diff --git a/build.gradle b/build.gradle index 3df3ab8ea..6f26dc4fc 100644 --- a/build.gradle +++ b/build.gradle @@ -87,7 +87,7 @@ ext { } android { - compileSdkVersion 30 + compileSdkVersion 31 defaultConfig { minSdkVersion 21 diff --git a/src/main/java/eu/siacs/conversations/persistance/FileBackend.java b/src/main/java/eu/siacs/conversations/persistance/FileBackend.java index d6a33b640..1ee5191db 100644 --- a/src/main/java/eu/siacs/conversations/persistance/FileBackend.java +++ b/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); diff --git a/src/main/java/eu/siacs/conversations/ui/RecordingActivity.java b/src/main/java/eu/siacs/conversations/ui/RecordingActivity.java index c42a36d57..bc9972316 100644 --- a/src/main/java/eu/siacs/conversations/ui/RecordingActivity.java +++ b/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(); } diff --git a/src/main/java/eu/siacs/conversations/ui/adapter/MediaAdapter.java b/src/main/java/eu/siacs/conversations/ui/adapter/MediaAdapter.java index 21473dafd..2733e7b8b 100644 --- a/src/main/java/eu/siacs/conversations/ui/adapter/MediaAdapter.java +++ b/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 { - private static final List DOCUMENT_MIMES = Arrays.asList( + public static final List DOCUMENT_MIMES = Arrays.asList( "application/pdf", "application/vnd.oasis.opendocument.text", "application/msword",