xref: /aosp_15_r20/frameworks/av/camera/ndk/impl/ACameraManager.cpp (revision ec779b8e0859a360c3d303172224686826e6e0e1)
1 /*
2  * Copyright (C) 2015 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 //#define LOG_NDEBUG 0
18 #define LOG_TAG "ACameraManager"
19 
20 #include "ACameraManager.h"
21 #include <android_companion_virtualdevice_flags.h>
22 #include <camera/CameraUtils.h>
23 #include <camera/StringUtils.h>
24 #include <camera/VendorTagDescriptor.h>
25 #include <cutils/properties.h>
26 #include <stdlib.h>
27 #include <utils/Vector.h>
28 #include <memory>
29 #include "ACameraDevice.h"
30 #include "ACameraMetadata.h"
31 #include <com_android_internal_camera_flags.h>
32 
33 using namespace android::acam;
34 namespace vd_flags = android::companion::virtualdevice::flags;
35 namespace flags = com::android::internal::camera::flags;
36 
37 namespace android {
38 namespace acam {
39 namespace {
40 
41 using ::android::binder::Status;
42 using ::android::companion::virtualnative::IVirtualDeviceManagerNative;
43 
44 // Return binder connection to VirtualDeviceManager.
45 //
46 // Subsequent calls return the same cached instance.
getVirtualDeviceManager()47 sp<IVirtualDeviceManagerNative> getVirtualDeviceManager() {
48     auto connectToVirtualDeviceManagerNative = []() {
49         sp<IBinder> binder =
50                 defaultServiceManager()->checkService(String16("virtualdevice_native"));
51         if (binder == nullptr) {
52             ALOGW("%s: Cannot get virtualdevice_native service", __func__);
53             return interface_cast<IVirtualDeviceManagerNative>(nullptr);
54         }
55         return interface_cast<IVirtualDeviceManagerNative>(binder);
56     };
57 
58     static sp<IVirtualDeviceManagerNative> vdm = connectToVirtualDeviceManagerNative();
59     return vdm;
60 }
61 
62 // Returns device id calling process is running on.
63 // If the process cannot be attributed to single virtual device id, returns default device id.
getCurrentDeviceId()64 int getCurrentDeviceId() {
65     if (!vd_flags::camera_device_awareness()) {
66         return kDefaultDeviceId;
67     }
68 
69     auto vdm = getVirtualDeviceManager();
70     if (vdm == nullptr) {
71         return kDefaultDeviceId;
72     }
73 
74     const uid_t myUid = getuid();
75     std::vector<int> deviceIds;
76     Status status = vdm->getDeviceIdsForUid(myUid, &deviceIds);
77     if (!status.isOk() || deviceIds.empty()) {
78         ALOGE("%s: Failed to call getDeviceIdsForUid to determine device id for uid %d: %s",
79               __func__, myUid, status.toString8().c_str());
80         return kDefaultDeviceId;
81     }
82 
83     // If the UID is associated with multiple virtual devices, use the default device's
84     // camera as we cannot disambiguate here. This effectively means that the app has
85     // activities on different devices at the same time.
86     if (deviceIds.size() != 1) {
87         return kDefaultDeviceId;
88     }
89     return deviceIds[0];
90 }
91 
92 // Returns device policy for POLICY_TYPE_CAMERA corresponding to deviceId.
getDevicePolicyForDeviceId(const int deviceId)93 DevicePolicy getDevicePolicyForDeviceId(const int deviceId) {
94     if (!vd_flags::camera_device_awareness() || deviceId == kDefaultDeviceId) {
95         return DevicePolicy::DEVICE_POLICY_DEFAULT;
96     }
97 
98     auto vdm = getVirtualDeviceManager();
99     if (vdm == nullptr) {
100         return DevicePolicy::DEVICE_POLICY_DEFAULT;
101     }
102 
103     int policy = IVirtualDeviceManagerNative::DEVICE_POLICY_DEFAULT;
104     Status status = vdm->getDevicePolicy(deviceId, IVirtualDeviceManagerNative::POLICY_TYPE_CAMERA,
105                                          &policy);
106     if (!status.isOk()) {
107         ALOGE("%s: Failed to call getDevicePolicy to determine camera policy for device id %d: %s",
108               __func__, deviceId, status.toString8().c_str());
109         return DevicePolicy::DEVICE_POLICY_DEFAULT;
110     }
111     return static_cast<DevicePolicy>(policy);
112 }
113 
114 // Returns true if camera owned by device cameraDeviceId can be accessed within deviceContext.
isCameraAccessible(const DeviceContext deviceContext,const int cameraDeviceId)115 bool isCameraAccessible(const DeviceContext deviceContext, const int cameraDeviceId) {
116     if (!vd_flags::camera_device_awareness() ||
117         deviceContext.policy == DevicePolicy::DEVICE_POLICY_DEFAULT) {
118         return cameraDeviceId == kDefaultDeviceId;
119     }
120     return deviceContext.deviceId == cameraDeviceId;
121 }
122 
123 }  // namespace
124 
125 // Static member definitions
126 const char* CameraManagerGlobal::kCameraIdKey   = "CameraId";
127 const char* CameraManagerGlobal::kPhysicalCameraIdKey   = "PhysicalCameraId";
128 const char* CameraManagerGlobal::kCallbackFpKey = "CallbackFp";
129 const char* CameraManagerGlobal::kContextKey    = "CallbackContext";
130 const nsecs_t CameraManagerGlobal::kCallbackDrainTimeout = 5000000; // 5 ms
131 Mutex                CameraManagerGlobal::sLock;
132 wp<CameraManagerGlobal> CameraManagerGlobal::sInstance = nullptr;
133 
DeviceContext()134 DeviceContext::DeviceContext() {
135     deviceId = getCurrentDeviceId();
136     policy = getDevicePolicyForDeviceId(deviceId);
137 }
138 
getInstance()139 sp<CameraManagerGlobal> CameraManagerGlobal::getInstance() {
140     Mutex::Autolock _l(sLock);
141     sp<CameraManagerGlobal> instance = sInstance.promote();
142     if (instance == nullptr) {
143         instance = new CameraManagerGlobal();
144         sInstance = instance;
145     }
146     return instance;
147 }
148 
~CameraManagerGlobal()149 CameraManagerGlobal::~CameraManagerGlobal() {
150     // clear sInstance so next getInstance call knows to create a new one
151     Mutex::Autolock _sl(sLock);
152     sInstance = nullptr;
153     Mutex::Autolock _l(mLock);
154     if (mCameraService != nullptr) {
155         IInterface::asBinder(mCameraService)->unlinkToDeath(mDeathNotifier);
156         mCameraService->removeListener(mCameraServiceListener);
157     }
158     mDeathNotifier.clear();
159     if (mCbLooper != nullptr) {
160         mCbLooper->unregisterHandler(mHandler->id());
161         mCbLooper->stop();
162     }
163     mCbLooper.clear();
164     mHandler.clear();
165     mCameraServiceListener.clear();
166     mCameraService.clear();
167 }
168 
getCameraService()169 sp<hardware::ICameraService> CameraManagerGlobal::getCameraService() {
170     Mutex::Autolock _l(mLock);
171     return getCameraServiceLocked();
172 }
173 
getCameraServiceLocked()174 sp<hardware::ICameraService> CameraManagerGlobal::getCameraServiceLocked() {
175     if (mCameraService.get() != nullptr) {
176         return mCameraService;
177     }
178     if (CameraUtils::isCameraServiceDisabled()) {
179         return mCameraService;
180     }
181 
182     sp<IServiceManager> sm = defaultServiceManager();
183     sp<IBinder> binder;
184     binder = sm->checkService(String16(kCameraServiceName));
185     if (binder == nullptr) {
186         ALOGE("%s: Could not get CameraService instance.", __FUNCTION__);
187         return nullptr;
188     }
189     sp<hardware::ICameraService> cameraService = interface_cast<hardware::ICameraService>(binder);
190     if (mDeathNotifier == nullptr) {
191         mDeathNotifier = new DeathNotifier(this);
192         binder->linkToDeath(mDeathNotifier);
193     }
194 
195     // Setup looper thread to perform availability callbacks
196     if (mCbLooper == nullptr) {
197         mCbLooper = new ALooper;
198         mCbLooper->setName("C2N-mgr-looper");
199         status_t err = mCbLooper->start(
200                 /*runOnCallingThread*/false,
201                 /*canCallJava*/       true,
202                 PRIORITY_DEFAULT);
203         if (err != OK) {
204             ALOGE("%s: Unable to start camera service listener looper: %s (%d)",
205                     __FUNCTION__, strerror(-err), err);
206             mCbLooper.clear();
207             return nullptr;
208         }
209         if (mHandler == nullptr) {
210             mHandler = new CallbackHandler(this);
211         }
212         mCbLooper->registerHandler(mHandler);
213     }
214 
215     // register ICameraServiceListener
216     std::vector<hardware::CameraStatus> cameraStatuses{};
217     if (mCameraServiceListener == nullptr) {
218         mCameraServiceListener = new CameraServiceListener(this);
219         cameraService->addListener(mCameraServiceListener, &cameraStatuses);
220     }
221 
222     for (auto& c : cameraStatuses) {
223         onStatusChangedLocked(c.status, c.deviceId, c.cameraId);
224 
225         for (auto& unavailablePhysicalId : c.unavailablePhysicalIds) {
226             onStatusChangedLocked(hardware::ICameraServiceListener::STATUS_NOT_PRESENT,
227                                     c.deviceId, c.cameraId, unavailablePhysicalId);
228         }
229     }
230     // setup vendor tags
231     if (!setupVendorTags(cameraService)) {
232         ALOGE("%s: Vendor tag descriptor cache couldn't be set up", __FUNCTION__);
233         return nullptr;
234     }
235 
236     mCameraService = cameraService;
237     ALOGE_IF(mCameraService == nullptr, "no CameraService!?");
238     return mCameraService;
239 }
240 
setupVendorTags(sp<hardware::ICameraService> & cameraService)241 bool CameraManagerGlobal::setupVendorTags(sp<hardware::ICameraService> &cameraService) {
242     sp<VendorTagDescriptor> desc = new VendorTagDescriptor();
243     binder::Status ret = cameraService->getCameraVendorTagDescriptor(/*out*/desc.get());
244     if (!ret.isOk()) {
245         if (ret.serviceSpecificErrorCode() ==
246             hardware::ICameraService::ERROR_DEPRECATED_HAL) {
247             ALOGW("%s: Camera HAL too old; does not support vendor tags",
248                     __FUNCTION__);
249             VendorTagDescriptor::clearGlobalVendorTagDescriptor();
250         } else {
251             ALOGE("%s: Failed to get vendor tag descriptors: %s",
252                     __FUNCTION__, ret.toString8().c_str());
253         }
254         return false;
255     }
256 
257     if (0 < desc->getTagCount()) {
258         status_t err = VendorTagDescriptor::setAsGlobalVendorTagDescriptor(desc);
259         if (err != OK) {
260             ALOGE("%s: Failed to set vendor tag descriptors, received error %s (%d)",
261                     __FUNCTION__, strerror(-err), err);
262             return false;
263         }
264     } else {
265         sp<VendorTagDescriptorCache> cache =
266                 new VendorTagDescriptorCache();
267         binder::Status res =
268                 cameraService->getCameraVendorTagCache(
269                         /*out*/cache.get());
270         if (res.serviceSpecificErrorCode() ==
271                 hardware::ICameraService::ERROR_DISCONNECTED) {
272             // No camera module available, not an error on devices with no cameras
273             VendorTagDescriptorCache::clearGlobalVendorTagCache();
274         } else if (res.isOk()) {
275             status_t err =
276                     VendorTagDescriptorCache::setAsGlobalVendorTagCache(
277                             cache);
278             if (err != OK) {
279                 ALOGE("%s: Failed to set vendor tag cache,"
280                         "received error %s (%d)", __FUNCTION__,
281                         strerror(-err), err);
282                 return false;
283             }
284         } else {
285             VendorTagDescriptorCache::clearGlobalVendorTagCache();
286             ALOGE("%s: Failed to setup vendor tag cache: %s",
287                     __FUNCTION__, res.toString8().c_str());
288             return false;
289         }
290     }
291 
292     return true;
293 }
294 
binderDied(const wp<IBinder> &)295 void CameraManagerGlobal::DeathNotifier::binderDied(const wp<IBinder>&)
296 {
297     ALOGE("Camera service binderDied!");
298     sp<CameraManagerGlobal> cm = mCameraManager.promote();
299     if (cm != nullptr) {
300         AutoMutex lock(cm->mLock);
301         std::vector<DeviceStatusMapKey> keysToRemove;
302         keysToRemove.reserve(cm->mDeviceStatusMap.size());
303         for (auto& pair : cm->mDeviceStatusMap) {
304             keysToRemove.push_back(pair.first);
305         }
306 
307         for (const DeviceStatusMapKey& key : keysToRemove) {
308             cm->onStatusChangedLocked(CameraServiceListener::STATUS_NOT_PRESENT, key.deviceId,
309                                       key.cameraId);
310         }
311         cm->mCameraService.clear();
312         cm->mCameraServiceListener.clear();
313         cm->mDeathNotifier.clear();
314         // TODO: consider adding re-connect call here?
315     }
316 }
317 
registerExtendedAvailabilityCallback(const DeviceContext & deviceContext,const ACameraManager_ExtendedAvailabilityCallbacks * callback)318 void CameraManagerGlobal::registerExtendedAvailabilityCallback(
319         const DeviceContext& deviceContext,
320         const ACameraManager_ExtendedAvailabilityCallbacks* callback) {
321     return registerAvailCallback<ACameraManager_ExtendedAvailabilityCallbacks>(deviceContext,
322                                                                                callback);
323 }
324 
unregisterExtendedAvailabilityCallback(const DeviceContext & deviceContext,const ACameraManager_ExtendedAvailabilityCallbacks * callback)325 void CameraManagerGlobal::unregisterExtendedAvailabilityCallback(
326         const DeviceContext& deviceContext,
327         const ACameraManager_ExtendedAvailabilityCallbacks* callback) {
328     Mutex::Autolock _l(mLock);
329 
330     drainPendingCallbacksLocked();
331 
332     Callback cb(deviceContext, callback);
333     mCallbacks.erase(cb);
334 }
335 
registerAvailabilityCallback(const DeviceContext & deviceContext,const ACameraManager_AvailabilityCallbacks * callback)336 void CameraManagerGlobal::registerAvailabilityCallback(
337         const DeviceContext& deviceContext, const ACameraManager_AvailabilityCallbacks* callback) {
338     return registerAvailCallback<ACameraManager_AvailabilityCallbacks>(deviceContext, callback);
339 }
340 
unregisterAvailabilityCallback(const DeviceContext & deviceContext,const ACameraManager_AvailabilityCallbacks * callback)341 void CameraManagerGlobal::unregisterAvailabilityCallback(
342         const DeviceContext& deviceContext, const ACameraManager_AvailabilityCallbacks* callback) {
343     Mutex::Autolock _l(mLock);
344 
345     drainPendingCallbacksLocked();
346 
347     Callback cb(deviceContext, callback);
348     mCallbacks.erase(cb);
349 }
350 
onCallbackCalled()351 void CameraManagerGlobal::onCallbackCalled() {
352     Mutex::Autolock _l(mLock);
353     if (mPendingCallbackCnt > 0) {
354         mPendingCallbackCnt--;
355     }
356     mCallbacksCond.signal();
357 }
358 
drainPendingCallbacksLocked()359 void CameraManagerGlobal::drainPendingCallbacksLocked() {
360     while (mPendingCallbackCnt > 0) {
361         auto res = mCallbacksCond.waitRelative(mLock, kCallbackDrainTimeout);
362         if (res != NO_ERROR) {
363             ALOGE("%s: Error waiting to drain callbacks: %s(%d)",
364                     __FUNCTION__, strerror(-res), res);
365             break;
366         }
367     }
368 }
369 
370 template <class T>
registerAvailCallback(const DeviceContext & deviceContext,const T * callback)371 void CameraManagerGlobal::registerAvailCallback(const DeviceContext& deviceContext,
372                                                 const T* callback) {
373     Mutex::Autolock _l(mLock);
374     getCameraServiceLocked();
375     Callback cb(deviceContext, callback);
376     const auto& [_, newlyRegistered] = mCallbacks.insert(cb);
377     // Send initial callbacks if callback is newly registered
378     if (newlyRegistered) {
379         for (auto& [key, statusAndHAL3Support] : mDeviceStatusMap) {
380             if (!isCameraAccessible(deviceContext, key.deviceId)) {
381                 continue;
382             }
383             const std::string& cameraId = key.cameraId;
384             int32_t status = statusAndHAL3Support.getStatus();
385             // Don't send initial callbacks for camera ids which don't support
386             // camera2
387             if (!statusAndHAL3Support.supportsHAL3) {
388                 continue;
389             }
390 
391             // Camera available/unavailable callback
392             sp<AMessage> msg = new AMessage(kWhatSendSingleCallback, mHandler);
393             ACameraManager_AvailabilityCallback cbFunc = isStatusAvailable(status) ?
394                     cb.mAvailable : cb.mUnavailable;
395             msg->setPointer(kCallbackFpKey, (void *) cbFunc);
396             msg->setPointer(kContextKey, cb.mContext);
397             msg->setString(kCameraIdKey, AString(cameraId.c_str()));
398             mPendingCallbackCnt++;
399             msg->post();
400 
401             // Physical camera unavailable callback
402             std::set<std::string> unavailablePhysicalCameras =
403                     statusAndHAL3Support.getUnavailablePhysicalIds();
404             for (const auto& physicalCameraId : unavailablePhysicalCameras) {
405                 sp<AMessage> msg = new AMessage(kWhatSendSinglePhysicalCameraCallback, mHandler);
406                 ACameraManager_PhysicalCameraAvailabilityCallback cbFunc =
407                         cb.mPhysicalCamUnavailable;
408                 msg->setPointer(kCallbackFpKey, (void *) cbFunc);
409                 msg->setPointer(kContextKey, cb.mContext);
410                 msg->setString(kCameraIdKey, AString(cameraId.c_str()));
411                 msg->setString(kPhysicalCameraIdKey, AString(physicalCameraId.c_str()));
412                 mPendingCallbackCnt++;
413                 msg->post();
414             }
415         }
416     }
417 }
418 
supportsCamera2ApiLocked(const std::string & cameraId)419 bool CameraManagerGlobal::supportsCamera2ApiLocked(const std::string &cameraId) {
420     bool camera2Support = false;
421     auto cs = getCameraServiceLocked();
422     if (cs == nullptr) {
423         return false;
424     }
425     binder::Status serviceRet =
426         cs->supportsCameraApi(cameraId,
427                 hardware::ICameraService::API_VERSION_2, &camera2Support);
428     if (!serviceRet.isOk()) {
429         ALOGE("%s: supportsCameraApi2Locked() call failed for cameraId  %s",
430                 __FUNCTION__, cameraId.c_str());
431         return false;
432     }
433     return camera2Support;
434 }
435 
getCameraIdList(const DeviceContext & context,std::vector<std::string> * cameraIds)436 void CameraManagerGlobal::getCameraIdList(const DeviceContext& context,
437         std::vector<std::string>* cameraIds) {
438     // Ensure that we have initialized/refreshed the list of available devices
439     Mutex::Autolock _l(mLock);
440     // Needed to make sure we're connected to cameraservice
441     getCameraServiceLocked();
442     for (auto& [key, statusAndHAL3Support] : mDeviceStatusMap) {
443         if (!isCameraAccessible(context, key.deviceId)) {
444             continue;
445         }
446 
447         int32_t status = statusAndHAL3Support.getStatus();
448         if (status == hardware::ICameraServiceListener::STATUS_NOT_PRESENT ||
449                 status == hardware::ICameraServiceListener::STATUS_ENUMERATING) {
450             continue;
451         }
452         if (!statusAndHAL3Support.supportsHAL3) {
453             continue;
454         }
455         cameraIds->push_back(key.cameraId);
456     }
457 }
458 
validStatus(int32_t status)459 bool CameraManagerGlobal::validStatus(int32_t status) {
460     switch (status) {
461         case hardware::ICameraServiceListener::STATUS_NOT_PRESENT:
462         case hardware::ICameraServiceListener::STATUS_PRESENT:
463         case hardware::ICameraServiceListener::STATUS_ENUMERATING:
464         case hardware::ICameraServiceListener::STATUS_NOT_AVAILABLE:
465             return true;
466         default:
467             return false;
468     }
469 }
470 
isStatusAvailable(int32_t status)471 bool CameraManagerGlobal::isStatusAvailable(int32_t status) {
472     switch (status) {
473         case hardware::ICameraServiceListener::STATUS_PRESENT:
474             return true;
475         default:
476             return false;
477     }
478 }
479 
onMessageReceived(const sp<AMessage> & msg)480 void CameraManagerGlobal::CallbackHandler::onMessageReceived(
481       const sp<AMessage> &msg) {
482     onMessageReceivedInternal(msg);
483     if (msg->what() == kWhatSendSingleCallback ||
484             msg->what() == kWhatSendSingleAccessCallback ||
485             msg->what() == kWhatSendSinglePhysicalCameraCallback) {
486         notifyParent();
487     }
488 }
489 
onMessageReceivedInternal(const sp<AMessage> & msg)490 void CameraManagerGlobal::CallbackHandler::onMessageReceivedInternal(
491         const sp<AMessage> &msg) {
492     switch (msg->what()) {
493         case kWhatSendSingleCallback:
494         {
495             ACameraManager_AvailabilityCallback cb;
496             void* context;
497             AString cameraId;
498             bool found = msg->findPointer(kCallbackFpKey, (void**) &cb);
499             if (!found) {
500                 ALOGE("%s: Cannot find camera callback fp!", __FUNCTION__);
501                 return;
502             }
503             found = msg->findPointer(kContextKey, &context);
504             if (!found) {
505                 ALOGE("%s: Cannot find callback context!", __FUNCTION__);
506                 return;
507             }
508             found = msg->findString(kCameraIdKey, &cameraId);
509             if (!found) {
510                 ALOGE("%s: Cannot find camera ID!", __FUNCTION__);
511                 return;
512             }
513             (*cb)(context, cameraId.c_str());
514             break;
515         }
516         case kWhatSendSingleAccessCallback:
517         {
518             ACameraManager_AccessPrioritiesChangedCallback cb;
519             void* context;
520             AString cameraId;
521             bool found = msg->findPointer(kCallbackFpKey, (void**) &cb);
522             if (!found) {
523                 ALOGE("%s: Cannot find camera callback fp!", __FUNCTION__);
524                 return;
525             }
526             found = msg->findPointer(kContextKey, &context);
527             if (!found) {
528                 ALOGE("%s: Cannot find callback context!", __FUNCTION__);
529                 return;
530             }
531             (*cb)(context);
532             break;
533         }
534         case kWhatSendSinglePhysicalCameraCallback:
535         {
536             ACameraManager_PhysicalCameraAvailabilityCallback cb;
537             void* context;
538             AString cameraId;
539             AString physicalCameraId;
540             bool found = msg->findPointer(kCallbackFpKey, (void**) &cb);
541             if (!found) {
542                 ALOGE("%s: Cannot find camera callback fp!", __FUNCTION__);
543                 return;
544             }
545             if (cb == nullptr) {
546                 // Physical camera callback is null
547                 return;
548             }
549             found = msg->findPointer(kContextKey, &context);
550             if (!found) {
551                 ALOGE("%s: Cannot find callback context!", __FUNCTION__);
552                 return;
553             }
554             found = msg->findString(kCameraIdKey, &cameraId);
555             if (!found) {
556                 ALOGE("%s: Cannot find camera ID!", __FUNCTION__);
557                 return;
558             }
559             found = msg->findString(kPhysicalCameraIdKey, &physicalCameraId);
560             if (!found) {
561                 ALOGE("%s: Cannot find physical camera ID!", __FUNCTION__);
562                 return;
563             }
564             (*cb)(context, cameraId.c_str(), physicalCameraId.c_str());
565             break;
566         }
567         default:
568             ALOGE("%s: unknown message type %d", __FUNCTION__, msg->what());
569             break;
570     }
571 }
572 
notifyParent()573 void CameraManagerGlobal::CallbackHandler::notifyParent() {
574     sp<CameraManagerGlobal> parent = mParent.promote();
575     if (parent != nullptr) {
576         parent->onCallbackCalled();
577     }
578 }
579 
onCameraAccessPrioritiesChanged()580 binder::Status CameraManagerGlobal::CameraServiceListener::onCameraAccessPrioritiesChanged() {
581     sp<CameraManagerGlobal> cm = mCameraManager.promote();
582     if (cm != nullptr) {
583         cm->onCameraAccessPrioritiesChanged();
584     } else {
585         ALOGE("Cannot deliver camera access priority callback. Global camera manager died");
586     }
587     return binder::Status::ok();
588 }
589 
onStatusChanged(int32_t status,const std::string & cameraId,int deviceId)590 binder::Status CameraManagerGlobal::CameraServiceListener::onStatusChanged(
591         int32_t status, const std::string& cameraId, int deviceId) {
592     sp<CameraManagerGlobal> cm = mCameraManager.promote();
593     if (cm != nullptr) {
594         cm->onStatusChanged(status, deviceId, cameraId);
595     }
596     ALOGE_IF(cm == nullptr,
597              "Cannot deliver physical camera status change. Global camera manager died");
598     return binder::Status::ok();
599 }
600 
onPhysicalCameraStatusChanged(int32_t status,const std::string & cameraId,const std::string & physicalCameraId,int deviceId)601 binder::Status CameraManagerGlobal::CameraServiceListener::onPhysicalCameraStatusChanged(
602         int32_t status, const std::string& cameraId, const std::string& physicalCameraId,
603         int deviceId) {
604     sp<CameraManagerGlobal> cm = mCameraManager.promote();
605     if (cm != nullptr) {
606         cm->onStatusChanged(status, deviceId, cameraId, physicalCameraId);
607     }
608     ALOGE_IF(cm == nullptr,
609              "Cannot deliver physical camera status change. Global camera manager died");
610     return binder::Status::ok();
611 }
612 
onCameraAccessPrioritiesChanged()613 void CameraManagerGlobal::onCameraAccessPrioritiesChanged() {
614     Mutex::Autolock _l(mLock);
615     for (auto cb : mCallbacks) {
616         sp<AMessage> msg = new AMessage(kWhatSendSingleAccessCallback, mHandler);
617         ACameraManager_AccessPrioritiesChangedCallback cbFp = cb.mAccessPriorityChanged;
618         if (cbFp != nullptr) {
619             msg->setPointer(kCallbackFpKey, (void *) cbFp);
620             msg->setPointer(kContextKey, cb.mContext);
621             mPendingCallbackCnt++;
622             msg->post();
623         }
624     }
625 }
626 
onStatusChanged(int32_t status,const int deviceId,const std::string & cameraId)627 void CameraManagerGlobal::onStatusChanged(int32_t status, const int deviceId,
628         const std::string& cameraId) {
629     Mutex::Autolock _l(mLock);
630     onStatusChangedLocked(status, deviceId, cameraId);
631 }
632 
onStatusChangedLocked(int32_t status,const int deviceId,const std::string & cameraId)633 void CameraManagerGlobal::onStatusChangedLocked(int32_t status, const int deviceId,
634         const std::string& cameraId) {
635     if (!validStatus(status)) {
636         ALOGE("%s: Invalid status %d", __FUNCTION__, status);
637         return;
638     }
639 
640     DeviceStatusMapKey key{.deviceId = deviceId, .cameraId = cameraId};
641 
642     bool firstStatus = (mDeviceStatusMap.count(key) == 0);
643     int32_t oldStatus = firstStatus ? status :  // first status
644                                 mDeviceStatusMap[key].getStatus();
645 
646     if (!firstStatus &&
647             isStatusAvailable(status) == isStatusAvailable(oldStatus)) {
648         // No status update. No need to send callback
649         return;
650     }
651 
652     bool supportsHAL3 = supportsCamera2ApiLocked(cameraId);
653     if (firstStatus) {
654         mDeviceStatusMap.emplace(std::piecewise_construct, std::forward_as_tuple(key),
655                                  std::forward_as_tuple(status, supportsHAL3));
656     } else {
657         mDeviceStatusMap[key].updateStatus(status);
658     }
659     // Iterate through all registered callbacks
660     if (supportsHAL3) {
661         for (auto cb : mCallbacks) {
662             if (!isCameraAccessible(cb.mDeviceContext, deviceId)) {
663                 continue;
664             }
665             sp<AMessage> msg = new AMessage(kWhatSendSingleCallback, mHandler);
666             ACameraManager_AvailabilityCallback cbFp = isStatusAvailable(status) ?
667                     cb.mAvailable : cb.mUnavailable;
668             msg->setPointer(kCallbackFpKey, (void *) cbFp);
669             msg->setPointer(kContextKey, cb.mContext);
670             msg->setString(kCameraIdKey, AString(cameraId.c_str()));
671             mPendingCallbackCnt++;
672             msg->post();
673         }
674     }
675     if (status == hardware::ICameraServiceListener::STATUS_NOT_PRESENT) {
676         mDeviceStatusMap.erase(key);
677     }
678 }
679 
onStatusChanged(int32_t status,const int deviceId,const std::string & cameraId,const std::string & physicalCameraId)680 void CameraManagerGlobal::onStatusChanged(int32_t status, const int deviceId,
681         const std::string& cameraId, const std::string& physicalCameraId) {
682     Mutex::Autolock _l(mLock);
683     onStatusChangedLocked(status, deviceId, cameraId, physicalCameraId);
684 }
685 
onStatusChangedLocked(int32_t status,const int deviceId,const std::string & cameraId,const std::string & physicalCameraId)686 void CameraManagerGlobal::onStatusChangedLocked(int32_t status, const int deviceId,
687         const std::string& cameraId, const std::string& physicalCameraId) {
688     if (!validStatus(status)) {
689         ALOGE("%s: Invalid status %d", __FUNCTION__, status);
690         return;
691     }
692 
693     DeviceStatusMapKey key{.deviceId = deviceId, .cameraId = cameraId};
694     auto logicalStatus = mDeviceStatusMap.find(key);
695     if (logicalStatus == mDeviceStatusMap.end()) {
696         ALOGE("%s: Physical camera id %s status change on a non-present id %s",
697                 __FUNCTION__, physicalCameraId.c_str(), cameraId.c_str());
698         return;
699     }
700     int32_t logicalCamStatus = mDeviceStatusMap[key].getStatus();
701     if (logicalCamStatus != hardware::ICameraServiceListener::STATUS_PRESENT &&
702             logicalCamStatus != hardware::ICameraServiceListener::STATUS_NOT_AVAILABLE) {
703         ALOGE("%s: Physical camera id %s status %d change for an invalid logical camera state %d",
704                 __FUNCTION__, physicalCameraId.c_str(), status, logicalCamStatus);
705         return;
706     }
707 
708     bool supportsHAL3 = supportsCamera2ApiLocked(cameraId);
709 
710     bool updated = false;
711     if (status == hardware::ICameraServiceListener::STATUS_PRESENT) {
712         updated = mDeviceStatusMap[key].removeUnavailablePhysicalId(physicalCameraId);
713     } else {
714         updated = mDeviceStatusMap[key].addUnavailablePhysicalId(physicalCameraId);
715     }
716 
717     // Iterate through all registered callbacks
718     if (supportsHAL3 && updated) {
719         for (auto cb : mCallbacks) {
720             if (!isCameraAccessible(cb.mDeviceContext, deviceId)) {
721                 continue;
722             }
723             sp<AMessage> msg = new AMessage(kWhatSendSinglePhysicalCameraCallback, mHandler);
724             ACameraManager_PhysicalCameraAvailabilityCallback cbFp = isStatusAvailable(status) ?
725                     cb.mPhysicalCamAvailable : cb.mPhysicalCamUnavailable;
726             msg->setPointer(kCallbackFpKey, (void *) cbFp);
727             msg->setPointer(kContextKey, cb.mContext);
728             msg->setString(kCameraIdKey, AString(cameraId.c_str()));
729             msg->setString(kPhysicalCameraIdKey, AString(physicalCameraId.c_str()));
730             mPendingCallbackCnt++;
731             msg->post();
732         }
733     }
734 }
735 
getStatus()736 int32_t CameraManagerGlobal::StatusAndHAL3Support::getStatus() {
737     std::lock_guard<std::mutex> lock(mLock);
738     return status;
739 }
740 
updateStatus(int32_t newStatus)741 void CameraManagerGlobal::StatusAndHAL3Support::updateStatus(int32_t newStatus) {
742     std::lock_guard<std::mutex> lock(mLock);
743     status = newStatus;
744 }
745 
addUnavailablePhysicalId(const std::string & physicalCameraId)746 bool CameraManagerGlobal::StatusAndHAL3Support::addUnavailablePhysicalId(
747         const std::string& physicalCameraId) {
748     std::lock_guard<std::mutex> lock(mLock);
749     auto result = unavailablePhysicalIds.insert(physicalCameraId);
750     return result.second;
751 }
752 
removeUnavailablePhysicalId(const std::string & physicalCameraId)753 bool CameraManagerGlobal::StatusAndHAL3Support::removeUnavailablePhysicalId(
754         const std::string& physicalCameraId) {
755     std::lock_guard<std::mutex> lock(mLock);
756     auto count = unavailablePhysicalIds.erase(physicalCameraId);
757     return count > 0;
758 }
759 
getUnavailablePhysicalIds()760 std::set<std::string> CameraManagerGlobal::StatusAndHAL3Support::getUnavailablePhysicalIds() {
761     std::lock_guard<std::mutex> lock(mLock);
762     return unavailablePhysicalIds;
763 }
764 
765 } // namespace acam
766 } // namespace android
767 
768 /**
769  * ACameraManger Implementation
770  */
771 camera_status_t
getCameraIdList(ACameraIdList ** cameraIdList)772 ACameraManager::getCameraIdList(ACameraIdList** cameraIdList) {
773     Mutex::Autolock _l(mLock);
774 
775     std::vector<std::string> idList;
776     mGlobalManager->getCameraIdList(mDeviceContext, &idList);
777 
778     int numCameras = idList.size();
779     ACameraIdList *out = new ACameraIdList;
780     if (!out) {
781         ALOGE("Allocate memory for ACameraIdList failed!");
782         return ACAMERA_ERROR_NOT_ENOUGH_MEMORY;
783     }
784     out->numCameras = numCameras;
785     out->cameraIds = new const char*[numCameras];
786     if (!out->cameraIds) {
787         ALOGE("Allocate memory for ACameraIdList failed!");
788         deleteCameraIdList(out);
789         return ACAMERA_ERROR_NOT_ENOUGH_MEMORY;
790     }
791     for (int i = 0; i < numCameras; i++) {
792         const char* src = idList[i].c_str();
793         size_t dstSize = strlen(src) + 1;
794         char* dst = new char[dstSize];
795         if (!dst) {
796             ALOGE("Allocate memory for ACameraIdList failed!");
797             deleteCameraIdList(out);
798             return ACAMERA_ERROR_NOT_ENOUGH_MEMORY;
799         }
800         strlcpy(dst, src, dstSize);
801         out->cameraIds[i] = dst;
802     }
803     *cameraIdList = out;
804     return ACAMERA_OK;
805 }
806 
807 void
deleteCameraIdList(ACameraIdList * cameraIdList)808 ACameraManager::deleteCameraIdList(ACameraIdList* cameraIdList) {
809     if (cameraIdList != nullptr) {
810         if (cameraIdList->cameraIds != nullptr) {
811             for (int i = 0; i < cameraIdList->numCameras; i ++) {
812                 if (cameraIdList->cameraIds[i] != nullptr) {
813                     delete[] cameraIdList->cameraIds[i];
814                 }
815             }
816             delete[] cameraIdList->cameraIds;
817         }
818         delete cameraIdList;
819     }
820 }
821 
getCameraCharacteristics(const char * cameraIdStr,sp<ACameraMetadata> * characteristics)822 camera_status_t ACameraManager::getCameraCharacteristics(
823         const char* cameraIdStr, sp<ACameraMetadata>* characteristics) {
824     Mutex::Autolock _l(mLock);
825 
826     sp<hardware::ICameraService> cs = mGlobalManager->getCameraService();
827     if (cs == nullptr) {
828         ALOGE("%s: Cannot reach camera service!", __FUNCTION__);
829         return ACAMERA_ERROR_CAMERA_DISCONNECTED;
830     }
831 
832     CameraMetadata rawMetadata;
833     int targetSdkVersion = android_get_application_target_sdk_version();
834 
835     AttributionSourceState clientAttribution;
836     clientAttribution.uid = hardware::ICameraService::USE_CALLING_UID;
837     clientAttribution.pid = hardware::ICameraService::USE_CALLING_PID;
838     clientAttribution.deviceId = mDeviceContext.deviceId;
839 
840     binder::Status serviceRet = cs->getCameraCharacteristics(cameraIdStr,
841             targetSdkVersion, /*rotationOverride*/hardware::ICameraService::ROTATION_OVERRIDE_NONE,
842             clientAttribution, static_cast<int32_t>(mDeviceContext.policy),
843             &rawMetadata);
844     if (!serviceRet.isOk()) {
845         switch(serviceRet.serviceSpecificErrorCode()) {
846             case hardware::ICameraService::ERROR_DISCONNECTED:
847                 ALOGE("%s: Camera %s has been disconnected", __FUNCTION__, cameraIdStr);
848                 return ACAMERA_ERROR_CAMERA_DISCONNECTED;
849             case hardware::ICameraService::ERROR_ILLEGAL_ARGUMENT:
850                 ALOGE("%s: Camera ID %s does not exist!", __FUNCTION__, cameraIdStr);
851                 return ACAMERA_ERROR_INVALID_PARAMETER;
852             default:
853                 ALOGE("Get camera characteristics from camera service failed: %s",
854                         serviceRet.toString8().c_str());
855                 return ACAMERA_ERROR_UNKNOWN; // should not reach here
856         }
857     }
858 
859     *characteristics = new ACameraMetadata(
860             rawMetadata.release(), ACameraMetadata::ACM_CHARACTERISTICS);
861     return ACAMERA_OK;
862 }
863 
864 camera_status_t
isCameraDeviceSharingSupported(const char * cameraId,bool * isSharingSupported)865 ACameraManager::isCameraDeviceSharingSupported(
866         const char* cameraId,
867         /*out*/bool* isSharingSupported) {
868     if (!flags::camera_multi_client()) {
869         return ACAMERA_ERROR_UNSUPPORTED_OPERATION;
870     }
871     sp<ACameraMetadata> spChars;
872     camera_status_t ret = getCameraCharacteristics(cameraId, &spChars);
873     if (ret != ACAMERA_OK) {
874         ALOGE("%s: cannot get camera characteristics for camera %s. err %d",
875                 __FUNCTION__, cameraId, ret);
876         return ret;
877     }
878 
879     ACameraMetadata* chars = spChars.get();
880     ACameraMetadata_const_entry entry;
881     ret = ACameraMetadata_getConstEntry(chars, ANDROID_SHARED_SESSION_OUTPUT_CONFIGURATIONS,
882             &entry);
883     if (ret != ACAMERA_OK) {
884         return ret;
885     }
886     *isSharingSupported =  (entry.count > 0) ? true : false;
887     return ACAMERA_OK;
888 }
889 
890 camera_status_t
openCamera(const char * cameraId,bool sharedMode,ACameraDevice_StateCallbacks * callback,ACameraDevice ** outDevice,bool * primaryClient)891 ACameraManager::openCamera(
892         const char* cameraId, bool sharedMode,
893         ACameraDevice_StateCallbacks* callback,
894         /*out*/ACameraDevice** outDevice, /*out*/bool* primaryClient) {
895     sp<ACameraMetadata> chars;
896     camera_status_t ret = getCameraCharacteristics(cameraId, &chars);
897     Mutex::Autolock _l(mLock);
898     if (ret != ACAMERA_OK) {
899         ALOGE("%s: cannot get camera characteristics for camera %s. err %d",
900                 __FUNCTION__, cameraId, ret);
901         return ACAMERA_ERROR_INVALID_PARAMETER;
902     }
903 
904     ACameraDevice* device = new ACameraDevice(cameraId, callback, chars, sharedMode);
905 
906     sp<hardware::ICameraService> cs = mGlobalManager->getCameraService();
907     if (cs == nullptr) {
908         ALOGE("%s: Cannot reach camera service!", __FUNCTION__);
909         delete device;
910         return ACAMERA_ERROR_CAMERA_DISCONNECTED;
911     }
912 
913     sp<hardware::camera2::ICameraDeviceCallbacks> callbacks = device->getServiceCallback();
914     sp<hardware::camera2::ICameraDeviceUser> deviceRemote;
915     int targetSdkVersion = android_get_application_target_sdk_version();
916 
917     AttributionSourceState clientAttribution;
918     clientAttribution.uid = hardware::ICameraService::USE_CALLING_UID;
919     clientAttribution.pid = hardware::ICameraService::USE_CALLING_PID;
920     clientAttribution.deviceId = mDeviceContext.deviceId;
921     clientAttribution.packageName = "";
922     clientAttribution.attributionTag = std::nullopt;
923     clientAttribution.token = sp<BBinder>::make();
924 
925     // No way to get package name from native.
926     // Send a zero length package name and let camera service figure it out from UID
927     binder::Status serviceRet = cs->connectDevice(
928             callbacks, cameraId, /*oomScoreOffset*/0,
929             targetSdkVersion, /*rotationOverride*/hardware::ICameraService::ROTATION_OVERRIDE_NONE,
930             clientAttribution, static_cast<int32_t>(mDeviceContext.policy), sharedMode,
931             /*out*/&deviceRemote);
932 
933     if (!serviceRet.isOk()) {
934         ALOGE("%s: connect camera device failed: %s", __FUNCTION__, serviceRet.toString8().c_str());
935         // Convert serviceRet to camera_status_t
936         switch(serviceRet.serviceSpecificErrorCode()) {
937             case hardware::ICameraService::ERROR_DISCONNECTED:
938                 ret = ACAMERA_ERROR_CAMERA_DISCONNECTED;
939                 break;
940             case hardware::ICameraService::ERROR_CAMERA_IN_USE:
941                 ret = ACAMERA_ERROR_CAMERA_IN_USE;
942                 break;
943             case hardware::ICameraService::ERROR_MAX_CAMERAS_IN_USE:
944                 ret = ACAMERA_ERROR_MAX_CAMERA_IN_USE;
945                 break;
946             case hardware::ICameraService::ERROR_ILLEGAL_ARGUMENT:
947                 ret = ACAMERA_ERROR_INVALID_PARAMETER;
948                 break;
949             case hardware::ICameraService::ERROR_DEPRECATED_HAL:
950                 // Should not reach here since we filtered legacy HALs earlier
951                 ret = ACAMERA_ERROR_INVALID_PARAMETER;
952                 break;
953             case hardware::ICameraService::ERROR_DISABLED:
954                 ret = ACAMERA_ERROR_CAMERA_DISABLED;
955                 break;
956             case hardware::ICameraService::ERROR_PERMISSION_DENIED:
957                 ret = ACAMERA_ERROR_PERMISSION_DENIED;
958                 break;
959             case hardware::ICameraService::ERROR_INVALID_OPERATION:
960             default:
961                 ret = ACAMERA_ERROR_UNKNOWN;
962                 break;
963         }
964 
965         delete device;
966         return ret;
967     }
968     if (deviceRemote == nullptr) {
969         ALOGE("%s: connect camera device failed! remote device is null", __FUNCTION__);
970         delete device;
971         return ACAMERA_ERROR_CAMERA_DISCONNECTED;
972     }
973     device->setRemoteDevice(deviceRemote);
974     device->setDeviceMetadataQueues();
975     if (flags::camera_multi_client() && sharedMode) {
976         binder::Status remoteRet = deviceRemote->isPrimaryClient(primaryClient);
977         if (!remoteRet.isOk()) {
978             delete device;
979             return ACAMERA_ERROR_UNKNOWN;
980         }
981         device->setPrimaryClient(*primaryClient);
982     }
983     *outDevice = device;
984     return ACAMERA_OK;
985 }
986 
registerAvailabilityCallback(const ACameraManager_AvailabilityCallbacks * callback)987 void ACameraManager::registerAvailabilityCallback(
988         const ACameraManager_AvailabilityCallbacks* callback) {
989     mGlobalManager->registerAvailabilityCallback(mDeviceContext, callback);
990 }
991 
unregisterAvailabilityCallback(const ACameraManager_AvailabilityCallbacks * callback)992 void ACameraManager::unregisterAvailabilityCallback(
993         const ACameraManager_AvailabilityCallbacks* callback) {
994     mGlobalManager->unregisterAvailabilityCallback(mDeviceContext, callback);
995 }
996 
registerExtendedAvailabilityCallback(const ACameraManager_ExtendedAvailabilityCallbacks * callback)997 void ACameraManager::registerExtendedAvailabilityCallback(
998         const ACameraManager_ExtendedAvailabilityCallbacks* callback) {
999     mGlobalManager->registerExtendedAvailabilityCallback(mDeviceContext, callback);
1000 }
1001 
unregisterExtendedAvailabilityCallback(const ACameraManager_ExtendedAvailabilityCallbacks * callback)1002 void ACameraManager::unregisterExtendedAvailabilityCallback(
1003         const ACameraManager_ExtendedAvailabilityCallbacks* callback) {
1004     mGlobalManager->unregisterExtendedAvailabilityCallback(mDeviceContext, callback);
1005 }
1006