From 6e425e95f55c16cbc61dd60a4f84aca60af71215 Mon Sep 17 00:00:00 2001 From: Adithya Abraham Philip Date: Wed, 24 Jun 2015 01:15:11 +0530 Subject: migrated delete op to KeychainNewService --- .../keychain/operations/DeleteOperation.java | 12 ++- .../keychain/service/KeychainNewService.java | 8 +- .../keychain/service/KeychainService.java | 23 ----- .../service/input/DeleteKeyringParcel.java | 44 +++++++++ .../keychain/ui/base/CryptoOperationHelper.java | 7 +- .../ui/dialog/DeleteKeyDialogFragment.java | 107 +++++++++++++-------- 6 files changed, 131 insertions(+), 70 deletions(-) create mode 100644 OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/input/DeleteKeyringParcel.java (limited to 'OpenKeychain/src/main/java/org/sufficientlysecure/keychain') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/DeleteOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/DeleteOperation.java index 5ef04ab05..06f7ee752 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/DeleteOperation.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/DeleteOperation.java @@ -27,7 +27,10 @@ import org.sufficientlysecure.keychain.pgp.Progressable; import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRingData; import org.sufficientlysecure.keychain.provider.ProviderHelper; import org.sufficientlysecure.keychain.service.ContactSyncAdapterService; +import org.sufficientlysecure.keychain.service.input.CryptoInputParcel; +import org.sufficientlysecure.keychain.service.input.DeleteKeyringParcel; import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils; +import org.sufficientlysecure.keychain.util.Log; /** An operation which implements a high level keyring delete operation. * @@ -37,13 +40,18 @@ import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils; * a list. * */ -public class DeleteOperation extends BaseOperation { +public class DeleteOperation extends BaseOperation { public DeleteOperation(Context context, ProviderHelper providerHelper, Progressable progressable) { super(context, providerHelper, progressable); } - public DeleteResult execute(long[] masterKeyIds, boolean isSecret) { + @Override + public DeleteResult execute(DeleteKeyringParcel deleteKeyringParcel, + CryptoInputParcel cryptoInputParcel) { + + long[] masterKeyIds = deleteKeyringParcel.mMasterKeyIds; + boolean isSecret = deleteKeyringParcel.mIsSecret; OperationLog log = new OperationLog(); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainNewService.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainNewService.java index adf5b7585..3e76f38e4 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainNewService.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainNewService.java @@ -41,6 +41,7 @@ import org.sufficientlysecure.keychain.provider.ProviderHelper; import org.sufficientlysecure.keychain.service.CertifyActionsParcel.CertifyAction; import org.sufficientlysecure.keychain.service.ServiceProgressHandler.MessageStatus; import org.sufficientlysecure.keychain.service.input.CryptoInputParcel; +import org.sufficientlysecure.keychain.service.input.DeleteKeyringParcel; import org.sufficientlysecure.keychain.util.Log; /** @@ -103,6 +104,9 @@ public class KeychainNewService extends Service implements Progressable { } else if (inputParcel instanceof CertifyAction) { op = new CertifyOperation(outerThis, new ProviderHelper(outerThis), outerThis, mActionCanceled); + } else if (inputParcel instanceof DeleteKeyringParcel){ + Log.e("PHILIP", "delete in KeychainNewService"); + op = new DeleteOperation(outerThis, new ProviderHelper(outerThis), outerThis); } else if (inputParcel instanceof ImportKeyringParcel || inputParcel instanceof ExportKeyringParcel){ op = new ImportExportOperation(outerThis, new ProviderHelper(outerThis), @@ -110,10 +114,10 @@ public class KeychainNewService extends Service implements Progressable { } else { return; } - + Log.e("PHILIP", "exec in KeychainNewService"); @SuppressWarnings("unchecked") // this is unchecked, we make sure it's the correct op above! OperationResult result = op.execute(inputParcel, cryptoInput); - + Log.e("PHILIP", "result in KeychainNewService" + result); sendMessageToHandler(MessageStatus.OKAY, result); } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainService.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainService.java index 83e435c96..13cb4ff6b 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainService.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainService.java @@ -87,12 +87,8 @@ public class KeychainService extends Service implements Progressable { public static final String ACTION_VERIFY_KEYBASE_PROOF = Constants.INTENT_PREFIX + "VERIFY_KEYBASE_PROOF"; - 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_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"; @@ -103,10 +99,6 @@ public class KeychainService extends Service implements Progressable { public static final String KEYBASE_REQUIRED_FINGERPRINT = "keybase_required_fingerprint"; public static final String KEYBASE_PROOF = "keybase_proof"; - // delete keyring(s) - public static final String DELETE_KEY_LIST = "delete_list"; - public static final String DELETE_IS_SECRET = "delete_is_secret"; - // promote key public static final String PROMOTE_MASTER_KEY_ID = "promote_master_key_id"; public static final String PROMOTE_CARD_AID = "promote_card_aid"; @@ -281,21 +273,6 @@ public class KeychainService extends Service implements Progressable { break; } - case ACTION_DELETE: { - - // Input - long[] masterKeyIds = data.getLongArray(DELETE_KEY_LIST); - boolean isSecret = data.getBoolean(DELETE_IS_SECRET); - - // Operation - DeleteOperation op = new DeleteOperation(KeychainService.this, providerHelper, KeychainService.this); - DeleteResult result = op.execute(masterKeyIds, isSecret); - - // Result - sendMessageToHandler(MessageStatus.OKAY, result); - - break; - } case ACTION_PROMOTE_KEYRING: { // Input diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/input/DeleteKeyringParcel.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/input/DeleteKeyringParcel.java new file mode 100644 index 000000000..cb61921e1 --- /dev/null +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/input/DeleteKeyringParcel.java @@ -0,0 +1,44 @@ +package org.sufficientlysecure.keychain.service.input; + +import android.os.Parcel; +import android.os.Parcelable; + +public class DeleteKeyringParcel implements Parcelable { + + public long[] mMasterKeyIds; + public boolean mIsSecret; + + public DeleteKeyringParcel(long[] masterKeyIds, boolean isSecret) { + mMasterKeyIds = masterKeyIds; + mIsSecret = isSecret; + } + + protected DeleteKeyringParcel(Parcel in) { + mIsSecret = in.readByte() != 0x00; + mMasterKeyIds = in.createLongArray(); + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeByte((byte) (mIsSecret ? 0x01 : 0x00)); + dest.writeLongArray(mMasterKeyIds); + } + + public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { + @Override + public DeleteKeyringParcel createFromParcel(Parcel in) { + return new DeleteKeyringParcel(in); + } + + @Override + public DeleteKeyringParcel[] newArray(int size) { + return new DeleteKeyringParcel[size]; + } + }; +} + diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/CryptoOperationHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/CryptoOperationHelper.java index 43106820f..a9002cf4a 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/CryptoOperationHelper.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/CryptoOperationHelper.java @@ -208,6 +208,11 @@ public class CryptoOperationHelper { private static final String ARG_MESSENGER = "messenger"; private static final String ARG_DELETE_MASTER_KEY_IDS = "delete_master_key_ids"; @@ -52,6 +58,13 @@ public class DeleteKeyDialogFragment extends DialogFragment { private TextView mMainMessage; private View mInflateView; + private Messenger mMessenger; + + // for CryptoOperationHelper.Callback + private long[] mMasterKeyIds; + private boolean mHasSecret; + private CryptoOperationHelper mDeleteOpHelper; + /** * Creates new instance of this delete file dialog fragment */ @@ -67,10 +80,18 @@ public class DeleteKeyDialogFragment extends DialogFragment { return frag; } + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + if (mDeleteOpHelper != null) { + mDeleteOpHelper.handleActivityResult(requestCode, resultCode, data); + } + super.onActivityResult(requestCode, resultCode, data); + } + @Override public Dialog onCreateDialog(Bundle savedInstanceState) { final FragmentActivity activity = getActivity(); - final Messenger messenger = getArguments().getParcelable(ARG_MESSENGER); + mMessenger = getArguments().getParcelable(ARG_MESSENGER); final long[] masterKeyIds = getArguments().getLongArray(ARG_DELETE_MASTER_KEY_IDS); @@ -129,47 +150,16 @@ public class DeleteKeyDialogFragment extends DialogFragment { @Override public void onClick(DialogInterface dialog, int which) { - // Send all information needed to service to import key in other thread - Intent intent = new Intent(getActivity(), KeychainService.class); - - intent.setAction(KeychainService.ACTION_DELETE); - - // Message is received after importing is done in KeychainService - ServiceProgressHandler saveHandler = new ServiceProgressHandler(getActivity()) { - @Override - public void handleMessage(Message message) { - super.handleMessage(message); - // handle messages by standard KeychainIntentServiceHandler first - if (message.arg1 == MessageStatus.OKAY.ordinal()) { - try { - Message msg = Message.obtain(); - msg.copyFrom(message); - messenger.send(msg); - } catch (RemoteException e) { - Log.e(Constants.TAG, "messenger error", e); - } - } - } - }; - - // fill values for this action - Bundle data = new Bundle(); - 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(KeychainService.EXTRA_MESSENGER, messenger); - - // show progress dialog - saveHandler.showProgressDialog(getString(R.string.progress_deleting), - ProgressDialog.STYLE_HORIZONTAL, true); - - // start service with intent - getActivity().startService(intent); + mMasterKeyIds = masterKeyIds; + mHasSecret = hasSecret; - dismiss(); + mDeleteOpHelper = new CryptoOperationHelper<> + (DeleteKeyDialogFragment.this, DeleteKeyDialogFragment.this, + R.string.progress_deleting); + mDeleteOpHelper.cryptoOperation(); + // do NOT dismiss here, it'll give + // OperationHelper a null fragmentManager + // dismiss(); } }); builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { @@ -183,4 +173,37 @@ public class DeleteKeyDialogFragment extends DialogFragment { return builder.show(); } + @Override + public DeleteKeyringParcel createOperationInput() { + return new DeleteKeyringParcel(mMasterKeyIds, mHasSecret); + } + + @Override + public void onCryptoOperationSuccess(DeleteResult result) { + handleResult(result); + } + + @Override + public void onCryptoOperationCancelled() { + + } + + @Override + public void onCryptoOperationError(DeleteResult result) { + handleResult(result); + } + + public void handleResult(DeleteResult result) { + try { + Bundle data = new Bundle(); + data.putParcelable(OperationResult.EXTRA_RESULT, result); + Message msg = Message.obtain(); + msg.arg1 = ServiceProgressHandler.MessageStatus.OKAY.ordinal(); + msg.setData(data); + mMessenger.send(msg); + } catch (RemoteException e) { + Log.e(Constants.TAG, "messenger error", e); + } + dismiss(); + } } -- cgit v1.2.3