package com.geek_alarm.android.activities; import android.content.Intent; import android.media.Ringtone; import android.media.RingtoneManager; import android.os.Bundle; import android.preference.ListPreference; import android.preference.Preference; import android.preference.PreferenceCategory; import android.util.Log; import com.geek_alarm.android.ListPreferenceWithValue; import com.geek_alarm.android.MuteUtils; import com.geek_alarm.android.NumberPickerPreference; import com.geek_alarm.android.R; import com.geek_alarm.android.Utils; import com.geek_alarm.android.db.TaskTypeDao; import com.geek_alarm.android.tasks.TaskType; public class PreferenceActivity extends android.preference.PreferenceActivity { // Values for task level ListPreference. private static final CharSequence[] LEVELS = { TaskType.Level.NONE.name(), TaskType.Level.EASY.name(), TaskType.Level.MEDIUM.name(), TaskType.Level.HARD.name() }; // Key for preference responsible for setting level for all tasks at the same time. private static final String ALL_TASKS_PREF = "all_tasks"; private TaskLevelChanged taskLevelChanged; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); taskLevelChanged = new TaskLevelChanged(); addPreferencesFromResource(R.xml.preferences); updateAlarmSoundSummary(); initMuteTime(); initTaskLevels(); initNumberOfTasks(); initMailTo(); Log.e("#######", Utils.getPreferences().getAll().toString()); } @Override protected void onResume() { super.onResume(); // We need somehow update current alarm sound after user changed in. // May be there is some better way to do it (e.g. with onActivityResult) but I don't know it. updateAlarmSoundSummary(); } private void initMailTo() { Preference mailTo = findPreference("feedback"); mailTo.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { public boolean onPreferenceClick(Preference preference) { Intent mailto = new Intent(Intent.ACTION_SEND); mailto.setType("text/plain"); mailto.putExtra(Intent.EXTRA_EMAIL, new String[]{"feedback@geek-alarm.com"}); mailto.putExtra(Intent.EXTRA_SUBJECT,"Feedback"); startActivity(Intent.createChooser(mailto, "Select email application.")); return true; } }); } private void initNumberOfTasks() { initNumberPicker(Utils.NUMBER_OF_ATTEMPTS, Utils.DEFAULT_NUMBER_OF_ATTEMPTS, 1, 100, 1, null); initNumberPicker(Utils.POSITIVE_BALANCE, Utils.DEFAULT_POSITIVE_BALANCE, 1, 100, 1, null); } private void initMuteTime() { initNumberPicker(MuteUtils.INITIAL_MUTE_TIME, MuteUtils.DEFAULT_INITIAL_MUTE_TIME, 5, 300, 5,"%ds"); initNumberPicker(MuteUtils.MUTE_TIME_STEP, MuteUtils.DEFAULT_MUTE_TIME_STEP, -300, 300, 5, "%ds"); } private void initNumberPicker(String key, int defaultValue, int minValue, int maxValue, int step, String format) { NumberPickerPreference preference = (NumberPickerPreference) findPreference(key); preference.setDefaultValue(defaultValue); preference.setMinValue(minValue); preference.setMaxValue(maxValue); preference.setStep(step); preference.setFormat(format); } /** * Initialize preferences for setting task levels. * It has 1 setting that changes levels for all tasks at the same time * and 1 setting for each task to set it's level. */ private void initTaskLevels() { ListPreference allTasksPref = (ListPreference) findPreference(ALL_TASKS_PREF); allTasksPref.setEntries(R.array.levels); allTasksPref.setEntryValues(LEVELS); allTasksPref.setPersistent(false); allTasksPref.setOnPreferenceChangeListener(taskLevelChanged); PreferenceCategory tasks = (PreferenceCategory) findPreference("tasks"); int order = 1; for (TaskType taskType : TaskTypeDao.INSTANCE.getAll()) { Preference preference = getTaskLevelPreference(taskType); preference.setOrder(order++); tasks.addPreference(preference); } } private void updateAlarmSoundSummary() { Ringtone ringtone = RingtoneManager.getRingtone(this, Utils.getCurrentAlarmSound()); String title = ringtone == null ? "" : ringtone.getTitle(this); findPreference("alarm_sound").setSummary(title); } /** * Create preference for changing task level. * @param taskType task for which we want to create preference. * @return list preference where values - {@code LEVELS} */ private ListPreference getTaskLevelPreference(TaskType taskType) { final ListPreference preference = new ListPreferenceWithValue(this); preference.setKey(taskType.getType()); preference.setEntries(R.array.levels); preference.setEntryValues(LEVELS); preference.setTitle(taskType.getName()); preference.setValue(taskType.getLevel().name()); preference.setPersistent(false); preference.setLayoutResource(R.layout.preference_with_value); preference.setOnPreferenceChangeListener(taskLevelChanged); return preference; } /** * Listener to save all changes made to task levels. */ private class TaskLevelChanged implements Preference.OnPreferenceChangeListener { public boolean onPreferenceChange(Preference preference, Object newValue) { if (preference.getKey().equals(ALL_TASKS_PREF)) { // Modify all tasks. TaskType.Level level = TaskType.Level.valueOf(newValue.toString()); for (TaskType taskType : TaskTypeDao.INSTANCE.getAll()) { taskType.setLevel(level); TaskTypeDao.INSTANCE.update(taskType); ListPreference listPreference = (ListPreference) findPreference(taskType.getType()); listPreference.setValue(newValue.toString()); } } else { // Modify single task. TaskType taskType = TaskTypeDao.INSTANCE.findByType(preference.getKey()); taskType.setLevel(TaskType.Level.valueOf(newValue.toString())); TaskTypeDao.INSTANCE.update(taskType); } return true; } } }