Generalize Communal Conditions.
This changelist refactors the communal conditions logic into a general utility class that can be used in other contexts. Test: atest ConditionTest Test: atest ConditionMonitorTest Bug: 209197297 Change-Id: I265c4b275d259299982381267a028db8091089b1
This commit is contained in:
@@ -16,139 +16,27 @@
|
||||
|
||||
package com.android.systemui.communal.conditions;
|
||||
|
||||
|
||||
import static com.android.systemui.communal.dagger.CommunalModule.COMMUNAL_CONDITIONS;
|
||||
|
||||
import android.util.Log;
|
||||
|
||||
import com.android.internal.annotations.VisibleForTesting;
|
||||
import com.android.systemui.dagger.SysUISingleton;
|
||||
import com.android.systemui.statusbar.policy.CallbackController;
|
||||
import com.android.systemui.util.condition.Condition;
|
||||
import com.android.systemui.util.condition.Monitor;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.lang.ref.WeakReference;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.Set;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Named;
|
||||
|
||||
/**
|
||||
* {@link CommunalConditionsMonitor} takes in a set of conditions, monitors whether all of them have
|
||||
* been fulfilled, and informs any registered listeners.
|
||||
* A concrete implementation of {@Monitor} with conditions for monitoring when communal mode should
|
||||
* be enabled.
|
||||
*/
|
||||
@SysUISingleton
|
||||
public class CommunalConditionsMonitor implements
|
||||
CallbackController<CommunalConditionsMonitor.Callback> {
|
||||
private final String mTag = getClass().getSimpleName();
|
||||
|
||||
private final ArrayList<WeakReference<Callback>> mCallbacks = new ArrayList<>();
|
||||
|
||||
// Set of all conditions that need to be monitored.
|
||||
private final Set<CommunalCondition> mConditions;
|
||||
|
||||
// Map of values of each condition.
|
||||
private final HashMap<CommunalCondition, Boolean> mConditionsMap = new HashMap<>();
|
||||
|
||||
// Whether all conditions have been met.
|
||||
private boolean mAllConditionsMet = false;
|
||||
|
||||
// Whether the monitor has started listening for all the conditions.
|
||||
private boolean mHaveConditionsStarted = false;
|
||||
|
||||
// Callback for when each condition has been updated.
|
||||
private final CommunalCondition.Callback mConditionCallback = (condition, isConditionMet) -> {
|
||||
mConditionsMap.put(condition, isConditionMet);
|
||||
|
||||
final boolean newAllConditionsMet = !mConditionsMap.containsValue(false);
|
||||
|
||||
if (newAllConditionsMet == mAllConditionsMet) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (shouldLog()) Log.d(mTag, "all conditions met: " + newAllConditionsMet);
|
||||
mAllConditionsMet = newAllConditionsMet;
|
||||
|
||||
// Updates all callbacks.
|
||||
final Iterator<WeakReference<Callback>> iterator = mCallbacks.iterator();
|
||||
while (iterator.hasNext()) {
|
||||
final Callback callback = iterator.next().get();
|
||||
if (callback == null) {
|
||||
iterator.remove();
|
||||
} else {
|
||||
callback.onConditionsChanged(mAllConditionsMet);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
public class CommunalConditionsMonitor extends Monitor {
|
||||
@Inject
|
||||
public CommunalConditionsMonitor(
|
||||
@Named(COMMUNAL_CONDITIONS) Set<CommunalCondition> communalConditions) {
|
||||
mConditions = communalConditions;
|
||||
|
||||
// Initializes the conditions map and registers a callback for each condition.
|
||||
mConditions.forEach((condition -> mConditionsMap.put(condition, false)));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addCallback(@NotNull Callback callback) {
|
||||
if (shouldLog()) Log.d(mTag, "adding callback");
|
||||
mCallbacks.add(new WeakReference<>(callback));
|
||||
|
||||
// Updates the callback immediately.
|
||||
callback.onConditionsChanged(mAllConditionsMet);
|
||||
|
||||
if (!mHaveConditionsStarted) {
|
||||
if (shouldLog()) Log.d(mTag, "starting all conditions");
|
||||
mConditions.forEach(condition -> condition.addCallback(mConditionCallback));
|
||||
mHaveConditionsStarted = true;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeCallback(@NotNull Callback callback) {
|
||||
if (shouldLog()) Log.d(mTag, "removing callback");
|
||||
final Iterator<WeakReference<Callback>> iterator = mCallbacks.iterator();
|
||||
while (iterator.hasNext()) {
|
||||
final Callback cb = iterator.next().get();
|
||||
if (cb == null || cb == callback) {
|
||||
iterator.remove();
|
||||
}
|
||||
}
|
||||
|
||||
if (mCallbacks.isEmpty() && mHaveConditionsStarted) {
|
||||
if (shouldLog()) Log.d(mTag, "stopping all conditions");
|
||||
mConditions.forEach(condition -> condition.removeCallback(mConditionCallback));
|
||||
|
||||
mAllConditionsMet = false;
|
||||
mHaveConditionsStarted = false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Force updates each condition to the value provided.
|
||||
*/
|
||||
@VisibleForTesting
|
||||
public void overrideAllConditionsMet(boolean value) {
|
||||
mConditions.forEach(condition -> condition.updateCondition(value));
|
||||
}
|
||||
|
||||
private boolean shouldLog() {
|
||||
return Log.isLoggable(mTag, Log.DEBUG);
|
||||
}
|
||||
|
||||
/**
|
||||
* Callback that receives updates of whether all conditions have been fulfilled.
|
||||
*/
|
||||
public interface Callback {
|
||||
/**
|
||||
* Triggered when the fulfillment of all conditions have been met.
|
||||
*
|
||||
* @param allConditionsMet True if all conditions have been fulfilled. False if none or
|
||||
* only partial conditions have been fulfilled.
|
||||
*/
|
||||
void onConditionsChanged(boolean allConditionsMet);
|
||||
@Named(COMMUNAL_CONDITIONS) Set<Condition> communalConditions) {
|
||||
super(communalConditions);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,6 +23,7 @@ import android.provider.Settings;
|
||||
|
||||
import androidx.annotation.MainThread;
|
||||
|
||||
import com.android.systemui.util.condition.Condition;
|
||||
import com.android.systemui.util.settings.SecureSettings;
|
||||
|
||||
import javax.inject.Inject;
|
||||
@@ -30,7 +31,7 @@ import javax.inject.Inject;
|
||||
/**
|
||||
* Monitors the communal setting, and informs any listeners with updates.
|
||||
*/
|
||||
public class CommunalSettingCondition extends CommunalCondition {
|
||||
public class CommunalSettingCondition extends Condition {
|
||||
private final SecureSettings mSecureSettings;
|
||||
private final ContentObserver mCommunalSettingContentObserver;
|
||||
|
||||
|
||||
@@ -31,6 +31,7 @@ import android.util.Log;
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import com.android.systemui.dagger.qualifiers.Main;
|
||||
import com.android.systemui.util.condition.Condition;
|
||||
import com.android.systemui.util.settings.SecureSettings;
|
||||
|
||||
import java.util.Arrays;
|
||||
@@ -42,7 +43,7 @@ import javax.inject.Inject;
|
||||
* Monitors Wi-Fi connections and triggers callback, if any, when the device is connected to and
|
||||
* disconnected from a trusted network.
|
||||
*/
|
||||
public class CommunalTrustedNetworkCondition extends CommunalCondition {
|
||||
public class CommunalTrustedNetworkCondition extends Condition {
|
||||
private final String mTag = getClass().getSimpleName();
|
||||
private final ConnectivityManager mConnectivityManager;
|
||||
private final ContentObserver mTrustedNetworksObserver;
|
||||
|
||||
@@ -28,12 +28,12 @@ import androidx.annotation.Nullable;
|
||||
import com.android.systemui.R;
|
||||
import com.android.systemui.communal.CommunalSource;
|
||||
import com.android.systemui.communal.PackageObserver;
|
||||
import com.android.systemui.communal.conditions.CommunalCondition;
|
||||
import com.android.systemui.communal.conditions.CommunalSettingCondition;
|
||||
import com.android.systemui.dagger.qualifiers.Main;
|
||||
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 java.util.Collections;
|
||||
import java.util.HashSet;
|
||||
@@ -99,7 +99,7 @@ public interface CommunalModule {
|
||||
@Provides
|
||||
@ElementsIntoSet
|
||||
@Named(COMMUNAL_CONDITIONS)
|
||||
static Set<CommunalCondition> provideCommunalConditions(
|
||||
static Set<Condition> provideCommunalConditions(
|
||||
CommunalSettingCondition communalSettingCondition) {
|
||||
return new HashSet<>(Collections.singletonList(communalSettingCondition));
|
||||
}
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.android.systemui.communal.conditions;
|
||||
package com.android.systemui.util.condition;
|
||||
|
||||
import android.util.Log;
|
||||
|
||||
@@ -27,9 +27,10 @@ import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
|
||||
/**
|
||||
* Base class for a condition that needs to be fulfilled in order for Communal Mode to display.
|
||||
* Base class for a condition that needs to be fulfilled in order for {@link Monitor} to inform
|
||||
* its callbacks.
|
||||
*/
|
||||
public abstract class CommunalCondition implements CallbackController<CommunalCondition.Callback> {
|
||||
public abstract class Condition implements CallbackController<Condition.Callback> {
|
||||
private final String mTag = getClass().getSimpleName();
|
||||
|
||||
private final ArrayList<WeakReference<Callback>> mCallbacks = new ArrayList<>();
|
||||
@@ -125,6 +126,6 @@ public abstract class CommunalCondition implements CallbackController<CommunalCo
|
||||
* @param condition The condition in question.
|
||||
* @param isConditionMet True if the condition has been fulfilled. False otherwise.
|
||||
*/
|
||||
void onConditionChanged(CommunalCondition condition, boolean isConditionMet);
|
||||
void onConditionChanged(Condition condition, boolean isConditionMet);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,147 @@
|
||||
/*
|
||||
* Copyright (C) 2021 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.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.android.systemui.util.condition;
|
||||
|
||||
import android.util.Log;
|
||||
|
||||
import com.android.internal.annotations.VisibleForTesting;
|
||||
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;
|
||||
import java.util.Set;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
/**
|
||||
* {@link Monitor} takes in a set of conditions, monitors whether all of them have
|
||||
* been fulfilled, and informs any registered listeners.
|
||||
*/
|
||||
public class Monitor implements CallbackController<Monitor.Callback> {
|
||||
private final String mTag = getClass().getSimpleName();
|
||||
|
||||
private final ArrayList<WeakReference<Callback>> mCallbacks = new ArrayList<>();
|
||||
|
||||
// Set of all conditions that need to be monitored.
|
||||
private final Set<Condition> mConditions;
|
||||
|
||||
// Map of values of each condition.
|
||||
private final HashMap<Condition, Boolean> mConditionsMap = new HashMap<>();
|
||||
|
||||
// Whether all conditions have been met.
|
||||
private boolean mAllConditionsMet = false;
|
||||
|
||||
// Whether the monitor has started listening for all the conditions.
|
||||
private boolean mHaveConditionsStarted = false;
|
||||
|
||||
// Callback for when each condition has been updated.
|
||||
private final Condition.Callback mConditionCallback = (condition, isConditionMet) -> {
|
||||
mConditionsMap.put(condition, isConditionMet);
|
||||
|
||||
final boolean newAllConditionsMet = !mConditionsMap.containsValue(false);
|
||||
|
||||
if (newAllConditionsMet == mAllConditionsMet) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (shouldLog()) Log.d(mTag, "all conditions met: " + newAllConditionsMet);
|
||||
mAllConditionsMet = newAllConditionsMet;
|
||||
|
||||
// Updates all callbacks.
|
||||
final Iterator<WeakReference<Callback>> iterator = mCallbacks.iterator();
|
||||
while (iterator.hasNext()) {
|
||||
final Callback callback = iterator.next().get();
|
||||
if (callback == null) {
|
||||
iterator.remove();
|
||||
} else {
|
||||
callback.onConditionsChanged(mAllConditionsMet);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@Inject
|
||||
public Monitor(Set<Condition> conditions) {
|
||||
mConditions = conditions;
|
||||
|
||||
// Initializes the conditions map and registers a callback for each condition.
|
||||
mConditions.forEach((condition -> mConditionsMap.put(condition, false)));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addCallback(@NotNull Callback callback) {
|
||||
if (shouldLog()) Log.d(mTag, "adding callback");
|
||||
mCallbacks.add(new WeakReference<>(callback));
|
||||
|
||||
// Updates the callback immediately.
|
||||
callback.onConditionsChanged(mAllConditionsMet);
|
||||
|
||||
if (!mHaveConditionsStarted) {
|
||||
if (shouldLog()) Log.d(mTag, "starting all conditions");
|
||||
mConditions.forEach(condition -> condition.addCallback(mConditionCallback));
|
||||
mHaveConditionsStarted = true;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeCallback(@NotNull Callback callback) {
|
||||
if (shouldLog()) Log.d(mTag, "removing callback");
|
||||
final Iterator<WeakReference<Callback>> iterator = mCallbacks.iterator();
|
||||
while (iterator.hasNext()) {
|
||||
final Callback cb = iterator.next().get();
|
||||
if (cb == null || cb == callback) {
|
||||
iterator.remove();
|
||||
}
|
||||
}
|
||||
|
||||
if (mCallbacks.isEmpty() && mHaveConditionsStarted) {
|
||||
if (shouldLog()) Log.d(mTag, "stopping all conditions");
|
||||
mConditions.forEach(condition -> condition.removeCallback(mConditionCallback));
|
||||
|
||||
mAllConditionsMet = false;
|
||||
mHaveConditionsStarted = false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Force updates each condition to the value provided.
|
||||
*/
|
||||
@VisibleForTesting
|
||||
public void overrideAllConditionsMet(boolean value) {
|
||||
mConditions.forEach(condition -> condition.updateCondition(value));
|
||||
}
|
||||
|
||||
private boolean shouldLog() {
|
||||
return Log.isLoggable(mTag, Log.DEBUG);
|
||||
}
|
||||
|
||||
/**
|
||||
* Callback that receives updates of whether all conditions have been fulfilled.
|
||||
*/
|
||||
public interface Callback {
|
||||
/**
|
||||
* Triggered when the fulfillment of all conditions have been met.
|
||||
*
|
||||
* @param allConditionsMet True if all conditions have been fulfilled. False if none or
|
||||
* only partial conditions have been fulfilled.
|
||||
*/
|
||||
void onConditionsChanged(boolean allConditionsMet);
|
||||
}
|
||||
}
|
||||
@@ -31,8 +31,8 @@ import android.testing.AndroidTestingRunner;
|
||||
import androidx.test.filters.SmallTest;
|
||||
|
||||
import com.android.systemui.SysuiTestCase;
|
||||
import com.android.systemui.communal.conditions.CommunalCondition;
|
||||
import com.android.systemui.communal.conditions.CommunalSettingCondition;
|
||||
import com.android.systemui.util.condition.Condition;
|
||||
import com.android.systemui.util.settings.FakeSettings;
|
||||
import com.android.systemui.utils.os.FakeHandler;
|
||||
|
||||
@@ -57,7 +57,7 @@ public class CommunalSettingConditionTest extends SysuiTestCase {
|
||||
public void addCallback_communalSettingEnabled_immediatelyReportsTrue() {
|
||||
updateCommunalSetting(true);
|
||||
|
||||
final CommunalCondition.Callback callback = mock(CommunalCondition.Callback.class);
|
||||
final Condition.Callback callback = mock(Condition.Callback.class);
|
||||
mCondition.addCallback(callback);
|
||||
verify(callback).onConditionChanged(mCondition, true);
|
||||
}
|
||||
@@ -66,7 +66,7 @@ public class CommunalSettingConditionTest extends SysuiTestCase {
|
||||
public void addCallback_communalSettingDisabled_noReport() {
|
||||
updateCommunalSetting(false);
|
||||
|
||||
final CommunalCondition.Callback callback = mock(CommunalCondition.Callback.class);
|
||||
final Condition.Callback callback = mock(Condition.Callback.class);
|
||||
mCondition.addCallback(callback);
|
||||
verify(callback, never()).onConditionChanged(eq(mCondition), anyBoolean());
|
||||
}
|
||||
@@ -75,7 +75,7 @@ public class CommunalSettingConditionTest extends SysuiTestCase {
|
||||
public void updateCallback_communalSettingEnabled_reportsTrue() {
|
||||
updateCommunalSetting(false);
|
||||
|
||||
final CommunalCondition.Callback callback = mock(CommunalCondition.Callback.class);
|
||||
final Condition.Callback callback = mock(Condition.Callback.class);
|
||||
mCondition.addCallback(callback);
|
||||
clearInvocations(callback);
|
||||
|
||||
@@ -87,7 +87,7 @@ public class CommunalSettingConditionTest extends SysuiTestCase {
|
||||
public void updateCallback_communalSettingDisabled_reportsFalse() {
|
||||
updateCommunalSetting(true);
|
||||
|
||||
final CommunalCondition.Callback callback = mock(CommunalCondition.Callback.class);
|
||||
final Condition.Callback callback = mock(Condition.Callback.class);
|
||||
mCondition.addCallback(callback);
|
||||
clearInvocations(callback);
|
||||
|
||||
@@ -99,7 +99,7 @@ public class CommunalSettingConditionTest extends SysuiTestCase {
|
||||
public void updateCallback_communalSettingDidNotChange_neverReportDup() {
|
||||
updateCommunalSetting(true);
|
||||
|
||||
final CommunalCondition.Callback callback = mock(CommunalCondition.Callback.class);
|
||||
final Condition.Callback callback = mock(Condition.Callback.class);
|
||||
mCondition.addCallback(callback);
|
||||
clearInvocations(callback);
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.android.systemui.communal;
|
||||
package com.android.systemui.util.condition;
|
||||
|
||||
import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.Mockito.anyBoolean;
|
||||
@@ -30,8 +30,6 @@ import android.testing.AndroidTestingRunner;
|
||||
import androidx.test.filters.SmallTest;
|
||||
|
||||
import com.android.systemui.SysuiTestCase;
|
||||
import com.android.systemui.communal.conditions.CommunalCondition;
|
||||
import com.android.systemui.communal.conditions.CommunalConditionsMonitor;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
@@ -43,97 +41,97 @@ import java.util.HashSet;
|
||||
|
||||
@SmallTest
|
||||
@RunWith(AndroidTestingRunner.class)
|
||||
public class CommunalConditionsMonitorTest extends SysuiTestCase {
|
||||
private FakeCommunalCondition mCondition1;
|
||||
private FakeCommunalCondition mCondition2;
|
||||
private FakeCommunalCondition mCondition3;
|
||||
private HashSet<CommunalCondition> mConditions;
|
||||
public class ConditionMonitorTest extends SysuiTestCase {
|
||||
private FakeCondition mCondition1;
|
||||
private FakeCondition mCondition2;
|
||||
private FakeCondition mCondition3;
|
||||
private HashSet<Condition> mConditions;
|
||||
|
||||
private CommunalConditionsMonitor mCommunalConditionsMonitor;
|
||||
private Monitor mConditionMonitor;
|
||||
|
||||
@Before
|
||||
public void setup() {
|
||||
MockitoAnnotations.initMocks(this);
|
||||
|
||||
mCondition1 = spy(new FakeCommunalCondition());
|
||||
mCondition2 = spy(new FakeCommunalCondition());
|
||||
mCondition3 = spy(new FakeCommunalCondition());
|
||||
mCondition1 = spy(new FakeCondition());
|
||||
mCondition2 = spy(new FakeCondition());
|
||||
mCondition3 = spy(new FakeCondition());
|
||||
mConditions = new HashSet<>(Arrays.asList(mCondition1, mCondition2, mCondition3));
|
||||
|
||||
mCommunalConditionsMonitor = new CommunalConditionsMonitor(mConditions);
|
||||
mConditionMonitor = new Monitor(mConditions);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void addCallback_addFirstCallback_addCallbackToAllConditions() {
|
||||
final CommunalConditionsMonitor.Callback callback1 =
|
||||
mock(CommunalConditionsMonitor.Callback.class);
|
||||
mCommunalConditionsMonitor.addCallback(callback1);
|
||||
final Monitor.Callback callback1 =
|
||||
mock(Monitor.Callback.class);
|
||||
mConditionMonitor.addCallback(callback1);
|
||||
mConditions.forEach(condition -> verify(condition).addCallback(any()));
|
||||
|
||||
final CommunalConditionsMonitor.Callback callback2 =
|
||||
mock(CommunalConditionsMonitor.Callback.class);
|
||||
mCommunalConditionsMonitor.addCallback(callback2);
|
||||
final Monitor.Callback callback2 =
|
||||
mock(Monitor.Callback.class);
|
||||
mConditionMonitor.addCallback(callback2);
|
||||
mConditions.forEach(condition -> verify(condition, times(1)).addCallback(any()));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void addCallback_addFirstCallback_reportWithDefaultValue() {
|
||||
final CommunalConditionsMonitor.Callback callback =
|
||||
mock(CommunalConditionsMonitor.Callback.class);
|
||||
mCommunalConditionsMonitor.addCallback(callback);
|
||||
final Monitor.Callback callback =
|
||||
mock(Monitor.Callback.class);
|
||||
mConditionMonitor.addCallback(callback);
|
||||
verify(callback).onConditionsChanged(false);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void addCallback_addSecondCallback_reportWithExistingValue() {
|
||||
final CommunalConditionsMonitor.Callback callback1 =
|
||||
mock(CommunalConditionsMonitor.Callback.class);
|
||||
mCommunalConditionsMonitor.addCallback(callback1);
|
||||
final Monitor.Callback callback1 =
|
||||
mock(Monitor.Callback.class);
|
||||
mConditionMonitor.addCallback(callback1);
|
||||
|
||||
mCommunalConditionsMonitor.overrideAllConditionsMet(true);
|
||||
mConditionMonitor.overrideAllConditionsMet(true);
|
||||
|
||||
final CommunalConditionsMonitor.Callback callback2 =
|
||||
mock(CommunalConditionsMonitor.Callback.class);
|
||||
mCommunalConditionsMonitor.addCallback(callback2);
|
||||
final Monitor.Callback callback2 =
|
||||
mock(Monitor.Callback.class);
|
||||
mConditionMonitor.addCallback(callback2);
|
||||
verify(callback2).onConditionsChanged(true);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void removeCallback_shouldNoLongerReceiveUpdate() {
|
||||
final CommunalConditionsMonitor.Callback callback =
|
||||
mock(CommunalConditionsMonitor.Callback.class);
|
||||
mCommunalConditionsMonitor.addCallback(callback);
|
||||
final Monitor.Callback callback =
|
||||
mock(Monitor.Callback.class);
|
||||
mConditionMonitor.addCallback(callback);
|
||||
clearInvocations(callback);
|
||||
mCommunalConditionsMonitor.removeCallback(callback);
|
||||
mConditionMonitor.removeCallback(callback);
|
||||
|
||||
mCommunalConditionsMonitor.overrideAllConditionsMet(true);
|
||||
mConditionMonitor.overrideAllConditionsMet(true);
|
||||
verify(callback, never()).onConditionsChanged(true);
|
||||
|
||||
mCommunalConditionsMonitor.overrideAllConditionsMet(false);
|
||||
mConditionMonitor.overrideAllConditionsMet(false);
|
||||
verify(callback, never()).onConditionsChanged(false);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void removeCallback_removeLastCallback_removeCallbackFromAllConditions() {
|
||||
final CommunalConditionsMonitor.Callback callback1 =
|
||||
mock(CommunalConditionsMonitor.Callback.class);
|
||||
final CommunalConditionsMonitor.Callback callback2 =
|
||||
mock(CommunalConditionsMonitor.Callback.class);
|
||||
mCommunalConditionsMonitor.addCallback(callback1);
|
||||
mCommunalConditionsMonitor.addCallback(callback2);
|
||||
final Monitor.Callback callback1 =
|
||||
mock(Monitor.Callback.class);
|
||||
final Monitor.Callback callback2 =
|
||||
mock(Monitor.Callback.class);
|
||||
mConditionMonitor.addCallback(callback1);
|
||||
mConditionMonitor.addCallback(callback2);
|
||||
|
||||
mCommunalConditionsMonitor.removeCallback(callback1);
|
||||
mConditionMonitor.removeCallback(callback1);
|
||||
mConditions.forEach(condition -> verify(condition, never()).removeCallback(any()));
|
||||
|
||||
mCommunalConditionsMonitor.removeCallback(callback2);
|
||||
mConditionMonitor.removeCallback(callback2);
|
||||
mConditions.forEach(condition -> verify(condition).removeCallback(any()));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void updateCallbacks_allConditionsMet_reportTrue() {
|
||||
final CommunalConditionsMonitor.Callback callback =
|
||||
mock(CommunalConditionsMonitor.Callback.class);
|
||||
mCommunalConditionsMonitor.addCallback(callback);
|
||||
final Monitor.Callback callback =
|
||||
mock(Monitor.Callback.class);
|
||||
mConditionMonitor.addCallback(callback);
|
||||
clearInvocations(callback);
|
||||
|
||||
mCondition1.fakeUpdateCondition(true);
|
||||
@@ -145,9 +143,9 @@ public class CommunalConditionsMonitorTest extends SysuiTestCase {
|
||||
|
||||
@Test
|
||||
public void updateCallbacks_oneConditionStoppedMeeting_reportFalse() {
|
||||
final CommunalConditionsMonitor.Callback callback =
|
||||
mock(CommunalConditionsMonitor.Callback.class);
|
||||
mCommunalConditionsMonitor.addCallback(callback);
|
||||
final Monitor.Callback callback =
|
||||
mock(Monitor.Callback.class);
|
||||
mConditionMonitor.addCallback(callback);
|
||||
|
||||
mCondition1.fakeUpdateCondition(true);
|
||||
mCondition2.fakeUpdateCondition(true);
|
||||
@@ -160,9 +158,9 @@ public class CommunalConditionsMonitorTest extends SysuiTestCase {
|
||||
|
||||
@Test
|
||||
public void updateCallbacks_shouldOnlyUpdateWhenValueChanges() {
|
||||
final CommunalConditionsMonitor.Callback callback =
|
||||
mock(CommunalConditionsMonitor.Callback.class);
|
||||
mCommunalConditionsMonitor.addCallback(callback);
|
||||
final Monitor.Callback callback =
|
||||
mock(Monitor.Callback.class);
|
||||
mConditionMonitor.addCallback(callback);
|
||||
verify(callback).onConditionsChanged(false);
|
||||
clearInvocations(callback);
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.android.systemui.communal;
|
||||
package com.android.systemui.util.condition;
|
||||
|
||||
import static org.mockito.ArgumentMatchers.anyBoolean;
|
||||
import static org.mockito.ArgumentMatchers.eq;
|
||||
@@ -29,7 +29,6 @@ import android.testing.AndroidTestingRunner;
|
||||
import androidx.test.filters.SmallTest;
|
||||
|
||||
import com.android.systemui.SysuiTestCase;
|
||||
import com.android.systemui.communal.conditions.CommunalCondition;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
@@ -37,26 +36,26 @@ import org.junit.runner.RunWith;
|
||||
|
||||
@SmallTest
|
||||
@RunWith(AndroidTestingRunner.class)
|
||||
public class CommunalConditionTest extends SysuiTestCase {
|
||||
private FakeCommunalCondition mCondition;
|
||||
public class ConditionTest extends SysuiTestCase {
|
||||
private FakeCondition mCondition;
|
||||
|
||||
@Before
|
||||
public void setup() {
|
||||
mCondition = spy(new FakeCommunalCondition());
|
||||
mCondition = spy(new FakeCondition());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void addCallback_addFirstCallback_triggerStart() {
|
||||
final CommunalCondition.Callback callback = mock(CommunalCondition.Callback.class);
|
||||
final Condition.Callback callback = mock(Condition.Callback.class);
|
||||
mCondition.addCallback(callback);
|
||||
verify(mCondition).start();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void addCallback_addMultipleCallbacks_triggerStartOnlyOnce() {
|
||||
final CommunalCondition.Callback callback1 = mock(CommunalCondition.Callback.class);
|
||||
final CommunalCondition.Callback callback2 = mock(CommunalCondition.Callback.class);
|
||||
final CommunalCondition.Callback callback3 = mock(CommunalCondition.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,19 +66,19 @@ public class CommunalConditionTest extends SysuiTestCase {
|
||||
|
||||
@Test
|
||||
public void addCallback_alreadyStarted_triggerUpdate() {
|
||||
final CommunalCondition.Callback callback1 = mock(CommunalCondition.Callback.class);
|
||||
final Condition.Callback callback1 = mock(Condition.Callback.class);
|
||||
mCondition.addCallback(callback1);
|
||||
|
||||
mCondition.fakeUpdateCondition(true);
|
||||
|
||||
final CommunalCondition.Callback callback2 = mock(CommunalCondition.Callback.class);
|
||||
final Condition.Callback callback2 = mock(Condition.Callback.class);
|
||||
mCondition.addCallback(callback2);
|
||||
verify(callback2).onConditionChanged(mCondition, true);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void removeCallback_removeLastCallback_triggerStop() {
|
||||
final CommunalCondition.Callback callback = mock(CommunalCondition.Callback.class);
|
||||
final Condition.Callback callback = mock(Condition.Callback.class);
|
||||
mCondition.addCallback(callback);
|
||||
verify(mCondition, never()).stop();
|
||||
|
||||
@@ -91,7 +90,7 @@ public class CommunalConditionTest extends SysuiTestCase {
|
||||
public void updateCondition_falseToTrue_reportTrue() {
|
||||
mCondition.fakeUpdateCondition(false);
|
||||
|
||||
final CommunalCondition.Callback callback = mock(CommunalCondition.Callback.class);
|
||||
final Condition.Callback callback = mock(Condition.Callback.class);
|
||||
mCondition.addCallback(callback);
|
||||
|
||||
mCondition.fakeUpdateCondition(true);
|
||||
@@ -102,7 +101,7 @@ public class CommunalConditionTest extends SysuiTestCase {
|
||||
public void updateCondition_trueToFalse_reportFalse() {
|
||||
mCondition.fakeUpdateCondition(true);
|
||||
|
||||
final CommunalCondition.Callback callback = mock(CommunalCondition.Callback.class);
|
||||
final Condition.Callback callback = mock(Condition.Callback.class);
|
||||
mCondition.addCallback(callback);
|
||||
|
||||
mCondition.fakeUpdateCondition(false);
|
||||
@@ -113,7 +112,7 @@ public class CommunalConditionTest extends SysuiTestCase {
|
||||
public void updateCondition_trueToTrue_reportNothing() {
|
||||
mCondition.fakeUpdateCondition(true);
|
||||
|
||||
final CommunalCondition.Callback callback = mock(CommunalCondition.Callback.class);
|
||||
final Condition.Callback callback = mock(Condition.Callback.class);
|
||||
mCondition.addCallback(callback);
|
||||
|
||||
mCondition.fakeUpdateCondition(true);
|
||||
@@ -124,7 +123,7 @@ public class CommunalConditionTest extends SysuiTestCase {
|
||||
public void updateCondition_falseToFalse_reportNothing() {
|
||||
mCondition.fakeUpdateCondition(false);
|
||||
|
||||
final CommunalCondition.Callback callback = mock(CommunalCondition.Callback.class);
|
||||
final Condition.Callback callback = mock(Condition.Callback.class);
|
||||
mCondition.addCallback(callback);
|
||||
|
||||
mCondition.fakeUpdateCondition(false);
|
||||
@@ -14,15 +14,13 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.android.systemui.communal;
|
||||
|
||||
import com.android.systemui.communal.conditions.CommunalCondition;
|
||||
package com.android.systemui.util.condition;
|
||||
|
||||
/**
|
||||
* Fake implementation of {@link CommunalCondition}, and provides a way for tests to update
|
||||
* Fake implementation of {@link Condition}, and provides a way for tests to update
|
||||
* condition fulfillment.
|
||||
*/
|
||||
public class FakeCommunalCondition extends CommunalCondition {
|
||||
public class FakeCondition extends Condition {
|
||||
@Override
|
||||
public void start() {}
|
||||
|
||||
Reference in New Issue
Block a user