diff --git a/OpenKeychain/src/main/AndroidManifest.xml b/OpenKeychain/src/main/AndroidManifest.xml
index 3be9e0aef..7c604611b 100644
--- a/OpenKeychain/src/main/AndroidManifest.xml
+++ b/OpenKeychain/src/main/AndroidManifest.xml
@@ -877,9 +877,6 @@
android:name=".remote.CryptoInputParcelCacheService"
android:exported="false"
android:process=":remote_api" />
-
{
}
public BackupOperation(Context context, KeyRepository keyRepository,
- Progressable progressable, CancellationSignal cancelled) {
+ Progressable progressable, AtomicBoolean cancelled) {
super(context, keyRepository, progressable, cancelled);
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/BaseOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/BaseOperation.java
index f757eb6dd..693d6dd11 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/BaseOperation.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/BaseOperation.java
@@ -18,17 +18,18 @@
package org.sufficientlysecure.keychain.operations;
+import java.util.concurrent.atomic.AtomicBoolean;
+
import android.content.Context;
import android.os.Parcelable;
import android.support.annotation.NonNull;
import android.support.annotation.StringRes;
-import android.support.v4.os.CancellationSignal;
import org.sufficientlysecure.keychain.Constants.key;
+import org.sufficientlysecure.keychain.daos.KeyRepository;
import org.sufficientlysecure.keychain.operations.results.OperationResult;
import org.sufficientlysecure.keychain.pgp.PassphraseCacheInterface;
import org.sufficientlysecure.keychain.pgp.Progressable;
-import org.sufficientlysecure.keychain.daos.KeyRepository;
import org.sufficientlysecure.keychain.service.PassphraseCacheService;
import org.sufficientlysecure.keychain.service.input.CryptoInputParcel;
import org.sufficientlysecure.keychain.util.Passphrase;
@@ -37,7 +38,7 @@ public abstract class BaseOperation implements PassphraseC
final public Context mContext;
final public Progressable mProgressable;
- final public CancellationSignal mCancelled;
+ final public AtomicBoolean mCancelled;
final public KeyRepository mKeyRepository;
@@ -71,7 +72,7 @@ public abstract class BaseOperation implements PassphraseC
}
public BaseOperation(Context context, KeyRepository keyRepository,
- Progressable progressable, CancellationSignal cancelled) {
+ Progressable progressable, AtomicBoolean cancelled) {
mContext = context;
mProgressable = progressable;
mKeyRepository = keyRepository;
@@ -100,7 +101,7 @@ public abstract class BaseOperation implements PassphraseC
}
protected boolean checkCancelled() {
- return mCancelled != null && mCancelled.isCanceled();
+ return mCancelled != null && mCancelled.get();
}
protected void setPreventCancel () {
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/BaseReadWriteOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/BaseReadWriteOperation.java
index 43df20fb1..ec90c9158 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/BaseReadWriteOperation.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/BaseReadWriteOperation.java
@@ -18,12 +18,13 @@
package org.sufficientlysecure.keychain.operations;
+import java.util.concurrent.atomic.AtomicBoolean;
+
import android.content.Context;
import android.os.Parcelable;
-import android.support.v4.os.CancellationSignal;
-import org.sufficientlysecure.keychain.pgp.Progressable;
import org.sufficientlysecure.keychain.daos.KeyWritableRepository;
+import org.sufficientlysecure.keychain.pgp.Progressable;
public abstract class BaseReadWriteOperation extends BaseOperation {
protected final KeyWritableRepository mKeyWritableRepository;
@@ -37,7 +38,7 @@ public abstract class BaseReadWriteOperation extends BaseO
}
protected BaseReadWriteOperation(Context context, KeyWritableRepository databaseInteractor,
- Progressable progressable, CancellationSignal cancelled) {
+ Progressable progressable, AtomicBoolean cancelled) {
super(context, databaseInteractor, progressable, cancelled);
mKeyWritableRepository = databaseInteractor;
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/CertifyOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/CertifyOperation.java
index b9a657cd8..87eaccd8f 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/CertifyOperation.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/CertifyOperation.java
@@ -19,11 +19,14 @@ package org.sufficientlysecure.keychain.operations;
import java.util.ArrayList;
+import java.util.concurrent.atomic.AtomicBoolean;
import android.content.Context;
import android.support.annotation.NonNull;
-import android.support.v4.os.CancellationSignal;
+import org.sufficientlysecure.keychain.daos.KeyMetadataDao;
+import org.sufficientlysecure.keychain.daos.KeyRepository.NotFoundException;
+import org.sufficientlysecure.keychain.daos.KeyWritableRepository;
import org.sufficientlysecure.keychain.operations.results.CertifyResult;
import org.sufficientlysecure.keychain.operations.results.OperationResult.LogType;
import org.sufficientlysecure.keychain.operations.results.OperationResult.OperationLog;
@@ -38,9 +41,6 @@ import org.sufficientlysecure.keychain.pgp.PgpCertifyOperation.PgpCertifyResult;
import org.sufficientlysecure.keychain.pgp.Progressable;
import org.sufficientlysecure.keychain.pgp.UncachedKeyRing;
import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException;
-import org.sufficientlysecure.keychain.daos.KeyMetadataDao;
-import org.sufficientlysecure.keychain.daos.KeyRepository.NotFoundException;
-import org.sufficientlysecure.keychain.daos.KeyWritableRepository;
import org.sufficientlysecure.keychain.service.CertifyActionsParcel;
import org.sufficientlysecure.keychain.service.CertifyActionsParcel.CertifyAction;
import org.sufficientlysecure.keychain.service.ContactSyncAdapterService;
@@ -63,8 +63,8 @@ import org.sufficientlysecure.keychain.util.Passphrase;
public class CertifyOperation extends BaseReadWriteOperation {
private final KeyMetadataDao keyMetadataDao;
- public CertifyOperation(Context context, KeyWritableRepository keyWritableRepository, Progressable progressable, CancellationSignal
- cancelled) {
+ public CertifyOperation(Context context, KeyWritableRepository keyWritableRepository, Progressable progressable,
+ AtomicBoolean cancelled) {
super(context, keyWritableRepository, progressable, cancelled);
this.keyMetadataDao = KeyMetadataDao.create(context);
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/EditKeyOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/EditKeyOperation.java
index f0d10c7b5..053ca87b0 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/EditKeyOperation.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/EditKeyOperation.java
@@ -19,12 +19,15 @@ package org.sufficientlysecure.keychain.operations;
import java.io.IOException;
+import java.util.concurrent.atomic.AtomicBoolean;
import android.content.Context;
import android.support.annotation.NonNull;
-import android.support.v4.os.CancellationSignal;
import org.sufficientlysecure.keychain.R;
+import org.sufficientlysecure.keychain.daos.KeyMetadataDao;
+import org.sufficientlysecure.keychain.daos.KeyRepository.NotFoundException;
+import org.sufficientlysecure.keychain.daos.KeyWritableRepository;
import org.sufficientlysecure.keychain.operations.results.EditKeyResult;
import org.sufficientlysecure.keychain.operations.results.OperationResult.LogType;
import org.sufficientlysecure.keychain.operations.results.OperationResult.OperationLog;
@@ -35,9 +38,6 @@ import org.sufficientlysecure.keychain.pgp.CanonicalizedSecretKeyRing;
import org.sufficientlysecure.keychain.pgp.PgpKeyOperation;
import org.sufficientlysecure.keychain.pgp.Progressable;
import org.sufficientlysecure.keychain.pgp.UncachedKeyRing;
-import org.sufficientlysecure.keychain.daos.KeyMetadataDao;
-import org.sufficientlysecure.keychain.daos.KeyRepository.NotFoundException;
-import org.sufficientlysecure.keychain.daos.KeyWritableRepository;
import org.sufficientlysecure.keychain.service.ContactSyncAdapterService;
import org.sufficientlysecure.keychain.service.SaveKeyringParcel;
import org.sufficientlysecure.keychain.service.UploadKeyringParcel;
@@ -61,7 +61,7 @@ public class EditKeyOperation extends BaseReadWriteOperation
public EditKeyOperation(Context context, KeyWritableRepository databaseInteractor,
- Progressable progressable, CancellationSignal cancelled) {
+ Progressable progressable, AtomicBoolean cancelled) {
super(context, databaseInteractor, progressable, cancelled);
this.keyMetadataDao = KeyMetadataDao.create(context);
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ImportOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ImportOperation.java
index 189d596fd..452990673 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ImportOperation.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ImportOperation.java
@@ -29,13 +29,15 @@ import java.util.concurrent.ExecutorService;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
-import android.support.v4.os.CancellationSignal;
import org.sufficientlysecure.keychain.R;
+import org.sufficientlysecure.keychain.daos.KeyMetadataDao;
+import org.sufficientlysecure.keychain.daos.KeyWritableRepository;
import org.sufficientlysecure.keychain.keyimport.FacebookKeyserverClient;
import org.sufficientlysecure.keychain.keyimport.HkpKeyserverAddress;
import org.sufficientlysecure.keychain.keyimport.HkpKeyserverClient;
@@ -54,8 +56,6 @@ import org.sufficientlysecure.keychain.pgp.CanonicalizedKeyRing;
import org.sufficientlysecure.keychain.pgp.Progressable;
import org.sufficientlysecure.keychain.pgp.UncachedKeyRing;
import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException;
-import org.sufficientlysecure.keychain.daos.KeyMetadataDao;
-import org.sufficientlysecure.keychain.daos.KeyWritableRepository;
import org.sufficientlysecure.keychain.service.ContactSyncAdapterService;
import org.sufficientlysecure.keychain.service.ImportKeyringParcel;
import org.sufficientlysecure.keychain.service.input.CryptoInputParcel;
@@ -102,7 +102,7 @@ public class ImportOperation extends BaseReadWriteOperation
}
public ImportOperation(Context context, KeyWritableRepository databaseInteractor,
- Progressable progressable, CancellationSignal cancelled) {
+ Progressable progressable, AtomicBoolean cancelled) {
super(context, databaseInteractor, progressable, cancelled);
this.keyMetadataDao = KeyMetadataDao.create(context);
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/KeySyncOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/KeySyncOperation.java
index ba4f5d79e..e97a31bf4 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/KeySyncOperation.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/KeySyncOperation.java
@@ -5,18 +5,18 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
import android.content.Context;
import android.support.annotation.NonNull;
-import android.support.v4.os.CancellationSignal;
import org.sufficientlysecure.keychain.Constants;
+import org.sufficientlysecure.keychain.daos.KeyMetadataDao;
+import org.sufficientlysecure.keychain.daos.KeyWritableRepository;
import org.sufficientlysecure.keychain.keyimport.ParcelableKeyRing;
import org.sufficientlysecure.keychain.operations.results.ImportKeyResult;
import org.sufficientlysecure.keychain.operations.results.OperationResult;
import org.sufficientlysecure.keychain.pgp.Progressable;
-import org.sufficientlysecure.keychain.daos.KeyMetadataDao;
-import org.sufficientlysecure.keychain.daos.KeyWritableRepository;
import org.sufficientlysecure.keychain.service.ImportKeyringParcel;
import org.sufficientlysecure.keychain.service.input.CryptoInputParcel;
import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
@@ -36,7 +36,7 @@ public class KeySyncOperation extends BaseReadWriteOperation {
private final Preferences preferences;
public KeySyncOperation(Context context, KeyWritableRepository databaseInteractor,
- Progressable progressable, CancellationSignal cancellationSignal) {
+ Progressable progressable, AtomicBoolean cancellationSignal) {
super(context, databaseInteractor, progressable, cancellationSignal);
keyMetadataDao = KeyMetadataDao.create(context);
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/PromoteKeyOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/PromoteKeyOperation.java
index fb4f350b2..b1126cf2f 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/PromoteKeyOperation.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/PromoteKeyOperation.java
@@ -20,12 +20,14 @@ package org.sufficientlysecure.keychain.operations;
import java.util.Arrays;
import java.util.List;
+import java.util.concurrent.atomic.AtomicBoolean;
import android.content.Context;
import android.support.annotation.NonNull;
-import android.support.v4.os.CancellationSignal;
import org.sufficientlysecure.keychain.R;
+import org.sufficientlysecure.keychain.daos.KeyRepository.NotFoundException;
+import org.sufficientlysecure.keychain.daos.KeyWritableRepository;
import org.sufficientlysecure.keychain.operations.results.OperationResult.LogType;
import org.sufficientlysecure.keychain.operations.results.OperationResult.OperationLog;
import org.sufficientlysecure.keychain.operations.results.PgpEditKeyResult;
@@ -35,8 +37,6 @@ import org.sufficientlysecure.keychain.pgp.CanonicalizedPublicKey;
import org.sufficientlysecure.keychain.pgp.CanonicalizedPublicKeyRing;
import org.sufficientlysecure.keychain.pgp.Progressable;
import org.sufficientlysecure.keychain.pgp.UncachedKeyRing;
-import org.sufficientlysecure.keychain.daos.KeyRepository.NotFoundException;
-import org.sufficientlysecure.keychain.daos.KeyWritableRepository;
import org.sufficientlysecure.keychain.service.PromoteKeyringParcel;
import org.sufficientlysecure.keychain.service.input.CryptoInputParcel;
import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
@@ -50,7 +50,7 @@ import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
*/
public class PromoteKeyOperation extends BaseReadWriteOperation {
public PromoteKeyOperation(Context context, KeyWritableRepository databaseInteractor,
- Progressable progressable, CancellationSignal cancelled) {
+ Progressable progressable, AtomicBoolean cancelled) {
super(context, databaseInteractor, progressable, cancelled);
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/SignEncryptOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/SignEncryptOperation.java
index 306003b6e..20bcd19e8 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/SignEncryptOperation.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/SignEncryptOperation.java
@@ -20,12 +20,13 @@ package org.sufficientlysecure.keychain.operations;
import java.util.ArrayDeque;
import java.util.ArrayList;
+import java.util.concurrent.atomic.AtomicBoolean;
import android.content.Context;
import android.net.Uri;
import android.support.annotation.NonNull;
-import android.support.v4.os.CancellationSignal;
+import org.sufficientlysecure.keychain.daos.KeyRepository;
import org.sufficientlysecure.keychain.operations.results.OperationResult.LogType;
import org.sufficientlysecure.keychain.operations.results.OperationResult.OperationLog;
import org.sufficientlysecure.keychain.operations.results.PgpSignEncryptResult;
@@ -34,7 +35,6 @@ import org.sufficientlysecure.keychain.pgp.PgpSignEncryptInputParcel;
import org.sufficientlysecure.keychain.pgp.PgpSignEncryptOperation;
import org.sufficientlysecure.keychain.pgp.Progressable;
import org.sufficientlysecure.keychain.pgp.SignEncryptParcel;
-import org.sufficientlysecure.keychain.daos.KeyRepository;
import org.sufficientlysecure.keychain.service.input.CryptoInputParcel;
import org.sufficientlysecure.keychain.service.input.RequiredInputParcel;
import org.sufficientlysecure.keychain.service.input.RequiredInputParcel.RequiredInputType;
@@ -52,7 +52,7 @@ import org.sufficientlysecure.keychain.util.ProgressScaler;
public class SignEncryptOperation extends BaseOperation {
public SignEncryptOperation(Context context, KeyRepository keyRepository,
- Progressable progressable, CancellationSignal cancelled) {
+ Progressable progressable, AtomicBoolean cancelled) {
super(context, keyRepository, progressable, cancelled);
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/UploadOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/UploadOperation.java
index 221d7af64..f7c70e671 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/UploadOperation.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/UploadOperation.java
@@ -21,11 +21,11 @@ package org.sufficientlysecure.keychain.operations;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.net.Proxy;
+import java.util.concurrent.atomic.AtomicBoolean;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
-import android.support.v4.os.CancellationSignal;
import org.bouncycastle.bcpg.ArmoredOutputStream;
import org.sufficientlysecure.keychain.R;
@@ -60,7 +60,7 @@ public class UploadOperation extends BaseOperation {
private KeyMetadataDao keyMetadataDao;
public UploadOperation(Context context, KeyRepository keyRepository,
- Progressable progressable, CancellationSignal cancelled) {
+ Progressable progressable, AtomicBoolean cancelled) {
super(context, keyRepository, progressable, cancelled);
keyMetadataDao = KeyMetadataDao.create(mContext);
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpKeyOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpKeyOperation.java
index 8fd9867cf..47fdd57fa 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpKeyOperation.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpKeyOperation.java
@@ -33,8 +33,7 @@ import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Stack;
-
-import android.support.v4.os.CancellationSignal;
+import java.util.concurrent.atomic.AtomicBoolean;
import org.bouncycastle.asn1.ASN1ObjectIdentifier;
import org.bouncycastle.asn1.nist.NISTNamedCurves;
@@ -109,7 +108,7 @@ import timber.log.Timber;
public class PgpKeyOperation {
private Stack mProgress;
- private CancellationSignal mCancelled;
+ private AtomicBoolean mCancelled;
public PgpKeyOperation(Progressable progress) {
super();
@@ -119,13 +118,13 @@ public class PgpKeyOperation {
}
}
- public PgpKeyOperation(Progressable progress, CancellationSignal cancelled) {
+ public PgpKeyOperation(Progressable progress, AtomicBoolean cancelled) {
this(progress);
mCancelled = cancelled;
}
private boolean checkCancelled() {
- return mCancelled != null && mCancelled.isCanceled();
+ return mCancelled != null && mCancelled.get();
}
private void subProgressPush(int from, int to) {
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncryptOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncryptOperation.java
index 9d071fc4b..038cbf01a 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncryptOperation.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncryptOperation.java
@@ -33,11 +33,11 @@ import java.security.SignatureException;
import java.util.Collection;
import java.util.Date;
import java.util.Set;
+import java.util.concurrent.atomic.AtomicBoolean;
import android.content.Context;
import android.net.Uri;
import android.support.annotation.NonNull;
-import android.support.v4.os.CancellationSignal;
import org.bouncycastle.bcpg.ArmoredOutputStream;
import org.bouncycastle.bcpg.BCPGOutputStream;
@@ -54,6 +54,9 @@ import org.bouncycastle.openpgp.operator.jcajce.NfcSyncPGPContentSignerBuilder;
import org.bouncycastle.openpgp.operator.jcajce.PGPUtil;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
+import org.sufficientlysecure.keychain.daos.KeyRepository;
+import org.sufficientlysecure.keychain.daos.KeyRepository.NotFoundException;
+import org.sufficientlysecure.keychain.daos.KeyWritableRepository;
import org.sufficientlysecure.keychain.operations.BaseOperation;
import org.sufficientlysecure.keychain.operations.results.OperationResult.LogType;
import org.sufficientlysecure.keychain.operations.results.OperationResult.OperationLog;
@@ -63,9 +66,6 @@ import org.sufficientlysecure.keychain.pgp.PgpSecurityConstants.OpenKeychainComp
import org.sufficientlysecure.keychain.pgp.PgpSecurityConstants.OpenKeychainHashAlgorithmTags;
import org.sufficientlysecure.keychain.pgp.PgpSecurityConstants.OpenKeychainSymmetricKeyAlgorithmTags;
import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException;
-import org.sufficientlysecure.keychain.daos.KeyRepository;
-import org.sufficientlysecure.keychain.daos.KeyRepository.NotFoundException;
-import org.sufficientlysecure.keychain.daos.KeyWritableRepository;
import org.sufficientlysecure.keychain.service.input.CryptoInputParcel;
import org.sufficientlysecure.keychain.service.input.RequiredInputParcel;
import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
@@ -104,7 +104,7 @@ public class PgpSignEncryptOperation extends BaseOperation());
+ this.keyRepository = KeyWritableRepository.create(context);
+ }
- public static final String ACTION_CANCEL = "action_cancel";
+ private final Context context;
+ private final ThreadPoolExecutor threadPoolExecutor;
+ private final KeyWritableRepository keyRepository;
// this attribute can possibly merged with the one above? not sure...
- private CancellationSignal mActionCanceled;
+ private AtomicBoolean operationCancelledBoolean = new AtomicBoolean(false);
- ThreadLocal mMessenger = new ThreadLocal<>();
+ public void startOperationInBackground(Parcelable inputParcel, CryptoInputParcel cryptoInput,
+ Progressable progressable, OperationCallback operationCallback) {
+ operationCancelledBoolean.set(false);
- @Override
- public IBinder onBind(Intent intent) {
- return null;
- }
+ Runnable actionRunnable = () -> {
+ BaseOperation op;
- /**
- * This is run on the main thread, we need to spawn a runnable which runs on another thread for the actual operation
- */
- @Override
- public int onStartCommand(final Intent intent, int flags, int startId) {
-
- if (intent.getAction() != null && intent.getAction().equals(ACTION_CANCEL)) {
- if (mActionCanceled != null) {
- mActionCanceled.cancel();
+ if (inputParcel instanceof SignEncryptParcel) {
+ op = new SignEncryptOperation(context, keyRepository, progressable, operationCancelledBoolean);
+ } else if (inputParcel instanceof PgpDecryptVerifyInputParcel) {
+ op = new PgpDecryptVerifyOperation(context, keyRepository, progressable);
+ } else if (inputParcel instanceof SaveKeyringParcel) {
+ op = new EditKeyOperation(context, keyRepository, progressable, operationCancelledBoolean);
+ } else if (inputParcel instanceof ChangeUnlockParcel) {
+ op = new ChangeUnlockOperation(context, keyRepository, progressable);
+ } else if (inputParcel instanceof RevokeKeyringParcel) {
+ op = new RevokeOperation(context, keyRepository, progressable);
+ } else if (inputParcel instanceof CertifyActionsParcel) {
+ op = new CertifyOperation(context, keyRepository, progressable, operationCancelledBoolean);
+ } else if (inputParcel instanceof DeleteKeyringParcel) {
+ op = new DeleteOperation(context, keyRepository, progressable);
+ } else if (inputParcel instanceof PromoteKeyringParcel) {
+ op = new PromoteKeyOperation(context, keyRepository, progressable, operationCancelledBoolean);
+ } else if (inputParcel instanceof ImportKeyringParcel) {
+ op = new ImportOperation(context, keyRepository, progressable, operationCancelledBoolean);
+ } else if (inputParcel instanceof BackupKeyringParcel) {
+ op = new BackupOperation(context, keyRepository, progressable, operationCancelledBoolean);
+ } else if (inputParcel instanceof UploadKeyringParcel) {
+ op = new UploadOperation(context, keyRepository, progressable, operationCancelledBoolean);
+ } else if (inputParcel instanceof KeybaseVerificationParcel) {
+ op = new KeybaseVerificationOperation(context, keyRepository, progressable);
+ } else if (inputParcel instanceof InputDataParcel) {
+ op = new InputDataOperation(context, keyRepository, progressable);
+ } else if (inputParcel instanceof BenchmarkInputParcel) {
+ op = new BenchmarkOperation(context, keyRepository, progressable);
+ } else if (inputParcel instanceof KeySyncParcel) {
+ op = new KeySyncOperation(context, keyRepository, progressable, operationCancelledBoolean);
+ } else {
+ throw new AssertionError("Unrecognized input parcel in KeychainService!");
}
- return START_NOT_STICKY;
- }
- mActionCanceled = new CancellationSignal();
-
- Runnable actionRunnable = new Runnable() {
- @Override
- public void run() {
- 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
- KeychainService outerThis = KeychainService.this;
- KeyWritableRepository databaseInteractor =
- KeyWritableRepository.create(outerThis);
- if (inputParcel instanceof SignEncryptParcel) {
- op = new SignEncryptOperation(outerThis, databaseInteractor, outerThis, mActionCanceled);
- } else if (inputParcel instanceof PgpDecryptVerifyInputParcel) {
- op = new PgpDecryptVerifyOperation(outerThis, databaseInteractor, outerThis);
- } else if (inputParcel instanceof SaveKeyringParcel) {
- op = new EditKeyOperation(outerThis, databaseInteractor, outerThis, mActionCanceled);
- } else if (inputParcel instanceof ChangeUnlockParcel) {
- op = new ChangeUnlockOperation(outerThis, databaseInteractor, outerThis);
- } else if (inputParcel instanceof RevokeKeyringParcel) {
- op = new RevokeOperation(outerThis, databaseInteractor, outerThis);
- } else if (inputParcel instanceof CertifyActionsParcel) {
- op = new CertifyOperation(outerThis, databaseInteractor, outerThis, mActionCanceled);
- } else if (inputParcel instanceof DeleteKeyringParcel) {
- op = new DeleteOperation(outerThis, databaseInteractor, outerThis);
- } else if (inputParcel instanceof PromoteKeyringParcel) {
- op = new PromoteKeyOperation(outerThis, databaseInteractor, outerThis, mActionCanceled);
- } else if (inputParcel instanceof ImportKeyringParcel) {
- op = new ImportOperation(outerThis, databaseInteractor, outerThis, mActionCanceled);
- } else if (inputParcel instanceof BackupKeyringParcel) {
- op = new BackupOperation(outerThis, databaseInteractor, outerThis, mActionCanceled);
- } else if (inputParcel instanceof UploadKeyringParcel) {
- op = new UploadOperation(outerThis, databaseInteractor, outerThis, mActionCanceled);
- } else if (inputParcel instanceof KeybaseVerificationParcel) {
- op = new KeybaseVerificationOperation(outerThis, databaseInteractor, outerThis);
- } else if (inputParcel instanceof InputDataParcel) {
- op = new InputDataOperation(outerThis, databaseInteractor, outerThis);
- } else if (inputParcel instanceof BenchmarkInputParcel) {
- op = new BenchmarkOperation(outerThis, databaseInteractor, outerThis);
- } else if (inputParcel instanceof KeySyncParcel) {
- op = new KeySyncOperation(outerThis, databaseInteractor, outerThis, mActionCanceled);
- } else {
- throw new AssertionError("Unrecognized input parcel in KeychainService!");
- }
-
- @SuppressWarnings("unchecked") // this is unchecked, we make sure it's the correct op above!
- OperationResult result = op.execute(inputParcel, cryptoInput);
- sendMessageToHandler(MessageStatus.OKAY, result);
-
- }
+ @SuppressWarnings("unchecked") // this is unchecked, we make sure it's the correct op above!
+ OperationResult result = op.execute(inputParcel, cryptoInput);
+ operationCallback.operationFinished(result);
};
- Thread actionThread = new Thread(actionRunnable);
- actionThread.start();
-
- return START_NOT_STICKY;
+ threadPoolExecutor.execute(actionRunnable);
}
- private void sendMessageToHandler(MessageStatus status, Integer arg2, Bundle data) {
-
- Message msg = Message.obtain();
- assert msg != null;
- msg.arg1 = status.ordinal();
- if (arg2 != null) {
- msg.arg2 = arg2;
- }
- if (data != null) {
- msg.setData(data);
- }
-
- try {
- mMessenger.get().send(msg);
- } catch (RemoteException e) {
- Timber.w(e, "Exception sending message, Is handler present?");
- } catch (NullPointerException e) {
- Timber.w(e, "Messenger is null!");
+ public void cancelRunningTask() {
+ if (operationCancelledBoolean != null) {
+ operationCancelledBoolean.set(true);
}
}
- private void sendMessageToHandler(MessageStatus status, OperationResult data) {
- Bundle bundle = new Bundle();
- bundle.putParcelable(OperationResult.EXTRA_RESULT, data);
- sendMessageToHandler(status, null, bundle);
+ public interface OperationCallback {
+ void operationFinished(OperationResult data);
}
-
- private void sendMessageToHandler(MessageStatus status) {
- sendMessageToHandler(status, null, null);
- }
-
- /**
- * Set progress of ProgressDialog by sending message to handler on UI thread
- */
- @Override
- public void setProgress(String message, int progress, int max) {
- Timber.d("Send message by setProgress with progress=" + progress + ", max="
- + max);
-
- 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
- public void setProgress(int resourceId, int progress, int max) {
- setProgress(getString(resourceId), progress, max);
- }
-
- @Override
- public void setProgress(int progress, int max) {
- setProgress(null, progress, max);
- }
-
- @Override
- public void setPreventCancel() {
- sendMessageToHandler(MessageStatus.PREVENT_CANCEL);
- }
-
}
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 13b62752e..92aaeda39 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
@@ -29,7 +29,6 @@ import android.view.inputmethod.InputMethodManager;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.operations.results.OperationResult;
-import org.sufficientlysecure.keychain.service.KeychainService;
import org.sufficientlysecure.keychain.service.input.CryptoInputParcel;
/** This is a base class for fragments which implement a cryptoOperation.
@@ -47,8 +46,6 @@ import org.sufficientlysecure.keychain.service.input.CryptoInputParcel;
* must override at least onCryptoOperationSuccess to proceed after a
* successful operation.
*
- * @see KeychainService
- *
*/
public abstract class CryptoOperationFragment
extends Fragment implements CryptoOperationHelper.Callback {
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/CryptoOperationHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/CryptoOperationHelper.java
index 06dc54345..374dda3aa 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/CryptoOperationHelper.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/CryptoOperationHelper.java
@@ -17,6 +17,7 @@
package org.sufficientlysecure.keychain.ui.base;
+
import java.util.Date;
import android.app.Activity;
@@ -27,6 +28,7 @@ import android.os.Handler;
import android.os.Message;
import android.os.Messenger;
import android.os.Parcelable;
+import android.os.RemoteException;
import android.os.SystemClock;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
@@ -34,14 +36,17 @@ import android.support.v4.app.FragmentManager;
import org.sufficientlysecure.keychain.operations.results.InputPendingResult;
import org.sufficientlysecure.keychain.operations.results.OperationResult;
+import org.sufficientlysecure.keychain.pgp.Progressable;
import org.sufficientlysecure.keychain.service.KeychainService;
+import org.sufficientlysecure.keychain.service.KeychainService.OperationCallback;
import org.sufficientlysecure.keychain.service.ServiceProgressHandler;
+import org.sufficientlysecure.keychain.service.ServiceProgressHandler.MessageStatus;
import org.sufficientlysecure.keychain.service.input.CryptoInputParcel;
import org.sufficientlysecure.keychain.service.input.RequiredInputParcel;
-import org.sufficientlysecure.keychain.ui.SecurityTokenOperationActivity;
import org.sufficientlysecure.keychain.ui.OrbotRequiredDialogActivity;
import org.sufficientlysecure.keychain.ui.PassphraseDialogActivity;
import org.sufficientlysecure.keychain.ui.RetryUploadDialogActivity;
+import org.sufficientlysecure.keychain.ui.SecurityTokenOperationActivity;
import org.sufficientlysecure.keychain.ui.dialog.ProgressDialogFragment;
import timber.log.Timber;
@@ -295,12 +300,6 @@ public class CryptoOperationHelper