DateTimeSettings.java revision 8a963babe2e36b7a41f77b8d2598c97658196e58
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.Preference;
33afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.PreferenceScreen;
34b98c40649eb7a5ab4b24d3ed74ff46ce7cb672deFabrice Di Meglioimport android.preference.SwitchPreference;
35afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.provider.Settings;
36afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.provider.Settings.SettingNotFoundException;
3704487594d73c89aa53548e6ad864e40d15324c62Elliott Hughesimport android.text.BidiFormatter;
3804487594d73c89aa53548e6ad864e40d15324c62Elliott Hughesimport android.text.TextDirectionHeuristics;
3904487594d73c89aa53548e6ad864e40d15324c62Elliott Hughesimport android.text.TextUtils;
40afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.text.format.DateFormat;
4104487594d73c89aa53548e6ad864e40d15324c62Elliott Hughesimport android.view.View;
42afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.DatePicker;
43afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.TimePicker;
448a963babe2e36b7a41f77b8d2598c97658196e58Chris Wrenimport com.android.internal.logging.MetricsLogger;
458a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren
4681faf895d7654322d46e1254bd9f75d915c78622Elliott Hughesimport java.text.SimpleDateFormat;
47afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.Calendar;
48afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.Date;
4904487594d73c89aa53548e6ad864e40d15324c62Elliott Hughesimport java.util.Locale;
50afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.TimeZone;
51afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
520f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawapublic class DateTimeSettings extends SettingsPreferenceFragment
53afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        implements OnSharedPreferenceChangeListener,
5471cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa                TimePickerDialog.OnTimeSetListener, DatePickerDialog.OnDateSetListener {
55afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
56afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final String HOURS_12 = "12";
57afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final String HOURS_24 = "24";
581bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
5971cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa    // Used for showing the current date format, which looks like "12/31/2010", "2010/12/13", etc.
6071cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa    // The date value is dummy (independent of actual date).
61afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Calendar mDummyDate;
6271cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa
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
72b98c40649eb7a5ab4b24d3ed74ff46ce7cb672deFabrice Di Meglio    private SwitchPreference mAutoTimePref;
73afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Preference mTimePref;
74afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Preference mTime24Pref;
75b98c40649eb7a5ab4b24d3ed74ff46ce7cb672deFabrice Di Meglio    private SwitchPreference mAutoTimeZonePref;
76afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Preference mTimeZone;
77afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Preference mDatePref;
781bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
79afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
808a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren    protected int getMetricsCategory() {
818a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren        return MetricsLogger.DATE_TIME;
828a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren    }
838a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren
848a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren    @Override
85d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani    public void onCreate(Bundle icicle) {
86afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onCreate(icicle);
871bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
88afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        addPreferencesFromResource(R.xml.date_time_prefs);
891bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
901bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani        initUI();
91afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
921bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
93afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void initUI() {
94f1c085899dd3d9142392b9ab7841c0e9502526a3Christopher Tate        boolean autoTimeEnabled = getAutoState(Settings.Global.AUTO_TIME);
95f1c085899dd3d9142392b9ab7841c0e9502526a3Christopher Tate        boolean autoTimeZoneEnabled = getAutoState(Settings.Global.AUTO_TIME_ZONE);
96afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
97b98c40649eb7a5ab4b24d3ed74ff46ce7cb672deFabrice Di Meglio        mAutoTimePref = (SwitchPreference) findPreference(KEY_AUTO_TIME);
98fe4eff6a6584d760584c4e438f15bcf774c6fbf0Sander Alewijnse
99fe4eff6a6584d760584c4e438f15bcf774c6fbf0Sander Alewijnse        DevicePolicyManager dpm = (DevicePolicyManager) getSystemService(Context
100fe4eff6a6584d760584c4e438f15bcf774c6fbf0Sander Alewijnse                .DEVICE_POLICY_SERVICE);
101fe4eff6a6584d760584c4e438f15bcf774c6fbf0Sander Alewijnse        if (dpm.getAutoTimeRequired()) {
102fe4eff6a6584d760584c4e438f15bcf774c6fbf0Sander Alewijnse            mAutoTimePref.setEnabled(false);
103fe4eff6a6584d760584c4e438f15bcf774c6fbf0Sander Alewijnse
104fe4eff6a6584d760584c4e438f15bcf774c6fbf0Sander Alewijnse            // If Settings.Global.AUTO_TIME is false it will be set to true
105fe4eff6a6584d760584c4e438f15bcf774c6fbf0Sander Alewijnse            // by the device policy manager very soon.
106fe4eff6a6584d760584c4e438f15bcf774c6fbf0Sander Alewijnse            // Note that this app listens to that change.
107fe4eff6a6584d760584c4e438f15bcf774c6fbf0Sander Alewijnse        }
108fe4eff6a6584d760584c4e438f15bcf774c6fbf0Sander Alewijnse
1097f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng        Intent intent = getActivity().getIntent();
1107f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng        boolean isFirstRun = intent.getBooleanExtra(EXTRA_IS_FIRST_RUN, false);
1117f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng
112afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mDummyDate = Calendar.getInstance();
1131bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
1141bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani        mAutoTimePref.setChecked(autoTimeEnabled);
115b98c40649eb7a5ab4b24d3ed74ff46ce7cb672deFabrice Di Meglio        mAutoTimeZonePref = (SwitchPreference) findPreference(KEY_AUTO_TIME_ZONE);
1167f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng        // Override auto-timezone if it's a wifi-only device or if we're still in setup wizard.
1177f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng        // TODO: Remove the wifiOnly test when auto-timezone is implemented based on wifi-location.
1188af88fb8387259e51615709b2d1ea0260f7057fdRobert Greenwalt        if (Utils.isWifiOnly(getActivity()) || isFirstRun) {
119c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani            getPreferenceScreen().removePreference(mAutoTimeZonePref);
120c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani            autoTimeZoneEnabled = false;
121c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani        }
122ea07165ef26b57dde4b45eee24200cdfaa5945e7Amith Yamasani        mAutoTimeZonePref.setChecked(autoTimeZoneEnabled);
123ea07165ef26b57dde4b45eee24200cdfaa5945e7Amith Yamasani
124afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mTimePref = findPreference("time");
125afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mTime24Pref = findPreference("24 hour");
126afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mTimeZone = findPreference("timezone");
127afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mDatePref = findPreference("date");
1287f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng        if (isFirstRun) {
1297f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng            getPreferenceScreen().removePreference(mTime24Pref);
1307f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng        }
1311bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
1321bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani        mTimePref.setEnabled(!autoTimeEnabled);
1331bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani        mDatePref.setEnabled(!autoTimeEnabled);
1341bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani        mTimeZone.setEnabled(!autoTimeZoneEnabled);
135afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
136afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
137afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
138d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani    public void onResume() {
139afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onResume();
1401bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
1411bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani        getPreferenceScreen().getSharedPreferences()
1421bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani                .registerOnSharedPreferenceChangeListener(this);
143afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
144b98c40649eb7a5ab4b24d3ed74ff46ce7cb672deFabrice Di Meglio        ((SwitchPreference)mTime24Pref).setChecked(is24Hour());
145afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
146afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // Register for time ticks and other reasons for time change
147afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        IntentFilter filter = new IntentFilter();
148afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        filter.addAction(Intent.ACTION_TIME_TICK);
149afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        filter.addAction(Intent.ACTION_TIME_CHANGED);
150afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        filter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
151d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani        getActivity().registerReceiver(mIntentReceiver, filter, null, null);
15229e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa
15329e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa        updateTimeAndDateDisplay(getActivity());
154afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
155afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
1561bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani    @Override
157d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani    public void onPause() {
158afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onPause();
159d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani        getActivity().unregisterReceiver(mIntentReceiver);
1601bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani        getPreferenceScreen().getSharedPreferences()
1611bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani                .unregisterOnSharedPreferenceChangeListener(this);
162afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
1631bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
1647f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng    public void updateTimeAndDateDisplay(Context context) {
16571cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        final Calendar now = Calendar.getInstance();
166151b0e117443d874c475d25f7144bba1e1b438efKenny Root        mDummyDate.setTimeZone(now.getTimeZone());
16782723df002a27a79545dd18a52333973b056b720Elliott Hughes        // We use December 31st because it's unambiguous when demonstrating the date format.
16882723df002a27a79545dd18a52333973b056b720Elliott Hughes        // We use 13:00 so we can demonstrate the 12/24 hour options.
169151b0e117443d874c475d25f7144bba1e1b438efKenny Root        mDummyDate.set(now.get(Calendar.YEAR), 11, 31, 13, 0, 0);
170afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        Date dummyDate = mDummyDate.getTime();
17130cc30864b2b41d73e187ba9a0f75ea1fa64b538Elliott Hughes        mDatePref.setSummary(DateFormat.getLongDateFormat(context).format(now.getTime()));
17271cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        mTimePref.setSummary(DateFormat.getTimeFormat(getActivity()).format(now.getTime()));
17304487594d73c89aa53548e6ad864e40d15324c62Elliott Hughes        mTimeZone.setSummary(getTimeZoneText(now.getTimeZone(), true));
17482723df002a27a79545dd18a52333973b056b720Elliott Hughes        mTime24Pref.setSummary(DateFormat.getTimeFormat(getActivity()).format(dummyDate));
175afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
176afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
1770f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa    @Override
178afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public void onDateSet(DatePicker view, int year, int month, int day) {
17929e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa        final Activity activity = getActivity();
18029e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa        if (activity != null) {
1815f050104386b96d8c99eb3ff0f5088814709348bAmith Yamasani            setDate(activity, year, month, day);
18229e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa            updateTimeAndDateDisplay(activity);
18329e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa        }
184afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
185afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
1860f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa    @Override
187afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
18829e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa        final Activity activity = getActivity();
18929e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa        if (activity != null) {
1905f050104386b96d8c99eb3ff0f5088814709348bAmith Yamasani            setTime(activity, hourOfDay, minute);
19129e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa            updateTimeAndDateDisplay(activity);
19229e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa        }
19371cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa
19472ed6feab24308a0acd1fa2135afa3476759cf39The Android Open Source Project        // We don't need to call timeUpdated() here because the TIME_CHANGED
19572ed6feab24308a0acd1fa2135afa3476759cf39The Android Open Source Project        // broadcast is sent by the AlarmManager as a side effect of setting the
19672ed6feab24308a0acd1fa2135afa3476759cf39The Android Open Source Project        // SystemClock time.
197afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
198afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
1990f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa    @Override
200afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public void onSharedPreferenceChanged(SharedPreferences preferences, String key) {
20130cc30864b2b41d73e187ba9a0f75ea1fa64b538Elliott Hughes        if (key.equals(KEY_AUTO_TIME)) {
202afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            boolean autoEnabled = preferences.getBoolean(key, true);
203f1c085899dd3d9142392b9ab7841c0e9502526a3Christopher Tate            Settings.Global.putInt(getContentResolver(), Settings.Global.AUTO_TIME,
204afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    autoEnabled ? 1 : 0);
205afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mTimePref.setEnabled(!autoEnabled);
206afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mDatePref.setEnabled(!autoEnabled);
2071bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani        } else if (key.equals(KEY_AUTO_TIME_ZONE)) {
2081bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani            boolean autoZoneEnabled = preferences.getBoolean(key, true);
209f1c085899dd3d9142392b9ab7841c0e9502526a3Christopher Tate            Settings.Global.putInt(
210f1c085899dd3d9142392b9ab7841c0e9502526a3Christopher Tate                    getContentResolver(), Settings.Global.AUTO_TIME_ZONE, autoZoneEnabled ? 1 : 0);
2111bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani            mTimeZone.setEnabled(!autoZoneEnabled);
212afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
213afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
214afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
215afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
216afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public Dialog onCreateDialog(int id) {
217b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes        final Calendar calendar = Calendar.getInstance();
218afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        switch (id) {
219b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes        case DIALOG_DATEPICKER:
220b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes            DatePickerDialog d = new DatePickerDialog(
221b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes                    getActivity(),
222b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes                    this,
223b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes                    calendar.get(Calendar.YEAR),
224b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes                    calendar.get(Calendar.MONTH),
225b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes                    calendar.get(Calendar.DAY_OF_MONTH));
226b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes            configureDatePicker(d.getDatePicker());
227b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes            return d;
228b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes        case DIALOG_TIMEPICKER:
229b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes            return new TimePickerDialog(
230d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani                    getActivity(),
231afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    this,
232afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    calendar.get(Calendar.HOUR_OF_DAY),
233afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    calendar.get(Calendar.MINUTE),
234d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani                    DateFormat.is24HourFormat(getActivity()));
235afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        default:
236b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes            throw new IllegalArgumentException();
237afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
238b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes    }
239afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
240b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes    static void configureDatePicker(DatePicker datePicker) {
241b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes        // The system clock can't represent dates outside this range.
242b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes        Calendar t = Calendar.getInstance();
243b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes        t.clear();
244b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes        t.set(1970, Calendar.JANUARY, 1);
245b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes        datePicker.setMinDate(t.getTimeInMillis());
246b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes        t.clear();
247b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes        t.set(2037, Calendar.DECEMBER, 31);
248b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes        datePicker.setMaxDate(t.getTimeInMillis());
249afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
250afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
251d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani    /*
252afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
253afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public void onPrepareDialog(int id, Dialog d) {
254afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        switch (id) {
255afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        case DIALOG_DATEPICKER: {
256afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            DatePickerDialog datePicker = (DatePickerDialog)d;
257afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            final Calendar calendar = Calendar.getInstance();
258afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            datePicker.updateDate(
259afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    calendar.get(Calendar.YEAR),
260afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    calendar.get(Calendar.MONTH),
261afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    calendar.get(Calendar.DAY_OF_MONTH));
262afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            break;
263afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
264afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        case DIALOG_TIMEPICKER: {
265afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            TimePickerDialog timePicker = (TimePickerDialog)d;
266afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            final Calendar calendar = Calendar.getInstance();
267afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            timePicker.updateTime(
268afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    calendar.get(Calendar.HOUR_OF_DAY),
269afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    calendar.get(Calendar.MINUTE));
270afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            break;
271afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
272afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        default:
273afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            break;
274afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
275afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
276d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani    */
277afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
278afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
279afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (preference == mDatePref) {
280afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            showDialog(DIALOG_DATEPICKER);
281afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (preference == mTimePref) {
282afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            // The 24-hour mode may have changed, so recreate the dialog
283afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            removeDialog(DIALOG_TIMEPICKER);
284afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            showDialog(DIALOG_TIMEPICKER);
285afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (preference == mTime24Pref) {
286b98c40649eb7a5ab4b24d3ed74ff46ce7cb672deFabrice Di Meglio            final boolean is24Hour = ((SwitchPreference)mTime24Pref).isChecked();
2870a2bc1cc760143e91a7a7cc3f5182e50c0009fcdNarayan Kamath            set24Hour(is24Hour);
28829e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa            updateTimeAndDateDisplay(getActivity());
2890a2bc1cc760143e91a7a7cc3f5182e50c0009fcdNarayan Kamath            timeUpdated(is24Hour);
290afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
2910f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa        return super.onPreferenceTreeClick(preferenceScreen, preference);
292afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
2931bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
294afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
295d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani    public void onActivityResult(int requestCode, int resultCode,
296afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            Intent data) {
29729e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa        updateTimeAndDateDisplay(getActivity());
298afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
2991bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
3000a2bc1cc760143e91a7a7cc3f5182e50c0009fcdNarayan Kamath    private void timeUpdated(boolean is24Hour) {
301afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        Intent timeChanged = new Intent(Intent.ACTION_TIME_CHANGED);
3020a2bc1cc760143e91a7a7cc3f5182e50c0009fcdNarayan Kamath        timeChanged.putExtra(Intent.EXTRA_TIME_PREF_24_HOUR_FORMAT, is24Hour);
303d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani        getActivity().sendBroadcast(timeChanged);
304afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
3051bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
306afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /*  Get & Set values from the system settings  */
3071bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
308afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private boolean is24Hour() {
309d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani        return DateFormat.is24HourFormat(getActivity());
310afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
3111bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
312afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void set24Hour(boolean is24Hour) {
313afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        Settings.System.putString(getContentResolver(),
314afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                Settings.System.TIME_12_24,
315afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                is24Hour? HOURS_24 : HOURS_12);
316afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
3171bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
3181bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani    private boolean getAutoState(String name) {
319afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        try {
320f1c085899dd3d9142392b9ab7841c0e9502526a3Christopher Tate            return Settings.Global.getInt(getContentResolver(), name) > 0;
321afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } catch (SettingNotFoundException snfe) {
322ea07165ef26b57dde4b45eee24200cdfaa5945e7Amith Yamasani            return false;
323afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
324afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
325afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
3265f050104386b96d8c99eb3ff0f5088814709348bAmith Yamasani    /* package */ static void setDate(Context context, int year, int month, int day) {
32771cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        Calendar c = Calendar.getInstance();
32871cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa
32971cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        c.set(Calendar.YEAR, year);
33071cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        c.set(Calendar.MONTH, month);
33171cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        c.set(Calendar.DAY_OF_MONTH, day);
33271cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        long when = c.getTimeInMillis();
33371cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa
33471cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        if (when / 1000 < Integer.MAX_VALUE) {
3355f050104386b96d8c99eb3ff0f5088814709348bAmith Yamasani            ((AlarmManager) context.getSystemService(Context.ALARM_SERVICE)).setTime(when);
336188ca778702938d87313592175a3c2ff86bd3218Eric Fischer        }
33771cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa    }
33871cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa
3395f050104386b96d8c99eb3ff0f5088814709348bAmith Yamasani    /* package */ static void setTime(Context context, int hourOfDay, int minute) {
34071cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        Calendar c = Calendar.getInstance();
341188ca778702938d87313592175a3c2ff86bd3218Eric Fischer
34271cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        c.set(Calendar.HOUR_OF_DAY, hourOfDay);
34371cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        c.set(Calendar.MINUTE, minute);
34433ff11599553254683bbf4a5c75d5dee4251fd74Gilles Debunne        c.set(Calendar.SECOND, 0);
34533ff11599553254683bbf4a5c75d5dee4251fd74Gilles Debunne        c.set(Calendar.MILLISECOND, 0);
34671cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        long when = c.getTimeInMillis();
34771cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa
34871cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        if (when / 1000 < Integer.MAX_VALUE) {
3495f050104386b96d8c99eb3ff0f5088814709348bAmith Yamasani            ((AlarmManager) context.getSystemService(Context.ALARM_SERVICE)).setTime(when);
35071cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa        }
351afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
35271cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa
35304487594d73c89aa53548e6ad864e40d15324c62Elliott Hughes    public static String getTimeZoneText(TimeZone tz, boolean includeName) {
35404487594d73c89aa53548e6ad864e40d15324c62Elliott Hughes        Date now = new Date();
35504487594d73c89aa53548e6ad864e40d15324c62Elliott Hughes
35604487594d73c89aa53548e6ad864e40d15324c62Elliott Hughes        // Use SimpleDateFormat to format the GMT+00:00 string.
35704487594d73c89aa53548e6ad864e40d15324c62Elliott Hughes        SimpleDateFormat gmtFormatter = new SimpleDateFormat("ZZZZ");
35804487594d73c89aa53548e6ad864e40d15324c62Elliott Hughes        gmtFormatter.setTimeZone(tz);
35904487594d73c89aa53548e6ad864e40d15324c62Elliott Hughes        String gmtString = gmtFormatter.format(now);
36004487594d73c89aa53548e6ad864e40d15324c62Elliott Hughes
36104487594d73c89aa53548e6ad864e40d15324c62Elliott Hughes        // Ensure that the "GMT+" stays with the "00:00" even if the digits are RTL.
36204487594d73c89aa53548e6ad864e40d15324c62Elliott Hughes        BidiFormatter bidiFormatter = BidiFormatter.getInstance();
36304487594d73c89aa53548e6ad864e40d15324c62Elliott Hughes        Locale l = Locale.getDefault();
36404487594d73c89aa53548e6ad864e40d15324c62Elliott Hughes        boolean isRtl = TextUtils.getLayoutDirectionFromLocale(l) == View.LAYOUT_DIRECTION_RTL;
36504487594d73c89aa53548e6ad864e40d15324c62Elliott Hughes        gmtString = bidiFormatter.unicodeWrap(gmtString,
36604487594d73c89aa53548e6ad864e40d15324c62Elliott Hughes                isRtl ? TextDirectionHeuristics.RTL : TextDirectionHeuristics.LTR);
36704487594d73c89aa53548e6ad864e40d15324c62Elliott Hughes
36804487594d73c89aa53548e6ad864e40d15324c62Elliott Hughes        if (!includeName) {
36904487594d73c89aa53548e6ad864e40d15324c62Elliott Hughes            return gmtString;
37004487594d73c89aa53548e6ad864e40d15324c62Elliott Hughes        }
37104487594d73c89aa53548e6ad864e40d15324c62Elliott Hughes
37204487594d73c89aa53548e6ad864e40d15324c62Elliott Hughes        // Optionally append the time zone name.
37304487594d73c89aa53548e6ad864e40d15324c62Elliott Hughes        SimpleDateFormat zoneNameFormatter = new SimpleDateFormat("zzzz");
37404487594d73c89aa53548e6ad864e40d15324c62Elliott Hughes        zoneNameFormatter.setTimeZone(tz);
37504487594d73c89aa53548e6ad864e40d15324c62Elliott Hughes        String zoneNameString = zoneNameFormatter.format(now);
37604487594d73c89aa53548e6ad864e40d15324c62Elliott Hughes
37704487594d73c89aa53548e6ad864e40d15324c62Elliott Hughes        // We don't use punctuation here to avoid having to worry about localizing that too!
37804487594d73c89aa53548e6ad864e40d15324c62Elliott Hughes        return gmtString + " " + zoneNameString;
379afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
3801bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani
381afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
382afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        @Override
383afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public void onReceive(Context context, Intent intent) {
38429e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa            final Activity activity = getActivity();
38529e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa            if (activity != null) {
38629e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa                updateTimeAndDateDisplay(activity);
38729e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa            }
388afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
389afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    };
390afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project}
391