diff options
Diffstat (limited to 'OpenKeychain')
7 files changed, 195 insertions, 32 deletions
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/Constants.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/Constants.java index fc1cb8acc..7c2f093ee 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/Constants.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/Constants.java @@ -84,6 +84,9 @@ public final class Constants { public static final String SEARCH_KEYBASE = "search_keybase_pref"; public static final String USE_DEFAULT_YUBIKEY_PIN = "useDefaultYubikeyPin"; public static final String USE_NUMKEYPAD_FOR_YUBIKEY_PIN = "useNumKeypadForYubikeyPin"; + public static final String ENCRYPT_FILENAMES = "encryptFilenames"; + public static final String USE_COMPRESSION = "useCompression"; + public static final String USE_ARMOR = "useArmor"; } public static final class Defaults { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesActivity.java index 45700f978..4d23ba9f8 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesActivity.java @@ -73,12 +73,10 @@ public class EncryptFilesActivity extends EncryptActivity { uris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM); } - boolean useArmor = extras.getBoolean(EXTRA_ASCII_ARMOR, false); - if (savedInstanceState == null) { FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); - EncryptFilesFragment encryptFragment = EncryptFilesFragment.newInstance(uris, useArmor); + EncryptFilesFragment encryptFragment = EncryptFilesFragment.newInstance(uris); transaction.replace(R.id.encrypt_file_container, encryptFragment); transaction.commit(); } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesFragment.java index f5963dbf0..13de80eb8 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesFragment.java @@ -41,6 +41,7 @@ import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; +import com.nispok.snackbar.Snackbar; import org.spongycastle.bcpg.CompressionAlgorithmTags; import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.R; @@ -58,9 +59,12 @@ import org.sufficientlysecure.keychain.ui.dialog.DeleteFileDialogFragment; import org.sufficientlysecure.keychain.ui.dialog.ProgressDialogFragment; import org.sufficientlysecure.keychain.ui.util.FormattingUtils; import org.sufficientlysecure.keychain.ui.util.Notify; +import org.sufficientlysecure.keychain.ui.util.Notify.ActionListener; +import org.sufficientlysecure.keychain.ui.util.Notify.Style; import org.sufficientlysecure.keychain.util.FileHelper; import org.sufficientlysecure.keychain.util.Log; import org.sufficientlysecure.keychain.util.Passphrase; +import org.sufficientlysecure.keychain.util.Preferences; import org.sufficientlysecure.keychain.util.ShareHelper; import java.io.File; @@ -99,11 +103,10 @@ public class EncryptFilesFragment extends CachingCryptoOperationFragment<SignEnc /** * Creates new instance of this fragment */ - public static EncryptFilesFragment newInstance(ArrayList<Uri> uris, boolean useArmor) { + public static EncryptFilesFragment newInstance(ArrayList<Uri> uris) { EncryptFilesFragment frag = new EncryptFilesFragment(); Bundle args = new Bundle(); - args.putBoolean(ARG_USE_ASCII_ARMOR, useArmor); args.putParcelableArrayList(ARG_URIS, uris); frag.setArguments(args); @@ -167,11 +170,28 @@ public class EncryptFilesFragment extends CachingCryptoOperationFragment<SignEnc public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + Preferences prefs = Preferences.getPreferences(getActivity()); + Bundle args = savedInstanceState == null ? getArguments() : savedInstanceState; mDeleteAfterEncrypt = args.getBoolean(ARG_DELETE_AFTER_ENCRYPT, false); - mUseArmor = args.getBoolean(ARG_USE_ASCII_ARMOR, false); - mUseCompression = args.getBoolean(ARG_USE_COMPRESSION, true); - mEncryptFilenames = args.getBoolean(ARG_ENCRYPT_FILENAMES, true); + + if (args.containsKey(ARG_USE_ASCII_ARMOR)) { + mUseArmor = args.getBoolean(ARG_USE_ASCII_ARMOR, false); + } else { + mUseArmor = prefs.getUseArmor(); + } + + if (args.containsKey(ARG_USE_COMPRESSION)) { + mUseCompression = args.getBoolean(ARG_USE_COMPRESSION, true); + } else { + mUseCompression = prefs.getUseCompression(); + } + + if (args.containsKey(ARG_ENCRYPT_FILENAMES)) { + mEncryptFilenames = args.getBoolean(ARG_ENCRYPT_FILENAMES, true); + } else { + mEncryptFilenames = prefs.getEncryptFilenames(); + } setHasOptionsMenu(true); } @@ -262,9 +282,7 @@ public class EncryptFilesFragment extends CachingCryptoOperationFragment<SignEnc break; } case R.id.check_use_armor: { - // we can NOT do this for every item, others might care! - item.setChecked(!item.isChecked()); - mUseArmor = item.isChecked(); + toggleUseArmor(item, !item.isChecked()); break; } case R.id.check_delete_after_encrypt: { @@ -273,13 +291,11 @@ public class EncryptFilesFragment extends CachingCryptoOperationFragment<SignEnc break; } case R.id.check_enable_compression: { - item.setChecked(!item.isChecked()); - mUseCompression = item.isChecked(); + toggleEnableCompression(item, !item.isChecked()); break; } case R.id.check_encrypt_filenames: { - item.setChecked(!item.isChecked()); - mEncryptFilenames = item.isChecked(); + toggleEncryptFilenamesCheck(item, !item.isChecked()); break; } // case R.id.check_hidden_recipients: { @@ -294,6 +310,72 @@ public class EncryptFilesFragment extends CachingCryptoOperationFragment<SignEnc return true; } + public void toggleUseArmor(MenuItem item, final boolean useArmor) { + + mUseArmor = useArmor; + item.setChecked(useArmor); + + Notify.create(getActivity(), useArmor + ? R.string.snack_armor_on + : R.string.snack_armor_off, + Notify.LENGTH_LONG, Style.OK, new ActionListener() { + @Override + public void onAction() { + Preferences.getPreferences(getActivity()).setUseArmor(useArmor); + Notify.create(getActivity(), useArmor + ? R.string.snack_armor_on + : R.string.snack_armor_off, + Notify.LENGTH_SHORT, Style.OK, null, R.string.btn_saved) + .show(EncryptFilesFragment.this, false); + } + }, R.string.btn_save_default).show(this); + + } + + public void toggleEnableCompression(MenuItem item, final boolean compress) { + + mUseCompression = compress; + item.setChecked(compress); + + Notify.create(getActivity(), compress + ? R.string.snack_compression_on + : R.string.snack_compression_off, + Notify.LENGTH_LONG, Style.OK, new ActionListener() { + @Override + public void onAction() { + Preferences.getPreferences(getActivity()).setUseCompression(compress); + Notify.create(getActivity(), compress + ? R.string.snack_compression_on + : R.string.snack_compression_off, + Notify.LENGTH_SHORT, Style.OK, null, R.string.btn_saved) + .show(EncryptFilesFragment.this, false); + } + }, R.string.btn_save_default).show(this); + + } + + public void toggleEncryptFilenamesCheck(MenuItem item, final boolean encryptFilenames) { + + mEncryptFilenames = encryptFilenames; + item.setChecked(encryptFilenames); + + Notify.create(getActivity(), encryptFilenames + ? R.string.snack_encrypt_filenames_on + : R.string.snack_encrypt_filenames_off, + Notify.LENGTH_LONG, Style.OK, new ActionListener() { + @Override + public void onAction() { + Preferences.getPreferences(getActivity()).setEncryptFilenames(encryptFilenames); + Notify.create(getActivity(), encryptFilenames + ? R.string.snack_encrypt_filenames_on + : R.string.snack_encrypt_filenames_off, + Notify.LENGTH_SHORT, Style.OK, null, R.string.btn_saved) + .show(EncryptFilesFragment.this, false); + } + }, R.string.btn_save_default).show(this); + + } + public void onEncryptSuccess(final SignEncryptResult result) { if (mDeleteAfterEncrypt) { DeleteFileDialogFragment deleteFileDialog = diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptTextFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptTextFragment.java index 10442ade0..7f6f6db14 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptTextFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptTextFragment.java @@ -47,7 +47,10 @@ import org.sufficientlysecure.keychain.service.input.CryptoInputParcel; import org.sufficientlysecure.keychain.ui.base.CachingCryptoOperationFragment; import org.sufficientlysecure.keychain.ui.dialog.ProgressDialogFragment; import org.sufficientlysecure.keychain.ui.util.Notify; +import org.sufficientlysecure.keychain.ui.util.Notify.ActionListener; +import org.sufficientlysecure.keychain.ui.util.Notify.Style; import org.sufficientlysecure.keychain.util.Passphrase; +import org.sufficientlysecure.keychain.util.Preferences; import org.sufficientlysecure.keychain.util.ShareHelper; import java.util.HashSet; @@ -131,8 +134,16 @@ public class EncryptTextFragment extends CachingCryptoOperationFragment<SignEncr mMessage = getArguments().getString(ARG_TEXT); } + Preferences prefs = Preferences.getPreferences(getActivity()); + Bundle args = savedInstanceState == null ? getArguments() : savedInstanceState; + mUseCompression = args.getBoolean(ARG_USE_COMPRESSION, true); + if (args.containsKey(ARG_USE_COMPRESSION)) { + mUseCompression = args.getBoolean(ARG_USE_COMPRESSION, true); + } else { + mUseCompression = prefs.getUseCompression(); + } setHasOptionsMenu(true); } @@ -147,12 +158,9 @@ public class EncryptTextFragment extends CachingCryptoOperationFragment<SignEncr @Override public boolean onOptionsItemSelected(MenuItem item) { - if (item.isCheckable()) { - item.setChecked(!item.isChecked()); - } switch (item.getItemId()) { case R.id.check_enable_compression: { - mUseCompression = item.isChecked(); + toggleEnableCompression(item, !item.isChecked()); break; } // case R.id.check_hidden_recipients: { @@ -175,6 +183,28 @@ public class EncryptTextFragment extends CachingCryptoOperationFragment<SignEncr return true; } + public void toggleEnableCompression(MenuItem item, final boolean compress) { + + mUseCompression = compress; + item.setChecked(compress); + + Notify.create(getActivity(), compress + ? R.string.snack_compression_on + : R.string.snack_compression_off, + Notify.LENGTH_LONG, Style.OK, new ActionListener() { + @Override + public void onAction() { + Preferences.getPreferences(getActivity()).setUseCompression(compress); + Notify.create(getActivity(), compress + ? R.string.snack_compression_on + : R.string.snack_compression_off, + Notify.LENGTH_SHORT, Style.OK, null, R.string.btn_saved) + .show(EncryptTextFragment.this, false); + } + }, R.string.btn_save_default).show(this); + + } + protected void onEncryptSuccess(SignEncryptResult result) { if (mShareAfterEncrypt) { // Share encrypted message/file diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/Notify.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/Notify.java index 7e07ed818..8c554dbde 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/Notify.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/Notify.java @@ -62,9 +62,10 @@ public class Notify { public static final int LENGTH_INDEFINITE = 0; public static final int LENGTH_LONG = 3500; + public static final int LENGTH_SHORT = 1500; public static Showable create(final Activity activity, String text, int duration, Style style, - final ActionListener actionListener, int actionResId) { + final ActionListener actionListener, Integer actionResId) { final Snackbar snackbar = Snackbar.with(activity) .type(SnackbarType.MULTI_LINE) .text(text); @@ -77,14 +78,16 @@ public class Notify { style.applyToBar(snackbar); + if (actionResId != null) { + snackbar.actionLabel(actionResId); + } if (actionListener != null) { - snackbar.actionLabel(actionResId) - .actionListener(new ActionClickListener() { - @Override - public void onActionClicked(Snackbar snackbar) { - actionListener.onAction(); - } - }); + snackbar.actionListener(new ActionClickListener() { + @Override + public void onActionClicked(Snackbar snackbar) { + actionListener.onAction(); + } + }); } if (activity instanceof FabContainer) { @@ -108,6 +111,13 @@ public class Notify { } @Override + public void show(Fragment fragment, boolean animate) { + snackbar.animation(animate); + snackbar.dismissOnActionClicked(animate); + show(fragment); + } + + @Override public void show(Fragment fragment) { if (fragment != null) { View view = fragment.getView(); @@ -134,7 +144,7 @@ public class Notify { } public static Showable create(Activity activity, String text, int duration, Style style) { - return create(activity, text, duration, style, null, -1); + return create(activity, text, duration, style, null, null); } public static Showable create(Activity activity, String text, Style style) { @@ -159,24 +169,26 @@ public class Notify { /** * Shows the notification on the bottom of the Activity. */ - public void show(); + void show(); + + void show(Fragment fragment, boolean animate); /** * Shows the notification on the bottom of the Fragment. */ - public void show(Fragment fragment); + void show(Fragment fragment); /** * Shows the notification on the given ViewGroup. * The viewGroup should be either a RelativeLayout or FrameLayout. */ - public void show(ViewGroup viewGroup); + void show(ViewGroup viewGroup); } public interface ActionListener { - public void onAction(); + void onAction(); } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/Preferences.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/Preferences.java index 303687315..dd295fb14 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/Preferences.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/Preferences.java @@ -182,6 +182,36 @@ public class Preferences { editor.commit(); } + public void setUseCompression(boolean compress) { + SharedPreferences.Editor editor = mSharedPreferences.edit(); + editor.putBoolean(Pref.USE_COMPRESSION, compress); + editor.commit(); + } + + public boolean getUseCompression() { + return mSharedPreferences.getBoolean(Pref.USE_COMPRESSION, true); + } + + public void setUseArmor(boolean useArmor) { + SharedPreferences.Editor editor = mSharedPreferences.edit(); + editor.putBoolean(Pref.USE_ARMOR, useArmor); + editor.commit(); + } + + public boolean getUseArmor() { + return mSharedPreferences.getBoolean(Pref.USE_ARMOR, false); + } + + public void setEncryptFilenames(boolean encryptFilenames) { + SharedPreferences.Editor editor = mSharedPreferences.edit(); + editor.putBoolean(Pref.ENCRYPT_FILENAMES, encryptFilenames); + editor.commit(); + } + + public boolean getEncryptFilenames() { + return mSharedPreferences.getBoolean(Pref.ENCRYPT_FILENAMES, true); + } + public CloudSearchPrefs getCloudSearchPrefs() { return new CloudSearchPrefs(mSharedPreferences.getBoolean(Pref.SEARCH_KEYSERVER, true), mSharedPreferences.getBoolean(Pref.SEARCH_KEYBASE, true), diff --git a/OpenKeychain/src/main/res/values/strings.xml b/OpenKeychain/src/main/res/values/strings.xml index 58e9292de..67952a6a4 100644 --- a/OpenKeychain/src/main/res/values/strings.xml +++ b/OpenKeychain/src/main/res/values/strings.xml @@ -88,6 +88,8 @@ <string name="btn_add_email">"Add additional email address"</string> <string name="btn_unlock">"Unlock"</string> <string name="btn_add_keyserver">"Add"</string> + <string name="btn_save_default">"Save as default"</string> + <string name="btn_saved">"Saved!"</string> <!-- menu --> <string name="menu_preferences">"Settings"</string> @@ -1308,5 +1310,11 @@ <string name="error_nfc">"NFC Error: %s"</string> <string name="error_pin_nodefault">Default PIN was rejected!</string> <string name="error_bluetooth_file">Error creating temporary file. Bluetooth sharing will fail.</string> + <string name="snack_encrypt_filenames_on">"Filenames <b>are</b> encrypted."</string> + <string name="snack_encrypt_filenames_off">"Filenames <b>are not</b> encrypted."</string> + <string name="snack_armor_on">"Output encoded as Text."</string> + <string name="snack_armor_off">"Output encoded as Binary."</string> + <string name="snack_compression_on">"Compression <b>enabled</b>."</string> + <string name="snack_compression_off">"Compression <b>disabled</b>."</string> </resources> |