The Android Open Source Project | 146de36 | 2009-03-03 19:32:18 -0800 | [diff] [blame] | 1 | /* |
| 2 | * Copyright (C) 2007 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 | |
| 17 | package com.android.calendar; |
| 18 | |
Daisuke Miyakawa | 4b441bd | 2010-09-16 14:55:36 -0700 | [diff] [blame] | 19 | import android.app.Activity; |
James Kung | 974343a | 2013-04-03 16:12:38 -0700 | [diff] [blame] | 20 | import android.app.FragmentManager; |
Michael Chan | 7412b62 | 2011-01-09 13:06:52 -0800 | [diff] [blame] | 21 | import android.app.backup.BackupManager; |
Jeff Hamilton | a17725e | 2010-02-16 18:28:16 -0600 | [diff] [blame] | 22 | import android.content.Context; |
RoboErik | 42dabd1 | 2011-07-12 18:01:03 -0700 | [diff] [blame] | 23 | import android.content.Intent; |
The Android Open Source Project | 146de36 | 2009-03-03 19:32:18 -0800 | [diff] [blame] | 24 | import android.content.SharedPreferences; |
Michael Chan | 1851ecb | 2013-04-18 18:36:24 -0700 | [diff] [blame] | 25 | import android.content.SharedPreferences.Editor; |
The Android Open Source Project | 146de36 | 2009-03-03 19:32:18 -0800 | [diff] [blame] | 26 | import android.content.SharedPreferences.OnSharedPreferenceChangeListener; |
Michael Chan | 0b674be | 2012-11-20 07:16:14 -0800 | [diff] [blame] | 27 | import android.media.Ringtone; |
| 28 | import android.media.RingtoneManager; |
| 29 | import android.net.Uri; |
The Android Open Source Project | 146de36 | 2009-03-03 19:32:18 -0800 | [diff] [blame] | 30 | import android.os.Bundle; |
Michael Chan | 7412b62 | 2011-01-09 13:06:52 -0800 | [diff] [blame] | 31 | import android.os.Vibrator; |
Mason Tang | cca9ecb | 2010-07-16 15:07:47 -0700 | [diff] [blame] | 32 | import android.preference.CheckBoxPreference; |
The Android Open Source Project | 146de36 | 2009-03-03 19:32:18 -0800 | [diff] [blame] | 33 | import android.preference.ListPreference; |
Mason Tang | 3a0e67b | 2010-08-23 16:59:30 -0700 | [diff] [blame] | 34 | import android.preference.Preference; |
Erik | 6ea265f | 2010-09-08 15:14:36 -0700 | [diff] [blame] | 35 | import android.preference.Preference.OnPreferenceChangeListener; |
James Kung | 974343a | 2013-04-03 16:12:38 -0700 | [diff] [blame] | 36 | import android.preference.Preference.OnPreferenceClickListener; |
Michael Chan | 7412b62 | 2011-01-09 13:06:52 -0800 | [diff] [blame] | 37 | import android.preference.PreferenceCategory; |
Daisuke Miyakawa | 4b441bd | 2010-09-16 14:55:36 -0700 | [diff] [blame] | 38 | import android.preference.PreferenceFragment; |
Jeff Hamilton | a17725e | 2010-02-16 18:28:16 -0600 | [diff] [blame] | 39 | import android.preference.PreferenceManager; |
The Android Open Source Project | 146de36 | 2009-03-03 19:32:18 -0800 | [diff] [blame] | 40 | import android.preference.PreferenceScreen; |
The Android Open Source Project | 146de36 | 2009-03-03 19:32:18 -0800 | [diff] [blame] | 41 | import android.preference.RingtonePreference; |
RoboErik | 42dabd1 | 2011-07-12 18:01:03 -0700 | [diff] [blame] | 42 | import android.provider.CalendarContract; |
RoboErik | a7c0390 | 2011-06-14 11:06:44 -0700 | [diff] [blame] | 43 | import android.provider.CalendarContract.CalendarCache; |
Mason Tang | 3a0e67b | 2010-08-23 16:59:30 -0700 | [diff] [blame] | 44 | import android.provider.SearchRecentSuggestions; |
Erik | 3986195 | 2010-12-10 13:25:24 -0800 | [diff] [blame] | 45 | import android.text.TextUtils; |
Michael Chan | 305c642 | 2013-04-12 18:28:27 -0700 | [diff] [blame] | 46 | import android.text.format.Time; |
Mason Tang | 3a0e67b | 2010-08-23 16:59:30 -0700 | [diff] [blame] | 47 | import android.widget.Toast; |
The Android Open Source Project | 146de36 | 2009-03-03 19:32:18 -0800 | [diff] [blame] | 48 | |
Michael Chan | 559cb86 | 2012-05-12 07:42:13 -0700 | [diff] [blame] | 49 | import com.android.calendar.alerts.AlertReceiver; |
James Kung | 974343a | 2013-04-03 16:12:38 -0700 | [diff] [blame] | 50 | import com.android.timezonepicker.TimeZoneInfo; |
| 51 | import com.android.timezonepicker.TimeZonePickerDialog; |
| 52 | import com.android.timezonepicker.TimeZonePickerDialog.OnTimeZoneSetListener; |
| 53 | import com.android.timezonepicker.TimeZonePickerUtils; |
Michael Chan | 559cb86 | 2012-05-12 07:42:13 -0700 | [diff] [blame] | 54 | |
Daisuke Miyakawa | 4b441bd | 2010-09-16 14:55:36 -0700 | [diff] [blame] | 55 | public class GeneralPreferences extends PreferenceFragment implements |
James Kung | 974343a | 2013-04-03 16:12:38 -0700 | [diff] [blame] | 56 | OnSharedPreferenceChangeListener, OnPreferenceChangeListener, OnTimeZoneSetListener { |
Jeff Hamilton | a17725e | 2010-02-16 18:28:16 -0600 | [diff] [blame] | 57 | // The name of the shared preferences file. This name must be maintained for historical |
| 58 | // reasons, as it's what PreferenceManager assigned the first time the file was created. |
Garth Bushell | bdadecb | 2010-10-06 22:35:31 +0100 | [diff] [blame] | 59 | static final String SHARED_PREFS_NAME = "com.android.calendar_preferences"; |
Michael Chan | 1851ecb | 2013-04-18 18:36:24 -0700 | [diff] [blame] | 60 | static final String SHARED_PREFS_NAME_NO_BACKUP = "com.android.calendar_preferences_no_backup"; |
Jeff Hamilton | a17725e | 2010-02-16 18:28:16 -0600 | [diff] [blame] | 61 | |
James Kung | 974343a | 2013-04-03 16:12:38 -0700 | [diff] [blame] | 62 | private static final String FRAG_TAG_TIME_ZONE_PICKER = "TimeZonePicker"; |
| 63 | |
The Android Open Source Project | 146de36 | 2009-03-03 19:32:18 -0800 | [diff] [blame] | 64 | // Preference keys |
Mason Tang | 23e7da3 | 2010-07-27 15:24:02 -0700 | [diff] [blame] | 65 | public static final String KEY_HIDE_DECLINED = "preferences_hide_declined"; |
| 66 | public static final String KEY_WEEK_START_DAY = "preferences_week_start_day"; |
Erik | 981874e | 2010-10-05 16:52:52 -0700 | [diff] [blame] | 67 | public static final String KEY_SHOW_WEEK_NUM = "preferences_show_week_num"; |
Erik | 91b01ed | 2010-11-22 17:46:15 -0800 | [diff] [blame] | 68 | public static final String KEY_DAYS_PER_WEEK = "preferences_days_per_week"; |
RoboErik | 6c892a2 | 2011-09-08 16:54:04 -0700 | [diff] [blame] | 69 | public static final String KEY_SKIP_SETUP = "preferences_skip_setup"; |
Mason Tang | cca9ecb | 2010-07-16 15:07:47 -0700 | [diff] [blame] | 70 | |
Mason Tang | 3a0e67b | 2010-08-23 16:59:30 -0700 | [diff] [blame] | 71 | public static final String KEY_CLEAR_SEARCH_HISTORY = "preferences_clear_search_history"; |
| 72 | |
Michael Chan | 7412b62 | 2011-01-09 13:06:52 -0800 | [diff] [blame] | 73 | public static final String KEY_ALERTS_CATEGORY = "preferences_alerts_category"; |
Mason Tang | 23e7da3 | 2010-07-27 15:24:02 -0700 | [diff] [blame] | 74 | public static final String KEY_ALERTS = "preferences_alerts"; |
| 75 | public static final String KEY_ALERTS_VIBRATE = "preferences_alerts_vibrate"; |
Mason Tang | 23e7da3 | 2010-07-27 15:24:02 -0700 | [diff] [blame] | 76 | public static final String KEY_ALERTS_RINGTONE = "preferences_alerts_ringtone"; |
| 77 | public static final String KEY_ALERTS_POPUP = "preferences_alerts_popup"; |
Mason Tang | cca9ecb | 2010-07-16 15:07:47 -0700 | [diff] [blame] | 78 | |
Isaac Katzenelson | 31489e9 | 2012-05-14 11:25:58 -0700 | [diff] [blame] | 79 | public static final String KEY_SHOW_CONTROLS = "preferences_show_controls"; |
| 80 | |
Mason Tang | 23e7da3 | 2010-07-27 15:24:02 -0700 | [diff] [blame] | 81 | public static final String KEY_DEFAULT_REMINDER = "preferences_default_reminder"; |
Michael Chan | 9d8a376 | 2011-03-29 15:40:24 -0700 | [diff] [blame] | 82 | public static final int NO_REMINDER = -1; |
| 83 | public static final String NO_REMINDER_STRING = "-1"; |
| 84 | public static final int REMINDER_DEFAULT_TIME = 10; // in minutes |
Michael Chan | d6734db | 2010-07-22 00:48:08 -0700 | [diff] [blame] | 85 | |
Michael Chan | d885c1a | 2010-08-26 00:06:25 -0700 | [diff] [blame] | 86 | public static final String KEY_DEFAULT_CELL_HEIGHT = "preferences_default_cell_height"; |
Sara Ting | f565bc1 | 2012-08-28 11:27:28 -0700 | [diff] [blame] | 87 | public static final String KEY_VERSION = "preferences_version"; |
Michael Chan | d885c1a | 2010-08-26 00:06:25 -0700 | [diff] [blame] | 88 | |
Michael Chan | d6734db | 2010-07-22 00:48:08 -0700 | [diff] [blame] | 89 | /** Key to SharePreference for default view (CalendarController.ViewType) */ |
Mason Tang | 23e7da3 | 2010-07-27 15:24:02 -0700 | [diff] [blame] | 90 | public static final String KEY_START_VIEW = "preferred_startView"; |
Michael Chan | d6734db | 2010-07-22 00:48:08 -0700 | [diff] [blame] | 91 | /** |
| 92 | * Key to SharePreference for default detail view (CalendarController.ViewType) |
| 93 | * Typically used by widget |
| 94 | */ |
Mason Tang | 23e7da3 | 2010-07-27 15:24:02 -0700 | [diff] [blame] | 95 | public static final String KEY_DETAILED_VIEW = "preferred_detailedView"; |
| 96 | public static final String KEY_DEFAULT_CALENDAR = "preference_defaultCalendar"; |
Michael Chan | 45efa09 | 2010-02-03 17:44:37 -0800 | [diff] [blame] | 97 | |
Mason Tang | 8e3d430 | 2010-07-12 17:39:30 -0700 | [diff] [blame] | 98 | // These must be in sync with the array preferences_week_start_day_values |
Mason Tang | 23e7da3 | 2010-07-27 15:24:02 -0700 | [diff] [blame] | 99 | public static final String WEEK_START_DEFAULT = "-1"; |
| 100 | public static final String WEEK_START_SATURDAY = "7"; |
| 101 | public static final String WEEK_START_SUNDAY = "1"; |
| 102 | public static final String WEEK_START_MONDAY = "2"; |
Mason Tang | 8e3d430 | 2010-07-12 17:39:30 -0700 | [diff] [blame] | 103 | |
Mason Tang | cca9ecb | 2010-07-16 15:07:47 -0700 | [diff] [blame] | 104 | // These keys are kept to enable migrating users from previous versions |
| 105 | private static final String KEY_ALERTS_TYPE = "preferences_alerts_type"; |
| 106 | private static final String ALERT_TYPE_ALERTS = "0"; |
| 107 | private static final String ALERT_TYPE_STATUS_BAR = "1"; |
| 108 | private static final String ALERT_TYPE_OFF = "2"; |
Erik | 235d59c | 2010-09-02 16:29:59 -0700 | [diff] [blame] | 109 | static final String KEY_HOME_TZ_ENABLED = "preferences_home_tz_enabled"; |
| 110 | static final String KEY_HOME_TZ = "preferences_home_tz"; |
Mason Tang | 8e3d430 | 2010-07-12 17:39:30 -0700 | [diff] [blame] | 111 | |
The Android Open Source Project | 146de36 | 2009-03-03 19:32:18 -0800 | [diff] [blame] | 112 | // Default preference values |
Michael Chan | d6734db | 2010-07-22 00:48:08 -0700 | [diff] [blame] | 113 | public static final int DEFAULT_START_VIEW = CalendarController.ViewType.WEEK; |
| 114 | public static final int DEFAULT_DETAILED_VIEW = CalendarController.ViewType.DAY; |
Daisuke Miyakawa | d644b0d | 2010-10-21 15:45:12 -0700 | [diff] [blame] | 115 | public static final boolean DEFAULT_SHOW_WEEK_NUM = false; |
Sam Blitzstein | 2e760f9 | 2013-04-18 11:52:33 -0700 | [diff] [blame] | 116 | // This should match the XML file. |
| 117 | public static final String DEFAULT_RINGTONE = "content://settings/system/notification_sound"; |
Michael Chan | 45efa09 | 2010-02-03 17:44:37 -0800 | [diff] [blame] | 118 | |
Mason Tang | cca9ecb | 2010-07-16 15:07:47 -0700 | [diff] [blame] | 119 | CheckBoxPreference mAlert; |
Michael Chan | 0b674be | 2012-11-20 07:16:14 -0800 | [diff] [blame] | 120 | CheckBoxPreference mVibrate; |
The Android Open Source Project | 146de36 | 2009-03-03 19:32:18 -0800 | [diff] [blame] | 121 | RingtonePreference mRingtone; |
Mason Tang | cca9ecb | 2010-07-16 15:07:47 -0700 | [diff] [blame] | 122 | CheckBoxPreference mPopup; |
Erik | 3dc5e90 | 2010-09-07 11:33:07 -0700 | [diff] [blame] | 123 | CheckBoxPreference mUseHomeTZ; |
RoboErik | 42dabd1 | 2011-07-12 18:01:03 -0700 | [diff] [blame] | 124 | CheckBoxPreference mHideDeclined; |
James Kung | 974343a | 2013-04-03 16:12:38 -0700 | [diff] [blame] | 125 | Preference mHomeTZ; |
Sam Blitzstein | 00040c6 | 2013-04-11 10:13:47 -0700 | [diff] [blame] | 126 | TimeZonePickerUtils mTzPickerUtils; |
Erik | 8b162f1 | 2011-02-02 16:05:58 -0800 | [diff] [blame] | 127 | ListPreference mWeekStart; |
| 128 | ListPreference mDefaultReminder; |
Michael Chan | 45efa09 | 2010-02-03 17:44:37 -0800 | [diff] [blame] | 129 | |
Michael Chan | 305c642 | 2013-04-12 18:28:27 -0700 | [diff] [blame] | 130 | private String mTimeZoneId; |
| 131 | |
Jeff Hamilton | a17725e | 2010-02-16 18:28:16 -0600 | [diff] [blame] | 132 | /** Return a properly configured SharedPreferences instance */ |
| 133 | public static SharedPreferences getSharedPreferences(Context context) { |
| 134 | return context.getSharedPreferences(SHARED_PREFS_NAME, Context.MODE_PRIVATE); |
| 135 | } |
| 136 | |
| 137 | /** Set the default shared preferences in the proper context */ |
| 138 | public static void setDefaultValues(Context context) { |
| 139 | PreferenceManager.setDefaultValues(context, SHARED_PREFS_NAME, Context.MODE_PRIVATE, |
Daisuke Miyakawa | 4ad6302 | 2010-09-17 13:57:35 -0700 | [diff] [blame] | 140 | R.xml.general_preferences, false); |
Jeff Hamilton | a17725e | 2010-02-16 18:28:16 -0600 | [diff] [blame] | 141 | } |
| 142 | |
The Android Open Source Project | 146de36 | 2009-03-03 19:32:18 -0800 | [diff] [blame] | 143 | @Override |
Daisuke Miyakawa | 4b441bd | 2010-09-16 14:55:36 -0700 | [diff] [blame] | 144 | public void onCreate(Bundle icicle) { |
The Android Open Source Project | 146de36 | 2009-03-03 19:32:18 -0800 | [diff] [blame] | 145 | super.onCreate(icicle); |
Michael Chan | 45efa09 | 2010-02-03 17:44:37 -0800 | [diff] [blame] | 146 | |
Daisuke Miyakawa | 4b441bd | 2010-09-16 14:55:36 -0700 | [diff] [blame] | 147 | final Activity activity = getActivity(); |
| 148 | |
Jeff Hamilton | a17725e | 2010-02-16 18:28:16 -0600 | [diff] [blame] | 149 | // Make sure to always use the same preferences file regardless of the package name |
| 150 | // we're running under |
Daisuke Miyakawa | 4b441bd | 2010-09-16 14:55:36 -0700 | [diff] [blame] | 151 | final PreferenceManager preferenceManager = getPreferenceManager(); |
| 152 | final SharedPreferences sharedPreferences = getSharedPreferences(activity); |
Jim Shuma | d73944a | 2010-03-25 12:01:08 -0700 | [diff] [blame] | 153 | preferenceManager.setSharedPreferencesName(SHARED_PREFS_NAME); |
Michael Chan | 8bb13b8 | 2010-03-01 22:22:48 -0800 | [diff] [blame] | 154 | |
The Android Open Source Project | 146de36 | 2009-03-03 19:32:18 -0800 | [diff] [blame] | 155 | // Load the preferences from an XML resource |
Daisuke Miyakawa | 4ad6302 | 2010-09-17 13:57:35 -0700 | [diff] [blame] | 156 | addPreferencesFromResource(R.xml.general_preferences); |
Michael Chan | 45efa09 | 2010-02-03 17:44:37 -0800 | [diff] [blame] | 157 | |
Daisuke Miyakawa | 5897c00 | 2010-11-30 17:08:01 -0800 | [diff] [blame] | 158 | final PreferenceScreen preferenceScreen = getPreferenceScreen(); |
Mason Tang | cca9ecb | 2010-07-16 15:07:47 -0700 | [diff] [blame] | 159 | mAlert = (CheckBoxPreference) preferenceScreen.findPreference(KEY_ALERTS); |
Michael Chan | 0b674be | 2012-11-20 07:16:14 -0800 | [diff] [blame] | 160 | mVibrate = (CheckBoxPreference) preferenceScreen.findPreference(KEY_ALERTS_VIBRATE); |
Michael Chan | 7412b62 | 2011-01-09 13:06:52 -0800 | [diff] [blame] | 161 | Vibrator vibrator = (Vibrator) activity.getSystemService(Context.VIBRATOR_SERVICE); |
| 162 | if (vibrator == null || !vibrator.hasVibrator()) { |
| 163 | PreferenceCategory mAlertGroup = (PreferenceCategory) preferenceScreen |
| 164 | .findPreference(KEY_ALERTS_CATEGORY); |
Michael Chan | 0b674be | 2012-11-20 07:16:14 -0800 | [diff] [blame] | 165 | mAlertGroup.removePreference(mVibrate); |
Michael Chan | 7412b62 | 2011-01-09 13:06:52 -0800 | [diff] [blame] | 166 | } |
| 167 | |
The Android Open Source Project | 146de36 | 2009-03-03 19:32:18 -0800 | [diff] [blame] | 168 | mRingtone = (RingtonePreference) preferenceScreen.findPreference(KEY_ALERTS_RINGTONE); |
Michael Chan | 1851ecb | 2013-04-18 18:36:24 -0700 | [diff] [blame] | 169 | String ringToneUri = Utils.getRingTonePreference(activity); |
| 170 | |
| 171 | // Set the ringToneUri to the backup-able shared pref only so that |
| 172 | // the Ringtone dialog will open up with the correct value. |
| 173 | final Editor editor = preferenceScreen.getEditor(); |
| 174 | editor.putString(GeneralPreferences.KEY_ALERTS_RINGTONE, ringToneUri).apply(); |
| 175 | |
| 176 | String ringtoneDisplayString = getRingtoneTitleFromUri(activity, ringToneUri); |
| 177 | mRingtone.setSummary(ringtoneDisplayString == null ? "" : ringtoneDisplayString); |
Michael Chan | 0b674be | 2012-11-20 07:16:14 -0800 | [diff] [blame] | 178 | |
Mason Tang | cca9ecb | 2010-07-16 15:07:47 -0700 | [diff] [blame] | 179 | mPopup = (CheckBoxPreference) preferenceScreen.findPreference(KEY_ALERTS_POPUP); |
Erik | 3dc5e90 | 2010-09-07 11:33:07 -0700 | [diff] [blame] | 180 | mUseHomeTZ = (CheckBoxPreference) preferenceScreen.findPreference(KEY_HOME_TZ_ENABLED); |
RoboErik | 42dabd1 | 2011-07-12 18:01:03 -0700 | [diff] [blame] | 181 | mHideDeclined = (CheckBoxPreference) preferenceScreen.findPreference(KEY_HIDE_DECLINED); |
Erik | 8b162f1 | 2011-02-02 16:05:58 -0800 | [diff] [blame] | 182 | mWeekStart = (ListPreference) preferenceScreen.findPreference(KEY_WEEK_START_DAY); |
| 183 | mDefaultReminder = (ListPreference) preferenceScreen.findPreference(KEY_DEFAULT_REMINDER); |
James Kung | 974343a | 2013-04-03 16:12:38 -0700 | [diff] [blame] | 184 | mHomeTZ = preferenceScreen.findPreference(KEY_HOME_TZ); |
Erik | 8b162f1 | 2011-02-02 16:05:58 -0800 | [diff] [blame] | 185 | mWeekStart.setSummary(mWeekStart.getEntry()); |
| 186 | mDefaultReminder.setSummary(mDefaultReminder.getEntry()); |
| 187 | |
Michael Chan | 305c642 | 2013-04-12 18:28:27 -0700 | [diff] [blame] | 188 | // This triggers an asynchronous call to the provider to refresh the data in shared pref |
| 189 | mTimeZoneId = Utils.getTimeZone(activity, null); |
| 190 | |
| 191 | SharedPreferences prefs = CalendarUtils.getSharedPreferences(activity, |
| 192 | Utils.SHARED_PREFS_NAME); |
| 193 | |
| 194 | // Utils.getTimeZone will return the currentTimeZone instead of the one |
| 195 | // in the shared_pref if home time zone is disabled. So if home tz is |
| 196 | // off, we will explicitly read it. |
| 197 | if (!prefs.getBoolean(KEY_HOME_TZ_ENABLED, false)) { |
| 198 | mTimeZoneId = prefs.getString(KEY_HOME_TZ, Time.getCurrentTimezone()); |
| 199 | } |
| 200 | |
James Kung | 974343a | 2013-04-03 16:12:38 -0700 | [diff] [blame] | 201 | mHomeTZ.setOnPreferenceClickListener(new OnPreferenceClickListener() { |
| 202 | @Override |
| 203 | public boolean onPreferenceClick(Preference preference) { |
| 204 | showTimezoneDialog(); |
| 205 | return true; |
| 206 | } |
| 207 | }); |
| 208 | |
Sam Blitzstein | 00040c6 | 2013-04-11 10:13:47 -0700 | [diff] [blame] | 209 | if (mTzPickerUtils == null) { |
| 210 | mTzPickerUtils = new TimeZonePickerUtils(getActivity()); |
| 211 | } |
Sam Blitzstein | dd67b8d | 2013-04-26 19:34:29 -0700 | [diff] [blame] | 212 | CharSequence timezoneName = mTzPickerUtils.getGmtDisplayName(getActivity(), mTimeZoneId, |
Sam Blitzstein | b69ea63 | 2013-05-03 18:22:12 -0700 | [diff] [blame] | 213 | System.currentTimeMillis(), false); |
Michael Chan | 305c642 | 2013-04-12 18:28:27 -0700 | [diff] [blame] | 214 | mHomeTZ.setSummary(timezoneName != null ? timezoneName : mTimeZoneId); |
James Kung | 974343a | 2013-04-03 16:12:38 -0700 | [diff] [blame] | 215 | |
| 216 | TimeZonePickerDialog tzpd = (TimeZonePickerDialog) activity.getFragmentManager() |
| 217 | .findFragmentByTag(FRAG_TAG_TIME_ZONE_PICKER); |
| 218 | if (tzpd != null) { |
| 219 | tzpd.setOnTimeZoneSetListener(this); |
Erik | a48b9d4 | 2010-09-22 15:31:03 -0700 | [diff] [blame] | 220 | } |
Michael Chan | 45efa09 | 2010-02-03 17:44:37 -0800 | [diff] [blame] | 221 | |
Mason Tang | cca9ecb | 2010-07-16 15:07:47 -0700 | [diff] [blame] | 222 | migrateOldPreferences(sharedPreferences); |
Jim Shuma | d73944a | 2010-03-25 12:01:08 -0700 | [diff] [blame] | 223 | |
The Android Open Source Project | 146de36 | 2009-03-03 19:32:18 -0800 | [diff] [blame] | 224 | updateChildPreferences(); |
| 225 | } |
Michael Chan | 45efa09 | 2010-02-03 17:44:37 -0800 | [diff] [blame] | 226 | |
James Kung | 974343a | 2013-04-03 16:12:38 -0700 | [diff] [blame] | 227 | private void showTimezoneDialog() { |
| 228 | final Activity activity = getActivity(); |
| 229 | if (activity == null) { |
| 230 | return; |
| 231 | } |
| 232 | |
| 233 | Bundle b = new Bundle(); |
| 234 | b.putLong(TimeZonePickerDialog.BUNDLE_START_TIME_MILLIS, System.currentTimeMillis()); |
| 235 | b.putString(TimeZonePickerDialog.BUNDLE_TIME_ZONE, Utils.getTimeZone(activity, null)); |
| 236 | |
| 237 | FragmentManager fm = getActivity().getFragmentManager(); |
| 238 | TimeZonePickerDialog tzpd = (TimeZonePickerDialog) fm |
| 239 | .findFragmentByTag(FRAG_TAG_TIME_ZONE_PICKER); |
| 240 | if (tzpd != null) { |
| 241 | tzpd.dismiss(); |
| 242 | } |
| 243 | tzpd = new TimeZonePickerDialog(); |
| 244 | tzpd.setArguments(b); |
| 245 | tzpd.setOnTimeZoneSetListener(this); |
| 246 | tzpd.show(fm, FRAG_TAG_TIME_ZONE_PICKER); |
| 247 | } |
| 248 | |
Daisuke Miyakawa | 5897c00 | 2010-11-30 17:08:01 -0800 | [diff] [blame] | 249 | @Override |
Michael Chan | 0b674be | 2012-11-20 07:16:14 -0800 | [diff] [blame] | 250 | public void onStart() { |
| 251 | super.onStart(); |
Daisuke Miyakawa | 5897c00 | 2010-11-30 17:08:01 -0800 | [diff] [blame] | 252 | getPreferenceScreen().getSharedPreferences() |
| 253 | .registerOnSharedPreferenceChangeListener(this); |
Erik | 8b162f1 | 2011-02-02 16:05:58 -0800 | [diff] [blame] | 254 | setPreferenceListeners(this); |
| 255 | } |
| 256 | |
| 257 | /** |
| 258 | * Sets up all the preference change listeners to use the specified |
| 259 | * listener. |
| 260 | */ |
| 261 | private void setPreferenceListeners(OnPreferenceChangeListener listener) { |
| 262 | mUseHomeTZ.setOnPreferenceChangeListener(listener); |
| 263 | mHomeTZ.setOnPreferenceChangeListener(listener); |
| 264 | mWeekStart.setOnPreferenceChangeListener(listener); |
| 265 | mDefaultReminder.setOnPreferenceChangeListener(listener); |
| 266 | mRingtone.setOnPreferenceChangeListener(listener); |
RoboErik | 42dabd1 | 2011-07-12 18:01:03 -0700 | [diff] [blame] | 267 | mHideDeclined.setOnPreferenceChangeListener(listener); |
Michael Chan | 0b674be | 2012-11-20 07:16:14 -0800 | [diff] [blame] | 268 | mVibrate.setOnPreferenceChangeListener(listener); |
Daisuke Miyakawa | 5897c00 | 2010-11-30 17:08:01 -0800 | [diff] [blame] | 269 | } |
| 270 | |
| 271 | @Override |
Michael Chan | 0b674be | 2012-11-20 07:16:14 -0800 | [diff] [blame] | 272 | public void onStop() { |
Daisuke Miyakawa | 5897c00 | 2010-11-30 17:08:01 -0800 | [diff] [blame] | 273 | getPreferenceScreen().getSharedPreferences() |
| 274 | .unregisterOnSharedPreferenceChangeListener(this); |
Erik | 8b162f1 | 2011-02-02 16:05:58 -0800 | [diff] [blame] | 275 | setPreferenceListeners(null); |
Michael Chan | 0b674be | 2012-11-20 07:16:14 -0800 | [diff] [blame] | 276 | super.onStop(); |
Daisuke Miyakawa | 5897c00 | 2010-11-30 17:08:01 -0800 | [diff] [blame] | 277 | } |
| 278 | |
RoboErik | 43ffa46 | 2011-10-31 16:01:58 -0700 | [diff] [blame] | 279 | @Override |
The Android Open Source Project | 146de36 | 2009-03-03 19:32:18 -0800 | [diff] [blame] | 280 | public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { |
RoboErik | 43ffa46 | 2011-10-31 16:01:58 -0700 | [diff] [blame] | 281 | Activity a = getActivity(); |
Mason Tang | cca9ecb | 2010-07-16 15:07:47 -0700 | [diff] [blame] | 282 | if (key.equals(KEY_ALERTS)) { |
The Android Open Source Project | 146de36 | 2009-03-03 19:32:18 -0800 | [diff] [blame] | 283 | updateChildPreferences(); |
RoboErik | 43ffa46 | 2011-10-31 16:01:58 -0700 | [diff] [blame] | 284 | if (a != null) { |
| 285 | Intent intent = new Intent(); |
| 286 | intent.setClass(a, AlertReceiver.class); |
| 287 | if (mAlert.isChecked()) { |
| 288 | intent.setAction(AlertReceiver.ACTION_DISMISS_OLD_REMINDERS); |
| 289 | } else { |
Sara Ting | 3a07a68 | 2012-10-31 13:19:38 -0700 | [diff] [blame] | 290 | intent.setAction(AlertReceiver.EVENT_REMINDER_APP_ACTION); |
RoboErik | 43ffa46 | 2011-10-31 16:01:58 -0700 | [diff] [blame] | 291 | } |
| 292 | a.sendBroadcast(intent); |
| 293 | } |
The Android Open Source Project | 146de36 | 2009-03-03 19:32:18 -0800 | [diff] [blame] | 294 | } |
Garth Bushell | bdadecb | 2010-10-06 22:35:31 +0100 | [diff] [blame] | 295 | if (a != null) { |
| 296 | BackupManager.dataChanged(a.getPackageName()); |
| 297 | } |
Erik | 3dc5e90 | 2010-09-07 11:33:07 -0700 | [diff] [blame] | 298 | } |
| 299 | |
Erik | 6ea265f | 2010-09-08 15:14:36 -0700 | [diff] [blame] | 300 | /** |
| 301 | * Handles time zone preference changes |
| 302 | */ |
| 303 | @Override |
| 304 | public boolean onPreferenceChange(Preference preference, Object newValue) { |
| 305 | String tz; |
Michael Chan | 1851ecb | 2013-04-18 18:36:24 -0700 | [diff] [blame] | 306 | final Activity activity = getActivity(); |
Erik | 6ea265f | 2010-09-08 15:14:36 -0700 | [diff] [blame] | 307 | if (preference == mUseHomeTZ) { |
| 308 | if ((Boolean)newValue) { |
Michael Chan | 305c642 | 2013-04-12 18:28:27 -0700 | [diff] [blame] | 309 | tz = mTimeZoneId; |
Erik | 6ea265f | 2010-09-08 15:14:36 -0700 | [diff] [blame] | 310 | } else { |
Erik | a48b9d4 | 2010-09-22 15:31:03 -0700 | [diff] [blame] | 311 | tz = CalendarCache.TIMEZONE_TYPE_AUTO; |
Erik | 6ea265f | 2010-09-08 15:14:36 -0700 | [diff] [blame] | 312 | } |
Michael Chan | 1851ecb | 2013-04-18 18:36:24 -0700 | [diff] [blame] | 313 | Utils.setTimeZone(activity, tz); |
RoboErik | df15c7e | 2011-02-14 13:59:05 -0800 | [diff] [blame] | 314 | return true; |
RoboErik | 42dabd1 | 2011-07-12 18:01:03 -0700 | [diff] [blame] | 315 | } else if (preference == mHideDeclined) { |
| 316 | mHideDeclined.setChecked((Boolean) newValue); |
Michael Chan | 1851ecb | 2013-04-18 18:36:24 -0700 | [diff] [blame] | 317 | Intent intent = new Intent(Utils.getWidgetScheduledUpdateAction(activity)); |
RoboErik | 42dabd1 | 2011-07-12 18:01:03 -0700 | [diff] [blame] | 318 | intent.setDataAndType(CalendarContract.CONTENT_URI, Utils.APPWIDGET_DATA_TYPE); |
Michael Chan | 1851ecb | 2013-04-18 18:36:24 -0700 | [diff] [blame] | 319 | activity.sendBroadcast(intent); |
RoboErik | 42dabd1 | 2011-07-12 18:01:03 -0700 | [diff] [blame] | 320 | return true; |
Erik | 8b162f1 | 2011-02-02 16:05:58 -0800 | [diff] [blame] | 321 | } else if (preference == mWeekStart) { |
| 322 | mWeekStart.setValue((String) newValue); |
| 323 | mWeekStart.setSummary(mWeekStart.getEntry()); |
| 324 | } else if (preference == mDefaultReminder) { |
| 325 | mDefaultReminder.setValue((String) newValue); |
| 326 | mDefaultReminder.setSummary(mDefaultReminder.getEntry()); |
| 327 | } else if (preference == mRingtone) { |
Michael Chan | 0b674be | 2012-11-20 07:16:14 -0800 | [diff] [blame] | 328 | if (newValue instanceof String) { |
Michael Chan | 1851ecb | 2013-04-18 18:36:24 -0700 | [diff] [blame] | 329 | Utils.setRingTonePreference(activity, (String) newValue); |
| 330 | String ringtone = getRingtoneTitleFromUri(activity, (String) newValue); |
Michael Chan | 0b674be | 2012-11-20 07:16:14 -0800 | [diff] [blame] | 331 | mRingtone.setSummary(ringtone == null ? "" : ringtone); |
| 332 | } |
Erik | 8b162f1 | 2011-02-02 16:05:58 -0800 | [diff] [blame] | 333 | return true; |
Michael Chan | 0b674be | 2012-11-20 07:16:14 -0800 | [diff] [blame] | 334 | } else if (preference == mVibrate) { |
| 335 | mVibrate.setChecked((Boolean) newValue); |
| 336 | return true; |
Erik | 6ea265f | 2010-09-08 15:14:36 -0700 | [diff] [blame] | 337 | } else { |
Erik | 8b162f1 | 2011-02-02 16:05:58 -0800 | [diff] [blame] | 338 | return true; |
Erik | 3dc5e90 | 2010-09-07 11:33:07 -0700 | [diff] [blame] | 339 | } |
Erik | 8b162f1 | 2011-02-02 16:05:58 -0800 | [diff] [blame] | 340 | return false; |
The Android Open Source Project | 146de36 | 2009-03-03 19:32:18 -0800 | [diff] [blame] | 341 | } |
Michael Chan | 45efa09 | 2010-02-03 17:44:37 -0800 | [diff] [blame] | 342 | |
Michael Chan | 0b674be | 2012-11-20 07:16:14 -0800 | [diff] [blame] | 343 | public String getRingtoneTitleFromUri(Context context, String uri) { |
| 344 | if (TextUtils.isEmpty(uri)) { |
| 345 | return null; |
| 346 | } |
| 347 | |
| 348 | Ringtone ring = RingtoneManager.getRingtone(getActivity(), Uri.parse(uri)); |
| 349 | if (ring != null) { |
| 350 | return ring.getTitle(context); |
| 351 | } |
| 352 | return null; |
| 353 | } |
| 354 | |
Mason Tang | cca9ecb | 2010-07-16 15:07:47 -0700 | [diff] [blame] | 355 | /** |
| 356 | * If necessary, upgrades previous versions of preferences to the current |
| 357 | * set of keys and values. |
| 358 | * @param prefs the preferences to upgrade |
| 359 | */ |
| 360 | private void migrateOldPreferences(SharedPreferences prefs) { |
| 361 | // If needed, migrate vibration setting from a previous version |
Michael Chan | 0b674be | 2012-11-20 07:16:14 -0800 | [diff] [blame] | 362 | |
| 363 | mVibrate.setChecked(Utils.getDefaultVibrate(getActivity(), prefs)); |
| 364 | |
Mason Tang | cca9ecb | 2010-07-16 15:07:47 -0700 | [diff] [blame] | 365 | // If needed, migrate the old alerts type settin |
| 366 | if (!prefs.contains(KEY_ALERTS) && prefs.contains(KEY_ALERTS_TYPE)) { |
| 367 | String type = prefs.getString(KEY_ALERTS_TYPE, ALERT_TYPE_STATUS_BAR); |
| 368 | if (type.equals(ALERT_TYPE_OFF)) { |
| 369 | mAlert.setChecked(false); |
| 370 | mPopup.setChecked(false); |
| 371 | mPopup.setEnabled(false); |
| 372 | } else if (type.equals(ALERT_TYPE_STATUS_BAR)) { |
| 373 | mAlert.setChecked(true); |
| 374 | mPopup.setChecked(false); |
| 375 | mPopup.setEnabled(true); |
| 376 | } else if (type.equals(ALERT_TYPE_ALERTS)) { |
| 377 | mAlert.setChecked(true); |
| 378 | mPopup.setChecked(true); |
| 379 | mPopup.setEnabled(true); |
| 380 | } |
| 381 | // clear out the old setting |
| 382 | prefs.edit().remove(KEY_ALERTS_TYPE).commit(); |
| 383 | } |
| 384 | } |
| 385 | |
| 386 | /** |
| 387 | * Keeps the dependent settings in sync with the parent preference, so for |
| 388 | * example, when notifications are turned off, we disable the preferences |
| 389 | * for configuring the exact notification behavior. |
| 390 | */ |
The Android Open Source Project | 146de36 | 2009-03-03 19:32:18 -0800 | [diff] [blame] | 391 | private void updateChildPreferences() { |
Mason Tang | cca9ecb | 2010-07-16 15:07:47 -0700 | [diff] [blame] | 392 | if (mAlert.isChecked()) { |
Michael Chan | 0b674be | 2012-11-20 07:16:14 -0800 | [diff] [blame] | 393 | mVibrate.setEnabled(true); |
Mason Tang | cca9ecb | 2010-07-16 15:07:47 -0700 | [diff] [blame] | 394 | mRingtone.setEnabled(true); |
| 395 | mPopup.setEnabled(true); |
| 396 | } else { |
Michael Chan | 0b674be | 2012-11-20 07:16:14 -0800 | [diff] [blame] | 397 | mVibrate.setEnabled(false); |
The Android Open Source Project | 146de36 | 2009-03-03 19:32:18 -0800 | [diff] [blame] | 398 | mRingtone.setEnabled(false); |
Mason Tang | cca9ecb | 2010-07-16 15:07:47 -0700 | [diff] [blame] | 399 | mPopup.setEnabled(false); |
The Android Open Source Project | 146de36 | 2009-03-03 19:32:18 -0800 | [diff] [blame] | 400 | } |
| 401 | } |
Mason Tang | 3a0e67b | 2010-08-23 16:59:30 -0700 | [diff] [blame] | 402 | |
| 403 | |
Daisuke Miyakawa | d644b0d | 2010-10-21 15:45:12 -0700 | [diff] [blame] | 404 | @Override |
| 405 | public boolean onPreferenceTreeClick( |
| 406 | PreferenceScreen preferenceScreen, Preference preference) { |
| 407 | final String key = preference.getKey(); |
Michael Chan | e98dca7 | 2012-06-16 08:22:47 -0700 | [diff] [blame] | 408 | if (KEY_CLEAR_SEARCH_HISTORY.equals(key)) { |
Daisuke Miyakawa | 4b441bd | 2010-09-16 14:55:36 -0700 | [diff] [blame] | 409 | SearchRecentSuggestions suggestions = new SearchRecentSuggestions(getActivity(), |
RoboErik | 064beb9 | 2011-06-16 17:25:14 -0700 | [diff] [blame] | 410 | Utils.getSearchAuthority(getActivity()), |
Mason Tang | 3a0e67b | 2010-08-23 16:59:30 -0700 | [diff] [blame] | 411 | CalendarRecentSuggestionsProvider.MODE); |
| 412 | suggestions.clearHistory(); |
Daisuke Miyakawa | 4b441bd | 2010-09-16 14:55:36 -0700 | [diff] [blame] | 413 | Toast.makeText(getActivity(), R.string.search_history_cleared, |
Mason Tang | 3a0e67b | 2010-08-23 16:59:30 -0700 | [diff] [blame] | 414 | Toast.LENGTH_SHORT).show(); |
| 415 | return true; |
Michael Chan | e98dca7 | 2012-06-16 08:22:47 -0700 | [diff] [blame] | 416 | } else { |
| 417 | return super.onPreferenceTreeClick(preferenceScreen, preference); |
Mason Tang | 3a0e67b | 2010-08-23 16:59:30 -0700 | [diff] [blame] | 418 | } |
Mason Tang | 3a0e67b | 2010-08-23 16:59:30 -0700 | [diff] [blame] | 419 | } |
| 420 | |
James Kung | 974343a | 2013-04-03 16:12:38 -0700 | [diff] [blame] | 421 | @Override |
| 422 | public void onTimeZoneSet(TimeZoneInfo tzi) { |
Sam Blitzstein | 00040c6 | 2013-04-11 10:13:47 -0700 | [diff] [blame] | 423 | if (mTzPickerUtils == null) { |
| 424 | mTzPickerUtils = new TimeZonePickerUtils(getActivity()); |
| 425 | } |
| 426 | |
Sam Blitzstein | dd67b8d | 2013-04-26 19:34:29 -0700 | [diff] [blame] | 427 | final CharSequence timezoneName = mTzPickerUtils.getGmtDisplayName( |
Sam Blitzstein | b69ea63 | 2013-05-03 18:22:12 -0700 | [diff] [blame] | 428 | getActivity(), tzi.mTzId, System.currentTimeMillis(), false); |
James Kung | 974343a | 2013-04-03 16:12:38 -0700 | [diff] [blame] | 429 | mHomeTZ.setSummary(timezoneName); |
| 430 | Utils.setTimeZone(getActivity(), tzi.mTzId); |
| 431 | } |
The Android Open Source Project | 146de36 | 2009-03-03 19:32:18 -0800 | [diff] [blame] | 432 | } |