OSDN Git Service

Battery saver mode should disable dark mode modification
authorJay Aliomer <aaliomer@google.com>
Wed, 27 Nov 2019 22:46:58 +0000 (17:46 -0500)
committerJay Aliomer <aaliomer@google.com>
Mon, 2 Dec 2019 18:19:52 +0000 (18:19 +0000)
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

res/xml/dark_mode_settings.xml
src/com/android/settings/display/DarkUIPreferenceController.java
src/com/android/settings/display/darkmode/DarkModeActivationPreferenceController.java
src/com/android/settings/display/darkmode/DarkModeObserver.java
src/com/android/settings/display/darkmode/DarkModePreference.java
src/com/android/settings/display/darkmode/DarkModeScheduleSelectorController.java
tests/robotests/src/com/android/settings/display/darkmode/DarkModeActivationPreferenceControllerTest.java
tests/robotests/src/com/android/settings/display/darkmode/DarkModeScheduleSelectorControllerTest.java

index 9247a0c..c3985e6 100644 (file)
@@ -24,7 +24,7 @@
     <DropDownPreference
         android:key="dark_ui_auto_mode"
         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:entryValues="@array/dark_ui_scheduler_preference_titles"
         settings:controller="com.android.settings.display.darkmode.DarkModeScheduleSelectorController"
index 7e550d7..98d9a69 100644 (file)
@@ -32,7 +32,6 @@ import androidx.preference.PreferenceScreen;
 
 import com.android.settings.R;
 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.events.OnStart;
 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;
         if (!dialogSeen && isChecked) {
             showDarkModeDialog();
-            return false;
         }
         return mUiModeManager.setNightModeActivated(isChecked);
     }
index 98d4b14..23f625f 100644 (file)
@@ -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.os.PowerManager;
 import android.view.View;
 import android.widget.Button;
 import androidx.preference.Preference;
@@ -30,18 +31,27 @@ import com.android.settingslib.widget.LayoutPreference;
  */
 public class DarkModeActivationPreferenceController extends BasePreferenceController {
     private final UiModeManager mUiModeManager;
+    private PowerManager mPowerManager;
     private Button mTurnOffButton;
     private Button mTurnOnButton;
 
     public DarkModeActivationPreferenceController(Context context,
             String preferenceKey) {
         super(context, preferenceKey);
-
+        mPowerManager = context.getSystemService(PowerManager.class);
         mUiModeManager = context.getSystemService(UiModeManager.class);
     }
 
     @Override
     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
                 & Configuration.UI_MODE_NIGHT_YES) != 0;
         updateNightMode(active);
index 1c076f7..4d0d7c5 100644 (file)
 
 package com.android.settings.display.darkmode;
 
+import android.content.BroadcastReceiver;
 import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
 import android.database.ContentObserver;
 import android.net.Uri;
 import android.os.Handler;
 import android.os.Looper;
+import android.os.PowerManager;
 import android.provider.Settings;
+import android.util.Log;
 import com.android.internal.annotations.VisibleForTesting;
 
 /**
  * Observes changes for dark night settings*/
 public class DarkModeObserver {
+    private static final String TAG = "DarkModeObserver";
     private ContentObserver mContentObserver;
+    private final BroadcastReceiver mBatterySaverReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            mCallback.run();
+        }
+    };
     private Runnable mCallback;
     private Context mContext;
 
@@ -58,6 +70,10 @@ public class DarkModeObserver {
         mCallback = callback;
         final Uri uri = Settings.Secure.getUriFor(Settings.Secure.UI_NIGHT_MODE);
         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() {
         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;
     }
 
index 2a8909f..c5fbded 100644 (file)
@@ -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.os.PowerManager;
 import android.util.AttributeSet;
 import com.android.settings.R;
 import com.android.settings.widget.MasterSwitchPreference;
@@ -27,14 +28,20 @@ public class DarkModePreference extends MasterSwitchPreference {
 
     private UiModeManager mUiModeManager;
     private DarkModeObserver mDarkModeObserver;
+    private PowerManager mPowerManager;
     private Runnable mCallback;
 
     public DarkModePreference(Context context, AttributeSet attrs) {
         super(context, attrs);
         mDarkModeObserver = new DarkModeObserver(context);
         mUiModeManager = context.getSystemService(UiModeManager.class);
+        mPowerManager = context.getSystemService(PowerManager.class);
         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);
     }
@@ -51,9 +58,13 @@ public class DarkModePreference extends MasterSwitchPreference {
         mDarkModeObserver.unsubscribe();
     }
 
-    private void updateSummary() {
-        final boolean active = (getContext().getResources().getConfiguration().uiMode
-                & Configuration.UI_MODE_NIGHT_YES) != 0;
+    private void updateSummary(boolean batterySaver, boolean active) {
+        if (batterySaver) {
+            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;
 
         String detail;
index ab7ea92..d99c7bf 100644 (file)
@@ -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.os.PowerManager;
 import androidx.preference.DropDownPreference;
 import androidx.preference.Preference;
 import androidx.preference.PreferenceScreen;
@@ -30,13 +31,14 @@ public class DarkModeScheduleSelectorController extends BasePreferenceController
         implements Preference.OnPreferenceChangeListener {
 
     private final UiModeManager mUiModeManager;
-    private boolean mPreferenceSet = false;
+    private PowerManager mPowerManager;
     private DropDownPreference mPreference;
     private String mCurrentMode;
 
     public DarkModeScheduleSelectorController(Context context, String key) {
         super(context, key);
         mUiModeManager = context.getSystemService(UiModeManager.class);
+        mPowerManager = context.getSystemService(PowerManager.class);
     }
 
     @Override
@@ -53,6 +55,8 @@ public class DarkModeScheduleSelectorController extends BasePreferenceController
 
     @Override
     public final void updateState(Preference preference) {
+        final boolean batterySaver = mPowerManager.isPowerSaveMode();
+        mPreference.setEnabled(!batterySaver);
         mCurrentMode =
                 mUiModeManager.getNightMode() == UiModeManager.MODE_NIGHT_AUTO
                 ? mContext.getString(R.string.dark_ui_auto_mode_auto)
index 24cbd07..cd20ea2 100644 (file)
@@ -19,6 +19,7 @@ import android.app.UiModeManager;
 import android.content.Context;
 import android.content.res.Configuration;
 import android.content.res.Resources;
+import android.os.PowerManager;
 import android.view.View;
 import android.widget.Button;
 import androidx.preference.PreferenceScreen;
@@ -57,6 +58,8 @@ public class DarkModeActivationPreferenceControllerTest {
     private Button mTurnOffButton;
     @Mock
     private Button mTurnOnButton;
+    @Mock
+    private PowerManager mPM;
 
     private Configuration configNightYes = new Configuration();
     private Configuration configNightNo = new Configuration();;
@@ -67,6 +70,7 @@ public class DarkModeActivationPreferenceControllerTest {
         mService = mock(UiModeManager.class);
         when(mContext.getResources()).thenReturn(res);
         when(mContext.getSystemService(UiModeManager.class)).thenReturn(mService);
+        when(mContext.getSystemService(PowerManager.class)).thenReturn(mPM);
         when(mScreen.findPreference(anyString())).thenReturn(mPreference);
         when(mPreference.findViewById(
                 eq(R.id.dark_ui_turn_on_button))).thenReturn(mTurnOnButton);
@@ -152,4 +156,12 @@ public class DarkModeActivationPreferenceControllerTest {
         assertEquals(mController.getSummary(), mContext.getString(
                 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));
+    }
 }
index a844fec..53be42c 100644 (file)
@@ -16,6 +16,7 @@ package com.android.settings.display.darkmode;
 
 import android.app.UiModeManager;
 import android.content.Context;
+import android.os.PowerManager;
 import androidx.preference.DropDownPreference;
 import androidx.preference.PreferenceScreen;
 import org.junit.Before;
@@ -31,6 +32,7 @@ import static junit.framework.TestCase.assertFalse;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.ArgumentMatchers.anyBoolean;
 import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
@@ -45,24 +47,27 @@ public class DarkModeScheduleSelectorControllerTest {
     private PreferenceScreen mScreen;
     private Context mContext;
     @Mock
-    private UiModeManager mService;
+    private UiModeManager mUiService;
+    @Mock
+    private PowerManager mPM;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
         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_auto)).thenReturn("auto");
         mPreference = spy(new DropDownPreference(mContext));
         when(mScreen.findPreference(anyString())).thenReturn(mPreference);
-        when(mService.setNightModeActivated(anyBoolean())).thenReturn(true);
+        when(mUiService.setNightModeActivated(anyBoolean())).thenReturn(true);
         mController = new DarkModeScheduleSelectorController(mContext, mPreferenceKey);
     }
 
     @Test
     public void nightMode_preferenceChange_preferenceChangeTrueWhenChangedOnly() {
-        when(mService.getNightMode()).thenReturn(UiModeManager.MODE_NIGHT_YES);
+        when(mUiService.getNightMode()).thenReturn(UiModeManager.MODE_NIGHT_YES);
         mController.displayPreference(mScreen);
         boolean changed = mController
                 .onPreferenceChange(mScreen, mContext.getString(R.string.dark_ui_auto_mode_auto));
@@ -74,7 +79,7 @@ public class DarkModeScheduleSelectorControllerTest {
 
     @Test
     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.updateState(mPreference);
         verify(mPreference).setValue(mContext.getString(R.string.dark_ui_auto_mode_never));
@@ -82,9 +87,17 @@ public class DarkModeScheduleSelectorControllerTest {
 
     @Test
     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.updateState(mPreference);
         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));
+    }
 }