NightDisplaySettings.java revision d60f09edafea67616d574d4421da220b1615e194
1/*
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 */
16
17package com.android.settings.display;
18
19import android.app.Dialog;
20import android.app.TimePickerDialog;
21import android.content.Context;
22import android.os.Bundle;
23import android.support.v7.preference.DropDownPreference;
24import android.support.v7.preference.Preference;
25import android.widget.Switch;
26import android.widget.TimePicker;
27
28import com.android.internal.app.NightDisplayController;
29import com.android.internal.logging.MetricsProto.MetricsEvent;
30import com.android.settings.R;
31import com.android.settings.SettingsActivity;
32import com.android.settings.SettingsPreferenceFragment;
33import com.android.settings.widget.SwitchBar;
34
35import java.text.DateFormat;
36import java.util.Calendar;
37import java.util.TimeZone;
38
39/**
40 * Settings screen for Night display.
41 */
42public class NightDisplaySettings extends SettingsPreferenceFragment implements
43        NightDisplayController.Callback,
44        Preference.OnPreferenceChangeListener,
45        SwitchBar.OnSwitchChangeListener {
46
47    private static final String KEY_NIGHT_DISPLAY_AUTO_MODE = "night_display_auto_mode";
48    private static final String KEY_NIGHT_DISPLAY_START_TIME = "night_display_start_time";
49    private static final String KEY_NIGHT_DISPLAY_END_TIME = "night_display_end_time";
50
51    private static final int DIALOG_START_TIME = 0;
52    private static final int DIALOG_END_TIME = 1;
53
54    private NightDisplayController mController;
55    private DateFormat mTimeFormatter;
56
57    private DropDownPreference mAutoModePreference;
58    private Preference mStartTimePreference;
59    private Preference mEndTimePreference;
60
61    private SwitchBar mSwitchBar;
62
63    @Override
64    public void onCreate(Bundle savedInstanceState) {
65        super.onCreate(savedInstanceState);
66
67        final Context context = getContext();
68        mController = new NightDisplayController(context);
69
70        mTimeFormatter = android.text.format.DateFormat.getTimeFormat(context);
71        mTimeFormatter.setTimeZone(TimeZone.getTimeZone("UTC"));
72    }
73
74    @Override
75    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
76        super.onCreatePreferences(savedInstanceState, rootKey);
77
78        // Load the preferences from xml.
79        addPreferencesFromResource(R.xml.night_display_settings);
80
81        mAutoModePreference = (DropDownPreference) findPreference(KEY_NIGHT_DISPLAY_AUTO_MODE);
82        mStartTimePreference = findPreference(KEY_NIGHT_DISPLAY_START_TIME);
83        mEndTimePreference = findPreference(KEY_NIGHT_DISPLAY_END_TIME);
84
85        mAutoModePreference.setEntries(new CharSequence[] {
86                getString(R.string.night_display_auto_mode_never),
87                getString(R.string.night_display_auto_mode_custom),
88                getString(R.string.night_display_auto_mode_twilight)
89        });
90        mAutoModePreference.setEntryValues(new CharSequence[] {
91                String.valueOf(NightDisplayController.AUTO_MODE_DISABLED),
92                String.valueOf(NightDisplayController.AUTO_MODE_CUSTOM),
93                String.valueOf(NightDisplayController.AUTO_MODE_TWILIGHT)
94        });
95        mAutoModePreference.setOnPreferenceChangeListener(this);
96    }
97
98    @Override
99    public void onActivityCreated(Bundle savedInstanceState) {
100        super.onActivityCreated(savedInstanceState);
101
102        mSwitchBar = ((SettingsActivity) getActivity()).getSwitchBar();
103        mSwitchBar.addOnSwitchChangeListener(this);
104        mSwitchBar.show();
105    }
106
107    @Override
108    public void onStart() {
109        super.onStart();
110
111        // Listen for changes only while visible.
112        mController.setListener(this);
113
114        // Update the current state since it have changed while not visible.
115        onActivated(mController.isActivated());
116        onAutoModeChanged(mController.getAutoMode());
117        onCustomStartTimeChanged(mController.getCustomStartTime());
118        onCustomEndTimeChanged(mController.getCustomEndTime());
119    }
120
121    @Override
122    public void onStop() {
123        super.onStop();
124
125        // Stop listening for state changes.
126        mController.setListener(null);
127    }
128
129    @Override
130    public boolean onPreferenceTreeClick(Preference preference) {
131        if (preference == mStartTimePreference) {
132            showDialog(DIALOG_START_TIME);
133            return true;
134        } else if (preference == mEndTimePreference) {
135            showDialog(DIALOG_END_TIME);
136            return true;
137        }
138        return super.onPreferenceTreeClick(preference);
139    }
140
141    @Override
142    public Dialog onCreateDialog(final int dialogId) {
143        if (dialogId == DIALOG_START_TIME || dialogId == DIALOG_END_TIME) {
144            final NightDisplayController.LocalTime initialTime;
145            if (dialogId == DIALOG_START_TIME) {
146                initialTime = mController.getCustomStartTime();
147            } else {
148                initialTime = mController.getCustomEndTime();
149            }
150
151            final Context context = getContext();
152            final boolean use24HourFormat = android.text.format.DateFormat.is24HourFormat(context);
153            return new TimePickerDialog(context, new TimePickerDialog.OnTimeSetListener() {
154                @Override
155                public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
156                    final NightDisplayController.LocalTime time =
157                            new NightDisplayController.LocalTime(hourOfDay, minute);
158                    if (dialogId == DIALOG_START_TIME) {
159                        mController.setCustomStartTime(time);
160                    } else {
161                        mController.setCustomEndTime(time);
162                    }
163                }
164            }, initialTime.hourOfDay, initialTime.minute, use24HourFormat);
165        }
166        return super.onCreateDialog(dialogId);
167    }
168
169    @Override
170    public void onActivated(boolean activated) {
171        mSwitchBar.setChecked(activated);
172    }
173
174    @Override
175    public void onAutoModeChanged(int autoMode) {
176        mAutoModePreference.setValue(String.valueOf(autoMode));
177
178        final boolean showCustomSchedule = autoMode == NightDisplayController.AUTO_MODE_CUSTOM;
179        mStartTimePreference.setVisible(showCustomSchedule);
180        mEndTimePreference.setVisible(showCustomSchedule);
181    }
182
183    private String getFormattedTimeString(NightDisplayController.LocalTime localTime) {
184        final Calendar c = Calendar.getInstance();
185        c.setTimeZone(mTimeFormatter.getTimeZone());
186        c.set(Calendar.HOUR_OF_DAY, localTime.hourOfDay);
187        c.set(Calendar.MINUTE, localTime.minute);
188        c.set(Calendar.SECOND, 0);
189        c.set(Calendar.MILLISECOND, 0);
190        return mTimeFormatter.format(c.getTime());
191    }
192
193    @Override
194    public void onCustomStartTimeChanged(NightDisplayController.LocalTime startTime) {
195        mStartTimePreference.setSummary(getFormattedTimeString(startTime));
196    }
197
198    @Override
199    public void onCustomEndTimeChanged(NightDisplayController.LocalTime endTime) {
200        mEndTimePreference.setSummary(getFormattedTimeString(endTime));
201    }
202
203    @Override
204    public void onSwitchChanged(Switch switchView, boolean isChecked) {
205        // Attempt to update the NIGHT_DISPLAY_ACTIVATED setting if necessary.
206        final boolean isActivated = mController.isActivated();
207        if (isActivated != isChecked) {
208            if (mController.setActivated(isChecked)) {
209                switchView.setChecked(isActivated);
210            }
211        }
212    }
213
214    @Override
215    public boolean onPreferenceChange(Preference preference, Object newValue) {
216        if (preference == mAutoModePreference) {
217            return mController.setAutoMode(Integer.parseInt((String) newValue));
218        }
219        return false;
220    }
221
222    @Override
223    protected int getMetricsCategory() {
224        return MetricsEvent.NIGHT_DISPLAY_SETTINGS;
225    }
226}
227