Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b3fc5d6b authored by Jayant Chowdhary's avatar Jayant Chowdhary Committed by android-build-merger
Browse files

Merge "camera2 ndk: Don't send onStatusChanged callbacks for devices which...

Merge "camera2 ndk: Don't send onStatusChanged callbacks for devices which don't support camera2." am: b2872d47
am: 837798c7

Change-Id: I24b095f89eb6fa96c3152a5478f480647de9f212
parents f1e48f34 837798c7
Loading
Loading
Loading
Loading
+43 −20
Original line number Diff line number Diff line
@@ -76,6 +76,10 @@ static bool isCameraServiceDisabled() {

sp<hardware::ICameraService> CameraManagerGlobal::getCameraService() {
    Mutex::Autolock _l(mLock);
    return getCameraServiceLocked();
}

sp<hardware::ICameraService> CameraManagerGlobal::getCameraServiceLocked() {
    if (mCameraService.get() == nullptr) {
        if (isCameraServiceDisabled()) {
            return mCameraService;
@@ -216,8 +220,12 @@ void CameraManagerGlobal::registerAvailabilityCallback(
    if (pair.second) {
        for (auto& pair : mDeviceStatusMap) {
            const String8& cameraId = pair.first;
            int32_t status = pair.second;

            int32_t status = pair.second.status;
            // Don't send initial callbacks for camera ids which don't support
            // camera2
            if (!pair.second.supportsHAL3) {
                continue;
            }
            sp<AMessage> msg = new AMessage(kWhatSendSingleCallback, mHandler);
            ACameraManager_AvailabilityCallback cb = isStatusAvailable(status) ?
                    callback->onCameraAvailable : callback->onCameraUnavailable;
@@ -236,20 +244,32 @@ void CameraManagerGlobal::unregisterAvailabilityCallback(
    mCallbacks.erase(cb);
}

bool CameraManagerGlobal::supportsCamera2ApiLocked(const String8 &cameraId) {
    bool camera2Support = false;
    auto cs = getCameraServiceLocked();
    binder::Status serviceRet =
        cs->supportsCameraApi(String16(cameraId),
                hardware::ICameraService::API_VERSION_2, &camera2Support);
    if (!serviceRet.isOk()) {
        ALOGE("%s: supportsCameraApi2Locked() call failed for cameraId  %s",
                __FUNCTION__, cameraId.c_str());
        return false;
    }
    return camera2Support;
}

void CameraManagerGlobal::getCameraIdList(std::vector<String8>* cameraIds) {
    // Ensure that we have initialized/refreshed the list of available devices
    auto cs = getCameraService();
    Mutex::Autolock _l(mLock);

    // Needed to make sure we're connected to cameraservice
    getCameraServiceLocked();
    for(auto& deviceStatus : mDeviceStatusMap) {
        if (deviceStatus.second == hardware::ICameraServiceListener::STATUS_NOT_PRESENT ||
                deviceStatus.second == hardware::ICameraServiceListener::STATUS_ENUMERATING) {
        if (deviceStatus.second.status == hardware::ICameraServiceListener::STATUS_NOT_PRESENT ||
                deviceStatus.second.status ==
                        hardware::ICameraServiceListener::STATUS_ENUMERATING) {
            continue;
        }
        bool camera2Support = false;
        binder::Status serviceRet = cs->supportsCameraApi(String16(deviceStatus.first),
                hardware::ICameraService::API_VERSION_2, &camera2Support);
        if (!serviceRet.isOk() || !camera2Support) {
        if (!deviceStatus.second.supportsHAL3) {
            continue;
        }
        cameraIds->push_back(deviceStatus.first);
@@ -377,7 +397,7 @@ void CameraManagerGlobal::onStatusChangedLocked(
    bool firstStatus = (mDeviceStatusMap.count(cameraId) == 0);
    int32_t oldStatus = firstStatus ?
            status : // first status
            mDeviceStatusMap[cameraId];
            mDeviceStatusMap[cameraId].status;

    if (!firstStatus &&
            isStatusAvailable(status) == isStatusAvailable(oldStatus)) {
@@ -385,8 +405,10 @@ void CameraManagerGlobal::onStatusChangedLocked(
        return;
    }

    bool supportsHAL3 = supportsCamera2ApiLocked(cameraId);
    // Iterate through all registered callbacks
    mDeviceStatusMap[cameraId] = status;
    mDeviceStatusMap[cameraId] = StatusAndHAL3Support(status, supportsHAL3);
    if (supportsHAL3) {
        for (auto cb : mCallbacks) {
            sp<AMessage> msg = new AMessage(kWhatSendSingleCallback, mHandler);
            ACameraManager_AvailabilityCallback cbFp = isStatusAvailable(status) ?
@@ -396,6 +418,7 @@ void CameraManagerGlobal::onStatusChangedLocked(
            msg->setString(kCameraIdKey, AString(cameraId));
            msg->post();
        }
    }
    if (status == hardware::ICameraServiceListener::STATUS_NOT_PRESENT) {
        mDeviceStatusMap.erase(cameraId);
    }
+14 −4
Original line number Diff line number Diff line
@@ -156,12 +156,14 @@ class CameraManagerGlobal final : public RefBase {
    sp<CallbackHandler> mHandler;
    sp<ALooper>         mCbLooper; // Looper thread where callbacks actually happen on

    sp<hardware::ICameraService> getCameraServiceLocked();
    void onCameraAccessPrioritiesChanged();
    void onStatusChanged(int32_t status, const String8& cameraId);
    void onStatusChangedLocked(int32_t status, const String8& cameraId);
    // Utils for status
    static bool validStatus(int32_t status);
    static bool isStatusAvailable(int32_t status);
    bool supportsCamera2ApiLocked(const String8 &cameraId);

    // The sort logic must match the logic in
    // libcameraservice/common/CameraProviderManager.cpp::getAPI1CompatibleCameraDeviceIds
@@ -184,8 +186,16 @@ class CameraManagerGlobal final : public RefBase {
        }
    };

    struct StatusAndHAL3Support {
        int32_t status = hardware::ICameraServiceListener::STATUS_NOT_PRESENT;
        bool supportsHAL3 = false;
        StatusAndHAL3Support(int32_t st, bool HAL3support):
                status(st), supportsHAL3(HAL3support) { };
        StatusAndHAL3Support() = default;
    };

    // Map camera_id -> status
    std::map<String8, int32_t, CameraIdComparator> mDeviceStatusMap;
    std::map<String8, StatusAndHAL3Support, CameraIdComparator> mDeviceStatusMap;

    // For the singleton instance
    static Mutex sLock;