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

Commit e9c17a7e authored by Shuzhen Wang's avatar Shuzhen Wang Committed by Android (Google) Code Review
Browse files

Merge "Camera: Fix HAL call order for setCallback" into rvc-qpr-dev

parents 4208ea0d bdf75f9b
Loading
Loading
Loading
Loading
+19 −23
Original line number Original line Diff line number Diff line
@@ -1345,6 +1345,20 @@ status_t CameraProviderManager::ProviderInfo::initialize(
        }
        }
    }
    }


    // cameraDeviceStatusChange callbacks may be called (and causing new devices added)
    // before setCallback returns
    hardware::Return<Status> status = interface->setCallback(this);
    if (!status.isOk()) {
        ALOGE("%s: Transaction error setting up callbacks with camera provider '%s': %s",
                __FUNCTION__, mProviderName.c_str(), status.description().c_str());
        return DEAD_OBJECT;
    }
    if (status != Status::OK) {
        ALOGE("%s: Unable to register callbacks with camera provider '%s'",
                __FUNCTION__, mProviderName.c_str());
        return mapToStatusT(status);
    }

    hardware::Return<bool> linked = interface->linkToDeath(this, /*cookie*/ mId);
    hardware::Return<bool> linked = interface->linkToDeath(this, /*cookie*/ mId);
    if (!linked.isOk()) {
    if (!linked.isOk()) {
        ALOGE("%s: Transaction error in linking to camera provider '%s' death: %s",
        ALOGE("%s: Transaction error in linking to camera provider '%s' death: %s",
@@ -1373,7 +1387,6 @@ status_t CameraProviderManager::ProviderInfo::initialize(
        return res;
        return res;
    }
    }


    Status status;
    // Get initial list of camera devices, if any
    // Get initial list of camera devices, if any
    std::vector<std::string> devices;
    std::vector<std::string> devices;
    hardware::Return<void> ret = interface->getCameraIdList([&status, this, &devices](
    hardware::Return<void> ret = interface->getCameraIdList([&status, this, &devices](
@@ -1438,22 +1451,6 @@ status_t CameraProviderManager::ProviderInfo::initialize(
        }
        }
    }
    }


    // cameraDeviceStatusChange callbacks may be called (and causing new devices added)
    // before setCallback returns. setCallback must be called after addDevice so that
    // the physical camera status callback can look up available regular
    // cameras.
    hardware::Return<Status> st = interface->setCallback(this);
    if (!st.isOk()) {
        ALOGE("%s: Transaction error setting up callbacks with camera provider '%s': %s",
                __FUNCTION__, mProviderName.c_str(), st.description().c_str());
        return DEAD_OBJECT;
    }
    if (st != Status::OK) {
        ALOGE("%s: Unable to register callbacks with camera provider '%s'",
                __FUNCTION__, mProviderName.c_str());
        return mapToStatusT(st);
    }

    ALOGI("Camera provider %s ready with %zu camera devices",
    ALOGI("Camera provider %s ready with %zu camera devices",
            mProviderName.c_str(), mDevices.size());
            mProviderName.c_str(), mDevices.size());


@@ -1784,9 +1781,10 @@ hardware::Return<void> CameraProviderManager::ProviderInfo::physicalCameraDevice
        CameraDeviceStatus newStatus) {
        CameraDeviceStatus newStatus) {
    sp<StatusListener> listener;
    sp<StatusListener> listener;
    std::string id;
    std::string id;
    bool initialized = false;
    {
    {
        std::lock_guard<std::mutex> lock(mLock);
        std::lock_guard<std::mutex> lock(mLock);
        if (!mInitialized) return hardware::Void();

        bool known = false;
        bool known = false;
        for (auto& deviceInfo : mDevices) {
        for (auto& deviceInfo : mDevices) {
            if (deviceInfo->mName == cameraDeviceName) {
            if (deviceInfo->mName == cameraDeviceName) {
@@ -1803,10 +1801,9 @@ hardware::Return<void> CameraProviderManager::ProviderInfo::physicalCameraDevice
                            __FUNCTION__, id.c_str(), physicalCameraDeviceName.c_str());
                            __FUNCTION__, id.c_str(), physicalCameraDeviceName.c_str());
                    return hardware::Void();
                    return hardware::Void();
                }
                }
                ALOGI("Camera device %s physical device %s status is now %s, was %s",
                ALOGI("Camera device %s physical device %s status is now %s",
                        cameraDeviceName.c_str(), physicalCameraDeviceName.c_str(),
                        cameraDeviceName.c_str(), physicalCameraDeviceName.c_str(),
                        deviceStatusToString(newStatus), deviceStatusToString(
                        deviceStatusToString(newStatus));
                        deviceInfo->mPhysicalStatus[physicalCameraDeviceName]));
                known = true;
                known = true;
                break;
                break;
            }
            }
@@ -1819,13 +1816,12 @@ hardware::Return<void> CameraProviderManager::ProviderInfo::physicalCameraDevice
            return hardware::Void();
            return hardware::Void();
        }
        }
        listener = mManager->getStatusListener();
        listener = mManager->getStatusListener();
        initialized = mInitialized;
    }
    }
    // Call without lock held to allow reentrancy into provider manager
    // Call without lock held to allow reentrancy into provider manager
    // Don't send the callback if providerInfo hasn't been initialized.
    // Don't send the callback if providerInfo hasn't been initialized.
    // CameraService will initialize device status after provider is
    // CameraService will initialize device status after provider is
    // initialized
    // initialized
    if (listener != nullptr && initialized) {
    if (listener != nullptr) {
        String8 physicalId(physicalCameraDeviceName.c_str());
        String8 physicalId(physicalCameraDeviceName.c_str());
        listener->onDeviceStatusChanged(String8(id.c_str()),
        listener->onDeviceStatusChanged(String8(id.c_str()),
                physicalId, newStatus);
                physicalId, newStatus);
+0 −2
Original line number Original line Diff line number Diff line
@@ -444,8 +444,6 @@ private:
            const hardware::camera::common::V1_0::CameraResourceCost mResourceCost;
            const hardware::camera::common::V1_0::CameraResourceCost mResourceCost;


            hardware::camera::common::V1_0::CameraDeviceStatus mStatus;
            hardware::camera::common::V1_0::CameraDeviceStatus mStatus;
            std::map<std::string, hardware::camera::common::V1_0::CameraDeviceStatus>
                    mPhysicalStatus;


            wp<ProviderInfo> mParentProvider;
            wp<ProviderInfo> mParentProvider;