blob: 248bb6f41ba7100ff299dddfecd640e74462c6c5 [file] [log] [blame]
/*
* Copyright (C) 2009 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.deskclock;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
import android.media.AudioManager;
import android.os.Bundle;
import android.preference.CheckBoxPreference;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.PreferenceFragment;
import android.text.format.DateUtils;
import android.view.Menu;
import android.view.MenuItem;
import com.android.deskclock.worldclock.Cities;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.TimeZone;
/**
* Settings for the Alarm Clock.
*/
public class SettingsActivity extends BaseActivity {
public static final String KEY_ALARM_SNOOZE = "snooze_duration";
public static final String KEY_ALARM_VOLUME = "volume_setting";
public static final String KEY_VOLUME_BEHAVIOR = "volume_button_setting";
public static final String KEY_AUTO_SILENCE = "auto_silence";
public static final String KEY_CLOCK_STYLE = "clock_style";
public static final String KEY_HOME_TZ = "home_time_zone";
public static final String KEY_AUTO_HOME_CLOCK = "automatic_home_clock";
public static final String KEY_VOLUME_BUTTONS = "volume_button_setting";
public static final String KEY_WEEK_START = "week_start";
public static final String DEFAULT_VOLUME_BEHAVIOR = "0";
public static final String VOLUME_BEHAVIOR_SNOOZE = "1";
public static final String VOLUME_BEHAVIOR_DISMISS = "2";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setVolumeControlStream(AudioManager.STREAM_ALARM);
setContentView(R.layout.settings);
}
@Override
public boolean onOptionsItemSelected (MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
finish();
return true;
default:
break;
}
return super.onOptionsItemSelected(item);
}
@Override
public boolean onCreateOptionsMenu (Menu menu) {
getMenuInflater().inflate(R.menu.settings_menu, menu);
MenuItem help = menu.findItem(R.id.menu_item_help);
if (help != null) {
Utils.prepareHelpMenuItem(this, help);
}
return super.onCreateOptionsMenu(menu);
}
public static class PrefsFragment extends PreferenceFragment
implements Preference.OnPreferenceChangeListener, Preference.OnPreferenceClickListener {
private static CharSequence[][] mTimezones;
private long mTime;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.settings);
// We don't want to reconstruct the timezone list every single time onResume() is
// called so we do it once in onCreate
if (mTimezones == null) {
mTime = System.currentTimeMillis();
mTimezones = getAllTimezones();
}
final ListPreference homeTimezonePref = (ListPreference) findPreference(KEY_HOME_TZ);
homeTimezonePref.setEntryValues(mTimezones[0]);
homeTimezonePref.setEntries(mTimezones[1]);
homeTimezonePref.setSummary(homeTimezonePref.getEntry());
homeTimezonePref.setOnPreferenceChangeListener(this);
}
@Override
public void onResume() {
super.onResume();
// By default, do not recreate the DeskClock activity
getActivity().setResult(RESULT_CANCELED);
refresh();
}
@Override
public boolean onPreferenceChange(Preference pref, Object newValue) {
if (KEY_AUTO_SILENCE.equals(pref.getKey())) {
final ListPreference autoSilencePref = (ListPreference) pref;
String delay = (String) newValue;
updateAutoSnoozeSummary(autoSilencePref, delay);
} else if (KEY_CLOCK_STYLE.equals(pref.getKey())) {
final ListPreference clockStylePref = (ListPreference) pref;
final int idx = clockStylePref.findIndexOfValue((String) newValue);
clockStylePref.setSummary(clockStylePref.getEntries()[idx]);
} else if (KEY_HOME_TZ.equals(pref.getKey())) {
final ListPreference homeTimezonePref = (ListPreference) pref;
final int idx = homeTimezonePref.findIndexOfValue((String) newValue);
homeTimezonePref.setSummary(homeTimezonePref.getEntries()[idx]);
notifyHomeTimeZoneChanged();
} else if (KEY_AUTO_HOME_CLOCK.equals(pref.getKey())) {
final boolean autoHomeClockEnabled = ((CheckBoxPreference) pref).isChecked();
final Preference homeTimeZonePref = findPreference(KEY_HOME_TZ);
homeTimeZonePref.setEnabled(!autoHomeClockEnabled);
notifyHomeTimeZoneChanged();
} else if (KEY_VOLUME_BUTTONS.equals(pref.getKey())) {
final ListPreference volumeButtonsPref = (ListPreference) pref;
final int index = volumeButtonsPref.findIndexOfValue((String) newValue);
volumeButtonsPref.setSummary(volumeButtonsPref.getEntries()[index]);
} else if (KEY_WEEK_START.equals(pref.getKey())) {
final ListPreference weekStartPref = (ListPreference) findPreference(KEY_WEEK_START);
final int idx = weekStartPref.findIndexOfValue((String) newValue);
weekStartPref.setSummary(weekStartPref.getEntries()[idx]);
}
// Set result so DeskClock knows to refresh itself
getActivity().setResult(RESULT_OK);
return true;
}
@Override
public boolean onPreferenceClick(Preference pref) {
final Activity activity = getActivity();
if (activity == null) {
return false;
}
if (KEY_ALARM_VOLUME.equals(pref.getKey())) {
final AudioManager audioManager =
(AudioManager) activity.getSystemService(Context.AUDIO_SERVICE);
audioManager.adjustStreamVolume(AudioManager.STREAM_ALARM,
AudioManager.ADJUST_SAME, AudioManager.FLAG_SHOW_UI);
return true;
}
return false;
}
/**
* Returns an array of ids/time zones. This returns a double indexed array
* of ids and time zones for Calendar. It is an inefficient method and
* shouldn't be called often, but can be used for one time generation of
* this list.
*
* @return double array of tz ids and tz names
*/
public CharSequence[][] getAllTimezones() {
Resources resources = this.getResources();
String[] ids = resources.getStringArray(R.array.timezone_values);
String[] labels = resources.getStringArray(R.array.timezone_labels);
int minLength = ids.length;
if (ids.length != labels.length) {
minLength = Math.min(minLength, labels.length);
LogUtils.e("Timezone ids and labels have different length!");
}
List<TimeZoneRow> timezones = new ArrayList<>();
for (int i = 0; i < minLength; i++) {
timezones.add(new TimeZoneRow(ids[i], labels[i]));
}
Collections.sort(timezones);
CharSequence[][] timeZones = new CharSequence[2][timezones.size()];
int i = 0;
for (TimeZoneRow row : timezones) {
timeZones[0][i] = row.mId;
timeZones[1][i++] = row.mDisplayName;
}
return timeZones;
}
private void refresh() {
final ListPreference autoSilencePref =
(ListPreference) findPreference(KEY_AUTO_SILENCE);
String delay = autoSilencePref.getValue();
updateAutoSnoozeSummary(autoSilencePref, delay);
autoSilencePref.setOnPreferenceChangeListener(this);
final ListPreference clockStylePref = (ListPreference) findPreference(KEY_CLOCK_STYLE);
clockStylePref.setSummary(clockStylePref.getEntry());
clockStylePref.setOnPreferenceChangeListener(this);
final Preference autoHomeClockPref = findPreference(KEY_AUTO_HOME_CLOCK);
final boolean autoHomeClockEnabled =
((CheckBoxPreference) autoHomeClockPref).isChecked();
autoHomeClockPref.setOnPreferenceChangeListener(this);
final ListPreference homeTimezonePref = (ListPreference) findPreference(KEY_HOME_TZ);
homeTimezonePref.setEnabled(autoHomeClockEnabled);
homeTimezonePref.setSummary(homeTimezonePref.getEntry());
homeTimezonePref.setOnPreferenceChangeListener(this);
final ListPreference volumeButtonsPref =
(ListPreference) findPreference(KEY_VOLUME_BUTTONS);
volumeButtonsPref.setSummary(volumeButtonsPref.getEntry());
volumeButtonsPref.setOnPreferenceChangeListener(this);
final Preference volumePref = findPreference(KEY_ALARM_VOLUME);
volumePref.setOnPreferenceClickListener(this);
final SnoozeLengthDialog snoozePref =
(SnoozeLengthDialog) findPreference(KEY_ALARM_SNOOZE);
snoozePref.setSummary();
final ListPreference weekStartPref = (ListPreference) findPreference(KEY_WEEK_START);
// Set the default value programmatically
final String value = weekStartPref.getValue();
final int idx = weekStartPref.findIndexOfValue(
value == null ? String.valueOf(Utils.DEFAULT_WEEK_START) : value);
weekStartPref.setValueIndex(idx);
weekStartPref.setSummary(weekStartPref.getEntries()[idx]);
weekStartPref.setOnPreferenceChangeListener(this);
}
private void updateAutoSnoozeSummary(ListPreference listPref, String delay) {
int i = Integer.parseInt(delay);
if (i == -1) {
listPref.setSummary(R.string.auto_silence_never);
} else {
listPref.setSummary(Utils.getNumberFormattedQuantityString(getActivity(),
R.plurals.auto_silence_summary, i));
}
}
private void notifyHomeTimeZoneChanged() {
Intent i = new Intent(Cities.WORLDCLOCK_UPDATE_INTENT);
getActivity().sendBroadcast(i);
}
private class TimeZoneRow implements Comparable<TimeZoneRow> {
private static final boolean SHOW_DAYLIGHT_SAVINGS_INDICATOR = false;
public final String mId;
public final String mDisplayName;
public final int mOffset;
public TimeZoneRow(String id, String name) {
mId = id;
TimeZone tz = TimeZone.getTimeZone(id);
boolean useDaylightTime = tz.useDaylightTime();
mOffset = tz.getOffset(mTime);
mDisplayName = buildGmtDisplayName(name, useDaylightTime);
}
@Override
public int compareTo(TimeZoneRow another) {
return mOffset - another.mOffset;
}
public String buildGmtDisplayName(String displayName, boolean useDaylightTime) {
int p = Math.abs(mOffset);
StringBuilder name = new StringBuilder("(GMT");
name.append(mOffset < 0 ? '-' : '+');
name.append(p / DateUtils.HOUR_IN_MILLIS);
name.append(':');
int min = p / 60000;
min %= 60;
if (min < 10) {
name.append('0');
}
name.append(min);
name.append(") ");
name.append(displayName);
if (useDaylightTime && SHOW_DAYLIGHT_SAVINGS_INDICATOR) {
name.append(" \u2600"); // Sun symbol
}
return name.toString();
}
}
}
}