Loading res/values/strings.xml +1 −1 Original line number Diff line number Diff line Loading @@ -8301,7 +8301,7 @@ <!-- Label for showing apps with blocked notifications in list [CHAR LIMIT=30] --> <string name="filter_notif_all_apps">Apps: All</string> <!-- Label for showing apps with blocked notifications in list [CHAR LIMIT=30] --> <string name="filter_notif_blocked_apps">Apps: Turned off</string> <string name="filter_notif_blocked_apps">Turned off</string> <!-- Label for showing categories with urgent notifications in list [CHAR LIMIT=30] --> <string name="filter_notif_urgent_channels">Categories: Urgent importance</string> <!-- Label for showing categories with low importance notifications in list [CHAR LIMIT=30] --> src/com/android/settings/applications/AppStateNotificationBridge.java +20 −3 Original line number Diff line number Diff line Loading @@ -100,18 +100,20 @@ public class AppStateNotificationBridge extends AppStateBaseBridge { } public static CharSequence getSummary(Context context, NotificationsSentState state, boolean sortByRecency) { if (sortByRecency) { int sortOrder) { if (sortOrder == R.id.sort_order_recent_notification) { if (state.lastSent == 0) { return context.getString(R.string.notifications_sent_never); } return StringUtil.formatRelativeTime( context, System.currentTimeMillis() - state.lastSent, true); } else { } else if (sortOrder == R.id.sort_order_frequent_notification) { if (state.avgSentWeekly > 0) { return context.getString(R.string.notifications_sent_weekly, state.avgSentWeekly); } return context.getString(R.string.notifications_sent_daily, state.avgSentDaily); } else { return ""; } } Loading Loading @@ -267,6 +269,21 @@ public class AppStateNotificationBridge extends AppStateBaseBridge { } }; public static final AppFilter FILTER_APP_NOTIFICATION_BLOCKED = new AppFilter() { @Override public void init() { } @Override public boolean filterApp(AppEntry info) { NotificationsSentState state = getNotificationsSentState(info); if (state != null) { return state.blocked; } return false; } }; public static final Comparator<AppEntry> RECENT_NOTIFICATION_COMPARATOR = new Comparator<AppEntry>() { @Override Loading src/com/android/settings/applications/manageapplications/AppFilterRegistry.java +10 −2 Original line number Diff line number Diff line Loading @@ -49,6 +49,7 @@ public class AppFilterRegistry { FILTER_APPS_WITH_OVERLAY, FILTER_APPS_WRITE_SETTINGS, FILTER_APPS_INSTALL_SOURCES, FILTER_APPS_BLOCKED, }) @interface FilterType { } Loading @@ -71,14 +72,15 @@ public class AppFilterRegistry { public static final int FILTER_APPS_INSTALL_SOURCES = 13; public static final int FILTER_APP_HAS_DIRECTORY_ACCESS = 14; public static final int FILTER_APP_CAN_CHANGE_WIFI_STATE = 15; // Next id: 16 public static final int FILTER_APPS_BLOCKED = 16; // Next id: 17 private static AppFilterRegistry sRegistry; private final AppFilterItem[] mFilters; private AppFilterRegistry() { mFilters = new AppFilterItem[16]; mFilters = new AppFilterItem[17]; // High power whitelist, on mFilters[FILTER_APPS_POWER_WHITELIST] = new AppFilterItem( Loading Loading @@ -178,6 +180,12 @@ public class AppFilterRegistry { AppStateChangeWifiStateBridge.FILTER_CHANGE_WIFI_STATE, FILTER_APP_CAN_CHANGE_WIFI_STATE, R.string.filter_write_settings_apps); // Blocked Notifications mFilters[FILTER_APPS_BLOCKED] = new AppFilterItem( AppStateNotificationBridge.FILTER_APP_NOTIFICATION_BLOCKED, FILTER_APPS_BLOCKED, R.string.filter_notif_blocked_apps); } public static AppFilterRegistry getInstance() { Loading src/com/android/settings/applications/manageapplications/ManageApplications.java +8 −14 Original line number Diff line number Diff line Loading @@ -20,6 +20,8 @@ import static androidx.recyclerview.widget.RecyclerView.SCROLL_STATE_IDLE; import static com.android.settings.applications.manageapplications.AppFilterRegistry .FILTER_APPS_ALL; import static com.android.settings.applications.manageapplications.AppFilterRegistry .FILTER_APPS_BLOCKED; import static com.android.settings.applications.manageapplications.AppFilterRegistry .FILTER_APPS_DISABLED; import static com.android.settings.applications.manageapplications.AppFilterRegistry Loading Loading @@ -409,6 +411,7 @@ public class ManageApplications extends InstrumentedFragment if (mListType == LIST_TYPE_NOTIFICATION) { mFilterAdapter.enableFilter(FILTER_APPS_RECENT); mFilterAdapter.enableFilter(FILTER_APPS_FREQUENT); mFilterAdapter.enableFilter(FILTER_APPS_BLOCKED); mFilterAdapter.disableFilter(FILTER_APPS_ALL); } if (mListType == LIST_TYPE_HIGH_POWER) { Loading Loading @@ -955,6 +958,8 @@ public class ManageApplications extends InstrumentedFragment rebuild(R.id.sort_order_frequent_notification); } else if (FILTER_APPS_RECENT == appFilter.getFilterType()) { rebuild(R.id.sort_order_recent_notification); } else if (FILTER_APPS_BLOCKED == appFilter.getFilterType()) { rebuild(R.id.sort_order_alpha); } else { rebuild(); } Loading Loading @@ -1111,17 +1116,8 @@ public class ManageApplications extends InstrumentedFragment @VisibleForTesting static boolean shouldUseStableItemHeight(int listType) { switch (listType) { case LIST_TYPE_NOTIFICATION: // Most entries in notification type has no summary. Don't use stable height // so height is short for most entries. return false; default: // Other types have non-empty summary, so keep the height as we expect summary // to fill in. return true; } } private static boolean packageNameEquals(PackageItemInfo info1, PackageItemInfo info2) { if (info1 == null || info2 == null) { Loading Loading @@ -1338,8 +1334,7 @@ public class ManageApplications extends InstrumentedFragment if (entry.extraInfo != null && entry.extraInfo instanceof NotificationsSentState) { holder.setSummary(AppStateNotificationBridge.getSummary(mContext, (NotificationsSentState) entry.extraInfo, (mLastSortMode == R.id.sort_order_recent_notification))); (NotificationsSentState) entry.extraInfo, mLastSortMode)); } else { holder.setSummary(null); } Loading Loading @@ -1388,8 +1383,7 @@ public class ManageApplications extends InstrumentedFragment if (entry.extraInfo != null && entry.extraInfo instanceof NotificationsSentState) { holder.setSummary(AppStateNotificationBridge.getSummary(mContext, (NotificationsSentState) entry.extraInfo, (mLastSortMode == R.id.sort_order_recent_notification))); (NotificationsSentState) entry.extraInfo, mLastSortMode)); } else { holder.setSummary(null); } Loading tests/robotests/src/com/android/settings/applications/AppStateNotificationBridgeTest.java +37 −6 Original line number Diff line number Diff line Loading @@ -18,6 +18,8 @@ package com.android.settings.applications; import static android.text.format.DateUtils.DAY_IN_MILLIS; import static com.android.settings.applications.AppStateNotificationBridge .FILTER_APP_NOTIFICATION_BLOCKED; import static com.android.settings.applications.AppStateNotificationBridge .FILTER_APP_NOTIFICATION_FREQUENCY; import static com.android.settings.applications.AppStateNotificationBridge Loading Loading @@ -379,10 +381,11 @@ public class AppStateNotificationBridgeTest { NotificationsSentState sent = new NotificationsSentState(); sent.lastSent = System.currentTimeMillis() - (2 * DAY_IN_MILLIS); assertThat(AppStateNotificationBridge.getSummary(mContext, neverSent, true)).isEqualTo( assertThat(AppStateNotificationBridge.getSummary( mContext, neverSent, R.id.sort_order_recent_notification)).isEqualTo( mContext.getString(R.string.notifications_sent_never)); assertThat(AppStateNotificationBridge.getSummary(mContext, sent, true).toString()) .contains("2"); assertThat(AppStateNotificationBridge.getSummary( mContext, sent, R.id.sort_order_recent_notification).toString()).contains("2"); } @Test Loading @@ -392,12 +395,23 @@ public class AppStateNotificationBridgeTest { NotificationsSentState sentOften = new NotificationsSentState(); sentOften.avgSentDaily = 8; assertThat(AppStateNotificationBridge.getSummary(mContext, sentRarely, false).toString()) assertThat(AppStateNotificationBridge.getSummary( mContext, sentRarely, R.id.sort_order_frequent_notification).toString()) .contains("1"); assertThat(AppStateNotificationBridge.getSummary(mContext, sentOften, false).toString()) assertThat(AppStateNotificationBridge.getSummary( mContext, sentOften, R.id.sort_order_frequent_notification).toString()) .contains("8"); } @Test public void testSummary_alpha() { NotificationsSentState sentRarely = new NotificationsSentState(); sentRarely.avgSentWeekly = 1; assertThat(AppStateNotificationBridge.getSummary( mContext, sentRarely, R.id.sort_order_alpha).toString()) .isEqualTo(""); } @Test public void testFilterRecency() { NotificationsSentState allowState = new NotificationsSentState(); Loading Loading @@ -432,6 +446,23 @@ public class AppStateNotificationBridgeTest { assertFalse(FILTER_APP_NOTIFICATION_FREQUENCY.filterApp(deny)); } @Test public void testFilterBlocked() { NotificationsSentState allowState = new NotificationsSentState(); allowState.blocked = true; AppEntry allow = mock(AppEntry.class); allow.extraInfo = allowState; assertTrue(FILTER_APP_NOTIFICATION_BLOCKED.filterApp(allow)); NotificationsSentState denyState = new NotificationsSentState(); denyState.blocked = false; AppEntry deny = mock(AppEntry.class); deny.extraInfo = denyState; assertFalse(FILTER_APP_NOTIFICATION_BLOCKED.filterApp(deny)); } @Test public void testComparators_nullsNoCrash() { List<AppEntry> entries = new ArrayList<>(); Loading Loading
res/values/strings.xml +1 −1 Original line number Diff line number Diff line Loading @@ -8301,7 +8301,7 @@ <!-- Label for showing apps with blocked notifications in list [CHAR LIMIT=30] --> <string name="filter_notif_all_apps">Apps: All</string> <!-- Label for showing apps with blocked notifications in list [CHAR LIMIT=30] --> <string name="filter_notif_blocked_apps">Apps: Turned off</string> <string name="filter_notif_blocked_apps">Turned off</string> <!-- Label for showing categories with urgent notifications in list [CHAR LIMIT=30] --> <string name="filter_notif_urgent_channels">Categories: Urgent importance</string> <!-- Label for showing categories with low importance notifications in list [CHAR LIMIT=30] -->
src/com/android/settings/applications/AppStateNotificationBridge.java +20 −3 Original line number Diff line number Diff line Loading @@ -100,18 +100,20 @@ public class AppStateNotificationBridge extends AppStateBaseBridge { } public static CharSequence getSummary(Context context, NotificationsSentState state, boolean sortByRecency) { if (sortByRecency) { int sortOrder) { if (sortOrder == R.id.sort_order_recent_notification) { if (state.lastSent == 0) { return context.getString(R.string.notifications_sent_never); } return StringUtil.formatRelativeTime( context, System.currentTimeMillis() - state.lastSent, true); } else { } else if (sortOrder == R.id.sort_order_frequent_notification) { if (state.avgSentWeekly > 0) { return context.getString(R.string.notifications_sent_weekly, state.avgSentWeekly); } return context.getString(R.string.notifications_sent_daily, state.avgSentDaily); } else { return ""; } } Loading Loading @@ -267,6 +269,21 @@ public class AppStateNotificationBridge extends AppStateBaseBridge { } }; public static final AppFilter FILTER_APP_NOTIFICATION_BLOCKED = new AppFilter() { @Override public void init() { } @Override public boolean filterApp(AppEntry info) { NotificationsSentState state = getNotificationsSentState(info); if (state != null) { return state.blocked; } return false; } }; public static final Comparator<AppEntry> RECENT_NOTIFICATION_COMPARATOR = new Comparator<AppEntry>() { @Override Loading
src/com/android/settings/applications/manageapplications/AppFilterRegistry.java +10 −2 Original line number Diff line number Diff line Loading @@ -49,6 +49,7 @@ public class AppFilterRegistry { FILTER_APPS_WITH_OVERLAY, FILTER_APPS_WRITE_SETTINGS, FILTER_APPS_INSTALL_SOURCES, FILTER_APPS_BLOCKED, }) @interface FilterType { } Loading @@ -71,14 +72,15 @@ public class AppFilterRegistry { public static final int FILTER_APPS_INSTALL_SOURCES = 13; public static final int FILTER_APP_HAS_DIRECTORY_ACCESS = 14; public static final int FILTER_APP_CAN_CHANGE_WIFI_STATE = 15; // Next id: 16 public static final int FILTER_APPS_BLOCKED = 16; // Next id: 17 private static AppFilterRegistry sRegistry; private final AppFilterItem[] mFilters; private AppFilterRegistry() { mFilters = new AppFilterItem[16]; mFilters = new AppFilterItem[17]; // High power whitelist, on mFilters[FILTER_APPS_POWER_WHITELIST] = new AppFilterItem( Loading Loading @@ -178,6 +180,12 @@ public class AppFilterRegistry { AppStateChangeWifiStateBridge.FILTER_CHANGE_WIFI_STATE, FILTER_APP_CAN_CHANGE_WIFI_STATE, R.string.filter_write_settings_apps); // Blocked Notifications mFilters[FILTER_APPS_BLOCKED] = new AppFilterItem( AppStateNotificationBridge.FILTER_APP_NOTIFICATION_BLOCKED, FILTER_APPS_BLOCKED, R.string.filter_notif_blocked_apps); } public static AppFilterRegistry getInstance() { Loading
src/com/android/settings/applications/manageapplications/ManageApplications.java +8 −14 Original line number Diff line number Diff line Loading @@ -20,6 +20,8 @@ import static androidx.recyclerview.widget.RecyclerView.SCROLL_STATE_IDLE; import static com.android.settings.applications.manageapplications.AppFilterRegistry .FILTER_APPS_ALL; import static com.android.settings.applications.manageapplications.AppFilterRegistry .FILTER_APPS_BLOCKED; import static com.android.settings.applications.manageapplications.AppFilterRegistry .FILTER_APPS_DISABLED; import static com.android.settings.applications.manageapplications.AppFilterRegistry Loading Loading @@ -409,6 +411,7 @@ public class ManageApplications extends InstrumentedFragment if (mListType == LIST_TYPE_NOTIFICATION) { mFilterAdapter.enableFilter(FILTER_APPS_RECENT); mFilterAdapter.enableFilter(FILTER_APPS_FREQUENT); mFilterAdapter.enableFilter(FILTER_APPS_BLOCKED); mFilterAdapter.disableFilter(FILTER_APPS_ALL); } if (mListType == LIST_TYPE_HIGH_POWER) { Loading Loading @@ -955,6 +958,8 @@ public class ManageApplications extends InstrumentedFragment rebuild(R.id.sort_order_frequent_notification); } else if (FILTER_APPS_RECENT == appFilter.getFilterType()) { rebuild(R.id.sort_order_recent_notification); } else if (FILTER_APPS_BLOCKED == appFilter.getFilterType()) { rebuild(R.id.sort_order_alpha); } else { rebuild(); } Loading Loading @@ -1111,17 +1116,8 @@ public class ManageApplications extends InstrumentedFragment @VisibleForTesting static boolean shouldUseStableItemHeight(int listType) { switch (listType) { case LIST_TYPE_NOTIFICATION: // Most entries in notification type has no summary. Don't use stable height // so height is short for most entries. return false; default: // Other types have non-empty summary, so keep the height as we expect summary // to fill in. return true; } } private static boolean packageNameEquals(PackageItemInfo info1, PackageItemInfo info2) { if (info1 == null || info2 == null) { Loading Loading @@ -1338,8 +1334,7 @@ public class ManageApplications extends InstrumentedFragment if (entry.extraInfo != null && entry.extraInfo instanceof NotificationsSentState) { holder.setSummary(AppStateNotificationBridge.getSummary(mContext, (NotificationsSentState) entry.extraInfo, (mLastSortMode == R.id.sort_order_recent_notification))); (NotificationsSentState) entry.extraInfo, mLastSortMode)); } else { holder.setSummary(null); } Loading Loading @@ -1388,8 +1383,7 @@ public class ManageApplications extends InstrumentedFragment if (entry.extraInfo != null && entry.extraInfo instanceof NotificationsSentState) { holder.setSummary(AppStateNotificationBridge.getSummary(mContext, (NotificationsSentState) entry.extraInfo, (mLastSortMode == R.id.sort_order_recent_notification))); (NotificationsSentState) entry.extraInfo, mLastSortMode)); } else { holder.setSummary(null); } Loading
tests/robotests/src/com/android/settings/applications/AppStateNotificationBridgeTest.java +37 −6 Original line number Diff line number Diff line Loading @@ -18,6 +18,8 @@ package com.android.settings.applications; import static android.text.format.DateUtils.DAY_IN_MILLIS; import static com.android.settings.applications.AppStateNotificationBridge .FILTER_APP_NOTIFICATION_BLOCKED; import static com.android.settings.applications.AppStateNotificationBridge .FILTER_APP_NOTIFICATION_FREQUENCY; import static com.android.settings.applications.AppStateNotificationBridge Loading Loading @@ -379,10 +381,11 @@ public class AppStateNotificationBridgeTest { NotificationsSentState sent = new NotificationsSentState(); sent.lastSent = System.currentTimeMillis() - (2 * DAY_IN_MILLIS); assertThat(AppStateNotificationBridge.getSummary(mContext, neverSent, true)).isEqualTo( assertThat(AppStateNotificationBridge.getSummary( mContext, neverSent, R.id.sort_order_recent_notification)).isEqualTo( mContext.getString(R.string.notifications_sent_never)); assertThat(AppStateNotificationBridge.getSummary(mContext, sent, true).toString()) .contains("2"); assertThat(AppStateNotificationBridge.getSummary( mContext, sent, R.id.sort_order_recent_notification).toString()).contains("2"); } @Test Loading @@ -392,12 +395,23 @@ public class AppStateNotificationBridgeTest { NotificationsSentState sentOften = new NotificationsSentState(); sentOften.avgSentDaily = 8; assertThat(AppStateNotificationBridge.getSummary(mContext, sentRarely, false).toString()) assertThat(AppStateNotificationBridge.getSummary( mContext, sentRarely, R.id.sort_order_frequent_notification).toString()) .contains("1"); assertThat(AppStateNotificationBridge.getSummary(mContext, sentOften, false).toString()) assertThat(AppStateNotificationBridge.getSummary( mContext, sentOften, R.id.sort_order_frequent_notification).toString()) .contains("8"); } @Test public void testSummary_alpha() { NotificationsSentState sentRarely = new NotificationsSentState(); sentRarely.avgSentWeekly = 1; assertThat(AppStateNotificationBridge.getSummary( mContext, sentRarely, R.id.sort_order_alpha).toString()) .isEqualTo(""); } @Test public void testFilterRecency() { NotificationsSentState allowState = new NotificationsSentState(); Loading Loading @@ -432,6 +446,23 @@ public class AppStateNotificationBridgeTest { assertFalse(FILTER_APP_NOTIFICATION_FREQUENCY.filterApp(deny)); } @Test public void testFilterBlocked() { NotificationsSentState allowState = new NotificationsSentState(); allowState.blocked = true; AppEntry allow = mock(AppEntry.class); allow.extraInfo = allowState; assertTrue(FILTER_APP_NOTIFICATION_BLOCKED.filterApp(allow)); NotificationsSentState denyState = new NotificationsSentState(); denyState.blocked = false; AppEntry deny = mock(AppEntry.class); deny.extraInfo = denyState; assertFalse(FILTER_APP_NOTIFICATION_BLOCKED.filterApp(deny)); } @Test public void testComparators_nullsNoCrash() { List<AppEntry> entries = new ArrayList<>(); Loading