delete targe file after unsuccessful image compression

Daniel Gultsch created

Change summary

src/main/java/eu/siacs/conversations/persistance/FileBackend.java | 51 
1 file changed, 32 insertions(+), 19 deletions(-)

Detailed changes

src/main/java/eu/siacs/conversations/persistance/FileBackend.java 🔗

@@ -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);