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