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;
24afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.BroadcastReceiver;
25afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Context;
26afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Intent;
27afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.IntentFilter;
28afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.SharedPreferences;
29afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.SharedPreferences.OnSharedPreferenceChangeListener;
30afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle;
31afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.SystemClock;
32afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.CheckBoxPreference;
33afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.ListPreference;
34afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.Preference;
35afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.PreferenceScreen;
36afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.provider.Settings;
37afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.provider.Settings.SettingNotFoundException;
38afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.text.format.DateFormat;
39afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.DatePicker;
40afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.TimePicker;
41afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
42afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.Calendar;
43afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.Date;
44afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.TimeZone;
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_DATE_FORMAT = "date_format";
58afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final String KEY_AUTO_TIME = "auto_time";
591bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani    private static final String KEY_AUTO_TIME_ZONE = "auto_zone";
60afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
61afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int DIALOG_DATEPICKER = 0;
62afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int DIALOG_TIMEPICKER = 1;
631bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
647f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng    // have we been launched from the setup wizard?
657f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng    protected static final String EXTRA_IS_FIRST_RUN = "firstRun";
667f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng
671bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani    private CheckBoxPreference mAutoTimePref;
68afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Preference mTimePref;
69afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Preference mTime24Pref;
701bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani    private CheckBoxPreference mAutoTimeZonePref;
71afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Preference mTimeZone;
72afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Preference mDatePref;
73afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private ListPreference mDateFormat;
741bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
75afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
76d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani    public void onCreate(Bundle icicle) {
77afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onCreate(icicle);
781bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
79afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        addPreferencesFromResource(R.xml.date_time_prefs);
801bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
811bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani        initUI();
82afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
831bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
84afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void initUI() {
85f1c085899dd3d9142392b9ab7841c0e9502526a3Christopher Tate        boolean autoTimeEnabled = getAutoState(Settings.Global.AUTO_TIME);
86f1c085899dd3d9142392b9ab7841c0e9502526a3Christopher Tate        boolean autoTimeZoneEnabled = getAutoState(Settings.Global.AUTO_TIME_ZONE);
87afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
887f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng        Intent intent = getActivity().getIntent();
897f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng        boolean isFirstRun = intent.getBooleanExtra(EXTRA_IS_FIRST_RUN, false);
907f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng
91afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mDummyDate = Calendar.getInstance();
921bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
931bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani        mAutoTimePref = (CheckBoxPreference) findPreference(KEY_AUTO_TIME);
941bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani        mAutoTimePref.setChecked(autoTimeEnabled);
95ea07165ef26b57dde4b45eee24200cdfaa5945e7Amith Yamasani        mAutoTimeZonePref = (CheckBoxPreference) findPreference(KEY_AUTO_TIME_ZONE);
967f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng        // Override auto-timezone if it's a wifi-only device or if we're still in setup wizard.
977f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng        // TODO: Remove the wifiOnly test when auto-timezone is implemented based on wifi-location.
988af88fb8387259e51615709b2d1ea0260f7057fdRobert Greenwalt        if (Utils.isWifiOnly(getActivity()) || isFirstRun) {
99c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani            getPreferenceScreen().removePreference(mAutoTimeZonePref);
100c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani            autoTimeZoneEnabled = false;
101c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani        }
102ea07165ef26b57dde4b45eee24200cdfaa5945e7Amith Yamasani        mAutoTimeZonePref.setChecked(autoTimeZoneEnabled);
103ea07165ef26b57dde4b45eee24200cdfaa5945e7Amith Yamasani
104afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mTimePref = findPreference("time");
105afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mTime24Pref = findPreference("24 hour");
106afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mTimeZone = findPreference("timezone");
107afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mDatePref = findPreference("date");
108afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mDateFormat = (ListPreference) findPreference(KEY_DATE_FORMAT);
1097f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng        if (isFirstRun) {
1107f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng            getPreferenceScreen().removePreference(mTime24Pref);
1117f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng            getPreferenceScreen().removePreference(mDateFormat);
1127f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng        }
1131bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
114afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        String [] dateFormats = getResources().getStringArray(R.array.date_format_values);
115afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        String [] formattedDates = new String[dateFormats.length];
116afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        String currentFormat = getDateFormat();
117afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // Initialize if DATE_FORMAT is not set in the system settings
118afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // This can happen after a factory reset (or data wipe)
119afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (currentFormat == null) {
120188ca778702938d87313592175a3c2ff86bd3218Eric Fischer            currentFormat = "";
121afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
122b6676bb6a3515e1599d2342190c2d2d89d611d63Fábio Silva
123b6676bb6a3515e1599d2342190c2d2d89d611d63Fábio Silva        // Prevents duplicated values on date format selector.
124b6676bb6a3515e1599d2342190c2d2d89d611d63Fábio Silva        mDummyDate.set(mDummyDate.get(Calendar.YEAR), mDummyDate.DECEMBER, 31, 13, 0, 0);
125b6676bb6a3515e1599d2342190c2d2d89d611d63Fábio Silva
126afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        for (int i = 0; i < formattedDates.length; i++) {
127188ca778702938d87313592175a3c2ff86bd3218Eric Fischer            String formatted =
128d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani                    DateFormat.getDateFormatForSetting(getActivity(), dateFormats[i])
129d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani                    .format(mDummyDate.getTime());
130188ca778702938d87313592175a3c2ff86bd3218Eric Fischer
131188ca778702938d87313592175a3c2ff86bd3218Eric Fischer            if (dateFormats[i].length() == 0) {
132188ca778702938d87313592175a3c2ff86bd3218Eric Fischer                formattedDates[i] = getResources().
133188ca778702938d87313592175a3c2ff86bd3218Eric Fischer                    getString(R.string.normal_date_format, formatted);
134188ca778702938d87313592175a3c2ff86bd3218Eric Fischer            } else {
135188ca778702938d87313592175a3c2ff86bd3218Eric Fischer                formattedDates[i] = formatted;
136188ca778702938d87313592175a3c2ff86bd3218Eric Fischer            }
137afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
1381bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
139afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mDateFormat.setEntries(formattedDates);
140afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mDateFormat.setEntryValues(R.array.date_format_values);
141afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mDateFormat.setValue(currentFormat);
1421bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
1431bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani        mTimePref.setEnabled(!autoTimeEnabled);
1441bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani        mDatePref.setEnabled(!autoTimeEnabled);
1451bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani        mTimeZone.setEnabled(!autoTimeZoneEnabled);
146afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
147afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
148afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
149d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani    public void onResume() {
150afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onResume();
1511bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
1521bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani        getPreferenceScreen().getSharedPreferences()
1531bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani                .registerOnSharedPreferenceChangeListener(this);
154afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
155afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        ((CheckBoxPreference)mTime24Pref).setChecked(is24Hour());
156afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
157afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // Register for time ticks and other reasons for time change
158afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        IntentFilter filter = new IntentFilter();
159afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        filter.addAction(Intent.ACTION_TIME_TICK);
160afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        filter.addAction(Intent.ACTION_TIME_CHANGED);
161afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        filter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
162d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani        getActivity().registerReceiver(mIntentReceiver, filter, null, null);
16329e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa
16429e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa        updateTimeAndDateDisplay(getActivity());
165afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
166afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
1671bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani    @Override
168d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani    public void onPause() {
169afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onPause();
170d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani        getActivity().unregisterReceiver(mIntentReceiver);
1711bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani        getPreferenceScreen().getSharedPreferences()
1721bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani                .unregisterOnSharedPreferenceChangeListener(this);
173afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
1741bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
1757f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng    public void updateTimeAndDateDisplay(Context context) {
17629e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa        java.text.DateFormat shortDateFormat = DateFormat.getDateFormat(context);
17771cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        final Calendar now = Calendar.getInstance();
178151b0e117443d874c475d25f7144bba1e1b438efKenny Root        mDummyDate.setTimeZone(now.getTimeZone());
17982723df002a27a79545dd18a52333973b056b720Elliott Hughes        // We use December 31st because it's unambiguous when demonstrating the date format.
18082723df002a27a79545dd18a52333973b056b720Elliott Hughes        // We use 13:00 so we can demonstrate the 12/24 hour options.
181151b0e117443d874c475d25f7144bba1e1b438efKenny Root        mDummyDate.set(now.get(Calendar.YEAR), 11, 31, 13, 0, 0);
182afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        Date dummyDate = mDummyDate.getTime();
18371cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        mTimePref.setSummary(DateFormat.getTimeFormat(getActivity()).format(now.getTime()));
18471cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        mTimeZone.setSummary(getTimeZoneText(now.getTimeZone()));
18571cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        mDatePref.setSummary(shortDateFormat.format(now.getTime()));
186afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mDateFormat.setSummary(shortDateFormat.format(dummyDate));
18782723df002a27a79545dd18a52333973b056b720Elliott Hughes        mTime24Pref.setSummary(DateFormat.getTimeFormat(getActivity()).format(dummyDate));
188afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
189afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
1900f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa    @Override
191afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public void onDateSet(DatePicker view, int year, int month, int day) {
19229e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa        final Activity activity = getActivity();
19329e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa        if (activity != null) {
1945f050104386b96d8c99eb3ff0f5088814709348bAmith Yamasani            setDate(activity, year, month, day);
19529e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa            updateTimeAndDateDisplay(activity);
19629e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa        }
197afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
198afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
1990f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa    @Override
200afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
20129e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa        final Activity activity = getActivity();
20229e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa        if (activity != null) {
2035f050104386b96d8c99eb3ff0f5088814709348bAmith Yamasani            setTime(activity, hourOfDay, minute);
20429e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa            updateTimeAndDateDisplay(activity);
20529e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa        }
20671cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa
20772ed6feab24308a0acd1fa2135afa3476759cf39The Android Open Source Project        // We don't need to call timeUpdated() here because the TIME_CHANGED
20872ed6feab24308a0acd1fa2135afa3476759cf39The Android Open Source Project        // broadcast is sent by the AlarmManager as a side effect of setting the
20972ed6feab24308a0acd1fa2135afa3476759cf39The Android Open Source Project        // SystemClock time.
210afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
211afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
2120f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa    @Override
213afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public void onSharedPreferenceChanged(SharedPreferences preferences, String key) {
214afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (key.equals(KEY_DATE_FORMAT)) {
2151bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani            String format = preferences.getString(key,
216afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    getResources().getString(R.string.default_date_format));
2171bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani            Settings.System.putString(getContentResolver(),
218afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    Settings.System.DATE_FORMAT, format);
21929e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa            updateTimeAndDateDisplay(getActivity());
220afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (key.equals(KEY_AUTO_TIME)) {
221afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            boolean autoEnabled = preferences.getBoolean(key, true);
222f1c085899dd3d9142392b9ab7841c0e9502526a3Christopher Tate            Settings.Global.putInt(getContentResolver(), Settings.Global.AUTO_TIME,
223afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    autoEnabled ? 1 : 0);
224afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mTimePref.setEnabled(!autoEnabled);
225afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mDatePref.setEnabled(!autoEnabled);
2261bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani        } else if (key.equals(KEY_AUTO_TIME_ZONE)) {
2271bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani            boolean autoZoneEnabled = preferences.getBoolean(key, true);
228f1c085899dd3d9142392b9ab7841c0e9502526a3Christopher Tate            Settings.Global.putInt(
229f1c085899dd3d9142392b9ab7841c0e9502526a3Christopher Tate                    getContentResolver(), Settings.Global.AUTO_TIME_ZONE, autoZoneEnabled ? 1 : 0);
2301bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani            mTimeZone.setEnabled(!autoZoneEnabled);
231afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
232afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
233afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
234afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
235afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public Dialog onCreateDialog(int id) {
236afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        Dialog d;
237afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
238afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        switch (id) {
239afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        case DIALOG_DATEPICKER: {
240afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            final Calendar calendar = Calendar.getInstance();
241afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            d = new DatePickerDialog(
242d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani                getActivity(),
243afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                this,
244afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                calendar.get(Calendar.YEAR),
245afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                calendar.get(Calendar.MONTH),
246afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                calendar.get(Calendar.DAY_OF_MONTH));
2477ccfa0614caeba8eba5d3040a90541a24fa1e6c9Sungmin Choi            // The system clock can't represent dates outside this range.
2487ccfa0614caeba8eba5d3040a90541a24fa1e6c9Sungmin Choi            DatePickerDialog datePicker = (DatePickerDialog)d;
2497ccfa0614caeba8eba5d3040a90541a24fa1e6c9Sungmin Choi            Calendar t = Calendar.getInstance();
2507ccfa0614caeba8eba5d3040a90541a24fa1e6c9Sungmin Choi            t.clear();
2517ccfa0614caeba8eba5d3040a90541a24fa1e6c9Sungmin Choi            t.set(1970, Calendar.JANUARY, 1);
2527ccfa0614caeba8eba5d3040a90541a24fa1e6c9Sungmin Choi            datePicker.getDatePicker().setMinDate(t.getTimeInMillis());
2537ccfa0614caeba8eba5d3040a90541a24fa1e6c9Sungmin Choi            t.clear();
2547ccfa0614caeba8eba5d3040a90541a24fa1e6c9Sungmin Choi            t.set(2037, Calendar.DECEMBER, 31);
2557ccfa0614caeba8eba5d3040a90541a24fa1e6c9Sungmin Choi            datePicker.getDatePicker().setMaxDate(t.getTimeInMillis());
256afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            break;
257afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
258afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        case DIALOG_TIMEPICKER: {
259afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            final Calendar calendar = Calendar.getInstance();
260afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            d = new TimePickerDialog(
261d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani                    getActivity(),
262afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    this,
263afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    calendar.get(Calendar.HOUR_OF_DAY),
264afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    calendar.get(Calendar.MINUTE),
265d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani                    DateFormat.is24HourFormat(getActivity()));
266afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            break;
267afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
268afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        default:
269afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            d = null;
270afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            break;
271afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
272afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
273afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        return d;
274afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
275afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
276d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani    /*
277afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
278afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public void onPrepareDialog(int id, Dialog d) {
279afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        switch (id) {
280afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        case DIALOG_DATEPICKER: {
281afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            DatePickerDialog datePicker = (DatePickerDialog)d;
282afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            final Calendar calendar = Calendar.getInstance();
283afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            datePicker.updateDate(
284afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    calendar.get(Calendar.YEAR),
285afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    calendar.get(Calendar.MONTH),
286afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    calendar.get(Calendar.DAY_OF_MONTH));
287afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            break;
288afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
289afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        case DIALOG_TIMEPICKER: {
290afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            TimePickerDialog timePicker = (TimePickerDialog)d;
291afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            final Calendar calendar = Calendar.getInstance();
292afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            timePicker.updateTime(
293afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    calendar.get(Calendar.HOUR_OF_DAY),
294afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    calendar.get(Calendar.MINUTE));
295afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            break;
296afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
297afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        default:
298afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            break;
299afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
300afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
301d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani    */
302afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
303afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
304afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (preference == mDatePref) {
305afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            showDialog(DIALOG_DATEPICKER);
306afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (preference == mTimePref) {
307afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            // The 24-hour mode may have changed, so recreate the dialog
308afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            removeDialog(DIALOG_TIMEPICKER);
309afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            showDialog(DIALOG_TIMEPICKER);
310afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (preference == mTime24Pref) {
311afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            set24Hour(((CheckBoxPreference)mTime24Pref).isChecked());
31229e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa            updateTimeAndDateDisplay(getActivity());
313afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            timeUpdated();
314afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
3150f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa        return super.onPreferenceTreeClick(preferenceScreen, preference);
316afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
3171bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
318afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
319d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani    public void onActivityResult(int requestCode, int resultCode,
320afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            Intent data) {
32129e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa        updateTimeAndDateDisplay(getActivity());
322afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
3231bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
324afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void timeUpdated() {
325afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        Intent timeChanged = new Intent(Intent.ACTION_TIME_CHANGED);
326d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani        getActivity().sendBroadcast(timeChanged);
327afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
3281bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
329afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /*  Get & Set values from the system settings  */
3301bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
331afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private boolean is24Hour() {
332d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani        return DateFormat.is24HourFormat(getActivity());
333afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
3341bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
335afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void set24Hour(boolean is24Hour) {
336afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        Settings.System.putString(getContentResolver(),
337afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                Settings.System.TIME_12_24,
338afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                is24Hour? HOURS_24 : HOURS_12);
339afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
3401bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
341afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private String getDateFormat() {
3421bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani        return Settings.System.getString(getContentResolver(),
343afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                Settings.System.DATE_FORMAT);
344afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
3451bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
3461bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani    private boolean getAutoState(String name) {
347afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        try {
348f1c085899dd3d9142392b9ab7841c0e9502526a3Christopher Tate            return Settings.Global.getInt(getContentResolver(), name) > 0;
349afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } catch (SettingNotFoundException snfe) {
350ea07165ef26b57dde4b45eee24200cdfaa5945e7Amith Yamasani            return false;
351afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
352afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
353afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
3545f050104386b96d8c99eb3ff0f5088814709348bAmith Yamasani    /* package */ static void setDate(Context context, int year, int month, int day) {
35571cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        Calendar c = Calendar.getInstance();
35671cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa
35771cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        c.set(Calendar.YEAR, year);
35871cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        c.set(Calendar.MONTH, month);
35971cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        c.set(Calendar.DAY_OF_MONTH, day);
36071cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        long when = c.getTimeInMillis();
36171cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa
36271cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        if (when / 1000 < Integer.MAX_VALUE) {
3635f050104386b96d8c99eb3ff0f5088814709348bAmith Yamasani            ((AlarmManager) context.getSystemService(Context.ALARM_SERVICE)).setTime(when);
364188ca778702938d87313592175a3c2ff86bd3218Eric Fischer        }
36571cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa    }
36671cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa
3675f050104386b96d8c99eb3ff0f5088814709348bAmith Yamasani    /* package */ static void setTime(Context context, int hourOfDay, int minute) {
36871cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        Calendar c = Calendar.getInstance();
369188ca778702938d87313592175a3c2ff86bd3218Eric Fischer
37071cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        c.set(Calendar.HOUR_OF_DAY, hourOfDay);
37171cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        c.set(Calendar.MINUTE, minute);
37233ff11599553254683bbf4a5c75d5dee4251fd74Gilles Debunne        c.set(Calendar.SECOND, 0);
37333ff11599553254683bbf4a5c75d5dee4251fd74Gilles Debunne        c.set(Calendar.MILLISECOND, 0);
37471cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        long when = c.getTimeInMillis();
37571cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa
37671cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        if (when / 1000 < Integer.MAX_VALUE) {
3775f050104386b96d8c99eb3ff0f5088814709348bAmith Yamasani            ((AlarmManager) context.getSystemService(Context.ALARM_SERVICE)).setTime(when);
37871cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        }
379afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
38071cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa
3816c7f55ee4b73d0131103f10211fdbe3742b41cbbElliott Hughes    /*  Helper routines to format timezone */
382afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
3836c7f55ee4b73d0131103f10211fdbe3742b41cbbElliott Hughes    /* package */ static String getTimeZoneText(TimeZone tz) {
3846c7f55ee4b73d0131103f10211fdbe3742b41cbbElliott Hughes        // Similar to new SimpleDateFormat("'GMT'Z, zzzz").format(new Date()), but
3856c7f55ee4b73d0131103f10211fdbe3742b41cbbElliott Hughes        // we want "GMT-03:00" rather than "GMT-0300".
3866c7f55ee4b73d0131103f10211fdbe3742b41cbbElliott Hughes        Date now = new Date();
3876c7f55ee4b73d0131103f10211fdbe3742b41cbbElliott Hughes        return formatOffset(new StringBuilder(), tz, now).
388afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            append(", ").
3896c7f55ee4b73d0131103f10211fdbe3742b41cbbElliott Hughes            append(tz.getDisplayName(tz.inDaylightTime(now), TimeZone.LONG)).toString();
390afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
391afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
3926c7f55ee4b73d0131103f10211fdbe3742b41cbbElliott Hughes    private static StringBuilder formatOffset(StringBuilder sb, TimeZone tz, Date d) {
3936c7f55ee4b73d0131103f10211fdbe3742b41cbbElliott Hughes        int off = tz.getOffset(d.getTime()) / 1000 / 60;
394afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
3956c7f55ee4b73d0131103f10211fdbe3742b41cbbElliott Hughes        sb.append("GMT");
396afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (off < 0) {
3976c7f55ee4b73d0131103f10211fdbe3742b41cbbElliott Hughes            sb.append('-');
398afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            off = -off;
399afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else {
4006c7f55ee4b73d0131103f10211fdbe3742b41cbbElliott Hughes            sb.append('+');
401afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
402afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
4031bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani        int hours = off / 60;
404afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        int minutes = off % 60;
405afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
4066c7f55ee4b73d0131103f10211fdbe3742b41cbbElliott Hughes        sb.append((char) ('0' + hours / 10));
4076c7f55ee4b73d0131103f10211fdbe3742b41cbbElliott Hughes        sb.append((char) ('0' + hours % 10));
408afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
4096c7f55ee4b73d0131103f10211fdbe3742b41cbbElliott Hughes        sb.append(':');
410afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
4116c7f55ee4b73d0131103f10211fdbe3742b41cbbElliott Hughes        sb.append((char) ('0' + minutes / 10));
4126c7f55ee4b73d0131103f10211fdbe3742b41cbbElliott Hughes        sb.append((char) ('0' + minutes % 10));
413afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
4146c7f55ee4b73d0131103f10211fdbe3742b41cbbElliott Hughes        return sb;
415afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
4161bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
417afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
418afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        @Override
419afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public void onReceive(Context context, Intent intent) {
42029e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa            final Activity activity = getActivity();
42129e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa            if (activity != null) {
42229e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa                updateTimeAndDateDisplay(activity);
42329e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa            }
424afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
425afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    };
426afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project}
427