diff --git a/OpenKeychain-Test/src/test/java/org/sufficientlysecure/keychain/operations/CertifyOperationTest.java b/OpenKeychain-Test/src/test/java/org/sufficientlysecure/keychain/operations/CertifyOperationTest.java index 65bb85712..115b253f8 100644 --- a/OpenKeychain-Test/src/test/java/org/sufficientlysecure/keychain/operations/CertifyOperationTest.java +++ b/OpenKeychain-Test/src/test/java/org/sufficientlysecure/keychain/operations/CertifyOperationTest.java @@ -156,7 +156,7 @@ public class CertifyOperationTest { CertifyActionsParcel actions = new CertifyActionsParcel(mStaticRing1.getMasterKeyId()); actions.add(new CertifyAction(mStaticRing2.getMasterKeyId(), mStaticRing2.getPublicKey().getUnorderedUserIds())); - CertifyResult result = op.execute(actions, new CryptoInputParcel(mKeyPhrase1), null); + CertifyResult result = op.execute(actions, new CryptoInputParcel(mKeyPhrase1)); Assert.assertTrue("certification must succeed", result.success()); @@ -184,7 +184,7 @@ public class CertifyOperationTest { CertifyActionsParcel actions = new CertifyActionsParcel(mStaticRing1.getMasterKeyId()); actions.add(new CertifyAction(mStaticRing2.getMasterKeyId(), null, mStaticRing2.getPublicKey().getUnorderedUserAttributes())); - CertifyResult result = op.execute(actions, new CryptoInputParcel(mKeyPhrase1), null); + CertifyResult result = op.execute(actions, new CryptoInputParcel(mKeyPhrase1)); Assert.assertTrue("certification must succeed", result.success()); @@ -207,7 +207,7 @@ public class CertifyOperationTest { actions.add(new CertifyAction(mStaticRing1.getMasterKeyId(), mStaticRing2.getPublicKey().getUnorderedUserIds())); - CertifyResult result = op.execute(actions, new CryptoInputParcel(mKeyPhrase1), null); + CertifyResult result = op.execute(actions, new CryptoInputParcel(mKeyPhrase1)); Assert.assertFalse("certification with itself must fail!", result.success()); Assert.assertTrue("error msg must be about self certification", @@ -226,7 +226,7 @@ public class CertifyOperationTest { uids.add("nonexistent"); actions.add(new CertifyAction(1234L, uids)); - CertifyResult result = op.execute(actions, new CryptoInputParcel(mKeyPhrase1), null); + CertifyResult result = op.execute(actions, new CryptoInputParcel(mKeyPhrase1)); Assert.assertFalse("certification of nonexistent key must fail", result.success()); Assert.assertTrue("must contain error msg about not found", @@ -238,7 +238,7 @@ public class CertifyOperationTest { actions.add(new CertifyAction(mStaticRing1.getMasterKeyId(), mStaticRing2.getPublicKey().getUnorderedUserIds())); - CertifyResult result = op.execute(actions, new CryptoInputParcel(mKeyPhrase1), null); + CertifyResult result = op.execute(actions, new CryptoInputParcel(mKeyPhrase1)); Assert.assertFalse("certification of nonexistent key must fail", result.success()); Assert.assertTrue("must contain error msg about not found", diff --git a/OpenKeychain/build.gradle b/OpenKeychain/build.gradle index d658572e0..a4caa1fe7 100644 --- a/OpenKeychain/build.gradle +++ b/OpenKeychain/build.gradle @@ -24,7 +24,6 @@ dependencies { } // JCenter etc. - compile 'de.greenrobot:eventbus:2.4.0' compile 'com.eftimoff:android-patternview:1.0.1@aar' compile 'com.journeyapps:zxing-android-embedded:2.3.0@aar' compile 'com.journeyapps:zxing-android-integration:2.3.0@aar' diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainNewService.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainNewService.java index 5ef475029..9e33a1421 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainNewService.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainNewService.java @@ -25,9 +25,11 @@ import android.app.Service; import android.content.Intent; import android.os.Bundle; import android.os.IBinder; +import android.os.Message; +import android.os.Messenger; import android.os.Parcelable; +import android.os.RemoteException; -import de.greenrobot.event.EventBus; import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.operations.BaseOperation; import org.sufficientlysecure.keychain.operations.CertifyOperation; @@ -40,6 +42,7 @@ import org.sufficientlysecure.keychain.pgp.Progressable; import org.sufficientlysecure.keychain.pgp.SignEncryptParcel; import org.sufficientlysecure.keychain.provider.ProviderHelper; import org.sufficientlysecure.keychain.service.CertifyActionsParcel.CertifyAction; +import org.sufficientlysecure.keychain.service.ServiceProgressHandler.MessageStatus; import org.sufficientlysecure.keychain.service.input.CryptoInputParcel; import org.sufficientlysecure.keychain.util.Log; @@ -49,13 +52,18 @@ import org.sufficientlysecure.keychain.util.Log; */ public class KeychainNewService extends Service implements Progressable { - /* extras that can be given by intent */ + // messenger for communication (hack) + public static final String EXTRA_MESSENGER = "messenger"; + + // extras for operation public static final String EXTRA_OPERATION_INPUT = "op_input"; public static final String EXTRA_CRYPTO_INPUT = "crypto_input"; // this attribute can possibly merged with the one above? not sure... private AtomicBoolean mActionCanceled = new AtomicBoolean(false); + ThreadLocal mMessenger = new ThreadLocal<>(); + @Override public IBinder onBind(Intent intent) { return null; @@ -66,56 +74,82 @@ public class KeychainNewService extends Service implements Progressable { */ @Override public int onStartCommand(final Intent intent, int flags, int startId) { - EventBus bus = EventBus.getDefault(); - if (!bus.isRegistered(this)) { - bus.register(this); - } - Bundle extras = intent.getExtras(); - if (extras != null) { - bus.post(extras); - } else { - Log.e(Constants.TAG, "Extras bundle is null!"); - } + Runnable actionRunnable = new Runnable() { + @Override + public void run() { + // We have not been cancelled! (yet) + mActionCanceled.set(false); + + Bundle extras = intent.getExtras(); + + // Set messenger for communication (for this particular thread) + mMessenger.set(extras.getParcelable(EXTRA_MESSENGER)); + + // Input + Parcelable inputParcel = extras.getParcelable(EXTRA_OPERATION_INPUT); + CryptoInputParcel cryptoInput = extras.getParcelable(EXTRA_CRYPTO_INPUT); + + // Operation + BaseOperation op; + + // just for brevity + KeychainNewService outerThis = KeychainNewService.this; + if (inputParcel instanceof SignEncryptParcel) { + op = new SignEncryptOperation(outerThis, new ProviderHelper(outerThis), outerThis, mActionCanceled); + } else if (inputParcel instanceof PgpDecryptVerifyInputParcel) { + op = new PgpDecryptVerify(outerThis, new ProviderHelper(outerThis), outerThis); + } else if (inputParcel instanceof SaveKeyringParcel) { + op = new EditKeyOperation(outerThis, new ProviderHelper(outerThis), outerThis, mActionCanceled); + } else if (inputParcel instanceof CertifyAction) { + op = new CertifyOperation(outerThis, new ProviderHelper(outerThis), outerThis, mActionCanceled); + } else { + return; + } + + @SuppressWarnings("unchecked") // this is unchecked, we make sure it's the correct op above! + OperationResult result = op.execute(inputParcel, cryptoInput); + + sendMessageToHandler(MessageStatus.OKAY, result); + + } + }; + + Thread actionThread = new Thread(actionRunnable); + actionThread.start(); return START_NOT_STICKY; } - @Override - public void onDestroy() { - super.onDestroy(); - EventBus.getDefault().unregister(this); - } + private void sendMessageToHandler(MessageStatus status, Integer arg2, Bundle data) { - public void onEventAsync(Bundle bundle) { - - // Input - Parcelable inputParcel = bundle.getParcelable(EXTRA_OPERATION_INPUT); - CryptoInputParcel cryptoInput = bundle.getParcelable(EXTRA_CRYPTO_INPUT); - - // Operation - BaseOperation op; - - if (inputParcel instanceof SignEncryptParcel) { - op = new SignEncryptOperation(this, new ProviderHelper(this), this, mActionCanceled); - } else if (inputParcel instanceof PgpDecryptVerifyInputParcel) { - op = new PgpDecryptVerify(this, new ProviderHelper(this), this); - } else if (inputParcel instanceof SaveKeyringParcel) { - op = new EditKeyOperation(this, new ProviderHelper(this), this, mActionCanceled); - } else if (inputParcel instanceof CertifyAction) { - op = new CertifyOperation(this, new ProviderHelper(this), this, mActionCanceled); - } else { - return; + Message msg = Message.obtain(); + assert msg != null; + msg.arg1 = status.ordinal(); + if (arg2 != null) { + msg.arg2 = arg2; + } + if (data != null) { + msg.setData(data); } - @SuppressWarnings("unchecked") // this is unchecked, we make sure it's the correct op above! - OperationResult result = op.execute(inputParcel, cryptoInput); + try { + mMessenger.get().send(msg); + } catch (RemoteException e) { + Log.w(Constants.TAG, "Exception sending message, Is handler present?", e); + } catch (NullPointerException e) { + Log.w(Constants.TAG, "Messenger is null!", e); + } + } - // Result - EventBus.getDefault().post(result); - - stopSelf(); + private void sendMessageToHandler(MessageStatus status, OperationResult data) { + Bundle bundle = new Bundle(); + bundle.putParcelable(OperationResult.EXTRA_RESULT, data); + sendMessageToHandler(status, null, bundle); + } + private void sendMessageToHandler(MessageStatus status) { + sendMessageToHandler(status, null, null); } /** @@ -126,9 +160,14 @@ public class KeychainNewService extends Service implements Progressable { Log.d(Constants.TAG, "Send message by setProgress with progress=" + progress + ", max=" + max); - ProgressEvent event = new ProgressEvent(message, progress, max); - EventBus.getDefault().post(event); + Bundle data = new Bundle(); + if (message != null) { + data.putString(ServiceProgressHandler.DATA_MESSAGE, message); + } + data.putInt(ServiceProgressHandler.DATA_PROGRESS, progress); + data.putInt(ServiceProgressHandler.DATA_PROGRESS_MAX, max); + sendMessageToHandler(MessageStatus.UPDATE_PROGRESS, null, data); } @Override @@ -143,8 +182,7 @@ public class KeychainNewService extends Service implements Progressable { @Override public void setPreventCancel() { - // sendMessageToHandler(MessageStatus.PREVENT_CANCEL); + sendMessageToHandler(MessageStatus.PREVENT_CANCEL); } - } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainService.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainService.java index e4bfd7dee..ba877c2a2 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainService.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainService.java @@ -30,7 +30,6 @@ import android.os.RemoteException; import com.textuality.keybase.lib.Proof; import com.textuality.keybase.lib.prover.Prover; -import de.greenrobot.event.EventBus; import org.json.JSONObject; import org.spongycastle.openpgp.PGPUtil; import org.sufficientlysecure.keychain.Constants; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/ProgressEvent.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/ProgressEvent.java deleted file mode 100644 index d441eccd0..000000000 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/ProgressEvent.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.sufficientlysecure.keychain.service; - - -public class ProgressEvent { - - public final String mMessage; - public final int mProgress; - public final int mMax; - - public ProgressEvent(String message, int progress, int max) { - mMessage = message; - mProgress = progress; - mMax = max; - } - -} diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/ServiceProgressHandler.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/ServiceProgressHandler.java index a0bb250d4..76aa1a618 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/ServiceProgressHandler.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/ServiceProgressHandler.java @@ -17,8 +17,7 @@ package org.sufficientlysecure.keychain.service; -import android.app.Activity; -import android.content.Intent; +import android.app.ProgressDialog; import android.os.Bundle; import android.os.Handler; import android.os.Message; @@ -27,7 +26,6 @@ import android.support.v4.app.FragmentManager; import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.R; -import org.sufficientlysecure.keychain.operations.results.CertifyResult; import org.sufficientlysecure.keychain.ui.dialog.ProgressDialogFragment; import org.sufficientlysecure.keychain.ui.util.Notify; import org.sufficientlysecure.keychain.util.Log; @@ -65,68 +63,58 @@ public class ServiceProgressHandler extends Handler { public static final String KEYBASE_PRESENCE_URL = "keybase_presence_url"; public static final String KEYBASE_PRESENCE_LABEL = "keybase_presence_label"; - Activity mActivity; - ProgressDialogFragment mProgressDialogFragment; + FragmentActivity mActivity; - public ServiceProgressHandler(Activity activity) { - this.mActivity = activity; + public ServiceProgressHandler(FragmentActivity activity) { + mActivity = activity; } - public ServiceProgressHandler(Activity activity, ProgressDialogFragment progressDialogFragment) { - this.mActivity = activity; - this.mProgressDialogFragment = progressDialogFragment; + public void showProgressDialog() { + showProgressDialog("", ProgressDialog.STYLE_SPINNER, false); } - public ServiceProgressHandler(Activity activity, String progressDialogMessage, int progressDialogStyle) { - this(activity, progressDialogMessage, progressDialogStyle, false); - } + public void showProgressDialog( + String progressDialogMessage, int progressDialogStyle, boolean cancelable) { - public ServiceProgressHandler(Activity activity, - String progressDialogMessage, - int progressDialogStyle, - boolean cancelable) { - this.mActivity = activity; - this.mProgressDialogFragment = ProgressDialogFragment.newInstance( + final ProgressDialogFragment frag = ProgressDialogFragment.newInstance( progressDialogMessage, progressDialogStyle, cancelable); - } - - public void showProgressDialog(FragmentActivity activity) { - if (mProgressDialogFragment == null) { - return; - } // TODO: This is a hack!, see // http://stackoverflow.com/questions/10114324/show-dialogfragment-from-onactivityresult - final FragmentManager manager = activity.getSupportFragmentManager(); + final FragmentManager manager = mActivity.getSupportFragmentManager(); Handler handler = new Handler(); handler.post(new Runnable() { public void run() { - mProgressDialogFragment.show(manager, "progressDialog"); + frag.show(manager, "progressDialog"); } }); + } @Override public void handleMessage(Message message) { Bundle data = message.getData(); - if (mProgressDialogFragment == null) { - // Log.e(Constants.TAG, - // "Progress has not been updated because mProgressDialogFragment was null!"); + ProgressDialogFragment progressDialogFragment = + (ProgressDialogFragment) mActivity.getSupportFragmentManager() + .findFragmentByTag("progressDialog"); + + if (progressDialogFragment == null) { + Log.e(Constants.TAG, "Progress has not been updated because mProgressDialogFragment was null!"); return; } MessageStatus status = MessageStatus.fromInt(message.arg1); switch (status) { case OKAY: - mProgressDialogFragment.dismissAllowingStateLoss(); + progressDialogFragment.dismissAllowingStateLoss(); break; case EXCEPTION: - mProgressDialogFragment.dismissAllowingStateLoss(); + progressDialogFragment.dismissAllowingStateLoss(); // show error from service if (data.containsKey(DATA_ERROR)) { @@ -142,13 +130,13 @@ public class ServiceProgressHandler extends Handler { // update progress from service if (data.containsKey(DATA_MESSAGE)) { - mProgressDialogFragment.setProgress(data.getString(DATA_MESSAGE), + progressDialogFragment.setProgress(data.getString(DATA_MESSAGE), data.getInt(DATA_PROGRESS), data.getInt(DATA_PROGRESS_MAX)); } else if (data.containsKey(DATA_MESSAGE_ID)) { - mProgressDialogFragment.setProgress(data.getInt(DATA_MESSAGE_ID), + progressDialogFragment.setProgress(data.getInt(DATA_MESSAGE_ID), data.getInt(DATA_PROGRESS), data.getInt(DATA_PROGRESS_MAX)); } else { - mProgressDialogFragment.setProgress(data.getInt(DATA_PROGRESS), + progressDialogFragment.setProgress(data.getInt(DATA_PROGRESS), data.getInt(DATA_PROGRESS_MAX)); } } @@ -156,7 +144,7 @@ public class ServiceProgressHandler extends Handler { break; case PREVENT_CANCEL: - mProgressDialogFragment.setPreventCancel(true); + progressDialogFragment.setPreventCancel(true); break; default: diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ConsolidateDialogActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ConsolidateDialogActivity.java index 054e43f21..6a9bb7b11 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ConsolidateDialogActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ConsolidateDialogActivity.java @@ -49,11 +49,7 @@ public class ConsolidateDialogActivity extends FragmentActivity { private void consolidateRecovery(boolean recovery) { // Message is received after importing is done in KeychainService - ServiceProgressHandler saveHandler = new ServiceProgressHandler( - this, - getString(R.string.progress_importing), - ProgressDialog.STYLE_HORIZONTAL - ) { + ServiceProgressHandler saveHandler = new ServiceProgressHandler(this) { @Override public void handleMessage(Message message) { // handle messages by standard KeychainIntentServiceHandler first @@ -94,7 +90,10 @@ public class ConsolidateDialogActivity extends FragmentActivity { intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger); // show progress dialog - saveHandler.showProgressDialog(this); + saveHandler.showProgressDialog( + getString(R.string.progress_importing), + ProgressDialog.STYLE_HORIZONTAL, false + ); // start service with intent startService(intent); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyFinalFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyFinalFragment.java index b39064e20..ebbd01afe 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyFinalFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyFinalFragment.java @@ -197,11 +197,7 @@ public class CreateKeyFinalFragment extends Fragment { Intent intent = new Intent(getActivity(), KeychainService.class); intent.setAction(KeychainService.ACTION_EDIT_KEYRING); - ServiceProgressHandler saveHandler = new ServiceProgressHandler( - getActivity(), - getString(R.string.progress_building_key), - ProgressDialog.STYLE_HORIZONTAL - ) { + ServiceProgressHandler saveHandler = new ServiceProgressHandler(getActivity()) { @Override public void handleMessage(Message message) { // handle messages by standard KeychainIntentServiceHandler first @@ -245,7 +241,8 @@ public class CreateKeyFinalFragment extends Fragment { Messenger messenger = new Messenger(saveHandler); intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger); - saveHandler.showProgressDialog(getActivity()); + saveHandler.showProgressDialog(getString(R.string.progress_building_key), + ProgressDialog.STYLE_HORIZONTAL, false); getActivity().startService(intent); } @@ -271,11 +268,7 @@ public class CreateKeyFinalFragment extends Fragment { intent.putExtra(KeychainService.EXTRA_DATA, data); - ServiceProgressHandler saveHandler = new ServiceProgressHandler( - getActivity(), - getString(R.string.progress_uploading), - ProgressDialog.STYLE_HORIZONTAL - ) { + ServiceProgressHandler saveHandler = new ServiceProgressHandler(getActivity()) { @Override public void handleMessage(Message message) { // handle messages by standard KeychainIntentServiceHandler first @@ -301,10 +294,13 @@ public class CreateKeyFinalFragment extends Fragment { intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger); // show progress dialog - saveHandler.showProgressDialog(getActivity()); + saveHandler.showProgressDialog( + getString(R.string.progress_uploading), + ProgressDialog.STYLE_HORIZONTAL, false); // start service with intent getActivity().startService(intent); + } } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyYubiKeyImportFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyYubiKeyImportFragment.java index ba8e8321a..2ab8c5967 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyYubiKeyImportFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyYubiKeyImportFragment.java @@ -176,11 +176,7 @@ public class CreateKeyYubiKeyImportFragment extends Fragment implements NfcListe public void importKey() { // Message is received after decrypting is done in KeychainService - ServiceProgressHandler saveHandler = new ServiceProgressHandler( - getActivity(), - getString(R.string.progress_importing), - ProgressDialog.STYLE_HORIZONTAL - ) { + ServiceProgressHandler saveHandler = new ServiceProgressHandler(getActivity()) { @Override public void handleMessage(Message message) { // handle messages by standard KeychainIntentServiceHandler first @@ -243,7 +239,10 @@ public class CreateKeyYubiKeyImportFragment extends Fragment implements NfcListe Messenger messenger = new Messenger(saveHandler); intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger); - saveHandler.showProgressDialog(getActivity()); + saveHandler.showProgressDialog( + getString(R.string.progress_importing), + ProgressDialog.STYLE_HORIZONTAL, false + ); // start service with intent getActivity().startService(intent); 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 a58ac8e87..83fede917 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptTextFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptTextFragment.java @@ -30,7 +30,6 @@ import android.view.View; import android.view.ViewGroup; import android.widget.TextView; -import de.greenrobot.event.EventBus; import org.spongycastle.bcpg.CompressionAlgorithmTags; import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.R; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java index 5251f5949..07ab88b02 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java @@ -263,7 +263,7 @@ public class ImportKeysActivity extends BaseNfcActivity { // 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) { + if (mListFragment != null) { return; } @@ -283,7 +283,7 @@ public class ImportKeysActivity extends BaseNfcActivity { // 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) { + if (mTopFragment != null) { return; } @@ -314,7 +314,7 @@ public class ImportKeysActivity extends BaseNfcActivity { // 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) { + if (mTopFragment != null) { return; } @@ -388,12 +388,7 @@ public class ImportKeysActivity extends BaseNfcActivity { return; } - ServiceProgressHandler serviceHandler = new ServiceProgressHandler( - this, - getString(R.string.progress_importing), - ProgressDialog.STYLE_HORIZONTAL, - true - ) { + ServiceProgressHandler serviceHandler = new ServiceProgressHandler(this) { @Override public void handleMessage(Message message) { // handle messages by standard KeychainIntentServiceHandler first @@ -435,7 +430,11 @@ public class ImportKeysActivity extends BaseNfcActivity { intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger); // show progress dialog - serviceHandler.showProgressDialog(this); + serviceHandler.showProgressDialog( + getString(R.string.progress_importing), + ProgressDialog.STYLE_HORIZONTAL, + true + ); // start service with intent startService(intent); @@ -469,7 +468,10 @@ public class ImportKeysActivity extends BaseNfcActivity { intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger); // show progress dialog - serviceHandler.showProgressDialog(this); + serviceHandler.showProgressDialog( + getString(R.string.progress_importing), + ProgressDialog.STYLE_HORIZONTAL, true + ); // start service with intent startService(intent); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysProxyActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysProxyActivity.java index 42efbf0f8..9f3beff43 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysProxyActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysProxyActivity.java @@ -206,12 +206,7 @@ public class ImportKeysProxyActivity extends FragmentActivity { private void startImportService(ArrayList keyRings) { // Message is received after importing is done in KeychainService - ServiceProgressHandler serviceHandler = new ServiceProgressHandler( - this, - getString(R.string.progress_importing), - ProgressDialog.STYLE_HORIZONTAL, - true - ) { + ServiceProgressHandler serviceHandler = new ServiceProgressHandler(this) { @Override public void handleMessage(Message message) { // handle messages by standard KeychainIntentServiceHandler first @@ -273,7 +268,9 @@ public class ImportKeysProxyActivity extends FragmentActivity { intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger); // show progress dialog - serviceHandler.showProgressDialog(this); + serviceHandler.showProgressDialog( + getString(R.string.progress_importing), + ProgressDialog.STYLE_HORIZONTAL, true); // start service with intent startService(intent); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java index ddc527847..36074f6ba 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java @@ -572,12 +572,7 @@ public class KeyListFragment extends LoaderFragment keyList.add(keyEntry); } - ServiceProgressHandler serviceHandler = new ServiceProgressHandler( - getActivity(), - getString(R.string.progress_updating), - ProgressDialog.STYLE_HORIZONTAL, - true - ) { + ServiceProgressHandler serviceHandler = new ServiceProgressHandler(getActivity()) { @Override public void handleMessage(Message message) { // handle messages by standard KeychainIntentServiceHandler first @@ -625,7 +620,9 @@ public class KeyListFragment extends LoaderFragment intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger); // show progress dialog - serviceHandler.showProgressDialog(getActivity()); + serviceHandler.showProgressDialog( + getString(R.string.progress_updating), + ProgressDialog.STYLE_HORIZONTAL, true); // start service with intent getActivity().startService(intent); @@ -633,11 +630,7 @@ public class KeyListFragment extends LoaderFragment private void consolidate() { // Message is received after importing is done in KeychainService - ServiceProgressHandler saveHandler = new ServiceProgressHandler( - getActivity(), - getString(R.string.progress_importing), - ProgressDialog.STYLE_HORIZONTAL - ) { + ServiceProgressHandler saveHandler = new ServiceProgressHandler(getActivity()) { @Override public void handleMessage(Message message) { // handle messages by standard KeychainIntentServiceHandler first @@ -675,7 +668,9 @@ public class KeyListFragment extends LoaderFragment intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger); // show progress dialog - saveHandler.showProgressDialog(getActivity()); + saveHandler.showProgressDialog( + getString(R.string.progress_importing), + ProgressDialog.STYLE_HORIZONTAL, false); // start service with intent getActivity().startService(intent); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/MainActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/MainActivity.java index 008433f78..f5a909676 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/MainActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/MainActivity.java @@ -23,6 +23,7 @@ import android.content.Intent; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; +import android.support.v4.app.FragmentManager.OnBackStackChangedListener; import android.support.v4.app.FragmentTransaction; import android.support.v7.widget.Toolbar; import android.view.View; @@ -42,7 +43,7 @@ import org.sufficientlysecure.keychain.ui.base.BaseNfcActivity; import org.sufficientlysecure.keychain.util.FabContainer; import org.sufficientlysecure.keychain.util.Preferences; -public class MainActivity extends BaseNfcActivity implements FabContainer { +public class MainActivity extends BaseNfcActivity implements FabContainer, OnBackStackChangedListener { private static final int ID_KEYS = 1; private static final int ID_ENCRYPT_DECRYPT = 2; @@ -121,6 +122,8 @@ public class MainActivity extends BaseNfcActivity implements FabContainer { return; } + getSupportFragmentManager().addOnBackStackChangedListener(this); + Intent data = getIntent(); // If we got an EXTRA_RESULT in the intent, show the notification if (data != null && data.hasExtra(OperationResult.EXTRA_RESULT)) { @@ -206,4 +209,25 @@ public class MainActivity extends BaseNfcActivity implements FabContainer { } + @Override + public void onBackStackChanged() { + FragmentManager fragmentManager = getSupportFragmentManager(); + if (fragmentManager == null) { + return; + } + Fragment frag = fragmentManager.findFragmentById(R.id.main_fragment_container); + if (frag == null) { + return; + } + + // make sure the selected icon is the one shown at this point + if (frag instanceof KeyListFragment) { + mDrawerResult.setSelection(mDrawerResult.getPositionFromIdentifier(ID_KEYS), false); + } else if (frag instanceof EncryptDecryptOverviewFragment) { + mDrawerResult.setSelection(mDrawerResult.getPositionFromIdentifier(ID_ENCRYPT_DECRYPT), false); + } else if (frag instanceof AppsListFragment) { + mDrawerResult.setSelection(mDrawerResult.getPositionFromIdentifier(ID_APPS), false); + } + } + } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SafeSlingerActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SafeSlingerActivity.java index 273acc23d..7408135ae 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SafeSlingerActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SafeSlingerActivity.java @@ -124,12 +124,7 @@ public class SafeSlingerActivity extends BaseActivity { final FragmentActivity activity = SafeSlingerActivity.this; // Message is received after importing is done in KeychainService - ServiceProgressHandler saveHandler = new ServiceProgressHandler( - activity, - getString(R.string.progress_importing), - ProgressDialog.STYLE_HORIZONTAL, - true - ) { + ServiceProgressHandler saveHandler = new ServiceProgressHandler(activity) { @Override public void handleMessage(Message message) { // handle messages by standard KeychainIntentServiceHandler first @@ -202,7 +197,10 @@ public class SafeSlingerActivity extends BaseActivity { intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger); // show progress dialog - saveHandler.showProgressDialog(activity); + saveHandler.showProgressDialog( + getString(R.string.progress_importing), + ProgressDialog.STYLE_HORIZONTAL, true + ); // start service with intent activity.startService(intent); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/UploadKeyActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/UploadKeyActivity.java index 2a195a4da..e4dff6083 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/UploadKeyActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/UploadKeyActivity.java @@ -108,11 +108,7 @@ public class UploadKeyActivity extends BaseActivity { intent.putExtra(KeychainService.EXTRA_DATA, data); // Message is received after uploading is done in KeychainService - ServiceProgressHandler saveHandler = new ServiceProgressHandler( - this, - getString(R.string.progress_uploading), - ProgressDialog.STYLE_HORIZONTAL - ) { + ServiceProgressHandler saveHandler = new ServiceProgressHandler(this) { @Override public void handleMessage(Message message) { // handle messages by standard KeychainIntentServiceHandler first @@ -132,7 +128,9 @@ public class UploadKeyActivity extends BaseActivity { intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger); // show progress dialog - saveHandler.showProgressDialog(this); + saveHandler.showProgressDialog( + getString(R.string.progress_uploading), + ProgressDialog.STYLE_HORIZONTAL, false); // start service with intent startService(intent); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java index 995b07720..5f6a32e5a 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java @@ -698,9 +698,6 @@ public class ViewKeyActivity extends BaseNfcActivity implements Messenger messenger = new Messenger(serviceHandler); intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger); - // show progress dialog - serviceHandler.showProgressDialog(this); - // start service with intent startService(intent); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyTrustFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyTrustFragment.java index 1f5c540ba..c33485adc 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyTrustFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyTrustFragment.java @@ -360,12 +360,7 @@ public class ViewKeyTrustFragment extends LoaderFragment implements mProofVerifyDetail.setVisibility(View.GONE); // Create a new Messenger for the communication back after proof work is done - // - ServiceProgressHandler handler = new ServiceProgressHandler( - getActivity(), - getString(R.string.progress_verifying_signature), - ProgressDialog.STYLE_HORIZONTAL - ) { + ServiceProgressHandler handler = new ServiceProgressHandler(getActivity()) { @Override public void handleMessage(Message message) { // handle messages by standard KeychainIntentServiceHandler first @@ -454,7 +449,10 @@ public class ViewKeyTrustFragment extends LoaderFragment implements intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger); // show progress dialog - handler.showProgressDialog(getActivity()); + handler.showProgressDialog( + getString(R.string.progress_verifying_signature), + ProgressDialog.STYLE_HORIZONTAL, false + ); // start service with intent getActivity().startService(intent); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/CachingCryptoOperationFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/CachingCryptoOperationFragment.java index e8e8c5363..8ed4cbc87 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/CachingCryptoOperationFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/CachingCryptoOperationFragment.java @@ -5,11 +5,13 @@ import android.app.ProgressDialog; import android.content.Intent; import android.os.Bundle; import android.os.Message; +import android.os.Messenger; import android.os.Parcelable; import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.operations.results.OperationResult; import org.sufficientlysecure.keychain.service.KeychainNewService; +import org.sufficientlysecure.keychain.service.KeychainService; import org.sufficientlysecure.keychain.service.ServiceProgressHandler; import org.sufficientlysecure.keychain.service.input.CryptoInputParcel; @@ -55,6 +57,7 @@ public abstract class CachingCryptoOperationFragment