diff --git a/res/layout/filter_info.xml b/res/layout/filter_info.xml index 8e07f2434..2270682f5 100644 --- a/res/layout/filter_info.xml +++ b/res/layout/filter_info.xml @@ -1,4 +1,19 @@ + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/res/values/arrays.xml b/res/values/arrays.xml new file mode 100644 index 000000000..db87d7c4a --- /dev/null +++ b/res/values/arrays.xml @@ -0,0 +1,35 @@ + + + + + + + @string/choice_15secs + @string/choice_1min + @string/choice_3mins + @string/choice_5mins + @string/choice_10mins + + + + 15 + 60 + 180 + 300 + 600 + + + diff --git a/res/xml/apg_preferences.xml b/res/xml/apg_preferences.xml new file mode 100644 index 000000000..7ce9b5344 --- /dev/null +++ b/res/xml/apg_preferences.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/xml/searchable_public_keys.xml b/res/xml/searchable_public_keys.xml index f8963e997..6bb934fec 100644 --- a/res/xml/searchable_public_keys.xml +++ b/res/xml/searchable_public_keys.xml @@ -1,4 +1,19 @@ + + + + >>>>>> 1.0.x mCursor = qb.query(mDatabase, new String[] { KeyRings.TABLE_NAME + "." + KeyRings._ID, // 0 diff --git a/src/org/thialfihar/android/apg/MainActivity.java b/src/org/thialfihar/android/apg/MainActivity.java index aa3900998..7ba0e912b 100644 --- a/src/org/thialfihar/android/apg/MainActivity.java +++ b/src/org/thialfihar/android/apg/MainActivity.java @@ -117,7 +117,7 @@ public class MainActivity extends BaseActivity { }); registerForContextMenu(mAccounts); - if (!hasSeenChangeLog()) { + if (!mPreferences.hasSeenChangeLog(Apg.getVersion(this))) { showDialog(Id.dialog.change_log); } } @@ -216,9 +216,10 @@ public class MainActivity extends BaseActivity { new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { MainActivity.this.removeDialog(Id.dialog.change_log); - setHasSeenChangeLog(true); + mPreferences.setHasSeenChangeLog( + Apg.getVersion(MainActivity.this), true); } - }); + }); return alert.create(); } diff --git a/src/org/thialfihar/android/apg/Preferences.java b/src/org/thialfihar/android/apg/Preferences.java new file mode 100644 index 000000000..50489dc89 --- /dev/null +++ b/src/org/thialfihar/android/apg/Preferences.java @@ -0,0 +1,106 @@ +package org.thialfihar.android.apg; + +import org.bouncycastle2.bcpg.HashAlgorithmTags; +import org.bouncycastle2.openpgp.PGPEncryptedData; + +import android.content.Context; +import android.content.SharedPreferences; + +public class Preferences { + private static Preferences mPreferences; + private SharedPreferences mSharedPreferences; + + public static synchronized Preferences getPreferences(Context context) + { + if (mPreferences == null) { + mPreferences = new Preferences(context); + } + return mPreferences; + } + + private Preferences(Context context) + { + mSharedPreferences = context.getSharedPreferences("APG.main", Context.MODE_PRIVATE); + } + + public int getPassPhraseCacheTtl() { + int ttl = mSharedPreferences.getInt(Constants.pref.pass_phrase_cache_ttl, 180); + // fix the value if it was set to "never" in previous versions, which currently is not + // supported + if (ttl == 0) { + ttl = 180; + } + return ttl; + } + + public void setPassPhraseCacheTtl(int value) { + SharedPreferences.Editor editor = mSharedPreferences.edit(); + editor.putInt(Constants.pref.pass_phrase_cache_ttl, value); + editor.commit(); + } + + public int getDefaultEncryptionAlgorithm() { + return mSharedPreferences.getInt(Constants.pref.default_encryption_algorithm, + PGPEncryptedData.AES_256); + } + + public void setDefaultEncryptionAlgorithm(int value) { + SharedPreferences.Editor editor = mSharedPreferences.edit(); + editor.putInt(Constants.pref.default_encryption_algorithm, value); + editor.commit(); + } + + public int getDefaultHashAlgorithm() { + return mSharedPreferences.getInt(Constants.pref.default_hash_algorithm, + HashAlgorithmTags.SHA256); + } + + public void setDefaultHashAlgorithm(int value) { + SharedPreferences.Editor editor = mSharedPreferences.edit(); + editor.putInt(Constants.pref.default_hash_algorithm, value); + editor.commit(); + } + + public int getDefaultMessageCompression() { + return mSharedPreferences.getInt(Constants.pref.default_message_compression, + Id.choice.compression.zlib); + } + + public void setDefaultMessageCompression(int value) { + SharedPreferences.Editor editor = mSharedPreferences.edit(); + editor.putInt(Constants.pref.default_message_compression, value); + editor.commit(); + } + + public int getDefaultFileCompression() { + return mSharedPreferences.getInt(Constants.pref.default_file_compression, + Id.choice.compression.none); + } + + public void setDefaultFileCompression(int value) { + SharedPreferences.Editor editor = mSharedPreferences.edit(); + editor.putInt(Constants.pref.default_file_compression, value); + editor.commit(); + } + + public boolean getDefaultAsciiArmour() { + return mSharedPreferences.getBoolean(Constants.pref.default_ascii_armour, false); + } + + public void setDefaultAsciiArmour(boolean value) { + SharedPreferences.Editor editor = mSharedPreferences.edit(); + editor.putBoolean(Constants.pref.default_ascii_armour, value); + editor.commit(); + } + + public boolean hasSeenChangeLog(String version) { + return mSharedPreferences.getBoolean(Constants.pref.has_seen_change_log + version, + false); + } + + public void setHasSeenChangeLog(String version, boolean value) { + SharedPreferences.Editor editor = mSharedPreferences.edit(); + editor.putBoolean(Constants.pref.has_seen_change_log + version, value); + editor.commit(); + } +} diff --git a/src/org/thialfihar/android/apg/PreferencesActivity.java b/src/org/thialfihar/android/apg/PreferencesActivity.java index e80e1ad5f..3f3a709a9 100644 --- a/src/org/thialfihar/android/apg/PreferencesActivity.java +++ b/src/org/thialfihar/android/apg/PreferencesActivity.java @@ -18,202 +18,157 @@ package org.thialfihar.android.apg; import org.bouncycastle2.bcpg.HashAlgorithmTags; import org.bouncycastle2.openpgp.PGPEncryptedData; -import org.thialfihar.android.apg.utils.Choice; import android.os.Bundle; -import android.view.View; -import android.view.View.OnClickListener; -import android.widget.AdapterView; -import android.widget.ArrayAdapter; -import android.widget.CheckBox; -import android.widget.Spinner; -import android.widget.AdapterView.OnItemSelectedListener; +import android.preference.CheckBoxPreference; +import android.preference.Preference; +import android.preference.PreferenceActivity; -public class PreferencesActivity extends BaseActivity { - private Spinner mPassPhraseCacheTtl = null; - private Spinner mEncryptionAlgorithm = null; - private Spinner mHashAlgorithm = null; - private Spinner mMessageCompression = null; - private Spinner mFileCompression = null; - private CheckBox mAsciiArmour = null; +public class PreferencesActivity extends PreferenceActivity { + private IntegerListPreference mPassPhraseCacheTtl = null; + private IntegerListPreference mEncryptionAlgorithm = null; + private IntegerListPreference mHashAlgorithm = null; + private IntegerListPreference mMessageCompression = null; + private IntegerListPreference mFileCompression = null; + private CheckBoxPreference mAsciiArmour = null; + private Preferences mPreferences; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setContentView(R.layout.preferences); - mPassPhraseCacheTtl = (Spinner) findViewById(R.id.passPhraseCacheTtl); + mPreferences = Preferences.getPreferences(this); - Choice choices[] = { - new Choice(15, getString(R.string.choice_15secs)), - new Choice(60, getString(R.string.choice_1min)), - new Choice(180, getString(R.string.choice_3mins)), - new Choice(300, getString(R.string.choice_5mins)), - new Choice(600, getString(R.string.choice_10mins)), - }; - ArrayAdapter adapter = - new ArrayAdapter(this, android.R.layout.simple_spinner_item, choices); - adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); - mPassPhraseCacheTtl.setAdapter(adapter); + addPreferencesFromResource(R.xml.apg_preferences); - int passPhraseCache = getPassPhraseCacheTtl(); - for (int i = 0; i < choices.length; ++i) { - if (choices[i].getId() == passPhraseCache) { - mPassPhraseCacheTtl.setSelection(i); - break; - } - } - - mPassPhraseCacheTtl.setOnItemSelectedListener(new OnItemSelectedListener() { - @Override - public void onItemSelected(AdapterView adapter, View view, int index, long id) { - setPassPhraseCacheTtl(((Choice) mPassPhraseCacheTtl.getSelectedItem()).getId()); - } - - @Override - public void onNothingSelected(AdapterView adapter) { - // nothing to do + mPassPhraseCacheTtl = (IntegerListPreference) findPreference(Constants.pref.pass_phrase_cache_ttl); + mPassPhraseCacheTtl.setValue("" + mPreferences.getPassPhraseCacheTtl()); + mPassPhraseCacheTtl.setSummary(mPassPhraseCacheTtl.getEntry()); + mPassPhraseCacheTtl.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() + { + public boolean onPreferenceChange(Preference preference, Object newValue) + { + mPassPhraseCacheTtl.setValue(newValue.toString()); + mPassPhraseCacheTtl.setSummary(mPassPhraseCacheTtl.getEntry()); + mPreferences.setPassPhraseCacheTtl(Integer.parseInt(newValue.toString())); + BaseActivity.startCacheService(PreferencesActivity.this, mPreferences); + return false; } }); - mEncryptionAlgorithm = (Spinner) findViewById(R.id.encryptionAlgorithm); - choices = new Choice[] { - new Choice(PGPEncryptedData.AES_128, "AES 128"), - new Choice(PGPEncryptedData.AES_192, "AES 192"), - new Choice(PGPEncryptedData.AES_256, "AES 256"), - new Choice(PGPEncryptedData.BLOWFISH, "Blowfish"), - new Choice(PGPEncryptedData.TWOFISH, "Twofish"), - new Choice(PGPEncryptedData.CAST5, "CAST5"), - new Choice(PGPEncryptedData.DES, "DES"), - new Choice(PGPEncryptedData.TRIPLE_DES, "Triple DES"), - new Choice(PGPEncryptedData.IDEA, "IDEA"), + mEncryptionAlgorithm = (IntegerListPreference) findPreference(Constants.pref.default_encryption_algorithm); + int valueIds[] = { + PGPEncryptedData.AES_128, PGPEncryptedData.AES_192, PGPEncryptedData.AES_256, + PGPEncryptedData.BLOWFISH, PGPEncryptedData.TWOFISH, PGPEncryptedData.CAST5, + PGPEncryptedData.DES, PGPEncryptedData.TRIPLE_DES, PGPEncryptedData.IDEA, }; - adapter = new ArrayAdapter(this, android.R.layout.simple_spinner_item, choices); - adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); - mEncryptionAlgorithm.setAdapter(adapter); - - int defaultEncryptionAlgorithm = getDefaultEncryptionAlgorithm(); - for (int i = 0; i < choices.length; ++i) { - if (choices[i].getId() == defaultEncryptionAlgorithm) { - mEncryptionAlgorithm.setSelection(i); - break; - } + String entries[] = { + "AES-128", "AES-192", "AES-256", + "Blowfish", "Twofish", "CAST5", + "DES", "Triple DES", "IDEA", + }; + String values[] = new String[valueIds.length]; + for (int i = 0; i < values.length; ++i) { + values[i] = "" + valueIds[i]; } - - mEncryptionAlgorithm.setOnItemSelectedListener(new OnItemSelectedListener() { - @Override - public void onItemSelected(AdapterView adapter, View view, int index, long id) { - setDefaultEncryptionAlgorithm(((Choice) mEncryptionAlgorithm.getSelectedItem()).getId()); - } - - @Override - public void onNothingSelected(AdapterView adapter) { - // nothing to do + mEncryptionAlgorithm.setEntries(entries); + mEncryptionAlgorithm.setEntryValues(values); + mEncryptionAlgorithm.setValue("" + mPreferences.getDefaultEncryptionAlgorithm()); + mEncryptionAlgorithm.setSummary(mEncryptionAlgorithm.getEntry()); + mEncryptionAlgorithm.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() + { + public boolean onPreferenceChange(Preference preference, Object newValue) + { + mEncryptionAlgorithm.setValue(newValue.toString()); + mEncryptionAlgorithm.setSummary(mEncryptionAlgorithm.getEntry()); + mPreferences.setDefaultEncryptionAlgorithm(Integer.parseInt(newValue.toString())); + return false; } }); - mHashAlgorithm = (Spinner) findViewById(R.id.hashAlgorithm); - choices = new Choice[] { - new Choice(HashAlgorithmTags.MD5, "MD5"), - new Choice(HashAlgorithmTags.RIPEMD160, "RIPEMD160"), - new Choice(HashAlgorithmTags.SHA1, "SHA1"), - new Choice(HashAlgorithmTags.SHA224, "SHA224"), - new Choice(HashAlgorithmTags.SHA256, "SHA256"), - new Choice(HashAlgorithmTags.SHA384, "SHA384"), - new Choice(HashAlgorithmTags.SHA512, "SHA512"), + mHashAlgorithm = (IntegerListPreference) findPreference(Constants.pref.default_hash_algorithm); + valueIds = new int[] { + HashAlgorithmTags.MD5, HashAlgorithmTags.RIPEMD160, HashAlgorithmTags.SHA1, + HashAlgorithmTags.SHA224, HashAlgorithmTags.SHA256, HashAlgorithmTags.SHA384, + HashAlgorithmTags.SHA512, }; - adapter = new ArrayAdapter(this, android.R.layout.simple_spinner_item, choices); - adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); - mHashAlgorithm.setAdapter(adapter); - - int defaultHashAlgorithm = getDefaultHashAlgorithm(); - for (int i = 0; i < choices.length; ++i) { - if (choices[i].getId() == defaultHashAlgorithm) { - mHashAlgorithm.setSelection(i); - break; - } + entries = new String[] { + "MD5", "RIPEMD-160", "SHA-1", + "SHA-224", "SHA-256", "SHA-384", + "SHA-512", + }; + values = new String[valueIds.length]; + for (int i = 0; i < values.length; ++i) { + values[i] = "" + valueIds[i]; } - - mHashAlgorithm.setOnItemSelectedListener(new OnItemSelectedListener() { - @Override - public void onItemSelected(AdapterView adapter, View view, int index, long id) { - setDefaultHashAlgorithm(((Choice) mHashAlgorithm.getSelectedItem()).getId()); - } - - @Override - public void onNothingSelected(AdapterView adapter) { - // nothing to do + mHashAlgorithm.setEntries(entries); + mHashAlgorithm.setEntryValues(values); + mHashAlgorithm.setValue("" + mPreferences.getDefaultHashAlgorithm()); + mHashAlgorithm.setSummary(mHashAlgorithm.getEntry()); + mHashAlgorithm.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() + { + public boolean onPreferenceChange(Preference preference, Object newValue) + { + mHashAlgorithm.setValue(newValue.toString()); + mHashAlgorithm.setSummary(mHashAlgorithm.getEntry()); + mPreferences.setDefaultHashAlgorithm(Integer.parseInt(newValue.toString())); + return false; } }); - mMessageCompression = (Spinner) findViewById(R.id.messageCompression); - choices = new Choice[] { - new Choice(Id.choice.compression.none, getString(R.string.choice_none)), - new Choice(Id.choice.compression.zip, "ZIP"), - new Choice(Id.choice.compression.bzip2, "BZIP2"), - new Choice(Id.choice.compression.zlib, "ZLIB"), + mMessageCompression = (IntegerListPreference) findPreference(Constants.pref.default_message_compression); + valueIds = new int[] { + Id.choice.compression.none, Id.choice.compression.zip, + Id.choice.compression.bzip2, Id.choice.compression.zlib, }; - adapter = new ArrayAdapter(this, android.R.layout.simple_spinner_item, choices); - adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); - mMessageCompression.setAdapter(adapter); - - int defaultMessageCompression = getDefaultMessageCompression(); - for (int i = 0; i < choices.length; ++i) { - if (choices[i].getId() == defaultMessageCompression) { - mMessageCompression.setSelection(i); - break; - } + entries = new String[] { + getString(R.string.choice_none), "ZIP", + "BZIP2", "ZLIB", + }; + values = new String[valueIds.length]; + for (int i = 0; i < values.length; ++i) { + values[i] = "" + valueIds[i]; } - - mMessageCompression.setOnItemSelectedListener(new OnItemSelectedListener() { - @Override - public void onItemSelected(AdapterView adapter, View view, int index, long id) { - setDefaultMessageCompression(((Choice) mMessageCompression.getSelectedItem()).getId()); - } - - @Override - public void onNothingSelected(AdapterView adapter) { - // nothing to do + mMessageCompression.setEntries(entries); + mMessageCompression.setEntryValues(values); + mMessageCompression.setValue("" + mPreferences.getDefaultMessageCompression()); + mMessageCompression.setSummary(mMessageCompression.getEntry()); + mMessageCompression.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() + { + public boolean onPreferenceChange(Preference preference, Object newValue) + { + mMessageCompression.setValue(newValue.toString()); + mMessageCompression.setSummary(mMessageCompression.getEntry()); + mPreferences.setDefaultMessageCompression(Integer.parseInt(newValue.toString())); + return false; } }); - mFileCompression = (Spinner) findViewById(R.id.fileCompression); - choices = new Choice[] { - new Choice(Id.choice.compression.none, getString(R.string.choice_none)), - new Choice(Id.choice.compression.zip, "ZIP"), - new Choice(Id.choice.compression.bzip2, "BZIP2"), - new Choice(Id.choice.compression.zlib, "ZLIB"), - }; - adapter = new ArrayAdapter(this, android.R.layout.simple_spinner_item, choices); - adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); - mFileCompression.setAdapter(adapter); - - int defaultFileCompression = getDefaultFileCompression(); - for (int i = 0; i < choices.length; ++i) { - if (choices[i].getId() == defaultFileCompression) { - mFileCompression.setSelection(i); - break; - } - } - - mFileCompression.setOnItemSelectedListener(new OnItemSelectedListener() { - @Override - public void onItemSelected(AdapterView adapter, View view, int index, long id) { - setDefaultFileCompression(((Choice) mFileCompression.getSelectedItem()).getId()); - } - - @Override - public void onNothingSelected(AdapterView adapter) { - // nothing to do + mFileCompression = (IntegerListPreference) findPreference(Constants.pref.default_file_compression); + mFileCompression.setEntries(entries); + mFileCompression.setEntryValues(values); + mFileCompression.setValue("" + mPreferences.getDefaultFileCompression()); + mFileCompression.setSummary(mFileCompression.getEntry()); + mFileCompression.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() + { + public boolean onPreferenceChange(Preference preference, Object newValue) + { + mFileCompression.setValue(newValue.toString()); + mFileCompression.setSummary(mFileCompression.getEntry()); + mPreferences.setDefaultFileCompression(Integer.parseInt(newValue.toString())); + return false; } }); - mAsciiArmour = (CheckBox) findViewById(R.id.asciiArmour); - mAsciiArmour.setChecked(getDefaultAsciiArmour()); - mAsciiArmour.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - setDefaultAsciiArmour(mAsciiArmour.isChecked()); + mAsciiArmour = (CheckBoxPreference) findPreference(Constants.pref.default_ascii_armour); + mAsciiArmour.setChecked(mPreferences.getDefaultAsciiArmour()); + mAsciiArmour.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() + { + public boolean onPreferenceChange(Preference preference, Object newValue) + { + mAsciiArmour.setChecked((Boolean)newValue); + mPreferences.setDefaultAsciiArmour((Boolean)newValue); + return false; } }); }