diff options
| author | Vincent Breitmoser <valodim@mugenguild.com> | 2015-06-10 17:12:22 +0200 | 
|---|---|---|
| committer | Vincent Breitmoser <valodim@mugenguild.com> | 2015-06-10 17:12:22 +0200 | 
| commit | 1697e22d1954d90289bac06abe23778c371337da (patch) | |
| tree | 39820a156392e15be5fb7d8d33cf6a23aa1c6625 /OpenKeychain/src/main/java/org/sufficientlysecure | |
| parent | d43671b2ed42dba8c0ab8c43a5d171bf842e2782 (diff) | |
| parent | 8da88f33bc3991653f91ccfd589cded23a9653b1 (diff) | |
| download | open-keychain-1697e22d1954d90289bac06abe23778c371337da.tar.gz open-keychain-1697e22d1954d90289bac06abe23778c371337da.tar.bz2 open-keychain-1697e22d1954d90289bac06abe23778c371337da.zip | |
Merge branch 'v/eventbus' into v/multi-decrypt
Conflicts:
	OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/CryptoOperationFragment.java
Diffstat (limited to 'OpenKeychain/src/main/java/org/sufficientlysecure')
20 files changed, 265 insertions, 252 deletions
| 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<Messenger> 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.<Messenger>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); - -        // Result -        EventBus.getDefault().post(result); +        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); +        } +    } -        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<ParcelableKeyRing> 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 <T extends Parcelable, S ex                  // Notify was created by createCryptoInput.                  return;              } +          }          // Send all information needed to service to edit key in other thread @@ -63,12 +66,36 @@ public abstract class CachingCryptoOperationFragment <T extends Parcelable, S ex          intent.putExtra(KeychainNewService.EXTRA_OPERATION_INPUT, mCachedActionsParcel);          intent.putExtra(KeychainNewService.EXTRA_CRYPTO_INPUT, cryptoInput); -        showProgressFragment( -                getString(R.string.progress_start), -                ProgressDialog.STYLE_HORIZONTAL, -                false); +        ServiceProgressHandler saveHandler = new ServiceProgressHandler(getActivity()) { +            @Override +            public void handleMessage(Message message) { +                // handle messages by standard KeychainIntentServiceHandler first +                super.handleMessage(message); + +                if (message.arg1 == MessageStatus.OKAY.ordinal()) { + +                    // get returned data bundle +                    Bundle returnData = message.getData(); +                    if (returnData == null) { +                        return; +                    } + +                    final OperationResult result = +                            returnData.getParcelable(OperationResult.EXTRA_RESULT); + +                    onHandleResult(result); +                } +            } +        }; + +        // Create a new Messenger for the communication back +        Messenger messenger = new Messenger(saveHandler); +        intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger); + +        saveHandler.showProgressDialog( +                getString(R.string.progress_building_key), +                ProgressDialog.STYLE_HORIZONTAL, false); -        // start service with intent          getActivity().startService(intent);      } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/CryptoOperationFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/CryptoOperationFragment.java index eb8b7cf3e..e21589bcd 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/CryptoOperationFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/CryptoOperationFragment.java @@ -21,16 +21,18 @@ package org.sufficientlysecure.keychain.ui.base;  import android.app.Activity;  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 android.support.v4.app.Fragment; -import android.support.v4.app.FragmentManager; -import de.greenrobot.event.EventBus;  import org.sufficientlysecure.keychain.R;  import org.sufficientlysecure.keychain.operations.results.InputPendingResult;  import org.sufficientlysecure.keychain.operations.results.OperationResult;  import org.sufficientlysecure.keychain.service.KeychainNewService; -import org.sufficientlysecure.keychain.service.ProgressEvent; +import org.sufficientlysecure.keychain.service.KeychainService; +import org.sufficientlysecure.keychain.service.ServiceProgressHandler;  import org.sufficientlysecure.keychain.service.input.CryptoInputParcel;  import org.sufficientlysecure.keychain.service.input.RequiredInputParcel;  import org.sufficientlysecure.keychain.ui.NfcOperationActivity; @@ -47,18 +49,6 @@ public abstract class CryptoOperationFragment <T extends Parcelable, S extends O      public static final int REQUEST_CODE_PASSPHRASE = 0x00008001;      public static final int REQUEST_CODE_NFC = 0x00008002; -    @Override -    public void onStart() { -        super.onStart(); -        EventBus.getDefault().register(this); -    } - -    @Override -    public void onStop() { -        EventBus.getDefault().unregister(this); -        super.onStop(); -    } -      private void initiateInputActivity(RequiredInputParcel requiredInput) {          switch (requiredInput.mType) { @@ -130,22 +120,6 @@ public abstract class CryptoOperationFragment <T extends Parcelable, S extends O      } -    public void showProgressFragment(String progressDialogMessage, -            int progressDialogStyle, -            boolean cancelable) { - -        if (getFragmentManager().findFragmentByTag("progressDialog") != null) { -            return; -        } - -        ProgressDialogFragment progressDialogFragment = ProgressDialogFragment.newInstance( -                progressDialogMessage, progressDialogStyle, cancelable); - -        FragmentManager manager = getFragmentManager(); -        progressDialogFragment.show(manager, "progressDialog"); - -    } -      protected abstract T createOperationInput();      protected void cryptoOperation(CryptoInputParcel cryptoInput) { @@ -161,12 +135,36 @@ public abstract class CryptoOperationFragment <T extends Parcelable, S extends O          intent.putExtra(KeychainNewService.EXTRA_OPERATION_INPUT, operationInput);          intent.putExtra(KeychainNewService.EXTRA_CRYPTO_INPUT, cryptoInput); -        showProgressFragment( -                getString(R.string.progress_start), -                ProgressDialog.STYLE_HORIZONTAL, -                false); +        ServiceProgressHandler saveHandler = new ServiceProgressHandler(getActivity()) { +            @Override +            public void handleMessage(Message message) { +                // handle messages by standard KeychainIntentServiceHandler first +                super.handleMessage(message); + +                if (message.arg1 == MessageStatus.OKAY.ordinal()) { + +                    // get returned data bundle +                    Bundle returnData = message.getData(); +                    if (returnData == null) { +                        return; +                    } + +                    final OperationResult result = +                            returnData.getParcelable(OperationResult.EXTRA_RESULT); + +                    onHandleResult(result); +                } +            } +        }; + +        // Create a new Messenger for the communication back +        Messenger messenger = new Messenger(saveHandler); +        intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger); + +        saveHandler.showProgressDialog( +                getString(R.string.progress_building_key), +                ProgressDialog.STYLE_HORIZONTAL, false); -        // start service with intent          getActivity().startService(intent);      } @@ -190,23 +188,9 @@ public abstract class CryptoOperationFragment <T extends Parcelable, S extends O      }      protected void onCryptoOperationCancelled() { -        dismissProgress();      } -    protected void onCryptoSetProgress(String msg, int progress, int max) { -        ProgressDialogFragment progressDialogFragment = -                (ProgressDialogFragment) getFragmentManager().findFragmentByTag("progressDialog"); - -        if (progressDialogFragment == null) { -            return; -        } - -        progressDialogFragment.setProgress(msg, progress, max); - -    } - -    @SuppressWarnings("unused") // it's an EventBus method -    public void onEventMainThread(OperationResult result) { +    public void onHandleResult(OperationResult result) {          if (result instanceof InputPendingResult) {              InputPendingResult pendingResult = (InputPendingResult) result; @@ -229,9 +213,4 @@ public abstract class CryptoOperationFragment <T extends Parcelable, S extends O      } -    @SuppressWarnings("unused") // it's an EventBus method -    public void onEventMainThread(ProgressEvent event) { -        onCryptoSetProgress(event.mMessage, event.mProgress, event.mMax); -    } -  } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/DeleteKeyDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/DeleteKeyDialogFragment.java index 58dce50a7..076876b5b 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/DeleteKeyDialogFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/DeleteKeyDialogFragment.java @@ -135,12 +135,7 @@ public class DeleteKeyDialogFragment extends DialogFragment {                  intent.setAction(KeychainService.ACTION_DELETE);                  // Message is received after importing is done in KeychainService -                ServiceProgressHandler saveHandler = new ServiceProgressHandler( -                        getActivity(), -                        getString(R.string.progress_deleting), -                        ProgressDialog.STYLE_HORIZONTAL, -                        true -                ) { +                ServiceProgressHandler saveHandler = new ServiceProgressHandler(getActivity()) {                      @Override                      public void handleMessage(Message message) {                          super.handleMessage(message); @@ -168,7 +163,8 @@ public class DeleteKeyDialogFragment extends DialogFragment {                  intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger);                  // show progress dialog -                saveHandler.showProgressDialog(getActivity()); +                saveHandler.showProgressDialog(getString(R.string.progress_deleting), +                        ProgressDialog.STYLE_HORIZONTAL, true);                  // start service with intent                  getActivity().startService(intent); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ExportHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ExportHelper.java index 88b0289d4..2fd09dc79 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ExportHelper.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ExportHelper.java @@ -97,10 +97,7 @@ public class ExportHelper {          intent.putExtra(KeychainService.EXTRA_DATA, data);          // Message is received after exporting is done in KeychainService -        ServiceProgressHandler exportHandler = new ServiceProgressHandler(mActivity, -                mActivity.getString(R.string.progress_exporting), -                ProgressDialog.STYLE_HORIZONTAL -        ) { +        ServiceProgressHandler exportHandler = new ServiceProgressHandler(mActivity) {              @Override              public void handleMessage(Message message) {                  // handle messages by standard KeychainIntentServiceHandler first @@ -121,7 +118,10 @@ public class ExportHelper {          intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger);          // show progress dialog -        exportHandler.showProgressDialog(mActivity); +        exportHandler.showProgressDialog( +                mActivity.getString(R.string.progress_exporting), +                ProgressDialog.STYLE_HORIZONTAL, false +        );          // start service with intent          mActivity.startService(intent); | 
