package com.nolanlawson.logcat; import java.util.ArrayList; import java.util.List; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.preference.EditTextPreference; import android.preference.ListPreference; import android.preference.Preference; import android.preference.Preference.OnPreferenceChangeListener; import android.preference.Preference.OnPreferenceClickListener; import android.preference.PreferenceActivity; import android.text.TextUtils; import android.view.KeyEvent; import android.view.MenuItem; import android.widget.Toast; import com.nolanlawson.logcat.helper.PackageHelper; import com.nolanlawson.logcat.helper.PreferenceHelper; import com.nolanlawson.logcat.util.ArrayUtil; import com.nolanlawson.logcat.util.StringUtil; import com.nolanlawson.logcat.widget.MockDisabledListPreference; import com.nolanlawson.logcat.widget.MultipleChoicePreference; public class SettingsActivity extends PreferenceActivity implements OnPreferenceChangeListener { private static final int MAX_LOG_LINE_PERIOD = 1000; private static final int MIN_LOG_LINE_PERIOD = 1; private static final int MAX_DISPLAY_LIMIT = 100000; private static final int MIN_DISPLAY_LIMIT = 1000; private EditTextPreference logLinePeriodPreference, displayLimitPreference; private ListPreference textSizePreference, defaultLevelPreference; private MultipleChoicePreference bufferPreference; private MockDisabledListPreference themePreference; private Preference aboutPreference; private boolean bufferChanged = false; @SuppressWarnings("deprecation") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setTitle(R.string.settings); addPreferencesFromResource(R.xml.settings); getActionBar().setDisplayHomeAsUpEnabled(true); setUpPreferences(); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: finish(); return true; } return false; } @SuppressWarnings("deprecation") private void setUpPreferences() { displayLimitPreference = (EditTextPreference) findPreference(getString(R.string.pref_display_limit)); int displayLimitValue = PreferenceHelper.getDisplayLimitPreference(this); displayLimitPreference.setSummary(String.format(getString(R.string.pref_display_limit_summary).toString(), displayLimitValue, getString(R.string.pref_display_limit_default))); displayLimitPreference.setOnPreferenceChangeListener(this); logLinePeriodPreference = (EditTextPreference) findPreference(getString(R.string.pref_log_line_period)); int logLinePrefValue = PreferenceHelper.getLogLinePeriodPreference(this); logLinePeriodPreference.setSummary(String.format(getString(R.string.pref_log_line_period_summary).toString(), logLinePrefValue, getString(R.string.pref_log_line_period_default))); logLinePeriodPreference.setOnPreferenceChangeListener(this); textSizePreference = (ListPreference) findPreference(getString(R.string.pref_text_size)); textSizePreference.setSummary(textSizePreference.getEntry()); textSizePreference.setOnPreferenceChangeListener(this); defaultLevelPreference = (ListPreference) findPreference(getString(R.string.pref_default_log_level)); defaultLevelPreference.setOnPreferenceChangeListener(this); setDefaultLevelPreferenceSummary(defaultLevelPreference.getEntry()); themePreference = (MockDisabledListPreference) findPreference(getString(R.string.pref_theme)); themePreference.setOnPreferenceChangeListener(this); bufferPreference = (MultipleChoicePreference) findPreference(getString(R.string.pref_buffer)); bufferPreference.setOnPreferenceChangeListener(this); setBufferPreferenceSummary(bufferPreference.getValue()); boolean donateInstalled = PackageHelper.isCatlogDonateInstalled(this); String themeSummary = donateInstalled ? PreferenceHelper.getColorScheme(this).getDisplayableName(this) : getString(R.string.pref_theme_summary_free); themePreference.setSummary(themeSummary); themePreference.setEnabledAppearance(donateInstalled); if (!donateInstalled) { themePreference.overrideOnClick(new OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { openDonateVersionInMarket(); return true; } }); } aboutPreference = findPreference(getString(R.string.pref_about)); aboutPreference.setOnPreferenceClickListener(new OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { // launch about activity Intent intent = new Intent(SettingsActivity.this, AboutActivity.class); startActivity(intent); return true; } }); aboutPreference.setSummary(String.format(getString(R.string.version), PackageHelper.getVersionName(this))); } private void setDefaultLevelPreferenceSummary(CharSequence entry) { defaultLevelPreference.setSummary( String.format(getString(R.string.pref_default_log_level_summary), entry)); } private void openDonateVersionInMarket() { Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=com.nolanlawson.logcat.donate")); startActivity(intent); } public boolean onPreferenceChange(Preference preference, Object newValue) { if (preference.getKey().equals(getString(R.string.pref_display_limit))) { // display buffer preference; update summary String input = ((String)newValue).trim(); try { int value = Integer.parseInt(input); if (value >= MIN_DISPLAY_LIMIT && value <= MAX_DISPLAY_LIMIT) { PreferenceHelper.setDisplayLimitPreference(this, value); displayLimitPreference.setSummary(String.format(getString(R.string.pref_display_limit_summary).toString(), value, getString(R.string.pref_display_limit_default))); // notify that a restart is required Toast.makeText(this, R.string.toast_pref_changed_restart_required, Toast.LENGTH_LONG).show(); return true; } } catch (NumberFormatException ignore) { } String invalidEntry = String.format(getString(R.string.toast_invalid_display_limit), MIN_DISPLAY_LIMIT, MAX_DISPLAY_LIMIT); Toast.makeText(this, invalidEntry, Toast.LENGTH_LONG).show(); return false; } else if (preference.getKey().equals(getString(R.string.pref_log_line_period))) { // log line period preference; update summary String input = ((String)newValue).trim(); try { int value = Integer.parseInt(input); if (value >= MIN_LOG_LINE_PERIOD && value <= MAX_LOG_LINE_PERIOD) { PreferenceHelper.setLogLinePeriodPreference(this, value); logLinePeriodPreference.setSummary(String.format(getString(R.string.pref_log_line_period_summary).toString(), value, getString(R.string.pref_log_line_period_default))); return true; } } catch (NumberFormatException ignore) { } Toast.makeText(this, R.string.pref_log_line_period_error, Toast.LENGTH_LONG).show(); return false; } else if (preference.getKey().equals(getString(R.string.pref_theme))) { // update summary int index = ArrayUtil.indexOf(themePreference.getEntryValues(),newValue.toString()); CharSequence newEntry = themePreference.getEntries()[index]; themePreference.setSummary(newEntry); return true; } else if (preference.getKey().equals(getString(R.string.pref_buffer))) { // buffers pref // check to make sure nothing was left unchecked if (TextUtils.isEmpty(newValue.toString())) { Toast.makeText(this, R.string.pref_buffer_none_checked_error, Toast.LENGTH_SHORT).show(); return false; } // notify the LogcatActivity that the buffer has changed if (!newValue.toString().equals(bufferPreference.getValue())) { bufferChanged = true; } setBufferPreferenceSummary(newValue.toString()); return true; } else if (preference.getKey().equals(getString(R.string.pref_default_log_level))) { // default log level preference // update the summary to reflect changes ListPreference listPreference = (ListPreference) preference; int index = ArrayUtil.indexOf(listPreference.getEntryValues(),newValue); CharSequence newEntry = listPreference.getEntries()[index]; setDefaultLevelPreferenceSummary(newEntry); return true; } else { // text size pref // update the summary to reflect changes ListPreference listPreference = (ListPreference) preference; int index = ArrayUtil.indexOf(listPreference.getEntryValues(),newValue); CharSequence newEntry = listPreference.getEntries()[index]; listPreference.setSummary(newEntry); return true; } } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0 ) { // set result and finish Intent data = new Intent(); data.putExtra("bufferChanged", bufferChanged); setResult(RESULT_OK, data); finish(); return true; } return super.onKeyDown(keyCode, event); } private void setBufferPreferenceSummary(String value) { String[] commaSeparated = StringUtil.split(StringUtil.nullToEmpty(value), MultipleChoicePreference.DELIMITER); List<CharSequence> checkedEntries = new ArrayList<CharSequence>(); for (String entryValue : commaSeparated) { int idx = ArrayUtil.indexOf(bufferPreference.getEntryValues(),entryValue); checkedEntries.add(bufferPreference.getEntries()[idx]); } String summary = TextUtils.join(getString(R.string.delimiter), checkedEntries); // add the word "simultaneous" to make it clearer what's going on with 2+ buffers if (checkedEntries.size() > 1) { summary += getString(R.string.simultaneous); } bufferPreference.setSummary(summary); } }