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