OSDN Git Service

Revert "Revert "Add settings for scheduling dark theme""
[android-x86/packages-apps-Settings.git] / src / com / android / settings / display / DarkUIPreferenceController.java
index 9df2402..7e550d7 100644 (file)
 package com.android.settings.display;
 
 import android.app.UiModeManager;
+import android.content.BroadcastReceiver;
 import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.res.Configuration;
+import android.os.PowerManager;
 import android.provider.Settings;
 
 import androidx.annotation.VisibleForTesting;
 import androidx.fragment.app.Fragment;
+import androidx.preference.Preference;
+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;
 
-public class DarkUIPreferenceController extends TogglePreferenceController {
+public class DarkUIPreferenceController extends TogglePreferenceController implements
+        LifecycleObserver, OnStart, OnStop {
 
     public static final String DARK_MODE_PREFS = "dark_mode_prefs";
     public static final String PREF_DARK_MODE_DIALOG_SEEN = "dark_mode_dialog_seen";
     public static final int DIALOG_SEEN = 1;
+
+    @VisibleForTesting
+    Preference mPreference;
+
     private UiModeManager mUiModeManager;
+    private PowerManager mPowerManager;
     private Context mContext;
+
     private Fragment mFragment;
 
+    private BroadcastReceiver mReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            updateEnabledStateIfNeeded();
+        }
+    };
+
     public DarkUIPreferenceController(Context context, String key) {
         super(context, key);
         mContext = context;
         mUiModeManager = context.getSystemService(UiModeManager.class);
+        mPowerManager = context.getSystemService(PowerManager.class);
     }
 
     @Override
     public boolean isChecked() {
-        return mUiModeManager.getNightMode() == UiModeManager.MODE_NIGHT_YES;
+         return (mContext.getResources().getConfiguration().uiMode
+                 & Configuration.UI_MODE_NIGHT_YES) != 0;
+    }
+
+    @Override
+    public void displayPreference(PreferenceScreen screen) {
+        super.displayPreference(screen);
+        mPreference = screen.findPreference(getPreferenceKey());
+    }
+
+    @Override
+    public void updateState(Preference preference) {
+        super.updateState(preference);
+        updateEnabledStateIfNeeded();
     }
 
     @Override
@@ -54,29 +94,53 @@ public class DarkUIPreferenceController extends TogglePreferenceController {
             showDarkModeDialog();
             return false;
         }
-        mUiModeManager.setNightMode(isChecked
-                ? UiModeManager.MODE_NIGHT_YES
-                : UiModeManager.MODE_NIGHT_NO);
-        return true;
+        return mUiModeManager.setNightModeActivated(isChecked);
     }
 
     private void showDarkModeDialog() {
         final DarkUIInfoDialogFragment frag = new DarkUIInfoDialogFragment();
-        if (mFragment.getFragmentManager() != null) {
+        if (mFragment != null && mFragment.getFragmentManager() != null) {
             frag.show(mFragment.getFragmentManager(), getClass().getName());
         }
     }
 
     @VisibleForTesting
-    void setUiModeManager(UiModeManager uiModeManager) {
-        mUiModeManager = uiModeManager;
+    void updateEnabledStateIfNeeded() {
+        if (mPreference == null) {
+            return;
+        }
+        boolean isBatterySaver = isPowerSaveMode();
+        mPreference.setEnabled(!isBatterySaver);
+        if (isBatterySaver) {
+            int stringId = isChecked()
+                    ? R.string.dark_ui_mode_disabled_summary_dark_theme_on
+                    : R.string.dark_ui_mode_disabled_summary_dark_theme_off;
+            mPreference.setSummary(mContext.getString(stringId));
+        }
+    }
+
+    @VisibleForTesting
+    boolean isPowerSaveMode() {
+        return mPowerManager.isPowerSaveMode();
     }
 
+    @Override
+    public void onStart() {
+        mContext.registerReceiver(mReceiver,
+                new IntentFilter(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED));
+    }
+
+    // used by AccessibilitySettings
     public void setParentFragment(Fragment fragment) {
         mFragment = fragment;
     }
 
     @Override
+    public void onStop() {
+        mContext.unregisterReceiver(mReceiver);
+    }
+
+    @Override
     public int getAvailabilityStatus() {
         return AVAILABLE;
     }