diff options
Diffstat (limited to 'OpenPGP-Keychain/src')
7 files changed, 87 insertions, 11 deletions
diff --git a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java index 3904a91d8..302dbea0b 100644 --- a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java +++ b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java @@ -203,10 +203,18 @@ public class KeychainIntentService extends IntentService implements ProgressDial      Messenger mMessenger; +    private boolean mIsCanceled; +      public KeychainIntentService() {          super("ApgService");      } +    @Override +    public void onDestroy() { +        super.onDestroy(); +        this.mIsCanceled = true; +    } +      /**       * The IntentService calls this method from the default worker thread with the intent that       * started the service. When this method returns, IntentService stops the service, as @@ -815,6 +823,10 @@ public class KeychainIntentService extends IntentService implements ProgressDial      }      private void sendErrorToHandler(Exception e) { +        // Service was canceled. Do not send error to handler. +        if (this.mIsCanceled) +            return; +          Log.e(Constants.TAG, "ApgService Exception: ", e);          e.printStackTrace(); @@ -824,6 +836,10 @@ public class KeychainIntentService extends IntentService implements ProgressDial      }      private void sendMessageToHandler(Integer arg1, Integer arg2, Bundle data) { +        // Service was canceled. Do not send message to handler. +        if (this.mIsCanceled) +            return; +          Message msg = Message.obtain();          msg.arg1 = arg1;          if (arg2 != null) { diff --git a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentServiceHandler.java b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentServiceHandler.java index dfea7eb04..6eba9cc83 100644 --- a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentServiceHandler.java +++ b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentServiceHandler.java @@ -21,6 +21,8 @@ import org.sufficientlysecure.keychain.ui.dialog.ProgressDialogFragment;  import org.sufficientlysecure.keychain.R;  import android.app.Activity; +import android.content.DialogInterface; +import android.content.DialogInterface.OnCancelListener;  import android.os.Bundle;  import android.os.Handler;  import android.os.Message; @@ -55,9 +57,15 @@ public class KeychainIntentServiceHandler extends Handler {      }      public KeychainIntentServiceHandler(Activity activity, int progressDialogMessageId, int progressDialogStyle) { +        this(activity, progressDialogMessageId, progressDialogStyle, false, null); +    } + +    public KeychainIntentServiceHandler(Activity activity, int progressDialogMessageId, +                                        int progressDialogStyle, boolean cancelable, +                                        OnCancelListener onCancelListener) {          this.mActivity = activity;          this.mProgressDialogFragment = ProgressDialogFragment.newInstance(progressDialogMessageId, -                progressDialogStyle); +                progressDialogStyle, cancelable, onCancelListener);      }      public void showProgressDialog(FragmentActivity activity) { diff --git a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyActivity.java b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyActivity.java index 73426e32d..0bed6f264 100644 --- a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyActivity.java +++ b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyActivity.java @@ -44,8 +44,10 @@ import org.sufficientlysecure.keychain.ui.widget.UserIdEditor;  import org.sufficientlysecure.keychain.util.IterableIterator;  import org.sufficientlysecure.keychain.util.Log; +import android.app.Activity;  import android.app.ProgressDialog;  import android.content.Context; +import android.content.DialogInterface;  import android.content.Intent;  import android.net.Uri;  import android.os.Bundle; @@ -173,7 +175,7 @@ public class EditKeyActivity extends ActionBarActivity {                  if (generateDefaultKeys) {                      // Send all information needed to service generate keys in other thread -                    Intent serviceIntent = new Intent(this, KeychainIntentService.class); +                    final Intent serviceIntent = new Intent(this, KeychainIntentService.class);                      serviceIntent.setAction(KeychainIntentService.ACTION_GENERATE_DEFAULT_RSA_KEYS);                      // fill values for this action @@ -185,7 +187,19 @@ public class EditKeyActivity extends ActionBarActivity {                      // Message is received after generating is done in ApgService                      KeychainIntentServiceHandler saveHandler = new KeychainIntentServiceHandler( -                            this, R.string.progress_generating, ProgressDialog.STYLE_SPINNER) { +                            this, R.string.progress_generating, ProgressDialog.STYLE_SPINNER, true, + +                            new DialogInterface.OnCancelListener() { +                                @Override +                                public void onCancel(DialogInterface dialog) { +                                    // Stop key generation on cancel +                                    stopService(serviceIntent); +                                    EditKeyActivity.this.setResult(Activity.RESULT_CANCELED); +                                    EditKeyActivity.this.finish(); +                                } +                            }) { + +                        @Override                          public void handleMessage(Message message) {                              // handle messages by standard ApgHandler first                              super.handleMessage(message); diff --git a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/DeleteFileDialogFragment.java b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/DeleteFileDialogFragment.java index a859bb045..cd8bc79a9 100644 --- a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/DeleteFileDialogFragment.java +++ b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/DeleteFileDialogFragment.java @@ -83,7 +83,7 @@ public class DeleteFileDialogFragment extends DialogFragment {                  intent.putExtra(KeychainIntentService.EXTRA_DATA, data);                  ProgressDialogFragment deletingDialog = ProgressDialogFragment.newInstance( -                        R.string.progress_deleting_securely, ProgressDialog.STYLE_HORIZONTAL); +                        R.string.progress_deleting_securely, ProgressDialog.STYLE_HORIZONTAL, false, null);                  // Message is received after deleting is done in ApgService                  KeychainIntentServiceHandler saveHandler = new KeychainIntentServiceHandler(activity, deletingDialog) { diff --git a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ProgressDialogFragment.java b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ProgressDialogFragment.java index 9b5d233e8..6c62d14e0 100644 --- a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ProgressDialogFragment.java +++ b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ProgressDialogFragment.java @@ -21,28 +21,40 @@ import android.app.Activity;  import android.app.Dialog;  import android.app.ProgressDialog;  import android.content.DialogInterface; +import android.content.DialogInterface.OnCancelListener;  import android.content.DialogInterface.OnKeyListener;  import android.os.Bundle;  import android.support.v4.app.DialogFragment;  import android.view.KeyEvent; +import org.sufficientlysecure.keychain.R; +  public class ProgressDialogFragment extends DialogFragment {      private static final String ARG_MESSAGE_ID = "message_id";      private static final String ARG_STYLE = "style"; +    private static final String ARG_CANCELABLE = "cancelable"; + +    private OnCancelListener mOnCancelListener;      /**       * Creates new instance of this fragment       * -     * @param id +     * @param messageId +     * @param style +     * @param cancelable       * @return       */ -    public static ProgressDialogFragment newInstance(int messageId, int style) { +    public static ProgressDialogFragment newInstance(int messageId, int style, boolean cancelable, +                                                     OnCancelListener onCancelListener) {          ProgressDialogFragment frag = new ProgressDialogFragment();          Bundle args = new Bundle();          args.putInt(ARG_MESSAGE_ID, messageId);          args.putInt(ARG_STYLE, style); +        args.putBoolean(ARG_CANCELABLE, cancelable);          frag.setArguments(args); +        frag.mOnCancelListener = onCancelListener; +          return frag;      } @@ -60,7 +72,6 @@ public class ProgressDialogFragment extends DialogFragment {      /**       * Updates progress of dialog       * -     * @param messageId       * @param progress       * @param max       */ @@ -74,7 +85,7 @@ public class ProgressDialogFragment extends DialogFragment {      /**       * Updates progress of dialog       * -     * @param messageId +     * @param message       * @param progress       * @param max       */ @@ -86,12 +97,20 @@ public class ProgressDialogFragment extends DialogFragment {          dialog.setMax(max);      } +    @Override +    public void onCancel(DialogInterface dialog) { +        super.onCancel(dialog); + +        if (this.mOnCancelListener != null) +            this.mOnCancelListener.onCancel(dialog); +    } +      /**       * Creates dialog       */      @Override      public Dialog onCreateDialog(Bundle savedInstanceState) { -        Activity activity = getActivity(); +        final Activity activity = getActivity();          ProgressDialog dialog = new ProgressDialog(activity);          dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); @@ -100,10 +119,22 @@ public class ProgressDialogFragment extends DialogFragment {          int messageId = getArguments().getInt(ARG_MESSAGE_ID);          int style = getArguments().getInt(ARG_STYLE); +        boolean cancelable = getArguments().getBoolean(ARG_CANCELABLE);          dialog.setMessage(getString(messageId));          dialog.setProgressStyle(style); +        if (cancelable) { +            dialog.setButton(DialogInterface.BUTTON_NEGATIVE, +                    activity.getString(R.string.progress_cancel), +                    new DialogInterface.OnClickListener() { +                @Override +                public void onClick(DialogInterface dialog, int which) { +                    dialog.cancel(); +                } +            }); +        } +          // Disable the back button          OnKeyListener keyListener = new OnKeyListener() { diff --git a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/SectionView.java b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/SectionView.java index 57865b032..a95d80a4e 100644 --- a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/SectionView.java +++ b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/SectionView.java @@ -18,6 +18,7 @@ package org.sufficientlysecure.keychain.ui.widget;  import android.app.ProgressDialog;  import android.content.Context; +import android.content.DialogInterface;  import android.content.Intent;  import android.os.Bundle;  import android.os.Message; @@ -211,7 +212,7 @@ public class SectionView extends LinearLayout implements OnClickListener, Editor      private void createKey() {          // Send all information needed to service to edit key in other thread -        Intent intent = new Intent(mActivity, KeychainIntentService.class); +        final Intent intent = new Intent(mActivity, KeychainIntentService.class);          intent.setAction(KeychainIntentService.ACTION_GENERATE_KEY); @@ -238,7 +239,12 @@ public class SectionView extends LinearLayout implements OnClickListener, Editor          // show progress dialog          mGeneratingDialog = ProgressDialogFragment.newInstance(R.string.progress_generating, -                ProgressDialog.STYLE_SPINNER); +                ProgressDialog.STYLE_SPINNER, true, new DialogInterface.OnCancelListener() { +            @Override +            public void onCancel(DialogInterface dialog) { +                mActivity.stopService(intent); +            } +        });          // Message is received after generating is done in ApgService          KeychainIntentServiceHandler saveHandler = new KeychainIntentServiceHandler(mActivity, diff --git a/OpenPGP-Keychain/src/main/res/values/strings.xml b/OpenPGP-Keychain/src/main/res/values/strings.xml index 46ffe5493..3ca5f5426 100644 --- a/OpenPGP-Keychain/src/main/res/values/strings.xml +++ b/OpenPGP-Keychain/src/main/res/values/strings.xml @@ -296,6 +296,7 @@      <!-- progress dialogs, usually ending in '…' -->      <string name="progress_done">done.</string> +    <string name="progress_cancel">cancel</string>      <string name="progress_saving">saving…</string>      <string name="progress_importing">importing…</string>      <string name="progress_exporting">exporting…</string>  | 
