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