• 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 <memory>
21 #include "ACameraManager.h"
22 #include "ACameraMetadata.h"
23 #include "ACameraDevice.h"
24 #include <utils/Vector.h>
25 #include <cutils/properties.h>
26 #include <stdlib.h>
27 #include <camera/CameraUtils.h>
28 #include <camera/VendorTagDescriptor.h>
29 
30 using namespace android::acam;
31 
32 namespace android {
33 namespace acam {
34 // Static member definitions
35 const char* CameraManagerGlobal::kCameraIdKey   = "CameraId";
36 const char* CameraManagerGlobal::kPhysicalCameraIdKey   = "PhysicalCameraId";
37 const char* CameraManagerGlobal::kCallbackFpKey = "CallbackFp";
38 const char* CameraManagerGlobal::kContextKey    = "CallbackContext";
39 const nsecs_t CameraManagerGlobal::kCallbackDrainTimeout = 5000000; // 5 ms
40 Mutex                CameraManagerGlobal::sLock;
41 CameraManagerGlobal* CameraManagerGlobal::sInstance = nullptr;
42 
43 CameraManagerGlobal&
getInstance()44 CameraManagerGlobal::getInstance() {
45     Mutex::Autolock _l(sLock);
46     CameraManagerGlobal* instance = sInstance;
47     if (instance == nullptr) {
48         instance = new CameraManagerGlobal();
49         sInstance = instance;
50     }
51     return *instance;
52 }
53 
~CameraManagerGlobal()54 CameraManagerGlobal::~CameraManagerGlobal() {
55     // clear sInstance so next getInstance call knows to create a new one
56     Mutex::Autolock _sl(sLock);
57     sInstance = nullptr;
58     Mutex::Autolock _l(mLock);
59     if (mCameraService != nullptr) {
60         IInterface::asBinder(mCameraService)->unlinkToDeath(mDeathNotifier);
61         mCameraService->removeListener(mCameraServiceListener);
62     }
63     mDeathNotifier.clear();
64     if (mCbLooper != nullptr) {
65         mCbLooper->unregisterHandler(mHandler->id());
66         mCbLooper->stop();
67     }
68     mCbLooper.clear();
69     mHandler.clear();
70     mCameraServiceListener.clear();
71     mCameraService.clear();
72 }
73 
getCameraService()74 sp<hardware::ICameraService> CameraManagerGlobal::getCameraService() {
75     Mutex::Autolock _l(mLock);
76     return getCameraServiceLocked();
77 }
78 
getCameraServiceLocked()79 sp<hardware::ICameraService> CameraManagerGlobal::getCameraServiceLocked() {
80     if (mCameraService.get() == nullptr) {
81         if (CameraUtils::isCameraServiceDisabled()) {
82             return mCameraService;
83         }
84 
85         sp<IServiceManager> sm = defaultServiceManager();
86         sp<IBinder> binder;
87         do {
88             binder = sm->getService(String16(kCameraServiceName));
89             if (binder != nullptr) {
90                 break;
91             }
92             ALOGW("CameraService not published, waiting...");
93             usleep(kCameraServicePollDelay);
94         } while(true);
95         if (mDeathNotifier == nullptr) {
96             mDeathNotifier = new DeathNotifier(this);
97         }
98         binder->linkToDeath(mDeathNotifier);
99         mCameraService = interface_cast<hardware::ICameraService>(binder);
100 
101         // Setup looper thread to perfrom availiability callbacks
102         if (mCbLooper == nullptr) {
103             mCbLooper = new ALooper;
104             mCbLooper->setName("C2N-mgr-looper");
105             status_t err = mCbLooper->start(
106                     /*runOnCallingThread*/false,
107                     /*canCallJava*/       true,
108                     PRIORITY_DEFAULT);
109             if (err != OK) {
110                 ALOGE("%s: Unable to start camera service listener looper: %s (%d)",
111                         __FUNCTION__, strerror(-err), err);
112                 mCbLooper.clear();
113                 return nullptr;
114             }
115             if (mHandler == nullptr) {
116                 mHandler = new CallbackHandler(this);
117             }
118             mCbLooper->registerHandler(mHandler);
119         }
120 
121         // register ICameraServiceListener
122         if (mCameraServiceListener == nullptr) {
123             mCameraServiceListener = new CameraServiceListener(this);
124         }
125         std::vector<hardware::CameraStatus> cameraStatuses{};
126         mCameraService->addListener(mCameraServiceListener, &cameraStatuses);
127         for (auto& c : cameraStatuses) {
128             onStatusChangedLocked(c.status, c.cameraId);
129 
130             for (auto& unavailablePhysicalId : c.unavailablePhysicalIds) {
131                 onStatusChangedLocked(hardware::ICameraServiceListener::STATUS_NOT_PRESENT,
132                         c.cameraId, unavailablePhysicalId);
133             }
134         }
135 
136         // setup vendor tags
137         sp<VendorTagDescriptor> desc = new VendorTagDescriptor();
138         binder::Status ret = mCameraService->getCameraVendorTagDescriptor(/*out*/desc.get());
139 
140         if (ret.isOk()) {
141             if (0 < desc->getTagCount()) {
142                 status_t err = VendorTagDescriptor::setAsGlobalVendorTagDescriptor(desc);
143                 if (err != OK) {
144                     ALOGE("%s: Failed to set vendor tag descriptors, received error %s (%d)",
145                             __FUNCTION__, strerror(-err), err);
146                 }
147             } else {
148                 sp<VendorTagDescriptorCache> cache =
149                         new VendorTagDescriptorCache();
150                 binder::Status res =
151                         mCameraService->getCameraVendorTagCache(
152                                 /*out*/cache.get());
153                 if (res.serviceSpecificErrorCode() ==
154                         hardware::ICameraService::ERROR_DISCONNECTED) {
155                     // No camera module available, not an error on devices with no cameras
156                     VendorTagDescriptorCache::clearGlobalVendorTagCache();
157                 } else if (res.isOk()) {
158                     status_t err =
159                             VendorTagDescriptorCache::setAsGlobalVendorTagCache(
160                                     cache);
161                     if (err != OK) {
162                         ALOGE("%s: Failed to set vendor tag cache,"
163                                 "received error %s (%d)", __FUNCTION__,
164                                 strerror(-err), err);
165                     }
166                 } else {
167                     VendorTagDescriptorCache::clearGlobalVendorTagCache();
168                     ALOGE("%s: Failed to setup vendor tag cache: %s",
169                             __FUNCTION__, res.toString8().string());
170                 }
171             }
172         } else if (ret.serviceSpecificErrorCode() ==
173                 hardware::ICameraService::ERROR_DEPRECATED_HAL) {
174             ALOGW("%s: Camera HAL too old; does not support vendor tags",
175                     __FUNCTION__);
176             VendorTagDescriptor::clearGlobalVendorTagDescriptor();
177         } else {
178             ALOGE("%s: Failed to get vendor tag descriptors: %s",
179                     __FUNCTION__, ret.toString8().string());
180         }
181     }
182     ALOGE_IF(mCameraService == nullptr, "no CameraService!?");
183     return mCameraService;
184 }
185 
binderDied(const wp<IBinder> &)186 void CameraManagerGlobal::DeathNotifier::binderDied(const wp<IBinder>&)
187 {
188     ALOGE("Camera service binderDied!");
189     sp<CameraManagerGlobal> cm = mCameraManager.promote();
190     if (cm != nullptr) {
191         AutoMutex lock(cm->mLock);
192         for (auto& pair : cm->mDeviceStatusMap) {
193             const String8 &cameraId = pair.first;
194             cm->onStatusChangedLocked(
195                     CameraServiceListener::STATUS_NOT_PRESENT, cameraId);
196         }
197         cm->mCameraService.clear();
198         // TODO: consider adding re-connect call here?
199     }
200 }
201 
registerExtendedAvailabilityCallback(const ACameraManager_ExtendedAvailabilityCallbacks * callback)202 void CameraManagerGlobal::registerExtendedAvailabilityCallback(
203         const ACameraManager_ExtendedAvailabilityCallbacks *callback) {
204     return registerAvailCallback<ACameraManager_ExtendedAvailabilityCallbacks>(callback);
205 }
206 
unregisterExtendedAvailabilityCallback(const ACameraManager_ExtendedAvailabilityCallbacks * callback)207 void CameraManagerGlobal::unregisterExtendedAvailabilityCallback(
208         const ACameraManager_ExtendedAvailabilityCallbacks *callback) {
209     Mutex::Autolock _l(mLock);
210 
211     drainPendingCallbacksLocked();
212 
213     Callback cb(callback);
214     mCallbacks.erase(cb);
215 }
216 
registerAvailabilityCallback(const ACameraManager_AvailabilityCallbacks * callback)217 void CameraManagerGlobal::registerAvailabilityCallback(
218         const ACameraManager_AvailabilityCallbacks *callback) {
219     return registerAvailCallback<ACameraManager_AvailabilityCallbacks>(callback);
220 }
221 
unregisterAvailabilityCallback(const ACameraManager_AvailabilityCallbacks * callback)222 void CameraManagerGlobal::unregisterAvailabilityCallback(
223         const ACameraManager_AvailabilityCallbacks *callback) {
224     Mutex::Autolock _l(mLock);
225 
226     drainPendingCallbacksLocked();
227 
228     Callback cb(callback);
229     mCallbacks.erase(cb);
230 }
231 
onCallbackCalled()232 void CameraManagerGlobal::onCallbackCalled() {
233     Mutex::Autolock _l(mLock);
234     if (mPendingCallbackCnt > 0) {
235         mPendingCallbackCnt--;
236     }
237     mCallbacksCond.signal();
238 }
239 
drainPendingCallbacksLocked()240 void CameraManagerGlobal::drainPendingCallbacksLocked() {
241     while (mPendingCallbackCnt > 0) {
242         auto res = mCallbacksCond.waitRelative(mLock, kCallbackDrainTimeout);
243         if (res != NO_ERROR) {
244             ALOGE("%s: Error waiting to drain callbacks: %s(%d)",
245                     __FUNCTION__, strerror(-res), res);
246             break;
247         }
248     }
249 }
250 
251 template<class T>
registerAvailCallback(const T * callback)252 void CameraManagerGlobal::registerAvailCallback(const T *callback) {
253     Mutex::Autolock _l(mLock);
254     Callback cb(callback);
255     auto pair = mCallbacks.insert(cb);
256     // Send initial callbacks if callback is newly registered
257     if (pair.second) {
258         for (auto& pair : mDeviceStatusMap) {
259             const String8& cameraId = pair.first;
260             int32_t status = pair.second.getStatus();
261             // Don't send initial callbacks for camera ids which don't support
262             // camera2
263             if (!pair.second.supportsHAL3) {
264                 continue;
265             }
266 
267             // Camera available/unavailable callback
268             sp<AMessage> msg = new AMessage(kWhatSendSingleCallback, mHandler);
269             ACameraManager_AvailabilityCallback cbFunc = isStatusAvailable(status) ?
270                     cb.mAvailable : cb.mUnavailable;
271             msg->setPointer(kCallbackFpKey, (void *) cbFunc);
272             msg->setPointer(kContextKey, cb.mContext);
273             msg->setString(kCameraIdKey, AString(cameraId));
274             mPendingCallbackCnt++;
275             msg->post();
276 
277             // Physical camera unavailable callback
278             std::set<String8> unavailablePhysicalCameras =
279                     pair.second.getUnavailablePhysicalIds();
280             for (const auto& physicalCameraId : unavailablePhysicalCameras) {
281                 sp<AMessage> msg = new AMessage(kWhatSendSinglePhysicalCameraCallback, mHandler);
282                 ACameraManager_PhysicalCameraAvailabilityCallback cbFunc =
283                         cb.mPhysicalCamUnavailable;
284                 msg->setPointer(kCallbackFpKey, (void *) cbFunc);
285                 msg->setPointer(kContextKey, cb.mContext);
286                 msg->setString(kCameraIdKey, AString(cameraId));
287                 msg->setString(kPhysicalCameraIdKey, AString(physicalCameraId));
288                 mPendingCallbackCnt++;
289                 msg->post();
290             }
291         }
292     }
293 }
294 
supportsCamera2ApiLocked(const String8 & cameraId)295 bool CameraManagerGlobal::supportsCamera2ApiLocked(const String8 &cameraId) {
296     bool camera2Support = false;
297     auto cs = getCameraServiceLocked();
298     binder::Status serviceRet =
299         cs->supportsCameraApi(String16(cameraId),
300                 hardware::ICameraService::API_VERSION_2, &camera2Support);
301     if (!serviceRet.isOk()) {
302         ALOGE("%s: supportsCameraApi2Locked() call failed for cameraId  %s",
303                 __FUNCTION__, cameraId.c_str());
304         return false;
305     }
306     return camera2Support;
307 }
308 
getCameraIdList(std::vector<String8> * cameraIds)309 void CameraManagerGlobal::getCameraIdList(std::vector<String8>* cameraIds) {
310     // Ensure that we have initialized/refreshed the list of available devices
311     Mutex::Autolock _l(mLock);
312     // Needed to make sure we're connected to cameraservice
313     getCameraServiceLocked();
314     for(auto& deviceStatus : mDeviceStatusMap) {
315         int32_t status = deviceStatus.second.getStatus();
316         if (status == hardware::ICameraServiceListener::STATUS_NOT_PRESENT ||
317                 status == hardware::ICameraServiceListener::STATUS_ENUMERATING) {
318             continue;
319         }
320         if (!deviceStatus.second.supportsHAL3) {
321             continue;
322         }
323         cameraIds->push_back(deviceStatus.first);
324     }
325 }
326 
validStatus(int32_t status)327 bool CameraManagerGlobal::validStatus(int32_t status) {
328     switch (status) {
329         case hardware::ICameraServiceListener::STATUS_NOT_PRESENT:
330         case hardware::ICameraServiceListener::STATUS_PRESENT:
331         case hardware::ICameraServiceListener::STATUS_ENUMERATING:
332         case hardware::ICameraServiceListener::STATUS_NOT_AVAILABLE:
333             return true;
334         default:
335             return false;
336     }
337 }
338 
isStatusAvailable(int32_t status)339 bool CameraManagerGlobal::isStatusAvailable(int32_t status) {
340     switch (status) {
341         case hardware::ICameraServiceListener::STATUS_PRESENT:
342             return true;
343         default:
344             return false;
345     }
346 }
347 
onMessageReceived(const sp<AMessage> & msg)348 void CameraManagerGlobal::CallbackHandler::onMessageReceived(
349       const sp<AMessage> &msg) {
350     onMessageReceivedInternal(msg);
351     if (msg->what() == kWhatSendSingleCallback ||
352             msg->what() == kWhatSendSingleAccessCallback ||
353             msg->what() == kWhatSendSinglePhysicalCameraCallback) {
354         notifyParent();
355     }
356 }
357 
onMessageReceivedInternal(const sp<AMessage> & msg)358 void CameraManagerGlobal::CallbackHandler::onMessageReceivedInternal(
359         const sp<AMessage> &msg) {
360     switch (msg->what()) {
361         case kWhatSendSingleCallback:
362         {
363             ACameraManager_AvailabilityCallback cb;
364             void* context;
365             AString cameraId;
366             bool found = msg->findPointer(kCallbackFpKey, (void**) &cb);
367             if (!found) {
368                 ALOGE("%s: Cannot find camera callback fp!", __FUNCTION__);
369                 return;
370             }
371             found = msg->findPointer(kContextKey, &context);
372             if (!found) {
373                 ALOGE("%s: Cannot find callback context!", __FUNCTION__);
374                 return;
375             }
376             found = msg->findString(kCameraIdKey, &cameraId);
377             if (!found) {
378                 ALOGE("%s: Cannot find camera ID!", __FUNCTION__);
379                 return;
380             }
381             (*cb)(context, cameraId.c_str());
382             break;
383         }
384         case kWhatSendSingleAccessCallback:
385         {
386             ACameraManager_AccessPrioritiesChangedCallback cb;
387             void* context;
388             AString cameraId;
389             bool found = msg->findPointer(kCallbackFpKey, (void**) &cb);
390             if (!found) {
391                 ALOGE("%s: Cannot find camera callback fp!", __FUNCTION__);
392                 return;
393             }
394             found = msg->findPointer(kContextKey, &context);
395             if (!found) {
396                 ALOGE("%s: Cannot find callback context!", __FUNCTION__);
397                 return;
398             }
399             (*cb)(context);
400             break;
401         }
402         case kWhatSendSinglePhysicalCameraCallback:
403         {
404             ACameraManager_PhysicalCameraAvailabilityCallback cb;
405             void* context;
406             AString cameraId;
407             AString physicalCameraId;
408             bool found = msg->findPointer(kCallbackFpKey, (void**) &cb);
409             if (!found) {
410                 ALOGE("%s: Cannot find camera callback fp!", __FUNCTION__);
411                 return;
412             }
413             if (cb == nullptr) {
414                 // Physical camera callback is null
415                 return;
416             }
417             found = msg->findPointer(kContextKey, &context);
418             if (!found) {
419                 ALOGE("%s: Cannot find callback context!", __FUNCTION__);
420                 return;
421             }
422             found = msg->findString(kCameraIdKey, &cameraId);
423             if (!found) {
424                 ALOGE("%s: Cannot find camera ID!", __FUNCTION__);
425                 return;
426             }
427             found = msg->findString(kPhysicalCameraIdKey, &physicalCameraId);
428             if (!found) {
429                 ALOGE("%s: Cannot find physical camera ID!", __FUNCTION__);
430                 return;
431             }
432             (*cb)(context, cameraId.c_str(), physicalCameraId.c_str());
433             break;
434         }
435         default:
436             ALOGE("%s: unknown message type %d", __FUNCTION__, msg->what());
437             break;
438     }
439 }
440 
notifyParent()441 void CameraManagerGlobal::CallbackHandler::notifyParent() {
442     sp<CameraManagerGlobal> parent = mParent.promote();
443     if (parent != nullptr) {
444         parent->onCallbackCalled();
445     }
446 }
447 
onCameraAccessPrioritiesChanged()448 binder::Status CameraManagerGlobal::CameraServiceListener::onCameraAccessPrioritiesChanged() {
449     sp<CameraManagerGlobal> cm = mCameraManager.promote();
450     if (cm != nullptr) {
451         cm->onCameraAccessPrioritiesChanged();
452     } else {
453         ALOGE("Cannot deliver camera access priority callback. Global camera manager died");
454     }
455     return binder::Status::ok();
456 }
457 
onStatusChanged(int32_t status,const String16 & cameraId)458 binder::Status CameraManagerGlobal::CameraServiceListener::onStatusChanged(
459         int32_t status, const String16& cameraId) {
460     sp<CameraManagerGlobal> cm = mCameraManager.promote();
461     if (cm != nullptr) {
462         cm->onStatusChanged(status, String8(cameraId));
463     } else {
464         ALOGE("Cannot deliver status change. Global camera manager died");
465     }
466     return binder::Status::ok();
467 }
468 
onPhysicalCameraStatusChanged(int32_t status,const String16 & cameraId,const String16 & physicalCameraId)469 binder::Status CameraManagerGlobal::CameraServiceListener::onPhysicalCameraStatusChanged(
470         int32_t status, const String16& cameraId, const String16& physicalCameraId) {
471     sp<CameraManagerGlobal> cm = mCameraManager.promote();
472     if (cm != nullptr) {
473         cm->onStatusChanged(status, String8(cameraId), String8(physicalCameraId));
474     } else {
475         ALOGE("Cannot deliver physical camera status change. Global camera manager died");
476     }
477     return binder::Status::ok();
478 }
479 
onCameraAccessPrioritiesChanged()480 void CameraManagerGlobal::onCameraAccessPrioritiesChanged() {
481     Mutex::Autolock _l(mLock);
482     for (auto cb : mCallbacks) {
483         sp<AMessage> msg = new AMessage(kWhatSendSingleAccessCallback, mHandler);
484         ACameraManager_AccessPrioritiesChangedCallback cbFp = cb.mAccessPriorityChanged;
485         if (cbFp != nullptr) {
486             msg->setPointer(kCallbackFpKey, (void *) cbFp);
487             msg->setPointer(kContextKey, cb.mContext);
488             mPendingCallbackCnt++;
489             msg->post();
490         }
491     }
492 }
493 
onStatusChanged(int32_t status,const String8 & cameraId)494 void CameraManagerGlobal::onStatusChanged(
495         int32_t status, const String8& cameraId) {
496     Mutex::Autolock _l(mLock);
497     onStatusChangedLocked(status, cameraId);
498 }
499 
onStatusChangedLocked(int32_t status,const String8 & cameraId)500 void CameraManagerGlobal::onStatusChangedLocked(
501         int32_t status, const String8& cameraId) {
502     if (!validStatus(status)) {
503         ALOGE("%s: Invalid status %d", __FUNCTION__, status);
504         return;
505     }
506 
507     bool firstStatus = (mDeviceStatusMap.count(cameraId) == 0);
508     int32_t oldStatus = firstStatus ?
509             status : // first status
510             mDeviceStatusMap[cameraId].getStatus();
511 
512     if (!firstStatus &&
513             isStatusAvailable(status) == isStatusAvailable(oldStatus)) {
514         // No status update. No need to send callback
515         return;
516     }
517 
518     bool supportsHAL3 = supportsCamera2ApiLocked(cameraId);
519     if (firstStatus) {
520         mDeviceStatusMap.emplace(std::piecewise_construct,
521                 std::forward_as_tuple(cameraId),
522                 std::forward_as_tuple(status, supportsHAL3));
523     } else {
524         mDeviceStatusMap[cameraId].updateStatus(status);
525     }
526     // Iterate through all registered callbacks
527     if (supportsHAL3) {
528         for (auto cb : mCallbacks) {
529             sp<AMessage> msg = new AMessage(kWhatSendSingleCallback, mHandler);
530             ACameraManager_AvailabilityCallback cbFp = isStatusAvailable(status) ?
531                     cb.mAvailable : cb.mUnavailable;
532             msg->setPointer(kCallbackFpKey, (void *) cbFp);
533             msg->setPointer(kContextKey, cb.mContext);
534             msg->setString(kCameraIdKey, AString(cameraId));
535             mPendingCallbackCnt++;
536             msg->post();
537         }
538     }
539     if (status == hardware::ICameraServiceListener::STATUS_NOT_PRESENT) {
540         mDeviceStatusMap.erase(cameraId);
541     }
542 }
543 
onStatusChanged(int32_t status,const String8 & cameraId,const String8 & physicalCameraId)544 void CameraManagerGlobal::onStatusChanged(
545         int32_t status, const String8& cameraId, const String8& physicalCameraId) {
546     Mutex::Autolock _l(mLock);
547     onStatusChangedLocked(status, cameraId, physicalCameraId);
548 }
549 
onStatusChangedLocked(int32_t status,const String8 & cameraId,const String8 & physicalCameraId)550 void CameraManagerGlobal::onStatusChangedLocked(
551         int32_t status, const String8& cameraId, const String8& physicalCameraId) {
552     if (!validStatus(status)) {
553         ALOGE("%s: Invalid status %d", __FUNCTION__, status);
554         return;
555     }
556 
557     auto logicalStatus = mDeviceStatusMap.find(cameraId);
558     if (logicalStatus == mDeviceStatusMap.end()) {
559         ALOGE("%s: Physical camera id %s status change on a non-present id %s",
560                 __FUNCTION__, physicalCameraId.c_str(), cameraId.c_str());
561         return;
562     }
563     int32_t logicalCamStatus = mDeviceStatusMap[cameraId].getStatus();
564     if (logicalCamStatus != hardware::ICameraServiceListener::STATUS_PRESENT &&
565             logicalCamStatus != hardware::ICameraServiceListener::STATUS_NOT_AVAILABLE) {
566         ALOGE("%s: Physical camera id %s status %d change for an invalid logical camera state %d",
567                 __FUNCTION__, physicalCameraId.string(), status, logicalCamStatus);
568         return;
569     }
570 
571     bool supportsHAL3 = supportsCamera2ApiLocked(cameraId);
572 
573     bool updated = false;
574     if (status == hardware::ICameraServiceListener::STATUS_PRESENT) {
575         updated = mDeviceStatusMap[cameraId].removeUnavailablePhysicalId(physicalCameraId);
576     } else {
577         updated = mDeviceStatusMap[cameraId].addUnavailablePhysicalId(physicalCameraId);
578     }
579 
580     // Iterate through all registered callbacks
581     if (supportsHAL3 && updated) {
582         for (auto cb : mCallbacks) {
583             sp<AMessage> msg = new AMessage(kWhatSendSinglePhysicalCameraCallback, mHandler);
584             ACameraManager_PhysicalCameraAvailabilityCallback cbFp = isStatusAvailable(status) ?
585                     cb.mPhysicalCamAvailable : cb.mPhysicalCamUnavailable;
586             msg->setPointer(kCallbackFpKey, (void *) cbFp);
587             msg->setPointer(kContextKey, cb.mContext);
588             msg->setString(kCameraIdKey, AString(cameraId));
589             msg->setString(kPhysicalCameraIdKey, AString(physicalCameraId));
590             mPendingCallbackCnt++;
591             msg->post();
592         }
593     }
594 }
595 
getStatus()596 int32_t CameraManagerGlobal::StatusAndHAL3Support::getStatus() {
597     std::lock_guard<std::mutex> lock(mLock);
598     return status;
599 }
600 
updateStatus(int32_t newStatus)601 void CameraManagerGlobal::StatusAndHAL3Support::updateStatus(int32_t newStatus) {
602     std::lock_guard<std::mutex> lock(mLock);
603     status = newStatus;
604 }
605 
addUnavailablePhysicalId(const String8 & physicalCameraId)606 bool CameraManagerGlobal::StatusAndHAL3Support::addUnavailablePhysicalId(
607         const String8& physicalCameraId) {
608     std::lock_guard<std::mutex> lock(mLock);
609     auto result = unavailablePhysicalIds.insert(physicalCameraId);
610     return result.second;
611 }
612 
removeUnavailablePhysicalId(const String8 & physicalCameraId)613 bool CameraManagerGlobal::StatusAndHAL3Support::removeUnavailablePhysicalId(
614         const String8& physicalCameraId) {
615     std::lock_guard<std::mutex> lock(mLock);
616     auto count = unavailablePhysicalIds.erase(physicalCameraId);
617     return count > 0;
618 }
619 
getUnavailablePhysicalIds()620 std::set<String8> CameraManagerGlobal::StatusAndHAL3Support::getUnavailablePhysicalIds() {
621     std::lock_guard<std::mutex> lock(mLock);
622     return unavailablePhysicalIds;
623 }
624 
625 } // namespace acam
626 } // namespace android
627 
628 /**
629  * ACameraManger Implementation
630  */
631 camera_status_t
getCameraIdList(ACameraIdList ** cameraIdList)632 ACameraManager::getCameraIdList(ACameraIdList** cameraIdList) {
633     Mutex::Autolock _l(mLock);
634 
635     std::vector<String8> idList;
636     CameraManagerGlobal::getInstance().getCameraIdList(&idList);
637 
638     int numCameras = idList.size();
639     ACameraIdList *out = new ACameraIdList;
640     if (!out) {
641         ALOGE("Allocate memory for ACameraIdList failed!");
642         return ACAMERA_ERROR_NOT_ENOUGH_MEMORY;
643     }
644     out->numCameras = numCameras;
645     out->cameraIds = new const char*[numCameras];
646     if (!out->cameraIds) {
647         ALOGE("Allocate memory for ACameraIdList failed!");
648         deleteCameraIdList(out);
649         return ACAMERA_ERROR_NOT_ENOUGH_MEMORY;
650     }
651     for (int i = 0; i < numCameras; i++) {
652         const char* src = idList[i].string();
653         size_t dstSize = strlen(src) + 1;
654         char* dst = new char[dstSize];
655         if (!dst) {
656             ALOGE("Allocate memory for ACameraIdList failed!");
657             deleteCameraIdList(out);
658             return ACAMERA_ERROR_NOT_ENOUGH_MEMORY;
659         }
660         strlcpy(dst, src, dstSize);
661         out->cameraIds[i] = dst;
662     }
663     *cameraIdList = out;
664     return ACAMERA_OK;
665 }
666 
667 void
deleteCameraIdList(ACameraIdList * cameraIdList)668 ACameraManager::deleteCameraIdList(ACameraIdList* cameraIdList) {
669     if (cameraIdList != nullptr) {
670         if (cameraIdList->cameraIds != nullptr) {
671             for (int i = 0; i < cameraIdList->numCameras; i ++) {
672                 if (cameraIdList->cameraIds[i] != nullptr) {
673                     delete[] cameraIdList->cameraIds[i];
674                 }
675             }
676             delete[] cameraIdList->cameraIds;
677         }
678         delete cameraIdList;
679     }
680 }
681 
getCameraCharacteristics(const char * cameraIdStr,sp<ACameraMetadata> * characteristics)682 camera_status_t ACameraManager::getCameraCharacteristics(
683         const char* cameraIdStr, sp<ACameraMetadata>* characteristics) {
684     Mutex::Autolock _l(mLock);
685 
686     sp<hardware::ICameraService> cs = CameraManagerGlobal::getInstance().getCameraService();
687     if (cs == nullptr) {
688         ALOGE("%s: Cannot reach camera service!", __FUNCTION__);
689         return ACAMERA_ERROR_CAMERA_DISCONNECTED;
690     }
691     CameraMetadata rawMetadata;
692     int targetSdkVersion = android_get_application_target_sdk_version();
693     binder::Status serviceRet = cs->getCameraCharacteristics(String16(cameraIdStr),
694             targetSdkVersion, &rawMetadata);
695     if (!serviceRet.isOk()) {
696         switch(serviceRet.serviceSpecificErrorCode()) {
697             case hardware::ICameraService::ERROR_DISCONNECTED:
698                 ALOGE("%s: Camera %s has been disconnected", __FUNCTION__, cameraIdStr);
699                 return ACAMERA_ERROR_CAMERA_DISCONNECTED;
700             case hardware::ICameraService::ERROR_ILLEGAL_ARGUMENT:
701                 ALOGE("%s: Camera ID %s does not exist!", __FUNCTION__, cameraIdStr);
702                 return ACAMERA_ERROR_INVALID_PARAMETER;
703             default:
704                 ALOGE("Get camera characteristics from camera service failed: %s",
705                         serviceRet.toString8().string());
706                 return ACAMERA_ERROR_UNKNOWN; // should not reach here
707         }
708     }
709 
710     *characteristics = new ACameraMetadata(
711             rawMetadata.release(), ACameraMetadata::ACM_CHARACTERISTICS);
712     return ACAMERA_OK;
713 }
714 
715 camera_status_t
openCamera(const char * cameraId,ACameraDevice_StateCallbacks * callback,ACameraDevice ** outDevice)716 ACameraManager::openCamera(
717         const char* cameraId,
718         ACameraDevice_StateCallbacks* callback,
719         /*out*/ACameraDevice** outDevice) {
720     sp<ACameraMetadata> chars;
721     camera_status_t ret = getCameraCharacteristics(cameraId, &chars);
722     Mutex::Autolock _l(mLock);
723     if (ret != ACAMERA_OK) {
724         ALOGE("%s: cannot get camera characteristics for camera %s. err %d",
725                 __FUNCTION__, cameraId, ret);
726         return ACAMERA_ERROR_INVALID_PARAMETER;
727     }
728 
729     ACameraDevice* device = new ACameraDevice(cameraId, callback, chars);
730 
731     sp<hardware::ICameraService> cs = CameraManagerGlobal::getInstance().getCameraService();
732     if (cs == nullptr) {
733         ALOGE("%s: Cannot reach camera service!", __FUNCTION__);
734         delete device;
735         return ACAMERA_ERROR_CAMERA_DISCONNECTED;
736     }
737 
738     sp<hardware::camera2::ICameraDeviceCallbacks> callbacks = device->getServiceCallback();
739     sp<hardware::camera2::ICameraDeviceUser> deviceRemote;
740     int targetSdkVersion = android_get_application_target_sdk_version();
741     // No way to get package name from native.
742     // Send a zero length package name and let camera service figure it out from UID
743     binder::Status serviceRet = cs->connectDevice(
744             callbacks, String16(cameraId), String16(""), {},
745             hardware::ICameraService::USE_CALLING_UID, /*oomScoreOffset*/0,
746             targetSdkVersion, /*out*/&deviceRemote);
747 
748     if (!serviceRet.isOk()) {
749         ALOGE("%s: connect camera device failed: %s", __FUNCTION__, serviceRet.toString8().string());
750         // Convert serviceRet to camera_status_t
751         switch(serviceRet.serviceSpecificErrorCode()) {
752             case hardware::ICameraService::ERROR_DISCONNECTED:
753                 ret = ACAMERA_ERROR_CAMERA_DISCONNECTED;
754                 break;
755             case hardware::ICameraService::ERROR_CAMERA_IN_USE:
756                 ret = ACAMERA_ERROR_CAMERA_IN_USE;
757                 break;
758             case hardware::ICameraService::ERROR_MAX_CAMERAS_IN_USE:
759                 ret = ACAMERA_ERROR_MAX_CAMERA_IN_USE;
760                 break;
761             case hardware::ICameraService::ERROR_ILLEGAL_ARGUMENT:
762                 ret = ACAMERA_ERROR_INVALID_PARAMETER;
763                 break;
764             case hardware::ICameraService::ERROR_DEPRECATED_HAL:
765                 // Should not reach here since we filtered legacy HALs earlier
766                 ret = ACAMERA_ERROR_INVALID_PARAMETER;
767                 break;
768             case hardware::ICameraService::ERROR_DISABLED:
769                 ret = ACAMERA_ERROR_CAMERA_DISABLED;
770                 break;
771             case hardware::ICameraService::ERROR_PERMISSION_DENIED:
772                 ret = ACAMERA_ERROR_PERMISSION_DENIED;
773                 break;
774             case hardware::ICameraService::ERROR_INVALID_OPERATION:
775             default:
776                 ret = ACAMERA_ERROR_UNKNOWN;
777                 break;
778         }
779 
780         delete device;
781         return ret;
782     }
783     if (deviceRemote == nullptr) {
784         ALOGE("%s: connect camera device failed! remote device is null", __FUNCTION__);
785         delete device;
786         return ACAMERA_ERROR_CAMERA_DISCONNECTED;
787     }
788     device->setRemoteDevice(deviceRemote);
789     *outDevice = device;
790     return ACAMERA_OK;
791 }
792 
~ACameraManager()793 ACameraManager::~ACameraManager() {
794 
795 }
796