Merge "Add 'notificaton blocked' filter to notifications"
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 04852e0..d612e81 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -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] -->
diff --git a/src/com/android/settings/applications/AppStateNotificationBridge.java b/src/com/android/settings/applications/AppStateNotificationBridge.java
index d06aeb1..fc9e14f 100644
--- a/src/com/android/settings/applications/AppStateNotificationBridge.java
+++ b/src/com/android/settings/applications/AppStateNotificationBridge.java
@@ -100,18 +100,20 @@
     }
 
     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 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
diff --git a/src/com/android/settings/applications/manageapplications/AppFilterRegistry.java b/src/com/android/settings/applications/manageapplications/AppFilterRegistry.java
index 2e4a640..7d1e159 100644
--- a/src/com/android/settings/applications/manageapplications/AppFilterRegistry.java
+++ b/src/com/android/settings/applications/manageapplications/AppFilterRegistry.java
@@ -49,6 +49,7 @@
             FILTER_APPS_WITH_OVERLAY,
             FILTER_APPS_WRITE_SETTINGS,
             FILTER_APPS_INSTALL_SOURCES,
+            FILTER_APPS_BLOCKED,
     })
     @interface FilterType {
     }
@@ -71,14 +72,15 @@
     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 @@
                 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 35c6d1c..1f577b4 100644
--- a/src/com/android/settings/applications/manageapplications/ManageApplications.java
+++ b/src/com/android/settings/applications/manageapplications/ManageApplications.java
@@ -21,6 +21,8 @@
 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
         .FILTER_APPS_ENABLED;
@@ -409,6 +411,7 @@
         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 @@
                 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 @@
 
         @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 @@
                     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 @@
                     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 8e3bb42..cb50486 100644
--- a/tests/robotests/src/com/android/settings/applications/AppStateNotificationBridgeTest.java
+++ b/tests/robotests/src/com/android/settings/applications/AppStateNotificationBridgeTest.java
@@ -19,6 +19,8 @@
 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
         .FILTER_APP_NOTIFICATION_RECENCY;
@@ -379,10 +381,11 @@
         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,13 +395,24 @@
         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();
         allowState.lastSent = 1;
@@ -433,6 +447,23 @@
     }
 
     @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<>();
         AppEntry a = mock(AppEntry.class);
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 c9ab7c0..b3f5b5e 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 @@
     }
 
     @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