Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 59c03c23 authored by Jay Aliomer's avatar Jay Aliomer
Browse files

Turn on location dialog when using twilight scheduling

Night light and Dark theme scheduling does not work when in
twiligth mode. For the reason, we added a dialog to inform the user
that they need to turn on location services first.

Fixes: 153115618
Fixes: 153115261
Test: manual
Change-Id: Iea51018a7caba5c0ec93e058ee047d067bc03867
parent 5a950b76
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -2807,6 +2807,12 @@
    <!-- Night display slice screen, subtitle of intensity setting when night light is off. [CHAR LIMIT=30] -->
    <string name="night_display_not_currently_on">Night Light not currently on</string>
    <!-- Twilight Mode -->
    <!-- When location mode is off, twilight scheduling does not function. [CHAR LIMIT=40] -->
    <string name="twilight_mode_location_off_dialog_message">Device location needed to determine you sunset to sunrise</string>
    <!-- When location mode is off, twilight scheduling does not function. [CHAR LIMIT=40] -->
    <string name="twilight_mode_launch_location">Turn on location</string>
    <!--    Dark ui screen-->
    <!-- Display settings screen, activation button action for manual mode. [CHAR LIMIT=40] -->
    <string name="dark_ui_activation_on_manual">Turn on now</string>
+8 −0
Original line number Diff line number Diff line
@@ -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));
    }
}
+47 −0
Original line number Diff line number Diff line
/*
 * 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();
    }
}
+8 −0
Original line number Diff line number Diff line
@@ -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))) {
+14 −0
Original line number Diff line number Diff line
@@ -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);