diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 8767198828e..fc49e02867e 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -2639,6 +2639,8 @@ + Additional settings in the app - Turned on for all apps + On for all apps - Turned off for %d app - Turned off for %d apps + Off for %d app + Off for %d apps diff --git a/src/com/android/settings/applications/appinfo/AppNotificationPreferenceController.java b/src/com/android/settings/applications/appinfo/AppNotificationPreferenceController.java index 4c1f0092974..33b44ff9996 100644 --- a/src/com/android/settings/applications/appinfo/AppNotificationPreferenceController.java +++ b/src/com/android/settings/applications/appinfo/AppNotificationPreferenceController.java @@ -81,11 +81,15 @@ public class AppNotificationPreferenceController extends AppInfoPreferenceContro 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 c9aa19d69a3..1ca4a4d6a2c 100644 --- a/src/com/android/settings/notification/ConfigureNotificationSettings.java +++ b/src/com/android/settings/notification/ConfigureNotificationSettings.java @@ -26,11 +26,13 @@ import android.os.UserHandle; 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; @@ -151,6 +153,54 @@ public class ConfigureNotificationSettings extends DashboardFragment { } } + /** + * 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. */ diff --git a/src/com/android/settings/notification/NotificationBackend.java b/src/com/android/settings/notification/NotificationBackend.java index 62c83886b05..5e8ef19d977 100644 --- a/src/com/android/settings/notification/NotificationBackend.java +++ b/src/com/android/settings/notification/NotificationBackend.java @@ -250,6 +250,15 @@ public class NotificationBackend { } } + 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 a453f7840b5..88526dc890b 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 @@ public class AppNotificationPreferenceControllerTest { 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 51f5a6ae9ed..d3463ce770b 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 @@ import java.util.List; @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 @@ public class ConfigureNotificationSettingsTest { 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 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 captor = ArgumentCaptor.forClass(CharSequence.class); + verify(loader).setSummary(any(), captor.capture()); + + assertThat(captor.getValue().toString()).contains("Off"); + assertThat(captor.getValue().toString()).contains("5"); + } }