diff options
| -rw-r--r-- | core/java/android/service/dreams/DreamOverlayService.java | 10 | ||||
| -rw-r--r-- | services/tests/dreamservicetests/src/com/android/server/dreams/DreamOverlayServiceTest.java | 45 |
2 files changed, 54 insertions, 1 deletions
diff --git a/core/java/android/service/dreams/DreamOverlayService.java b/core/java/android/service/dreams/DreamOverlayService.java index 013ec5f35761..244257cb61c8 100644 --- a/core/java/android/service/dreams/DreamOverlayService.java +++ b/core/java/android/service/dreams/DreamOverlayService.java @@ -51,6 +51,8 @@ public abstract class DreamOverlayService extends Service { */ private Executor mExecutor; + private boolean mCurrentRedirectToWake; + // An {@link IDreamOverlayClient} implementation that identifies itself when forwarding // requests to the {@link DreamOverlayService} private static class OverlayClient extends IDreamOverlayClient.Stub { @@ -132,6 +134,10 @@ public abstract class DreamOverlayService extends Service { mExecutor.execute(() -> { endDreamInternal(mCurrentClient); mCurrentClient = client; + if (Flags.dreamWakeRedirect()) { + mCurrentClient.redirectWake(mCurrentRedirectToWake); + } + onStartDream(params); }); } @@ -282,8 +288,10 @@ public abstract class DreamOverlayService extends Service { return; } + mCurrentRedirectToWake = redirect; + if (mCurrentClient == null) { - throw new IllegalStateException("redirected wake with no dream present"); + return; } mCurrentClient.redirectWake(redirect); diff --git a/services/tests/dreamservicetests/src/com/android/server/dreams/DreamOverlayServiceTest.java b/services/tests/dreamservicetests/src/com/android/server/dreams/DreamOverlayServiceTest.java index 54f46078d30b..698ce13aa6db 100644 --- a/services/tests/dreamservicetests/src/com/android/server/dreams/DreamOverlayServiceTest.java +++ b/services/tests/dreamservicetests/src/com/android/server/dreams/DreamOverlayServiceTest.java @@ -18,7 +18,9 @@ package com.android.server.dreams; import static com.google.common.truth.Truth.assertThat; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.any; +import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; @@ -27,7 +29,9 @@ import android.content.ComponentName; import android.content.Intent; import android.os.IBinder; import android.os.RemoteException; +import android.platform.test.annotations.EnableFlags; import android.service.dreams.DreamOverlayService; +import android.service.dreams.Flags; import android.service.dreams.IDreamOverlay; import android.service.dreams.IDreamOverlayCallback; import android.service.dreams.IDreamOverlayClient; @@ -221,6 +225,47 @@ public class DreamOverlayServiceTest { verify(monitor, never()).onWakeUp(); } + /** + * Verifies that only the currently started dream is able to affect the overlay. + */ + @Test + @EnableFlags(Flags.FLAG_DREAM_WAKE_REDIRECT) + public void testRedirectToWakeAcrossClients() throws RemoteException { + doAnswer(invocation -> { + ((Runnable) invocation.getArgument(0)).run(); + return null; + }).when(mExecutor).execute(any()); + + final TestDreamOverlayService.Monitor monitor = Mockito.mock( + TestDreamOverlayService.Monitor.class); + final TestDreamOverlayService service = new TestDreamOverlayService(monitor, mExecutor); + final IBinder binder = service.onBind(new Intent()); + final IDreamOverlay overlay = IDreamOverlay.Stub.asInterface(binder); + + service.redirectWake(true); + + final IDreamOverlayClient client = getClient(overlay); + + // Start the dream. + client.startDream(mLayoutParams, mOverlayCallback, + FIRST_DREAM_COMPONENT.flattenToString(), false); + // Make sure redirect state is set on dream. + verify(mOverlayCallback).onRedirectWake(eq(true)); + + // Make sure new changes are propagated. + clearInvocations(mOverlayCallback); + service.redirectWake(false); + verify(mOverlayCallback).onRedirectWake(eq(false)); + + + // Start another dream, make sure new dream is informed of current state. + service.redirectWake(true); + clearInvocations(mOverlayCallback); + client.startDream(mLayoutParams, mOverlayCallback, + FIRST_DREAM_COMPONENT.flattenToString(), false); + verify(mOverlayCallback).onRedirectWake(eq(true)); + } + private static IDreamOverlayClient getClient(IDreamOverlay overlay) throws RemoteException { final OverlayClientCallback callback = new OverlayClientCallback(); overlay.getClient(callback); |