OSDN Git Service

Refactor badging notification preference controller.
authorChuck Liao <chuckliao@google.com>
Fri, 30 Mar 2018 10:41:18 +0000 (18:41 +0800)
committerChuck Liao <chuckliao@google.com>
Thu, 3 May 2018 09:35:18 +0000 (09:35 +0000)
- Convert inheritance from AbstractPreferenceController to TogglePreferenceController.
- Register BadgingNotificationPreferenceController in XML.
- Add RoboTests test cases for BadgingNotificationPreferenceController.

Fixes: 67997784
Test: RunSettingsRoboTests
Change-Id: If10744c067f065e7c2465ca1fff66895d7dc1c56
Merged-In: If10744c067f065e7c2465ca1fff66895d7dc1c56

res/xml/configure_notification_settings.xml
src/com/android/settings/notification/BadgingNotificationPreferenceController.java
src/com/android/settings/notification/ConfigureNotificationSettings.java
tests/robotests/src/com/android/settings/notification/BadgingNotificationPreferenceControllerTest.java

index 612f5e7..291d9a8 100644 (file)
@@ -28,7 +28,8 @@
     <!-- Notification badging -->
     <SwitchPreference
         android:key="notification_badging"
-        android:title="@string/notification_badging_title"/>
+        android:title="@string/notification_badging_title"
+        settings:controller="com.android.settings.notification.BadgingNotificationPreferenceController"/>
 
     <!-- Pulse notification light -->
     <SwitchPreference
index 18efd43..37e3db0 100644 (file)
@@ -23,11 +23,13 @@ import android.database.ContentObserver;
 import android.net.Uri;
 import android.os.Handler;
 import android.provider.Settings;
+import android.support.annotation.VisibleForTesting;
 import android.support.v7.preference.Preference;
 import android.support.v7.preference.PreferenceScreen;
 import android.support.v7.preference.TwoStatePreference;
 
 import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settings.core.TogglePreferenceController;
 import com.android.settingslib.core.AbstractPreferenceController;
 import com.android.settings.R;
 import com.android.settings.search.DatabaseIndexingUtils;
@@ -39,19 +41,20 @@ import com.android.settingslib.core.lifecycle.events.OnResume;
 
 import static android.provider.Settings.Secure.NOTIFICATION_BADGING;
 
-public class BadgingNotificationPreferenceController extends AbstractPreferenceController
+public class BadgingNotificationPreferenceController extends TogglePreferenceController
         implements PreferenceControllerMixin, Preference.OnPreferenceChangeListener,
         LifecycleObserver, OnResume, OnPause {
 
     private static final String TAG = "BadgeNotifPrefContr";
-    private static final String KEY_NOTIFICATION_BADGING = "notification_badging";
-    private static final int ON = 1;
-    private static final int OFF = 0;
+    @VisibleForTesting
+    static final int ON = 1;
+    @VisibleForTesting
+    static final int OFF = 0;
 
     private SettingObserver mSettingObserver;
 
-    public BadgingNotificationPreferenceController(Context context) {
-        super(context);
+    public BadgingNotificationPreferenceController(Context context, String preferenceKey) {
+        super(context, preferenceKey);
     }
 
     @Override
@@ -78,28 +81,22 @@ public class BadgingNotificationPreferenceController extends AbstractPreferenceC
     }
 
     @Override
-    public String getPreferenceKey() {
-        return KEY_NOTIFICATION_BADGING;
-    }
-
-    @Override
-    public boolean isAvailable() {
+    public int getAvailabilityStatus() {
         return mContext.getResources()
-                .getBoolean(com.android.internal.R.bool.config_notificationBadging);
+                .getBoolean(com.android.internal.R.bool.config_notificationBadging)
+                ? AVAILABLE : DISABLED_UNSUPPORTED;
     }
 
     @Override
-    public void updateState(Preference preference) {
-        final boolean checked = Settings.Secure.getInt(mContext.getContentResolver(),
+    public boolean isChecked() {
+        return Settings.Secure.getInt(mContext.getContentResolver(),
                 NOTIFICATION_BADGING, ON) == ON;
-        ((TwoStatePreference) preference).setChecked(checked);
     }
 
     @Override
-    public boolean onPreferenceChange(Preference preference, Object newValue) {
-        final boolean val = (Boolean) newValue;
+    public boolean setChecked(boolean isChecked) {
         return Settings.Secure.putInt(mContext.getContentResolver(),
-                NOTIFICATION_BADGING, val ? ON : OFF);
+                NOTIFICATION_BADGING, isChecked ? ON : OFF);
     }
 
     class SettingObserver extends ContentObserver {
@@ -134,7 +131,7 @@ public class BadgingNotificationPreferenceController extends AbstractPreferenceC
     @Override
     public ResultPayload getResultPayload() {
         final Intent intent = DatabaseIndexingUtils.buildSearchResultPageIntent(mContext,
-                ConfigureNotificationSettings.class.getName(), KEY_NOTIFICATION_BADGING,
+                ConfigureNotificationSettings.class.getName(), getPreferenceKey(),
                 mContext.getString(R.string.configure_notification_settings));
 
         return new InlineSwitchPayload(Settings.Secure.NOTIFICATION_BADGING,
index c9aa19d..2b7e9e8 100644 (file)
@@ -91,8 +91,6 @@ public class ConfigureNotificationSettings extends DashboardFragment {
     private static List<AbstractPreferenceController> buildPreferenceControllers(Context context,
             Lifecycle lifecycle, Application app, Fragment host) {
         final List<AbstractPreferenceController> controllers = new ArrayList<>();
-        final BadgingNotificationPreferenceController badgeController =
-                new BadgingNotificationPreferenceController(context);
         final PulseNotificationPreferenceController pulseController =
                 new PulseNotificationPreferenceController(context);
         final LockScreenNotificationPreferenceController lockScreenNotificationController =
@@ -106,7 +104,6 @@ public class ConfigureNotificationSettings extends DashboardFragment {
         }
         controllers.add(new RecentNotifyingAppsPreferenceController(
                 context, new NotificationBackend(), app, host));
-        controllers.add(badgeController);
         controllers.add(pulseController);
         controllers.add(lockScreenNotificationController);
         controllers.add(new NotificationRingtonePreferenceController(context) {
index d852aaa..f999194 100644 (file)
 package com.android.settings.notification;
 
 import static android.provider.Settings.Secure.NOTIFICATION_BADGING;
+
+import static com.android.settings.core.BasePreferenceController.AVAILABLE;
+import static com.android.settings.core.BasePreferenceController.DISABLED_UNSUPPORTED;
+import static com.android.settings.notification.BadgingNotificationPreferenceController.OFF;
+import static com.android.settings.notification.BadgingNotificationPreferenceController.ON;
+
 import static com.google.common.truth.Truth.assertThat;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
@@ -54,10 +60,13 @@ public class BadgingNotificationPreferenceControllerTest {
     private BadgingNotificationPreferenceController mController;
     private Preference mPreference;
 
+    private static final String KEY_NOTIFICATION_BADGING = "notification_badging";
+
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-        mController = new BadgingNotificationPreferenceController(mContext);
+        mController = new BadgingNotificationPreferenceController(mContext,
+                KEY_NOTIFICATION_BADGING);
         mPreference = new Preference(RuntimeEnvironment.application);
         mPreference.setKey(mController.getPreferenceKey());
         when(mScreen.findPreference(mPreference.getKey())).thenReturn(mPreference);
@@ -88,9 +97,10 @@ public class BadgingNotificationPreferenceControllerTest {
     public void updateState_preferenceSetCheckedWhenSettingIsOn() {
         final TwoStatePreference preference = mock(TwoStatePreference.class);
         final Context context = RuntimeEnvironment.application;
-        Settings.Secure.putInt(context.getContentResolver(), NOTIFICATION_BADGING, 1);
+        Settings.Secure.putInt(context.getContentResolver(), NOTIFICATION_BADGING, ON);
 
-        mController = new BadgingNotificationPreferenceController(context);
+        mController = new BadgingNotificationPreferenceController(context,
+                KEY_NOTIFICATION_BADGING);
         mController.updateState(preference);
 
         verify(preference).setChecked(true);
@@ -100,9 +110,10 @@ public class BadgingNotificationPreferenceControllerTest {
     public void updateState_preferenceSetUncheckedWhenSettingIsOff() {
         final TwoStatePreference preference = mock(TwoStatePreference.class);
         final Context context = RuntimeEnvironment.application;
-        Settings.Secure.putInt(context.getContentResolver(), NOTIFICATION_BADGING, 0);
+        Settings.Secure.putInt(context.getContentResolver(), NOTIFICATION_BADGING, OFF);
 
-        mController = new BadgingNotificationPreferenceController(context);
+        mController = new BadgingNotificationPreferenceController(context,
+                KEY_NOTIFICATION_BADGING);
         mController.updateState(preference);
 
         verify(preference).setChecked(false);
@@ -118,11 +129,11 @@ public class BadgingNotificationPreferenceControllerTest {
     public void testSetValue_updatesCorrectly() {
         final int newValue = 0;
         ContentResolver resolver = mContext.getContentResolver();
-        Settings.Secure.putInt(resolver, Settings.Secure.NOTIFICATION_BADGING, 1);
+        Settings.Secure.putInt(resolver, Settings.Secure.NOTIFICATION_BADGING, ON);
 
         ((InlinePayload) mController.getResultPayload()).setValue(mContext, newValue);
         final int updatedValue =
-            Settings.Secure.getInt(resolver, Settings.Secure.NOTIFICATION_BADGING, 1);
+            Settings.Secure.getInt(resolver, Settings.Secure.NOTIFICATION_BADGING, ON);
 
         assertThat(updatedValue).isEqualTo(newValue);
     }
@@ -138,4 +149,40 @@ public class BadgingNotificationPreferenceControllerTest {
 
         assertThat(newValue).isEqualTo(currentValue);
     }
+
+    @Test
+    public void isChecked_settingIsOff_shouldReturnFalse() {
+        Settings.Secure.putInt(mContext.getContentResolver(), NOTIFICATION_BADGING, OFF);
+
+        assertThat(mController.isChecked()).isFalse();
+    }
+
+    @Test
+    public void isChecked_settingIsOn_shouldReturnTrue() {
+        Settings.Secure.putInt(mContext.getContentResolver(), NOTIFICATION_BADGING, ON);
+
+        assertThat(mController.isChecked()).isTrue();
+    }
+
+    @Test
+    public void setChecked_setFalse_disablesSetting() {
+        Settings.Secure.putInt(mContext.getContentResolver(), NOTIFICATION_BADGING, ON);
+
+        mController.setChecked(false);
+        int updatedValue = Settings.Secure.getInt(mContext.getContentResolver(),
+                NOTIFICATION_BADGING, -1);
+
+        assertThat(updatedValue).isEqualTo(OFF);
+    }
+
+    @Test
+    public void setChecked_setTrue_enablesSetting() {
+        Settings.Secure.putInt(mContext.getContentResolver(), NOTIFICATION_BADGING, OFF);
+
+        mController.setChecked(true);
+        int updatedValue = Settings.Secure.getInt(mContext.getContentResolver(),
+                NOTIFICATION_BADGING, -1);
+
+        assertThat(updatedValue).isEqualTo(ON);
+    }
 }