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
19fe4eff6a6584d760584c4e438f15bcf774c6fbf0Sander Alewijnseimport android.app.admin.DevicePolicyManager;
2029e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawaimport android.app.Activity;
215f050104386b96d8c99eb3ff0f5088814709348bAmith Yamasaniimport android.app.AlarmManager;
22afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.app.DatePickerDialog;
23d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasaniimport android.app.Dialog;
24afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.app.TimePickerDialog;
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.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;
3804487594d73c89aa53548e6ad864e40d15324c62Elliott Hughesimport android.text.BidiFormatter;
3904487594d73c89aa53548e6ad864e40d15324c62Elliott Hughesimport android.text.TextDirectionHeuristics;
4004487594d73c89aa53548e6ad864e40d15324c62Elliott Hughesimport android.text.TextUtils;
41afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.text.format.DateFormat;
4204487594d73c89aa53548e6ad864e40d15324c62Elliott Hughesimport android.view.View;
43afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.DatePicker;
44afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.TimePicker;
4581faf895d7654322d46e1254bd9f75d915c78622Elliott Hughesimport java.text.SimpleDateFormat;
46afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.Calendar;
47afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.Date;
4804487594d73c89aa53548e6ad864e40d15324c62Elliott Hughesimport java.util.Locale;
49afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.TimeZone;
50afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
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_DATE_FORMAT = "date_format";
63afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final String KEY_AUTO_TIME = "auto_time";
641bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani    private static final String KEY_AUTO_TIME_ZONE = "auto_zone";
65afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
66afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int DIALOG_DATEPICKER = 0;
67afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int DIALOG_TIMEPICKER = 1;
681bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
697f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng    // have we been launched from the setup wizard?
707f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng    protected static final String EXTRA_IS_FIRST_RUN = "firstRun";
717f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng
721bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani    private CheckBoxPreference mAutoTimePref;
73afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Preference mTimePref;
74afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Preference mTime24Pref;
751bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani    private CheckBoxPreference mAutoTimeZonePref;
76afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Preference mTimeZone;
77afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Preference mDatePref;
78afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private ListPreference mDateFormat;
791bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
80afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
81d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani    public void onCreate(Bundle icicle) {
82afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onCreate(icicle);
831bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
84afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        addPreferencesFromResource(R.xml.date_time_prefs);
851bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
861bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani        initUI();
87afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
881bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
89afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void initUI() {
90f1c085899dd3d9142392b9ab7841c0e9502526a3Christopher Tate        boolean autoTimeEnabled = getAutoState(Settings.Global.AUTO_TIME);
91f1c085899dd3d9142392b9ab7841c0e9502526a3Christopher Tate        boolean autoTimeZoneEnabled = getAutoState(Settings.Global.AUTO_TIME_ZONE);
92afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
93fe4eff6a6584d760584c4e438f15bcf774c6fbf0Sander Alewijnse        mAutoTimePref = (CheckBoxPreference) findPreference(KEY_AUTO_TIME);
94fe4eff6a6584d760584c4e438f15bcf774c6fbf0Sander Alewijnse
95fe4eff6a6584d760584c4e438f15bcf774c6fbf0Sander Alewijnse        DevicePolicyManager dpm = (DevicePolicyManager) getSystemService(Context
96fe4eff6a6584d760584c4e438f15bcf774c6fbf0Sander Alewijnse                .DEVICE_POLICY_SERVICE);
97fe4eff6a6584d760584c4e438f15bcf774c6fbf0Sander Alewijnse        if (dpm.getAutoTimeRequired()) {
98fe4eff6a6584d760584c4e438f15bcf774c6fbf0Sander Alewijnse            mAutoTimePref.setEnabled(false);
99fe4eff6a6584d760584c4e438f15bcf774c6fbf0Sander Alewijnse
100fe4eff6a6584d760584c4e438f15bcf774c6fbf0Sander Alewijnse            // If Settings.Global.AUTO_TIME is false it will be set to true
101fe4eff6a6584d760584c4e438f15bcf774c6fbf0Sander Alewijnse            // by the device policy manager very soon.
102fe4eff6a6584d760584c4e438f15bcf774c6fbf0Sander Alewijnse            // Note that this app listens to that change.
103fe4eff6a6584d760584c4e438f15bcf774c6fbf0Sander Alewijnse        }
104fe4eff6a6584d760584c4e438f15bcf774c6fbf0Sander Alewijnse
1057f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng        Intent intent = getActivity().getIntent();
1067f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng        boolean isFirstRun = intent.getBooleanExtra(EXTRA_IS_FIRST_RUN, false);
1077f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng
108afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mDummyDate = Calendar.getInstance();
1091bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
1101bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani        mAutoTimePref.setChecked(autoTimeEnabled);
111ea07165ef26b57dde4b45eee24200cdfaa5945e7Amith Yamasani        mAutoTimeZonePref = (CheckBoxPreference) findPreference(KEY_AUTO_TIME_ZONE);
1127f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng        // Override auto-timezone if it's a wifi-only device or if we're still in setup wizard.
1137f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng        // TODO: Remove the wifiOnly test when auto-timezone is implemented based on wifi-location.
1148af88fb8387259e51615709b2d1ea0260f7057fdRobert Greenwalt        if (Utils.isWifiOnly(getActivity()) || isFirstRun) {
115c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani            getPreferenceScreen().removePreference(mAutoTimeZonePref);
116c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani            autoTimeZoneEnabled = false;
117c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani        }
118ea07165ef26b57dde4b45eee24200cdfaa5945e7Amith Yamasani        mAutoTimeZonePref.setChecked(autoTimeZoneEnabled);
119ea07165ef26b57dde4b45eee24200cdfaa5945e7Amith Yamasani
120afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mTimePref = findPreference("time");
121afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mTime24Pref = findPreference("24 hour");
122afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mTimeZone = findPreference("timezone");
123afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mDatePref = findPreference("date");
124afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mDateFormat = (ListPreference) findPreference(KEY_DATE_FORMAT);
1257f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng        if (isFirstRun) {
1267f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng            getPreferenceScreen().removePreference(mTime24Pref);
1277f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng            getPreferenceScreen().removePreference(mDateFormat);
1287f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng        }
1291bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
130afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        String [] dateFormats = getResources().getStringArray(R.array.date_format_values);
131afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        String [] formattedDates = new String[dateFormats.length];
132afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        String currentFormat = getDateFormat();
133afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // Initialize if DATE_FORMAT is not set in the system settings
134afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // This can happen after a factory reset (or data wipe)
135afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (currentFormat == null) {
136188ca778702938d87313592175a3c2ff86bd3218Eric Fischer            currentFormat = "";
137afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
138b6676bb6a3515e1599d2342190c2d2d89d611d63Fábio Silva
139b6676bb6a3515e1599d2342190c2d2d89d611d63Fábio Silva        // Prevents duplicated values on date format selector.
140b6676bb6a3515e1599d2342190c2d2d89d611d63Fábio Silva        mDummyDate.set(mDummyDate.get(Calendar.YEAR), mDummyDate.DECEMBER, 31, 13, 0, 0);
141b6676bb6a3515e1599d2342190c2d2d89d611d63Fábio Silva
142afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        for (int i = 0; i < formattedDates.length; i++) {
143188ca778702938d87313592175a3c2ff86bd3218Eric Fischer            String formatted =
144d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani                    DateFormat.getDateFormatForSetting(getActivity(), dateFormats[i])
145d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani                    .format(mDummyDate.getTime());
146188ca778702938d87313592175a3c2ff86bd3218Eric Fischer
147188ca778702938d87313592175a3c2ff86bd3218Eric Fischer            if (dateFormats[i].length() == 0) {
148188ca778702938d87313592175a3c2ff86bd3218Eric Fischer                formattedDates[i] = getResources().
149188ca778702938d87313592175a3c2ff86bd3218Eric Fischer                    getString(R.string.normal_date_format, formatted);
150188ca778702938d87313592175a3c2ff86bd3218Eric Fischer            } else {
151188ca778702938d87313592175a3c2ff86bd3218Eric Fischer                formattedDates[i] = formatted;
152188ca778702938d87313592175a3c2ff86bd3218Eric Fischer            }
153afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
1541bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
155afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mDateFormat.setEntries(formattedDates);
156afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mDateFormat.setEntryValues(R.array.date_format_values);
157afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mDateFormat.setValue(currentFormat);
1581bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
1591bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani        mTimePref.setEnabled(!autoTimeEnabled);
1601bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani        mDatePref.setEnabled(!autoTimeEnabled);
1611bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani        mTimeZone.setEnabled(!autoTimeZoneEnabled);
162afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
163afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
164afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
165d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani    public void onResume() {
166afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onResume();
1671bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
1681bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani        getPreferenceScreen().getSharedPreferences()
1691bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani                .registerOnSharedPreferenceChangeListener(this);
170afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
171afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        ((CheckBoxPreference)mTime24Pref).setChecked(is24Hour());
172afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
173afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // Register for time ticks and other reasons for time change
174afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        IntentFilter filter = new IntentFilter();
175afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        filter.addAction(Intent.ACTION_TIME_TICK);
176afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        filter.addAction(Intent.ACTION_TIME_CHANGED);
177afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        filter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
178d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani        getActivity().registerReceiver(mIntentReceiver, filter, null, null);
17929e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa
18029e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa        updateTimeAndDateDisplay(getActivity());
181afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
182afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
1831bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani    @Override
184d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani    public void onPause() {
185afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onPause();
186d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani        getActivity().unregisterReceiver(mIntentReceiver);
1871bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani        getPreferenceScreen().getSharedPreferences()
1881bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani                .unregisterOnSharedPreferenceChangeListener(this);
189afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
1901bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
1917f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng    public void updateTimeAndDateDisplay(Context context) {
19229e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa        java.text.DateFormat shortDateFormat = DateFormat.getDateFormat(context);
19371cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        final Calendar now = Calendar.getInstance();
194151b0e117443d874c475d25f7144bba1e1b438efKenny Root        mDummyDate.setTimeZone(now.getTimeZone());
19582723df002a27a79545dd18a52333973b056b720Elliott Hughes        // We use December 31st because it's unambiguous when demonstrating the date format.
19682723df002a27a79545dd18a52333973b056b720Elliott Hughes        // We use 13:00 so we can demonstrate the 12/24 hour options.
197151b0e117443d874c475d25f7144bba1e1b438efKenny Root        mDummyDate.set(now.get(Calendar.YEAR), 11, 31, 13, 0, 0);
198afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        Date dummyDate = mDummyDate.getTime();
19971cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        mTimePref.setSummary(DateFormat.getTimeFormat(getActivity()).format(now.getTime()));
20004487594d73c89aa53548e6ad864e40d15324c62Elliott Hughes        mTimeZone.setSummary(getTimeZoneText(now.getTimeZone(), true));
20171cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        mDatePref.setSummary(shortDateFormat.format(now.getTime()));
202afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mDateFormat.setSummary(shortDateFormat.format(dummyDate));
20382723df002a27a79545dd18a52333973b056b720Elliott Hughes        mTime24Pref.setSummary(DateFormat.getTimeFormat(getActivity()).format(dummyDate));
204afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
205afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
2060f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa    @Override
207afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public void onDateSet(DatePicker view, int year, int month, int day) {
20829e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa        final Activity activity = getActivity();
20929e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa        if (activity != null) {
2105f050104386b96d8c99eb3ff0f5088814709348bAmith Yamasani            setDate(activity, year, month, day);
21129e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa            updateTimeAndDateDisplay(activity);
21229e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa        }
213afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
214afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
2150f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa    @Override
216afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
21729e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa        final Activity activity = getActivity();
21829e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa        if (activity != null) {
2195f050104386b96d8c99eb3ff0f5088814709348bAmith Yamasani            setTime(activity, hourOfDay, minute);
22029e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa            updateTimeAndDateDisplay(activity);
22129e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa        }
22271cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa
22372ed6feab24308a0acd1fa2135afa3476759cf39The Android Open Source Project        // We don't need to call timeUpdated() here because the TIME_CHANGED
22472ed6feab24308a0acd1fa2135afa3476759cf39The Android Open Source Project        // broadcast is sent by the AlarmManager as a side effect of setting the
22572ed6feab24308a0acd1fa2135afa3476759cf39The Android Open Source Project        // SystemClock time.
226afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
227afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
2280f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa    @Override
229afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public void onSharedPreferenceChanged(SharedPreferences preferences, String key) {
230afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (key.equals(KEY_DATE_FORMAT)) {
2311bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani            String format = preferences.getString(key,
232afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    getResources().getString(R.string.default_date_format));
2331bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani            Settings.System.putString(getContentResolver(),
234afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    Settings.System.DATE_FORMAT, format);
23529e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa            updateTimeAndDateDisplay(getActivity());
236afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (key.equals(KEY_AUTO_TIME)) {
237afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            boolean autoEnabled = preferences.getBoolean(key, true);
238f1c085899dd3d9142392b9ab7841c0e9502526a3Christopher Tate            Settings.Global.putInt(getContentResolver(), Settings.Global.AUTO_TIME,
239afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    autoEnabled ? 1 : 0);
240afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mTimePref.setEnabled(!autoEnabled);
241afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mDatePref.setEnabled(!autoEnabled);
2421bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani        } else if (key.equals(KEY_AUTO_TIME_ZONE)) {
2431bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani            boolean autoZoneEnabled = preferences.getBoolean(key, true);
244f1c085899dd3d9142392b9ab7841c0e9502526a3Christopher Tate            Settings.Global.putInt(
245f1c085899dd3d9142392b9ab7841c0e9502526a3Christopher Tate                    getContentResolver(), Settings.Global.AUTO_TIME_ZONE, autoZoneEnabled ? 1 : 0);
2461bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani            mTimeZone.setEnabled(!autoZoneEnabled);
247afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
248afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
249afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
250afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
251afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public Dialog onCreateDialog(int id) {
252b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes        final Calendar calendar = Calendar.getInstance();
253afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        switch (id) {
254b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes        case DIALOG_DATEPICKER:
255b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes            DatePickerDialog d = new DatePickerDialog(
256b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes                    getActivity(),
257b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes                    this,
258b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes                    calendar.get(Calendar.YEAR),
259b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes                    calendar.get(Calendar.MONTH),
260b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes                    calendar.get(Calendar.DAY_OF_MONTH));
261b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes            configureDatePicker(d.getDatePicker());
262b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes            return d;
263b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes        case DIALOG_TIMEPICKER:
264b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes            return new TimePickerDialog(
265d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani                    getActivity(),
266afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    this,
267afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    calendar.get(Calendar.HOUR_OF_DAY),
268afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    calendar.get(Calendar.MINUTE),
269d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani                    DateFormat.is24HourFormat(getActivity()));
270afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        default:
271b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes            throw new IllegalArgumentException();
272afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
273b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes    }
274afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
275b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes    static void configureDatePicker(DatePicker datePicker) {
276b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes        // The system clock can't represent dates outside this range.
277b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes        Calendar t = Calendar.getInstance();
278b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes        t.clear();
279b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes        t.set(1970, Calendar.JANUARY, 1);
280b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes        datePicker.setMinDate(t.getTimeInMillis());
281b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes        t.clear();
282b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes        t.set(2037, Calendar.DECEMBER, 31);
283b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes        datePicker.setMaxDate(t.getTimeInMillis());
284afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
285afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
286d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani    /*
287afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
288afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public void onPrepareDialog(int id, Dialog d) {
289afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        switch (id) {
290afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        case DIALOG_DATEPICKER: {
291afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            DatePickerDialog datePicker = (DatePickerDialog)d;
292afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            final Calendar calendar = Calendar.getInstance();
293afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            datePicker.updateDate(
294afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    calendar.get(Calendar.YEAR),
295afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    calendar.get(Calendar.MONTH),
296afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    calendar.get(Calendar.DAY_OF_MONTH));
297afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            break;
298afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
299afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        case DIALOG_TIMEPICKER: {
300afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            TimePickerDialog timePicker = (TimePickerDialog)d;
301afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            final Calendar calendar = Calendar.getInstance();
302afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            timePicker.updateTime(
303afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    calendar.get(Calendar.HOUR_OF_DAY),
304afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    calendar.get(Calendar.MINUTE));
305afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            break;
306afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
307afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        default:
308afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            break;
309afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
310afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
311d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani    */
312afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
313afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
314afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (preference == mDatePref) {
315afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            showDialog(DIALOG_DATEPICKER);
316afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (preference == mTimePref) {
317afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            // The 24-hour mode may have changed, so recreate the dialog
318afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            removeDialog(DIALOG_TIMEPICKER);
319afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            showDialog(DIALOG_TIMEPICKER);
320afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (preference == mTime24Pref) {
3210a2bc1cc760143e91a7a7cc3f5182e50c0009fcdNarayan Kamath            final boolean is24Hour = ((CheckBoxPreference)mTime24Pref).isChecked();
3220a2bc1cc760143e91a7a7cc3f5182e50c0009fcdNarayan Kamath            set24Hour(is24Hour);
32329e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa            updateTimeAndDateDisplay(getActivity());
3240a2bc1cc760143e91a7a7cc3f5182e50c0009fcdNarayan Kamath            timeUpdated(is24Hour);
325afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
3260f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa        return super.onPreferenceTreeClick(preferenceScreen, preference);
327afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
3281bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
329afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
330d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani    public void onActivityResult(int requestCode, int resultCode,
331afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            Intent data) {
33229e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa        updateTimeAndDateDisplay(getActivity());
333afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
3341bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
3350a2bc1cc760143e91a7a7cc3f5182e50c0009fcdNarayan Kamath    private void timeUpdated(boolean is24Hour) {
336afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        Intent timeChanged = new Intent(Intent.ACTION_TIME_CHANGED);
3370a2bc1cc760143e91a7a7cc3f5182e50c0009fcdNarayan Kamath        timeChanged.putExtra(Intent.EXTRA_TIME_PREF_24_HOUR_FORMAT, is24Hour);
338d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani        getActivity().sendBroadcast(timeChanged);
339afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
3401bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
341afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /*  Get & Set values from the system settings  */
3421bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
343afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private boolean is24Hour() {
344d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani        return DateFormat.is24HourFormat(getActivity());
345afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
3461bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
347afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void set24Hour(boolean is24Hour) {
348afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        Settings.System.putString(getContentResolver(),
349afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                Settings.System.TIME_12_24,
350afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                is24Hour? HOURS_24 : HOURS_12);
351afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
3521bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
353afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private String getDateFormat() {
3541bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani        return Settings.System.getString(getContentResolver(),
355afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                Settings.System.DATE_FORMAT);
356afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
3571bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
3581bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani    private boolean getAutoState(String name) {
359afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        try {
360f1c085899dd3d9142392b9ab7841c0e9502526a3Christopher Tate            return Settings.Global.getInt(getContentResolver(), name) > 0;
361afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } catch (SettingNotFoundException snfe) {
362ea07165ef26b57dde4b45eee24200cdfaa5945e7Amith Yamasani            return false;
363afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
364afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
365afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
3665f050104386b96d8c99eb3ff0f5088814709348bAmith Yamasani    /* package */ static void setDate(Context context, int year, int month, int day) {
36771cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        Calendar c = Calendar.getInstance();
36871cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa
36971cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        c.set(Calendar.YEAR, year);
37071cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        c.set(Calendar.MONTH, month);
37171cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        c.set(Calendar.DAY_OF_MONTH, day);
37271cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        long when = c.getTimeInMillis();
37371cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa
37471cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        if (when / 1000 < Integer.MAX_VALUE) {
3755f050104386b96d8c99eb3ff0f5088814709348bAmith Yamasani            ((AlarmManager) context.getSystemService(Context.ALARM_SERVICE)).setTime(when);
376188ca778702938d87313592175a3c2ff86bd3218Eric Fischer        }
37771cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa    }
37871cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa
3795f050104386b96d8c99eb3ff0f5088814709348bAmith Yamasani    /* package */ static void setTime(Context context, int hourOfDay, int minute) {
38071cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        Calendar c = Calendar.getInstance();
381188ca778702938d87313592175a3c2ff86bd3218Eric Fischer
38271cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        c.set(Calendar.HOUR_OF_DAY, hourOfDay);
38371cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        c.set(Calendar.MINUTE, minute);
38433ff11599553254683bbf4a5c75d5dee4251fd74Gilles Debunne        c.set(Calendar.SECOND, 0);
38533ff11599553254683bbf4a5c75d5dee4251fd74Gilles Debunne        c.set(Calendar.MILLISECOND, 0);
38671cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        long when = c.getTimeInMillis();
38771cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa
38871cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        if (when / 1000 < Integer.MAX_VALUE) {
3895f050104386b96d8c99eb3ff0f5088814709348bAmith Yamasani            ((AlarmManager) context.getSystemService(Context.ALARM_SERVICE)).setTime(when);
39071cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        }
391afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
39271cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa
39304487594d73c89aa53548e6ad864e40d15324c62Elliott Hughes    public static String getTimeZoneText(TimeZone tz, boolean includeName) {
39404487594d73c89aa53548e6ad864e40d15324c62Elliott Hughes        Date now = new Date();
39504487594d73c89aa53548e6ad864e40d15324c62Elliott Hughes
39604487594d73c89aa53548e6ad864e40d15324c62Elliott Hughes        // Use SimpleDateFormat to format the GMT+00:00 string.
39704487594d73c89aa53548e6ad864e40d15324c62Elliott Hughes        SimpleDateFormat gmtFormatter = new SimpleDateFormat("ZZZZ");
39804487594d73c89aa53548e6ad864e40d15324c62Elliott Hughes        gmtFormatter.setTimeZone(tz);
39904487594d73c89aa53548e6ad864e40d15324c62Elliott Hughes        String gmtString = gmtFormatter.format(now);
40004487594d73c89aa53548e6ad864e40d15324c62Elliott Hughes
40104487594d73c89aa53548e6ad864e40d15324c62Elliott Hughes        // Ensure that the "GMT+" stays with the "00:00" even if the digits are RTL.
40204487594d73c89aa53548e6ad864e40d15324c62Elliott Hughes        BidiFormatter bidiFormatter = BidiFormatter.getInstance();
40304487594d73c89aa53548e6ad864e40d15324c62Elliott Hughes        Locale l = Locale.getDefault();
40404487594d73c89aa53548e6ad864e40d15324c62Elliott Hughes        boolean isRtl = TextUtils.getLayoutDirectionFromLocale(l) == View.LAYOUT_DIRECTION_RTL;
40504487594d73c89aa53548e6ad864e40d15324c62Elliott Hughes        gmtString = bidiFormatter.unicodeWrap(gmtString,
40604487594d73c89aa53548e6ad864e40d15324c62Elliott Hughes                isRtl ? TextDirectionHeuristics.RTL : TextDirectionHeuristics.LTR);
40704487594d73c89aa53548e6ad864e40d15324c62Elliott Hughes
40804487594d73c89aa53548e6ad864e40d15324c62Elliott Hughes        if (!includeName) {
40904487594d73c89aa53548e6ad864e40d15324c62Elliott Hughes            return gmtString;
41004487594d73c89aa53548e6ad864e40d15324c62Elliott Hughes        }
41104487594d73c89aa53548e6ad864e40d15324c62Elliott Hughes
41204487594d73c89aa53548e6ad864e40d15324c62Elliott Hughes        // Optionally append the time zone name.
41304487594d73c89aa53548e6ad864e40d15324c62Elliott Hughes        SimpleDateFormat zoneNameFormatter = new SimpleDateFormat("zzzz");
41404487594d73c89aa53548e6ad864e40d15324c62Elliott Hughes        zoneNameFormatter.setTimeZone(tz);
41504487594d73c89aa53548e6ad864e40d15324c62Elliott Hughes        String zoneNameString = zoneNameFormatter.format(now);
41604487594d73c89aa53548e6ad864e40d15324c62Elliott Hughes
41704487594d73c89aa53548e6ad864e40d15324c62Elliott Hughes        // We don't use punctuation here to avoid having to worry about localizing that too!
41804487594d73c89aa53548e6ad864e40d15324c62Elliott Hughes        return gmtString + " " + zoneNameString;
419afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
4201bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
421afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
422afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        @Override
423afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public void onReceive(Context context, Intent intent) {
42429e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa            final Activity activity = getActivity();
42529e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa            if (activity != null) {
42629e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa                updateTimeAndDateDisplay(activity);
42729e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa            }
428afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
429afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    };
430afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project}
431