113e902189e05f09a890b9d6673a6f451c758542aJason Parekh/*
213e902189e05f09a890b9d6673a6f451c758542aJason Parekh * Copyright (C) 2009 The Android Open Source Project
313e902189e05f09a890b9d6673a6f451c758542aJason Parekh *
413e902189e05f09a890b9d6673a6f451c758542aJason Parekh * Licensed under the Apache License, Version 2.0 (the "License");
513e902189e05f09a890b9d6673a6f451c758542aJason Parekh * you may not use this file except in compliance with the License.
613e902189e05f09a890b9d6673a6f451c758542aJason Parekh * You may obtain a copy of the License at
713e902189e05f09a890b9d6673a6f451c758542aJason Parekh *
813e902189e05f09a890b9d6673a6f451c758542aJason Parekh *      http://www.apache.org/licenses/LICENSE-2.0
913e902189e05f09a890b9d6673a6f451c758542aJason Parekh *
1013e902189e05f09a890b9d6673a6f451c758542aJason Parekh * Unless required by applicable law or agreed to in writing, software
1113e902189e05f09a890b9d6673a6f451c758542aJason Parekh * distributed under the License is distributed on an "AS IS" BASIS,
1213e902189e05f09a890b9d6673a6f451c758542aJason Parekh * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1313e902189e05f09a890b9d6673a6f451c758542aJason Parekh * See the License for the specific language governing permissions and
1413e902189e05f09a890b9d6673a6f451c758542aJason Parekh * limitations under the License.
1513e902189e05f09a890b9d6673a6f451c758542aJason Parekh */
1613e902189e05f09a890b9d6673a6f451c758542aJason Parekh
17fa954248b41b567dfa2ddd7bd063d3936a51758eDaniel Sandlerpackage com.android.deskclock;
1813e902189e05f09a890b9d6673a6f451c758542aJason Parekh
19be8244565cd5e987eaf1bf8754a1750c95477b43Itzhak Katzenelsonimport android.app.ActionBar;
20c1d293908f835285f87d6c5dd07df76fe3127519Isaac Katzenelsonimport android.content.Intent;
21f72e6889ec05b5f6e72d061f87d003281c445febYorke Leeimport android.content.res.Resources;
2213e902189e05f09a890b9d6673a6f451c758542aJason Parekhimport android.media.AudioManager;
2313e902189e05f09a890b9d6673a6f451c758542aJason Parekhimport android.os.Bundle;
2413e902189e05f09a890b9d6673a6f451c758542aJason Parekhimport android.preference.CheckBoxPreference;
25abbdb5687b2f4505b16d3f8fad3efbab3ea1cf90Patrick Scottimport android.preference.ListPreference;
2613e902189e05f09a890b9d6673a6f451c758542aJason Parekhimport android.preference.Preference;
2713e902189e05f09a890b9d6673a6f451c758542aJason Parekhimport android.preference.PreferenceActivity;
2813e902189e05f09a890b9d6673a6f451c758542aJason Parekhimport android.preference.PreferenceScreen;
2913e902189e05f09a890b9d6673a6f451c758542aJason Parekhimport android.provider.Settings;
30f72e6889ec05b5f6e72d061f87d003281c445febYorke Leeimport android.text.format.DateUtils;
3163211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelsonimport android.view.Menu;
3263211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelsonimport android.view.MenuItem;
3313e902189e05f09a890b9d6673a6f451c758542aJason Parekh
34c1d293908f835285f87d6c5dd07df76fe3127519Isaac Katzenelsonimport com.android.deskclock.worldclock.Cities;
35c1d293908f835285f87d6c5dd07df76fe3127519Isaac Katzenelson
36e06d867375f0d64f35c229b04f07d4cd374fa6f0Isaac Katzenelsonimport java.util.ArrayList;
37e06d867375f0d64f35c229b04f07d4cd374fa6f0Isaac Katzenelsonimport java.util.Collections;
38e06d867375f0d64f35c229b04f07d4cd374fa6f0Isaac Katzenelsonimport java.util.List;
39f72e6889ec05b5f6e72d061f87d003281c445febYorke Leeimport java.util.TimeZone;
40f72e6889ec05b5f6e72d061f87d003281c445febYorke Lee
4113e902189e05f09a890b9d6673a6f451c758542aJason Parekh/**
4213e902189e05f09a890b9d6673a6f451c758542aJason Parekh * Settings for the Alarm Clock.
4313e902189e05f09a890b9d6673a6f451c758542aJason Parekh */
44abbdb5687b2f4505b16d3f8fad3efbab3ea1cf90Patrick Scottpublic class SettingsActivity extends PreferenceActivity
45abbdb5687b2f4505b16d3f8fad3efbab3ea1cf90Patrick Scott        implements Preference.OnPreferenceChangeListener {
4613e902189e05f09a890b9d6673a6f451c758542aJason Parekh
4713e902189e05f09a890b9d6673a6f451c758542aJason Parekh    private static final int ALARM_STREAM_TYPE_BIT =
4813e902189e05f09a890b9d6673a6f451c758542aJason Parekh            1 << AudioManager.STREAM_ALARM;
49abbdb5687b2f4505b16d3f8fad3efbab3ea1cf90Patrick Scott
5063211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson    static final String KEY_ALARM_IN_SILENT_MODE =
5113e902189e05f09a890b9d6673a6f451c758542aJason Parekh            "alarm_in_silent_mode";
5289811e14c23c7fe6f88a21d13429613b756bce3fPatrick Scott    static final String KEY_ALARM_SNOOZE =
53abbdb5687b2f4505b16d3f8fad3efbab3ea1cf90Patrick Scott            "snooze_duration";
5489811e14c23c7fe6f88a21d13429613b756bce3fPatrick Scott    static final String KEY_VOLUME_BEHAVIOR =
5589811e14c23c7fe6f88a21d13429613b756bce3fPatrick Scott            "volume_button_setting";
5628dbcd13adec986d5d2c08b71edab35d84b40958Patrick Scott    static final String KEY_AUTO_SILENCE =
5728dbcd13adec986d5d2c08b71edab35d84b40958Patrick Scott            "auto_silence";
585c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson    public static final String KEY_CLOCK_STYLE =
5963211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson            "clock_style";
605c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson    public static final String KEY_HOME_TZ =
6163211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson            "home_time_zone";
625c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson    public static final String KEY_AUTO_HOME_CLOCK =
6363211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson            "automatic_home_clock";
6463211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson    static final String KEY_VOLUME_BUTTONS =
6563211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson            "volume_button_setting";
66f72e6889ec05b5f6e72d061f87d003281c445febYorke Lee
67a3458d9448c4131b530361fb87edb28baebb647eIsaac Katzenelson    public static final String DEFAULT_VOLUME_BEHAVIOR = "0";
68a3458d9448c4131b530361fb87edb28baebb647eIsaac Katzenelson
69f72e6889ec05b5f6e72d061f87d003281c445febYorke Lee    private static CharSequence[][] mTimezones;
70f72e6889ec05b5f6e72d061f87d003281c445febYorke Lee    private long mTime;
71f72e6889ec05b5f6e72d061f87d003281c445febYorke Lee
72f72e6889ec05b5f6e72d061f87d003281c445febYorke Lee
7313e902189e05f09a890b9d6673a6f451c758542aJason Parekh    @Override
7413e902189e05f09a890b9d6673a6f451c758542aJason Parekh    protected void onCreate(Bundle savedInstanceState) {
7513e902189e05f09a890b9d6673a6f451c758542aJason Parekh        super.onCreate(savedInstanceState);
7613e902189e05f09a890b9d6673a6f451c758542aJason Parekh        addPreferencesFromResource(R.xml.settings);
77e7bf7ed4c4d3680d838a1581832d22be89e37e46Patrick Scott
78be8244565cd5e987eaf1bf8754a1750c95477b43Itzhak Katzenelson        ActionBar actionBar = getActionBar();
79be8244565cd5e987eaf1bf8754a1750c95477b43Itzhak Katzenelson        if (actionBar != null) {
80be8244565cd5e987eaf1bf8754a1750c95477b43Itzhak Katzenelson            actionBar.setDisplayOptions(ActionBar.DISPLAY_HOME_AS_UP, ActionBar.DISPLAY_HOME_AS_UP);
81be8244565cd5e987eaf1bf8754a1750c95477b43Itzhak Katzenelson        }
82f72e6889ec05b5f6e72d061f87d003281c445febYorke Lee
83f72e6889ec05b5f6e72d061f87d003281c445febYorke Lee        // We don't want to reconstruct the timezone list every single time
84f72e6889ec05b5f6e72d061f87d003281c445febYorke Lee        // onResume() is called so we do it once in onCreate
85f72e6889ec05b5f6e72d061f87d003281c445febYorke Lee        ListPreference listPref;
86f72e6889ec05b5f6e72d061f87d003281c445febYorke Lee        listPref = (ListPreference) findPreference(KEY_HOME_TZ);
87f72e6889ec05b5f6e72d061f87d003281c445febYorke Lee        if (mTimezones == null) {
88f72e6889ec05b5f6e72d061f87d003281c445febYorke Lee            mTime = System.currentTimeMillis();
89f72e6889ec05b5f6e72d061f87d003281c445febYorke Lee            mTimezones = getAllTimezones();
90f72e6889ec05b5f6e72d061f87d003281c445febYorke Lee        }
91f72e6889ec05b5f6e72d061f87d003281c445febYorke Lee
92f72e6889ec05b5f6e72d061f87d003281c445febYorke Lee        listPref.setEntryValues(mTimezones[0]);
93f72e6889ec05b5f6e72d061f87d003281c445febYorke Lee        listPref.setEntries(mTimezones[1]);
94f72e6889ec05b5f6e72d061f87d003281c445febYorke Lee        listPref.setSummary(listPref.getEntry());
95f72e6889ec05b5f6e72d061f87d003281c445febYorke Lee        listPref.setOnPreferenceChangeListener(this);
9613e902189e05f09a890b9d6673a6f451c758542aJason Parekh    }
9713e902189e05f09a890b9d6673a6f451c758542aJason Parekh
9813e902189e05f09a890b9d6673a6f451c758542aJason Parekh    @Override
9913e902189e05f09a890b9d6673a6f451c758542aJason Parekh    protected void onResume() {
10013e902189e05f09a890b9d6673a6f451c758542aJason Parekh        super.onResume();
10113e902189e05f09a890b9d6673a6f451c758542aJason Parekh        refresh();
10213e902189e05f09a890b9d6673a6f451c758542aJason Parekh    }
10313e902189e05f09a890b9d6673a6f451c758542aJason Parekh
10413e902189e05f09a890b9d6673a6f451c758542aJason Parekh    @Override
10563211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson    public boolean onOptionsItemSelected (MenuItem item) {
10663211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson        switch (item.getItemId()) {
107be8244565cd5e987eaf1bf8754a1750c95477b43Itzhak Katzenelson            case android.R.id.home:
108be8244565cd5e987eaf1bf8754a1750c95477b43Itzhak Katzenelson                finish();
109be8244565cd5e987eaf1bf8754a1750c95477b43Itzhak Katzenelson                return true;
11063211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson            default:
11163211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson                break;
11263211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson        }
11363211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson        return super.onOptionsItemSelected(item);
11463211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson    }
11563211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson
11663211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson
11763211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson    @Override
11863211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson    public boolean onCreateOptionsMenu (Menu menu) {
11963211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson        getMenuInflater().inflate(R.menu.settings_menu, menu);
1206fc34de781d8fece646b16dc289bbf4c0b01fde4Isaac Katzenelson        MenuItem help = menu.findItem(R.id.menu_item_help);
1216fc34de781d8fece646b16dc289bbf4c0b01fde4Isaac Katzenelson        if (help != null) {
1226fc34de781d8fece646b16dc289bbf4c0b01fde4Isaac Katzenelson            Utils.prepareHelpMenuItem(this, help);
1236fc34de781d8fece646b16dc289bbf4c0b01fde4Isaac Katzenelson        }
12463211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson        return super.onCreateOptionsMenu(menu);
12563211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson    }
12663211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson
12763211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson    @Override
12813e902189e05f09a890b9d6673a6f451c758542aJason Parekh    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,
12913e902189e05f09a890b9d6673a6f451c758542aJason Parekh            Preference preference) {
13089811e14c23c7fe6f88a21d13429613b756bce3fPatrick Scott        if (KEY_ALARM_IN_SILENT_MODE.equals(preference.getKey())) {
13189811e14c23c7fe6f88a21d13429613b756bce3fPatrick Scott            CheckBoxPreference pref = (CheckBoxPreference) preference;
13213e902189e05f09a890b9d6673a6f451c758542aJason Parekh            int ringerModeStreamTypes = Settings.System.getInt(
13313e902189e05f09a890b9d6673a6f451c758542aJason Parekh                    getContentResolver(),
13413e902189e05f09a890b9d6673a6f451c758542aJason Parekh                    Settings.System.MODE_RINGER_STREAMS_AFFECTED, 0);
135abbdb5687b2f4505b16d3f8fad3efbab3ea1cf90Patrick Scott
13689811e14c23c7fe6f88a21d13429613b756bce3fPatrick Scott            if (pref.isChecked()) {
13713e902189e05f09a890b9d6673a6f451c758542aJason Parekh                ringerModeStreamTypes &= ~ALARM_STREAM_TYPE_BIT;
13813e902189e05f09a890b9d6673a6f451c758542aJason Parekh            } else {
13913e902189e05f09a890b9d6673a6f451c758542aJason Parekh                ringerModeStreamTypes |= ALARM_STREAM_TYPE_BIT;
14013e902189e05f09a890b9d6673a6f451c758542aJason Parekh            }
141abbdb5687b2f4505b16d3f8fad3efbab3ea1cf90Patrick Scott
14213e902189e05f09a890b9d6673a6f451c758542aJason Parekh            Settings.System.putInt(getContentResolver(),
14313e902189e05f09a890b9d6673a6f451c758542aJason Parekh                    Settings.System.MODE_RINGER_STREAMS_AFFECTED,
14413e902189e05f09a890b9d6673a6f451c758542aJason Parekh                    ringerModeStreamTypes);
145abbdb5687b2f4505b16d3f8fad3efbab3ea1cf90Patrick Scott
14613e902189e05f09a890b9d6673a6f451c758542aJason Parekh            return true;
14713e902189e05f09a890b9d6673a6f451c758542aJason Parekh        }
148abbdb5687b2f4505b16d3f8fad3efbab3ea1cf90Patrick Scott
14913e902189e05f09a890b9d6673a6f451c758542aJason Parekh        return super.onPreferenceTreeClick(preferenceScreen, preference);
15013e902189e05f09a890b9d6673a6f451c758542aJason Parekh    }
15113e902189e05f09a890b9d6673a6f451c758542aJason Parekh
15263211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson    @Override
153abbdb5687b2f4505b16d3f8fad3efbab3ea1cf90Patrick Scott    public boolean onPreferenceChange(Preference pref, Object newValue) {
15463211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson        if (KEY_AUTO_SILENCE.equals(pref.getKey())) {
15563211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson            final ListPreference listPref = (ListPreference) pref;
15663211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson            String delay = (String) newValue;
15763211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson            updateAutoSnoozeSummary(listPref, delay);
15863211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson        } else if (KEY_CLOCK_STYLE.equals(pref.getKey())) {
15928dbcd13adec986d5d2c08b71edab35d84b40958Patrick Scott            final ListPreference listPref = (ListPreference) pref;
16028dbcd13adec986d5d2c08b71edab35d84b40958Patrick Scott            final int idx = listPref.findIndexOfValue((String) newValue);
16128dbcd13adec986d5d2c08b71edab35d84b40958Patrick Scott            listPref.setSummary(listPref.getEntries()[idx]);
16263211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson        } else if (KEY_HOME_TZ.equals(pref.getKey())) {
16328dbcd13adec986d5d2c08b71edab35d84b40958Patrick Scott            final ListPreference listPref = (ListPreference) pref;
16463211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson            final int idx = listPref.findIndexOfValue((String) newValue);
16563211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson            listPref.setSummary(listPref.getEntries()[idx]);
166c1d293908f835285f87d6c5dd07df76fe3127519Isaac Katzenelson            notifyHomeTimeZoneChanged();
16763211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson        } else if (KEY_AUTO_HOME_CLOCK.equals(pref.getKey())) {
16863211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson            boolean state =((CheckBoxPreference) pref).isChecked();
16963211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson            Preference homeTimeZone = findPreference(KEY_HOME_TZ);
17063211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson            homeTimeZone.setEnabled(!state);
171c1d293908f835285f87d6c5dd07df76fe3127519Isaac Katzenelson            notifyHomeTimeZoneChanged();
17263211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson        } else if (KEY_VOLUME_BUTTONS.equals(pref.getKey())) {
17363211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson            final ListPreference listPref = (ListPreference) pref;
17463211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson            final int idx = listPref.findIndexOfValue((String) newValue);
17563211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson            listPref.setSummary(listPref.getEntries()[idx]);
17628dbcd13adec986d5d2c08b71edab35d84b40958Patrick Scott        }
177abbdb5687b2f4505b16d3f8fad3efbab3ea1cf90Patrick Scott        return true;
178abbdb5687b2f4505b16d3f8fad3efbab3ea1cf90Patrick Scott    }
179abbdb5687b2f4505b16d3f8fad3efbab3ea1cf90Patrick Scott
18028dbcd13adec986d5d2c08b71edab35d84b40958Patrick Scott    private void updateAutoSnoozeSummary(ListPreference listPref,
18128dbcd13adec986d5d2c08b71edab35d84b40958Patrick Scott            String delay) {
18228dbcd13adec986d5d2c08b71edab35d84b40958Patrick Scott        int i = Integer.parseInt(delay);
18328dbcd13adec986d5d2c08b71edab35d84b40958Patrick Scott        if (i == -1) {
18428dbcd13adec986d5d2c08b71edab35d84b40958Patrick Scott            listPref.setSummary(R.string.auto_silence_never);
18528dbcd13adec986d5d2c08b71edab35d84b40958Patrick Scott        } else {
18628dbcd13adec986d5d2c08b71edab35d84b40958Patrick Scott            listPref.setSummary(getString(R.string.auto_silence_summary, i));
18728dbcd13adec986d5d2c08b71edab35d84b40958Patrick Scott        }
18828dbcd13adec986d5d2c08b71edab35d84b40958Patrick Scott    }
18928dbcd13adec986d5d2c08b71edab35d84b40958Patrick Scott
190c1d293908f835285f87d6c5dd07df76fe3127519Isaac Katzenelson    private void notifyHomeTimeZoneChanged() {
191c1d293908f835285f87d6c5dd07df76fe3127519Isaac Katzenelson        Intent i = new Intent(Cities.WORLDCLOCK_UPDATE_INTENT);
192c1d293908f835285f87d6c5dd07df76fe3127519Isaac Katzenelson        sendBroadcast(i);
193c1d293908f835285f87d6c5dd07df76fe3127519Isaac Katzenelson    }
194c1d293908f835285f87d6c5dd07df76fe3127519Isaac Katzenelson
195c1d293908f835285f87d6c5dd07df76fe3127519Isaac Katzenelson
19613e902189e05f09a890b9d6673a6f451c758542aJason Parekh    private void refresh() {
19763211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson        ListPreference listPref = (ListPreference) findPreference(KEY_AUTO_SILENCE);
19863211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson        String delay = listPref.getValue();
19963211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson        updateAutoSnoozeSummary(listPref, delay);
20063211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson        listPref.setOnPreferenceChangeListener(this);
20163211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson
20263211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson        listPref = (ListPreference) findPreference(KEY_CLOCK_STYLE);
20328dbcd13adec986d5d2c08b71edab35d84b40958Patrick Scott        listPref.setSummary(listPref.getEntry());
20428dbcd13adec986d5d2c08b71edab35d84b40958Patrick Scott        listPref.setOnPreferenceChangeListener(this);
205abbdb5687b2f4505b16d3f8fad3efbab3ea1cf90Patrick Scott
20663211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson        Preference pref = findPreference(KEY_AUTO_HOME_CLOCK);
20763211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson        boolean state =((CheckBoxPreference) pref).isChecked();
20863211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson        pref.setOnPreferenceChangeListener(this);
20963211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson
21063211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson        listPref = (ListPreference)findPreference(KEY_HOME_TZ);
21163211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson        listPref.setEnabled(state);
21263211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson        listPref.setSummary(listPref.getEntry());
21363211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson
21463211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson        listPref = (ListPreference) findPreference(KEY_VOLUME_BUTTONS);
21563211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson        listPref.setSummary(listPref.getEntry());
21663211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson        listPref.setOnPreferenceChangeListener(this);
21763211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson
21863211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson        SnoozeLengthDialog snoozePref = (SnoozeLengthDialog) findPreference(KEY_ALARM_SNOOZE);
21963211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson        snoozePref.setSummary();
22028dbcd13adec986d5d2c08b71edab35d84b40958Patrick Scott    }
221e06d867375f0d64f35c229b04f07d4cd374fa6f0Isaac Katzenelson
222e06d867375f0d64f35c229b04f07d4cd374fa6f0Isaac Katzenelson    private class TimeZoneRow implements Comparable<TimeZoneRow> {
223e06d867375f0d64f35c229b04f07d4cd374fa6f0Isaac Katzenelson        private static final boolean SHOW_DAYLIGHT_SAVINGS_INDICATOR = false;
224e06d867375f0d64f35c229b04f07d4cd374fa6f0Isaac Katzenelson
225e06d867375f0d64f35c229b04f07d4cd374fa6f0Isaac Katzenelson        public final String mId;
226e06d867375f0d64f35c229b04f07d4cd374fa6f0Isaac Katzenelson        public final String mDisplayName;
227e06d867375f0d64f35c229b04f07d4cd374fa6f0Isaac Katzenelson        public final int mOffset;
228e06d867375f0d64f35c229b04f07d4cd374fa6f0Isaac Katzenelson
229e06d867375f0d64f35c229b04f07d4cd374fa6f0Isaac Katzenelson        public TimeZoneRow(String id, String name) {
230e06d867375f0d64f35c229b04f07d4cd374fa6f0Isaac Katzenelson            mId = id;
231e06d867375f0d64f35c229b04f07d4cd374fa6f0Isaac Katzenelson            TimeZone tz = TimeZone.getTimeZone(id);
232e06d867375f0d64f35c229b04f07d4cd374fa6f0Isaac Katzenelson            boolean useDaylightTime = tz.useDaylightTime();
233e06d867375f0d64f35c229b04f07d4cd374fa6f0Isaac Katzenelson            mOffset = tz.getOffset(mTime);
234e06d867375f0d64f35c229b04f07d4cd374fa6f0Isaac Katzenelson            mDisplayName = buildGmtDisplayName(id, name, useDaylightTime);
235e06d867375f0d64f35c229b04f07d4cd374fa6f0Isaac Katzenelson        }
236e06d867375f0d64f35c229b04f07d4cd374fa6f0Isaac Katzenelson
237e06d867375f0d64f35c229b04f07d4cd374fa6f0Isaac Katzenelson        @Override
238e06d867375f0d64f35c229b04f07d4cd374fa6f0Isaac Katzenelson        public int compareTo(TimeZoneRow another) {
239e06d867375f0d64f35c229b04f07d4cd374fa6f0Isaac Katzenelson            return mOffset - another.mOffset;
240e06d867375f0d64f35c229b04f07d4cd374fa6f0Isaac Katzenelson        }
241e06d867375f0d64f35c229b04f07d4cd374fa6f0Isaac Katzenelson
242e06d867375f0d64f35c229b04f07d4cd374fa6f0Isaac Katzenelson        public String buildGmtDisplayName(String id, String displayName, boolean useDaylightTime) {
243e06d867375f0d64f35c229b04f07d4cd374fa6f0Isaac Katzenelson            int p = Math.abs(mOffset);
244e06d867375f0d64f35c229b04f07d4cd374fa6f0Isaac Katzenelson            StringBuilder name = new StringBuilder("(GMT");
245e06d867375f0d64f35c229b04f07d4cd374fa6f0Isaac Katzenelson            name.append(mOffset < 0 ? '-' : '+');
246e06d867375f0d64f35c229b04f07d4cd374fa6f0Isaac Katzenelson
247e06d867375f0d64f35c229b04f07d4cd374fa6f0Isaac Katzenelson            name.append(p / DateUtils.HOUR_IN_MILLIS);
248e06d867375f0d64f35c229b04f07d4cd374fa6f0Isaac Katzenelson            name.append(':');
249e06d867375f0d64f35c229b04f07d4cd374fa6f0Isaac Katzenelson
250e06d867375f0d64f35c229b04f07d4cd374fa6f0Isaac Katzenelson            int min = p / 60000;
251e06d867375f0d64f35c229b04f07d4cd374fa6f0Isaac Katzenelson            min %= 60;
252e06d867375f0d64f35c229b04f07d4cd374fa6f0Isaac Katzenelson
253e06d867375f0d64f35c229b04f07d4cd374fa6f0Isaac Katzenelson            if (min < 10) {
254e06d867375f0d64f35c229b04f07d4cd374fa6f0Isaac Katzenelson                name.append('0');
255e06d867375f0d64f35c229b04f07d4cd374fa6f0Isaac Katzenelson            }
256e06d867375f0d64f35c229b04f07d4cd374fa6f0Isaac Katzenelson            name.append(min);
257e06d867375f0d64f35c229b04f07d4cd374fa6f0Isaac Katzenelson            name.append(") ");
258e06d867375f0d64f35c229b04f07d4cd374fa6f0Isaac Katzenelson            name.append(displayName);
259e06d867375f0d64f35c229b04f07d4cd374fa6f0Isaac Katzenelson            if (useDaylightTime && SHOW_DAYLIGHT_SAVINGS_INDICATOR) {
260e06d867375f0d64f35c229b04f07d4cd374fa6f0Isaac Katzenelson                name.append(" \u2600"); // Sun symbol
261e06d867375f0d64f35c229b04f07d4cd374fa6f0Isaac Katzenelson            }
262e06d867375f0d64f35c229b04f07d4cd374fa6f0Isaac Katzenelson            return name.toString();
263e06d867375f0d64f35c229b04f07d4cd374fa6f0Isaac Katzenelson        }
264e06d867375f0d64f35c229b04f07d4cd374fa6f0Isaac Katzenelson    }
265e06d867375f0d64f35c229b04f07d4cd374fa6f0Isaac Katzenelson
266e06d867375f0d64f35c229b04f07d4cd374fa6f0Isaac Katzenelson
267f72e6889ec05b5f6e72d061f87d003281c445febYorke Lee    /**
268f72e6889ec05b5f6e72d061f87d003281c445febYorke Lee     * Returns an array of ids/time zones. This returns a double indexed array
269f72e6889ec05b5f6e72d061f87d003281c445febYorke Lee     * of ids and time zones for Calendar. It is an inefficient method and
270f72e6889ec05b5f6e72d061f87d003281c445febYorke Lee     * shouldn't be called often, but can be used for one time generation of
271f72e6889ec05b5f6e72d061f87d003281c445febYorke Lee     * this list.
272f72e6889ec05b5f6e72d061f87d003281c445febYorke Lee     *
273f72e6889ec05b5f6e72d061f87d003281c445febYorke Lee     * @return double array of tz ids and tz names
274f72e6889ec05b5f6e72d061f87d003281c445febYorke Lee     */
275f72e6889ec05b5f6e72d061f87d003281c445febYorke Lee    public CharSequence[][] getAllTimezones() {
276f72e6889ec05b5f6e72d061f87d003281c445febYorke Lee        Resources resources = this.getResources();
277f72e6889ec05b5f6e72d061f87d003281c445febYorke Lee        String[] ids = resources.getStringArray(R.array.timezone_values);
278f72e6889ec05b5f6e72d061f87d003281c445febYorke Lee        String[] labels = resources.getStringArray(R.array.timezone_labels);
279f72e6889ec05b5f6e72d061f87d003281c445febYorke Lee        if (ids.length != labels.length) {
280f72e6889ec05b5f6e72d061f87d003281c445febYorke Lee            Log.wtf("Timezone ids and labels have different length!");
281f72e6889ec05b5f6e72d061f87d003281c445febYorke Lee        }
282e06d867375f0d64f35c229b04f07d4cd374fa6f0Isaac Katzenelson        List<TimeZoneRow> timezones = new ArrayList<TimeZoneRow>();
283f72e6889ec05b5f6e72d061f87d003281c445febYorke Lee        for (int i = 0; i < ids.length; i++) {
284e06d867375f0d64f35c229b04f07d4cd374fa6f0Isaac Katzenelson            timezones.add(new TimeZoneRow(ids[i], labels[i]));
285f72e6889ec05b5f6e72d061f87d003281c445febYorke Lee        }
286e06d867375f0d64f35c229b04f07d4cd374fa6f0Isaac Katzenelson        Collections.sort(timezones);
28763211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson
288e06d867375f0d64f35c229b04f07d4cd374fa6f0Isaac Katzenelson        CharSequence[][] timeZones = new CharSequence[2][timezones.size()];
289e06d867375f0d64f35c229b04f07d4cd374fa6f0Isaac Katzenelson        int i = 0;
290e06d867375f0d64f35c229b04f07d4cd374fa6f0Isaac Katzenelson        for (TimeZoneRow row : timezones) {
291e06d867375f0d64f35c229b04f07d4cd374fa6f0Isaac Katzenelson            timeZones[0][i] = row.mId;
292e06d867375f0d64f35c229b04f07d4cd374fa6f0Isaac Katzenelson            timeZones[1][i++] = row.mDisplayName;
293f72e6889ec05b5f6e72d061f87d003281c445febYorke Lee        }
294e06d867375f0d64f35c229b04f07d4cd374fa6f0Isaac Katzenelson        return timeZones;
295f72e6889ec05b5f6e72d061f87d003281c445febYorke Lee    }
296e06d867375f0d64f35c229b04f07d4cd374fa6f0Isaac Katzenelson
29713e902189e05f09a890b9d6673a6f451c758542aJason Parekh}
298