blob: 77561bd38c9bf1abf79ab6491802862cae90a8bc [file] [log] [blame]
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001/*
2 * Copyright (C) 2008 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.settings;
18
Daisuke Miyakawa29e812f2010-09-13 16:50:57 -070019import android.app.Activity;
Amith Yamasani5f050102012-11-01 15:36:29 -070020import android.app.AlarmManager;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080021import android.app.DatePickerDialog;
Amith Yamasanid7993472010-08-18 13:59:28 -070022import android.app.Dialog;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080023import android.app.TimePickerDialog;
24import android.content.BroadcastReceiver;
25import android.content.Context;
26import android.content.Intent;
27import android.content.IntentFilter;
28import android.content.SharedPreferences;
29import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
30import android.os.Bundle;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080031import android.preference.CheckBoxPreference;
32import android.preference.ListPreference;
33import android.preference.Preference;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080034import android.preference.PreferenceScreen;
35import android.provider.Settings;
36import android.provider.Settings.SettingNotFoundException;
Elliott Hughes04487592013-09-18 15:04:25 -070037import android.text.BidiFormatter;
38import android.text.TextDirectionHeuristics;
39import android.text.TextUtils;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080040import android.text.format.DateFormat;
Elliott Hughes04487592013-09-18 15:04:25 -070041import android.view.View;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080042import android.widget.DatePicker;
43import android.widget.TimePicker;
Elliott Hughes81faf892013-06-25 10:16:27 -070044import java.text.SimpleDateFormat;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080045import java.util.Calendar;
46import java.util.Date;
Elliott Hughes04487592013-09-18 15:04:25 -070047import java.util.Locale;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080048import java.util.TimeZone;
49
Daisuke Miyakawa0f4f2f32010-09-03 15:40:17 -070050public class DateTimeSettings extends SettingsPreferenceFragment
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080051 implements OnSharedPreferenceChangeListener,
Daisuke Miyakawa71cc5482010-09-09 11:51:16 -070052 TimePickerDialog.OnTimeSetListener, DatePickerDialog.OnDateSetListener {
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080053
54 private static final String HOURS_12 = "12";
55 private static final String HOURS_24 = "24";
Amith Yamasani1bb6db52010-09-17 13:34:47 -070056
Daisuke Miyakawa71cc5482010-09-09 11:51:16 -070057 // Used for showing the current date format, which looks like "12/31/2010", "2010/12/13", etc.
58 // The date value is dummy (independent of actual date).
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080059 private Calendar mDummyDate;
Daisuke Miyakawa71cc5482010-09-09 11:51:16 -070060
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080061 private static final String KEY_DATE_FORMAT = "date_format";
62 private static final String KEY_AUTO_TIME = "auto_time";
Amith Yamasani1bb6db52010-09-17 13:34:47 -070063 private static final String KEY_AUTO_TIME_ZONE = "auto_zone";
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080064
65 private static final int DIALOG_DATEPICKER = 0;
66 private static final int DIALOG_TIMEPICKER = 1;
Amith Yamasani1bb6db52010-09-17 13:34:47 -070067
Freeman Ng7f6f6e12011-06-02 15:44:51 -070068 // have we been launched from the setup wizard?
69 protected static final String EXTRA_IS_FIRST_RUN = "firstRun";
70
Amith Yamasani1bb6db52010-09-17 13:34:47 -070071 private CheckBoxPreference mAutoTimePref;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080072 private Preference mTimePref;
73 private Preference mTime24Pref;
Amith Yamasani1bb6db52010-09-17 13:34:47 -070074 private CheckBoxPreference mAutoTimeZonePref;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080075 private Preference mTimeZone;
76 private Preference mDatePref;
77 private ListPreference mDateFormat;
Amith Yamasani1bb6db52010-09-17 13:34:47 -070078
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080079 @Override
Amith Yamasanid7993472010-08-18 13:59:28 -070080 public void onCreate(Bundle icicle) {
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080081 super.onCreate(icicle);
Amith Yamasani1bb6db52010-09-17 13:34:47 -070082
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080083 addPreferencesFromResource(R.xml.date_time_prefs);
Amith Yamasani1bb6db52010-09-17 13:34:47 -070084
85 initUI();
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080086 }
Amith Yamasani1bb6db52010-09-17 13:34:47 -070087
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080088 private void initUI() {
Christopher Tatef1c08582012-09-12 14:25:46 -070089 boolean autoTimeEnabled = getAutoState(Settings.Global.AUTO_TIME);
90 boolean autoTimeZoneEnabled = getAutoState(Settings.Global.AUTO_TIME_ZONE);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080091
Freeman Ng7f6f6e12011-06-02 15:44:51 -070092 Intent intent = getActivity().getIntent();
93 boolean isFirstRun = intent.getBooleanExtra(EXTRA_IS_FIRST_RUN, false);
94
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080095 mDummyDate = Calendar.getInstance();
Amith Yamasani1bb6db52010-09-17 13:34:47 -070096
97 mAutoTimePref = (CheckBoxPreference) findPreference(KEY_AUTO_TIME);
98 mAutoTimePref.setChecked(autoTimeEnabled);
Amith Yamasaniea071652010-11-08 14:28:05 -080099 mAutoTimeZonePref = (CheckBoxPreference) findPreference(KEY_AUTO_TIME_ZONE);
Freeman Ng7f6f6e12011-06-02 15:44:51 -0700100 // Override auto-timezone if it's a wifi-only device or if we're still in setup wizard.
101 // TODO: Remove the wifiOnly test when auto-timezone is implemented based on wifi-location.
Robert Greenwalt8af88fb2011-08-31 11:17:47 -0700102 if (Utils.isWifiOnly(getActivity()) || isFirstRun) {
Amith Yamasanic06d4c42011-02-25 14:35:20 -0800103 getPreferenceScreen().removePreference(mAutoTimeZonePref);
104 autoTimeZoneEnabled = false;
105 }
Amith Yamasaniea071652010-11-08 14:28:05 -0800106 mAutoTimeZonePref.setChecked(autoTimeZoneEnabled);
107
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800108 mTimePref = findPreference("time");
109 mTime24Pref = findPreference("24 hour");
110 mTimeZone = findPreference("timezone");
111 mDatePref = findPreference("date");
112 mDateFormat = (ListPreference) findPreference(KEY_DATE_FORMAT);
Freeman Ng7f6f6e12011-06-02 15:44:51 -0700113 if (isFirstRun) {
114 getPreferenceScreen().removePreference(mTime24Pref);
115 getPreferenceScreen().removePreference(mDateFormat);
116 }
Amith Yamasani1bb6db52010-09-17 13:34:47 -0700117
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800118 String [] dateFormats = getResources().getStringArray(R.array.date_format_values);
119 String [] formattedDates = new String[dateFormats.length];
120 String currentFormat = getDateFormat();
121 // Initialize if DATE_FORMAT is not set in the system settings
122 // This can happen after a factory reset (or data wipe)
123 if (currentFormat == null) {
Eric Fischer188ca772009-06-11 18:16:15 -0700124 currentFormat = "";
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800125 }
Fábio Silvab6676bb2012-10-15 12:21:19 -0300126
127 // Prevents duplicated values on date format selector.
128 mDummyDate.set(mDummyDate.get(Calendar.YEAR), mDummyDate.DECEMBER, 31, 13, 0, 0);
129
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800130 for (int i = 0; i < formattedDates.length; i++) {
Eric Fischer188ca772009-06-11 18:16:15 -0700131 String formatted =
Amith Yamasanid7993472010-08-18 13:59:28 -0700132 DateFormat.getDateFormatForSetting(getActivity(), dateFormats[i])
133 .format(mDummyDate.getTime());
Eric Fischer188ca772009-06-11 18:16:15 -0700134
135 if (dateFormats[i].length() == 0) {
136 formattedDates[i] = getResources().
137 getString(R.string.normal_date_format, formatted);
138 } else {
139 formattedDates[i] = formatted;
140 }
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800141 }
Amith Yamasani1bb6db52010-09-17 13:34:47 -0700142
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800143 mDateFormat.setEntries(formattedDates);
144 mDateFormat.setEntryValues(R.array.date_format_values);
145 mDateFormat.setValue(currentFormat);
Amith Yamasani1bb6db52010-09-17 13:34:47 -0700146
147 mTimePref.setEnabled(!autoTimeEnabled);
148 mDatePref.setEnabled(!autoTimeEnabled);
149 mTimeZone.setEnabled(!autoTimeZoneEnabled);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800150 }
151
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800152 @Override
Amith Yamasanid7993472010-08-18 13:59:28 -0700153 public void onResume() {
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800154 super.onResume();
Amith Yamasani1bb6db52010-09-17 13:34:47 -0700155
156 getPreferenceScreen().getSharedPreferences()
157 .registerOnSharedPreferenceChangeListener(this);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800158
159 ((CheckBoxPreference)mTime24Pref).setChecked(is24Hour());
160
161 // Register for time ticks and other reasons for time change
162 IntentFilter filter = new IntentFilter();
163 filter.addAction(Intent.ACTION_TIME_TICK);
164 filter.addAction(Intent.ACTION_TIME_CHANGED);
165 filter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
Amith Yamasanid7993472010-08-18 13:59:28 -0700166 getActivity().registerReceiver(mIntentReceiver, filter, null, null);
Daisuke Miyakawa29e812f2010-09-13 16:50:57 -0700167
168 updateTimeAndDateDisplay(getActivity());
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800169 }
170
Amith Yamasani1bb6db52010-09-17 13:34:47 -0700171 @Override
Amith Yamasanid7993472010-08-18 13:59:28 -0700172 public void onPause() {
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800173 super.onPause();
Amith Yamasanid7993472010-08-18 13:59:28 -0700174 getActivity().unregisterReceiver(mIntentReceiver);
Amith Yamasani1bb6db52010-09-17 13:34:47 -0700175 getPreferenceScreen().getSharedPreferences()
176 .unregisterOnSharedPreferenceChangeListener(this);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800177 }
Amith Yamasani1bb6db52010-09-17 13:34:47 -0700178
Freeman Ng7f6f6e12011-06-02 15:44:51 -0700179 public void updateTimeAndDateDisplay(Context context) {
Daisuke Miyakawa29e812f2010-09-13 16:50:57 -0700180 java.text.DateFormat shortDateFormat = DateFormat.getDateFormat(context);
Daisuke Miyakawa71cc5482010-09-09 11:51:16 -0700181 final Calendar now = Calendar.getInstance();
Kenny Root151b0e12011-06-12 19:44:14 -0700182 mDummyDate.setTimeZone(now.getTimeZone());
Elliott Hughes82723df2012-09-06 14:49:35 -0700183 // We use December 31st because it's unambiguous when demonstrating the date format.
184 // We use 13:00 so we can demonstrate the 12/24 hour options.
Kenny Root151b0e12011-06-12 19:44:14 -0700185 mDummyDate.set(now.get(Calendar.YEAR), 11, 31, 13, 0, 0);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800186 Date dummyDate = mDummyDate.getTime();
Daisuke Miyakawa71cc5482010-09-09 11:51:16 -0700187 mTimePref.setSummary(DateFormat.getTimeFormat(getActivity()).format(now.getTime()));
Elliott Hughes04487592013-09-18 15:04:25 -0700188 mTimeZone.setSummary(getTimeZoneText(now.getTimeZone(), true));
Daisuke Miyakawa71cc5482010-09-09 11:51:16 -0700189 mDatePref.setSummary(shortDateFormat.format(now.getTime()));
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800190 mDateFormat.setSummary(shortDateFormat.format(dummyDate));
Elliott Hughes82723df2012-09-06 14:49:35 -0700191 mTime24Pref.setSummary(DateFormat.getTimeFormat(getActivity()).format(dummyDate));
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800192 }
193
Daisuke Miyakawa0f4f2f32010-09-03 15:40:17 -0700194 @Override
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800195 public void onDateSet(DatePicker view, int year, int month, int day) {
Daisuke Miyakawa29e812f2010-09-13 16:50:57 -0700196 final Activity activity = getActivity();
197 if (activity != null) {
Amith Yamasani5f050102012-11-01 15:36:29 -0700198 setDate(activity, year, month, day);
Daisuke Miyakawa29e812f2010-09-13 16:50:57 -0700199 updateTimeAndDateDisplay(activity);
200 }
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800201 }
202
Daisuke Miyakawa0f4f2f32010-09-03 15:40:17 -0700203 @Override
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800204 public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
Daisuke Miyakawa29e812f2010-09-13 16:50:57 -0700205 final Activity activity = getActivity();
206 if (activity != null) {
Amith Yamasani5f050102012-11-01 15:36:29 -0700207 setTime(activity, hourOfDay, minute);
Daisuke Miyakawa29e812f2010-09-13 16:50:57 -0700208 updateTimeAndDateDisplay(activity);
209 }
Daisuke Miyakawa71cc5482010-09-09 11:51:16 -0700210
The Android Open Source Project72ed6fe2009-03-13 13:04:25 -0700211 // We don't need to call timeUpdated() here because the TIME_CHANGED
212 // broadcast is sent by the AlarmManager as a side effect of setting the
213 // SystemClock time.
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800214 }
215
Daisuke Miyakawa0f4f2f32010-09-03 15:40:17 -0700216 @Override
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800217 public void onSharedPreferenceChanged(SharedPreferences preferences, String key) {
218 if (key.equals(KEY_DATE_FORMAT)) {
Amith Yamasani1bb6db52010-09-17 13:34:47 -0700219 String format = preferences.getString(key,
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800220 getResources().getString(R.string.default_date_format));
Amith Yamasani1bb6db52010-09-17 13:34:47 -0700221 Settings.System.putString(getContentResolver(),
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800222 Settings.System.DATE_FORMAT, format);
Daisuke Miyakawa29e812f2010-09-13 16:50:57 -0700223 updateTimeAndDateDisplay(getActivity());
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800224 } else if (key.equals(KEY_AUTO_TIME)) {
225 boolean autoEnabled = preferences.getBoolean(key, true);
Christopher Tatef1c08582012-09-12 14:25:46 -0700226 Settings.Global.putInt(getContentResolver(), Settings.Global.AUTO_TIME,
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800227 autoEnabled ? 1 : 0);
228 mTimePref.setEnabled(!autoEnabled);
229 mDatePref.setEnabled(!autoEnabled);
Amith Yamasani1bb6db52010-09-17 13:34:47 -0700230 } else if (key.equals(KEY_AUTO_TIME_ZONE)) {
231 boolean autoZoneEnabled = preferences.getBoolean(key, true);
Christopher Tatef1c08582012-09-12 14:25:46 -0700232 Settings.Global.putInt(
233 getContentResolver(), Settings.Global.AUTO_TIME_ZONE, autoZoneEnabled ? 1 : 0);
Amith Yamasani1bb6db52010-09-17 13:34:47 -0700234 mTimeZone.setEnabled(!autoZoneEnabled);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800235 }
236 }
237
238 @Override
239 public Dialog onCreateDialog(int id) {
Elliott Hughesb85d48f2013-06-24 16:11:19 -0700240 final Calendar calendar = Calendar.getInstance();
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800241 switch (id) {
Elliott Hughesb85d48f2013-06-24 16:11:19 -0700242 case DIALOG_DATEPICKER:
243 DatePickerDialog d = new DatePickerDialog(
244 getActivity(),
245 this,
246 calendar.get(Calendar.YEAR),
247 calendar.get(Calendar.MONTH),
248 calendar.get(Calendar.DAY_OF_MONTH));
249 configureDatePicker(d.getDatePicker());
250 return d;
251 case DIALOG_TIMEPICKER:
252 return new TimePickerDialog(
Amith Yamasanid7993472010-08-18 13:59:28 -0700253 getActivity(),
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800254 this,
255 calendar.get(Calendar.HOUR_OF_DAY),
256 calendar.get(Calendar.MINUTE),
Amith Yamasanid7993472010-08-18 13:59:28 -0700257 DateFormat.is24HourFormat(getActivity()));
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800258 default:
Elliott Hughesb85d48f2013-06-24 16:11:19 -0700259 throw new IllegalArgumentException();
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800260 }
Elliott Hughesb85d48f2013-06-24 16:11:19 -0700261 }
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800262
Elliott Hughesb85d48f2013-06-24 16:11:19 -0700263 static void configureDatePicker(DatePicker datePicker) {
264 // The system clock can't represent dates outside this range.
265 Calendar t = Calendar.getInstance();
266 t.clear();
267 t.set(1970, Calendar.JANUARY, 1);
268 datePicker.setMinDate(t.getTimeInMillis());
269 t.clear();
270 t.set(2037, Calendar.DECEMBER, 31);
271 datePicker.setMaxDate(t.getTimeInMillis());
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800272 }
273
Amith Yamasanid7993472010-08-18 13:59:28 -0700274 /*
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800275 @Override
276 public void onPrepareDialog(int id, Dialog d) {
277 switch (id) {
278 case DIALOG_DATEPICKER: {
279 DatePickerDialog datePicker = (DatePickerDialog)d;
280 final Calendar calendar = Calendar.getInstance();
281 datePicker.updateDate(
282 calendar.get(Calendar.YEAR),
283 calendar.get(Calendar.MONTH),
284 calendar.get(Calendar.DAY_OF_MONTH));
285 break;
286 }
287 case DIALOG_TIMEPICKER: {
288 TimePickerDialog timePicker = (TimePickerDialog)d;
289 final Calendar calendar = Calendar.getInstance();
290 timePicker.updateTime(
291 calendar.get(Calendar.HOUR_OF_DAY),
292 calendar.get(Calendar.MINUTE));
293 break;
294 }
295 default:
296 break;
297 }
298 }
Amith Yamasanid7993472010-08-18 13:59:28 -0700299 */
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800300 @Override
301 public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
302 if (preference == mDatePref) {
303 showDialog(DIALOG_DATEPICKER);
304 } else if (preference == mTimePref) {
305 // The 24-hour mode may have changed, so recreate the dialog
306 removeDialog(DIALOG_TIMEPICKER);
307 showDialog(DIALOG_TIMEPICKER);
308 } else if (preference == mTime24Pref) {
Narayan Kamath0a2bc1c2014-03-11 13:05:37 +0000309 final boolean is24Hour = ((CheckBoxPreference)mTime24Pref).isChecked();
310 set24Hour(is24Hour);
Daisuke Miyakawa29e812f2010-09-13 16:50:57 -0700311 updateTimeAndDateDisplay(getActivity());
Narayan Kamath0a2bc1c2014-03-11 13:05:37 +0000312 timeUpdated(is24Hour);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800313 }
Daisuke Miyakawa0f4f2f32010-09-03 15:40:17 -0700314 return super.onPreferenceTreeClick(preferenceScreen, preference);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800315 }
Amith Yamasani1bb6db52010-09-17 13:34:47 -0700316
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800317 @Override
Amith Yamasanid7993472010-08-18 13:59:28 -0700318 public void onActivityResult(int requestCode, int resultCode,
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800319 Intent data) {
Daisuke Miyakawa29e812f2010-09-13 16:50:57 -0700320 updateTimeAndDateDisplay(getActivity());
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800321 }
Amith Yamasani1bb6db52010-09-17 13:34:47 -0700322
Narayan Kamath0a2bc1c2014-03-11 13:05:37 +0000323 private void timeUpdated(boolean is24Hour) {
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800324 Intent timeChanged = new Intent(Intent.ACTION_TIME_CHANGED);
Narayan Kamath0a2bc1c2014-03-11 13:05:37 +0000325 timeChanged.putExtra(Intent.EXTRA_TIME_PREF_24_HOUR_FORMAT, is24Hour);
Amith Yamasanid7993472010-08-18 13:59:28 -0700326 getActivity().sendBroadcast(timeChanged);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800327 }
Amith Yamasani1bb6db52010-09-17 13:34:47 -0700328
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800329 /* Get & Set values from the system settings */
Amith Yamasani1bb6db52010-09-17 13:34:47 -0700330
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800331 private boolean is24Hour() {
Amith Yamasanid7993472010-08-18 13:59:28 -0700332 return DateFormat.is24HourFormat(getActivity());
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800333 }
Amith Yamasani1bb6db52010-09-17 13:34:47 -0700334
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800335 private void set24Hour(boolean is24Hour) {
336 Settings.System.putString(getContentResolver(),
337 Settings.System.TIME_12_24,
338 is24Hour? HOURS_24 : HOURS_12);
339 }
Amith Yamasani1bb6db52010-09-17 13:34:47 -0700340
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800341 private String getDateFormat() {
Amith Yamasani1bb6db52010-09-17 13:34:47 -0700342 return Settings.System.getString(getContentResolver(),
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800343 Settings.System.DATE_FORMAT);
344 }
Amith Yamasani1bb6db52010-09-17 13:34:47 -0700345
346 private boolean getAutoState(String name) {
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800347 try {
Christopher Tatef1c08582012-09-12 14:25:46 -0700348 return Settings.Global.getInt(getContentResolver(), name) > 0;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800349 } catch (SettingNotFoundException snfe) {
Amith Yamasaniea071652010-11-08 14:28:05 -0800350 return false;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800351 }
352 }
353
Amith Yamasani5f050102012-11-01 15:36:29 -0700354 /* package */ static void setDate(Context context, int year, int month, int day) {
Daisuke Miyakawa71cc5482010-09-09 11:51:16 -0700355 Calendar c = Calendar.getInstance();
356
357 c.set(Calendar.YEAR, year);
358 c.set(Calendar.MONTH, month);
359 c.set(Calendar.DAY_OF_MONTH, day);
360 long when = c.getTimeInMillis();
361
362 if (when / 1000 < Integer.MAX_VALUE) {
Amith Yamasani5f050102012-11-01 15:36:29 -0700363 ((AlarmManager) context.getSystemService(Context.ALARM_SERVICE)).setTime(when);
Daisuke Miyakawa71cc5482010-09-09 11:51:16 -0700364 }
365 }
366
Amith Yamasani5f050102012-11-01 15:36:29 -0700367 /* package */ static void setTime(Context context, int hourOfDay, int minute) {
Daisuke Miyakawa71cc5482010-09-09 11:51:16 -0700368 Calendar c = Calendar.getInstance();
369
370 c.set(Calendar.HOUR_OF_DAY, hourOfDay);
371 c.set(Calendar.MINUTE, minute);
Gilles Debunne33ff1152011-07-28 14:16:51 -0700372 c.set(Calendar.SECOND, 0);
373 c.set(Calendar.MILLISECOND, 0);
Daisuke Miyakawa71cc5482010-09-09 11:51:16 -0700374 long when = c.getTimeInMillis();
375
376 if (when / 1000 < Integer.MAX_VALUE) {
Amith Yamasani5f050102012-11-01 15:36:29 -0700377 ((AlarmManager) context.getSystemService(Context.ALARM_SERVICE)).setTime(when);
Daisuke Miyakawa71cc5482010-09-09 11:51:16 -0700378 }
379 }
380
Elliott Hughes04487592013-09-18 15:04:25 -0700381 public static String getTimeZoneText(TimeZone tz, boolean includeName) {
382 Date now = new Date();
383
384 // Use SimpleDateFormat to format the GMT+00:00 string.
385 SimpleDateFormat gmtFormatter = new SimpleDateFormat("ZZZZ");
386 gmtFormatter.setTimeZone(tz);
387 String gmtString = gmtFormatter.format(now);
388
389 // Ensure that the "GMT+" stays with the "00:00" even if the digits are RTL.
390 BidiFormatter bidiFormatter = BidiFormatter.getInstance();
391 Locale l = Locale.getDefault();
392 boolean isRtl = TextUtils.getLayoutDirectionFromLocale(l) == View.LAYOUT_DIRECTION_RTL;
393 gmtString = bidiFormatter.unicodeWrap(gmtString,
394 isRtl ? TextDirectionHeuristics.RTL : TextDirectionHeuristics.LTR);
395
396 if (!includeName) {
397 return gmtString;
398 }
399
400 // Optionally append the time zone name.
401 SimpleDateFormat zoneNameFormatter = new SimpleDateFormat("zzzz");
402 zoneNameFormatter.setTimeZone(tz);
403 String zoneNameString = zoneNameFormatter.format(now);
404
405 // We don't use punctuation here to avoid having to worry about localizing that too!
406 return gmtString + " " + zoneNameString;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800407 }
Amith Yamasani1bb6db52010-09-17 13:34:47 -0700408
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800409 private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
410 @Override
411 public void onReceive(Context context, Intent intent) {
Daisuke Miyakawa29e812f2010-09-13 16:50:57 -0700412 final Activity activity = getActivity();
413 if (activity != null) {
414 updateTimeAndDateDisplay(activity);
415 }
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800416 }
417 };
418}