@@ -33,6 +33,8 @@ import androidx.annotation.StringRes;
import androidx.core.content.FileProvider;
import androidx.exifinterface.media.ExifInterface;
+import com.google.common.io.ByteStreams;
+
import java.io.ByteArrayOutputStream;
import java.io.Closeable;
import java.io.File;
@@ -627,20 +629,20 @@ public class FileBackend {
private void copyFileToPrivateStorage(File file, Uri uri) throws FileCopyException {
Log.d(Config.LOGTAG, "copy file (" + uri.toString() + ") to private storage " + file.getAbsolutePath());
file.getParentFile().mkdirs();
- OutputStream os = null;
- InputStream is = null;
try {
file.createNewFile();
- os = new FileOutputStream(file);
- is = mXmppConnectionService.getContentResolver().openInputStream(uri);
- byte[] buffer = new byte[1024];
- int length;
- while ((length = is.read(buffer)) > 0) {
- try {
- os.write(buffer, 0, length);
- } catch (IOException e) {
- throw new FileWriterException();
- }
+ } catch (IOException e) {
+ throw new FileCopyException(R.string.error_unable_to_create_temporary_file);
+ }
+ try (final OutputStream os = new FileOutputStream(file);
+ final InputStream is = mXmppConnectionService.getContentResolver().openInputStream(uri)) {
+ if (is == null) {
+ throw new FileCopyException(R.string.error_file_not_found);
+ }
+ try {
+ ByteStreams.copy(is, os);
+ } catch (IOException e) {
+ throw new FileWriterException();
}
try {
os.flush();
@@ -648,16 +650,17 @@ public class FileBackend {
throw new FileWriterException();
}
} catch (final FileNotFoundException e) {
+ cleanup(file);
throw new FileCopyException(R.string.error_file_not_found);
} catch (final FileWriterException e) {
+ cleanup(file);
throw new FileCopyException(R.string.error_unable_to_create_temporary_file);
} catch (final SecurityException e) {
+ cleanup(file);
throw new FileCopyException(R.string.error_security_exception);
} catch (final IOException e) {
+ cleanup(file);
throw new FileCopyException(R.string.error_io_exception);
- } finally {
- close(os);
- close(is);
}
}
@@ -708,7 +711,7 @@ public class FileBackend {
private void copyImageToPrivateStorage(File file, Uri image, int sampleSize) throws FileCopyException, ImageCompressionException {
final File parent = file.getParentFile();
- if (parent.mkdirs()) {
+ if (parent != null && parent.mkdirs()) {
Log.d(Config.LOGTAG, "created parent directory");
}
InputStream is = null;
@@ -753,13 +756,15 @@ public class FileBackend {
}
scaledBitmap.recycle();
} catch (final FileNotFoundException e) {
+ cleanup(file);
throw new FileCopyException(R.string.error_file_not_found);
- } catch (IOException e) {
- e.printStackTrace();
+ } catch (final IOException e) {
+ cleanup(file);
throw new FileCopyException(R.string.error_io_exception);
} catch (SecurityException e) {
+ cleanup(file);
throw new FileCopyException(R.string.error_security_exception_during_image_copy);
- } catch (OutOfMemoryError e) {
+ } catch (final OutOfMemoryError e) {
++sampleSize;
if (sampleSize <= 3) {
copyImageToPrivateStorage(file, image, sampleSize);
@@ -772,6 +777,14 @@ public class FileBackend {
}
}
+ private static void cleanup(final File file) {
+ try {
+ file.delete();
+ } catch (Exception e) {
+
+ }
+ }
+
public void copyImageToPrivateStorage(File file, Uri image) throws FileCopyException, ImageCompressionException {
Log.d(Config.LOGTAG, "copy image (" + image.toString() + ") to private storage " + file.getAbsolutePath());
copyImageToPrivateStorage(file, image, 0);