Enforce zen rule limit on a package level.
This means that a single package with multiple different condition providers or configuration activities will correctly have all of their zen rules associated with the same package rather than each owner/activity having their rules counted separately.
Bug: 235823407
Test: ZenModeHelperTest
Change-Id: I35daf9a24f546ae25a78a2d841be39072cdc5641
Merged-In: I35daf9a24f546ae25a78a2d841be39072cdc5641
(cherry picked from commit f4e69394ee)
This commit is contained in:
@@ -321,7 +321,8 @@ public class ZenModeHelper {
|
|||||||
int newRuleInstanceCount = getCurrentInstanceCount(automaticZenRule.getOwner())
|
int newRuleInstanceCount = getCurrentInstanceCount(automaticZenRule.getOwner())
|
||||||
+ getCurrentInstanceCount(automaticZenRule.getConfigurationActivity())
|
+ getCurrentInstanceCount(automaticZenRule.getConfigurationActivity())
|
||||||
+ 1;
|
+ 1;
|
||||||
if (newRuleInstanceCount > RULE_LIMIT_PER_PACKAGE
|
int newPackageRuleCount = getPackageRuleCount(pkg) + 1;
|
||||||
|
if (newPackageRuleCount > RULE_LIMIT_PER_PACKAGE
|
||||||
|| (ruleInstanceLimit > 0 && ruleInstanceLimit < newRuleInstanceCount)) {
|
|| (ruleInstanceLimit > 0 && ruleInstanceLimit < newRuleInstanceCount)) {
|
||||||
throw new IllegalArgumentException("Rule instance limit exceeded");
|
throw new IllegalArgumentException("Rule instance limit exceeded");
|
||||||
}
|
}
|
||||||
@@ -495,6 +496,23 @@ public class ZenModeHelper {
|
|||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Equivalent method to getCurrentInstanceCount, but for all rules associated with a specific
|
||||||
|
// package rather than a condition provider service or activity.
|
||||||
|
private int getPackageRuleCount(String pkg) {
|
||||||
|
if (pkg == null) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
int count = 0;
|
||||||
|
synchronized (mConfig) {
|
||||||
|
for (ZenRule rule : mConfig.automaticRules.values()) {
|
||||||
|
if (pkg.equals(rule.pkg)) {
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
public boolean canManageAutomaticZenRule(ZenRule rule) {
|
public boolean canManageAutomaticZenRule(ZenRule rule) {
|
||||||
final int callingUid = Binder.getCallingUid();
|
final int callingUid = Binder.getCallingUid();
|
||||||
if (callingUid == 0 || callingUid == Process.SYSTEM_UID) {
|
if (callingUid == 0 || callingUid == Process.SYSTEM_UID) {
|
||||||
|
|||||||
@@ -1586,7 +1586,9 @@ public class ZenModeHelperTest extends UiServiceTestCase {
|
|||||||
ZenModeConfig.toScheduleConditionId(si),
|
ZenModeConfig.toScheduleConditionId(si),
|
||||||
new ZenPolicy.Builder().build(),
|
new ZenPolicy.Builder().build(),
|
||||||
NotificationManager.INTERRUPTION_FILTER_PRIORITY, true);
|
NotificationManager.INTERRUPTION_FILTER_PRIORITY, true);
|
||||||
String id = mZenModeHelperSpy.addAutomaticZenRule("android", zenRule, "test");
|
// We need the package name to be something that's not "android" so there aren't any
|
||||||
|
// existing rules under that package.
|
||||||
|
String id = mZenModeHelperSpy.addAutomaticZenRule("pkgname", zenRule, "test");
|
||||||
assertNotNull(id);
|
assertNotNull(id);
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
@@ -1596,7 +1598,37 @@ public class ZenModeHelperTest extends UiServiceTestCase {
|
|||||||
ZenModeConfig.toScheduleConditionId(new ScheduleInfo()),
|
ZenModeConfig.toScheduleConditionId(new ScheduleInfo()),
|
||||||
new ZenPolicy.Builder().build(),
|
new ZenPolicy.Builder().build(),
|
||||||
NotificationManager.INTERRUPTION_FILTER_PRIORITY, true);
|
NotificationManager.INTERRUPTION_FILTER_PRIORITY, true);
|
||||||
String id = mZenModeHelperSpy.addAutomaticZenRule("android", zenRule, "test");
|
String id = mZenModeHelperSpy.addAutomaticZenRule("pkgname", zenRule, "test");
|
||||||
|
fail("allowed too many rules to be created");
|
||||||
|
} catch (IllegalArgumentException e) {
|
||||||
|
// yay
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testAddAutomaticZenRule_beyondSystemLimit_differentComponents() {
|
||||||
|
// Make sure the system limit is enforced per-package even with different component provider
|
||||||
|
// names.
|
||||||
|
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" + i),
|
||||||
|
ZenModeConfig.toScheduleConditionId(si),
|
||||||
|
new ZenPolicy.Builder().build(),
|
||||||
|
NotificationManager.INTERRUPTION_FILTER_PRIORITY, true);
|
||||||
|
String id = mZenModeHelperSpy.addAutomaticZenRule("pkgname", zenRule, "test");
|
||||||
|
assertNotNull(id);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
AutomaticZenRule zenRule = new AutomaticZenRule("name",
|
||||||
|
null,
|
||||||
|
new ComponentName("android", "ScheduleConditionProviderFinal"),
|
||||||
|
ZenModeConfig.toScheduleConditionId(new ScheduleInfo()),
|
||||||
|
new ZenPolicy.Builder().build(),
|
||||||
|
NotificationManager.INTERRUPTION_FILTER_PRIORITY, true);
|
||||||
|
String id = mZenModeHelperSpy.addAutomaticZenRule("pkgname", zenRule, "test");
|
||||||
fail("allowed too many rules to be created");
|
fail("allowed too many rules to be created");
|
||||||
} catch (IllegalArgumentException e) {
|
} catch (IllegalArgumentException e) {
|
||||||
// yay
|
// yay
|
||||||
|
|||||||
Reference in New Issue
Block a user