Home | History | Annotate | Download | only in libcameraservice
      1 /*
      2  * Copyright (C) 2008 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #ifndef ANDROID_SERVERS_CAMERA_CAMERASERVICE_H
     18 #define ANDROID_SERVERS_CAMERA_CAMERASERVICE_H
     19 
     20 #include <cutils/multiuser.h>
     21 #include <utils/Vector.h>
     22 #include <utils/KeyedVector.h>
     23 #include <binder/AppOpsManager.h>
     24 #include <binder/BinderService.h>
     25 #include <binder/IAppOpsCallback.h>
     26 #include <camera/ICameraService.h>
     27 #include <hardware/camera.h>
     28 
     29 #include <camera/ICamera.h>
     30 #include <camera/ICameraClient.h>
     31 #include <camera/camera2/ICameraDeviceUser.h>
     32 #include <camera/camera2/ICameraDeviceCallbacks.h>
     33 #include <camera/VendorTagDescriptor.h>
     34 #include <camera/CaptureResult.h>
     35 #include <camera/CameraParameters.h>
     36 
     37 #include <camera/ICameraServiceListener.h>
     38 #include "CameraFlashlight.h"
     39 
     40 #include "common/CameraModule.h"
     41 #include "media/RingBuffer.h"
     42 #include "utils/AutoConditionLock.h"
     43 #include "utils/ClientManager.h"
     44 
     45 #include <set>
     46 #include <string>
     47 #include <map>
     48 #include <memory>
     49 #include <utility>
     50 
     51 namespace android {
     52 
     53 extern volatile int32_t gLogLevel;
     54 
     55 class MemoryHeapBase;
     56 class MediaPlayer;
     57 
     58 class CameraService :
     59     public BinderService<CameraService>,
     60     public BnCameraService,
     61     public IBinder::DeathRecipient,
     62     public camera_module_callbacks_t
     63 {
     64     friend class BinderService<CameraService>;
     65 public:
     66     class Client;
     67     class BasicClient;
     68 
     69     // The effective API level.  The Camera2 API running in LEGACY mode counts as API_1.
     70     enum apiLevel {
     71         API_1 = 1,
     72         API_2 = 2
     73     };
     74 
     75     // Process state (mirrors frameworks/base/core/java/android/app/ActivityManager.java)
     76     static const int PROCESS_STATE_NONEXISTENT = -1;
     77 
     78     // 3 second busy timeout when other clients are connecting
     79     static const nsecs_t DEFAULT_CONNECT_TIMEOUT_NS = 3000000000;
     80 
     81     // 1 second busy timeout when other clients are disconnecting
     82     static const nsecs_t DEFAULT_DISCONNECT_TIMEOUT_NS = 1000000000;
     83 
     84     // Default number of messages to store in eviction log
     85     static const size_t DEFAULT_EVENT_LOG_LENGTH = 100;
     86 
     87     // Implementation of BinderService<T>
     88     static char const* getServiceName() { return "media.camera"; }
     89 
     90                         CameraService();
     91     virtual             ~CameraService();
     92 
     93     /////////////////////////////////////////////////////////////////////
     94     // HAL Callbacks
     95     virtual void        onDeviceStatusChanged(camera_device_status_t cameraId,
     96                                               camera_device_status_t newStatus);
     97     virtual void        onTorchStatusChanged(const String8& cameraId,
     98                                              ICameraServiceListener::TorchStatus
     99                                                    newStatus);
    100 
    101     /////////////////////////////////////////////////////////////////////
    102     // ICameraService
    103     virtual int32_t     getNumberOfCameras(int type);
    104     virtual int32_t     getNumberOfCameras();
    105 
    106     virtual status_t    getCameraInfo(int cameraId,
    107                                       struct CameraInfo* cameraInfo);
    108     virtual status_t    getCameraCharacteristics(int cameraId,
    109                                                  CameraMetadata* cameraInfo);
    110     virtual status_t    getCameraVendorTagDescriptor(/*out*/ sp<VendorTagDescriptor>& desc);
    111 
    112     virtual status_t connect(const sp<ICameraClient>& cameraClient, int cameraId,
    113             const String16& clientPackageName, int clientUid,
    114             /*out*/
    115             sp<ICamera>& device);
    116 
    117     virtual status_t connectLegacy(const sp<ICameraClient>& cameraClient, int cameraId,
    118             int halVersion, const String16& clientPackageName, int clientUid,
    119             /*out*/
    120             sp<ICamera>& device);
    121 
    122     virtual status_t connectDevice(
    123             const sp<ICameraDeviceCallbacks>& cameraCb,
    124             int cameraId,
    125             const String16& clientPackageName,
    126             int clientUid,
    127             /*out*/
    128             sp<ICameraDeviceUser>& device);
    129 
    130     virtual status_t    addListener(const sp<ICameraServiceListener>& listener);
    131     virtual status_t    removeListener(
    132                                     const sp<ICameraServiceListener>& listener);
    133 
    134     virtual status_t    getLegacyParameters(
    135             int cameraId,
    136             /*out*/
    137             String16* parameters);
    138 
    139     virtual status_t    setTorchMode(const String16& cameraId, bool enabled,
    140             const sp<IBinder>& clientBinder);
    141 
    142     virtual void notifySystemEvent(int32_t eventId, const int32_t* args, size_t length);
    143 
    144     // OK = supports api of that version, -EOPNOTSUPP = does not support
    145     virtual status_t    supportsCameraApi(
    146             int cameraId, int apiVersion);
    147 
    148     // Extra permissions checks
    149     virtual status_t    onTransact(uint32_t code, const Parcel& data,
    150                                    Parcel* reply, uint32_t flags);
    151 
    152     virtual status_t    dump(int fd, const Vector<String16>& args);
    153 
    154     /////////////////////////////////////////////////////////////////////
    155     // Client functionality
    156 
    157     enum sound_kind {
    158         SOUND_SHUTTER = 0,
    159         SOUND_RECORDING = 1,
    160         NUM_SOUNDS
    161     };
    162 
    163     void                loadSound();
    164     void                playSound(sound_kind kind);
    165     void                releaseSound();
    166 
    167     /////////////////////////////////////////////////////////////////////
    168     // CameraDeviceFactory functionality
    169     int                 getDeviceVersion(int cameraId, int* facing = NULL);
    170 
    171     /////////////////////////////////////////////////////////////////////
    172     // Shared utilities
    173     static status_t     filterGetInfoErrorCode(status_t err);
    174 
    175     /////////////////////////////////////////////////////////////////////
    176     // CameraClient functionality
    177 
    178     class BasicClient : public virtual RefBase {
    179     public:
    180         virtual status_t    initialize(CameraModule *module) = 0;
    181         virtual void        disconnect();
    182 
    183         // because we can't virtually inherit IInterface, which breaks
    184         // virtual inheritance
    185         virtual sp<IBinder> asBinderWrapper() = 0;
    186 
    187         // Return the remote callback binder object (e.g. ICameraDeviceCallbacks)
    188         sp<IBinder>         getRemote() {
    189             return mRemoteBinder;
    190         }
    191 
    192         virtual status_t    dump(int fd, const Vector<String16>& args) = 0;
    193 
    194         // Return the package name for this client
    195         virtual String16 getPackageName() const;
    196 
    197         // Notify client about a fatal error
    198         virtual void notifyError(ICameraDeviceCallbacks::CameraErrorCode errorCode,
    199                 const CaptureResultExtras& resultExtras) = 0;
    200 
    201         // Get the UID of the application client using this
    202         virtual uid_t getClientUid() const;
    203 
    204         // Get the PID of the application client using this
    205         virtual int getClientPid() const;
    206 
    207         // Check what API level is used for this client. This is used to determine which
    208         // superclass this can be cast to.
    209         virtual bool canCastToApiClient(apiLevel level) const;
    210     protected:
    211         BasicClient(const sp<CameraService>& cameraService,
    212                 const sp<IBinder>& remoteCallback,
    213                 const String16& clientPackageName,
    214                 int cameraId,
    215                 int cameraFacing,
    216                 int clientPid,
    217                 uid_t clientUid,
    218                 int servicePid);
    219 
    220         virtual ~BasicClient();
    221 
    222         // the instance is in the middle of destruction. When this is set,
    223         // the instance should not be accessed from callback.
    224         // CameraService's mClientLock should be acquired to access this.
    225         // - subclasses should set this to true in their destructors.
    226         bool                            mDestructionStarted;
    227 
    228         // these are initialized in the constructor.
    229         sp<CameraService>               mCameraService;  // immutable after constructor
    230         int                             mCameraId;       // immutable after constructor
    231         int                             mCameraFacing;   // immutable after constructor
    232         const String16                  mClientPackageName;
    233         pid_t                           mClientPid;
    234         uid_t                           mClientUid;      // immutable after constructor
    235         pid_t                           mServicePid;     // immutable after constructor
    236         bool                            mDisconnected;
    237 
    238         // - The app-side Binder interface to receive callbacks from us
    239         sp<IBinder>                     mRemoteBinder;   // immutable after constructor
    240 
    241         // permissions management
    242         status_t                        startCameraOps();
    243         status_t                        finishCameraOps();
    244 
    245     private:
    246         AppOpsManager                   mAppOpsManager;
    247 
    248         class OpsCallback : public BnAppOpsCallback {
    249         public:
    250             OpsCallback(wp<BasicClient> client);
    251             virtual void opChanged(int32_t op, const String16& packageName);
    252 
    253         private:
    254             wp<BasicClient> mClient;
    255 
    256         }; // class OpsCallback
    257 
    258         sp<OpsCallback> mOpsCallback;
    259         // Track whether startCameraOps was called successfully, to avoid
    260         // finishing what we didn't start.
    261         bool            mOpsActive;
    262 
    263         // IAppOpsCallback interface, indirected through opListener
    264         virtual void opChanged(int32_t op, const String16& packageName);
    265     }; // class BasicClient
    266 
    267     class Client : public BnCamera, public BasicClient
    268     {
    269     public:
    270         typedef ICameraClient TCamCallbacks;
    271 
    272         // ICamera interface (see ICamera for details)
    273         virtual void          disconnect();
    274         virtual status_t      connect(const sp<ICameraClient>& client) = 0;
    275         virtual status_t      lock() = 0;
    276         virtual status_t      unlock() = 0;
    277         virtual status_t      setPreviewTarget(const sp<IGraphicBufferProducer>& bufferProducer)=0;
    278         virtual void          setPreviewCallbackFlag(int flag) = 0;
    279         virtual status_t      setPreviewCallbackTarget(
    280                 const sp<IGraphicBufferProducer>& callbackProducer) = 0;
    281         virtual status_t      startPreview() = 0;
    282         virtual void          stopPreview() = 0;
    283         virtual bool          previewEnabled() = 0;
    284         virtual status_t      storeMetaDataInBuffers(bool enabled) = 0;
    285         virtual status_t      startRecording() = 0;
    286         virtual void          stopRecording() = 0;
    287         virtual bool          recordingEnabled() = 0;
    288         virtual void          releaseRecordingFrame(const sp<IMemory>& mem) = 0;
    289         virtual status_t      autoFocus() = 0;
    290         virtual status_t      cancelAutoFocus() = 0;
    291         virtual status_t      takePicture(int msgType) = 0;
    292         virtual status_t      setParameters(const String8& params) = 0;
    293         virtual String8       getParameters() const = 0;
    294         virtual status_t      sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) = 0;
    295 
    296         // Interface used by CameraService
    297         Client(const sp<CameraService>& cameraService,
    298                 const sp<ICameraClient>& cameraClient,
    299                 const String16& clientPackageName,
    300                 int cameraId,
    301                 int cameraFacing,
    302                 int clientPid,
    303                 uid_t clientUid,
    304                 int servicePid);
    305         ~Client();
    306 
    307         // return our camera client
    308         const sp<ICameraClient>&    getRemoteCallback() {
    309             return mRemoteCallback;
    310         }
    311 
    312         virtual sp<IBinder> asBinderWrapper() {
    313             return asBinder(this);
    314         }
    315 
    316         virtual void         notifyError(ICameraDeviceCallbacks::CameraErrorCode errorCode,
    317                                          const CaptureResultExtras& resultExtras);
    318 
    319         // Check what API level is used for this client. This is used to determine which
    320         // superclass this can be cast to.
    321         virtual bool canCastToApiClient(apiLevel level) const;
    322     protected:
    323         // Convert client from cookie.
    324         static sp<CameraService::Client> getClientFromCookie(void* user);
    325 
    326         // Initialized in constructor
    327 
    328         // - The app-side Binder interface to receive callbacks from us
    329         sp<ICameraClient>               mRemoteCallback;
    330 
    331     }; // class Client
    332 
    333     /**
    334      * A listener class that implements the LISTENER interface for use with a ClientManager, and
    335      * implements the following methods:
    336      *    void onClientRemoved(const ClientDescriptor<KEY, VALUE>& descriptor);
    337      *    void onClientAdded(const ClientDescriptor<KEY, VALUE>& descriptor);
    338      */
    339     class ClientEventListener {
    340     public:
    341         void onClientAdded(const resource_policy::ClientDescriptor<String8,
    342                 sp<CameraService::BasicClient>>& descriptor);
    343         void onClientRemoved(const resource_policy::ClientDescriptor<String8,
    344                 sp<CameraService::BasicClient>>& descriptor);
    345     }; // class ClientEventListener
    346 
    347     typedef std::shared_ptr<resource_policy::ClientDescriptor<String8,
    348             sp<CameraService::BasicClient>>> DescriptorPtr;
    349 
    350     /**
    351      * A container class for managing active camera clients that are using HAL devices.  Active
    352      * clients are represented by ClientDescriptor objects that contain strong pointers to the
    353      * actual BasicClient subclass binder interface implementation.
    354      *
    355      * This class manages the eviction behavior for the camera clients.  See the parent class
    356      * implementation in utils/ClientManager for the specifics of this behavior.
    357      */
    358     class CameraClientManager : public resource_policy::ClientManager<String8,
    359             sp<CameraService::BasicClient>, ClientEventListener> {
    360     public:
    361         CameraClientManager();
    362         virtual ~CameraClientManager();
    363 
    364         /**
    365          * Return a strong pointer to the active BasicClient for this camera ID, or an empty
    366          * if none exists.
    367          */
    368         sp<CameraService::BasicClient> getCameraClient(const String8& id) const;
    369 
    370         /**
    371          * Return a string describing the current state.
    372          */
    373         String8 toString() const;
    374 
    375         /**
    376          * Make a ClientDescriptor object wrapping the given BasicClient strong pointer.
    377          */
    378         static DescriptorPtr makeClientDescriptor(const String8& key, const sp<BasicClient>& value,
    379                 int32_t cost, const std::set<String8>& conflictingKeys, int32_t priority,
    380                 int32_t ownerId);
    381 
    382         /**
    383          * Make a ClientDescriptor object wrapping the given BasicClient strong pointer with
    384          * values intialized from a prior ClientDescriptor.
    385          */
    386         static DescriptorPtr makeClientDescriptor(const sp<BasicClient>& value,
    387                 const CameraService::DescriptorPtr& partial);
    388 
    389     }; // class CameraClientManager
    390 
    391 private:
    392 
    393     /**
    394      * Container class for the state of each logical camera device, including: ID, status, and
    395      * dependencies on other devices.  The mapping of camera ID -> state saved in mCameraStates
    396      * represents the camera devices advertised by the HAL (and any USB devices, when we add
    397      * those).
    398      *
    399      * This container does NOT represent an active camera client.  These are represented using
    400      * the ClientDescriptors stored in mActiveClientManager.
    401      */
    402     class CameraState {
    403     public:
    404         /**
    405          * Make a new CameraState and set the ID, cost, and conflicting devices using the values
    406          * returned in the HAL's camera_info struct for each device.
    407          */
    408         CameraState(const String8& id, int cost, const std::set<String8>& conflicting);
    409         virtual ~CameraState();
    410 
    411         /**
    412          * Return the status for this device.
    413          *
    414          * This method acquires mStatusLock.
    415          */
    416         ICameraServiceListener::Status getStatus() const;
    417 
    418         /**
    419          * This function updates the status for this camera device, unless the given status
    420          * is in the given list of rejected status states, and execute the function passed in
    421          * with a signature onStatusUpdateLocked(const String8&, ICameraServiceListener::Status)
    422          * if the status has changed.
    423          *
    424          * This method is idempotent, and will not result in the function passed to
    425          * onStatusUpdateLocked being called more than once for the same arguments.
    426          * This method aquires mStatusLock.
    427          */
    428         template<class Func>
    429         void updateStatus(ICameraServiceListener::Status status, const String8& cameraId,
    430                 std::initializer_list<ICameraServiceListener::Status> rejectSourceStates,
    431                 Func onStatusUpdatedLocked);
    432 
    433         /**
    434          * Return the last set CameraParameters object generated from the information returned by
    435          * the HAL for this device (or an empty CameraParameters object if none has been set).
    436          */
    437         CameraParameters getShimParams() const;
    438 
    439         /**
    440          * Set the CameraParameters for this device.
    441          */
    442         void setShimParams(const CameraParameters& params);
    443 
    444         /**
    445          * Return the resource_cost advertised by the HAL for this device.
    446          */
    447         int getCost() const;
    448 
    449         /**
    450          * Return a set of the IDs of conflicting devices advertised by the HAL for this device.
    451          */
    452         std::set<String8> getConflicting() const;
    453 
    454         /**
    455          * Return the ID of this camera device.
    456          */
    457         String8 getId() const;
    458 
    459     private:
    460         const String8 mId;
    461         ICameraServiceListener::Status mStatus; // protected by mStatusLock
    462         const int mCost;
    463         std::set<String8> mConflicting;
    464         mutable Mutex mStatusLock;
    465         CameraParameters mShimParams;
    466     }; // class CameraState
    467 
    468     // Delay-load the Camera HAL module
    469     virtual void onFirstRef();
    470 
    471     // Check if we can connect, before we acquire the service lock.
    472     status_t validateConnectLocked(const String8& cameraId, /*inout*/int& clientUid) const;
    473 
    474     // Handle active client evictions, and update service state.
    475     // Only call with with mServiceLock held.
    476     status_t handleEvictionsLocked(const String8& cameraId, int clientPid,
    477         apiLevel effectiveApiLevel, const sp<IBinder>& remoteCallback, const String8& packageName,
    478         /*out*/
    479         sp<BasicClient>* client,
    480         std::shared_ptr<resource_policy::ClientDescriptor<String8, sp<BasicClient>>>* partial);
    481 
    482     // Single implementation shared between the various connect calls
    483     template<class CALLBACK, class CLIENT>
    484     status_t connectHelper(const sp<CALLBACK>& cameraCb, const String8& cameraId, int halVersion,
    485             const String16& clientPackageName, int clientUid, apiLevel effectiveApiLevel,
    486             bool legacyMode, bool shimUpdateOnly, /*out*/sp<CLIENT>& device);
    487 
    488     // Lock guarding camera service state
    489     Mutex               mServiceLock;
    490 
    491     // Condition to use with mServiceLock, used to handle simultaneous connect calls from clients
    492     std::shared_ptr<WaitableMutexWrapper> mServiceLockWrapper;
    493 
    494     // Return NO_ERROR if the device with a give ID can be connected to
    495     status_t checkIfDeviceIsUsable(const String8& cameraId) const;
    496 
    497     // Container for managing currently active application-layer clients
    498     CameraClientManager mActiveClientManager;
    499 
    500     // Mapping from camera ID -> state for each device, map is protected by mCameraStatesLock
    501     std::map<String8, std::shared_ptr<CameraState>> mCameraStates;
    502 
    503     // Mutex guarding mCameraStates map
    504     mutable Mutex mCameraStatesLock;
    505 
    506     // Circular buffer for storing event logging for dumps
    507     RingBuffer<String8> mEventLog;
    508     Mutex mLogLock;
    509 
    510     // Currently allowed user IDs
    511     std::set<userid_t> mAllowedUsers;
    512 
    513     /**
    514      * Check camera capabilities, such as support for basic color operation
    515      */
    516     int checkCameraCapabilities(int id, camera_info info, int *latestStrangeCameraId);
    517 
    518     /**
    519      * Get the camera state for a given camera id.
    520      *
    521      * This acquires mCameraStatesLock.
    522      */
    523     std::shared_ptr<CameraService::CameraState> getCameraState(const String8& cameraId) const;
    524 
    525     /**
    526      * Evict client who's remote binder has died.  Returns true if this client was in the active
    527      * list and was disconnected.
    528      *
    529      * This method acquires mServiceLock.
    530      */
    531     bool evictClientIdByRemote(const wp<IBinder>& cameraClient);
    532 
    533     /**
    534      * Remove the given client from the active clients list; does not disconnect the client.
    535      *
    536      * This method acquires mServiceLock.
    537      */
    538     void removeByClient(const BasicClient* client);
    539 
    540     /**
    541      * Add new client to active clients list after conflicting clients have disconnected using the
    542      * values set in the partial descriptor passed in to construct the actual client descriptor.
    543      * This is typically called at the end of a connect call.
    544      *
    545      * This method must be called with mServiceLock held.
    546      */
    547     void finishConnectLocked(const sp<BasicClient>& client, const DescriptorPtr& desc);
    548 
    549     /**
    550      * Returns the integer corresponding to the given camera ID string, or -1 on failure.
    551      */
    552     static int cameraIdToInt(const String8& cameraId);
    553 
    554     /**
    555      * Remove a single client corresponding to the given camera id from the list of active clients.
    556      * If none exists, return an empty strongpointer.
    557      *
    558      * This method must be called with mServiceLock held.
    559      */
    560     sp<CameraService::BasicClient> removeClientLocked(const String8& cameraId);
    561 
    562     /**
    563      * Handle a notification that the current device user has changed.
    564      */
    565     void doUserSwitch(const int32_t* newUserId, size_t length);
    566 
    567     /**
    568      * Add an event log message.
    569      */
    570     void logEvent(const char* event);
    571 
    572     /**
    573      * Add an event log message that a client has been disconnected.
    574      */
    575     void logDisconnected(const char* cameraId, int clientPid, const char* clientPackage);
    576 
    577     /**
    578      * Add an event log message that a client has been connected.
    579      */
    580     void logConnected(const char* cameraId, int clientPid, const char* clientPackage);
    581 
    582     /**
    583      * Add an event log message that a client's connect attempt has been rejected.
    584      */
    585     void logRejected(const char* cameraId, int clientPid, const char* clientPackage,
    586             const char* reason);
    587 
    588     /**
    589      * Add an event log message that the current device user has been switched.
    590      */
    591     void logUserSwitch(const std::set<userid_t>& oldUserIds,
    592         const std::set<userid_t>& newUserIds);
    593 
    594     /**
    595      * Add an event log message that a device has been removed by the HAL
    596      */
    597     void logDeviceRemoved(const char* cameraId, const char* reason);
    598 
    599     /**
    600      * Add an event log message that a device has been added by the HAL
    601      */
    602     void logDeviceAdded(const char* cameraId, const char* reason);
    603 
    604     /**
    605      * Add an event log message that a client has unexpectedly died.
    606      */
    607     void logClientDied(int clientPid, const char* reason);
    608 
    609     /**
    610      * Add a event log message that a serious service-level error has occured
    611      */
    612     void logServiceError(const char* msg, int errorCode);
    613 
    614     /**
    615      * Dump the event log to an FD
    616      */
    617     void dumpEventLog(int fd);
    618 
    619     int                 mNumberOfCameras;
    620     int                 mNumberOfNormalCameras;
    621 
    622     // sounds
    623     MediaPlayer*        newMediaPlayer(const char *file);
    624 
    625     Mutex               mSoundLock;
    626     sp<MediaPlayer>     mSoundPlayer[NUM_SOUNDS];
    627     int                 mSoundRef;  // reference count (release all MediaPlayer when 0)
    628 
    629     CameraModule*     mModule;
    630 
    631     // Guarded by mStatusListenerMutex
    632     std::vector<sp<ICameraServiceListener>> mListenerList;
    633     Mutex       mStatusListenerLock;
    634 
    635     /**
    636      * Update the status for the given camera id (if that device exists), and broadcast the
    637      * status update to all current ICameraServiceListeners if the status has changed.  Any
    638      * statuses in rejectedSourceStates will be ignored.
    639      *
    640      * This method must be idempotent.
    641      * This method acquires mStatusLock and mStatusListenerLock.
    642      */
    643     void updateStatus(ICameraServiceListener::Status status, const String8& cameraId,
    644             std::initializer_list<ICameraServiceListener::Status> rejectedSourceStates);
    645     void updateStatus(ICameraServiceListener::Status status, const String8& cameraId);
    646 
    647     // flashlight control
    648     sp<CameraFlashlight> mFlashlight;
    649     // guard mTorchStatusMap
    650     Mutex                mTorchStatusMutex;
    651     // guard mTorchClientMap
    652     Mutex                mTorchClientMapMutex;
    653     // guard mTorchUidMap
    654     Mutex                mTorchUidMapMutex;
    655     // camera id -> torch status
    656     KeyedVector<String8, ICameraServiceListener::TorchStatus> mTorchStatusMap;
    657     // camera id -> torch client binder
    658     // only store the last client that turns on each camera's torch mode
    659     KeyedVector<String8, sp<IBinder>> mTorchClientMap;
    660     // camera id -> [incoming uid, current uid] pair
    661     std::map<String8, std::pair<int, int>> mTorchUidMap;
    662 
    663     // check and handle if torch client's process has died
    664     void handleTorchClientBinderDied(const wp<IBinder> &who);
    665 
    666     // handle torch mode status change and invoke callbacks. mTorchStatusMutex
    667     // should be locked.
    668     void onTorchStatusChangedLocked(const String8& cameraId,
    669             ICameraServiceListener::TorchStatus newStatus);
    670 
    671     // get a camera's torch status. mTorchStatusMutex should be locked.
    672     status_t getTorchStatusLocked(const String8 &cameraId,
    673             ICameraServiceListener::TorchStatus *status) const;
    674 
    675     // set a camera's torch status. mTorchStatusMutex should be locked.
    676     status_t setTorchStatusLocked(const String8 &cameraId,
    677             ICameraServiceListener::TorchStatus status);
    678 
    679     // IBinder::DeathRecipient implementation
    680     virtual void        binderDied(const wp<IBinder> &who);
    681 
    682     // Helpers
    683 
    684     bool                setUpVendorTags();
    685 
    686     /**
    687      * Initialize and cache the metadata used by the HAL1 shim for a given cameraId.
    688      *
    689      * Returns OK on success, or a negative error code.
    690      */
    691     status_t            initializeShimMetadata(int cameraId);
    692 
    693     /**
    694      * Get the cached CameraParameters for the camera. If they haven't been
    695      * cached yet, then initialize them for the first time.
    696      *
    697      * Returns OK on success, or a negative error code.
    698      */
    699     status_t            getLegacyParametersLazy(int cameraId, /*out*/CameraParameters* parameters);
    700 
    701     /**
    702      * Generate the CameraCharacteristics metadata required by the Camera2 API
    703      * from the available HAL1 CameraParameters and CameraInfo.
    704      *
    705      * Returns OK on success, or a negative error code.
    706      */
    707     status_t            generateShimMetadata(int cameraId, /*out*/CameraMetadata* cameraInfo);
    708 
    709     static int getCallingPid();
    710 
    711     static int getCallingUid();
    712 
    713     /**
    714      * Get the current system time as a formatted string.
    715      */
    716     static String8 getFormattedCurrentTime();
    717 
    718     /**
    719      * Get the camera eviction priority from the current process state given by ActivityManager.
    720      */
    721     static int getCameraPriorityFromProcState(int procState);
    722 
    723     static status_t makeClient(const sp<CameraService>& cameraService,
    724             const sp<IInterface>& cameraCb, const String16& packageName, const String8& cameraId,
    725             int facing, int clientPid, uid_t clientUid, int servicePid, bool legacyMode,
    726             int halVersion, int deviceVersion, apiLevel effectiveApiLevel,
    727             /*out*/sp<BasicClient>* client);
    728 
    729     status_t checkCameraAccess(const String16& opPackageName);
    730 
    731     static String8 toString(std::set<userid_t> intSet);
    732 
    733     static void pingCameraServiceProxy();
    734 
    735 };
    736 
    737 template<class Func>
    738 void CameraService::CameraState::updateStatus(ICameraServiceListener::Status status,
    739         const String8& cameraId,
    740         std::initializer_list<ICameraServiceListener::Status> rejectSourceStates,
    741         Func onStatusUpdatedLocked) {
    742     Mutex::Autolock lock(mStatusLock);
    743     ICameraServiceListener::Status oldStatus = mStatus;
    744     mStatus = status;
    745 
    746     if (oldStatus == status) {
    747         return;
    748     }
    749 
    750     ALOGV("%s: Status has changed for camera ID %s from %#x to %#x", __FUNCTION__,
    751             cameraId.string(), oldStatus, status);
    752 
    753     if (oldStatus == ICameraServiceListener::STATUS_NOT_PRESENT &&
    754         (status != ICameraServiceListener::STATUS_PRESENT &&
    755          status != ICameraServiceListener::STATUS_ENUMERATING)) {
    756 
    757         ALOGW("%s: From NOT_PRESENT can only transition into PRESENT or ENUMERATING",
    758                 __FUNCTION__);
    759         mStatus = oldStatus;
    760         return;
    761     }
    762 
    763     /**
    764      * Sometimes we want to conditionally do a transition.
    765      * For example if a client disconnects, we want to go to PRESENT
    766      * only if we weren't already in NOT_PRESENT or ENUMERATING.
    767      */
    768     for (auto& rejectStatus : rejectSourceStates) {
    769         if (oldStatus == rejectStatus) {
    770             ALOGV("%s: Rejecting status transition for Camera ID %s,  since the source "
    771                     "state was was in one of the bad states.", __FUNCTION__, cameraId.string());
    772             mStatus = oldStatus;
    773             return;
    774         }
    775     }
    776 
    777     onStatusUpdatedLocked(cameraId, status);
    778 }
    779 
    780 
    781 template<class CALLBACK, class CLIENT>
    782 status_t CameraService::connectHelper(const sp<CALLBACK>& cameraCb, const String8& cameraId,
    783         int halVersion, const String16& clientPackageName, int clientUid,
    784         apiLevel effectiveApiLevel, bool legacyMode, bool shimUpdateOnly,
    785         /*out*/sp<CLIENT>& device) {
    786     status_t ret = NO_ERROR;
    787     String8 clientName8(clientPackageName);
    788     int clientPid = getCallingPid();
    789 
    790     ALOGI("CameraService::connect call (PID %d \"%s\", camera ID %s) for HAL version %s and "
    791             "Camera API version %d", clientPid, clientName8.string(), cameraId.string(),
    792             (halVersion == -1) ? "default" : std::to_string(halVersion).c_str(),
    793             static_cast<int>(effectiveApiLevel));
    794 
    795     sp<CLIENT> client = nullptr;
    796     {
    797         // Acquire mServiceLock and prevent other clients from connecting
    798         std::unique_ptr<AutoConditionLock> lock =
    799                 AutoConditionLock::waitAndAcquire(mServiceLockWrapper, DEFAULT_CONNECT_TIMEOUT_NS);
    800 
    801         if (lock == nullptr) {
    802             ALOGE("CameraService::connect X (PID %d) rejected (too many other clients connecting)."
    803                     , clientPid);
    804             return -EBUSY;
    805         }
    806 
    807         // Enforce client permissions and do basic sanity checks
    808         if((ret = validateConnectLocked(cameraId, /*inout*/clientUid)) != NO_ERROR) {
    809             return ret;
    810         }
    811 
    812         // Check the shim parameters after acquiring lock, if they have already been updated and
    813         // we were doing a shim update, return immediately
    814         if (shimUpdateOnly) {
    815             auto cameraState = getCameraState(cameraId);
    816             if (cameraState != nullptr) {
    817                 if (!cameraState->getShimParams().isEmpty()) return NO_ERROR;
    818             }
    819         }
    820 
    821         sp<BasicClient> clientTmp = nullptr;
    822         std::shared_ptr<resource_policy::ClientDescriptor<String8, sp<BasicClient>>> partial;
    823         if ((ret = handleEvictionsLocked(cameraId, clientPid, effectiveApiLevel,
    824                 IInterface::asBinder(cameraCb), clientName8, /*out*/&clientTmp,
    825                 /*out*/&partial)) != NO_ERROR) {
    826             return ret;
    827         }
    828 
    829         if (clientTmp.get() != nullptr) {
    830             // Handle special case for API1 MediaRecorder where the existing client is returned
    831             device = static_cast<CLIENT*>(clientTmp.get());
    832             return NO_ERROR;
    833         }
    834 
    835         // give flashlight a chance to close devices if necessary.
    836         mFlashlight->prepareDeviceOpen(cameraId);
    837 
    838         // TODO: Update getDeviceVersion + HAL interface to use strings for Camera IDs
    839         int id = cameraIdToInt(cameraId);
    840         if (id == -1) {
    841             ALOGE("%s: Invalid camera ID %s, cannot get device version from HAL.", __FUNCTION__,
    842                     cameraId.string());
    843             return BAD_VALUE;
    844         }
    845 
    846         int facing = -1;
    847         int deviceVersion = getDeviceVersion(id, /*out*/&facing);
    848         sp<BasicClient> tmp = nullptr;
    849         if((ret = makeClient(this, cameraCb, clientPackageName, cameraId, facing, clientPid,
    850                 clientUid, getpid(), legacyMode, halVersion, deviceVersion, effectiveApiLevel,
    851                 /*out*/&tmp)) != NO_ERROR) {
    852             return ret;
    853         }
    854         client = static_cast<CLIENT*>(tmp.get());
    855 
    856         LOG_ALWAYS_FATAL_IF(client.get() == nullptr, "%s: CameraService in invalid state",
    857                 __FUNCTION__);
    858 
    859         if ((ret = client->initialize(mModule)) != OK) {
    860             ALOGE("%s: Could not initialize client from HAL module.", __FUNCTION__);
    861             return ret;
    862         }
    863 
    864         sp<IBinder> remoteCallback = client->getRemote();
    865         if (remoteCallback != nullptr) {
    866             remoteCallback->linkToDeath(this);
    867         }
    868 
    869         // Update shim paremeters for legacy clients
    870         if (effectiveApiLevel == API_1) {
    871             // Assume we have always received a Client subclass for API1
    872             sp<Client> shimClient = reinterpret_cast<Client*>(client.get());
    873             String8 rawParams = shimClient->getParameters();
    874             CameraParameters params(rawParams);
    875 
    876             auto cameraState = getCameraState(cameraId);
    877             if (cameraState != nullptr) {
    878                 cameraState->setShimParams(params);
    879             } else {
    880                 ALOGE("%s: Cannot update shim parameters for camera %s, no such device exists.",
    881                         __FUNCTION__, cameraId.string());
    882             }
    883         }
    884 
    885         if (shimUpdateOnly) {
    886             // If only updating legacy shim parameters, immediately disconnect client
    887             mServiceLock.unlock();
    888             client->disconnect();
    889             mServiceLock.lock();
    890         } else {
    891             // Otherwise, add client to active clients list
    892             finishConnectLocked(client, partial);
    893         }
    894     } // lock is destroyed, allow further connect calls
    895 
    896     // Important: release the mutex here so the client can call back into the service from its
    897     // destructor (can be at the end of the call)
    898     device = client;
    899     return NO_ERROR;
    900 }
    901 
    902 } // namespace android
    903 
    904 #endif
    905