blob: 8c945f9f7a1367f46a1f866bab7e93a8522589d8 [file] [log] [blame]
Jason Monk5dbd4aa2016-02-07 13:13:39 -05001/**
2 * Copyright (c) 2016, The Android Open Source Project
3 *
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
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
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.
15 */
16package com.android.systemui.tuner;
17
18import android.annotation.Nullable;
19import android.app.UiModeManager;
Jason Monk5dbd4aa2016-02-07 13:13:39 -050020import android.content.Context;
21import android.os.Bundle;
Jason Monk5dbd4aa2016-02-07 13:13:39 -050022import android.provider.Settings.Secure;
23import android.support.v14.preference.PreferenceFragment;
24import android.support.v14.preference.SwitchPreference;
Jason Monk5dbd4aa2016-02-07 13:13:39 -050025import android.support.v7.preference.Preference;
26import android.support.v7.preference.Preference.OnPreferenceChangeListener;
27import android.view.LayoutInflater;
28import android.view.View;
29import android.view.ViewGroup;
30import android.widget.Switch;
Jason Monk5732df42016-02-24 16:24:55 -050031import com.android.internal.logging.MetricsLogger;
32import com.android.internal.logging.MetricsProto.MetricsEvent;
Jason Monk5dbd4aa2016-02-07 13:13:39 -050033import com.android.systemui.R;
Jason Monk5dbd4aa2016-02-07 13:13:39 -050034import com.android.systemui.statusbar.policy.NightModeController;
35import com.android.systemui.statusbar.policy.NightModeController.Listener;
36import com.android.systemui.tuner.TunerService.Tunable;
37
38public class NightModeFragment extends PreferenceFragment implements Tunable,
39 Listener, OnPreferenceChangeListener {
40
41 private static final String TAG = "NightModeFragment";
Jason Monk76c67aa2016-02-19 14:49:42 -050042
43 public static final String EXTRA_SHOW_NIGHT_MODE = "show_night_mode";
44
Jason Monk5dbd4aa2016-02-07 13:13:39 -050045 private static final CharSequence KEY_AUTO = "auto";
46 private static final CharSequence KEY_DARK_THEME = "dark_theme";
47 private static final CharSequence KEY_ADJUST_TINT = "adjust_tint";
48 private static final CharSequence KEY_ADJUST_BRIGHTNESS = "adjust_brightness";
49
50 private Switch mSwitch;
51
52 private NightModeController mNightModeController;
53 private SwitchPreference mAutoSwitch;
54 private SwitchPreference mDarkTheme;
55 private SwitchPreference mAdjustTint;
56 private SwitchPreference mAdjustBrightness;
57 private UiModeManager mUiModeManager;
58
59 @Override
60 public void onCreate(@Nullable Bundle savedInstanceState) {
61 super.onCreate(savedInstanceState);
62 mNightModeController = new NightModeController(getContext());
63 mUiModeManager = getContext().getSystemService(UiModeManager.class);
64 }
65
66 @Override
67 public View onCreateView(LayoutInflater inflater, ViewGroup container,
68 Bundle savedInstanceState) {
69 final View view = LayoutInflater.from(getContext()).inflate(
70 R.layout.night_mode_settings, container, false);
71 ((ViewGroup) view).addView(super.onCreateView(inflater, container, savedInstanceState));
72 return view;
73 }
74
75 @Override
76 public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
77 final Context context = getPreferenceManager().getContext();
78
79 addPreferencesFromResource(R.xml.night_mode);
80 mAutoSwitch = (SwitchPreference) findPreference(KEY_AUTO);
81 mAutoSwitch.setOnPreferenceChangeListener(this);
82 mDarkTheme = (SwitchPreference) findPreference(KEY_DARK_THEME);
83 mDarkTheme.setOnPreferenceChangeListener(this);
84 mAdjustTint = (SwitchPreference) findPreference(KEY_ADJUST_TINT);
85 mAdjustTint.setOnPreferenceChangeListener(this);
86 mAdjustBrightness = (SwitchPreference) findPreference(KEY_ADJUST_BRIGHTNESS);
87 mAdjustBrightness.setOnPreferenceChangeListener(this);
88 }
89
90 @Override
91 public void onViewCreated(View view, Bundle savedInstanceState) {
92 super.onViewCreated(view, savedInstanceState);
93 View switchBar = view.findViewById(R.id.switch_bar);
94 mSwitch = (Switch) switchBar.findViewById(android.R.id.switch_widget);
95 mSwitch.setChecked(mNightModeController.isEnabled());
96 switchBar.setOnClickListener(new View.OnClickListener() {
97 @Override
98 public void onClick(View v) {
99 boolean newState = !mNightModeController.isEnabled();
Jason Monk5732df42016-02-24 16:24:55 -0500100 MetricsLogger.action(getContext(), MetricsEvent.ACTION_TUNER_NIGHT_MODE, newState);
Jason Monk5dbd4aa2016-02-07 13:13:39 -0500101 mNightModeController.setNightMode(newState);
102 mSwitch.setChecked(newState);
103 }
104 });
105 }
106
107 @Override
108 public void onResume() {
109 super.onResume();
Jason Monk5732df42016-02-24 16:24:55 -0500110 MetricsLogger.visibility(getContext(), MetricsEvent.TUNER_NIGHT_MODE, true);
Jason Monk5dbd4aa2016-02-07 13:13:39 -0500111 mNightModeController.addListener(this);
112 TunerService.get(getContext()).addTunable(this, Secure.BRIGHTNESS_USE_TWILIGHT,
113 NightModeController.NIGHT_MODE_ADJUST_TINT);
114 mDarkTheme.setChecked(mUiModeManager.getNightMode() == UiModeManager.MODE_NIGHT_AUTO);
115 calculateDisabled();
116 }
117
118 @Override
119 public void onPause() {
120 super.onPause();
Jason Monk5732df42016-02-24 16:24:55 -0500121 MetricsLogger.visibility(getContext(), MetricsEvent.TUNER_NIGHT_MODE, false);
Jason Monk5dbd4aa2016-02-07 13:13:39 -0500122 mNightModeController.removeListener(this);
123 TunerService.get(getContext()).removeTunable(this);
124 }
125
126 @Override
127 public boolean onPreferenceChange(Preference preference, Object newValue) {
Jason Monk5732df42016-02-24 16:24:55 -0500128 final Boolean value = (Boolean) newValue;
Jason Monk5dbd4aa2016-02-07 13:13:39 -0500129 if (mAutoSwitch == preference) {
Jason Monk5732df42016-02-24 16:24:55 -0500130 MetricsLogger.action(getContext(), MetricsEvent.ACTION_TUNER_NIGHT_MODE_AUTO, value);
131 mNightModeController.setAuto(value);
Jason Monk5dbd4aa2016-02-07 13:13:39 -0500132 } else if (mDarkTheme == preference) {
Jason Monk5732df42016-02-24 16:24:55 -0500133 MetricsLogger.action(getContext(),
134 MetricsEvent.ACTION_TUNER_NIGHT_MODE_ADJUST_DARK_THEME, value);
135 mUiModeManager.setNightMode(value ? UiModeManager.MODE_NIGHT_AUTO
Jason Monk5dbd4aa2016-02-07 13:13:39 -0500136 : UiModeManager.MODE_NIGHT_NO);
137 postCalculateDisabled();
138 } else if (mAdjustTint == preference) {
Jason Monk5732df42016-02-24 16:24:55 -0500139 MetricsLogger.action(getContext(),
140 MetricsEvent.ACTION_TUNER_NIGHT_MODE_ADJUST_TINT, value);
141 mNightModeController.setAdjustTint(value);
Jason Monk5dbd4aa2016-02-07 13:13:39 -0500142 postCalculateDisabled();
143 } else if (mAdjustBrightness == preference) {
Jason Monk5732df42016-02-24 16:24:55 -0500144 MetricsLogger.action(getContext(),
145 MetricsEvent.ACTION_TUNER_NIGHT_MODE_ADJUST_BRIGHTNESS, value);
Jason Monk5dbd4aa2016-02-07 13:13:39 -0500146 TunerService.get(getContext()).setValue(Secure.BRIGHTNESS_USE_TWILIGHT,
Jason Monk5732df42016-02-24 16:24:55 -0500147 value ? 1 : 0);
Jason Monk5dbd4aa2016-02-07 13:13:39 -0500148 postCalculateDisabled();
149 } else {
150 return false;
151 }
152 return true;
153 }
154
155 private void postCalculateDisabled() {
156 // Post this because its the easiest way to wait for all state to be calculated.
157 getView().post(new Runnable() {
158 @Override
159 public void run() {
160 calculateDisabled();
161 }
162 });
163 }
164
165 private void calculateDisabled() {
166 int enabledCount = (mDarkTheme.isChecked() ? 1 : 0)
167 + (mAdjustTint.isChecked() ? 1 : 0)
168 + (mAdjustBrightness.isChecked() ? 1 : 0);
169 if (enabledCount == 1) {
170 if (mDarkTheme.isChecked()) {
171 mDarkTheme.setEnabled(false);
172 } else if (mAdjustTint.isChecked()) {
173 mAdjustTint.setEnabled(false);
174 } else {
175 mAdjustBrightness.setEnabled(false);
176 }
177 } else {
178 mDarkTheme.setEnabled(true);
179 mAdjustTint.setEnabled(true);
180 mAdjustBrightness.setEnabled(true);
181 }
182 }
183
184 @Override
185 public void onTuningChanged(String key, String newValue) {
186 if (Secure.BRIGHTNESS_USE_TWILIGHT.equals(key)) {
187 mAdjustBrightness.setChecked(newValue != null && Integer.parseInt(newValue) != 0);
188 } else if (NightModeController.NIGHT_MODE_ADJUST_TINT.equals(key)) {
189 // Default on.
190 mAdjustTint.setChecked(newValue == null || Integer.parseInt(newValue) != 0);
191 }
192 }
193
194 @Override
195 public void onNightModeChanged() {
196 mSwitch.setChecked(mNightModeController.isEnabled());
197 }
198
199 @Override
200 public void onTwilightAutoChanged() {
201 mAutoSwitch.setChecked(mNightModeController.isAuto());
202 }
203}