Merge branch 'v/sticky-prefs'

This commit is contained in:
Vincent Breitmoser 2015-06-03 01:23:51 +02:00
commit 7cfc0d80d0
7 changed files with 207 additions and 32 deletions

View File

@ -84,6 +84,10 @@ public final class Constants {
public static final String SEARCH_KEYBASE = "search_keybase_pref"; public static final String SEARCH_KEYBASE = "search_keybase_pref";
public static final String USE_DEFAULT_YUBIKEY_PIN = "useDefaultYubikeyPin"; public static final String USE_DEFAULT_YUBIKEY_PIN = "useDefaultYubikeyPin";
public static final String USE_NUMKEYPAD_FOR_YUBIKEY_PIN = "useNumKeypadForYubikeyPin"; public static final String USE_NUMKEYPAD_FOR_YUBIKEY_PIN = "useNumKeypadForYubikeyPin";
public static final String ENCRYPT_FILENAMES = "encryptFilenames";
public static final String FILE_USE_COMPRESSION = "useFileCompression";
public static final String TEXT_USE_COMPRESSION = "useTextCompression";
public static final String USE_ARMOR = "useArmor";
} }
public static final class Defaults { public static final class Defaults {

View File

@ -73,12 +73,10 @@ public class EncryptFilesActivity extends EncryptActivity {
uris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM); uris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM);
} }
boolean useArmor = extras.getBoolean(EXTRA_ASCII_ARMOR, false);
if (savedInstanceState == null) { if (savedInstanceState == null) {
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
EncryptFilesFragment encryptFragment = EncryptFilesFragment.newInstance(uris, useArmor); EncryptFilesFragment encryptFragment = EncryptFilesFragment.newInstance(uris);
transaction.replace(R.id.encrypt_file_container, encryptFragment); transaction.replace(R.id.encrypt_file_container, encryptFragment);
transaction.commit(); transaction.commit();
} }

View File

@ -57,9 +57,12 @@ import org.sufficientlysecure.keychain.ui.base.CachingCryptoOperationFragment;
import org.sufficientlysecure.keychain.ui.dialog.DeleteFileDialogFragment; import org.sufficientlysecure.keychain.ui.dialog.DeleteFileDialogFragment;
import org.sufficientlysecure.keychain.ui.util.FormattingUtils; import org.sufficientlysecure.keychain.ui.util.FormattingUtils;
import org.sufficientlysecure.keychain.ui.util.Notify; 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.FileHelper;
import org.sufficientlysecure.keychain.util.Log; import org.sufficientlysecure.keychain.util.Log;
import org.sufficientlysecure.keychain.util.Passphrase; import org.sufficientlysecure.keychain.util.Passphrase;
import org.sufficientlysecure.keychain.util.Preferences;
import org.sufficientlysecure.keychain.util.ShareHelper; import org.sufficientlysecure.keychain.util.ShareHelper;
import java.io.File; import java.io.File;
@ -98,11 +101,10 @@ public class EncryptFilesFragment extends CachingCryptoOperationFragment<SignEnc
/** /**
* Creates new instance of this fragment * 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(); EncryptFilesFragment frag = new EncryptFilesFragment();
Bundle args = new Bundle(); Bundle args = new Bundle();
args.putBoolean(ARG_USE_ASCII_ARMOR, useArmor);
args.putParcelableArrayList(ARG_URIS, uris); args.putParcelableArrayList(ARG_URIS, uris);
frag.setArguments(args); frag.setArguments(args);
@ -166,11 +168,28 @@ public class EncryptFilesFragment extends CachingCryptoOperationFragment<SignEnc
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
Preferences prefs = Preferences.getPreferences(getActivity());
Bundle args = savedInstanceState == null ? getArguments() : savedInstanceState; Bundle args = savedInstanceState == null ? getArguments() : savedInstanceState;
mDeleteAfterEncrypt = args.getBoolean(ARG_DELETE_AFTER_ENCRYPT, false); mDeleteAfterEncrypt = args.getBoolean(ARG_DELETE_AFTER_ENCRYPT, false);
mUseArmor = args.getBoolean(ARG_USE_ASCII_ARMOR, false);
mUseCompression = args.getBoolean(ARG_USE_COMPRESSION, true); if (args.containsKey(ARG_USE_ASCII_ARMOR)) {
mEncryptFilenames = args.getBoolean(ARG_ENCRYPT_FILENAMES, true); 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.getFilesUseCompression();
}
if (args.containsKey(ARG_ENCRYPT_FILENAMES)) {
mEncryptFilenames = args.getBoolean(ARG_ENCRYPT_FILENAMES, true);
} else {
mEncryptFilenames = prefs.getEncryptFilenames();
}
setHasOptionsMenu(true); setHasOptionsMenu(true);
} }
@ -261,9 +280,7 @@ public class EncryptFilesFragment extends CachingCryptoOperationFragment<SignEnc
break; break;
} }
case R.id.check_use_armor: { case R.id.check_use_armor: {
// we can NOT do this for every item, others might care! toggleUseArmor(item, !item.isChecked());
item.setChecked(!item.isChecked());
mUseArmor = item.isChecked();
break; break;
} }
case R.id.check_delete_after_encrypt: { case R.id.check_delete_after_encrypt: {
@ -272,13 +289,11 @@ public class EncryptFilesFragment extends CachingCryptoOperationFragment<SignEnc
break; break;
} }
case R.id.check_enable_compression: { case R.id.check_enable_compression: {
item.setChecked(!item.isChecked()); toggleEnableCompression(item, !item.isChecked());
mUseCompression = item.isChecked();
break; break;
} }
case R.id.check_encrypt_filenames: { case R.id.check_encrypt_filenames: {
item.setChecked(!item.isChecked()); toggleEncryptFilenamesCheck(item, !item.isChecked());
mEncryptFilenames = item.isChecked();
break; break;
} }
// case R.id.check_hidden_recipients: { // case R.id.check_hidden_recipients: {
@ -293,6 +308,72 @@ public class EncryptFilesFragment extends CachingCryptoOperationFragment<SignEnc
return true; 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()).setFilesUseCompression(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) { public void onEncryptSuccess(final SignEncryptResult result) {
if (mDeleteAfterEncrypt) { if (mDeleteAfterEncrypt) {
DeleteFileDialogFragment deleteFileDialog = DeleteFileDialogFragment deleteFileDialog =

View File

@ -46,7 +46,10 @@ import org.sufficientlysecure.keychain.service.ServiceProgressHandler;
import org.sufficientlysecure.keychain.service.input.CryptoInputParcel; import org.sufficientlysecure.keychain.service.input.CryptoInputParcel;
import org.sufficientlysecure.keychain.ui.base.CachingCryptoOperationFragment; import org.sufficientlysecure.keychain.ui.base.CachingCryptoOperationFragment;
import org.sufficientlysecure.keychain.ui.util.Notify; 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.Passphrase;
import org.sufficientlysecure.keychain.util.Preferences;
import org.sufficientlysecure.keychain.util.ShareHelper; import org.sufficientlysecure.keychain.util.ShareHelper;
import java.util.HashSet; import java.util.HashSet;
@ -130,8 +133,16 @@ public class EncryptTextFragment extends CachingCryptoOperationFragment<SignEncr
mMessage = getArguments().getString(ARG_TEXT); mMessage = getArguments().getString(ARG_TEXT);
} }
Preferences prefs = Preferences.getPreferences(getActivity());
Bundle args = savedInstanceState == null ? getArguments() : savedInstanceState; Bundle args = savedInstanceState == null ? getArguments() : savedInstanceState;
mUseCompression = args.getBoolean(ARG_USE_COMPRESSION, true); mUseCompression = args.getBoolean(ARG_USE_COMPRESSION, true);
if (args.containsKey(ARG_USE_COMPRESSION)) {
mUseCompression = args.getBoolean(ARG_USE_COMPRESSION, true);
} else {
mUseCompression = prefs.getTextUseCompression();
}
setHasOptionsMenu(true); setHasOptionsMenu(true);
} }
@ -146,12 +157,9 @@ public class EncryptTextFragment extends CachingCryptoOperationFragment<SignEncr
@Override @Override
public boolean onOptionsItemSelected(MenuItem item) { public boolean onOptionsItemSelected(MenuItem item) {
if (item.isCheckable()) {
item.setChecked(!item.isChecked());
}
switch (item.getItemId()) { switch (item.getItemId()) {
case R.id.check_enable_compression: { case R.id.check_enable_compression: {
mUseCompression = item.isChecked(); toggleEnableCompression(item, !item.isChecked());
break; break;
} }
// case R.id.check_hidden_recipients: { // case R.id.check_hidden_recipients: {
@ -174,6 +182,28 @@ public class EncryptTextFragment extends CachingCryptoOperationFragment<SignEncr
return true; 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()).setTextUseCompression(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) { protected void onEncryptSuccess(SignEncryptResult result) {
if (mShareAfterEncrypt) { if (mShareAfterEncrypt) {
// Share encrypted message/file // Share encrypted message/file

View File

@ -62,9 +62,10 @@ public class Notify {
public static final int LENGTH_INDEFINITE = 0; public static final int LENGTH_INDEFINITE = 0;
public static final int LENGTH_LONG = 3500; 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, 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) final Snackbar snackbar = Snackbar.with(activity)
.type(SnackbarType.MULTI_LINE) .type(SnackbarType.MULTI_LINE)
.text(text); .text(text);
@ -77,14 +78,16 @@ public class Notify {
style.applyToBar(snackbar); style.applyToBar(snackbar);
if (actionResId != null) {
snackbar.actionLabel(actionResId);
}
if (actionListener != null) { if (actionListener != null) {
snackbar.actionLabel(actionResId) snackbar.actionListener(new ActionClickListener() {
.actionListener(new ActionClickListener() { @Override
@Override public void onActionClicked(Snackbar snackbar) {
public void onActionClicked(Snackbar snackbar) { actionListener.onAction();
actionListener.onAction(); }
} });
});
} }
if (activity instanceof FabContainer) { if (activity instanceof FabContainer) {
@ -107,6 +110,13 @@ public class Notify {
SnackbarManager.show(snackbar, activity); SnackbarManager.show(snackbar, activity);
} }
@Override
public void show(Fragment fragment, boolean animate) {
snackbar.animation(animate);
snackbar.dismissOnActionClicked(animate);
show(fragment);
}
@Override @Override
public void show(Fragment fragment) { public void show(Fragment fragment) {
if (fragment != null) { if (fragment != null) {
@ -134,7 +144,7 @@ public class Notify {
} }
public static Showable create(Activity activity, String text, int duration, Style style) { 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) { 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. * 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. * 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. * Shows the notification on the given ViewGroup.
* The viewGroup should be either a RelativeLayout or FrameLayout. * The viewGroup should be either a RelativeLayout or FrameLayout.
*/ */
public void show(ViewGroup viewGroup); void show(ViewGroup viewGroup);
} }
public interface ActionListener { public interface ActionListener {
public void onAction(); void onAction();
} }

View File

@ -182,6 +182,48 @@ public class Preferences {
editor.commit(); editor.commit();
} }
public void setFilesUseCompression(boolean compress) {
SharedPreferences.Editor editor = mSharedPreferences.edit();
editor.putBoolean(Pref.FILE_USE_COMPRESSION, compress);
editor.commit();
}
public boolean getFilesUseCompression() {
return mSharedPreferences.getBoolean(Pref.FILE_USE_COMPRESSION, true);
}
public void setTextUseCompression(boolean compress) {
SharedPreferences.Editor editor = mSharedPreferences.edit();
editor.putBoolean(Pref.TEXT_USE_COMPRESSION, compress);
editor.commit();
}
public boolean getTextUseCompression() {
return mSharedPreferences.getBoolean(Pref.TEXT_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() { public CloudSearchPrefs getCloudSearchPrefs() {
return new CloudSearchPrefs(mSharedPreferences.getBoolean(Pref.SEARCH_KEYSERVER, true), return new CloudSearchPrefs(mSharedPreferences.getBoolean(Pref.SEARCH_KEYSERVER, true),
mSharedPreferences.getBoolean(Pref.SEARCH_KEYBASE, true), mSharedPreferences.getBoolean(Pref.SEARCH_KEYBASE, true),

View File

@ -88,6 +88,8 @@
<string name="btn_add_email">"Add additional email address"</string> <string name="btn_add_email">"Add additional email address"</string>
<string name="btn_unlock">"Unlock"</string> <string name="btn_unlock">"Unlock"</string>
<string name="btn_add_keyserver">"Add"</string> <string name="btn_add_keyserver">"Add"</string>
<string name="btn_save_default">"Save as default"</string>
<string name="btn_saved">"Saved!"</string>
<!-- menu --> <!-- menu -->
<string name="menu_preferences">"Settings"</string> <string name="menu_preferences">"Settings"</string>
@ -1309,5 +1311,11 @@
<string name="error_nfc">"NFC Error: %s"</string> <string name="error_nfc">"NFC Error: %s"</string>
<string name="error_pin_nodefault">Default PIN was rejected!</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="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> </resources>