From 7363749128db65a3580a2c1ed6bb53c6a1dc0bb3 Mon Sep 17 00:00:00 2001 From: Darrell Shi Date: Wed, 2 Feb 2022 22:29:40 +0000 Subject: [PATCH] Hide all complications as necessary. Pass whether the dream overlay should show complications from the overlay service to overlay state controller, and use the flag when filtering what complications to show. Test: atest DreamOverlayStateControllerTest Bug: 211519550 Change-Id: I65841c880b4173bd5b7d0b489b0bd30ac4c0a2bf --- .../systemui/dreams/DreamOverlayService.java | 1 + .../dreams/DreamOverlayStateController.java | 29 ++++++++++- .../DreamOverlayStateControllerTest.java | 48 ++++++++++++++++++- 3 files changed, 75 insertions(+), 3 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayService.java b/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayService.java index 4dacf654496cb..338a8b2a2a59e 100644 --- a/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayService.java +++ b/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayService.java @@ -132,6 +132,7 @@ public class DreamOverlayService extends android.service.dreams.DreamOverlayServ public void onStartDream(@NonNull WindowManager.LayoutParams layoutParams) { setCurrentState(Lifecycle.State.STARTED); mExecutor.execute(() -> { + mStateController.setShouldShowComplications(shouldShowComplications()); addOverlayWindowLocked(layoutParams); setCurrentState(Lifecycle.State.RESUMED); mStateController.setOverlayActive(true); diff --git a/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayStateController.java b/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayStateController.java index bc5a52a40a35c..fc71e2fb23296 100644 --- a/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayStateController.java +++ b/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayStateController.java @@ -16,6 +16,7 @@ package com.android.systemui.dreams; +import android.service.dreams.DreamService; import android.util.Log; import androidx.annotation.NonNull; @@ -84,6 +85,8 @@ public class DreamOverlayStateController implements @Complication.ComplicationType private int mAvailableComplicationTypes = Complication.COMPLICATION_TYPE_NONE; + private boolean mShouldShowComplications = DreamService.DEFAULT_SHOW_COMPLICATIONS; + private final Collection mComplications = new HashSet(); @VisibleForTesting @@ -131,7 +134,12 @@ public class DreamOverlayStateController implements .filter(complication -> { @Complication.ComplicationType final int requiredTypes = complication.getRequiredTypeAvailability(); - return (requiredTypes & getAvailableComplicationTypes()) == requiredTypes; + // If it should show complications, show ones whose required types are + // available. Otherwise, only show ones that don't require types. + if (mShouldShowComplications) { + return (requiredTypes & getAvailableComplicationTypes()) == requiredTypes; + } + return requiredTypes == Complication.COMPLICATION_TYPE_NONE; }) .collect(Collectors.toCollection(HashSet::new)) : mComplications); @@ -221,7 +229,24 @@ public class DreamOverlayStateController implements public void setAvailableComplicationTypes(@Complication.ComplicationType int types) { mExecutor.execute(() -> { mAvailableComplicationTypes = types; - mCallbacks.forEach(callback -> callback.onAvailableComplicationTypesChanged()); + mCallbacks.forEach(Callback::onAvailableComplicationTypesChanged); + }); + } + + /** + * Returns whether the dream overlay should show complications. + */ + public boolean getShouldShowComplications() { + return mShouldShowComplications; + } + + /** + * Sets whether the dream overlay should show complications. + */ + public void setShouldShowComplications(boolean shouldShowComplications) { + mExecutor.execute(() -> { + mShouldShowComplications = shouldShowComplications; + mCallbacks.forEach(Callback::onAvailableComplicationTypesChanged); }); } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayStateControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayStateControllerTest.java index 627da3c5ec77a..515a1ac814a95 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayStateControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayStateControllerTest.java @@ -123,7 +123,7 @@ public class DreamOverlayStateControllerTest extends SysuiTestCase { } @Test - public void testComplicationFiltering() { + public void testComplicationFilteringWhenShouldShowComplications() { final DreamOverlayStateController stateController = new DreamOverlayStateController(mExecutor); @@ -160,4 +160,50 @@ public class DreamOverlayStateControllerTest extends SysuiTestCase { } } + + @Test + public void testComplicationFilteringWhenShouldHideComplications() { + final DreamOverlayStateController stateController = + new DreamOverlayStateController(mExecutor); + stateController.setShouldShowComplications(true); + + final Complication alwaysAvailableComplication = Mockito.mock(Complication.class); + final Complication weatherComplication = Mockito.mock(Complication.class); + when(alwaysAvailableComplication.getRequiredTypeAvailability()) + .thenReturn(Complication.COMPLICATION_TYPE_NONE); + when(weatherComplication.getRequiredTypeAvailability()) + .thenReturn(Complication.COMPLICATION_TYPE_WEATHER); + + stateController.addComplication(alwaysAvailableComplication); + stateController.addComplication(weatherComplication); + + final DreamOverlayStateController.Callback callback = + Mockito.mock(DreamOverlayStateController.Callback.class); + + stateController.setAvailableComplicationTypes(Complication.COMPLICATION_TYPE_WEATHER); + stateController.addCallback(callback); + mExecutor.runAllReady(); + + { + clearInvocations(callback); + stateController.setShouldShowComplications(true); + mExecutor.runAllReady(); + + verify(callback).onAvailableComplicationTypesChanged(); + final Collection complications = stateController.getComplications(); + assertThat(complications.contains(alwaysAvailableComplication)).isTrue(); + assertThat(complications.contains(weatherComplication)).isTrue(); + } + + { + clearInvocations(callback); + stateController.setShouldShowComplications(false); + mExecutor.runAllReady(); + + verify(callback).onAvailableComplicationTypesChanged(); + final Collection complications = stateController.getComplications(); + assertThat(complications.contains(alwaysAvailableComplication)).isTrue(); + assertThat(complications.contains(weatherComplication)).isFalse(); + } + } }