From 1e8b9618ef8dd9981fa21e554b4effa764c516d8 Mon Sep 17 00:00:00 2001 From: Bryce Lee Date: Fri, 28 Jan 2022 14:35:02 -0800 Subject: [PATCH] Prune unavailable complications. This changelist checks the availability of a complication based on its required available complication types and trims ineligible complications from participating at the LiveData level. By default, the DreamOverlayStateController now only returns available complications. Bug: 214039870 Test: atest DreamOverlayStateControllerTest ComplicationCollectionLiveDataTest Change-Id: If1fa63b46e409dce944b6e0ae54d80c2c44f7024 --- .../dreams/DreamOverlayStateController.java | 48 ++++++++++++++++++- .../dreams/complication/Complication.java | 11 +++++ .../ComplicationCollectionLiveData.java | 4 ++ .../DreamOverlayStateControllerTest.java | 40 ++++++++++++++++ .../ComplicationCollectionLiveDataTest.java | 4 ++ 5 files changed, 106 insertions(+), 1 deletion(-) diff --git a/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayStateController.java b/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayStateController.java index 3e4ae57000f16..ac7457d90e495 100644 --- a/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayStateController.java +++ b/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayStateController.java @@ -33,6 +33,7 @@ import java.util.HashSet; import java.util.Objects; import java.util.concurrent.Executor; import java.util.function.Consumer; +import java.util.stream.Collectors; import javax.inject.Inject; @@ -69,11 +70,20 @@ public class DreamOverlayStateController implements */ default void onStateChanged() { } + + /** + * Called when the available complication types changes. + */ + default void onAvailableComplicationTypesChanged() { + } } private final Executor mExecutor; private final ArrayList mCallbacks = new ArrayList<>(); + @Complication.ComplicationType + private int mAvailableComplicationTypes = Complication.COMPLICATION_TYPE_NONE; + private final Collection mComplications = new HashSet(); @VisibleForTesting @@ -108,7 +118,25 @@ public class DreamOverlayStateController implements * Returns collection of present {@link Complication}. */ public Collection getComplications() { - return Collections.unmodifiableCollection(mComplications); + return getComplications(true); + } + + /** + * Returns collection of present {@link Complication}. + */ + public Collection getComplications(boolean filterByAvailability) { + return Collections.unmodifiableCollection(filterByAvailability + ? mComplications + .stream() + .filter(complication -> { + @Complication.ComplicationType + final int requiredTypes = complication.getRequiredTypeAvailability(); + + return requiredTypes == Complication.COMPLICATION_TYPE_NONE + || (requiredTypes & getAvailableComplicationTypes()) == requiredTypes; + }) + .collect(Collectors.toCollection(HashSet::new)) + : mComplications); } private void notifyCallbacks(Consumer callbackConsumer) { @@ -180,4 +208,22 @@ public class DreamOverlayStateController implements public void setOverlayActive(boolean active) { modifyState(active ? OP_SET_STATE : OP_CLEAR_STATE, STATE_DREAM_OVERLAY_ACTIVE); } + + /** + * Returns the available complication types. + */ + @Complication.ComplicationType + public int getAvailableComplicationTypes() { + return mAvailableComplicationTypes; + } + + /** + * Sets the available complication types for the dream overlay. + */ + public void setAvailableComplicationTypes(@Complication.ComplicationType int types) { + mExecutor.execute(() -> { + mAvailableComplicationTypes = types; + mCallbacks.forEach(callback -> callback.onAvailableComplicationTypesChanged()); + }); + } } diff --git a/packages/SystemUI/src/com/android/systemui/dreams/complication/Complication.java b/packages/SystemUI/src/com/android/systemui/dreams/complication/Complication.java index 4332f5880e2e2..fe458f4c53185 100644 --- a/packages/SystemUI/src/com/android/systemui/dreams/complication/Complication.java +++ b/packages/SystemUI/src/com/android/systemui/dreams/complication/Complication.java @@ -228,4 +228,15 @@ public interface Complication { * @return a {@link ViewHolder} for this {@link Complication} instance. */ ViewHolder createView(ComplicationViewModel model); + + /** + * Returns the types that must be present in order for this complication to participate on + * the dream overlay. By default, this method returns + * {@code Complication.COMPLICATION_TYPE_NONE} to indicate no types are required. + * @return + */ + @Complication.ComplicationType + default int getRequiredTypeAvailability() { + return Complication.COMPLICATION_TYPE_NONE; + } } diff --git a/packages/SystemUI/src/com/android/systemui/dreams/complication/ComplicationCollectionLiveData.java b/packages/SystemUI/src/com/android/systemui/dreams/complication/ComplicationCollectionLiveData.java index 76818fa0c42e1..f6fe8d2e579c8 100644 --- a/packages/SystemUI/src/com/android/systemui/dreams/complication/ComplicationCollectionLiveData.java +++ b/packages/SystemUI/src/com/android/systemui/dreams/complication/ComplicationCollectionLiveData.java @@ -42,6 +42,10 @@ public class ComplicationCollectionLiveData extends LiveData complications = stateController.getComplications(); + assertThat(complications.contains(alwaysAvailableComplication)).isTrue(); + assertThat(complications.contains(weatherComplication)).isFalse(); + } + + stateController.setAvailableComplicationTypes(Complication.COMPLICATION_TYPE_WEATHER); + mExecutor.runAllReady(); + verify(callback).onAvailableComplicationTypesChanged(); + + { + final Collection complications = stateController.getComplications(); + assertThat(complications.contains(alwaysAvailableComplication)).isTrue(); + assertThat(complications.contains(weatherComplication)).isTrue(); + } + + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/dreams/complication/ComplicationCollectionLiveDataTest.java b/packages/SystemUI/tests/src/com/android/systemui/dreams/complication/ComplicationCollectionLiveDataTest.java index feeea5dff7ea2..5fcf414f02511 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/dreams/complication/ComplicationCollectionLiveDataTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/dreams/complication/ComplicationCollectionLiveDataTest.java @@ -75,6 +75,10 @@ public class ComplicationCollectionLiveDataTest extends SysuiTestCase { callbackCaptor.getValue().onComplicationsChanged(); verifyUpdate(observer, complications); + + callbackCaptor.getValue().onAvailableComplicationTypesChanged(); + + verifyUpdate(observer, complications); }); }