diff options
Diffstat (limited to 'OpenKeychain/src/main/java/org')
30 files changed, 1152 insertions, 1332 deletions
| 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 a824e73d7..5a3321ac8 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/BaseOperation.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/BaseOperation.java @@ -40,7 +40,7 @@ public abstract class BaseOperation implements PassphraseCacheInterface {       * of common methods for progress, cancellation and passphrase cache handling.       *       * An "operation" in this sense is a high level operation which is called -     * by the KeychainIntentService or OpenPgpService services. Concrete +     * by the KeychainService or OpenPgpService services. Concrete       * subclasses of this class should implement either a single or a group of       * related operations. An operation must rely solely on its input       * parameters for operation specifics. It should also write a log of its @@ -49,7 +49,7 @@ public abstract class BaseOperation implements PassphraseCacheInterface {       *       * An operation must *not* throw exceptions of any kind, errors should be       * handled as part of the OperationResult! Consequently, all handling of -     * errors in KeychainIntentService and OpenPgpService should consist of +     * errors in KeychainService and OpenPgpService should consist of       * informational rather than operational means.       *       * Note that subclasses of this class should be either Android- or diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ImportExportOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ImportExportOperation.java index b48de009e..ffce2f39c 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ImportExportOperation.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ImportExportOperation.java @@ -156,6 +156,15 @@ public class ImportExportOperation extends BaseOperation {      } +    /** +     * Since the introduction of multithreaded import, we expect calling functions to handle the key sync i,e +     * ContactSyncAdapterService.requestSync() +     * +     * @param entries keys to import +     * @param num number of keys to import +     * @param keyServerUri contains uri of keyserver to import from, if it is an import from cloud +     * @return +     */      public ImportKeyResult importKeyRings(Iterator<ParcelableKeyRing> entries, int num, String keyServerUri) {          updateProgress(R.string.progress_importing, 0, 100); @@ -330,8 +339,8 @@ public class ImportExportOperation extends BaseOperation {          // Special: make sure new data is synced into contacts          // disabling sync right now since it reduces speed while multi-threading -        // so, we expect calling functions to take care of it. KeychainIntentService handles this -        //ContactSyncAdapterService.requestSync(); +        // so, we expect calling functions to take care of it. KeychainService handles this +        // ContactSyncAdapterService.requestSync();          // convert to long array          long[] importedMasterKeyIdsArray = new long[importedMasterKeyIds.size()]; @@ -375,8 +384,6 @@ public class ImportExportOperation extends BaseOperation {              log.add(LogType.MSG_IMPORT_ERROR, 1);          } -        ContactSyncAdapterService.requestSync(); -          return new ImportKeyResult(resultType, log, newKeys, updatedKeys, badKeys, secret,                  importedMasterKeyIdsArray);      } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/CloudImportService.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/CloudImportService.java deleted file mode 100644 index 249586f6d..000000000 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/CloudImportService.java +++ /dev/null @@ -1,384 +0,0 @@ -/* - * Copyright (C) 2012-2013 Dominik Schürmann <dominik@dominikschuermann.de> - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program.  If not, see <http://www.gnu.org/licenses/>. - */ - -package org.sufficientlysecure.keychain.service; - -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.RemoteException; - -import org.sufficientlysecure.keychain.Constants; -import org.sufficientlysecure.keychain.keyimport.ParcelableKeyRing; -import org.sufficientlysecure.keychain.operations.ImportExportOperation; -import org.sufficientlysecure.keychain.operations.results.ImportKeyResult; -import org.sufficientlysecure.keychain.operations.results.OperationResult; -import org.sufficientlysecure.keychain.pgp.Progressable; -import org.sufficientlysecure.keychain.provider.ProviderHelper; -import org.sufficientlysecure.keychain.util.Log; -import org.sufficientlysecure.keychain.util.ParcelableFileCache; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.SynchronousQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicBoolean; - -/** - * When this service is started it will initiate a multi-threaded key import and when done it will - * shut itself down. - */ -public class CloudImportService extends Service implements Progressable { - -    // required as extras from intent -    public static final String EXTRA_MESSENGER = "messenger"; -    public static final String EXTRA_DATA = "data"; - -    // required by data bundle -    public static final String IMPORT_KEY_LIST = "import_key_list"; -    public static final String IMPORT_KEY_SERVER = "import_key_server"; - -    // indicates a request to cancel the import -    public static final String ACTION_CANCEL = Constants.INTENT_PREFIX + "CANCEL"; - -    // tells the spawned threads whether the user has requested a cancel -    private static AtomicBoolean mActionCancelled = new AtomicBoolean(false); - -    @Override -    public IBinder onBind(Intent intent) { -        return null; -    } - -    /** -     * Used to accumulate the results of individual key imports -     */ -    private class KeyImportAccumulator { -        private OperationResult.OperationLog mImportLog = new OperationResult.OperationLog(); -        private int mTotalKeys; -        private int mImportedKeys = 0; -        private Progressable mImportProgressable; -        ArrayList<Long> mImportedMasterKeyIds = new ArrayList<Long>(); -        private int mBadKeys = 0; -        private int mNewKeys = 0; -        private int mUpdatedKeys = 0; -        private int mSecret = 0; -        private int mResultType = 0; - -        public KeyImportAccumulator(int totalKeys) { -            mTotalKeys = totalKeys; -            // ignore updates from ImportExportOperation for now -            mImportProgressable = new Progressable() { -                @Override -                public void setProgress(String message, int current, int total) { - -                } - -                @Override -                public void setProgress(int resourceId, int current, int total) { - -                } - -                @Override -                public void setProgress(int current, int total) { - -                } - -                @Override -                public void setPreventCancel() { - -                } -            }; -        } - -        public Progressable getImportProgressable() { -            return mImportProgressable; -        } - -        public int getTotalKeys() { -            return mTotalKeys; -        } - -        public int getImportedKeys() { -            return mImportedKeys; -        } - -        public synchronized void accumulateKeyImport(ImportKeyResult result) { -            mImportedKeys++; -            mImportLog.addAll(result.getLog().toList());//accumulates log -            mBadKeys += result.mBadKeys; -            mNewKeys += result.mNewKeys; -            mUpdatedKeys += result.mUpdatedKeys; -            mSecret += result.mSecret; - -            long[] masterKeyIds = result.getImportedMasterKeyIds(); -            for (long masterKeyId : masterKeyIds) { -                mImportedMasterKeyIds.add(masterKeyId); -            } - -            // if any key import has been cancelled, set result type to cancelled -            // resultType is added to in getConsolidatedKayImport to account for remaining factors -            mResultType |= result.getResult() & ImportKeyResult.RESULT_CANCELLED; -        } - -        /** -         * returns accumulated result of all imports so far -         */ -        public ImportKeyResult getConsolidatedImportKeyResult() { - -            // adding required information to mResultType -            // special case,no keys requested for import -            if (mBadKeys == 0 && mNewKeys == 0 && mUpdatedKeys == 0) { -                mResultType = ImportKeyResult.RESULT_FAIL_NOTHING; -            } else { -                if (mNewKeys > 0) { -                    mResultType |= ImportKeyResult.RESULT_OK_NEWKEYS; -                } -                if (mUpdatedKeys > 0) { -                    mResultType |= ImportKeyResult.RESULT_OK_UPDATED; -                } -                if (mBadKeys > 0) { -                    mResultType |= ImportKeyResult.RESULT_WITH_ERRORS; -                    if (mNewKeys == 0 && mUpdatedKeys == 0) { -                        mResultType |= ImportKeyResult.RESULT_ERROR; -                    } -                } -                if (mImportLog.containsWarnings()) { -                    mResultType |= ImportKeyResult.RESULT_WARNINGS; -                } -            } - -            long masterKeyIds[] = new long[mImportedMasterKeyIds.size()]; -            for (int i = 0; i < masterKeyIds.length; i++) { -                masterKeyIds[i] = mImportedMasterKeyIds.get(i); -            } - -            return new ImportKeyResult(mResultType, mImportLog, mNewKeys, mUpdatedKeys, mBadKeys, -                    mSecret, masterKeyIds); -        } - -        public boolean isImportFinished() { -            return mTotalKeys == mImportedKeys; -        } -    } - -    private KeyImportAccumulator mKeyImportAccumulator; - -    Messenger mMessenger; - -    @Override -    public int onStartCommand(Intent intent, int flags, int startId) { - -        if (ACTION_CANCEL.equals(intent.getAction())) { -            mActionCancelled.set(true); -            return Service.START_NOT_STICKY; -        } - -        mActionCancelled.set(false);//we haven't been cancelled, yet - -        Bundle extras = intent.getExtras(); - -        mMessenger = (Messenger) extras.get(EXTRA_MESSENGER); - -        Bundle data = extras.getBundle(EXTRA_DATA); - -        final String keyServer = data.getString(IMPORT_KEY_SERVER); -        // keyList being null (in case key list to be reaad from cache) is checked by importKeys -        final ArrayList<ParcelableKeyRing> keyList = data.getParcelableArrayList(IMPORT_KEY_LIST); - -        // Adding keys to the ThreadPoolExecutor takes time, we don't want to block the main thread -        Thread baseImportThread = new Thread(new Runnable() { - -            @Override -            public void run() { -                importKeys(keyList, keyServer); -            } -        }); -        baseImportThread.start(); -        return Service.START_NOT_STICKY; -    } - -    public void importKeys(ArrayList<ParcelableKeyRing> keyList, final String keyServer) { -        ParcelableFileCache<ParcelableKeyRing> cache = -                new ParcelableFileCache<>(this, "key_import.pcl"); -        int totKeys = 0; -        Iterator<ParcelableKeyRing> keyListIterator = null; -        // either keyList or cache must be null, no guarantees otherwise -        if (keyList == null) {//export from cache, copied from ImportExportOperation.importKeyRings - -            try { -                ParcelableFileCache.IteratorWithSize<ParcelableKeyRing> it = cache.readCache(); -                keyListIterator = it; -                totKeys = it.getSize(); -            } catch (IOException e) { - -                // Special treatment here, we need a lot -                OperationResult.OperationLog log = new OperationResult.OperationLog(); -                log.add(OperationResult.LogType.MSG_IMPORT, 0, 0); -                log.add(OperationResult.LogType.MSG_IMPORT_ERROR_IO, 0, 0); - -                keyImportFailed(new ImportKeyResult(ImportKeyResult.RESULT_ERROR, log)); -            } -        } else { -            keyListIterator = keyList.iterator(); -            totKeys = keyList.size(); -        } - - -        if (keyListIterator != null) { -            mKeyImportAccumulator = new KeyImportAccumulator(totKeys); -            setProgress(0, totKeys); - -            final int maxThreads = 200; -            ExecutorService importExecutor = new ThreadPoolExecutor(0, maxThreads, -                    30L, TimeUnit.SECONDS, -                    new SynchronousQueue<Runnable>()); - -            while (keyListIterator.hasNext()) { - -                final ParcelableKeyRing pkRing = keyListIterator.next(); - -                Runnable importOperationRunnable = new Runnable() { - -                    @Override -                    public void run() { -                        ImportKeyResult result = null; -                        try { -                            ImportExportOperation importExportOperation = new ImportExportOperation( -                                    CloudImportService.this, -                                    new ProviderHelper(CloudImportService.this), -                                    mKeyImportAccumulator.getImportProgressable(), -                                    mActionCancelled); - -                            ArrayList<ParcelableKeyRing> list = new ArrayList<>(); -                            list.add(pkRing); -                            result = importExportOperation.importKeyRings(list, -                                    keyServer); -                        } finally { -                            // in the off-chance that importKeyRings does something to crash the -                            // thread before it can call singleKeyRingImportCompleted, our imported -                            // key count will go wrong. This will cause the service to never die, -                            // and the progress dialog to stay displayed. The finally block was -                            // originally meant to ensure singleKeyRingImportCompleted was called, -                            // and checks for null were to be introduced, but in such a scenario, -                            // knowing an uncaught error exists in importKeyRings is more important. - -                            // if a null gets passed, something wrong is happening. We want a crash. - -                            singleKeyRingImportCompleted(result); -                        } -                    } -                }; - -                importExecutor.execute(importOperationRunnable); -            } -        } -    } - -    private synchronized void singleKeyRingImportCompleted(ImportKeyResult result) { -        // increase imported key count and accumulate log and bad, new etc. key counts from result -        mKeyImportAccumulator.accumulateKeyImport(result); - -        setProgress(mKeyImportAccumulator.getImportedKeys(), mKeyImportAccumulator.getTotalKeys()); - -        if (mKeyImportAccumulator.isImportFinished()) { -            ContactSyncAdapterService.requestSync(); - -            sendMessageToHandler(ServiceProgressHandler.MessageStatus.OKAY, -                    mKeyImportAccumulator.getConsolidatedImportKeyResult()); - -            stopSelf();//we're done here -        } -    } - -    private void keyImportFailed(ImportKeyResult result) { -        sendMessageToHandler(ServiceProgressHandler.MessageStatus.OKAY, result); -    } - -    private void sendMessageToHandler(ServiceProgressHandler.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.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); -        } -    } - -    private void sendMessageToHandler(ServiceProgressHandler.MessageStatus status, OperationResult data) { -        Bundle bundle = new Bundle(); -        bundle.putParcelable(OperationResult.EXTRA_RESULT, data); -        sendMessageToHandler(status, null, bundle); -    } - -    private void sendMessageToHandler(ServiceProgressHandler.MessageStatus status, Bundle data) { -        sendMessageToHandler(status, null, data); -    } - -    private void sendMessageToHandler(ServiceProgressHandler.MessageStatus status) { -        sendMessageToHandler(status, null, null); -    } - -    /** -     * Set progress of ProgressDialog by sending message to handler on UI thread -     */ -    @Override -    public synchronized void setProgress(String message, int progress, int max) { -        Log.d(Constants.TAG, "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(ServiceProgressHandler.MessageStatus.UPDATE_PROGRESS, null, data); -    } - -    @Override -    public synchronized void setProgress(int resourceId, int progress, int max) { -        setProgress(getString(resourceId), progress, max); -    } - -    @Override -    public synchronized void setProgress(int progress, int max) { -        setProgress(null, progress, max); -    } - -    @Override -    public synchronized void setPreventCancel() { -        sendMessageToHandler(ServiceProgressHandler.MessageStatus.PREVENT_CANCEL); -    } -} diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java deleted file mode 100644 index 5f9c98ac5..000000000 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java +++ /dev/null @@ -1,617 +0,0 @@ -/* - * Copyright (C) 2012-2014 Dominik Schürmann <dominik@dominikschuermann.de> - * Copyright (C) 2014 Vincent Breitmoser <v.breitmoser@mugenguild.com> - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program.  If not, see <http://www.gnu.org/licenses/>. - */ - -package org.sufficientlysecure.keychain.service; - -import android.app.IntentService; -import android.content.Intent; -import android.net.Uri; -import android.os.Bundle; -import android.os.Message; -import android.os.Messenger; -import android.os.RemoteException; - -import com.textuality.keybase.lib.Proof; -import com.textuality.keybase.lib.prover.Prover; - -import org.json.JSONObject; -import org.spongycastle.openpgp.PGPUtil; -import org.sufficientlysecure.keychain.Constants; -import org.sufficientlysecure.keychain.R; -import org.sufficientlysecure.keychain.keyimport.HkpKeyserver; -import org.sufficientlysecure.keychain.keyimport.Keyserver; -import org.sufficientlysecure.keychain.keyimport.ParcelableKeyRing; -import org.sufficientlysecure.keychain.operations.CertifyOperation; -import org.sufficientlysecure.keychain.operations.DeleteOperation; -import org.sufficientlysecure.keychain.operations.EditKeyOperation; -import org.sufficientlysecure.keychain.operations.ImportExportOperation; -import org.sufficientlysecure.keychain.operations.PromoteKeyOperation; -import org.sufficientlysecure.keychain.operations.SignEncryptOperation; -import org.sufficientlysecure.keychain.operations.results.CertifyResult; -import org.sufficientlysecure.keychain.operations.results.ConsolidateResult; -import org.sufficientlysecure.keychain.operations.results.DecryptVerifyResult; -import org.sufficientlysecure.keychain.operations.results.DeleteResult; -import org.sufficientlysecure.keychain.operations.results.ExportResult; -import org.sufficientlysecure.keychain.operations.results.ImportKeyResult; -import org.sufficientlysecure.keychain.operations.results.OperationResult; -import org.sufficientlysecure.keychain.operations.results.OperationResult.OperationLog; -import org.sufficientlysecure.keychain.operations.results.PromoteKeyResult; -import org.sufficientlysecure.keychain.operations.results.SignEncryptResult; -import org.sufficientlysecure.keychain.pgp.CanonicalizedPublicKeyRing; -import org.sufficientlysecure.keychain.pgp.PgpDecryptVerify; -import org.sufficientlysecure.keychain.pgp.PgpDecryptVerifyInputParcel; -import org.sufficientlysecure.keychain.pgp.Progressable; -import org.sufficientlysecure.keychain.pgp.SignEncryptParcel; -import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException; -import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralMsgIdException; -import org.sufficientlysecure.keychain.provider.ProviderHelper; -import org.sufficientlysecure.keychain.service.input.CryptoInputParcel; -import org.sufficientlysecure.keychain.service.ServiceProgressHandler.MessageStatus; -import org.sufficientlysecure.keychain.util.Log; -import org.sufficientlysecure.keychain.util.ParcelableFileCache; - -import java.io.ByteArrayInputStream; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.atomic.AtomicBoolean; - -import de.measite.minidns.Client; -import de.measite.minidns.DNSMessage; -import de.measite.minidns.Question; -import de.measite.minidns.Record; -import de.measite.minidns.record.Data; -import de.measite.minidns.record.TXT; - -/** - * This Service contains all important long lasting operations for OpenKeychain. It receives Intents with - * data from the activities or other apps, queues these intents, executes them, and stops itself - * after doing them. - */ -public class KeychainIntentService extends IntentService implements Progressable { - -    /* extras that can be given by intent */ -    public static final String EXTRA_MESSENGER = "messenger"; -    public static final String EXTRA_DATA = "data"; - -    /* possible actions */ -    public static final String ACTION_SIGN_ENCRYPT = Constants.INTENT_PREFIX + "SIGN_ENCRYPT"; - -    public static final String ACTION_DECRYPT_VERIFY = Constants.INTENT_PREFIX + "DECRYPT_VERIFY"; - -    public static final String ACTION_VERIFY_KEYBASE_PROOF = Constants.INTENT_PREFIX + "VERIFY_KEYBASE_PROOF"; - -    public static final String ACTION_DECRYPT_METADATA = Constants.INTENT_PREFIX + "DECRYPT_METADATA"; - -    public static final String ACTION_EDIT_KEYRING = Constants.INTENT_PREFIX + "EDIT_KEYRING"; - -    public static final String ACTION_PROMOTE_KEYRING = Constants.INTENT_PREFIX + "PROMOTE_KEYRING"; - -    public static final String ACTION_IMPORT_KEYRING = Constants.INTENT_PREFIX + "IMPORT_KEYRING"; -    public static final String ACTION_EXPORT_KEYRING = Constants.INTENT_PREFIX + "EXPORT_KEYRING"; - -    public static final String ACTION_UPLOAD_KEYRING = Constants.INTENT_PREFIX + "UPLOAD_KEYRING"; - -    public static final String ACTION_CERTIFY_KEYRING = Constants.INTENT_PREFIX + "SIGN_KEYRING"; - -    public static final String ACTION_DELETE = Constants.INTENT_PREFIX + "DELETE"; - -    public static final String ACTION_CONSOLIDATE = Constants.INTENT_PREFIX + "CONSOLIDATE"; - -    public static final String ACTION_CANCEL = Constants.INTENT_PREFIX + "CANCEL"; - -    /* keys for data bundle */ - -    // encrypt -    public static final String ENCRYPT_DECRYPT_INPUT_URI = "input_uri"; -    public static final String ENCRYPT_DECRYPT_OUTPUT_URI = "output_uri"; -    public static final String SIGN_ENCRYPT_PARCEL = "sign_encrypt_parcel"; - -    // decrypt/verify -    public static final String DECRYPT_VERIFY_PARCEL = "decrypt_verify_parcel"; - -    // keybase proof -    public static final String KEYBASE_REQUIRED_FINGERPRINT = "keybase_required_fingerprint"; -    public static final String KEYBASE_PROOF = "keybase_proof"; - -    // save keyring -    public static final String EDIT_KEYRING_PARCEL = "save_parcel"; -    public static final String EDIT_KEYRING_PASSPHRASE = "passphrase"; -    public static final String EXTRA_CRYPTO_INPUT = "crypto_input"; - -    // delete keyring(s) -    public static final String DELETE_KEY_LIST = "delete_list"; -    public static final String DELETE_IS_SECRET = "delete_is_secret"; - -    // import key -    public static final String IMPORT_KEY_LIST = "import_key_list"; -    public static final String IMPORT_KEY_SERVER = "import_key_server"; - -    // export key -    public static final String EXPORT_FILENAME = "export_filename"; -    public static final String EXPORT_URI = "export_uri"; -    public static final String EXPORT_SECRET = "export_secret"; -    public static final String EXPORT_ALL = "export_all"; -    public static final String EXPORT_KEY_RING_MASTER_KEY_ID = "export_key_ring_id"; - -    // upload key -    public static final String UPLOAD_KEY_SERVER = "upload_key_server"; - -    // certify key -    public static final String CERTIFY_PARCEL = "certify_parcel"; - -    // promote key -    public static final String PROMOTE_MASTER_KEY_ID = "promote_master_key_id"; -    public static final String PROMOTE_CARD_AID = "promote_card_aid"; -    public static final String PROMOTE_SUBKEY_IDS = "promote_fingerprints"; - -    // consolidate -    public static final String CONSOLIDATE_RECOVERY = "consolidate_recovery"; - -    Messenger mMessenger; - -    // this attribute can possibly merged with the one above? not sure... -    private AtomicBoolean mActionCanceled = new AtomicBoolean(false); - -    public KeychainIntentService() { -        super("KeychainIntentService"); -    } - -    /** -     * 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 -     * appropriate. -     */ -    @Override -    protected void onHandleIntent(Intent intent) { - -        // We have not been cancelled! (yet) -        mActionCanceled.set(false); - -        Bundle extras = intent.getExtras(); -        if (extras == null) { -            Log.e(Constants.TAG, "Extras bundle is null!"); -            return; -        } - -        if (!(extras.containsKey(EXTRA_MESSENGER) || extras.containsKey(EXTRA_DATA) || (intent -                .getAction() == null))) { -            Log.e(Constants.TAG, -                    "Extra bundle must contain a messenger, a data bundle, and an action!"); -            return; -        } - -        Uri dataUri = intent.getData(); - -        mMessenger = (Messenger) extras.get(EXTRA_MESSENGER); -        Bundle data = extras.getBundle(EXTRA_DATA); -        if (data == null) { -            Log.e(Constants.TAG, "data extra is null!"); -            return; -        } - -        Log.logDebugBundle(data, "EXTRA_DATA"); - -        ProviderHelper providerHelper = new ProviderHelper(this); - -        String action = intent.getAction(); - -        // executeServiceMethod action from extra bundle -        switch (action) { -            case ACTION_CERTIFY_KEYRING: { - -                // Input -                CertifyActionsParcel parcel = data.getParcelable(CERTIFY_PARCEL); -                CryptoInputParcel cryptoInput = data.getParcelable(EXTRA_CRYPTO_INPUT); -                String keyServerUri = data.getString(UPLOAD_KEY_SERVER); - -                // Operation -                CertifyOperation op = new CertifyOperation(this, providerHelper, this, mActionCanceled); -                CertifyResult result = op.certify(parcel, cryptoInput, keyServerUri); - -                // Result -                sendMessageToHandler(MessageStatus.OKAY, result); - -                break; -            } -            case ACTION_CONSOLIDATE: { - -                // Operation -                ConsolidateResult result; -                if (data.containsKey(CONSOLIDATE_RECOVERY) && data.getBoolean(CONSOLIDATE_RECOVERY)) { -                    result = new ProviderHelper(this).consolidateDatabaseStep2(this); -                } else { -                    result = new ProviderHelper(this).consolidateDatabaseStep1(this); -                } - -                // Result -                sendMessageToHandler(MessageStatus.OKAY, result); - -                break; -            } -            case ACTION_DECRYPT_METADATA: { - -                /* Input */ -                CryptoInputParcel cryptoInput = data.getParcelable(EXTRA_CRYPTO_INPUT); -                PgpDecryptVerifyInputParcel input = data.getParcelable(DECRYPT_VERIFY_PARCEL); - -                // this action is here for compatibility only -                input.setDecryptMetadataOnly(true); - -                /* Operation */ -                PgpDecryptVerify op = new PgpDecryptVerify(this, new ProviderHelper(this), this); -                DecryptVerifyResult decryptVerifyResult = op.execute(input, cryptoInput); - -                /* Result */ -                sendMessageToHandler(MessageStatus.OKAY, decryptVerifyResult); - -                break; -            } -            case ACTION_VERIFY_KEYBASE_PROOF: { - -                try { -                    Proof proof = new Proof(new JSONObject(data.getString(KEYBASE_PROOF))); -                    setProgress(R.string.keybase_message_fetching_data, 0, 100); - -                    Prover prover = Prover.findProverFor(proof); - -                    if (prover == null) { -                        sendProofError(getString(R.string.keybase_no_prover_found) + ": " + proof.getPrettyName()); -                        return; -                    } - -                    if (!prover.fetchProofData()) { -                        sendProofError(prover.getLog(), getString(R.string.keybase_problem_fetching_evidence)); -                        return; -                    } -                    String requiredFingerprint = data.getString(KEYBASE_REQUIRED_FINGERPRINT); -                    if (!prover.checkFingerprint(requiredFingerprint)) { -                        sendProofError(getString(R.string.keybase_key_mismatch)); -                        return; -                    } - -                    String domain = prover.dnsTxtCheckRequired(); -                    if (domain != null) { -                        DNSMessage dnsQuery = new Client().query(new Question(domain, Record.TYPE.TXT)); -                        if (dnsQuery == null) { -                            sendProofError(prover.getLog(), getString(R.string.keybase_dns_query_failure)); -                            return; -                        } -                        Record[] records = dnsQuery.getAnswers(); -                        List<List<byte[]>> extents = new ArrayList<List<byte[]>>(); -                        for (Record r : records) { -                            Data d = r.getPayload(); -                            if (d instanceof TXT) { -                                extents.add(((TXT) d).getExtents()); -                            } -                        } -                        if (!prover.checkDnsTxt(extents)) { -                            sendProofError(prover.getLog(), null); -                            return; -                        } -                    } - -                    byte[] messageBytes = prover.getPgpMessage().getBytes(); -                    if (prover.rawMessageCheckRequired()) { -                        InputStream messageByteStream = PGPUtil.getDecoderStream(new ByteArrayInputStream(messageBytes)); -                        if (!prover.checkRawMessageBytes(messageByteStream)) { -                            sendProofError(prover.getLog(), null); -                            return; -                        } -                    } - -                    PgpDecryptVerify op = new PgpDecryptVerify(this, new ProviderHelper(this), this); - -                    PgpDecryptVerifyInputParcel input = new PgpDecryptVerifyInputParcel(messageBytes) -                            .setSignedLiteralData(true) -                            .setRequiredSignerFingerprint(requiredFingerprint); - -                    DecryptVerifyResult decryptVerifyResult = op.execute(input, new CryptoInputParcel()); - -                    if (!decryptVerifyResult.success()) { -                        OperationLog log = decryptVerifyResult.getLog(); -                        OperationResult.LogEntryParcel lastEntry = null; -                        for (OperationResult.LogEntryParcel entry : log) { -                            lastEntry = entry; -                        } -                        sendProofError(getString(lastEntry.mType.getMsgId())); -                        return; -                    } - -                    if (!prover.validate(new String(decryptVerifyResult.getOutputBytes()))) { -                        sendProofError(getString(R.string.keybase_message_payload_mismatch)); -                        return; -                    } - -                    Bundle resultData = new Bundle(); -                    resultData.putString(ServiceProgressHandler.DATA_MESSAGE, "OK"); - -                    // these help the handler construct a useful human-readable message -                    resultData.putString(ServiceProgressHandler.KEYBASE_PROOF_URL, prover.getProofUrl()); -                    resultData.putString(ServiceProgressHandler.KEYBASE_PRESENCE_URL, prover.getPresenceUrl()); -                    resultData.putString(ServiceProgressHandler.KEYBASE_PRESENCE_LABEL, prover.getPresenceLabel()); -                    sendMessageToHandler(MessageStatus.OKAY, resultData); -                } catch (Exception e) { -                    sendErrorToHandler(e); -                } - -                break; -            } -            case ACTION_DECRYPT_VERIFY: { - -                /* Input */ -                CryptoInputParcel cryptoInput = data.getParcelable(EXTRA_CRYPTO_INPUT); -                PgpDecryptVerifyInputParcel input = data.getParcelable(DECRYPT_VERIFY_PARCEL); - -                // for compatibility -                // TODO merge with ACTION_DECRYPT_METADATA -                input.setDecryptMetadataOnly(false); - -                /* Operation */ -                PgpDecryptVerify op = new PgpDecryptVerify(this, new ProviderHelper(this), this); -                DecryptVerifyResult decryptVerifyResult = op.execute(input, cryptoInput); - -                /* Output */ -                sendMessageToHandler(MessageStatus.OKAY, decryptVerifyResult); - -                break; -            } -            case ACTION_DELETE: { - -                // Input -                long[] masterKeyIds = data.getLongArray(DELETE_KEY_LIST); -                boolean isSecret = data.getBoolean(DELETE_IS_SECRET); - -                // Operation -                DeleteOperation op = new DeleteOperation(this, new ProviderHelper(this), this); -                DeleteResult result = op.execute(masterKeyIds, isSecret); - -                // Result -                sendMessageToHandler(MessageStatus.OKAY, result); - -                break; -            } -            case ACTION_EDIT_KEYRING: { - -                // Input -                SaveKeyringParcel saveParcel = data.getParcelable(EDIT_KEYRING_PARCEL); -                CryptoInputParcel cryptoInput = data.getParcelable(EXTRA_CRYPTO_INPUT); - -                // Operation -                EditKeyOperation op = new EditKeyOperation(this, providerHelper, this, mActionCanceled); -                OperationResult result = op.execute(saveParcel, cryptoInput); - -                // Result -                sendMessageToHandler(MessageStatus.OKAY, result); - -                break; -            } -            case ACTION_PROMOTE_KEYRING: { - -                // Input -                long keyRingId = data.getLong(PROMOTE_MASTER_KEY_ID); -                byte[] cardAid = data.getByteArray(PROMOTE_CARD_AID); -                long[] subKeyIds = data.getLongArray(PROMOTE_SUBKEY_IDS); - -                // Operation -                PromoteKeyOperation op = new PromoteKeyOperation( -                        this, providerHelper, this, mActionCanceled); -                PromoteKeyResult result = op.execute(keyRingId, cardAid, subKeyIds); - -                // Result -                sendMessageToHandler(MessageStatus.OKAY, result); - -                break; -            } -            case ACTION_EXPORT_KEYRING: { - -                // Input -                boolean exportSecret = data.getBoolean(EXPORT_SECRET, false); -                String outputFile = data.getString(EXPORT_FILENAME); -                Uri outputUri = data.getParcelable(EXPORT_URI); - -                boolean exportAll = data.getBoolean(EXPORT_ALL); -                long[] masterKeyIds = exportAll ? null : data.getLongArray(EXPORT_KEY_RING_MASTER_KEY_ID); - -                // Operation -                ImportExportOperation importExportOperation = new ImportExportOperation(this, new ProviderHelper(this), this); -                ExportResult result; -                if (outputFile != null) { -                    result = importExportOperation.exportToFile(masterKeyIds, exportSecret, outputFile); -                } else { -                    result = importExportOperation.exportToUri(masterKeyIds, exportSecret, outputUri); -                } - -                // Result -                sendMessageToHandler(MessageStatus.OKAY, result); - -                break; -            } -            case ACTION_IMPORT_KEYRING: { - -                // Input -                String keyServer = data.getString(IMPORT_KEY_SERVER); -                ArrayList<ParcelableKeyRing> list = data.getParcelableArrayList(IMPORT_KEY_LIST); -                ParcelableFileCache<ParcelableKeyRing> cache = -                        new ParcelableFileCache<>(this, "key_import.pcl"); - -                // Operation -                ImportExportOperation importExportOperation = new ImportExportOperation( -                        this, providerHelper, this, mActionCanceled); -                // Either list or cache must be null, no guarantees otherwise. -                ImportKeyResult result = list != null -                        ? importExportOperation.importKeyRings(list, keyServer) -                        : importExportOperation.importKeyRings(cache, keyServer); - -                // Result -                sendMessageToHandler(MessageStatus.OKAY, result); - -                break; - -            } -            case ACTION_SIGN_ENCRYPT: { - -                // Input -                SignEncryptParcel inputParcel = data.getParcelable(SIGN_ENCRYPT_PARCEL); -                CryptoInputParcel cryptoInput = data.getParcelable(EXTRA_CRYPTO_INPUT); - -                // Operation -                SignEncryptOperation op = new SignEncryptOperation( -                        this, new ProviderHelper(this), this, mActionCanceled); -                SignEncryptResult result = op.execute(inputParcel, cryptoInput); - -                // Result -                sendMessageToHandler(MessageStatus.OKAY, result); - -                break; -            } -            case ACTION_UPLOAD_KEYRING: { -                try { - -                    /* Input */ -                    String keyServer = data.getString(UPLOAD_KEY_SERVER); -                    // and dataUri! - -                    /* Operation */ -                    HkpKeyserver server = new HkpKeyserver(keyServer); - -                    CanonicalizedPublicKeyRing keyring = providerHelper.getCanonicalizedPublicKeyRing(dataUri); -                    ImportExportOperation importExportOperation = new ImportExportOperation(this, new ProviderHelper(this), this); - -                    try { -                        importExportOperation.uploadKeyRingToServer(server, keyring); -                    } catch (Keyserver.AddKeyException e) { -                        throw new PgpGeneralException("Unable to export key to selected server"); -                    } - -                    sendMessageToHandler(MessageStatus.OKAY); -                } catch (Exception e) { -                    sendErrorToHandler(e); -                } -                break; -            } -        } -    } - -    private void sendProofError(List<String> log, String label) { -        String msg = null; -        label = (label == null) ? "" : label + ": "; -        for (String m : log) { -            Log.e(Constants.TAG, label + m); -            msg = m; -        } -        sendProofError(label + msg); -    } - -    private void sendProofError(String msg) { -        Bundle bundle = new Bundle(); -        bundle.putString(ServiceProgressHandler.DATA_ERROR, msg); -        sendMessageToHandler(MessageStatus.OKAY, bundle); -    } - -    private void sendErrorToHandler(Exception e) { -        // TODO: Implement a better exception handling here -        // contextualize the exception, if necessary -        String message; -        if (e instanceof PgpGeneralMsgIdException) { -            e = ((PgpGeneralMsgIdException) e).getContextualized(this); -            message = e.getMessage(); -        } else { -            message = e.getMessage(); -        } -        Log.d(Constants.TAG, "KeychainIntentService Exception: ", e); - -        Bundle data = new Bundle(); -        data.putString(ServiceProgressHandler.DATA_ERROR, message); -        sendMessageToHandler(MessageStatus.EXCEPTION, null, data); -    } - -    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.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); -        } -    } - -    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, Bundle data) { -        sendMessageToHandler(status, null, data); -    } - -    private void sendMessageToHandler(MessageStatus status) { -        sendMessageToHandler(status, null, null); -    } - -    /** -     * Set progress of ProgressDialog by sending message to handler on UI thread -     */ -    public void setProgress(String message, int progress, int max) { -        Log.d(Constants.TAG, "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); -    } - -    public void setProgress(int resourceId, int progress, int max) { -        setProgress(getString(resourceId), progress, max); -    } - -    public void setProgress(int progress, int max) { -        setProgress(null, progress, max); -    } - -    @Override -    public void setPreventCancel() { -        sendMessageToHandler(MessageStatus.PREVENT_CANCEL); -    } - -    @Override -    public int onStartCommand(Intent intent, int flags, int startId) { -        if (ACTION_CANCEL.equals(intent.getAction())) { -            mActionCanceled.set(true); -            return START_NOT_STICKY; -        } -        return super.onStartCommand(intent, flags, startId); -    } -} diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainService.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainService.java new file mode 100644 index 000000000..41b4b3fba --- /dev/null +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainService.java @@ -0,0 +1,865 @@ +/* + * Copyright (C) 2012-2014 Dominik Schürmann <dominik@dominikschuermann.de> + * Copyright (C) 2014 Vincent Breitmoser <v.breitmoser@mugenguild.com> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program.  If not, see <http://www.gnu.org/licenses/>. + */ + +package org.sufficientlysecure.keychain.service; + +import android.app.Service; +import android.content.Intent; +import android.net.Uri; +import android.os.Bundle; +import android.os.IBinder; +import android.os.Message; +import android.os.Messenger; +import android.os.RemoteException; + +import com.textuality.keybase.lib.Proof; +import com.textuality.keybase.lib.prover.Prover; + +import org.json.JSONObject; +import org.spongycastle.openpgp.PGPUtil; +import org.sufficientlysecure.keychain.Constants; +import org.sufficientlysecure.keychain.R; +import org.sufficientlysecure.keychain.keyimport.HkpKeyserver; +import org.sufficientlysecure.keychain.keyimport.Keyserver; +import org.sufficientlysecure.keychain.keyimport.ParcelableKeyRing; +import org.sufficientlysecure.keychain.operations.CertifyOperation; +import org.sufficientlysecure.keychain.operations.DeleteOperation; +import org.sufficientlysecure.keychain.operations.EditKeyOperation; +import org.sufficientlysecure.keychain.operations.ImportExportOperation; +import org.sufficientlysecure.keychain.operations.PromoteKeyOperation; +import org.sufficientlysecure.keychain.operations.SignEncryptOperation; +import org.sufficientlysecure.keychain.operations.results.CertifyResult; +import org.sufficientlysecure.keychain.operations.results.ConsolidateResult; +import org.sufficientlysecure.keychain.operations.results.DecryptVerifyResult; +import org.sufficientlysecure.keychain.operations.results.DeleteResult; +import org.sufficientlysecure.keychain.operations.results.ExportResult; +import org.sufficientlysecure.keychain.operations.results.ImportKeyResult; +import org.sufficientlysecure.keychain.operations.results.OperationResult; +import org.sufficientlysecure.keychain.operations.results.OperationResult.OperationLog; +import org.sufficientlysecure.keychain.operations.results.PromoteKeyResult; +import org.sufficientlysecure.keychain.operations.results.SignEncryptResult; +import org.sufficientlysecure.keychain.pgp.CanonicalizedPublicKeyRing; +import org.sufficientlysecure.keychain.pgp.PgpDecryptVerify; +import org.sufficientlysecure.keychain.pgp.PgpDecryptVerifyInputParcel; +import org.sufficientlysecure.keychain.pgp.Progressable; +import org.sufficientlysecure.keychain.pgp.SignEncryptParcel; +import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException; +import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralMsgIdException; +import org.sufficientlysecure.keychain.provider.ProviderHelper; +import org.sufficientlysecure.keychain.service.input.CryptoInputParcel; +import org.sufficientlysecure.keychain.service.ServiceProgressHandler.MessageStatus; +import org.sufficientlysecure.keychain.util.Log; +import org.sufficientlysecure.keychain.util.ParcelableFileCache; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.SynchronousQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; + +import de.measite.minidns.Client; +import de.measite.minidns.DNSMessage; +import de.measite.minidns.Question; +import de.measite.minidns.Record; +import de.measite.minidns.record.Data; +import de.measite.minidns.record.TXT; + +/** + * This Service contains all important long lasting operations for OpenKeychain. It receives Intents with + * data from the activities or other apps, executes them, and stops itself after doing them. + */ +public class KeychainService extends Service implements Progressable { + +    /* extras that can be given by intent */ +    public static final String EXTRA_MESSENGER = "messenger"; +    public static final String EXTRA_DATA = "data"; + +    /* possible actions */ +    public static final String ACTION_SIGN_ENCRYPT = Constants.INTENT_PREFIX + "SIGN_ENCRYPT"; + +    public static final String ACTION_DECRYPT_VERIFY = Constants.INTENT_PREFIX + "DECRYPT_VERIFY"; + +    public static final String ACTION_VERIFY_KEYBASE_PROOF = Constants.INTENT_PREFIX + "VERIFY_KEYBASE_PROOF"; + +    public static final String ACTION_DECRYPT_METADATA = Constants.INTENT_PREFIX + "DECRYPT_METADATA"; + +    public static final String ACTION_EDIT_KEYRING = Constants.INTENT_PREFIX + "EDIT_KEYRING"; + +    public static final String ACTION_PROMOTE_KEYRING = Constants.INTENT_PREFIX + "PROMOTE_KEYRING"; + +    public static final String ACTION_IMPORT_KEYRING = Constants.INTENT_PREFIX + "IMPORT_KEYRING"; +    public static final String ACTION_EXPORT_KEYRING = Constants.INTENT_PREFIX + "EXPORT_KEYRING"; + +    public static final String ACTION_UPLOAD_KEYRING = Constants.INTENT_PREFIX + "UPLOAD_KEYRING"; + +    public static final String ACTION_CERTIFY_KEYRING = Constants.INTENT_PREFIX + "SIGN_KEYRING"; + +    public static final String ACTION_DELETE = Constants.INTENT_PREFIX + "DELETE"; + +    public static final String ACTION_CONSOLIDATE = Constants.INTENT_PREFIX + "CONSOLIDATE"; + +    public static final String ACTION_CANCEL = Constants.INTENT_PREFIX + "CANCEL"; + +    /* keys for data bundle */ + +    // encrypt +    public static final String ENCRYPT_DECRYPT_INPUT_URI = "input_uri"; +    public static final String ENCRYPT_DECRYPT_OUTPUT_URI = "output_uri"; +    public static final String SIGN_ENCRYPT_PARCEL = "sign_encrypt_parcel"; + +    // decrypt/verify +    public static final String DECRYPT_VERIFY_PARCEL = "decrypt_verify_parcel"; + +    // keybase proof +    public static final String KEYBASE_REQUIRED_FINGERPRINT = "keybase_required_fingerprint"; +    public static final String KEYBASE_PROOF = "keybase_proof"; + +    // save keyring +    public static final String EDIT_KEYRING_PARCEL = "save_parcel"; +    public static final String EDIT_KEYRING_PASSPHRASE = "passphrase"; +    public static final String EXTRA_CRYPTO_INPUT = "crypto_input"; + +    // delete keyring(s) +    public static final String DELETE_KEY_LIST = "delete_list"; +    public static final String DELETE_IS_SECRET = "delete_is_secret"; + +    // import key +    public static final String IMPORT_KEY_LIST = "import_key_list"; +    public static final String IMPORT_KEY_SERVER = "import_key_server"; + +    // export key +    public static final String EXPORT_FILENAME = "export_filename"; +    public static final String EXPORT_URI = "export_uri"; +    public static final String EXPORT_SECRET = "export_secret"; +    public static final String EXPORT_ALL = "export_all"; +    public static final String EXPORT_KEY_RING_MASTER_KEY_ID = "export_key_ring_id"; + +    // upload key +    public static final String UPLOAD_KEY_SERVER = "upload_key_server"; + +    // certify key +    public static final String CERTIFY_PARCEL = "certify_parcel"; + +    // promote key +    public static final String PROMOTE_MASTER_KEY_ID = "promote_master_key_id"; +    public static final String PROMOTE_CARD_AID = "promote_card_aid"; +    public static final String PROMOTE_SUBKEY_IDS = "promote_fingerprints"; + +    // consolidate +    public static final String CONSOLIDATE_RECOVERY = "consolidate_recovery"; + +    Messenger mMessenger; + +    // this attribute can possibly merged with the one above? not sure... +    private AtomicBoolean mActionCanceled = new AtomicBoolean(false); + + +    private KeyImportAccumulator mKeyImportAccumulator; + +    private KeychainService mKeychainService; + +    @Override +    public IBinder onBind(Intent intent) { +        return null; +    } + +    /** +     * 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) { +        mKeychainService = this; + +        if (ACTION_CANCEL.equals(intent.getAction())) { +            mActionCanceled.set(true); +            return START_NOT_STICKY; +        } + +        Runnable actionRunnable = new Runnable() { +            @Override +            public void run() { +                // We have not been cancelled! (yet) +                mActionCanceled.set(false); + +                Bundle extras = intent.getExtras(); +                if (extras == null) { +                    Log.e(Constants.TAG, "Extras bundle is null!"); +                    return; +                } + +                if (!(extras.containsKey(EXTRA_MESSENGER) || extras.containsKey(EXTRA_DATA) || (intent +                        .getAction() == null))) { +                    Log.e(Constants.TAG, +                            "Extra bundle must contain a messenger, a data bundle, and an action!"); +                    return; +                } + +                Uri dataUri = intent.getData(); + +                mMessenger = (Messenger) extras.get(EXTRA_MESSENGER); +                Bundle data = extras.getBundle(EXTRA_DATA); +                if (data == null) { +                    Log.e(Constants.TAG, "data extra is null!"); +                    return; +                } + +                Log.logDebugBundle(data, "EXTRA_DATA"); + +                ProviderHelper providerHelper = new ProviderHelper(mKeychainService); + +                String action = intent.getAction(); + +                // executeServiceMethod action from extra bundle +                switch (action) { +                    case ACTION_CERTIFY_KEYRING: { + +                        // Input +                        CertifyActionsParcel parcel = data.getParcelable(CERTIFY_PARCEL); +                        CryptoInputParcel cryptoInput = data.getParcelable(EXTRA_CRYPTO_INPUT); +                        String keyServerUri = data.getString(UPLOAD_KEY_SERVER); + +                        // Operation +                        CertifyOperation op = new CertifyOperation(mKeychainService, providerHelper, mKeychainService, +                                mActionCanceled); +                        CertifyResult result = op.certify(parcel, cryptoInput, keyServerUri); + +                        // Result +                        sendMessageToHandler(MessageStatus.OKAY, result); + +                        break; +                    } +                    case ACTION_CONSOLIDATE: { + +                        // Operation +                        ConsolidateResult result; +                        if (data.containsKey(CONSOLIDATE_RECOVERY) && data.getBoolean(CONSOLIDATE_RECOVERY)) { +                            result = providerHelper.consolidateDatabaseStep2(mKeychainService); +                        } else { +                            result = providerHelper.consolidateDatabaseStep1(mKeychainService); +                        } + +                        // Result +                        sendMessageToHandler(MessageStatus.OKAY, result); + +                        break; +                    } +                    case ACTION_DECRYPT_METADATA: { + +                /* Input */ +                        CryptoInputParcel cryptoInput = data.getParcelable(EXTRA_CRYPTO_INPUT); +                        PgpDecryptVerifyInputParcel input = data.getParcelable(DECRYPT_VERIFY_PARCEL); + +                        // this action is here for compatibility only +                        input.setDecryptMetadataOnly(true); + +                /* Operation */ +                        PgpDecryptVerify op = new PgpDecryptVerify(mKeychainService, providerHelper, mKeychainService); +                        DecryptVerifyResult decryptVerifyResult = op.execute(input, cryptoInput); + +                /* Result */ +                        sendMessageToHandler(MessageStatus.OKAY, decryptVerifyResult); + +                        break; +                    } +                    case ACTION_VERIFY_KEYBASE_PROOF: { + +                        try { +                            Proof proof = new Proof(new JSONObject(data.getString(KEYBASE_PROOF))); +                            setProgress(R.string.keybase_message_fetching_data, 0, 100); + +                            Prover prover = Prover.findProverFor(proof); + +                            if (prover == null) { +                                sendProofError(getString(R.string.keybase_no_prover_found) + ": " + proof +                                        .getPrettyName()); +                                return; +                            } + +                            if (!prover.fetchProofData()) { +                                sendProofError(prover.getLog(), getString(R.string.keybase_problem_fetching_evidence)); +                                return; +                            } +                            String requiredFingerprint = data.getString(KEYBASE_REQUIRED_FINGERPRINT); +                            if (!prover.checkFingerprint(requiredFingerprint)) { +                                sendProofError(getString(R.string.keybase_key_mismatch)); +                                return; +                            } + +                            String domain = prover.dnsTxtCheckRequired(); +                            if (domain != null) { +                                DNSMessage dnsQuery = new Client().query(new Question(domain, Record.TYPE.TXT)); +                                if (dnsQuery == null) { +                                    sendProofError(prover.getLog(), getString(R.string.keybase_dns_query_failure)); +                                    return; +                                } +                                Record[] records = dnsQuery.getAnswers(); +                                List<List<byte[]>> extents = new ArrayList<List<byte[]>>(); +                                for (Record r : records) { +                                    Data d = r.getPayload(); +                                    if (d instanceof TXT) { +                                        extents.add(((TXT) d).getExtents()); +                                    } +                                } +                                if (!prover.checkDnsTxt(extents)) { +                                    sendProofError(prover.getLog(), null); +                                    return; +                                } +                            } + +                            byte[] messageBytes = prover.getPgpMessage().getBytes(); +                            if (prover.rawMessageCheckRequired()) { +                                InputStream messageByteStream = PGPUtil.getDecoderStream(new ByteArrayInputStream +                                        (messageBytes)); +                                if (!prover.checkRawMessageBytes(messageByteStream)) { +                                    sendProofError(prover.getLog(), null); +                                    return; +                                } +                            } + +                            PgpDecryptVerify op = new PgpDecryptVerify(mKeychainService, providerHelper, +                                    mKeychainService); + +                            PgpDecryptVerifyInputParcel input = new PgpDecryptVerifyInputParcel(messageBytes) +                                    .setSignedLiteralData(true) +                                    .setRequiredSignerFingerprint(requiredFingerprint); + +                            DecryptVerifyResult decryptVerifyResult = op.execute(input, new CryptoInputParcel()); + +                            if (!decryptVerifyResult.success()) { +                                OperationLog log = decryptVerifyResult.getLog(); +                                OperationResult.LogEntryParcel lastEntry = null; +                                for (OperationResult.LogEntryParcel entry : log) { +                                    lastEntry = entry; +                                } +                                sendProofError(getString(lastEntry.mType.getMsgId())); +                                return; +                            } + +                            if (!prover.validate(new String(decryptVerifyResult.getOutputBytes()))) { +                                sendProofError(getString(R.string.keybase_message_payload_mismatch)); +                                return; +                            } + +                            Bundle resultData = new Bundle(); +                            resultData.putString(ServiceProgressHandler.DATA_MESSAGE, "OK"); + +                            // these help the handler construct a useful human-readable message +                            resultData.putString(ServiceProgressHandler.KEYBASE_PROOF_URL, prover.getProofUrl()); +                            resultData.putString(ServiceProgressHandler.KEYBASE_PRESENCE_URL, prover.getPresenceUrl()); +                            resultData.putString(ServiceProgressHandler.KEYBASE_PRESENCE_LABEL, prover +                                    .getPresenceLabel()); +                            sendMessageToHandler(MessageStatus.OKAY, resultData); +                        } catch (Exception e) { +                            sendErrorToHandler(e); +                        } + +                        break; +                    } +                    case ACTION_DECRYPT_VERIFY: { + +                /* Input */ +                        CryptoInputParcel cryptoInput = data.getParcelable(EXTRA_CRYPTO_INPUT); +                        PgpDecryptVerifyInputParcel input = data.getParcelable(DECRYPT_VERIFY_PARCEL); + +                        // for compatibility +                        // TODO merge with ACTION_DECRYPT_METADATA +                        input.setDecryptMetadataOnly(false); + +                /* Operation */ +                        PgpDecryptVerify op = new PgpDecryptVerify(mKeychainService, providerHelper, mKeychainService); +                        DecryptVerifyResult decryptVerifyResult = op.execute(input, cryptoInput); + +                /* Output */ +                        sendMessageToHandler(MessageStatus.OKAY, decryptVerifyResult); + +                        break; +                    } +                    case ACTION_DELETE: { + +                        // Input +                        long[] masterKeyIds = data.getLongArray(DELETE_KEY_LIST); +                        boolean isSecret = data.getBoolean(DELETE_IS_SECRET); + +                        // Operation +                        DeleteOperation op = new DeleteOperation(mKeychainService, providerHelper, mKeychainService); +                        DeleteResult result = op.execute(masterKeyIds, isSecret); + +                        // Result +                        sendMessageToHandler(MessageStatus.OKAY, result); + +                        break; +                    } +                    case ACTION_EDIT_KEYRING: { + +                        // Input +                        SaveKeyringParcel saveParcel = data.getParcelable(EDIT_KEYRING_PARCEL); +                        CryptoInputParcel cryptoInput = data.getParcelable(EXTRA_CRYPTO_INPUT); + +                        // Operation +                        EditKeyOperation op = new EditKeyOperation(mKeychainService, providerHelper, +                                mKeychainService, mActionCanceled); +                        OperationResult result = op.execute(saveParcel, cryptoInput); + +                        // Result +                        sendMessageToHandler(MessageStatus.OKAY, result); + +                        break; +                    } +                    case ACTION_PROMOTE_KEYRING: { + +                        // Input +                        long keyRingId = data.getLong(PROMOTE_MASTER_KEY_ID); +                        byte[] cardAid = data.getByteArray(PROMOTE_CARD_AID); +                        long[] subKeyIds = data.getLongArray(PROMOTE_SUBKEY_IDS); + +                        // Operation +                        PromoteKeyOperation op = new PromoteKeyOperation( +                                mKeychainService, providerHelper, mKeychainService, +                                mActionCanceled); +                        PromoteKeyResult result = op.execute(keyRingId, cardAid, subKeyIds); + +                        // Result +                        sendMessageToHandler(MessageStatus.OKAY, result); + +                        break; +                    } +                    case ACTION_EXPORT_KEYRING: { + +                        // Input +                        boolean exportSecret = data.getBoolean(EXPORT_SECRET, false); +                        String outputFile = data.getString(EXPORT_FILENAME); +                        Uri outputUri = data.getParcelable(EXPORT_URI); + +                        boolean exportAll = data.getBoolean(EXPORT_ALL); +                        long[] masterKeyIds = exportAll ? null : data.getLongArray(EXPORT_KEY_RING_MASTER_KEY_ID); + +                        // Operation +                        ImportExportOperation importExportOperation = new ImportExportOperation( +                                mKeychainService, providerHelper, mKeychainService); +                        ExportResult result; +                        if (outputFile != null) { +                            result = importExportOperation.exportToFile(masterKeyIds, exportSecret, outputFile); +                        } else { +                            result = importExportOperation.exportToUri(masterKeyIds, exportSecret, outputUri); +                        } + +                        // Result +                        sendMessageToHandler(MessageStatus.OKAY, result); + +                        break; +                    } +                    case ACTION_IMPORT_KEYRING: { + +                        // Input +                        String keyServer = data.getString(IMPORT_KEY_SERVER); +                        ArrayList<ParcelableKeyRing> keyList = data.getParcelableArrayList(IMPORT_KEY_LIST); + +                        // either keyList or cache must be null, no guarantees otherwise +                        if (keyList == null) {// import from file, do serially +                            serialKeyImport(null, keyServer, providerHelper); +                        } else { +                            // if there is more than one key with the same fingerprint, we do a serial import to prevent +                            // https://github.com/open-keychain/open-keychain/issues/1221 +                            HashSet<String> keyFingerprintSet = new HashSet<>(); +                            for (int i = 0; i < keyList.size(); i++) { +                                keyFingerprintSet.add(keyList.get(i).mExpectedFingerprint); +                            } +                            if (keyFingerprintSet.size() == keyList.size()) { +                                // all keys have unique fingerprints +                                multiThreadedKeyImport(keyList.iterator(), keyList.size(), keyServer); +                            } else { +                                serialKeyImport(keyList, keyServer, providerHelper); +                            } +                        } + +                        break; +                    } +                    case ACTION_SIGN_ENCRYPT: { + +                        // Input +                        SignEncryptParcel inputParcel = data.getParcelable(SIGN_ENCRYPT_PARCEL); +                        CryptoInputParcel cryptoInput = data.getParcelable(EXTRA_CRYPTO_INPUT); + +                        // Operation +                        SignEncryptOperation op = new SignEncryptOperation( +                                mKeychainService, providerHelper, mKeychainService, mActionCanceled); +                        SignEncryptResult result = op.execute(inputParcel, cryptoInput); + +                        // Result +                        sendMessageToHandler(MessageStatus.OKAY, result); + +                        break; +                    } +                    case ACTION_UPLOAD_KEYRING: { +                        try { + +                    /* Input */ +                            String keyServer = data.getString(UPLOAD_KEY_SERVER); +                            // and dataUri! + +                    /* Operation */ +                            HkpKeyserver server = new HkpKeyserver(keyServer); + +                            CanonicalizedPublicKeyRing keyring = providerHelper.getCanonicalizedPublicKeyRing(dataUri); +                            ImportExportOperation importExportOperation = new ImportExportOperation(mKeychainService, +                                    providerHelper, mKeychainService); + +                            try { +                                importExportOperation.uploadKeyRingToServer(server, keyring); +                            } catch (Keyserver.AddKeyException e) { +                                throw new PgpGeneralException("Unable to export key to selected server"); +                            } + +                            sendMessageToHandler(MessageStatus.OKAY); +                        } catch (Exception e) { +                            sendErrorToHandler(e); +                        } +                        break; +                    } +                } +                if (!intent.getAction().equals(ACTION_IMPORT_KEYRING)) { +                    // import keyring handles stopping service on its own +                    stopSelf(); +                } +            } +        }; + +        Thread actionThread = new Thread(actionRunnable); +        actionThread.start(); +         +        return START_NOT_STICKY; +    } + +    private void sendProofError(List<String> log, String label) { +        String msg = null; +        label = (label == null) ? "" : label + ": "; +        for (String m : log) { +            Log.e(Constants.TAG, label + m); +            msg = m; +        } +        sendProofError(label + msg); +    } + +    private void sendProofError(String msg) { +        Bundle bundle = new Bundle(); +        bundle.putString(ServiceProgressHandler.DATA_ERROR, msg); +        sendMessageToHandler(MessageStatus.OKAY, bundle); +    } + +    private void sendErrorToHandler(Exception e) { +        // TODO: Implement a better exception handling here +        // contextualize the exception, if necessary +        String message; +        if (e instanceof PgpGeneralMsgIdException) { +            e = ((PgpGeneralMsgIdException) e).getContextualized(mKeychainService); +            message = e.getMessage(); +        } else { +            message = e.getMessage(); +        } +        Log.d(Constants.TAG, "KeychainService Exception: ", e); + +        Bundle data = new Bundle(); +        data.putString(ServiceProgressHandler.DATA_ERROR, message); +        sendMessageToHandler(MessageStatus.EXCEPTION, null, data); +    } + +    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.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); +        } +    } + +    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, Bundle data) { +        sendMessageToHandler(status, null, 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) { +        Log.d(Constants.TAG, "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); +    } + +    public void serialKeyImport(ArrayList<ParcelableKeyRing> keyList, final String keyServer, +                                ProviderHelper providerHelper) { +        Log.d(Constants.TAG, "serial key import starting"); +        ParcelableFileCache<ParcelableKeyRing> cache = +                new ParcelableFileCache<>(mKeychainService, "key_import.pcl"); + +        // Operation +        ImportExportOperation importExportOperation = new ImportExportOperation( +                mKeychainService, providerHelper, mKeychainService, +                mActionCanceled); +        // Either list or cache must be null, no guarantees otherwise. +        ImportKeyResult result = keyList != null +                ? importExportOperation.importKeyRings(keyList, keyServer) +                : importExportOperation.importKeyRings(cache, keyServer); + +        ContactSyncAdapterService.requestSync(); +        // Result +        sendMessageToHandler(MessageStatus.OKAY, result); + +        stopSelf(); +    } + +    public void multiThreadedKeyImport(Iterator<ParcelableKeyRing> keyListIterator, int totKeys, final String +            keyServer) { +        Log.d(Constants.TAG, "Multi-threaded key import starting"); +        if (keyListIterator != null) { +            mKeyImportAccumulator = new KeyImportAccumulator(totKeys, mKeychainService); +            setProgress(0, totKeys); + +            final int maxThreads = 200; +            ExecutorService importExecutor = new ThreadPoolExecutor(0, maxThreads, +                    30L, TimeUnit.SECONDS, +                    new SynchronousQueue<Runnable>()); + +            while (keyListIterator.hasNext()) { + +                final ParcelableKeyRing pkRing = keyListIterator.next(); + +                Runnable importOperationRunnable = new Runnable() { + +                    @Override +                    public void run() { +                        ImportKeyResult result = null; +                        try { +                            ImportExportOperation importExportOperation = new ImportExportOperation( +                                    mKeychainService, +                                    new ProviderHelper(mKeychainService), +                                    mKeyImportAccumulator.getImportProgressable(), +                                    mActionCanceled); + +                            ArrayList<ParcelableKeyRing> list = new ArrayList<>(); +                            list.add(pkRing); + +                            result = importExportOperation.importKeyRings(list, +                                    keyServer); +                        } finally { +                            // in the off-chance that importKeyRings does something to crash the +                            // thread before it can call singleKeyRingImportCompleted, our imported +                            // key count will go wrong. This will cause the service to never die, +                            // and the progress dialog to stay displayed. The finally block was +                            // originally meant to ensure singleKeyRingImportCompleted was called, +                            // and checks for null were to be introduced, but in such a scenario, +                            // knowing an uncaught error exists in importKeyRings is more important. + +                            // if a null gets passed, something wrong is happening. We want a crash. + +                            mKeyImportAccumulator.singleKeyRingImportCompleted(result); +                        } +                    } +                }; + +                importExecutor.execute(importOperationRunnable); +            } +        } +    } + +    /** +     * Used to accumulate the results of individual key imports +     */ +    private class KeyImportAccumulator { +        private OperationResult.OperationLog mImportLog = new OperationResult.OperationLog(); +        private int mTotalKeys; +        private int mImportedKeys = 0; +        private Progressable mInternalProgressable; +        ArrayList<Long> mImportedMasterKeyIds = new ArrayList<Long>(); +        private int mBadKeys = 0; +        private int mNewKeys = 0; +        private int mUpdatedKeys = 0; +        private int mSecret = 0; +        private int mResultType = 0; + +        /** +         * meant to be used with a service due to stopSelf() in singleKeyRingImportCompleted. Remove this if +         * generalising. +         * +         * @param totalKeys            total number of keys to be imported +         * @param externalProgressable the external progressable to be updated every time a key is imported +         */ +        public KeyImportAccumulator(int totalKeys, Progressable externalProgressable) { +            mTotalKeys = totalKeys; +            // ignore updates from ImportExportOperation for now +            mInternalProgressable = new Progressable() { +                @Override +                public void setProgress(String message, int current, int total) { + +                } + +                @Override +                public void setProgress(int resourceId, int current, int total) { + +                } + +                @Override +                public void setProgress(int current, int total) { + +                } + +                @Override +                public void setPreventCancel() { + +                } +            }; +        } + +        private synchronized void singleKeyRingImportCompleted(ImportKeyResult result) { +            // increase imported key count and accumulate log and bad, new etc. key counts from result +            mKeyImportAccumulator.accumulateKeyImport(result); + +            setProgress(mKeyImportAccumulator.getImportedKeys(), mKeyImportAccumulator.getTotalKeys()); + +            if (mKeyImportAccumulator.isImportFinished()) { +                ContactSyncAdapterService.requestSync(); + +                sendMessageToHandler(ServiceProgressHandler.MessageStatus.OKAY, +                        mKeyImportAccumulator.getConsolidatedImportKeyResult()); + +                stopSelf();//we're done here +            } +        } + +        public Progressable getImportProgressable() { +            return mInternalProgressable; +        } + +        public int getTotalKeys() { +            return mTotalKeys; +        } + +        public int getImportedKeys() { +            return mImportedKeys; +        } + +        public synchronized void accumulateKeyImport(ImportKeyResult result) { +            mImportedKeys++; +            mImportLog.addAll(result.getLog().toList());//accumulates log +            mBadKeys += result.mBadKeys; +            mNewKeys += result.mNewKeys; +            mUpdatedKeys += result.mUpdatedKeys; +            mSecret += result.mSecret; + +            long[] masterKeyIds = result.getImportedMasterKeyIds(); +            for (long masterKeyId : masterKeyIds) { +                mImportedMasterKeyIds.add(masterKeyId); +            } + +            // if any key import has been cancelled, set result type to cancelled +            // resultType is added to in getConsolidatedKayImport to account for remaining factors +            mResultType |= result.getResult() & ImportKeyResult.RESULT_CANCELLED; +        } + +        /** +         * returns accumulated result of all imports so far +         */ +        public ImportKeyResult getConsolidatedImportKeyResult() { + +            // adding required information to mResultType +            // special case,no keys requested for import +            if (mBadKeys == 0 && mNewKeys == 0 && mUpdatedKeys == 0) { +                mResultType = ImportKeyResult.RESULT_FAIL_NOTHING; +            } else { +                if (mNewKeys > 0) { +                    mResultType |= ImportKeyResult.RESULT_OK_NEWKEYS; +                } +                if (mUpdatedKeys > 0) { +                    mResultType |= ImportKeyResult.RESULT_OK_UPDATED; +                } +                if (mBadKeys > 0) { +                    mResultType |= ImportKeyResult.RESULT_WITH_ERRORS; +                    if (mNewKeys == 0 && mUpdatedKeys == 0) { +                        mResultType |= ImportKeyResult.RESULT_ERROR; +                    } +                } +                if (mImportLog.containsWarnings()) { +                    mResultType |= ImportKeyResult.RESULT_WARNINGS; +                } +            } + +            long masterKeyIds[] = new long[mImportedMasterKeyIds.size()]; +            for (int i = 0; i < masterKeyIds.length; i++) { +                masterKeyIds[i] = mImportedMasterKeyIds.get(i); +            } + +            return new ImportKeyResult(mResultType, mImportLog, mNewKeys, mUpdatedKeys, mBadKeys, +                    mSecret, masterKeyIds); +        } + +        public boolean isImportFinished() { +            return mTotalKeys == mImportedKeys; +        } +    } +} 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 5b19d9e42..5625408f8 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/ServiceProgressHandler.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/ServiceProgressHandler.java @@ -33,7 +33,7 @@ import org.sufficientlysecure.keychain.util.Log;  public class ServiceProgressHandler extends Handler {      // possible messages sent from this service to handler on ui -    public static enum MessageStatus{ +    public enum MessageStatus {          UNKNOWN,          OKAY,          EXCEPTION, @@ -42,9 +42,8 @@ public class ServiceProgressHandler extends Handler {          private static final MessageStatus[] values = values(); -        public static MessageStatus fromInt(int n) -        { -            if(n < 0 || n >= values.length) { +        public static MessageStatus fromInt(int n) { +            if (n < 0 || n >= values.length) {                  return UNKNOWN;              } else {                  return values[n]; @@ -71,30 +70,24 @@ public class ServiceProgressHandler extends Handler {          this.mActivity = activity;      } -    public ServiceProgressHandler(Activity activity, -                                  ProgressDialogFragment progressDialogFragment) { +    public ServiceProgressHandler(Activity activity, ProgressDialogFragment progressDialogFragment) {          this.mActivity = activity;          this.mProgressDialogFragment = progressDialogFragment;      } -    public ServiceProgressHandler(Activity activity, -                                  String progressDialogMessage, -                                  int progressDialogStyle, -                                  ProgressDialogFragment.ServiceType serviceType) { -        this(activity, progressDialogMessage, progressDialogStyle, false, serviceType); +    public ServiceProgressHandler(Activity activity, String progressDialogMessage, int progressDialogStyle) { +        this(activity, progressDialogMessage, progressDialogStyle, false);      }      public ServiceProgressHandler(Activity activity,                                    String progressDialogMessage,                                    int progressDialogStyle, -                                  boolean cancelable, -                                  ProgressDialogFragment.ServiceType serviceType) { +                                  boolean cancelable) {          this.mActivity = activity;          this.mProgressDialogFragment = ProgressDialogFragment.newInstance(                  progressDialogMessage,                  progressDialogStyle, -                cancelable, -                serviceType); +                cancelable);      }      public void showProgressDialog(FragmentActivity activity) { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyKeyFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyKeyFragment.java index 17836aa37..6afe2256b 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyKeyFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyKeyFragment.java @@ -52,12 +52,11 @@ import org.sufficientlysecure.keychain.provider.KeychainDatabase.Tables;  import org.sufficientlysecure.keychain.provider.ProviderHelper;  import org.sufficientlysecure.keychain.service.CertifyActionsParcel;  import org.sufficientlysecure.keychain.service.CertifyActionsParcel.CertifyAction; -import org.sufficientlysecure.keychain.service.KeychainIntentService; +import org.sufficientlysecure.keychain.service.KeychainService;  import org.sufficientlysecure.keychain.service.ServiceProgressHandler;  import org.sufficientlysecure.keychain.service.input.CryptoInputParcel;  import org.sufficientlysecure.keychain.ui.adapter.MultiUserIdsAdapter;  import org.sufficientlysecure.keychain.ui.base.CachingCryptoOperationFragment; -import org.sufficientlysecure.keychain.ui.dialog.ProgressDialogFragment;  import org.sufficientlysecure.keychain.ui.util.Notify;  import org.sufficientlysecure.keychain.ui.widget.CertifyKeySpinner;  import org.sufficientlysecure.keychain.util.Log; @@ -104,7 +103,7 @@ public class CertifyKeyFragment extends CachingCryptoOperationFragment<CertifyAc          }          mPassthroughMessenger = getActivity().getIntent().getParcelableExtra( -                KeychainIntentService.EXTRA_MESSENGER); +                KeychainService.EXTRA_MESSENGER);          mPassthroughMessenger = null; // TODO doesn't work with CryptoOperationFragment, disabled for now          ArrayList<Boolean> checkedStates; @@ -330,31 +329,32 @@ public class CertifyKeyFragment extends CachingCryptoOperationFragment<CertifyAc                  cacheActionsParcel(actionsParcel);              } -            data.putParcelable(KeychainIntentService.EXTRA_CRYPTO_INPUT, cryptoInput); -            data.putParcelable(KeychainIntentService.CERTIFY_PARCEL, actionsParcel); +            data.putParcelable(KeychainService.EXTRA_CRYPTO_INPUT, cryptoInput); +            data.putParcelable(KeychainService.CERTIFY_PARCEL, actionsParcel);              if (mUploadKeyCheckbox.isChecked()) {                  String keyserver = Preferences.getPreferences(getActivity()).getPreferredKeyserver(); -                data.putString(KeychainIntentService.UPLOAD_KEY_SERVER, keyserver); +                data.putString(KeychainService.UPLOAD_KEY_SERVER, keyserver);              }          }          // Send all information needed to service to sign key in other thread -        Intent intent = new Intent(getActivity(), KeychainIntentService.class); -        intent.setAction(KeychainIntentService.ACTION_CERTIFY_KEYRING); -        intent.putExtra(KeychainIntentService.EXTRA_DATA, data); +        Intent intent = new Intent(getActivity(), KeychainService.class); +        intent.setAction(KeychainService.ACTION_CERTIFY_KEYRING); +        intent.putExtra(KeychainService.EXTRA_DATA, data);          if (mPassthroughMessenger != null) { -            intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, mPassthroughMessenger); +            intent.putExtra(KeychainService.EXTRA_MESSENGER, mPassthroughMessenger);          } else { -            // Message is received after signing is done in KeychainIntentService +            // Message is received after signing is done in KeychainService              ServiceProgressHandler saveHandler = new ServiceProgressHandler(                      getActivity(),                      getString(R.string.progress_certifying),                      ProgressDialog.STYLE_SPINNER, -                    true, -                    ProgressDialogFragment.ServiceType.KEYCHAIN_INTENT) { +                    true +            ) { +                @Override                  public void handleMessage(Message message) {                      // handle messages by KeychainIntentCryptoServiceHandler first                      super.handleMessage(message); @@ -379,7 +379,7 @@ public class CertifyKeyFragment extends CachingCryptoOperationFragment<CertifyAc              // Create a new Messenger for the communication back              Messenger messenger = new Messenger(saveHandler); -            intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger); +            intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger);              // show progress dialog              saveHandler.showProgressDialog(getActivity()); 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 11ba3e287..054e43f21 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ConsolidateDialogActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ConsolidateDialogActivity.java @@ -25,9 +25,8 @@ import android.os.Messenger;  import android.support.v4.app.FragmentActivity;  import org.sufficientlysecure.keychain.R; -import org.sufficientlysecure.keychain.service.KeychainIntentService; +import org.sufficientlysecure.keychain.service.KeychainService;  import org.sufficientlysecure.keychain.service.ServiceProgressHandler; -import org.sufficientlysecure.keychain.ui.dialog.ProgressDialogFragment;  /**   * We can not directly create a dialog on the application context. @@ -49,12 +48,13 @@ public class ConsolidateDialogActivity extends FragmentActivity {      }      private void consolidateRecovery(boolean recovery) { -        // Message is received after importing is done in KeychainIntentService +        // Message is received after importing is done in KeychainService          ServiceProgressHandler saveHandler = new ServiceProgressHandler(                  this,                  getString(R.string.progress_importing), -                ProgressDialog.STYLE_HORIZONTAL, -                ProgressDialogFragment.ServiceType.KEYCHAIN_INTENT) { +                ProgressDialog.STYLE_HORIZONTAL +        ) { +            @Override              public void handleMessage(Message message) {                  // handle messages by standard KeychainIntentServiceHandler first                  super.handleMessage(message); @@ -68,7 +68,7 @@ public class ConsolidateDialogActivity extends FragmentActivity {                          return;                      }                      final ConsolidateResult result = -                            returnData.getParcelable(KeychainIntentService.RESULT_CONSOLIDATE); +                            returnData.getParcelable(KeychainService.RESULT_CONSOLIDATE);                      if (result == null) {                          return;                      } @@ -81,17 +81,17 @@ public class ConsolidateDialogActivity extends FragmentActivity {          };          // Send all information needed to service to import key in other thread -        Intent intent = new Intent(this, KeychainIntentService.class); -        intent.setAction(KeychainIntentService.ACTION_CONSOLIDATE); +        Intent intent = new Intent(this, KeychainService.class); +        intent.setAction(KeychainService.ACTION_CONSOLIDATE);          // fill values for this action          Bundle data = new Bundle(); -        data.putBoolean(KeychainIntentService.CONSOLIDATE_RECOVERY, recovery); -        intent.putExtra(KeychainIntentService.EXTRA_DATA, data); +        data.putBoolean(KeychainService.CONSOLIDATE_RECOVERY, recovery); +        intent.putExtra(KeychainService.EXTRA_DATA, data);          // Create a new Messenger for the communication back          Messenger messenger = new Messenger(saveHandler); -        intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger); +        intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger);          // show progress dialog          saveHandler.showProgressDialog(this); 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 b4131b23d..b39064e20 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyFinalFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyFinalFragment.java @@ -38,13 +38,12 @@ import org.sufficientlysecure.keychain.operations.results.EditKeyResult;  import org.sufficientlysecure.keychain.operations.results.OperationResult;  import org.sufficientlysecure.keychain.pgp.KeyRing;  import org.sufficientlysecure.keychain.provider.KeychainContract; -import org.sufficientlysecure.keychain.service.KeychainIntentService; +import org.sufficientlysecure.keychain.service.KeychainService;  import org.sufficientlysecure.keychain.service.ServiceProgressHandler;  import org.sufficientlysecure.keychain.service.SaveKeyringParcel;  import org.sufficientlysecure.keychain.service.SaveKeyringParcel.Algorithm;  import org.sufficientlysecure.keychain.service.SaveKeyringParcel.ChangeUnlockParcel;  import org.sufficientlysecure.keychain.ui.CreateKeyActivity.FragAction; -import org.sufficientlysecure.keychain.ui.dialog.ProgressDialogFragment;  import org.sufficientlysecure.keychain.util.Log;  import org.sufficientlysecure.keychain.util.Preferences; @@ -195,14 +194,15 @@ public class CreateKeyFinalFragment extends Fragment {      private void createKey() { -        Intent intent = new Intent(getActivity(), KeychainIntentService.class); -        intent.setAction(KeychainIntentService.ACTION_EDIT_KEYRING); +        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, -                ProgressDialogFragment.ServiceType.KEYCHAIN_INTENT) { +                ProgressDialog.STYLE_HORIZONTAL +        ) { +            @Override              public void handleMessage(Message message) {                  // handle messages by standard KeychainIntentServiceHandler first                  super.handleMessage(message); @@ -237,13 +237,13 @@ public class CreateKeyFinalFragment extends Fragment {          Bundle data = new Bundle();          // get selected key entries -        data.putParcelable(KeychainIntentService.EDIT_KEYRING_PARCEL, mSaveKeyringParcel); +        data.putParcelable(KeychainService.EDIT_KEYRING_PARCEL, mSaveKeyringParcel); -        intent.putExtra(KeychainIntentService.EXTRA_DATA, data); +        intent.putExtra(KeychainService.EXTRA_DATA, data);          // Create a new Messenger for the communication back          Messenger messenger = new Messenger(saveHandler); -        intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger); +        intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger);          saveHandler.showProgressDialog(getActivity()); @@ -253,9 +253,9 @@ public class CreateKeyFinalFragment extends Fragment {      // TODO move into EditKeyOperation      private void uploadKey(final EditKeyResult saveKeyResult) {          // Send all information needed to service to upload key in other thread -        final Intent intent = new Intent(getActivity(), KeychainIntentService.class); +        final Intent intent = new Intent(getActivity(), KeychainService.class); -        intent.setAction(KeychainIntentService.ACTION_UPLOAD_KEYRING); +        intent.setAction(KeychainService.ACTION_UPLOAD_KEYRING);          // set data uri as path to keyring          Uri blobUri = KeychainContract.KeyRings.buildUnifiedKeyRingUri( @@ -267,15 +267,16 @@ public class CreateKeyFinalFragment extends Fragment {          // upload to favorite keyserver          String keyserver = Preferences.getPreferences(getActivity()).getPreferredKeyserver(); -        data.putString(KeychainIntentService.UPLOAD_KEY_SERVER, keyserver); +        data.putString(KeychainService.UPLOAD_KEY_SERVER, keyserver); -        intent.putExtra(KeychainIntentService.EXTRA_DATA, data); +        intent.putExtra(KeychainService.EXTRA_DATA, data);          ServiceProgressHandler saveHandler = new ServiceProgressHandler(                  getActivity(),                  getString(R.string.progress_uploading), -                ProgressDialog.STYLE_HORIZONTAL, -                ProgressDialogFragment.ServiceType.KEYCHAIN_INTENT) { +                ProgressDialog.STYLE_HORIZONTAL +        ) { +            @Override              public void handleMessage(Message message) {                  // handle messages by standard KeychainIntentServiceHandler first                  super.handleMessage(message); @@ -297,7 +298,7 @@ public class CreateKeyFinalFragment extends Fragment {          // Create a new Messenger for the communication back          Messenger messenger = new Messenger(saveHandler); -        intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger); +        intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger);          // show progress dialog          saveHandler.showProgressDialog(getActivity()); 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 61db8552b..ba8e8321a 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyYubiKeyImportFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyYubiKeyImportFragment.java @@ -40,11 +40,10 @@ import org.sufficientlysecure.keychain.keyimport.ParcelableKeyRing;  import org.sufficientlysecure.keychain.operations.results.DecryptVerifyResult;  import org.sufficientlysecure.keychain.operations.results.ImportKeyResult;  import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings; -import org.sufficientlysecure.keychain.service.KeychainIntentService; +import org.sufficientlysecure.keychain.service.KeychainService;  import org.sufficientlysecure.keychain.service.ServiceProgressHandler;  import org.sufficientlysecure.keychain.ui.CreateKeyActivity.FragAction;  import org.sufficientlysecure.keychain.ui.CreateKeyActivity.NfcListenerFragment; -import org.sufficientlysecure.keychain.ui.dialog.ProgressDialogFragment;  import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;  import org.sufficientlysecure.keychain.util.Preferences; @@ -176,13 +175,13 @@ public class CreateKeyYubiKeyImportFragment extends Fragment implements NfcListe      public void importKey() { -        // Message is received after decrypting is done in KeychainIntentService +        // Message is received after decrypting is done in KeychainService          ServiceProgressHandler saveHandler = new ServiceProgressHandler(                  getActivity(),                  getString(R.string.progress_importing), -                ProgressDialog.STYLE_HORIZONTAL, -                ProgressDialogFragment.ServiceType.KEYCHAIN_INTENT +                ProgressDialog.STYLE_HORIZONTAL          ) { +            @Override              public void handleMessage(Message message) {                  // handle messages by standard KeychainIntentServiceHandler first                  super.handleMessage(message); @@ -220,29 +219,29 @@ public class CreateKeyYubiKeyImportFragment extends Fragment implements NfcListe          };          // Send all information needed to service to decrypt in other thread -        Intent intent = new Intent(getActivity(), KeychainIntentService.class); +        Intent intent = new Intent(getActivity(), KeychainService.class);          // fill values for this action          Bundle data = new Bundle(); -        intent.setAction(KeychainIntentService.ACTION_IMPORT_KEYRING); +        intent.setAction(KeychainService.ACTION_IMPORT_KEYRING);          ArrayList<ParcelableKeyRing> keyList = new ArrayList<>();          keyList.add(new ParcelableKeyRing(mNfcFingerprint, null, null)); -        data.putParcelableArrayList(KeychainIntentService.IMPORT_KEY_LIST, keyList); +        data.putParcelableArrayList(KeychainService.IMPORT_KEY_LIST, keyList);          {              Preferences prefs = Preferences.getPreferences(getActivity());              Preferences.CloudSearchPrefs cloudPrefs =                      new Preferences.CloudSearchPrefs(true, true, prefs.getPreferredKeyserver()); -            data.putString(KeychainIntentService.IMPORT_KEY_SERVER, cloudPrefs.keyserver); +            data.putString(KeychainService.IMPORT_KEY_SERVER, cloudPrefs.keyserver);          } -        intent.putExtra(KeychainIntentService.EXTRA_DATA, data); +        intent.putExtra(KeychainService.EXTRA_DATA, data);          // Create a new Messenger for the communication back          Messenger messenger = new Messenger(saveHandler); -        intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger); +        intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger);          saveHandler.showProgressDialog(getActivity()); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFilesFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFilesFragment.java index 254b926d4..b2d9596fd 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFilesFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFilesFragment.java @@ -37,11 +37,10 @@ import org.sufficientlysecure.keychain.Constants;  import org.sufficientlysecure.keychain.R;  import org.sufficientlysecure.keychain.operations.results.DecryptVerifyResult;  import org.sufficientlysecure.keychain.pgp.PgpDecryptVerifyInputParcel; -import org.sufficientlysecure.keychain.service.KeychainIntentService; +import org.sufficientlysecure.keychain.service.KeychainService;  import org.sufficientlysecure.keychain.service.ServiceProgressHandler;  import org.sufficientlysecure.keychain.service.input.CryptoInputParcel;  import org.sufficientlysecure.keychain.ui.dialog.DeleteFileDialogFragment; -import org.sufficientlysecure.keychain.ui.dialog.ProgressDialogFragment;  import org.sufficientlysecure.keychain.ui.util.Notify;  import org.sufficientlysecure.keychain.util.FileHelper;  import org.sufficientlysecure.keychain.util.Log; @@ -181,12 +180,12 @@ public class DecryptFilesFragment extends DecryptFragment {      }      private void startDecrypt() { -        mCurrentCryptoOperation = KeychainIntentService.ACTION_DECRYPT_VERIFY; +        mCurrentCryptoOperation = KeychainService.ACTION_DECRYPT_VERIFY;          cryptoOperation(new CryptoInputParcel());      }      private void startDecryptFilenames() { -        mCurrentCryptoOperation = KeychainIntentService.ACTION_DECRYPT_METADATA; +        mCurrentCryptoOperation = KeychainService.ACTION_DECRYPT_METADATA;          cryptoOperation(new CryptoInputParcel());      } @@ -194,7 +193,7 @@ public class DecryptFilesFragment extends DecryptFragment {      @SuppressLint("HandlerLeak")      protected void cryptoOperation(CryptoInputParcel cryptoInput) {          // Send all information needed to service to decrypt in other thread -        Intent intent = new Intent(getActivity(), KeychainIntentService.class); +        Intent intent = new Intent(getActivity(), KeychainService.class);          // fill values for this action          Bundle data = new Bundle(); @@ -208,17 +207,17 @@ public class DecryptFilesFragment extends DecryptFragment {          PgpDecryptVerifyInputParcel input = new PgpDecryptVerifyInputParcel(mInputUri, mOutputUri)                  .setAllowSymmetricDecryption(true); -        data.putParcelable(KeychainIntentService.DECRYPT_VERIFY_PARCEL, input); -        data.putParcelable(KeychainIntentService.EXTRA_CRYPTO_INPUT, cryptoInput); +        data.putParcelable(KeychainService.DECRYPT_VERIFY_PARCEL, input); +        data.putParcelable(KeychainService.EXTRA_CRYPTO_INPUT, cryptoInput); -        intent.putExtra(KeychainIntentService.EXTRA_DATA, data); +        intent.putExtra(KeychainService.EXTRA_DATA, data); -        // Message is received after decrypting is done in KeychainIntentService +        // Message is received after decrypting is done in KeychainService          ServiceProgressHandler saveHandler = new ServiceProgressHandler(                  getActivity(),                  getString(R.string.progress_decrypting), -                ProgressDialog.STYLE_HORIZONTAL, -                ProgressDialogFragment.ServiceType.KEYCHAIN_INTENT) { +                ProgressDialog.STYLE_HORIZONTAL +        ) {              @Override              public void handleMessage(Message message) {                  // handle messages by standard KeychainIntentServiceHandler first @@ -238,11 +237,11 @@ public class DecryptFilesFragment extends DecryptFragment {                      if (pgpResult.success()) {                          switch (mCurrentCryptoOperation) { -                            case KeychainIntentService.ACTION_DECRYPT_METADATA: { +                            case KeychainService.ACTION_DECRYPT_METADATA: {                                  askForOutputFilename(pgpResult.getDecryptMetadata().getFilename());                                  break;                              } -                            case KeychainIntentService.ACTION_DECRYPT_VERIFY: { +                            case KeychainService.ACTION_DECRYPT_VERIFY: {                                  // display signature result in activity                                  loadVerifyResult(pgpResult); @@ -277,7 +276,7 @@ public class DecryptFilesFragment extends DecryptFragment {          // Create a new Messenger for the communication back          Messenger messenger = new Messenger(saveHandler); -        intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger); +        intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger);          // show progress dialog          saveHandler.showProgressDialog(getActivity()); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFragment.java index e13365feb..3d87ce894 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFragment.java @@ -47,7 +47,7 @@ import org.sufficientlysecure.keychain.pgp.exception.PgpKeyNotFoundException;  import org.sufficientlysecure.keychain.provider.KeychainContract;  import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;  import org.sufficientlysecure.keychain.provider.ProviderHelper; -import org.sufficientlysecure.keychain.service.KeychainIntentService; +import org.sufficientlysecure.keychain.service.KeychainService;  import org.sufficientlysecure.keychain.service.ServiceProgressHandler;  import org.sufficientlysecure.keychain.ui.base.CryptoOperationFragment;  import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils; @@ -130,8 +130,9 @@ public abstract class DecryptFragment extends CryptoOperationFragment implements      private void lookupUnknownKey(long unknownKeyId) { -        // Message is received after importing is done in KeychainIntentService +        // Message is received after importing is done in KeychainService          ServiceProgressHandler serviceHandler = new ServiceProgressHandler(getActivity()) { +            @Override              public void handleMessage(Message message) {                  // handle messages by standard KeychainIntentServiceHandler first                  super.handleMessage(message); @@ -162,7 +163,7 @@ public abstract class DecryptFragment extends CryptoOperationFragment implements              Preferences prefs = Preferences.getPreferences(getActivity());              Preferences.CloudSearchPrefs cloudPrefs =                      new Preferences.CloudSearchPrefs(true, true, prefs.getPreferredKeyserver()); -            data.putString(KeychainIntentService.IMPORT_KEY_SERVER, cloudPrefs.keyserver); +            data.putString(KeychainService.IMPORT_KEY_SERVER, cloudPrefs.keyserver);          }          { @@ -171,17 +172,17 @@ public abstract class DecryptFragment extends CryptoOperationFragment implements              ArrayList<ParcelableKeyRing> selectedEntries = new ArrayList<>();              selectedEntries.add(keyEntry); -            data.putParcelableArrayList(KeychainIntentService.IMPORT_KEY_LIST, selectedEntries); +            data.putParcelableArrayList(KeychainService.IMPORT_KEY_LIST, selectedEntries);          }          // Send all information needed to service to query keys in other thread -        Intent intent = new Intent(getActivity(), KeychainIntentService.class); -        intent.setAction(KeychainIntentService.ACTION_IMPORT_KEYRING); -        intent.putExtra(KeychainIntentService.EXTRA_DATA, data); +        Intent intent = new Intent(getActivity(), KeychainService.class); +        intent.setAction(KeychainService.ACTION_IMPORT_KEYRING); +        intent.putExtra(KeychainService.EXTRA_DATA, data);          // Create a new Messenger for the communication back          Messenger messenger = new Messenger(serviceHandler); -        intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger); +        intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger);          getActivity().startService(intent);      } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptTextFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptTextFragment.java index 93397c806..b7ea90a36 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptTextFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptTextFragment.java @@ -35,10 +35,9 @@ import org.sufficientlysecure.keychain.R;  import org.sufficientlysecure.keychain.compatibility.ClipboardReflection;  import org.sufficientlysecure.keychain.operations.results.DecryptVerifyResult;  import org.sufficientlysecure.keychain.pgp.PgpDecryptVerifyInputParcel; -import org.sufficientlysecure.keychain.service.KeychainIntentService; +import org.sufficientlysecure.keychain.service.KeychainService;  import org.sufficientlysecure.keychain.service.ServiceProgressHandler;  import org.sufficientlysecure.keychain.service.input.CryptoInputParcel; -import org.sufficientlysecure.keychain.ui.dialog.ProgressDialogFragment;  import org.sufficientlysecure.keychain.ui.util.Notify;  import org.sufficientlysecure.keychain.util.ShareHelper; @@ -161,25 +160,25 @@ public class DecryptTextFragment extends DecryptFragment {      @Override      protected void cryptoOperation(CryptoInputParcel cryptoInput) {          // Send all information needed to service to decrypt in other thread -        Intent intent = new Intent(getActivity(), KeychainIntentService.class); +        Intent intent = new Intent(getActivity(), KeychainService.class);          // fill values for this action          Bundle data = new Bundle(); -        intent.setAction(KeychainIntentService.ACTION_DECRYPT_VERIFY); +        intent.setAction(KeychainService.ACTION_DECRYPT_VERIFY);          PgpDecryptVerifyInputParcel input = new PgpDecryptVerifyInputParcel(mCiphertext.getBytes()); -        data.putParcelable(KeychainIntentService.DECRYPT_VERIFY_PARCEL, input); -        data.putParcelable(KeychainIntentService.EXTRA_CRYPTO_INPUT, cryptoInput); +        data.putParcelable(KeychainService.DECRYPT_VERIFY_PARCEL, input); +        data.putParcelable(KeychainService.EXTRA_CRYPTO_INPUT, cryptoInput); -        intent.putExtra(KeychainIntentService.EXTRA_DATA, data); +        intent.putExtra(KeychainService.EXTRA_DATA, data); -        // Message is received after encrypting is done in KeychainIntentService +        // Message is received after encrypting is done in KeychainService          ServiceProgressHandler saveHandler = new ServiceProgressHandler(                  getActivity(),                  getString(R.string.progress_decrypting), -                ProgressDialog.STYLE_HORIZONTAL, -                ProgressDialogFragment.ServiceType.KEYCHAIN_INTENT) { +                ProgressDialog.STYLE_HORIZONTAL +        ) {              public void handleMessage(Message message) {                  // handle messages by standard KeychainIntentServiceHandler first                  super.handleMessage(message); @@ -223,7 +222,7 @@ public class DecryptTextFragment extends DecryptFragment {          // Create a new Messenger for the communication back          Messenger messenger = new Messenger(saveHandler); -        intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger); +        intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger);          // show progress dialog          saveHandler.showProgressDialog(getActivity()); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyFragment.java index 1f7a0eb0d..63fb8413b 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyFragment.java @@ -50,7 +50,7 @@ import org.sufficientlysecure.keychain.provider.KeychainContract;  import org.sufficientlysecure.keychain.provider.KeychainContract.UserPackets;  import org.sufficientlysecure.keychain.provider.ProviderHelper;  import org.sufficientlysecure.keychain.provider.ProviderHelper.NotFoundException; -import org.sufficientlysecure.keychain.service.KeychainIntentService; +import org.sufficientlysecure.keychain.service.KeychainService;  import org.sufficientlysecure.keychain.service.ServiceProgressHandler;  import org.sufficientlysecure.keychain.service.SaveKeyringParcel;  import org.sufficientlysecure.keychain.service.SaveKeyringParcel.ChangeUnlockParcel; @@ -66,8 +66,6 @@ import org.sufficientlysecure.keychain.ui.util.Notify;  import org.sufficientlysecure.keychain.util.Log;  import org.sufficientlysecure.keychain.util.Passphrase; -import java.nio.ByteBuffer; -  public class EditKeyFragment extends CryptoOperationFragment implements          LoaderManager.LoaderCallbacks<Cursor> { @@ -603,8 +601,8 @@ public class EditKeyFragment extends CryptoOperationFragment implements                  getActivity(),                  getString(R.string.progress_saving),                  ProgressDialog.STYLE_HORIZONTAL, -                true, -                ProgressDialogFragment.ServiceType.KEYCHAIN_INTENT) { +                true +        ) {              public void handleMessage(Message message) {                  // handle messages by standard KeychainIntentServiceHandler first                  super.handleMessage(message); @@ -643,18 +641,18 @@ public class EditKeyFragment extends CryptoOperationFragment implements          };          // Send all information needed to service to import key in other thread -        Intent intent = new Intent(getActivity(), KeychainIntentService.class); -        intent.setAction(KeychainIntentService.ACTION_EDIT_KEYRING); +        Intent intent = new Intent(getActivity(), KeychainService.class); +        intent.setAction(KeychainService.ACTION_EDIT_KEYRING);          // fill values for this action          Bundle data = new Bundle(); -        data.putParcelable(KeychainIntentService.EXTRA_CRYPTO_INPUT, cryptoInput); -        data.putParcelable(KeychainIntentService.EDIT_KEYRING_PARCEL, mSaveKeyringParcel); -        intent.putExtra(KeychainIntentService.EXTRA_DATA, data); +        data.putParcelable(KeychainService.EXTRA_CRYPTO_INPUT, cryptoInput); +        data.putParcelable(KeychainService.EDIT_KEYRING_PARCEL, mSaveKeyringParcel); +        intent.putExtra(KeychainService.EXTRA_DATA, data);          // Create a new Messenger for the communication back          Messenger messenger = new Messenger(saveHandler); -        intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger); +        intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger);          // show progress dialog          saveHandler.showProgressDialog(getActivity()); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesFragment.java index f5963dbf0..143450e32 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesFragment.java @@ -49,13 +49,12 @@ import org.sufficientlysecure.keychain.pgp.KeyRing;  import org.sufficientlysecure.keychain.pgp.PgpConstants;  import org.sufficientlysecure.keychain.pgp.SignEncryptParcel;  import org.sufficientlysecure.keychain.provider.TemporaryStorageProvider; -import org.sufficientlysecure.keychain.service.KeychainIntentService; +import org.sufficientlysecure.keychain.service.KeychainService;  import org.sufficientlysecure.keychain.service.ServiceProgressHandler;  import org.sufficientlysecure.keychain.service.input.CryptoInputParcel;  import org.sufficientlysecure.keychain.ui.adapter.SpacesItemDecoration;  import org.sufficientlysecure.keychain.ui.base.CachingCryptoOperationFragment;  import org.sufficientlysecure.keychain.ui.dialog.DeleteFileDialogFragment; -import org.sufficientlysecure.keychain.ui.dialog.ProgressDialogFragment;  import org.sufficientlysecure.keychain.ui.util.FormattingUtils;  import org.sufficientlysecure.keychain.ui.util.Notify;  import org.sufficientlysecure.keychain.util.FileHelper; @@ -505,21 +504,22 @@ public class EncryptFilesFragment extends CachingCryptoOperationFragment<SignEnc          }          // Send all information needed to service to edit key in other thread -        Intent intent = new Intent(getActivity(), KeychainIntentService.class); -        intent.setAction(KeychainIntentService.ACTION_SIGN_ENCRYPT); +        Intent intent = new Intent(getActivity(), KeychainService.class); +        intent.setAction(KeychainService.ACTION_SIGN_ENCRYPT);          Bundle data = new Bundle(); -        data.putParcelable(KeychainIntentService.SIGN_ENCRYPT_PARCEL, actionsParcel); -        data.putParcelable(KeychainIntentService.EXTRA_CRYPTO_INPUT, cryptoInput); -        intent.putExtra(KeychainIntentService.EXTRA_DATA, data); +        data.putParcelable(KeychainService.SIGN_ENCRYPT_PARCEL, actionsParcel); +        data.putParcelable(KeychainService.EXTRA_CRYPTO_INPUT, cryptoInput); +        intent.putExtra(KeychainService.EXTRA_DATA, data); -        // Message is received after encrypting is done in KeychainIntentService +        // Message is received after encrypting is done in KeychainService          ServiceProgressHandler serviceHandler = new ServiceProgressHandler(                  getActivity(),                  getString(R.string.progress_encrypting),                  ProgressDialog.STYLE_HORIZONTAL, -                true, -                ProgressDialogFragment.ServiceType.KEYCHAIN_INTENT) { +                true +        ) { +            @Override              public void handleMessage(Message message) {                  // handle messages by standard KeychainIntentServiceHandler first                  super.handleMessage(message); @@ -542,7 +542,7 @@ public class EncryptFilesFragment extends CachingCryptoOperationFragment<SignEnc          };          // Create a new Messenger for the communication back          Messenger messenger = new Messenger(serviceHandler); -        intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger); +        intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger);          // show progress dialog          serviceHandler.showProgressDialog(getActivity()); 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 10442ade0..a8840dbf1 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptTextFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptTextFragment.java @@ -41,11 +41,10 @@ import org.sufficientlysecure.keychain.operations.results.SignEncryptResult;  import org.sufficientlysecure.keychain.pgp.KeyRing;  import org.sufficientlysecure.keychain.pgp.PgpConstants;  import org.sufficientlysecure.keychain.pgp.SignEncryptParcel; -import org.sufficientlysecure.keychain.service.KeychainIntentService; +import org.sufficientlysecure.keychain.service.KeychainService;  import org.sufficientlysecure.keychain.service.ServiceProgressHandler;  import org.sufficientlysecure.keychain.service.input.CryptoInputParcel;  import org.sufficientlysecure.keychain.ui.base.CachingCryptoOperationFragment; -import org.sufficientlysecure.keychain.ui.dialog.ProgressDialogFragment;  import org.sufficientlysecure.keychain.ui.util.Notify;  import org.sufficientlysecure.keychain.util.Passphrase;  import org.sufficientlysecure.keychain.util.ShareHelper; @@ -323,20 +322,21 @@ public class EncryptTextFragment extends CachingCryptoOperationFragment<SignEncr          }          // Send all information needed to service to edit key in other thread -        Intent intent = new Intent(getActivity(), KeychainIntentService.class); -        intent.setAction(KeychainIntentService.ACTION_SIGN_ENCRYPT); +        Intent intent = new Intent(getActivity(), KeychainService.class); +        intent.setAction(KeychainService.ACTION_SIGN_ENCRYPT);          Bundle data = new Bundle(); -        data.putParcelable(KeychainIntentService.SIGN_ENCRYPT_PARCEL, actionsParcel); -        data.putParcelable(KeychainIntentService.EXTRA_CRYPTO_INPUT, cryptoInput); -        intent.putExtra(KeychainIntentService.EXTRA_DATA, data); +        data.putParcelable(KeychainService.SIGN_ENCRYPT_PARCEL, actionsParcel); +        data.putParcelable(KeychainService.EXTRA_CRYPTO_INPUT, cryptoInput); +        intent.putExtra(KeychainService.EXTRA_DATA, data); -        // Message is received after encrypting is done in KeychainIntentService +        // Message is received after encrypting is done in KeychainService          ServiceProgressHandler serviceHandler = new ServiceProgressHandler(                  getActivity(),                  getString(R.string.progress_encrypting), -                ProgressDialog.STYLE_HORIZONTAL, -                ProgressDialogFragment.ServiceType.KEYCHAIN_INTENT) { +                ProgressDialog.STYLE_HORIZONTAL +        ) { +            @Override              public void handleMessage(Message message) {                  // handle messages by standard KeychainIntentServiceHandler first                  super.handleMessage(message); @@ -359,7 +359,7 @@ public class EncryptTextFragment extends CachingCryptoOperationFragment<SignEncr          };          // Create a new Messenger for the communication back          Messenger messenger = new Messenger(serviceHandler); -        intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger); +        intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger);          // show progress dialog          serviceHandler.showProgressDialog(getActivity()); 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 d02030cbf..5251f5949 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java @@ -35,11 +35,9 @@ import org.sufficientlysecure.keychain.keyimport.ImportKeysListEntry;  import org.sufficientlysecure.keychain.keyimport.ParcelableKeyRing;  import org.sufficientlysecure.keychain.operations.results.ImportKeyResult;  import org.sufficientlysecure.keychain.operations.results.OperationResult; -import org.sufficientlysecure.keychain.service.KeychainIntentService; +import org.sufficientlysecure.keychain.service.KeychainService;  import org.sufficientlysecure.keychain.ui.base.BaseNfcActivity; -import org.sufficientlysecure.keychain.service.CloudImportService;  import org.sufficientlysecure.keychain.service.ServiceProgressHandler; -import org.sufficientlysecure.keychain.ui.dialog.ProgressDialogFragment;  import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;  import org.sufficientlysecure.keychain.ui.util.Notify;  import org.sufficientlysecure.keychain.util.Log; @@ -383,7 +381,6 @@ public class ImportKeysActivity extends BaseNfcActivity {       * Import keys with mImportData       */      public void importKeys() { -        ImportKeysListFragment.LoaderState ls = mListFragment.getLoaderState();          if (mListFragment.getSelectedEntries().size() == 0) {              Notify.create(this, R.string.error_nothing_import_selected, Notify.Style.ERROR) @@ -391,31 +388,32 @@ public class ImportKeysActivity extends BaseNfcActivity {              return;          } -        if (ls instanceof ImportKeysListFragment.BytesLoaderState) { -            Log.d(Constants.TAG, "importKeys started"); +        ServiceProgressHandler serviceHandler = new ServiceProgressHandler( +                this, +                getString(R.string.progress_importing), +                ProgressDialog.STYLE_HORIZONTAL, +                true +        ) { +            @Override +            public void handleMessage(Message message) { +                // handle messages by standard KeychainIntentServiceHandler first +                super.handleMessage(message); -            ServiceProgressHandler serviceHandler = new ServiceProgressHandler( -                    this, -                    getString(R.string.progress_importing), -                    ProgressDialog.STYLE_HORIZONTAL, -                    true, -                    ProgressDialogFragment.ServiceType.KEYCHAIN_INTENT) { -                public void handleMessage(Message message) { -                    // handle messages by standard KeychainIntentServiceHandler first -                    super.handleMessage(message); - -                    ImportKeysActivity.this.handleMessage(message); -                } -            }; +                ImportKeysActivity.this.handleMessage(message); +            } +        }; + +        // Send all information needed to service to import key in other thread +        Intent intent = new Intent(this, KeychainService.class); -            // TODO: Currently not using CloudImport here due to https://github.com/open-keychain/open-keychain/issues/1221 -            // Send all information needed to service to import key in other thread -            Intent intent = new Intent(this, KeychainIntentService.class); +        intent.setAction(KeychainService.ACTION_IMPORT_KEYRING); -            intent.setAction(KeychainIntentService.ACTION_IMPORT_KEYRING); +        // fill values for this action +        Bundle data = new Bundle(); -            // fill values for this action -            Bundle data = new Bundle(); +        ImportKeysListFragment.LoaderState ls = mListFragment.getLoaderState(); +        if (ls instanceof ImportKeysListFragment.BytesLoaderState) { +            Log.d(Constants.TAG, "importKeys started");              // get DATA from selected key entries              IteratorWithSize<ParcelableKeyRing> selectedEntries = mListFragment.getSelectedData(); @@ -430,11 +428,11 @@ public class ImportKeysActivity extends BaseNfcActivity {                          new ParcelableFileCache<>(this, "key_import.pcl");                  cache.writeCache(selectedEntries); -                intent.putExtra(KeychainIntentService.EXTRA_DATA, data); +                intent.putExtra(KeychainService.EXTRA_DATA, data);                  // Create a new Messenger for the communication back                  Messenger messenger = new Messenger(serviceHandler); -                intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger); +                intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger);                  // show progress dialog                  serviceHandler.showProgressDialog(this); @@ -449,27 +447,7 @@ public class ImportKeysActivity extends BaseNfcActivity {          } else if (ls instanceof ImportKeysListFragment.CloudLoaderState) {              ImportKeysListFragment.CloudLoaderState sls = (ImportKeysListFragment.CloudLoaderState) ls; -            ServiceProgressHandler serviceHandler = new ServiceProgressHandler( -                    this, -                    getString(R.string.progress_importing), -                    ProgressDialog.STYLE_HORIZONTAL, -                    true, -                    ProgressDialogFragment.ServiceType.CLOUD_IMPORT) { -                public void handleMessage(Message message) { -                    // handle messages by standard KeychainIntentServiceHandler first -                    super.handleMessage(message); - -                    ImportKeysActivity.this.handleMessage(message); -                } -            }; - -            // Send all information needed to service to query keys in other thread -            Intent intent = new Intent(this, CloudImportService.class); - -            // fill values for this action -            Bundle data = new Bundle(); - -            data.putString(CloudImportService.IMPORT_KEY_SERVER, sls.mCloudPrefs.keyserver); +            data.putString(KeychainService.IMPORT_KEY_SERVER, sls.mCloudPrefs.keyserver);              // get selected key entries              ArrayList<ParcelableKeyRing> keys = new ArrayList<>(); @@ -482,13 +460,13 @@ public class ImportKeysActivity extends BaseNfcActivity {                      );                  }              } -            data.putParcelableArrayList(CloudImportService.IMPORT_KEY_LIST, keys); +            data.putParcelableArrayList(KeychainService.IMPORT_KEY_LIST, keys); -            intent.putExtra(CloudImportService.EXTRA_DATA, data); +            intent.putExtra(KeychainService.EXTRA_DATA, data);              // Create a new Messenger for the communication back              Messenger messenger = new Messenger(serviceHandler); -            intent.putExtra(CloudImportService.EXTRA_MESSENGER, messenger); +            intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger);              // show progress dialog              serviceHandler.showProgressDialog(this); 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 7ed8dd0b5..42efbf0f8 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysProxyActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysProxyActivity.java @@ -43,9 +43,8 @@ import org.sufficientlysecure.keychain.operations.results.ImportKeyResult;  import org.sufficientlysecure.keychain.operations.results.OperationResult;  import org.sufficientlysecure.keychain.operations.results.OperationResult.LogType;  import org.sufficientlysecure.keychain.operations.results.SingletonResult; -import org.sufficientlysecure.keychain.service.KeychainIntentService; +import org.sufficientlysecure.keychain.service.KeychainService;  import org.sufficientlysecure.keychain.service.ServiceProgressHandler; -import org.sufficientlysecure.keychain.ui.dialog.ProgressDialogFragment;  import org.sufficientlysecure.keychain.util.IntentIntegratorSupportV4;  import org.sufficientlysecure.keychain.util.Log;  import org.sufficientlysecure.keychain.util.Preferences; @@ -206,13 +205,14 @@ public class ImportKeysProxyActivity extends FragmentActivity {      private void startImportService(ArrayList<ParcelableKeyRing> keyRings) { -        // Message is received after importing is done in KeychainIntentService +        // Message is received after importing is done in KeychainService          ServiceProgressHandler serviceHandler = new ServiceProgressHandler(                  this,                  getString(R.string.progress_importing),                  ProgressDialog.STYLE_HORIZONTAL, -                true, -                ProgressDialogFragment.ServiceType.KEYCHAIN_INTENT) { +                true +        ) { +            @Override              public void handleMessage(Message message) {                  // handle messages by standard KeychainIntentServiceHandler first                  super.handleMessage(message); @@ -258,19 +258,19 @@ public class ImportKeysProxyActivity extends FragmentActivity {              Preferences prefs = Preferences.getPreferences(this);              Preferences.CloudSearchPrefs cloudPrefs =                      new Preferences.CloudSearchPrefs(true, true, prefs.getPreferredKeyserver()); -            data.putString(KeychainIntentService.IMPORT_KEY_SERVER, cloudPrefs.keyserver); +            data.putString(KeychainService.IMPORT_KEY_SERVER, cloudPrefs.keyserver);          } -        data.putParcelableArrayList(KeychainIntentService.IMPORT_KEY_LIST, keyRings); +        data.putParcelableArrayList(KeychainService.IMPORT_KEY_LIST, keyRings);          // Send all information needed to service to query keys in other thread -        Intent intent = new Intent(this, KeychainIntentService.class); -        intent.setAction(KeychainIntentService.ACTION_IMPORT_KEYRING); -        intent.putExtra(KeychainIntentService.EXTRA_DATA, data); +        Intent intent = new Intent(this, KeychainService.class); +        intent.setAction(KeychainService.ACTION_IMPORT_KEYRING); +        intent.putExtra(KeychainService.EXTRA_DATA, data);          // Create a new Messenger for the communication back          Messenger messenger = new Messenger(serviceHandler); -        intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger); +        intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger);          // show progress dialog          serviceHandler.showProgressDialog(this); 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 1355bd3e6..ddc527847 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java @@ -64,12 +64,10 @@ import org.sufficientlysecure.keychain.provider.KeychainContract;  import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;  import org.sufficientlysecure.keychain.provider.KeychainDatabase;  import org.sufficientlysecure.keychain.provider.ProviderHelper; -import org.sufficientlysecure.keychain.service.CloudImportService; -import org.sufficientlysecure.keychain.service.KeychainIntentService; +import org.sufficientlysecure.keychain.service.KeychainService;  import org.sufficientlysecure.keychain.service.ServiceProgressHandler;  import org.sufficientlysecure.keychain.service.PassphraseCacheService;  import org.sufficientlysecure.keychain.ui.dialog.DeleteKeyDialogFragment; -import org.sufficientlysecure.keychain.ui.dialog.ProgressDialogFragment;  import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;  import org.sufficientlysecure.keychain.ui.adapter.KeyAdapter;  import org.sufficientlysecure.keychain.ui.util.Notify; @@ -578,8 +576,9 @@ public class KeyListFragment extends LoaderFragment                  getActivity(),                  getString(R.string.progress_updating),                  ProgressDialog.STYLE_HORIZONTAL, -                true, -                ProgressDialogFragment.ServiceType.CLOUD_IMPORT) { +                true +        ) { +            @Override              public void handleMessage(Message message) {                  // handle messages by standard KeychainIntentServiceHandler first                  super.handleMessage(message); @@ -603,7 +602,8 @@ public class KeyListFragment extends LoaderFragment          };          // Send all information needed to service to query keys in other thread -        Intent intent = new Intent(getActivity(), CloudImportService.class); +        Intent intent = new Intent(getActivity(), KeychainService.class); +        intent.setAction(KeychainService.ACTION_IMPORT_KEYRING);          // fill values for this action          Bundle data = new Bundle(); @@ -613,16 +613,16 @@ public class KeyListFragment extends LoaderFragment              Preferences prefs = Preferences.getPreferences(getActivity());              Preferences.CloudSearchPrefs cloudPrefs =                      new Preferences.CloudSearchPrefs(true, true, prefs.getPreferredKeyserver()); -            data.putString(CloudImportService.IMPORT_KEY_SERVER, cloudPrefs.keyserver); +            data.putString(KeychainService.IMPORT_KEY_SERVER, cloudPrefs.keyserver);          } -        data.putParcelableArrayList(CloudImportService.IMPORT_KEY_LIST, keyList); +        data.putParcelableArrayList(KeychainService.IMPORT_KEY_LIST, keyList); -        intent.putExtra(CloudImportService.EXTRA_DATA, data); +        intent.putExtra(KeychainService.EXTRA_DATA, data);          // Create a new Messenger for the communication back          Messenger messenger = new Messenger(serviceHandler); -        intent.putExtra(CloudImportService.EXTRA_MESSENGER, messenger); +        intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger);          // show progress dialog          serviceHandler.showProgressDialog(getActivity()); @@ -632,12 +632,13 @@ public class KeyListFragment extends LoaderFragment      }      private void consolidate() { -        // Message is received after importing is done in KeychainIntentService +        // Message is received after importing is done in KeychainService          ServiceProgressHandler saveHandler = new ServiceProgressHandler(                  getActivity(),                  getString(R.string.progress_importing), -                ProgressDialog.STYLE_HORIZONTAL, -                ProgressDialogFragment.ServiceType.KEYCHAIN_INTENT) { +                ProgressDialog.STYLE_HORIZONTAL +        ) { +            @Override              public void handleMessage(Message message) {                  // handle messages by standard KeychainIntentServiceHandler first                  super.handleMessage(message); @@ -660,18 +661,18 @@ public class KeyListFragment extends LoaderFragment          };          // Send all information needed to service to import key in other thread -        Intent intent = new Intent(getActivity(), KeychainIntentService.class); +        Intent intent = new Intent(getActivity(), KeychainService.class); -        intent.setAction(KeychainIntentService.ACTION_CONSOLIDATE); +        intent.setAction(KeychainService.ACTION_CONSOLIDATE);          // fill values for this action          Bundle data = new Bundle(); -        intent.putExtra(KeychainIntentService.EXTRA_DATA, data); +        intent.putExtra(KeychainService.EXTRA_DATA, data);          // Create a new Messenger for the communication back          Messenger messenger = new Messenger(saveHandler); -        intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger); +        intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger);          // show progress dialog          saveHandler.showProgressDialog(getActivity()); 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 aa3c36d11..273acc23d 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SafeSlingerActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SafeSlingerActivity.java @@ -38,10 +38,9 @@ import org.sufficientlysecure.keychain.operations.results.ImportKeyResult;  import org.sufficientlysecure.keychain.operations.results.OperationResult;  import org.sufficientlysecure.keychain.provider.KeychainContract;  import org.sufficientlysecure.keychain.provider.ProviderHelper; -import org.sufficientlysecure.keychain.service.KeychainIntentService; +import org.sufficientlysecure.keychain.service.KeychainService;  import org.sufficientlysecure.keychain.ui.base.BaseActivity;  import org.sufficientlysecure.keychain.service.ServiceProgressHandler; -import org.sufficientlysecure.keychain.ui.dialog.ProgressDialogFragment;  import org.sufficientlysecure.keychain.ui.util.Notify;  import org.sufficientlysecure.keychain.util.Log;  import org.sufficientlysecure.keychain.util.ParcelableFileCache; @@ -124,13 +123,14 @@ public class SafeSlingerActivity extends BaseActivity {              final FragmentActivity activity = SafeSlingerActivity.this; -            // Message is received after importing is done in KeychainIntentService +            // Message is received after importing is done in KeychainService              ServiceProgressHandler saveHandler = new ServiceProgressHandler(                      activity,                      getString(R.string.progress_importing),                      ProgressDialog.STYLE_HORIZONTAL, -                    true, -                    ProgressDialogFragment.ServiceType.KEYCHAIN_INTENT) { +                    true +            ) { +                @Override                  public void handleMessage(Message message) {                      // handle messages by standard KeychainIntentServiceHandler first                      super.handleMessage(message); @@ -176,9 +176,9 @@ public class SafeSlingerActivity extends BaseActivity {              Log.d(Constants.TAG, "importKeys started");              // Send all information needed to service to import key in other thread -            Intent intent = new Intent(activity, KeychainIntentService.class); +            Intent intent = new Intent(activity, KeychainService.class); -            intent.setAction(KeychainIntentService.ACTION_IMPORT_KEYRING); +            intent.setAction(KeychainService.ACTION_IMPORT_KEYRING);              // instead of giving the entries by Intent extra, cache them into a              // file to prevent Java Binder problems on heavy imports @@ -195,11 +195,11 @@ public class SafeSlingerActivity extends BaseActivity {                  // fill values for this action                  Bundle bundle = new Bundle(); -                intent.putExtra(KeychainIntentService.EXTRA_DATA, bundle); +                intent.putExtra(KeychainService.EXTRA_DATA, bundle);                  // Create a new Messenger for the communication back                  Messenger messenger = new Messenger(saveHandler); -                intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger); +                intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger);                  // show progress dialog                  saveHandler.showProgressDialog(activity); 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 5c8e6bb5d..2a195a4da 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/UploadKeyActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/UploadKeyActivity.java @@ -35,10 +35,9 @@ import org.sufficientlysecure.keychain.Constants;  import org.sufficientlysecure.keychain.R;  import org.sufficientlysecure.keychain.provider.KeychainContract;  import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings; -import org.sufficientlysecure.keychain.service.KeychainIntentService; +import org.sufficientlysecure.keychain.service.KeychainService;  import org.sufficientlysecure.keychain.ui.base.BaseActivity;  import org.sufficientlysecure.keychain.service.ServiceProgressHandler; -import org.sufficientlysecure.keychain.ui.dialog.ProgressDialogFragment;  import org.sufficientlysecure.keychain.util.Log;  import org.sufficientlysecure.keychain.util.Preferences; @@ -92,9 +91,9 @@ public class UploadKeyActivity extends BaseActivity {      private void uploadKey() {          // Send all information needed to service to upload key in other thread -        Intent intent = new Intent(this, KeychainIntentService.class); +        Intent intent = new Intent(this, KeychainService.class); -        intent.setAction(KeychainIntentService.ACTION_UPLOAD_KEYRING); +        intent.setAction(KeychainService.ACTION_UPLOAD_KEYRING);          // set data uri as path to keyring          Uri blobUri = KeyRings.buildUnifiedKeyRingUri(mDataUri); @@ -104,16 +103,17 @@ public class UploadKeyActivity extends BaseActivity {          Bundle data = new Bundle();          String server = (String) mKeyServerSpinner.getSelectedItem(); -        data.putString(KeychainIntentService.UPLOAD_KEY_SERVER, server); +        data.putString(KeychainService.UPLOAD_KEY_SERVER, server); -        intent.putExtra(KeychainIntentService.EXTRA_DATA, data); +        intent.putExtra(KeychainService.EXTRA_DATA, data); -        // Message is received after uploading is done in KeychainIntentService +        // Message is received after uploading is done in KeychainService          ServiceProgressHandler saveHandler = new ServiceProgressHandler(                  this,                  getString(R.string.progress_uploading), -                ProgressDialog.STYLE_HORIZONTAL, -                ProgressDialogFragment.ServiceType.KEYCHAIN_INTENT) { +                ProgressDialog.STYLE_HORIZONTAL +        ) { +            @Override              public void handleMessage(Message message) {                  // handle messages by standard KeychainIntentServiceHandler first                  super.handleMessage(message); @@ -129,7 +129,7 @@ public class UploadKeyActivity extends BaseActivity {          // Create a new Messenger for the communication back          Messenger messenger = new Messenger(saveHandler); -        intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger); +        intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger);          // show progress dialog          saveHandler.showProgressDialog(this); 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 9968855f7..995b07720 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java @@ -65,7 +65,7 @@ import org.sufficientlysecure.keychain.provider.CachedPublicKeyRing;  import org.sufficientlysecure.keychain.provider.KeychainContract;  import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;  import org.sufficientlysecure.keychain.provider.ProviderHelper; -import org.sufficientlysecure.keychain.service.KeychainIntentService; +import org.sufficientlysecure.keychain.service.KeychainService;  import org.sufficientlysecure.keychain.service.ServiceProgressHandler;  import org.sufficientlysecure.keychain.service.ServiceProgressHandler.MessageStatus;  import org.sufficientlysecure.keychain.service.PassphraseCacheService; @@ -402,8 +402,9 @@ public class ViewKeyActivity extends BaseNfcActivity implements      }      private void startCertifyIntent(Intent intent) { -        // Message is received after signing is done in KeychainIntentService +        // Message is received after signing is done in KeychainService          ServiceProgressHandler saveHandler = new ServiceProgressHandler(this) { +            @Override              public void handleMessage(Message message) {                  // handle messages by standard KeychainIntentServiceHandler first                  super.handleMessage(message); @@ -418,7 +419,7 @@ public class ViewKeyActivity extends BaseNfcActivity implements          };          // Create a new Messenger for the communication back          Messenger messenger = new Messenger(saveHandler); -        intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger); +        intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger);          startActivityForResult(intent, 0);      } @@ -651,8 +652,9 @@ public class ViewKeyActivity extends BaseNfcActivity implements          ArrayList<ParcelableKeyRing> entries = new ArrayList<>();          entries.add(keyEntry); -        // Message is received after importing is done in KeychainIntentService +        // Message is received after importing is done in KeychainService          ServiceProgressHandler serviceHandler = new ServiceProgressHandler(this) { +            @Override              public void handleMessage(Message message) {                  // handle messages by standard KeychainIntentServiceHandler first                  super.handleMessage(message); @@ -682,19 +684,19 @@ public class ViewKeyActivity extends BaseNfcActivity implements              Preferences prefs = Preferences.getPreferences(this);              Preferences.CloudSearchPrefs cloudPrefs =                      new Preferences.CloudSearchPrefs(true, true, prefs.getPreferredKeyserver()); -            data.putString(KeychainIntentService.IMPORT_KEY_SERVER, cloudPrefs.keyserver); +            data.putString(KeychainService.IMPORT_KEY_SERVER, cloudPrefs.keyserver);          } -        data.putParcelableArrayList(KeychainIntentService.IMPORT_KEY_LIST, entries); +        data.putParcelableArrayList(KeychainService.IMPORT_KEY_LIST, entries);          // Send all information needed to service to query keys in other thread -        Intent intent = new Intent(this, KeychainIntentService.class); -        intent.setAction(KeychainIntentService.ACTION_IMPORT_KEYRING); -        intent.putExtra(KeychainIntentService.EXTRA_DATA, data); +        Intent intent = new Intent(this, KeychainService.class); +        intent.setAction(KeychainService.ACTION_IMPORT_KEYRING); +        intent.putExtra(KeychainService.EXTRA_DATA, data);          // Create a new Messenger for the communication back          Messenger messenger = new Messenger(serviceHandler); -        intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger); +        intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger);          // show progress dialog          serviceHandler.showProgressDialog(this); 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 d5870d8c5..1f5c540ba 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyTrustFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyTrustFragment.java @@ -49,9 +49,8 @@ import com.textuality.keybase.lib.User;  import org.sufficientlysecure.keychain.Constants;  import org.sufficientlysecure.keychain.R;  import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings; -import org.sufficientlysecure.keychain.service.KeychainIntentService; +import org.sufficientlysecure.keychain.service.KeychainService;  import org.sufficientlysecure.keychain.service.ServiceProgressHandler; -import org.sufficientlysecure.keychain.ui.dialog.ProgressDialogFragment;  import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;  import org.sufficientlysecure.keychain.util.Log; @@ -350,13 +349,13 @@ public class ViewKeyTrustFragment extends LoaderFragment implements      }      private void verify(final Proof proof, final String fingerprint) { -        Intent intent = new Intent(getActivity(), KeychainIntentService.class); +        Intent intent = new Intent(getActivity(), KeychainService.class);          Bundle data = new Bundle(); -        intent.setAction(KeychainIntentService.ACTION_VERIFY_KEYBASE_PROOF); +        intent.setAction(KeychainService.ACTION_VERIFY_KEYBASE_PROOF); -        data.putString(KeychainIntentService.KEYBASE_PROOF, proof.toString()); -        data.putString(KeychainIntentService.KEYBASE_REQUIRED_FINGERPRINT, fingerprint); -        intent.putExtra(KeychainIntentService.EXTRA_DATA, data); +        data.putString(KeychainService.KEYBASE_PROOF, proof.toString()); +        data.putString(KeychainService.KEYBASE_REQUIRED_FINGERPRINT, fingerprint); +        intent.putExtra(KeychainService.EXTRA_DATA, data);          mProofVerifyDetail.setVisibility(View.GONE); @@ -365,8 +364,9 @@ public class ViewKeyTrustFragment extends LoaderFragment implements          ServiceProgressHandler handler = new ServiceProgressHandler(                  getActivity(),                  getString(R.string.progress_verifying_signature), -                ProgressDialog.STYLE_HORIZONTAL, -                ProgressDialogFragment.ServiceType.KEYCHAIN_INTENT) { +                ProgressDialog.STYLE_HORIZONTAL +        ) { +            @Override              public void handleMessage(Message message) {                  // handle messages by standard KeychainIntentServiceHandler first                  super.handleMessage(message); @@ -451,7 +451,7 @@ public class ViewKeyTrustFragment extends LoaderFragment implements          // Create a new Messenger for the communication back          Messenger messenger = new Messenger(handler); -        intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger); +        intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger);          // show progress dialog          handler.showProgressDialog(getActivity()); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyYubiKeyFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyYubiKeyFragment.java index b02bb0b83..ab25341d3 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyYubiKeyFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyYubiKeyFragment.java @@ -43,7 +43,7 @@ import org.sufficientlysecure.keychain.operations.results.DecryptVerifyResult;  import org.sufficientlysecure.keychain.operations.results.PromoteKeyResult;  import org.sufficientlysecure.keychain.pgp.CanonicalizedSecretKey.SecretKeyType;  import org.sufficientlysecure.keychain.provider.KeychainContract.Keys; -import org.sufficientlysecure.keychain.service.KeychainIntentService; +import org.sufficientlysecure.keychain.service.KeychainService;  import org.sufficientlysecure.keychain.service.ServiceProgressHandler;  import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils; @@ -129,6 +129,7 @@ public class ViewKeyYubiKeyFragment extends Fragment      public void promoteToSecretKey() {          ServiceProgressHandler saveHandler = new ServiceProgressHandler(getActivity()) { +            @Override              public void handleMessage(Message message) {                  // handle messages by standard KeychainIntentServiceHandler first                  super.handleMessage(message); @@ -147,25 +148,25 @@ public class ViewKeyYubiKeyFragment extends Fragment          };          // Send all information needed to service to decrypt in other thread -        Intent intent = new Intent(getActivity(), KeychainIntentService.class); +        Intent intent = new Intent(getActivity(), KeychainService.class);          // fill values for this action -        intent.setAction(KeychainIntentService.ACTION_PROMOTE_KEYRING); +        intent.setAction(KeychainService.ACTION_PROMOTE_KEYRING);          Bundle data = new Bundle(); -        data.putLong(KeychainIntentService.PROMOTE_MASTER_KEY_ID, mMasterKeyId); -        data.putByteArray(KeychainIntentService.PROMOTE_CARD_AID, mCardAid); +        data.putLong(KeychainService.PROMOTE_MASTER_KEY_ID, mMasterKeyId); +        data.putByteArray(KeychainService.PROMOTE_CARD_AID, mCardAid);          long[] subKeyIds = new long[mFingerprints.length];          for (int i = 0; i < subKeyIds.length; i++) {              subKeyIds[i] = KeyFormattingUtils.getKeyIdFromFingerprint(mFingerprints[i]);          } -        data.putLongArray(KeychainIntentService.PROMOTE_SUBKEY_IDS, subKeyIds); -        intent.putExtra(KeychainIntentService.EXTRA_DATA, data); +        data.putLongArray(KeychainService.PROMOTE_SUBKEY_IDS, subKeyIds); +        intent.putExtra(KeychainService.EXTRA_DATA, data);          // Create a new Messenger for the communication back          Messenger messenger = new Messenger(saveHandler); -        intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger); +        intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger);          // start service with intent          getActivity().startService(intent); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListCloudLoader.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListCloudLoader.java index 4781864dd..af919f3b6 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListCloudLoader.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListCloudLoader.java @@ -109,7 +109,7 @@ public class ImportKeysListCloudLoader                      ImportKeysListEntry uniqueEntry = searchResult.get(0);                      /*                       * set fingerprint explicitly after query -                     * to enforce a check when the key is imported by KeychainIntentService +                     * to enforce a check when the key is imported by KeychainService                       */                      uniqueEntry.setFingerprintHex(fingerprint);                      uniqueEntry.setSelected(true); 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 581a96e52..58dce50a7 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 @@ -36,7 +36,7 @@ import org.sufficientlysecure.keychain.R;  import org.sufficientlysecure.keychain.pgp.KeyRing;  import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;  import org.sufficientlysecure.keychain.provider.ProviderHelper; -import org.sufficientlysecure.keychain.service.KeychainIntentService; +import org.sufficientlysecure.keychain.service.KeychainService;  import org.sufficientlysecure.keychain.service.ServiceProgressHandler;  import org.sufficientlysecure.keychain.util.Log; @@ -130,17 +130,17 @@ public class DeleteKeyDialogFragment extends DialogFragment {              public void onClick(DialogInterface dialog, int which) {                  // Send all information needed to service to import key in other thread -                Intent intent = new Intent(getActivity(), KeychainIntentService.class); +                Intent intent = new Intent(getActivity(), KeychainService.class); -                intent.setAction(KeychainIntentService.ACTION_DELETE); +                intent.setAction(KeychainService.ACTION_DELETE); -                // Message is received after importing is done in KeychainIntentService +                // Message is received after importing is done in KeychainService                  ServiceProgressHandler saveHandler = new ServiceProgressHandler(                          getActivity(),                          getString(R.string.progress_deleting),                          ProgressDialog.STYLE_HORIZONTAL, -                        true, -                        ProgressDialogFragment.ServiceType.KEYCHAIN_INTENT) { +                        true +                ) {                      @Override                      public void handleMessage(Message message) {                          super.handleMessage(message); @@ -159,13 +159,13 @@ public class DeleteKeyDialogFragment extends DialogFragment {                  // fill values for this action                  Bundle data = new Bundle(); -                data.putLongArray(KeychainIntentService.DELETE_KEY_LIST, masterKeyIds); -                data.putBoolean(KeychainIntentService.DELETE_IS_SECRET, hasSecret); -                intent.putExtra(KeychainIntentService.EXTRA_DATA, data); +                data.putLongArray(KeychainService.DELETE_KEY_LIST, masterKeyIds); +                data.putBoolean(KeychainService.DELETE_IS_SECRET, hasSecret); +                intent.putExtra(KeychainService.EXTRA_DATA, data);                  // Create a new Messenger for the communication back                  Messenger messenger = new Messenger(saveHandler); -                intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger); +                intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger);                  // show progress dialog                  saveHandler.showProgressDialog(getActivity()); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ProgressDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ProgressDialogFragment.java index 562517c12..130d22b37 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ProgressDialogFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ProgressDialogFragment.java @@ -33,25 +33,18 @@ import android.view.View;  import android.view.View.OnClickListener;  import android.widget.Button; -import org.sufficientlysecure.keychain.Constants;  import org.sufficientlysecure.keychain.R; -import org.sufficientlysecure.keychain.service.CloudImportService; -import org.sufficientlysecure.keychain.service.KeychainIntentService; -import org.sufficientlysecure.keychain.util.Log; +import org.sufficientlysecure.keychain.service.KeychainService; +/** + * meant to be used + */  public class ProgressDialogFragment extends DialogFragment {      private static final String ARG_MESSAGE = "message";      private static final String ARG_STYLE = "style";      private static final String ARG_CANCELABLE = "cancelable";      private static final String ARG_SERVICE_TYPE = "service_class"; -    public enum ServiceType { -        KEYCHAIN_INTENT, -        CLOUD_IMPORT -    } - -    ServiceType mServiceType; -      boolean mCanCancel = false, mPreventCancel = false, mIsCancelled = false;      /** @@ -59,16 +52,13 @@ public class ProgressDialogFragment extends DialogFragment {       * @param message the message to be displayed initially above the progress bar       * @param style the progress bar style, as defined in ProgressDialog (horizontal or spinner)       * @param cancelable should we let the user cancel this operation -     * @param serviceType which Service this progress dialog is meant for       */ -    public static ProgressDialogFragment newInstance(String message, int style, boolean cancelable, -                                                     ServiceType serviceType) { +    public static ProgressDialogFragment newInstance(String message, int style, boolean cancelable) {          ProgressDialogFragment frag = new ProgressDialogFragment();          Bundle args = new Bundle();          args.putString(ARG_MESSAGE, message);          args.putInt(ARG_STYLE, style);          args.putBoolean(ARG_CANCELABLE, cancelable); -        args.putSerializable(ARG_SERVICE_TYPE, serviceType);          frag.setArguments(args); @@ -121,7 +111,6 @@ public class ProgressDialogFragment extends DialogFragment {          String message = getArguments().getString(ARG_MESSAGE);          int style = getArguments().getInt(ARG_STYLE);          mCanCancel = getArguments().getBoolean(ARG_CANCELABLE); -        mServiceType = (ServiceType) getArguments().getSerializable(ARG_SERVICE_TYPE);          dialog.setMessage(message);          dialog.setProgressStyle(style); @@ -189,23 +178,11 @@ public class ProgressDialogFragment extends DialogFragment {                  negative.setTextColor(Color.GRAY);                  // send a cancel message. note that this message will be handled by -                // KeychainIntentService.onStartCommand, which runs in this thread, +                // KeychainService.onStartCommand, which runs in this thread,                  // not the service one, and will not queue up a command. -                Intent serviceIntent = null; - -                switch (mServiceType) { -                    case CLOUD_IMPORT: -                        serviceIntent = new Intent(getActivity(), CloudImportService.class); -                        break; -                    case KEYCHAIN_INTENT: -                        serviceIntent = new Intent(getActivity(), KeychainIntentService.class); -                        break; -                    default: -                        //should never happen, unless we forget to include a ServiceType enum case -                        Log.e(Constants.TAG, "Unrecognized ServiceType at ProgressDialogFragment"); -                } +                Intent serviceIntent = new Intent(getActivity(), KeychainService.class); -                serviceIntent.setAction(KeychainIntentService.ACTION_CANCEL); +                serviceIntent.setAction(KeychainService.ACTION_CANCEL);                  getActivity().startService(serviceIntent);                  // Set the progress bar accordingly diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/EmailKeyHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/EmailKeyHelper.java index 8334b37ec..bbc08a2aa 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/EmailKeyHelper.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/EmailKeyHelper.java @@ -26,7 +26,7 @@ import org.sufficientlysecure.keychain.keyimport.HkpKeyserver;  import org.sufficientlysecure.keychain.keyimport.ImportKeysListEntry;  import org.sufficientlysecure.keychain.keyimport.Keyserver;  import org.sufficientlysecure.keychain.keyimport.ParcelableKeyRing; -import org.sufficientlysecure.keychain.service.KeychainIntentService; +import org.sufficientlysecure.keychain.service.KeychainService;  import java.util.ArrayList;  import java.util.HashSet; @@ -79,12 +79,12 @@ public class EmailKeyHelper {      }      private static void importKeys(Context context, Messenger messenger, ArrayList<ParcelableKeyRing> keys) { -        Intent importIntent = new Intent(context, KeychainIntentService.class); -        importIntent.setAction(KeychainIntentService.ACTION_IMPORT_KEYRING); +        Intent importIntent = new Intent(context, KeychainService.class); +        importIntent.setAction(KeychainService.ACTION_IMPORT_KEYRING);          Bundle importData = new Bundle(); -        importData.putParcelableArrayList(KeychainIntentService.IMPORT_KEY_LIST, keys); -        importIntent.putExtra(KeychainIntentService.EXTRA_DATA, importData); -        importIntent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger); +        importData.putParcelableArrayList(KeychainService.IMPORT_KEY_LIST, keys); +        importIntent.putExtra(KeychainService.EXTRA_DATA, importData); +        importIntent.putExtra(KeychainService.EXTRA_MESSENGER, messenger);          context.startService(importIntent);      } 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 7efb7c5af..88b0289d4 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ExportHelper.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ExportHelper.java @@ -27,9 +27,8 @@ import android.support.v4.app.FragmentActivity;  import org.sufficientlysecure.keychain.Constants;  import org.sufficientlysecure.keychain.R;  import org.sufficientlysecure.keychain.operations.results.ExportResult; -import org.sufficientlysecure.keychain.service.KeychainIntentService; +import org.sufficientlysecure.keychain.service.KeychainService;  import org.sufficientlysecure.keychain.service.ServiceProgressHandler; -import org.sufficientlysecure.keychain.ui.dialog.ProgressDialogFragment;  import java.io.File; @@ -79,29 +78,30 @@ public class ExportHelper {          Log.d(Constants.TAG, "exportKeys started");          // Send all information needed to service to export key in other thread -        final Intent intent = new Intent(mActivity, KeychainIntentService.class); +        final Intent intent = new Intent(mActivity, KeychainService.class); -        intent.setAction(KeychainIntentService.ACTION_EXPORT_KEYRING); +        intent.setAction(KeychainService.ACTION_EXPORT_KEYRING);          // fill values for this action          Bundle data = new Bundle(); -        data.putString(KeychainIntentService.EXPORT_FILENAME, mExportFile.getAbsolutePath()); -        data.putBoolean(KeychainIntentService.EXPORT_SECRET, exportSecret); +        data.putString(KeychainService.EXPORT_FILENAME, mExportFile.getAbsolutePath()); +        data.putBoolean(KeychainService.EXPORT_SECRET, exportSecret);          if (masterKeyIds == null) { -            data.putBoolean(KeychainIntentService.EXPORT_ALL, true); +            data.putBoolean(KeychainService.EXPORT_ALL, true);          } else { -            data.putLongArray(KeychainIntentService.EXPORT_KEY_RING_MASTER_KEY_ID, masterKeyIds); +            data.putLongArray(KeychainService.EXPORT_KEY_RING_MASTER_KEY_ID, masterKeyIds);          } -        intent.putExtra(KeychainIntentService.EXTRA_DATA, data); +        intent.putExtra(KeychainService.EXTRA_DATA, data); -        // Message is received after exporting is done in KeychainIntentService +        // Message is received after exporting is done in KeychainService          ServiceProgressHandler exportHandler = new ServiceProgressHandler(mActivity,                  mActivity.getString(R.string.progress_exporting), -                ProgressDialog.STYLE_HORIZONTAL, -                ProgressDialogFragment.ServiceType.KEYCHAIN_INTENT) { +                ProgressDialog.STYLE_HORIZONTAL +        ) { +            @Override              public void handleMessage(Message message) {                  // handle messages by standard KeychainIntentServiceHandler first                  super.handleMessage(message); @@ -118,7 +118,7 @@ public class ExportHelper {          // Create a new Messenger for the communication back          Messenger messenger = new Messenger(exportHandler); -        intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger); +        intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger);          // show progress dialog          exportHandler.showProgressDialog(mActivity); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/KeyUpdateHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/KeyUpdateHelper.java index 3bbd86d6a..8a614d64d 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/KeyUpdateHelper.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/KeyUpdateHelper.java @@ -51,15 +51,15 @@ public class KeyUpdateHelper {                  }                  // Start the service and update the keys -                Intent importIntent = new Intent(mContext, KeychainIntentService.class); -                importIntent.setAction(KeychainIntentService.ACTION_DOWNLOAD_AND_IMPORT_KEYS); +                Intent importIntent = new Intent(mContext, KeychainService.class); +                importIntent.setAction(KeychainService.ACTION_DOWNLOAD_AND_IMPORT_KEYS);                  Bundle importData = new Bundle(); -                importData.putParcelableArrayList(KeychainIntentService.DOWNLOAD_KEY_LIST, +                importData.putParcelableArrayList(KeychainService.DOWNLOAD_KEY_LIST,                          new ArrayList<ImportKeysListEntry>(keys)); -                importIntent.putExtra(KeychainIntentService.EXTRA_SERVICE_INTENT, importData); +                importIntent.putExtra(KeychainService.EXTRA_SERVICE_INTENT, importData); -                importIntent.putExtra(KeychainIntentService.EXTRA_MESSENGER, new Messenger(mHandler)); +                importIntent.putExtra(KeychainService.EXTRA_MESSENGER, new Messenger(mHandler));                  mContext.startService(importIntent);              } | 
