Battery saver mode should disable dark mode modification

disable toggle options and disable the dark theme drop down selection

Test: make -j64 RunSettingsRoboTests ROBOTEST_FILTER="com.android.settings.display.DarkUIPreferenceControllerTest" && \
make -j64 RunSettingsRoboTests ROBOTEST_FILTER="com.android.settings.display.darkmode.DarkModeActivationPreferenceControllerTest" && \
make -j64 RunSettingsRoboTests ROBOTEST_FILTER="com.android.settings.display.darkmode.DarkModeObserverTest" && \
make -j64 RunSettingsRoboTests ROBOTEST_FILTER="com.android.settings.display.darkmode.DarkModeScheduleSelectorControllerTest"

Fixes: 	145098277
Fixes: 145297188
Fixes: 	145254016
Change-Id: I5c81a295810cc2d9a45657978104647e9c15da46
This commit is contained in:
Jay Aliomer
2019-11-27 17:46:58 -05:00
parent 5dd4272ee4
commit f4bc80c45c
8 changed files with 86 additions and 15 deletions

View File

@@ -24,7 +24,7 @@
<DropDownPreference <DropDownPreference
android:key="dark_ui_auto_mode" android:key="dark_ui_auto_mode"
android:title="@string/dark_ui_auto_mode_title" android:title="@string/dark_ui_auto_mode_title"
android:summary="%s" android:summary="@string/summary_placeholder"
android:entries="@array/dark_ui_scheduler_preference_titles" android:entries="@array/dark_ui_scheduler_preference_titles"
android:entryValues="@array/dark_ui_scheduler_preference_titles" android:entryValues="@array/dark_ui_scheduler_preference_titles"
settings:controller="com.android.settings.display.darkmode.DarkModeScheduleSelectorController" settings:controller="com.android.settings.display.darkmode.DarkModeScheduleSelectorController"

View File

@@ -32,7 +32,6 @@ import androidx.preference.PreferenceScreen;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.core.TogglePreferenceController; import com.android.settings.core.TogglePreferenceController;
import com.android.settings.display.darkmode.DarkModePreference;
import com.android.settingslib.core.lifecycle.LifecycleObserver; import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.core.lifecycle.events.OnStart; import com.android.settingslib.core.lifecycle.events.OnStart;
import com.android.settingslib.core.lifecycle.events.OnStop; import com.android.settingslib.core.lifecycle.events.OnStop;
@@ -92,7 +91,6 @@ public class DarkUIPreferenceController extends TogglePreferenceController imple
Settings.Secure.DARK_MODE_DIALOG_SEEN, 0) == DIALOG_SEEN; Settings.Secure.DARK_MODE_DIALOG_SEEN, 0) == DIALOG_SEEN;
if (!dialogSeen && isChecked) { if (!dialogSeen && isChecked) {
showDarkModeDialog(); showDarkModeDialog();
return false;
} }
return mUiModeManager.setNightModeActivated(isChecked); return mUiModeManager.setNightModeActivated(isChecked);
} }

View File

@@ -17,6 +17,7 @@ package com.android.settings.display.darkmode;
import android.app.UiModeManager; import android.app.UiModeManager;
import android.content.Context; import android.content.Context;
import android.content.res.Configuration; import android.content.res.Configuration;
import android.os.PowerManager;
import android.view.View; import android.view.View;
import android.widget.Button; import android.widget.Button;
import androidx.preference.Preference; import androidx.preference.Preference;
@@ -30,18 +31,27 @@ import com.android.settingslib.widget.LayoutPreference;
*/ */
public class DarkModeActivationPreferenceController extends BasePreferenceController { public class DarkModeActivationPreferenceController extends BasePreferenceController {
private final UiModeManager mUiModeManager; private final UiModeManager mUiModeManager;
private PowerManager mPowerManager;
private Button mTurnOffButton; private Button mTurnOffButton;
private Button mTurnOnButton; private Button mTurnOnButton;
public DarkModeActivationPreferenceController(Context context, public DarkModeActivationPreferenceController(Context context,
String preferenceKey) { String preferenceKey) {
super(context, preferenceKey); super(context, preferenceKey);
mPowerManager = context.getSystemService(PowerManager.class);
mUiModeManager = context.getSystemService(UiModeManager.class); mUiModeManager = context.getSystemService(UiModeManager.class);
} }
@Override @Override
public final void updateState(Preference preference) { public final void updateState(Preference preference) {
final boolean batterySaver = mPowerManager.isPowerSaveMode();
if (batterySaver) {
mTurnOnButton.setVisibility(View.GONE);
mTurnOffButton.setVisibility(View.GONE);
return;
}
final boolean active = (mContext.getResources().getConfiguration().uiMode final boolean active = (mContext.getResources().getConfiguration().uiMode
& Configuration.UI_MODE_NIGHT_YES) != 0; & Configuration.UI_MODE_NIGHT_YES) != 0;
updateNightMode(active); updateNightMode(active);

View File

@@ -14,18 +14,30 @@
package com.android.settings.display.darkmode; package com.android.settings.display.darkmode;
import android.content.BroadcastReceiver;
import android.content.Context; import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.ContentObserver; import android.database.ContentObserver;
import android.net.Uri; import android.net.Uri;
import android.os.Handler; import android.os.Handler;
import android.os.Looper; import android.os.Looper;
import android.os.PowerManager;
import android.provider.Settings; import android.provider.Settings;
import android.util.Log;
import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting;
/** /**
* Observes changes for dark night settings*/ * Observes changes for dark night settings*/
public class DarkModeObserver { public class DarkModeObserver {
private static final String TAG = "DarkModeObserver";
private ContentObserver mContentObserver; private ContentObserver mContentObserver;
private final BroadcastReceiver mBatterySaverReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
mCallback.run();
}
};
private Runnable mCallback; private Runnable mCallback;
private Context mContext; private Context mContext;
@@ -58,6 +70,10 @@ public class DarkModeObserver {
mCallback = callback; mCallback = callback;
final Uri uri = Settings.Secure.getUriFor(Settings.Secure.UI_NIGHT_MODE); final Uri uri = Settings.Secure.getUriFor(Settings.Secure.UI_NIGHT_MODE);
mContext.getContentResolver().registerContentObserver(uri, false, mContentObserver); mContext.getContentResolver().registerContentObserver(uri, false, mContentObserver);
final IntentFilter batteryFilter = new IntentFilter();
batteryFilter.addAction(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED);
mContext.registerReceiver(
mBatterySaverReceiver, batteryFilter);
} }
/** /**
@@ -65,6 +81,13 @@ public class DarkModeObserver {
*/ */
public void unsubscribe() { public void unsubscribe() {
mContext.getContentResolver().unregisterContentObserver(mContentObserver); mContext.getContentResolver().unregisterContentObserver(mContentObserver);
try {
mContext.unregisterReceiver(mBatterySaverReceiver);
} catch (IllegalArgumentException e) {
/* Ignore: unregistering an unregistered receiver */
Log.w(TAG, e.getMessage());
}
// NO-OP
mCallback = null; mCallback = null;
} }

View File

@@ -17,6 +17,7 @@ package com.android.settings.display.darkmode;
import android.app.UiModeManager; import android.app.UiModeManager;
import android.content.Context; import android.content.Context;
import android.content.res.Configuration; import android.content.res.Configuration;
import android.os.PowerManager;
import android.util.AttributeSet; import android.util.AttributeSet;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.widget.MasterSwitchPreference; import com.android.settings.widget.MasterSwitchPreference;
@@ -27,14 +28,20 @@ public class DarkModePreference extends MasterSwitchPreference {
private UiModeManager mUiModeManager; private UiModeManager mUiModeManager;
private DarkModeObserver mDarkModeObserver; private DarkModeObserver mDarkModeObserver;
private PowerManager mPowerManager;
private Runnable mCallback; private Runnable mCallback;
public DarkModePreference(Context context, AttributeSet attrs) { public DarkModePreference(Context context, AttributeSet attrs) {
super(context, attrs); super(context, attrs);
mDarkModeObserver = new DarkModeObserver(context); mDarkModeObserver = new DarkModeObserver(context);
mUiModeManager = context.getSystemService(UiModeManager.class); mUiModeManager = context.getSystemService(UiModeManager.class);
mPowerManager = context.getSystemService(PowerManager.class);
mCallback = () -> { mCallback = () -> {
updateSummary(); final boolean batterySaver = mPowerManager.isPowerSaveMode();
final boolean active = (getContext().getResources().getConfiguration().uiMode
& Configuration.UI_MODE_NIGHT_YES) != 0;
setSwitchEnabled(!batterySaver);
updateSummary(batterySaver, active);
}; };
mDarkModeObserver.subscribe(mCallback); mDarkModeObserver.subscribe(mCallback);
} }
@@ -51,9 +58,13 @@ public class DarkModePreference extends MasterSwitchPreference {
mDarkModeObserver.unsubscribe(); mDarkModeObserver.unsubscribe();
} }
private void updateSummary() { private void updateSummary(boolean batterySaver, boolean active) {
final boolean active = (getContext().getResources().getConfiguration().uiMode if (batterySaver) {
& Configuration.UI_MODE_NIGHT_YES) != 0; final int stringId = active ? R.string.dark_ui_mode_disabled_summary_dark_theme_on
: R.string.dark_ui_mode_disabled_summary_dark_theme_off;
setSummary(getContext().getString(stringId));
return;
}
final boolean auto = mUiModeManager.getNightMode() == UiModeManager.MODE_NIGHT_AUTO; final boolean auto = mUiModeManager.getNightMode() == UiModeManager.MODE_NIGHT_AUTO;
String detail; String detail;

View File

@@ -17,6 +17,7 @@ package com.android.settings.display.darkmode;
import android.app.UiModeManager; import android.app.UiModeManager;
import android.content.Context; import android.content.Context;
import android.content.res.Configuration; import android.content.res.Configuration;
import android.os.PowerManager;
import androidx.preference.DropDownPreference; import androidx.preference.DropDownPreference;
import androidx.preference.Preference; import androidx.preference.Preference;
import androidx.preference.PreferenceScreen; import androidx.preference.PreferenceScreen;
@@ -30,13 +31,14 @@ public class DarkModeScheduleSelectorController extends BasePreferenceController
implements Preference.OnPreferenceChangeListener { implements Preference.OnPreferenceChangeListener {
private final UiModeManager mUiModeManager; private final UiModeManager mUiModeManager;
private boolean mPreferenceSet = false; private PowerManager mPowerManager;
private DropDownPreference mPreference; private DropDownPreference mPreference;
private String mCurrentMode; private String mCurrentMode;
public DarkModeScheduleSelectorController(Context context, String key) { public DarkModeScheduleSelectorController(Context context, String key) {
super(context, key); super(context, key);
mUiModeManager = context.getSystemService(UiModeManager.class); mUiModeManager = context.getSystemService(UiModeManager.class);
mPowerManager = context.getSystemService(PowerManager.class);
} }
@Override @Override
@@ -53,6 +55,8 @@ public class DarkModeScheduleSelectorController extends BasePreferenceController
@Override @Override
public final void updateState(Preference preference) { public final void updateState(Preference preference) {
final boolean batterySaver = mPowerManager.isPowerSaveMode();
mPreference.setEnabled(!batterySaver);
mCurrentMode = mCurrentMode =
mUiModeManager.getNightMode() == UiModeManager.MODE_NIGHT_AUTO mUiModeManager.getNightMode() == UiModeManager.MODE_NIGHT_AUTO
? mContext.getString(R.string.dark_ui_auto_mode_auto) ? mContext.getString(R.string.dark_ui_auto_mode_auto)

View File

@@ -19,6 +19,7 @@ import android.app.UiModeManager;
import android.content.Context; import android.content.Context;
import android.content.res.Configuration; import android.content.res.Configuration;
import android.content.res.Resources; import android.content.res.Resources;
import android.os.PowerManager;
import android.view.View; import android.view.View;
import android.widget.Button; import android.widget.Button;
import androidx.preference.PreferenceScreen; import androidx.preference.PreferenceScreen;
@@ -57,6 +58,8 @@ public class DarkModeActivationPreferenceControllerTest {
private Button mTurnOffButton; private Button mTurnOffButton;
@Mock @Mock
private Button mTurnOnButton; private Button mTurnOnButton;
@Mock
private PowerManager mPM;
private Configuration configNightYes = new Configuration(); private Configuration configNightYes = new Configuration();
private Configuration configNightNo = new Configuration();; private Configuration configNightNo = new Configuration();;
@@ -67,6 +70,7 @@ public class DarkModeActivationPreferenceControllerTest {
mService = mock(UiModeManager.class); mService = mock(UiModeManager.class);
when(mContext.getResources()).thenReturn(res); when(mContext.getResources()).thenReturn(res);
when(mContext.getSystemService(UiModeManager.class)).thenReturn(mService); when(mContext.getSystemService(UiModeManager.class)).thenReturn(mService);
when(mContext.getSystemService(PowerManager.class)).thenReturn(mPM);
when(mScreen.findPreference(anyString())).thenReturn(mPreference); when(mScreen.findPreference(anyString())).thenReturn(mPreference);
when(mPreference.findViewById( when(mPreference.findViewById(
eq(R.id.dark_ui_turn_on_button))).thenReturn(mTurnOnButton); eq(R.id.dark_ui_turn_on_button))).thenReturn(mTurnOnButton);
@@ -152,4 +156,12 @@ public class DarkModeActivationPreferenceControllerTest {
assertEquals(mController.getSummary(), mContext.getString( assertEquals(mController.getSummary(), mContext.getString(
R.string.dark_ui_summary_off_auto_mode_auto)); R.string.dark_ui_summary_off_auto_mode_auto));
} }
@Test
public void buttonVisisbility_hideButton_offWhenInPowerSaveMode() {
when(mPM.isPowerSaveMode()).thenReturn(true);
mController.updateState(mPreference);
verify(mTurnOffButton).setVisibility(eq(View.GONE));
verify(mTurnOnButton).setVisibility(eq(View.GONE));
}
} }

View File

@@ -16,6 +16,7 @@ package com.android.settings.display.darkmode;
import android.app.UiModeManager; import android.app.UiModeManager;
import android.content.Context; import android.content.Context;
import android.os.PowerManager;
import androidx.preference.DropDownPreference; import androidx.preference.DropDownPreference;
import androidx.preference.PreferenceScreen; import androidx.preference.PreferenceScreen;
import org.junit.Before; import org.junit.Before;
@@ -31,6 +32,7 @@ import static junit.framework.TestCase.assertFalse;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.spy; import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
@@ -45,24 +47,27 @@ public class DarkModeScheduleSelectorControllerTest {
private PreferenceScreen mScreen; private PreferenceScreen mScreen;
private Context mContext; private Context mContext;
@Mock @Mock
private UiModeManager mService; private UiModeManager mUiService;
@Mock
private PowerManager mPM;
@Before @Before
public void setUp() { public void setUp() {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
mContext = spy(RuntimeEnvironment.application); mContext = spy(RuntimeEnvironment.application);
when(mContext.getSystemService(UiModeManager.class)).thenReturn(mService); when(mContext.getSystemService(UiModeManager.class)).thenReturn(mUiService);
when(mContext.getSystemService(PowerManager.class)).thenReturn(mPM);
when(mContext.getString(R.string.dark_ui_auto_mode_never)).thenReturn("never"); 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_auto)).thenReturn("auto");
mPreference = spy(new DropDownPreference(mContext)); mPreference = spy(new DropDownPreference(mContext));
when(mScreen.findPreference(anyString())).thenReturn(mPreference); when(mScreen.findPreference(anyString())).thenReturn(mPreference);
when(mService.setNightModeActivated(anyBoolean())).thenReturn(true); when(mUiService.setNightModeActivated(anyBoolean())).thenReturn(true);
mController = new DarkModeScheduleSelectorController(mContext, mPreferenceKey); mController = new DarkModeScheduleSelectorController(mContext, mPreferenceKey);
} }
@Test @Test
public void nightMode_preferenceChange_preferenceChangeTrueWhenChangedOnly() { public void nightMode_preferenceChange_preferenceChangeTrueWhenChangedOnly() {
when(mService.getNightMode()).thenReturn(UiModeManager.MODE_NIGHT_YES); when(mUiService.getNightMode()).thenReturn(UiModeManager.MODE_NIGHT_YES);
mController.displayPreference(mScreen); mController.displayPreference(mScreen);
boolean changed = mController boolean changed = mController
.onPreferenceChange(mScreen, mContext.getString(R.string.dark_ui_auto_mode_auto)); .onPreferenceChange(mScreen, mContext.getString(R.string.dark_ui_auto_mode_auto));
@@ -74,7 +79,7 @@ public class DarkModeScheduleSelectorControllerTest {
@Test @Test
public void nightMode_updateStateNone_dropDownValueChangedToNone() { public void nightMode_updateStateNone_dropDownValueChangedToNone() {
when(mService.getNightMode()).thenReturn(UiModeManager.MODE_NIGHT_YES); when(mUiService.getNightMode()).thenReturn(UiModeManager.MODE_NIGHT_YES);
mController.displayPreference(mScreen); mController.displayPreference(mScreen);
mController.updateState(mPreference); mController.updateState(mPreference);
verify(mPreference).setValue(mContext.getString(R.string.dark_ui_auto_mode_never)); verify(mPreference).setValue(mContext.getString(R.string.dark_ui_auto_mode_never));
@@ -82,9 +87,17 @@ public class DarkModeScheduleSelectorControllerTest {
@Test @Test
public void nightMode_updateStateNone_dropDownValueChangedToAuto() { public void nightMode_updateStateNone_dropDownValueChangedToAuto() {
when(mService.getNightMode()).thenReturn(UiModeManager.MODE_NIGHT_AUTO); when(mUiService.getNightMode()).thenReturn(UiModeManager.MODE_NIGHT_AUTO);
mController.displayPreference(mScreen); mController.displayPreference(mScreen);
mController.updateState(mPreference); mController.updateState(mPreference);
verify(mPreference).setValue(mContext.getString(R.string.dark_ui_auto_mode_auto)); verify(mPreference).setValue(mContext.getString(R.string.dark_ui_auto_mode_auto));
} }
@Test
public void batterySaver_dropDown_disabledSelector() {
when(mPM.isPowerSaveMode()).thenReturn(true);
mController.displayPreference(mScreen);
mController.updateState(mPreference);
verify(mPreference).setEnabled(eq(false));
}
} }