store recordings and documents in their respective folders
This commit is contained in:
parent
c03a8b784f
commit
0b470534f1
|
@ -87,7 +87,7 @@ ext {
|
|||
}
|
||||
|
||||
android {
|
||||
compileSdkVersion 30
|
||||
compileSdkVersion 31
|
||||
|
||||
defaultConfig {
|
||||
minSdkVersion 21
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
@ -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",
|
||||
|
|
Loading…
Reference in a new issue