/* * Copyright (C) 2011 The original author or authors. * * 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.zapta.apps.maniana.settings; import java.text.SimpleDateFormat; import java.util.Date; import javax.annotation.Nullable; import net.margaritov.preference.colorpicker.ColorPickerPreference; import android.annotation.SuppressLint; import android.app.AlertDialog; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.content.SharedPreferences.OnSharedPreferenceChangeListener; import android.net.Uri; import android.os.Bundle; import android.preference.CheckBoxPreference; import android.preference.ListPreference; import android.preference.Preference; import android.preference.Preference.OnPreferenceClickListener; import android.preference.PreferenceActivity; import android.preference.PreferenceGroup; import android.text.format.Time; import android.widget.Toast; import com.zapta.apps.maniana.R; import com.zapta.apps.maniana.annotations.ActivityScope; import com.zapta.apps.maniana.annotations.VisibleForTesting; import com.zapta.apps.maniana.help.PopupMessageActivity; import com.zapta.apps.maniana.help.PopupMessageActivity.MessageKind; import com.zapta.apps.maniana.services.BackupFileProvider; import com.zapta.apps.maniana.util.DateUtil; import com.zapta.apps.maniana.util.LogUtil; import com.zapta.apps.maniana.util.PopupsTracker; import com.zapta.apps.maniana.util.WorkingDialog; /** * Activity that shows the settings page. * <p> * The class includes logic to display the current selected values. This feature is not yet provided * by the Android framework (as of Dec 2011). * * @author Tal Dayan */ @ActivityScope public class SettingsActivity extends PreferenceActivity implements OnSharedPreferenceChangeListener { // Sound private CheckBoxPreference mSoundEnablePreference; private ListPreference mApplauseLevelListPreference; // Behavior private ListPreference mLockPeriodListPreference; // Shaking private ListPreference mShakerActionPreference; // Page private CheckBoxPreference mPageBackgroundPaperPreference; private ColorPickerPreference mPagePaperColorPickPreference; private ColorPickerPreference mPageSolidColorPickPreference; private PageIconSetPreference mPageIconSetPreference; private FontPreference mPageTitleFontPreference; private SeekBarPreference mPageTitleFontSizePreference; private ColorPickerPreference mPageTitleTodayColorPickPreference; private ColorPickerPreference mPageTitleTomorrowColorPickPreference; private FontPreference mPageItemFontPreference; private SeekBarPreference mPageItemFontSizePreference; private ColorPickerPreference mPageTextActiveColorPickPreference; private ColorPickerPreference mPageTextCompletedColorPickPreference; private ColorPickerPreference mPageItemDividerColorPickPreference; private Preference mPageSelectThemePreference; // Widget private CheckBoxPreference mWidgetBackgroundPaperPreference; private ColorPickerPreference mWidgetPaperColorPickPreference; private ColorPickerPreference mWidgetSolidColorPickPreference; private FontPreference mWidgetItemFontPreference; private SeekBarPreference mWidgetFontSizePreference; private ColorPickerPreference mWidgetTextColorPickPreference; private CheckBoxPreference mWidgetShowCompletedTasksPreference; private ColorPickerPreference mWidgetTextCompletedColorPickPreference; private CheckBoxPreference mWidgetShowToolbarPreference; private Preference mWidgetSelectThemePreference; // Miscellaneous private Preference mVersionInfoPreference; private Preference mSharePreference; private Preference mFeedbackPreference; private Preference mRestoreDefaultsPreference; // Backup private Preference mBackupPreference; // TODO: implement popup help message for do restore private Preference mBackupHelpPreference; /** For temp time calculations. Avoiding new object creation. */ private Time tempTime = new Time(); /** The open dialog tracker. */ private final PopupsTracker mPopupsTracker = new PopupsTracker(); private PreferenceSelector mPageColorPreferenceSelector; private PreferenceSelector mWidgetColorPreferenceSelector; private PreferenceSelector mWidgetCompletedTasksColorSelector; @Nullable private WorkingDialog mWorkingDialog = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.preferences); // Sound mSoundEnablePreference = (CheckBoxPreference) findPreference(PreferenceKind.SOUND_ENABLED); mApplauseLevelListPreference = (ListPreference) findPreference(PreferenceKind.APPLAUSE_LEVEL); // Behavior mLockPeriodListPreference = (ListPreference) findPreference(PreferenceKind.LOCK_PERIOD); // Shaker mShakerActionPreference = (ListPreference) findPreference(PreferenceKind.SHAKER_ACTION); // Pages mPageBackgroundPaperPreference = (CheckBoxPreference) findPreference(PreferenceKind.PAGE_BACKGROUND_PAPER); mPagePaperColorPickPreference = findColorPickerPrerence(PreferenceKind.PAGE_PAPER_COLOR); mPageSolidColorPickPreference = findColorPickerPrerence(PreferenceKind.PAGE_BACKGROUND_SOLID_COLOR); mPageColorPreferenceSelector = new PreferenceSelector( (PreferenceGroup) findPreference("prefPagesScreenKey"), mPageBackgroundPaperPreference, mPagePaperColorPickPreference, mPageSolidColorPickPreference); mPageIconSetPreference = (PageIconSetPreference) findPreference(PreferenceKind.PAGE_ICON_SET); mPageTitleFontPreference = (FontPreference) findPreference(PreferenceKind.PAGE_TITLE_FONT); mPageTitleFontSizePreference = (SeekBarPreference) findPreference(PreferenceKind.PAGE_TITLE_FONT_SIZE); mPageTitleTodayColorPickPreference = findColorPickerPrerence(PreferenceKind.PAGE_TITLE_TODAY_COLOR); mPageTitleTomorrowColorPickPreference = findColorPickerPrerence(PreferenceKind.PAGE_TITLE_TOMORROW_COLOR); mPageItemFontPreference = (FontPreference) findPreference(PreferenceKind.PAGE_ITEM_FONT); mPageItemFontSizePreference = (SeekBarPreference) findPreference(PreferenceKind.PAGE_ITEM_FONT_SIZE); mPageTextActiveColorPickPreference = findColorPickerPrerence(PreferenceKind.PAGE_ITEM_ACTIVE_TEXT_COLOR); mPageTextCompletedColorPickPreference = findColorPickerPrerence(PreferenceKind.PAGE_ITEM_COMPLETED_TEXT_COLOR); mPageItemDividerColorPickPreference = findColorPickerPrerence(PreferenceKind.PAGE_ITEM_DIVIDER_COLOR); mPageSelectThemePreference = findPreference(PreferenceKind.PAGE_SELECT_THEME); // Widget mWidgetSelectThemePreference = findPreference(PreferenceKind.WIDGET_SELECT_THEME); mWidgetBackgroundPaperPreference = (CheckBoxPreference) findPreference(PreferenceKind.WIDGET_BACKGROUND_PAPER); mWidgetPaperColorPickPreference = findColorPickerPrerence(PreferenceKind.WIDGET_PAPER_COLOR); mWidgetSolidColorPickPreference = findColorPickerPrerence(PreferenceKind.WIDGET_BACKGROUND_COLOR); mWidgetColorPreferenceSelector = new PreferenceSelector( (PreferenceGroup) findPreference("prefWidgetScreenKey"), mWidgetBackgroundPaperPreference, mWidgetPaperColorPickPreference, mWidgetSolidColorPickPreference); mWidgetItemFontPreference = (FontPreference) findPreference(PreferenceKind.WIDGET_ITEM_FONT); mWidgetFontSizePreference = (SeekBarPreference) findPreference(PreferenceKind.WIDGET_ITEM_FONT_SIZE); mWidgetTextColorPickPreference = findColorPickerPrerence(PreferenceKind.WIDGET_ITEM_TEXT_COLOR); mWidgetTextCompletedColorPickPreference = findColorPickerPrerence(PreferenceKind.WIDGET_ITEM_COMPLETED_TEXT_COLOR); mWidgetShowToolbarPreference = (CheckBoxPreference) findPreference(PreferenceKind.WIDGET_SHOW_TOOLBAR); mWidgetShowCompletedTasksPreference = (CheckBoxPreference) findPreference(PreferenceKind.WIDGET_SHOW_COMPLETED_ITEMS); mWidgetCompletedTasksColorSelector = new PreferenceSelector( (PreferenceGroup) findPreference("prefWidgetTaskTextScreenKey"), mWidgetShowCompletedTasksPreference, mWidgetTextCompletedColorPickPreference, null); // Miscellaneous mVersionInfoPreference = findPreference(PreferenceKind.VERSION_INFO); mSharePreference = findPreference(PreferenceKind.SHARE); mFeedbackPreference = findPreference(PreferenceKind.FEEDBACK); mRestoreDefaultsPreference = findPreference(PreferenceKind.RESTORE_DEFAULTS); // Backup mBackupPreference = findPreference(PreferenceKind.BACKUP); mBackupHelpPreference = findPreference(PreferenceKind.BACKUP_HELP); // Enabled alpha channel in colors pickers that need it. mPageItemDividerColorPickPreference.setAlphaSliderEnabled(true); mWidgetSolidColorPickPreference.setAlphaSliderEnabled(true); // Disable color V setting mPagePaperColorPickPreference.setJustHsNoV(0.2f); mWidgetPaperColorPickPreference.setJustHsNoV(0.2f); // We lookup also the preferences we don't use here to assert that the code and the xml // key strings match. findPreference(PreferenceKind.AUTO_SORT); findPreference(PreferenceKind.ADD_TO_TOP); findPreference(PreferenceKind.ITEM_COLORS); findPreference(PreferenceKind.AUTO_DAILY_CLEANUP); findPreference(PreferenceKind.DAILY_NOTIFICATION); findPreference(PreferenceKind.NOTIFICATION_LED); findPreference(PreferenceKind.WIDGET_SINGLE_LINE); mPageSelectThemePreference.setOnPreferenceClickListener(new OnPreferenceClickListener() { public boolean onPreferenceClick(Preference preference) { onPageSelectThemeClick(); return true; } }); mWidgetSelectThemePreference.setOnPreferenceClickListener(new OnPreferenceClickListener() { public boolean onPreferenceClick(Preference preference) { onWidgetSelectThemeClick(); return true; } }); mRestoreDefaultsPreference.setOnPreferenceClickListener(new OnPreferenceClickListener() { public boolean onPreferenceClick(Preference preference) { onResetSettingsInitialClick(); return true; } }); mVersionInfoPreference.setOnPreferenceClickListener(new OnPreferenceClickListener() { public boolean onPreferenceClick(Preference preference) { onVersionInfoClick(); return true; } }); mBackupHelpPreference.setOnPreferenceClickListener(new OnPreferenceClickListener() { public boolean onPreferenceClick(Preference preference) { onBackupHelpClick(); return true; } }); mBackupPreference.setOnPreferenceClickListener(new OnPreferenceClickListener() { public boolean onPreferenceClick(Preference preference) { onBackupClick(); return true; } }); mSharePreference.setOnPreferenceClickListener(new OnPreferenceClickListener() { public boolean onPreferenceClick(Preference preference) { onShareClick(); return true; } }); mFeedbackPreference.setOnPreferenceClickListener(new OnPreferenceClickListener() { public boolean onPreferenceClick(Preference preference) { onFeedbackClick(); return true; } }); } /** Handle the user clicking on page theme selection in the settings activity */ private final void onPageSelectThemeClick() { final Dialog dialog = new ThumbnailSelector<PageTheme>(this, PageTheme.PAGE_THEMES, mPopupsTracker, new ThumbnailSelector.ThumbnailSelectorListener<PageTheme>() { @Override public void onThumbnailSelection(PageTheme theme) { onPageThemeSelection(theme); } }); dialog.show(); } /** Handle the user clicking on widget theme selection in the settings activity */ private final void onWidgetSelectThemeClick() { final Dialog dialog = new ThumbnailSelector<WidgetTheme>(this, WidgetTheme.WIDGET_THEMES, mPopupsTracker, new ThumbnailSelector.ThumbnailSelectorListener<WidgetTheme>() { @Override public void onThumbnailSelection(WidgetTheme theme) { onWidgetThemeSelection(theme); } }); dialog.show(); } /** Called when a page theme is selected from the widget theme dialog. */ private final void onPageThemeSelection(PageTheme theme) { mPageBackgroundPaperPreference.setChecked(theme.backgroundPaper); mPagePaperColorPickPreference.onColorChanged(theme.paperColor); mPageSolidColorPickPreference.onColorChanged(theme.backgroundSolidColor); mPageIconSetPreference.setValue(theme.iconSet); mPageTitleFontPreference.setValue(theme.titleFont); mPageTitleFontSizePreference.setValue(theme.titleFontSize); mPageTitleTodayColorPickPreference.onColorChanged(theme.titleTodayTextColor); mPageTitleTomorrowColorPickPreference.onColorChanged(theme.titleTomorrowTextColor); mPageItemFontPreference.setValue(theme.itemFont); mPageItemFontSizePreference.setValue(theme.itemFontSize); mPageTextActiveColorPickPreference.onColorChanged(theme.itemTextColor); mPageTextCompletedColorPickPreference.onColorChanged(theme.itemCompletedTextColor); mPageItemDividerColorPickPreference.onColorChanged(theme.itemDividerColor); } /** Called when a widget theme is selected from the widget theme dialog. */ private final void onWidgetThemeSelection(WidgetTheme theme) { mWidgetBackgroundPaperPreference.setChecked(theme.backgroundPaper); mWidgetPaperColorPickPreference.onColorChanged(theme.paperColor); mWidgetSolidColorPickPreference.onColorChanged(theme.backgroundColor); mWidgetItemFontPreference.setValue(theme.font); mWidgetFontSizePreference.setValue(theme.fontSize); mWidgetTextColorPickPreference.onColorChanged(theme.textColor); mWidgetTextCompletedColorPickPreference.onColorChanged(theme.completedTextColor); mWidgetShowToolbarPreference.setChecked(theme.showToolbar); // Show completed items preferences and show single line are NOT modified by the theme. } /** Handle user selecting reset settings in the settings activity */ private final void onResetSettingsInitialClick() { final DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { switch (which) { case DialogInterface.BUTTON_POSITIVE: dialog.dismiss(); mWorkingDialog = new WorkingDialog(SettingsActivity.this, SettingsActivity.this .getString(R.string.settings_Restoring_defaults)); mWorkingDialog.setOnShowListener(new DialogInterface.OnShowListener() { @Override public void onShow(DialogInterface arg0) { getListView().post(new Runnable() { @Override public void run() { onResetSettingsConfirmed(); } }); } }); mWorkingDialog.show(); break; case DialogInterface.BUTTON_NEGATIVE: // Doing nothing break; } } }; final AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage(getString(R.string.settings_restore_default_confirmation_text)) .setPositiveButton(getString(R.string.settings_restore_default_confirmation_yes), dialogClickListener) .setNegativeButton(getString(R.string.dialog_cancel), dialogClickListener).show(); } private final void onResetSettingsConfirmed() { Editor editor = getPreferenceScreen().getEditor(); editor.clear(); // TODO: this is a hack to force notifying the main activity and widget // about the change. For some reason they are not notified about it // as the the non custom preference types do. editor.putInt(PreferenceKind.PAGE_ITEM_ACTIVE_TEXT_COLOR.getKey(), PreferenceConstants.DEFAULT_ITEM_TEXT_COLOR); editor.putInt(PreferenceKind.PAGE_ITEM_COMPLETED_TEXT_COLOR.getKey(), PreferenceConstants.DEFAULT_COMPLETED_ITEM_TEXT_COLOR); editor.putInt(PreferenceKind.PAGE_PAPER_COLOR.getKey(), PreferenceConstants.DEFAULT_PAGE_PAPER_COLOR); editor.putInt(PreferenceKind.PAGE_BACKGROUND_SOLID_COLOR.getKey(), PreferenceConstants.DEFAULT_PAGE_BACKGROUND_SOLID_COLOR); editor.putInt(PreferenceKind.PAGE_ITEM_DIVIDER_COLOR.getKey(), PreferenceConstants.DEFAULT_PAGE_ITEM_DIVIDER_COLOR); editor.putInt(PreferenceKind.WIDGET_BACKGROUND_COLOR.getKey(), PreferenceConstants.DEFAULT_WIDGET_BACKGROUND_COLOR); editor.putInt(PreferenceKind.WIDGET_ITEM_TEXT_COLOR.getKey(), PreferenceConstants.DEFAULT_WIDGET_TEXT_COLOR); editor.putInt(PreferenceKind.WIDGET_ITEM_COMPLETED_TEXT_COLOR.getKey(), PreferenceConstants.DEFAULT_WIDGET_ITEM_COMPLETED_TEXT_COLOR); // NOTE: for checkbox whose default value is false, need to set them // here to false. editor.putBoolean(PreferenceKind.DAILY_NOTIFICATION.getKey(), PreferenceConstants.DEFAULT_DAILY_NOTIFICATION); editor.putBoolean(PreferenceKind.WIDGET_SHOW_COMPLETED_ITEMS.getKey(), PreferenceConstants.DEFAULT_WIDGET_SHOW_COMPLETED_ITEMS); editor.putBoolean(PreferenceKind.WIDGET_SINGLE_LINE.getKey(), PreferenceConstants.DEFAULT_WIDGET_SINGLE_LINE); editor.putBoolean(PreferenceKind.WIDGET_SHOW_DATE.getKey(), PreferenceConstants.DEFAULT_WIDGET_SHOW_DATE); editor.putBoolean(PreferenceKind.SHAKER_ENABLED.getKey(), PreferenceConstants.DEFAULT_SHAKER_ENABLED); // Set icon-set preferences to broadcast the change event. editor.putString(PreferenceKind.PAGE_ICON_SET.getKey(), PreferenceConstants.DEFAULT_PAGE_ICON_SET.getKey()); // Set font preferences to broadcast the change event. editor.putString(PreferenceKind.PAGE_TITLE_FONT.getKey(), PreferenceConstants.DEFAULT_PAGE_TITLE_FONT.getKey()); editor.putString(PreferenceKind.PAGE_ITEM_FONT.getKey(), PreferenceConstants.DEFAULT_PAGE_ITEM_FONT.getKey()); editor.putString(PreferenceKind.WIDGET_ITEM_FONT.getKey(), PreferenceConstants.DEFAULT_WIDGET_FONT_TYPE.getKey()); // Set the seek bar preferences to broadcast the change event editor.putInt(PreferenceKind.PAGE_ITEM_FONT_SIZE.getKey(), PreferenceConstants.DEFAULT_PAGE_ITEM_FONT_SIZE); editor.putInt(PreferenceKind.WIDGET_ITEM_FONT_SIZE.getKey(), PreferenceConstants.DEFAULT_WIDGET_ITEM_FONT_SIZE); // Set color set preference to broadcast the change event. editor.putString(PreferenceKind.ITEM_COLORS.getKey(), PreferenceConstants.DEFAULT_ITEM_COLORS); editor.commit(); // Hack per http://tinyurl.com/c44gl4r We close this activity and restart // Using the same intent that created this preferences activity. // This causes it to reload the preferences. finish(); startActivity(getIntent()); mWorkingDialog.dismiss(); mWorkingDialog = null; } private final void onVersionInfoClick() { final Intent intent = PopupMessageActivity.intentFor(this, MessageKind.WHATS_NEW); startActivity(intent); } private final void onBackupHelpClick() { // Popup a message with backup/restore instructions final Intent intent = PopupMessageActivity.intentFor(this, MessageKind.BACKUP_HELP); startActivity(intent); } @SuppressLint("SimpleDateFormat") private final void onBackupClick() { final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-dd-MM-HH-mm-ss"); final String timeStamp = dateFormat.format(new Date()); final String fileName = "Maniana_Backup_" + timeStamp + ".json"; final Intent intent = BackupFileProvider.constructBackupFileSendIntent(fileName); try { startActivity(Intent.createChooser(intent, getString(R.string.settings_backup_do_backup_chooser_title))); } catch (android.content.ActivityNotFoundException e) { Toast.makeText(this, getString(R.string.settings_backup_no_app_error), Toast.LENGTH_SHORT).show(); } } private final void onShareClick() { Intent sharingIntent = new Intent(Intent.ACTION_SEND); sharingIntent.setType("text/plain"); String message = getString(R.string.share_email_body_text) + "\n\n" + "https://market.android.com/details?id=com.zapta.apps.maniana"; sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT, message); sharingIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, getString(R.string.share_email_subject)); startActivity(Intent.createChooser(sharingIntent, getString(R.string.share_email_chooser_title))); } private final void onFeedbackClick() { // NOTE: based on http://stackoverflow.com/questions/3312438 final Intent intent = new Intent(Intent.ACTION_VIEW); final Uri data = Uri.parse("mailto:maniana@zapta.com?subject=Maniana feedback&body="); intent.setData(data); startActivity(intent); } private final ColorPickerPreference findColorPickerPrerence(PreferenceKind kind) { return (ColorPickerPreference) findPreference(kind); } private final Preference findPreference(PreferenceKind kind) { final Preference result = getPreferenceScreen().findPreference(kind.getKey()); if (result == null) { throw new RuntimeException("Preference key not found for kind: " + kind); } return result; } @Override protected void onResume() { super.onResume(); updateSummaries(); getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this); } @Override protected void onPause() { super.onPause(); mPopupsTracker.closeAllLeftOvers(); getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener( this); } @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { // NOTE(tal): since settings change is a rare operation, we don't bother to // switch of key and always update all the lists. Code is simpler this way. updateSummaries(); } private void updateSummaries() { // Disable applause if voice is disabled if (mSoundEnablePreference.isChecked()) { updateListPreferenceSummary(mApplauseLevelListPreference, R.array.applauseLevelSummaries, null); } else { mApplauseLevelListPreference.setSummary("(" + getString(R.string.settings_applause_summary_sound_is_off) + ")"); } // Update color selectors mPageColorPreferenceSelector.update(); mWidgetColorPreferenceSelector.update(); mWidgetCompletedTasksColorSelector.update(); // For lock expiration preference, also show the time until next expiration. This require // some computation. { final String key = mLockPeriodListPreference.getValue(); final LockExpirationPeriod selection = LockExpirationPeriod.fromKey(key, null); final int wholeHoursLeft; if (selection == LockExpirationPeriod.WEEKLY) { tempTime.setToNow(); wholeHoursLeft = DateUtil.hoursToEndOfWeek(tempTime); } else if (selection == LockExpirationPeriod.MONTHLY) { tempTime.setToNow(); wholeHoursLeft = DateUtil.hoursToEndOfMonth(tempTime); } else { wholeHoursLeft = -1; } final String suffix = (wholeHoursLeft >= 0) ? " (" + construtLockTimeLeftMessageSuffix(this, wholeHoursLeft) + ")" : ""; updateListPreferenceSummary(mLockPeriodListPreference, R.array.lockPeriodNames, suffix); } updateListPreferenceSummary(mShakerActionPreference, R.array.shakerActionNames, null); } @VisibleForTesting static String construtLockTimeLeftMessageSuffix(Context context, int wholeHoursLeft) { if (wholeHoursLeft < 16) { return context.getString(R.string.time_string_tonight); } if (wholeHoursLeft < 48) { return String .format(context.getString(R.string.time_string_in_d_hours), wholeHoursLeft); } // Rounding up return String.format(context.getString(R.string.time_string_in_d_days), (wholeHoursLeft + 23) / 24); } private void updateListPreferenceSummary(ListPreference listPreference, int stringArrayId, @Nullable String suffix) { final String value = listPreference.getValue(); // -1 if not found. final int index = listPreference.findIndexOfValue(value); String summary; if (index < 0) { LogUtil.error("Could not find index of preference value [%s]", value); // Fallback summary = ""; } else { summary = getResources().getStringArray(stringArrayId)[index]; if (suffix != null) { summary += suffix; } } listPreference.setSummary(summary); } }