store recordings and documents in their respective folders

Daniel Gultsch created

Change summary

build.gradle                                                      |  2 
src/main/java/eu/siacs/conversations/persistance/FileBackend.java |  4 
src/main/java/eu/siacs/conversations/ui/RecordingActivity.java    | 92 
src/main/java/eu/siacs/conversations/ui/adapter/MediaAdapter.java |  2 
4 files changed, 61 insertions(+), 39 deletions(-)

Detailed changes

build.gradle 🔗

@@ -87,7 +87,7 @@ ext {
 }
 
 android {
-    compileSdkVersion 30
+    compileSdkVersion 31
 
     defaultConfig {
         minSdkVersion 21

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

@@ -64,6 +64,7 @@ import eu.siacs.conversations.entities.DownloadableFile;
 import eu.siacs.conversations.entities.Message;
 import eu.siacs.conversations.services.AttachFileToConversationRunnable;
 import eu.siacs.conversations.services.XmppConnectionService;
+import eu.siacs.conversations.ui.adapter.MediaAdapter;
 import eu.siacs.conversations.ui.util.Attachment;
 import eu.siacs.conversations.utils.Compatibility;
 import eu.siacs.conversations.utils.CryptoHelper;
@@ -888,6 +889,9 @@ public class FileBackend {
         } else if (mime.startsWith("video/")) {
             parentDirectory =
                     Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES);
+        } else if (MediaAdapter.DOCUMENT_MIMES.contains(mime)) {
+            parentDirectory =
+                    Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS);
         } else {
             parentDirectory =
                     Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);

src/main/java/eu/siacs/conversations/ui/RecordingActivity.java 🔗

@@ -1,10 +1,10 @@
 package eu.siacs.conversations.ui;
 
 import android.app.Activity;
-import android.content.Context;
 import android.content.Intent;
 import android.media.MediaRecorder;
 import android.net.Uri;
+import android.os.Build;
 import android.os.Bundle;
 import android.os.Environment;
 import android.os.FileObserver;
@@ -18,25 +18,22 @@ import android.widget.Toast;
 import androidx.databinding.DataBindingUtil;
 
 import java.io.File;
-import java.io.IOException;
 import java.text.SimpleDateFormat;
 import java.util.Date;
 import java.util.Locale;
+import java.util.Objects;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 
 import eu.siacs.conversations.Config;
 import eu.siacs.conversations.R;
 import eu.siacs.conversations.databinding.ActivityRecordingBinding;
-import eu.siacs.conversations.persistance.FileBackend;
 import eu.siacs.conversations.ui.util.SettingsUtils;
 import eu.siacs.conversations.utils.ThemeHelper;
 import eu.siacs.conversations.utils.TimeFrameUtils;
 
 public class RecordingActivity extends Activity implements View.OnClickListener {
 
-    public static String STORAGE_DIRECTORY_TYPE_NAME = "Recordings";
-
     private ActivityRecordingBinding binding;
 
     private MediaRecorder mRecorder;
@@ -45,13 +42,14 @@ public class RecordingActivity extends Activity implements View.OnClickListener
     private final CountDownLatch outputFileWrittenLatch = new CountDownLatch(1);
 
     private final Handler mHandler = new Handler();
-    private final Runnable mTickExecutor = new Runnable() {
-        @Override
-        public void run() {
-            tick();
-            mHandler.postDelayed(mTickExecutor, 100);
-        }
-    };
+    private final Runnable mTickExecutor =
+            new Runnable() {
+                @Override
+                public void run() {
+                    tick();
+                    mHandler.postDelayed(mTickExecutor, 100);
+                }
+            };
 
     private File mOutputFile;
 
@@ -69,7 +67,7 @@ public class RecordingActivity extends Activity implements View.OnClickListener
     }
 
     @Override
-    protected void onResume(){
+    protected void onResume() {
         super.onResume();
         SettingsUtils.applyScreenshotPreventionSetting(this);
     }
@@ -138,27 +136,44 @@ public class RecordingActivity extends Activity implements View.OnClickListener
             }
         }
         if (saveFile) {
-            new Thread(() -> {
-                try {
-                    if (!outputFileWrittenLatch.await(2, TimeUnit.SECONDS)) {
-                        Log.d(Config.LOGTAG, "time out waiting for output file to be written");
-                    }
-                } catch (InterruptedException e) {
-                    Log.d(Config.LOGTAG, "interrupted while waiting for output file to be written", e);
-                }
-                runOnUiThread(() -> {
-                    setResult(Activity.RESULT_OK, new Intent().setData(Uri.fromFile(mOutputFile)));
-                    finish();
-                });
-            }).start();
+            new Thread(
+                            () -> {
+                                try {
+                                    if (!outputFileWrittenLatch.await(2, TimeUnit.SECONDS)) {
+                                        Log.d(
+                                                Config.LOGTAG,
+                                                "time out waiting for output file to be written");
+                                    }
+                                } catch (InterruptedException e) {
+                                    Log.d(
+                                            Config.LOGTAG,
+                                            "interrupted while waiting for output file to be written",
+                                            e);
+                                }
+                                runOnUiThread(
+                                        () -> {
+                                            setResult(
+                                                    Activity.RESULT_OK,
+                                                    new Intent()
+                                                            .setData(Uri.fromFile(mOutputFile)));
+                                            finish();
+                                        });
+                            })
+                    .start();
         }
     }
 
     private File generateOutputFilename() {
         final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd_HHmmssSSS", Locale.US);
         final String filename = "RECORDING_" + dateFormat.format(new Date()) + ".m4a";
-        //TODO once we target 31 use DIRECTORY_RECORDINGS
-        final File parentDirectory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
+        final File parentDirectory;
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
+            parentDirectory =
+                    Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_RECORDINGS);
+        } else {
+            parentDirectory =
+                    Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
+        }
         final File conversationsDirectory = new File(parentDirectory, getString(R.string.app_name));
         return new File(conversationsDirectory, filename);
     }
@@ -166,21 +181,24 @@ public class RecordingActivity extends Activity implements View.OnClickListener
     private void setupOutputFile() {
         mOutputFile = generateOutputFilename();
         final File parentDirectory = mOutputFile.getParentFile();
-        if (parentDirectory.mkdirs()) {
+        if (Objects.requireNonNull(parentDirectory).mkdirs()) {
             Log.d(Config.LOGTAG, "created " + parentDirectory.getAbsolutePath());
         }
         setupFileObserver(parentDirectory);
     }
 
     private void setupFileObserver(File directory) {
-        mFileObserver = new FileObserver(directory.getAbsolutePath()) {
-            @Override
-            public void onEvent(int event, String s) {
-                if (s != null && s.equals(mOutputFile.getName()) && event == FileObserver.CLOSE_WRITE) {
-                    outputFileWrittenLatch.countDown();
-                }
-            }
-        };
+        mFileObserver =
+                new FileObserver(directory.getAbsolutePath()) {
+                    @Override
+                    public void onEvent(int event, String s) {
+                        if (s != null
+                                && s.equals(mOutputFile.getName())
+                                && event == FileObserver.CLOSE_WRITE) {
+                            outputFileWrittenLatch.countDown();
+                        }
+                    }
+                };
         mFileObserver.startWatching();
     }
 

src/main/java/eu/siacs/conversations/ui/adapter/MediaAdapter.java 🔗

@@ -34,7 +34,7 @@ import eu.siacs.conversations.ui.util.ViewUtil;
 
 public class MediaAdapter extends RecyclerView.Adapter<MediaAdapter.MediaViewHolder> {
 
-    private static final List<String> DOCUMENT_MIMES = Arrays.asList(
+    public static final List<String> DOCUMENT_MIMES = Arrays.asList(
             "application/pdf",
             "application/vnd.oasis.opendocument.text",
             "application/msword",