| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 1 | /* | 
| Ruben Brunk | d1176ef | 2014-02-21 10:51:38 -0800 | [diff] [blame] | 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 |  */ | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 16 |  | 
 | 17 | #ifndef ANDROID_SERVERS_CAMERA_CAMERASERVICE_H | 
 | 18 | #define ANDROID_SERVERS_CAMERA_CAMERASERVICE_H | 
 | 19 |  | 
| Eino-Ville Talvala | d56db1d | 2015-12-17 16:50:35 -0800 | [diff] [blame] | 20 | #include <android/hardware/BnCameraService.h> | 
| Michael Groover | d1d435a | 2018-12-18 17:39:42 -0800 | [diff] [blame] | 21 | #include <android/hardware/BnSensorPrivacyListener.h> | 
| Eino-Ville Talvala | d56db1d | 2015-12-17 16:50:35 -0800 | [diff] [blame] | 22 | #include <android/hardware/ICameraServiceListener.h> | 
| Eino-Ville Talvala | e8c96c7 | 2017-06-27 12:24:07 -0700 | [diff] [blame] | 23 | #include <android/hardware/ICameraServiceProxy.h> | 
| Eino-Ville Talvala | d56db1d | 2015-12-17 16:50:35 -0800 | [diff] [blame] | 24 |  | 
| Ruben Brunk | 36597b2 | 2015-03-20 22:15:57 -0700 | [diff] [blame] | 25 | #include <cutils/multiuser.h> | 
| Igor Murashkin | 634a515 | 2013-02-20 17:15:11 -0800 | [diff] [blame] | 26 | #include <utils/Vector.h> | 
| Ruben Brunk | b2119af | 2014-05-09 19:57:56 -0700 | [diff] [blame] | 27 | #include <utils/KeyedVector.h> | 
| Eino-Ville Talvala | ceb388d | 2013-02-19 10:40:14 -0800 | [diff] [blame] | 28 | #include <binder/AppOpsManager.h> | 
| Mathias Agopian | 5462fc9 | 2010-07-14 18:41:18 -0700 | [diff] [blame] | 29 | #include <binder/BinderService.h> | 
| Eino-Ville Talvala | ceb388d | 2013-02-19 10:40:14 -0800 | [diff] [blame] | 30 | #include <binder/IAppOpsCallback.h> | 
| Svet Ganov | a453d0d | 2018-01-11 15:37:58 -0800 | [diff] [blame] | 31 | #include <binder/IUidObserver.h> | 
| Iliyan Malchev | 8951a97 | 2011-04-14 16:55:59 -0700 | [diff] [blame] | 32 | #include <hardware/camera.h> | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 33 |  | 
| Eino-Ville Talvala | f51fca2 | 2016-12-13 11:25:55 -0800 | [diff] [blame] | 34 | #include <android/hardware/camera/common/1.0/types.h> | 
 | 35 |  | 
| Ruben Brunk | d1176ef | 2014-02-21 10:51:38 -0800 | [diff] [blame] | 36 | #include <camera/VendorTagDescriptor.h> | 
| Jianing Wei | cb0652e | 2014-03-12 18:29:36 -0700 | [diff] [blame] | 37 | #include <camera/CaptureResult.h> | 
| Ruben Brunk | b2119af | 2014-05-09 19:57:56 -0700 | [diff] [blame] | 38 | #include <camera/CameraParameters.h> | 
| Igor Murashkin | c073ba5 | 2013-02-26 14:32:34 -0800 | [diff] [blame] | 39 |  | 
| Chien-Yu Chen | 3068d73 | 2015-02-09 13:29:57 -0800 | [diff] [blame] | 40 | #include "CameraFlashlight.h" | 
 | 41 |  | 
| Eino-Ville Talvala | 2f09bac | 2016-12-13 11:29:54 -0800 | [diff] [blame] | 42 | #include "common/CameraProviderManager.h" | 
| Ronghua Wu | 022ed72 | 2015-05-11 15:15:09 -0700 | [diff] [blame] | 43 | #include "media/RingBuffer.h" | 
| Ruben Brunk | cc77671 | 2015-02-17 20:18:47 -0800 | [diff] [blame] | 44 | #include "utils/AutoConditionLock.h" | 
 | 45 | #include "utils/ClientManager.h" | 
| Yin-Chia Yeh | e074a93 | 2015-01-30 10:29:02 -0800 | [diff] [blame] | 46 |  | 
| Ruben Brunk | cc77671 | 2015-02-17 20:18:47 -0800 | [diff] [blame] | 47 | #include <set> | 
 | 48 | #include <string> | 
 | 49 | #include <map> | 
 | 50 | #include <memory> | 
| Ruben Brunk | 99e6971 | 2015-05-26 17:25:07 -0700 | [diff] [blame] | 51 | #include <utility> | 
| Svet Ganov | a453d0d | 2018-01-11 15:37:58 -0800 | [diff] [blame] | 52 | #include <unordered_map> | 
 | 53 | #include <unordered_set> | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 54 |  | 
 | 55 | namespace android { | 
 | 56 |  | 
| Eino-Ville Talvala | 5e08d60 | 2012-05-16 14:59:25 -0700 | [diff] [blame] | 57 | extern volatile int32_t gLogLevel; | 
 | 58 |  | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 59 | class MemoryHeapBase; | 
 | 60 | class MediaPlayer; | 
 | 61 |  | 
| Mathias Agopian | 5462fc9 | 2010-07-14 18:41:18 -0700 | [diff] [blame] | 62 | class CameraService : | 
 | 63 |     public BinderService<CameraService>, | 
| Eino-Ville Talvala | 2f09bac | 2016-12-13 11:29:54 -0800 | [diff] [blame] | 64 |     public virtual ::android::hardware::BnCameraService, | 
 | 65 |     public virtual IBinder::DeathRecipient, | 
| Eino-Ville Talvala | 2f09bac | 2016-12-13 11:29:54 -0800 | [diff] [blame] | 66 |     public virtual CameraProviderManager::StatusListener | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 67 | { | 
| Mathias Agopian | 5462fc9 | 2010-07-14 18:41:18 -0700 | [diff] [blame] | 68 |     friend class BinderService<CameraService>; | 
| Eino-Ville Talvala | 2f09bac | 2016-12-13 11:29:54 -0800 | [diff] [blame] | 69 |     friend class CameraClient; | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 70 | public: | 
| Eino-Ville Talvala | 5e08d60 | 2012-05-16 14:59:25 -0700 | [diff] [blame] | 71 |     class Client; | 
| Igor Murashkin | 634a515 | 2013-02-20 17:15:11 -0800 | [diff] [blame] | 72 |     class BasicClient; | 
 | 73 |  | 
| Ruben Brunk | 0bbf8b2 | 2015-04-30 14:35:42 -0700 | [diff] [blame] | 74 |     // The effective API level.  The Camera2 API running in LEGACY mode counts as API_1. | 
| Ruben Brunk | cc77671 | 2015-02-17 20:18:47 -0800 | [diff] [blame] | 75 |     enum apiLevel { | 
 | 76 |         API_1 = 1, | 
 | 77 |         API_2 = 2 | 
 | 78 |     }; | 
 | 79 |  | 
| Ruben Brunk | cc77671 | 2015-02-17 20:18:47 -0800 | [diff] [blame] | 80 |     // 3 second busy timeout when other clients are connecting | 
 | 81 |     static const nsecs_t DEFAULT_CONNECT_TIMEOUT_NS = 3000000000; | 
 | 82 |  | 
| Ruben Brunk | 4f9576b | 2015-04-10 17:26:56 -0700 | [diff] [blame] | 83 |     // 1 second busy timeout when other clients are disconnecting | 
 | 84 |     static const nsecs_t DEFAULT_DISCONNECT_TIMEOUT_NS = 1000000000; | 
 | 85 |  | 
| Ruben Brunk | cc77671 | 2015-02-17 20:18:47 -0800 | [diff] [blame] | 86 |     // Default number of messages to store in eviction log | 
| Ruben Brunk | a8ca915 | 2015-04-07 14:23:40 -0700 | [diff] [blame] | 87 |     static const size_t DEFAULT_EVENT_LOG_LENGTH = 100; | 
| Ruben Brunk | cc77671 | 2015-02-17 20:18:47 -0800 | [diff] [blame] | 88 |  | 
| Eino-Ville Talvala | c400396 | 2016-01-13 10:07:04 -0800 | [diff] [blame] | 89 |     // Event log ID | 
 | 90 |     static const int SN_EVENT_LOG_ID = 0x534e4554; | 
 | 91 |  | 
| Igor Murashkin | 634a515 | 2013-02-20 17:15:11 -0800 | [diff] [blame] | 92 |     // Implementation of BinderService<T> | 
| Mathias Agopian | 5462fc9 | 2010-07-14 18:41:18 -0700 | [diff] [blame] | 93 |     static char const* getServiceName() { return "media.camera"; } | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 94 |  | 
 | 95 |                         CameraService(); | 
 | 96 |     virtual             ~CameraService(); | 
 | 97 |  | 
| Igor Murashkin | 634a515 | 2013-02-20 17:15:11 -0800 | [diff] [blame] | 98 |     ///////////////////////////////////////////////////////////////////// | 
| Eino-Ville Talvala | 2f09bac | 2016-12-13 11:29:54 -0800 | [diff] [blame] | 99 |     // HAL Callbacks - implements CameraProviderManager::StatusListener | 
 | 100 |  | 
| Eino-Ville Talvala | f51fca2 | 2016-12-13 11:25:55 -0800 | [diff] [blame] | 101 |     virtual void        onDeviceStatusChanged(const String8 &cameraId, | 
| Eino-Ville Talvala | 2f09bac | 2016-12-13 11:29:54 -0800 | [diff] [blame] | 102 |             hardware::camera::common::V1_0::CameraDeviceStatus newHalStatus) override; | 
| Chien-Yu Chen | 88da526 | 2015-02-17 13:56:46 -0800 | [diff] [blame] | 103 |     virtual void        onTorchStatusChanged(const String8& cameraId, | 
| Eino-Ville Talvala | 2f09bac | 2016-12-13 11:29:54 -0800 | [diff] [blame] | 104 |             hardware::camera::common::V1_0::TorchModeStatus newStatus) override; | 
| Emilian Peev | aee727d | 2017-05-04 16:35:48 +0100 | [diff] [blame] | 105 |     virtual void        onNewProviderRegistered() override; | 
| Igor Murashkin | cba2c16 | 2013-03-20 15:56:31 -0700 | [diff] [blame] | 106 |  | 
 | 107 |     ///////////////////////////////////////////////////////////////////// | 
| Igor Murashkin | 634a515 | 2013-02-20 17:15:11 -0800 | [diff] [blame] | 108 |     // ICameraService | 
| Eino-Ville Talvala | d56db1d | 2015-12-17 16:50:35 -0800 | [diff] [blame] | 109 |     virtual binder::Status     getNumberOfCameras(int32_t type, int32_t* numCameras); | 
| Eino-Ville Talvala | bad4358 | 2015-08-14 13:12:32 -0700 | [diff] [blame] | 110 |  | 
| Eino-Ville Talvala | d56db1d | 2015-12-17 16:50:35 -0800 | [diff] [blame] | 111 |     virtual binder::Status     getCameraInfo(int cameraId, | 
 | 112 |             hardware::CameraInfo* cameraInfo); | 
| Eino-Ville Talvala | 2f09bac | 2016-12-13 11:29:54 -0800 | [diff] [blame] | 113 |     virtual binder::Status     getCameraCharacteristics(const String16& cameraId, | 
| Eino-Ville Talvala | d56db1d | 2015-12-17 16:50:35 -0800 | [diff] [blame] | 114 |             CameraMetadata* cameraInfo); | 
 | 115 |     virtual binder::Status     getCameraVendorTagDescriptor( | 
| Ruben Brunk | 0f61d8f | 2013-08-08 13:07:18 -0700 | [diff] [blame] | 116 |             /*out*/ | 
| Eino-Ville Talvala | d56db1d | 2015-12-17 16:50:35 -0800 | [diff] [blame] | 117 |             hardware::camera2::params::VendorTagDescriptor* desc); | 
| Emilian Peev | 71c73a2 | 2017-03-21 16:35:51 +0000 | [diff] [blame] | 118 |     virtual binder::Status     getCameraVendorTagCache( | 
 | 119 |             /*out*/ | 
 | 120 |             hardware::camera2::params::VendorTagDescriptorCache* cache); | 
| Ruben Brunk | 0f61d8f | 2013-08-08 13:07:18 -0700 | [diff] [blame] | 121 |  | 
| Eino-Ville Talvala | d56db1d | 2015-12-17 16:50:35 -0800 | [diff] [blame] | 122 |     virtual binder::Status     connect(const sp<hardware::ICameraClient>& cameraClient, | 
 | 123 |             int32_t cameraId, const String16& clientPackageName, | 
 | 124 |             int32_t clientUid, int clientPid, | 
| Zhijun He | b10cdad | 2014-06-16 16:38:35 -0700 | [diff] [blame] | 125 |             /*out*/ | 
| Eino-Ville Talvala | d56db1d | 2015-12-17 16:50:35 -0800 | [diff] [blame] | 126 |             sp<hardware::ICamera>* device); | 
| Zhijun He | b10cdad | 2014-06-16 16:38:35 -0700 | [diff] [blame] | 127 |  | 
| Eino-Ville Talvala | d56db1d | 2015-12-17 16:50:35 -0800 | [diff] [blame] | 128 |     virtual binder::Status     connectLegacy(const sp<hardware::ICameraClient>& cameraClient, | 
 | 129 |             int32_t cameraId, int32_t halVersion, | 
 | 130 |             const String16& clientPackageName, int32_t clientUid, | 
| Ruben Brunk | 0f61d8f | 2013-08-08 13:07:18 -0700 | [diff] [blame] | 131 |             /*out*/ | 
| Eino-Ville Talvala | d56db1d | 2015-12-17 16:50:35 -0800 | [diff] [blame] | 132 |             sp<hardware::ICamera>* device); | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 133 |  | 
| Eino-Ville Talvala | d56db1d | 2015-12-17 16:50:35 -0800 | [diff] [blame] | 134 |     virtual binder::Status     connectDevice( | 
| Eino-Ville Talvala | f51fca2 | 2016-12-13 11:25:55 -0800 | [diff] [blame] | 135 |             const sp<hardware::camera2::ICameraDeviceCallbacks>& cameraCb, const String16& cameraId, | 
| Eino-Ville Talvala | d56db1d | 2015-12-17 16:50:35 -0800 | [diff] [blame] | 136 |             const String16& clientPackageName, int32_t clientUid, | 
 | 137 |             /*out*/ | 
 | 138 |             sp<hardware::camera2::ICameraDeviceUser>* device); | 
| Igor Murashkin | bfc9915 | 2013-02-27 12:55:20 -0800 | [diff] [blame] | 139 |  | 
| Eino-Ville Talvala | f51fca2 | 2016-12-13 11:25:55 -0800 | [diff] [blame] | 140 |     virtual binder::Status    addListener(const sp<hardware::ICameraServiceListener>& listener, | 
 | 141 |             /*out*/ | 
 | 142 |             std::vector<hardware::CameraStatus>* cameraStatuses); | 
| Eino-Ville Talvala | d56db1d | 2015-12-17 16:50:35 -0800 | [diff] [blame] | 143 |     virtual binder::Status    removeListener( | 
 | 144 |             const sp<hardware::ICameraServiceListener>& listener); | 
 | 145 |  | 
 | 146 |     virtual binder::Status    getLegacyParameters( | 
 | 147 |             int32_t cameraId, | 
| Igor Murashkin | 65d14b9 | 2014-06-17 12:03:20 -0700 | [diff] [blame] | 148 |             /*out*/ | 
 | 149 |             String16* parameters); | 
 | 150 |  | 
| Eino-Ville Talvala | d56db1d | 2015-12-17 16:50:35 -0800 | [diff] [blame] | 151 |     virtual binder::Status    setTorchMode(const String16& cameraId, bool enabled, | 
| Chien-Yu Chen | 3068d73 | 2015-02-09 13:29:57 -0800 | [diff] [blame] | 152 |             const sp<IBinder>& clientBinder); | 
 | 153 |  | 
| Eino-Ville Talvala | d56db1d | 2015-12-17 16:50:35 -0800 | [diff] [blame] | 154 |     virtual binder::Status    notifySystemEvent(int32_t eventId, | 
 | 155 |             const std::vector<int32_t>& args); | 
| Ruben Brunk | 36597b2 | 2015-03-20 22:15:57 -0700 | [diff] [blame] | 156 |  | 
| Igor Murashkin | 65d14b9 | 2014-06-17 12:03:20 -0700 | [diff] [blame] | 157 |     // OK = supports api of that version, -EOPNOTSUPP = does not support | 
| Eino-Ville Talvala | d56db1d | 2015-12-17 16:50:35 -0800 | [diff] [blame] | 158 |     virtual binder::Status    supportsCameraApi( | 
| Eino-Ville Talvala | f51fca2 | 2016-12-13 11:25:55 -0800 | [diff] [blame] | 159 |             const String16& cameraId, int32_t apiVersion, | 
| Eino-Ville Talvala | d56db1d | 2015-12-17 16:50:35 -0800 | [diff] [blame] | 160 |             /*out*/ | 
 | 161 |             bool *isSupported); | 
| Igor Murashkin | 65d14b9 | 2014-06-17 12:03:20 -0700 | [diff] [blame] | 162 |  | 
| Shuzhen Wang | f9d2c02 | 2018-08-21 12:07:35 -0700 | [diff] [blame] | 163 |     virtual binder::Status    isHiddenPhysicalCamera( | 
 | 164 |             const String16& cameraId, | 
 | 165 |             /*out*/ | 
 | 166 |             bool *isSupported); | 
 | 167 |  | 
| Igor Murashkin | 634a515 | 2013-02-20 17:15:11 -0800 | [diff] [blame] | 168 |     // Extra permissions checks | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 169 |     virtual status_t    onTransact(uint32_t code, const Parcel& data, | 
 | 170 |                                    Parcel* reply, uint32_t flags); | 
| Igor Murashkin | 634a515 | 2013-02-20 17:15:11 -0800 | [diff] [blame] | 171 |  | 
 | 172 |     virtual status_t    dump(int fd, const Vector<String16>& args); | 
 | 173 |  | 
| Svet Ganov | a453d0d | 2018-01-11 15:37:58 -0800 | [diff] [blame] | 174 |     virtual status_t    shellCommand(int in, int out, int err, const Vector<String16>& args); | 
 | 175 |  | 
| Jayant Chowdhary | f949ddd | 2019-01-29 14:34:11 -0800 | [diff] [blame] | 176 |     binder::Status      addListenerHelper(const sp<hardware::ICameraServiceListener>& listener, | 
 | 177 |             /*out*/ | 
 | 178 |             std::vector<hardware::CameraStatus>* cameraStatuses, bool isVendor = false); | 
 | 179 |  | 
| Igor Murashkin | 634a515 | 2013-02-20 17:15:11 -0800 | [diff] [blame] | 180 |     ///////////////////////////////////////////////////////////////////// | 
 | 181 |     // Client functionality | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 182 |  | 
 | 183 |     enum sound_kind { | 
 | 184 |         SOUND_SHUTTER = 0, | 
| Chien-Yu Chen | 82104eb | 2015-10-14 11:29:31 -0700 | [diff] [blame] | 185 |         SOUND_RECORDING_START = 1, | 
 | 186 |         SOUND_RECORDING_STOP = 2, | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 187 |         NUM_SOUNDS | 
 | 188 |     }; | 
 | 189 |  | 
 | 190 |     void                loadSound(); | 
 | 191 |     void                playSound(sound_kind kind); | 
 | 192 |     void                releaseSound(); | 
 | 193 |  | 
| Eino-Ville Talvala | 412fe56 | 2015-08-20 17:08:32 -0700 | [diff] [blame] | 194 |     /** | 
 | 195 |      * Update the state of a given camera device (open/close/active/idle) with | 
 | 196 |      * the camera proxy service in the system service | 
 | 197 |      */ | 
 | 198 |     static void         updateProxyDeviceState( | 
| Eino-Ville Talvala | e8c96c7 | 2017-06-27 12:24:07 -0700 | [diff] [blame] | 199 |             int newState, | 
 | 200 |             const String8& cameraId, | 
 | 201 |             int facing, | 
| Emilian Peev | 573291c | 2018-02-10 02:10:56 +0000 | [diff] [blame] | 202 |             const String16& clientName, | 
 | 203 |             int apiLevel); | 
| Eino-Ville Talvala | 412fe56 | 2015-08-20 17:08:32 -0700 | [diff] [blame] | 204 |  | 
| Igor Murashkin | 98e2472 | 2013-06-19 19:51:04 -0700 | [diff] [blame] | 205 |     ///////////////////////////////////////////////////////////////////// | 
 | 206 |     // CameraDeviceFactory functionality | 
| Eino-Ville Talvala | 2f09bac | 2016-12-13 11:29:54 -0800 | [diff] [blame] | 207 |     int                 getDeviceVersion(const String8& cameraId, int* facing = NULL); | 
| Igor Murashkin | 98e2472 | 2013-06-19 19:51:04 -0700 | [diff] [blame] | 208 |  | 
| Eino-Ville Talvala | f67e23e | 2014-07-23 17:17:59 -0700 | [diff] [blame] | 209 |     ///////////////////////////////////////////////////////////////////// | 
 | 210 |     // Shared utilities | 
| Eino-Ville Talvala | d56db1d | 2015-12-17 16:50:35 -0800 | [diff] [blame] | 211 |     static binder::Status filterGetInfoErrorCode(status_t err); | 
| Igor Murashkin | 634a515 | 2013-02-20 17:15:11 -0800 | [diff] [blame] | 212 |  | 
 | 213 |     ///////////////////////////////////////////////////////////////////// | 
 | 214 |     // CameraClient functionality | 
 | 215 |  | 
| Igor Murashkin | 634a515 | 2013-02-20 17:15:11 -0800 | [diff] [blame] | 216 |     class BasicClient : public virtual RefBase { | 
 | 217 |     public: | 
| Emilian Peev | bd8c503 | 2018-02-14 23:05:40 +0000 | [diff] [blame] | 218 |         virtual status_t       initialize(sp<CameraProviderManager> manager, | 
 | 219 |                 const String8& monitorTags) = 0; | 
| Eino-Ville Talvala | d56db1d | 2015-12-17 16:50:35 -0800 | [diff] [blame] | 220 |         virtual binder::Status disconnect(); | 
| Igor Murashkin | 634a515 | 2013-02-20 17:15:11 -0800 | [diff] [blame] | 221 |  | 
| Igor Murashkin | e7ee763 | 2013-06-11 18:10:18 -0700 | [diff] [blame] | 222 |         // because we can't virtually inherit IInterface, which breaks | 
 | 223 |         // virtual inheritance | 
| Eino-Ville Talvala | d56db1d | 2015-12-17 16:50:35 -0800 | [diff] [blame] | 224 |         virtual sp<IBinder>    asBinderWrapper() = 0; | 
| Igor Murashkin | e7ee763 | 2013-06-11 18:10:18 -0700 | [diff] [blame] | 225 |  | 
| Ruben Brunk | 9efdf95 | 2015-03-18 23:11:57 -0700 | [diff] [blame] | 226 |         // Return the remote callback binder object (e.g. ICameraDeviceCallbacks) | 
| Eino-Ville Talvala | d56db1d | 2015-12-17 16:50:35 -0800 | [diff] [blame] | 227 |         sp<IBinder>            getRemote() { | 
| Igor Murashkin | 44cfcf0 | 2013-03-01 16:22:28 -0800 | [diff] [blame] | 228 |             return mRemoteBinder; | 
| Igor Murashkin | 634a515 | 2013-02-20 17:15:11 -0800 | [diff] [blame] | 229 |         } | 
 | 230 |  | 
| Eino-Ville Talvala | c400396 | 2016-01-13 10:07:04 -0800 | [diff] [blame] | 231 |         // Disallows dumping over binder interface | 
| Eino-Ville Talvala | d56db1d | 2015-12-17 16:50:35 -0800 | [diff] [blame] | 232 |         virtual status_t dump(int fd, const Vector<String16>& args); | 
| Eino-Ville Talvala | c400396 | 2016-01-13 10:07:04 -0800 | [diff] [blame] | 233 |         // Internal dump method to be called by CameraService | 
| Eino-Ville Talvala | d56db1d | 2015-12-17 16:50:35 -0800 | [diff] [blame] | 234 |         virtual status_t dumpClient(int fd, const Vector<String16>& args) = 0; | 
| Igor Murashkin | e7ee763 | 2013-06-11 18:10:18 -0700 | [diff] [blame] | 235 |  | 
| Ruben Brunk | cc77671 | 2015-02-17 20:18:47 -0800 | [diff] [blame] | 236 |         // Return the package name for this client | 
 | 237 |         virtual String16 getPackageName() const; | 
 | 238 |  | 
 | 239 |         // Notify client about a fatal error | 
| Eino-Ville Talvala | d56db1d | 2015-12-17 16:50:35 -0800 | [diff] [blame] | 240 |         virtual void notifyError(int32_t errorCode, | 
| Ruben Brunk | cc77671 | 2015-02-17 20:18:47 -0800 | [diff] [blame] | 241 |                 const CaptureResultExtras& resultExtras) = 0; | 
 | 242 |  | 
| Ruben Brunk | 6267b53 | 2015-04-30 17:44:07 -0700 | [diff] [blame] | 243 |         // Get the UID of the application client using this | 
 | 244 |         virtual uid_t getClientUid() const; | 
 | 245 |  | 
| Ruben Brunk | cc77671 | 2015-02-17 20:18:47 -0800 | [diff] [blame] | 246 |         // Get the PID of the application client using this | 
 | 247 |         virtual int getClientPid() const; | 
| Ruben Brunk | 0bbf8b2 | 2015-04-30 14:35:42 -0700 | [diff] [blame] | 248 |  | 
 | 249 |         // Check what API level is used for this client. This is used to determine which | 
 | 250 |         // superclass this can be cast to. | 
 | 251 |         virtual bool canCastToApiClient(apiLevel level) const; | 
| Svet Ganov | a453d0d | 2018-01-11 15:37:58 -0800 | [diff] [blame] | 252 |  | 
 | 253 |         // Block the client form using the camera | 
 | 254 |         virtual void block(); | 
| Igor Murashkin | 634a515 | 2013-02-20 17:15:11 -0800 | [diff] [blame] | 255 |     protected: | 
 | 256 |         BasicClient(const sp<CameraService>& cameraService, | 
 | 257 |                 const sp<IBinder>& remoteCallback, | 
| Svetoslav Ganov | 280405a | 2015-05-12 02:19:27 +0000 | [diff] [blame] | 258 |                 const String16& clientPackageName, | 
| Eino-Ville Talvala | 2f09bac | 2016-12-13 11:29:54 -0800 | [diff] [blame] | 259 |                 const String8& cameraIdStr, | 
| Igor Murashkin | 634a515 | 2013-02-20 17:15:11 -0800 | [diff] [blame] | 260 |                 int cameraFacing, | 
 | 261 |                 int clientPid, | 
| Eino-Ville Talvala | ceb388d | 2013-02-19 10:40:14 -0800 | [diff] [blame] | 262 |                 uid_t clientUid, | 
| Igor Murashkin | 634a515 | 2013-02-20 17:15:11 -0800 | [diff] [blame] | 263 |                 int servicePid); | 
 | 264 |  | 
 | 265 |         virtual ~BasicClient(); | 
 | 266 |  | 
 | 267 |         // the instance is in the middle of destruction. When this is set, | 
 | 268 |         // the instance should not be accessed from callback. | 
 | 269 |         // CameraService's mClientLock should be acquired to access this. | 
 | 270 |         // - subclasses should set this to true in their destructors. | 
 | 271 |         bool                            mDestructionStarted; | 
 | 272 |  | 
 | 273 |         // these are initialized in the constructor. | 
| Eino-Ville Talvala | 2f09bac | 2016-12-13 11:29:54 -0800 | [diff] [blame] | 274 |         static sp<CameraService>        sCameraService; | 
 | 275 |         const String8                   mCameraIdStr; | 
 | 276 |         const int                       mCameraFacing; | 
 | 277 |         String16                        mClientPackageName; | 
| Igor Murashkin | 634a515 | 2013-02-20 17:15:11 -0800 | [diff] [blame] | 278 |         pid_t                           mClientPid; | 
| Eino-Ville Talvala | 2f09bac | 2016-12-13 11:29:54 -0800 | [diff] [blame] | 279 |         const uid_t                     mClientUid; | 
 | 280 |         const pid_t                     mServicePid; | 
| Ruben Brunk | cc77671 | 2015-02-17 20:18:47 -0800 | [diff] [blame] | 281 |         bool                            mDisconnected; | 
| Igor Murashkin | 634a515 | 2013-02-20 17:15:11 -0800 | [diff] [blame] | 282 |  | 
 | 283 |         // - The app-side Binder interface to receive callbacks from us | 
| Igor Murashkin | e7ee763 | 2013-06-11 18:10:18 -0700 | [diff] [blame] | 284 |         sp<IBinder>                     mRemoteBinder;   // immutable after constructor | 
| Eino-Ville Talvala | ceb388d | 2013-02-19 10:40:14 -0800 | [diff] [blame] | 285 |  | 
 | 286 |         // permissions management | 
 | 287 |         status_t                        startCameraOps(); | 
 | 288 |         status_t                        finishCameraOps(); | 
 | 289 |  | 
| Eino-Ville Talvala | ceb388d | 2013-02-19 10:40:14 -0800 | [diff] [blame] | 290 |     private: | 
 | 291 |         AppOpsManager                   mAppOpsManager; | 
 | 292 |  | 
 | 293 |         class OpsCallback : public BnAppOpsCallback { | 
 | 294 |         public: | 
| Chih-Hung Hsieh | 8b0b971 | 2016-08-09 14:25:53 -0700 | [diff] [blame] | 295 |             explicit OpsCallback(wp<BasicClient> client); | 
| Eino-Ville Talvala | ceb388d | 2013-02-19 10:40:14 -0800 | [diff] [blame] | 296 |             virtual void opChanged(int32_t op, const String16& packageName); | 
 | 297 |  | 
 | 298 |         private: | 
 | 299 |             wp<BasicClient> mClient; | 
 | 300 |  | 
 | 301 |         }; // class OpsCallback | 
 | 302 |  | 
 | 303 |         sp<OpsCallback> mOpsCallback; | 
 | 304 |         // Track whether startCameraOps was called successfully, to avoid | 
 | 305 |         // finishing what we didn't start. | 
 | 306 |         bool            mOpsActive; | 
 | 307 |  | 
 | 308 |         // IAppOpsCallback interface, indirected through opListener | 
 | 309 |         virtual void opChanged(int32_t op, const String16& packageName); | 
 | 310 |     }; // class BasicClient | 
| Igor Murashkin | 634a515 | 2013-02-20 17:15:11 -0800 | [diff] [blame] | 311 |  | 
| Eino-Ville Talvala | d56db1d | 2015-12-17 16:50:35 -0800 | [diff] [blame] | 312 |     class Client : public hardware::BnCamera, public BasicClient | 
| Eino-Ville Talvala | 5e08d60 | 2012-05-16 14:59:25 -0700 | [diff] [blame] | 313 |     { | 
 | 314 |     public: | 
| Eino-Ville Talvala | d56db1d | 2015-12-17 16:50:35 -0800 | [diff] [blame] | 315 |         typedef hardware::ICameraClient TCamCallbacks; | 
| Igor Murashkin | 44cfcf0 | 2013-03-01 16:22:28 -0800 | [diff] [blame] | 316 |  | 
| Eino-Ville Talvala | 5e08d60 | 2012-05-16 14:59:25 -0700 | [diff] [blame] | 317 |         // ICamera interface (see ICamera for details) | 
| Eino-Ville Talvala | d56db1d | 2015-12-17 16:50:35 -0800 | [diff] [blame] | 318 |         virtual binder::Status disconnect(); | 
 | 319 |         virtual status_t      connect(const sp<hardware::ICameraClient>& client) = 0; | 
| Eino-Ville Talvala | 5e08d60 | 2012-05-16 14:59:25 -0700 | [diff] [blame] | 320 |         virtual status_t      lock() = 0; | 
 | 321 |         virtual status_t      unlock() = 0; | 
| Eino-Ville Talvala | 1ce7c34 | 2013-08-21 13:57:21 -0700 | [diff] [blame] | 322 |         virtual status_t      setPreviewTarget(const sp<IGraphicBufferProducer>& bufferProducer)=0; | 
| Eino-Ville Talvala | 5e08d60 | 2012-05-16 14:59:25 -0700 | [diff] [blame] | 323 |         virtual void          setPreviewCallbackFlag(int flag) = 0; | 
| Eino-Ville Talvala | 3ee3550 | 2013-04-02 15:45:11 -0700 | [diff] [blame] | 324 |         virtual status_t      setPreviewCallbackTarget( | 
 | 325 |                 const sp<IGraphicBufferProducer>& callbackProducer) = 0; | 
| Eino-Ville Talvala | 5e08d60 | 2012-05-16 14:59:25 -0700 | [diff] [blame] | 326 |         virtual status_t      startPreview() = 0; | 
 | 327 |         virtual void          stopPreview() = 0; | 
 | 328 |         virtual bool          previewEnabled() = 0; | 
| Chien-Yu Chen | 8cca075 | 2015-11-13 15:28:48 -0800 | [diff] [blame] | 329 |         virtual status_t      setVideoBufferMode(int32_t videoBufferMode) = 0; | 
| Eino-Ville Talvala | 5e08d60 | 2012-05-16 14:59:25 -0700 | [diff] [blame] | 330 |         virtual status_t      startRecording() = 0; | 
 | 331 |         virtual void          stopRecording() = 0; | 
 | 332 |         virtual bool          recordingEnabled() = 0; | 
 | 333 |         virtual void          releaseRecordingFrame(const sp<IMemory>& mem) = 0; | 
 | 334 |         virtual status_t      autoFocus() = 0; | 
 | 335 |         virtual status_t      cancelAutoFocus() = 0; | 
 | 336 |         virtual status_t      takePicture(int msgType) = 0; | 
 | 337 |         virtual status_t      setParameters(const String8& params) = 0; | 
 | 338 |         virtual String8       getParameters() const = 0; | 
 | 339 |         virtual status_t      sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) = 0; | 
| Chien-Yu Chen | 8cca075 | 2015-11-13 15:28:48 -0800 | [diff] [blame] | 340 |         virtual status_t      setVideoTarget(const sp<IGraphicBufferProducer>& bufferProducer) = 0; | 
| Eino-Ville Talvala | 5e08d60 | 2012-05-16 14:59:25 -0700 | [diff] [blame] | 341 |  | 
 | 342 |         // Interface used by CameraService | 
 | 343 |         Client(const sp<CameraService>& cameraService, | 
| Eino-Ville Talvala | d56db1d | 2015-12-17 16:50:35 -0800 | [diff] [blame] | 344 |                 const sp<hardware::ICameraClient>& cameraClient, | 
| Svetoslav Ganov | 280405a | 2015-05-12 02:19:27 +0000 | [diff] [blame] | 345 |                 const String16& clientPackageName, | 
| Eino-Ville Talvala | 2f09bac | 2016-12-13 11:29:54 -0800 | [diff] [blame] | 346 |                 const String8& cameraIdStr, | 
| Yin-Chia Yeh | c3e9d6f | 2018-02-06 10:56:32 -0800 | [diff] [blame] | 347 |                 int api1CameraId, | 
| Eino-Ville Talvala | 5e08d60 | 2012-05-16 14:59:25 -0700 | [diff] [blame] | 348 |                 int cameraFacing, | 
| Igor Murashkin | ecf17e8 | 2012-10-02 16:05:11 -0700 | [diff] [blame] | 349 |                 int clientPid, | 
| Eino-Ville Talvala | ceb388d | 2013-02-19 10:40:14 -0800 | [diff] [blame] | 350 |                 uid_t clientUid, | 
| Igor Murashkin | ecf17e8 | 2012-10-02 16:05:11 -0700 | [diff] [blame] | 351 |                 int servicePid); | 
| Eino-Ville Talvala | 5e08d60 | 2012-05-16 14:59:25 -0700 | [diff] [blame] | 352 |         ~Client(); | 
 | 353 |  | 
 | 354 |         // return our camera client | 
| Eino-Ville Talvala | d56db1d | 2015-12-17 16:50:35 -0800 | [diff] [blame] | 355 |         const sp<hardware::ICameraClient>&    getRemoteCallback() { | 
| Igor Murashkin | 44cfcf0 | 2013-03-01 16:22:28 -0800 | [diff] [blame] | 356 |             return mRemoteCallback; | 
| Eino-Ville Talvala | 5e08d60 | 2012-05-16 14:59:25 -0700 | [diff] [blame] | 357 |         } | 
 | 358 |  | 
| Igor Murashkin | e7ee763 | 2013-06-11 18:10:18 -0700 | [diff] [blame] | 359 |         virtual sp<IBinder> asBinderWrapper() { | 
| Marco Nelissen | 06b4606 | 2014-11-14 07:58:25 -0800 | [diff] [blame] | 360 |             return asBinder(this); | 
| Igor Murashkin | e7ee763 | 2013-06-11 18:10:18 -0700 | [diff] [blame] | 361 |         } | 
 | 362 |  | 
| Eino-Ville Talvala | d56db1d | 2015-12-17 16:50:35 -0800 | [diff] [blame] | 363 |         virtual void         notifyError(int32_t errorCode, | 
| Jianing Wei | cb0652e | 2014-03-12 18:29:36 -0700 | [diff] [blame] | 364 |                                          const CaptureResultExtras& resultExtras); | 
| Ruben Brunk | 0bbf8b2 | 2015-04-30 14:35:42 -0700 | [diff] [blame] | 365 |  | 
 | 366 |         // Check what API level is used for this client. This is used to determine which | 
 | 367 |         // superclass this can be cast to. | 
 | 368 |         virtual bool canCastToApiClient(apiLevel level) const; | 
| Ruben Brunk | cc77671 | 2015-02-17 20:18:47 -0800 | [diff] [blame] | 369 |     protected: | 
| Igor Murashkin | 634a515 | 2013-02-20 17:15:11 -0800 | [diff] [blame] | 370 |         // Initialized in constructor | 
| Eino-Ville Talvala | 5e08d60 | 2012-05-16 14:59:25 -0700 | [diff] [blame] | 371 |  | 
| Igor Murashkin | 634a515 | 2013-02-20 17:15:11 -0800 | [diff] [blame] | 372 |         // - The app-side Binder interface to receive callbacks from us | 
| Eino-Ville Talvala | d56db1d | 2015-12-17 16:50:35 -0800 | [diff] [blame] | 373 |         sp<hardware::ICameraClient>               mRemoteCallback; | 
| Eino-Ville Talvala | ceb388d | 2013-02-19 10:40:14 -0800 | [diff] [blame] | 374 |  | 
| Eino-Ville Talvala | 2f09bac | 2016-12-13 11:29:54 -0800 | [diff] [blame] | 375 |         int mCameraId;  // All API1 clients use integer camera IDs | 
| Eino-Ville Talvala | ceb388d | 2013-02-19 10:40:14 -0800 | [diff] [blame] | 376 |     }; // class Client | 
| Igor Murashkin | 634a515 | 2013-02-20 17:15:11 -0800 | [diff] [blame] | 377 |  | 
| Ruben Brunk | 99e6971 | 2015-05-26 17:25:07 -0700 | [diff] [blame] | 378 |     /** | 
 | 379 |      * A listener class that implements the LISTENER interface for use with a ClientManager, and | 
 | 380 |      * implements the following methods: | 
 | 381 |      *    void onClientRemoved(const ClientDescriptor<KEY, VALUE>& descriptor); | 
 | 382 |      *    void onClientAdded(const ClientDescriptor<KEY, VALUE>& descriptor); | 
 | 383 |      */ | 
 | 384 |     class ClientEventListener { | 
 | 385 |     public: | 
 | 386 |         void onClientAdded(const resource_policy::ClientDescriptor<String8, | 
 | 387 |                 sp<CameraService::BasicClient>>& descriptor); | 
 | 388 |         void onClientRemoved(const resource_policy::ClientDescriptor<String8, | 
 | 389 |                 sp<CameraService::BasicClient>>& descriptor); | 
 | 390 |     }; // class ClientEventListener | 
 | 391 |  | 
| Ruben Brunk | cc77671 | 2015-02-17 20:18:47 -0800 | [diff] [blame] | 392 |     typedef std::shared_ptr<resource_policy::ClientDescriptor<String8, | 
 | 393 |             sp<CameraService::BasicClient>>> DescriptorPtr; | 
 | 394 |  | 
 | 395 |     /** | 
 | 396 |      * A container class for managing active camera clients that are using HAL devices.  Active | 
 | 397 |      * clients are represented by ClientDescriptor objects that contain strong pointers to the | 
 | 398 |      * actual BasicClient subclass binder interface implementation. | 
 | 399 |      * | 
 | 400 |      * This class manages the eviction behavior for the camera clients.  See the parent class | 
 | 401 |      * implementation in utils/ClientManager for the specifics of this behavior. | 
 | 402 |      */ | 
| Ruben Brunk | 99e6971 | 2015-05-26 17:25:07 -0700 | [diff] [blame] | 403 |     class CameraClientManager : public resource_policy::ClientManager<String8, | 
 | 404 |             sp<CameraService::BasicClient>, ClientEventListener> { | 
| Ruben Brunk | cc77671 | 2015-02-17 20:18:47 -0800 | [diff] [blame] | 405 |     public: | 
| Ruben Brunk | 99e6971 | 2015-05-26 17:25:07 -0700 | [diff] [blame] | 406 |         CameraClientManager(); | 
| Ruben Brunk | cc77671 | 2015-02-17 20:18:47 -0800 | [diff] [blame] | 407 |         virtual ~CameraClientManager(); | 
 | 408 |  | 
 | 409 |         /** | 
 | 410 |          * Return a strong pointer to the active BasicClient for this camera ID, or an empty | 
 | 411 |          * if none exists. | 
 | 412 |          */ | 
 | 413 |         sp<CameraService::BasicClient> getCameraClient(const String8& id) const; | 
 | 414 |  | 
 | 415 |         /** | 
 | 416 |          * Return a string describing the current state. | 
 | 417 |          */ | 
 | 418 |         String8 toString() const; | 
 | 419 |  | 
 | 420 |         /** | 
 | 421 |          * Make a ClientDescriptor object wrapping the given BasicClient strong pointer. | 
 | 422 |          */ | 
 | 423 |         static DescriptorPtr makeClientDescriptor(const String8& key, const sp<BasicClient>& value, | 
| Emilian Peev | 8131a26 | 2017-02-01 12:33:43 +0000 | [diff] [blame] | 424 |                 int32_t cost, const std::set<String8>& conflictingKeys, int32_t score, | 
 | 425 |                 int32_t ownerId, int32_t state); | 
| Ruben Brunk | cc77671 | 2015-02-17 20:18:47 -0800 | [diff] [blame] | 426 |  | 
 | 427 |         /** | 
 | 428 |          * Make a ClientDescriptor object wrapping the given BasicClient strong pointer with | 
 | 429 |          * values intialized from a prior ClientDescriptor. | 
 | 430 |          */ | 
 | 431 |         static DescriptorPtr makeClientDescriptor(const sp<BasicClient>& value, | 
 | 432 |                 const CameraService::DescriptorPtr& partial); | 
 | 433 |  | 
 | 434 |     }; // class CameraClientManager | 
 | 435 |  | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 436 | private: | 
| Igor Murashkin | 634a515 | 2013-02-20 17:15:11 -0800 | [diff] [blame] | 437 |  | 
| Eino-Ville Talvala | f51fca2 | 2016-12-13 11:25:55 -0800 | [diff] [blame] | 438 |     typedef hardware::camera::common::V1_0::CameraDeviceStatus CameraDeviceStatus; | 
 | 439 |  | 
 | 440 |     /** | 
 | 441 |      * Typesafe version of device status, containing both the HAL-layer and the service interface- | 
 | 442 |      * layer values. | 
 | 443 |      */ | 
 | 444 |     enum class StatusInternal : int32_t { | 
 | 445 |         NOT_PRESENT = static_cast<int32_t>(CameraDeviceStatus::NOT_PRESENT), | 
 | 446 |         PRESENT = static_cast<int32_t>(CameraDeviceStatus::PRESENT), | 
 | 447 |         ENUMERATING = static_cast<int32_t>(CameraDeviceStatus::ENUMERATING), | 
 | 448 |         NOT_AVAILABLE = static_cast<int32_t>(hardware::ICameraServiceListener::STATUS_NOT_AVAILABLE), | 
 | 449 |         UNKNOWN = static_cast<int32_t>(hardware::ICameraServiceListener::STATUS_UNKNOWN) | 
 | 450 |     }; | 
 | 451 |  | 
| Ruben Brunk | cc77671 | 2015-02-17 20:18:47 -0800 | [diff] [blame] | 452 |     /** | 
 | 453 |      * Container class for the state of each logical camera device, including: ID, status, and | 
 | 454 |      * dependencies on other devices.  The mapping of camera ID -> state saved in mCameraStates | 
 | 455 |      * represents the camera devices advertised by the HAL (and any USB devices, when we add | 
 | 456 |      * those). | 
 | 457 |      * | 
 | 458 |      * This container does NOT represent an active camera client.  These are represented using | 
 | 459 |      * the ClientDescriptors stored in mActiveClientManager. | 
 | 460 |      */ | 
 | 461 |     class CameraState { | 
 | 462 |     public: | 
| Eino-Ville Talvala | 2f09bac | 2016-12-13 11:29:54 -0800 | [diff] [blame] | 463 |  | 
| Ruben Brunk | cc77671 | 2015-02-17 20:18:47 -0800 | [diff] [blame] | 464 |         /** | 
 | 465 |          * Make a new CameraState and set the ID, cost, and conflicting devices using the values | 
 | 466 |          * returned in the HAL's camera_info struct for each device. | 
 | 467 |          */ | 
 | 468 |         CameraState(const String8& id, int cost, const std::set<String8>& conflicting); | 
 | 469 |         virtual ~CameraState(); | 
 | 470 |  | 
 | 471 |         /** | 
 | 472 |          * Return the status for this device. | 
 | 473 |          * | 
 | 474 |          * This method acquires mStatusLock. | 
 | 475 |          */ | 
| Eino-Ville Talvala | f51fca2 | 2016-12-13 11:25:55 -0800 | [diff] [blame] | 476 |         StatusInternal getStatus() const; | 
| Ruben Brunk | cc77671 | 2015-02-17 20:18:47 -0800 | [diff] [blame] | 477 |  | 
 | 478 |         /** | 
 | 479 |          * This function updates the status for this camera device, unless the given status | 
 | 480 |          * is in the given list of rejected status states, and execute the function passed in | 
| Eino-Ville Talvala | d56db1d | 2015-12-17 16:50:35 -0800 | [diff] [blame] | 481 |          * with a signature onStatusUpdateLocked(const String8&, int32_t) | 
| Ruben Brunk | cc77671 | 2015-02-17 20:18:47 -0800 | [diff] [blame] | 482 |          * if the status has changed. | 
 | 483 |          * | 
 | 484 |          * This method is idempotent, and will not result in the function passed to | 
 | 485 |          * onStatusUpdateLocked being called more than once for the same arguments. | 
 | 486 |          * This method aquires mStatusLock. | 
 | 487 |          */ | 
 | 488 |         template<class Func> | 
| Eino-Ville Talvala | f51fca2 | 2016-12-13 11:25:55 -0800 | [diff] [blame] | 489 |         void updateStatus(StatusInternal status, | 
 | 490 |                 const String8& cameraId, | 
 | 491 |                 std::initializer_list<StatusInternal> rejectSourceStates, | 
| Ruben Brunk | cc77671 | 2015-02-17 20:18:47 -0800 | [diff] [blame] | 492 |                 Func onStatusUpdatedLocked); | 
 | 493 |  | 
 | 494 |         /** | 
 | 495 |          * Return the last set CameraParameters object generated from the information returned by | 
 | 496 |          * the HAL for this device (or an empty CameraParameters object if none has been set). | 
 | 497 |          */ | 
 | 498 |         CameraParameters getShimParams() const; | 
 | 499 |  | 
 | 500 |         /** | 
 | 501 |          * Set the CameraParameters for this device. | 
 | 502 |          */ | 
 | 503 |         void setShimParams(const CameraParameters& params); | 
 | 504 |  | 
 | 505 |         /** | 
 | 506 |          * Return the resource_cost advertised by the HAL for this device. | 
 | 507 |          */ | 
 | 508 |         int getCost() const; | 
 | 509 |  | 
 | 510 |         /** | 
 | 511 |          * Return a set of the IDs of conflicting devices advertised by the HAL for this device. | 
 | 512 |          */ | 
 | 513 |         std::set<String8> getConflicting() const; | 
 | 514 |  | 
 | 515 |         /** | 
 | 516 |          * Return the ID of this camera device. | 
 | 517 |          */ | 
 | 518 |         String8 getId() const; | 
 | 519 |  | 
 | 520 |     private: | 
 | 521 |         const String8 mId; | 
| Eino-Ville Talvala | f51fca2 | 2016-12-13 11:25:55 -0800 | [diff] [blame] | 522 |         StatusInternal mStatus; // protected by mStatusLock | 
| Ruben Brunk | cc77671 | 2015-02-17 20:18:47 -0800 | [diff] [blame] | 523 |         const int mCost; | 
 | 524 |         std::set<String8> mConflicting; | 
 | 525 |         mutable Mutex mStatusLock; | 
 | 526 |         CameraParameters mShimParams; | 
 | 527 |     }; // class CameraState | 
 | 528 |  | 
| Svet Ganov | a453d0d | 2018-01-11 15:37:58 -0800 | [diff] [blame] | 529 |     // Observer for UID lifecycle enforcing that UIDs in idle | 
 | 530 |     // state cannot use the camera to protect user privacy. | 
| Eino-Ville Talvala | 8abec3f | 2018-03-20 11:07:00 -0700 | [diff] [blame] | 531 |     class UidPolicy : public BnUidObserver, public virtual IBinder::DeathRecipient { | 
| Svet Ganov | a453d0d | 2018-01-11 15:37:58 -0800 | [diff] [blame] | 532 |     public: | 
 | 533 |         explicit UidPolicy(sp<CameraService> service) | 
| Eino-Ville Talvala | 8abec3f | 2018-03-20 11:07:00 -0700 | [diff] [blame] | 534 |                 : mRegistered(false), mService(service) {} | 
| Svet Ganov | a453d0d | 2018-01-11 15:37:58 -0800 | [diff] [blame] | 535 |  | 
 | 536 |         void registerSelf(); | 
 | 537 |         void unregisterSelf(); | 
 | 538 |  | 
| Svet Ganov | 7b4ab78 | 2018-03-25 12:48:10 -0700 | [diff] [blame] | 539 |         bool isUidActive(uid_t uid, String16 callingPackage); | 
| Svet Ganov | a453d0d | 2018-01-11 15:37:58 -0800 | [diff] [blame] | 540 |  | 
 | 541 |         void onUidGone(uid_t uid, bool disabled); | 
 | 542 |         void onUidActive(uid_t uid); | 
 | 543 |         void onUidIdle(uid_t uid, bool disabled); | 
| Eric Laurent | e8c8b43 | 2018-10-17 10:08:02 -0700 | [diff] [blame] | 544 |         void onUidStateChanged(uid_t uid __unused, int32_t procState __unused, int64_t procStateSeq __unused) {} | 
| Svet Ganov | a453d0d | 2018-01-11 15:37:58 -0800 | [diff] [blame] | 545 |  | 
| Svet Ganov | 7b4ab78 | 2018-03-25 12:48:10 -0700 | [diff] [blame] | 546 |         void addOverrideUid(uid_t uid, String16 callingPackage, bool active); | 
 | 547 |         void removeOverrideUid(uid_t uid, String16 callingPackage); | 
| Svet Ganov | a453d0d | 2018-01-11 15:37:58 -0800 | [diff] [blame] | 548 |  | 
| Eino-Ville Talvala | 8abec3f | 2018-03-20 11:07:00 -0700 | [diff] [blame] | 549 |         // IBinder::DeathRecipient implementation | 
 | 550 |         virtual void binderDied(const wp<IBinder> &who); | 
| Svet Ganov | a453d0d | 2018-01-11 15:37:58 -0800 | [diff] [blame] | 551 |     private: | 
| Svet Ganov | 7b4ab78 | 2018-03-25 12:48:10 -0700 | [diff] [blame] | 552 |         bool isUidActiveLocked(uid_t uid, String16 callingPackage); | 
 | 553 |         void updateOverrideUid(uid_t uid, String16 callingPackage, bool active, bool insert); | 
| Svet Ganov | a453d0d | 2018-01-11 15:37:58 -0800 | [diff] [blame] | 554 |  | 
 | 555 |         Mutex mUidLock; | 
| Eino-Ville Talvala | 8abec3f | 2018-03-20 11:07:00 -0700 | [diff] [blame] | 556 |         bool mRegistered; | 
| Svet Ganov | a453d0d | 2018-01-11 15:37:58 -0800 | [diff] [blame] | 557 |         wp<CameraService> mService; | 
 | 558 |         std::unordered_set<uid_t> mActiveUids; | 
 | 559 |         std::unordered_map<uid_t, bool> mOverrideUids; | 
 | 560 |     }; // class UidPolicy | 
 | 561 |  | 
| Michael Groover | d1d435a | 2018-12-18 17:39:42 -0800 | [diff] [blame] | 562 |     // If sensor privacy is enabled then all apps, including those that are active, should be | 
 | 563 |     // prevented from accessing the camera. | 
 | 564 |     class SensorPrivacyPolicy : public hardware::BnSensorPrivacyListener, | 
 | 565 |             public virtual IBinder::DeathRecipient { | 
 | 566 |         public: | 
 | 567 |             explicit SensorPrivacyPolicy(wp<CameraService> service) | 
 | 568 |                     : mService(service), mSensorPrivacyEnabled(false), mRegistered(false) {} | 
 | 569 |  | 
 | 570 |             void registerSelf(); | 
 | 571 |             void unregisterSelf(); | 
 | 572 |  | 
 | 573 |             bool isSensorPrivacyEnabled(); | 
 | 574 |  | 
 | 575 |             binder::Status onSensorPrivacyChanged(bool enabled); | 
 | 576 |  | 
 | 577 |             // IBinder::DeathRecipient implementation | 
 | 578 |             virtual void binderDied(const wp<IBinder> &who); | 
 | 579 |  | 
 | 580 |         private: | 
 | 581 |             wp<CameraService> mService; | 
 | 582 |             Mutex mSensorPrivacyLock; | 
 | 583 |             bool mSensorPrivacyEnabled; | 
 | 584 |             bool mRegistered; | 
 | 585 |     }; | 
 | 586 |  | 
| Svet Ganov | a453d0d | 2018-01-11 15:37:58 -0800 | [diff] [blame] | 587 |     sp<UidPolicy> mUidPolicy; | 
 | 588 |  | 
| Michael Groover | d1d435a | 2018-12-18 17:39:42 -0800 | [diff] [blame] | 589 |     sp<SensorPrivacyPolicy> mSensorPrivacyPolicy; | 
 | 590 |  | 
| Igor Murashkin | 634a515 | 2013-02-20 17:15:11 -0800 | [diff] [blame] | 591 |     // Delay-load the Camera HAL module | 
 | 592 |     virtual void onFirstRef(); | 
 | 593 |  | 
| Eino-Ville Talvala | 2f09bac | 2016-12-13 11:29:54 -0800 | [diff] [blame] | 594 |     // Eumerate all camera providers in the system | 
 | 595 |     status_t enumerateProviders(); | 
 | 596 |  | 
| Yin-Chia Yeh | c3e9d6f | 2018-02-06 10:56:32 -0800 | [diff] [blame] | 597 |     // Add/remove a new camera to camera and torch state lists or remove an unplugged one | 
 | 598 |     // Caller must not hold mServiceLock | 
| Guennadi Liakhovetski | 151e3be | 2017-11-28 16:34:18 +0100 | [diff] [blame] | 599 |     void addStates(const String8 id); | 
| Guennadi Liakhovetski | 6034bf5 | 2017-12-07 10:28:29 +0100 | [diff] [blame] | 600 |     void removeStates(const String8 id); | 
| Guennadi Liakhovetski | 151e3be | 2017-11-28 16:34:18 +0100 | [diff] [blame] | 601 |  | 
| Ruben Brunk | cc77671 | 2015-02-17 20:18:47 -0800 | [diff] [blame] | 602 |     // Check if we can connect, before we acquire the service lock. | 
| Chien-Yu Chen | 18df60e | 2016-03-18 18:18:09 -0700 | [diff] [blame] | 603 |     // The returned originalClientPid is the PID of the original process that wants to connect to | 
 | 604 |     // camera. | 
 | 605 |     // The returned clientPid is the PID of the client that directly connects to camera. | 
 | 606 |     // originalClientPid and clientPid are usually the same except when the application uses | 
 | 607 |     // mediaserver to connect to camera (using MediaRecorder to connect to camera). In that case, | 
 | 608 |     // clientPid is the PID of mediaserver and originalClientPid is the PID of the application. | 
| Eino-Ville Talvala | d56db1d | 2015-12-17 16:50:35 -0800 | [diff] [blame] | 609 |     binder::Status validateConnectLocked(const String8& cameraId, const String8& clientName8, | 
| Chien-Yu Chen | 7939aee | 2016-03-21 18:19:33 -0700 | [diff] [blame] | 610 |             /*inout*/int& clientUid, /*inout*/int& clientPid, /*out*/int& originalClientPid) const; | 
| Eino-Ville Talvala | 0492686 | 2016-03-02 15:42:53 -0800 | [diff] [blame] | 611 |     binder::Status validateClientPermissionsLocked(const String8& cameraId, const String8& clientName8, | 
| Chien-Yu Chen | 7939aee | 2016-03-21 18:19:33 -0700 | [diff] [blame] | 612 |             /*inout*/int& clientUid, /*inout*/int& clientPid, /*out*/int& originalClientPid) const; | 
| Igor Murashkin | e6800ce | 2013-03-04 17:25:57 -0800 | [diff] [blame] | 613 |  | 
| Ruben Brunk | cc77671 | 2015-02-17 20:18:47 -0800 | [diff] [blame] | 614 |     // Handle active client evictions, and update service state. | 
 | 615 |     // Only call with with mServiceLock held. | 
 | 616 |     status_t handleEvictionsLocked(const String8& cameraId, int clientPid, | 
 | 617 |         apiLevel effectiveApiLevel, const sp<IBinder>& remoteCallback, const String8& packageName, | 
 | 618 |         /*out*/ | 
 | 619 |         sp<BasicClient>* client, | 
 | 620 |         std::shared_ptr<resource_policy::ClientDescriptor<String8, sp<BasicClient>>>* partial); | 
| Igor Murashkin | e6800ce | 2013-03-04 17:25:57 -0800 | [diff] [blame] | 621 |  | 
| Jayant Chowdhary | f949ddd | 2019-01-29 14:34:11 -0800 | [diff] [blame] | 622 |     // Should an operation attempt on a cameraId be rejected, if the camera id is | 
 | 623 |     // advertised as a publically hidden secure camera, by the camera HAL ? | 
 | 624 |     bool shouldRejectHiddenCameraConnection(const String8 & cameraId); | 
 | 625 |  | 
| Ruben Brunk | cc77671 | 2015-02-17 20:18:47 -0800 | [diff] [blame] | 626 |     // Single implementation shared between the various connect calls | 
 | 627 |     template<class CALLBACK, class CLIENT> | 
| Eino-Ville Talvala | d56db1d | 2015-12-17 16:50:35 -0800 | [diff] [blame] | 628 |     binder::Status connectHelper(const sp<CALLBACK>& cameraCb, const String8& cameraId, | 
| Yin-Chia Yeh | c3e9d6f | 2018-02-06 10:56:32 -0800 | [diff] [blame] | 629 |             int api1CameraId, int halVersion, const String16& clientPackageName, | 
| Shuzhen Wang | 06fcfb0 | 2018-07-30 18:23:31 -0700 | [diff] [blame] | 630 |             int clientUid, int clientPid, apiLevel effectiveApiLevel, bool shimUpdateOnly, | 
| Chien-Yu Chen | 98a668f | 2015-12-18 14:10:33 -0800 | [diff] [blame] | 631 |             /*out*/sp<CLIENT>& device); | 
| Igor Murashkin | e6800ce | 2013-03-04 17:25:57 -0800 | [diff] [blame] | 632 |  | 
| Ruben Brunk | cc77671 | 2015-02-17 20:18:47 -0800 | [diff] [blame] | 633 |     // Lock guarding camera service state | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 634 |     Mutex               mServiceLock; | 
| Ruben Brunk | cc77671 | 2015-02-17 20:18:47 -0800 | [diff] [blame] | 635 |  | 
 | 636 |     // Condition to use with mServiceLock, used to handle simultaneous connect calls from clients | 
 | 637 |     std::shared_ptr<WaitableMutexWrapper> mServiceLockWrapper; | 
 | 638 |  | 
 | 639 |     // Return NO_ERROR if the device with a give ID can be connected to | 
 | 640 |     status_t checkIfDeviceIsUsable(const String8& cameraId) const; | 
 | 641 |  | 
 | 642 |     // Container for managing currently active application-layer clients | 
 | 643 |     CameraClientManager mActiveClientManager; | 
 | 644 |  | 
 | 645 |     // Mapping from camera ID -> state for each device, map is protected by mCameraStatesLock | 
 | 646 |     std::map<String8, std::shared_ptr<CameraState>> mCameraStates; | 
 | 647 |  | 
 | 648 |     // Mutex guarding mCameraStates map | 
 | 649 |     mutable Mutex mCameraStatesLock; | 
 | 650 |  | 
 | 651 |     // Circular buffer for storing event logging for dumps | 
 | 652 |     RingBuffer<String8> mEventLog; | 
| Ruben Brunk | a8ca915 | 2015-04-07 14:23:40 -0700 | [diff] [blame] | 653 |     Mutex mLogLock; | 
| Ruben Brunk | cc77671 | 2015-02-17 20:18:47 -0800 | [diff] [blame] | 654 |  | 
| Emilian Peev | bd8c503 | 2018-02-14 23:05:40 +0000 | [diff] [blame] | 655 |     // The last monitored tags set by client | 
 | 656 |     String8 mMonitorTags; | 
 | 657 |  | 
| Ruben Brunk | 6267b53 | 2015-04-30 17:44:07 -0700 | [diff] [blame] | 658 |     // Currently allowed user IDs | 
 | 659 |     std::set<userid_t> mAllowedUsers; | 
| Ruben Brunk | 36597b2 | 2015-03-20 22:15:57 -0700 | [diff] [blame] | 660 |  | 
| Ruben Brunk | cc77671 | 2015-02-17 20:18:47 -0800 | [diff] [blame] | 661 |     /** | 
 | 662 |      * Get the camera state for a given camera id. | 
 | 663 |      * | 
 | 664 |      * This acquires mCameraStatesLock. | 
 | 665 |      */ | 
 | 666 |     std::shared_ptr<CameraService::CameraState> getCameraState(const String8& cameraId) const; | 
 | 667 |  | 
 | 668 |     /** | 
 | 669 |      * Evict client who's remote binder has died.  Returns true if this client was in the active | 
 | 670 |      * list and was disconnected. | 
 | 671 |      * | 
 | 672 |      * This method acquires mServiceLock. | 
 | 673 |      */ | 
 | 674 |     bool evictClientIdByRemote(const wp<IBinder>& cameraClient); | 
 | 675 |  | 
 | 676 |     /** | 
 | 677 |      * Remove the given client from the active clients list; does not disconnect the client. | 
 | 678 |      * | 
 | 679 |      * This method acquires mServiceLock. | 
 | 680 |      */ | 
 | 681 |     void removeByClient(const BasicClient* client); | 
 | 682 |  | 
 | 683 |     /** | 
 | 684 |      * Add new client to active clients list after conflicting clients have disconnected using the | 
 | 685 |      * values set in the partial descriptor passed in to construct the actual client descriptor. | 
 | 686 |      * This is typically called at the end of a connect call. | 
 | 687 |      * | 
 | 688 |      * This method must be called with mServiceLock held. | 
 | 689 |      */ | 
 | 690 |     void finishConnectLocked(const sp<BasicClient>& client, const DescriptorPtr& desc); | 
 | 691 |  | 
 | 692 |     /** | 
| Yin-Chia Yeh | c3e9d6f | 2018-02-06 10:56:32 -0800 | [diff] [blame] | 693 |      * Returns the underlying camera Id string mapped to a camera id int | 
 | 694 |      * Empty string is returned when the cameraIdInt is invalid. | 
| Ruben Brunk | cc77671 | 2015-02-17 20:18:47 -0800 | [diff] [blame] | 695 |      */ | 
| Yin-Chia Yeh | c3e9d6f | 2018-02-06 10:56:32 -0800 | [diff] [blame] | 696 |     String8 cameraIdIntToStr(int cameraIdInt); | 
 | 697 |  | 
 | 698 |     /** | 
 | 699 |      * Returns the underlying camera Id string mapped to a camera id int | 
 | 700 |      * Empty string is returned when the cameraIdInt is invalid. | 
 | 701 |      */ | 
 | 702 |     std::string cameraIdIntToStrLocked(int cameraIdInt); | 
| Ruben Brunk | cc77671 | 2015-02-17 20:18:47 -0800 | [diff] [blame] | 703 |  | 
 | 704 |     /** | 
 | 705 |      * Remove a single client corresponding to the given camera id from the list of active clients. | 
 | 706 |      * If none exists, return an empty strongpointer. | 
 | 707 |      * | 
 | 708 |      * This method must be called with mServiceLock held. | 
 | 709 |      */ | 
 | 710 |     sp<CameraService::BasicClient> removeClientLocked(const String8& cameraId); | 
 | 711 |  | 
 | 712 |     /** | 
| Ruben Brunk | 36597b2 | 2015-03-20 22:15:57 -0700 | [diff] [blame] | 713 |      * Handle a notification that the current device user has changed. | 
 | 714 |      */ | 
| Eino-Ville Talvala | d56db1d | 2015-12-17 16:50:35 -0800 | [diff] [blame] | 715 |     void doUserSwitch(const std::vector<int32_t>& newUserIds); | 
| Ruben Brunk | 36597b2 | 2015-03-20 22:15:57 -0700 | [diff] [blame] | 716 |  | 
 | 717 |     /** | 
| Ruben Brunk | a8ca915 | 2015-04-07 14:23:40 -0700 | [diff] [blame] | 718 |      * Add an event log message. | 
| Ruben Brunk | cc77671 | 2015-02-17 20:18:47 -0800 | [diff] [blame] | 719 |      */ | 
| Ruben Brunk | a8ca915 | 2015-04-07 14:23:40 -0700 | [diff] [blame] | 720 |     void logEvent(const char* event); | 
| Ruben Brunk | cc77671 | 2015-02-17 20:18:47 -0800 | [diff] [blame] | 721 |  | 
 | 722 |     /** | 
| Ruben Brunk | a8ca915 | 2015-04-07 14:23:40 -0700 | [diff] [blame] | 723 |      * Add an event log message that a client has been disconnected. | 
| Ruben Brunk | cc77671 | 2015-02-17 20:18:47 -0800 | [diff] [blame] | 724 |      */ | 
| Ruben Brunk | a8ca915 | 2015-04-07 14:23:40 -0700 | [diff] [blame] | 725 |     void logDisconnected(const char* cameraId, int clientPid, const char* clientPackage); | 
 | 726 |  | 
 | 727 |     /** | 
 | 728 |      * Add an event log message that a client has been connected. | 
 | 729 |      */ | 
 | 730 |     void logConnected(const char* cameraId, int clientPid, const char* clientPackage); | 
 | 731 |  | 
 | 732 |     /** | 
 | 733 |      * Add an event log message that a client's connect attempt has been rejected. | 
 | 734 |      */ | 
 | 735 |     void logRejected(const char* cameraId, int clientPid, const char* clientPackage, | 
 | 736 |             const char* reason); | 
 | 737 |  | 
 | 738 |     /** | 
 | 739 |      * Add an event log message that the current device user has been switched. | 
 | 740 |      */ | 
| Ruben Brunk | 6267b53 | 2015-04-30 17:44:07 -0700 | [diff] [blame] | 741 |     void logUserSwitch(const std::set<userid_t>& oldUserIds, | 
 | 742 |         const std::set<userid_t>& newUserIds); | 
| Ruben Brunk | a8ca915 | 2015-04-07 14:23:40 -0700 | [diff] [blame] | 743 |  | 
 | 744 |     /** | 
 | 745 |      * Add an event log message that a device has been removed by the HAL | 
 | 746 |      */ | 
 | 747 |     void logDeviceRemoved(const char* cameraId, const char* reason); | 
 | 748 |  | 
 | 749 |     /** | 
 | 750 |      * Add an event log message that a device has been added by the HAL | 
 | 751 |      */ | 
 | 752 |     void logDeviceAdded(const char* cameraId, const char* reason); | 
 | 753 |  | 
 | 754 |     /** | 
 | 755 |      * Add an event log message that a client has unexpectedly died. | 
 | 756 |      */ | 
 | 757 |     void logClientDied(int clientPid, const char* reason); | 
| Ruben Brunk | cc77671 | 2015-02-17 20:18:47 -0800 | [diff] [blame] | 758 |  | 
| Eino-Ville Talvala | 1527f07 | 2015-04-07 15:55:31 -0700 | [diff] [blame] | 759 |     /** | 
 | 760 |      * Add a event log message that a serious service-level error has occured | 
| Eino-Ville Talvala | d309fb9 | 2015-11-25 12:12:45 -0800 | [diff] [blame] | 761 |      * The errorCode should be one of the Android Errors | 
| Eino-Ville Talvala | 1527f07 | 2015-04-07 15:55:31 -0700 | [diff] [blame] | 762 |      */ | 
 | 763 |     void logServiceError(const char* msg, int errorCode); | 
 | 764 |  | 
 | 765 |     /** | 
 | 766 |      * Dump the event log to an FD | 
 | 767 |      */ | 
 | 768 |     void dumpEventLog(int fd); | 
 | 769 |  | 
| Yin-Chia Yeh | c3e9d6f | 2018-02-06 10:56:32 -0800 | [diff] [blame] | 770 |     /** | 
 | 771 |      * This method will acquire mServiceLock | 
 | 772 |      */ | 
 | 773 |     void updateCameraNumAndIds(); | 
 | 774 |  | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 775 |     int                 mNumberOfCameras; | 
| Yin-Chia Yeh | c3e9d6f | 2018-02-06 10:56:32 -0800 | [diff] [blame] | 776 |  | 
 | 777 |     std::vector<std::string> mNormalDeviceIds; | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 778 |  | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 779 |     // sounds | 
| Jaekyun Seok | ef49805 | 2018-03-23 13:09:44 +0900 | [diff] [blame] | 780 |     sp<MediaPlayer>     newMediaPlayer(const char *file); | 
| Chih-Chung Chang | ff4f55c | 2011-10-17 19:03:12 +0800 | [diff] [blame] | 781 |  | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 782 |     Mutex               mSoundLock; | 
 | 783 |     sp<MediaPlayer>     mSoundPlayer[NUM_SOUNDS]; | 
 | 784 |     int                 mSoundRef;  // reference count (release all MediaPlayer when 0) | 
 | 785 |  | 
| Eino-Ville Talvala | 2f09bac | 2016-12-13 11:29:54 -0800 | [diff] [blame] | 786 |     // Basic flag on whether the camera subsystem is in a usable state | 
 | 787 |     bool                mInitialized; | 
 | 788 |  | 
| Eino-Ville Talvala | 2f09bac | 2016-12-13 11:29:54 -0800 | [diff] [blame] | 789 |     sp<CameraProviderManager> mCameraProviderManager; | 
| Igor Murashkin | ecf17e8 | 2012-10-02 16:05:11 -0700 | [diff] [blame] | 790 |  | 
| Ruben Brunk | cc77671 | 2015-02-17 20:18:47 -0800 | [diff] [blame] | 791 |     // Guarded by mStatusListenerMutex | 
| Jayant Chowdhary | f949ddd | 2019-01-29 14:34:11 -0800 | [diff] [blame] | 792 |     std::vector<std::pair<bool, sp<hardware::ICameraServiceListener>>> mListenerList; | 
 | 793 |  | 
| Ruben Brunk | cc77671 | 2015-02-17 20:18:47 -0800 | [diff] [blame] | 794 |     Mutex       mStatusListenerLock; | 
| Igor Murashkin | bfc9915 | 2013-02-27 12:55:20 -0800 | [diff] [blame] | 795 |  | 
| Ruben Brunk | cc77671 | 2015-02-17 20:18:47 -0800 | [diff] [blame] | 796 |     /** | 
 | 797 |      * Update the status for the given camera id (if that device exists), and broadcast the | 
 | 798 |      * status update to all current ICameraServiceListeners if the status has changed.  Any | 
 | 799 |      * statuses in rejectedSourceStates will be ignored. | 
 | 800 |      * | 
 | 801 |      * This method must be idempotent. | 
 | 802 |      * This method acquires mStatusLock and mStatusListenerLock. | 
 | 803 |      */ | 
| Eino-Ville Talvala | f51fca2 | 2016-12-13 11:25:55 -0800 | [diff] [blame] | 804 |     void updateStatus(StatusInternal status, | 
 | 805 |             const String8& cameraId, | 
 | 806 |             std::initializer_list<StatusInternal> | 
 | 807 |                 rejectedSourceStates); | 
 | 808 |     void updateStatus(StatusInternal status, | 
 | 809 |             const String8& cameraId); | 
| Igor Murashkin | bfc9915 | 2013-02-27 12:55:20 -0800 | [diff] [blame] | 810 |  | 
| Chien-Yu Chen | 3068d73 | 2015-02-09 13:29:57 -0800 | [diff] [blame] | 811 |     // flashlight control | 
 | 812 |     sp<CameraFlashlight> mFlashlight; | 
| Chien-Yu Chen | 88da526 | 2015-02-17 13:56:46 -0800 | [diff] [blame] | 813 |     // guard mTorchStatusMap | 
| Chien-Yu Chen | 3068d73 | 2015-02-09 13:29:57 -0800 | [diff] [blame] | 814 |     Mutex                mTorchStatusMutex; | 
| Chien-Yu Chen | fe751be | 2015-09-01 14:16:44 -0700 | [diff] [blame] | 815 |     // guard mTorchClientMap | 
| Chien-Yu Chen | 88da526 | 2015-02-17 13:56:46 -0800 | [diff] [blame] | 816 |     Mutex                mTorchClientMapMutex; | 
| Chien-Yu Chen | fe751be | 2015-09-01 14:16:44 -0700 | [diff] [blame] | 817 |     // guard mTorchUidMap | 
 | 818 |     Mutex                mTorchUidMapMutex; | 
| Chien-Yu Chen | 3068d73 | 2015-02-09 13:29:57 -0800 | [diff] [blame] | 819 |     // camera id -> torch status | 
| Eino-Ville Talvala | f51fca2 | 2016-12-13 11:25:55 -0800 | [diff] [blame] | 820 |     KeyedVector<String8, hardware::camera::common::V1_0::TorchModeStatus> | 
 | 821 |             mTorchStatusMap; | 
| Chien-Yu Chen | 3068d73 | 2015-02-09 13:29:57 -0800 | [diff] [blame] | 822 |     // camera id -> torch client binder | 
 | 823 |     // only store the last client that turns on each camera's torch mode | 
| Ruben Brunk | 99e6971 | 2015-05-26 17:25:07 -0700 | [diff] [blame] | 824 |     KeyedVector<String8, sp<IBinder>> mTorchClientMap; | 
 | 825 |     // camera id -> [incoming uid, current uid] pair | 
 | 826 |     std::map<String8, std::pair<int, int>> mTorchUidMap; | 
| Chien-Yu Chen | 3068d73 | 2015-02-09 13:29:57 -0800 | [diff] [blame] | 827 |  | 
 | 828 |     // check and handle if torch client's process has died | 
 | 829 |     void handleTorchClientBinderDied(const wp<IBinder> &who); | 
 | 830 |  | 
 | 831 |     // handle torch mode status change and invoke callbacks. mTorchStatusMutex | 
 | 832 |     // should be locked. | 
| Chien-Yu Chen | 88da526 | 2015-02-17 13:56:46 -0800 | [diff] [blame] | 833 |     void onTorchStatusChangedLocked(const String8& cameraId, | 
| Eino-Ville Talvala | f51fca2 | 2016-12-13 11:25:55 -0800 | [diff] [blame] | 834 |             hardware::camera::common::V1_0::TorchModeStatus newStatus); | 
| Chien-Yu Chen | 3068d73 | 2015-02-09 13:29:57 -0800 | [diff] [blame] | 835 |  | 
 | 836 |     // get a camera's torch status. mTorchStatusMutex should be locked. | 
| Chien-Yu Chen | 88da526 | 2015-02-17 13:56:46 -0800 | [diff] [blame] | 837 |     status_t getTorchStatusLocked(const String8 &cameraId, | 
| Eino-Ville Talvala | f51fca2 | 2016-12-13 11:25:55 -0800 | [diff] [blame] | 838 |              hardware::camera::common::V1_0::TorchModeStatus *status) const; | 
| Chien-Yu Chen | 3068d73 | 2015-02-09 13:29:57 -0800 | [diff] [blame] | 839 |  | 
 | 840 |     // set a camera's torch status. mTorchStatusMutex should be locked. | 
| Chien-Yu Chen | 88da526 | 2015-02-17 13:56:46 -0800 | [diff] [blame] | 841 |     status_t setTorchStatusLocked(const String8 &cameraId, | 
| Eino-Ville Talvala | f51fca2 | 2016-12-13 11:25:55 -0800 | [diff] [blame] | 842 |             hardware::camera::common::V1_0::TorchModeStatus status); | 
| Chien-Yu Chen | 3068d73 | 2015-02-09 13:29:57 -0800 | [diff] [blame] | 843 |  | 
| Igor Murashkin | ecf17e8 | 2012-10-02 16:05:11 -0700 | [diff] [blame] | 844 |     // IBinder::DeathRecipient implementation | 
| Igor Murashkin | bfc9915 | 2013-02-27 12:55:20 -0800 | [diff] [blame] | 845 |     virtual void        binderDied(const wp<IBinder> &who); | 
| Igor Murashkin | 634a515 | 2013-02-20 17:15:11 -0800 | [diff] [blame] | 846 |  | 
| Ruben Brunk | b2119af | 2014-05-09 19:57:56 -0700 | [diff] [blame] | 847 |     /** | 
| Ruben Brunk | b2119af | 2014-05-09 19:57:56 -0700 | [diff] [blame] | 848 |      * Initialize and cache the metadata used by the HAL1 shim for a given cameraId. | 
 | 849 |      * | 
| Eino-Ville Talvala | d56db1d | 2015-12-17 16:50:35 -0800 | [diff] [blame] | 850 |      * Sets Status to a service-specific error on failure | 
| Ruben Brunk | b2119af | 2014-05-09 19:57:56 -0700 | [diff] [blame] | 851 |      */ | 
| Eino-Ville Talvala | d56db1d | 2015-12-17 16:50:35 -0800 | [diff] [blame] | 852 |     binder::Status      initializeShimMetadata(int cameraId); | 
| Ruben Brunk | b2119af | 2014-05-09 19:57:56 -0700 | [diff] [blame] | 853 |  | 
 | 854 |     /** | 
| Igor Murashkin | 65d14b9 | 2014-06-17 12:03:20 -0700 | [diff] [blame] | 855 |      * Get the cached CameraParameters for the camera. If they haven't been | 
 | 856 |      * cached yet, then initialize them for the first time. | 
 | 857 |      * | 
| Eino-Ville Talvala | d56db1d | 2015-12-17 16:50:35 -0800 | [diff] [blame] | 858 |      * Sets Status to a service-specific error on failure | 
| Igor Murashkin | 65d14b9 | 2014-06-17 12:03:20 -0700 | [diff] [blame] | 859 |      */ | 
| Eino-Ville Talvala | d56db1d | 2015-12-17 16:50:35 -0800 | [diff] [blame] | 860 |     binder::Status      getLegacyParametersLazy(int cameraId, /*out*/CameraParameters* parameters); | 
| Igor Murashkin | 65d14b9 | 2014-06-17 12:03:20 -0700 | [diff] [blame] | 861 |  | 
| Svet Ganov | a453d0d | 2018-01-11 15:37:58 -0800 | [diff] [blame] | 862 |     // Blocks all clients from the UID | 
 | 863 |     void blockClientsForUid(uid_t uid); | 
 | 864 |  | 
| Michael Groover | d1d435a | 2018-12-18 17:39:42 -0800 | [diff] [blame] | 865 |     // Blocks all active clients. | 
 | 866 |     void blockAllClients(); | 
 | 867 |  | 
| Svet Ganov | a453d0d | 2018-01-11 15:37:58 -0800 | [diff] [blame] | 868 |     // Overrides the UID state as if it is idle | 
 | 869 |     status_t handleSetUidState(const Vector<String16>& args, int err); | 
 | 870 |  | 
 | 871 |     // Clears the override for the UID state | 
 | 872 |     status_t handleResetUidState(const Vector<String16>& args, int err); | 
 | 873 |  | 
 | 874 |     // Gets the UID state | 
 | 875 |     status_t handleGetUidState(const Vector<String16>& args, int out, int err); | 
 | 876 |  | 
 | 877 |     // Prints the shell command help | 
 | 878 |     status_t printHelp(int out); | 
 | 879 |  | 
| Ruben Brunk | b2119af | 2014-05-09 19:57:56 -0700 | [diff] [blame] | 880 |     /** | 
| Ruben Brunk | cc77671 | 2015-02-17 20:18:47 -0800 | [diff] [blame] | 881 |      * Get the current system time as a formatted string. | 
| Ruben Brunk | b2119af | 2014-05-09 19:57:56 -0700 | [diff] [blame] | 882 |      */ | 
| Ruben Brunk | cc77671 | 2015-02-17 20:18:47 -0800 | [diff] [blame] | 883 |     static String8 getFormattedCurrentTime(); | 
 | 884 |  | 
| Eino-Ville Talvala | d56db1d | 2015-12-17 16:50:35 -0800 | [diff] [blame] | 885 |     static binder::Status makeClient(const sp<CameraService>& cameraService, | 
| Eino-Ville Talvala | 2f09bac | 2016-12-13 11:29:54 -0800 | [diff] [blame] | 886 |             const sp<IInterface>& cameraCb, const String16& packageName, const String8& cameraId, | 
| Yin-Chia Yeh | c3e9d6f | 2018-02-06 10:56:32 -0800 | [diff] [blame] | 887 |             int api1CameraId, int facing, int clientPid, uid_t clientUid, int servicePid, | 
| Shuzhen Wang | 06fcfb0 | 2018-07-30 18:23:31 -0700 | [diff] [blame] | 888 |             int halVersion, int deviceVersion, apiLevel effectiveApiLevel, | 
| Ruben Brunk | cc77671 | 2015-02-17 20:18:47 -0800 | [diff] [blame] | 889 |             /*out*/sp<BasicClient>* client); | 
| Ruben Brunk | 6267b53 | 2015-04-30 17:44:07 -0700 | [diff] [blame] | 890 |  | 
 | 891 |     status_t checkCameraAccess(const String16& opPackageName); | 
 | 892 |  | 
 | 893 |     static String8 toString(std::set<userid_t> intSet); | 
| Eino-Ville Talvala | f51fca2 | 2016-12-13 11:25:55 -0800 | [diff] [blame] | 894 |     static int32_t mapToInterface(hardware::camera::common::V1_0::TorchModeStatus status); | 
 | 895 |     static StatusInternal mapToInternal(hardware::camera::common::V1_0::CameraDeviceStatus status); | 
 | 896 |     static int32_t mapToInterface(StatusInternal status); | 
| Ruben Brunk | 6267b53 | 2015-04-30 17:44:07 -0700 | [diff] [blame] | 897 |  | 
| Eino-Ville Talvala | e8c96c7 | 2017-06-27 12:24:07 -0700 | [diff] [blame] | 898 |     static sp<hardware::ICameraServiceProxy> getCameraServiceProxy(); | 
| Ruben Brunk | 2823ce0 | 2015-05-19 17:25:13 -0700 | [diff] [blame] | 899 |     static void pingCameraServiceProxy(); | 
 | 900 |  | 
| Shuzhen Wang | 7d859d4 | 2018-11-06 15:33:23 -0800 | [diff] [blame] | 901 |     void broadcastTorchModeStatus(const String8& cameraId, | 
 | 902 |             hardware::camera::common::V1_0::TorchModeStatus status); | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 903 | }; | 
 | 904 |  | 
| Mathias Agopian | 65ab471 | 2010-07-14 17:59:35 -0700 | [diff] [blame] | 905 | } // namespace android | 
 | 906 |  | 
 | 907 | #endif |