diff options
Diffstat (limited to 'OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFilesFragment.java')
-rw-r--r-- | OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFilesFragment.java | 168 |
1 files changed, 54 insertions, 114 deletions
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 d1c005868..cd66902ba 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFilesFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFilesFragment.java @@ -17,6 +17,7 @@ package org.sufficientlysecure.keychain.ui; +import android.annotation.SuppressLint; import android.app.Activity; import android.app.ProgressDialog; import android.content.Intent; @@ -32,7 +33,6 @@ import android.view.ViewGroup; import android.widget.CheckBox; import android.widget.TextView; -import org.openintents.openpgp.util.OpenPgpApi; import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.operations.results.DecryptVerifyResult; @@ -64,6 +64,8 @@ public class DecryptFilesFragment extends DecryptFragment { private Uri mInputUri = null; private Uri mOutputUri = null; + private String mCurrentCryptoOperation; + /** * Creates new instance of this fragment */ @@ -145,7 +147,7 @@ public class DecryptFilesFragment extends DecryptFragment { return; } -// decryptOriginalFilename(); + startDecryptFilenames(); } private String removeEncryptedAppend(String name) { @@ -158,121 +160,45 @@ public class DecryptFilesFragment extends DecryptFragment { } private void askForOutputFilename(String originalFilename) { - String targetName; - if (!TextUtils.isEmpty(originalFilename)) { - targetName = originalFilename; - } else { - targetName = removeEncryptedAppend(FileHelper.getFilename(getActivity(), mInputUri)); + if (TextUtils.isEmpty(originalFilename)) { + originalFilename = removeEncryptedAppend(FileHelper.getFilename(getActivity(), mInputUri)); } + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { File file = new File(mInputUri.getPath()); File parentDir = file.exists() ? file.getParentFile() : Constants.Path.APP_DIR; - File targetFile = new File(parentDir, targetName); + File targetFile = new File(parentDir, originalFilename); FileHelper.saveFile(this, getString(R.string.title_decrypt_to_file), getString(R.string.specify_file_to_decrypt_to), targetFile, REQUEST_CODE_OUTPUT); } else { - FileHelper.saveDocument(this, "*/*", targetName, REQUEST_CODE_OUTPUT); + FileHelper.saveDocument(this, "*/*", originalFilename, REQUEST_CODE_OUTPUT); } } + private void startDecrypt() { + mCurrentCryptoOperation = KeychainIntentService.ACTION_DECRYPT_VERIFY; + cryptoOperation(new CryptoInputParcel()); + } - // TODO: also needs to use cryptoOperation!!! (switch between this and normal decrypt -// private void decryptOriginalFilename() { -// Log.d(Constants.TAG, "decryptOriginalFilename"); -// -// Intent intent = new Intent(getActivity(), KeychainIntentService.class); -// -// // fill values for this action -// Bundle data = new Bundle(); -// intent.setAction(KeychainIntentService.ACTION_DECRYPT_METADATA); -// -// // data -// Log.d(Constants.TAG, "mInputUri=" + mInputUri + ", mOutputUri=" + mOutputUri); -// -// data.putInt(KeychainIntentService.SOURCE, IOType.URI.ordinal()); -// data.putParcelable(KeychainIntentService.ENCRYPT_DECRYPT_INPUT_URI, mInputUri); -// -// data.putInt(KeychainIntentService.TARGET, IOType.URI.ordinal()); -// data.putParcelable(KeychainIntentService.ENCRYPT_DECRYPT_OUTPUT_URI, mOutputUri); -// -// data.putParcelable(KeychainIntentService.DECRYPT_PASSPHRASE, mPassphrase); -// data.putByteArray(KeychainIntentService.DECRYPT_NFC_DECRYPTED_SESSION_KEY, mNfcDecryptedSessionKey); -// -// intent.putExtra(KeychainIntentService.EXTRA_SERVICE_INTENT, data); -// -// // Message is received after decrypting is done in KeychainIntentService -// ServiceProgressHandler saveHandler = new ServiceProgressHandler( -// getActivity(), -// getString(R.string.progress_decrypting), -// ProgressDialog.STYLE_HORIZONTAL, -// ProgressDialogFragment.ServiceType.KEYCHAIN_INTENT) { -// public void handleMessage(Message message) { -// // handle messages by standard KeychainIntentServiceHandler first -// super.handleMessage(message); -// -// // handle pending messages -// if (handlePendingMessage(message)) { -// return; -// } -// -// if (message.arg1 == MessageStatus.OKAY.ordinal()) { -// // get returned data bundle -// Bundle returnData = message.getData(); -// -// DecryptVerifyResult pgpResult = -// returnData.getParcelable(DecryptVerifyResult.EXTRA_RESULT); -// -// if (pgpResult.isPending()) { -// if ((pgpResult.getResult() & DecryptVerifyResult.RESULT_PENDING_ASYM_PASSPHRASE) == -// DecryptVerifyResult.RESULT_PENDING_ASYM_PASSPHRASE) { -// startPassphraseDialog(pgpResult.getKeyIdPassphraseNeeded()); -// } else if ((pgpResult.getResult() & DecryptVerifyResult.RESULT_PENDING_SYM_PASSPHRASE) == -// DecryptVerifyResult.RESULT_PENDING_SYM_PASSPHRASE) { -// startPassphraseDialog(Constants.key.symmetric); -// } else if ((pgpResult.getResult() & DecryptVerifyResult.RESULT_PENDING_NFC) == -// DecryptVerifyResult.RESULT_PENDING_NFC) { -// startNfcDecrypt(pgpResult.getNfcSubKeyId(), pgpResult.getNfcPassphrase(), pgpResult.getNfcEncryptedSessionKey()); -// } else { -// throw new RuntimeException("Unhandled pending result!"); -// } -// } else if (pgpResult.success()) { -// // go on... -// askForOutputFilename(pgpResult.getDecryptMetadata().getFilename()); -// } else { -// pgpResult.createNotify(getActivity()).show(); -// } -// } -// } -// }; -// -// // Create a new Messenger for the communication back -// Messenger messenger = new Messenger(saveHandler); -// intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger); -// -// // show progress dialog -// saveHandler.showProgressDialog(getActivity()); -// -// // start service with intent -// getActivity().startService(intent); -// } - - private void decryptStart() { + private void startDecryptFilenames() { + mCurrentCryptoOperation = KeychainIntentService.ACTION_DECRYPT_METADATA; cryptoOperation(new CryptoInputParcel()); } @Override + @SuppressLint("HandlerLeak") protected void cryptoOperation(CryptoInputParcel cryptoInput) { - Log.d(Constants.TAG, "decryptStart"); - // Send all information needed to service to decrypt in other thread Intent intent = new Intent(getActivity(), KeychainIntentService.class); // fill values for this action Bundle data = new Bundle(); - - intent.setAction(KeychainIntentService.ACTION_DECRYPT_VERIFY); + // use current operation, either decrypt metadata or decrypt payload + intent.setAction(mCurrentCryptoOperation); // data + data.putParcelable(KeychainIntentService.EXTRA_CRYPTO_INPUT, cryptoInput); + Log.d(Constants.TAG, "mInputUri=" + mInputUri + ", mOutputUri=" + mOutputUri); data.putInt(KeychainIntentService.SOURCE, IOType.URI.ordinal()); @@ -281,8 +207,8 @@ public class DecryptFilesFragment extends DecryptFragment { data.putInt(KeychainIntentService.TARGET, IOType.URI.ordinal()); data.putParcelable(KeychainIntentService.ENCRYPT_DECRYPT_OUTPUT_URI, mOutputUri); - data.putParcelable(KeychainIntentService.DECRYPT_PASSPHRASE, mPassphrase); - data.putByteArray(KeychainIntentService.DECRYPT_NFC_DECRYPTED_SESSION_KEY, mNfcDecryptedSessionKey); +// data.putParcelable(KeychainIntentService.DECRYPT_PASSPHRASE, mPassphrase); +// data.putByteArray(KeychainIntentService.DECRYPT_NFC_DECRYPTED_SESSION_KEY, mNfcDecryptedSessionKey); intent.putExtra(KeychainIntentService.EXTRA_DATA, data); @@ -292,6 +218,7 @@ public class DecryptFilesFragment extends DecryptFragment { getString(R.string.progress_decrypting), ProgressDialog.STYLE_HORIZONTAL, ProgressDialogFragment.ServiceType.KEYCHAIN_INTENT) { + @Override public void handleMessage(Message message) { // handle messages by standard KeychainIntentServiceHandler first super.handleMessage(message); @@ -324,24 +251,37 @@ public class DecryptFilesFragment extends DecryptFragment { if (pgpResult.success()) { - // display signature result in activity - onResult(pgpResult); - - if (mDeleteAfter.isChecked()) { - // Create and show dialog to delete original file - DeleteFileDialogFragment deleteFileDialog = DeleteFileDialogFragment.newInstance(mInputUri); - deleteFileDialog.show(getActivity().getSupportFragmentManager(), "deleteDialog"); - setInputUri(null); - } - - /* - // A future open after decryption feature - if () { - Intent viewFile = new Intent(Intent.ACTION_VIEW); - viewFile.setInputData(mOutputUri); - startActivity(viewFile); + switch (mCurrentCryptoOperation) { + case KeychainIntentService.ACTION_DECRYPT_METADATA: { + askForOutputFilename(pgpResult.getDecryptMetadata().getFilename()); + break; + } + case KeychainIntentService.ACTION_DECRYPT_VERIFY: { + // display signature result in activity + onResult(pgpResult); + + if (mDeleteAfter.isChecked()) { + // Create and show dialog to delete original file + DeleteFileDialogFragment deleteFileDialog = DeleteFileDialogFragment.newInstance(mInputUri); + deleteFileDialog.show(getActivity().getSupportFragmentManager(), "deleteDialog"); + setInputUri(null); + } + + /* + // A future open after decryption feature + if () { + Intent viewFile = new Intent(Intent.ACTION_VIEW); + viewFile.setInputData(mOutputUri); + startActivity(viewFile); + } + */ + break; + } + default: { + Log.e(Constants.TAG, "Bug: not supported operation!"); + break; + } } - */ } else { pgpResult.createNotify(getActivity()).show(); } @@ -391,7 +331,7 @@ public class DecryptFilesFragment extends DecryptFragment { // This happens after output file was selected, so start our operation if (resultCode == Activity.RESULT_OK && data != null) { mOutputUri = data.getData(); - decryptStart(); + startDecrypt(); } return; } |