Loading services/core/java/com/android/server/notification/ConditionProviders.java +17 −1 Original line number Diff line number Diff line Loading @@ -16,6 +16,9 @@ package com.android.server.notification; import static android.service.notification.Condition.STATE_TRUE; import static android.service.notification.ZenModeConfig.UPDATE_ORIGIN_USER; import android.app.INotificationManager; import android.app.NotificationManager; import android.content.ComponentName; Loading Loading @@ -319,8 +322,21 @@ public class ConditionProviders extends ManagedServices { final Condition c = conditions[i]; final ConditionRecord r = getRecordLocked(c.id, info.component, true /*create*/); r.info = info; if (android.app.Flags.modesUi()) { // if user turned on the mode, ignore the update unless the app also wants the // mode on. this will update the origin of the mode and let the owner turn it // off when the context ends if (r.condition != null && r.condition.source == UPDATE_ORIGIN_USER) { if (r.condition.state == STATE_TRUE && c.state == STATE_TRUE) { r.condition = c; } } else { r.condition = c; } } else { r.condition = c; } } } final int N = conditions.length; for (int i = 0; i < N; i++) { Loading services/tests/uiservicestests/src/com/android/server/notification/ConditionProvidersTest.java +74 −11 Original line number Diff line number Diff line Loading @@ -16,6 +16,10 @@ package com.android.server.notification; import static android.service.notification.Condition.SOURCE_USER_ACTION; import static android.service.notification.Condition.STATE_FALSE; import static android.service.notification.Condition.STATE_TRUE; import static com.google.common.truth.Truth.assertThat; import static junit.framework.Assert.assertEquals; Loading @@ -27,16 +31,20 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; import android.app.Flags; import android.content.ComponentName; import android.content.ServiceConnection; import android.content.pm.IPackageManager; import android.net.Uri; import android.os.IInterface; import android.platform.test.annotations.EnableFlags; import android.platform.test.flag.junit.SetFlagsRule; import android.service.notification.Condition; import com.android.server.UiServiceTestCase; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.mockito.Mock; import org.mockito.MockitoAnnotations; Loading @@ -52,6 +60,10 @@ public class ConditionProvidersTest extends UiServiceTestCase { @Mock private ConditionProviders.Callback mCallback; @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule( SetFlagsRule.DefaultInitValueType.DEVICE_DEFAULT); @Before public void setUp() { MockitoAnnotations.initMocks(this); Loading @@ -67,8 +79,8 @@ public class ConditionProvidersTest extends UiServiceTestCase { ManagedServices.ManagedServiceInfo msi = mProviders.new ManagedServiceInfo( mock(IInterface.class), cn, 0, false, mock(ServiceConnection.class), 33, 100); Condition[] conditions = new Condition[] { new Condition(Uri.parse("a"), "summary", Condition.STATE_TRUE), new Condition(Uri.parse("b"), "summary2", Condition.STATE_TRUE) new Condition(Uri.parse("a"), "summary", STATE_TRUE), new Condition(Uri.parse("b"), "summary2", STATE_TRUE) }; mProviders.notifyConditions("package", msi, conditions); Loading @@ -85,9 +97,9 @@ public class ConditionProvidersTest extends UiServiceTestCase { mock(IInterface.class), new ComponentName("package", "cls"), 0, false, mock(ServiceConnection.class), 33, 100); Condition[] conditionsToNotify = new Condition[] { new Condition(Uri.parse("a"), "summary", Condition.STATE_TRUE), new Condition(Uri.parse("b"), "summary2", Condition.STATE_TRUE), new Condition(Uri.parse("c"), "summary3", Condition.STATE_TRUE) new Condition(Uri.parse("a"), "summary", STATE_TRUE), new Condition(Uri.parse("b"), "summary2", STATE_TRUE), new Condition(Uri.parse("c"), "summary3", STATE_TRUE) }; mProviders.notifyConditions("package", msi, conditionsToNotify); Loading @@ -104,10 +116,10 @@ public class ConditionProvidersTest extends UiServiceTestCase { mock(IInterface.class), new ComponentName("package", "cls"), 0, false, mock(ServiceConnection.class), 33, 100); Condition[] conditionsToNotify = new Condition[] { new Condition(Uri.parse("a"), "summary", Condition.STATE_TRUE), new Condition(Uri.parse("b"), "summary2", Condition.STATE_TRUE), new Condition(Uri.parse("a"), "summary3", Condition.STATE_FALSE), new Condition(Uri.parse("a"), "summary4", Condition.STATE_FALSE) new Condition(Uri.parse("a"), "summary", STATE_TRUE), new Condition(Uri.parse("b"), "summary2", STATE_TRUE), new Condition(Uri.parse("a"), "summary3", STATE_FALSE), new Condition(Uri.parse("a"), "summary4", STATE_FALSE) }; mProviders.notifyConditions("package", msi, conditionsToNotify); Loading @@ -124,10 +136,10 @@ public class ConditionProvidersTest extends UiServiceTestCase { mock(IInterface.class), new ComponentName("package", "cls"), 0, false, mock(ServiceConnection.class), 33, 100); Condition[] conditionsToNotify = new Condition[] { new Condition(Uri.parse("a"), "summary", Condition.STATE_TRUE), new Condition(Uri.parse("a"), "summary", STATE_TRUE), null, null, new Condition(Uri.parse("b"), "summary", Condition.STATE_TRUE) new Condition(Uri.parse("b"), "summary", STATE_TRUE) }; mProviders.notifyConditions("package", msi, conditionsToNotify); Loading @@ -137,6 +149,57 @@ public class ConditionProvidersTest extends UiServiceTestCase { verifyNoMoreInteractions(mCallback); } @Test @EnableFlags(Flags.FLAG_MODES_UI) public void notifyConditions_appCannotUndoUserEnablement() { ManagedServices.ManagedServiceInfo msi = mProviders.new ManagedServiceInfo( mock(IInterface.class), new ComponentName("package", "cls"), 0, false, mock(ServiceConnection.class), 33, 100); // First, user enabled mode Condition[] userConditions = new Condition[] { new Condition(Uri.parse("a"), "summary", STATE_TRUE, SOURCE_USER_ACTION) }; mProviders.notifyConditions("package", msi, userConditions); verify(mCallback).onConditionChanged(eq(Uri.parse("a")), eq(userConditions[0])); // Second, app tries to disable it, but cannot Condition[] appConditions = new Condition[] { new Condition(Uri.parse("a"), "summary", STATE_FALSE) }; mProviders.notifyConditions("package", msi, appConditions); verify(mCallback).onConditionChanged(eq(Uri.parse("a")), eq(userConditions[0])); } @Test @EnableFlags(Flags.FLAG_MODES_UI) public void notifyConditions_appCanTakeoverUserEnablement() { ManagedServices.ManagedServiceInfo msi = mProviders.new ManagedServiceInfo( mock(IInterface.class), new ComponentName("package", "cls"), 0, false, mock(ServiceConnection.class), 33, 100); // First, user enabled mode Condition[] userConditions = new Condition[] { new Condition(Uri.parse("a"), "summary", STATE_TRUE, SOURCE_USER_ACTION) }; mProviders.notifyConditions("package", msi, userConditions); verify(mCallback).onConditionChanged(eq(Uri.parse("a")), eq(userConditions[0])); // Second, app now thinks the rule should be on due it its intelligence Condition[] appConditions = new Condition[] { new Condition(Uri.parse("a"), "summary", STATE_TRUE) }; mProviders.notifyConditions("package", msi, appConditions); verify(mCallback).onConditionChanged(eq(Uri.parse("a")), eq(appConditions[0])); // Lastly, app can turn rule off when its intelligence think it should be off appConditions = new Condition[] { new Condition(Uri.parse("a"), "summary", STATE_FALSE) }; mProviders.notifyConditions("package", msi, appConditions); verify(mCallback).onConditionChanged(eq(Uri.parse("a")), eq(appConditions[0])); verifyNoMoreInteractions(mCallback); } @Test public void testRemoveDefaultFromConfig() { final int userId = 0; Loading Loading
services/core/java/com/android/server/notification/ConditionProviders.java +17 −1 Original line number Diff line number Diff line Loading @@ -16,6 +16,9 @@ package com.android.server.notification; import static android.service.notification.Condition.STATE_TRUE; import static android.service.notification.ZenModeConfig.UPDATE_ORIGIN_USER; import android.app.INotificationManager; import android.app.NotificationManager; import android.content.ComponentName; Loading Loading @@ -319,8 +322,21 @@ public class ConditionProviders extends ManagedServices { final Condition c = conditions[i]; final ConditionRecord r = getRecordLocked(c.id, info.component, true /*create*/); r.info = info; if (android.app.Flags.modesUi()) { // if user turned on the mode, ignore the update unless the app also wants the // mode on. this will update the origin of the mode and let the owner turn it // off when the context ends if (r.condition != null && r.condition.source == UPDATE_ORIGIN_USER) { if (r.condition.state == STATE_TRUE && c.state == STATE_TRUE) { r.condition = c; } } else { r.condition = c; } } else { r.condition = c; } } } final int N = conditions.length; for (int i = 0; i < N; i++) { Loading
services/tests/uiservicestests/src/com/android/server/notification/ConditionProvidersTest.java +74 −11 Original line number Diff line number Diff line Loading @@ -16,6 +16,10 @@ package com.android.server.notification; import static android.service.notification.Condition.SOURCE_USER_ACTION; import static android.service.notification.Condition.STATE_FALSE; import static android.service.notification.Condition.STATE_TRUE; import static com.google.common.truth.Truth.assertThat; import static junit.framework.Assert.assertEquals; Loading @@ -27,16 +31,20 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; import android.app.Flags; import android.content.ComponentName; import android.content.ServiceConnection; import android.content.pm.IPackageManager; import android.net.Uri; import android.os.IInterface; import android.platform.test.annotations.EnableFlags; import android.platform.test.flag.junit.SetFlagsRule; import android.service.notification.Condition; import com.android.server.UiServiceTestCase; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.mockito.Mock; import org.mockito.MockitoAnnotations; Loading @@ -52,6 +60,10 @@ public class ConditionProvidersTest extends UiServiceTestCase { @Mock private ConditionProviders.Callback mCallback; @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule( SetFlagsRule.DefaultInitValueType.DEVICE_DEFAULT); @Before public void setUp() { MockitoAnnotations.initMocks(this); Loading @@ -67,8 +79,8 @@ public class ConditionProvidersTest extends UiServiceTestCase { ManagedServices.ManagedServiceInfo msi = mProviders.new ManagedServiceInfo( mock(IInterface.class), cn, 0, false, mock(ServiceConnection.class), 33, 100); Condition[] conditions = new Condition[] { new Condition(Uri.parse("a"), "summary", Condition.STATE_TRUE), new Condition(Uri.parse("b"), "summary2", Condition.STATE_TRUE) new Condition(Uri.parse("a"), "summary", STATE_TRUE), new Condition(Uri.parse("b"), "summary2", STATE_TRUE) }; mProviders.notifyConditions("package", msi, conditions); Loading @@ -85,9 +97,9 @@ public class ConditionProvidersTest extends UiServiceTestCase { mock(IInterface.class), new ComponentName("package", "cls"), 0, false, mock(ServiceConnection.class), 33, 100); Condition[] conditionsToNotify = new Condition[] { new Condition(Uri.parse("a"), "summary", Condition.STATE_TRUE), new Condition(Uri.parse("b"), "summary2", Condition.STATE_TRUE), new Condition(Uri.parse("c"), "summary3", Condition.STATE_TRUE) new Condition(Uri.parse("a"), "summary", STATE_TRUE), new Condition(Uri.parse("b"), "summary2", STATE_TRUE), new Condition(Uri.parse("c"), "summary3", STATE_TRUE) }; mProviders.notifyConditions("package", msi, conditionsToNotify); Loading @@ -104,10 +116,10 @@ public class ConditionProvidersTest extends UiServiceTestCase { mock(IInterface.class), new ComponentName("package", "cls"), 0, false, mock(ServiceConnection.class), 33, 100); Condition[] conditionsToNotify = new Condition[] { new Condition(Uri.parse("a"), "summary", Condition.STATE_TRUE), new Condition(Uri.parse("b"), "summary2", Condition.STATE_TRUE), new Condition(Uri.parse("a"), "summary3", Condition.STATE_FALSE), new Condition(Uri.parse("a"), "summary4", Condition.STATE_FALSE) new Condition(Uri.parse("a"), "summary", STATE_TRUE), new Condition(Uri.parse("b"), "summary2", STATE_TRUE), new Condition(Uri.parse("a"), "summary3", STATE_FALSE), new Condition(Uri.parse("a"), "summary4", STATE_FALSE) }; mProviders.notifyConditions("package", msi, conditionsToNotify); Loading @@ -124,10 +136,10 @@ public class ConditionProvidersTest extends UiServiceTestCase { mock(IInterface.class), new ComponentName("package", "cls"), 0, false, mock(ServiceConnection.class), 33, 100); Condition[] conditionsToNotify = new Condition[] { new Condition(Uri.parse("a"), "summary", Condition.STATE_TRUE), new Condition(Uri.parse("a"), "summary", STATE_TRUE), null, null, new Condition(Uri.parse("b"), "summary", Condition.STATE_TRUE) new Condition(Uri.parse("b"), "summary", STATE_TRUE) }; mProviders.notifyConditions("package", msi, conditionsToNotify); Loading @@ -137,6 +149,57 @@ public class ConditionProvidersTest extends UiServiceTestCase { verifyNoMoreInteractions(mCallback); } @Test @EnableFlags(Flags.FLAG_MODES_UI) public void notifyConditions_appCannotUndoUserEnablement() { ManagedServices.ManagedServiceInfo msi = mProviders.new ManagedServiceInfo( mock(IInterface.class), new ComponentName("package", "cls"), 0, false, mock(ServiceConnection.class), 33, 100); // First, user enabled mode Condition[] userConditions = new Condition[] { new Condition(Uri.parse("a"), "summary", STATE_TRUE, SOURCE_USER_ACTION) }; mProviders.notifyConditions("package", msi, userConditions); verify(mCallback).onConditionChanged(eq(Uri.parse("a")), eq(userConditions[0])); // Second, app tries to disable it, but cannot Condition[] appConditions = new Condition[] { new Condition(Uri.parse("a"), "summary", STATE_FALSE) }; mProviders.notifyConditions("package", msi, appConditions); verify(mCallback).onConditionChanged(eq(Uri.parse("a")), eq(userConditions[0])); } @Test @EnableFlags(Flags.FLAG_MODES_UI) public void notifyConditions_appCanTakeoverUserEnablement() { ManagedServices.ManagedServiceInfo msi = mProviders.new ManagedServiceInfo( mock(IInterface.class), new ComponentName("package", "cls"), 0, false, mock(ServiceConnection.class), 33, 100); // First, user enabled mode Condition[] userConditions = new Condition[] { new Condition(Uri.parse("a"), "summary", STATE_TRUE, SOURCE_USER_ACTION) }; mProviders.notifyConditions("package", msi, userConditions); verify(mCallback).onConditionChanged(eq(Uri.parse("a")), eq(userConditions[0])); // Second, app now thinks the rule should be on due it its intelligence Condition[] appConditions = new Condition[] { new Condition(Uri.parse("a"), "summary", STATE_TRUE) }; mProviders.notifyConditions("package", msi, appConditions); verify(mCallback).onConditionChanged(eq(Uri.parse("a")), eq(appConditions[0])); // Lastly, app can turn rule off when its intelligence think it should be off appConditions = new Condition[] { new Condition(Uri.parse("a"), "summary", STATE_FALSE) }; mProviders.notifyConditions("package", msi, appConditions); verify(mCallback).onConditionChanged(eq(Uri.parse("a")), eq(appConditions[0])); verifyNoMoreInteractions(mCallback); } @Test public void testRemoveDefaultFromConfig() { final int userId = 0; Loading