Write voice recording data in 1s intervals to drafts.

This commit is contained in:
Alex Hart
2025-11-19 13:18:40 -04:00
committed by Cody Henthorne
parent 7978cc668d
commit 0afa75564f
6 changed files with 95 additions and 16 deletions

View File

@@ -35,9 +35,9 @@ public class AudioRecorder {
private final AudioRecordingHandler uiHandler;
private final AudioRecorderFocusManager audioFocusManager;
private Recorder recorder;
private Future<Uri> recordingUriFuture;
private Recorder recorder;
private Future<Uri> recordingUriFuture;
private volatile Uri recordingUri;
private SingleSubject<VoiceNoteDraft> recordingSubject;
public AudioRecorder(@NonNull Context context, @Nullable AudioRecordingHandler uiHandler) {
@@ -88,10 +88,12 @@ public class AudioRecorder {
ParcelFileDescriptor fds[] = ParcelFileDescriptor.createPipe();
recordingUriFuture = BlobProvider.getInstance()
.forData(new ParcelFileDescriptor.AutoCloseInputStream(fds[0]), 0)
.withMimeType(MediaUtil.AUDIO_AAC)
.createForDraftAttachmentAsync(context);
BlobProvider.BlobBuilder blobBuilder = BlobProvider.getInstance()
.forData(new ParcelFileDescriptor.AutoCloseInputStream(fds[0]), 0)
.withMimeType(MediaUtil.AUDIO_AAC);
recordingUri = blobBuilder.buildUriForDraftAttachment();
recordingUriFuture = blobBuilder.createForDraftAttachmentAsync(context);
recorder = useMediaRecorderWrapper ? new MediaRecorderWrapper() : new AudioCodec();
int focusResult = audioFocusManager.requestAudioFocus();
@@ -130,6 +132,7 @@ public class AudioRecorder {
recordingSubject = null;
recorder = null;
recordingUriFuture = null;
recordingUri = null;
});
}
@@ -157,6 +160,27 @@ public class AudioRecorder {
recordingSubject = null;
recorder = null;
recordingUriFuture = null;
recordingUri = null;
});
}
/**
* Gets a snapshot of the current recording as a VoiceNoteDraft, without stopping the recording.
* This can be used to periodically save drafts while recording is in progress.
* Returns null if there is no active recording.
*/
@Nullable
public VoiceNoteDraft getCurrentRecordingSnapshot() {
if (recordingUri == null) {
return null;
}
try {
long size = MediaUtil.getMediaSize(context, recordingUri);
return new VoiceNoteDraft(recordingUri, size);
} catch (IOException e) {
Log.w(TAG, "Error getting current recording snapshot", e);
return null;
}
}
}