diff --git a/res/values/strings.xml b/res/values/strings.xml
index 8d5c400f881..50331630c7a 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -6515,6 +6515,9 @@
Work notifications
+
+ Allow icon badges
+
Blink light
diff --git a/res/xml/configure_notification_settings.xml b/res/xml/configure_notification_settings.xml
index a6ffff4689a..2b9246bb6cb 100644
--- a/res/xml/configure_notification_settings.xml
+++ b/res/xml/configure_notification_settings.xml
@@ -22,6 +22,11 @@
android:key="dashboard_tile_placeholder"
android:order="1"/>
+
+
+
buildPreferenceControllers(Context context,
Lifecycle lifecycle) {
final List controllers = new ArrayList<>();
+ final BadgingNotificationPreferenceController badgeController =
+ new BadgingNotificationPreferenceController(context);
final PulseNotificationPreferenceController pulseController =
new PulseNotificationPreferenceController(context);
final LockScreenNotificationPreferenceController lockScreenNotificationController =
@@ -67,6 +69,7 @@ public class ConfigureNotificationSettings extends DashboardFragment {
lifecycle.addObserver(lockScreenNotificationController);
}
controllers.add(new SwipeToNotificationPreferenceController(context, lifecycle));
+ controllers.add(badgeController);
controllers.add(pulseController);
controllers.add(lockScreenNotificationController);
return controllers;
diff --git a/tests/robotests/src/com/android/settings/notification/BadgingNotificationPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/BadgingNotificationPreferenceControllerTest.java
new file mode 100644
index 00000000000..618574cdda4
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/notification/BadgingNotificationPreferenceControllerTest.java
@@ -0,0 +1,109 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.notification;
+
+import android.content.Context;
+import android.provider.Settings;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceScreen;
+import android.support.v7.preference.TwoStatePreference;
+
+import com.android.settings.TestConfig;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Answers;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowApplication;
+
+import static android.provider.Settings.Secure.NOTIFICATION_BADGING;
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+@RunWith(RobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class BadgingNotificationPreferenceControllerTest {
+
+ @Mock(answer = Answers.RETURNS_DEEP_STUBS)
+ private Context mContext;
+ @Mock(answer = Answers.RETURNS_DEEP_STUBS)
+ private PreferenceScreen mScreen;
+
+ private BadgingNotificationPreferenceController mController;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mController = new BadgingNotificationPreferenceController(mContext);
+ }
+
+ @Test
+ public void display_configIsTrue_shouldDisplay() {
+ when(mContext.getResources().
+ getBoolean(com.android.internal.R.bool.config_notificationBadging))
+ .thenReturn(true);
+ mController.displayPreference(mScreen);
+
+ verify(mScreen, never()).removePreference(any(Preference.class));
+ }
+
+ @Test
+ public void display_configIsFalse_shouldNotDisplay() {
+ when(mContext.getResources().
+ getBoolean(com.android.internal.R.bool.config_notificationBadging))
+ .thenReturn(false);
+ final Preference preference = mock(Preference.class);
+ when(mScreen.getPreferenceCount()).thenReturn(1);
+ when(mScreen.getPreference(0)).thenReturn(preference);
+ when(preference.getKey()).thenReturn(mController.getPreferenceKey());
+
+ mController.displayPreference(mScreen);
+
+ verify(mScreen).removePreference(any(Preference.class));
+ }
+
+ @Test
+ public void updateState_preferenceSetCheckedWhenSettingIsOn() {
+ final TwoStatePreference preference = mock(TwoStatePreference.class);
+ final Context context = ShadowApplication.getInstance().getApplicationContext();
+ Settings.Secure.putInt(context.getContentResolver(), NOTIFICATION_BADGING, 1);
+
+ mController = new BadgingNotificationPreferenceController(context);
+ mController.updateState(preference);
+
+ verify(preference).setChecked(true);
+ }
+
+ @Test
+ public void updateState_preferenceSetUncheckedWhenSettingIsOff() {
+ final TwoStatePreference preference = mock(TwoStatePreference.class);
+ final Context context = ShadowApplication.getInstance().getApplicationContext();
+ Settings.Secure.putInt(context.getContentResolver(), NOTIFICATION_BADGING, 0);
+
+ mController = new BadgingNotificationPreferenceController(context);
+ mController.updateState(preference);
+
+ verify(preference).setChecked(false);
+ }
+}