Loading services/core/java/com/android/server/notification/PreferencesHelper.java +14 −0 Original line number Diff line number Diff line Loading @@ -98,6 +98,8 @@ public class PreferencesHelper implements RankingConfig { @VisibleForTesting static final int NOTIFICATION_CHANNEL_COUNT_LIMIT = 5000; @VisibleForTesting static final int NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT = 6000; private static final int NOTIFICATION_PREFERENCES_PULL_LIMIT = 1000; private static final int NOTIFICATION_CHANNEL_PULL_LIMIT = 2000; Loading Loading @@ -239,6 +241,7 @@ public class PreferencesHelper implements RankingConfig { } } boolean skipWarningLogged = false; boolean skipGroupWarningLogged = false; boolean hasSAWPermission = false; if (upgradeForBubbles && uid != UNKNOWN_UID) { hasSAWPermission = mAppOps.noteOpNoThrow( Loading Loading @@ -289,6 +292,14 @@ public class PreferencesHelper implements RankingConfig { String tagName = parser.getName(); // Channel groups if (TAG_GROUP.equals(tagName)) { if (r.groups.size() >= NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT) { if (!skipGroupWarningLogged) { Slog.w(TAG, "Skipping further groups for " + r.pkg + "; app has too many"); skipGroupWarningLogged = true; } continue; } String id = parser.getAttributeValue(null, ATT_ID); CharSequence groupName = parser.getAttributeValue(null, ATT_NAME); Loading Loading @@ -798,6 +809,9 @@ public class PreferencesHelper implements RankingConfig { } if (fromTargetApp) { group.setBlocked(false); if (r.groups.size() >= NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT) { throw new IllegalStateException("Limit exceed; cannot create more groups"); } } final NotificationChannelGroup oldGroup = r.groups.get(group.getId()); if (oldGroup != null) { Loading services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java +47 −0 Original line number Diff line number Diff line Loading @@ -42,6 +42,7 @@ import static com.android.os.AtomsProto.PackageNotificationChannelPreferences.IS import static com.android.os.AtomsProto.PackageNotificationChannelPreferences.UID_FIELD_NUMBER; import static com.android.server.notification.PreferencesHelper.DEFAULT_BUBBLE_PREFERENCE; import static com.android.server.notification.PreferencesHelper.NOTIFICATION_CHANNEL_COUNT_LIMIT; import static com.android.server.notification.PreferencesHelper.NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT; import static com.android.server.notification.PreferencesHelper.UNKNOWN_UID; import static com.google.common.truth.Truth.assertThat; Loading Loading @@ -3165,6 +3166,52 @@ public class PreferencesHelperTest extends UiServiceTestCase { assertNull(mHelper.getNotificationChannel(PKG_O, UID_O, extraChannel1, true)); } @Test public void testTooManyGroups() { for (int i = 0; i < NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT; i++) { NotificationChannelGroup group = new NotificationChannelGroup(String.valueOf(i), String.valueOf(i)); mHelper.createNotificationChannelGroup(PKG_O, UID_O, group, true); } try { NotificationChannelGroup group = new NotificationChannelGroup( String.valueOf(NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT), String.valueOf(NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT)); mHelper.createNotificationChannelGroup(PKG_O, UID_O, group, true); fail("Allowed to create too many notification channel groups"); } catch (IllegalStateException e) { // great } } @Test public void testTooManyGroups_xml() throws Exception { String extraGroup = "EXTRA"; String extraGroup1 = "EXTRA1"; // create first... many... directly so we don't need a big xml blob in this test for (int i = 0; i < NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT; i++) { NotificationChannelGroup group = new NotificationChannelGroup(String.valueOf(i), String.valueOf(i)); mHelper.createNotificationChannelGroup(PKG_O, UID_O, group, true); } final String xml = "<ranking version=\"1\">\n" + "<package name=\"" + PKG_O + "\" uid=\"" + UID_O + "\" >\n" + "<channelGroup id=\"" + extraGroup + "\" name=\"hi\"/>" + "<channelGroup id=\"" + extraGroup1 + "\" name=\"hi2\"/>" + "</package>" + "</ranking>"; TypedXmlPullParser parser = Xml.newFastPullParser(); parser.setInput(new BufferedInputStream(new ByteArrayInputStream(xml.getBytes())), null); parser.nextTag(); mHelper.readXml(parser, false, UserHandle.USER_ALL); assertNull(mHelper.getNotificationChannelGroup(extraGroup, PKG_O, UID_O)); assertNull(mHelper.getNotificationChannelGroup(extraGroup1, PKG_O, UID_O)); } @Test public void testRestoreMultiUser() throws Exception { String pkg = "restore_pkg"; Loading Loading
services/core/java/com/android/server/notification/PreferencesHelper.java +14 −0 Original line number Diff line number Diff line Loading @@ -98,6 +98,8 @@ public class PreferencesHelper implements RankingConfig { @VisibleForTesting static final int NOTIFICATION_CHANNEL_COUNT_LIMIT = 5000; @VisibleForTesting static final int NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT = 6000; private static final int NOTIFICATION_PREFERENCES_PULL_LIMIT = 1000; private static final int NOTIFICATION_CHANNEL_PULL_LIMIT = 2000; Loading Loading @@ -239,6 +241,7 @@ public class PreferencesHelper implements RankingConfig { } } boolean skipWarningLogged = false; boolean skipGroupWarningLogged = false; boolean hasSAWPermission = false; if (upgradeForBubbles && uid != UNKNOWN_UID) { hasSAWPermission = mAppOps.noteOpNoThrow( Loading Loading @@ -289,6 +292,14 @@ public class PreferencesHelper implements RankingConfig { String tagName = parser.getName(); // Channel groups if (TAG_GROUP.equals(tagName)) { if (r.groups.size() >= NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT) { if (!skipGroupWarningLogged) { Slog.w(TAG, "Skipping further groups for " + r.pkg + "; app has too many"); skipGroupWarningLogged = true; } continue; } String id = parser.getAttributeValue(null, ATT_ID); CharSequence groupName = parser.getAttributeValue(null, ATT_NAME); Loading Loading @@ -798,6 +809,9 @@ public class PreferencesHelper implements RankingConfig { } if (fromTargetApp) { group.setBlocked(false); if (r.groups.size() >= NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT) { throw new IllegalStateException("Limit exceed; cannot create more groups"); } } final NotificationChannelGroup oldGroup = r.groups.get(group.getId()); if (oldGroup != null) { Loading
services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java +47 −0 Original line number Diff line number Diff line Loading @@ -42,6 +42,7 @@ import static com.android.os.AtomsProto.PackageNotificationChannelPreferences.IS import static com.android.os.AtomsProto.PackageNotificationChannelPreferences.UID_FIELD_NUMBER; import static com.android.server.notification.PreferencesHelper.DEFAULT_BUBBLE_PREFERENCE; import static com.android.server.notification.PreferencesHelper.NOTIFICATION_CHANNEL_COUNT_LIMIT; import static com.android.server.notification.PreferencesHelper.NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT; import static com.android.server.notification.PreferencesHelper.UNKNOWN_UID; import static com.google.common.truth.Truth.assertThat; Loading Loading @@ -3165,6 +3166,52 @@ public class PreferencesHelperTest extends UiServiceTestCase { assertNull(mHelper.getNotificationChannel(PKG_O, UID_O, extraChannel1, true)); } @Test public void testTooManyGroups() { for (int i = 0; i < NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT; i++) { NotificationChannelGroup group = new NotificationChannelGroup(String.valueOf(i), String.valueOf(i)); mHelper.createNotificationChannelGroup(PKG_O, UID_O, group, true); } try { NotificationChannelGroup group = new NotificationChannelGroup( String.valueOf(NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT), String.valueOf(NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT)); mHelper.createNotificationChannelGroup(PKG_O, UID_O, group, true); fail("Allowed to create too many notification channel groups"); } catch (IllegalStateException e) { // great } } @Test public void testTooManyGroups_xml() throws Exception { String extraGroup = "EXTRA"; String extraGroup1 = "EXTRA1"; // create first... many... directly so we don't need a big xml blob in this test for (int i = 0; i < NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT; i++) { NotificationChannelGroup group = new NotificationChannelGroup(String.valueOf(i), String.valueOf(i)); mHelper.createNotificationChannelGroup(PKG_O, UID_O, group, true); } final String xml = "<ranking version=\"1\">\n" + "<package name=\"" + PKG_O + "\" uid=\"" + UID_O + "\" >\n" + "<channelGroup id=\"" + extraGroup + "\" name=\"hi\"/>" + "<channelGroup id=\"" + extraGroup1 + "\" name=\"hi2\"/>" + "</package>" + "</ranking>"; TypedXmlPullParser parser = Xml.newFastPullParser(); parser.setInput(new BufferedInputStream(new ByteArrayInputStream(xml.getBytes())), null); parser.nextTag(); mHelper.readXml(parser, false, UserHandle.USER_ALL); assertNull(mHelper.getNotificationChannelGroup(extraGroup, PKG_O, UID_O)); assertNull(mHelper.getNotificationChannelGroup(extraGroup1, PKG_O, UID_O)); } @Test public void testRestoreMultiUser() throws Exception { String pkg = "restore_pkg"; Loading