xref: /aosp_15_r20/frameworks/av/services/camera/libcameraservice/CameraService.h (revision ec779b8e0859a360c3d303172224686826e6e0e1)
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> &notifyUidSet);
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