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

Commit 06fcfb07 authored by Shuzhen Wang's avatar Shuzhen Wang
Browse files

Camera: Play shutter sound in absence of CAMERA_MSG_SHUTTER

When shutter sound is ON, even if application calls takePicture
without CAMERA_MSG_SHUTTER, the camera service should still play
shutter sound.

Also remove the code using ro.camera.sound.forced since it's
not used any more.

Test: 3rd party app on device with enforced shutter sound
Bug: 111995040
Change-Id: I0d2e888b7f17eff5e5bff8d0f3ec3da7f7ad97b7
parent a0e772b2
Loading
Loading
Loading
Loading
+10 −15
Original line number Original line Diff line number Diff line
@@ -582,7 +582,7 @@ Status CameraService::filterGetInfoErrorCode(status_t err) {
Status CameraService::makeClient(const sp<CameraService>& cameraService,
Status CameraService::makeClient(const sp<CameraService>& cameraService,
        const sp<IInterface>& cameraCb, const String16& packageName, const String8& cameraId,
        const sp<IInterface>& cameraCb, const String16& packageName, const String8& cameraId,
        int api1CameraId, int facing, int clientPid, uid_t clientUid, int servicePid,
        int api1CameraId, int facing, int clientPid, uid_t clientUid, int servicePid,
        bool legacyMode, int halVersion, int deviceVersion, apiLevel effectiveApiLevel,
        int halVersion, int deviceVersion, apiLevel effectiveApiLevel,
        /*out*/sp<BasicClient>* client) {
        /*out*/sp<BasicClient>* client) {


    if (halVersion < 0 || halVersion == deviceVersion) {
    if (halVersion < 0 || halVersion == deviceVersion) {
@@ -594,7 +594,7 @@ Status CameraService::makeClient(const sp<CameraService>& cameraService,
                sp<ICameraClient> tmp = static_cast<ICameraClient*>(cameraCb.get());
                sp<ICameraClient> tmp = static_cast<ICameraClient*>(cameraCb.get());
                *client = new CameraClient(cameraService, tmp, packageName,
                *client = new CameraClient(cameraService, tmp, packageName,
                        api1CameraId, facing, clientPid, clientUid,
                        api1CameraId, facing, clientPid, clientUid,
                        getpid(), legacyMode);
                        getpid());
            } else { // Camera2 API route
            } else { // Camera2 API route
                ALOGW("Camera using old HAL version: %d", deviceVersion);
                ALOGW("Camera using old HAL version: %d", deviceVersion);
                return STATUS_ERROR_FMT(ERROR_DEPRECATED_HAL,
                return STATUS_ERROR_FMT(ERROR_DEPRECATED_HAL,
@@ -612,7 +612,7 @@ Status CameraService::makeClient(const sp<CameraService>& cameraService,
                *client = new Camera2Client(cameraService, tmp, packageName,
                *client = new Camera2Client(cameraService, tmp, packageName,
                        cameraId, api1CameraId,
                        cameraId, api1CameraId,
                        facing, clientPid, clientUid,
                        facing, clientPid, clientUid,
                        servicePid, legacyMode);
                        servicePid);
            } else { // Camera2 API route
            } else { // Camera2 API route
                sp<hardware::camera2::ICameraDeviceCallbacks> tmp =
                sp<hardware::camera2::ICameraDeviceCallbacks> tmp =
                        static_cast<hardware::camera2::ICameraDeviceCallbacks*>(cameraCb.get());
                        static_cast<hardware::camera2::ICameraDeviceCallbacks*>(cameraCb.get());
@@ -636,7 +636,7 @@ Status CameraService::makeClient(const sp<CameraService>& cameraService,
            sp<ICameraClient> tmp = static_cast<ICameraClient*>(cameraCb.get());
            sp<ICameraClient> tmp = static_cast<ICameraClient*>(cameraCb.get());
            *client = new CameraClient(cameraService, tmp, packageName,
            *client = new CameraClient(cameraService, tmp, packageName,
                    api1CameraId, facing, clientPid, clientUid,
                    api1CameraId, facing, clientPid, clientUid,
                    servicePid, legacyMode);
                    servicePid);
        } else {
        } else {
            // Other combinations (e.g. HAL3.x open as HAL2.x) are not supported yet.
            // Other combinations (e.g. HAL3.x open as HAL2.x) are not supported yet.
            ALOGE("Invalid camera HAL version %x: HAL %x device can only be"
            ALOGE("Invalid camera HAL version %x: HAL %x device can only be"
@@ -735,8 +735,7 @@ Status CameraService::initializeShimMetadata(int cameraId) {
            sp<ICameraClient>{nullptr}, id, cameraId,
            sp<ICameraClient>{nullptr}, id, cameraId,
            static_cast<int>(CAMERA_HAL_API_VERSION_UNSPECIFIED),
            static_cast<int>(CAMERA_HAL_API_VERSION_UNSPECIFIED),
            internalPackageName, uid, USE_CALLING_PID,
            internalPackageName, uid, USE_CALLING_PID,
            API_1, /*legacyMode*/ false, /*shimUpdateOnly*/ true,
            API_1, /*shimUpdateOnly*/ true, /*out*/ tmp)
            /*out*/ tmp)
            ).isOk()) {
            ).isOk()) {
        ALOGE("%s: Error initializing shim metadata: %s", __FUNCTION__, ret.toString8().string());
        ALOGE("%s: Error initializing shim metadata: %s", __FUNCTION__, ret.toString8().string());
    }
    }
@@ -1200,8 +1199,7 @@ Status CameraService::connect(
    sp<Client> client = nullptr;
    sp<Client> client = nullptr;
    ret = connectHelper<ICameraClient,Client>(cameraClient, id, api1CameraId,
    ret = connectHelper<ICameraClient,Client>(cameraClient, id, api1CameraId,
            CAMERA_HAL_API_VERSION_UNSPECIFIED, clientPackageName, clientUid, clientPid, API_1,
            CAMERA_HAL_API_VERSION_UNSPECIFIED, clientPackageName, clientUid, clientPid, API_1,
            /*legacyMode*/ false, /*shimUpdateOnly*/ false,
            /*shimUpdateOnly*/ false, /*out*/client);
            /*out*/client);


    if(!ret.isOk()) {
    if(!ret.isOk()) {
        logRejected(id, getCallingPid(), String8(clientPackageName),
        logRejected(id, getCallingPid(), String8(clientPackageName),
@@ -1227,8 +1225,7 @@ Status CameraService::connectLegacy(
    Status ret = Status::ok();
    Status ret = Status::ok();
    sp<Client> client = nullptr;
    sp<Client> client = nullptr;
    ret = connectHelper<ICameraClient,Client>(cameraClient, id, api1CameraId, halVersion,
    ret = connectHelper<ICameraClient,Client>(cameraClient, id, api1CameraId, halVersion,
            clientPackageName, clientUid, USE_CALLING_PID, API_1,
            clientPackageName, clientUid, USE_CALLING_PID, API_1, /*shimUpdateOnly*/ false,
            /*legacyMode*/ true, /*shimUpdateOnly*/ false,
            /*out*/client);
            /*out*/client);


    if(!ret.isOk()) {
    if(!ret.isOk()) {
@@ -1256,9 +1253,7 @@ Status CameraService::connectDevice(
    ret = connectHelper<hardware::camera2::ICameraDeviceCallbacks,CameraDeviceClient>(cameraCb, id,
    ret = connectHelper<hardware::camera2::ICameraDeviceCallbacks,CameraDeviceClient>(cameraCb, id,
            /*api1CameraId*/-1,
            /*api1CameraId*/-1,
            CAMERA_HAL_API_VERSION_UNSPECIFIED, clientPackageName,
            CAMERA_HAL_API_VERSION_UNSPECIFIED, clientPackageName,
            clientUid, USE_CALLING_PID, API_2,
            clientUid, USE_CALLING_PID, API_2, /*shimUpdateOnly*/ false, /*out*/client);
            /*legacyMode*/ false, /*shimUpdateOnly*/ false,
            /*out*/client);


    if(!ret.isOk()) {
    if(!ret.isOk()) {
        logRejected(id, getCallingPid(), String8(clientPackageName),
        logRejected(id, getCallingPid(), String8(clientPackageName),
@@ -1273,7 +1268,7 @@ Status CameraService::connectDevice(
template<class CALLBACK, class CLIENT>
template<class CALLBACK, class CLIENT>
Status CameraService::connectHelper(const sp<CALLBACK>& cameraCb, const String8& cameraId,
Status CameraService::connectHelper(const sp<CALLBACK>& cameraCb, const String8& cameraId,
        int api1CameraId, int halVersion, const String16& clientPackageName, int clientUid,
        int api1CameraId, int halVersion, const String16& clientPackageName, int clientUid,
        int clientPid, apiLevel effectiveApiLevel, bool legacyMode, bool shimUpdateOnly,
        int clientPid, apiLevel effectiveApiLevel, bool shimUpdateOnly,
        /*out*/sp<CLIENT>& device) {
        /*out*/sp<CLIENT>& device) {
    binder::Status ret = binder::Status::ok();
    binder::Status ret = binder::Status::ok();


@@ -1358,7 +1353,7 @@ Status CameraService::connectHelper(const sp<CALLBACK>& cameraCb, const String8&
        sp<BasicClient> tmp = nullptr;
        sp<BasicClient> tmp = nullptr;
        if(!(ret = makeClient(this, cameraCb, clientPackageName,
        if(!(ret = makeClient(this, cameraCb, clientPackageName,
                cameraId, api1CameraId, facing,
                cameraId, api1CameraId, facing,
                clientPid, clientUid, getpid(), legacyMode,
                clientPid, clientUid, getpid(),
                halVersion, deviceVersion, effectiveApiLevel,
                halVersion, deviceVersion, effectiveApiLevel,
                /*out*/&tmp)).isOk()) {
                /*out*/&tmp)).isOk()) {
            return ret;
            return ret;
+2 −3
Original line number Original line Diff line number Diff line
@@ -585,8 +585,7 @@ private:
    template<class CALLBACK, class CLIENT>
    template<class CALLBACK, class CLIENT>
    binder::Status connectHelper(const sp<CALLBACK>& cameraCb, const String8& cameraId,
    binder::Status connectHelper(const sp<CALLBACK>& cameraCb, const String8& cameraId,
            int api1CameraId, int halVersion, const String16& clientPackageName,
            int api1CameraId, int halVersion, const String16& clientPackageName,
            int clientUid, int clientPid,
            int clientUid, int clientPid, apiLevel effectiveApiLevel, bool shimUpdateOnly,
            apiLevel effectiveApiLevel, bool legacyMode, bool shimUpdateOnly,
            /*out*/sp<CLIENT>& device);
            /*out*/sp<CLIENT>& device);


    // Lock guarding camera service state
    // Lock guarding camera service state
@@ -844,7 +843,7 @@ private:
    static binder::Status makeClient(const sp<CameraService>& cameraService,
    static binder::Status makeClient(const sp<CameraService>& cameraService,
            const sp<IInterface>& cameraCb, const String16& packageName, const String8& cameraId,
            const sp<IInterface>& cameraCb, const String16& packageName, const String8& cameraId,
            int api1CameraId, int facing, int clientPid, uid_t clientUid, int servicePid,
            int api1CameraId, int facing, int clientPid, uid_t clientUid, int servicePid,
            bool legacyMode, int halVersion, int deviceVersion, apiLevel effectiveApiLevel,
            int halVersion, int deviceVersion, apiLevel effectiveApiLevel,
            /*out*/sp<BasicClient>* client);
            /*out*/sp<BasicClient>* client);


    status_t checkCameraAccess(const String16& opPackageName);
    status_t checkCameraAccess(const String16& opPackageName);
+3 −27
Original line number Original line Diff line number Diff line
@@ -54,8 +54,7 @@ Camera2Client::Camera2Client(const sp<CameraService>& cameraService,
        int cameraFacing,
        int cameraFacing,
        int clientPid,
        int clientPid,
        uid_t clientUid,
        uid_t clientUid,
        int servicePid,
        int servicePid):
        bool legacyMode):
        Camera2ClientBase(cameraService, cameraClient, clientPackageName,
        Camera2ClientBase(cameraService, cameraClient, clientPackageName,
                cameraDeviceId, api1CameraId, cameraFacing,
                cameraDeviceId, api1CameraId, cameraFacing,
                clientPid, clientUid, servicePid),
                clientPid, clientUid, servicePid),
@@ -65,8 +64,6 @@ Camera2Client::Camera2Client(const sp<CameraService>& cameraService,


    SharedParameters::Lock l(mParameters);
    SharedParameters::Lock l(mParameters);
    l.mParameters.state = Parameters::DISCONNECTED;
    l.mParameters.state = Parameters::DISCONNECTED;

    mLegacyMode = legacyMode;
}
}


status_t Camera2Client::initialize(sp<CameraProviderManager> manager, const String8& monitorTags) {
status_t Camera2Client::initialize(sp<CameraProviderManager> manager, const String8& monitorTags) {
@@ -1443,7 +1440,7 @@ status_t Camera2Client::cancelAutoFocus() {
    return OK;
    return OK;
}
}


status_t Camera2Client::takePicture(int msgType) {
status_t Camera2Client::takePicture(int /*msgType*/) {
    ATRACE_CALL();
    ATRACE_CALL();
    Mutex::Autolock icl(mBinderSerializationLock);
    Mutex::Autolock icl(mBinderSerializationLock);
    status_t res;
    status_t res;
@@ -1542,7 +1539,7 @@ status_t Camera2Client::takePicture(int msgType) {
    // Need HAL to have correct settings before (possibly) triggering precapture
    // Need HAL to have correct settings before (possibly) triggering precapture
    syncWithDevice();
    syncWithDevice();


    res = mCaptureSequencer->startCapture(msgType);
    res = mCaptureSequencer->startCapture();
    if (res != OK) {
    if (res != OK) {
        ALOGE("%s: Camera %d: Unable to start capture: %s (%d)",
        ALOGE("%s: Camera %d: Unable to start capture: %s (%d)",
                __FUNCTION__, mCameraId, strerror(-res), res);
                __FUNCTION__, mCameraId, strerror(-res), res);
@@ -1662,27 +1659,6 @@ status_t Camera2Client::commandEnableShutterSoundL(bool enable) {
        return OK;
        return OK;
    }
    }


    // the camera2 api legacy mode can unconditionally disable the shutter sound
    if (mLegacyMode) {
        ALOGV("%s: Disable shutter sound in legacy mode", __FUNCTION__);
        l.mParameters.playShutterSound = false;
        return OK;
    }

    // Disabling shutter sound may not be allowed. In that case only
    // allow the mediaserver process to disable the sound.
    char value[PROPERTY_VALUE_MAX];
    property_get("ro.camera.sound.forced", value, "0");
    if (strncmp(value, "0", 2) != 0) {
        // Disabling shutter sound is not allowed. Deny if the current
        // process is not mediaserver.
        if (getCallingPid() != getpid()) {
            ALOGE("Failed to disable shutter sound. Permission denied (pid %d)",
                    getCallingPid());
            return PERMISSION_DENIED;
        }
    }

    l.mParameters.playShutterSound = false;
    l.mParameters.playShutterSound = false;
    return OK;
    return OK;
}
}
+1 −2
Original line number Original line Diff line number Diff line
@@ -96,8 +96,7 @@ public:
            int cameraFacing,
            int cameraFacing,
            int clientPid,
            int clientPid,
            uid_t clientUid,
            uid_t clientUid,
            int servicePid,
            int servicePid);
            bool legacyMode);


    virtual ~Camera2Client();
    virtual ~Camera2Client();


+1 −22
Original line number Original line Diff line number Diff line
@@ -40,7 +40,7 @@ CameraClient::CameraClient(const sp<CameraService>& cameraService,
        const String16& clientPackageName,
        const String16& clientPackageName,
        int cameraId, int cameraFacing,
        int cameraId, int cameraFacing,
        int clientPid, int clientUid,
        int clientPid, int clientUid,
        int servicePid, bool legacyMode):
        int servicePid):
        Client(cameraService, cameraClient, clientPackageName,
        Client(cameraService, cameraClient, clientPackageName,
                String8::format("%d", cameraId), cameraId, cameraFacing, clientPid,
                String8::format("%d", cameraId), cameraId, cameraFacing, clientPid,
                clientUid, servicePid)
                clientUid, servicePid)
@@ -57,7 +57,6 @@ CameraClient::CameraClient(const sp<CameraService>& cameraService,
    // Callback is disabled by default
    // Callback is disabled by default
    mPreviewCallbackFlag = CAMERA_FRAME_CALLBACK_FLAG_NOOP;
    mPreviewCallbackFlag = CAMERA_FRAME_CALLBACK_FLAG_NOOP;
    mOrientation = getOrientation(0, mCameraFacing == CAMERA_FACING_FRONT);
    mOrientation = getOrientation(0, mCameraFacing == CAMERA_FACING_FRONT);
    mLegacyMode = legacyMode;
    mPlayShutterSound = true;
    mPlayShutterSound = true;
    LOG1("CameraClient::CameraClient X (pid %d, id %d)", callingPid, cameraId);
    LOG1("CameraClient::CameraClient X (pid %d, id %d)", callingPid, cameraId);
}
}
@@ -715,26 +714,6 @@ status_t CameraClient::enableShutterSound(bool enable) {
        return OK;
        return OK;
    }
    }


    // the camera2 api legacy mode can unconditionally disable the shutter sound
    if (mLegacyMode) {
        ALOGV("%s: Disable shutter sound in legacy mode", __FUNCTION__);
        mPlayShutterSound = false;
        return OK;
    }

    // Disabling shutter sound may not be allowed. In that case only
    // allow the mediaserver process to disable the sound.
    char value[PROPERTY_VALUE_MAX];
    property_get("ro.camera.sound.forced", value, "0");
    if (strcmp(value, "0") != 0) {
        // Disabling shutter sound is not allowed. Deny if the current
        // process is not mediaserver.
        if (getCallingPid() != getpid()) {
            ALOGE("Failed to disable shutter sound. Permission denied (pid %d)", getCallingPid());
            return PERMISSION_DENIED;
        }
    }

    mPlayShutterSound = false;
    mPlayShutterSound = false;
    return OK;
    return OK;
}
}
Loading