diff --git a/res/values/strings.xml b/res/values/strings.xml index 04852e0b64c..d612e81b698 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -8301,7 +8301,7 @@ Apps: All - Apps: Turned off + Turned off Categories: Urgent importance diff --git a/src/com/android/settings/applications/AppStateNotificationBridge.java b/src/com/android/settings/applications/AppStateNotificationBridge.java index d06aeb1110a..fc9e14f0af1 100644 --- a/src/com/android/settings/applications/AppStateNotificationBridge.java +++ b/src/com/android/settings/applications/AppStateNotificationBridge.java @@ -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 ""; } } @@ -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 RECENT_NOTIFICATION_COMPARATOR = new Comparator() { @Override diff --git a/src/com/android/settings/applications/manageapplications/AppFilterRegistry.java b/src/com/android/settings/applications/manageapplications/AppFilterRegistry.java index 2e4a640de4d..7d1e159ffe0 100644 --- a/src/com/android/settings/applications/manageapplications/AppFilterRegistry.java +++ b/src/com/android/settings/applications/manageapplications/AppFilterRegistry.java @@ -49,6 +49,7 @@ public class AppFilterRegistry { FILTER_APPS_WITH_OVERLAY, FILTER_APPS_WRITE_SETTINGS, FILTER_APPS_INSTALL_SOURCES, + FILTER_APPS_BLOCKED, }) @interface FilterType { } @@ -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( @@ -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() { diff --git a/src/com/android/settings/applications/manageapplications/ManageApplications.java b/src/com/android/settings/applications/manageapplications/ManageApplications.java index 35c6d1c4796..1f577b43c45 100644 --- a/src/com/android/settings/applications/manageapplications/ManageApplications.java +++ b/src/com/android/settings/applications/manageapplications/ManageApplications.java @@ -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 @@ -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) { @@ -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(); } @@ -1111,16 +1116,7 @@ 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; - } + return true; } private static boolean packageNameEquals(PackageItemInfo info1, PackageItemInfo info2) { @@ -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); } @@ -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); } diff --git a/tests/robotests/src/com/android/settings/applications/AppStateNotificationBridgeTest.java b/tests/robotests/src/com/android/settings/applications/AppStateNotificationBridgeTest.java index 8e3bb4254a0..cb504861a74 100644 --- a/tests/robotests/src/com/android/settings/applications/AppStateNotificationBridgeTest.java +++ b/tests/robotests/src/com/android/settings/applications/AppStateNotificationBridgeTest.java @@ -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 @@ -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( - mContext.getString(R.string.notifications_sent_never)); - assertThat(AppStateNotificationBridge.getSummary(mContext, sent, true).toString()) - .contains("2"); + assertThat(AppStateNotificationBridge.getSummary( + mContext, neverSent, R.id.sort_order_recent_notification)).isEqualTo( + mContext.getString(R.string.notifications_sent_never)); + assertThat(AppStateNotificationBridge.getSummary( + mContext, sent, R.id.sort_order_recent_notification).toString()).contains("2"); } @Test @@ -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(); @@ -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 entries = new ArrayList<>(); diff --git a/tests/robotests/src/com/android/settings/applications/manageapplications/ManageApplicationsTest.java b/tests/robotests/src/com/android/settings/applications/manageapplications/ManageApplicationsTest.java index c9ab7c0ebc9..b3f5b5e72e8 100644 --- a/tests/robotests/src/com/android/settings/applications/manageapplications/ManageApplicationsTest.java +++ b/tests/robotests/src/com/android/settings/applications/manageapplications/ManageApplicationsTest.java @@ -200,13 +200,13 @@ public class ManageApplicationsTest { } @Test - public void shouldUseStableItemHeight_mainType_yes() { + public void shouldUseStableItemHeight() { assertThat(ManageApplications.ApplicationsAdapter.shouldUseStableItemHeight( LIST_TYPE_MAIN)) .isTrue(); assertThat(ManageApplications.ApplicationsAdapter.shouldUseStableItemHeight( LIST_TYPE_NOTIFICATION)) - .isFalse(); + .isTrue(); } @Test