/**
* Copyright (c) 2012 Todoroo Inc
*
* See the file "LICENSE" for the full license governing this code.
*/
package com.todoroo.astrid.activity;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map.Entry;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.ResolveInfo;
import android.content.res.Resources;
import android.net.Uri;
import android.os.Bundle;
import android.preference.CheckBoxPreference;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceChangeListener;
import android.preference.Preference.OnPreferenceClickListener;
import android.preference.PreferenceCategory;
import android.preference.PreferenceGroup;
import android.preference.PreferenceManager;
import android.preference.PreferenceScreen;
import android.text.TextUtils;
import android.widget.Toast;
import com.crittercism.app.Crittercism;
import com.timsu.astrid.R;
import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.ContextManager;
import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.andlib.sql.Criterion;
import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.andlib.utility.DialogUtilities;
import com.todoroo.andlib.utility.Preferences;
import com.todoroo.andlib.utility.TodorooPreferenceActivity;
import com.todoroo.astrid.actfm.ActFmLoginActivity;
import com.todoroo.astrid.actfm.ActFmPreferences;
import com.todoroo.astrid.actfm.sync.ActFmPreferenceService;
import com.todoroo.astrid.api.AstridApiConstants;
import com.todoroo.astrid.dao.Database;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.data.TaskAttachment;
import com.todoroo.astrid.files.FileExplore;
import com.todoroo.astrid.gcal.CalendarStartupReceiver;
import com.todoroo.astrid.gtasks.GtasksPreferences;
import com.todoroo.astrid.helper.MetadataHelper;
import com.todoroo.astrid.service.AddOnService;
import com.todoroo.astrid.service.MarketStrategy.AmazonMarketStrategy;
import com.todoroo.astrid.service.StartupService;
import com.todoroo.astrid.service.StatisticsConstants;
import com.todoroo.astrid.service.StatisticsService;
import com.todoroo.astrid.service.TaskService;
import com.todoroo.astrid.sync.SyncProviderPreferences;
import com.todoroo.astrid.ui.ContactListAdapter;
import com.todoroo.astrid.ui.TaskListFragmentPager;
import com.todoroo.astrid.utility.AstridDefaultPreferenceSpec;
import com.todoroo.astrid.utility.AstridLitePreferenceSpec;
import com.todoroo.astrid.utility.AstridPreferenceSpec;
import com.todoroo.astrid.utility.Constants;
import com.todoroo.astrid.utility.Flags;
import com.todoroo.astrid.voice.VoiceInputAssistant;
import com.todoroo.astrid.voice.VoiceOutputService;
import com.todoroo.astrid.voice.VoiceRecognizer;
import com.todoroo.astrid.welcome.tutorial.WelcomeWalkthrough;
import com.todoroo.astrid.widget.TasksWidget;
/**
* Displays the preference screen for users to edit their preferences
*
* @author Tim Su <tim@todoroo.com>
*
*/
public class EditPreferences extends TodorooPreferenceActivity {
private static final String SUPPORT_URL = "http://astrid.helpshift.com/a/astrid/?p=android"; //$NON-NLS-1$
private static final int APPEARANCE_PREFERENCE = 4;
private static final int REQUEST_CODE_SYNC = 0;
private static final int REQUEST_CODE_FILES_DIR = 2;
public static final int RESULT_CODE_THEME_CHANGED = 1;
public static final int RESULT_CODE_PERFORMANCE_PREF_CHANGED = 3;
// --- instance variables
@Autowired private TaskService taskService;
@Autowired private AddOnService addOnService;
@Autowired private ActFmPreferenceService actFmPreferenceService;
@Autowired
private Database database;
private VoiceInputAssistant voiceInputAssistant;
public EditPreferences() {
DependencyInjectionService.getInstance().inject(this);
}
private class SetResultOnPreferenceChangeListener implements OnPreferenceChangeListener {
private final int resultCode;
public SetResultOnPreferenceChangeListener(int resultCode) {
this.resultCode = resultCode;
}
@Override
public boolean onPreferenceChange(Preference p, Object newValue) {
setResult(resultCode);
updatePreferences(p, newValue);
return true;
}
}
private class SetDefaultsClickListener implements OnPreferenceClickListener {
private final AstridPreferenceSpec spec;
private final int nameId;
private final String statistic;
public SetDefaultsClickListener(AstridPreferenceSpec spec, int nameId, String statistic) {
this.spec = spec;
this.nameId = nameId;
this.statistic = statistic;
}
@Override
public boolean onPreferenceClick(Preference preference) {
DialogUtilities.okCancelDialog(EditPreferences.this, getString(R.string.EPr_config_dialog_title),
getString(R.string.EPr_config_dialog_text, getString(nameId)), new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
spec.resetDefaults();
StatisticsService.reportEvent(statistic);
setResult(RESULT_CODE_PERFORMANCE_PREF_CHANGED);
finish();
}
}, null);
return true;
}
}
@Override
public int getPreferenceResource() {
return R.xml.preferences;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
new StartupService().onStartupApplication(this);
ContextManager.setContext(this);
PreferenceScreen screen = getPreferenceScreen();
voiceInputAssistant = new VoiceInputAssistant(this);
addPluginPreferences(screen);
addPreferencesFromResource(R.xml.preferences_misc);
final Resources r = getResources();
// first-order preferences
Preference preference = screen.findPreference(getString(R.string.p_about));
preference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
public boolean onPreferenceClick(Preference p) {
showAbout();
return true;
}
});
preference = screen.findPreference(getString(R.string.p_tutorial));
preference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference p) {
Intent showWelcomeLogin = new Intent(EditPreferences.this, WelcomeWalkthrough.class);
showWelcomeLogin.putExtra(ActFmLoginActivity.SHOW_TOAST, false);
showWelcomeLogin.putExtra(WelcomeWalkthrough.TOKEN_MANUAL_SHOW, true);
startActivity(showWelcomeLogin);
return true;
}
});
preference = screen.findPreference(getString(R.string.p_help));
preference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference p) {
showSupport();
return true;
}
});
preference = screen.findPreference(getString(R.string.p_account));
preference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference p) {
showAccountPrefs();
return true;
}
});
preference = screen.findPreference(getString(R.string.EPr_share_astrid));
preference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference p) {
showShareActivity();
return true;
}
});
Preference beastMode = findPreference(getString(R.string.p_beastMode));
beastMode.setOnPreferenceClickListener(new OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference p) {
showBeastMode();
return true;
}
});
preference = screen.findPreference(getString(R.string.p_files_dir));
preference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference p) {
Intent filesDir = new Intent(EditPreferences.this, FileExplore.class);
filesDir.putExtra(FileExplore.EXTRA_DIRECTORIES_SELECTABLE, true);
startActivityForResult(filesDir, REQUEST_CODE_FILES_DIR);
return true;
}
});
addDebugPreferences();
addPreferenceListeners();
disablePremiumPrefs();
PreferenceScreen appearance = (PreferenceScreen) screen.getPreference(APPEARANCE_PREFERENCE);
if (!AndroidUtilities.isTabletSized(this)) {
appearance.removePreference(screen.findPreference(getString(R.string.p_force_phone_layout)));
} else {
preference = screen.findPreference(getString(R.string.p_swipe_lists_enabled));
preference.setEnabled(Preferences.getBoolean(R.string.p_force_phone_layout, false));
}
preference = screen.findPreference(getString(R.string.p_showNotes));
preference.setEnabled(Preferences.getIntegerFromString(R.string.p_taskRowStyle_v2, 0) == 0);
removeForbiddenPreferences(screen, r);
}
public static void removeForbiddenPreferences(PreferenceScreen screen, Resources r) {
int[] forbiddenPrefs = Constants.MARKET_STRATEGY.excludedSettings();
if (forbiddenPrefs == null)
return;
for (int i : forbiddenPrefs) {
searchForAndRemovePreference(screen, r.getString(i));
}
}
private static boolean searchForAndRemovePreference(PreferenceGroup group, String key) {
int preferenceCount = group.getPreferenceCount();
for (int i = 0; i < preferenceCount; i++) {
final Preference preference = group.getPreference(i);
final String curKey = preference.getKey();
if (curKey != null && curKey.equals(key)) {
group.removePreference(preference);
return true;
}
if (preference instanceof PreferenceGroup) {
if (searchForAndRemovePreference((PreferenceGroup) preference, key)) {
return true;
}
}
}
return false;
}
private void disablePremiumPrefs() {
boolean hasPowerPack = addOnService.hasPowerPack();
findPreference(getString(R.string.p_files_dir)).setEnabled(ActFmPreferenceService.isPremiumUser());
findPreference(getString(R.string.p_voiceRemindersEnabled)).setEnabled(hasPowerPack);
findPreference(getString(R.string.p_statistics)).setEnabled(hasPowerPack);
}
/** Show about dialog */
private void showAbout () {
String version = "unknown"; //$NON-NLS-1$
try {
version = getPackageManager().getPackageInfo(Constants.PACKAGE, 0).versionName;
} catch (NameNotFoundException e) {
// sadness
}
About.showAbout(this, version);
}
private void showSupport() {
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(SUPPORT_URL));
startActivity(intent);
}
private void showBeastMode() {
Intent intent = new Intent(this, BeastModePreferences.class);
intent.setAction(AstridApiConstants.ACTION_SETTINGS);
startActivity(intent);
}
private void showAccountPrefs() {
if (actFmPreferenceService.isLoggedIn()) {
Intent intent = new Intent(this, ActFmPreferences.class);
intent.setAction(AstridApiConstants.ACTION_SETTINGS);
startActivityForResult(intent, REQUEST_CODE_SYNC);
} else {
Intent intent = new Intent(this, ActFmLoginActivity.class);
startActivity(intent);
}
}
private void showShareActivity() {
Intent intent = new Intent(this, ShareActivity.class);
startActivity(intent);
}
private static final HashMap<Class<?>, Integer> PREFERENCE_REQUEST_CODES = new HashMap<Class<?>, Integer>();
static {
PREFERENCE_REQUEST_CODES.put(SyncProviderPreferences.class, REQUEST_CODE_SYNC);
}
private void addPluginPreferences(PreferenceScreen screen) {
Intent queryIntent = new Intent(AstridApiConstants.ACTION_SETTINGS);
PackageManager pm = getPackageManager();
List<ResolveInfo> resolveInfoList = pm.queryIntentActivities(queryIntent,
PackageManager.GET_META_DATA);
int length = resolveInfoList.size();
LinkedHashMap<String, ArrayList<Preference>> categoryPreferences =
new LinkedHashMap<String, ArrayList<Preference>>();
// Loop through a list of all packages (including plugins, addons)
// that have a settings action
for(int i = 0; i < length; i++) {
ResolveInfo resolveInfo = resolveInfoList.get(i);
final Intent intent = new Intent(AstridApiConstants.ACTION_SETTINGS);
intent.setClassName(resolveInfo.activityInfo.packageName,
resolveInfo.activityInfo.name);
if (GtasksPreferences.class.getName().equals(resolveInfo.activityInfo.name)
&& AmazonMarketStrategy.isKindleFire())
continue;
Preference preference = new Preference(this);
preference.setTitle(resolveInfo.activityInfo.loadLabel(pm));
Bundle metadata = resolveInfo.activityInfo.metaData;
if (metadata != null) {
int resource = metadata.getInt("summary", 0); //$NON-NLS-1$
if (resource > 0)
preference.setSummary(resource);
}
try {
Class<?> intentComponent = Class.forName(intent.getComponent().getClassName());
if (intentComponent.getSuperclass().equals(SyncProviderPreferences.class))
intentComponent = SyncProviderPreferences.class;
if (PREFERENCE_REQUEST_CODES.containsKey(intentComponent)) {
final int code = PREFERENCE_REQUEST_CODES.get(intentComponent);
preference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference pref) {
startActivityForResult(intent, code);
return true;
}
});
} else {
preference.setIntent(intent);
}
} catch (ClassNotFoundException e) {
preference.setIntent(intent);
}
String category = MetadataHelper.resolveActivityCategoryName(resolveInfo, pm);
if(!categoryPreferences.containsKey(category))
categoryPreferences.put(category, new ArrayList<Preference>());
ArrayList<Preference> arrayList = categoryPreferences.get(category);
arrayList.add(preference);
}
for(Entry<String, ArrayList<Preference>> entry : categoryPreferences.entrySet()) {
if (entry.getKey().equals(getString(R.string.app_name))) {
for(Preference preference : entry.getValue())
screen.addPreference(preference);
} else {
PreferenceManager manager = getPreferenceManager();
PreferenceScreen header = manager.createPreferenceScreen(this);
header.setTitle(entry.getKey());
if (entry.getKey().equals(getString(R.string.SyP_label)))
header.setSummary(R.string.SyP_summary);
screen.addPreference(header);
for(Preference preference : entry.getValue())
header.addPreference(preference);
}
}
}
@SuppressWarnings("nls")
private void addDebugPreferences() {
if(!Constants.DEBUG)
return;
PreferenceCategory group = new PreferenceCategory(this);
group.setTitle("DEBUG");
getPreferenceScreen().addPreference(group);
Preference preference = new Preference(this);
preference.setTitle("Flush detail cache");
preference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
public boolean onPreferenceClick(Preference p) {
database.openForWriting();
Toast.makeText(EditPreferences.this, "" + taskService.clearDetails(Criterion.all),
Toast.LENGTH_LONG).show();
return false;
}
});
group.addPreference(preference);
preference = new Preference(this);
preference.setTitle("Make Lots of Tasks");
preference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
public boolean onPreferenceClick(Preference p) {
database.openForWriting();
Task task = new Task();
for(int i = 0; i < 100; i++) {
task.clear();
task.setValue(Task.TITLE, Integer.toString(i));
taskService.save(task);
}
DialogUtilities.okDialog(EditPreferences.this, "done", null);
return false;
}
});
group.addPreference(preference);
preference = new Preference(this);
preference.setTitle("Delete all tasks");
preference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
public boolean onPreferenceClick(Preference p) {
database.openForWriting();
taskService.deleteWhere(Criterion.all);
DialogUtilities.okDialog(EditPreferences.this, "done", null);
return false;
}
});
group.addPreference(preference);
preference = new Preference(this);
preference.setTitle("Make lots of contacts");
preference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
public boolean onPreferenceClick(Preference p) {
ContactListAdapter.makeLotsOfContacts();
DialogUtilities.okDialog(EditPreferences.this, "done", null);
return false;
}
});
group.addPreference(preference);
}
@Override
public void updatePreferences(final Preference preference, Object value) {
final Resources r = getResources();
if (r.getString(R.string.p_account).equals(preference.getKey())) {
int title;
int summary;
if (!actFmPreferenceService.isLoggedIn()) {
title = R.string.account_type_title_not_logged_in;
summary = R.string.account_type_summary_not_logged_in;
} else {
title = R.string.actfm_account_info;
summary = R.string.actfm_account_info_summary;
}
preference.setTitle(title);
preference.setSummary(summary);
} else if (r.getString(R.string.p_taskRowStyle_v2).equals(preference.getKey())) {
try {
Integer valueInt = Integer.parseInt((String) value);
String[] titles = getResources().getStringArray(R.array.EPr_task_row_styles);
String[] descriptions = getResources().getStringArray(R.array.EPr_task_row_style_descriptions);
preference.setTitle(getString(R.string.EPr_task_row_style_title, titles[valueInt]));
preference.setSummary(descriptions[valueInt]);
} catch (Exception e) {
//
}
preference.setOnPreferenceChangeListener(new SetResultOnPreferenceChangeListener(RESULT_CODE_PERFORMANCE_PREF_CHANGED) {
@Override
public boolean onPreferenceChange(Preference p, Object newValue) {
String valueString = newValue.toString();
StatisticsService.reportEvent(StatisticsConstants.PREF_CHANGED_PREFIX + "row-style", //$NON-NLS-1$
"changed-to", valueString); //$NON-NLS-1$
Preference notes = findPreference(getString(R.string.p_showNotes));
Preference fullTitle = findPreference(getString(R.string.p_fullTaskTitle));
try {
int newValueInt = Integer.parseInt((String) newValue);
fullTitle.setEnabled(newValueInt != 2);
notes.setEnabled(newValueInt == 0);
} catch (Exception e) {
e.printStackTrace();
}
return super.onPreferenceChange(p, newValue);
};
});
} else if (r.getString(R.string.p_showNotes).equals(preference.getKey())) {
if (value != null && !(Boolean)value)
preference.setSummary(R.string.EPr_showNotes_desc_disabled);
else
preference.setSummary(R.string.EPr_showNotes_desc_enabled);
if((Boolean)value != Preferences.getBoolean(preference.getKey(), false)) {
taskService.clearDetails(Criterion.all);
Flags.set(Flags.REFRESH);
}
} else if(r.getString(R.string.p_fullTaskTitle).equals(preference.getKey())) {
if (value != null && (Boolean) value)
preference.setSummary(R.string.EPr_fullTask_desc_enabled);
else
preference.setSummary(R.string.EPr_fullTask_desc_disabled);
} else if (r.getString(R.string.p_theme).equals(preference.getKey())) {
if(AndroidUtilities.getSdkVersion() < 5) {
preference.setEnabled(false);
preference.setSummary(R.string.EPr_theme_desc_unsupported);
} else {
int index = 0;
if(value instanceof String && !TextUtils.isEmpty((String)value))
index = AndroidUtilities.indexOf(r.getStringArray(R.array.EPr_theme_settings), (String)value);
if (index < 0)
index = 0;
preference.setSummary(getString(R.string.EPr_theme_desc,
r.getStringArray(R.array.EPr_themes)[index]));
}
} else if (r.getString(R.string.p_theme_widget).equals(preference.getKey())) {
if(AndroidUtilities.getSdkVersion() < 5) {
preference.setEnabled(false);
preference.setSummary(R.string.EPr_theme_desc_unsupported);
} else {
int index = 0;
if(value instanceof String && !TextUtils.isEmpty((String)value))
index = AndroidUtilities.indexOf(r.getStringArray(R.array.EPr_theme_widget_settings), (String)value);
if (index < 0)
index = 0;
preference.setSummary(getString(R.string.EPr_theme_desc,
r.getStringArray(R.array.EPr_themes_widget)[index]));
}
}
// pp preferences
else if (r.getString(R.string.p_files_dir).equals(preference.getKey())) {
String dir = Preferences.getStringValue(TaskAttachment.FILES_DIRECTORY_PREF);
if (TextUtils.isEmpty(dir)) {
dir = r.getString(R.string.p_files_dir_desc_default);
}
preference.setSummary(r.getString(R.string.p_files_dir_desc, dir));
}
else if (booleanPreference(preference, value, R.string.p_statistics,
R.string.EPr_statistics_desc_disabled, R.string.EPr_statistics_desc_enabled));
else if (booleanPreference(preference, value, R.string.p_field_missed_calls,
R.string.MCA_missed_calls_pref_desc_disabled, R.string.MCA_missed_calls_pref_desc_enabled));
else if (booleanPreference(preference, value, R.string.p_calendar_reminders,
R.string.CRA_calendar_reminders_pref_desc_disabled, R.string.CRA_calendar_reminders_pref_desc_enabled));
else if (booleanPreference(preference, value, R.string.p_use_contact_picker,
R.string.EPr_use_contact_picker_desc_disabled, R.string.EPr_use_contact_picker_desc_enabled));
else if (booleanPreference(preference, value, R.string.p_end_at_deadline,
R.string.EPr_cal_end_at_due_time, R.string.EPr_cal_start_at_due_time));
else if (r.getString(R.string.p_swipe_lists_enabled).equals(preference.getKey())) {
preference.setOnPreferenceChangeListener(new SetResultOnPreferenceChangeListener(RESULT_CODE_PERFORMANCE_PREF_CHANGED) {
@Override
public boolean onPreferenceChange(Preference p, Object newValue) {
// If the user changes the setting themselves, no need to show the helper
Preferences.setBoolean(TaskListFragmentPager.PREF_SHOWED_SWIPE_HELPER, true);
return super.onPreferenceChange(p, newValue);
}
});
}
else if (r.getString(R.string.p_force_phone_layout).equals(preference.getKey())) {
preference.setOnPreferenceChangeListener(new SetResultOnPreferenceChangeListener(RESULT_CODE_PERFORMANCE_PREF_CHANGED) {
@Override
public boolean onPreferenceChange(Preference p, Object newValue) {
Preference swipe = findPreference(getString(R.string.p_swipe_lists_enabled));
swipe.setEnabled((Boolean) newValue);
return super.onPreferenceChange(p, newValue);
}
});
}
else if (r.getString(R.string.p_voiceInputEnabled).equals(preference.getKey())) {
if (value != null && !(Boolean)value)
preference.setSummary(R.string.EPr_voiceInputEnabled_desc_disabled);
else
preference.setSummary(R.string.EPr_voiceInputEnabled_desc_enabled);
onVoiceInputStatusChanged(preference, (Boolean)value);
} else if (r.getString(R.string.p_voiceRemindersEnabled).equals(preference.getKey())) {
if (value != null && !(Boolean)value)
preference.setSummary(R.string.EPr_voiceRemindersEnabled_desc_disabled);
else
preference.setSummary(R.string.EPr_voiceRemindersEnabled_desc_enabled);
onVoiceReminderStatusChanged(preference, (Boolean)value);
}
}
protected boolean booleanPreference(Preference preference, Object value,
int key, int disabledString, int enabledString) {
if(getString(key).equals(preference.getKey())) {
if (value != null && !(Boolean)value)
preference.setSummary(disabledString);
else
preference.setSummary(enabledString);
return true;
}
return false;
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_CODE_SYNC && resultCode == SyncProviderPreferences.RESULT_CODE_SYNCHRONIZE) {
setResult(SyncProviderPreferences.RESULT_CODE_SYNCHRONIZE);
finish();
return;
} else if (requestCode == REQUEST_CODE_FILES_DIR && resultCode == RESULT_OK) {
if (data != null) {
String dir = data.getStringExtra(FileExplore.RESULT_DIR_SELECTED);
Preferences.setString(TaskAttachment.FILES_DIRECTORY_PREF, dir);
}
return;
}
try {
VoiceOutputService.getVoiceOutputInstance().handleActivityResult(requestCode, resultCode, data);
} catch (VerifyError e) {
// unavailable
}
super.onActivityResult(requestCode, resultCode, data);
}
public void addPreferenceListeners() {
findPreference(getString(R.string.p_theme)).setOnPreferenceChangeListener(new SetResultOnPreferenceChangeListener(RESULT_CODE_PERFORMANCE_PREF_CHANGED));
findPreference(getString(R.string.p_fontSize)).setOnPreferenceChangeListener(new SetResultOnPreferenceChangeListener(RESULT_CODE_PERFORMANCE_PREF_CHANGED));
findPreference(getString(R.string.p_hide_plus_button)).setOnPreferenceChangeListener(new SetResultOnPreferenceChangeListener(RESULT_CODE_PERFORMANCE_PREF_CHANGED));
findPreference(getString(R.string.p_config_default)).setOnPreferenceClickListener(
new SetDefaultsClickListener(new AstridDefaultPreferenceSpec(), R.string.EPr_config_dialog_default_id, StatisticsConstants.PREFS_RESET_DEFAULT));
findPreference(getString(R.string.p_config_lite)).setOnPreferenceClickListener(
new SetDefaultsClickListener(new AstridLitePreferenceSpec(), R.string.EPr_config_lite, StatisticsConstants.PREFS_RESET_LITE));
int[] menuPrefs = { R.string.p_show_menu_search, R.string.p_show_menu_friends,
R.string.p_show_menu_sync, R.string.p_show_menu_sort,
};
for (int key : menuPrefs) {
findPreference(getString(key)).setOnPreferenceChangeListener(new SetResultOnPreferenceChangeListener(RESULT_CODE_PERFORMANCE_PREF_CHANGED));
}
findPreference(getString(R.string.p_theme_widget)).setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
TasksWidget.updateWidgets(EditPreferences.this);
updatePreferences(preference, newValue);
return true;
}
});
if (AndroidUtilities.getSdkVersion() <= 7) {
searchForAndRemovePreference(getPreferenceScreen(), getString(R.string.p_calendar_reminders));
} else {
findPreference(getString(R.string.p_calendar_reminders)).setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
if (newValue != null && ((Boolean) newValue))
CalendarStartupReceiver.scheduleCalendarAlarms(EditPreferences.this, true);
return true;
}
});
}
findPreference(getString(R.string.p_statistics)).setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
Boolean value = (Boolean) newValue;
try {
if (!value.booleanValue()) {
Crittercism.setOptOutStatus(true);
} else {
Crittercism.setOptOutStatus(false);
}
} catch (NullPointerException e) {
return false;
}
return true;
}
});
findPreference(getString(R.string.p_showNotes)).setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
updatePreferences(preference, newValue);
StatisticsService.reportEvent(StatisticsConstants.PREF_SHOW_NOTES_IN_ROW, "enabled", newValue.toString()); //$NON-NLS-1$
return true;
}
});
findPreference(getString(R.string.p_fullTaskTitle)).setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
updatePreferences(preference, newValue);
StatisticsService.reportEvent(StatisticsConstants.PREF_CHANGED_PREFIX + "full-title", "full-title", newValue.toString()); //$NON-NLS-1$ //$NON-NLS-2$
return true;
}
});
}
private void onVoiceReminderStatusChanged(final Preference preference, boolean newValue) {
try {
VoiceOutputService.getVoiceOutputInstance();
if(newValue)
VoiceOutputService.getVoiceOutputInstance().checkIsTTSInstalled();
} catch (VerifyError e) {
// doesn't work :(
preference.setEnabled(false);
Preferences.setBoolean(preference.getKey(), false);
}
}
private void onVoiceInputStatusChanged(final Preference preference, boolean newValue) {
if(!newValue)
return;
int[] excludedSettings = Constants.MARKET_STRATEGY.excludedSettings();
if (excludedSettings != null && AndroidUtilities.indexOf(excludedSettings, R.string.p_voiceInputEnabled) >= 0)
return;
final Resources r = getResources();
if (!VoiceRecognizer.voiceInputAvailable(this)) {
if (AndroidUtilities.getSdkVersion() > 6) {
DialogUtilities.okCancelDialog(this,
r.getString(R.string.EPr_voiceInputInstall_dlg),
new OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
voiceInputAssistant.showVoiceInputMarketSearch(new OnClickListener() {
@Override
public void onClick(DialogInterface dialog1,
int which1) {
((CheckBoxPreference)preference).setChecked(false);
}
});
}
},
new OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
((CheckBoxPreference)preference).setChecked(false);
}
});
} else {
DialogUtilities.okDialog(this,
r.getString(R.string.EPr_voiceInputUnavailable_dlg),
new OnClickListener() {
@Override
public void onClick(DialogInterface dialog1,
int which1) {
((CheckBoxPreference)preference).setChecked(false);
}
});
}
}
}
@Override
protected void onPause() {
StatisticsService.sessionPause();
super.onPause();
}
@Override
protected void onStart() {
super.onStart();
}
@Override
protected void onResume() {
super.onResume();
StatisticsService.sessionStart(this);
}
@Override
protected void onStop() {
StatisticsService.sessionStop(this);
super.onStop();
}
}