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

Commit b3347bc6 authored by Wu-cheng Li's avatar Wu-cheng Li
Browse files

The old overlay should be destroyed if orientation changes.

Previously the orientation was wrong after suspend and resume.
When the camera app is resumed behide the lock screen, it
orinteation is portrait. When users slide to unlock the screen,
surfaceChanged is called and the orientation is landscape.
The camera app stops the preview, sets the display orientation,
and starts the preview. Overlay should be destroyed if the
orientation has changed.

bug:3031640
Change-Id: I38b527f9ea78c91b538463292152c023383b4695
parent 4e9751f0
Loading
Loading
Loading
Loading
+13 −5
Original line number Diff line number Diff line
@@ -319,6 +319,7 @@ CameraService::Client::Client(const sp<CameraService>& cameraService,
    // Callback is disabled by default
    mPreviewCallbackFlag = FRAME_CALLBACK_FLAG_NOOP;
    mOrientation = 0;
    mOrientationChanged = false;
    cameraService->setCameraBusy(cameraId);
    cameraService->loadSound();
    LOG1("Client::Client X (pid %d)", callingPid);
@@ -496,6 +497,7 @@ status_t CameraService::Client::setPreviewDisplay(const sp<ISurface>& surface) {
            // Force the destruction of any previous overlay
            sp<Overlay> dummy;
            mHardware->setOverlay(dummy);
            mOverlayRef = 0;
        } else {
            mSurface->unregisterBuffers();
        }
@@ -539,11 +541,12 @@ status_t CameraService::Client::setOverlay() {
    CameraParameters params(mHardware->getParameters());
    params.getPreviewSize(&w, &h);

    if (w != mOverlayW || h != mOverlayH) {
    if (w != mOverlayW || h != mOverlayH || mOrientationChanged) {
        // Force the destruction of any previous overlay
        sp<Overlay> dummy;
        mHardware->setOverlay(dummy);
        mOverlayRef = 0;
        mOrientationChanged = false;
    }

    status_t result = NO_ERROR;
@@ -810,6 +813,7 @@ String8 CameraService::Client::getParameters() const {

status_t CameraService::Client::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) {
    LOG1("sendCommand (pid %d)", getCallingPid());
    int orientation;
    Mutex::Autolock lock(mLock);
    status_t result = checkPidAndHardware();
    if (result != NO_ERROR) return result;
@@ -821,20 +825,24 @@ status_t CameraService::Client::sendCommand(int32_t cmd, int32_t arg1, int32_t a
        }
        switch (arg1) {
            case 0:
                mOrientation = ISurface::BufferHeap::ROT_0;
                orientation = ISurface::BufferHeap::ROT_0;
                break;
            case 90:
                mOrientation = ISurface::BufferHeap::ROT_90;
                orientation = ISurface::BufferHeap::ROT_90;
                break;
            case 180:
                mOrientation = ISurface::BufferHeap::ROT_180;
                orientation = ISurface::BufferHeap::ROT_180;
                break;
            case 270:
                mOrientation = ISurface::BufferHeap::ROT_270;
                orientation = ISurface::BufferHeap::ROT_270;
                break;
            default:
                return BAD_VALUE;
        }
        if (mOrientation != orientation) {
            mOrientation = orientation;
            if (mOverlayRef != 0) mOrientationChanged = true;
        }
        return OK;
    }

+3 −1
Original line number Diff line number Diff line
@@ -164,7 +164,9 @@ private:
        int                             mOverlayW;
        int                             mOverlayH;
        int                             mPreviewCallbackFlag;
        int                             mOrientation;
        int                             mOrientation;     // Current display orientation
        // True if display orientation has been changed. This is only used in overlay.
        int                             mOrientationChanged;

        // Ensures atomicity among the public methods
        mutable Mutex                   mLock;