ACameraManager.cpp revision d56db1d2bee182d1851097a9c712712fc094d117
10dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh/*
20dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh * Copyright (C) 2015 The Android Open Source Project
30dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh *
40dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh * Licensed under the Apache License, Version 2.0 (the "License");
50dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh * you may not use this file except in compliance with the License.
60dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh * You may obtain a copy of the License at
70dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh *
80dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh *      http://www.apache.org/licenses/LICENSE-2.0
90dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh *
100dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh * Unless required by applicable law or agreed to in writing, software
110dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh * distributed under the License is distributed on an "AS IS" BASIS,
120dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh * See the License for the specific language governing permissions and
140dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh * limitations under the License.
150dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh */
160dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
170dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh//#define LOG_NDEBUG 0
180dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh#define LOG_TAG "ACameraManager"
190dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
200dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh#include <memory>
210dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh#include "ACameraManager.h"
220dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh#include "ACameraMetadata.h"
230dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh#include "ACameraDevice.h"
240dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh#include <utils/Vector.h>
250dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh#include <stdlib.h>
260dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh#include <camera/VendorTagDescriptor.h>
270dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
280dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehusing namespace android;
290dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
300dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh//constants shared between ACameraManager and CameraManagerGlobal
310dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehnamespace {
320dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    const int kMaxCameraIdLen = 32;
330dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh}
340dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
350dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehnamespace android {
360dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh// Static member definitions
370dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehconst char* CameraManagerGlobal::kCameraIdKey   = "CameraId";
380dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehconst char* CameraManagerGlobal::kCallbackFpKey = "CallbackFp";
390dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehconst char* CameraManagerGlobal::kContextKey    = "CallbackContext";
400dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia YehMutex                CameraManagerGlobal::sLock;
410dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia YehCameraManagerGlobal* CameraManagerGlobal::sInstance = nullptr;
420dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
430dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia YehCameraManagerGlobal&
440dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia YehCameraManagerGlobal::getInstance() {
450dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    Mutex::Autolock _l(sLock);
460dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    CameraManagerGlobal* instance = sInstance;
470dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    if (instance == nullptr) {
480dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        instance = new CameraManagerGlobal();
490dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        sInstance = instance;
500dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    }
510dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    return *instance;
520dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh}
530dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
540dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia YehCameraManagerGlobal::~CameraManagerGlobal() {
550dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    // clear sInstance so next getInstance call knows to create a new one
560dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    Mutex::Autolock _sl(sLock);
570dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    sInstance = nullptr;
580dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    Mutex::Autolock _l(mLock);
590dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    if (mCameraService != nullptr) {
600dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        IInterface::asBinder(mCameraService)->unlinkToDeath(mDeathNotifier);
61ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh        mCameraService->removeListener(mCameraServiceListener);
620dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    }
630dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    mDeathNotifier.clear();
640dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    if (mCbLooper != nullptr) {
650dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        mCbLooper->unregisterHandler(mHandler->id());
660dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        mCbLooper->stop();
670dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    }
680dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    mCbLooper.clear();
690dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    mHandler.clear();
700dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    mCameraServiceListener.clear();
710dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    mCameraService.clear();
720dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh}
730dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
74d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvalasp<hardware::ICameraService> CameraManagerGlobal::getCameraService() {
750dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    Mutex::Autolock _l(mLock);
760dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    if (mCameraService.get() == nullptr) {
770dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        sp<IServiceManager> sm = defaultServiceManager();
780dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        sp<IBinder> binder;
790dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        do {
800dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            binder = sm->getService(String16(kCameraServiceName));
810dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            if (binder != nullptr) {
820dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh                break;
830dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            }
840dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            ALOGW("CameraService not published, waiting...");
850dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            usleep(kCameraServicePollDelay);
860dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        } while(true);
870dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        if (mDeathNotifier == nullptr) {
880dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            mDeathNotifier = new DeathNotifier(this);
890dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        }
900dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        binder->linkToDeath(mDeathNotifier);
91d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        mCameraService = interface_cast<hardware::ICameraService>(binder);
920dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
930dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        // Setup looper thread to perfrom availiability callbacks
940dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        if (mCbLooper == nullptr) {
950dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            mCbLooper = new ALooper;
960dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            mCbLooper->setName("C2N-mgr-looper");
970dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            status_t ret = mCbLooper->start(
980dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh                    /*runOnCallingThread*/false,
990dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh                    /*canCallJava*/       true,
100ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh                    PRIORITY_DEFAULT);
1010dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            if (mHandler == nullptr) {
1020dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh                mHandler = new CallbackHandler();
1030dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            }
1040dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            mCbLooper->registerHandler(mHandler);
1050dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        }
1060dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
1070dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        // register ICameraServiceListener
1080dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        if (mCameraServiceListener == nullptr) {
1090dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            mCameraServiceListener = new CameraServiceListener(this);
1100dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        }
1110dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        mCameraService->addListener(mCameraServiceListener);
1120dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
1130dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        // setup vendor tags
114d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        sp<VendorTagDescriptor> desc = new VendorTagDescriptor();
115d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        binder::Status ret = mCameraService->getCameraVendorTagDescriptor(/*out*/desc.get());
1160dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
117d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        if (ret.isOk()) {
118d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala            status_t err = VendorTagDescriptor::setAsGlobalVendorTagDescriptor(desc);
119d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala            if (err != OK) {
1200dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh                ALOGE("%s: Failed to set vendor tag descriptors, received error %s (%d)",
121d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala                        __FUNCTION__, strerror(-err), err);
1220dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            }
123d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        } else if (ret.serviceSpecificErrorCode() ==
124d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala                hardware::ICameraService::ERROR_DEPRECATED_HAL) {
1250dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            ALOGW("%s: Camera HAL too old; does not support vendor tags",
1260dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh                    __FUNCTION__);
1270dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            VendorTagDescriptor::clearGlobalVendorTagDescriptor();
1280dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        } else {
129d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala            ALOGE("%s: Failed to get vendor tag descriptors: %s",
130d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala                    __FUNCTION__, ret.toString8().string());
1310dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        }
1320dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    }
1330dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    ALOGE_IF(mCameraService == nullptr, "no CameraService!?");
1340dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    return mCameraService;
1350dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh}
1360dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
1370dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehvoid CameraManagerGlobal::DeathNotifier::binderDied(const wp<IBinder>&)
1380dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh{
1390dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    ALOGE("Camera service binderDied!");
1400dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    sp<CameraManagerGlobal> cm = mCameraManager.promote();
1410dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    if (cm != nullptr) {
1420dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        AutoMutex lock(cm->mLock);
1430dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        for (auto pair : cm->mDeviceStatusMap) {
1440dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            int32_t cameraId = pair.first;
1450dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            cm->onStatusChangedLocked(
146d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala                    CameraServiceListener::STATUS_NOT_PRESENT, cameraId);
1470dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        }
1480dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        cm->mCameraService.clear();
1490dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        // TODO: consider adding re-connect call here?
1500dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    }
1510dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh}
1520dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
1530dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehvoid CameraManagerGlobal::registerAvailabilityCallback(
1540dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        const ACameraManager_AvailabilityCallbacks *callback) {
1550dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    Mutex::Autolock _l(mLock);
1560dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    Callback cb(callback);
1570dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    auto pair = mCallbacks.insert(cb);
1580dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    // Send initial callbacks if callback is newly registered
1590dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    if (pair.second) {
1600dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        for (auto pair : mDeviceStatusMap) {
1610dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            int32_t cameraId = pair.first;
162d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala            int32_t status = pair.second;
1630dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
1640dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            sp<AMessage> msg = new AMessage(kWhatSendSingleCallback, mHandler);
1650dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            ACameraManager_AvailabilityCallback cb = isStatusAvailable(status) ?
1660dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh                    callback->onCameraAvailable : callback->onCameraUnavailable;
1670dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            msg->setPointer(kCallbackFpKey, (void *) cb);
1680dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            msg->setPointer(kContextKey, callback->context);
1690dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            msg->setInt32(kCameraIdKey, cameraId);
1700dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            msg->post();
1710dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        }
1720dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    }
1730dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh}
1740dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
1750dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehvoid CameraManagerGlobal::unregisterAvailabilityCallback(
1760dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        const ACameraManager_AvailabilityCallbacks *callback) {
1770dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    Mutex::Autolock _l(mLock);
1780dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    Callback cb(callback);
1790dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    mCallbacks.erase(cb);
1800dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh}
1810dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
182d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvalabool CameraManagerGlobal::validStatus(int32_t status) {
1830dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    switch (status) {
184d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        case hardware::ICameraServiceListener::STATUS_NOT_PRESENT:
185d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        case hardware::ICameraServiceListener::STATUS_PRESENT:
186d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        case hardware::ICameraServiceListener::STATUS_ENUMERATING:
187d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        case hardware::ICameraServiceListener::STATUS_NOT_AVAILABLE:
1880dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            return true;
1890dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        default:
1900dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            return false;
1910dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    }
1920dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh}
1930dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
194d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvalabool CameraManagerGlobal::isStatusAvailable(int32_t status) {
1950dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    switch (status) {
196d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        case hardware::ICameraServiceListener::STATUS_PRESENT:
1970dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            return true;
1980dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        default:
1990dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            return false;
2000dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    }
2010dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh}
2020dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
2030dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehvoid CameraManagerGlobal::CallbackHandler::sendSingleCallback(
2040dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        int32_t cameraId, void* context,
2050dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        ACameraManager_AvailabilityCallback cb) const {
2060dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    char cameraIdStr[kMaxCameraIdLen];
2070dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    snprintf(cameraIdStr, sizeof(cameraIdStr), "%d", cameraId);
2080dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    (*cb)(context, cameraIdStr);
2090dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh}
2100dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
2110dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehvoid CameraManagerGlobal::CallbackHandler::onMessageReceived(
2120dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        const sp<AMessage> &msg) {
2130dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    switch (msg->what()) {
2140dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        case kWhatSendSingleCallback:
2150dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        {
2160dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            ACameraManager_AvailabilityCallback cb;
2170dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            void* context;
2180dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            int32_t cameraId;
2190dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            bool found = msg->findPointer(kCallbackFpKey, (void**) &cb);
2200dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            if (!found) {
2210dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh                ALOGE("%s: Cannot find camera callback fp!", __FUNCTION__);
2220dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh                return;
2230dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            }
2240dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            found = msg->findPointer(kContextKey, &context);
2250dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            if (!found) {
2260dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh                ALOGE("%s: Cannot find callback context!", __FUNCTION__);
2270dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh                return;
2280dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            }
2290dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            found = msg->findInt32(kCameraIdKey, &cameraId);
2300dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            if (!found) {
2310dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh                ALOGE("%s: Cannot find camera ID!", __FUNCTION__);
2320dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh                return;
2330dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            }
2340dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            sendSingleCallback(cameraId, context, cb);
2350dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            break;
2360dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        }
2370dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        default:
2380dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            ALOGE("%s: unknown message type %d", __FUNCTION__, msg->what());
2390dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            break;
2400dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    }
2410dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh}
2420dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
243d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvalabinder::Status CameraManagerGlobal::CameraServiceListener::onStatusChanged(
244d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        int32_t status, int32_t cameraId) {
2450dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    sp<CameraManagerGlobal> cm = mCameraManager.promote();
246d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    if (cm != nullptr) {
247d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        cm->onStatusChanged(status, cameraId);
248d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    } else {
249ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh        ALOGE("Cannot deliver status change. Global camera manager died");
2500dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    }
251d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    return binder::Status::ok();
2520dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh}
2530dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
2540dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehvoid CameraManagerGlobal::onStatusChanged(
255d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        int32_t status, int32_t cameraId) {
2560dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    Mutex::Autolock _l(mLock);
2570dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    onStatusChangedLocked(status, cameraId);
2580dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh}
2590dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
2600dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehvoid CameraManagerGlobal::onStatusChangedLocked(
261d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        int32_t status, int32_t cameraId) {
2620dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        if (!validStatus(status)) {
2630dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            ALOGE("%s: Invalid status %d", __FUNCTION__, status);
2640dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            return;
2650dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        }
2660dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
2670dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        bool firstStatus = (mDeviceStatusMap.count(cameraId) == 0);
268d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        int32_t oldStatus = firstStatus ?
2690dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh                status : // first status
2700dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh                mDeviceStatusMap[cameraId];
2710dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
2720dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        if (!firstStatus &&
2730dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh                isStatusAvailable(status) == isStatusAvailable(oldStatus)) {
2740dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            // No status update. No need to send callback
2750dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            return;
2760dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        }
2770dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
2780dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        // Iterate through all registered callbacks
2790dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        mDeviceStatusMap[cameraId] = status;
2800dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        for (auto cb : mCallbacks) {
2810dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            sp<AMessage> msg = new AMessage(kWhatSendSingleCallback, mHandler);
2820dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            ACameraManager_AvailabilityCallback cbFp = isStatusAvailable(status) ?
2830dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh                    cb.mAvailable : cb.mUnavailable;
2840dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            msg->setPointer(kCallbackFpKey, (void *) cbFp);
2850dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            msg->setPointer(kContextKey, cb.mContext);
2860dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            msg->setInt32(kCameraIdKey, cameraId);
2870dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            msg->post();
2880dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        }
2890dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh}
2900dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
2910dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh} // namespace android
2920dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
2930dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh/**
2940dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh * ACameraManger Implementation
2950dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh */
2960dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehcamera_status_t
2970dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia YehACameraManager::getOrCreateCameraIdListLocked(ACameraIdList** cameraIdList) {
2980dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    if (mCachedCameraIdList.numCameras == kCameraIdListNotInit) {
2990dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        int numCameras = 0;
3000dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        Vector<char *> cameraIds;
301d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        sp<hardware::ICameraService> cs = CameraManagerGlobal::getInstance().getCameraService();
3020dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        if (cs == nullptr) {
3030dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            ALOGE("%s: Cannot reach camera service!", __FUNCTION__);
3040dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            return ACAMERA_ERROR_CAMERA_DISCONNECTED;
3050dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        }
3060dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        // Get number of cameras
307d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        int numAllCameras = 0;
308d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        binder::Status serviceRet = cs->getNumberOfCameras(hardware::ICameraService::CAMERA_TYPE_ALL,
309d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala                &numAllCameras);
310d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        if (!serviceRet.isOk()) {
311d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala            ALOGE("%s: Error getting camera count: %s", __FUNCTION__,
312d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala                    serviceRet.toString8().string());
313d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala            numAllCameras = 0;
314d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        }
3150dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        // Filter API2 compatible cameras and push to cameraIds
3160dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        for (int i = 0; i < numAllCameras; i++) {
3170dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            // TODO: Only suppot HALs that supports API2 directly now
318d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala            bool camera2Support = false;
319d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala            serviceRet = cs->supportsCameraApi(i, hardware::ICameraService::API_VERSION_2,
320d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala                    &camera2Support);
3210dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            char buf[kMaxCameraIdLen];
322d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala            if (camera2Support) {
3230dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh                numCameras++;
3240dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh                mCameraIds.insert(i);
3250dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh                snprintf(buf, sizeof(buf), "%d", i);
3260dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh                size_t cameraIdSize = strlen(buf) + 1;
3270dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh                char *cameraId = new char[cameraIdSize];
3280dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh                if (!cameraId) {
3290dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh                    ALOGE("Allocate memory for ACameraIdList failed!");
3300dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh                    return ACAMERA_ERROR_NOT_ENOUGH_MEMORY;
3310dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh                }
3320dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh                strlcpy(cameraId, buf, cameraIdSize);
3330dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh                cameraIds.push(cameraId);
3340dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            }
3350dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        }
3360dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        mCachedCameraIdList.numCameras = numCameras;
3370dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        mCachedCameraIdList.cameraIds = new const char*[numCameras];
3380dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        if (!mCachedCameraIdList.cameraIds) {
3390dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            ALOGE("Allocate memory for ACameraIdList failed!");
3400dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            return ACAMERA_ERROR_NOT_ENOUGH_MEMORY;
3410dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        }
3420dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        for (int i = 0; i < numCameras; i++) {
3430dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            mCachedCameraIdList.cameraIds[i] = cameraIds[i];
3440dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        }
3450dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    }
3460dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    *cameraIdList = &mCachedCameraIdList;
3470dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    return ACAMERA_OK;
3480dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh}
3490dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
3500dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehcamera_status_t
3510dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia YehACameraManager::getCameraIdList(ACameraIdList** cameraIdList) {
3520dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    Mutex::Autolock _l(mLock);
3530dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    ACameraIdList* cachedList;
3540dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    camera_status_t ret = getOrCreateCameraIdListLocked(&cachedList);
3550dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    if (ret != ACAMERA_OK) {
3560dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        ALOGE("Get camera ID list failed! err: %d", ret);
3570dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        return ret;
3580dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    }
3590dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
3600dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    int numCameras = cachedList->numCameras;
3610dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    ACameraIdList *out = new ACameraIdList;
3620dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    if (!out) {
3630dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        ALOGE("Allocate memory for ACameraIdList failed!");
3640dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        return ACAMERA_ERROR_NOT_ENOUGH_MEMORY;
3650dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    }
3660dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    out->numCameras = numCameras;
3670dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    out->cameraIds = new const char*[numCameras];
3680dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    if (!out->cameraIds) {
3690dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        ALOGE("Allocate memory for ACameraIdList failed!");
3700dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        return ACAMERA_ERROR_NOT_ENOUGH_MEMORY;
3710dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    }
3720dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    for (int i = 0; i < numCameras; i++) {
3730dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        const char* src = cachedList->cameraIds[i];
3740dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        size_t dstSize = strlen(src) + 1;
3750dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        char* dst = new char[dstSize];
3760dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        if (!dst) {
3770dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            ALOGE("Allocate memory for ACameraIdList failed!");
3780dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            return ACAMERA_ERROR_NOT_ENOUGH_MEMORY;
3790dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        }
3800dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        strlcpy(dst, src, dstSize);
3810dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        out->cameraIds[i] = dst;
3820dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    }
3830dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    *cameraIdList = out;
3840dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    return ACAMERA_OK;
3850dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh}
3860dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
3870dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehvoid
3880dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia YehACameraManager::deleteCameraIdList(ACameraIdList* cameraIdList) {
3890dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    if (cameraIdList != nullptr) {
3900dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        if (cameraIdList->cameraIds != nullptr) {
3910dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            for (int i = 0; i < cameraIdList->numCameras; i ++) {
3920dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh                delete[] cameraIdList->cameraIds[i];
3930dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            }
3940dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            delete[] cameraIdList->cameraIds;
3950dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        }
3960dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        delete cameraIdList;
3970dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    }
3980dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh}
3990dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
4000dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehcamera_status_t ACameraManager::getCameraCharacteristics(
4010dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        const char *cameraIdStr, ACameraMetadata **characteristics) {
4020dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    Mutex::Autolock _l(mLock);
4030dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    ACameraIdList* cachedList;
4040dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    // Make sure mCameraIds is initialized
4050dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    camera_status_t ret = getOrCreateCameraIdListLocked(&cachedList);
4060dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    if (ret != ACAMERA_OK) {
4070dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        ALOGE("%s: Get camera ID list failed! err: %d", __FUNCTION__, ret);
4080dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        return ret;
4090dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    }
4100dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    int cameraId = atoi(cameraIdStr);
4110dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    if (mCameraIds.count(cameraId) == 0) {
4120dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        ALOGE("%s: Camera ID %s does not exist!", __FUNCTION__, cameraIdStr);
4130dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        return ACAMERA_ERROR_INVALID_PARAMETER;
4140dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    }
415d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    sp<hardware::ICameraService> cs = CameraManagerGlobal::getInstance().getCameraService();
4160dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    if (cs == nullptr) {
4170dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        ALOGE("%s: Cannot reach camera service!", __FUNCTION__);
4180dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        return ACAMERA_ERROR_CAMERA_DISCONNECTED;
4190dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    }
4200dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    CameraMetadata rawMetadata;
421d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    binder::Status serviceRet = cs->getCameraCharacteristics(cameraId, &rawMetadata);
422d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    if (!serviceRet.isOk()) {
423d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        ALOGE("Get camera characteristics from camera service failed: %s",
424d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala                serviceRet.toString8().string());
4250dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        return ACAMERA_ERROR_UNKNOWN; // should not reach here
4260dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    }
4270dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
4280dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    *characteristics = new ACameraMetadata(
4290dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            rawMetadata.release(), ACameraMetadata::ACM_CHARACTERISTICS);
4300dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    return ACAMERA_OK;
4310dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh}
4320dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
4330dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehcamera_status_t
4340dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia YehACameraManager::openCamera(
4350dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        const char* cameraId,
4360dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        ACameraDevice_StateCallbacks* callback,
4370dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        /*out*/ACameraDevice** outDevice) {
4380dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    ACameraMetadata* rawChars;
4390dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    camera_status_t ret = getCameraCharacteristics(cameraId, &rawChars);
4400dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    Mutex::Autolock _l(mLock);
4410dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    if (ret != ACAMERA_OK) {
4420dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        ALOGE("%s: cannot get camera characteristics for camera %s. err %d",
4430dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh                __FUNCTION__, cameraId, ret);
4440dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        return ACAMERA_ERROR_INVALID_PARAMETER;
4450dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    }
4460dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    std::unique_ptr<ACameraMetadata> chars(rawChars);
4470dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    rawChars = nullptr;
4480dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
4490dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    ACameraDevice* device = new ACameraDevice(cameraId, callback, std::move(chars));
4500dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
451d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    sp<hardware::ICameraService> cs = CameraManagerGlobal::getInstance().getCameraService();
4520dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    if (cs == nullptr) {
4530dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        ALOGE("%s: Cannot reach camera service!", __FUNCTION__);
4540dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        return ACAMERA_ERROR_CAMERA_DISCONNECTED;
4550dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    }
4560dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
4570dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    int id = atoi(cameraId);
458d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    sp<hardware::camera2::ICameraDeviceCallbacks> callbacks = device->getServiceCallback();
459d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    sp<hardware::camera2::ICameraDeviceUser> deviceRemote;
4600dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    // No way to get package name from native.
4610dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    // Send a zero length package name and let camera service figure it out from UID
462d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    binder::Status serviceRet = cs->connectDevice(
4630dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            callbacks, id, String16(""),
464d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala            hardware::ICameraService::USE_CALLING_UID, /*out*/&deviceRemote);
4650dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
466d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    if (!serviceRet.isOk()) {
467d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        ALOGE("%s: connect camera device failed: %s", __FUNCTION__, serviceRet.toString8().string());
4680dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        delete device;
4690dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        return ACAMERA_ERROR_CAMERA_DISCONNECTED;
4700dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    }
4710dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    if (deviceRemote == nullptr) {
4720dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        ALOGE("%s: connect camera device failed! remote device is null", __FUNCTION__);
4730dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        delete device;
4740dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        return ACAMERA_ERROR_CAMERA_DISCONNECTED;
4750dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    }
4760dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    device->setRemoteDevice(deviceRemote);
4770dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    *outDevice = device;
4780dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    return ACAMERA_OK;
4790dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh}
4800dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
4810dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia YehACameraManager::~ACameraManager() {
4820dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    Mutex::Autolock _l(mLock);
4830dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    if (mCachedCameraIdList.numCameras != kCameraIdListNotInit) {
4840dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        for (int i = 0; i < mCachedCameraIdList.numCameras; i++) {
4850dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            delete[] mCachedCameraIdList.cameraIds[i];
4860dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        }
4870dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        delete[] mCachedCameraIdList.cameraIds;
4880dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    }
4890dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh}
490