summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/notification/ConditionProviders.java18
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/ConditionProvidersTest.java85
2 files changed, 91 insertions, 12 deletions
diff --git a/services/core/java/com/android/server/notification/ConditionProviders.java b/services/core/java/com/android/server/notification/ConditionProviders.java
index 66e61c076030..3cc04570643f 100644
--- a/services/core/java/com/android/server/notification/ConditionProviders.java
+++ b/services/core/java/com/android/server/notification/ConditionProviders.java
@@ -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;
@@ -319,7 +322,20 @@ public class ConditionProviders extends ManagedServices {
final Condition c = conditions[i];
final ConditionRecord r = getRecordLocked(c.id, info.component, true /*create*/);
r.info = info;
- r.condition = c;
+ 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;
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/ConditionProvidersTest.java b/services/tests/uiservicestests/src/com/android/server/notification/ConditionProvidersTest.java
index d04c51819377..f6e1162a5ada 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/ConditionProvidersTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/ConditionProvidersTest.java
@@ -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;
@@ -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;
@@ -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);
@@ -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);
@@ -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);
@@ -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);
@@ -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);
@@ -138,6 +150,57 @@ public class ConditionProvidersTest extends UiServiceTestCase {
}
@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;
ComponentName oldDefaultComponent = ComponentName.unflattenFromString("package/Component1");