DateTimeSettings.java revision 9c32468cd59cbe5b8e7692235a67034c936b4788
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;
419d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monkimport com.android.settings.dashboard.SummaryLoader;
429c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shankaimport com.android.settingslib.RestrictedLockUtils;
439c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shankaimport com.android.settingslib.RestrictedSwitchPreference;
44550015e47656dad997973c89a30cffe56db9cdbdTony Mantlerimport com.android.settingslib.datetime.ZoneGetter;
458a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren
46afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.Calendar;
47afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.Date;
48afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
499c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shankaimport static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
509c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka
510f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawapublic class DateTimeSettings extends SettingsPreferenceFragment
52afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        implements OnSharedPreferenceChangeListener,
5371cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa                TimePickerDialog.OnTimeSetListener, DatePickerDialog.OnDateSetListener {
54afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
55afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final String HOURS_12 = "12";
56afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final String HOURS_24 = "24";
571bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
5871cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa    // Used for showing the current date format, which looks like "12/31/2010", "2010/12/13", etc.
5971cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa    // The date value is dummy (independent of actual date).
60afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Calendar mDummyDate;
6171cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa
62afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final String KEY_AUTO_TIME = "auto_time";
631bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani    private static final String KEY_AUTO_TIME_ZONE = "auto_zone";
64afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
65afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int DIALOG_DATEPICKER = 0;
66afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int DIALOG_TIMEPICKER = 1;
671bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
687f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng    // have we been launched from the setup wizard?
697f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng    protected static final String EXTRA_IS_FIRST_RUN = "firstRun";
707f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng
719c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka    private RestrictedSwitchPreference mAutoTimePref;
72afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Preference mTimePref;
73afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Preference mTime24Pref;
74b98c40649eb7a5ab4b24d3ed74ff46ce7cb672deFabrice Di Meglio    private SwitchPreference mAutoTimeZonePref;
75afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Preference mTimeZone;
76afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Preference mDatePref;
771bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
78afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
798a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren    protected int getMetricsCategory() {
808a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren        return MetricsLogger.DATE_TIME;
818a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren    }
828a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren
838a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren    @Override
84d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani    public void onCreate(Bundle icicle) {
85afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onCreate(icicle);
861bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
87afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        addPreferencesFromResource(R.xml.date_time_prefs);
881bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
891bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani        initUI();
90afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
911bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
92afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void initUI() {
93f1c085899dd3d9142392b9ab7841c0e9502526a3Christopher Tate        boolean autoTimeEnabled = getAutoState(Settings.Global.AUTO_TIME);
94f1c085899dd3d9142392b9ab7841c0e9502526a3Christopher Tate        boolean autoTimeZoneEnabled = getAutoState(Settings.Global.AUTO_TIME_ZONE);
95afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
969c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka        mAutoTimePref = (RestrictedSwitchPreference) findPreference(KEY_AUTO_TIME);
979c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka        EnforcedAdmin admin = RestrictedLockUtils.checkIfAutoTimeRequired(getActivity());
989c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka        mAutoTimePref.setDisabledByAdmin(admin);
99fe4eff6a6584d760584c4e438f15bcf774c6fbf0Sander Alewijnse
1007f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng        Intent intent = getActivity().getIntent();
1017f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng        boolean isFirstRun = intent.getBooleanExtra(EXTRA_IS_FIRST_RUN, false);
1027f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng
103afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mDummyDate = Calendar.getInstance();
1041bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
1059c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka        // If device admin requires auto time device policy manager will set
1069c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka        // Settings.Global.AUTO_TIME to true. Note that this app listens to that change.
1071bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani        mAutoTimePref.setChecked(autoTimeEnabled);
108b98c40649eb7a5ab4b24d3ed74ff46ce7cb672deFabrice Di Meglio        mAutoTimeZonePref = (SwitchPreference) findPreference(KEY_AUTO_TIME_ZONE);
1097f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng        // Override auto-timezone if it's a wifi-only device or if we're still in setup wizard.
1107f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng        // TODO: Remove the wifiOnly test when auto-timezone is implemented based on wifi-location.
1118af88fb8387259e51615709b2d1ea0260f7057fdRobert Greenwalt        if (Utils.isWifiOnly(getActivity()) || isFirstRun) {
112c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani            getPreferenceScreen().removePreference(mAutoTimeZonePref);
113c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani            autoTimeZoneEnabled = false;
114c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani        }
115ea07165ef26b57dde4b45eee24200cdfaa5945e7Amith Yamasani        mAutoTimeZonePref.setChecked(autoTimeZoneEnabled);
116ea07165ef26b57dde4b45eee24200cdfaa5945e7Amith Yamasani
117afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mTimePref = findPreference("time");
118afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mTime24Pref = findPreference("24 hour");
119afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mTimeZone = findPreference("timezone");
120afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mDatePref = findPreference("date");
1217f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng        if (isFirstRun) {
1227f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng            getPreferenceScreen().removePreference(mTime24Pref);
1237f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng        }
1241bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
1251bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani        mTimePref.setEnabled(!autoTimeEnabled);
1261bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani        mDatePref.setEnabled(!autoTimeEnabled);
1271bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani        mTimeZone.setEnabled(!autoTimeZoneEnabled);
128afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
129afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
130afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
131d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani    public void onResume() {
132afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onResume();
1331bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
1341bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani        getPreferenceScreen().getSharedPreferences()
1351bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani                .registerOnSharedPreferenceChangeListener(this);
136afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
137b98c40649eb7a5ab4b24d3ed74ff46ce7cb672deFabrice Di Meglio        ((SwitchPreference)mTime24Pref).setChecked(is24Hour());
138afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
139afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // Register for time ticks and other reasons for time change
140afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        IntentFilter filter = new IntentFilter();
141afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        filter.addAction(Intent.ACTION_TIME_TICK);
142afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        filter.addAction(Intent.ACTION_TIME_CHANGED);
143afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        filter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
144d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani        getActivity().registerReceiver(mIntentReceiver, filter, null, null);
14529e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa
14629e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa        updateTimeAndDateDisplay(getActivity());
147afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
148afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
1491bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani    @Override
150d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani    public void onPause() {
151afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onPause();
152d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani        getActivity().unregisterReceiver(mIntentReceiver);
1531bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani        getPreferenceScreen().getSharedPreferences()
1541bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani                .unregisterOnSharedPreferenceChangeListener(this);
155afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
1561bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
1577f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng    public void updateTimeAndDateDisplay(Context context) {
15871cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        final Calendar now = Calendar.getInstance();
159151b0e117443d874c475d25f7144bba1e1b438efKenny Root        mDummyDate.setTimeZone(now.getTimeZone());
16082723df002a27a79545dd18a52333973b056b720Elliott Hughes        // We use December 31st because it's unambiguous when demonstrating the date format.
16182723df002a27a79545dd18a52333973b056b720Elliott Hughes        // We use 13:00 so we can demonstrate the 12/24 hour options.
162151b0e117443d874c475d25f7144bba1e1b438efKenny Root        mDummyDate.set(now.get(Calendar.YEAR), 11, 31, 13, 0, 0);
163afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        Date dummyDate = mDummyDate.getTime();
16430cc30864b2b41d73e187ba9a0f75ea1fa64b538Elliott Hughes        mDatePref.setSummary(DateFormat.getLongDateFormat(context).format(now.getTime()));
16571cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        mTimePref.setSummary(DateFormat.getTimeFormat(getActivity()).format(now.getTime()));
166b9864427471ac206d08836a12a8b2f230c883d9eNeil Fuller        mTimeZone.setSummary(ZoneGetter.getTimeZoneOffsetAndName(now.getTimeZone(), now.getTime()));
16782723df002a27a79545dd18a52333973b056b720Elliott Hughes        mTime24Pref.setSummary(DateFormat.getTimeFormat(getActivity()).format(dummyDate));
168afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
169afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
1700f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa    @Override
171afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public void onDateSet(DatePicker view, int year, int month, int day) {
17229e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa        final Activity activity = getActivity();
17329e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa        if (activity != null) {
1745f050104386b96d8c99eb3ff0f5088814709348bAmith Yamasani            setDate(activity, year, month, day);
17529e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa            updateTimeAndDateDisplay(activity);
17629e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa        }
177afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
178afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
1790f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa    @Override
180afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
18129e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa        final Activity activity = getActivity();
18229e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa        if (activity != null) {
1835f050104386b96d8c99eb3ff0f5088814709348bAmith Yamasani            setTime(activity, hourOfDay, minute);
18429e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa            updateTimeAndDateDisplay(activity);
18529e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa        }
18671cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa
18772ed6feab24308a0acd1fa2135afa3476759cf39The Android Open Source Project        // We don't need to call timeUpdated() here because the TIME_CHANGED
18872ed6feab24308a0acd1fa2135afa3476759cf39The Android Open Source Project        // broadcast is sent by the AlarmManager as a side effect of setting the
18972ed6feab24308a0acd1fa2135afa3476759cf39The Android Open Source Project        // SystemClock time.
190afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
191afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
1920f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa    @Override
193afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public void onSharedPreferenceChanged(SharedPreferences preferences, String key) {
19430cc30864b2b41d73e187ba9a0f75ea1fa64b538Elliott Hughes        if (key.equals(KEY_AUTO_TIME)) {
195afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            boolean autoEnabled = preferences.getBoolean(key, true);
196f1c085899dd3d9142392b9ab7841c0e9502526a3Christopher Tate            Settings.Global.putInt(getContentResolver(), Settings.Global.AUTO_TIME,
197afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    autoEnabled ? 1 : 0);
198afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mTimePref.setEnabled(!autoEnabled);
199afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mDatePref.setEnabled(!autoEnabled);
2001bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani        } else if (key.equals(KEY_AUTO_TIME_ZONE)) {
2011bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani            boolean autoZoneEnabled = preferences.getBoolean(key, true);
202f1c085899dd3d9142392b9ab7841c0e9502526a3Christopher Tate            Settings.Global.putInt(
203f1c085899dd3d9142392b9ab7841c0e9502526a3Christopher Tate                    getContentResolver(), Settings.Global.AUTO_TIME_ZONE, autoZoneEnabled ? 1 : 0);
2041bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani            mTimeZone.setEnabled(!autoZoneEnabled);
205afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
206afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
207afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
208afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
209afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public Dialog onCreateDialog(int id) {
210b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes        final Calendar calendar = Calendar.getInstance();
211afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        switch (id) {
212b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes        case DIALOG_DATEPICKER:
213b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes            DatePickerDialog d = new DatePickerDialog(
214b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes                    getActivity(),
215b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes                    this,
216b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes                    calendar.get(Calendar.YEAR),
217b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes                    calendar.get(Calendar.MONTH),
218b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes                    calendar.get(Calendar.DAY_OF_MONTH));
219b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes            configureDatePicker(d.getDatePicker());
220b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes            return d;
221b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes        case DIALOG_TIMEPICKER:
222b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes            return new TimePickerDialog(
223d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani                    getActivity(),
224afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    this,
225afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    calendar.get(Calendar.HOUR_OF_DAY),
226afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    calendar.get(Calendar.MINUTE),
227d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani                    DateFormat.is24HourFormat(getActivity()));
228afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        default:
229b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes            throw new IllegalArgumentException();
230afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
231b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes    }
232afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
233b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes    static void configureDatePicker(DatePicker datePicker) {
234b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes        // The system clock can't represent dates outside this range.
235b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes        Calendar t = Calendar.getInstance();
236b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes        t.clear();
237b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes        t.set(1970, Calendar.JANUARY, 1);
238b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes        datePicker.setMinDate(t.getTimeInMillis());
239b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes        t.clear();
240b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes        t.set(2037, Calendar.DECEMBER, 31);
241b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes        datePicker.setMaxDate(t.getTimeInMillis());
242afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
243afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
244d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani    /*
245afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
246afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public void onPrepareDialog(int id, Dialog d) {
247afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        switch (id) {
248afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        case DIALOG_DATEPICKER: {
249afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            DatePickerDialog datePicker = (DatePickerDialog)d;
250afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            final Calendar calendar = Calendar.getInstance();
251afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            datePicker.updateDate(
252afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    calendar.get(Calendar.YEAR),
253afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    calendar.get(Calendar.MONTH),
254afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    calendar.get(Calendar.DAY_OF_MONTH));
255afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            break;
256afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
257afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        case DIALOG_TIMEPICKER: {
258afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            TimePickerDialog timePicker = (TimePickerDialog)d;
259afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            final Calendar calendar = Calendar.getInstance();
260afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            timePicker.updateTime(
261afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    calendar.get(Calendar.HOUR_OF_DAY),
262afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    calendar.get(Calendar.MINUTE));
263afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            break;
264afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
265afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        default:
266afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            break;
267afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
268afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
269d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani    */
270afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
27139b467482d1bf256a111c757e9b7621c6f523271Jason Monk    public boolean onPreferenceTreeClick(Preference preference) {
272afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (preference == mDatePref) {
273afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            showDialog(DIALOG_DATEPICKER);
274afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (preference == mTimePref) {
275afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            // The 24-hour mode may have changed, so recreate the dialog
276afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            removeDialog(DIALOG_TIMEPICKER);
277afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            showDialog(DIALOG_TIMEPICKER);
278afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (preference == mTime24Pref) {
279b98c40649eb7a5ab4b24d3ed74ff46ce7cb672deFabrice Di Meglio            final boolean is24Hour = ((SwitchPreference)mTime24Pref).isChecked();
2800a2bc1cc760143e91a7a7cc3f5182e50c0009fcdNarayan Kamath            set24Hour(is24Hour);
28129e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa            updateTimeAndDateDisplay(getActivity());
2820a2bc1cc760143e91a7a7cc3f5182e50c0009fcdNarayan Kamath            timeUpdated(is24Hour);
283afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
28439b467482d1bf256a111c757e9b7621c6f523271Jason Monk        return super.onPreferenceTreeClick(preference);
285afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
2861bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
287afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
288d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani    public void onActivityResult(int requestCode, int resultCode,
289afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            Intent data) {
29029e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa        updateTimeAndDateDisplay(getActivity());
291afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
2921bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
2930a2bc1cc760143e91a7a7cc3f5182e50c0009fcdNarayan Kamath    private void timeUpdated(boolean is24Hour) {
294afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        Intent timeChanged = new Intent(Intent.ACTION_TIME_CHANGED);
2950a2bc1cc760143e91a7a7cc3f5182e50c0009fcdNarayan Kamath        timeChanged.putExtra(Intent.EXTRA_TIME_PREF_24_HOUR_FORMAT, is24Hour);
296d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani        getActivity().sendBroadcast(timeChanged);
297afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
2981bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
299afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /*  Get & Set values from the system settings  */
3001bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
301afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private boolean is24Hour() {
302d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani        return DateFormat.is24HourFormat(getActivity());
303afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
3041bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
305afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void set24Hour(boolean is24Hour) {
306afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        Settings.System.putString(getContentResolver(),
307afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                Settings.System.TIME_12_24,
308afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                is24Hour? HOURS_24 : HOURS_12);
309afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
3101bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
3111bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani    private boolean getAutoState(String name) {
312afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        try {
313f1c085899dd3d9142392b9ab7841c0e9502526a3Christopher Tate            return Settings.Global.getInt(getContentResolver(), name) > 0;
314afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } catch (SettingNotFoundException snfe) {
315ea07165ef26b57dde4b45eee24200cdfaa5945e7Amith Yamasani            return false;
316afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
317afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
318afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
3195f050104386b96d8c99eb3ff0f5088814709348bAmith Yamasani    /* package */ static void setDate(Context context, int year, int month, int day) {
32071cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        Calendar c = Calendar.getInstance();
32171cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa
32271cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        c.set(Calendar.YEAR, year);
32371cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        c.set(Calendar.MONTH, month);
32471cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        c.set(Calendar.DAY_OF_MONTH, day);
32571cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        long when = c.getTimeInMillis();
32671cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa
32771cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        if (when / 1000 < Integer.MAX_VALUE) {
3285f050104386b96d8c99eb3ff0f5088814709348bAmith Yamasani            ((AlarmManager) context.getSystemService(Context.ALARM_SERVICE)).setTime(when);
329188ca778702938d87313592175a3c2ff86bd3218Eric Fischer        }
33071cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa    }
33171cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa
3325f050104386b96d8c99eb3ff0f5088814709348bAmith Yamasani    /* package */ static void setTime(Context context, int hourOfDay, int minute) {
33371cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        Calendar c = Calendar.getInstance();
334188ca778702938d87313592175a3c2ff86bd3218Eric Fischer
33571cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        c.set(Calendar.HOUR_OF_DAY, hourOfDay);
33671cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        c.set(Calendar.MINUTE, minute);
33733ff11599553254683bbf4a5c75d5dee4251fd74Gilles Debunne        c.set(Calendar.SECOND, 0);
33833ff11599553254683bbf4a5c75d5dee4251fd74Gilles Debunne        c.set(Calendar.MILLISECOND, 0);
33971cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        long when = c.getTimeInMillis();
34071cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa
34171cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        if (when / 1000 < Integer.MAX_VALUE) {
3425f050104386b96d8c99eb3ff0f5088814709348bAmith Yamasani            ((AlarmManager) context.getSystemService(Context.ALARM_SERVICE)).setTime(when);
34371cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        }
344afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
34571cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa
346afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
347afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        @Override
348afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public void onReceive(Context context, Intent intent) {
34929e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa            final Activity activity = getActivity();
35029e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa            if (activity != null) {
35129e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa                updateTimeAndDateDisplay(activity);
35229e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa            }
353afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
354afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    };
3559d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk
3569d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk    private static class SummaryProvider implements SummaryLoader.SummaryProvider {
3579d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk
3589d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk        private final Context mContext;
3599d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk        private final SummaryLoader mSummaryLoader;
3609d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk
3619d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk        public SummaryProvider(Context context, SummaryLoader summaryLoader) {
3629d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk            mContext = context;
3639d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk            mSummaryLoader = summaryLoader;
3649d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk        }
3659d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk
3669d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk        @Override
3679d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk        public void setListening(boolean listening) {
3689d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk            if (listening) {
3699d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk                final Calendar now = Calendar.getInstance();
3709d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk                mSummaryLoader.setSummary(this, ZoneGetter.getTimeZoneOffsetAndName(
3719d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk                        now.getTimeZone(), now.getTime()));
3729d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk            }
3739d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk        }
3749d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk    }
3759d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk
3769d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk    public static final SummaryLoader.SummaryProviderFactory SUMMARY_PROVIDER_FACTORY
3779d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk            = new SummaryLoader.SummaryProviderFactory() {
3789d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk        @Override
3799d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk        public SummaryLoader.SummaryProvider createSummaryProvider(Activity activity,
3809d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk                                                                   SummaryLoader summaryLoader) {
3819d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk            return new SummaryProvider(activity, summaryLoader);
3829d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk        }
3839d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk    };
384afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project}
385