diff --git a/res/values/strings.xml b/res/values/strings.xml index 139fd5f6865..d30a95a614d 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -2807,6 +2807,12 @@ Night Light not currently on + + + Device location needed to determine you sunset to sunrise + + Turn on location + Turn on now diff --git a/src/com/android/settings/display/NightDisplayAutoModePreferenceController.java b/src/com/android/settings/display/NightDisplayAutoModePreferenceController.java index 121b062a0e6..fb2dbc3b903 100644 --- a/src/com/android/settings/display/NightDisplayAutoModePreferenceController.java +++ b/src/com/android/settings/display/NightDisplayAutoModePreferenceController.java @@ -18,6 +18,7 @@ package com.android.settings.display; import android.content.Context; import android.hardware.display.ColorDisplayManager; +import android.location.LocationManager; import androidx.preference.DropDownPreference; import androidx.preference.Preference; @@ -29,12 +30,14 @@ import com.android.settings.core.BasePreferenceController; public class NightDisplayAutoModePreferenceController extends BasePreferenceController implements Preference.OnPreferenceChangeListener { + private final LocationManager mLocationManager; private DropDownPreference mPreference; private ColorDisplayManager mColorDisplayManager; public NightDisplayAutoModePreferenceController(Context context, String key) { super(context, key); mColorDisplayManager = context.getSystemService(ColorDisplayManager.class); + mLocationManager = context.getSystemService(LocationManager.class); } @Override @@ -68,6 +71,11 @@ public class NightDisplayAutoModePreferenceController extends BasePreferenceCont @Override public final boolean onPreferenceChange(Preference preference, Object newValue) { + if (String.valueOf(ColorDisplayManager.AUTO_MODE_TWILIGHT).equals(newValue) + && !mLocationManager.isLocationEnabled()) { + TwilightLocationDialog.show(mContext); + return false; + } return mColorDisplayManager.setNightDisplayAutoMode(Integer.parseInt((String) newValue)); } } diff --git a/src/com/android/settings/display/TwilightLocationDialog.java b/src/com/android/settings/display/TwilightLocationDialog.java new file mode 100644 index 00000000000..1a2cf673611 --- /dev/null +++ b/src/com/android/settings/display/TwilightLocationDialog.java @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2020 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.app.AlertDialog; +import android.content.Context; +import android.content.Intent; +import android.util.Log; + +import com.android.settings.R; +import com.android.settings.Settings; + +/* + * This class lauches a dialog when users try to use twilight scheduling without + * turning on location services + */ +public class TwilightLocationDialog { + public static String TAG = "TwilightLocationDialog"; + + public static void show(Context context) { + final AlertDialog dialog = new AlertDialog.Builder(context) + .setPositiveButton(R.string.twilight_mode_launch_location, ((dialog1, which) -> { + Log.d(TAG, "clicked forget"); + final Intent intent = new Intent(); + intent.setClass(context, Settings.LocationSettingsActivity.class); + context.startActivity(intent); + })) + .setNegativeButton(R.string.cancel, null /* listener */) + .setMessage(R.string.twilight_mode_location_off_dialog_message) + .create(); + dialog.show(); + } +} diff --git a/src/com/android/settings/display/darkmode/DarkModeScheduleSelectorController.java b/src/com/android/settings/display/darkmode/DarkModeScheduleSelectorController.java index ea7fc036ee4..6acaf8292a4 100644 --- a/src/com/android/settings/display/darkmode/DarkModeScheduleSelectorController.java +++ b/src/com/android/settings/display/darkmode/DarkModeScheduleSelectorController.java @@ -17,6 +17,7 @@ package com.android.settings.display.darkmode; import android.app.UiModeManager; import android.content.Context; import android.content.res.Configuration; +import android.location.LocationManager; import android.os.PowerManager; import androidx.preference.DropDownPreference; @@ -25,6 +26,7 @@ import androidx.preference.PreferenceScreen; import com.android.settings.R; import com.android.settings.core.BasePreferenceController; +import com.android.settings.display.TwilightLocationDialog; /** * Controller for the dark ui option dropdown @@ -35,12 +37,14 @@ public class DarkModeScheduleSelectorController extends BasePreferenceController private final UiModeManager mUiModeManager; private PowerManager mPowerManager; private DropDownPreference mPreference; + private LocationManager mLocationManager; private int mCurrentMode; public DarkModeScheduleSelectorController(Context context, String key) { super(context, key); mUiModeManager = context.getSystemService(UiModeManager.class); mPowerManager = context.getSystemService(PowerManager.class); + mLocationManager = context.getSystemService(LocationManager.class); } @Override @@ -93,6 +97,10 @@ public class DarkModeScheduleSelectorController extends BasePreferenceController mUiModeManager.setNightMode(mode); } else if (mCurrentMode == mPreference.findIndexOfValue( mContext.getString(R.string.dark_ui_auto_mode_auto))) { + if (!mLocationManager.isLocationEnabled()) { + TwilightLocationDialog.show(mContext); + return false; + } mUiModeManager.setNightMode(UiModeManager.MODE_NIGHT_AUTO); } else if (mCurrentMode == mPreference.findIndexOfValue( mContext.getString(R.string.dark_ui_auto_mode_custom))) { diff --git a/tests/robotests/src/com/android/settings/display/darkmode/DarkModeScheduleSelectorControllerTest.java b/tests/robotests/src/com/android/settings/display/darkmode/DarkModeScheduleSelectorControllerTest.java index 8afda73e09e..d741235ff56 100644 --- a/tests/robotests/src/com/android/settings/display/darkmode/DarkModeScheduleSelectorControllerTest.java +++ b/tests/robotests/src/com/android/settings/display/darkmode/DarkModeScheduleSelectorControllerTest.java @@ -28,6 +28,7 @@ import static org.mockito.Mockito.when; import android.app.UiModeManager; import android.content.Context; +import android.location.LocationManager; import android.os.PowerManager; import androidx.preference.DropDownPreference; @@ -55,6 +56,8 @@ public class DarkModeScheduleSelectorControllerTest { @Mock private UiModeManager mUiService; @Mock + private LocationManager mLocationManager; + @Mock private PowerManager mPM; @Before @@ -63,6 +66,7 @@ public class DarkModeScheduleSelectorControllerTest { mContext = spy(RuntimeEnvironment.application); when(mContext.getSystemService(UiModeManager.class)).thenReturn(mUiService); when(mContext.getSystemService(PowerManager.class)).thenReturn(mPM); + when(mContext.getSystemService(LocationManager.class)).thenReturn(mLocationManager); when(mContext.getString(R.string.dark_ui_auto_mode_never)).thenReturn("never"); when(mContext.getString(R.string.dark_ui_auto_mode_auto)).thenReturn("auto"); when(mContext.getString(R.string.dark_ui_auto_mode_custom)).thenReturn("custom"); @@ -72,6 +76,7 @@ public class DarkModeScheduleSelectorControllerTest { mContext.getString(R.string.dark_ui_auto_mode_auto) }); doNothing().when(mPreference).setValueIndex(anyInt()); + when(mLocationManager.isLocationEnabled()).thenReturn(true); when(mScreen.findPreference(anyString())).thenReturn(mPreference); when(mUiService.setNightModeActivated(anyBoolean())).thenReturn(true); mController = new DarkModeScheduleSelectorController(mContext, mPreferenceKey); @@ -96,6 +101,15 @@ public class DarkModeScheduleSelectorControllerTest { verify(mPreference).setValueIndex(0); } + @Test + public void nightMode_selectNightMode_locationOff() { + when(mLocationManager.isLocationEnabled()).thenReturn(false); + mController.onPreferenceChange(mPreference, + mContext.getString(R.string.dark_ui_auto_mode_never)); + assertFalse(mController.onPreferenceChange(mPreference, + mContext.getString(R.string.dark_ui_auto_mode_auto))); + } + @Test public void nightMode_updateStateNone_dropDownValueChangedToAuto() { when(mUiService.getNightMode()).thenReturn(UiModeManager.MODE_NIGHT_AUTO);