diff --git a/packages/SystemUI/src/com/android/systemui/communal/CommunalSourceMonitor.java b/packages/SystemUI/src/com/android/systemui/communal/CommunalSourceMonitor.java index 4aa46f1813dca..58cf35f2917c0 100644 --- a/packages/SystemUI/src/com/android/systemui/communal/CommunalSourceMonitor.java +++ b/packages/SystemUI/src/com/android/systemui/communal/CommunalSourceMonitor.java @@ -16,12 +16,14 @@ package com.android.systemui.communal; +import static com.android.systemui.communal.dagger.CommunalModule.COMMUNAL_CONDITIONS; + import android.util.Log; import com.android.internal.annotations.VisibleForTesting; -import com.android.systemui.communal.conditions.CommunalConditionsMonitor; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.Main; +import com.android.systemui.util.condition.Monitor; import com.google.android.collect.Lists; @@ -31,6 +33,7 @@ import java.util.Iterator; import java.util.concurrent.Executor; import javax.inject.Inject; +import javax.inject.Named; /** * A Monitor for reporting a {@link CommunalSource} presence. @@ -42,7 +45,7 @@ public class CommunalSourceMonitor { // A list of {@link Callback} that have registered to receive updates. private final ArrayList> mCallbacks = Lists.newArrayList(); - private final CommunalConditionsMonitor mConditionsMonitor; + private final Monitor mConditionsMonitor; private final Executor mExecutor; private CommunalSource mCurrentSource; @@ -53,7 +56,7 @@ public class CommunalSourceMonitor { // Whether the class is currently listening for condition changes. private boolean mListeningForConditions = false; - private final CommunalConditionsMonitor.Callback mConditionsCallback = + private final Monitor.Callback mConditionsCallback = allConditionsMet -> { if (mAllCommunalConditionsMet != allConditionsMet) { if (DEBUG) Log.d(TAG, "communal conditions changed: " + allConditionsMet); @@ -66,7 +69,7 @@ public class CommunalSourceMonitor { @VisibleForTesting @Inject public CommunalSourceMonitor(@Main Executor executor, - CommunalConditionsMonitor communalConditionsMonitor) { + @Named(COMMUNAL_CONDITIONS) Monitor communalConditionsMonitor) { mExecutor = executor; mConditionsMonitor = communalConditionsMonitor; } diff --git a/packages/SystemUI/src/com/android/systemui/communal/dagger/CommunalModule.java b/packages/SystemUI/src/com/android/systemui/communal/dagger/CommunalModule.java index f27ae344eb24d..e1f1ac42884d5 100644 --- a/packages/SystemUI/src/com/android/systemui/communal/dagger/CommunalModule.java +++ b/packages/SystemUI/src/com/android/systemui/communal/dagger/CommunalModule.java @@ -34,6 +34,8 @@ import com.android.systemui.idle.AmbientLightModeMonitor; import com.android.systemui.idle.LightSensorEventsDebounceAlgorithm; import com.android.systemui.idle.dagger.IdleViewComponent; import com.android.systemui.util.condition.Condition; +import com.android.systemui.util.condition.Monitor; +import com.android.systemui.util.condition.dagger.MonitorComponent; import java.util.Collections; import java.util.HashSet; @@ -135,4 +137,14 @@ public interface CommunalModule { return Optional.empty(); } } + + /** */ + @Provides + @Named(COMMUNAL_CONDITIONS) + static Monitor provideCommunalSourceMonitor( + @Named(COMMUNAL_CONDITIONS) Set communalConditions, + MonitorComponent.Factory factory) { + final MonitorComponent component = factory.create(communalConditions, new HashSet<>()); + return component.getMonitor(); + } } diff --git a/packages/SystemUI/src/com/android/systemui/util/condition/Monitor.java b/packages/SystemUI/src/com/android/systemui/util/condition/Monitor.java index a7e9cdbf1a180..8b6e982be55bf 100644 --- a/packages/SystemUI/src/com/android/systemui/util/condition/Monitor.java +++ b/packages/SystemUI/src/com/android/systemui/util/condition/Monitor.java @@ -23,7 +23,6 @@ import com.android.systemui.statusbar.policy.CallbackController; import org.jetbrains.annotations.NotNull; -import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; @@ -38,7 +37,7 @@ import javax.inject.Inject; public class Monitor implements CallbackController { private final String mTag = getClass().getSimpleName(); - private final ArrayList> mCallbacks = new ArrayList<>(); + private final ArrayList mCallbacks = new ArrayList<>(); // Set of all conditions that need to be monitored. private final Set mConditions; @@ -66,9 +65,9 @@ public class Monitor implements CallbackController { mAllConditionsMet = newAllConditionsMet; // Updates all callbacks. - final Iterator> iterator = mCallbacks.iterator(); + final Iterator iterator = mCallbacks.iterator(); while (iterator.hasNext()) { - final Callback callback = iterator.next().get(); + final Callback callback = iterator.next(); if (callback == null) { iterator.remove(); } else { @@ -78,7 +77,7 @@ public class Monitor implements CallbackController { }; @Inject - public Monitor(Set conditions) { + public Monitor(Set conditions, Set callbacks) { mConditions = conditions; // If there is no condition, give green pass. @@ -89,12 +88,20 @@ public class Monitor implements CallbackController { // Initializes the conditions map and registers a callback for each condition. mConditions.forEach((condition -> mConditionsMap.put(condition, false))); + + if (callbacks == null) { + return; + } + + for (Callback callback : callbacks) { + addCallback(callback); + } } @Override public void addCallback(@NotNull Callback callback) { if (shouldLog()) Log.d(mTag, "adding callback"); - mCallbacks.add(new WeakReference<>(callback)); + mCallbacks.add(callback); // Updates the callback immediately. callback.onConditionsChanged(mAllConditionsMet); @@ -109,9 +116,9 @@ public class Monitor implements CallbackController { @Override public void removeCallback(@NotNull Callback callback) { if (shouldLog()) Log.d(mTag, "removing callback"); - final Iterator> iterator = mCallbacks.iterator(); + final Iterator iterator = mCallbacks.iterator(); while (iterator.hasNext()) { - final Callback cb = iterator.next().get(); + final Callback cb = iterator.next(); if (cb == null || cb == callback) { iterator.remove(); } diff --git a/packages/SystemUI/src/com/android/systemui/communal/conditions/CommunalConditionsMonitor.java b/packages/SystemUI/src/com/android/systemui/util/condition/dagger/MonitorComponent.java similarity index 56% rename from packages/SystemUI/src/com/android/systemui/communal/conditions/CommunalConditionsMonitor.java rename to packages/SystemUI/src/com/android/systemui/util/condition/dagger/MonitorComponent.java index 1197816e24d29..fc67973fe2788 100644 --- a/packages/SystemUI/src/com/android/systemui/communal/conditions/CommunalConditionsMonitor.java +++ b/packages/SystemUI/src/com/android/systemui/util/condition/dagger/MonitorComponent.java @@ -14,29 +14,33 @@ * limitations under the License. */ -package com.android.systemui.communal.conditions; +package com.android.systemui.util.condition.dagger; - -import static com.android.systemui.communal.dagger.CommunalModule.COMMUNAL_CONDITIONS; - -import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.util.condition.Condition; import com.android.systemui.util.condition.Monitor; import java.util.Set; -import javax.inject.Inject; -import javax.inject.Named; +import dagger.BindsInstance; +import dagger.Subcomponent; /** - * A concrete implementation of {@Monitor} with conditions for monitoring when communal mode should - * be enabled. + * Component for {@link Monitor}. */ -@SysUISingleton -public class CommunalConditionsMonitor extends Monitor { - @Inject - public CommunalConditionsMonitor( - @Named(COMMUNAL_CONDITIONS) Set communalConditions) { - super(communalConditions); +@Subcomponent +public interface MonitorComponent { + /** + * Factory for {@link MonitorComponent}. + */ + @Subcomponent.Factory + interface Factory { + MonitorComponent create(@BindsInstance Set conditions, + @BindsInstance Set callbacks); } + + /** + * Provides {@link Monitor}. + * @return + */ + Monitor getMonitor(); } diff --git a/packages/SystemUI/src/com/android/systemui/util/dagger/UtilModule.java b/packages/SystemUI/src/com/android/systemui/util/dagger/UtilModule.java index 981bf01164e3d..7892d6eec98d1 100644 --- a/packages/SystemUI/src/com/android/systemui/util/dagger/UtilModule.java +++ b/packages/SystemUI/src/com/android/systemui/util/dagger/UtilModule.java @@ -18,6 +18,7 @@ package com.android.systemui.util.dagger; import com.android.systemui.util.RingerModeTracker; import com.android.systemui.util.RingerModeTrackerImpl; +import com.android.systemui.util.condition.dagger.MonitorComponent; import com.android.systemui.util.wrapper.UtilWrapperModule; import dagger.Binds; @@ -26,6 +27,9 @@ import dagger.Module; /** Dagger Module for code in the util package. */ @Module(includes = { UtilWrapperModule.class + }, + subcomponents = { + MonitorComponent.class, }) public interface UtilModule { /** */ diff --git a/packages/SystemUI/tests/src/com/android/systemui/communal/CommunalManagerUpdaterTest.java b/packages/SystemUI/tests/src/com/android/systemui/communal/CommunalManagerUpdaterTest.java index 9a9b7c4f62eb7..4a29ada8a9986 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/communal/CommunalManagerUpdaterTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/communal/CommunalManagerUpdaterTest.java @@ -28,8 +28,8 @@ import android.testing.AndroidTestingRunner; import androidx.test.filters.SmallTest; import com.android.systemui.SysuiTestCase; -import com.android.systemui.communal.conditions.CommunalConditionsMonitor; import com.android.systemui.util.concurrency.FakeExecutor; +import com.android.systemui.util.condition.Monitor; import com.android.systemui.util.time.FakeSystemClock; import org.junit.Before; @@ -45,7 +45,7 @@ public class CommunalManagerUpdaterTest extends SysuiTestCase { @Mock private CommunalManager mCommunalManager; @Mock - private CommunalConditionsMonitor mCommunalConditionsMonitor; + private Monitor mCommunalConditionsMonitor; private FakeExecutor mExecutor = new FakeExecutor(new FakeSystemClock()); @@ -55,7 +55,7 @@ public class CommunalManagerUpdaterTest extends SysuiTestCase { mContext.addMockSystemService(CommunalManager.class, mCommunalManager); doAnswer(invocation -> { - final CommunalConditionsMonitor.Callback callback = invocation.getArgument(0); + final Monitor.Callback callback = invocation.getArgument(0); callback.onConditionsChanged(true); return null; }).when(mCommunalConditionsMonitor).addCallback(any()); diff --git a/packages/SystemUI/tests/src/com/android/systemui/communal/CommunalSourceMonitorTest.java b/packages/SystemUI/tests/src/com/android/systemui/communal/CommunalSourceMonitorTest.java index 409dd940ceb6d..df1cc766d162c 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/communal/CommunalSourceMonitorTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/communal/CommunalSourceMonitorTest.java @@ -31,8 +31,8 @@ import android.testing.TestableLooper; import androidx.test.filters.SmallTest; import com.android.systemui.SysuiTestCase; -import com.android.systemui.communal.conditions.CommunalConditionsMonitor; import com.android.systemui.util.concurrency.FakeExecutor; +import com.android.systemui.util.condition.Monitor; import com.android.systemui.util.time.FakeSystemClock; import org.junit.Before; @@ -49,9 +49,9 @@ import java.lang.ref.WeakReference; @RunWith(AndroidTestingRunner.class) @TestableLooper.RunWithLooper public class CommunalSourceMonitorTest extends SysuiTestCase { - @Mock private CommunalConditionsMonitor mCommunalConditionsMonitor; + @Mock private Monitor mCommunalConditionsMonitor; - @Captor private ArgumentCaptor mConditionsCallbackCaptor; + @Captor private ArgumentCaptor mConditionsCallbackCaptor; private CommunalSourceMonitor mCommunalSourceMonitor; private FakeExecutor mExecutor = new FakeExecutor(new FakeSystemClock()); @@ -156,7 +156,7 @@ public class CommunalSourceMonitorTest extends SysuiTestCase { private void setConditionsMet(boolean value) { mExecutor.runAllReady(); verify(mCommunalConditionsMonitor).addCallback(mConditionsCallbackCaptor.capture()); - final CommunalConditionsMonitor.Callback conditionsCallback = + final Monitor.Callback conditionsCallback = mConditionsCallbackCaptor.getValue(); conditionsCallback.onConditionsChanged(value); mExecutor.runAllReady(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/util/condition/ConditionMonitorTest.java b/packages/SystemUI/tests/src/com/android/systemui/util/condition/ConditionMonitorTest.java index 878bdeac43c98..d6454490e62a0 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/util/condition/ConditionMonitorTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/util/condition/ConditionMonitorTest.java @@ -58,7 +58,7 @@ public class ConditionMonitorTest extends SysuiTestCase { mCondition3 = spy(new FakeCondition()); mConditions = new HashSet<>(Arrays.asList(mCondition1, mCondition2, mCondition3)); - mConditionMonitor = new Monitor(mConditions); + mConditionMonitor = new Monitor(mConditions, null /*callbacks*/); } @Test @@ -98,7 +98,7 @@ public class ConditionMonitorTest extends SysuiTestCase { @Test public void addCallback_noConditions_reportAllConditionsMet() { - final Monitor monitor = new Monitor(new HashSet<>()); + final Monitor monitor = new Monitor(new HashSet<>(), null /*callbacks*/); final Monitor.Callback callback = mock(Monitor.Callback.class); monitor.addCallback(callback);