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

Commit c57a6c62 authored by Emilian Peev's avatar Emilian Peev Committed by Android (Google) Code Review
Browse files

Merge "Camera: Handle display configuration change events" into sc-dev

parents b6ee6bf8 8b64f285
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -173,6 +173,13 @@ interface ICameraService
    const int EVENT_USER_SWITCHED = 1; // The argument is the set of new foreground user IDs.
    oneway void notifySystemEvent(int eventId, in int[] args);

    /**
     * Notify the camera service of a display configuration change.
     *
     * Callers require the android.permission.CAMERA_SEND_SYSTEM_EVENTS permission.
     */
    oneway void notifyDisplayConfigurationChange();

    /**
     * Notify the camera service of a device physical status change. May only be called from
     * a privileged process.
+60 −10
Original line number Diff line number Diff line
@@ -800,8 +800,8 @@ Status CameraService::filterGetInfoErrorCode(status_t err) {
Status CameraService::makeClient(const sp<CameraService>& cameraService,
        const sp<IInterface>& cameraCb, const String16& packageName,
        const std::optional<String16>& featureId,  const String8& cameraId,
        int api1CameraId, int facing, int clientPid, uid_t clientUid, int servicePid,
        int deviceVersion, apiLevel effectiveApiLevel,
        int api1CameraId, int facing, int sensorOrientation, int clientPid, uid_t clientUid,
        int servicePid, int deviceVersion, apiLevel effectiveApiLevel,
        /*out*/sp<BasicClient>* client) {

    // Create CameraClient based on device version reported by the HAL.
@@ -824,13 +824,13 @@ Status CameraService::makeClient(const sp<CameraService>& cameraService,
                sp<ICameraClient> tmp = static_cast<ICameraClient*>(cameraCb.get());
                *client = new Camera2Client(cameraService, tmp, packageName, featureId,
                        cameraId, api1CameraId,
                        facing, clientPid, clientUid,
                        facing, sensorOrientation, clientPid, clientUid,
                        servicePid);
            } else { // Camera2 API route
                sp<hardware::camera2::ICameraDeviceCallbacks> tmp =
                        static_cast<hardware::camera2::ICameraDeviceCallbacks*>(cameraCb.get());
                *client = new CameraDeviceClient(cameraService, tmp, packageName, featureId,
                        cameraId, facing, clientPid, clientUid, servicePid);
                        cameraId, facing, sensorOrientation, clientPid, clientUid, servicePid);
            }
            break;
        default:
@@ -1645,7 +1645,7 @@ Status CameraService::connectHelper(const sp<CALLBACK>& cameraCb, const String8&

        sp<BasicClient> tmp = nullptr;
        if(!(ret = makeClient(this, cameraCb, clientPackageName, clientFeatureId,
                cameraId, api1CameraId, facing,
                cameraId, api1CameraId, facing, orientation,
                clientPid, clientUid, getpid(),
                deviceVersion, effectiveApiLevel,
                /*out*/&tmp)).isOk()) {
@@ -2030,6 +2030,49 @@ Status CameraService::notifyDeviceStateChange(int64_t newState) {
    return Status::ok();
}

Status CameraService::notifyDisplayConfigurationChange() {
    ATRACE_CALL();
    const int callingPid = CameraThreadState::getCallingPid();
    const int selfPid = getpid();

    // Permission checks
    if (callingPid != selfPid) {
        // Ensure we're being called by system_server, or similar process with
        // permissions to notify the camera service about system events
        if (!checkCallingPermission(sCameraSendSystemEventsPermission)) {
            const int uid = CameraThreadState::getCallingUid();
            ALOGE("Permission Denial: cannot send updates to camera service about orientation"
                    " changes from pid=%d, uid=%d", callingPid, uid);
            return STATUS_ERROR_FMT(ERROR_PERMISSION_DENIED,
                    "No permission to send updates to camera service about orientation"
                    " changes from pid=%d, uid=%d", callingPid, uid);
        }
    }

    Mutex::Autolock lock(mServiceLock);

    // Don't do anything if rotate-and-crop override via cmd is active
    if (mOverrideRotateAndCropMode != ANDROID_SCALER_ROTATE_AND_CROP_AUTO) return Status::ok();

    const auto clients = mActiveClientManager.getAll();
    for (auto& current : clients) {
        if (current != nullptr) {
            const auto basicClient = current->getValue();
            if (basicClient.get() != nullptr) {
                if (CameraServiceProxyWrapper::isRotateAndCropOverrideNeeded(
                            basicClient->getPackageName(), basicClient->getCameraOrientation(),
                            basicClient->getCameraFacing())) {
                    basicClient->setRotateAndCropOverride(ANDROID_SCALER_ROTATE_AND_CROP_90);
                } else {
                    basicClient->setRotateAndCropOverride(ANDROID_SCALER_ROTATE_AND_CROP_NONE);
                }
            }
        }
    }

    return Status::ok();
}

Status CameraService::getConcurrentCameraIds(
        std::vector<ConcurrentCameraIdCombination>* concurrentCameraIds) {
    ATRACE_CALL();
@@ -2690,13 +2733,13 @@ CameraService::Client::Client(const sp<CameraService>& cameraService,
        const String16& clientPackageName,
        const std::optional<String16>& clientFeatureId,
        const String8& cameraIdStr,
        int api1CameraId, int cameraFacing,
        int api1CameraId, int cameraFacing, int sensorOrientation,
        int clientPid, uid_t clientUid,
        int servicePid) :
        CameraService::BasicClient(cameraService,
                IInterface::asBinder(cameraClient),
                clientPackageName, clientFeatureId,
                cameraIdStr, cameraFacing,
                cameraIdStr, cameraFacing, sensorOrientation,
                clientPid, clientUid,
                servicePid),
        mCameraId(api1CameraId)
@@ -2726,10 +2769,10 @@ sp<CameraService> CameraService::BasicClient::BasicClient::sCameraService;
CameraService::BasicClient::BasicClient(const sp<CameraService>& cameraService,
        const sp<IBinder>& remoteCallback,
        const String16& clientPackageName, const std::optional<String16>& clientFeatureId,
        const String8& cameraIdStr, int cameraFacing,
        const String8& cameraIdStr, int cameraFacing, int sensorOrientation,
        int clientPid, uid_t clientUid,
        int servicePid):
        mCameraIdStr(cameraIdStr), mCameraFacing(cameraFacing),
        mCameraIdStr(cameraIdStr), mCameraFacing(cameraFacing), mOrientation(sensorOrientation),
        mClientPackageName(clientPackageName), mClientFeatureId(clientFeatureId),
        mClientPid(clientPid), mClientUid(clientUid),
        mServicePid(servicePid),
@@ -2826,6 +2869,13 @@ String16 CameraService::BasicClient::getPackageName() const {
    return mClientPackageName;
}

int CameraService::BasicClient::getCameraFacing() const {
    return mCameraFacing;
}

int CameraService::BasicClient::getCameraOrientation() const {
    return mOrientation;
}

int CameraService::BasicClient::getClientPid() const {
    return mClientPid;
+13 −2
Original line number Diff line number Diff line
@@ -167,6 +167,8 @@ public:

    virtual binder::Status    notifyDeviceStateChange(int64_t newState);

    virtual binder::Status    notifyDisplayConfigurationChange();

    // OK = supports api of that version, -EOPNOTSUPP = does not support
    virtual binder::Status    supportsCameraApi(
            const String16& cameraId, int32_t apiVersion,
@@ -246,6 +248,12 @@ public:
        // Return the package name for this client
        virtual String16 getPackageName() const;

        // Return the camera facing for this client
        virtual int getCameraFacing() const;

        // Return the camera orientation for this client
        virtual int getCameraOrientation() const;

        // Notify client about a fatal error
        virtual void notifyError(int32_t errorCode,
                const CaptureResultExtras& resultExtras) = 0;
@@ -292,6 +300,7 @@ public:
                const std::optional<String16>& clientFeatureId,
                const String8& cameraIdStr,
                int cameraFacing,
                int sensorOrientation,
                int clientPid,
                uid_t clientUid,
                int servicePid);
@@ -308,6 +317,7 @@ public:
        static sp<CameraService>        sCameraService;
        const String8                   mCameraIdStr;
        const int                       mCameraFacing;
        const int                       mOrientation;
        String16                        mClientPackageName;
        std::optional<String16>         mClientFeatureId;
        pid_t                           mClientPid;
@@ -385,6 +395,7 @@ public:
                const String8& cameraIdStr,
                int api1CameraId,
                int cameraFacing,
                int sensorOrientation,
                int clientPid,
                uid_t clientUid,
                int servicePid);
@@ -1073,7 +1084,7 @@ private:
    static binder::Status makeClient(const sp<CameraService>& cameraService,
            const sp<IInterface>& cameraCb, const String16& packageName,
            const std::optional<String16>& featureId, const String8& cameraId, int api1CameraId,
            int facing, int clientPid, uid_t clientUid, int servicePid,
            int facing, int sensorOrientation, int clientPid, uid_t clientUid, int servicePid,
            int deviceVersion, apiLevel effectiveApiLevel,
            /*out*/sp<BasicClient>* client);

@@ -1102,7 +1113,7 @@ private:
    // Aggreated audio restriction mode for all camera clients
    int32_t mAudioRestriction;

    // Current override rotate-and-crop mode
    // Current override cmd rotate-and-crop mode; AUTO means no override
    uint8_t mOverrideRotateAndCropMode = ANDROID_SCALER_ROTATE_AND_CROP_AUTO;

    // Current image dump mask
+2 −1
Original line number Diff line number Diff line
@@ -55,11 +55,12 @@ Camera2Client::Camera2Client(const sp<CameraService>& cameraService,
        const String8& cameraDeviceId,
        int api1CameraId,
        int cameraFacing,
        int sensorOrientation,
        int clientPid,
        uid_t clientUid,
        int servicePid):
        Camera2ClientBase(cameraService, cameraClient, clientPackageName, clientFeatureId,
                cameraDeviceId, api1CameraId, cameraFacing,
                cameraDeviceId, api1CameraId, cameraFacing, sensorOrientation,
                clientPid, clientUid, servicePid),
        mParameters(api1CameraId, cameraFacing)
{
+1 −0
Original line number Diff line number Diff line
@@ -101,6 +101,7 @@ public:
            const String8& cameraDeviceId,
            int api1CameraId,
            int cameraFacing,
            int sensorOrientation,
            int clientPid,
            uid_t clientUid,
            int servicePid);
Loading