From 6a5bd6509b088cf8cee3e9ddf9a5eac5a33de98a Mon Sep 17 00:00:00 2001 From: Vincent Breitmoser Date: Tue, 23 Jun 2015 16:58:40 +0200 Subject: implement saving of files --- .../keychain/ui/DecryptListFragment.java | 25 +++++++++++++++-- .../keychain/util/FileHelper.java | 31 ++++++++++++++++++++++ 2 files changed, 54 insertions(+), 2 deletions(-) (limited to 'OpenKeychain/src/main/java/org/sufficientlysecure/keychain') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptListFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptListFragment.java index 422a12a2e..0d527926d 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptListFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptListFragment.java @@ -19,6 +19,7 @@ package org.sufficientlysecure.keychain.ui; import java.io.File; +import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -220,8 +221,7 @@ public class DecryptListFragment if (resultCode == Activity.RESULT_OK && data != null) { Uri saveUri = data.getData(); Uri outputUri = mOutputUris.get(mCurrentInputUri); - // TODO save from outputUri to saveUri - + saveFile(saveUri, outputUri); mCurrentInputUri = null; } return; @@ -233,6 +233,21 @@ public class DecryptListFragment } } + private void saveFile(Uri outputUri, Uri saveUri) { + Activity activity = getActivity(); + if (activity == null) { + return; + } + + try { + FileHelper.copyUriData(activity, outputUri, saveUri); + Notify.create(activity, R.string.file_saved, Style.ERROR).show(); + } catch (IOException e) { + Log.e(Constants.TAG, "error saving file", e); + Notify.create(activity, R.string.error_saving_file, Style.ERROR).show(); + } + } + @Override protected void cryptoOperation(CryptoInputParcel cryptoInput) { super.cryptoOperation(cryptoInput, false); @@ -448,6 +463,12 @@ public class DecryptListFragment if (mAdapter.mMenuClickedModel == null || !mAdapter.mMenuClickedModel.hasResult()) { return false; } + + // don't process menu items until all items are done! + if (!mPendingInputUris.isEmpty()) { + return true; + } + Activity activity = getActivity(); if (activity == null) { return false; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/FileHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/FileHelper.java index e223217ef..4a00f46cb 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/FileHelper.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/FileHelper.java @@ -20,6 +20,7 @@ package org.sufficientlysecure.keychain.util; import android.annotation.TargetApi; import android.app.Activity; import android.content.ActivityNotFoundException; +import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.database.Cursor; @@ -41,8 +42,11 @@ import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.compatibility.DialogFragmentWorkaround; import org.sufficientlysecure.keychain.ui.dialog.FileDialogFragment; +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; import java.io.ByteArrayOutputStream; import java.io.File; +import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; @@ -267,6 +271,33 @@ public class FileHelper { } + public static void copyUriData(Context context, Uri fromUri, Uri toUri) throws IOException { + BufferedInputStream bis = null; + BufferedOutputStream bos = null; + + try { + ContentResolver resolver = context.getContentResolver(); + bis = new BufferedInputStream(resolver.openInputStream(fromUri)); + bos = new BufferedOutputStream(resolver.openOutputStream(toUri)); + byte[] buf = new byte[1024]; + int len; + while ( (len = bis.read(buf)) > 0) { + bos.write(buf, 0, len); + } + } finally { + try { + if (bis != null) { + bis.close(); + } + if (bos != null) { + bos.close(); + } + } catch (IOException e) { + // ignore, it's just stream closin' + } + } + } + public interface FileDialogCallback { void onFileSelected(File file, boolean checked); } -- cgit v1.2.3