From 1deb5dbfda73b0fa72c132c318d9fb7a46aafeee Mon Sep 17 00:00:00 2001 From: Vincent Breitmoser Date: Thu, 28 May 2015 18:55:34 +0200 Subject: preserve state in DecryptTextActivity --- .../keychain/ui/DecryptFragment.java | 25 ++++++++++++++++++++ .../keychain/ui/DecryptTextActivity.java | 26 +++++++++------------ .../keychain/ui/DecryptTextFragment.java | 27 ++++++++++++++-------- .../keychain/ui/util/KeyFormattingUtils.java | 2 +- .../src/main/res/layout/toolbar_result_decrypt.xml | 3 +-- 5 files changed, 56 insertions(+), 27 deletions(-) (limited to 'OpenKeychain') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFragment.java index c5f9821d3..e13365feb 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFragment.java @@ -60,6 +60,7 @@ public abstract class DecryptFragment extends CryptoOperationFragment implements LoaderManager.LoaderCallbacks { public static final int LOADER_ID_UNIFIED = 0; + public static final String ARG_DECRYPT_VERIFY_RESULT = "decrypt_verify_result"; protected LinearLayout mResultLayout; protected ImageView mEncryptionIcon; @@ -75,6 +76,7 @@ public abstract class DecryptFragment extends CryptoOperationFragment implements private LinearLayout mErrorOverlayLayout; private OpenPgpSignatureResult mSignatureResult; + private DecryptVerifyResult mDecryptVerifyResult; @Override public void onViewCreated(View view, Bundle savedInstanceState) { @@ -105,6 +107,27 @@ public abstract class DecryptFragment extends CryptoOperationFragment implements }); } + @Override + public void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + + outState.putParcelable(ARG_DECRYPT_VERIFY_RESULT, mDecryptVerifyResult); + } + + @Override + public void onViewStateRestored(Bundle savedInstanceState) { + super.onViewStateRestored(savedInstanceState); + + if (savedInstanceState == null) { + return; + } + + DecryptVerifyResult result = savedInstanceState.getParcelable(ARG_DECRYPT_VERIFY_RESULT); + if (result != null) { + loadVerifyResult(result); + } + } + private void lookupUnknownKey(long unknownKeyId) { // Message is received after importing is done in KeychainIntentService @@ -183,7 +206,9 @@ public abstract class DecryptFragment extends CryptoOperationFragment implements */ protected void loadVerifyResult(DecryptVerifyResult decryptVerifyResult) { + mDecryptVerifyResult = decryptVerifyResult; mSignatureResult = decryptVerifyResult.getSignatureResult(); + mResultLayout.setVisibility(View.VISIBLE); // unsigned data diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptTextActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptTextActivity.java index e2eba3947..0c463c2cd 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptTextActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptTextActivity.java @@ -21,6 +21,7 @@ package org.sufficientlysecure.keychain.ui; import android.app.Activity; import android.content.Intent; import android.os.Bundle; +import android.support.v4.app.Fragment; import android.text.TextUtils; import android.view.View; import android.widget.Toast; @@ -46,8 +47,6 @@ public class DecryptTextActivity extends BaseActivity { // intern public static final String ACTION_DECRYPT_FROM_CLIPBOARD = Constants.INTENT_PREFIX + "DECRYPT_TEXT_FROM_CLIPBOARD"; - DecryptTextFragment mFragment; - @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -148,6 +147,10 @@ public class DecryptTextActivity extends BaseActivity { extras = new Bundle(); } + if (savedInstanceState != null) { + return; + } + if (Intent.ACTION_SEND.equals(action) && type != null) { Log.d(Constants.TAG, "ACTION_SEND"); Log.logDebugBundle(extras, "SEND extras"); @@ -158,7 +161,7 @@ public class DecryptTextActivity extends BaseActivity { sharedText = getPgpContent(sharedText); if (sharedText != null) { - loadFragment(savedInstanceState, sharedText); + loadFragment(sharedText); } else { Log.e(Constants.TAG, "EXTRA_TEXT does not contain PGP content!"); Toast.makeText(this, R.string.error_invalid_data, Toast.LENGTH_LONG).show(); @@ -176,7 +179,7 @@ public class DecryptTextActivity extends BaseActivity { extraText = getPgpContent(extraText); if (extraText != null) { - loadFragment(savedInstanceState, extraText); + loadFragment(extraText); } else { Log.e(Constants.TAG, "EXTRA_TEXT does not contain PGP content!"); Toast.makeText(this, R.string.error_invalid_data, Toast.LENGTH_LONG).show(); @@ -189,7 +192,7 @@ public class DecryptTextActivity extends BaseActivity { String text = getPgpContent(clipboardText); if (text != null) { - loadFragment(savedInstanceState, text); + loadFragment(text); } else { returnInvalidResult(); } @@ -209,21 +212,14 @@ public class DecryptTextActivity extends BaseActivity { finish(); } - private void loadFragment(Bundle savedInstanceState, String ciphertext) { - // However, if we're being restored from a previous state, - // then we don't need to do anything and should return or else - // we could end up with overlapping fragments. - if (savedInstanceState != null) { - return; - } - + private void loadFragment(String ciphertext) { // Create an instance of the fragment - mFragment = DecryptTextFragment.newInstance(ciphertext); + Fragment frag = DecryptTextFragment.newInstance(ciphertext); // Add the fragment to the 'fragment_container' FrameLayout // NOTE: We use commitAllowingStateLoss() to prevent weird crashes! getSupportFragmentManager().beginTransaction() - .replace(R.id.decrypt_text_fragment_container, mFragment) + .replace(R.id.decrypt_text_fragment_container, frag) .commitAllowingStateLoss(); // do it immediately! getSupportFragmentManager().executePendingTransactions(); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptTextFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptTextFragment.java index 381da6f0d..a666c2357 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptTextFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptTextFragment.java @@ -28,8 +28,6 @@ import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; -import android.widget.Button; -import android.widget.LinearLayout; import android.widget.TextView; import org.sufficientlysecure.keychain.Constants; @@ -48,17 +46,15 @@ import java.io.UnsupportedEncodingException; public class DecryptTextFragment extends DecryptFragment { public static final String ARG_CIPHERTEXT = "ciphertext"; + public static final String ARG_SHOW_MENU = "show_menu"; // view private TextView mText; // model private String mCiphertext; - private boolean mShowMenuOptions = false; + private boolean mShowMenuOptions; - /** - * Creates new instance of this fragment - */ public static DecryptTextFragment newInstance(String ciphertext) { DecryptTextFragment frag = new DecryptTextFragment(); @@ -115,11 +111,24 @@ public class DecryptTextFragment extends DecryptFragment { setHasOptionsMenu(true); - String ciphertext = getArguments().getString(ARG_CIPHERTEXT); - if (ciphertext != null) { - mCiphertext = ciphertext; + Bundle args = savedInstanceState == null ? getArguments() : savedInstanceState; + mCiphertext = args.getString(ARG_CIPHERTEXT); + mShowMenuOptions = args.getBoolean(ARG_SHOW_MENU, false); + + if (savedInstanceState == null) { cryptoOperation(new CryptoInputParcel()); } + + } + + @Override + public void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + + outState.putString(ARG_CIPHERTEXT, mCiphertext); + outState.putBoolean(ARG_SHOW_MENU, mShowMenuOptions); + // no need to save the decrypted text, it's in the textview + } @Override diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/KeyFormattingUtils.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/KeyFormattingUtils.java index 10c1aca0c..dd85a6e46 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/KeyFormattingUtils.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/KeyFormattingUtils.java @@ -219,7 +219,7 @@ public class KeyFormattingUtils { // NOTE: Even though v3 keys are not imported we need to support both fingerprints for // display/comparison before import if (fingerprint.length != 16 && fingerprint.length != 20) { - throw new AssertionError("No valid v3 or v4 fingerprint!"); + throw new IllegalArgumentException("No valid v3 or v4 fingerprint!"); } return Hex.toHexString(fingerprint).toLowerCase(Locale.ENGLISH); diff --git a/OpenKeychain/src/main/res/layout/toolbar_result_decrypt.xml b/OpenKeychain/src/main/res/layout/toolbar_result_decrypt.xml index fe421449a..4f9b5d373 100644 --- a/OpenKeychain/src/main/res/layout/toolbar_result_decrypt.xml +++ b/OpenKeychain/src/main/res/layout/toolbar_result_decrypt.xml @@ -26,8 +26,7 @@ android:paddingLeft="16dp" android:paddingRight="16dp" android:paddingTop="4dp" - android:paddingBottom="4dp" - android:animateLayoutChanges="true"> + android:paddingBottom="4dp">