preliminary working mime parsing in DecryptListFragment! (beware WIP, here be dragons!)

This commit is contained in:
Vincent Breitmoser
2015-09-16 00:05:21 +02:00
parent 326834fd58
commit 99fd1f4c22
4 changed files with 66 additions and 50 deletions

View File

@@ -70,6 +70,8 @@ public class InputDataOperation extends BaseOperation<InputDataParcel> {
Uri currentUri; Uri currentUri;
DecryptVerifyResult decryptResult = null;
PgpDecryptVerifyInputParcel decryptInput = input.getDecryptInput(); PgpDecryptVerifyInputParcel decryptInput = input.getDecryptInput();
if (decryptInput != null) { if (decryptInput != null) {
@@ -83,11 +85,11 @@ public class InputDataOperation extends BaseOperation<InputDataParcel> {
currentUri = TemporaryStorageProvider.createFile(mContext); currentUri = TemporaryStorageProvider.createFile(mContext);
decryptInput.setOutputUri(currentUri); decryptInput.setOutputUri(currentUri);
DecryptVerifyResult result = op.execute(decryptInput, cryptoInput); decryptResult = op.execute(decryptInput, cryptoInput);
if (result.isPending()) { if (decryptResult.isPending()) {
return new InputDataResult(log, result); return new InputDataResult(log, decryptResult);
} }
log.addByMerge(result, 2); log.addByMerge(decryptResult, 2);
} else { } else {
currentUri = input.getInputUri(); currentUri = input.getInputUri();
@@ -106,7 +108,7 @@ public class InputDataOperation extends BaseOperation<InputDataParcel> {
uris.add(currentUri); uris.add(currentUri);
log.add(LogType.MSG_DATA_OK, 1); log.add(LogType.MSG_DATA_OK, 1);
return new InputDataResult(InputDataResult.RESULT_OK, log, uris); return new InputDataResult(InputDataResult.RESULT_OK, log, decryptResult, uris);
} }
@@ -117,7 +119,7 @@ public class InputDataOperation extends BaseOperation<InputDataParcel> {
in = mContext.getContentResolver().openInputStream(currentUri); in = mContext.getContentResolver().openInputStream(currentUri);
} catch (FileNotFoundException e) { } catch (FileNotFoundException e) {
log.add(LogType.MSG_DATA_ERROR_IO, 2); log.add(LogType.MSG_DATA_ERROR_IO, 2);
return new InputDataResult(InputDataResult.RESULT_ERROR, log, null); return new InputDataResult(InputDataResult.RESULT_ERROR, log);
} }
MimeStreamParser parser = new MimeStreamParser((MimeConfig) null); MimeStreamParser parser = new MimeStreamParser((MimeConfig) null);
@@ -176,16 +178,16 @@ public class InputDataOperation extends BaseOperation<InputDataParcel> {
log.add(LogType.MSG_DATA_MIME_OK, 2); log.add(LogType.MSG_DATA_MIME_OK, 2);
log.add(LogType.MSG_DATA_OK, 1); log.add(LogType.MSG_DATA_OK, 1);
return new InputDataResult(InputDataResult.RESULT_OK, log, outputUris); return new InputDataResult(InputDataResult.RESULT_OK, log, decryptResult, outputUris);
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
log.add(LogType.MSG_DATA_MIME_ERROR, 2); log.add(LogType.MSG_DATA_MIME_ERROR, 2);
return new InputDataResult(InputDataResult.RESULT_ERROR, log, null); return new InputDataResult(InputDataResult.RESULT_ERROR, log);
} catch (MimeException e) { } catch (MimeException e) {
e.printStackTrace(); e.printStackTrace();
log.add(LogType.MSG_DATA_MIME_ERROR, 2); log.add(LogType.MSG_DATA_MIME_ERROR, 2);
return new InputDataResult(InputDataResult.RESULT_ERROR, log, outputUris); return new InputDataResult(InputDataResult.RESULT_ERROR, log);
} }
} }

View File

@@ -25,21 +25,30 @@ import java.util.ArrayList;
public class InputDataResult extends InputPendingResult { public class InputDataResult extends InputPendingResult {
public final ArrayList<Uri> mOutputUris; public final ArrayList<Uri> mOutputUris;
public DecryptVerifyResult mDecryptVerifyResult; final public DecryptVerifyResult mDecryptVerifyResult;
public InputDataResult(OperationLog log, InputPendingResult result) { public InputDataResult(OperationLog log, InputPendingResult result) {
super(log, result); super(log, result);
mOutputUris = null; mOutputUris = null;
mDecryptVerifyResult = null;
} }
public InputDataResult(int result, OperationLog log, ArrayList<Uri> temporaryUris) { public InputDataResult(int result, OperationLog log, DecryptVerifyResult decryptResult, ArrayList<Uri> temporaryUris) {
super(result, log); super(result, log);
mOutputUris = temporaryUris; mOutputUris = temporaryUris;
mDecryptVerifyResult = decryptResult;
}
public InputDataResult(int result, OperationLog log) {
super(result, log);
mOutputUris = null;
mDecryptVerifyResult = null;
} }
protected InputDataResult(Parcel in) { protected InputDataResult(Parcel in) {
super(in); super(in);
mOutputUris = in.createTypedArrayList(Uri.CREATOR); mOutputUris = in.createTypedArrayList(Uri.CREATOR);
mDecryptVerifyResult = in.readParcelable(DecryptVerifyResult.class.getClassLoader());
} }
public ArrayList<Uri> getOutputUris() { public ArrayList<Uri> getOutputUris() {
@@ -55,6 +64,7 @@ public class InputDataResult extends InputPendingResult {
public void writeToParcel(Parcel dest, int flags) { public void writeToParcel(Parcel dest, int flags) {
super.writeToParcel(dest, flags); super.writeToParcel(dest, flags);
dest.writeTypedList(mOutputUris); dest.writeTypedList(mOutputUris);
dest.writeParcelable(mDecryptVerifyResult, 0);
} }
public static final Creator<InputDataResult> CREATOR = new Creator<InputDataResult>() { public static final Creator<InputDataResult> CREATOR = new Creator<InputDataResult>() {

View File

@@ -33,6 +33,7 @@ public class InputDataParcel implements Parcelable {
public InputDataParcel(Uri inputUri, PgpDecryptVerifyInputParcel decryptInput) { public InputDataParcel(Uri inputUri, PgpDecryptVerifyInputParcel decryptInput) {
mInputUri = inputUri; mInputUri = inputUri;
mDecryptInput = decryptInput;
} }
InputDataParcel(Parcel source) { InputDataParcel(Parcel source) {

View File

@@ -58,10 +58,12 @@ import org.openintents.openpgp.OpenPgpSignatureResult;
import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.operations.results.DecryptVerifyResult; import org.sufficientlysecure.keychain.operations.results.DecryptVerifyResult;
import org.sufficientlysecure.keychain.operations.results.InputDataResult;
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;
// 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.service.InputDataParcel;
import org.sufficientlysecure.keychain.ui.base.QueueingCryptoOperationFragment; import org.sufficientlysecure.keychain.ui.base.QueueingCryptoOperationFragment;
import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils.StatusHolder; import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils.StatusHolder;
import org.sufficientlysecure.keychain.ui.DecryptListFragment.DecryptFilesAdapter.ViewModel; import org.sufficientlysecure.keychain.ui.DecryptListFragment.DecryptFilesAdapter.ViewModel;
@@ -76,7 +78,7 @@ import org.sufficientlysecure.keychain.util.ParcelableHashMap;
public class DecryptListFragment public class DecryptListFragment
extends QueueingCryptoOperationFragment<PgpDecryptVerifyInputParcel,DecryptVerifyResult> extends QueueingCryptoOperationFragment<InputDataParcel,InputDataResult>
implements OnMenuItemClickListener { implements OnMenuItemClickListener {
public static final String ARG_INPUT_URIS = "input_uris"; public static final String ARG_INPUT_URIS = "input_uris";
@@ -88,7 +90,7 @@ public class DecryptListFragment
public static final String ARG_CURRENT_URI = "current_uri"; public static final String ARG_CURRENT_URI = "current_uri";
private ArrayList<Uri> mInputUris; private ArrayList<Uri> mInputUris;
private HashMap<Uri, Uri> mOutputUris; private HashMap<Uri, InputDataResult> mInputDataResults;
private ArrayList<Uri> mPendingInputUris; private ArrayList<Uri> mPendingInputUris;
private ArrayList<Uri> mCancelledInputUris; private ArrayList<Uri> mCancelledInputUris;
@@ -141,19 +143,19 @@ public class DecryptListFragment
outState.putParcelableArrayList(ARG_INPUT_URIS, mInputUris); outState.putParcelableArrayList(ARG_INPUT_URIS, mInputUris);
HashMap<Uri,DecryptVerifyResult> results = new HashMap<>(mInputUris.size()); HashMap<Uri,InputDataResult> results = new HashMap<>(mInputUris.size());
for (Uri uri : mInputUris) { for (Uri uri : mInputUris) {
if (mPendingInputUris.contains(uri)) { if (mPendingInputUris.contains(uri)) {
continue; continue;
} }
DecryptVerifyResult result = mAdapter.getItemResult(uri); InputDataResult result = mAdapter.getItemResult(uri);
if (result != null) { if (result != null) {
results.put(uri, result); results.put(uri, result);
} }
} }
outState.putParcelable(ARG_RESULTS, new ParcelableHashMap<>(results)); outState.putParcelable(ARG_RESULTS, new ParcelableHashMap<>(results));
outState.putParcelable(ARG_OUTPUT_URIS, new ParcelableHashMap<>(mOutputUris)); outState.putParcelable(ARG_OUTPUT_URIS, new ParcelableHashMap<>(mInputDataResults));
outState.putParcelableArrayList(ARG_CANCELLED_URIS, mCancelledInputUris); outState.putParcelableArrayList(ARG_CANCELLED_URIS, mCancelledInputUris);
outState.putParcelable(ARG_CURRENT_URI, mCurrentInputUri); outState.putParcelable(ARG_CURRENT_URI, mCurrentInputUri);
@@ -167,23 +169,20 @@ public class DecryptListFragment
ArrayList<Uri> inputUris = getArguments().getParcelableArrayList(ARG_INPUT_URIS); ArrayList<Uri> inputUris = getArguments().getParcelableArrayList(ARG_INPUT_URIS);
ArrayList<Uri> cancelledUris = args.getParcelableArrayList(ARG_CANCELLED_URIS); ArrayList<Uri> cancelledUris = args.getParcelableArrayList(ARG_CANCELLED_URIS);
ParcelableHashMap<Uri,Uri> outputUris = args.getParcelable(ARG_OUTPUT_URIS); ParcelableHashMap<Uri,InputDataResult> results = args.getParcelable(ARG_RESULTS);
ParcelableHashMap<Uri,DecryptVerifyResult> results = args.getParcelable(ARG_RESULTS);
Uri currentInputUri = args.getParcelable(ARG_CURRENT_URI); Uri currentInputUri = args.getParcelable(ARG_CURRENT_URI);
displayInputUris(inputUris, currentInputUri, cancelledUris, displayInputUris(inputUris, currentInputUri, cancelledUris,
outputUris != null ? outputUris.getMap() : null,
results != null ? results.getMap() : null results != null ? results.getMap() : null
); );
} }
private void displayInputUris(ArrayList<Uri> inputUris, Uri currentInputUri, private void displayInputUris(ArrayList<Uri> inputUris, Uri currentInputUri,
ArrayList<Uri> cancelledUris, HashMap<Uri,Uri> outputUris, ArrayList<Uri> cancelledUris, HashMap<Uri,InputDataResult> results) {
HashMap<Uri,DecryptVerifyResult> results) {
mInputUris = inputUris; mInputUris = inputUris;
mCurrentInputUri = currentInputUri; mCurrentInputUri = currentInputUri;
mOutputUris = outputUris != null ? outputUris : new HashMap<Uri,Uri>(inputUris.size()); mInputDataResults = results != null ? results : new HashMap<Uri,InputDataResult>(inputUris.size());
mCancelledInputUris = cancelledUris != null ? cancelledUris : new ArrayList<Uri>(); mCancelledInputUris = cancelledUris != null ? cancelledUris : new ArrayList<Uri>();
mPendingInputUris = new ArrayList<>(); mPendingInputUris = new ArrayList<>();
@@ -206,9 +205,8 @@ public class DecryptListFragment
} }
if (results != null && results.containsKey(uri)) { if (results != null && results.containsKey(uri)) {
processResult(uri, results.get(uri)); processResult(uri);
} else { } else {
mOutputUris.put(uri, TemporaryStorageProvider.createFile(getActivity()));
mPendingInputUris.add(uri); mPendingInputUris.add(uri);
} }
} }
@@ -224,7 +222,7 @@ public class DecryptListFragment
case REQUEST_CODE_OUTPUT: { case REQUEST_CODE_OUTPUT: {
// This happens after output file was selected, so start our operation // This happens after output file was selected, so start our operation
if (resultCode == Activity.RESULT_OK && data != null) { if (resultCode == Activity.RESULT_OK && data != null) {
Uri decryptedFileUri = mOutputUris.get(mCurrentInputUri); Uri decryptedFileUri = mInputDataResults.get(mCurrentInputUri).getOutputUris().get(0);
Uri saveUri = data.getData(); Uri saveUri = data.getData();
saveFile(decryptedFileUri, saveUri); saveFile(decryptedFileUri, saveUri);
mCurrentInputUri = null; mCurrentInputUri = null;
@@ -260,7 +258,7 @@ public class DecryptListFragment
} }
@Override @Override
public void onQueuedOperationError(DecryptVerifyResult result) { public void onQueuedOperationError(InputDataResult result) {
final Uri uri = mCurrentInputUri; final Uri uri = mCurrentInputUri;
mCurrentInputUri = null; mCurrentInputUri = null;
@@ -270,11 +268,12 @@ public class DecryptListFragment
} }
@Override @Override
public void onQueuedOperationSuccess(DecryptVerifyResult result) { public void onQueuedOperationSuccess(InputDataResult result) {
Uri uri = mCurrentInputUri; Uri uri = mCurrentInputUri;
mCurrentInputUri = null; mCurrentInputUri = null;
processResult(uri, result); mInputDataResults.put(uri, result);
processResult(uri);
cryptoOperation(); cryptoOperation();
} }
@@ -298,19 +297,21 @@ public class DecryptListFragment
} }
private void processResult(final Uri uri, final DecryptVerifyResult result) { private void processResult(final Uri uri) {
new AsyncTask<Void, Void, Drawable>() { new AsyncTask<Void, Void, Drawable>() {
@Override @Override
protected Drawable doInBackground(Void... params) { protected Drawable doInBackground(Void... params) {
InputDataResult result = mInputDataResults.get(uri);
Context context = getActivity(); Context context = getActivity();
if (result.getDecryptionMetadata() == null || context == null) { if (result.mDecryptVerifyResult.getDecryptionMetadata() == null || context == null) {
return null; return null;
} }
String type = result.getDecryptionMetadata().getMimeType(); String type = result.mDecryptVerifyResult.getDecryptionMetadata().getMimeType();
Uri outputUri = mOutputUris.get(uri); Uri outputUri = result.getOutputUris().get(0);
if (type == null || outputUri == null) { if (type == null || outputUri == null) {
return null; return null;
} }
@@ -339,17 +340,19 @@ public class DecryptListFragment
@Override @Override
protected void onPostExecute(Drawable icon) { protected void onPostExecute(Drawable icon) {
processResult(uri, result, icon); processResult(uri, icon);
} }
}.execute(); }.execute();
} }
private void processResult(final Uri uri, DecryptVerifyResult result, Drawable icon) { private void processResult(final Uri uri, Drawable icon) {
InputDataResult result = mInputDataResults.get(uri);
OnClickListener onFileClick = null, onKeyClick = null; OnClickListener onFileClick = null, onKeyClick = null;
OpenPgpSignatureResult sigResult = result.getSignatureResult(); OpenPgpSignatureResult sigResult = result.mDecryptVerifyResult.getSignatureResult();
if (sigResult != null) { if (sigResult != null) {
final long keyId = sigResult.getKeyId(); final long keyId = sigResult.getKeyId();
if (sigResult.getResult() != OpenPgpSignatureResult.RESULT_KEY_MISSING) { if (sigResult.getResult() != OpenPgpSignatureResult.RESULT_KEY_MISSING) {
@@ -368,7 +371,7 @@ public class DecryptListFragment
} }
} }
if (result.success() && result.getDecryptionMetadata() != null) { if (result.success() && result.mDecryptVerifyResult.getDecryptionMetadata() != null) {
onFileClick = new OnClickListener() { onFileClick = new OnClickListener() {
@Override @Override
public void onClick(View view) { public void onClick(View view) {
@@ -403,8 +406,8 @@ public class DecryptListFragment
return; return;
} }
final Uri outputUri = mOutputUris.get(uri); final Uri outputUri = mInputDataResults.get(uri).getOutputUris().get(0);
final DecryptVerifyResult result = mAdapter.getItemResult(uri); final DecryptVerifyResult result = mAdapter.getItemResult(uri).mDecryptVerifyResult;
if (outputUri == null || result == null) { if (outputUri == null || result == null) {
return; return;
} }
@@ -460,7 +463,7 @@ public class DecryptListFragment
} }
@Override @Override
public PgpDecryptVerifyInputParcel createOperationInput() { public InputDataParcel createOperationInput() {
if (mCurrentInputUri == null) { if (mCurrentInputUri == null) {
if (mPendingInputUris.isEmpty()) { if (mPendingInputUris.isEmpty()) {
@@ -471,11 +474,11 @@ public class DecryptListFragment
mCurrentInputUri = mPendingInputUris.remove(0); mCurrentInputUri = mPendingInputUris.remove(0);
} }
Uri currentOutputUri = mOutputUris.get(mCurrentInputUri); Log.d(Constants.TAG, "mInputUri=" + mCurrentInputUri);
Log.d(Constants.TAG, "mInputUri=" + mCurrentInputUri + ", mOutputUri=" + currentOutputUri);
return new PgpDecryptVerifyInputParcel(mCurrentInputUri, currentOutputUri) PgpDecryptVerifyInputParcel decryptInput = new PgpDecryptVerifyInputParcel()
.setAllowSymmetricDecryption(true); .setAllowSymmetricDecryption(true);
return new InputDataParcel(mCurrentInputUri, decryptInput);
} }
@@ -496,7 +499,7 @@ public class DecryptListFragment
} }
ViewModel model = mAdapter.mMenuClickedModel; ViewModel model = mAdapter.mMenuClickedModel;
DecryptVerifyResult result = model.mResult; DecryptVerifyResult result = model.mResult.mDecryptVerifyResult;
switch (menuItem.getItemId()) { switch (menuItem.getItemId()) {
case R.id.view_log: case R.id.view_log:
Intent intent = new Intent(activity, LogDisplayActivity.class); Intent intent = new Intent(activity, LogDisplayActivity.class);
@@ -553,7 +556,7 @@ public class DecryptListFragment
} }
public static class DecryptFilesAdapter extends RecyclerView.Adapter<ViewHolder> { public class DecryptFilesAdapter extends RecyclerView.Adapter<ViewHolder> {
private Context mContext; private Context mContext;
private ArrayList<ViewModel> mDataset; private ArrayList<ViewModel> mDataset;
private OnMenuItemClickListener mMenuItemClickListener; private OnMenuItemClickListener mMenuItemClickListener;
@@ -562,7 +565,7 @@ public class DecryptListFragment
public class ViewModel { public class ViewModel {
Context mContext; Context mContext;
Uri mInputUri; Uri mInputUri;
DecryptVerifyResult mResult; InputDataResult mResult;
Drawable mIcon; Drawable mIcon;
OnClickListener mOnFileClickListener; OnClickListener mOnFileClickListener;
@@ -580,7 +583,7 @@ public class DecryptListFragment
mCancelled = null; mCancelled = null;
} }
void addResult(DecryptVerifyResult result) { void addResult(InputDataResult result) {
mResult = result; mResult = result;
} }
@@ -701,9 +704,9 @@ public class DecryptListFragment
holder.vAnimator.setDisplayedChild(1); holder.vAnimator.setDisplayedChild(1);
} }
KeyFormattingUtils.setStatus(mContext, holder, model.mResult); KeyFormattingUtils.setStatus(mContext, holder, model.mResult.mDecryptVerifyResult);
final OpenPgpMetadata metadata = model.mResult.getDecryptionMetadata(); final OpenPgpMetadata metadata = model.mResult.mDecryptVerifyResult.getDecryptionMetadata();
String filename; String filename;
if (metadata == null) { if (metadata == null) {
@@ -775,7 +778,7 @@ public class DecryptListFragment
return mDataset.size(); return mDataset.size();
} }
public DecryptVerifyResult getItemResult(Uri uri) { public InputDataResult getItemResult(Uri uri) {
ViewModel model = new ViewModel(mContext, uri); ViewModel model = new ViewModel(mContext, uri);
int pos = mDataset.indexOf(model); int pos = mDataset.indexOf(model);
if (pos == -1) { if (pos == -1) {
@@ -806,7 +809,7 @@ public class DecryptListFragment
notifyItemChanged(pos); notifyItemChanged(pos);
} }
public void addResult(Uri uri, DecryptVerifyResult result, Drawable icon, public void addResult(Uri uri, InputDataResult result, Drawable icon,
OnClickListener onFileClick, OnClickListener onKeyClick) { OnClickListener onFileClick, OnClickListener onKeyClick) {
ViewModel model = new ViewModel(mContext, uri); ViewModel model = new ViewModel(mContext, uri);