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");
+ }
}