diff options
-rw-r--r-- | res/layout/filter_info.xml | 15 | ||||
-rw-r--r-- | res/layout/general.xml | 15 | ||||
-rw-r--r-- | res/layout/info.xml | 15 | ||||
-rw-r--r-- | res/layout/pass_phrase.xml | 15 | ||||
-rw-r--r-- | res/layout/preferences.xml | 197 | ||||
-rw-r--r-- | res/values/arrays.xml | 35 | ||||
-rw-r--r-- | res/xml/apg_preferences.xml | 62 | ||||
-rw-r--r-- | res/xml/searchable_public_keys.xml | 15 | ||||
-rw-r--r-- | res/xml/searchable_secret_keys.xml | 15 | ||||
-rw-r--r-- | src/org/thialfihar/android/apg/BaseActivity.java | 109 | ||||
-rw-r--r-- | src/org/thialfihar/android/apg/EncryptActivity.java | 11 | ||||
-rw-r--r-- | src/org/thialfihar/android/apg/IntegerListPreference.java | 95 | ||||
-rw-r--r-- | src/org/thialfihar/android/apg/KeyListActivity.java | 13 | ||||
-rw-r--r-- | src/org/thialfihar/android/apg/MainActivity.java | 7 | ||||
-rw-r--r-- | src/org/thialfihar/android/apg/Preferences.java | 106 | ||||
-rw-r--r-- | src/org/thialfihar/android/apg/PreferencesActivity.java | 287 |
16 files changed, 530 insertions, 482 deletions
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 @@ <?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2010 Thialfihar <thi@thialfihar.org>
+
+ 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.
+-->
+
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
diff --git a/res/layout/general.xml b/res/layout/general.xml index afc776a33..c6702efac 100644 --- a/res/layout/general.xml +++ b/res/layout/general.xml @@ -1,4 +1,19 @@ <?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2010 Thialfihar <thi@thialfihar.org> + + 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. +--> + <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" diff --git a/res/layout/info.xml b/res/layout/info.xml index ab9e99a5b..2507029c4 100644 --- a/res/layout/info.xml +++ b/res/layout/info.xml @@ -1,4 +1,19 @@ <?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2010 Thialfihar <thi@thialfihar.org> + + 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. +--> + <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" diff --git a/res/layout/pass_phrase.xml b/res/layout/pass_phrase.xml index f377e5bf7..d66ffca07 100644 --- a/res/layout/pass_phrase.xml +++ b/res/layout/pass_phrase.xml @@ -1,4 +1,19 @@ <?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2010 Thialfihar <thi@thialfihar.org> + + 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. +--> + <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" diff --git a/res/layout/preferences.xml b/res/layout/preferences.xml deleted file mode 100644 index 1ff97a0e4..000000000 --- a/res/layout/preferences.xml +++ /dev/null @@ -1,197 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2010 Thialfihar <thi@thialfihar.org> - - 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. ---> - -<ScrollView - xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="fill_parent" - android:layout_height="fill_parent" - android:fillViewport="true"> - - <LinearLayout - android:layout_width="fill_parent" - android:layout_height="fill_parent" - android:orientation="vertical" - android:paddingTop="5dip" - android:layout_marginRight="?android:attr/scrollbarSize"> - - <TextView - android:id="@+id/section_general" - android:text="@string/section_general" - android:layout_width="fill_parent" - android:layout_height="wrap_content" - android:textAppearance="?android:attr/textAppearanceLarge"/> - - <View - android:layout_width="fill_parent" - android:layout_height="1dip" - android:background="?android:attr/listDivider" - android:layout_marginBottom="5dip"/> - - <LinearLayout - android:layout_width="fill_parent" - android:layout_height="wrap_content" - android:orientation="horizontal"> - - <TextView - android:id="@+id/label_passPhraseCacheTtl" - android:text="@string/label_passPhraseCacheTtl" - android:textAppearance="?android:attr/textAppearanceMedium" - android:layout_height="wrap_content" - android:layout_width="0dip" - android:layout_weight="1" - android:layout_gravity="center_vertical" - android:paddingRight="10dip"/> - - <Spinner - android:id="@+id/passPhraseCacheTtl" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center_vertical"/> - - </LinearLayout> - - <TextView - android:id="@+id/section_defaults" - android:text="@string/section_defaults" - android:layout_width="fill_parent" - android:layout_height="wrap_content" - android:layout_marginTop="5dip" - android:textAppearance="?android:attr/textAppearanceLarge"/> - - <View - android:layout_width="fill_parent" - android:layout_height="1dip" - android:background="?android:attr/listDivider" - android:layout_marginBottom="5dip"/> - - <LinearLayout - android:layout_width="fill_parent" - android:layout_height="wrap_content" - android:orientation="horizontal"> - - <TextView - android:id="@+id/label_encryptionAlgorithm" - android:text="@string/label_encryptionAlgorithm" - android:textAppearance="?android:attr/textAppearanceMedium" - android:layout_height="wrap_content" - android:layout_width="0dip" - android:layout_weight="1" - android:layout_gravity="center_vertical" - android:paddingRight="10dip"/> - - <Spinner - android:id="@+id/encryptionAlgorithm" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center_vertical"/> - - </LinearLayout> - - <LinearLayout - android:layout_width="fill_parent" - android:layout_height="wrap_content" - android:orientation="horizontal"> - - <TextView - android:id="@+id/label_hashAlgorithm" - android:text="@string/label_hashAlgorithm" - android:textAppearance="?android:attr/textAppearanceMedium" - android:layout_height="wrap_content" - android:layout_width="0dip" - android:layout_weight="1" - android:layout_gravity="center_vertical" - android:paddingRight="10dip"/> - - <Spinner - android:id="@+id/hashAlgorithm" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center_vertical"/> - - </LinearLayout> - - <LinearLayout - android:layout_width="fill_parent" - android:layout_height="wrap_content" - android:orientation="horizontal"> - - <TextView - android:id="@+id/label_messageCompression" - android:text="@string/label_messageCompression" - android:textAppearance="?android:attr/textAppearanceMedium" - android:layout_height="wrap_content" - android:layout_width="0dip" - android:layout_weight="1" - android:layout_gravity="center_vertical" - android:paddingRight="10dip"/> - - <Spinner - android:id="@+id/messageCompression" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center_vertical"/> - - </LinearLayout> - - <LinearLayout - android:layout_width="fill_parent" - android:layout_height="wrap_content" - android:orientation="horizontal"> - - <TextView - android:id="@+id/label_fileCompression" - android:text="@string/label_fileCompression" - android:textAppearance="?android:attr/textAppearanceMedium" - android:layout_height="wrap_content" - android:layout_width="0dip" - android:layout_weight="1" - android:layout_gravity="center_vertical" - android:paddingRight="10dip"/> - - <Spinner - android:id="@+id/fileCompression" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center_vertical"/> - - </LinearLayout> - - <LinearLayout - android:layout_width="fill_parent" - android:layout_height="wrap_content" - android:orientation="horizontal"> - - <TextView - android:id="@+id/label_asciiArmour" - android:text="@string/label_asciiArmour" - android:textAppearance="?android:attr/textAppearanceMedium" - android:layout_gravity="center_vertical" - android:paddingRight="10dip" - android:layout_height="wrap_content" - android:layout_width="0dip" - android:layout_weight="1"/> - - <CheckBox - android:id="@+id/asciiArmour" - android:layout_height="wrap_content" - android:layout_width="wrap_content" - android:layout_gravity="center_vertical"/> - - </LinearLayout> - - </LinearLayout> - -</ScrollView> 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 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2010 Thialfihar <thi@thialfihar.org> + + 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. +--> + +<resources> + + <string-array name="pass_phrase_cache_ttl_entries"> + <item>@string/choice_15secs</item> + <item>@string/choice_1min</item> + <item>@string/choice_3mins</item> + <item>@string/choice_5mins</item> + <item>@string/choice_10mins</item> + </string-array> + + <string-array name="pass_phrase_cache_ttl_values"> + <item>15</item> + <item>60</item> + <item>180</item> + <item>300</item> + <item>600</item> + </string-array> + +</resources> 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 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2010 Thialfihar <thi@thialfihar.org> + + 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. +--> + +<PreferenceScreen + xmlns:android="http://schemas.android.com/apk/res/android"> + + <PreferenceCategory + android:title="@string/section_general"> + + <org.thialfihar.android.apg.IntegerListPreference + android:persistent="false" + android:key="passPhraseCacheTtl" + android:entries="@array/pass_phrase_cache_ttl_entries" + android:entryValues="@array/pass_phrase_cache_ttl_values" + android:title="@string/label_passPhraseCacheTtl" /> + + </PreferenceCategory> + + <PreferenceCategory + android:title="@string/section_defaults"> + + <org.thialfihar.android.apg.IntegerListPreference + android:persistent="false" + android:key="defaultEncryptionAlgorithm" + android:title="@string/label_encryptionAlgorithm" /> + + <org.thialfihar.android.apg.IntegerListPreference + android:persistent="false" + android:key="defaultHashAlgorithm" + android:title="@string/label_hashAlgorithm" /> + + <org.thialfihar.android.apg.IntegerListPreference + android:persistent="false" + android:key="defaultMessageCompression" + android:title="@string/label_messageCompression" /> + + <org.thialfihar.android.apg.IntegerListPreference + android:persistent="false" + android:key="defaultFileCompression" + android:title="@string/label_fileCompression" /> + + <CheckBoxPreference + android:persistent="false" + android:key="defaultAsciiArmour" + android:title="@string/label_asciiArmour" /> + + </PreferenceCategory> + +</PreferenceScreen> 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 @@ <?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2010 Thialfihar <thi@thialfihar.org> + + 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. +--> + <searchable xmlns:android="http://schemas.android.com/apk/res/android" android:label="@string/app_name" diff --git a/res/xml/searchable_secret_keys.xml b/res/xml/searchable_secret_keys.xml index 43328df82..e196b4664 100644 --- a/res/xml/searchable_secret_keys.xml +++ b/res/xml/searchable_secret_keys.xml @@ -1,4 +1,19 @@ <?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2010 Thialfihar <thi@thialfihar.org> + + 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. +--> + <searchable xmlns:android="http://schemas.android.com/apk/res/android" android:label="@string/app_name" diff --git a/src/org/thialfihar/android/apg/BaseActivity.java b/src/org/thialfihar/android/apg/BaseActivity.java index 9cddc03f1..7fd8752b7 100644 --- a/src/org/thialfihar/android/apg/BaseActivity.java +++ b/src/org/thialfihar/android/apg/BaseActivity.java @@ -18,9 +18,6 @@ package org.thialfihar.android.apg; import java.io.File;
-import org.bouncycastle2.bcpg.HashAlgorithmTags;
-import org.bouncycastle2.openpgp.PGPEncryptedData;
-
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
@@ -28,7 +25,6 @@ import android.app.ProgressDialog; import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
-import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
@@ -49,7 +45,8 @@ public class BaseActivity extends Activity private long mSecretKeyId = 0;
private String mDeleteFile = null;
- protected static SharedPreferences mPreferences = null;
+
+ protected Preferences mPreferences;
private Handler mHandler = new Handler() {
@Override
@@ -62,11 +59,9 @@ public class BaseActivity extends Activity protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- Apg.initialize(this);
+ mPreferences = Preferences.getPreferences(this);
- if (mPreferences == null) {
- mPreferences = getPreferences(MODE_PRIVATE);
- }
+ Apg.initialize(this);
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
File dir = new File(Constants.path.app_dir);
@@ -76,9 +71,13 @@ public class BaseActivity extends Activity }
}
- Intent intent = new Intent(this, Service.class);
- intent.putExtra(Service.EXTRA_TTL, getPassPhraseCacheTtl());
- startService(intent);
+ startCacheService(this, mPreferences);
+ }
+
+ public static void startCacheService(Activity activity, Preferences preferences) {
+ Intent intent = new Intent(activity, Service.class);
+ intent.putExtra(Service.EXTRA_TTL, preferences.getPassPhraseCacheTtl());
+ activity.startService(intent);
}
@Override
@@ -372,92 +371,6 @@ public class BaseActivity extends Activity return mSecretKeyId;
}
- public int getPassPhraseCacheTtl() {
- int ttl = mPreferences.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;
- setPassPhraseCacheTtl(ttl);
- }
- return ttl;
- }
-
- public void setPassPhraseCacheTtl(int value) {
- SharedPreferences.Editor editor = mPreferences.edit();
- editor.putInt(Constants.pref.pass_phrase_cache_ttl, value);
- editor.commit();
-
- Intent intent = new Intent(this, Service.class);
- intent.putExtra(Service.EXTRA_TTL, value);
- startService(intent);
- }
-
- public int getDefaultEncryptionAlgorithm() {
- return mPreferences.getInt(Constants.pref.default_encryption_algorithm,
- PGPEncryptedData.AES_256);
- }
-
- public void setDefaultEncryptionAlgorithm(int value) {
- SharedPreferences.Editor editor = mPreferences.edit();
- editor.putInt(Constants.pref.default_encryption_algorithm, value);
- editor.commit();
- }
-
- public int getDefaultHashAlgorithm() {
- return mPreferences.getInt(Constants.pref.default_hash_algorithm,
- HashAlgorithmTags.SHA256);
- }
-
- public void setDefaultHashAlgorithm(int value) {
- SharedPreferences.Editor editor = mPreferences.edit();
- editor.putInt(Constants.pref.default_hash_algorithm, value);
- editor.commit();
- }
-
- public int getDefaultMessageCompression() {
- return mPreferences.getInt(Constants.pref.default_message_compression,
- Id.choice.compression.zlib);
- }
-
- public void setDefaultMessageCompression(int value) {
- SharedPreferences.Editor editor = mPreferences.edit();
- editor.putInt(Constants.pref.default_message_compression, value);
- editor.commit();
- }
-
- public int getDefaultFileCompression() {
- return mPreferences.getInt(Constants.pref.default_file_compression,
- Id.choice.compression.none);
- }
-
- public void setDefaultFileCompression(int value) {
- SharedPreferences.Editor editor = mPreferences.edit();
- editor.putInt(Constants.pref.default_file_compression, value);
- editor.commit();
- }
-
- public boolean getDefaultAsciiArmour() {
- return mPreferences.getBoolean(Constants.pref.default_ascii_armour, false);
- }
-
- public void setDefaultAsciiArmour(boolean value) {
- SharedPreferences.Editor editor = mPreferences.edit();
- editor.putBoolean(Constants.pref.default_ascii_armour, value);
- editor.commit();
- }
-
- public boolean hasSeenChangeLog() {
- return mPreferences.getBoolean(Constants.pref.has_seen_change_log + Apg.getVersion(this),
- false);
- }
-
- public void setHasSeenChangeLog(boolean value) {
- SharedPreferences.Editor editor = mPreferences.edit();
- editor.putBoolean(Constants.pref.has_seen_change_log + Apg.getVersion(this), value);
- editor.commit();
- }
-
protected void setDeleteFile(String deleteFile) {
mDeleteFile = deleteFile;
}
diff --git a/src/org/thialfihar/android/apg/EncryptActivity.java b/src/org/thialfihar/android/apg/EncryptActivity.java index 2c095ecbf..e0a38f061 100644 --- a/src/org/thialfihar/android/apg/EncryptActivity.java +++ b/src/org/thialfihar/android/apg/EncryptActivity.java @@ -213,7 +213,7 @@ public class EncryptActivity extends BaseActivity { adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); mFileCompression.setAdapter(adapter); - int defaultFileCompression = getDefaultFileCompression(); + int defaultFileCompression = mPreferences.getDefaultFileCompression(); for (int i = 0; i < choices.length; ++i) { if (choices[i].getId() == defaultFileCompression) { mFileCompression.setSelection(i); @@ -224,7 +224,7 @@ public class EncryptActivity extends BaseActivity { mDeleteAfter = (CheckBox) findViewById(R.id.deleteAfterEncryption); mAsciiArmour = (CheckBox) findViewById(R.id.asciiArmour); - mAsciiArmour.setChecked(getDefaultAsciiArmour()); + mAsciiArmour.setChecked(mPreferences.getDefaultAsciiArmour()); mAsciiArmour.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { @@ -607,18 +607,19 @@ public class EncryptActivity extends BaseActivity { size = byteData.length; useAsciiArmour = true; - compressionId = getDefaultMessageCompression(); + compressionId = mPreferences.getDefaultMessageCompression(); } if (signOnly) { Apg.signText(this, in, out, getSecretKeyId(), Apg.getCachedPassPhrase(getSecretKeyId()), - getDefaultHashAlgorithm(), this); + mPreferences.getDefaultHashAlgorithm(), this); } else { Apg.encrypt(this, in, out, size, useAsciiArmour, encryptionKeyIds, signatureKeyId, Apg.getCachedPassPhrase(signatureKeyId), this, - getDefaultEncryptionAlgorithm(), getDefaultHashAlgorithm(), + mPreferences.getDefaultEncryptionAlgorithm(), + mPreferences.getDefaultHashAlgorithm(), compressionId, passPhrase); } diff --git a/src/org/thialfihar/android/apg/IntegerListPreference.java b/src/org/thialfihar/android/apg/IntegerListPreference.java new file mode 100644 index 000000000..26a58afd5 --- /dev/null +++ b/src/org/thialfihar/android/apg/IntegerListPreference.java @@ -0,0 +1,95 @@ +/*
+ * Copyright 2010 Google Inc.
+ *
+ * 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 org.thialfihar.android.apg;
+
+import android.content.Context;
+import android.preference.ListPreference;
+import android.util.AttributeSet;
+
+/**
+ * A list preference which persists its values as integers instead of strings.
+ * Code reading the values should use
+ * {@link android.content.SharedPreferences#getInt}.
+ * When using XML-declared arrays for entry values, the arrays should be regular
+ * string arrays containing valid integer values.
+ *
+ * @author Rodrigo Damazio
+ */
+public class IntegerListPreference extends ListPreference {
+
+ public IntegerListPreference(Context context) {
+ super(context);
+
+ verifyEntryValues(null);
+ }
+
+ public IntegerListPreference(Context context, AttributeSet attrs) {
+ super(context, attrs);
+
+ verifyEntryValues(null);
+ }
+
+ @Override
+ public void setEntryValues(CharSequence[] entryValues) {
+ CharSequence[] oldValues = getEntryValues();
+ super.setEntryValues(entryValues);
+ verifyEntryValues(oldValues);
+ }
+
+ @Override
+ public void setEntryValues(int entryValuesResId) {
+ CharSequence[] oldValues = getEntryValues();
+ super.setEntryValues(entryValuesResId);
+ verifyEntryValues(oldValues);
+ }
+
+ @Override
+ protected String getPersistedString(String defaultReturnValue) {
+ // During initial load, there's no known default value
+ int defaultIntegerValue = Integer.MIN_VALUE;
+ if (defaultReturnValue != null) {
+ defaultIntegerValue = Integer.parseInt(defaultReturnValue);
+ }
+
+ // When the list preference asks us to read a string, instead read an
+ // integer.
+ int value = getPersistedInt(defaultIntegerValue);
+ return Integer.toString(value);
+ }
+
+ @Override
+ protected boolean persistString(String value) {
+ // When asked to save a string, instead save an integer
+ return persistInt(Integer.parseInt(value));
+ }
+
+ private void verifyEntryValues(CharSequence[] oldValues) {
+ CharSequence[] entryValues = getEntryValues();
+ if (entryValues == null) {
+ return;
+ }
+
+ for (CharSequence entryValue : entryValues) {
+ try {
+ Integer.parseInt(entryValue.toString());
+ } catch (NumberFormatException nfe) {
+ super.setEntryValues(oldValues);
+ throw nfe;
+ }
+ }
+ }
+}
diff --git a/src/org/thialfihar/android/apg/KeyListActivity.java b/src/org/thialfihar/android/apg/KeyListActivity.java index c9880e8fe..ac861f0ac 100644 --- a/src/org/thialfihar/android/apg/KeyListActivity.java +++ b/src/org/thialfihar/android/apg/KeyListActivity.java @@ -510,19 +510,6 @@ public class KeyListActivity extends BaseActivity { qb.appendWhere(")");
}
-<<<<<<< HEAD - String query = qb.buildQuery(new String[] {
- KeyRings.TABLE_NAME + "." + KeyRings._ID, // 0
- KeyRings.TABLE_NAME + "." + KeyRings.MASTER_KEY_ID, // 1
- UserIds.TABLE_NAME + "." + UserIds.USER_ID, // 2
- },
- KeyRings.TABLE_NAME + "." + KeyRings.TYPE + " = ?",
- new String[] { "" + (mKeyType == Id.type.public_key ?
- Id.database.type_public : Id.database.type_secret) },
- null, null, UserIds.TABLE_NAME + "." + UserIds.USER_ID + " ASC", null);
-
-======= ->>>>>>> 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;
-
-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;
+import android.preference.CheckBoxPreference;
+import android.preference.Preference;
+import android.preference.PreferenceActivity;
+
+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);
-
- 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<Choice> adapter =
- new ArrayAdapter<Choice>(this, android.R.layout.simple_spinner_item, choices);
- adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
- mPassPhraseCacheTtl.setAdapter(adapter);
- int passPhraseCache = getPassPhraseCacheTtl();
- for (int i = 0; i < choices.length; ++i) {
- if (choices[i].getId() == passPhraseCache) {
- mPassPhraseCacheTtl.setSelection(i);
- break;
- }
- }
+ mPreferences = Preferences.getPreferences(this);
- mPassPhraseCacheTtl.setOnItemSelectedListener(new OnItemSelectedListener() {
- @Override
- public void onItemSelected(AdapterView<?> adapter, View view, int index, long id) {
- setPassPhraseCacheTtl(((Choice) mPassPhraseCacheTtl.getSelectedItem()).getId());
- }
+ addPreferencesFromResource(R.xml.apg_preferences);
- @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<Choice>(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;
- }
- }
-
- 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
- }
- });
-
- 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"),
+ String entries[] = {
+ "AES-128", "AES-192", "AES-256",
+ "Blowfish", "Twofish", "CAST5",
+ "DES", "Triple DES", "IDEA",
};
- adapter = new ArrayAdapter<Choice>(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;
- }
+ String 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
+ 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;
}
});
- 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"),
+ 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<Choice>(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[] {
+ "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];
}
-
- 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
+ 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;
}
});
- 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"),
+ 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<Choice>(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;
- }
+ 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];
}
-
- mFileCompression.setOnItemSelectedListener(new OnItemSelectedListener() {
- @Override
- public void onItemSelected(AdapterView<?> adapter, View view, int index, long id) {
- setDefaultFileCompression(((Choice) mFileCompression.getSelectedItem()).getId());
+ 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;
}
+ });
- @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;
}
});
}
|