2 * Copyright (C) 2018 The Android Open Source Project
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License
17 package com.android.settings.display;
19 import android.app.UiModeManager;
20 import android.content.BroadcastReceiver;
21 import android.content.Context;
22 import android.content.Intent;
23 import android.content.IntentFilter;
24 import android.content.res.Configuration;
25 import android.os.PowerManager;
26 import android.provider.Settings;
28 import androidx.annotation.VisibleForTesting;
29 import androidx.fragment.app.Fragment;
30 import androidx.preference.Preference;
31 import androidx.preference.PreferenceScreen;
33 import com.android.settings.R;
34 import com.android.settings.core.TogglePreferenceController;
35 import com.android.settings.display.darkmode.DarkModePreference;
36 import com.android.settingslib.core.lifecycle.LifecycleObserver;
37 import com.android.settingslib.core.lifecycle.events.OnStart;
38 import com.android.settingslib.core.lifecycle.events.OnStop;
40 public class DarkUIPreferenceController extends TogglePreferenceController implements
41 LifecycleObserver, OnStart, OnStop {
43 public static final String DARK_MODE_PREFS = "dark_mode_prefs";
44 public static final String PREF_DARK_MODE_DIALOG_SEEN = "dark_mode_dialog_seen";
45 public static final int DIALOG_SEEN = 1;
48 Preference mPreference;
50 private UiModeManager mUiModeManager;
51 private PowerManager mPowerManager;
52 private Context mContext;
54 private Fragment mFragment;
56 private BroadcastReceiver mReceiver = new BroadcastReceiver() {
58 public void onReceive(Context context, Intent intent) {
59 updateEnabledStateIfNeeded();
63 public DarkUIPreferenceController(Context context, String key) {
66 mUiModeManager = context.getSystemService(UiModeManager.class);
67 mPowerManager = context.getSystemService(PowerManager.class);
71 public boolean isChecked() {
72 return (mContext.getResources().getConfiguration().uiMode
73 & Configuration.UI_MODE_NIGHT_YES) != 0;
77 public void displayPreference(PreferenceScreen screen) {
78 super.displayPreference(screen);
79 mPreference = screen.findPreference(getPreferenceKey());
83 public void updateState(Preference preference) {
84 super.updateState(preference);
85 updateEnabledStateIfNeeded();
89 public boolean setChecked(boolean isChecked) {
90 final boolean dialogSeen =
91 Settings.Secure.getInt(mContext.getContentResolver(),
92 Settings.Secure.DARK_MODE_DIALOG_SEEN, 0) == DIALOG_SEEN;
93 if (!dialogSeen && isChecked) {
97 return mUiModeManager.setNightModeActivated(isChecked);
100 private void showDarkModeDialog() {
101 final DarkUIInfoDialogFragment frag = new DarkUIInfoDialogFragment();
102 if (mFragment.getFragmentManager() != null) {
103 frag.show(mFragment.getFragmentManager(), getClass().getName());
108 void updateEnabledStateIfNeeded() {
109 if (mPreference == null) {
112 boolean isBatterySaver = isPowerSaveMode();
113 mPreference.setEnabled(!isBatterySaver);
114 if (isBatterySaver) {
115 int stringId = isChecked()
116 ? R.string.dark_ui_mode_disabled_summary_dark_theme_on
117 : R.string.dark_ui_mode_disabled_summary_dark_theme_off;
118 mPreference.setSummary(mContext.getString(stringId));
123 boolean isPowerSaveMode() {
124 return mPowerManager.isPowerSaveMode();
128 public void onStart() {
129 mContext.registerReceiver(mReceiver,
130 new IntentFilter(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED));
133 // used by AccessibilitySettings
134 public void setParentFragment(Fragment fragment) {
135 mFragment = fragment;
139 public void onStop() {
140 mContext.unregisterReceiver(mReceiver);
144 public int getAvailabilityStatus() {