diff --git a/res/xml/ambient_display_settings.xml b/res/xml/ambient_display_settings.xml index 037421cd213..a23aeaa633d 100644 --- a/res/xml/ambient_display_settings.xml +++ b/res/xml/ambient_display_settings.xml @@ -51,7 +51,8 @@ + android:summary="@string/doze_summary" + settings:controller="com.android.settings.display.AmbientDisplayNotificationsPreferenceController"/> diff --git a/src/com/android/settings/display/AmbientDisplayNotificationsPreferenceController.java b/src/com/android/settings/display/AmbientDisplayNotificationsPreferenceController.java index f3d17d58939..ab769e18252 100644 --- a/src/com/android/settings/display/AmbientDisplayNotificationsPreferenceController.java +++ b/src/com/android/settings/display/AmbientDisplayNotificationsPreferenceController.java @@ -14,6 +14,7 @@ package com.android.settings.display; import static android.provider.Settings.Secure.DOZE_ENABLED; + import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.ACTION_AMBIENT_DISPLAY; import android.content.Context; @@ -21,21 +22,19 @@ import android.content.Intent; import android.os.UserHandle; import android.provider.Settings; import android.support.annotation.VisibleForTesting; -import android.support.v14.preference.SwitchPreference; import android.support.v7.preference.Preference; import com.android.internal.hardware.AmbientDisplayConfiguration; import com.android.settings.R; -import com.android.settings.core.PreferenceControllerMixin; +import com.android.settings.core.TogglePreferenceController; +import com.android.settings.overlay.FeatureFactory; import com.android.settings.search.DatabaseIndexingUtils; import com.android.settings.search.InlineSwitchPayload; import com.android.settings.search.ResultPayload; -import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; public class AmbientDisplayNotificationsPreferenceController extends - AbstractPreferenceController implements PreferenceControllerMixin, - Preference.OnPreferenceChangeListener { + TogglePreferenceController implements Preference.OnPreferenceChangeListener { private final int ON = 1; private final int OFF = 0; @@ -45,18 +44,20 @@ public class AmbientDisplayNotificationsPreferenceController extends private static final int MY_USER = UserHandle.myUserId(); private final MetricsFeatureProvider mMetricsFeatureProvider; - private final AmbientDisplayConfiguration mConfig; + private AmbientDisplayConfiguration mConfig; - public AmbientDisplayNotificationsPreferenceController(Context context, - AmbientDisplayConfiguration config, MetricsFeatureProvider metricsFeatureProvider) { - super(context); - mMetricsFeatureProvider = metricsFeatureProvider; - mConfig = config; + public AmbientDisplayNotificationsPreferenceController(Context context, String key) { + super(context, key); + mMetricsFeatureProvider = FeatureFactory.getFactory(context).getMetricsFeatureProvider(); } - @Override - public String getPreferenceKey() { - return KEY_AMBIENT_DISPLAY_NOTIFICATIONS; + /** + * Set AmbientDisplayConfiguration for this controller, please call in onAttach of fragment + * + * @param config AmbientDisplayConfiguration for this controller + */ + public void setConfig(AmbientDisplayConfiguration config) { + mConfig = config; } @Override @@ -68,23 +69,23 @@ public class AmbientDisplayNotificationsPreferenceController extends } @Override - public void updateState(Preference preference) { - ((SwitchPreference) preference).setChecked(mConfig.pulseOnNotificationEnabled(MY_USER)); + public boolean isChecked() { + return mConfig.pulseOnNotificationEnabled(MY_USER); } @Override - public boolean onPreferenceChange(Preference preference, Object newValue) { - boolean value = (Boolean) newValue; - Settings.Secure.putInt(mContext.getContentResolver(), DOZE_ENABLED, value ? ON : OFF); + public boolean setChecked(boolean isChecked) { + Settings.Secure.putInt(mContext.getContentResolver(), DOZE_ENABLED, isChecked ? ON : OFF); return true; } @Override - public boolean isAvailable() { - return mConfig.pulseOnNotificationAvailable(); + public int getAvailabilityStatus() { + return mConfig.pulseOnNotificationAvailable() ? AVAILABLE : DISABLED_UNSUPPORTED; } @Override + //TODO (b/69808376): Remove result payload public ResultPayload getResultPayload() { final Intent intent = DatabaseIndexingUtils.buildSearchResultPageIntent(mContext, AmbientDisplaySettings.class.getName(), KEY_AMBIENT_DISPLAY_NOTIFICATIONS, diff --git a/src/com/android/settings/display/AmbientDisplaySettings.java b/src/com/android/settings/display/AmbientDisplaySettings.java index db3f38ae165..cab28fa290f 100644 --- a/src/com/android/settings/display/AmbientDisplaySettings.java +++ b/src/com/android/settings/display/AmbientDisplaySettings.java @@ -26,6 +26,7 @@ import com.android.settings.R; import com.android.settings.dashboard.DashboardFragment; import com.android.settings.gestures.DoubleTapScreenPreferenceController; import com.android.settings.gestures.PickupGesturePreferenceController; +import com.android.settings.overlay.FeatureFactory; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.search.Indexable; import com.android.settingslib.core.AbstractPreferenceController; @@ -52,11 +53,9 @@ public class AmbientDisplaySettings extends DashboardFragment { private AmbientDisplayConfiguration mConfig; private static List buildPreferenceControllers(Context context, - Lifecycle lifecycle, AmbientDisplayConfiguration config, - MetricsFeatureProvider metricsFeatureProvider) { + Lifecycle lifecycle, AmbientDisplayConfiguration config) { + final List controllers = new ArrayList<>(); - controllers.add(new AmbientDisplayNotificationsPreferenceController(context, config, - metricsFeatureProvider)); controllers.add(new DoubleTapScreenPreferenceController(context, lifecycle, config, MY_USER_ID, KEY_AMBIENT_DISPLAY_DOUBLE_TAP)); controllers.add(new PickupGesturePreferenceController(context, lifecycle, config, @@ -71,6 +70,9 @@ public class AmbientDisplaySettings extends DashboardFragment { AmbientDisplayAlwaysOnPreferenceController.class); controller.setConfig(getConfig(context)); controller.setCallback(this::updatePreferenceStates); + final AmbientDisplayNotificationsPreferenceController notificationController = use( + AmbientDisplayNotificationsPreferenceController.class); + notificationController.setConfig(getConfig(context)); } @Override @@ -85,8 +87,7 @@ public class AmbientDisplaySettings extends DashboardFragment { @Override protected List createPreferenceControllers(Context context) { - return buildPreferenceControllers(context, getLifecycle(), - getConfig(context), mMetricsFeatureProvider); + return buildPreferenceControllers(context, getLifecycle(), getConfig(context)); } @Override @@ -111,7 +112,7 @@ public class AmbientDisplaySettings extends DashboardFragment { public List createPreferenceControllers( Context context) { return buildPreferenceControllers(context, null, - new AmbientDisplayConfiguration(context), null); + new AmbientDisplayConfiguration(context)); } }; diff --git a/tests/robotests/src/com/android/settings/display/AmbientDisplayNotificationsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/display/AmbientDisplayNotificationsPreferenceControllerTest.java index 543d5358ab6..119d29417b7 100644 --- a/tests/robotests/src/com/android/settings/display/AmbientDisplayNotificationsPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/display/AmbientDisplayNotificationsPreferenceControllerTest.java @@ -27,6 +27,7 @@ import static org.mockito.Mockito.when; import android.content.ContentResolver; import android.content.Context; +import android.os.UserHandle; import android.provider.Settings; import android.support.v14.preference.SwitchPreference; @@ -44,6 +45,7 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; +import org.robolectric.util.ReflectionHelpers; @RunWith(SettingsRobolectricTestRunner.class) @Config(shadows = ShadowSecureSettings.class) @@ -67,8 +69,10 @@ public class AmbientDisplayNotificationsPreferenceControllerTest { MockitoAnnotations.initMocks(this); mContext = RuntimeEnvironment.application; mContentResolver = mContext.getContentResolver(); - mController = new AmbientDisplayNotificationsPreferenceController(mContext, mConfig, - mMetricsFeatureProvider); + mController = new AmbientDisplayNotificationsPreferenceController(mContext, + AmbientDisplayNotificationsPreferenceController.KEY_AMBIENT_DISPLAY_NOTIFICATIONS); + mController.setConfig(mConfig); + ReflectionHelpers.setField(mController, "mMetricsFeatureProvider", mMetricsFeatureProvider); } @Test @@ -119,6 +123,20 @@ public class AmbientDisplayNotificationsPreferenceControllerTest { assertThat(mController.isAvailable()).isFalse(); } + @Test + public void isChecked_checked_shouldReturnTrue() { + when(mConfig.pulseOnNotificationEnabled(UserHandle.myUserId())).thenReturn(true); + + assertThat(mController.isChecked()).isTrue(); + } + + @Test + public void isChecked_checked_shouldReturnFalse() { + when(mConfig.pulseOnNotificationEnabled(UserHandle.myUserId())).thenReturn(false); + + assertThat(mController.isChecked()).isFalse(); + } + @Test public void handlePreferenceTreeClick_reportsEventForItsPreference() { when(mSwitchPreference.getKey()).thenReturn(