Notification summary updates

- Fix app info summary
- Add configure notifications summary

Test: make -j RunSettingsRoboTests
Change-Id: Ic3c3036ee903fe7403032925a8145693807793d5
Fixes: 77598357
Fixes: 73018368
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 8767198..fc49e02 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -2639,6 +2639,8 @@
             </intent-filter>
             <meta-data android:name="com.android.settings.category"
                 android:value="com.android.settings.category.ia.apps"/>
+            <meta-data android:name="com.android.settings.summary"
+                       android:resource="@string/summary_empty"/>
             <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
                 android:value="com.android.settings.notification.ConfigureNotificationSettings" />
             <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
diff --git a/res/values/strings.xml b/res/values/strings.xml
index a351bd8..23c7d8a 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -7645,11 +7645,11 @@
     <string name="app_settings_link">Additional settings in the app</string>
 
     <!-- [CHAR LIMIT=45] App notification listing summary, blocked apps -->
-    <string name="app_notification_listing_summary_zero">Turned on for all apps</string>
+    <string name="app_notification_listing_summary_zero">On for all apps</string>
     <!-- [CHAR LIMIT=45] App notification listing summary, blocked apps -->
     <plurals name="app_notification_listing_summary_others">
-        <item quantity="one">Turned off for <xliff:g id="count" example="1">%d</xliff:g> app</item>
-        <item quantity="other">Turned off for <xliff:g id="count" example="10">%d</xliff:g> apps</item>
+        <item quantity="one">Off for <xliff:g id="count" example="1">%d</xliff:g> app</item>
+        <item quantity="other">Off for <xliff:g id="count" example="10">%d</xliff:g> apps</item>
     </plurals>
 
     <!-- [CHAR LIMIT=NONE] Footer listing a count of deleted channels. -->
diff --git a/src/com/android/settings/applications/appinfo/AppNotificationPreferenceController.java b/src/com/android/settings/applications/appinfo/AppNotificationPreferenceController.java
index 4c1f009..33b44ff 100644
--- a/src/com/android/settings/applications/appinfo/AppNotificationPreferenceController.java
+++ b/src/com/android/settings/applications/appinfo/AppNotificationPreferenceController.java
@@ -81,11 +81,15 @@
         if (appRow == null) {
             return "";
         }
-        if (appRow.banned || appRow.channelCount == appRow.blockedChannelCount) {
-            return context.getString(R.string.notifications_disabled);
+        if (appRow.banned) {
+            return context.getText(R.string.notifications_disabled);
+        } else if (appRow.channelCount == 0) {
+            return context.getText(R.string.notifications_enabled);
+        } else if (appRow.channelCount == appRow.blockedChannelCount) {
+            return context.getText(R.string.notifications_disabled);
         } else {
             if (appRow.blockedChannelCount == 0) {
-                return context.getString(R.string.notifications_enabled);
+                return context.getText(R.string.notifications_enabled);
             }
             return context.getString(R.string.notifications_enabled_with_info,
                     context.getResources().getQuantityString(R.plurals.notifications_categories_off,
diff --git a/src/com/android/settings/notification/ConfigureNotificationSettings.java b/src/com/android/settings/notification/ConfigureNotificationSettings.java
index c9aa19d..1ca4a4d 100644
--- a/src/com/android/settings/notification/ConfigureNotificationSettings.java
+++ b/src/com/android/settings/notification/ConfigureNotificationSettings.java
@@ -26,11 +26,13 @@
 import android.provider.SearchIndexableResource;
 import android.support.annotation.VisibleForTesting;
 import android.support.v7.preference.Preference;
+import android.text.TextUtils;
 
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.settings.R;
 import com.android.settings.RingtonePreference;
 import com.android.settings.dashboard.DashboardFragment;
+import com.android.settings.dashboard.SummaryLoader;
 import com.android.settings.gestures.SwipeToNotificationPreferenceController;
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.search.Indexable;
@@ -152,6 +154,54 @@
     }
 
     /**
+     * For summary
+     */
+    static class SummaryProvider implements SummaryLoader.SummaryProvider {
+
+        private final Context mContext;
+        private final SummaryLoader mSummaryLoader;
+        private NotificationBackend mBackend;
+
+        public SummaryProvider(Context context, SummaryLoader summaryLoader) {
+            mContext = context;
+            mSummaryLoader = summaryLoader;
+            mBackend = new NotificationBackend();
+        }
+
+        @VisibleForTesting
+        protected void setBackend(NotificationBackend backend) {
+            mBackend = backend;
+        }
+
+        @Override
+        public void setListening(boolean listening) {
+            if (!listening) {
+                return;
+            }
+            int blockedAppCount = mBackend.getBlockedAppCount();
+            if (blockedAppCount == 0) {
+                mSummaryLoader.setSummary(this,
+                        mContext.getText(R.string.app_notification_listing_summary_zero));
+            } else {
+                mSummaryLoader.setSummary(this,
+                        mContext.getResources().getQuantityString(
+                                R.plurals.app_notification_listing_summary_others,
+                                blockedAppCount, blockedAppCount));
+            }
+        }
+    }
+
+    public static final SummaryLoader.SummaryProviderFactory SUMMARY_PROVIDER_FACTORY =
+            new SummaryLoader.SummaryProviderFactory() {
+                @Override
+                public SummaryLoader.SummaryProvider createSummaryProvider(Activity activity,
+                        SummaryLoader summaryLoader) {
+                    return new ConfigureNotificationSettings.SummaryProvider(
+                            activity, summaryLoader);
+                }
+            };
+
+    /**
      * For Search.
      */
     public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
diff --git a/src/com/android/settings/notification/NotificationBackend.java b/src/com/android/settings/notification/NotificationBackend.java
index 62c8388..5e8ef19 100644
--- a/src/com/android/settings/notification/NotificationBackend.java
+++ b/src/com/android/settings/notification/NotificationBackend.java
@@ -250,6 +250,15 @@
         }
     }
 
+    public int getBlockedAppCount() {
+        try {
+            return sINM.getBlockedAppCount(UserHandle.myUserId());
+        } catch (Exception e) {
+            Log.w(TAG, "Error calling NoMan", e);
+            return 0;
+        }
+    }
+
     static class Row {
         public String section;
     }
diff --git a/tests/robotests/src/com/android/settings/applications/appinfo/AppNotificationPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/applications/appinfo/AppNotificationPreferenceControllerTest.java
index a453f78..88526dc 100644
--- a/tests/robotests/src/com/android/settings/applications/appinfo/AppNotificationPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/appinfo/AppNotificationPreferenceControllerTest.java
@@ -150,4 +150,13 @@
         appRow.channelCount = 10;
         assertThat(mController.getNotificationSummary(appRow, mContext).toString()).isEqualTo("On");
     }
+
+    @Test
+    public void getNotificationSummary_noChannels() {
+        NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
+        appRow.banned = false;
+        appRow.blockedChannelCount = 0;
+        appRow.channelCount = 0;
+        assertThat(mController.getNotificationSummary(appRow, mContext).toString()).isEqualTo("On");
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/notification/ConfigureNotificationSettingsTest.java b/tests/robotests/src/com/android/settings/notification/ConfigureNotificationSettingsTest.java
index 51f5a6a..d3463ce 100644
--- a/tests/robotests/src/com/android/settings/notification/ConfigureNotificationSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/notification/ConfigureNotificationSettingsTest.java
@@ -17,17 +17,35 @@
 package com.android.settings.notification;
 
 import static com.android.settings.notification.ConfigureNotificationSettings.KEY_LOCKSCREEN;
-import static com.android.settings.notification.ConfigureNotificationSettings.KEY_LOCKSCREEN_WORK_PROFILE;
-import static com.android.settings.notification.ConfigureNotificationSettings.KEY_LOCKSCREEN_WORK_PROFILE_HEADER;
+import static com.android.settings.notification.ConfigureNotificationSettings
+        .KEY_LOCKSCREEN_WORK_PROFILE;
+import static com.android.settings.notification.ConfigureNotificationSettings
+        .KEY_LOCKSCREEN_WORK_PROFILE_HEADER;
 import static com.android.settings.notification.ConfigureNotificationSettings.KEY_SWIPE_DOWN;
+import static com.android.settings.notification.ConfigureNotificationSettings
+        .SUMMARY_PROVIDER_FACTORY;
+
 import static com.google.common.truth.Truth.assertThat;
 
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.app.Activity;
+
+import com.android.settings.dashboard.SummaryLoader;
+import com.android.settings.notification.ConfigureNotificationSettings.SummaryProvider;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settings.testutils.shadow.ShadowLockPatternUtils;
 import com.android.settings.testutils.shadow.ShadowUtils;
 
+import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.robolectric.Robolectric;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 
@@ -36,6 +54,13 @@
 @RunWith(SettingsRobolectricTestRunner.class)
 public class ConfigureNotificationSettingsTest {
 
+    private Activity mActivity;
+
+    @Before
+    public void setUp() {
+        mActivity = spy(Robolectric.buildActivity(Activity.class).get());
+    }
+
     @Test
     @Config(shadows = {
             ShadowUtils.class,
@@ -49,4 +74,39 @@
                 KEY_SWIPE_DOWN, KEY_LOCKSCREEN, KEY_LOCKSCREEN_WORK_PROFILE,
                 KEY_LOCKSCREEN_WORK_PROFILE_HEADER);
     }
+
+    @Test
+    public void getSummary_noneBlocked() {
+        SummaryLoader loader = mock(SummaryLoader.class);
+        NotificationBackend backend = mock(NotificationBackend.class);
+        when(backend.getBlockedAppCount()).thenReturn(0);
+        SummaryProvider provider =
+                (SummaryProvider) SUMMARY_PROVIDER_FACTORY.createSummaryProvider(mActivity, loader);
+        provider.setBackend(backend);
+
+        provider.setListening(true);
+
+        ArgumentCaptor<CharSequence> captor = ArgumentCaptor.forClass(CharSequence.class);
+        verify(loader).setSummary(any(), captor.capture());
+
+        assertThat(captor.getValue().toString()).contains("On");
+    }
+
+    @Test
+    public void getSummary_someBlocked() {
+        SummaryLoader loader = mock(SummaryLoader.class);
+        NotificationBackend backend = mock(NotificationBackend.class);
+        when(backend.getBlockedAppCount()).thenReturn(5);
+        SummaryProvider provider =
+                (SummaryProvider) SUMMARY_PROVIDER_FACTORY.createSummaryProvider(mActivity, loader);
+        provider.setBackend(backend);
+
+        provider.setListening(true);
+
+        ArgumentCaptor<CharSequence> captor = ArgumentCaptor.forClass(CharSequence.class);
+        verify(loader).setSummary(any(), captor.capture());
+
+        assertThat(captor.getValue().toString()).contains("Off");
+        assertThat(captor.getValue().toString()).contains("5");
+    }
 }