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

Commit 510546a9 authored by Emilian Peev's avatar Emilian Peev
Browse files

Camera: fix invalid torch flash status

If the camera is restricted by MDM, the Camera HAL is initialized and
then the connection is rejected by startCameraOps.
However, for some AP vendors, the Camera HAL will post a torch status
callback when the HAL is initialized but not when it is disconnected.

Under the above circumstances, FlashlightTile receives only
onTorchModeUnavailable callback and torch flash control is disabled
until the device is rebooted.

This patch addresses the issue by adjusting the order of startCameraOps.

Bug: 325562820
Test: Manual test with MDM policy applied

Change-Id: I47b59ac12fbd735fdfc1ba66cb34a77a7e2d4640
parent dbff6b4c
Loading
Loading
Loading
Loading
+6 −5
Original line number Diff line number Diff line
@@ -135,16 +135,17 @@ status_t Camera2ClientBase<TClientBase>::initializeImpl(TProviderPtr providerPtr
        return NO_INIT;
    }

    res = mDevice->initialize(providerPtr, monitorTags);
    // Verify ops permissions
    res = TClientBase::startCameraOps();
    if (res != OK) {
        ALOGE("%s: Camera %s: unable to initialize device: %s (%d)",
                __FUNCTION__, TClientBase::mCameraIdStr.c_str(), strerror(-res), res);
        TClientBase::finishCameraOps();
        return res;
    }

    // Verify ops permissions
    res = TClientBase::startCameraOps();
    res = mDevice->initialize(providerPtr, monitorTags);
    if (res != OK) {
        ALOGE("%s: Camera %s: unable to initialize device: %s (%d)",
                __FUNCTION__, TClientBase::mCameraIdStr.c_str(), strerror(-res), res);
        TClientBase::finishCameraOps();
        return res;
    }
+12 −1
Original line number Diff line number Diff line
@@ -202,6 +202,8 @@ status_t Camera3Device::initializeCommonLocked() {
        return res;
    }

    setCameraMuteLocked(mCameraMuteInitial);

    mPreparerThread = new PreparerThread();

    internalUpdateStatusLocked(STATUS_UNCONFIGURED);
@@ -5447,10 +5449,19 @@ status_t Camera3Device::setCameraMute(bool enabled) {
    ATRACE_CALL();
    Mutex::Autolock il(mInterfaceLock);
    Mutex::Autolock l(mLock);
    return setCameraMuteLocked(enabled);
}

    if (mRequestThread == nullptr || !mSupportCameraMute) {
status_t Camera3Device::setCameraMuteLocked(bool enabled) {
    if (mRequestThread == nullptr) {
        mCameraMuteInitial = enabled;
        return OK;
    }

    if (!mSupportCameraMute) {
        return INVALID_OPERATION;
    }

    int32_t muteMode =
            !enabled                      ? ANDROID_SENSOR_TEST_PATTERN_MODE_OFF :
            mSupportTestPatternSolidColor ? ANDROID_SENSOR_TEST_PATTERN_MODE_SOLID_COLOR :
+13 −0
Original line number Diff line number Diff line
@@ -300,6 +300,15 @@ class Camera3Device :
     */
    status_t setCameraMute(bool enabled);

    /**
     * Mute the camera.
     *
     * When muted, black image data is output on all output streams.
     * This method assumes the caller already acquired the 'mInterfaceLock'
     * and 'mLock' locks.
     */
    status_t setCameraMuteLocked(bool enabled);

    /**
     * Enables/disables camera service watchdog
     */
@@ -1481,6 +1490,10 @@ class Camera3Device :
    // Auto framing override value
    camera_metadata_enum_android_control_autoframing mAutoframingOverride;

    // Initial camera mute state stored before the request thread
    // is active.
    bool mCameraMuteInitial = false;

    // Settings override value
    int32_t mSettingsOverride; // -1 = use original, otherwise
                               // the settings override to use.