DateTimeSettings.java revision 39b467482d1bf256a111c757e9b7621c6f523271
1afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/*
2afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
3afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project *
4afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * you may not use this file except in compliance with the License.
6afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * You may obtain a copy of the License at
7afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project *
8afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project *
10afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * See the License for the specific language governing permissions and
14afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * limitations under the License.
15afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */
16afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
17afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectpackage com.android.settings;
18afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
1929e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawaimport android.app.Activity;
205f050104386b96d8c99eb3ff0f5088814709348bAmith Yamasaniimport android.app.AlarmManager;
21afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.app.DatePickerDialog;
22d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasaniimport android.app.Dialog;
23afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.app.TimePickerDialog;
24550015e47656dad997973c89a30cffe56db9cdbdTony Mantlerimport android.app.admin.DevicePolicyManager;
25afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.BroadcastReceiver;
26afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Context;
27afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Intent;
28afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.IntentFilter;
29afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.SharedPreferences;
30afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.SharedPreferences.OnSharedPreferenceChangeListener;
31afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle;
32afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.provider.Settings;
33afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.provider.Settings.SettingNotFoundException;
3439b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.support.v14.preference.SwitchPreference;
3539b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.support.v7.preference.Preference;
36afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.text.format.DateFormat;
37afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.DatePicker;
38afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.TimePicker;
39550015e47656dad997973c89a30cffe56db9cdbdTony Mantler
408a963babe2e36b7a41f77b8d2598c97658196e58Chris Wrenimport com.android.internal.logging.MetricsLogger;
41550015e47656dad997973c89a30cffe56db9cdbdTony Mantlerimport com.android.settingslib.datetime.ZoneGetter;
428a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren
43afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.Calendar;
44afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.Date;
45afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
460f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawapublic class DateTimeSettings extends SettingsPreferenceFragment
47afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        implements OnSharedPreferenceChangeListener,
4871cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa                TimePickerDialog.OnTimeSetListener, DatePickerDialog.OnDateSetListener {
49afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
50afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final String HOURS_12 = "12";
51afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final String HOURS_24 = "24";
521bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
5371cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa    // Used for showing the current date format, which looks like "12/31/2010", "2010/12/13", etc.
5471cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa    // The date value is dummy (independent of actual date).
55afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Calendar mDummyDate;
5671cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa
57afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final String KEY_AUTO_TIME = "auto_time";
581bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani    private static final String KEY_AUTO_TIME_ZONE = "auto_zone";
59afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
60afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int DIALOG_DATEPICKER = 0;
61afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int DIALOG_TIMEPICKER = 1;
621bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
637f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng    // have we been launched from the setup wizard?
647f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng    protected static final String EXTRA_IS_FIRST_RUN = "firstRun";
657f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng
66b98c40649eb7a5ab4b24d3ed74ff46ce7cb672deFabrice Di Meglio    private SwitchPreference mAutoTimePref;
67afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Preference mTimePref;
68afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Preference mTime24Pref;
69b98c40649eb7a5ab4b24d3ed74ff46ce7cb672deFabrice Di Meglio    private SwitchPreference mAutoTimeZonePref;
70afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Preference mTimeZone;
71afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Preference mDatePref;
721bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
73afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
748a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren    protected int getMetricsCategory() {
758a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren        return MetricsLogger.DATE_TIME;
768a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren    }
778a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren
788a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren    @Override
79d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani    public void onCreate(Bundle icicle) {
80afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onCreate(icicle);
811bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
82afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        addPreferencesFromResource(R.xml.date_time_prefs);
831bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
841bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani        initUI();
85afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
861bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
87afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void initUI() {
88f1c085899dd3d9142392b9ab7841c0e9502526a3Christopher Tate        boolean autoTimeEnabled = getAutoState(Settings.Global.AUTO_TIME);
89f1c085899dd3d9142392b9ab7841c0e9502526a3Christopher Tate        boolean autoTimeZoneEnabled = getAutoState(Settings.Global.AUTO_TIME_ZONE);
90afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
91b98c40649eb7a5ab4b24d3ed74ff46ce7cb672deFabrice Di Meglio        mAutoTimePref = (SwitchPreference) findPreference(KEY_AUTO_TIME);
92fe4eff6a6584d760584c4e438f15bcf774c6fbf0Sander Alewijnse
93fe4eff6a6584d760584c4e438f15bcf774c6fbf0Sander Alewijnse        DevicePolicyManager dpm = (DevicePolicyManager) getSystemService(Context
94fe4eff6a6584d760584c4e438f15bcf774c6fbf0Sander Alewijnse                .DEVICE_POLICY_SERVICE);
95fe4eff6a6584d760584c4e438f15bcf774c6fbf0Sander Alewijnse        if (dpm.getAutoTimeRequired()) {
96fe4eff6a6584d760584c4e438f15bcf774c6fbf0Sander Alewijnse            mAutoTimePref.setEnabled(false);
97fe4eff6a6584d760584c4e438f15bcf774c6fbf0Sander Alewijnse
98fe4eff6a6584d760584c4e438f15bcf774c6fbf0Sander Alewijnse            // If Settings.Global.AUTO_TIME is false it will be set to true
99fe4eff6a6584d760584c4e438f15bcf774c6fbf0Sander Alewijnse            // by the device policy manager very soon.
100fe4eff6a6584d760584c4e438f15bcf774c6fbf0Sander Alewijnse            // Note that this app listens to that change.
101fe4eff6a6584d760584c4e438f15bcf774c6fbf0Sander Alewijnse        }
102fe4eff6a6584d760584c4e438f15bcf774c6fbf0Sander Alewijnse
1037f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng        Intent intent = getActivity().getIntent();
1047f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng        boolean isFirstRun = intent.getBooleanExtra(EXTRA_IS_FIRST_RUN, false);
1057f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng
106afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mDummyDate = Calendar.getInstance();
1071bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
1081bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani        mAutoTimePref.setChecked(autoTimeEnabled);
109b98c40649eb7a5ab4b24d3ed74ff46ce7cb672deFabrice Di Meglio        mAutoTimeZonePref = (SwitchPreference) findPreference(KEY_AUTO_TIME_ZONE);
1107f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng        // Override auto-timezone if it's a wifi-only device or if we're still in setup wizard.
1117f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng        // TODO: Remove the wifiOnly test when auto-timezone is implemented based on wifi-location.
1128af88fb8387259e51615709b2d1ea0260f7057fdRobert Greenwalt        if (Utils.isWifiOnly(getActivity()) || isFirstRun) {
113c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani            getPreferenceScreen().removePreference(mAutoTimeZonePref);
114c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani            autoTimeZoneEnabled = false;
115c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani        }
116ea07165ef26b57dde4b45eee24200cdfaa5945e7Amith Yamasani        mAutoTimeZonePref.setChecked(autoTimeZoneEnabled);
117ea07165ef26b57dde4b45eee24200cdfaa5945e7Amith Yamasani
118afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mTimePref = findPreference("time");
119afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mTime24Pref = findPreference("24 hour");
120afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mTimeZone = findPreference("timezone");
121afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mDatePref = findPreference("date");
1227f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng        if (isFirstRun) {
1237f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng            getPreferenceScreen().removePreference(mTime24Pref);
1247f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng        }
1251bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
1261bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani        mTimePref.setEnabled(!autoTimeEnabled);
1271bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani        mDatePref.setEnabled(!autoTimeEnabled);
1281bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani        mTimeZone.setEnabled(!autoTimeZoneEnabled);
129afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
130afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
131afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
132d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani    public void onResume() {
133afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onResume();
1341bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
1351bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani        getPreferenceScreen().getSharedPreferences()
1361bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani                .registerOnSharedPreferenceChangeListener(this);
137afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
138b98c40649eb7a5ab4b24d3ed74ff46ce7cb672deFabrice Di Meglio        ((SwitchPreference)mTime24Pref).setChecked(is24Hour());
139afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
140afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // Register for time ticks and other reasons for time change
141afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        IntentFilter filter = new IntentFilter();
142afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        filter.addAction(Intent.ACTION_TIME_TICK);
143afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        filter.addAction(Intent.ACTION_TIME_CHANGED);
144afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        filter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
145d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani        getActivity().registerReceiver(mIntentReceiver, filter, null, null);
14629e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa
14729e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa        updateTimeAndDateDisplay(getActivity());
148afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
149afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
1501bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani    @Override
151d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani    public void onPause() {
152afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onPause();
153d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani        getActivity().unregisterReceiver(mIntentReceiver);
1541bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani        getPreferenceScreen().getSharedPreferences()
1551bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani                .unregisterOnSharedPreferenceChangeListener(this);
156afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
1571bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
1587f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng    public void updateTimeAndDateDisplay(Context context) {
15971cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        final Calendar now = Calendar.getInstance();
160151b0e117443d874c475d25f7144bba1e1b438efKenny Root        mDummyDate.setTimeZone(now.getTimeZone());
16182723df002a27a79545dd18a52333973b056b720Elliott Hughes        // We use December 31st because it's unambiguous when demonstrating the date format.
16282723df002a27a79545dd18a52333973b056b720Elliott Hughes        // We use 13:00 so we can demonstrate the 12/24 hour options.
163151b0e117443d874c475d25f7144bba1e1b438efKenny Root        mDummyDate.set(now.get(Calendar.YEAR), 11, 31, 13, 0, 0);
164afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        Date dummyDate = mDummyDate.getTime();
16530cc30864b2b41d73e187ba9a0f75ea1fa64b538Elliott Hughes        mDatePref.setSummary(DateFormat.getLongDateFormat(context).format(now.getTime()));
16671cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        mTimePref.setSummary(DateFormat.getTimeFormat(getActivity()).format(now.getTime()));
167b9864427471ac206d08836a12a8b2f230c883d9eNeil Fuller        mTimeZone.setSummary(ZoneGetter.getTimeZoneOffsetAndName(now.getTimeZone(), now.getTime()));
16882723df002a27a79545dd18a52333973b056b720Elliott Hughes        mTime24Pref.setSummary(DateFormat.getTimeFormat(getActivity()).format(dummyDate));
169afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
170afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
1710f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa    @Override
172afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public void onDateSet(DatePicker view, int year, int month, int day) {
17329e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa        final Activity activity = getActivity();
17429e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa        if (activity != null) {
1755f050104386b96d8c99eb3ff0f5088814709348bAmith Yamasani            setDate(activity, year, month, day);
17629e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa            updateTimeAndDateDisplay(activity);
17729e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa        }
178afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
179afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
1800f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa    @Override
181afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
18229e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa        final Activity activity = getActivity();
18329e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa        if (activity != null) {
1845f050104386b96d8c99eb3ff0f5088814709348bAmith Yamasani            setTime(activity, hourOfDay, minute);
18529e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa            updateTimeAndDateDisplay(activity);
18629e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa        }
18771cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa
18872ed6feab24308a0acd1fa2135afa3476759cf39The Android Open Source Project        // We don't need to call timeUpdated() here because the TIME_CHANGED
18972ed6feab24308a0acd1fa2135afa3476759cf39The Android Open Source Project        // broadcast is sent by the AlarmManager as a side effect of setting the
19072ed6feab24308a0acd1fa2135afa3476759cf39The Android Open Source Project        // SystemClock time.
191afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
192afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
1930f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa    @Override
194afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public void onSharedPreferenceChanged(SharedPreferences preferences, String key) {
19530cc30864b2b41d73e187ba9a0f75ea1fa64b538Elliott Hughes        if (key.equals(KEY_AUTO_TIME)) {
196afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            boolean autoEnabled = preferences.getBoolean(key, true);
197f1c085899dd3d9142392b9ab7841c0e9502526a3Christopher Tate            Settings.Global.putInt(getContentResolver(), Settings.Global.AUTO_TIME,
198afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    autoEnabled ? 1 : 0);
199afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mTimePref.setEnabled(!autoEnabled);
200afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mDatePref.setEnabled(!autoEnabled);
2011bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani        } else if (key.equals(KEY_AUTO_TIME_ZONE)) {
2021bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani            boolean autoZoneEnabled = preferences.getBoolean(key, true);
203f1c085899dd3d9142392b9ab7841c0e9502526a3Christopher Tate            Settings.Global.putInt(
204f1c085899dd3d9142392b9ab7841c0e9502526a3Christopher Tate                    getContentResolver(), Settings.Global.AUTO_TIME_ZONE, autoZoneEnabled ? 1 : 0);
2051bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani            mTimeZone.setEnabled(!autoZoneEnabled);
206afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
207afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
208afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
209afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
210afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public Dialog onCreateDialog(int id) {
211b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes        final Calendar calendar = Calendar.getInstance();
212afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        switch (id) {
213b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes        case DIALOG_DATEPICKER:
214b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes            DatePickerDialog d = new DatePickerDialog(
215b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes                    getActivity(),
216b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes                    this,
217b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes                    calendar.get(Calendar.YEAR),
218b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes                    calendar.get(Calendar.MONTH),
219b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes                    calendar.get(Calendar.DAY_OF_MONTH));
220b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes            configureDatePicker(d.getDatePicker());
221b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes            return d;
222b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes        case DIALOG_TIMEPICKER:
223b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes            return new TimePickerDialog(
224d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani                    getActivity(),
225afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    this,
226afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    calendar.get(Calendar.HOUR_OF_DAY),
227afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    calendar.get(Calendar.MINUTE),
228d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani                    DateFormat.is24HourFormat(getActivity()));
229afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        default:
230b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes            throw new IllegalArgumentException();
231afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
232b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes    }
233afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
234b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes    static void configureDatePicker(DatePicker datePicker) {
235b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes        // The system clock can't represent dates outside this range.
236b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes        Calendar t = Calendar.getInstance();
237b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes        t.clear();
238b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes        t.set(1970, Calendar.JANUARY, 1);
239b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes        datePicker.setMinDate(t.getTimeInMillis());
240b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes        t.clear();
241b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes        t.set(2037, Calendar.DECEMBER, 31);
242b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes        datePicker.setMaxDate(t.getTimeInMillis());
243afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
244afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
245d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani    /*
246afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
247afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public void onPrepareDialog(int id, Dialog d) {
248afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        switch (id) {
249afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        case DIALOG_DATEPICKER: {
250afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            DatePickerDialog datePicker = (DatePickerDialog)d;
251afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            final Calendar calendar = Calendar.getInstance();
252afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            datePicker.updateDate(
253afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    calendar.get(Calendar.YEAR),
254afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    calendar.get(Calendar.MONTH),
255afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    calendar.get(Calendar.DAY_OF_MONTH));
256afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            break;
257afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
258afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        case DIALOG_TIMEPICKER: {
259afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            TimePickerDialog timePicker = (TimePickerDialog)d;
260afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            final Calendar calendar = Calendar.getInstance();
261afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            timePicker.updateTime(
262afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    calendar.get(Calendar.HOUR_OF_DAY),
263afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    calendar.get(Calendar.MINUTE));
264afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            break;
265afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
266afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        default:
267afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            break;
268afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
269afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
270d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani    */
271afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
27239b467482d1bf256a111c757e9b7621c6f523271Jason Monk    public boolean onPreferenceTreeClick(Preference preference) {
273afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (preference == mDatePref) {
274afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            showDialog(DIALOG_DATEPICKER);
275afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (preference == mTimePref) {
276afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            // The 24-hour mode may have changed, so recreate the dialog
277afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            removeDialog(DIALOG_TIMEPICKER);
278afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            showDialog(DIALOG_TIMEPICKER);
279afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (preference == mTime24Pref) {
280b98c40649eb7a5ab4b24d3ed74ff46ce7cb672deFabrice Di Meglio            final boolean is24Hour = ((SwitchPreference)mTime24Pref).isChecked();
2810a2bc1cc760143e91a7a7cc3f5182e50c0009fcdNarayan Kamath            set24Hour(is24Hour);
28229e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa            updateTimeAndDateDisplay(getActivity());
2830a2bc1cc760143e91a7a7cc3f5182e50c0009fcdNarayan Kamath            timeUpdated(is24Hour);
284afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
28539b467482d1bf256a111c757e9b7621c6f523271Jason Monk        return super.onPreferenceTreeClick(preference);
286afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
2871bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
288afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
289d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani    public void onActivityResult(int requestCode, int resultCode,
290afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            Intent data) {
29129e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa        updateTimeAndDateDisplay(getActivity());
292afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
2931bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
2940a2bc1cc760143e91a7a7cc3f5182e50c0009fcdNarayan Kamath    private void timeUpdated(boolean is24Hour) {
295afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        Intent timeChanged = new Intent(Intent.ACTION_TIME_CHANGED);
2960a2bc1cc760143e91a7a7cc3f5182e50c0009fcdNarayan Kamath        timeChanged.putExtra(Intent.EXTRA_TIME_PREF_24_HOUR_FORMAT, is24Hour);
297d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani        getActivity().sendBroadcast(timeChanged);
298afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
2991bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
300afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /*  Get & Set values from the system settings  */
3011bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
302afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private boolean is24Hour() {
303d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani        return DateFormat.is24HourFormat(getActivity());
304afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
3051bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
306afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void set24Hour(boolean is24Hour) {
307afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        Settings.System.putString(getContentResolver(),
308afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                Settings.System.TIME_12_24,
309afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                is24Hour? HOURS_24 : HOURS_12);
310afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
3111bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
3121bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani    private boolean getAutoState(String name) {
313afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        try {
314f1c085899dd3d9142392b9ab7841c0e9502526a3Christopher Tate            return Settings.Global.getInt(getContentResolver(), name) > 0;
315afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } catch (SettingNotFoundException snfe) {
316ea07165ef26b57dde4b45eee24200cdfaa5945e7Amith Yamasani            return false;
317afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
318afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
319afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
3205f050104386b96d8c99eb3ff0f5088814709348bAmith Yamasani    /* package */ static void setDate(Context context, int year, int month, int day) {
32171cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        Calendar c = Calendar.getInstance();
32271cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa
32371cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        c.set(Calendar.YEAR, year);
32471cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        c.set(Calendar.MONTH, month);
32571cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        c.set(Calendar.DAY_OF_MONTH, day);
32671cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        long when = c.getTimeInMillis();
32771cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa
32871cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        if (when / 1000 < Integer.MAX_VALUE) {
3295f050104386b96d8c99eb3ff0f5088814709348bAmith Yamasani            ((AlarmManager) context.getSystemService(Context.ALARM_SERVICE)).setTime(when);
330188ca778702938d87313592175a3c2ff86bd3218Eric Fischer        }
33171cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa    }
33271cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa
3335f050104386b96d8c99eb3ff0f5088814709348bAmith Yamasani    /* package */ static void setTime(Context context, int hourOfDay, int minute) {
33471cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        Calendar c = Calendar.getInstance();
335188ca778702938d87313592175a3c2ff86bd3218Eric Fischer
33671cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        c.set(Calendar.HOUR_OF_DAY, hourOfDay);
33771cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        c.set(Calendar.MINUTE, minute);
33833ff11599553254683bbf4a5c75d5dee4251fd74Gilles Debunne        c.set(Calendar.SECOND, 0);
33933ff11599553254683bbf4a5c75d5dee4251fd74Gilles Debunne        c.set(Calendar.MILLISECOND, 0);
34071cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        long when = c.getTimeInMillis();
34171cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa
34271cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        if (when / 1000 < Integer.MAX_VALUE) {
3435f050104386b96d8c99eb3ff0f5088814709348bAmith Yamasani            ((AlarmManager) context.getSystemService(Context.ALARM_SERVICE)).setTime(when);
34471cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        }
345afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
34671cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa
347afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
348afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        @Override
349afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public void onReceive(Context context, Intent intent) {
35029e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa            final Activity activity = getActivity();
35129e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa            if (activity != null) {
35229e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa                updateTimeAndDateDisplay(activity);
35329e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa            }
354afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
355afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    };
356afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project}
357