1146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project/*
2146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
3146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project *
4146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project * you may not use this file except in compliance with the License.
6146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project * You may obtain a copy of the License at
7146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project *
8146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project *
10146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project * See the License for the specific language governing permissions and
14146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project * limitations under the License.
15146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project */
16146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
17146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectpackage com.android.calendar;
18146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
194b441bd6544fe6d11be75f974a41afd8fa040a4fDaisuke Miyakawaimport android.app.Activity;
20974343a44435bedc104d89fa98fdeb1ccf362501James Kungimport android.app.FragmentManager;
217412b62056858a0c7a3ebc2f1a14f7475d93287cMichael Chanimport android.app.backup.BackupManager;
22a17725e24d51b7a6f002dd5afd3270c8eeea0dbeJeff Hamiltonimport android.content.Context;
2342dabd1e1e89b0d4af5afb776c6ecc53f6ae9fbaRoboErikimport android.content.Intent;
24146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.content.SharedPreferences;
251851ecb450bbfa40ef375a914d1c31c793684894Michael Chanimport android.content.SharedPreferences.Editor;
26146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.content.SharedPreferences.OnSharedPreferenceChangeListener;
270b674bef73eac24a4c41cfd5af8be516f4936844Michael Chanimport android.media.Ringtone;
280b674bef73eac24a4c41cfd5af8be516f4936844Michael Chanimport android.media.RingtoneManager;
290b674bef73eac24a4c41cfd5af8be516f4936844Michael Chanimport android.net.Uri;
30146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.os.Bundle;
317412b62056858a0c7a3ebc2f1a14f7475d93287cMichael Chanimport android.os.Vibrator;
32cca9ecb23b079c47856af22f89f7a6f3dec7a492Mason Tangimport android.preference.CheckBoxPreference;
33146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.preference.ListPreference;
343a0e67b1d81a6170a844bb6f9e294efa3a42650aMason Tangimport android.preference.Preference;
356ea265f8b747a26d6d3b21743afcdaa667a02711Erikimport android.preference.Preference.OnPreferenceChangeListener;
36974343a44435bedc104d89fa98fdeb1ccf362501James Kungimport android.preference.Preference.OnPreferenceClickListener;
377412b62056858a0c7a3ebc2f1a14f7475d93287cMichael Chanimport android.preference.PreferenceCategory;
384b441bd6544fe6d11be75f974a41afd8fa040a4fDaisuke Miyakawaimport android.preference.PreferenceFragment;
39a17725e24d51b7a6f002dd5afd3270c8eeea0dbeJeff Hamiltonimport android.preference.PreferenceManager;
40146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.preference.PreferenceScreen;
41146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.preference.RingtonePreference;
4242dabd1e1e89b0d4af5afb776c6ecc53f6ae9fbaRoboErikimport android.provider.CalendarContract;
43a7c0390d9c5dd4ff730de505682687fae5f5ced0RoboErikimport android.provider.CalendarContract.CalendarCache;
443a0e67b1d81a6170a844bb6f9e294efa3a42650aMason Tangimport android.provider.SearchRecentSuggestions;
4539861950855726cb86118f03a74b2f3a69c713c2Erikimport android.text.TextUtils;
46305c64230c4c8928d5aa29c4bd123ca44627491aMichael Chanimport android.text.format.Time;
473a0e67b1d81a6170a844bb6f9e294efa3a42650aMason Tangimport android.widget.Toast;
48146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
49559cb86bf1aa43c0a9cba7a4c7297d8d6d3a33f8Michael Chanimport com.android.calendar.alerts.AlertReceiver;
50974343a44435bedc104d89fa98fdeb1ccf362501James Kungimport com.android.timezonepicker.TimeZoneInfo;
51974343a44435bedc104d89fa98fdeb1ccf362501James Kungimport com.android.timezonepicker.TimeZonePickerDialog;
52974343a44435bedc104d89fa98fdeb1ccf362501James Kungimport com.android.timezonepicker.TimeZonePickerDialog.OnTimeZoneSetListener;
53974343a44435bedc104d89fa98fdeb1ccf362501James Kungimport com.android.timezonepicker.TimeZonePickerUtils;
54559cb86bf1aa43c0a9cba7a4c7297d8d6d3a33f8Michael Chan
554b441bd6544fe6d11be75f974a41afd8fa040a4fDaisuke Miyakawapublic class GeneralPreferences extends PreferenceFragment implements
56974343a44435bedc104d89fa98fdeb1ccf362501James Kung        OnSharedPreferenceChangeListener, OnPreferenceChangeListener, OnTimeZoneSetListener {
57a17725e24d51b7a6f002dd5afd3270c8eeea0dbeJeff Hamilton    // The name of the shared preferences file. This name must be maintained for historical
58a17725e24d51b7a6f002dd5afd3270c8eeea0dbeJeff Hamilton    // reasons, as it's what PreferenceManager assigned the first time the file was created.
59bdadecb6a5fc35b51bc3d488b5f0b4cbed987964Garth Bushell    static final String SHARED_PREFS_NAME = "com.android.calendar_preferences";
601851ecb450bbfa40ef375a914d1c31c793684894Michael Chan    static final String SHARED_PREFS_NAME_NO_BACKUP = "com.android.calendar_preferences_no_backup";
61a17725e24d51b7a6f002dd5afd3270c8eeea0dbeJeff Hamilton
62974343a44435bedc104d89fa98fdeb1ccf362501James Kung    private static final String FRAG_TAG_TIME_ZONE_PICKER = "TimeZonePicker";
63974343a44435bedc104d89fa98fdeb1ccf362501James Kung
64146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    // Preference keys
6523e7da3eacee7bceb105cdfc7b5329c7a43846d5Mason Tang    public static final String KEY_HIDE_DECLINED = "preferences_hide_declined";
6623e7da3eacee7bceb105cdfc7b5329c7a43846d5Mason Tang    public static final String KEY_WEEK_START_DAY = "preferences_week_start_day";
67981874e61ecf29a96a77601a3172b2503b6537eeErik    public static final String KEY_SHOW_WEEK_NUM = "preferences_show_week_num";
6891b01ed605e36fc5a7a924c226597a62c789b50dErik    public static final String KEY_DAYS_PER_WEEK = "preferences_days_per_week";
696c892a2ce67c08b9b60ceae27d941d40ed37e720RoboErik    public static final String KEY_SKIP_SETUP = "preferences_skip_setup";
70cca9ecb23b079c47856af22f89f7a6f3dec7a492Mason Tang
713a0e67b1d81a6170a844bb6f9e294efa3a42650aMason Tang    public static final String KEY_CLEAR_SEARCH_HISTORY = "preferences_clear_search_history";
723a0e67b1d81a6170a844bb6f9e294efa3a42650aMason Tang
737412b62056858a0c7a3ebc2f1a14f7475d93287cMichael Chan    public static final String KEY_ALERTS_CATEGORY = "preferences_alerts_category";
7423e7da3eacee7bceb105cdfc7b5329c7a43846d5Mason Tang    public static final String KEY_ALERTS = "preferences_alerts";
7523e7da3eacee7bceb105cdfc7b5329c7a43846d5Mason Tang    public static final String KEY_ALERTS_VIBRATE = "preferences_alerts_vibrate";
7623e7da3eacee7bceb105cdfc7b5329c7a43846d5Mason Tang    public static final String KEY_ALERTS_RINGTONE = "preferences_alerts_ringtone";
7723e7da3eacee7bceb105cdfc7b5329c7a43846d5Mason Tang    public static final String KEY_ALERTS_POPUP = "preferences_alerts_popup";
78cca9ecb23b079c47856af22f89f7a6f3dec7a492Mason Tang
7931489e9749cbcb6574b6b60c7942241aa2d8df7bIsaac Katzenelson    public static final String KEY_SHOW_CONTROLS = "preferences_show_controls";
8031489e9749cbcb6574b6b60c7942241aa2d8df7bIsaac Katzenelson
8123e7da3eacee7bceb105cdfc7b5329c7a43846d5Mason Tang    public static final String KEY_DEFAULT_REMINDER = "preferences_default_reminder";
829d8a376b89fcc36c44d4df0c5cbf6991306131c4Michael Chan    public static final int NO_REMINDER = -1;
839d8a376b89fcc36c44d4df0c5cbf6991306131c4Michael Chan    public static final String NO_REMINDER_STRING = "-1";
849d8a376b89fcc36c44d4df0c5cbf6991306131c4Michael Chan    public static final int REMINDER_DEFAULT_TIME = 10; // in minutes
85d6734dbbd704cdb1bc331d1bd74b7a3be58f69ffMichael Chan
86d885c1a5876735bbf2c0086956101bd70bac37e7Michael Chan    public static final String KEY_DEFAULT_CELL_HEIGHT = "preferences_default_cell_height";
87f565bc11cf22e639c01ad5b9a6129e707991eb4eSara Ting    public static final String KEY_VERSION = "preferences_version";
88d885c1a5876735bbf2c0086956101bd70bac37e7Michael Chan
89d6734dbbd704cdb1bc331d1bd74b7a3be58f69ffMichael Chan    /** Key to SharePreference for default view (CalendarController.ViewType) */
9023e7da3eacee7bceb105cdfc7b5329c7a43846d5Mason Tang    public static final String KEY_START_VIEW = "preferred_startView";
91d6734dbbd704cdb1bc331d1bd74b7a3be58f69ffMichael Chan    /**
92d6734dbbd704cdb1bc331d1bd74b7a3be58f69ffMichael Chan     *  Key to SharePreference for default detail view (CalendarController.ViewType)
93d6734dbbd704cdb1bc331d1bd74b7a3be58f69ffMichael Chan     *  Typically used by widget
94d6734dbbd704cdb1bc331d1bd74b7a3be58f69ffMichael Chan     */
9523e7da3eacee7bceb105cdfc7b5329c7a43846d5Mason Tang    public static final String KEY_DETAILED_VIEW = "preferred_detailedView";
9623e7da3eacee7bceb105cdfc7b5329c7a43846d5Mason Tang    public static final String KEY_DEFAULT_CALENDAR = "preference_defaultCalendar";
9745efa09d6e06f5569b2c0ae0dae0436dbfe6cb28Michael Chan
988e3d430a020744faa21bf4ca24f1a99c36ec5c4fMason Tang    // These must be in sync with the array preferences_week_start_day_values
9923e7da3eacee7bceb105cdfc7b5329c7a43846d5Mason Tang    public static final String WEEK_START_DEFAULT = "-1";
10023e7da3eacee7bceb105cdfc7b5329c7a43846d5Mason Tang    public static final String WEEK_START_SATURDAY = "7";
10123e7da3eacee7bceb105cdfc7b5329c7a43846d5Mason Tang    public static final String WEEK_START_SUNDAY = "1";
10223e7da3eacee7bceb105cdfc7b5329c7a43846d5Mason Tang    public static final String WEEK_START_MONDAY = "2";
1038e3d430a020744faa21bf4ca24f1a99c36ec5c4fMason Tang
104cca9ecb23b079c47856af22f89f7a6f3dec7a492Mason Tang    // These keys are kept to enable migrating users from previous versions
105cca9ecb23b079c47856af22f89f7a6f3dec7a492Mason Tang    private static final String KEY_ALERTS_TYPE = "preferences_alerts_type";
106cca9ecb23b079c47856af22f89f7a6f3dec7a492Mason Tang    private static final String ALERT_TYPE_ALERTS = "0";
107cca9ecb23b079c47856af22f89f7a6f3dec7a492Mason Tang    private static final String ALERT_TYPE_STATUS_BAR = "1";
108cca9ecb23b079c47856af22f89f7a6f3dec7a492Mason Tang    private static final String ALERT_TYPE_OFF = "2";
109235d59cf61769ec8ab777d81cd1ceb2e7530f439Erik    static final String KEY_HOME_TZ_ENABLED = "preferences_home_tz_enabled";
110235d59cf61769ec8ab777d81cd1ceb2e7530f439Erik    static final String KEY_HOME_TZ = "preferences_home_tz";
1118e3d430a020744faa21bf4ca24f1a99c36ec5c4fMason Tang
112146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    // Default preference values
113d6734dbbd704cdb1bc331d1bd74b7a3be58f69ffMichael Chan    public static final int DEFAULT_START_VIEW = CalendarController.ViewType.WEEK;
114d6734dbbd704cdb1bc331d1bd74b7a3be58f69ffMichael Chan    public static final int DEFAULT_DETAILED_VIEW = CalendarController.ViewType.DAY;
115d644b0df14ae6e204369b3454d16976fba32f15cDaisuke Miyakawa    public static final boolean DEFAULT_SHOW_WEEK_NUM = false;
1162e760f909aac60f9db66bb293377f8fabad08e51Sam Blitzstein    // This should match the XML file.
1172e760f909aac60f9db66bb293377f8fabad08e51Sam Blitzstein    public static final String DEFAULT_RINGTONE = "content://settings/system/notification_sound";
11845efa09d6e06f5569b2c0ae0dae0436dbfe6cb28Michael Chan
119cca9ecb23b079c47856af22f89f7a6f3dec7a492Mason Tang    CheckBoxPreference mAlert;
1200b674bef73eac24a4c41cfd5af8be516f4936844Michael Chan    CheckBoxPreference mVibrate;
121146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    RingtonePreference mRingtone;
122cca9ecb23b079c47856af22f89f7a6f3dec7a492Mason Tang    CheckBoxPreference mPopup;
1233dc5e908a825b879978ba523d9099dc2255da9a5Erik    CheckBoxPreference mUseHomeTZ;
12442dabd1e1e89b0d4af5afb776c6ecc53f6ae9fbaRoboErik    CheckBoxPreference mHideDeclined;
125974343a44435bedc104d89fa98fdeb1ccf362501James Kung    Preference mHomeTZ;
12600040c6e081d367567fd579f881e58d448154622Sam Blitzstein    TimeZonePickerUtils mTzPickerUtils;
1278b162f148579c26bf5b4b667308ac829cae6abe6Erik    ListPreference mWeekStart;
1288b162f148579c26bf5b4b667308ac829cae6abe6Erik    ListPreference mDefaultReminder;
12945efa09d6e06f5569b2c0ae0dae0436dbfe6cb28Michael Chan
130305c64230c4c8928d5aa29c4bd123ca44627491aMichael Chan    private String mTimeZoneId;
131305c64230c4c8928d5aa29c4bd123ca44627491aMichael Chan
132a17725e24d51b7a6f002dd5afd3270c8eeea0dbeJeff Hamilton    /** Return a properly configured SharedPreferences instance */
133a17725e24d51b7a6f002dd5afd3270c8eeea0dbeJeff Hamilton    public static SharedPreferences getSharedPreferences(Context context) {
134a17725e24d51b7a6f002dd5afd3270c8eeea0dbeJeff Hamilton        return context.getSharedPreferences(SHARED_PREFS_NAME, Context.MODE_PRIVATE);
135a17725e24d51b7a6f002dd5afd3270c8eeea0dbeJeff Hamilton    }
136a17725e24d51b7a6f002dd5afd3270c8eeea0dbeJeff Hamilton
137a17725e24d51b7a6f002dd5afd3270c8eeea0dbeJeff Hamilton    /** Set the default shared preferences in the proper context */
138a17725e24d51b7a6f002dd5afd3270c8eeea0dbeJeff Hamilton    public static void setDefaultValues(Context context) {
139a17725e24d51b7a6f002dd5afd3270c8eeea0dbeJeff Hamilton        PreferenceManager.setDefaultValues(context, SHARED_PREFS_NAME, Context.MODE_PRIVATE,
1404ad6302749749149766dcca599380b8f06fa0f12Daisuke Miyakawa                R.xml.general_preferences, false);
141a17725e24d51b7a6f002dd5afd3270c8eeea0dbeJeff Hamilton    }
142a17725e24d51b7a6f002dd5afd3270c8eeea0dbeJeff Hamilton
143146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    @Override
1444b441bd6544fe6d11be75f974a41afd8fa040a4fDaisuke Miyakawa    public void onCreate(Bundle icicle) {
145146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        super.onCreate(icicle);
14645efa09d6e06f5569b2c0ae0dae0436dbfe6cb28Michael Chan
1474b441bd6544fe6d11be75f974a41afd8fa040a4fDaisuke Miyakawa        final Activity activity = getActivity();
1484b441bd6544fe6d11be75f974a41afd8fa040a4fDaisuke Miyakawa
149a17725e24d51b7a6f002dd5afd3270c8eeea0dbeJeff Hamilton        // Make sure to always use the same preferences file regardless of the package name
150a17725e24d51b7a6f002dd5afd3270c8eeea0dbeJeff Hamilton        // we're running under
1514b441bd6544fe6d11be75f974a41afd8fa040a4fDaisuke Miyakawa        final PreferenceManager preferenceManager = getPreferenceManager();
1524b441bd6544fe6d11be75f974a41afd8fa040a4fDaisuke Miyakawa        final SharedPreferences sharedPreferences = getSharedPreferences(activity);
153d73944a1691f2299889ea6140f7fd256040d9e41Jim Shuma        preferenceManager.setSharedPreferencesName(SHARED_PREFS_NAME);
1548bb13b84840bbea1ccdd64a582b655547b16ba1bMichael Chan
155146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        // Load the preferences from an XML resource
1564ad6302749749149766dcca599380b8f06fa0f12Daisuke Miyakawa        addPreferencesFromResource(R.xml.general_preferences);
15745efa09d6e06f5569b2c0ae0dae0436dbfe6cb28Michael Chan
1585897c00e8ced53c27f3bd87f11df071d4266203aDaisuke Miyakawa        final PreferenceScreen preferenceScreen = getPreferenceScreen();
159cca9ecb23b079c47856af22f89f7a6f3dec7a492Mason Tang        mAlert = (CheckBoxPreference) preferenceScreen.findPreference(KEY_ALERTS);
1600b674bef73eac24a4c41cfd5af8be516f4936844Michael Chan        mVibrate = (CheckBoxPreference) preferenceScreen.findPreference(KEY_ALERTS_VIBRATE);
1617412b62056858a0c7a3ebc2f1a14f7475d93287cMichael Chan        Vibrator vibrator = (Vibrator) activity.getSystemService(Context.VIBRATOR_SERVICE);
1627412b62056858a0c7a3ebc2f1a14f7475d93287cMichael Chan        if (vibrator == null || !vibrator.hasVibrator()) {
1637412b62056858a0c7a3ebc2f1a14f7475d93287cMichael Chan            PreferenceCategory mAlertGroup = (PreferenceCategory) preferenceScreen
1647412b62056858a0c7a3ebc2f1a14f7475d93287cMichael Chan                    .findPreference(KEY_ALERTS_CATEGORY);
1650b674bef73eac24a4c41cfd5af8be516f4936844Michael Chan            mAlertGroup.removePreference(mVibrate);
1667412b62056858a0c7a3ebc2f1a14f7475d93287cMichael Chan        }
1677412b62056858a0c7a3ebc2f1a14f7475d93287cMichael Chan
168146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        mRingtone = (RingtonePreference) preferenceScreen.findPreference(KEY_ALERTS_RINGTONE);
1691851ecb450bbfa40ef375a914d1c31c793684894Michael Chan        String ringToneUri = Utils.getRingTonePreference(activity);
1701851ecb450bbfa40ef375a914d1c31c793684894Michael Chan
1711851ecb450bbfa40ef375a914d1c31c793684894Michael Chan        // Set the ringToneUri to the backup-able shared pref only so that
1721851ecb450bbfa40ef375a914d1c31c793684894Michael Chan        // the Ringtone dialog will open up with the correct value.
1731851ecb450bbfa40ef375a914d1c31c793684894Michael Chan        final Editor editor = preferenceScreen.getEditor();
1741851ecb450bbfa40ef375a914d1c31c793684894Michael Chan        editor.putString(GeneralPreferences.KEY_ALERTS_RINGTONE, ringToneUri).apply();
1751851ecb450bbfa40ef375a914d1c31c793684894Michael Chan
1761851ecb450bbfa40ef375a914d1c31c793684894Michael Chan        String ringtoneDisplayString = getRingtoneTitleFromUri(activity, ringToneUri);
1771851ecb450bbfa40ef375a914d1c31c793684894Michael Chan        mRingtone.setSummary(ringtoneDisplayString == null ? "" : ringtoneDisplayString);
1780b674bef73eac24a4c41cfd5af8be516f4936844Michael Chan
179cca9ecb23b079c47856af22f89f7a6f3dec7a492Mason Tang        mPopup = (CheckBoxPreference) preferenceScreen.findPreference(KEY_ALERTS_POPUP);
1803dc5e908a825b879978ba523d9099dc2255da9a5Erik        mUseHomeTZ = (CheckBoxPreference) preferenceScreen.findPreference(KEY_HOME_TZ_ENABLED);
18142dabd1e1e89b0d4af5afb776c6ecc53f6ae9fbaRoboErik        mHideDeclined = (CheckBoxPreference) preferenceScreen.findPreference(KEY_HIDE_DECLINED);
1828b162f148579c26bf5b4b667308ac829cae6abe6Erik        mWeekStart = (ListPreference) preferenceScreen.findPreference(KEY_WEEK_START_DAY);
1838b162f148579c26bf5b4b667308ac829cae6abe6Erik        mDefaultReminder = (ListPreference) preferenceScreen.findPreference(KEY_DEFAULT_REMINDER);
184974343a44435bedc104d89fa98fdeb1ccf362501James Kung        mHomeTZ = preferenceScreen.findPreference(KEY_HOME_TZ);
1858b162f148579c26bf5b4b667308ac829cae6abe6Erik        mWeekStart.setSummary(mWeekStart.getEntry());
1868b162f148579c26bf5b4b667308ac829cae6abe6Erik        mDefaultReminder.setSummary(mDefaultReminder.getEntry());
1878b162f148579c26bf5b4b667308ac829cae6abe6Erik
188305c64230c4c8928d5aa29c4bd123ca44627491aMichael Chan        // This triggers an asynchronous call to the provider to refresh the data in shared pref
189305c64230c4c8928d5aa29c4bd123ca44627491aMichael Chan        mTimeZoneId = Utils.getTimeZone(activity, null);
190305c64230c4c8928d5aa29c4bd123ca44627491aMichael Chan
191305c64230c4c8928d5aa29c4bd123ca44627491aMichael Chan        SharedPreferences prefs = CalendarUtils.getSharedPreferences(activity,
192305c64230c4c8928d5aa29c4bd123ca44627491aMichael Chan                Utils.SHARED_PREFS_NAME);
193305c64230c4c8928d5aa29c4bd123ca44627491aMichael Chan
194305c64230c4c8928d5aa29c4bd123ca44627491aMichael Chan        // Utils.getTimeZone will return the currentTimeZone instead of the one
195305c64230c4c8928d5aa29c4bd123ca44627491aMichael Chan        // in the shared_pref if home time zone is disabled. So if home tz is
196305c64230c4c8928d5aa29c4bd123ca44627491aMichael Chan        // off, we will explicitly read it.
197305c64230c4c8928d5aa29c4bd123ca44627491aMichael Chan        if (!prefs.getBoolean(KEY_HOME_TZ_ENABLED, false)) {
198305c64230c4c8928d5aa29c4bd123ca44627491aMichael Chan            mTimeZoneId = prefs.getString(KEY_HOME_TZ, Time.getCurrentTimezone());
199305c64230c4c8928d5aa29c4bd123ca44627491aMichael Chan        }
200305c64230c4c8928d5aa29c4bd123ca44627491aMichael Chan
201974343a44435bedc104d89fa98fdeb1ccf362501James Kung        mHomeTZ.setOnPreferenceClickListener(new OnPreferenceClickListener() {
202974343a44435bedc104d89fa98fdeb1ccf362501James Kung            @Override
203974343a44435bedc104d89fa98fdeb1ccf362501James Kung            public boolean onPreferenceClick(Preference preference) {
204974343a44435bedc104d89fa98fdeb1ccf362501James Kung                showTimezoneDialog();
205974343a44435bedc104d89fa98fdeb1ccf362501James Kung                return true;
206974343a44435bedc104d89fa98fdeb1ccf362501James Kung            }
207974343a44435bedc104d89fa98fdeb1ccf362501James Kung        });
208974343a44435bedc104d89fa98fdeb1ccf362501James Kung
20900040c6e081d367567fd579f881e58d448154622Sam Blitzstein        if (mTzPickerUtils == null) {
21000040c6e081d367567fd579f881e58d448154622Sam Blitzstein            mTzPickerUtils = new TimeZonePickerUtils(getActivity());
21100040c6e081d367567fd579f881e58d448154622Sam Blitzstein        }
212dd67b8db0c2e39bee143cd09fc9055b25849910aSam Blitzstein        CharSequence timezoneName = mTzPickerUtils.getGmtDisplayName(getActivity(), mTimeZoneId,
213b69ea6371541b833662acbb835ae758316e1d0bbSam Blitzstein                System.currentTimeMillis(), false);
214305c64230c4c8928d5aa29c4bd123ca44627491aMichael Chan        mHomeTZ.setSummary(timezoneName != null ? timezoneName : mTimeZoneId);
215974343a44435bedc104d89fa98fdeb1ccf362501James Kung
216974343a44435bedc104d89fa98fdeb1ccf362501James Kung        TimeZonePickerDialog tzpd = (TimeZonePickerDialog) activity.getFragmentManager()
217974343a44435bedc104d89fa98fdeb1ccf362501James Kung                .findFragmentByTag(FRAG_TAG_TIME_ZONE_PICKER);
218974343a44435bedc104d89fa98fdeb1ccf362501James Kung        if (tzpd != null) {
219974343a44435bedc104d89fa98fdeb1ccf362501James Kung            tzpd.setOnTimeZoneSetListener(this);
22039861950855726cb86118f03a74b2f3a69c713c2Erik        }
22145efa09d6e06f5569b2c0ae0dae0436dbfe6cb28Michael Chan
222cca9ecb23b079c47856af22f89f7a6f3dec7a492Mason Tang        migrateOldPreferences(sharedPreferences);
223d73944a1691f2299889ea6140f7fd256040d9e41Jim Shuma
224146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        updateChildPreferences();
225146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    }
22645efa09d6e06f5569b2c0ae0dae0436dbfe6cb28Michael Chan
227974343a44435bedc104d89fa98fdeb1ccf362501James Kung    private void showTimezoneDialog() {
228974343a44435bedc104d89fa98fdeb1ccf362501James Kung        final Activity activity = getActivity();
229974343a44435bedc104d89fa98fdeb1ccf362501James Kung        if (activity == null) {
230974343a44435bedc104d89fa98fdeb1ccf362501James Kung            return;
231974343a44435bedc104d89fa98fdeb1ccf362501James Kung        }
232974343a44435bedc104d89fa98fdeb1ccf362501James Kung
233974343a44435bedc104d89fa98fdeb1ccf362501James Kung        Bundle b = new Bundle();
234974343a44435bedc104d89fa98fdeb1ccf362501James Kung        b.putLong(TimeZonePickerDialog.BUNDLE_START_TIME_MILLIS, System.currentTimeMillis());
235974343a44435bedc104d89fa98fdeb1ccf362501James Kung        b.putString(TimeZonePickerDialog.BUNDLE_TIME_ZONE, Utils.getTimeZone(activity, null));
236974343a44435bedc104d89fa98fdeb1ccf362501James Kung
237974343a44435bedc104d89fa98fdeb1ccf362501James Kung        FragmentManager fm = getActivity().getFragmentManager();
238974343a44435bedc104d89fa98fdeb1ccf362501James Kung        TimeZonePickerDialog tzpd = (TimeZonePickerDialog) fm
239974343a44435bedc104d89fa98fdeb1ccf362501James Kung                .findFragmentByTag(FRAG_TAG_TIME_ZONE_PICKER);
240974343a44435bedc104d89fa98fdeb1ccf362501James Kung        if (tzpd != null) {
241974343a44435bedc104d89fa98fdeb1ccf362501James Kung            tzpd.dismiss();
242974343a44435bedc104d89fa98fdeb1ccf362501James Kung        }
243974343a44435bedc104d89fa98fdeb1ccf362501James Kung        tzpd = new TimeZonePickerDialog();
244974343a44435bedc104d89fa98fdeb1ccf362501James Kung        tzpd.setArguments(b);
245974343a44435bedc104d89fa98fdeb1ccf362501James Kung        tzpd.setOnTimeZoneSetListener(this);
246974343a44435bedc104d89fa98fdeb1ccf362501James Kung        tzpd.show(fm, FRAG_TAG_TIME_ZONE_PICKER);
247974343a44435bedc104d89fa98fdeb1ccf362501James Kung    }
248974343a44435bedc104d89fa98fdeb1ccf362501James Kung
2495897c00e8ced53c27f3bd87f11df071d4266203aDaisuke Miyakawa    @Override
2500b674bef73eac24a4c41cfd5af8be516f4936844Michael Chan    public void onStart() {
2510b674bef73eac24a4c41cfd5af8be516f4936844Michael Chan        super.onStart();
2525897c00e8ced53c27f3bd87f11df071d4266203aDaisuke Miyakawa        getPreferenceScreen().getSharedPreferences()
2535897c00e8ced53c27f3bd87f11df071d4266203aDaisuke Miyakawa                .registerOnSharedPreferenceChangeListener(this);
2548b162f148579c26bf5b4b667308ac829cae6abe6Erik        setPreferenceListeners(this);
2558b162f148579c26bf5b4b667308ac829cae6abe6Erik    }
2568b162f148579c26bf5b4b667308ac829cae6abe6Erik
2578b162f148579c26bf5b4b667308ac829cae6abe6Erik    /**
2588b162f148579c26bf5b4b667308ac829cae6abe6Erik     * Sets up all the preference change listeners to use the specified
2598b162f148579c26bf5b4b667308ac829cae6abe6Erik     * listener.
2608b162f148579c26bf5b4b667308ac829cae6abe6Erik     */
2618b162f148579c26bf5b4b667308ac829cae6abe6Erik    private void setPreferenceListeners(OnPreferenceChangeListener listener) {
2628b162f148579c26bf5b4b667308ac829cae6abe6Erik        mUseHomeTZ.setOnPreferenceChangeListener(listener);
2638b162f148579c26bf5b4b667308ac829cae6abe6Erik        mHomeTZ.setOnPreferenceChangeListener(listener);
2648b162f148579c26bf5b4b667308ac829cae6abe6Erik        mWeekStart.setOnPreferenceChangeListener(listener);
2658b162f148579c26bf5b4b667308ac829cae6abe6Erik        mDefaultReminder.setOnPreferenceChangeListener(listener);
2668b162f148579c26bf5b4b667308ac829cae6abe6Erik        mRingtone.setOnPreferenceChangeListener(listener);
26742dabd1e1e89b0d4af5afb776c6ecc53f6ae9fbaRoboErik        mHideDeclined.setOnPreferenceChangeListener(listener);
2680b674bef73eac24a4c41cfd5af8be516f4936844Michael Chan        mVibrate.setOnPreferenceChangeListener(listener);
2695897c00e8ced53c27f3bd87f11df071d4266203aDaisuke Miyakawa    }
2705897c00e8ced53c27f3bd87f11df071d4266203aDaisuke Miyakawa
2715897c00e8ced53c27f3bd87f11df071d4266203aDaisuke Miyakawa    @Override
2720b674bef73eac24a4c41cfd5af8be516f4936844Michael Chan    public void onStop() {
2735897c00e8ced53c27f3bd87f11df071d4266203aDaisuke Miyakawa        getPreferenceScreen().getSharedPreferences()
2745897c00e8ced53c27f3bd87f11df071d4266203aDaisuke Miyakawa                .unregisterOnSharedPreferenceChangeListener(this);
2758b162f148579c26bf5b4b667308ac829cae6abe6Erik        setPreferenceListeners(null);
2760b674bef73eac24a4c41cfd5af8be516f4936844Michael Chan        super.onStop();
2775897c00e8ced53c27f3bd87f11df071d4266203aDaisuke Miyakawa    }
2785897c00e8ced53c27f3bd87f11df071d4266203aDaisuke Miyakawa
27943ffa461b738692925a94c005c90ff60757455a7RoboErik    @Override
280146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
28143ffa461b738692925a94c005c90ff60757455a7RoboErik        Activity a = getActivity();
282cca9ecb23b079c47856af22f89f7a6f3dec7a492Mason Tang        if (key.equals(KEY_ALERTS)) {
283146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            updateChildPreferences();
28443ffa461b738692925a94c005c90ff60757455a7RoboErik            if (a != null) {
28543ffa461b738692925a94c005c90ff60757455a7RoboErik                Intent intent = new Intent();
28643ffa461b738692925a94c005c90ff60757455a7RoboErik                intent.setClass(a, AlertReceiver.class);
28743ffa461b738692925a94c005c90ff60757455a7RoboErik                if (mAlert.isChecked()) {
28843ffa461b738692925a94c005c90ff60757455a7RoboErik                    intent.setAction(AlertReceiver.ACTION_DISMISS_OLD_REMINDERS);
28943ffa461b738692925a94c005c90ff60757455a7RoboErik                } else {
2903a07a68da6460c36a5dbec5b8828baa4355dbe04Sara Ting                    intent.setAction(AlertReceiver.EVENT_REMINDER_APP_ACTION);
29143ffa461b738692925a94c005c90ff60757455a7RoboErik                }
29243ffa461b738692925a94c005c90ff60757455a7RoboErik                a.sendBroadcast(intent);
29343ffa461b738692925a94c005c90ff60757455a7RoboErik            }
294146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        }
295bdadecb6a5fc35b51bc3d488b5f0b4cbed987964Garth Bushell        if (a != null) {
296bdadecb6a5fc35b51bc3d488b5f0b4cbed987964Garth Bushell            BackupManager.dataChanged(a.getPackageName());
297bdadecb6a5fc35b51bc3d488b5f0b4cbed987964Garth Bushell        }
2983dc5e908a825b879978ba523d9099dc2255da9a5Erik    }
2993dc5e908a825b879978ba523d9099dc2255da9a5Erik
3006ea265f8b747a26d6d3b21743afcdaa667a02711Erik    /**
3016ea265f8b747a26d6d3b21743afcdaa667a02711Erik     * Handles time zone preference changes
3026ea265f8b747a26d6d3b21743afcdaa667a02711Erik     */
3036ea265f8b747a26d6d3b21743afcdaa667a02711Erik    @Override
3046ea265f8b747a26d6d3b21743afcdaa667a02711Erik    public boolean onPreferenceChange(Preference preference, Object newValue) {
3056ea265f8b747a26d6d3b21743afcdaa667a02711Erik        String tz;
3061851ecb450bbfa40ef375a914d1c31c793684894Michael Chan        final Activity activity = getActivity();
3076ea265f8b747a26d6d3b21743afcdaa667a02711Erik        if (preference == mUseHomeTZ) {
3086ea265f8b747a26d6d3b21743afcdaa667a02711Erik            if ((Boolean)newValue) {
309305c64230c4c8928d5aa29c4bd123ca44627491aMichael Chan                tz = mTimeZoneId;
3106ea265f8b747a26d6d3b21743afcdaa667a02711Erik            } else {
311a48b9d426236d8d26bd99602bf0a84315b3f1b09Erik                tz = CalendarCache.TIMEZONE_TYPE_AUTO;
3126ea265f8b747a26d6d3b21743afcdaa667a02711Erik            }
3131851ecb450bbfa40ef375a914d1c31c793684894Michael Chan            Utils.setTimeZone(activity, tz);
314df15c7efe5839edd670b8b5dd6918e1b08df5a91RoboErik            return true;
31542dabd1e1e89b0d4af5afb776c6ecc53f6ae9fbaRoboErik        } else if (preference == mHideDeclined) {
31642dabd1e1e89b0d4af5afb776c6ecc53f6ae9fbaRoboErik            mHideDeclined.setChecked((Boolean) newValue);
3171851ecb450bbfa40ef375a914d1c31c793684894Michael Chan            Intent intent = new Intent(Utils.getWidgetScheduledUpdateAction(activity));
31842dabd1e1e89b0d4af5afb776c6ecc53f6ae9fbaRoboErik            intent.setDataAndType(CalendarContract.CONTENT_URI, Utils.APPWIDGET_DATA_TYPE);
3191851ecb450bbfa40ef375a914d1c31c793684894Michael Chan            activity.sendBroadcast(intent);
32042dabd1e1e89b0d4af5afb776c6ecc53f6ae9fbaRoboErik            return true;
3218b162f148579c26bf5b4b667308ac829cae6abe6Erik        } else if (preference == mWeekStart) {
3228b162f148579c26bf5b4b667308ac829cae6abe6Erik            mWeekStart.setValue((String) newValue);
3238b162f148579c26bf5b4b667308ac829cae6abe6Erik            mWeekStart.setSummary(mWeekStart.getEntry());
3248b162f148579c26bf5b4b667308ac829cae6abe6Erik        } else if (preference == mDefaultReminder) {
3258b162f148579c26bf5b4b667308ac829cae6abe6Erik            mDefaultReminder.setValue((String) newValue);
3268b162f148579c26bf5b4b667308ac829cae6abe6Erik            mDefaultReminder.setSummary(mDefaultReminder.getEntry());
3278b162f148579c26bf5b4b667308ac829cae6abe6Erik        } else if (preference == mRingtone) {
3280b674bef73eac24a4c41cfd5af8be516f4936844Michael Chan            if (newValue instanceof String) {
3291851ecb450bbfa40ef375a914d1c31c793684894Michael Chan                Utils.setRingTonePreference(activity, (String) newValue);
3301851ecb450bbfa40ef375a914d1c31c793684894Michael Chan                String ringtone = getRingtoneTitleFromUri(activity, (String) newValue);
3310b674bef73eac24a4c41cfd5af8be516f4936844Michael Chan                mRingtone.setSummary(ringtone == null ? "" : ringtone);
3320b674bef73eac24a4c41cfd5af8be516f4936844Michael Chan            }
3330b674bef73eac24a4c41cfd5af8be516f4936844Michael Chan            return true;
3340b674bef73eac24a4c41cfd5af8be516f4936844Michael Chan        } else if (preference == mVibrate) {
3350b674bef73eac24a4c41cfd5af8be516f4936844Michael Chan            mVibrate.setChecked((Boolean) newValue);
3368b162f148579c26bf5b4b667308ac829cae6abe6Erik            return true;
3376ea265f8b747a26d6d3b21743afcdaa667a02711Erik        } else {
3388b162f148579c26bf5b4b667308ac829cae6abe6Erik            return true;
3393dc5e908a825b879978ba523d9099dc2255da9a5Erik        }
3408b162f148579c26bf5b4b667308ac829cae6abe6Erik        return false;
341146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    }
34245efa09d6e06f5569b2c0ae0dae0436dbfe6cb28Michael Chan
3430b674bef73eac24a4c41cfd5af8be516f4936844Michael Chan    public String getRingtoneTitleFromUri(Context context, String uri) {
3440b674bef73eac24a4c41cfd5af8be516f4936844Michael Chan        if (TextUtils.isEmpty(uri)) {
3450b674bef73eac24a4c41cfd5af8be516f4936844Michael Chan            return null;
3460b674bef73eac24a4c41cfd5af8be516f4936844Michael Chan        }
3470b674bef73eac24a4c41cfd5af8be516f4936844Michael Chan
3480b674bef73eac24a4c41cfd5af8be516f4936844Michael Chan        Ringtone ring = RingtoneManager.getRingtone(getActivity(), Uri.parse(uri));
3490b674bef73eac24a4c41cfd5af8be516f4936844Michael Chan        if (ring != null) {
3500b674bef73eac24a4c41cfd5af8be516f4936844Michael Chan            return ring.getTitle(context);
3510b674bef73eac24a4c41cfd5af8be516f4936844Michael Chan        }
3520b674bef73eac24a4c41cfd5af8be516f4936844Michael Chan        return null;
3530b674bef73eac24a4c41cfd5af8be516f4936844Michael Chan    }
3540b674bef73eac24a4c41cfd5af8be516f4936844Michael Chan
355cca9ecb23b079c47856af22f89f7a6f3dec7a492Mason Tang    /**
356cca9ecb23b079c47856af22f89f7a6f3dec7a492Mason Tang     * If necessary, upgrades previous versions of preferences to the current
357cca9ecb23b079c47856af22f89f7a6f3dec7a492Mason Tang     * set of keys and values.
358cca9ecb23b079c47856af22f89f7a6f3dec7a492Mason Tang     * @param prefs the preferences to upgrade
359cca9ecb23b079c47856af22f89f7a6f3dec7a492Mason Tang     */
360cca9ecb23b079c47856af22f89f7a6f3dec7a492Mason Tang    private void migrateOldPreferences(SharedPreferences prefs) {
361cca9ecb23b079c47856af22f89f7a6f3dec7a492Mason Tang        // If needed, migrate vibration setting from a previous version
3620b674bef73eac24a4c41cfd5af8be516f4936844Michael Chan
3630b674bef73eac24a4c41cfd5af8be516f4936844Michael Chan        mVibrate.setChecked(Utils.getDefaultVibrate(getActivity(), prefs));
3640b674bef73eac24a4c41cfd5af8be516f4936844Michael Chan
365cca9ecb23b079c47856af22f89f7a6f3dec7a492Mason Tang        // If needed, migrate the old alerts type settin
366cca9ecb23b079c47856af22f89f7a6f3dec7a492Mason Tang        if (!prefs.contains(KEY_ALERTS) && prefs.contains(KEY_ALERTS_TYPE)) {
367cca9ecb23b079c47856af22f89f7a6f3dec7a492Mason Tang            String type = prefs.getString(KEY_ALERTS_TYPE, ALERT_TYPE_STATUS_BAR);
368cca9ecb23b079c47856af22f89f7a6f3dec7a492Mason Tang            if (type.equals(ALERT_TYPE_OFF)) {
369cca9ecb23b079c47856af22f89f7a6f3dec7a492Mason Tang                mAlert.setChecked(false);
370cca9ecb23b079c47856af22f89f7a6f3dec7a492Mason Tang                mPopup.setChecked(false);
371cca9ecb23b079c47856af22f89f7a6f3dec7a492Mason Tang                mPopup.setEnabled(false);
372cca9ecb23b079c47856af22f89f7a6f3dec7a492Mason Tang            } else if (type.equals(ALERT_TYPE_STATUS_BAR)) {
373cca9ecb23b079c47856af22f89f7a6f3dec7a492Mason Tang                mAlert.setChecked(true);
374cca9ecb23b079c47856af22f89f7a6f3dec7a492Mason Tang                mPopup.setChecked(false);
375cca9ecb23b079c47856af22f89f7a6f3dec7a492Mason Tang                mPopup.setEnabled(true);
376cca9ecb23b079c47856af22f89f7a6f3dec7a492Mason Tang            } else if (type.equals(ALERT_TYPE_ALERTS)) {
377cca9ecb23b079c47856af22f89f7a6f3dec7a492Mason Tang                mAlert.setChecked(true);
378cca9ecb23b079c47856af22f89f7a6f3dec7a492Mason Tang                mPopup.setChecked(true);
379cca9ecb23b079c47856af22f89f7a6f3dec7a492Mason Tang                mPopup.setEnabled(true);
380cca9ecb23b079c47856af22f89f7a6f3dec7a492Mason Tang            }
381cca9ecb23b079c47856af22f89f7a6f3dec7a492Mason Tang            // clear out the old setting
382cca9ecb23b079c47856af22f89f7a6f3dec7a492Mason Tang            prefs.edit().remove(KEY_ALERTS_TYPE).commit();
383cca9ecb23b079c47856af22f89f7a6f3dec7a492Mason Tang        }
384cca9ecb23b079c47856af22f89f7a6f3dec7a492Mason Tang    }
385cca9ecb23b079c47856af22f89f7a6f3dec7a492Mason Tang
386cca9ecb23b079c47856af22f89f7a6f3dec7a492Mason Tang    /**
387cca9ecb23b079c47856af22f89f7a6f3dec7a492Mason Tang     * Keeps the dependent settings in sync with the parent preference, so for
388cca9ecb23b079c47856af22f89f7a6f3dec7a492Mason Tang     * example, when notifications are turned off, we disable the preferences
389cca9ecb23b079c47856af22f89f7a6f3dec7a492Mason Tang     * for configuring the exact notification behavior.
390cca9ecb23b079c47856af22f89f7a6f3dec7a492Mason Tang     */
391146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    private void updateChildPreferences() {
392cca9ecb23b079c47856af22f89f7a6f3dec7a492Mason Tang        if (mAlert.isChecked()) {
3930b674bef73eac24a4c41cfd5af8be516f4936844Michael Chan            mVibrate.setEnabled(true);
394cca9ecb23b079c47856af22f89f7a6f3dec7a492Mason Tang            mRingtone.setEnabled(true);
395cca9ecb23b079c47856af22f89f7a6f3dec7a492Mason Tang            mPopup.setEnabled(true);
396cca9ecb23b079c47856af22f89f7a6f3dec7a492Mason Tang        } else {
3970b674bef73eac24a4c41cfd5af8be516f4936844Michael Chan            mVibrate.setEnabled(false);
398146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            mRingtone.setEnabled(false);
399cca9ecb23b079c47856af22f89f7a6f3dec7a492Mason Tang            mPopup.setEnabled(false);
400146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        }
401146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    }
4023a0e67b1d81a6170a844bb6f9e294efa3a42650aMason Tang
4033a0e67b1d81a6170a844bb6f9e294efa3a42650aMason Tang
404d644b0df14ae6e204369b3454d16976fba32f15cDaisuke Miyakawa    @Override
405d644b0df14ae6e204369b3454d16976fba32f15cDaisuke Miyakawa    public boolean onPreferenceTreeClick(
406d644b0df14ae6e204369b3454d16976fba32f15cDaisuke Miyakawa            PreferenceScreen preferenceScreen, Preference preference) {
407d644b0df14ae6e204369b3454d16976fba32f15cDaisuke Miyakawa        final String key = preference.getKey();
408e98dca7e0042f7b36788b0e5d8dc6e94048c895cMichael Chan        if (KEY_CLEAR_SEARCH_HISTORY.equals(key)) {
4094b441bd6544fe6d11be75f974a41afd8fa040a4fDaisuke Miyakawa            SearchRecentSuggestions suggestions = new SearchRecentSuggestions(getActivity(),
410064beb957ae443760118023a40fd7001eb11c1a1RoboErik                    Utils.getSearchAuthority(getActivity()),
4113a0e67b1d81a6170a844bb6f9e294efa3a42650aMason Tang                    CalendarRecentSuggestionsProvider.MODE);
4123a0e67b1d81a6170a844bb6f9e294efa3a42650aMason Tang            suggestions.clearHistory();
4134b441bd6544fe6d11be75f974a41afd8fa040a4fDaisuke Miyakawa            Toast.makeText(getActivity(), R.string.search_history_cleared,
4143a0e67b1d81a6170a844bb6f9e294efa3a42650aMason Tang                    Toast.LENGTH_SHORT).show();
4153a0e67b1d81a6170a844bb6f9e294efa3a42650aMason Tang            return true;
416e98dca7e0042f7b36788b0e5d8dc6e94048c895cMichael Chan        } else {
417e98dca7e0042f7b36788b0e5d8dc6e94048c895cMichael Chan            return super.onPreferenceTreeClick(preferenceScreen, preference);
4183a0e67b1d81a6170a844bb6f9e294efa3a42650aMason Tang        }
4193a0e67b1d81a6170a844bb6f9e294efa3a42650aMason Tang    }
4203a0e67b1d81a6170a844bb6f9e294efa3a42650aMason Tang
421974343a44435bedc104d89fa98fdeb1ccf362501James Kung    @Override
422974343a44435bedc104d89fa98fdeb1ccf362501James Kung    public void onTimeZoneSet(TimeZoneInfo tzi) {
42300040c6e081d367567fd579f881e58d448154622Sam Blitzstein        if (mTzPickerUtils == null) {
42400040c6e081d367567fd579f881e58d448154622Sam Blitzstein            mTzPickerUtils = new TimeZonePickerUtils(getActivity());
42500040c6e081d367567fd579f881e58d448154622Sam Blitzstein        }
42600040c6e081d367567fd579f881e58d448154622Sam Blitzstein
427dd67b8db0c2e39bee143cd09fc9055b25849910aSam Blitzstein        final CharSequence timezoneName = mTzPickerUtils.getGmtDisplayName(
428b69ea6371541b833662acbb835ae758316e1d0bbSam Blitzstein                getActivity(), tzi.mTzId, System.currentTimeMillis(), false);
429974343a44435bedc104d89fa98fdeb1ccf362501James Kung        mHomeTZ.setSummary(timezoneName);
430974343a44435bedc104d89fa98fdeb1ccf362501James Kung        Utils.setTimeZone(getActivity(), tzi.mTzId);
431974343a44435bedc104d89fa98fdeb1ccf362501James Kung    }
432146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project}
433