diff --git a/res/xml/display_settings.xml b/res/xml/display_settings.xml index 8262bb29316..8df5696a0c4 100644 --- a/res/xml/display_settings.xml +++ b/res/xml/display_settings.xml @@ -40,12 +40,12 @@ settings:controller="com.android.settings.display.DarkUIPreferenceController" settings:keywords="@string/keywords_dark_ui_mode"/> - + settings:controller="com.android.settings.display.NightDisplayPreferenceController" + settings:keywords="@string/keywords_display_night_display"/> - + settings:controller="com.android.settings.display.NightDisplayPreferenceController" + settings:keywords="@string/keywords_display_night_display"/> controllers = new ArrayList<>(); controllers.add(new CameraGesturePreferenceController(context)); controllers.add(new LiftToWakePreferenceController(context)); - controllers.add(new NightDisplayPreferenceController(context)); - controllers.add(new NightModePreferenceController(context)); controllers.add(new ScreenSaverPreferenceController(context)); controllers.add(new TapToWakePreferenceController(context)); controllers.add(new VrDisplayPreferenceController(context)); diff --git a/src/com/android/settings/display/NightDisplayPreference.java b/src/com/android/settings/display/NightDisplayPreference.java deleted file mode 100644 index 7020c49cec5..00000000000 --- a/src/com/android/settings/display/NightDisplayPreference.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (C) 2016 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.display; - -import android.content.Context; -import android.hardware.display.ColorDisplayManager; -import android.hardware.display.NightDisplayListener; -import android.util.AttributeSet; - -import androidx.preference.SwitchPreference; - -import java.time.LocalTime; - -public class NightDisplayPreference extends SwitchPreference - implements NightDisplayListener.Callback { - - private ColorDisplayManager mColorDisplayManager; - private NightDisplayListener mNightDisplayListener; - private NightDisplayTimeFormatter mTimeFormatter; - - public NightDisplayPreference(Context context, AttributeSet attrs) { - super(context, attrs); - - mColorDisplayManager = context.getSystemService(ColorDisplayManager.class); - mNightDisplayListener = new NightDisplayListener(context); - mTimeFormatter = new NightDisplayTimeFormatter(context); - } - - @Override - public void onAttached() { - super.onAttached(); - - // Listen for changes only while attached. - mNightDisplayListener.setCallback(this); - - // Update the summary since the state may have changed while not attached. - updateSummary(); - } - - @Override - public void onDetached() { - super.onDetached(); - - // Stop listening for state changes. - mNightDisplayListener.setCallback(null); - } - - @Override - public void onActivated(boolean activated) { - updateSummary(); - } - - @Override - public void onAutoModeChanged(int autoMode) { - updateSummary(); - } - - @Override - public void onCustomStartTimeChanged(LocalTime startTime) { - updateSummary(); - } - - @Override - public void onCustomEndTimeChanged(LocalTime endTime) { - updateSummary(); - } - - private void updateSummary() { - setSummary(mTimeFormatter.getAutoModeTimeSummary(getContext(), mColorDisplayManager)); - } -} diff --git a/src/com/android/settings/display/NightDisplayPreferenceController.java b/src/com/android/settings/display/NightDisplayPreferenceController.java index 6891d65dd95..0198007b29f 100644 --- a/src/com/android/settings/display/NightDisplayPreferenceController.java +++ b/src/com/android/settings/display/NightDisplayPreferenceController.java @@ -15,18 +15,30 @@ package com.android.settings.display; import android.content.Context; import android.hardware.display.ColorDisplayManager; +import android.hardware.display.NightDisplayListener; + +import androidx.preference.PreferenceScreen; import com.android.settings.R; -import com.android.settings.core.PreferenceControllerMixin; -import com.android.settingslib.core.AbstractPreferenceController; +import com.android.settings.core.TogglePreferenceController; +import com.android.settings.widget.PrimarySwitchPreference; +import com.android.settingslib.core.lifecycle.LifecycleObserver; +import com.android.settingslib.core.lifecycle.events.OnStart; +import com.android.settingslib.core.lifecycle.events.OnStop; -public class NightDisplayPreferenceController extends AbstractPreferenceController implements - PreferenceControllerMixin { +/** A controller can control the behavior of night display setting. */ +public class NightDisplayPreferenceController extends TogglePreferenceController + implements NightDisplayListener.Callback, LifecycleObserver, OnStart, OnStop { - private static final String KEY_NIGHT_DISPLAY = "night_display"; + private final ColorDisplayManager mColorDisplayManager; + private final NightDisplayListener mNightDisplayListener; + private PrimarySwitchPreference mPreference; - public NightDisplayPreferenceController(Context context) { - super(context); + public NightDisplayPreferenceController(Context context, String key) { + super(context, key); + + mColorDisplayManager = context.getSystemService(ColorDisplayManager.class); + mNightDisplayListener = new NightDisplayListener(context); } public static boolean isSuggestionComplete(Context context) { @@ -41,12 +53,41 @@ public class NightDisplayPreferenceController extends AbstractPreferenceControll } @Override - public boolean isAvailable() { - return ColorDisplayManager.isNightDisplayAvailable(mContext); + public void onStart() { + // Listen for changes only while attached. + mNightDisplayListener.setCallback(this); } @Override - public String getPreferenceKey() { - return KEY_NIGHT_DISPLAY; + public void onStop() { + // Stop listening for state changes. + mNightDisplayListener.setCallback(null); + } + + @Override + public void displayPreference(PreferenceScreen screen) { + super.displayPreference(screen); + mPreference = screen.findPreference(getPreferenceKey()); + } + + @Override + public int getAvailabilityStatus() { + return ColorDisplayManager.isNightDisplayAvailable(mContext) + ? AVAILABLE : UNSUPPORTED_ON_DEVICE; + } + + @Override + public boolean isChecked() { + return mColorDisplayManager.isNightDisplayActivated(); + } + + @Override + public boolean setChecked(boolean isChecked) { + return mColorDisplayManager.setNightDisplayActivated(isChecked); + } + + @Override + public void onActivated(boolean activated) { + updateState(mPreference); } } \ No newline at end of file diff --git a/tests/robotests/src/com/android/settings/display/NightDisplayPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/display/NightDisplayPreferenceControllerTest.java index eeaae67f779..ea1896e4125 100644 --- a/tests/robotests/src/com/android/settings/display/NightDisplayPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/display/NightDisplayPreferenceControllerTest.java @@ -2,11 +2,15 @@ package com.android.settings.display; import static com.google.common.truth.Truth.assertThat; -import android.app.Application; +import android.content.Context; import android.hardware.display.ColorDisplayManager; + import com.android.settings.R; +import com.android.settings.core.BasePreferenceController; import com.android.settings.testutils.shadow.SettingsShadowResources; + import org.junit.After; +import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; @@ -17,41 +21,81 @@ import org.robolectric.annotation.Config; @Config(shadows = {SettingsShadowResources.class}) public class NightDisplayPreferenceControllerTest { - @After - public void tearDown() { - SettingsShadowResources.reset(); - } + private Context mContext; + private ColorDisplayManager mColorDisplayManager; + private NightDisplayPreferenceController mPreferenceController; - @Test - public void nightDisplaySuggestion_isNotCompleted_ifAutoModeDisabled() { - final Application context = RuntimeEnvironment.application; - context.getSystemService(ColorDisplayManager.class) - .setNightDisplayAutoMode(ColorDisplayManager.AUTO_MODE_DISABLED); - assertThat(NightDisplayPreferenceController.isSuggestionComplete(context)).isFalse(); - } + @Before + public void setUp() { + mContext = RuntimeEnvironment.application; + mColorDisplayManager = mContext.getSystemService(ColorDisplayManager.class); + mPreferenceController = new NightDisplayPreferenceController(mContext, "test"); + } - @Test - public void nightDisplaySuggestion_isCompleted_ifAutoModeCustom() { - final Application context = RuntimeEnvironment.application; - context.getSystemService(ColorDisplayManager.class) - .setNightDisplayAutoMode(ColorDisplayManager.AUTO_MODE_CUSTOM_TIME); - assertThat(NightDisplayPreferenceController.isSuggestionComplete(context)).isTrue(); - } + @After + public void tearDown() { + SettingsShadowResources.reset(); + } - @Test - public void nightDisplaySuggestion_isCompleted_ifAutoModeTwilight() { - final Application context = RuntimeEnvironment.application; - context.getSystemService(ColorDisplayManager.class) - .setNightDisplayAutoMode(ColorDisplayManager.AUTO_MODE_TWILIGHT); - assertThat(NightDisplayPreferenceController.isSuggestionComplete(context)).isTrue(); - } + @Test + public void nightDisplaySuggestion_isNotCompleted_ifAutoModeDisabled() { + mColorDisplayManager.setNightDisplayAutoMode(ColorDisplayManager.AUTO_MODE_DISABLED); - @Test - public void nightDisplaySuggestion_isCompleted_ifSuggestionDisabled() { - final Application context = RuntimeEnvironment.application; - context.getSystemService(ColorDisplayManager.class) - .setNightDisplayAutoMode(ColorDisplayManager.AUTO_MODE_DISABLED); - SettingsShadowResources.overrideResource(R.bool.config_night_light_suggestion_enabled, false); - assertThat(NightDisplayPreferenceController.isSuggestionComplete(context)).isTrue(); - } -} + assertThat(NightDisplayPreferenceController.isSuggestionComplete(mContext)).isFalse(); + } + + @Test + public void nightDisplaySuggestion_isCompleted_ifAutoModeCustom() { + mColorDisplayManager.setNightDisplayAutoMode(ColorDisplayManager.AUTO_MODE_CUSTOM_TIME); + + assertThat(NightDisplayPreferenceController.isSuggestionComplete(mContext)).isTrue(); + } + + @Test + public void nightDisplaySuggestion_isCompleted_ifAutoModeTwilight() { + mColorDisplayManager.setNightDisplayAutoMode(ColorDisplayManager.AUTO_MODE_TWILIGHT); + + assertThat(NightDisplayPreferenceController.isSuggestionComplete(mContext)).isTrue(); + } + + @Test + public void nightDisplaySuggestion_isCompleted_ifSuggestionDisabled() { + mColorDisplayManager.setNightDisplayAutoMode(ColorDisplayManager.AUTO_MODE_DISABLED); + SettingsShadowResources.overrideResource(R.bool.config_night_light_suggestion_enabled, + false); + + assertThat(NightDisplayPreferenceController.isSuggestionComplete(mContext)).isTrue(); + } + + @Test + public void getAvailabilityStatus_nightDisplayIsSupported_returnAvailable() { + SettingsShadowResources.overrideResource( + com.android.internal.R.bool.config_nightDisplayAvailable, true); + + assertThat(mPreferenceController.getAvailabilityStatus()) + .isEqualTo(BasePreferenceController.AVAILABLE); + } + + @Test + public void getAvailabilityStatus_nightDisplayIsNotSupported_returnUnsupportedOnDevice() { + SettingsShadowResources.overrideResource( + com.android.internal.R.bool.config_nightDisplayAvailable, false); + + assertThat(mPreferenceController.getAvailabilityStatus()) + .isEqualTo(BasePreferenceController.UNSUPPORTED_ON_DEVICE); + } + + @Test + public void isChecked_nightDisplayIsActivated_returnTrue() { + mColorDisplayManager.setNightDisplayActivated(true); + + assertThat(mPreferenceController.isChecked()).isTrue(); + } + + @Test + public void isChecked_nightDisplayIsNotActivated_returnFalse() { + mColorDisplayManager.setNightDisplayActivated(false); + + assertThat(mPreferenceController.isChecked()).isFalse(); + } +} \ No newline at end of file