1*ec779b8eSAndroid Build Coastguard Worker /* 2*ec779b8eSAndroid Build Coastguard Worker * Copyright (C) 2008 The Android Open Source Project 3*ec779b8eSAndroid Build Coastguard Worker * 4*ec779b8eSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*ec779b8eSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*ec779b8eSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*ec779b8eSAndroid Build Coastguard Worker * 8*ec779b8eSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*ec779b8eSAndroid Build Coastguard Worker * 10*ec779b8eSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*ec779b8eSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*ec779b8eSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*ec779b8eSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*ec779b8eSAndroid Build Coastguard Worker * limitations under the License. 15*ec779b8eSAndroid Build Coastguard Worker */ 16*ec779b8eSAndroid Build Coastguard Worker 17*ec779b8eSAndroid Build Coastguard Worker #ifndef ANDROID_SERVERS_CAMERA_CAMERASERVICE_H 18*ec779b8eSAndroid Build Coastguard Worker #define ANDROID_SERVERS_CAMERA_CAMERASERVICE_H 19*ec779b8eSAndroid Build Coastguard Worker 20*ec779b8eSAndroid Build Coastguard Worker #include <android/content/AttributionSourceState.h> 21*ec779b8eSAndroid Build Coastguard Worker #include <android/hardware/BnCameraService.h> 22*ec779b8eSAndroid Build Coastguard Worker #include <android/hardware/BnSensorPrivacyListener.h> 23*ec779b8eSAndroid Build Coastguard Worker #include <android/hardware/ICameraServiceListener.h> 24*ec779b8eSAndroid Build Coastguard Worker #include <android/hardware/camera2/BnCameraInjectionSession.h> 25*ec779b8eSAndroid Build Coastguard Worker #include <android/hardware/camera2/ICameraInjectionCallback.h> 26*ec779b8eSAndroid Build Coastguard Worker 27*ec779b8eSAndroid Build Coastguard Worker #include <binder/ActivityManager.h> 28*ec779b8eSAndroid Build Coastguard Worker #include <binder/AppOpsManager.h> 29*ec779b8eSAndroid Build Coastguard Worker #include <binder/BinderService.h> 30*ec779b8eSAndroid Build Coastguard Worker #include <binder/IActivityManager.h> 31*ec779b8eSAndroid Build Coastguard Worker #include <binder/IAppOpsCallback.h> 32*ec779b8eSAndroid Build Coastguard Worker #include <binder/IServiceManager.h> 33*ec779b8eSAndroid Build Coastguard Worker #include <binder/IUidObserver.h> 34*ec779b8eSAndroid Build Coastguard Worker #include <cutils/multiuser.h> 35*ec779b8eSAndroid Build Coastguard Worker #include <gui/Flags.h> 36*ec779b8eSAndroid Build Coastguard Worker #include <hardware/camera.h> 37*ec779b8eSAndroid Build Coastguard Worker #include <sensorprivacy/SensorPrivacyManager.h> 38*ec779b8eSAndroid Build Coastguard Worker #include <utils/KeyedVector.h> 39*ec779b8eSAndroid Build Coastguard Worker #include <utils/Vector.h> 40*ec779b8eSAndroid Build Coastguard Worker 41*ec779b8eSAndroid Build Coastguard Worker #include <android/hardware/camera/common/1.0/types.h> 42*ec779b8eSAndroid Build Coastguard Worker 43*ec779b8eSAndroid Build Coastguard Worker #include <camera/VendorTagDescriptor.h> 44*ec779b8eSAndroid Build Coastguard Worker #include <camera/CaptureResult.h> 45*ec779b8eSAndroid Build Coastguard Worker #include <camera/CameraParameters.h> 46*ec779b8eSAndroid Build Coastguard Worker #include <camera/camera2/ConcurrentCamera.h> 47*ec779b8eSAndroid Build Coastguard Worker 48*ec779b8eSAndroid Build Coastguard Worker #include "CameraFlashlight.h" 49*ec779b8eSAndroid Build Coastguard Worker 50*ec779b8eSAndroid Build Coastguard Worker #include "common/CameraProviderManager.h" 51*ec779b8eSAndroid Build Coastguard Worker #include "media/RingBuffer.h" 52*ec779b8eSAndroid Build Coastguard Worker #include "utils/AutoConditionLock.h" 53*ec779b8eSAndroid Build Coastguard Worker #include "utils/ClientManager.h" 54*ec779b8eSAndroid Build Coastguard Worker #include "utils/IPCTransport.h" 55*ec779b8eSAndroid Build Coastguard Worker #include "utils/CameraServiceProxyWrapper.h" 56*ec779b8eSAndroid Build Coastguard Worker #include "utils/AttributionAndPermissionUtils.h" 57*ec779b8eSAndroid Build Coastguard Worker #include "utils/VirtualDeviceCameraIdMapper.h" 58*ec779b8eSAndroid Build Coastguard Worker 59*ec779b8eSAndroid Build Coastguard Worker #include <set> 60*ec779b8eSAndroid Build Coastguard Worker #include <string> 61*ec779b8eSAndroid Build Coastguard Worker #include <list> 62*ec779b8eSAndroid Build Coastguard Worker #include <map> 63*ec779b8eSAndroid Build Coastguard Worker #include <memory> 64*ec779b8eSAndroid Build Coastguard Worker #include <mutex> 65*ec779b8eSAndroid Build Coastguard Worker #include <optional> 66*ec779b8eSAndroid Build Coastguard Worker #include <utility> 67*ec779b8eSAndroid Build Coastguard Worker #include <unordered_map> 68*ec779b8eSAndroid Build Coastguard Worker #include <unordered_set> 69*ec779b8eSAndroid Build Coastguard Worker #include <vector> 70*ec779b8eSAndroid Build Coastguard Worker 71*ec779b8eSAndroid Build Coastguard Worker namespace android { 72*ec779b8eSAndroid Build Coastguard Worker 73*ec779b8eSAndroid Build Coastguard Worker extern volatile int32_t gLogLevel; 74*ec779b8eSAndroid Build Coastguard Worker 75*ec779b8eSAndroid Build Coastguard Worker class MemoryHeapBase; 76*ec779b8eSAndroid Build Coastguard Worker class MediaPlayer; 77*ec779b8eSAndroid Build Coastguard Worker 78*ec779b8eSAndroid Build Coastguard Worker class CameraService : 79*ec779b8eSAndroid Build Coastguard Worker public BinderService<CameraService>, 80*ec779b8eSAndroid Build Coastguard Worker public virtual ::android::hardware::BnCameraService, 81*ec779b8eSAndroid Build Coastguard Worker public virtual IBinder::DeathRecipient, 82*ec779b8eSAndroid Build Coastguard Worker public virtual CameraProviderManager::StatusListener, 83*ec779b8eSAndroid Build Coastguard Worker public virtual IServiceManager::LocalRegistrationCallback, 84*ec779b8eSAndroid Build Coastguard Worker public AttributionAndPermissionUtilsEncapsulator 85*ec779b8eSAndroid Build Coastguard Worker { 86*ec779b8eSAndroid Build Coastguard Worker friend class BinderService<CameraService>; 87*ec779b8eSAndroid Build Coastguard Worker friend class CameraOfflineSessionClient; 88*ec779b8eSAndroid Build Coastguard Worker public: 89*ec779b8eSAndroid Build Coastguard Worker class Client; 90*ec779b8eSAndroid Build Coastguard Worker class BasicClient; 91*ec779b8eSAndroid Build Coastguard Worker class OfflineClient; 92*ec779b8eSAndroid Build Coastguard Worker 93*ec779b8eSAndroid Build Coastguard Worker // The effective API level. The Camera2 API running in LEGACY mode counts as API_1. 94*ec779b8eSAndroid Build Coastguard Worker enum apiLevel { 95*ec779b8eSAndroid Build Coastguard Worker API_1 = 1, 96*ec779b8eSAndroid Build Coastguard Worker API_2 = 2 97*ec779b8eSAndroid Build Coastguard Worker }; 98*ec779b8eSAndroid Build Coastguard Worker 99*ec779b8eSAndroid Build Coastguard Worker // 3 second busy timeout when other clients are connecting 100*ec779b8eSAndroid Build Coastguard Worker static const nsecs_t DEFAULT_CONNECT_TIMEOUT_NS = 3000000000; 101*ec779b8eSAndroid Build Coastguard Worker 102*ec779b8eSAndroid Build Coastguard Worker // 1 second busy timeout when other clients are disconnecting 103*ec779b8eSAndroid Build Coastguard Worker static const nsecs_t DEFAULT_DISCONNECT_TIMEOUT_NS = 1000000000; 104*ec779b8eSAndroid Build Coastguard Worker 105*ec779b8eSAndroid Build Coastguard Worker // Default number of messages to store in eviction log 106*ec779b8eSAndroid Build Coastguard Worker static const size_t DEFAULT_EVENT_LOG_LENGTH = 100; 107*ec779b8eSAndroid Build Coastguard Worker 108*ec779b8eSAndroid Build Coastguard Worker // Event log ID 109*ec779b8eSAndroid Build Coastguard Worker static const int SN_EVENT_LOG_ID = 0x534e4554; 110*ec779b8eSAndroid Build Coastguard Worker 111*ec779b8eSAndroid Build Coastguard Worker // Keep this in sync with frameworks/base/core/java/android/os/UserHandle.java 112*ec779b8eSAndroid Build Coastguard Worker static const userid_t USER_SYSTEM = 0; 113*ec779b8eSAndroid Build Coastguard Worker 114*ec779b8eSAndroid Build Coastguard Worker // Register camera service 115*ec779b8eSAndroid Build Coastguard Worker static void instantiate(); 116*ec779b8eSAndroid Build Coastguard Worker 117*ec779b8eSAndroid Build Coastguard Worker // Implementation of BinderService<T> getServiceName()118*ec779b8eSAndroid Build Coastguard Worker static char const* getServiceName() { return "media.camera"; } 119*ec779b8eSAndroid Build Coastguard Worker 120*ec779b8eSAndroid Build Coastguard Worker // Implementation of IServiceManager::LocalRegistrationCallback 121*ec779b8eSAndroid Build Coastguard Worker virtual void onServiceRegistration(const String16& name, const sp<IBinder>& binder) override; 122*ec779b8eSAndroid Build Coastguard Worker 123*ec779b8eSAndroid Build Coastguard Worker // Non-null arguments for cameraServiceProxyWrapper should be provided for 124*ec779b8eSAndroid Build Coastguard Worker // testing purposes only. 125*ec779b8eSAndroid Build Coastguard Worker CameraService(std::shared_ptr<CameraServiceProxyWrapper> 126*ec779b8eSAndroid Build Coastguard Worker cameraServiceProxyWrapper = nullptr, 127*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<AttributionAndPermissionUtils> 128*ec779b8eSAndroid Build Coastguard Worker attributionAndPermissionUtils = nullptr); 129*ec779b8eSAndroid Build Coastguard Worker virtual ~CameraService(); 130*ec779b8eSAndroid Build Coastguard Worker 131*ec779b8eSAndroid Build Coastguard Worker ///////////////////////////////////////////////////////////////////// 132*ec779b8eSAndroid Build Coastguard Worker // HAL Callbacks - implements CameraProviderManager::StatusListener 133*ec779b8eSAndroid Build Coastguard Worker 134*ec779b8eSAndroid Build Coastguard Worker virtual void onDeviceStatusChanged(const std::string &cameraId, 135*ec779b8eSAndroid Build Coastguard Worker CameraDeviceStatus newHalStatus) override; 136*ec779b8eSAndroid Build Coastguard Worker virtual void onDeviceStatusChanged(const std::string &cameraId, 137*ec779b8eSAndroid Build Coastguard Worker const std::string &physicalCameraId, 138*ec779b8eSAndroid Build Coastguard Worker CameraDeviceStatus newHalStatus) override; 139*ec779b8eSAndroid Build Coastguard Worker // This method may hold CameraProviderManager::mInterfaceMutex as a part 140*ec779b8eSAndroid Build Coastguard Worker // of calling getSystemCameraKind() internally. Care should be taken not to 141*ec779b8eSAndroid Build Coastguard Worker // directly / indirectly call this from callers who also hold 142*ec779b8eSAndroid Build Coastguard Worker // mInterfaceMutex. 143*ec779b8eSAndroid Build Coastguard Worker virtual void onTorchStatusChanged(const std::string& cameraId, 144*ec779b8eSAndroid Build Coastguard Worker TorchModeStatus newStatus) override; 145*ec779b8eSAndroid Build Coastguard Worker // Does not hold CameraProviderManager::mInterfaceMutex. 146*ec779b8eSAndroid Build Coastguard Worker virtual void onTorchStatusChanged(const std::string& cameraId, 147*ec779b8eSAndroid Build Coastguard Worker TorchModeStatus newStatus, 148*ec779b8eSAndroid Build Coastguard Worker SystemCameraKind kind) override; 149*ec779b8eSAndroid Build Coastguard Worker virtual void onNewProviderRegistered() override; 150*ec779b8eSAndroid Build Coastguard Worker 151*ec779b8eSAndroid Build Coastguard Worker ///////////////////////////////////////////////////////////////////// 152*ec779b8eSAndroid Build Coastguard Worker // ICameraService 153*ec779b8eSAndroid Build Coastguard Worker // IMPORTANT: All binder calls that deal with logicalCameraId should use 154*ec779b8eSAndroid Build Coastguard Worker // resolveCameraId(logicalCameraId, deviceId, devicePolicy) to arrive at the correct 155*ec779b8eSAndroid Build Coastguard Worker // cameraId to perform the operation on (in case of contexts 156*ec779b8eSAndroid Build Coastguard Worker // associated with virtual devices). 157*ec779b8eSAndroid Build Coastguard Worker virtual binder::Status getNumberOfCameras(int32_t type, 158*ec779b8eSAndroid Build Coastguard Worker const AttributionSourceState& clientAttribution, 159*ec779b8eSAndroid Build Coastguard Worker int32_t devicePolicy, int32_t* numCameras); 160*ec779b8eSAndroid Build Coastguard Worker 161*ec779b8eSAndroid Build Coastguard Worker virtual binder::Status getCameraInfo(int cameraId, int rotationOverride, 162*ec779b8eSAndroid Build Coastguard Worker const AttributionSourceState& clientAttribution, 163*ec779b8eSAndroid Build Coastguard Worker int32_t devicePolicy, hardware::CameraInfo* cameraInfo) override; 164*ec779b8eSAndroid Build Coastguard Worker virtual binder::Status getCameraCharacteristics(const std::string& cameraId, 165*ec779b8eSAndroid Build Coastguard Worker int targetSdkVersion, int rotationOverride, 166*ec779b8eSAndroid Build Coastguard Worker const AttributionSourceState& clientAttribution, 167*ec779b8eSAndroid Build Coastguard Worker int32_t devicePolicy, CameraMetadata* cameraInfo) override; 168*ec779b8eSAndroid Build Coastguard Worker virtual binder::Status getCameraVendorTagDescriptor( 169*ec779b8eSAndroid Build Coastguard Worker /*out*/ 170*ec779b8eSAndroid Build Coastguard Worker hardware::camera2::params::VendorTagDescriptor* desc); 171*ec779b8eSAndroid Build Coastguard Worker virtual binder::Status getCameraVendorTagCache( 172*ec779b8eSAndroid Build Coastguard Worker /*out*/ 173*ec779b8eSAndroid Build Coastguard Worker hardware::camera2::params::VendorTagDescriptorCache* cache); 174*ec779b8eSAndroid Build Coastguard Worker 175*ec779b8eSAndroid Build Coastguard Worker virtual binder::Status connect(const sp<hardware::ICameraClient>& cameraClient, 176*ec779b8eSAndroid Build Coastguard Worker int32_t cameraId, int targetSdkVersion, int rotationOverride, bool forceSlowJpegMode, 177*ec779b8eSAndroid Build Coastguard Worker const AttributionSourceState& clientAttribution, 178*ec779b8eSAndroid Build Coastguard Worker int32_t devicePolicy, /*out*/ sp<hardware::ICamera>* device) override; 179*ec779b8eSAndroid Build Coastguard Worker 180*ec779b8eSAndroid Build Coastguard Worker virtual binder::Status connectDevice( 181*ec779b8eSAndroid Build Coastguard Worker const sp<hardware::camera2::ICameraDeviceCallbacks>& cameraCb, 182*ec779b8eSAndroid Build Coastguard Worker const std::string& cameraId, int scoreOffset, int targetSdkVersion, 183*ec779b8eSAndroid Build Coastguard Worker int rotationOverride, const AttributionSourceState& clientAttribution, 184*ec779b8eSAndroid Build Coastguard Worker int32_t devicePolicy, bool sharedMode, 185*ec779b8eSAndroid Build Coastguard Worker /*out*/ 186*ec779b8eSAndroid Build Coastguard Worker sp<hardware::camera2::ICameraDeviceUser>* device); 187*ec779b8eSAndroid Build Coastguard Worker 188*ec779b8eSAndroid Build Coastguard Worker virtual binder::Status addListener(const sp<hardware::ICameraServiceListener>& listener, 189*ec779b8eSAndroid Build Coastguard Worker /*out*/ 190*ec779b8eSAndroid Build Coastguard Worker std::vector<hardware::CameraStatus>* cameraStatuses); 191*ec779b8eSAndroid Build Coastguard Worker virtual binder::Status removeListener( 192*ec779b8eSAndroid Build Coastguard Worker const sp<hardware::ICameraServiceListener>& listener); 193*ec779b8eSAndroid Build Coastguard Worker 194*ec779b8eSAndroid Build Coastguard Worker virtual binder::Status getConcurrentCameraIds( 195*ec779b8eSAndroid Build Coastguard Worker /*out*/ 196*ec779b8eSAndroid Build Coastguard Worker std::vector<hardware::camera2::utils::ConcurrentCameraIdCombination>* concurrentCameraIds); 197*ec779b8eSAndroid Build Coastguard Worker 198*ec779b8eSAndroid Build Coastguard Worker virtual binder::Status isConcurrentSessionConfigurationSupported( 199*ec779b8eSAndroid Build Coastguard Worker const std::vector<hardware::camera2::utils::CameraIdAndSessionConfiguration>& sessions, 200*ec779b8eSAndroid Build Coastguard Worker int targetSdkVersion, const AttributionSourceState& clientAttribution, int32_t devicePolicy, 201*ec779b8eSAndroid Build Coastguard Worker /*out*/bool* supported); 202*ec779b8eSAndroid Build Coastguard Worker 203*ec779b8eSAndroid Build Coastguard Worker virtual binder::Status getLegacyParameters( 204*ec779b8eSAndroid Build Coastguard Worker int32_t cameraId, 205*ec779b8eSAndroid Build Coastguard Worker /*out*/ 206*ec779b8eSAndroid Build Coastguard Worker std::string* parameters); 207*ec779b8eSAndroid Build Coastguard Worker 208*ec779b8eSAndroid Build Coastguard Worker virtual binder::Status setTorchMode(const std::string& cameraId, bool enabled, 209*ec779b8eSAndroid Build Coastguard Worker const sp<IBinder>& clientBinder, const AttributionSourceState& clientAttribution, 210*ec779b8eSAndroid Build Coastguard Worker int32_t devicePolicy); 211*ec779b8eSAndroid Build Coastguard Worker 212*ec779b8eSAndroid Build Coastguard Worker virtual binder::Status turnOnTorchWithStrengthLevel(const std::string& cameraId, 213*ec779b8eSAndroid Build Coastguard Worker int32_t torchStrength, const sp<IBinder>& clientBinder, 214*ec779b8eSAndroid Build Coastguard Worker const AttributionSourceState& clientAttribution, 215*ec779b8eSAndroid Build Coastguard Worker int32_t devicePolicy); 216*ec779b8eSAndroid Build Coastguard Worker 217*ec779b8eSAndroid Build Coastguard Worker virtual binder::Status getTorchStrengthLevel(const std::string& cameraId, 218*ec779b8eSAndroid Build Coastguard Worker const AttributionSourceState& clientAttribution, 219*ec779b8eSAndroid Build Coastguard Worker int32_t devicePolicy, int32_t* torchStrength); 220*ec779b8eSAndroid Build Coastguard Worker 221*ec779b8eSAndroid Build Coastguard Worker virtual binder::Status notifySystemEvent(int32_t eventId, 222*ec779b8eSAndroid Build Coastguard Worker const std::vector<int32_t>& args); 223*ec779b8eSAndroid Build Coastguard Worker 224*ec779b8eSAndroid Build Coastguard Worker virtual binder::Status notifyDeviceStateChange(int64_t newState); 225*ec779b8eSAndroid Build Coastguard Worker 226*ec779b8eSAndroid Build Coastguard Worker virtual binder::Status notifyDisplayConfigurationChange(); 227*ec779b8eSAndroid Build Coastguard Worker 228*ec779b8eSAndroid Build Coastguard Worker // OK = supports api of that version, -EOPNOTSUPP = does not support 229*ec779b8eSAndroid Build Coastguard Worker virtual binder::Status supportsCameraApi( 230*ec779b8eSAndroid Build Coastguard Worker const std::string& cameraId, int32_t apiVersion, 231*ec779b8eSAndroid Build Coastguard Worker /*out*/ 232*ec779b8eSAndroid Build Coastguard Worker bool *isSupported); 233*ec779b8eSAndroid Build Coastguard Worker 234*ec779b8eSAndroid Build Coastguard Worker virtual binder::Status isHiddenPhysicalCamera( 235*ec779b8eSAndroid Build Coastguard Worker const std::string& cameraId, 236*ec779b8eSAndroid Build Coastguard Worker /*out*/ 237*ec779b8eSAndroid Build Coastguard Worker bool *isSupported); 238*ec779b8eSAndroid Build Coastguard Worker 239*ec779b8eSAndroid Build Coastguard Worker virtual binder::Status injectCamera( 240*ec779b8eSAndroid Build Coastguard Worker const std::string& packageName, const std::string& internalCamId, 241*ec779b8eSAndroid Build Coastguard Worker const std::string& externalCamId, 242*ec779b8eSAndroid Build Coastguard Worker const sp<hardware::camera2::ICameraInjectionCallback>& callback, 243*ec779b8eSAndroid Build Coastguard Worker /*out*/ 244*ec779b8eSAndroid Build Coastguard Worker sp<hardware::camera2::ICameraInjectionSession>* cameraInjectionSession); 245*ec779b8eSAndroid Build Coastguard Worker 246*ec779b8eSAndroid Build Coastguard Worker virtual binder::Status reportExtensionSessionStats( 247*ec779b8eSAndroid Build Coastguard Worker const hardware::CameraExtensionSessionStats& stats, std::string* sessionKey /*out*/); 248*ec779b8eSAndroid Build Coastguard Worker 249*ec779b8eSAndroid Build Coastguard Worker virtual binder::Status injectSessionParams( 250*ec779b8eSAndroid Build Coastguard Worker const std::string& cameraId, 251*ec779b8eSAndroid Build Coastguard Worker const hardware::camera2::impl::CameraMetadataNative& sessionParams); 252*ec779b8eSAndroid Build Coastguard Worker 253*ec779b8eSAndroid Build Coastguard Worker virtual binder::Status createDefaultRequest(const std::string& cameraId, int templateId, 254*ec779b8eSAndroid Build Coastguard Worker const AttributionSourceState& clientAttribution, int32_t devicePolicy, 255*ec779b8eSAndroid Build Coastguard Worker /*out*/ 256*ec779b8eSAndroid Build Coastguard Worker hardware::camera2::impl::CameraMetadataNative* request); 257*ec779b8eSAndroid Build Coastguard Worker 258*ec779b8eSAndroid Build Coastguard Worker virtual binder::Status isSessionConfigurationWithParametersSupported( 259*ec779b8eSAndroid Build Coastguard Worker const std::string& cameraId, int targetSdkVersion, 260*ec779b8eSAndroid Build Coastguard Worker const SessionConfiguration& sessionConfiguration, 261*ec779b8eSAndroid Build Coastguard Worker const AttributionSourceState& clientAttribution, int32_t devicePolicy, 262*ec779b8eSAndroid Build Coastguard Worker /*out*/ bool* supported); 263*ec779b8eSAndroid Build Coastguard Worker 264*ec779b8eSAndroid Build Coastguard Worker virtual binder::Status getSessionCharacteristics( 265*ec779b8eSAndroid Build Coastguard Worker const std::string& cameraId, int targetSdkVersion, int rotationOverride, 266*ec779b8eSAndroid Build Coastguard Worker const SessionConfiguration& sessionConfiguration, 267*ec779b8eSAndroid Build Coastguard Worker const AttributionSourceState& clientAttribution, 268*ec779b8eSAndroid Build Coastguard Worker int32_t devicePolicy, /*out*/ CameraMetadata* outMetadata); 269*ec779b8eSAndroid Build Coastguard Worker 270*ec779b8eSAndroid Build Coastguard Worker // Extra permissions checks 271*ec779b8eSAndroid Build Coastguard Worker virtual status_t onTransact(uint32_t code, const Parcel& data, 272*ec779b8eSAndroid Build Coastguard Worker Parcel* reply, uint32_t flags); 273*ec779b8eSAndroid Build Coastguard Worker 274*ec779b8eSAndroid Build Coastguard Worker virtual status_t dump(int fd, const Vector<String16>& args); 275*ec779b8eSAndroid Build Coastguard Worker 276*ec779b8eSAndroid Build Coastguard Worker virtual status_t shellCommand(int in, int out, int err, const Vector<String16>& args); 277*ec779b8eSAndroid Build Coastguard Worker 278*ec779b8eSAndroid Build Coastguard Worker binder::Status addListenerHelper(const sp<hardware::ICameraServiceListener>& listener, 279*ec779b8eSAndroid Build Coastguard Worker /*out*/ 280*ec779b8eSAndroid Build Coastguard Worker std::vector<hardware::CameraStatus>* cameraStatuses, bool isVendor = false, 281*ec779b8eSAndroid Build Coastguard Worker bool isProcessLocalTest = false); 282*ec779b8eSAndroid Build Coastguard Worker 283*ec779b8eSAndroid Build Coastguard Worker binder::Status connectDeviceVendor( 284*ec779b8eSAndroid Build Coastguard Worker const sp<hardware::camera2::ICameraDeviceCallbacks>& cameraCb, 285*ec779b8eSAndroid Build Coastguard Worker const std::string& cameraId, int scoreOffset, int targetSdkVersion, 286*ec779b8eSAndroid Build Coastguard Worker int rotationOverride, const AttributionSourceState& clientAttribution, 287*ec779b8eSAndroid Build Coastguard Worker int32_t devicePolicy, bool sharedMode, 288*ec779b8eSAndroid Build Coastguard Worker /*out*/ 289*ec779b8eSAndroid Build Coastguard Worker sp<hardware::camera2::ICameraDeviceUser>* device); 290*ec779b8eSAndroid Build Coastguard Worker 291*ec779b8eSAndroid Build Coastguard Worker // Monitored UIDs availability notification 292*ec779b8eSAndroid Build Coastguard Worker void notifyMonitoredUids(); 293*ec779b8eSAndroid Build Coastguard Worker void notifyMonitoredUids(const std::unordered_set<uid_t> ¬ifyUidSet); 294*ec779b8eSAndroid Build Coastguard Worker 295*ec779b8eSAndroid Build Coastguard Worker // Stores current open session device info in temp file. 296*ec779b8eSAndroid Build Coastguard Worker void cacheDump(); 297*ec779b8eSAndroid Build Coastguard Worker 298*ec779b8eSAndroid Build Coastguard Worker // Register an offline client for a given active camera id 299*ec779b8eSAndroid Build Coastguard Worker status_t addOfflineClient(const std::string &cameraId, sp<BasicClient> offlineClient); 300*ec779b8eSAndroid Build Coastguard Worker 301*ec779b8eSAndroid Build Coastguard Worker ///////////////////////////////////////////////////////////////////// 302*ec779b8eSAndroid Build Coastguard Worker // Client functionality 303*ec779b8eSAndroid Build Coastguard Worker 304*ec779b8eSAndroid Build Coastguard Worker enum sound_kind { 305*ec779b8eSAndroid Build Coastguard Worker SOUND_SHUTTER = 0, 306*ec779b8eSAndroid Build Coastguard Worker SOUND_RECORDING_START = 1, 307*ec779b8eSAndroid Build Coastguard Worker SOUND_RECORDING_STOP = 2, 308*ec779b8eSAndroid Build Coastguard Worker NUM_SOUNDS 309*ec779b8eSAndroid Build Coastguard Worker }; 310*ec779b8eSAndroid Build Coastguard Worker 311*ec779b8eSAndroid Build Coastguard Worker void playSound(sound_kind kind); 312*ec779b8eSAndroid Build Coastguard Worker void loadSoundLocked(sound_kind kind); 313*ec779b8eSAndroid Build Coastguard Worker void decreaseSoundRef(); 314*ec779b8eSAndroid Build Coastguard Worker void increaseSoundRef(); 315*ec779b8eSAndroid Build Coastguard Worker 316*ec779b8eSAndroid Build Coastguard Worker ///////////////////////////////////////////////////////////////////// 317*ec779b8eSAndroid Build Coastguard Worker // CameraDeviceFactory functionality 318*ec779b8eSAndroid Build Coastguard Worker std::pair<int, IPCTransport> getDeviceVersion(const std::string& cameraId, 319*ec779b8eSAndroid Build Coastguard Worker int rotationOverride, 320*ec779b8eSAndroid Build Coastguard Worker int* portraitRotation, 321*ec779b8eSAndroid Build Coastguard Worker int* facing = nullptr, int* orientation = nullptr); 322*ec779b8eSAndroid Build Coastguard Worker 323*ec779b8eSAndroid Build Coastguard Worker ///////////////////////////////////////////////////////////////////// 324*ec779b8eSAndroid Build Coastguard Worker // Methods to be used in CameraService class tests only 325*ec779b8eSAndroid Build Coastguard Worker // 326*ec779b8eSAndroid Build Coastguard Worker // CameraService class test method only - clear static variables in the 327*ec779b8eSAndroid Build Coastguard Worker // cameraserver process, which otherwise might affect multiple test runs. 328*ec779b8eSAndroid Build Coastguard Worker void clearCachedVariables(); 329*ec779b8eSAndroid Build Coastguard Worker 330*ec779b8eSAndroid Build Coastguard Worker // Add test listener, linkToDeath won't be called since this is for process 331*ec779b8eSAndroid Build Coastguard Worker // local testing. 332*ec779b8eSAndroid Build Coastguard Worker binder::Status addListenerTest(const sp<hardware::ICameraServiceListener>& listener, 333*ec779b8eSAndroid Build Coastguard Worker /*out*/ 334*ec779b8eSAndroid Build Coastguard Worker std::vector<hardware::CameraStatus>* cameraStatuses); 335*ec779b8eSAndroid Build Coastguard Worker 336*ec779b8eSAndroid Build Coastguard Worker ///////////////////////////////////////////////////////////////////// 337*ec779b8eSAndroid Build Coastguard Worker // Shared utilities 338*ec779b8eSAndroid Build Coastguard Worker static binder::Status filterGetInfoErrorCode(status_t err); 339*ec779b8eSAndroid Build Coastguard Worker 340*ec779b8eSAndroid Build Coastguard Worker /** 341*ec779b8eSAndroid Build Coastguard Worker * Returns true if the device is an automotive device and cameraId is system 342*ec779b8eSAndroid Build Coastguard Worker * only camera which has characteristic AUTOMOTIVE_LOCATION value as either 343*ec779b8eSAndroid Build Coastguard Worker * AUTOMOTIVE_LOCATION_EXTERIOR_LEFT,AUTOMOTIVE_LOCATION_EXTERIOR_RIGHT, 344*ec779b8eSAndroid Build Coastguard Worker * AUTOMOTIVE_LOCATION_EXTERIOR_FRONT or AUTOMOTIVE_LOCATION_EXTERIOR_REAR. 345*ec779b8eSAndroid Build Coastguard Worker */ 346*ec779b8eSAndroid Build Coastguard Worker bool isAutomotiveExteriorSystemCamera(const std::string& cameraId) const; 347*ec779b8eSAndroid Build Coastguard Worker 348*ec779b8eSAndroid Build Coastguard Worker ///////////////////////////////////////////////////////////////////// 349*ec779b8eSAndroid Build Coastguard Worker // CameraClient functionality 350*ec779b8eSAndroid Build Coastguard Worker 351*ec779b8eSAndroid Build Coastguard Worker class BasicClient : 352*ec779b8eSAndroid Build Coastguard Worker public virtual RefBase, 353*ec779b8eSAndroid Build Coastguard Worker public AttributionAndPermissionUtilsEncapsulator { 354*ec779b8eSAndroid Build Coastguard Worker friend class CameraService; 355*ec779b8eSAndroid Build Coastguard Worker public: 356*ec779b8eSAndroid Build Coastguard Worker virtual status_t initialize(sp<CameraProviderManager> manager, 357*ec779b8eSAndroid Build Coastguard Worker const std::string& monitorTags) = 0; 358*ec779b8eSAndroid Build Coastguard Worker virtual binder::Status disconnect(); 359*ec779b8eSAndroid Build Coastguard Worker 360*ec779b8eSAndroid Build Coastguard Worker // because we can't virtually inherit IInterface, which breaks 361*ec779b8eSAndroid Build Coastguard Worker // virtual inheritance 362*ec779b8eSAndroid Build Coastguard Worker virtual sp<IBinder> asBinderWrapper() = 0; 363*ec779b8eSAndroid Build Coastguard Worker 364*ec779b8eSAndroid Build Coastguard Worker // Return the remote callback binder object (e.g. ICameraDeviceCallbacks) getRemote()365*ec779b8eSAndroid Build Coastguard Worker sp<IBinder> getRemote() { 366*ec779b8eSAndroid Build Coastguard Worker return mRemoteBinder; 367*ec779b8eSAndroid Build Coastguard Worker } 368*ec779b8eSAndroid Build Coastguard Worker getOverrideToPortrait()369*ec779b8eSAndroid Build Coastguard Worker bool getOverrideToPortrait() const { 370*ec779b8eSAndroid Build Coastguard Worker return mRotationOverride == ICameraService::ROTATION_OVERRIDE_OVERRIDE_TO_PORTRAIT; 371*ec779b8eSAndroid Build Coastguard Worker } 372*ec779b8eSAndroid Build Coastguard Worker 373*ec779b8eSAndroid Build Coastguard Worker // Disallows dumping over binder interface 374*ec779b8eSAndroid Build Coastguard Worker virtual status_t dump(int fd, const Vector<String16>& args); 375*ec779b8eSAndroid Build Coastguard Worker // Internal dump method to be called by CameraService 376*ec779b8eSAndroid Build Coastguard Worker virtual status_t dumpClient(int fd, const Vector<String16>& args) = 0; 377*ec779b8eSAndroid Build Coastguard Worker 378*ec779b8eSAndroid Build Coastguard Worker virtual status_t startWatchingTags(const std::string &tags, int outFd); 379*ec779b8eSAndroid Build Coastguard Worker virtual status_t stopWatchingTags(int outFd); 380*ec779b8eSAndroid Build Coastguard Worker virtual status_t dumpWatchedEventsToVector(std::vector<std::string> &out); 381*ec779b8eSAndroid Build Coastguard Worker 382*ec779b8eSAndroid Build Coastguard Worker // Return the package name for this client 383*ec779b8eSAndroid Build Coastguard Worker virtual std::string getPackageName() const; 384*ec779b8eSAndroid Build Coastguard Worker 385*ec779b8eSAndroid Build Coastguard Worker // Return the camera facing for this client 386*ec779b8eSAndroid Build Coastguard Worker virtual int getCameraFacing() const; 387*ec779b8eSAndroid Build Coastguard Worker 388*ec779b8eSAndroid Build Coastguard Worker // Return the camera orientation for this client 389*ec779b8eSAndroid Build Coastguard Worker virtual int getCameraOrientation() const; 390*ec779b8eSAndroid Build Coastguard Worker 391*ec779b8eSAndroid Build Coastguard Worker // Notify client about a fatal error 392*ec779b8eSAndroid Build Coastguard Worker virtual void notifyError(int32_t errorCode, 393*ec779b8eSAndroid Build Coastguard Worker const CaptureResultExtras& resultExtras) = 0; 394*ec779b8eSAndroid Build Coastguard Worker 395*ec779b8eSAndroid Build Coastguard Worker virtual void notifyClientSharedAccessPriorityChanged(bool primaryClient) = 0; 396*ec779b8eSAndroid Build Coastguard Worker 397*ec779b8eSAndroid Build Coastguard Worker // Get the UID of the application client using this 398*ec779b8eSAndroid Build Coastguard Worker virtual uid_t getClientUid() const; 399*ec779b8eSAndroid Build Coastguard Worker 400*ec779b8eSAndroid Build Coastguard Worker // Get the calling PID of the application client using this 401*ec779b8eSAndroid Build Coastguard Worker virtual int getClientCallingPid() const; 402*ec779b8eSAndroid Build Coastguard Worker 403*ec779b8eSAndroid Build Coastguard Worker // Get the attribution tag (previously featureId) of the application client using this 404*ec779b8eSAndroid Build Coastguard Worker virtual const std::optional<std::string>& getClientAttributionTag() const; 405*ec779b8eSAndroid Build Coastguard Worker 406*ec779b8eSAndroid Build Coastguard Worker // Check what API level is used for this client. This is used to determine which 407*ec779b8eSAndroid Build Coastguard Worker // superclass this can be cast to. 408*ec779b8eSAndroid Build Coastguard Worker virtual bool canCastToApiClient(apiLevel level) const; 409*ec779b8eSAndroid Build Coastguard Worker 410*ec779b8eSAndroid Build Coastguard Worker // Block the client form using the camera 411*ec779b8eSAndroid Build Coastguard Worker virtual void block(); 412*ec779b8eSAndroid Build Coastguard Worker 413*ec779b8eSAndroid Build Coastguard Worker // set audio restriction from client 414*ec779b8eSAndroid Build Coastguard Worker // Will call into camera service and hold mServiceLock 415*ec779b8eSAndroid Build Coastguard Worker virtual status_t setAudioRestriction(int32_t mode); 416*ec779b8eSAndroid Build Coastguard Worker 417*ec779b8eSAndroid Build Coastguard Worker // Get current global audio restriction setting 418*ec779b8eSAndroid Build Coastguard Worker // Will call into camera service and hold mServiceLock 419*ec779b8eSAndroid Build Coastguard Worker virtual int32_t getServiceAudioRestriction() const; 420*ec779b8eSAndroid Build Coastguard Worker 421*ec779b8eSAndroid Build Coastguard Worker // Get current audio restriction setting for this client 422*ec779b8eSAndroid Build Coastguard Worker virtual int32_t getAudioRestriction() const; 423*ec779b8eSAndroid Build Coastguard Worker 424*ec779b8eSAndroid Build Coastguard Worker static bool isValidAudioRestriction(int32_t mode); 425*ec779b8eSAndroid Build Coastguard Worker 426*ec779b8eSAndroid Build Coastguard Worker // Override rotate-and-crop AUTO behavior 427*ec779b8eSAndroid Build Coastguard Worker virtual status_t setRotateAndCropOverride(uint8_t rotateAndCrop, bool fromHal = false) = 0; 428*ec779b8eSAndroid Build Coastguard Worker 429*ec779b8eSAndroid Build Coastguard Worker // Override autoframing AUTO behaviour 430*ec779b8eSAndroid Build Coastguard Worker virtual status_t setAutoframingOverride(uint8_t autoframingValue) = 0; 431*ec779b8eSAndroid Build Coastguard Worker 432*ec779b8eSAndroid Build Coastguard Worker // Whether the client supports camera muting (black only output) 433*ec779b8eSAndroid Build Coastguard Worker virtual bool supportsCameraMute() = 0; 434*ec779b8eSAndroid Build Coastguard Worker 435*ec779b8eSAndroid Build Coastguard Worker // Set/reset camera mute 436*ec779b8eSAndroid Build Coastguard Worker virtual status_t setCameraMute(bool enabled) = 0; 437*ec779b8eSAndroid Build Coastguard Worker 438*ec779b8eSAndroid Build Coastguard Worker // Set Camera service watchdog 439*ec779b8eSAndroid Build Coastguard Worker virtual status_t setCameraServiceWatchdog(bool enabled) = 0; 440*ec779b8eSAndroid Build Coastguard Worker 441*ec779b8eSAndroid Build Coastguard Worker // Set stream use case overrides 442*ec779b8eSAndroid Build Coastguard Worker virtual void setStreamUseCaseOverrides( 443*ec779b8eSAndroid Build Coastguard Worker const std::vector<int64_t>& useCaseOverrides) = 0; 444*ec779b8eSAndroid Build Coastguard Worker 445*ec779b8eSAndroid Build Coastguard Worker // Clear stream use case overrides 446*ec779b8eSAndroid Build Coastguard Worker virtual void clearStreamUseCaseOverrides() = 0; 447*ec779b8eSAndroid Build Coastguard Worker 448*ec779b8eSAndroid Build Coastguard Worker // Whether the client supports camera zoom override 449*ec779b8eSAndroid Build Coastguard Worker virtual bool supportsZoomOverride() = 0; 450*ec779b8eSAndroid Build Coastguard Worker 451*ec779b8eSAndroid Build Coastguard Worker // Set/reset zoom override 452*ec779b8eSAndroid Build Coastguard Worker virtual status_t setZoomOverride(int32_t zoomOverride) = 0; 453*ec779b8eSAndroid Build Coastguard Worker 454*ec779b8eSAndroid Build Coastguard Worker // The injection camera session to replace the internal camera 455*ec779b8eSAndroid Build Coastguard Worker // session. 456*ec779b8eSAndroid Build Coastguard Worker virtual status_t injectCamera(const std::string& injectedCamId, 457*ec779b8eSAndroid Build Coastguard Worker sp<CameraProviderManager> manager) = 0; 458*ec779b8eSAndroid Build Coastguard Worker 459*ec779b8eSAndroid Build Coastguard Worker // Stop the injection camera and restore to internal camera session. 460*ec779b8eSAndroid Build Coastguard Worker virtual status_t stopInjection() = 0; 461*ec779b8eSAndroid Build Coastguard Worker 462*ec779b8eSAndroid Build Coastguard Worker // Inject session parameters into an existing session. 463*ec779b8eSAndroid Build Coastguard Worker virtual status_t injectSessionParams( 464*ec779b8eSAndroid Build Coastguard Worker const hardware::camera2::impl::CameraMetadataNative& sessionParams) = 0; 465*ec779b8eSAndroid Build Coastguard Worker 466*ec779b8eSAndroid Build Coastguard Worker status_t isPrimaryClient(/*out*/bool* isPrimary); 467*ec779b8eSAndroid Build Coastguard Worker 468*ec779b8eSAndroid Build Coastguard Worker status_t setPrimaryClient(bool isPrimary); 469*ec779b8eSAndroid Build Coastguard Worker 470*ec779b8eSAndroid Build Coastguard Worker protected: 471*ec779b8eSAndroid Build Coastguard Worker BasicClient(const sp<CameraService>& cameraService, const sp<IBinder>& remoteCallback, 472*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<AttributionAndPermissionUtils> attributionAndPermissionUtils, 473*ec779b8eSAndroid Build Coastguard Worker const AttributionSourceState& clientAttribution, int callingPid, 474*ec779b8eSAndroid Build Coastguard Worker bool nativeClient, const std::string& cameraIdStr, int cameraFacing, 475*ec779b8eSAndroid Build Coastguard Worker int sensorOrientation, int servicePid, int rotationOverride, bool sharedMode); 476*ec779b8eSAndroid Build Coastguard Worker 477*ec779b8eSAndroid Build Coastguard Worker virtual ~BasicClient(); 478*ec779b8eSAndroid Build Coastguard Worker 479*ec779b8eSAndroid Build Coastguard Worker // The instance is in the middle of destruction. When this is set, 480*ec779b8eSAndroid Build Coastguard Worker // the instance should not be accessed from callback. 481*ec779b8eSAndroid Build Coastguard Worker // CameraService's mClientLock should be acquired to access this. 482*ec779b8eSAndroid Build Coastguard Worker // - subclasses should set this to true in their destructors. 483*ec779b8eSAndroid Build Coastguard Worker bool mDestructionStarted; 484*ec779b8eSAndroid Build Coastguard Worker 485*ec779b8eSAndroid Build Coastguard Worker // These are initialized in the constructor. 486*ec779b8eSAndroid Build Coastguard Worker static sp<CameraService> sCameraService; 487*ec779b8eSAndroid Build Coastguard Worker const std::string mCameraIdStr; 488*ec779b8eSAndroid Build Coastguard Worker const int mCameraFacing; 489*ec779b8eSAndroid Build Coastguard Worker const int mOrientation; 490*ec779b8eSAndroid Build Coastguard Worker AttributionSourceState mClientAttribution; 491*ec779b8eSAndroid Build Coastguard Worker int mCallingPid; 492*ec779b8eSAndroid Build Coastguard Worker bool mSystemNativeClient; 493*ec779b8eSAndroid Build Coastguard Worker const pid_t mServicePid; 494*ec779b8eSAndroid Build Coastguard Worker bool mDisconnected; 495*ec779b8eSAndroid Build Coastguard Worker bool mUidIsTrusted; 496*ec779b8eSAndroid Build Coastguard Worker int mRotationOverride; 497*ec779b8eSAndroid Build Coastguard Worker bool mSharedMode; 498*ec779b8eSAndroid Build Coastguard Worker bool mIsPrimaryClient; 499*ec779b8eSAndroid Build Coastguard Worker 500*ec779b8eSAndroid Build Coastguard Worker mutable Mutex mAudioRestrictionLock; 501*ec779b8eSAndroid Build Coastguard Worker int32_t mAudioRestriction; 502*ec779b8eSAndroid Build Coastguard Worker 503*ec779b8eSAndroid Build Coastguard Worker // - The app-side Binder interface to receive callbacks from us 504*ec779b8eSAndroid Build Coastguard Worker sp<IBinder> mRemoteBinder; // immutable after constructor 505*ec779b8eSAndroid Build Coastguard Worker 506*ec779b8eSAndroid Build Coastguard Worker // Permissions management methods for camera lifecycle 507*ec779b8eSAndroid Build Coastguard Worker 508*ec779b8eSAndroid Build Coastguard Worker // Notify rest of system/apps about camera opening, and (legacy) check appops 509*ec779b8eSAndroid Build Coastguard Worker virtual status_t notifyCameraOpening(); 510*ec779b8eSAndroid Build Coastguard Worker // Notify rest of system/apps about camera starting to stream data, and confirm appops 511*ec779b8eSAndroid Build Coastguard Worker virtual status_t startCameraStreamingOps(); 512*ec779b8eSAndroid Build Coastguard Worker // Notify rest of system/apps about camera stopping streaming data 513*ec779b8eSAndroid Build Coastguard Worker virtual status_t finishCameraStreamingOps(); 514*ec779b8eSAndroid Build Coastguard Worker // Notify rest of system/apps about camera closing 515*ec779b8eSAndroid Build Coastguard Worker virtual status_t notifyCameraClosing(); 516*ec779b8eSAndroid Build Coastguard Worker // Handle errors for start/checkOps, startDataDelivery 517*ec779b8eSAndroid Build Coastguard Worker virtual status_t handleAppOpMode(int32_t mode); 518*ec779b8eSAndroid Build Coastguard Worker virtual status_t handlePermissionResult( 519*ec779b8eSAndroid Build Coastguard Worker PermissionChecker::PermissionResult result); 520*ec779b8eSAndroid Build Coastguard Worker // Just notify camera appops to trigger unblocking dialog if sensor 521*ec779b8eSAndroid Build Coastguard Worker // privacy is enabled and camera mute is not supported 522*ec779b8eSAndroid Build Coastguard Worker virtual status_t noteAppOp(); 523*ec779b8eSAndroid Build Coastguard Worker 524*ec779b8eSAndroid Build Coastguard Worker std::unique_ptr<AppOpsManager> mAppOpsManager = nullptr; 525*ec779b8eSAndroid Build Coastguard Worker 526*ec779b8eSAndroid Build Coastguard Worker class OpsCallback : public BnAppOpsCallback { 527*ec779b8eSAndroid Build Coastguard Worker public: 528*ec779b8eSAndroid Build Coastguard Worker explicit OpsCallback(wp<BasicClient> client); 529*ec779b8eSAndroid Build Coastguard Worker virtual void opChanged(int32_t op, const String16& packageName); 530*ec779b8eSAndroid Build Coastguard Worker 531*ec779b8eSAndroid Build Coastguard Worker private: 532*ec779b8eSAndroid Build Coastguard Worker wp<BasicClient> mClient; 533*ec779b8eSAndroid Build Coastguard Worker 534*ec779b8eSAndroid Build Coastguard Worker }; // class OpsCallback 535*ec779b8eSAndroid Build Coastguard Worker 536*ec779b8eSAndroid Build Coastguard Worker sp<OpsCallback> mOpsCallback; 537*ec779b8eSAndroid Build Coastguard Worker // Track if the camera is currently active. 538*ec779b8eSAndroid Build Coastguard Worker bool mCameraOpen; 539*ec779b8eSAndroid Build Coastguard Worker // Track if the camera is currently streaming. 540*ec779b8eSAndroid Build Coastguard Worker bool mCameraStreaming; 541*ec779b8eSAndroid Build Coastguard Worker 542*ec779b8eSAndroid Build Coastguard Worker // IAppOpsCallback interface, indirected through opListener 543*ec779b8eSAndroid Build Coastguard Worker virtual void opChanged(int32_t op, const String16& packageName); 544*ec779b8eSAndroid Build Coastguard Worker }; // class BasicClient 545*ec779b8eSAndroid Build Coastguard Worker 546*ec779b8eSAndroid Build Coastguard Worker class Client : public hardware::BnCamera, public BasicClient 547*ec779b8eSAndroid Build Coastguard Worker { 548*ec779b8eSAndroid Build Coastguard Worker public: 549*ec779b8eSAndroid Build Coastguard Worker typedef hardware::ICameraClient TCamCallbacks; 550*ec779b8eSAndroid Build Coastguard Worker 551*ec779b8eSAndroid Build Coastguard Worker // ICamera interface (see ICamera for details) 552*ec779b8eSAndroid Build Coastguard Worker virtual binder::Status disconnect(); 553*ec779b8eSAndroid Build Coastguard Worker virtual status_t connect(const sp<hardware::ICameraClient>& client) = 0; 554*ec779b8eSAndroid Build Coastguard Worker virtual status_t lock() = 0; 555*ec779b8eSAndroid Build Coastguard Worker virtual status_t unlock() = 0; 556*ec779b8eSAndroid Build Coastguard Worker virtual status_t setPreviewTarget(const sp<SurfaceType>& target) = 0; 557*ec779b8eSAndroid Build Coastguard Worker virtual void setPreviewCallbackFlag(int flag) = 0; 558*ec779b8eSAndroid Build Coastguard Worker virtual status_t setPreviewCallbackTarget(const sp<SurfaceType>& target) = 0; 559*ec779b8eSAndroid Build Coastguard Worker virtual status_t startPreview() = 0; 560*ec779b8eSAndroid Build Coastguard Worker virtual void stopPreview() = 0; 561*ec779b8eSAndroid Build Coastguard Worker virtual bool previewEnabled() = 0; 562*ec779b8eSAndroid Build Coastguard Worker virtual status_t setVideoBufferMode(int32_t videoBufferMode) = 0; 563*ec779b8eSAndroid Build Coastguard Worker virtual status_t startRecording() = 0; 564*ec779b8eSAndroid Build Coastguard Worker virtual void stopRecording() = 0; 565*ec779b8eSAndroid Build Coastguard Worker virtual bool recordingEnabled() = 0; 566*ec779b8eSAndroid Build Coastguard Worker virtual void releaseRecordingFrame(const sp<IMemory>& mem) = 0; 567*ec779b8eSAndroid Build Coastguard Worker virtual status_t autoFocus() = 0; 568*ec779b8eSAndroid Build Coastguard Worker virtual status_t cancelAutoFocus() = 0; 569*ec779b8eSAndroid Build Coastguard Worker virtual status_t takePicture(int msgType) = 0; 570*ec779b8eSAndroid Build Coastguard Worker virtual status_t setParameters(const String8& params) = 0; 571*ec779b8eSAndroid Build Coastguard Worker virtual String8 getParameters() const = 0; 572*ec779b8eSAndroid Build Coastguard Worker virtual status_t sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) = 0; 573*ec779b8eSAndroid Build Coastguard Worker virtual status_t setVideoTarget(const sp<SurfaceType>& target) = 0; 574*ec779b8eSAndroid Build Coastguard Worker 575*ec779b8eSAndroid Build Coastguard Worker // Interface used by CameraService 576*ec779b8eSAndroid Build Coastguard Worker Client(const sp<CameraService>& cameraService, 577*ec779b8eSAndroid Build Coastguard Worker const sp<hardware::ICameraClient>& cameraClient, 578*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<AttributionAndPermissionUtils> attributionAndPermissionUtils, 579*ec779b8eSAndroid Build Coastguard Worker const AttributionSourceState& clientAttribution, int callingPid, 580*ec779b8eSAndroid Build Coastguard Worker bool systemNativeClient, const std::string& cameraIdStr, int api1CameraId, 581*ec779b8eSAndroid Build Coastguard Worker int cameraFacing, int sensorOrientation, int servicePid, int rotationOverride, 582*ec779b8eSAndroid Build Coastguard Worker bool sharedMode); 583*ec779b8eSAndroid Build Coastguard Worker ~Client(); 584*ec779b8eSAndroid Build Coastguard Worker 585*ec779b8eSAndroid Build Coastguard Worker // return our camera client getRemoteCallback()586*ec779b8eSAndroid Build Coastguard Worker const sp<hardware::ICameraClient>& getRemoteCallback() { 587*ec779b8eSAndroid Build Coastguard Worker return mRemoteCallback; 588*ec779b8eSAndroid Build Coastguard Worker } 589*ec779b8eSAndroid Build Coastguard Worker asBinderWrapper()590*ec779b8eSAndroid Build Coastguard Worker virtual sp<IBinder> asBinderWrapper() { 591*ec779b8eSAndroid Build Coastguard Worker return asBinder(this); 592*ec779b8eSAndroid Build Coastguard Worker } 593*ec779b8eSAndroid Build Coastguard Worker 594*ec779b8eSAndroid Build Coastguard Worker virtual void notifyError(int32_t errorCode, 595*ec779b8eSAndroid Build Coastguard Worker const CaptureResultExtras& resultExtras); 596*ec779b8eSAndroid Build Coastguard Worker 597*ec779b8eSAndroid Build Coastguard Worker // Check what API level is used for this client. This is used to determine which 598*ec779b8eSAndroid Build Coastguard Worker // superclass this can be cast to. 599*ec779b8eSAndroid Build Coastguard Worker virtual bool canCastToApiClient(apiLevel level) const; 600*ec779b8eSAndroid Build Coastguard Worker setImageDumpMask(int)601*ec779b8eSAndroid Build Coastguard Worker void setImageDumpMask(int /*mask*/) { } 602*ec779b8eSAndroid Build Coastguard Worker protected: 603*ec779b8eSAndroid Build Coastguard Worker // Initialized in constructor 604*ec779b8eSAndroid Build Coastguard Worker 605*ec779b8eSAndroid Build Coastguard Worker // - The app-side Binder interface to receive callbacks from us 606*ec779b8eSAndroid Build Coastguard Worker sp<hardware::ICameraClient> mRemoteCallback; 607*ec779b8eSAndroid Build Coastguard Worker 608*ec779b8eSAndroid Build Coastguard Worker int mCameraId; // All API1 clients use integer camera IDs 609*ec779b8eSAndroid Build Coastguard Worker }; // class Client 610*ec779b8eSAndroid Build Coastguard Worker 611*ec779b8eSAndroid Build Coastguard Worker /** 612*ec779b8eSAndroid Build Coastguard Worker * A listener class that implements the LISTENER interface for use with a ClientManager, and 613*ec779b8eSAndroid Build Coastguard Worker * implements the following methods: 614*ec779b8eSAndroid Build Coastguard Worker * void onClientRemoved(const ClientDescriptor<KEY, VALUE>& descriptor); 615*ec779b8eSAndroid Build Coastguard Worker * void onClientAdded(const ClientDescriptor<KEY, VALUE>& descriptor); 616*ec779b8eSAndroid Build Coastguard Worker */ 617*ec779b8eSAndroid Build Coastguard Worker class ClientEventListener { 618*ec779b8eSAndroid Build Coastguard Worker public: 619*ec779b8eSAndroid Build Coastguard Worker void onClientAdded(const resource_policy::ClientDescriptor<std::string, 620*ec779b8eSAndroid Build Coastguard Worker sp<CameraService::BasicClient>>& descriptor); 621*ec779b8eSAndroid Build Coastguard Worker void onClientRemoved(const resource_policy::ClientDescriptor<std::string, 622*ec779b8eSAndroid Build Coastguard Worker sp<CameraService::BasicClient>>& descriptor); 623*ec779b8eSAndroid Build Coastguard Worker }; // class ClientEventListener 624*ec779b8eSAndroid Build Coastguard Worker 625*ec779b8eSAndroid Build Coastguard Worker typedef std::shared_ptr<resource_policy::ClientDescriptor<std::string, 626*ec779b8eSAndroid Build Coastguard Worker sp<CameraService::BasicClient>>> DescriptorPtr; 627*ec779b8eSAndroid Build Coastguard Worker 628*ec779b8eSAndroid Build Coastguard Worker /** 629*ec779b8eSAndroid Build Coastguard Worker * A container class for managing active camera clients that are using HAL devices. Active 630*ec779b8eSAndroid Build Coastguard Worker * clients are represented by ClientDescriptor objects that contain strong pointers to the 631*ec779b8eSAndroid Build Coastguard Worker * actual BasicClient subclass binder interface implementation. 632*ec779b8eSAndroid Build Coastguard Worker * 633*ec779b8eSAndroid Build Coastguard Worker * This class manages the eviction behavior for the camera clients. See the parent class 634*ec779b8eSAndroid Build Coastguard Worker * implementation in utils/ClientManager for the specifics of this behavior. 635*ec779b8eSAndroid Build Coastguard Worker */ 636*ec779b8eSAndroid Build Coastguard Worker class CameraClientManager : public resource_policy::ClientManager<std::string, 637*ec779b8eSAndroid Build Coastguard Worker sp<CameraService::BasicClient>, ClientEventListener> { 638*ec779b8eSAndroid Build Coastguard Worker public: 639*ec779b8eSAndroid Build Coastguard Worker CameraClientManager(); 640*ec779b8eSAndroid Build Coastguard Worker virtual ~CameraClientManager(); 641*ec779b8eSAndroid Build Coastguard Worker 642*ec779b8eSAndroid Build Coastguard Worker // Bring all remove() functions into scope 643*ec779b8eSAndroid Build Coastguard Worker using ClientManager::remove; 644*ec779b8eSAndroid Build Coastguard Worker 645*ec779b8eSAndroid Build Coastguard Worker virtual void remove(const DescriptorPtr& value) override; 646*ec779b8eSAndroid Build Coastguard Worker 647*ec779b8eSAndroid Build Coastguard Worker /** 648*ec779b8eSAndroid Build Coastguard Worker * Return a strong pointer to the active BasicClient for this camera ID, or an empty 649*ec779b8eSAndroid Build Coastguard Worker * if none exists. 650*ec779b8eSAndroid Build Coastguard Worker */ 651*ec779b8eSAndroid Build Coastguard Worker sp<CameraService::BasicClient> getCameraClient(const std::string& id) const; 652*ec779b8eSAndroid Build Coastguard Worker 653*ec779b8eSAndroid Build Coastguard Worker /** 654*ec779b8eSAndroid Build Coastguard Worker * Return a string describing the current state. 655*ec779b8eSAndroid Build Coastguard Worker */ 656*ec779b8eSAndroid Build Coastguard Worker std::string toString() const; 657*ec779b8eSAndroid Build Coastguard Worker 658*ec779b8eSAndroid Build Coastguard Worker /** 659*ec779b8eSAndroid Build Coastguard Worker * Make a ClientDescriptor object wrapping the given BasicClient strong pointer. 660*ec779b8eSAndroid Build Coastguard Worker */ 661*ec779b8eSAndroid Build Coastguard Worker static DescriptorPtr makeClientDescriptor(const std::string& key, 662*ec779b8eSAndroid Build Coastguard Worker const sp<BasicClient>& value, int32_t cost, 663*ec779b8eSAndroid Build Coastguard Worker const std::set<std::string>& conflictingKeys, int32_t score, 664*ec779b8eSAndroid Build Coastguard Worker int32_t ownerId, int32_t state, int oomScoreOffset, bool systemNativeClient, 665*ec779b8eSAndroid Build Coastguard Worker bool sharedMode); 666*ec779b8eSAndroid Build Coastguard Worker 667*ec779b8eSAndroid Build Coastguard Worker /** 668*ec779b8eSAndroid Build Coastguard Worker * Make a ClientDescriptor object wrapping the given BasicClient strong pointer with 669*ec779b8eSAndroid Build Coastguard Worker * values intialized from a prior ClientDescriptor. 670*ec779b8eSAndroid Build Coastguard Worker */ 671*ec779b8eSAndroid Build Coastguard Worker static DescriptorPtr makeClientDescriptor(const sp<BasicClient>& value, 672*ec779b8eSAndroid Build Coastguard Worker const CameraService::DescriptorPtr& partial, int oomScoreOffset, 673*ec779b8eSAndroid Build Coastguard Worker bool systemNativeClient); 674*ec779b8eSAndroid Build Coastguard Worker 675*ec779b8eSAndroid Build Coastguard Worker }; // class CameraClientManager 676*ec779b8eSAndroid Build Coastguard Worker 677*ec779b8eSAndroid Build Coastguard Worker int32_t updateAudioRestriction(); 678*ec779b8eSAndroid Build Coastguard Worker int32_t updateAudioRestrictionLocked(); 679*ec779b8eSAndroid Build Coastguard Worker 680*ec779b8eSAndroid Build Coastguard Worker /** 681*ec779b8eSAndroid Build Coastguard Worker * Returns true if the given client is the only client in the active clients list for a given 682*ec779b8eSAndroid Build Coastguard Worker * camera. 683*ec779b8eSAndroid Build Coastguard Worker * 684*ec779b8eSAndroid Build Coastguard Worker * This method acquires mServiceLock. 685*ec779b8eSAndroid Build Coastguard Worker */ 686*ec779b8eSAndroid Build Coastguard Worker bool isOnlyClient(const BasicClient* client); 687*ec779b8eSAndroid Build Coastguard Worker 688*ec779b8eSAndroid Build Coastguard Worker 689*ec779b8eSAndroid Build Coastguard Worker private: 690*ec779b8eSAndroid Build Coastguard Worker 691*ec779b8eSAndroid Build Coastguard Worker // TODO: b/263304156 update this to make use of a death callback for more 692*ec779b8eSAndroid Build Coastguard Worker // robust/fault tolerant logging getActivityManager()693*ec779b8eSAndroid Build Coastguard Worker static const sp<IActivityManager>& getActivityManager() { 694*ec779b8eSAndroid Build Coastguard Worker static const char* kActivityService = "activity"; 695*ec779b8eSAndroid Build Coastguard Worker static const auto activityManager = []() -> sp<IActivityManager> { 696*ec779b8eSAndroid Build Coastguard Worker const sp<IServiceManager> sm(defaultServiceManager()); 697*ec779b8eSAndroid Build Coastguard Worker if (sm != nullptr) { 698*ec779b8eSAndroid Build Coastguard Worker return interface_cast<IActivityManager>(sm->checkService(String16(kActivityService))); 699*ec779b8eSAndroid Build Coastguard Worker } 700*ec779b8eSAndroid Build Coastguard Worker return nullptr; 701*ec779b8eSAndroid Build Coastguard Worker }(); 702*ec779b8eSAndroid Build Coastguard Worker return activityManager; 703*ec779b8eSAndroid Build Coastguard Worker } 704*ec779b8eSAndroid Build Coastguard Worker 705*ec779b8eSAndroid Build Coastguard Worker static int32_t getUidProcessState(int32_t uid); 706*ec779b8eSAndroid Build Coastguard Worker 707*ec779b8eSAndroid Build Coastguard Worker /** 708*ec779b8eSAndroid Build Coastguard Worker * Typesafe version of device status, containing both the HAL-layer and the service interface- 709*ec779b8eSAndroid Build Coastguard Worker * layer values. 710*ec779b8eSAndroid Build Coastguard Worker */ 711*ec779b8eSAndroid Build Coastguard Worker enum class StatusInternal : int32_t { 712*ec779b8eSAndroid Build Coastguard Worker NOT_PRESENT = static_cast<int32_t>(CameraDeviceStatus::NOT_PRESENT), 713*ec779b8eSAndroid Build Coastguard Worker PRESENT = static_cast<int32_t>(CameraDeviceStatus::PRESENT), 714*ec779b8eSAndroid Build Coastguard Worker ENUMERATING = static_cast<int32_t>(CameraDeviceStatus::ENUMERATING), 715*ec779b8eSAndroid Build Coastguard Worker NOT_AVAILABLE = static_cast<int32_t>(hardware::ICameraServiceListener::STATUS_NOT_AVAILABLE), 716*ec779b8eSAndroid Build Coastguard Worker UNKNOWN = static_cast<int32_t>(hardware::ICameraServiceListener::STATUS_UNKNOWN) 717*ec779b8eSAndroid Build Coastguard Worker }; 718*ec779b8eSAndroid Build Coastguard Worker 719*ec779b8eSAndroid Build Coastguard Worker friend int32_t format_as(StatusInternal s); 720*ec779b8eSAndroid Build Coastguard Worker 721*ec779b8eSAndroid Build Coastguard Worker /** 722*ec779b8eSAndroid Build Coastguard Worker * Container class for the state of each logical camera device, including: ID, status, and 723*ec779b8eSAndroid Build Coastguard Worker * dependencies on other devices. The mapping of camera ID -> state saved in mCameraStates 724*ec779b8eSAndroid Build Coastguard Worker * represents the camera devices advertised by the HAL (and any USB devices, when we add 725*ec779b8eSAndroid Build Coastguard Worker * those). 726*ec779b8eSAndroid Build Coastguard Worker * 727*ec779b8eSAndroid Build Coastguard Worker * This container does NOT represent an active camera client. These are represented using 728*ec779b8eSAndroid Build Coastguard Worker * the ClientDescriptors stored in mActiveClientManager. 729*ec779b8eSAndroid Build Coastguard Worker */ 730*ec779b8eSAndroid Build Coastguard Worker class CameraState { 731*ec779b8eSAndroid Build Coastguard Worker public: 732*ec779b8eSAndroid Build Coastguard Worker 733*ec779b8eSAndroid Build Coastguard Worker /** 734*ec779b8eSAndroid Build Coastguard Worker * Make a new CameraState and set the ID, cost, and conflicting devices using the values 735*ec779b8eSAndroid Build Coastguard Worker * returned in the HAL's camera_info struct for each device. 736*ec779b8eSAndroid Build Coastguard Worker */ 737*ec779b8eSAndroid Build Coastguard Worker CameraState(const std::string& id, int cost, const std::set<std::string>& conflicting, 738*ec779b8eSAndroid Build Coastguard Worker SystemCameraKind deviceKind, const std::vector<std::string>& physicalCameras); 739*ec779b8eSAndroid Build Coastguard Worker virtual ~CameraState(); 740*ec779b8eSAndroid Build Coastguard Worker 741*ec779b8eSAndroid Build Coastguard Worker /** 742*ec779b8eSAndroid Build Coastguard Worker * Return the status for this device. 743*ec779b8eSAndroid Build Coastguard Worker * 744*ec779b8eSAndroid Build Coastguard Worker * This method acquires mStatusLock. 745*ec779b8eSAndroid Build Coastguard Worker */ 746*ec779b8eSAndroid Build Coastguard Worker StatusInternal getStatus() const; 747*ec779b8eSAndroid Build Coastguard Worker 748*ec779b8eSAndroid Build Coastguard Worker /** 749*ec779b8eSAndroid Build Coastguard Worker * This function updates the status for this camera device, unless the given status 750*ec779b8eSAndroid Build Coastguard Worker * is in the given list of rejected status states, and execute the function passed in 751*ec779b8eSAndroid Build Coastguard Worker * with a signature onStatusUpdateLocked(const std::string&, int32_t) 752*ec779b8eSAndroid Build Coastguard Worker * if the status has changed. 753*ec779b8eSAndroid Build Coastguard Worker * 754*ec779b8eSAndroid Build Coastguard Worker * This method is idempotent, and will not result in the function passed to 755*ec779b8eSAndroid Build Coastguard Worker * onStatusUpdateLocked being called more than once for the same arguments. 756*ec779b8eSAndroid Build Coastguard Worker * This method aquires mStatusLock. 757*ec779b8eSAndroid Build Coastguard Worker */ 758*ec779b8eSAndroid Build Coastguard Worker template<class Func> 759*ec779b8eSAndroid Build Coastguard Worker void updateStatus(StatusInternal status, 760*ec779b8eSAndroid Build Coastguard Worker const std::string& cameraId, 761*ec779b8eSAndroid Build Coastguard Worker std::initializer_list<StatusInternal> rejectSourceStates, 762*ec779b8eSAndroid Build Coastguard Worker Func onStatusUpdatedLocked); 763*ec779b8eSAndroid Build Coastguard Worker 764*ec779b8eSAndroid Build Coastguard Worker /** 765*ec779b8eSAndroid Build Coastguard Worker * Return the last set CameraParameters object generated from the information returned by 766*ec779b8eSAndroid Build Coastguard Worker * the HAL for this device (or an empty CameraParameters object if none has been set). 767*ec779b8eSAndroid Build Coastguard Worker */ 768*ec779b8eSAndroid Build Coastguard Worker CameraParameters getShimParams() const; 769*ec779b8eSAndroid Build Coastguard Worker 770*ec779b8eSAndroid Build Coastguard Worker /** 771*ec779b8eSAndroid Build Coastguard Worker * Set the CameraParameters for this device. 772*ec779b8eSAndroid Build Coastguard Worker */ 773*ec779b8eSAndroid Build Coastguard Worker void setShimParams(const CameraParameters& params); 774*ec779b8eSAndroid Build Coastguard Worker 775*ec779b8eSAndroid Build Coastguard Worker /** 776*ec779b8eSAndroid Build Coastguard Worker * Return the resource_cost advertised by the HAL for this device. 777*ec779b8eSAndroid Build Coastguard Worker */ 778*ec779b8eSAndroid Build Coastguard Worker int getCost() const; 779*ec779b8eSAndroid Build Coastguard Worker 780*ec779b8eSAndroid Build Coastguard Worker /** 781*ec779b8eSAndroid Build Coastguard Worker * Return a set of the IDs of conflicting devices advertised by the HAL for this device. 782*ec779b8eSAndroid Build Coastguard Worker */ 783*ec779b8eSAndroid Build Coastguard Worker std::set<std::string> getConflicting() const; 784*ec779b8eSAndroid Build Coastguard Worker 785*ec779b8eSAndroid Build Coastguard Worker /** 786*ec779b8eSAndroid Build Coastguard Worker * Return the kind (SystemCameraKind) of this camera device. 787*ec779b8eSAndroid Build Coastguard Worker */ 788*ec779b8eSAndroid Build Coastguard Worker SystemCameraKind getSystemCameraKind() const; 789*ec779b8eSAndroid Build Coastguard Worker 790*ec779b8eSAndroid Build Coastguard Worker /** 791*ec779b8eSAndroid Build Coastguard Worker * Return whether this camera is a logical multi-camera and has a 792*ec779b8eSAndroid Build Coastguard Worker * particular physical sub-camera. 793*ec779b8eSAndroid Build Coastguard Worker */ 794*ec779b8eSAndroid Build Coastguard Worker bool containsPhysicalCamera(const std::string& physicalCameraId) const; 795*ec779b8eSAndroid Build Coastguard Worker 796*ec779b8eSAndroid Build Coastguard Worker /** 797*ec779b8eSAndroid Build Coastguard Worker * Add/Remove the unavailable physical camera ID. 798*ec779b8eSAndroid Build Coastguard Worker */ 799*ec779b8eSAndroid Build Coastguard Worker bool addUnavailablePhysicalId(const std::string& physicalId); 800*ec779b8eSAndroid Build Coastguard Worker bool removeUnavailablePhysicalId(const std::string& physicalId); 801*ec779b8eSAndroid Build Coastguard Worker 802*ec779b8eSAndroid Build Coastguard Worker /** 803*ec779b8eSAndroid Build Coastguard Worker * Set and get client package name. 804*ec779b8eSAndroid Build Coastguard Worker */ 805*ec779b8eSAndroid Build Coastguard Worker void setClientPackage(const std::string& clientPackage); 806*ec779b8eSAndroid Build Coastguard Worker std::string getClientPackage() const; 807*ec779b8eSAndroid Build Coastguard Worker 808*ec779b8eSAndroid Build Coastguard Worker void addClientPackage(const std::string& clientPackage); 809*ec779b8eSAndroid Build Coastguard Worker void removeClientPackage(const std::string& clientPackage); 810*ec779b8eSAndroid Build Coastguard Worker std::set<std::string> getClientPackages() const; 811*ec779b8eSAndroid Build Coastguard Worker 812*ec779b8eSAndroid Build Coastguard Worker /** 813*ec779b8eSAndroid Build Coastguard Worker * Return the unavailable physical ids for this device. 814*ec779b8eSAndroid Build Coastguard Worker * 815*ec779b8eSAndroid Build Coastguard Worker * This method acquires mStatusLock. 816*ec779b8eSAndroid Build Coastguard Worker */ 817*ec779b8eSAndroid Build Coastguard Worker std::vector<std::string> getUnavailablePhysicalIds() const; 818*ec779b8eSAndroid Build Coastguard Worker private: 819*ec779b8eSAndroid Build Coastguard Worker const std::string mId; 820*ec779b8eSAndroid Build Coastguard Worker StatusInternal mStatus; // protected by mStatusLock 821*ec779b8eSAndroid Build Coastguard Worker const int mCost; 822*ec779b8eSAndroid Build Coastguard Worker std::set<std::string> mConflicting; 823*ec779b8eSAndroid Build Coastguard Worker std::set<std::string> mUnavailablePhysicalIds; 824*ec779b8eSAndroid Build Coastguard Worker std::set<std::string> mClientPackages; 825*ec779b8eSAndroid Build Coastguard Worker mutable Mutex mStatusLock; 826*ec779b8eSAndroid Build Coastguard Worker CameraParameters mShimParams; 827*ec779b8eSAndroid Build Coastguard Worker const SystemCameraKind mSystemCameraKind; 828*ec779b8eSAndroid Build Coastguard Worker const std::vector<std::string> mPhysicalCameras; // Empty if not a logical multi-camera 829*ec779b8eSAndroid Build Coastguard Worker }; // class CameraState 830*ec779b8eSAndroid Build Coastguard Worker 831*ec779b8eSAndroid Build Coastguard Worker // Observer for UID lifecycle enforcing that UIDs in idle 832*ec779b8eSAndroid Build Coastguard Worker // state cannot use the camera to protect user privacy. 833*ec779b8eSAndroid Build Coastguard Worker class UidPolicy : 834*ec779b8eSAndroid Build Coastguard Worker public BnUidObserver, 835*ec779b8eSAndroid Build Coastguard Worker public virtual IBinder::DeathRecipient, 836*ec779b8eSAndroid Build Coastguard Worker public virtual IServiceManager::LocalRegistrationCallback { 837*ec779b8eSAndroid Build Coastguard Worker public: UidPolicy(sp<CameraService> service)838*ec779b8eSAndroid Build Coastguard Worker explicit UidPolicy(sp<CameraService> service) 839*ec779b8eSAndroid Build Coastguard Worker : mRegistered(false), mService(service) {} 840*ec779b8eSAndroid Build Coastguard Worker 841*ec779b8eSAndroid Build Coastguard Worker void registerSelf(); 842*ec779b8eSAndroid Build Coastguard Worker void unregisterSelf(); 843*ec779b8eSAndroid Build Coastguard Worker 844*ec779b8eSAndroid Build Coastguard Worker bool isUidActive(uid_t uid, const std::string &callingPackage); 845*ec779b8eSAndroid Build Coastguard Worker int32_t getProcState(uid_t uid); 846*ec779b8eSAndroid Build Coastguard Worker 847*ec779b8eSAndroid Build Coastguard Worker // IUidObserver 848*ec779b8eSAndroid Build Coastguard Worker void onUidGone(uid_t uid, bool disabled) override; 849*ec779b8eSAndroid Build Coastguard Worker void onUidActive(uid_t uid) override; 850*ec779b8eSAndroid Build Coastguard Worker void onUidIdle(uid_t uid, bool disabled) override; 851*ec779b8eSAndroid Build Coastguard Worker void onUidStateChanged(uid_t uid, int32_t procState, int64_t procStateSeq, 852*ec779b8eSAndroid Build Coastguard Worker int32_t capability) override; 853*ec779b8eSAndroid Build Coastguard Worker void onUidProcAdjChanged(uid_t uid, int adj) override; 854*ec779b8eSAndroid Build Coastguard Worker 855*ec779b8eSAndroid Build Coastguard Worker void addOverrideUid(uid_t uid, const std::string &callingPackage, bool active); 856*ec779b8eSAndroid Build Coastguard Worker void removeOverrideUid(uid_t uid, const std::string &callingPackage); 857*ec779b8eSAndroid Build Coastguard Worker 858*ec779b8eSAndroid Build Coastguard Worker void registerMonitorUid(uid_t uid, bool openCamera); 859*ec779b8eSAndroid Build Coastguard Worker void unregisterMonitorUid(uid_t uid, bool closeCamera); 860*ec779b8eSAndroid Build Coastguard Worker 861*ec779b8eSAndroid Build Coastguard Worker // Implementation of IServiceManager::LocalRegistrationCallback 862*ec779b8eSAndroid Build Coastguard Worker virtual void onServiceRegistration(const String16& name, 863*ec779b8eSAndroid Build Coastguard Worker const sp<IBinder>& binder) override; 864*ec779b8eSAndroid Build Coastguard Worker // IBinder::DeathRecipient implementation 865*ec779b8eSAndroid Build Coastguard Worker virtual void binderDied(const wp<IBinder> &who); 866*ec779b8eSAndroid Build Coastguard Worker private: 867*ec779b8eSAndroid Build Coastguard Worker bool isUidActiveLocked(uid_t uid, const std::string &callingPackage); 868*ec779b8eSAndroid Build Coastguard Worker int32_t getProcStateLocked(uid_t uid); 869*ec779b8eSAndroid Build Coastguard Worker void updateOverrideUid(uid_t uid, const std::string &callingPackage, bool active, 870*ec779b8eSAndroid Build Coastguard Worker bool insert); 871*ec779b8eSAndroid Build Coastguard Worker void registerWithActivityManager(); 872*ec779b8eSAndroid Build Coastguard Worker 873*ec779b8eSAndroid Build Coastguard Worker struct MonitoredUid { 874*ec779b8eSAndroid Build Coastguard Worker int32_t procState; 875*ec779b8eSAndroid Build Coastguard Worker int32_t procAdj; 876*ec779b8eSAndroid Build Coastguard Worker bool hasCamera; 877*ec779b8eSAndroid Build Coastguard Worker size_t refCount; 878*ec779b8eSAndroid Build Coastguard Worker }; 879*ec779b8eSAndroid Build Coastguard Worker 880*ec779b8eSAndroid Build Coastguard Worker Mutex mUidLock; 881*ec779b8eSAndroid Build Coastguard Worker bool mRegistered; 882*ec779b8eSAndroid Build Coastguard Worker ActivityManager mAm; 883*ec779b8eSAndroid Build Coastguard Worker wp<CameraService> mService; 884*ec779b8eSAndroid Build Coastguard Worker std::unordered_set<uid_t> mActiveUids; 885*ec779b8eSAndroid Build Coastguard Worker // Monitored uid map 886*ec779b8eSAndroid Build Coastguard Worker std::unordered_map<uid_t, MonitoredUid> mMonitoredUids; 887*ec779b8eSAndroid Build Coastguard Worker std::unordered_map<uid_t, bool> mOverrideUids; 888*ec779b8eSAndroid Build Coastguard Worker sp<IBinder> mObserverToken; 889*ec779b8eSAndroid Build Coastguard Worker }; // class UidPolicy 890*ec779b8eSAndroid Build Coastguard Worker 891*ec779b8eSAndroid Build Coastguard Worker // If sensor privacy is enabled then all apps, including those that are active, should be 892*ec779b8eSAndroid Build Coastguard Worker // prevented from accessing the camera. 893*ec779b8eSAndroid Build Coastguard Worker class SensorPrivacyPolicy : public hardware::BnSensorPrivacyListener, 894*ec779b8eSAndroid Build Coastguard Worker public virtual IBinder::DeathRecipient, 895*ec779b8eSAndroid Build Coastguard Worker public virtual IServiceManager::LocalRegistrationCallback, 896*ec779b8eSAndroid Build Coastguard Worker public AttributionAndPermissionUtilsEncapsulator { 897*ec779b8eSAndroid Build Coastguard Worker public: SensorPrivacyPolicy(wp<CameraService> service,std::shared_ptr<AttributionAndPermissionUtils> attributionAndPermissionUtils)898*ec779b8eSAndroid Build Coastguard Worker explicit SensorPrivacyPolicy(wp<CameraService> service, 899*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<AttributionAndPermissionUtils> attributionAndPermissionUtils) 900*ec779b8eSAndroid Build Coastguard Worker : AttributionAndPermissionUtilsEncapsulator(attributionAndPermissionUtils), 901*ec779b8eSAndroid Build Coastguard Worker mService(service), 902*ec779b8eSAndroid Build Coastguard Worker mSensorPrivacyEnabled(false), 903*ec779b8eSAndroid Build Coastguard Worker mCameraPrivacyState(SensorPrivacyManager::DISABLED), mRegistered(false) {} 904*ec779b8eSAndroid Build Coastguard Worker 905*ec779b8eSAndroid Build Coastguard Worker void registerSelf(); 906*ec779b8eSAndroid Build Coastguard Worker void unregisterSelf(); 907*ec779b8eSAndroid Build Coastguard Worker 908*ec779b8eSAndroid Build Coastguard Worker bool isSensorPrivacyEnabled(); 909*ec779b8eSAndroid Build Coastguard Worker bool isCameraPrivacyEnabled(); 910*ec779b8eSAndroid Build Coastguard Worker int getCameraPrivacyState(); 911*ec779b8eSAndroid Build Coastguard Worker bool isCameraPrivacyEnabled(const String16& packageName); 912*ec779b8eSAndroid Build Coastguard Worker 913*ec779b8eSAndroid Build Coastguard Worker binder::Status onSensorPrivacyChanged(int toggleType, int sensor, 914*ec779b8eSAndroid Build Coastguard Worker bool enabled); 915*ec779b8eSAndroid Build Coastguard Worker binder::Status onSensorPrivacyStateChanged(int toggleType, int sensor, int state); 916*ec779b8eSAndroid Build Coastguard Worker 917*ec779b8eSAndroid Build Coastguard Worker // Implementation of IServiceManager::LocalRegistrationCallback 918*ec779b8eSAndroid Build Coastguard Worker virtual void onServiceRegistration(const String16& name, 919*ec779b8eSAndroid Build Coastguard Worker const sp<IBinder>& binder) override; 920*ec779b8eSAndroid Build Coastguard Worker // IBinder::DeathRecipient implementation 921*ec779b8eSAndroid Build Coastguard Worker virtual void binderDied(const wp<IBinder> &who); 922*ec779b8eSAndroid Build Coastguard Worker 923*ec779b8eSAndroid Build Coastguard Worker private: 924*ec779b8eSAndroid Build Coastguard Worker SensorPrivacyManager mSpm; 925*ec779b8eSAndroid Build Coastguard Worker wp<CameraService> mService; 926*ec779b8eSAndroid Build Coastguard Worker Mutex mSensorPrivacyLock; 927*ec779b8eSAndroid Build Coastguard Worker bool mSensorPrivacyEnabled; 928*ec779b8eSAndroid Build Coastguard Worker int mCameraPrivacyState; 929*ec779b8eSAndroid Build Coastguard Worker bool mRegistered; 930*ec779b8eSAndroid Build Coastguard Worker 931*ec779b8eSAndroid Build Coastguard Worker bool hasCameraPrivacyFeature(); 932*ec779b8eSAndroid Build Coastguard Worker void registerWithSensorPrivacyManager(); 933*ec779b8eSAndroid Build Coastguard Worker }; 934*ec779b8eSAndroid Build Coastguard Worker 935*ec779b8eSAndroid Build Coastguard Worker sp<UidPolicy> mUidPolicy; 936*ec779b8eSAndroid Build Coastguard Worker 937*ec779b8eSAndroid Build Coastguard Worker sp<SensorPrivacyPolicy> mSensorPrivacyPolicy; 938*ec779b8eSAndroid Build Coastguard Worker 939*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<CameraServiceProxyWrapper> mCameraServiceProxyWrapper; 940*ec779b8eSAndroid Build Coastguard Worker 941*ec779b8eSAndroid Build Coastguard Worker // Delay-load the Camera HAL module 942*ec779b8eSAndroid Build Coastguard Worker virtual void onFirstRef(); 943*ec779b8eSAndroid Build Coastguard Worker 944*ec779b8eSAndroid Build Coastguard Worker // Eumerate all camera providers in the system 945*ec779b8eSAndroid Build Coastguard Worker status_t enumerateProviders(); 946*ec779b8eSAndroid Build Coastguard Worker 947*ec779b8eSAndroid Build Coastguard Worker // Add/remove a new camera to camera and torch state lists or remove an unplugged one 948*ec779b8eSAndroid Build Coastguard Worker // Caller must not hold mServiceLock 949*ec779b8eSAndroid Build Coastguard Worker void addStates(const std::string& id); 950*ec779b8eSAndroid Build Coastguard Worker void removeStates(const std::string& id); 951*ec779b8eSAndroid Build Coastguard Worker 952*ec779b8eSAndroid Build Coastguard Worker // Check if we can connect, before we acquire the service lock. 953*ec779b8eSAndroid Build Coastguard Worker binder::Status validateConnectLocked(const std::string& cameraId, 954*ec779b8eSAndroid Build Coastguard Worker const AttributionSourceState& clientAttribution, 955*ec779b8eSAndroid Build Coastguard Worker bool sharedMode) const; 956*ec779b8eSAndroid Build Coastguard Worker binder::Status validateClientPermissionsLocked( 957*ec779b8eSAndroid Build Coastguard Worker const std::string& cameraId, const AttributionSourceState& clientAttribution, 958*ec779b8eSAndroid Build Coastguard Worker bool sharedMode) const; 959*ec779b8eSAndroid Build Coastguard Worker 960*ec779b8eSAndroid Build Coastguard Worker void logConnectionAttempt(int clientPid, const std::string& clientPackageName, 961*ec779b8eSAndroid Build Coastguard Worker const std::string& cameraId, apiLevel effectiveApiLevel) const; 962*ec779b8eSAndroid Build Coastguard Worker 963*ec779b8eSAndroid Build Coastguard Worker bool isCameraPrivacyEnabled(const String16& packageName,const std::string& cameraId, 964*ec779b8eSAndroid Build Coastguard Worker int clientPid, int ClientUid); 965*ec779b8eSAndroid Build Coastguard Worker 966*ec779b8eSAndroid Build Coastguard Worker // Handle active client evictions, and update service state. 967*ec779b8eSAndroid Build Coastguard Worker // Only call with with mServiceLock held. 968*ec779b8eSAndroid Build Coastguard Worker status_t handleEvictionsLocked(const std::string& cameraId, int clientPid, 969*ec779b8eSAndroid Build Coastguard Worker apiLevel effectiveApiLevel, const sp<IBinder>& remoteCallback, 970*ec779b8eSAndroid Build Coastguard Worker const std::string& packageName, int scoreOffset, bool systemNativeClient, bool sharedMode, 971*ec779b8eSAndroid Build Coastguard Worker /*out*/ 972*ec779b8eSAndroid Build Coastguard Worker sp<BasicClient>* client, 973*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<resource_policy::ClientDescriptor<std::string, sp<BasicClient>>>* partial); 974*ec779b8eSAndroid Build Coastguard Worker 975*ec779b8eSAndroid Build Coastguard Worker // Should an operation attempt on a cameraId be rejected ? (this can happen 976*ec779b8eSAndroid Build Coastguard Worker // under various conditions. For example if a camera device is advertised as 977*ec779b8eSAndroid Build Coastguard Worker // system only or hidden secure camera, amongst possible others. 978*ec779b8eSAndroid Build Coastguard Worker bool shouldRejectSystemCameraConnection(const std::string& cameraId) const; 979*ec779b8eSAndroid Build Coastguard Worker 980*ec779b8eSAndroid Build Coastguard Worker // Should a device status update be skipped for a particular camera device ? (this can happen 981*ec779b8eSAndroid Build Coastguard Worker // under various conditions. For example if a camera device is advertised as 982*ec779b8eSAndroid Build Coastguard Worker // system only or hidden secure camera, amongst possible others. 983*ec779b8eSAndroid Build Coastguard Worker bool shouldSkipStatusUpdates(SystemCameraKind systemCameraKind, bool isVendorListener, 984*ec779b8eSAndroid Build Coastguard Worker int clientPid, int clientUid); 985*ec779b8eSAndroid Build Coastguard Worker 986*ec779b8eSAndroid Build Coastguard Worker // Gets the kind of camera device (i.e public, hidden secure or system only) 987*ec779b8eSAndroid Build Coastguard Worker // getSystemCameraKind() needs mInterfaceMutex which might lead to deadlocks 988*ec779b8eSAndroid Build Coastguard Worker // if held along with mStatusListenerLock (depending on lock ordering, b/141756275), it is 989*ec779b8eSAndroid Build Coastguard Worker // recommended that we don't call this function with mStatusListenerLock held. 990*ec779b8eSAndroid Build Coastguard Worker status_t getSystemCameraKind(const std::string& cameraId, SystemCameraKind *kind) const; 991*ec779b8eSAndroid Build Coastguard Worker 992*ec779b8eSAndroid Build Coastguard Worker // Update the set of API1Compatible camera devices without including system 993*ec779b8eSAndroid Build Coastguard Worker // cameras and secure cameras. This is used for hiding system only cameras 994*ec779b8eSAndroid Build Coastguard Worker // from clients using camera1 api and not having android.permission.SYSTEM_CAMERA. 995*ec779b8eSAndroid Build Coastguard Worker // This function expects @param normalDeviceIds, to have normalDeviceIds 996*ec779b8eSAndroid Build Coastguard Worker // sorted in alpha-numeric order. 997*ec779b8eSAndroid Build Coastguard Worker void filterAPI1SystemCameraLocked(const std::vector<std::string> &normalDeviceIds); 998*ec779b8eSAndroid Build Coastguard Worker 999*ec779b8eSAndroid Build Coastguard Worker // Single implementation shared between the various connect calls 1000*ec779b8eSAndroid Build Coastguard Worker template <class CALLBACK, class CLIENT> 1001*ec779b8eSAndroid Build Coastguard Worker binder::Status connectHelper(const sp<CALLBACK>& cameraCb, const std::string& cameraId, 1002*ec779b8eSAndroid Build Coastguard Worker int api1CameraId, const AttributionSourceState& clientAttribution, 1003*ec779b8eSAndroid Build Coastguard Worker bool systemNativeClient, apiLevel effectiveApiLevel, 1004*ec779b8eSAndroid Build Coastguard Worker bool shimUpdateOnly, int scoreOffset, int targetSdkVersion, 1005*ec779b8eSAndroid Build Coastguard Worker int rotationOverride, bool forceSlowJpegMode, 1006*ec779b8eSAndroid Build Coastguard Worker const std::string& originalCameraId, bool isNonSystemNdk, 1007*ec779b8eSAndroid Build Coastguard Worker bool sharedMode, bool isVendorClient, 1008*ec779b8eSAndroid Build Coastguard Worker /*out*/ sp<CLIENT>& device); 1009*ec779b8eSAndroid Build Coastguard Worker 1010*ec779b8eSAndroid Build Coastguard Worker binder::Status connectDeviceImpl( 1011*ec779b8eSAndroid Build Coastguard Worker const sp<hardware::camera2::ICameraDeviceCallbacks>& cameraCb, 1012*ec779b8eSAndroid Build Coastguard Worker const std::string& cameraId, int scoreOffset, int targetSdkVersion, 1013*ec779b8eSAndroid Build Coastguard Worker int rotationOverride, const AttributionSourceState& clientAttribution, 1014*ec779b8eSAndroid Build Coastguard Worker int32_t devicePolicy, bool sharedMode, bool isVendorClient, 1015*ec779b8eSAndroid Build Coastguard Worker /*out*/ 1016*ec779b8eSAndroid Build Coastguard Worker sp<hardware::camera2::ICameraDeviceUser>* device); 1017*ec779b8eSAndroid Build Coastguard Worker 1018*ec779b8eSAndroid Build Coastguard Worker // Lock guarding camera service state 1019*ec779b8eSAndroid Build Coastguard Worker Mutex mServiceLock; 1020*ec779b8eSAndroid Build Coastguard Worker 1021*ec779b8eSAndroid Build Coastguard Worker // Condition to use with mServiceLock, used to handle simultaneous connect calls from clients 1022*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<WaitableMutexWrapper> mServiceLockWrapper; 1023*ec779b8eSAndroid Build Coastguard Worker 1024*ec779b8eSAndroid Build Coastguard Worker // Return NO_ERROR if the device with a give ID can be connected to 1025*ec779b8eSAndroid Build Coastguard Worker status_t checkIfDeviceIsUsable(const std::string& cameraId) const; 1026*ec779b8eSAndroid Build Coastguard Worker 1027*ec779b8eSAndroid Build Coastguard Worker // Container for managing currently active application-layer clients 1028*ec779b8eSAndroid Build Coastguard Worker CameraClientManager mActiveClientManager; 1029*ec779b8eSAndroid Build Coastguard Worker 1030*ec779b8eSAndroid Build Coastguard Worker // Adds client logs during open session to the file pointed by fd. 1031*ec779b8eSAndroid Build Coastguard Worker void dumpOpenSessionClientLogs(int fd, const Vector<String16>& args, 1032*ec779b8eSAndroid Build Coastguard Worker const std::string& cameraId); 1033*ec779b8eSAndroid Build Coastguard Worker 1034*ec779b8eSAndroid Build Coastguard Worker // Adds client logs during closed session to the file pointed by fd. 1035*ec779b8eSAndroid Build Coastguard Worker void dumpClosedSessionClientLogs(int fd, const std::string& cameraId); 1036*ec779b8eSAndroid Build Coastguard Worker 1037*ec779b8eSAndroid Build Coastguard Worker binder::Status isSessionConfigurationWithParametersSupportedUnsafe( 1038*ec779b8eSAndroid Build Coastguard Worker const std::string& cameraId, const SessionConfiguration& sessionConfiguration, 1039*ec779b8eSAndroid Build Coastguard Worker bool overrideForPerfClass, /*out*/ bool* supported); 1040*ec779b8eSAndroid Build Coastguard Worker 1041*ec779b8eSAndroid Build Coastguard Worker // Mapping from camera ID -> state for each device, map is protected by mCameraStatesLock 1042*ec779b8eSAndroid Build Coastguard Worker std::map<std::string, std::shared_ptr<CameraState>> mCameraStates; 1043*ec779b8eSAndroid Build Coastguard Worker 1044*ec779b8eSAndroid Build Coastguard Worker // Mutex guarding mCameraStates map 1045*ec779b8eSAndroid Build Coastguard Worker mutable Mutex mCameraStatesLock; 1046*ec779b8eSAndroid Build Coastguard Worker 1047*ec779b8eSAndroid Build Coastguard Worker /** 1048*ec779b8eSAndroid Build Coastguard Worker * Resolve the (potentially remapped) camera id for the given input camera id and the given 1049*ec779b8eSAndroid Build Coastguard Worker * device id and device policy (for the device associated with the context of the caller). 1050*ec779b8eSAndroid Build Coastguard Worker * 1051*ec779b8eSAndroid Build Coastguard Worker * For any context associated with a virtual device with custom camera policy, this will return 1052*ec779b8eSAndroid Build Coastguard Worker * the actual camera id if inputCameraId corresponds to the mapped id of a virtual camera 1053*ec779b8eSAndroid Build Coastguard Worker * (for virtual devices with custom camera policy, the back and front virtual cameras of that 1054*ec779b8eSAndroid Build Coastguard Worker * device would have 0 and 1 respectively as their mapped camera id). 1055*ec779b8eSAndroid Build Coastguard Worker */ 1056*ec779b8eSAndroid Build Coastguard Worker std::optional<std::string> resolveCameraId( 1057*ec779b8eSAndroid Build Coastguard Worker const std::string& inputCameraId, 1058*ec779b8eSAndroid Build Coastguard Worker int32_t deviceId, 1059*ec779b8eSAndroid Build Coastguard Worker int32_t devicePolicy); 1060*ec779b8eSAndroid Build Coastguard Worker 1061*ec779b8eSAndroid Build Coastguard Worker // Circular buffer for storing event logging for dumps 1062*ec779b8eSAndroid Build Coastguard Worker RingBuffer<std::string> mEventLog; 1063*ec779b8eSAndroid Build Coastguard Worker Mutex mLogLock; 1064*ec779b8eSAndroid Build Coastguard Worker 1065*ec779b8eSAndroid Build Coastguard Worker // set of client package names to watch. if this set contains 'all', then all clients will 1066*ec779b8eSAndroid Build Coastguard Worker // be watched. Access should be guarded by mLogLock 1067*ec779b8eSAndroid Build Coastguard Worker std::set<std::string> mWatchedClientPackages; 1068*ec779b8eSAndroid Build Coastguard Worker // cache of last monitored tags dump immediately before the client disconnects. If a client 1069*ec779b8eSAndroid Build Coastguard Worker // re-connects, its entry is not updated until it disconnects again. Access should be guarded 1070*ec779b8eSAndroid Build Coastguard Worker // by mLogLock 1071*ec779b8eSAndroid Build Coastguard Worker std::map<std::string, std::string> mWatchedClientsDumpCache; 1072*ec779b8eSAndroid Build Coastguard Worker 1073*ec779b8eSAndroid Build Coastguard Worker // The last monitored tags set by client 1074*ec779b8eSAndroid Build Coastguard Worker std::string mMonitorTags; 1075*ec779b8eSAndroid Build Coastguard Worker 1076*ec779b8eSAndroid Build Coastguard Worker // Currently allowed user IDs 1077*ec779b8eSAndroid Build Coastguard Worker std::set<userid_t> mAllowedUsers; 1078*ec779b8eSAndroid Build Coastguard Worker 1079*ec779b8eSAndroid Build Coastguard Worker /** 1080*ec779b8eSAndroid Build Coastguard Worker * Get the camera state for a given camera id. 1081*ec779b8eSAndroid Build Coastguard Worker * 1082*ec779b8eSAndroid Build Coastguard Worker * This acquires mCameraStatesLock. 1083*ec779b8eSAndroid Build Coastguard Worker */ 1084*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<CameraService::CameraState> getCameraState(const std::string& cameraId) const; 1085*ec779b8eSAndroid Build Coastguard Worker 1086*ec779b8eSAndroid Build Coastguard Worker /** 1087*ec779b8eSAndroid Build Coastguard Worker * Evict client who's remote binder has died. Returns true if this client was in the active 1088*ec779b8eSAndroid Build Coastguard Worker * list and was disconnected. 1089*ec779b8eSAndroid Build Coastguard Worker * 1090*ec779b8eSAndroid Build Coastguard Worker * This method acquires mServiceLock. 1091*ec779b8eSAndroid Build Coastguard Worker */ 1092*ec779b8eSAndroid Build Coastguard Worker bool evictClientIdByRemote(const wp<IBinder>& cameraClient); 1093*ec779b8eSAndroid Build Coastguard Worker 1094*ec779b8eSAndroid Build Coastguard Worker /** 1095*ec779b8eSAndroid Build Coastguard Worker * Remove the given client from the active clients list; does not disconnect the client. 1096*ec779b8eSAndroid Build Coastguard Worker * 1097*ec779b8eSAndroid Build Coastguard Worker * This method acquires mServiceLock. 1098*ec779b8eSAndroid Build Coastguard Worker */ 1099*ec779b8eSAndroid Build Coastguard Worker void removeByClient(const BasicClient* client); 1100*ec779b8eSAndroid Build Coastguard Worker 1101*ec779b8eSAndroid Build Coastguard Worker /** 1102*ec779b8eSAndroid Build Coastguard Worker * Add new client to active clients list after conflicting clients have disconnected using the 1103*ec779b8eSAndroid Build Coastguard Worker * values set in the partial descriptor passed in to construct the actual client descriptor. 1104*ec779b8eSAndroid Build Coastguard Worker * This is typically called at the end of a connect call. 1105*ec779b8eSAndroid Build Coastguard Worker * 1106*ec779b8eSAndroid Build Coastguard Worker * This method must be called with mServiceLock held. 1107*ec779b8eSAndroid Build Coastguard Worker */ 1108*ec779b8eSAndroid Build Coastguard Worker void finishConnectLocked(const sp<BasicClient>& client, const DescriptorPtr& desc, 1109*ec779b8eSAndroid Build Coastguard Worker int oomScoreOffset, bool systemNativeClient); 1110*ec779b8eSAndroid Build Coastguard Worker 1111*ec779b8eSAndroid Build Coastguard Worker /** 1112*ec779b8eSAndroid Build Coastguard Worker * Returns the underlying camera Id string mapped to a camera id int 1113*ec779b8eSAndroid Build Coastguard Worker * Empty string is returned when the cameraIdInt is invalid. 1114*ec779b8eSAndroid Build Coastguard Worker */ 1115*ec779b8eSAndroid Build Coastguard Worker std::string cameraIdIntToStr(int cameraIdInt, int32_t deviceId, int32_t devicePolicy); 1116*ec779b8eSAndroid Build Coastguard Worker 1117*ec779b8eSAndroid Build Coastguard Worker /** 1118*ec779b8eSAndroid Build Coastguard Worker * Returns the underlying camera Id string mapped to a camera id int 1119*ec779b8eSAndroid Build Coastguard Worker * Empty string is returned when the cameraIdInt is invalid. 1120*ec779b8eSAndroid Build Coastguard Worker */ 1121*ec779b8eSAndroid Build Coastguard Worker std::string cameraIdIntToStrLocked(int cameraIdInt, int32_t deviceId, int32_t devicePolicy); 1122*ec779b8eSAndroid Build Coastguard Worker 1123*ec779b8eSAndroid Build Coastguard Worker /** 1124*ec779b8eSAndroid Build Coastguard Worker * Remove all the clients corresponding to the given camera id from the list of active clients. 1125*ec779b8eSAndroid Build Coastguard Worker * If none exists, return an empty strongpointer. 1126*ec779b8eSAndroid Build Coastguard Worker * 1127*ec779b8eSAndroid Build Coastguard Worker * This method must be called with mServiceLock held. 1128*ec779b8eSAndroid Build Coastguard Worker */ 1129*ec779b8eSAndroid Build Coastguard Worker std::vector<sp<CameraService::BasicClient>> removeClientsLocked(const std::string& cameraId); 1130*ec779b8eSAndroid Build Coastguard Worker 1131*ec779b8eSAndroid Build Coastguard Worker /** 1132*ec779b8eSAndroid Build Coastguard Worker * Handle a notification that the current device user has changed. 1133*ec779b8eSAndroid Build Coastguard Worker */ 1134*ec779b8eSAndroid Build Coastguard Worker void doUserSwitch(const std::vector<int32_t>& newUserIds); 1135*ec779b8eSAndroid Build Coastguard Worker 1136*ec779b8eSAndroid Build Coastguard Worker /** 1137*ec779b8eSAndroid Build Coastguard Worker * Add an event log message. 1138*ec779b8eSAndroid Build Coastguard Worker */ 1139*ec779b8eSAndroid Build Coastguard Worker void logEvent(const std::string &event); 1140*ec779b8eSAndroid Build Coastguard Worker 1141*ec779b8eSAndroid Build Coastguard Worker /** 1142*ec779b8eSAndroid Build Coastguard Worker * Add an event log message that a client has been disconnected. 1143*ec779b8eSAndroid Build Coastguard Worker */ 1144*ec779b8eSAndroid Build Coastguard Worker void logDisconnected(const std::string &cameraId, int clientPid, 1145*ec779b8eSAndroid Build Coastguard Worker const std::string &clientPackage); 1146*ec779b8eSAndroid Build Coastguard Worker 1147*ec779b8eSAndroid Build Coastguard Worker /** 1148*ec779b8eSAndroid Build Coastguard Worker * Add an event log message that a client has been disconnected from offline device. 1149*ec779b8eSAndroid Build Coastguard Worker */ 1150*ec779b8eSAndroid Build Coastguard Worker void logDisconnectedOffline(const std::string &cameraId, int clientPid, 1151*ec779b8eSAndroid Build Coastguard Worker const std::string &clientPackage); 1152*ec779b8eSAndroid Build Coastguard Worker 1153*ec779b8eSAndroid Build Coastguard Worker /** 1154*ec779b8eSAndroid Build Coastguard Worker * Add an event log message that an offline client has been connected. 1155*ec779b8eSAndroid Build Coastguard Worker */ 1156*ec779b8eSAndroid Build Coastguard Worker void logConnectedOffline(const std::string &cameraId, int clientPid, 1157*ec779b8eSAndroid Build Coastguard Worker const std::string &clientPackage); 1158*ec779b8eSAndroid Build Coastguard Worker 1159*ec779b8eSAndroid Build Coastguard Worker /** 1160*ec779b8eSAndroid Build Coastguard Worker * Add an event log message that a client has been connected. 1161*ec779b8eSAndroid Build Coastguard Worker */ 1162*ec779b8eSAndroid Build Coastguard Worker void logConnected(const std::string &cameraId, int clientPid, const std::string &clientPackage); 1163*ec779b8eSAndroid Build Coastguard Worker 1164*ec779b8eSAndroid Build Coastguard Worker /** 1165*ec779b8eSAndroid Build Coastguard Worker * Add an event log message that a client's connect attempt has been rejected. 1166*ec779b8eSAndroid Build Coastguard Worker */ 1167*ec779b8eSAndroid Build Coastguard Worker void logRejected(const std::string &cameraId, int clientPid, const std::string &clientPackage, 1168*ec779b8eSAndroid Build Coastguard Worker const std::string &reason); 1169*ec779b8eSAndroid Build Coastguard Worker 1170*ec779b8eSAndroid Build Coastguard Worker /** 1171*ec779b8eSAndroid Build Coastguard Worker * Add an event log message when a client calls setTorchMode succesfully. 1172*ec779b8eSAndroid Build Coastguard Worker */ 1173*ec779b8eSAndroid Build Coastguard Worker void logTorchEvent(const std::string &cameraId, const std::string &torchState, int clientPid); 1174*ec779b8eSAndroid Build Coastguard Worker 1175*ec779b8eSAndroid Build Coastguard Worker /** 1176*ec779b8eSAndroid Build Coastguard Worker * Add an event log message that the current device user has been switched. 1177*ec779b8eSAndroid Build Coastguard Worker */ 1178*ec779b8eSAndroid Build Coastguard Worker void logUserSwitch(const std::set<userid_t>& oldUserIds, 1179*ec779b8eSAndroid Build Coastguard Worker const std::set<userid_t>& newUserIds); 1180*ec779b8eSAndroid Build Coastguard Worker 1181*ec779b8eSAndroid Build Coastguard Worker /** 1182*ec779b8eSAndroid Build Coastguard Worker * Add an event log message that a device has been removed by the HAL 1183*ec779b8eSAndroid Build Coastguard Worker */ 1184*ec779b8eSAndroid Build Coastguard Worker void logDeviceRemoved(const std::string &cameraId, const std::string &reason); 1185*ec779b8eSAndroid Build Coastguard Worker 1186*ec779b8eSAndroid Build Coastguard Worker /** 1187*ec779b8eSAndroid Build Coastguard Worker * Add an event log message that a device has been added by the HAL 1188*ec779b8eSAndroid Build Coastguard Worker */ 1189*ec779b8eSAndroid Build Coastguard Worker void logDeviceAdded(const std::string &cameraId, const std::string &reason); 1190*ec779b8eSAndroid Build Coastguard Worker 1191*ec779b8eSAndroid Build Coastguard Worker /** 1192*ec779b8eSAndroid Build Coastguard Worker * Add an event log message that a client has unexpectedly died. 1193*ec779b8eSAndroid Build Coastguard Worker */ 1194*ec779b8eSAndroid Build Coastguard Worker void logClientDied(int clientPid, const std::string &reason); 1195*ec779b8eSAndroid Build Coastguard Worker 1196*ec779b8eSAndroid Build Coastguard Worker /** 1197*ec779b8eSAndroid Build Coastguard Worker * Add a event log message that a serious service-level error has occured 1198*ec779b8eSAndroid Build Coastguard Worker * The errorCode should be one of the Android Errors 1199*ec779b8eSAndroid Build Coastguard Worker */ 1200*ec779b8eSAndroid Build Coastguard Worker void logServiceError(const std::string &msg, int errorCode); 1201*ec779b8eSAndroid Build Coastguard Worker 1202*ec779b8eSAndroid Build Coastguard Worker /** 1203*ec779b8eSAndroid Build Coastguard Worker * Dump the event log to an FD 1204*ec779b8eSAndroid Build Coastguard Worker */ 1205*ec779b8eSAndroid Build Coastguard Worker void dumpEventLog(int fd); 1206*ec779b8eSAndroid Build Coastguard Worker 1207*ec779b8eSAndroid Build Coastguard Worker void cacheClientTagDumpIfNeeded(const std::string &cameraId, BasicClient *client); 1208*ec779b8eSAndroid Build Coastguard Worker 1209*ec779b8eSAndroid Build Coastguard Worker /** 1210*ec779b8eSAndroid Build Coastguard Worker * This method will acquire mServiceLock 1211*ec779b8eSAndroid Build Coastguard Worker */ 1212*ec779b8eSAndroid Build Coastguard Worker void updateCameraNumAndIds(); 1213*ec779b8eSAndroid Build Coastguard Worker 1214*ec779b8eSAndroid Build Coastguard Worker /** 1215*ec779b8eSAndroid Build Coastguard Worker * Filter camera characteristics for S Performance class primary cameras. 1216*ec779b8eSAndroid Build Coastguard Worker * mServiceLock should be locked. 1217*ec779b8eSAndroid Build Coastguard Worker */ 1218*ec779b8eSAndroid Build Coastguard Worker void filterSPerfClassCharacteristicsLocked(); 1219*ec779b8eSAndroid Build Coastguard Worker 1220*ec779b8eSAndroid Build Coastguard Worker // File descriptor to temp file used for caching previous open 1221*ec779b8eSAndroid Build Coastguard Worker // session dumpsys info. 1222*ec779b8eSAndroid Build Coastguard Worker int mMemFd; 1223*ec779b8eSAndroid Build Coastguard Worker 1224*ec779b8eSAndroid Build Coastguard Worker // Number of camera devices (excluding hidden secure cameras) 1225*ec779b8eSAndroid Build Coastguard Worker int mNumberOfCameras; 1226*ec779b8eSAndroid Build Coastguard Worker // Number of camera devices (excluding hidden secure cameras and 1227*ec779b8eSAndroid Build Coastguard Worker // system cameras) 1228*ec779b8eSAndroid Build Coastguard Worker int mNumberOfCamerasWithoutSystemCamera; 1229*ec779b8eSAndroid Build Coastguard Worker 1230*ec779b8eSAndroid Build Coastguard Worker std::vector<std::string> mNormalDeviceIds; 1231*ec779b8eSAndroid Build Coastguard Worker std::vector<std::string> mNormalDeviceIdsWithoutSystemCamera; 1232*ec779b8eSAndroid Build Coastguard Worker std::set<std::string> mPerfClassPrimaryCameraIds; 1233*ec779b8eSAndroid Build Coastguard Worker 1234*ec779b8eSAndroid Build Coastguard Worker // sounds 1235*ec779b8eSAndroid Build Coastguard Worker sp<MediaPlayer> newMediaPlayer(const char *file); 1236*ec779b8eSAndroid Build Coastguard Worker 1237*ec779b8eSAndroid Build Coastguard Worker Mutex mSoundLock; 1238*ec779b8eSAndroid Build Coastguard Worker sp<MediaPlayer> mSoundPlayer[NUM_SOUNDS]; 1239*ec779b8eSAndroid Build Coastguard Worker int mSoundRef; // reference count (release all MediaPlayer when 0) 1240*ec779b8eSAndroid Build Coastguard Worker 1241*ec779b8eSAndroid Build Coastguard Worker // Basic flag on whether the camera subsystem is in a usable state 1242*ec779b8eSAndroid Build Coastguard Worker bool mInitialized; 1243*ec779b8eSAndroid Build Coastguard Worker 1244*ec779b8eSAndroid Build Coastguard Worker sp<CameraProviderManager> mCameraProviderManager; 1245*ec779b8eSAndroid Build Coastguard Worker 1246*ec779b8eSAndroid Build Coastguard Worker class ServiceListener : public virtual IBinder::DeathRecipient { 1247*ec779b8eSAndroid Build Coastguard Worker public: ServiceListener(sp<CameraService> parent,sp<hardware::ICameraServiceListener> listener,int uid,int pid,bool isVendorClient,bool openCloseCallbackAllowed)1248*ec779b8eSAndroid Build Coastguard Worker ServiceListener(sp<CameraService> parent, sp<hardware::ICameraServiceListener> listener, 1249*ec779b8eSAndroid Build Coastguard Worker int uid, int pid, bool isVendorClient, bool openCloseCallbackAllowed) 1250*ec779b8eSAndroid Build Coastguard Worker : mParent(parent), mListener(listener), mListenerUid(uid), mListenerPid(pid), 1251*ec779b8eSAndroid Build Coastguard Worker mIsVendorListener(isVendorClient), 1252*ec779b8eSAndroid Build Coastguard Worker mOpenCloseCallbackAllowed(openCloseCallbackAllowed) { } 1253*ec779b8eSAndroid Build Coastguard Worker initialize(bool isProcessLocalTest)1254*ec779b8eSAndroid Build Coastguard Worker status_t initialize(bool isProcessLocalTest) { 1255*ec779b8eSAndroid Build Coastguard Worker if (isProcessLocalTest) { 1256*ec779b8eSAndroid Build Coastguard Worker return OK; 1257*ec779b8eSAndroid Build Coastguard Worker } 1258*ec779b8eSAndroid Build Coastguard Worker return IInterface::asBinder(mListener)->linkToDeath(this); 1259*ec779b8eSAndroid Build Coastguard Worker } 1260*ec779b8eSAndroid Build Coastguard Worker 1261*ec779b8eSAndroid Build Coastguard Worker template<typename... args_t> handleBinderStatus(const binder::Status & ret,const char * logOnError,args_t...args)1262*ec779b8eSAndroid Build Coastguard Worker void handleBinderStatus(const binder::Status &ret, const char *logOnError, 1263*ec779b8eSAndroid Build Coastguard Worker args_t... args) { 1264*ec779b8eSAndroid Build Coastguard Worker if (!ret.isOk() && 1265*ec779b8eSAndroid Build Coastguard Worker (ret.exceptionCode() != binder::Status::Exception::EX_TRANSACTION_FAILED 1266*ec779b8eSAndroid Build Coastguard Worker || !mLastTransactFailed)) { 1267*ec779b8eSAndroid Build Coastguard Worker ALOGE(logOnError, args...); 1268*ec779b8eSAndroid Build Coastguard Worker } 1269*ec779b8eSAndroid Build Coastguard Worker 1270*ec779b8eSAndroid Build Coastguard Worker // If the transaction failed, the process may have died (or other things, see 1271*ec779b8eSAndroid Build Coastguard Worker // b/28321379). Mute consecutive errors from this listener to avoid log spam. 1272*ec779b8eSAndroid Build Coastguard Worker if (ret.exceptionCode() == binder::Status::Exception::EX_TRANSACTION_FAILED) { 1273*ec779b8eSAndroid Build Coastguard Worker if (!mLastTransactFailed) { 1274*ec779b8eSAndroid Build Coastguard Worker ALOGE("%s: Muting similar errors from listener %d:%d", __FUNCTION__, 1275*ec779b8eSAndroid Build Coastguard Worker mListenerUid, mListenerPid); 1276*ec779b8eSAndroid Build Coastguard Worker } 1277*ec779b8eSAndroid Build Coastguard Worker mLastTransactFailed = true; 1278*ec779b8eSAndroid Build Coastguard Worker } else { 1279*ec779b8eSAndroid Build Coastguard Worker // Reset mLastTransactFailed when binder becomes healthy again. 1280*ec779b8eSAndroid Build Coastguard Worker mLastTransactFailed = false; 1281*ec779b8eSAndroid Build Coastguard Worker } 1282*ec779b8eSAndroid Build Coastguard Worker } 1283*ec779b8eSAndroid Build Coastguard Worker binderDied(const wp<IBinder> &)1284*ec779b8eSAndroid Build Coastguard Worker virtual void binderDied(const wp<IBinder> &/*who*/) { 1285*ec779b8eSAndroid Build Coastguard Worker auto parent = mParent.promote(); 1286*ec779b8eSAndroid Build Coastguard Worker if (parent.get() != nullptr) { 1287*ec779b8eSAndroid Build Coastguard Worker parent->removeListener(mListener); 1288*ec779b8eSAndroid Build Coastguard Worker } 1289*ec779b8eSAndroid Build Coastguard Worker } 1290*ec779b8eSAndroid Build Coastguard Worker getListenerUid()1291*ec779b8eSAndroid Build Coastguard Worker int getListenerUid() { return mListenerUid; } getListenerPid()1292*ec779b8eSAndroid Build Coastguard Worker int getListenerPid() { return mListenerPid; } getListener()1293*ec779b8eSAndroid Build Coastguard Worker sp<hardware::ICameraServiceListener> getListener() { return mListener; } isVendorListener()1294*ec779b8eSAndroid Build Coastguard Worker bool isVendorListener() { return mIsVendorListener; } isOpenCloseCallbackAllowed()1295*ec779b8eSAndroid Build Coastguard Worker bool isOpenCloseCallbackAllowed() { return mOpenCloseCallbackAllowed; } 1296*ec779b8eSAndroid Build Coastguard Worker 1297*ec779b8eSAndroid Build Coastguard Worker private: 1298*ec779b8eSAndroid Build Coastguard Worker wp<CameraService> mParent; 1299*ec779b8eSAndroid Build Coastguard Worker sp<hardware::ICameraServiceListener> mListener; 1300*ec779b8eSAndroid Build Coastguard Worker int mListenerUid = -1; 1301*ec779b8eSAndroid Build Coastguard Worker int mListenerPid = -1; 1302*ec779b8eSAndroid Build Coastguard Worker bool mIsVendorListener = false; 1303*ec779b8eSAndroid Build Coastguard Worker bool mOpenCloseCallbackAllowed = false; 1304*ec779b8eSAndroid Build Coastguard Worker 1305*ec779b8eSAndroid Build Coastguard Worker // Flag for preventing log spam when binder becomes unhealthy 1306*ec779b8eSAndroid Build Coastguard Worker bool mLastTransactFailed = false; 1307*ec779b8eSAndroid Build Coastguard Worker }; 1308*ec779b8eSAndroid Build Coastguard Worker 1309*ec779b8eSAndroid Build Coastguard Worker // Guarded by mStatusListenerMutex 1310*ec779b8eSAndroid Build Coastguard Worker std::vector<sp<ServiceListener>> mListenerList; 1311*ec779b8eSAndroid Build Coastguard Worker 1312*ec779b8eSAndroid Build Coastguard Worker Mutex mStatusListenerLock; 1313*ec779b8eSAndroid Build Coastguard Worker 1314*ec779b8eSAndroid Build Coastguard Worker /** 1315*ec779b8eSAndroid Build Coastguard Worker * Update the status for the given camera id (if that device exists), and broadcast the 1316*ec779b8eSAndroid Build Coastguard Worker * status update to all current ICameraServiceListeners if the status has changed. Any 1317*ec779b8eSAndroid Build Coastguard Worker * statuses in rejectedSourceStates will be ignored. 1318*ec779b8eSAndroid Build Coastguard Worker * 1319*ec779b8eSAndroid Build Coastguard Worker * This method must be idempotent. 1320*ec779b8eSAndroid Build Coastguard Worker * This method acquires mStatusLock and mStatusListenerLock. 1321*ec779b8eSAndroid Build Coastguard Worker * For any virtual camera, this method must pass its mapped camera id and device id to 1322*ec779b8eSAndroid Build Coastguard Worker * ICameraServiceListeners (using mVirtualDeviceCameraIdMapper). 1323*ec779b8eSAndroid Build Coastguard Worker */ 1324*ec779b8eSAndroid Build Coastguard Worker void updateStatus(StatusInternal status, 1325*ec779b8eSAndroid Build Coastguard Worker const std::string& cameraId, 1326*ec779b8eSAndroid Build Coastguard Worker std::initializer_list<StatusInternal> 1327*ec779b8eSAndroid Build Coastguard Worker rejectedSourceStates); 1328*ec779b8eSAndroid Build Coastguard Worker void updateStatus(StatusInternal status, 1329*ec779b8eSAndroid Build Coastguard Worker const std::string& cameraId); 1330*ec779b8eSAndroid Build Coastguard Worker 1331*ec779b8eSAndroid Build Coastguard Worker /** 1332*ec779b8eSAndroid Build Coastguard Worker * Update the opened/closed status of the given camera id. 1333*ec779b8eSAndroid Build Coastguard Worker * 1334*ec779b8eSAndroid Build Coastguard Worker * This method acqiures mStatusListenerLock. 1335*ec779b8eSAndroid Build Coastguard Worker */ 1336*ec779b8eSAndroid Build Coastguard Worker void updateOpenCloseStatus(const std::string& cameraId, bool open, 1337*ec779b8eSAndroid Build Coastguard Worker const std::string& packageName, bool sharedMode); 1338*ec779b8eSAndroid Build Coastguard Worker 1339*ec779b8eSAndroid Build Coastguard Worker // flashlight control 1340*ec779b8eSAndroid Build Coastguard Worker sp<CameraFlashlight> mFlashlight; 1341*ec779b8eSAndroid Build Coastguard Worker // guard mTorchStatusMap 1342*ec779b8eSAndroid Build Coastguard Worker Mutex mTorchStatusMutex; 1343*ec779b8eSAndroid Build Coastguard Worker // guard mTorchClientMap 1344*ec779b8eSAndroid Build Coastguard Worker Mutex mTorchClientMapMutex; 1345*ec779b8eSAndroid Build Coastguard Worker // guard mTorchUidMap 1346*ec779b8eSAndroid Build Coastguard Worker Mutex mTorchUidMapMutex; 1347*ec779b8eSAndroid Build Coastguard Worker // camera id -> torch status 1348*ec779b8eSAndroid Build Coastguard Worker KeyedVector<std::string, TorchModeStatus> 1349*ec779b8eSAndroid Build Coastguard Worker mTorchStatusMap; 1350*ec779b8eSAndroid Build Coastguard Worker // camera id -> torch client binder 1351*ec779b8eSAndroid Build Coastguard Worker // only store the last client that turns on each camera's torch mode 1352*ec779b8eSAndroid Build Coastguard Worker KeyedVector<std::string, sp<IBinder>> mTorchClientMap; 1353*ec779b8eSAndroid Build Coastguard Worker // camera id -> [incoming uid, current uid] pair 1354*ec779b8eSAndroid Build Coastguard Worker std::map<std::string, std::pair<int, int>> mTorchUidMap; 1355*ec779b8eSAndroid Build Coastguard Worker 1356*ec779b8eSAndroid Build Coastguard Worker // check and handle if torch client's process has died 1357*ec779b8eSAndroid Build Coastguard Worker void handleTorchClientBinderDied(const wp<IBinder> &who); 1358*ec779b8eSAndroid Build Coastguard Worker 1359*ec779b8eSAndroid Build Coastguard Worker // handle torch mode status change and invoke callbacks. mTorchStatusMutex 1360*ec779b8eSAndroid Build Coastguard Worker // should be locked. 1361*ec779b8eSAndroid Build Coastguard Worker void onTorchStatusChangedLocked(const std::string& cameraId, 1362*ec779b8eSAndroid Build Coastguard Worker TorchModeStatus newStatus, 1363*ec779b8eSAndroid Build Coastguard Worker SystemCameraKind systemCameraKind); 1364*ec779b8eSAndroid Build Coastguard Worker 1365*ec779b8eSAndroid Build Coastguard Worker // get a camera's torch status. mTorchStatusMutex should be locked. 1366*ec779b8eSAndroid Build Coastguard Worker status_t getTorchStatusLocked(const std::string &cameraId, 1367*ec779b8eSAndroid Build Coastguard Worker TorchModeStatus *status) const; 1368*ec779b8eSAndroid Build Coastguard Worker 1369*ec779b8eSAndroid Build Coastguard Worker // set a camera's torch status. mTorchStatusMutex should be locked. 1370*ec779b8eSAndroid Build Coastguard Worker status_t setTorchStatusLocked(const std::string &cameraId, 1371*ec779b8eSAndroid Build Coastguard Worker TorchModeStatus status); 1372*ec779b8eSAndroid Build Coastguard Worker 1373*ec779b8eSAndroid Build Coastguard Worker // notify physical camera status when the physical camera is public. 1374*ec779b8eSAndroid Build Coastguard Worker // Expects mStatusListenerLock to be locked. 1375*ec779b8eSAndroid Build Coastguard Worker void notifyPhysicalCameraStatusLocked(int32_t status, const std::string& physicalCameraId, 1376*ec779b8eSAndroid Build Coastguard Worker const std::list<std::string>& logicalCameraIds, SystemCameraKind deviceKind, 1377*ec779b8eSAndroid Build Coastguard Worker int32_t virtualDeviceId); 1378*ec779b8eSAndroid Build Coastguard Worker 1379*ec779b8eSAndroid Build Coastguard Worker // get list of logical cameras which are backed by physicalCameraId 1380*ec779b8eSAndroid Build Coastguard Worker std::list<std::string> getLogicalCameras(const std::string& physicalCameraId); 1381*ec779b8eSAndroid Build Coastguard Worker 1382*ec779b8eSAndroid Build Coastguard Worker 1383*ec779b8eSAndroid Build Coastguard Worker // IBinder::DeathRecipient implementation 1384*ec779b8eSAndroid Build Coastguard Worker virtual void binderDied(const wp<IBinder> &who); 1385*ec779b8eSAndroid Build Coastguard Worker 1386*ec779b8eSAndroid Build Coastguard Worker /** 1387*ec779b8eSAndroid Build Coastguard Worker * Initialize and cache the metadata used by the HAL1 shim for a given cameraId. 1388*ec779b8eSAndroid Build Coastguard Worker * 1389*ec779b8eSAndroid Build Coastguard Worker * Sets Status to a service-specific error on failure 1390*ec779b8eSAndroid Build Coastguard Worker */ 1391*ec779b8eSAndroid Build Coastguard Worker binder::Status initializeShimMetadata(int cameraId); 1392*ec779b8eSAndroid Build Coastguard Worker 1393*ec779b8eSAndroid Build Coastguard Worker /** 1394*ec779b8eSAndroid Build Coastguard Worker * Get the cached CameraParameters for the camera. If they haven't been 1395*ec779b8eSAndroid Build Coastguard Worker * cached yet, then initialize them for the first time. 1396*ec779b8eSAndroid Build Coastguard Worker * 1397*ec779b8eSAndroid Build Coastguard Worker * Sets Status to a service-specific error on failure 1398*ec779b8eSAndroid Build Coastguard Worker */ 1399*ec779b8eSAndroid Build Coastguard Worker binder::Status getLegacyParametersLazy(int cameraId, /*out*/CameraParameters* parameters); 1400*ec779b8eSAndroid Build Coastguard Worker 1401*ec779b8eSAndroid Build Coastguard Worker // Blocks all clients from the UID 1402*ec779b8eSAndroid Build Coastguard Worker void blockClientsForUid(uid_t uid); 1403*ec779b8eSAndroid Build Coastguard Worker 1404*ec779b8eSAndroid Build Coastguard Worker // Blocks all active clients. 1405*ec779b8eSAndroid Build Coastguard Worker void blockAllClients(); 1406*ec779b8eSAndroid Build Coastguard Worker 1407*ec779b8eSAndroid Build Coastguard Worker // Blocks clients whose privacy is enabled. 1408*ec779b8eSAndroid Build Coastguard Worker void blockPrivacyEnabledClients(); 1409*ec779b8eSAndroid Build Coastguard Worker 1410*ec779b8eSAndroid Build Coastguard Worker // Overrides the UID state as if it is idle 1411*ec779b8eSAndroid Build Coastguard Worker status_t handleSetUidState(const Vector<String16>& args, int err); 1412*ec779b8eSAndroid Build Coastguard Worker 1413*ec779b8eSAndroid Build Coastguard Worker // Clears the override for the UID state 1414*ec779b8eSAndroid Build Coastguard Worker status_t handleResetUidState(const Vector<String16>& args, int err); 1415*ec779b8eSAndroid Build Coastguard Worker 1416*ec779b8eSAndroid Build Coastguard Worker // Gets the UID state 1417*ec779b8eSAndroid Build Coastguard Worker status_t handleGetUidState(const Vector<String16>& args, int out, int err); 1418*ec779b8eSAndroid Build Coastguard Worker 1419*ec779b8eSAndroid Build Coastguard Worker // Set the rotate-and-crop AUTO override behavior 1420*ec779b8eSAndroid Build Coastguard Worker status_t handleSetRotateAndCrop(const Vector<String16>& args); 1421*ec779b8eSAndroid Build Coastguard Worker 1422*ec779b8eSAndroid Build Coastguard Worker // Get the rotate-and-crop AUTO override behavior 1423*ec779b8eSAndroid Build Coastguard Worker status_t handleGetRotateAndCrop(int out); 1424*ec779b8eSAndroid Build Coastguard Worker 1425*ec779b8eSAndroid Build Coastguard Worker // Set the autoframing AUTO override behaviour. 1426*ec779b8eSAndroid Build Coastguard Worker status_t handleSetAutoframing(const Vector<String16>& args); 1427*ec779b8eSAndroid Build Coastguard Worker 1428*ec779b8eSAndroid Build Coastguard Worker // Get the autoframing AUTO override behaviour 1429*ec779b8eSAndroid Build Coastguard Worker status_t handleGetAutoframing(int out); 1430*ec779b8eSAndroid Build Coastguard Worker 1431*ec779b8eSAndroid Build Coastguard Worker // Set the mask for image dump to disk 1432*ec779b8eSAndroid Build Coastguard Worker status_t handleSetImageDumpMask(const Vector<String16>& args); 1433*ec779b8eSAndroid Build Coastguard Worker 1434*ec779b8eSAndroid Build Coastguard Worker // Get the mask for image dump to disk 1435*ec779b8eSAndroid Build Coastguard Worker status_t handleGetImageDumpMask(int out); 1436*ec779b8eSAndroid Build Coastguard Worker 1437*ec779b8eSAndroid Build Coastguard Worker // Set the camera mute state 1438*ec779b8eSAndroid Build Coastguard Worker status_t handleSetCameraMute(const Vector<String16>& args); 1439*ec779b8eSAndroid Build Coastguard Worker 1440*ec779b8eSAndroid Build Coastguard Worker // Set the stream use case overrides 1441*ec779b8eSAndroid Build Coastguard Worker status_t handleSetStreamUseCaseOverrides(const Vector<String16>& args); 1442*ec779b8eSAndroid Build Coastguard Worker 1443*ec779b8eSAndroid Build Coastguard Worker // Clear the stream use case overrides 1444*ec779b8eSAndroid Build Coastguard Worker void handleClearStreamUseCaseOverrides(); 1445*ec779b8eSAndroid Build Coastguard Worker 1446*ec779b8eSAndroid Build Coastguard Worker // Set or clear the zoom override flag 1447*ec779b8eSAndroid Build Coastguard Worker status_t handleSetZoomOverride(const Vector<String16>& args); 1448*ec779b8eSAndroid Build Coastguard Worker 1449*ec779b8eSAndroid Build Coastguard Worker // Set Camera Id remapping using 'cmd' 1450*ec779b8eSAndroid Build Coastguard Worker status_t handleCameraIdRemapping(const Vector<String16>& args, int errFd); 1451*ec779b8eSAndroid Build Coastguard Worker 1452*ec779b8eSAndroid Build Coastguard Worker // Handle 'watch' command as passed through 'cmd' 1453*ec779b8eSAndroid Build Coastguard Worker status_t handleWatchCommand(const Vector<String16> &args, int inFd, int outFd); 1454*ec779b8eSAndroid Build Coastguard Worker 1455*ec779b8eSAndroid Build Coastguard Worker // Set the camera service watchdog 1456*ec779b8eSAndroid Build Coastguard Worker status_t handleSetCameraServiceWatchdog(const Vector<String16>& args); 1457*ec779b8eSAndroid Build Coastguard Worker 1458*ec779b8eSAndroid Build Coastguard Worker // Enable tag monitoring of the given tags in provided clients 1459*ec779b8eSAndroid Build Coastguard Worker status_t startWatchingTags(const Vector<String16> &args, int outFd); 1460*ec779b8eSAndroid Build Coastguard Worker 1461*ec779b8eSAndroid Build Coastguard Worker // Disable tag monitoring 1462*ec779b8eSAndroid Build Coastguard Worker status_t stopWatchingTags(int outFd); 1463*ec779b8eSAndroid Build Coastguard Worker 1464*ec779b8eSAndroid Build Coastguard Worker // Clears mWatchedClientsDumpCache 1465*ec779b8eSAndroid Build Coastguard Worker status_t clearCachedMonitoredTagDumps(int outFd); 1466*ec779b8eSAndroid Build Coastguard Worker 1467*ec779b8eSAndroid Build Coastguard Worker // Print events of monitored tags in all cached and attached clients 1468*ec779b8eSAndroid Build Coastguard Worker status_t printWatchedTags(int outFd); 1469*ec779b8eSAndroid Build Coastguard Worker 1470*ec779b8eSAndroid Build Coastguard Worker // Print events of monitored tags in all attached clients as they are captured. New events are 1471*ec779b8eSAndroid Build Coastguard Worker // fetched every `refreshMillis` ms 1472*ec779b8eSAndroid Build Coastguard Worker // NOTE: This function does not terminate until user passes '\n' to inFd. 1473*ec779b8eSAndroid Build Coastguard Worker status_t printWatchedTagsUntilInterrupt(const Vector<String16> &args, int inFd, int outFd); 1474*ec779b8eSAndroid Build Coastguard Worker 1475*ec779b8eSAndroid Build Coastguard Worker // Parses comma separated clients list and adds them to mWatchedClientPackages. 1476*ec779b8eSAndroid Build Coastguard Worker // Does not acquire mLogLock before modifying mWatchedClientPackages. It is the caller's 1477*ec779b8eSAndroid Build Coastguard Worker // responsibility to acquire mLogLock before calling this function. 1478*ec779b8eSAndroid Build Coastguard Worker void parseClientsToWatchLocked(const std::string &clients); 1479*ec779b8eSAndroid Build Coastguard Worker 1480*ec779b8eSAndroid Build Coastguard Worker // Prints the shell command help 1481*ec779b8eSAndroid Build Coastguard Worker status_t printHelp(int out); 1482*ec779b8eSAndroid Build Coastguard Worker 1483*ec779b8eSAndroid Build Coastguard Worker // Returns true if client should monitor tags based on the contents of mWatchedClientPackages. 1484*ec779b8eSAndroid Build Coastguard Worker // Acquires mLogLock before querying mWatchedClientPackages. 1485*ec779b8eSAndroid Build Coastguard Worker bool isClientWatched(const BasicClient *client); 1486*ec779b8eSAndroid Build Coastguard Worker 1487*ec779b8eSAndroid Build Coastguard Worker // Returns true if client should monitor tags based on the contents of mWatchedClientPackages. 1488*ec779b8eSAndroid Build Coastguard Worker // Does not acquire mLogLock before querying mWatchedClientPackages. It is the caller's 1489*ec779b8eSAndroid Build Coastguard Worker // responsibility to acquire mLogLock before calling this functions. 1490*ec779b8eSAndroid Build Coastguard Worker bool isClientWatchedLocked(const BasicClient *client); 1491*ec779b8eSAndroid Build Coastguard Worker 1492*ec779b8eSAndroid Build Coastguard Worker // Filters out fingerprintable keys if the calling process does not have CAMERA permission. 1493*ec779b8eSAndroid Build Coastguard Worker // Note: function caller should ensure that shouldRejectSystemCameraConnection is checked 1494*ec779b8eSAndroid Build Coastguard Worker // for the calling process before calling this function. 1495*ec779b8eSAndroid Build Coastguard Worker binder::Status filterSensitiveMetadataIfNeeded(const std::string& cameraId, 1496*ec779b8eSAndroid Build Coastguard Worker CameraMetadata* metadata); 1497*ec779b8eSAndroid Build Coastguard Worker 1498*ec779b8eSAndroid Build Coastguard Worker /** 1499*ec779b8eSAndroid Build Coastguard Worker * Get the current system time as a formatted string. 1500*ec779b8eSAndroid Build Coastguard Worker */ 1501*ec779b8eSAndroid Build Coastguard Worker static std::string getFormattedCurrentTime(); 1502*ec779b8eSAndroid Build Coastguard Worker 1503*ec779b8eSAndroid Build Coastguard Worker static binder::Status makeClient(const sp<CameraService>& cameraService, 1504*ec779b8eSAndroid Build Coastguard Worker const sp<IInterface>& cameraCb, 1505*ec779b8eSAndroid Build Coastguard Worker const AttributionSourceState& clientAttribution, 1506*ec779b8eSAndroid Build Coastguard Worker int callingPid, bool systemNativeClient, 1507*ec779b8eSAndroid Build Coastguard Worker const std::string& cameraId, int api1CameraId, int facing, 1508*ec779b8eSAndroid Build Coastguard Worker int sensorOrientation, int servicePid, 1509*ec779b8eSAndroid Build Coastguard Worker std::pair<int, IPCTransport> deviceVersionAndIPCTransport, 1510*ec779b8eSAndroid Build Coastguard Worker apiLevel effectiveApiLevel, bool overrideForPerfClass, 1511*ec779b8eSAndroid Build Coastguard Worker int rotationOverride, bool forceSlowJpegMode, 1512*ec779b8eSAndroid Build Coastguard Worker const std::string& originalCameraId, bool sharedMode, 1513*ec779b8eSAndroid Build Coastguard Worker bool isVendorClient, 1514*ec779b8eSAndroid Build Coastguard Worker /*out*/ sp<BasicClient>* client); 1515*ec779b8eSAndroid Build Coastguard Worker 1516*ec779b8eSAndroid Build Coastguard Worker static std::string toString(std::set<userid_t> intSet); 1517*ec779b8eSAndroid Build Coastguard Worker static int32_t mapToInterface(TorchModeStatus status); 1518*ec779b8eSAndroid Build Coastguard Worker static StatusInternal mapToInternal(CameraDeviceStatus status); 1519*ec779b8eSAndroid Build Coastguard Worker static int32_t mapToInterface(StatusInternal status); 1520*ec779b8eSAndroid Build Coastguard Worker 1521*ec779b8eSAndroid Build Coastguard Worker 1522*ec779b8eSAndroid Build Coastguard Worker void broadcastTorchModeStatus(const std::string& cameraId, 1523*ec779b8eSAndroid Build Coastguard Worker TorchModeStatus status, SystemCameraKind systemCameraKind); 1524*ec779b8eSAndroid Build Coastguard Worker 1525*ec779b8eSAndroid Build Coastguard Worker void broadcastTorchStrengthLevel(const std::string& cameraId, int32_t newTorchStrengthLevel); 1526*ec779b8eSAndroid Build Coastguard Worker 1527*ec779b8eSAndroid Build Coastguard Worker void disconnectClient(const std::string& id, sp<BasicClient> clientToDisconnect); 1528*ec779b8eSAndroid Build Coastguard Worker 1529*ec779b8eSAndroid Build Coastguard Worker void disconnectClients(const std::string& id, 1530*ec779b8eSAndroid Build Coastguard Worker std::vector<sp<BasicClient>> clientsToDisconnect); 1531*ec779b8eSAndroid Build Coastguard Worker 1532*ec779b8eSAndroid Build Coastguard Worker // Regular online and offline devices must not be in conflict at camera service layer. 1533*ec779b8eSAndroid Build Coastguard Worker // Use separate keys for offline devices. 1534*ec779b8eSAndroid Build Coastguard Worker static const std::string kOfflineDevice; 1535*ec779b8eSAndroid Build Coastguard Worker 1536*ec779b8eSAndroid Build Coastguard Worker // Sentinel value to be stored in `mWatchedClientsPackages` to indicate that all clients should 1537*ec779b8eSAndroid Build Coastguard Worker // be watched. 1538*ec779b8eSAndroid Build Coastguard Worker static const std::string kWatchAllClientsFlag; 1539*ec779b8eSAndroid Build Coastguard Worker 1540*ec779b8eSAndroid Build Coastguard Worker // TODO: right now each BasicClient holds one AppOpsManager instance. 1541*ec779b8eSAndroid Build Coastguard Worker // We can refactor the code so all of clients share this instance 1542*ec779b8eSAndroid Build Coastguard Worker AppOpsManager mAppOps; 1543*ec779b8eSAndroid Build Coastguard Worker 1544*ec779b8eSAndroid Build Coastguard Worker // Aggreated audio restriction mode for all camera clients 1545*ec779b8eSAndroid Build Coastguard Worker int32_t mAudioRestriction; 1546*ec779b8eSAndroid Build Coastguard Worker 1547*ec779b8eSAndroid Build Coastguard Worker // Current override cmd rotate-and-crop mode; AUTO means no override 1548*ec779b8eSAndroid Build Coastguard Worker uint8_t mOverrideRotateAndCropMode = ANDROID_SCALER_ROTATE_AND_CROP_AUTO; 1549*ec779b8eSAndroid Build Coastguard Worker 1550*ec779b8eSAndroid Build Coastguard Worker // Current autoframing mode 1551*ec779b8eSAndroid Build Coastguard Worker uint8_t mOverrideAutoframingMode = ANDROID_CONTROL_AUTOFRAMING_AUTO; 1552*ec779b8eSAndroid Build Coastguard Worker 1553*ec779b8eSAndroid Build Coastguard Worker // Current image dump mask 1554*ec779b8eSAndroid Build Coastguard Worker uint8_t mImageDumpMask = 0; 1555*ec779b8eSAndroid Build Coastguard Worker 1556*ec779b8eSAndroid Build Coastguard Worker // Current camera mute mode 1557*ec779b8eSAndroid Build Coastguard Worker bool mOverrideCameraMuteMode = false; 1558*ec779b8eSAndroid Build Coastguard Worker 1559*ec779b8eSAndroid Build Coastguard Worker // Camera Service watchdog flag 1560*ec779b8eSAndroid Build Coastguard Worker bool mCameraServiceWatchdogEnabled = true; 1561*ec779b8eSAndroid Build Coastguard Worker 1562*ec779b8eSAndroid Build Coastguard Worker // Current stream use case overrides 1563*ec779b8eSAndroid Build Coastguard Worker std::vector<int64_t> mStreamUseCaseOverrides; 1564*ec779b8eSAndroid Build Coastguard Worker 1565*ec779b8eSAndroid Build Coastguard Worker // Current zoom override value 1566*ec779b8eSAndroid Build Coastguard Worker int32_t mZoomOverrideValue = -1; 1567*ec779b8eSAndroid Build Coastguard Worker 1568*ec779b8eSAndroid Build Coastguard Worker /** 1569*ec779b8eSAndroid Build Coastguard Worker * A listener class that implements the IBinder::DeathRecipient interface 1570*ec779b8eSAndroid Build Coastguard Worker * for use to call back the error state injected by the external camera, and 1571*ec779b8eSAndroid Build Coastguard Worker * camera service can kill the injection when binder signals process death. 1572*ec779b8eSAndroid Build Coastguard Worker */ 1573*ec779b8eSAndroid Build Coastguard Worker class InjectionStatusListener : public virtual IBinder::DeathRecipient { 1574*ec779b8eSAndroid Build Coastguard Worker public: InjectionStatusListener(sp<CameraService> parent)1575*ec779b8eSAndroid Build Coastguard Worker InjectionStatusListener(sp<CameraService> parent) : mParent(parent) {} 1576*ec779b8eSAndroid Build Coastguard Worker 1577*ec779b8eSAndroid Build Coastguard Worker void addListener(const sp<hardware::camera2::ICameraInjectionCallback>& callback); 1578*ec779b8eSAndroid Build Coastguard Worker void removeListener(); 1579*ec779b8eSAndroid Build Coastguard Worker void notifyInjectionError(const std::string &injectedCamId, status_t err); 1580*ec779b8eSAndroid Build Coastguard Worker 1581*ec779b8eSAndroid Build Coastguard Worker // IBinder::DeathRecipient implementation 1582*ec779b8eSAndroid Build Coastguard Worker virtual void binderDied(const wp<IBinder>& who); 1583*ec779b8eSAndroid Build Coastguard Worker 1584*ec779b8eSAndroid Build Coastguard Worker private: 1585*ec779b8eSAndroid Build Coastguard Worker Mutex mListenerLock; 1586*ec779b8eSAndroid Build Coastguard Worker wp<CameraService> mParent; 1587*ec779b8eSAndroid Build Coastguard Worker sp<hardware::camera2::ICameraInjectionCallback> mCameraInjectionCallback; 1588*ec779b8eSAndroid Build Coastguard Worker }; 1589*ec779b8eSAndroid Build Coastguard Worker 1590*ec779b8eSAndroid Build Coastguard Worker sp<InjectionStatusListener> mInjectionStatusListener; 1591*ec779b8eSAndroid Build Coastguard Worker 1592*ec779b8eSAndroid Build Coastguard Worker /** 1593*ec779b8eSAndroid Build Coastguard Worker * A class that implements the hardware::camera2::BnCameraInjectionSession interface 1594*ec779b8eSAndroid Build Coastguard Worker */ 1595*ec779b8eSAndroid Build Coastguard Worker class CameraInjectionSession : public hardware::camera2::BnCameraInjectionSession { 1596*ec779b8eSAndroid Build Coastguard Worker public: CameraInjectionSession(sp<CameraService> parent)1597*ec779b8eSAndroid Build Coastguard Worker CameraInjectionSession(sp<CameraService> parent) : mParent(parent) {} ~CameraInjectionSession()1598*ec779b8eSAndroid Build Coastguard Worker virtual ~CameraInjectionSession() {} 1599*ec779b8eSAndroid Build Coastguard Worker binder::Status stopInjection() override; 1600*ec779b8eSAndroid Build Coastguard Worker 1601*ec779b8eSAndroid Build Coastguard Worker private: 1602*ec779b8eSAndroid Build Coastguard Worker Mutex mInjectionSessionLock; 1603*ec779b8eSAndroid Build Coastguard Worker wp<CameraService> mParent; 1604*ec779b8eSAndroid Build Coastguard Worker }; 1605*ec779b8eSAndroid Build Coastguard Worker 1606*ec779b8eSAndroid Build Coastguard Worker // When injecting the camera, it will check whether the injecting camera status is unavailable. 1607*ec779b8eSAndroid Build Coastguard Worker // If it is, the disconnect function will be called to to prevent camera access on the device. 1608*ec779b8eSAndroid Build Coastguard Worker status_t checkIfInjectionCameraIsPresent(const std::string& externalCamId, 1609*ec779b8eSAndroid Build Coastguard Worker sp<BasicClient> clientSp); 1610*ec779b8eSAndroid Build Coastguard Worker 1611*ec779b8eSAndroid Build Coastguard Worker void clearInjectionParameters(); 1612*ec779b8eSAndroid Build Coastguard Worker 1613*ec779b8eSAndroid Build Coastguard Worker // This is the existing camera id being replaced. 1614*ec779b8eSAndroid Build Coastguard Worker std::string mInjectionInternalCamId; 1615*ec779b8eSAndroid Build Coastguard Worker // This is the external camera Id replacing the internalId. 1616*ec779b8eSAndroid Build Coastguard Worker std::string mInjectionExternalCamId; 1617*ec779b8eSAndroid Build Coastguard Worker bool mInjectionInitPending = false; 1618*ec779b8eSAndroid Build Coastguard Worker // Guard mInjectionInternalCamId and mInjectionInitPending. 1619*ec779b8eSAndroid Build Coastguard Worker Mutex mInjectionParametersLock; 1620*ec779b8eSAndroid Build Coastguard Worker 1621*ec779b8eSAndroid Build Coastguard Worker // Track the folded/unfoled device state. 0 == UNFOLDED, 4 == FOLDED 1622*ec779b8eSAndroid Build Coastguard Worker int64_t mDeviceState; 1623*ec779b8eSAndroid Build Coastguard Worker 1624*ec779b8eSAndroid Build Coastguard Worker void updateTorchUidMapLocked(const std::string& cameraId, int uid); 1625*ec779b8eSAndroid Build Coastguard Worker 1626*ec779b8eSAndroid Build Coastguard Worker VirtualDeviceCameraIdMapper mVirtualDeviceCameraIdMapper; 1627*ec779b8eSAndroid Build Coastguard Worker }; 1628*ec779b8eSAndroid Build Coastguard Worker 1629*ec779b8eSAndroid Build Coastguard Worker } // namespace android 1630*ec779b8eSAndroid Build Coastguard Worker 1631*ec779b8eSAndroid Build Coastguard Worker #endif 1632