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#ifndef _ACAMERA_MANAGER_H
180dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh#define _ACAMERA_MANAGER_H
190dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
207e8d4ba5887affda749978d787b898bf31fda729Colin Cross#include <camera/NdkCameraManager.h>
210dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
2203f5575dc5c1a4de41dd2f327e59c1938b2a25d1Yin-Chia Yeh#include <android-base/parseint.h>
23d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala#include <android/hardware/ICameraService.h>
24d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala#include <android/hardware/BnCameraServiceListener.h>
250dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh#include <camera/CameraMetadata.h>
260dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh#include <binder/IServiceManager.h>
270dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh#include <utils/StrongPointer.h>
280dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh#include <utils/Mutex.h>
290dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
300dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh#include <media/stagefright/foundation/ALooper.h>
310dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh#include <media/stagefright/foundation/AHandler.h>
320dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh#include <media/stagefright/foundation/AMessage.h>
330dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
340dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh#include <set>
350dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh#include <map>
360dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
370dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehnamespace android {
380dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
390dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh/**
400dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh * Per-process singleton instance of CameraManger. Shared by all ACameraManager
410dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh * instances. Created when first ACameraManager is created and destroyed when
420dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh * all ACameraManager instances are deleted.
430dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh *
44f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala * TODO: maybe CameraManagerGlobal is better suited in libcameraclient?
450dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh */
460dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehclass CameraManagerGlobal final : public RefBase {
470dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh  public:
480dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    static CameraManagerGlobal& getInstance();
49d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    sp<hardware::ICameraService> getCameraService();
500dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
510dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    void registerAvailabilityCallback(
520dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            const ACameraManager_AvailabilityCallbacks *callback);
530dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    void unregisterAvailabilityCallback(
540dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            const ACameraManager_AvailabilityCallbacks *callback);
550dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
56f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala    /**
57f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala     * Return camera IDs that support camera2
58f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala     */
59f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala    void getCameraIdList(std::vector<String8> *cameraIds);
60f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala
610dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh  private:
62d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    sp<hardware::ICameraService> mCameraService;
630dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    const int          kCameraServicePollDelay = 500000; // 0.5s
640dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    const char*        kCameraServiceName      = "media.camera";
650dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    Mutex              mLock;
660dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
670dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    class DeathNotifier : public IBinder::DeathRecipient {
680dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh      public:
69d19d994770a04f02c204affd29985c5aeaa58baaChih-Hung Hsieh        explicit DeathNotifier(CameraManagerGlobal* cm) : mCameraManager(cm) {}
700dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh      protected:
710dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        // IBinder::DeathRecipient implementation
720dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        virtual void binderDied(const wp<IBinder>& who);
730dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh      private:
740dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        const wp<CameraManagerGlobal> mCameraManager;
750dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    };
760dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    sp<DeathNotifier> mDeathNotifier;
770dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
78d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    class CameraServiceListener final : public hardware::BnCameraServiceListener {
790dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh      public:
80d19d994770a04f02c204affd29985c5aeaa58baaChih-Hung Hsieh        explicit CameraServiceListener(CameraManagerGlobal* cm) : mCameraManager(cm) {}
81f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala        virtual binder::Status onStatusChanged(int32_t status, const String16& cameraId);
820dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
830dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        // Torch API not implemented yet
84d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        virtual binder::Status onTorchStatusChanged(int32_t, const String16&) {
85d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala            return binder::Status::ok();
86d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        }
87d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala
880dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh      private:
890dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        const wp<CameraManagerGlobal> mCameraManager;
900dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    };
910dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    sp<CameraServiceListener> mCameraServiceListener;
920dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
930dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    // Wrapper of ACameraManager_AvailabilityCallbacks so we can store it in std::set
940dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    struct Callback {
95d19d994770a04f02c204affd29985c5aeaa58baaChih-Hung Hsieh        explicit Callback(const ACameraManager_AvailabilityCallbacks *callback) :
960dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            mAvailable(callback->onCameraAvailable),
970dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            mUnavailable(callback->onCameraUnavailable),
980dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            mContext(callback->context) {}
990dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
1000dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        bool operator == (const Callback& other) const {
1010dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            return (mAvailable == other.mAvailable &&
1020dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh                    mUnavailable == other.mUnavailable &&
1030dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh                    mContext == other.mContext);
1040dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        }
1050dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        bool operator != (const Callback& other) const {
1060dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            return !(*this == other);
1070dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        }
1080dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        bool operator < (const Callback& other) const {
1090dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            if (*this == other) return false;
1100dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            if (mContext != other.mContext) return mContext < other.mContext;
1110dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            if (mAvailable != other.mAvailable) return mAvailable < other.mAvailable;
1120dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            return mUnavailable < other.mUnavailable;
1130dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        }
1140dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        bool operator > (const Callback& other) const {
1150dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            return (*this != other && !(*this < other));
1160dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        }
1170dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        ACameraManager_AvailabilityCallback mAvailable;
1180dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        ACameraManager_AvailabilityCallback mUnavailable;
1190dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        void*                               mContext;
1200dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    };
1210dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    std::set<Callback> mCallbacks;
1220dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
1230dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    // definition of handler and message
1240dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    enum {
1250dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        kWhatSendSingleCallback
1260dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    };
1270dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    static const char* kCameraIdKey;
1280dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    static const char* kCallbackFpKey;
1290dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    static const char* kContextKey;
1300dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    class CallbackHandler : public AHandler {
1310dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh      public:
1320dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        CallbackHandler() {}
1330dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        void onMessageReceived(const sp<AMessage> &msg) override;
1340dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    };
1350dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    sp<CallbackHandler> mHandler;
1360dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    sp<ALooper>         mCbLooper; // Looper thread where callbacks actually happen on
1370dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
138f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala    void onStatusChanged(int32_t status, const String8& cameraId);
139f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala    void onStatusChangedLocked(int32_t status, const String8& cameraId);
1400dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    // Utils for status
141d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    static bool validStatus(int32_t status);
142d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    static bool isStatusAvailable(int32_t status);
1430dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
14403f5575dc5c1a4de41dd2f327e59c1938b2a25d1Yin-Chia Yeh    // The sort logic must match the logic in
14503f5575dc5c1a4de41dd2f327e59c1938b2a25d1Yin-Chia Yeh    // libcameraservice/common/CameraProviderManager.cpp::getAPI1CompatibleCameraDeviceIds
14603f5575dc5c1a4de41dd2f327e59c1938b2a25d1Yin-Chia Yeh    struct CameraIdComparator {
14703f5575dc5c1a4de41dd2f327e59c1938b2a25d1Yin-Chia Yeh        bool operator()(const String8& a, const String8& b) const {
14803f5575dc5c1a4de41dd2f327e59c1938b2a25d1Yin-Chia Yeh            uint32_t aUint = 0, bUint = 0;
14903f5575dc5c1a4de41dd2f327e59c1938b2a25d1Yin-Chia Yeh            bool aIsUint = base::ParseUint(a.c_str(), &aUint);
15003f5575dc5c1a4de41dd2f327e59c1938b2a25d1Yin-Chia Yeh            bool bIsUint = base::ParseUint(b.c_str(), &bUint);
15103f5575dc5c1a4de41dd2f327e59c1938b2a25d1Yin-Chia Yeh
15203f5575dc5c1a4de41dd2f327e59c1938b2a25d1Yin-Chia Yeh            // Uint device IDs first
15303f5575dc5c1a4de41dd2f327e59c1938b2a25d1Yin-Chia Yeh            if (aIsUint && bIsUint) {
15403f5575dc5c1a4de41dd2f327e59c1938b2a25d1Yin-Chia Yeh                return aUint < bUint;
15503f5575dc5c1a4de41dd2f327e59c1938b2a25d1Yin-Chia Yeh            } else if (aIsUint) {
15603f5575dc5c1a4de41dd2f327e59c1938b2a25d1Yin-Chia Yeh                return true;
15703f5575dc5c1a4de41dd2f327e59c1938b2a25d1Yin-Chia Yeh            } else if (bIsUint) {
15803f5575dc5c1a4de41dd2f327e59c1938b2a25d1Yin-Chia Yeh                return false;
15903f5575dc5c1a4de41dd2f327e59c1938b2a25d1Yin-Chia Yeh            }
16003f5575dc5c1a4de41dd2f327e59c1938b2a25d1Yin-Chia Yeh            // Simple string compare if both id are not uint
16103f5575dc5c1a4de41dd2f327e59c1938b2a25d1Yin-Chia Yeh            return a < b;
16203f5575dc5c1a4de41dd2f327e59c1938b2a25d1Yin-Chia Yeh        }
16303f5575dc5c1a4de41dd2f327e59c1938b2a25d1Yin-Chia Yeh    };
16403f5575dc5c1a4de41dd2f327e59c1938b2a25d1Yin-Chia Yeh
1650dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    // Map camera_id -> status
16603f5575dc5c1a4de41dd2f327e59c1938b2a25d1Yin-Chia Yeh    std::map<String8, int32_t, CameraIdComparator> mDeviceStatusMap;
1670dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
1680dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    // For the singleton instance
1690dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    static Mutex sLock;
1700dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    static CameraManagerGlobal* sInstance;
1710dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    CameraManagerGlobal() {};
1720dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    ~CameraManagerGlobal();
1730dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh};
1740dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
1750dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh} // namespace android;
1760dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
1770dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh/**
1780dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh * ACameraManager opaque struct definition
1790dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh * Leave outside of android namespace because it's NDK struct
1800dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh */
1810dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehstruct ACameraManager {
1820dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    ACameraManager() :
183d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala            mGlobalManager(&(android::CameraManagerGlobal::getInstance())) {}
1840dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    ~ACameraManager();
1850dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    camera_status_t getCameraIdList(ACameraIdList** cameraIdList);
1860dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    static void     deleteCameraIdList(ACameraIdList* cameraIdList);
1870dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
1880dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    camera_status_t getCameraCharacteristics(
1890dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            const char *cameraId, ACameraMetadata **characteristics);
1900dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    camera_status_t openCamera(const char* cameraId,
1910dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh                               ACameraDevice_StateCallbacks* callback,
1920dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh                               /*out*/ACameraDevice** device);
1930dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
1940dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh  private:
1950dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    enum {
1960dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        kCameraIdListNotInit = -1
1970dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    };
198d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    android::Mutex         mLock;
199d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    android::sp<android::CameraManagerGlobal> mGlobalManager;
2000dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh};
2010dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
2020dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh#endif //_ACAMERA_MANAGER_H
203