diff --git a/vector/src/main/java/im/vector/app/core/di/VoiceModule.kt b/vector/src/main/java/im/vector/app/core/di/VoiceModule.kt index 992ed80677..54d556ea91 100644 --- a/vector/src/main/java/im/vector/app/core/di/VoiceModule.kt +++ b/vector/src/main/java/im/vector/app/core/di/VoiceModule.kt @@ -23,6 +23,7 @@ import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent import im.vector.app.features.voicebroadcast.VoiceBroadcastRecorder +import im.vector.app.features.voicebroadcast.VoiceBroadcastRecorderQ import javax.inject.Singleton @Module @@ -32,7 +33,7 @@ object VoiceModule { @Singleton fun providesVoiceBroadcastRecorder(context: Context): VoiceBroadcastRecorder? { return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { - VoiceBroadcastRecorder(context) + VoiceBroadcastRecorderQ(context) } else { null } diff --git a/vector/src/main/java/im/vector/app/features/voicebroadcast/VoiceBroadcastRecorder.kt b/vector/src/main/java/im/vector/app/features/voicebroadcast/VoiceBroadcastRecorder.kt index 2ec882a3d6..916f39106a 100644 --- a/vector/src/main/java/im/vector/app/features/voicebroadcast/VoiceBroadcastRecorder.kt +++ b/vector/src/main/java/im/vector/app/features/voicebroadcast/VoiceBroadcastRecorder.kt @@ -16,66 +16,12 @@ package im.vector.app.features.voicebroadcast -import android.content.Context -import android.media.MediaRecorder -import android.os.Build -import androidx.annotation.RequiresApi -import im.vector.app.features.voice.AbstractVoiceRecorderQ -import org.matrix.android.sdk.api.session.content.ContentAttachmentData +import im.vector.app.features.voice.VoiceRecorder import java.io.File -@RequiresApi(Build.VERSION_CODES.Q) -class VoiceBroadcastRecorder( - context: Context, -) : AbstractVoiceRecorderQ(context) { +interface VoiceBroadcastRecorder : VoiceRecorder { - private val maxFileSize = 25_000L // 0,025 Mb = 25 Kb ~= 6s - - var listener: Listener? = null - - override val outputFormat = MediaRecorder.OutputFormat.MPEG_4 - override val audioEncoder = MediaRecorder.AudioEncoder.HE_AAC - - override val fileNameExt: String = "mp4" - - override fun initializeRecord(roomId: String, attachmentData: ContentAttachmentData?) { - super.initializeRecord(roomId, attachmentData) - mediaRecorder?.setMaxFileSize(maxFileSize) - mediaRecorder?.setOnInfoListener { _, what, _ -> - when (what) { - MediaRecorder.MEDIA_RECORDER_INFO_MAX_FILESIZE_APPROACHING -> onMaxFileSizeApproaching(roomId) - MediaRecorder.MEDIA_RECORDER_INFO_NEXT_OUTPUT_FILE_STARTED -> onNextOutputFileStarted() - else -> Unit // Nothing to do - } - } - } - - override fun stopRecord() { - super.stopRecord() - notifyOutputFileCreated() - listener = null - } - - override fun release() { - mediaRecorder?.setOnInfoListener(null) - super.release() - } - - private fun onMaxFileSizeApproaching(roomId: String) { - setNextOutputFile(roomId) - } - - private fun onNextOutputFileStarted() { - notifyOutputFileCreated() - } - - private fun notifyOutputFileCreated() { - outputFile?.let { - listener?.onVoiceMessageCreated(it) - outputFile = nextOutputFile - nextOutputFile = null - } - } + var listener: Listener? fun interface Listener { fun onVoiceMessageCreated(file: File) diff --git a/vector/src/main/java/im/vector/app/features/voicebroadcast/VoiceBroadcastRecorderQ.kt b/vector/src/main/java/im/vector/app/features/voicebroadcast/VoiceBroadcastRecorderQ.kt new file mode 100644 index 0000000000..3aaad19a47 --- /dev/null +++ b/vector/src/main/java/im/vector/app/features/voicebroadcast/VoiceBroadcastRecorderQ.kt @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2022 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.app.features.voicebroadcast + +import android.content.Context +import android.media.MediaRecorder +import android.os.Build +import androidx.annotation.RequiresApi +import im.vector.app.features.voice.AbstractVoiceRecorderQ +import org.matrix.android.sdk.api.session.content.ContentAttachmentData + +@RequiresApi(Build.VERSION_CODES.Q) +class VoiceBroadcastRecorderQ( + context: Context, +) : AbstractVoiceRecorderQ(context), VoiceBroadcastRecorder { + + private val maxFileSize = 25_000L // 0,025 Mb = 25 Kb ~= 6s + + override var listener: VoiceBroadcastRecorder.Listener? = null + + override val outputFormat = MediaRecorder.OutputFormat.MPEG_4 + override val audioEncoder = MediaRecorder.AudioEncoder.HE_AAC + + override val fileNameExt: String = "mp4" + + override fun initializeRecord(roomId: String, attachmentData: ContentAttachmentData?) { + super.initializeRecord(roomId, attachmentData) + mediaRecorder?.setMaxFileSize(maxFileSize) + mediaRecorder?.setOnInfoListener { _, what, _ -> + when (what) { + MediaRecorder.MEDIA_RECORDER_INFO_MAX_FILESIZE_APPROACHING -> onMaxFileSizeApproaching(roomId) + MediaRecorder.MEDIA_RECORDER_INFO_NEXT_OUTPUT_FILE_STARTED -> onNextOutputFileStarted() + else -> Unit // Nothing to do + } + } + } + + override fun stopRecord() { + super.stopRecord() + notifyOutputFileCreated() + listener = null + } + + override fun release() { + mediaRecorder?.setOnInfoListener(null) + super.release() + } + + private fun onMaxFileSizeApproaching(roomId: String) { + setNextOutputFile(roomId) + } + + private fun onNextOutputFileStarted() { + notifyOutputFileCreated() + } + + private fun notifyOutputFileCreated() { + outputFile?.let { + listener?.onVoiceMessageCreated(it) + outputFile = nextOutputFile + nextOutputFile = null + } + } +}