mirror of
https://github.com/moparisthebest/open-keychain
synced 2024-11-27 11:12:15 -05:00
multi-decrypt: fix progress with new CryptoFragment interfaces
This commit is contained in:
parent
cfa2ecca61
commit
d43671b2ed
@ -23,7 +23,6 @@ import java.util.ArrayList;
|
|||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import android.annotation.SuppressLint;
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
@ -32,9 +31,6 @@ import android.graphics.drawable.Drawable;
|
|||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.Handler;
|
|
||||||
import android.os.Message;
|
|
||||||
import android.os.Messenger;
|
|
||||||
import android.support.v7.widget.DefaultItemAnimator;
|
import android.support.v7.widget.DefaultItemAnimator;
|
||||||
import android.support.v7.widget.LinearLayoutManager;
|
import android.support.v7.widget.LinearLayoutManager;
|
||||||
import android.support.v7.widget.RecyclerView;
|
import android.support.v7.widget.RecyclerView;
|
||||||
@ -61,10 +57,6 @@ import org.sufficientlysecure.keychain.operations.results.DecryptVerifyResult;
|
|||||||
import org.sufficientlysecure.keychain.pgp.PgpDecryptVerifyInputParcel;
|
import org.sufficientlysecure.keychain.pgp.PgpDecryptVerifyInputParcel;
|
||||||
import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
|
import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
|
||||||
import org.sufficientlysecure.keychain.provider.TemporaryStorageProvider;
|
import org.sufficientlysecure.keychain.provider.TemporaryStorageProvider;
|
||||||
import org.sufficientlysecure.keychain.service.KeychainService;
|
|
||||||
import org.sufficientlysecure.keychain.service.ServiceProgressHandler;
|
|
||||||
import org.sufficientlysecure.keychain.service.ServiceProgressHandler.MessageStatus;
|
|
||||||
import org.sufficientlysecure.keychain.service.input.CryptoInputParcel;
|
|
||||||
// this import NEEDS to be above the ViewModel one, or it won't compile! (as of 06/06/15)
|
// this import NEEDS to be above the ViewModel one, or it won't compile! (as of 06/06/15)
|
||||||
import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils.StatusHolder;
|
import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils.StatusHolder;
|
||||||
import org.sufficientlysecure.keychain.ui.DecryptFilesListFragment.DecryptFilesAdapter.ViewModel;
|
import org.sufficientlysecure.keychain.ui.DecryptFilesListFragment.DecryptFilesAdapter.ViewModel;
|
||||||
@ -78,7 +70,7 @@ import org.sufficientlysecure.keychain.util.FileHelper;
|
|||||||
import org.sufficientlysecure.keychain.util.Log;
|
import org.sufficientlysecure.keychain.util.Log;
|
||||||
|
|
||||||
public class DecryptFilesListFragment
|
public class DecryptFilesListFragment
|
||||||
extends CryptoOperationFragment
|
extends CryptoOperationFragment<PgpDecryptVerifyInputParcel,DecryptVerifyResult>
|
||||||
implements OnMenuItemClickListener {
|
implements OnMenuItemClickListener {
|
||||||
public static final String ARG_URIS = "uris";
|
public static final String ARG_URIS = "uris";
|
||||||
|
|
||||||
@ -195,57 +187,77 @@ public class DecryptFilesListFragment
|
|||||||
cryptoOperation();
|
cryptoOperation();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void displayProgress(Uri uri, int progress, int max, String msg) {
|
@Override
|
||||||
mAdapter.setProgress(uri, progress, max, msg);
|
protected void onCryptoSetProgress(String msg, int progress, int max) {
|
||||||
|
mAdapter.setProgress(mCurrentInputUri, progress, max, msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void displayInputResult(final Uri uri, DecryptVerifyResult result) {
|
@Override
|
||||||
|
public void showProgressFragment(
|
||||||
|
String progressDialogMessage, int progressDialogStyle, boolean cancelable) {
|
||||||
|
// progress shown inline, so never mind
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void dismissProgress() {
|
||||||
|
// progress shown inline, so never mind
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCryptoOperationError(DecryptVerifyResult result) {
|
||||||
|
final Uri uri = mCurrentInputUri;
|
||||||
|
mCurrentInputUri = null;
|
||||||
|
|
||||||
|
mAdapter.addResult(uri, result, null, null, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCryptoOperationSuccess(DecryptVerifyResult result) {
|
||||||
|
final Uri uri = mCurrentInputUri;
|
||||||
|
mCurrentInputUri = null;
|
||||||
|
|
||||||
Drawable icon = null;
|
Drawable icon = null;
|
||||||
OnClickListener onFileClick = null, onKeyClick = null;
|
OnClickListener onFileClick = null, onKeyClick = null;
|
||||||
|
|
||||||
if (result.success()) {
|
if (result.getDecryptMetadata() != null && result.getDecryptMetadata().getMimeType() != null) {
|
||||||
|
icon = loadIcon(result.getDecryptMetadata().getMimeType());
|
||||||
|
}
|
||||||
|
|
||||||
if (result.getDecryptMetadata() != null && result.getDecryptMetadata().getMimeType() != null) {
|
OpenPgpSignatureResult sigResult = result.getSignatureResult();
|
||||||
icon = loadIcon(result.getDecryptMetadata().getMimeType());
|
if (sigResult != null) {
|
||||||
}
|
final long keyId = sigResult.getKeyId();
|
||||||
|
if (sigResult.getStatus() != OpenPgpSignatureResult.SIGNATURE_KEY_MISSING) {
|
||||||
OpenPgpSignatureResult sigResult = result.getSignatureResult();
|
onKeyClick = new OnClickListener() {
|
||||||
if (sigResult != null) {
|
|
||||||
final long keyId = sigResult.getKeyId();
|
|
||||||
if (sigResult.getStatus() != OpenPgpSignatureResult.SIGNATURE_KEY_MISSING) {
|
|
||||||
onKeyClick = new OnClickListener() {
|
|
||||||
@Override
|
|
||||||
public void onClick(View view) {
|
|
||||||
Activity activity = getActivity();
|
|
||||||
if (activity == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
Intent intent = new Intent(activity, ViewKeyActivity.class);
|
|
||||||
intent.setData(KeyRings.buildUnifiedKeyRingUri(keyId));
|
|
||||||
activity.startActivity(intent);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (result.success() && result.getDecryptMetadata() != null) {
|
|
||||||
final OpenPgpMetadata metadata = result.getDecryptMetadata();
|
|
||||||
onFileClick = new OnClickListener() {
|
|
||||||
@Override
|
@Override
|
||||||
public void onClick(View view) {
|
public void onClick(View view) {
|
||||||
Activity activity = getActivity();
|
Activity activity = getActivity();
|
||||||
if (activity == null || mCurrentInputUri != null) {
|
if (activity == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
Intent intent = new Intent(activity, ViewKeyActivity.class);
|
||||||
Uri outputUri = mOutputUris.get(uri);
|
intent.setData(KeyRings.buildUnifiedKeyRingUri(keyId));
|
||||||
Intent intent = new Intent();
|
|
||||||
intent.setDataAndType(outputUri, metadata.getMimeType());
|
|
||||||
activity.startActivity(intent);
|
activity.startActivity(intent);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (result.success() && result.getDecryptMetadata() != null) {
|
||||||
|
final OpenPgpMetadata metadata = result.getDecryptMetadata();
|
||||||
|
onFileClick = new OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View view) {
|
||||||
|
Activity activity = getActivity();
|
||||||
|
if (activity == null || mCurrentInputUri != null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Uri outputUri = mOutputUris.get(uri);
|
||||||
|
Intent intent = new Intent();
|
||||||
|
intent.setDataAndType(outputUri, metadata.getMimeType());
|
||||||
|
activity.startActivity(intent);
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
mAdapter.addResult(uri, result, icon, onFileClick, onKeyClick);
|
mAdapter.addResult(uri, result, icon, onFileClick, onKeyClick);
|
||||||
@ -253,104 +265,23 @@ public class DecryptFilesListFragment
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@SuppressLint("HandlerLeak")
|
protected PgpDecryptVerifyInputParcel createOperationInput() {
|
||||||
protected void cryptoOperation(CryptoInputParcel cryptoInput) {
|
|
||||||
|
|
||||||
if (mCurrentInputUri == null) {
|
if (mCurrentInputUri == null) {
|
||||||
|
|
||||||
if (mPendingInputUris.isEmpty()) {
|
if (mPendingInputUris.isEmpty()) {
|
||||||
return;
|
// nothing left to do
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
mCurrentInputUri = mPendingInputUris.remove(0);
|
mCurrentInputUri = mPendingInputUris.remove(0);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Send all information needed to service to decrypt in other thread
|
|
||||||
Intent intent = new Intent(getActivity(), KeychainService.class);
|
|
||||||
|
|
||||||
// fill values for this action
|
|
||||||
Bundle data = new Bundle();
|
|
||||||
// use current operation, either decrypt metadata or decrypt payload
|
|
||||||
intent.setAction(KeychainService.ACTION_DECRYPT_VERIFY);
|
|
||||||
|
|
||||||
// data
|
|
||||||
|
|
||||||
Uri currentOutputUri = mOutputUris.get(mCurrentInputUri);
|
Uri currentOutputUri = mOutputUris.get(mCurrentInputUri);
|
||||||
Log.d(Constants.TAG, "mInputUri=" + mCurrentInputUri + ", mOutputUri=" + currentOutputUri);
|
Log.d(Constants.TAG, "mInputUri=" + mCurrentInputUri + ", mOutputUri=" + currentOutputUri);
|
||||||
|
|
||||||
PgpDecryptVerifyInputParcel input = new PgpDecryptVerifyInputParcel(mCurrentInputUri, currentOutputUri)
|
return new PgpDecryptVerifyInputParcel(mCurrentInputUri, currentOutputUri)
|
||||||
.setAllowSymmetricDecryption(true);
|
.setAllowSymmetricDecryption(true);
|
||||||
|
|
||||||
data.putParcelable(KeychainService.DECRYPT_VERIFY_PARCEL, input);
|
|
||||||
data.putParcelable(KeychainService.EXTRA_CRYPTO_INPUT, cryptoInput);
|
|
||||||
|
|
||||||
intent.putExtra(KeychainService.EXTRA_DATA, data);
|
|
||||||
|
|
||||||
// Message is received after decrypting is done in KeychainIntentService
|
|
||||||
Handler saveHandler = new Handler() {
|
|
||||||
@Override
|
|
||||||
public void handleMessage(Message message) {
|
|
||||||
// handle messages by standard KeychainIntentServiceHandler first
|
|
||||||
super.handleMessage(message);
|
|
||||||
|
|
||||||
// handle pending messages
|
|
||||||
if (handlePendingMessage(message)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
MessageStatus status = MessageStatus.fromInt(message.arg1);
|
|
||||||
Bundle data = message.getData();
|
|
||||||
|
|
||||||
switch (status) {
|
|
||||||
case UNKNOWN:
|
|
||||||
case EXCEPTION: {
|
|
||||||
Log.e(Constants.TAG, "error: " + status);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case UPDATE_PROGRESS: {
|
|
||||||
int progress = data.getInt(ServiceProgressHandler.DATA_PROGRESS);
|
|
||||||
int max = data.getInt(ServiceProgressHandler.DATA_PROGRESS_MAX);
|
|
||||||
String msg;
|
|
||||||
if (data.containsKey(ServiceProgressHandler.DATA_MESSAGE_ID)) {
|
|
||||||
msg = getString(data.getInt(ServiceProgressHandler.DATA_MESSAGE_ID));
|
|
||||||
} else if (data.containsKey(ServiceProgressHandler.DATA_MESSAGE)) {
|
|
||||||
msg = data.getString(ServiceProgressHandler.DATA_MESSAGE);
|
|
||||||
} else {
|
|
||||||
msg = null;
|
|
||||||
}
|
|
||||||
displayProgress(mCurrentInputUri, progress, max, msg);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case OKAY: {
|
|
||||||
// get returned data bundle
|
|
||||||
Bundle returnData = message.getData();
|
|
||||||
|
|
||||||
DecryptVerifyResult result =
|
|
||||||
returnData.getParcelable(DecryptVerifyResult.EXTRA_RESULT);
|
|
||||||
|
|
||||||
if (result.success()) {
|
|
||||||
// display signature result in activity
|
|
||||||
displayInputResult(mCurrentInputUri, result);
|
|
||||||
mCurrentInputUri = null;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
result.createNotify(getActivity()).show(DecryptFilesListFragment.this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// Create a new Messenger for the communication back
|
|
||||||
Messenger messenger = new Messenger(saveHandler);
|
|
||||||
intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger);
|
|
||||||
|
|
||||||
// start service with intent
|
|
||||||
getActivity().startService(intent);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -193,6 +193,18 @@ public abstract class CryptoOperationFragment <T extends Parcelable, S extends O
|
|||||||
dismissProgress();
|
dismissProgress();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected void onCryptoSetProgress(String msg, int progress, int max) {
|
||||||
|
ProgressDialogFragment progressDialogFragment =
|
||||||
|
(ProgressDialogFragment) getFragmentManager().findFragmentByTag("progressDialog");
|
||||||
|
|
||||||
|
if (progressDialogFragment == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
progressDialogFragment.setProgress(msg, progress, max);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unused") // it's an EventBus method
|
@SuppressWarnings("unused") // it's an EventBus method
|
||||||
public void onEventMainThread(OperationResult result) {
|
public void onEventMainThread(OperationResult result) {
|
||||||
|
|
||||||
@ -219,16 +231,7 @@ public abstract class CryptoOperationFragment <T extends Parcelable, S extends O
|
|||||||
|
|
||||||
@SuppressWarnings("unused") // it's an EventBus method
|
@SuppressWarnings("unused") // it's an EventBus method
|
||||||
public void onEventMainThread(ProgressEvent event) {
|
public void onEventMainThread(ProgressEvent event) {
|
||||||
|
onCryptoSetProgress(event.mMessage, event.mProgress, event.mMax);
|
||||||
ProgressDialogFragment progressDialogFragment =
|
|
||||||
(ProgressDialogFragment) getFragmentManager().findFragmentByTag("progressDialog");
|
|
||||||
|
|
||||||
if (progressDialogFragment == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
progressDialogFragment.setProgress(event.mMessage, event.mProgress, event.mMax);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user