DateTimeSettings.java revision 9c32468cd59cbe5b8e7692235a67034c936b4788
1afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/* 2afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 3afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * 4afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * you may not use this file except in compliance with the License. 6afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * You may obtain a copy of the License at 7afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * 8afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * 10afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * See the License for the specific language governing permissions and 14afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * limitations under the License. 15afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 16afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 17afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectpackage com.android.settings; 18afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 1929e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawaimport android.app.Activity; 205f050104386b96d8c99eb3ff0f5088814709348bAmith Yamasaniimport android.app.AlarmManager; 21afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.app.DatePickerDialog; 22d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasaniimport android.app.Dialog; 23afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.app.TimePickerDialog; 24550015e47656dad997973c89a30cffe56db9cdbdTony Mantlerimport android.app.admin.DevicePolicyManager; 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.provider.Settings; 33afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.provider.Settings.SettingNotFoundException; 3439b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.support.v14.preference.SwitchPreference; 3539b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.support.v7.preference.Preference; 36afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.text.format.DateFormat; 37afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.DatePicker; 38afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.TimePicker; 39550015e47656dad997973c89a30cffe56db9cdbdTony Mantler 408a963babe2e36b7a41f77b8d2598c97658196e58Chris Wrenimport com.android.internal.logging.MetricsLogger; 419d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monkimport com.android.settings.dashboard.SummaryLoader; 429c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shankaimport com.android.settingslib.RestrictedLockUtils; 439c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shankaimport com.android.settingslib.RestrictedSwitchPreference; 44550015e47656dad997973c89a30cffe56db9cdbdTony Mantlerimport com.android.settingslib.datetime.ZoneGetter; 458a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren 46afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.Calendar; 47afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.Date; 48afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 499c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shankaimport static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; 509c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka 510f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawapublic class DateTimeSettings extends SettingsPreferenceFragment 52afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project implements OnSharedPreferenceChangeListener, 5371cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa TimePickerDialog.OnTimeSetListener, DatePickerDialog.OnDateSetListener { 54afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 55afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String HOURS_12 = "12"; 56afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String HOURS_24 = "24"; 571bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani 5871cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa // Used for showing the current date format, which looks like "12/31/2010", "2010/12/13", etc. 5971cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa // The date value is dummy (independent of actual date). 60afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private Calendar mDummyDate; 6171cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa 62afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String KEY_AUTO_TIME = "auto_time"; 631bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani private static final String KEY_AUTO_TIME_ZONE = "auto_zone"; 64afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 65afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int DIALOG_DATEPICKER = 0; 66afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int DIALOG_TIMEPICKER = 1; 671bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani 687f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng // have we been launched from the setup wizard? 697f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng protected static final String EXTRA_IS_FIRST_RUN = "firstRun"; 707f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng 719c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka private RestrictedSwitchPreference mAutoTimePref; 72afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private Preference mTimePref; 73afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private Preference mTime24Pref; 74b98c40649eb7a5ab4b24d3ed74ff46ce7cb672deFabrice Di Meglio private SwitchPreference mAutoTimeZonePref; 75afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private Preference mTimeZone; 76afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private Preference mDatePref; 771bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani 78afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 798a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren protected int getMetricsCategory() { 808a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren return MetricsLogger.DATE_TIME; 818a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren } 828a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren 838a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren @Override 84d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani public void onCreate(Bundle icicle) { 85afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super.onCreate(icicle); 861bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani 87afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project addPreferencesFromResource(R.xml.date_time_prefs); 881bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani 891bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani initUI(); 90afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 911bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani 92afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void initUI() { 93f1c085899dd3d9142392b9ab7841c0e9502526a3Christopher Tate boolean autoTimeEnabled = getAutoState(Settings.Global.AUTO_TIME); 94f1c085899dd3d9142392b9ab7841c0e9502526a3Christopher Tate boolean autoTimeZoneEnabled = getAutoState(Settings.Global.AUTO_TIME_ZONE); 95afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 969c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka mAutoTimePref = (RestrictedSwitchPreference) findPreference(KEY_AUTO_TIME); 979c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka EnforcedAdmin admin = RestrictedLockUtils.checkIfAutoTimeRequired(getActivity()); 989c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka mAutoTimePref.setDisabledByAdmin(admin); 99fe4eff6a6584d760584c4e438f15bcf774c6fbf0Sander Alewijnse 1007f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng Intent intent = getActivity().getIntent(); 1017f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng boolean isFirstRun = intent.getBooleanExtra(EXTRA_IS_FIRST_RUN, false); 1027f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng 103afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mDummyDate = Calendar.getInstance(); 1041bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani 1059c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka // If device admin requires auto time device policy manager will set 1069c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka // Settings.Global.AUTO_TIME to true. Note that this app listens to that change. 1071bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani mAutoTimePref.setChecked(autoTimeEnabled); 108b98c40649eb7a5ab4b24d3ed74ff46ce7cb672deFabrice Di Meglio mAutoTimeZonePref = (SwitchPreference) findPreference(KEY_AUTO_TIME_ZONE); 1097f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng // Override auto-timezone if it's a wifi-only device or if we're still in setup wizard. 1107f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng // TODO: Remove the wifiOnly test when auto-timezone is implemented based on wifi-location. 1118af88fb8387259e51615709b2d1ea0260f7057fdRobert Greenwalt if (Utils.isWifiOnly(getActivity()) || isFirstRun) { 112c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani getPreferenceScreen().removePreference(mAutoTimeZonePref); 113c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani autoTimeZoneEnabled = false; 114c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani } 115ea07165ef26b57dde4b45eee24200cdfaa5945e7Amith Yamasani mAutoTimeZonePref.setChecked(autoTimeZoneEnabled); 116ea07165ef26b57dde4b45eee24200cdfaa5945e7Amith Yamasani 117afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mTimePref = findPreference("time"); 118afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mTime24Pref = findPreference("24 hour"); 119afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mTimeZone = findPreference("timezone"); 120afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mDatePref = findPreference("date"); 1217f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng if (isFirstRun) { 1227f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng getPreferenceScreen().removePreference(mTime24Pref); 1237f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng } 1241bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani 1251bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani mTimePref.setEnabled(!autoTimeEnabled); 1261bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani mDatePref.setEnabled(!autoTimeEnabled); 1271bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani mTimeZone.setEnabled(!autoTimeZoneEnabled); 128afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 129afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 130afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 131d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani public void onResume() { 132afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super.onResume(); 1331bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani 1341bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani getPreferenceScreen().getSharedPreferences() 1351bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani .registerOnSharedPreferenceChangeListener(this); 136afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 137b98c40649eb7a5ab4b24d3ed74ff46ce7cb672deFabrice Di Meglio ((SwitchPreference)mTime24Pref).setChecked(is24Hour()); 138afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 139afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Register for time ticks and other reasons for time change 140afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project IntentFilter filter = new IntentFilter(); 141afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project filter.addAction(Intent.ACTION_TIME_TICK); 142afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project filter.addAction(Intent.ACTION_TIME_CHANGED); 143afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project filter.addAction(Intent.ACTION_TIMEZONE_CHANGED); 144d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani getActivity().registerReceiver(mIntentReceiver, filter, null, null); 14529e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa 14629e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa updateTimeAndDateDisplay(getActivity()); 147afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 148afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 1491bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani @Override 150d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani public void onPause() { 151afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super.onPause(); 152d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani getActivity().unregisterReceiver(mIntentReceiver); 1531bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani getPreferenceScreen().getSharedPreferences() 1541bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani .unregisterOnSharedPreferenceChangeListener(this); 155afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 1561bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani 1577f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng public void updateTimeAndDateDisplay(Context context) { 15871cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa final Calendar now = Calendar.getInstance(); 159151b0e117443d874c475d25f7144bba1e1b438efKenny Root mDummyDate.setTimeZone(now.getTimeZone()); 16082723df002a27a79545dd18a52333973b056b720Elliott Hughes // We use December 31st because it's unambiguous when demonstrating the date format. 16182723df002a27a79545dd18a52333973b056b720Elliott Hughes // We use 13:00 so we can demonstrate the 12/24 hour options. 162151b0e117443d874c475d25f7144bba1e1b438efKenny Root mDummyDate.set(now.get(Calendar.YEAR), 11, 31, 13, 0, 0); 163afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Date dummyDate = mDummyDate.getTime(); 16430cc30864b2b41d73e187ba9a0f75ea1fa64b538Elliott Hughes mDatePref.setSummary(DateFormat.getLongDateFormat(context).format(now.getTime())); 16571cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa mTimePref.setSummary(DateFormat.getTimeFormat(getActivity()).format(now.getTime())); 166b9864427471ac206d08836a12a8b2f230c883d9eNeil Fuller mTimeZone.setSummary(ZoneGetter.getTimeZoneOffsetAndName(now.getTimeZone(), now.getTime())); 16782723df002a27a79545dd18a52333973b056b720Elliott Hughes mTime24Pref.setSummary(DateFormat.getTimeFormat(getActivity()).format(dummyDate)); 168afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 169afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 1700f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa @Override 171afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void onDateSet(DatePicker view, int year, int month, int day) { 17229e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa final Activity activity = getActivity(); 17329e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa if (activity != null) { 1745f050104386b96d8c99eb3ff0f5088814709348bAmith Yamasani setDate(activity, year, month, day); 17529e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa updateTimeAndDateDisplay(activity); 17629e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa } 177afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 178afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 1790f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa @Override 180afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void onTimeSet(TimePicker view, int hourOfDay, int minute) { 18129e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa final Activity activity = getActivity(); 18229e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa if (activity != null) { 1835f050104386b96d8c99eb3ff0f5088814709348bAmith Yamasani setTime(activity, hourOfDay, minute); 18429e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa updateTimeAndDateDisplay(activity); 18529e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa } 18671cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa 18772ed6feab24308a0acd1fa2135afa3476759cf39The Android Open Source Project // We don't need to call timeUpdated() here because the TIME_CHANGED 18872ed6feab24308a0acd1fa2135afa3476759cf39The Android Open Source Project // broadcast is sent by the AlarmManager as a side effect of setting the 18972ed6feab24308a0acd1fa2135afa3476759cf39The Android Open Source Project // SystemClock time. 190afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 191afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 1920f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa @Override 193afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void onSharedPreferenceChanged(SharedPreferences preferences, String key) { 19430cc30864b2b41d73e187ba9a0f75ea1fa64b538Elliott Hughes if (key.equals(KEY_AUTO_TIME)) { 195afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project boolean autoEnabled = preferences.getBoolean(key, true); 196f1c085899dd3d9142392b9ab7841c0e9502526a3Christopher Tate Settings.Global.putInt(getContentResolver(), Settings.Global.AUTO_TIME, 197afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project autoEnabled ? 1 : 0); 198afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mTimePref.setEnabled(!autoEnabled); 199afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mDatePref.setEnabled(!autoEnabled); 2001bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani } else if (key.equals(KEY_AUTO_TIME_ZONE)) { 2011bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani boolean autoZoneEnabled = preferences.getBoolean(key, true); 202f1c085899dd3d9142392b9ab7841c0e9502526a3Christopher Tate Settings.Global.putInt( 203f1c085899dd3d9142392b9ab7841c0e9502526a3Christopher Tate getContentResolver(), Settings.Global.AUTO_TIME_ZONE, autoZoneEnabled ? 1 : 0); 2041bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani mTimeZone.setEnabled(!autoZoneEnabled); 205afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 206afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 207afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 208afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 209afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public Dialog onCreateDialog(int id) { 210b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes final Calendar calendar = Calendar.getInstance(); 211afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project switch (id) { 212b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes case DIALOG_DATEPICKER: 213b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes DatePickerDialog d = new DatePickerDialog( 214b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes getActivity(), 215b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes this, 216b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes calendar.get(Calendar.YEAR), 217b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes calendar.get(Calendar.MONTH), 218b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes calendar.get(Calendar.DAY_OF_MONTH)); 219b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes configureDatePicker(d.getDatePicker()); 220b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes return d; 221b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes case DIALOG_TIMEPICKER: 222b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes return new TimePickerDialog( 223d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani getActivity(), 224afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project this, 225afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project calendar.get(Calendar.HOUR_OF_DAY), 226afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project calendar.get(Calendar.MINUTE), 227d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani DateFormat.is24HourFormat(getActivity())); 228afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project default: 229b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes throw new IllegalArgumentException(); 230afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 231b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes } 232afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 233b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes static void configureDatePicker(DatePicker datePicker) { 234b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes // The system clock can't represent dates outside this range. 235b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes Calendar t = Calendar.getInstance(); 236b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes t.clear(); 237b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes t.set(1970, Calendar.JANUARY, 1); 238b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes datePicker.setMinDate(t.getTimeInMillis()); 239b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes t.clear(); 240b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes t.set(2037, Calendar.DECEMBER, 31); 241b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes datePicker.setMaxDate(t.getTimeInMillis()); 242afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 243afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 244d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani /* 245afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 246afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void onPrepareDialog(int id, Dialog d) { 247afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project switch (id) { 248afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project case DIALOG_DATEPICKER: { 249afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project DatePickerDialog datePicker = (DatePickerDialog)d; 250afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project final Calendar calendar = Calendar.getInstance(); 251afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project datePicker.updateDate( 252afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project calendar.get(Calendar.YEAR), 253afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project calendar.get(Calendar.MONTH), 254afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project calendar.get(Calendar.DAY_OF_MONTH)); 255afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project break; 256afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 257afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project case DIALOG_TIMEPICKER: { 258afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project TimePickerDialog timePicker = (TimePickerDialog)d; 259afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project final Calendar calendar = Calendar.getInstance(); 260afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project timePicker.updateTime( 261afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project calendar.get(Calendar.HOUR_OF_DAY), 262afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project calendar.get(Calendar.MINUTE)); 263afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project break; 264afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 265afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project default: 266afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project break; 267afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 268afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 269d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani */ 270afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 27139b467482d1bf256a111c757e9b7621c6f523271Jason Monk public boolean onPreferenceTreeClick(Preference preference) { 272afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (preference == mDatePref) { 273afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project showDialog(DIALOG_DATEPICKER); 274afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else if (preference == mTimePref) { 275afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // The 24-hour mode may have changed, so recreate the dialog 276afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project removeDialog(DIALOG_TIMEPICKER); 277afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project showDialog(DIALOG_TIMEPICKER); 278afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else if (preference == mTime24Pref) { 279b98c40649eb7a5ab4b24d3ed74ff46ce7cb672deFabrice Di Meglio final boolean is24Hour = ((SwitchPreference)mTime24Pref).isChecked(); 2800a2bc1cc760143e91a7a7cc3f5182e50c0009fcdNarayan Kamath set24Hour(is24Hour); 28129e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa updateTimeAndDateDisplay(getActivity()); 2820a2bc1cc760143e91a7a7cc3f5182e50c0009fcdNarayan Kamath timeUpdated(is24Hour); 283afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 28439b467482d1bf256a111c757e9b7621c6f523271Jason Monk return super.onPreferenceTreeClick(preference); 285afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 2861bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani 287afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 288d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani public void onActivityResult(int requestCode, int resultCode, 289afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Intent data) { 29029e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa updateTimeAndDateDisplay(getActivity()); 291afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 2921bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani 2930a2bc1cc760143e91a7a7cc3f5182e50c0009fcdNarayan Kamath private void timeUpdated(boolean is24Hour) { 294afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Intent timeChanged = new Intent(Intent.ACTION_TIME_CHANGED); 2950a2bc1cc760143e91a7a7cc3f5182e50c0009fcdNarayan Kamath timeChanged.putExtra(Intent.EXTRA_TIME_PREF_24_HOUR_FORMAT, is24Hour); 296d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani getActivity().sendBroadcast(timeChanged); 297afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 2981bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani 299afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /* Get & Set values from the system settings */ 3001bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani 301afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private boolean is24Hour() { 302d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani return DateFormat.is24HourFormat(getActivity()); 303afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 3041bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani 305afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void set24Hour(boolean is24Hour) { 306afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Settings.System.putString(getContentResolver(), 307afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Settings.System.TIME_12_24, 308afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project is24Hour? HOURS_24 : HOURS_12); 309afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 3101bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani 3111bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani private boolean getAutoState(String name) { 312afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project try { 313f1c085899dd3d9142392b9ab7841c0e9502526a3Christopher Tate return Settings.Global.getInt(getContentResolver(), name) > 0; 314afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } catch (SettingNotFoundException snfe) { 315ea07165ef26b57dde4b45eee24200cdfaa5945e7Amith Yamasani return false; 316afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 317afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 318afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 3195f050104386b96d8c99eb3ff0f5088814709348bAmith Yamasani /* package */ static void setDate(Context context, int year, int month, int day) { 32071cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa Calendar c = Calendar.getInstance(); 32171cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa 32271cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa c.set(Calendar.YEAR, year); 32371cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa c.set(Calendar.MONTH, month); 32471cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa c.set(Calendar.DAY_OF_MONTH, day); 32571cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa long when = c.getTimeInMillis(); 32671cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa 32771cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa if (when / 1000 < Integer.MAX_VALUE) { 3285f050104386b96d8c99eb3ff0f5088814709348bAmith Yamasani ((AlarmManager) context.getSystemService(Context.ALARM_SERVICE)).setTime(when); 329188ca778702938d87313592175a3c2ff86bd3218Eric Fischer } 33071cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa } 33171cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa 3325f050104386b96d8c99eb3ff0f5088814709348bAmith Yamasani /* package */ static void setTime(Context context, int hourOfDay, int minute) { 33371cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa Calendar c = Calendar.getInstance(); 334188ca778702938d87313592175a3c2ff86bd3218Eric Fischer 33571cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa c.set(Calendar.HOUR_OF_DAY, hourOfDay); 33671cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa c.set(Calendar.MINUTE, minute); 33733ff11599553254683bbf4a5c75d5dee4251fd74Gilles Debunne c.set(Calendar.SECOND, 0); 33833ff11599553254683bbf4a5c75d5dee4251fd74Gilles Debunne c.set(Calendar.MILLISECOND, 0); 33971cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa long when = c.getTimeInMillis(); 34071cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa 34171cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa if (when / 1000 < Integer.MAX_VALUE) { 3425f050104386b96d8c99eb3ff0f5088814709348bAmith Yamasani ((AlarmManager) context.getSystemService(Context.ALARM_SERVICE)).setTime(when); 34371cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa } 344afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 34571cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa 346afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() { 347afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 348afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void onReceive(Context context, Intent intent) { 34929e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa final Activity activity = getActivity(); 35029e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa if (activity != null) { 35129e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa updateTimeAndDateDisplay(activity); 35229e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa } 353afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 354afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project }; 3559d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk 3569d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk private static class SummaryProvider implements SummaryLoader.SummaryProvider { 3579d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk 3589d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk private final Context mContext; 3599d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk private final SummaryLoader mSummaryLoader; 3609d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk 3619d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk public SummaryProvider(Context context, SummaryLoader summaryLoader) { 3629d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk mContext = context; 3639d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk mSummaryLoader = summaryLoader; 3649d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk } 3659d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk 3669d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk @Override 3679d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk public void setListening(boolean listening) { 3689d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk if (listening) { 3699d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk final Calendar now = Calendar.getInstance(); 3709d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk mSummaryLoader.setSummary(this, ZoneGetter.getTimeZoneOffsetAndName( 3719d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk now.getTimeZone(), now.getTime())); 3729d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk } 3739d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk } 3749d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk } 3759d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk 3769d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk public static final SummaryLoader.SummaryProviderFactory SUMMARY_PROVIDER_FACTORY 3779d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk = new SummaryLoader.SummaryProviderFactory() { 3789d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk @Override 3799d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk public SummaryLoader.SummaryProvider createSummaryProvider(Activity activity, 3809d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk SummaryLoader summaryLoader) { 3819d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk return new SummaryProvider(activity, summaryLoader); 3829d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk } 3839d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk }; 384afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project} 385