Loading res/values/strings.xml +1 −1 Original line number Diff line number Diff line Loading @@ -8270,7 +8270,7 @@ <!-- App notification summary with notifications enabled [CHAR LIMIT=40] --> <string name="notifications_enabled">On</string> <!-- App notification summary with notifications enabled [CHAR LIMIT=40] --> <string name="notifications_enabled_with_info">On / <xliff:g id="notifications_categories_off" example="3 categories turned off">%1$s</xliff:g> </string> <string name="notifications_enabled_with_info"><xliff:g id="notifications_sent" example="~6 per week">%1$s</xliff:g> / <xliff:g id="notifications_categories_off" example="3 categories turned off">%2$s</xliff:g> </string> <!-- Label for showing apps with blocked notifications in list [CHAR LIMIT=30] --> <string name="notifications_disabled">Off</string> <!-- Label for showing apps with some blocked notifications in list [CHAR LIMIT=30] --> src/com/android/settings/applications/appinfo/AppNotificationPreferenceController.java +3 −2 Original line number Diff line number Diff line Loading @@ -84,14 +84,15 @@ public class AppNotificationPreferenceController extends AppInfoPreferenceContro if (appRow.banned) { return context.getText(R.string.notifications_disabled); } else if (appRow.channelCount == 0) { return context.getText(R.string.notifications_enabled); return NotificationBackend.getSentSummary(context, appRow.sentByApp, false); } else if (appRow.channelCount == appRow.blockedChannelCount) { return context.getText(R.string.notifications_disabled); } else { if (appRow.blockedChannelCount == 0) { return context.getText(R.string.notifications_enabled); return NotificationBackend.getSentSummary(context, appRow.sentByApp, false); } return context.getString(R.string.notifications_enabled_with_info, NotificationBackend.getSentSummary(context, appRow.sentByApp, false), context.getResources().getQuantityString(R.plurals.notifications_categories_off, appRow.blockedChannelCount, appRow.blockedChannelCount)); } Loading src/com/android/settings/notification/NotificationBackend.java +13 −10 Original line number Diff line number Diff line Loading @@ -73,7 +73,7 @@ public class NotificationBackend { row.userId = UserHandle.getUserId(row.uid); row.blockedChannelCount = getBlockedChannelCount(row.pkg, row.uid); row.channelCount = getChannelCount(row.pkg, row.uid); row.sentByChannel = getAggregatedUsageEvents(context, row.userId, row.pkg); recordAggregatedUsageEvents(context, row); return row; } Loading Loading @@ -271,22 +271,22 @@ public class NotificationBackend { } } protected Map<String, NotificationsSentState> getAggregatedUsageEvents( Context context, int userId, String pkg) { protected void recordAggregatedUsageEvents(Context context, AppRow appRow) { long now = System.currentTimeMillis(); long startTime = now - (DateUtils.DAY_IN_MILLIS * DAYS_TO_CHECK); UsageEvents events = null; try { events = sUsageStatsManager.queryEventsForPackageForUser( startTime, now, userId, pkg, context.getPackageName()); startTime, now, appRow.userId, appRow.pkg, context.getPackageName()); } catch (RemoteException e) { e.printStackTrace(); } return getAggregatedUsageEvents(events); recordAggregatedUsageEvents(events, appRow); } protected Map<String, NotificationsSentState> getAggregatedUsageEvents(UsageEvents events) { Map<String, NotificationsSentState> sentByChannel = new HashMap<>(); protected void recordAggregatedUsageEvents(UsageEvents events, AppRow appRow) { appRow.sentByChannel = new HashMap<>(); appRow.sentByApp = new NotificationsSentState(); if (events != null) { UsageEvents.Event event = new UsageEvents.Event(); while (events.hasNextEvent()) { Loading @@ -295,22 +295,24 @@ public class NotificationBackend { if (event.getEventType() == UsageEvents.Event.NOTIFICATION_INTERRUPTION) { String channelId = event.mNotificationChannelId; if (channelId != null) { NotificationsSentState stats = sentByChannel.get(channelId); NotificationsSentState stats = appRow.sentByChannel.get(channelId); if (stats == null) { stats = new NotificationsSentState(); sentByChannel.put(channelId, stats); appRow.sentByChannel.put(channelId, stats); } if (event.getTimeStamp() > stats.lastSent) { stats.lastSent = event.getTimeStamp(); appRow.sentByApp.lastSent = event.getTimeStamp(); } stats.sentCount++; appRow.sentByApp.sentCount++; calculateAvgSentCounts(stats); } } } calculateAvgSentCounts(appRow.sentByApp); } return sentByChannel; } public static CharSequence getSentSummary(Context context, NotificationsSentState state, Loading Loading @@ -372,5 +374,6 @@ public class NotificationBackend { public int blockedChannelCount; public int channelCount; public Map<String, NotificationsSentState> sentByChannel; public NotificationsSentState sentByApp; } } tests/robotests/src/com/android/settings/applications/appinfo/AppNotificationPreferenceControllerTest.java +12 −4 Original line number Diff line number Diff line Loading @@ -139,10 +139,12 @@ public class AppNotificationPreferenceControllerTest { appRow.banned = false; appRow.blockedChannelCount = 30; appRow.channelCount = 60; appRow.sentByApp = new NotificationBackend.NotificationsSentState(); appRow.sentByApp.avgSentWeekly = 4; assertThat(mController.getNotificationSummary( appRow, mContext).toString().contains("30")).isTrue(); assertThat(mController.getNotificationSummary( appRow, mContext).toString().contains("On")).isTrue(); assertThat(mController.getNotificationSummary(appRow, mContext).toString().contains( NotificationBackend.getSentSummary(mContext, appRow.sentByApp, false))).isTrue(); } @Test Loading @@ -151,7 +153,10 @@ public class AppNotificationPreferenceControllerTest { appRow.banned = false; appRow.blockedChannelCount = 0; appRow.channelCount = 10; assertThat(mController.getNotificationSummary(appRow, mContext).toString()).isEqualTo("On"); appRow.sentByApp = new NotificationBackend.NotificationsSentState(); appRow.sentByApp.avgSentDaily = 4; assertThat(mController.getNotificationSummary(appRow, mContext).toString()).isEqualTo( NotificationBackend.getSentSummary(mContext, appRow.sentByApp, false)); } @Test Loading @@ -160,6 +165,9 @@ public class AppNotificationPreferenceControllerTest { appRow.banned = false; appRow.blockedChannelCount = 0; appRow.channelCount = 0; assertThat(mController.getNotificationSummary(appRow, mContext).toString()).isEqualTo("On"); appRow.sentByApp = new NotificationBackend.NotificationsSentState(); appRow.sentByApp.avgSentDaily = 7; assertThat(mController.getNotificationSummary(appRow, mContext).toString()).isEqualTo( NotificationBackend.getSentSummary(mContext, appRow.sentByApp, false)); } } tests/robotests/src/com/android/settings/notification/NotificationBackendTest.java +19 −15 Original line number Diff line number Diff line Loading @@ -142,29 +142,33 @@ public class NotificationBackendTest { good.mNotificationChannelId = "channel1"; good.mTimeStamp = 2; events.add(good); UsageEvents.Event good1 = new UsageEvents.Event(); good1.mEventType = UsageEvents.Event.NOTIFICATION_INTERRUPTION; good1.mPackage = "pkg"; good1.mNotificationChannelId = "channel1"; good1.mTimeStamp = 6; events.add(good1); UsageEvents.Event good2 = new UsageEvents.Event(); good2.mEventType = UsageEvents.Event.NOTIFICATION_INTERRUPTION; good2.mPackage = "pkg"; good2.mNotificationChannelId = "channel2"; good2.mTimeStamp = 3; events.add(good2); UsageEvents.Event good1 = new UsageEvents.Event(); good1.mEventType = UsageEvents.Event.NOTIFICATION_INTERRUPTION; good1.mPackage = "pkg"; good1.mNotificationChannelId = "channel1"; good1.mTimeStamp = 6; events.add(good1); NotificationBackend backend = new NotificationBackend(); Map<String, NotificationBackend.NotificationsSentState> stats = backend.getAggregatedUsageEvents(getUsageEvents(events)); assertThat(stats.get("channel1").sentCount).isEqualTo(2); assertThat(stats.get("channel1").lastSent).isEqualTo(6); assertThat(stats.get("channel1").avgSentWeekly).isEqualTo(2); assertThat(stats.get("channel2").sentCount).isEqualTo(1); assertThat(stats.get("channel2").lastSent).isEqualTo(3); assertThat(stats.get("channel2").avgSentWeekly).isEqualTo(1); AppRow appRow = new AppRow(); appRow.pkg = "pkg"; backend.recordAggregatedUsageEvents(getUsageEvents(events), appRow); assertThat(appRow.sentByChannel.get("channel1").sentCount).isEqualTo(2); assertThat(appRow.sentByChannel.get("channel1").lastSent).isEqualTo(6); assertThat(appRow.sentByChannel.get("channel1").avgSentWeekly).isEqualTo(2); assertThat(appRow.sentByChannel.get("channel2").sentCount).isEqualTo(1); assertThat(appRow.sentByChannel.get("channel2").lastSent).isEqualTo(3); assertThat(appRow.sentByChannel.get("channel2").avgSentWeekly).isEqualTo(1); assertThat(appRow.sentByApp.sentCount).isEqualTo(3); assertThat(appRow.sentByApp.lastSent).isEqualTo(6); assertThat(appRow.sentByApp.avgSentWeekly).isEqualTo(3); } private UsageEvents getUsageEvents(List<UsageEvents.Event> events) { Loading Loading
res/values/strings.xml +1 −1 Original line number Diff line number Diff line Loading @@ -8270,7 +8270,7 @@ <!-- App notification summary with notifications enabled [CHAR LIMIT=40] --> <string name="notifications_enabled">On</string> <!-- App notification summary with notifications enabled [CHAR LIMIT=40] --> <string name="notifications_enabled_with_info">On / <xliff:g id="notifications_categories_off" example="3 categories turned off">%1$s</xliff:g> </string> <string name="notifications_enabled_with_info"><xliff:g id="notifications_sent" example="~6 per week">%1$s</xliff:g> / <xliff:g id="notifications_categories_off" example="3 categories turned off">%2$s</xliff:g> </string> <!-- Label for showing apps with blocked notifications in list [CHAR LIMIT=30] --> <string name="notifications_disabled">Off</string> <!-- Label for showing apps with some blocked notifications in list [CHAR LIMIT=30] -->
src/com/android/settings/applications/appinfo/AppNotificationPreferenceController.java +3 −2 Original line number Diff line number Diff line Loading @@ -84,14 +84,15 @@ public class AppNotificationPreferenceController extends AppInfoPreferenceContro if (appRow.banned) { return context.getText(R.string.notifications_disabled); } else if (appRow.channelCount == 0) { return context.getText(R.string.notifications_enabled); return NotificationBackend.getSentSummary(context, appRow.sentByApp, false); } else if (appRow.channelCount == appRow.blockedChannelCount) { return context.getText(R.string.notifications_disabled); } else { if (appRow.blockedChannelCount == 0) { return context.getText(R.string.notifications_enabled); return NotificationBackend.getSentSummary(context, appRow.sentByApp, false); } return context.getString(R.string.notifications_enabled_with_info, NotificationBackend.getSentSummary(context, appRow.sentByApp, false), context.getResources().getQuantityString(R.plurals.notifications_categories_off, appRow.blockedChannelCount, appRow.blockedChannelCount)); } Loading
src/com/android/settings/notification/NotificationBackend.java +13 −10 Original line number Diff line number Diff line Loading @@ -73,7 +73,7 @@ public class NotificationBackend { row.userId = UserHandle.getUserId(row.uid); row.blockedChannelCount = getBlockedChannelCount(row.pkg, row.uid); row.channelCount = getChannelCount(row.pkg, row.uid); row.sentByChannel = getAggregatedUsageEvents(context, row.userId, row.pkg); recordAggregatedUsageEvents(context, row); return row; } Loading Loading @@ -271,22 +271,22 @@ public class NotificationBackend { } } protected Map<String, NotificationsSentState> getAggregatedUsageEvents( Context context, int userId, String pkg) { protected void recordAggregatedUsageEvents(Context context, AppRow appRow) { long now = System.currentTimeMillis(); long startTime = now - (DateUtils.DAY_IN_MILLIS * DAYS_TO_CHECK); UsageEvents events = null; try { events = sUsageStatsManager.queryEventsForPackageForUser( startTime, now, userId, pkg, context.getPackageName()); startTime, now, appRow.userId, appRow.pkg, context.getPackageName()); } catch (RemoteException e) { e.printStackTrace(); } return getAggregatedUsageEvents(events); recordAggregatedUsageEvents(events, appRow); } protected Map<String, NotificationsSentState> getAggregatedUsageEvents(UsageEvents events) { Map<String, NotificationsSentState> sentByChannel = new HashMap<>(); protected void recordAggregatedUsageEvents(UsageEvents events, AppRow appRow) { appRow.sentByChannel = new HashMap<>(); appRow.sentByApp = new NotificationsSentState(); if (events != null) { UsageEvents.Event event = new UsageEvents.Event(); while (events.hasNextEvent()) { Loading @@ -295,22 +295,24 @@ public class NotificationBackend { if (event.getEventType() == UsageEvents.Event.NOTIFICATION_INTERRUPTION) { String channelId = event.mNotificationChannelId; if (channelId != null) { NotificationsSentState stats = sentByChannel.get(channelId); NotificationsSentState stats = appRow.sentByChannel.get(channelId); if (stats == null) { stats = new NotificationsSentState(); sentByChannel.put(channelId, stats); appRow.sentByChannel.put(channelId, stats); } if (event.getTimeStamp() > stats.lastSent) { stats.lastSent = event.getTimeStamp(); appRow.sentByApp.lastSent = event.getTimeStamp(); } stats.sentCount++; appRow.sentByApp.sentCount++; calculateAvgSentCounts(stats); } } } calculateAvgSentCounts(appRow.sentByApp); } return sentByChannel; } public static CharSequence getSentSummary(Context context, NotificationsSentState state, Loading Loading @@ -372,5 +374,6 @@ public class NotificationBackend { public int blockedChannelCount; public int channelCount; public Map<String, NotificationsSentState> sentByChannel; public NotificationsSentState sentByApp; } }
tests/robotests/src/com/android/settings/applications/appinfo/AppNotificationPreferenceControllerTest.java +12 −4 Original line number Diff line number Diff line Loading @@ -139,10 +139,12 @@ public class AppNotificationPreferenceControllerTest { appRow.banned = false; appRow.blockedChannelCount = 30; appRow.channelCount = 60; appRow.sentByApp = new NotificationBackend.NotificationsSentState(); appRow.sentByApp.avgSentWeekly = 4; assertThat(mController.getNotificationSummary( appRow, mContext).toString().contains("30")).isTrue(); assertThat(mController.getNotificationSummary( appRow, mContext).toString().contains("On")).isTrue(); assertThat(mController.getNotificationSummary(appRow, mContext).toString().contains( NotificationBackend.getSentSummary(mContext, appRow.sentByApp, false))).isTrue(); } @Test Loading @@ -151,7 +153,10 @@ public class AppNotificationPreferenceControllerTest { appRow.banned = false; appRow.blockedChannelCount = 0; appRow.channelCount = 10; assertThat(mController.getNotificationSummary(appRow, mContext).toString()).isEqualTo("On"); appRow.sentByApp = new NotificationBackend.NotificationsSentState(); appRow.sentByApp.avgSentDaily = 4; assertThat(mController.getNotificationSummary(appRow, mContext).toString()).isEqualTo( NotificationBackend.getSentSummary(mContext, appRow.sentByApp, false)); } @Test Loading @@ -160,6 +165,9 @@ public class AppNotificationPreferenceControllerTest { appRow.banned = false; appRow.blockedChannelCount = 0; appRow.channelCount = 0; assertThat(mController.getNotificationSummary(appRow, mContext).toString()).isEqualTo("On"); appRow.sentByApp = new NotificationBackend.NotificationsSentState(); appRow.sentByApp.avgSentDaily = 7; assertThat(mController.getNotificationSummary(appRow, mContext).toString()).isEqualTo( NotificationBackend.getSentSummary(mContext, appRow.sentByApp, false)); } }
tests/robotests/src/com/android/settings/notification/NotificationBackendTest.java +19 −15 Original line number Diff line number Diff line Loading @@ -142,29 +142,33 @@ public class NotificationBackendTest { good.mNotificationChannelId = "channel1"; good.mTimeStamp = 2; events.add(good); UsageEvents.Event good1 = new UsageEvents.Event(); good1.mEventType = UsageEvents.Event.NOTIFICATION_INTERRUPTION; good1.mPackage = "pkg"; good1.mNotificationChannelId = "channel1"; good1.mTimeStamp = 6; events.add(good1); UsageEvents.Event good2 = new UsageEvents.Event(); good2.mEventType = UsageEvents.Event.NOTIFICATION_INTERRUPTION; good2.mPackage = "pkg"; good2.mNotificationChannelId = "channel2"; good2.mTimeStamp = 3; events.add(good2); UsageEvents.Event good1 = new UsageEvents.Event(); good1.mEventType = UsageEvents.Event.NOTIFICATION_INTERRUPTION; good1.mPackage = "pkg"; good1.mNotificationChannelId = "channel1"; good1.mTimeStamp = 6; events.add(good1); NotificationBackend backend = new NotificationBackend(); Map<String, NotificationBackend.NotificationsSentState> stats = backend.getAggregatedUsageEvents(getUsageEvents(events)); assertThat(stats.get("channel1").sentCount).isEqualTo(2); assertThat(stats.get("channel1").lastSent).isEqualTo(6); assertThat(stats.get("channel1").avgSentWeekly).isEqualTo(2); assertThat(stats.get("channel2").sentCount).isEqualTo(1); assertThat(stats.get("channel2").lastSent).isEqualTo(3); assertThat(stats.get("channel2").avgSentWeekly).isEqualTo(1); AppRow appRow = new AppRow(); appRow.pkg = "pkg"; backend.recordAggregatedUsageEvents(getUsageEvents(events), appRow); assertThat(appRow.sentByChannel.get("channel1").sentCount).isEqualTo(2); assertThat(appRow.sentByChannel.get("channel1").lastSent).isEqualTo(6); assertThat(appRow.sentByChannel.get("channel1").avgSentWeekly).isEqualTo(2); assertThat(appRow.sentByChannel.get("channel2").sentCount).isEqualTo(1); assertThat(appRow.sentByChannel.get("channel2").lastSent).isEqualTo(3); assertThat(appRow.sentByChannel.get("channel2").avgSentWeekly).isEqualTo(1); assertThat(appRow.sentByApp.sentCount).isEqualTo(3); assertThat(appRow.sentByApp.lastSent).isEqualTo(6); assertThat(appRow.sentByApp.avgSentWeekly).isEqualTo(3); } private UsageEvents getUsageEvents(List<UsageEvents.Event> events) { Loading