diff options
| author | Thialfihar <thialfihar@gmail.com> | 2010-06-17 13:23:07 +0000 | 
|---|---|---|
| committer | Thialfihar <thialfihar@gmail.com> | 2010-06-17 13:23:07 +0000 | 
| commit | 1bad192a91364fe48ae38ddcf6fb436a40a82283 (patch) | |
| tree | 1549299e50016a793bf6d57c5a21add8a3ee3869 | |
| parent | 865c998abdf96f8b97e6bb444b732fa18fc02671 (diff) | |
| download | open-keychain-1bad192a91364fe48ae38ddcf6fb436a40a82283.tar.gz open-keychain-1bad192a91364fe48ae38ddcf6fb436a40a82283.tar.bz2 open-keychain-1bad192a91364fe48ae38ddcf6fb436a40a82283.zip  | |
using proper PreferenceActivity now, tho the underlying storage of the values remained almost the same, some changes how the preferences are accessed and how the cache service is started
| -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;
              }
          });
      }
  | 
