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

Commit 29d0aa0f authored by Chen Bai's avatar Chen Bai
Browse files

do wom: fix potential issue of VirtualDisplay's callback not called

- Remove requestDisplayStateLocked version without displayoffload &
  enforce VirtualDisplayAdapter to implement the new
  requestDisplayStateLocked.
- Fix tests.

Test: atest DisplayManagerServiceTest && atest LocalDisplayAdapterTest
BUG: 304944369
Change-Id: I1ec351e6280088b301662cdb0af6ad24f84fc93e
parent d64b75d5
Loading
Loading
Loading
Loading
+2 −16
Original line number Original line Diff line number Diff line
@@ -23,7 +23,7 @@ import android.annotation.Nullable;
import android.content.Context;
import android.content.Context;
import android.graphics.Point;
import android.graphics.Point;
import android.graphics.Rect;
import android.graphics.Rect;
import android.hardware.display.DisplayManagerInternal;
import android.hardware.display.DisplayManagerInternal.DisplayOffloadSession;
import android.hardware.display.DisplayViewport;
import android.hardware.display.DisplayViewport;
import android.os.IBinder;
import android.os.IBinder;
import android.util.Slog;
import android.util.Slog;
@@ -195,20 +195,6 @@ abstract class DisplayDevice {
    public void performTraversalLocked(SurfaceControl.Transaction t) {
    public void performTraversalLocked(SurfaceControl.Transaction t) {
    }
    }


    /**
     * Sets the display state, if supported.
     *
     * @param state The new display state.
     * @param brightnessState The new display brightnessState.
     * @param sdrBrightnessState The new display brightnessState for SDR layers.
     * @return A runnable containing work to be deferred until after we have
     * exited the critical section, or null if none.
     */
    public Runnable requestDisplayStateLocked(int state, float brightnessState,
            float sdrBrightnessState) {
        return requestDisplayStateLocked(state, brightnessState, sdrBrightnessState, null);
    }

    /**
    /**
     * Sets the display state, if supported.
     * Sets the display state, if supported.
     *
     *
@@ -223,7 +209,7 @@ abstract class DisplayDevice {
            int state,
            int state,
            float brightnessState,
            float brightnessState,
            float sdrBrightnessState,
            float sdrBrightnessState,
            @Nullable DisplayManagerInternal.DisplayOffloadSession displayOffloadSession) {
            @Nullable DisplayOffloadSession displayOffloadSession) {
        return null;
        return null;
    }
    }


+2 −1
Original line number Original line Diff line number Diff line
@@ -43,6 +43,7 @@ import static com.android.server.display.DisplayDeviceInfo.FLAG_TRUSTED;
import android.annotation.Nullable;
import android.annotation.Nullable;
import android.content.Context;
import android.content.Context;
import android.graphics.Point;
import android.graphics.Point;
import android.hardware.display.DisplayManagerInternal.DisplayOffloadSession;
import android.hardware.display.IVirtualDisplayCallback;
import android.hardware.display.IVirtualDisplayCallback;
import android.hardware.display.VirtualDisplayConfig;
import android.hardware.display.VirtualDisplayConfig;
import android.media.projection.IMediaProjection;
import android.media.projection.IMediaProjection;
@@ -395,7 +396,7 @@ public class VirtualDisplayAdapter extends DisplayAdapter {


        @Override
        @Override
        public Runnable requestDisplayStateLocked(int state, float brightnessState,
        public Runnable requestDisplayStateLocked(int state, float brightnessState,
                float sdrBrightnessState) {
                float sdrBrightnessState, DisplayOffloadSession displayOffloadSession) {
            if (state != mDisplayState) {
            if (state != mDisplayState) {
                mDisplayState = state;
                mDisplayState = state;
                if (state == Display.STATE_OFF) {
                if (state == Display.STATE_OFF) {
+10 −9
Original line number Original line Diff line number Diff line
@@ -33,6 +33,7 @@ import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.when;
import static org.mockito.Mockito.when;


import android.content.Context;
import android.content.Context;
@@ -699,7 +700,7 @@ public class LocalDisplayAdapterTest {


        // Turn off.
        // Turn off.
        Runnable changeStateRunnable = displayDevice.requestDisplayStateLocked(Display.STATE_OFF, 0,
        Runnable changeStateRunnable = displayDevice.requestDisplayStateLocked(Display.STATE_OFF, 0,
                0);
                0, null);
        waitForHandlerToComplete(mHandler, HANDLER_WAIT_MS);
        waitForHandlerToComplete(mHandler, HANDLER_WAIT_MS);
        assertThat(mListener.changedDisplays.size()).isEqualTo(1);
        assertThat(mListener.changedDisplays.size()).isEqualTo(1);
        mListener.changedDisplays.clear();
        mListener.changedDisplays.clear();
@@ -1003,7 +1004,7 @@ public class LocalDisplayAdapterTest {
        // Turn on / initialize
        // Turn on / initialize
        assumeTrue(displayDevice.getDisplayDeviceConfig().hasSdrToHdrRatioSpline());
        assumeTrue(displayDevice.getDisplayDeviceConfig().hasSdrToHdrRatioSpline());
        Runnable changeStateRunnable = displayDevice.requestDisplayStateLocked(Display.STATE_ON, 0,
        Runnable changeStateRunnable = displayDevice.requestDisplayStateLocked(Display.STATE_ON, 0,
                0);
                0, null);
        changeStateRunnable.run();
        changeStateRunnable.run();
        waitForHandlerToComplete(mHandler, HANDLER_WAIT_MS);
        waitForHandlerToComplete(mHandler, HANDLER_WAIT_MS);
        mListener.changedDisplays.clear();
        mListener.changedDisplays.clear();
@@ -1012,7 +1013,7 @@ public class LocalDisplayAdapterTest {


        // HDR time!
        // HDR time!
        Runnable goHdrRunnable = displayDevice.requestDisplayStateLocked(Display.STATE_ON, 1f,
        Runnable goHdrRunnable = displayDevice.requestDisplayStateLocked(Display.STATE_ON, 1f,
                0);
                0, null);
        waitForHandlerToComplete(mHandler, HANDLER_WAIT_MS);
        waitForHandlerToComplete(mHandler, HANDLER_WAIT_MS);
        // Display state didn't change, no listeners should have happened
        // Display state didn't change, no listeners should have happened
        assertThat(mListener.changedDisplays.size()).isEqualTo(0);
        assertThat(mListener.changedDisplays.size()).isEqualTo(0);
@@ -1043,7 +1044,7 @@ public class LocalDisplayAdapterTest {


        // Turn on / initialize
        // Turn on / initialize
        Runnable changeStateRunnable = displayDevice.requestDisplayStateLocked(Display.STATE_ON, 0,
        Runnable changeStateRunnable = displayDevice.requestDisplayStateLocked(Display.STATE_ON, 0,
                0);
                0, null);
        changeStateRunnable.run();
        changeStateRunnable.run();
        waitForHandlerToComplete(mHandler, HANDLER_WAIT_MS);
        waitForHandlerToComplete(mHandler, HANDLER_WAIT_MS);
        mListener.changedDisplays.clear();
        mListener.changedDisplays.clear();
@@ -1070,7 +1071,7 @@ public class LocalDisplayAdapterTest {


        // Turn on / initialize
        // Turn on / initialize
        Runnable changeStateRunnable = displayDevice.requestDisplayStateLocked(Display.STATE_ON, 0,
        Runnable changeStateRunnable = displayDevice.requestDisplayStateLocked(Display.STATE_ON, 0,
                0);
                0, null);
        changeStateRunnable.run();
        changeStateRunnable.run();
        waitForHandlerToComplete(mHandler, HANDLER_WAIT_MS);
        waitForHandlerToComplete(mHandler, HANDLER_WAIT_MS);
        mListener.changedDisplays.clear();
        mListener.changedDisplays.clear();
@@ -1095,7 +1096,7 @@ public class LocalDisplayAdapterTest {


        // Turn on / initialize
        // Turn on / initialize
        Runnable changeStateRunnable = displayDevice.requestDisplayStateLocked(Display.STATE_ON, 0,
        Runnable changeStateRunnable = displayDevice.requestDisplayStateLocked(Display.STATE_ON, 0,
                0);
                0, null);
        changeStateRunnable.run();
        changeStateRunnable.run();
        waitForHandlerToComplete(mHandler, HANDLER_WAIT_MS);
        waitForHandlerToComplete(mHandler, HANDLER_WAIT_MS);
        mListener.changedDisplays.clear();
        mListener.changedDisplays.clear();
@@ -1118,7 +1119,7 @@ public class LocalDisplayAdapterTest {


        // Turn on / initialize
        // Turn on / initialize
        Runnable changeStateRunnable = displayDevice.requestDisplayStateLocked(Display.STATE_ON, 0,
        Runnable changeStateRunnable = displayDevice.requestDisplayStateLocked(Display.STATE_ON, 0,
                0);
                0, null);
        changeStateRunnable.run();
        changeStateRunnable.run();
        waitForHandlerToComplete(mHandler, HANDLER_WAIT_MS);
        waitForHandlerToComplete(mHandler, HANDLER_WAIT_MS);
        mListener.changedDisplays.clear();
        mListener.changedDisplays.clear();
@@ -1145,9 +1146,9 @@ public class LocalDisplayAdapterTest {
            Runnable changeStateRunnable = displayDevice.requestDisplayStateLocked(
            Runnable changeStateRunnable = displayDevice.requestDisplayStateLocked(
                    supportedState, 0, 0, mDisplayOffloadSession);
                    supportedState, 0, 0, mDisplayOffloadSession);
            changeStateRunnable.run();
            changeStateRunnable.run();

            verify(mDisplayOffloader).startOffload();
        }
        }

        verify(mDisplayOffloader, times(mDisplayOffloadSupportedStates.size())).startOffload();
    }
    }


    @Test
    @Test