From 9a202be8e4aa3dc0f654bafed831bfcf97553d7b Mon Sep 17 00:00:00 2001 From: Lucas Silva Date: Mon, 5 Dec 2022 14:29:41 -0500 Subject: [PATCH] Move condition logic to shared lib so it can be reused in DockSetup apk This will help make the conditional code in DockSetup more scalable Bug: 259724339 Test: mp droid Change-Id: I3822ebbe3fcf6a3f0db65465b83932cd48dd9732 --- .../shared}/condition/CombinedCondition.kt | 2 +- .../systemui/shared}/condition/Condition.java | 50 ++++++++++---- .../systemui/shared}/condition/Evaluator.kt | 18 ++++- .../systemui/shared}/condition/Monitor.java | 12 ++-- .../condition/ConditionMonitorTest.java | 49 +++++++++----- .../condition/ConditionTest.java | 67 ++++++++++++------- .../shared}/condition/FakeCondition.java | 4 +- 7 files changed, 138 insertions(+), 64 deletions(-) rename packages/SystemUI/{src/com/android/systemui/util => shared/src/com/android/systemui/shared}/condition/CombinedCondition.kt (96%) rename packages/SystemUI/{src/com/android/systemui/util => shared/src/com/android/systemui/shared}/condition/Condition.java (80%) rename packages/SystemUI/{src/com/android/systemui/util => shared/src/com/android/systemui/shared}/condition/Evaluator.kt (81%) rename packages/SystemUI/{src/com/android/systemui/util => shared/src/com/android/systemui/shared}/condition/Monitor.java (96%) rename packages/SystemUI/tests/src/com/android/systemui/{util => shared}/condition/ConditionMonitorTest.java (92%) rename packages/SystemUI/tests/src/com/android/systemui/{util => shared}/condition/ConditionTest.java (81%) rename packages/SystemUI/tests/{utils/src/com/android/systemui/util => src/com/android/systemui/shared}/condition/FakeCondition.java (92%) diff --git a/packages/SystemUI/src/com/android/systemui/util/condition/CombinedCondition.kt b/packages/SystemUI/shared/src/com/android/systemui/shared/condition/CombinedCondition.kt similarity index 96% rename from packages/SystemUI/src/com/android/systemui/util/condition/CombinedCondition.kt rename to packages/SystemUI/shared/src/com/android/systemui/shared/condition/CombinedCondition.kt index da81d540f1892..2d83458ec2f74 100644 --- a/packages/SystemUI/src/com/android/systemui/util/condition/CombinedCondition.kt +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/condition/CombinedCondition.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.systemui.util.condition +package com.android.systemui.shared.condition /** * A higher order [Condition] which combines multiple conditions with a specified diff --git a/packages/SystemUI/src/com/android/systemui/util/condition/Condition.java b/packages/SystemUI/shared/src/com/android/systemui/shared/condition/Condition.java similarity index 80% rename from packages/SystemUI/src/com/android/systemui/util/condition/Condition.java rename to packages/SystemUI/shared/src/com/android/systemui/shared/condition/Condition.java index b39adefa238bf..cc48090e12176 100644 --- a/packages/SystemUI/src/com/android/systemui/util/condition/Condition.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/condition/Condition.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,13 +14,14 @@ * limitations under the License. */ -package com.android.systemui.util.condition; +package com.android.systemui.shared.condition; import android.util.Log; -import com.android.systemui.statusbar.policy.CallbackController; - -import org.jetbrains.annotations.NotNull; +import androidx.annotation.NonNull; +import androidx.lifecycle.Lifecycle; +import androidx.lifecycle.LifecycleEventObserver; +import androidx.lifecycle.LifecycleOwner; import java.lang.ref.WeakReference; import java.util.ArrayList; @@ -33,7 +34,7 @@ import java.util.List; * Base class for a condition that needs to be fulfilled in order for {@link Monitor} to inform * its callbacks. */ -public abstract class Condition implements CallbackController { +public abstract class Condition { private final String mTag = getClass().getSimpleName(); private final ArrayList> mCallbacks = new ArrayList<>(); @@ -79,8 +80,7 @@ public abstract class Condition implements CallbackController(callback)); @@ -96,8 +96,7 @@ public abstract class Condition implements CallbackController> iterator = mCallbacks.iterator(); while (iterator.hasNext()) { @@ -115,6 +114,29 @@ public abstract class Condition implements CallbackController { + if (event == Lifecycle.Event.ON_RESUME) { + addCallback(listener); + } else if (event == Lifecycle.Event.ON_PAUSE) { + removeCallback(listener); + } + }); + return listener; + } + /** * Updates the value for whether the condition has been fulfilled, and sends an update if the * value changes and any callback is registered. @@ -187,7 +209,7 @@ public abstract class Condition implements CallbackController others) { + public Condition and(@NonNull Collection others) { final List conditions = new ArrayList<>(others); conditions.add(this); return new CombinedCondition(conditions, Evaluator.OP_AND); @@ -197,7 +219,7 @@ public abstract class Condition implements CallbackController others) { + public Condition or(@NonNull Collection others) { final List conditions = new ArrayList<>(others); conditions.add(this); return new CombinedCondition(conditions, Evaluator.OP_OR); @@ -215,7 +237,7 @@ public abstract class Condition implements CallbackController { if (shouldLog()) Log.d(mTag, "removing subscription"); if (!mSubscriptions.containsKey(token)) { diff --git a/packages/SystemUI/tests/src/com/android/systemui/util/condition/ConditionMonitorTest.java b/packages/SystemUI/tests/src/com/android/systemui/shared/condition/ConditionMonitorTest.java similarity index 92% rename from packages/SystemUI/tests/src/com/android/systemui/util/condition/ConditionMonitorTest.java rename to packages/SystemUI/tests/src/com/android/systemui/shared/condition/ConditionMonitorTest.java index 17d81c8338cba..7693fee0a1c47 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/util/condition/ConditionMonitorTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/shared/condition/ConditionMonitorTest.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.systemui.util.condition; +package com.android.systemui.shared.condition; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; @@ -68,13 +68,15 @@ public class ConditionMonitorTest extends SysuiTestCase { mConditionMonitor = new Monitor(mExecutor); } - public Monitor.Subscription.Builder getDefaultBuilder(Monitor.Callback callback) { + public Monitor.Subscription.Builder getDefaultBuilder( + Monitor.Callback callback) { return new Monitor.Subscription.Builder(callback) .addConditions(mConditions); } private Condition createMockCondition() { - final Condition condition = Mockito.mock(Condition.class); + final Condition condition = Mockito.mock( + Condition.class); when(condition.isConditionSet()).thenReturn(true); return condition; } @@ -83,11 +85,14 @@ public class ConditionMonitorTest extends SysuiTestCase { public void testOverridingCondition() { final Condition overridingCondition = createMockCondition(); final Condition regularCondition = createMockCondition(); - final Monitor.Callback callback = Mockito.mock(Monitor.Callback.class); + final Monitor.Callback callback = Mockito.mock( + Monitor.Callback.class); - final Monitor.Callback referenceCallback = Mockito.mock(Monitor.Callback.class); + final Monitor.Callback referenceCallback = Mockito.mock( + Monitor.Callback.class); - final Monitor monitor = new Monitor(mExecutor); + final Monitor + monitor = new Monitor(mExecutor); monitor.addSubscription(getDefaultBuilder(callback) .addCondition(overridingCondition) @@ -136,9 +141,11 @@ public class ConditionMonitorTest extends SysuiTestCase { final Condition overridingCondition = createMockCondition(); final Condition overridingCondition2 = createMockCondition(); final Condition regularCondition = createMockCondition(); - final Monitor.Callback callback = Mockito.mock(Monitor.Callback.class); + final Monitor.Callback callback = Mockito.mock( + Monitor.Callback.class); - final Monitor monitor = new Monitor(mExecutor); + final Monitor + monitor = new Monitor(mExecutor); monitor.addSubscription(getDefaultBuilder(callback) .addCondition(overridingCondition) @@ -211,9 +218,11 @@ public class ConditionMonitorTest extends SysuiTestCase { public void addCallback_addSecondCallback_reportWithExistingValue() { final Monitor.Callback callback1 = mock(Monitor.Callback.class); - final Condition condition = mock(Condition.class); + final Condition condition = mock( + Condition.class); when(condition.isConditionMet()).thenReturn(true); - final Monitor monitor = new Monitor(mExecutor); + final Monitor + monitor = new Monitor(mExecutor); monitor.addSubscription(new Monitor.Subscription.Builder(callback1) .addCondition(condition) .build()); @@ -229,8 +238,10 @@ public class ConditionMonitorTest extends SysuiTestCase { @Test public void addCallback_noConditions_reportAllConditionsMet() { - final Monitor monitor = new Monitor(mExecutor); - final Monitor.Callback callback = mock(Monitor.Callback.class); + final Monitor + monitor = new Monitor(mExecutor); + final Monitor.Callback callback = mock( + Monitor.Callback.class); monitor.addSubscription(new Monitor.Subscription.Builder(callback).build()); mExecutor.runAllReady(); @@ -239,8 +250,10 @@ public class ConditionMonitorTest extends SysuiTestCase { @Test public void removeCallback_noFailureOnDoubleRemove() { - final Condition condition = mock(Condition.class); - final Monitor monitor = new Monitor(mExecutor); + final Condition condition = mock( + Condition.class); + final Monitor + monitor = new Monitor(mExecutor); final Monitor.Callback callback = mock(Monitor.Callback.class); final Monitor.Subscription.Token token = monitor.addSubscription( @@ -255,8 +268,10 @@ public class ConditionMonitorTest extends SysuiTestCase { @Test public void removeCallback_shouldNoLongerReceiveUpdate() { - final Condition condition = mock(Condition.class); - final Monitor monitor = new Monitor(mExecutor); + final Condition condition = mock( + Condition.class); + final Monitor + monitor = new Monitor(mExecutor); final Monitor.Callback callback = mock(Monitor.Callback.class); final Monitor.Subscription.Token token = monitor.addSubscription( diff --git a/packages/SystemUI/tests/src/com/android/systemui/util/condition/ConditionTest.java b/packages/SystemUI/tests/src/com/android/systemui/shared/condition/ConditionTest.java similarity index 81% rename from packages/SystemUI/tests/src/com/android/systemui/util/condition/ConditionTest.java rename to packages/SystemUI/tests/src/com/android/systemui/shared/condition/ConditionTest.java index 28788647dd581..8443221e8b7a6 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/util/condition/ConditionTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/shared/condition/ConditionTest.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.systemui.util.condition; +package com.android.systemui.shared.condition; import static com.google.common.truth.Truth.assertThat; @@ -47,16 +47,20 @@ public class ConditionTest extends SysuiTestCase { @Test public void addCallback_addFirstCallback_triggerStart() { - final Condition.Callback callback = mock(Condition.Callback.class); + final Condition.Callback callback = mock( + Condition.Callback.class); mCondition.addCallback(callback); verify(mCondition).start(); } @Test public void addCallback_addMultipleCallbacks_triggerStartOnlyOnce() { - final Condition.Callback callback1 = mock(Condition.Callback.class); - final Condition.Callback callback2 = mock(Condition.Callback.class); - final Condition.Callback callback3 = mock(Condition.Callback.class); + final Condition.Callback callback1 = mock( + Condition.Callback.class); + final Condition.Callback callback2 = mock( + Condition.Callback.class); + final Condition.Callback callback3 = mock( + Condition.Callback.class); mCondition.addCallback(callback1); mCondition.addCallback(callback2); @@ -67,12 +71,14 @@ public class ConditionTest extends SysuiTestCase { @Test public void addCallback_alreadyStarted_triggerUpdate() { - final Condition.Callback callback1 = mock(Condition.Callback.class); + final Condition.Callback callback1 = mock( + Condition.Callback.class); mCondition.addCallback(callback1); mCondition.fakeUpdateCondition(true); - final Condition.Callback callback2 = mock(Condition.Callback.class); + final Condition.Callback callback2 = mock( + Condition.Callback.class); mCondition.addCallback(callback2); verify(callback2).onConditionChanged(mCondition); assertThat(mCondition.isConditionMet()).isTrue(); @@ -80,7 +86,8 @@ public class ConditionTest extends SysuiTestCase { @Test public void removeCallback_removeLastCallback_triggerStop() { - final Condition.Callback callback = mock(Condition.Callback.class); + final Condition.Callback callback = mock( + Condition.Callback.class); mCondition.addCallback(callback); verify(mCondition, never()).stop(); @@ -92,7 +99,8 @@ public class ConditionTest extends SysuiTestCase { public void updateCondition_falseToTrue_reportTrue() { mCondition.fakeUpdateCondition(false); - final Condition.Callback callback = mock(Condition.Callback.class); + final Condition.Callback callback = mock( + Condition.Callback.class); mCondition.addCallback(callback); mCondition.fakeUpdateCondition(true); @@ -104,7 +112,8 @@ public class ConditionTest extends SysuiTestCase { public void updateCondition_trueToFalse_reportFalse() { mCondition.fakeUpdateCondition(true); - final Condition.Callback callback = mock(Condition.Callback.class); + final Condition.Callback callback = mock( + Condition.Callback.class); mCondition.addCallback(callback); mCondition.fakeUpdateCondition(false); @@ -116,7 +125,8 @@ public class ConditionTest extends SysuiTestCase { public void updateCondition_trueToTrue_reportNothing() { mCondition.fakeUpdateCondition(true); - final Condition.Callback callback = mock(Condition.Callback.class); + final Condition.Callback callback = mock( + Condition.Callback.class); mCondition.addCallback(callback); mCondition.fakeUpdateCondition(true); @@ -127,7 +137,8 @@ public class ConditionTest extends SysuiTestCase { public void updateCondition_falseToFalse_reportNothing() { mCondition.fakeUpdateCondition(false); - final Condition.Callback callback = mock(Condition.Callback.class); + final Condition.Callback callback = mock( + Condition.Callback.class); mCondition.addCallback(callback); mCondition.fakeUpdateCondition(false); @@ -149,7 +160,8 @@ public class ConditionTest extends SysuiTestCase { final Condition combinedCondition = mCondition.or( new FakeCondition(/* initialValue= */ false)); - final Condition.Callback callback = mock(Condition.Callback.class); + final Condition.Callback callback = mock( + Condition.Callback.class); combinedCondition.addCallback(callback); assertThat(combinedCondition.isConditionSet()).isTrue(); @@ -164,7 +176,8 @@ public class ConditionTest extends SysuiTestCase { final Condition combinedCondition = mCondition.or( new FakeCondition(/* initialValue= */ true)); - final Condition.Callback callback = mock(Condition.Callback.class); + final Condition.Callback callback = mock( + Condition.Callback.class); combinedCondition.addCallback(callback); assertThat(combinedCondition.isConditionSet()).isTrue(); @@ -179,7 +192,8 @@ public class ConditionTest extends SysuiTestCase { final Condition combinedCondition = mCondition.or( new FakeCondition(/* initialValue= */ true)); - final Condition.Callback callback = mock(Condition.Callback.class); + final Condition.Callback callback = mock( + Condition.Callback.class); combinedCondition.addCallback(callback); assertThat(combinedCondition.isConditionSet()).isTrue(); @@ -195,7 +209,8 @@ public class ConditionTest extends SysuiTestCase { final Condition combinedCondition = mCondition.or( new FakeCondition(/* initialValue= */ null)); - final Condition.Callback callback = mock(Condition.Callback.class); + final Condition.Callback callback = mock( + Condition.Callback.class); combinedCondition.addCallback(callback); assertThat(combinedCondition.isConditionSet()).isTrue(); @@ -211,7 +226,8 @@ public class ConditionTest extends SysuiTestCase { final Condition combinedCondition = mCondition.or( new FakeCondition(/* initialValue= */ null)); - final Condition.Callback callback = mock(Condition.Callback.class); + final Condition.Callback callback = mock( + Condition.Callback.class); combinedCondition.addCallback(callback); assertThat(combinedCondition.isConditionSet()).isFalse(); @@ -226,7 +242,8 @@ public class ConditionTest extends SysuiTestCase { final Condition combinedCondition = mCondition.and( new FakeCondition(/* initialValue= */ false)); - final Condition.Callback callback = mock(Condition.Callback.class); + final Condition.Callback callback = mock( + Condition.Callback.class); combinedCondition.addCallback(callback); assertThat(combinedCondition.isConditionSet()).isTrue(); @@ -241,7 +258,8 @@ public class ConditionTest extends SysuiTestCase { final Condition combinedCondition = mCondition.and( new FakeCondition(/* initialValue= */ true)); - final Condition.Callback callback = mock(Condition.Callback.class); + final Condition.Callback callback = mock( + Condition.Callback.class); combinedCondition.addCallback(callback); assertThat(combinedCondition.isConditionSet()).isTrue(); @@ -256,7 +274,8 @@ public class ConditionTest extends SysuiTestCase { final Condition combinedCondition = mCondition.and( new FakeCondition(/* initialValue= */ false)); - final Condition.Callback callback = mock(Condition.Callback.class); + final Condition.Callback callback = mock( + Condition.Callback.class); combinedCondition.addCallback(callback); assertThat(combinedCondition.isConditionSet()).isTrue(); @@ -272,7 +291,8 @@ public class ConditionTest extends SysuiTestCase { final Condition combinedCondition = mCondition.and( new FakeCondition(/* initialValue= */ null)); - final Condition.Callback callback = mock(Condition.Callback.class); + final Condition.Callback callback = mock( + Condition.Callback.class); combinedCondition.addCallback(callback); assertThat(combinedCondition.isConditionSet()).isFalse(); @@ -288,7 +308,8 @@ public class ConditionTest extends SysuiTestCase { final Condition combinedCondition = mCondition.and( new FakeCondition(/* initialValue= */ null)); - final Condition.Callback callback = mock(Condition.Callback.class); + final Condition.Callback callback = mock( + Condition.Callback.class); combinedCondition.addCallback(callback); assertThat(combinedCondition.isConditionSet()).isTrue(); diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/util/condition/FakeCondition.java b/packages/SystemUI/tests/src/com/android/systemui/shared/condition/FakeCondition.java similarity index 92% rename from packages/SystemUI/tests/utils/src/com/android/systemui/util/condition/FakeCondition.java rename to packages/SystemUI/tests/src/com/android/systemui/shared/condition/FakeCondition.java index 07ed1102e9907..55a6d39d46441 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/util/condition/FakeCondition.java +++ b/packages/SystemUI/tests/src/com/android/systemui/shared/condition/FakeCondition.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.systemui.util.condition; +package com.android.systemui.shared.condition; /** * Fake implementation of {@link Condition}, and provides a way for tests to update