DO NOT MERGE Add an OEM configurable limit for zen rules
Test: ZenModeHelperTest Bug: 220735360 Change-Id: I3da105951af90007bf48dc6cf00aed3e28778b36 Merged-In: I3da105951af90007bf48dc6cf00aed3e28778b36
This commit is contained in:
@@ -102,6 +102,7 @@ public class ZenModeHelper {
|
|||||||
|
|
||||||
// The amount of time rules instances can exist without their owning app being installed.
|
// The amount of time rules instances can exist without their owning app being installed.
|
||||||
private static final int RULE_INSTANCE_GRACE_PERIOD = 1000 * 60 * 60 * 72;
|
private static final int RULE_INSTANCE_GRACE_PERIOD = 1000 * 60 * 60 * 72;
|
||||||
|
static final int RULE_LIMIT_PER_PACKAGE = 100;
|
||||||
|
|
||||||
private final Context mContext;
|
private final Context mContext;
|
||||||
private final H mHandler;
|
private final H mHandler;
|
||||||
@@ -319,10 +320,10 @@ public class ZenModeHelper {
|
|||||||
int newRuleInstanceCount = getCurrentInstanceCount(automaticZenRule.getOwner())
|
int newRuleInstanceCount = getCurrentInstanceCount(automaticZenRule.getOwner())
|
||||||
+ getCurrentInstanceCount(automaticZenRule.getConfigurationActivity())
|
+ getCurrentInstanceCount(automaticZenRule.getConfigurationActivity())
|
||||||
+ 1;
|
+ 1;
|
||||||
if (ruleInstanceLimit > 0 && ruleInstanceLimit < newRuleInstanceCount) {
|
if (newRuleInstanceCount > RULE_LIMIT_PER_PACKAGE
|
||||||
|
|| (ruleInstanceLimit > 0 && ruleInstanceLimit < newRuleInstanceCount)) {
|
||||||
throw new IllegalArgumentException("Rule instance limit exceeded");
|
throw new IllegalArgumentException("Rule instance limit exceeded");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ZenModeConfig newConfig;
|
ZenModeConfig newConfig;
|
||||||
|
|||||||
@@ -41,9 +41,11 @@ import static com.android.os.AtomsProto.DNDModeProto.ENABLED_FIELD_NUMBER;
|
|||||||
import static com.android.os.AtomsProto.DNDModeProto.ID_FIELD_NUMBER;
|
import static com.android.os.AtomsProto.DNDModeProto.ID_FIELD_NUMBER;
|
||||||
import static com.android.os.AtomsProto.DNDModeProto.UID_FIELD_NUMBER;
|
import static com.android.os.AtomsProto.DNDModeProto.UID_FIELD_NUMBER;
|
||||||
import static com.android.os.AtomsProto.DNDModeProto.ZEN_MODE_FIELD_NUMBER;
|
import static com.android.os.AtomsProto.DNDModeProto.ZEN_MODE_FIELD_NUMBER;
|
||||||
|
import static com.android.server.notification.ZenModeHelper.RULE_LIMIT_PER_PACKAGE;
|
||||||
|
|
||||||
import static junit.framework.Assert.assertEquals;
|
import static junit.framework.Assert.assertEquals;
|
||||||
import static junit.framework.Assert.assertFalse;
|
import static junit.framework.Assert.assertFalse;
|
||||||
|
import static junit.framework.Assert.assertNotNull;
|
||||||
import static junit.framework.TestCase.assertTrue;
|
import static junit.framework.TestCase.assertTrue;
|
||||||
import static junit.framework.TestCase.fail;
|
import static junit.framework.TestCase.fail;
|
||||||
|
|
||||||
@@ -70,7 +72,9 @@ import android.app.NotificationManager.Policy;
|
|||||||
import android.content.ComponentName;
|
import android.content.ComponentName;
|
||||||
import android.content.ContentResolver;
|
import android.content.ContentResolver;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.content.pm.ActivityInfo;
|
||||||
import android.content.pm.PackageManager;
|
import android.content.pm.PackageManager;
|
||||||
|
import android.content.pm.ResolveInfo;
|
||||||
import android.content.res.Resources;
|
import android.content.res.Resources;
|
||||||
import android.content.res.XmlResourceParser;
|
import android.content.res.XmlResourceParser;
|
||||||
import android.media.AudioAttributes;
|
import android.media.AudioAttributes;
|
||||||
@@ -102,6 +106,8 @@ import com.android.internal.util.FastXmlSerializer;
|
|||||||
import com.android.server.UiServiceTestCase;
|
import com.android.server.UiServiceTestCase;
|
||||||
import com.android.server.notification.ManagedServices.UserProfiles;
|
import com.android.server.notification.ManagedServices.UserProfiles;
|
||||||
|
|
||||||
|
import com.google.common.collect.ImmutableList;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
@@ -131,9 +137,12 @@ public class ZenModeHelperTest extends UiServiceTestCase {
|
|||||||
private static final String EVENTS_DEFAULT_RULE_ID = "EVENTS_DEFAULT_RULE";
|
private static final String EVENTS_DEFAULT_RULE_ID = "EVENTS_DEFAULT_RULE";
|
||||||
private static final String SCHEDULE_DEFAULT_RULE_ID = "EVERY_NIGHT_DEFAULT_RULE";
|
private static final String SCHEDULE_DEFAULT_RULE_ID = "EVERY_NIGHT_DEFAULT_RULE";
|
||||||
private static final int ZEN_MODE_FOR_TESTING = 99;
|
private static final int ZEN_MODE_FOR_TESTING = 99;
|
||||||
|
private static final String CUSTOM_PKG_NAME = "not.android";
|
||||||
|
private static final int CUSTOM_PKG_UID = 1;
|
||||||
|
|
||||||
ConditionProviders mConditionProviders;
|
ConditionProviders mConditionProviders;
|
||||||
@Mock NotificationManager mNotificationManager;
|
@Mock NotificationManager mNotificationManager;
|
||||||
|
@Mock PackageManager mPackageManager;
|
||||||
private Resources mResources;
|
private Resources mResources;
|
||||||
private TestableLooper mTestableLooper;
|
private TestableLooper mTestableLooper;
|
||||||
private ZenModeHelper mZenModeHelperSpy;
|
private ZenModeHelper mZenModeHelperSpy;
|
||||||
@@ -143,7 +152,7 @@ public class ZenModeHelperTest extends UiServiceTestCase {
|
|||||||
private WrappedSysUiStatsEvent.WrappedBuilderFactory mStatsEventBuilderFactory;
|
private WrappedSysUiStatsEvent.WrappedBuilderFactory mStatsEventBuilderFactory;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() throws PackageManager.NameNotFoundException {
|
||||||
MockitoAnnotations.initMocks(this);
|
MockitoAnnotations.initMocks(this);
|
||||||
|
|
||||||
mTestableLooper = TestableLooper.get(this);
|
mTestableLooper = TestableLooper.get(this);
|
||||||
@@ -166,6 +175,16 @@ public class ZenModeHelperTest extends UiServiceTestCase {
|
|||||||
mConditionProviders.addSystemProvider(new CountdownConditionProvider());
|
mConditionProviders.addSystemProvider(new CountdownConditionProvider());
|
||||||
mZenModeHelperSpy = spy(new ZenModeHelper(mContext, mTestableLooper.getLooper(),
|
mZenModeHelperSpy = spy(new ZenModeHelper(mContext, mTestableLooper.getLooper(),
|
||||||
mConditionProviders, mStatsEventBuilderFactory));
|
mConditionProviders, mStatsEventBuilderFactory));
|
||||||
|
|
||||||
|
ResolveInfo ri = new ResolveInfo();
|
||||||
|
ri.activityInfo = new ActivityInfo();
|
||||||
|
when(mPackageManager.queryIntentActivitiesAsUser(any(), anyInt(), anyInt())).thenReturn(
|
||||||
|
ImmutableList.of(ri));
|
||||||
|
when(mPackageManager.getPackageUidAsUser(eq(CUSTOM_PKG_NAME), anyInt()))
|
||||||
|
.thenReturn(CUSTOM_PKG_UID);
|
||||||
|
when(mPackageManager.getPackagesForUid(anyInt())).thenReturn(
|
||||||
|
new String[] {getContext().getPackageName()});
|
||||||
|
mZenModeHelperSpy.mPm = mPackageManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
private XmlResourceParser getDefaultConfigParser() throws IOException, XmlPullParserException {
|
private XmlResourceParser getDefaultConfigParser() throws IOException, XmlPullParserException {
|
||||||
@@ -1556,6 +1575,34 @@ public class ZenModeHelperTest extends UiServiceTestCase {
|
|||||||
assertEquals(zenRule.getName(), ruleInConfig.name);
|
assertEquals(zenRule.getName(), ruleInConfig.name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testAddAutomaticZenRule_beyondSystemLimit() {
|
||||||
|
for (int i = 0; i < RULE_LIMIT_PER_PACKAGE; i++) {
|
||||||
|
ScheduleInfo si = new ScheduleInfo();
|
||||||
|
si.startHour = i;
|
||||||
|
AutomaticZenRule zenRule = new AutomaticZenRule("name" + i,
|
||||||
|
null,
|
||||||
|
new ComponentName("android", "ScheduleConditionProvider"),
|
||||||
|
ZenModeConfig.toScheduleConditionId(si),
|
||||||
|
new ZenPolicy.Builder().build(),
|
||||||
|
NotificationManager.INTERRUPTION_FILTER_PRIORITY, true);
|
||||||
|
String id = mZenModeHelperSpy.addAutomaticZenRule(zenRule, "test");
|
||||||
|
assertNotNull(id);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
AutomaticZenRule zenRule = new AutomaticZenRule("name",
|
||||||
|
null,
|
||||||
|
new ComponentName("android", "ScheduleConditionProvider"),
|
||||||
|
ZenModeConfig.toScheduleConditionId(new ScheduleInfo()),
|
||||||
|
new ZenPolicy.Builder().build(),
|
||||||
|
NotificationManager.INTERRUPTION_FILTER_PRIORITY, true);
|
||||||
|
String id = mZenModeHelperSpy.addAutomaticZenRule(zenRule, "test");
|
||||||
|
fail("allowed too many rules to be created");
|
||||||
|
} catch (IllegalArgumentException e) {
|
||||||
|
// yay
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void setupZenConfig() {
|
private void setupZenConfig() {
|
||||||
mZenModeHelperSpy.mZenMode = ZEN_MODE_IMPORTANT_INTERRUPTIONS;
|
mZenModeHelperSpy.mZenMode = ZEN_MODE_IMPORTANT_INTERRUPTIONS;
|
||||||
mZenModeHelperSpy.mConfig.allowAlarms = false;
|
mZenModeHelperSpy.mConfig.allowAlarms = false;
|
||||||
|
|||||||
Reference in New Issue
Block a user