use full file name for all new files

Daniel Gultsch created

Change summary

src/main/java/eu/siacs/conversations/crypto/PgpDecryptionService.java               |  9 
src/main/java/eu/siacs/conversations/http/HttpDownloadConnection.java               |  9 
src/main/java/eu/siacs/conversations/persistance/FileBackend.java                   | 40 
src/main/java/eu/siacs/conversations/services/AttachFileToConversationRunnable.java |  2 
src/main/java/eu/siacs/conversations/ui/util/ViewUtil.java                          | 14 
src/main/java/eu/siacs/conversations/xmpp/jingle/JingleFileTransferConnection.java  |  8 
6 files changed, 53 insertions(+), 29 deletions(-)

Detailed changes

src/main/java/eu/siacs/conversations/crypto/PgpDecryptionService.java 🔗

@@ -9,6 +9,7 @@ import org.openintents.openpgp.util.OpenPgpApi;
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
+import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
@@ -194,9 +195,9 @@ public class PgpDecryptionService {
 							String originalExtension = originalFilename == null ? null : MimeUtils.extractRelevantExtension(originalFilename);
 							if (originalExtension != null && MimeUtils.extractRelevantExtension(outputFile.getName()) == null) {
 								Log.d(Config.LOGTAG,"detected original filename during pgp decryption");
-								String mime = MimeUtils.guessMimeTypeFromExtension(originalExtension);
-								String path = outputFile.getName()+"."+originalExtension;
-								DownloadableFile fixedFile = mXmppConnectionService.getFileBackend().getFileForPath(path,mime);
+								final String mime = MimeUtils.guessMimeTypeFromExtension(originalExtension);
+								final String filename = outputFile.getName()+"."+originalExtension;
+								final File fixedFile = mXmppConnectionService.getFileBackend().getStorageLocation(filename,mime);
 								if (fixedFile.getParentFile().mkdirs()) {
 									Log.d(Config.LOGTAG,"created parent directories for "+fixedFile.getAbsolutePath());
 								}
@@ -205,7 +206,7 @@ public class PgpDecryptionService {
 								}
 								if (outputFile.renameTo(fixedFile)) {
 									Log.d(Config.LOGTAG, "renamed " + outputFile.getAbsolutePath() + " to " + fixedFile.getAbsolutePath());
-									message.setRelativeFilePath(path);
+									message.setRelativeFilePath(fixedFile.getAbsolutePath());
 								}
 							}
 							final String url = message.getFileParams().url;

src/main/java/eu/siacs/conversations/http/HttpDownloadConnection.java 🔗

@@ -96,11 +96,8 @@ public class HttpDownloadConnection implements Transferable {
                 this.message.setEncryption(Message.ENCRYPTION_NONE);
             }
             final String ext = extension.getExtension();
-            if (ext != null) {
-                message.setRelativeFilePath(String.format("%s.%s", message.getUuid(), ext));
-            } else if (Strings.isNullOrEmpty(message.getRelativeFilePath())) {
-                message.setRelativeFilePath(message.getUuid());
-            }
+            final String filename = Strings.isNullOrEmpty(ext) ? message.getUuid() : String.format("%s.%s", message.getUuid(), ext);
+            mXmppConnectionService.getFileBackend().setupRelativeFilePath(message, filename);
             setupFile();
             if (this.message.getEncryption() == Message.ENCRYPTION_AXOLOTL && this.file.getKey() == null) {
                 this.message.setEncryption(Message.ENCRYPTION_NONE);
@@ -326,7 +323,7 @@ public class HttpDownloadConnection implements Transferable {
                 if (Strings.isNullOrEmpty(extension.getExtension()) && contentType != null) {
                     final String fileExtension = MimeUtils.guessExtensionFromMimeType(contentType);
                     if (fileExtension != null) {
-                        message.setRelativeFilePath(String.format("%s.%s", message.getUuid(), fileExtension));
+                        mXmppConnectionService.getFileBackend().setupRelativeFilePath(message, String.format("%s.%s", message.getUuid(), fileExtension), contentType);
                         Log.d(Config.LOGTAG, "rewriting name after not finding extension in url but in content type");
                         setupFile();
                     }

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

@@ -533,7 +533,7 @@ public class FileBackend {
                 MimeUtils.guessMimeTypeFromExtension(MimeUtils.extractRelevantExtension(path)));
     }
 
-    public DownloadableFile getFileForPath(final String path, final String mime) {
+    private DownloadableFile getFileForPath(final String path, final String mime) {
         if (path.startsWith("/")) {
             return new DownloadableFile(path);
         } else {
@@ -719,7 +719,7 @@ public class FileBackend {
         if ("ogg".equals(extension) && type != null && type.startsWith("audio/")) {
             extension = "oga";
         }
-        message.setRelativeFilePath(message.getUuid() + "." + extension);
+        setupRelativeFilePath(message, String.format("%s.%s", message.getUuid(), extension));
         copyFileToPrivateStorage(mXmppConnectionService.getFileBackend().getFile(message), uri);
     }
 
@@ -852,21 +852,51 @@ public class FileBackend {
 
     public void copyImageToPrivateStorage(Message message, Uri image)
             throws FileCopyException, ImageCompressionException {
+        final String filename;
         switch (Config.IMAGE_FORMAT) {
             case JPEG:
-                message.setRelativeFilePath(message.getUuid() + ".jpg");
+                filename = String.format("%s.%s", message.getUuid(), "jpg");
                 break;
             case PNG:
-                message.setRelativeFilePath(message.getUuid() + ".png");
+                filename = String.format("%s.%s", message.getUuid(), "png");
                 break;
             case WEBP:
-                message.setRelativeFilePath(message.getUuid() + ".webp");
+                filename = String.format("%s.%s", message.getUuid(), "webp");
                 break;
+            default:
+                throw new IllegalStateException("Unknown image format");
         }
+        setupRelativeFilePath(message, filename);
         copyImageToPrivateStorage(getFile(message), image);
         updateFileParams(message);
     }
 
+    public void setupRelativeFilePath(final Message message, final String filename) {
+        final String extension = MimeUtils.extractRelevantExtension(filename);
+        final String mime = MimeUtils.guessMimeTypeFromExtension(extension);
+        setupRelativeFilePath(message, filename, mime);
+    }
+
+    public File getStorageLocation(final String filename, final String mime) {
+        final File parentDirectory;
+        if (Strings.isNullOrEmpty(mime)) {
+            parentDirectory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
+        } else if (mime.startsWith("image/")) {
+            parentDirectory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
+        } else if (mime.startsWith("video/")) {
+            parentDirectory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES);
+        } else {
+            parentDirectory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
+        }
+        final File appDirectory = new File(parentDirectory, mXmppConnectionService.getString(R.string.app_name));
+        return new File(appDirectory, filename);
+    }
+
+    public void setupRelativeFilePath(final Message message, final String filename,  final String mime) {
+        final File file = getStorageLocation(filename, mime);
+        message.setRelativeFilePath(file.getAbsolutePath());
+    }
+
     public boolean unusualBounds(final Uri image) {
         try {
             final BitmapFactory.Options options = new BitmapFactory.Options();

src/main/java/eu/siacs/conversations/services/AttachFileToConversationRunnable.java 🔗

@@ -91,7 +91,7 @@ public class AttachFileToConversationRunnable implements Runnable, TranscoderLis
     private void processAsVideo() throws FileNotFoundException {
         Log.d(Config.LOGTAG, "processing file as video");
         mXmppConnectionService.startForcingForegroundNotification();
-        message.setRelativeFilePath(message.getUuid() + ".mp4");
+        mXmppConnectionService.getFileBackend().setupRelativeFilePath(message, String.format("%s.%s", message.getUuid(), "mp4"));
         final DownloadableFile file = mXmppConnectionService.getFileBackend().getFile(message);
         if (Objects.requireNonNull(file.getParentFile()).mkdirs()) {
             Log.d(Config.LOGTAG, "created parent directory for video file");

src/main/java/eu/siacs/conversations/ui/util/ViewUtil.java 🔗

@@ -37,9 +37,10 @@ public class ViewUtil {
         view(context, file, mime);
     }
 
-    public static void view(Context context, File file, String mime) {
-        Intent openIntent = new Intent(Intent.ACTION_VIEW);
-        Uri uri;
+    private static void view(Context context, File file, String mime) {
+        Log.d(Config.LOGTAG,"viewing "+file.getAbsolutePath()+" "+mime);
+        final Intent openIntent = new Intent(Intent.ACTION_VIEW);
+        final Uri uri;
         try {
             uri = FileBackend.getUriForFile(context, file);
         } catch (SecurityException e) {
@@ -49,14 +50,9 @@ public class ViewUtil {
         }
         openIntent.setDataAndType(uri, mime);
         openIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
-        PackageManager manager = context.getPackageManager();
-        List<ResolveInfo> info = manager.queryIntentActivities(openIntent, 0);
-        if (info.size() == 0) {
-            openIntent.setDataAndType(uri, "*/*");
-        }
         try {
             context.startActivity(openIntent);
-        } catch (ActivityNotFoundException e) {
+        } catch (final ActivityNotFoundException e) {
             Toast.makeText(context, R.string.no_application_found_to_open_file, Toast.LENGTH_SHORT).show();
         }
     }

src/main/java/eu/siacs/conversations/xmpp/jingle/JingleFileTransferConnection.java 🔗

@@ -492,19 +492,19 @@ public class JingleFileTransferConnection extends AbstractJingleConnection imple
                 AbstractConnectionManager.Extension extension = AbstractConnectionManager.Extension.of(path);
                 if (VALID_IMAGE_EXTENSIONS.contains(extension.main)) {
                     message.setType(Message.TYPE_IMAGE);
-                    message.setRelativeFilePath(message.getUuid() + "." + extension.main);
+                    xmppConnectionService.getFileBackend().setupRelativeFilePath(message, message.getUuid() + "." + extension.main);
                 } else if (VALID_CRYPTO_EXTENSIONS.contains(extension.main)) {
                     if (VALID_IMAGE_EXTENSIONS.contains(extension.secondary)) {
                         message.setType(Message.TYPE_IMAGE);
-                        message.setRelativeFilePath(message.getUuid() + "." + extension.secondary);
+                        xmppConnectionService.getFileBackend().setupRelativeFilePath(message,message.getUuid() + "." + extension.secondary);
                     } else {
                         message.setType(Message.TYPE_FILE);
-                        message.setRelativeFilePath(message.getUuid() + (extension.secondary != null ? ("." + extension.secondary) : ""));
+                        xmppConnectionService.getFileBackend().setupRelativeFilePath(message,message.getUuid() + (extension.secondary != null ? ("." + extension.secondary) : ""));
                     }
                     message.setEncryption(Message.ENCRYPTION_PGP);
                 } else {
                     message.setType(Message.TYPE_FILE);
-                    message.setRelativeFilePath(message.getUuid() + (extension.main != null ? ("." + extension.main) : ""));
+                    xmppConnectionService.getFileBackend().setupRelativeFilePath(message,message.getUuid() + (extension.main != null ? ("." + extension.main) : ""));
                 }
                 long size = parseLong(fileSize, 0);
                 message.setBody(Long.toString(size));