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

Commit 9451efd2 authored by Vladimir Komsiyski's avatar Vladimir Komsiyski
Browse files

Fix virtual display power state management.

Before:
 - setSurface results in OFF/ON display state, ignoring the relevant
   power group state.

After:
 - display states follow the relevant power group state.
 - setSurface can turn off and on the display if the power group is
   on but has no effect if the power group is off. This is in line
   with the API docs of VirtualDisplay#setSurface

Fix: 369061926
Test: CTS
Flag: EXEMPT bugfix
Change-Id: Iff0b59ba400c7eb1277a2bd65e835b715215a8b6
parent a70cdf69
Loading
Loading
Loading
Loading
+0 −9
Original line number Diff line number Diff line
@@ -792,7 +792,6 @@ public final class DisplayManagerGlobal {
    public void setVirtualDisplaySurface(IVirtualDisplayCallback token, Surface surface) {
        try {
            mDm.setVirtualDisplaySurface(token, surface);
            setVirtualDisplayState(token, surface != null);
        } catch (RemoteException ex) {
            throw ex.rethrowFromSystemServer();
        }
@@ -815,14 +814,6 @@ public final class DisplayManagerGlobal {
        }
    }

    void setVirtualDisplayState(IVirtualDisplayCallback token, boolean isOn) {
        try {
            mDm.setVirtualDisplayState(token, isOn);
        } catch (RemoteException ex) {
            throw ex.rethrowFromSystemServer();
        }
    }

    void setVirtualDisplayRotation(IVirtualDisplayCallback token, @Surface.Rotation int rotation) {
        try {
            mDm.setVirtualDisplayRotation(token, rotation);
+0 −3
Original line number Diff line number Diff line
@@ -114,9 +114,6 @@ interface IDisplayManager {
    // No permissions required but must be same Uid as the creator.
    void releaseVirtualDisplay(in IVirtualDisplayCallback token);

    // No permissions required but must be same Uid as the creator.
    void setVirtualDisplayState(in IVirtualDisplayCallback token, boolean isOn);

    // No permissions required but must be same Uid as the creator.
    void setVirtualDisplayRotation(in IVirtualDisplayCallback token, int rotation);

+0 −12
Original line number Diff line number Diff line
@@ -111,18 +111,6 @@ public final class VirtualDisplay {
        }
    }

    /**
     * Sets the on/off state for a virtual display.
     *
     * @param isOn Whether the display should be on or off.
     * @hide
     */
    public void setDisplayState(boolean isOn) {
        if (mToken != null) {
            mGlobal.setVirtualDisplayState(mToken, isOn);
        }
    }

    /**
     * Sets the rotation of the virtual display.
     *
+0 −20
Original line number Diff line number Diff line
@@ -2093,16 +2093,6 @@ public final class DisplayManagerService extends SystemService {
        }
    }

    private void setVirtualDisplayStateInternal(IBinder appToken, boolean isOn) {
        synchronized (mSyncRoot) {
            if (mVirtualDisplayAdapter == null) {
                return;
            }

            mVirtualDisplayAdapter.setVirtualDisplayStateLocked(appToken, isOn);
        }
    }

    private void setVirtualDisplayRotationInternal(IBinder appToken,
            @Surface.Rotation int rotation) {
        int displayId;
@@ -4614,16 +4604,6 @@ public final class DisplayManagerService extends SystemService {
            }
        }

        @Override // Binder call
        public void setVirtualDisplayState(IVirtualDisplayCallback callback, boolean isOn) {
            final long token = Binder.clearCallingIdentity();
            try {
                setVirtualDisplayStateInternal(callback.asBinder(), isOn);
            } finally {
                Binder.restoreCallingIdentity(token);
            }
        }

        @Override // Binder call
        public void setVirtualDisplayRotation(IVirtualDisplayCallback callback,
                @Surface.Rotation int rotation) {
+11 −21
Original line number Diff line number Diff line
@@ -207,13 +207,6 @@ public class VirtualDisplayAdapter extends DisplayAdapter {
        return device;
    }

    void setVirtualDisplayStateLocked(IBinder appToken, boolean isOn) {
        VirtualDisplayDevice device = mVirtualDisplayDevices.get(appToken);
        if (device != null) {
            device.setDisplayState(isOn);
        }
    }

    DisplayDevice getDisplayDevice(IBinder appToken) {
        return mVirtualDisplayDevices.get(appToken);
    }
@@ -273,7 +266,6 @@ public class VirtualDisplayAdapter extends DisplayAdapter {
        private boolean mStopped;
        private int mPendingChanges;
        private Display.Mode mMode;
        private boolean mIsDisplayOn;
        private int mDisplayIdToMirror;
        private boolean mIsWindowManagerMirroring;
        private DisplayCutout mDisplayCutout;
@@ -299,9 +291,8 @@ public class VirtualDisplayAdapter extends DisplayAdapter {
            mCallback = callback;
            mProjection = projection;
            mMediaProjectionCallback = mediaProjectionCallback;
            mDisplayState = Display.STATE_UNKNOWN;
            mDisplayState = Display.STATE_ON;
            mPendingChanges |= PENDING_SURFACE_CHANGE;
            mIsDisplayOn = surface != null;
            mDisplayIdToMirror = virtualDisplayConfig.getDisplayIdToMirror();
            mIsWindowManagerMirroring = virtualDisplayConfig.isWindowManagerMirroringEnabled();
        }
@@ -394,6 +385,8 @@ public class VirtualDisplayAdapter extends DisplayAdapter {
                float sdrBrightnessState, DisplayOffloadSessionImpl displayOffloadSession) {
            if (state != mDisplayState) {
                mDisplayState = state;
                mInfo = null;
                sendDisplayDeviceEventLocked(this, DISPLAY_DEVICE_EVENT_CHANGED);
                if (state == Display.STATE_OFF) {
                    mCallback.dispatchDisplayPaused();
                } else {
@@ -416,12 +409,13 @@ public class VirtualDisplayAdapter extends DisplayAdapter {

        public void setSurfaceLocked(Surface surface) {
            if (!mStopped && mSurface != surface) {
                if ((mSurface != null) != (surface != null)) {
                if (mDisplayState == Display.STATE_ON
                        && ((mSurface == null) != (surface == null))) {
                    mInfo = null;
                    sendDisplayDeviceEventLocked(this, DISPLAY_DEVICE_EVENT_CHANGED);
                }
                sendTraversalRequestLocked();
                mSurface = surface;
                mInfo = null;
                mPendingChanges |= PENDING_SURFACE_CHANGE;
            }
        }
@@ -439,14 +433,6 @@ public class VirtualDisplayAdapter extends DisplayAdapter {
            }
        }

        void setDisplayState(boolean isOn) {
            if (mIsDisplayOn != isOn) {
                mIsDisplayOn = isOn;
                mInfo = null;
                sendDisplayDeviceEventLocked(this, DISPLAY_DEVICE_EVENT_CHANGED);
            }
        }

        public void stopLocked() {
            Slog.d(TAG, "Virtual Display: stopping device " + mName);
            setSurfaceLocked(null);
@@ -567,7 +553,11 @@ public class VirtualDisplayAdapter extends DisplayAdapter {
                mInfo.touch = ((mFlags & VIRTUAL_DISPLAY_FLAG_SUPPORTS_TOUCH) == 0) ?
                        DisplayDeviceInfo.TOUCH_NONE : DisplayDeviceInfo.TOUCH_VIRTUAL;

                mInfo.state = mIsDisplayOn ? Display.STATE_ON : Display.STATE_OFF;
                if (mSurface == null) {
                    mInfo.state = Display.STATE_OFF;
                } else {
                    mInfo.state = mDisplayState;
                }

                mInfo.ownerUid = mOwnerUid;
                mInfo.ownerPackageName = mOwnerPackageName;