limit voice recording to 180s
This commit is contained in:
@@ -42,11 +42,14 @@ import com.vitorpamplona.amethyst.ui.stringRes
|
|||||||
import kotlinx.coroutines.delay
|
import kotlinx.coroutines.delay
|
||||||
import kotlinx.coroutines.isActive
|
import kotlinx.coroutines.isActive
|
||||||
|
|
||||||
|
const val MAX_VOICE_RECORD_SECONDS = 180
|
||||||
|
|
||||||
@OptIn(ExperimentalPermissionsApi::class)
|
@OptIn(ExperimentalPermissionsApi::class)
|
||||||
@Composable
|
@Composable
|
||||||
fun RecordAudioBox(
|
fun RecordAudioBox(
|
||||||
modifier: Modifier,
|
modifier: Modifier,
|
||||||
onRecordTaken: (RecordingResult) -> Unit,
|
onRecordTaken: (RecordingResult) -> Unit,
|
||||||
|
maxDurationSeconds: Int? = null,
|
||||||
content: @Composable (Boolean, Int) -> Unit,
|
content: @Composable (Boolean, Int) -> Unit,
|
||||||
) {
|
) {
|
||||||
val mediaRecorder = remember { mutableStateOf<VoiceMessageRecorder?>(null) }
|
val mediaRecorder = remember { mutableStateOf<VoiceMessageRecorder?>(null) }
|
||||||
@@ -107,6 +110,10 @@ fun RecordAudioBox(
|
|||||||
while (isActive) {
|
while (isActive) {
|
||||||
delay(1000)
|
delay(1000)
|
||||||
elapsedSeconds++
|
elapsedSeconds++
|
||||||
|
if (maxDurationSeconds != null && elapsedSeconds >= maxDurationSeconds) {
|
||||||
|
stopRecording()
|
||||||
|
break
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Reset elapsed time when not recording
|
// Reset elapsed time when not recording
|
||||||
|
|||||||
+5
-1
@@ -42,7 +42,10 @@ import com.vitorpamplona.amethyst.R
|
|||||||
import com.vitorpamplona.amethyst.ui.stringRes
|
import com.vitorpamplona.amethyst.ui.stringRes
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun RecordVoiceButton(onVoiceTaken: (RecordingResult) -> Unit) {
|
fun RecordVoiceButton(
|
||||||
|
onVoiceTaken: (RecordingResult) -> Unit,
|
||||||
|
maxDurationSeconds: Int? = null,
|
||||||
|
) {
|
||||||
var isRecording by remember { mutableStateOf(false) }
|
var isRecording by remember { mutableStateOf(false) }
|
||||||
var elapsedSeconds by remember { mutableIntStateOf(0) }
|
var elapsedSeconds by remember { mutableIntStateOf(0) }
|
||||||
|
|
||||||
@@ -61,6 +64,7 @@ fun RecordVoiceButton(onVoiceTaken: (RecordingResult) -> Unit) {
|
|||||||
elapsedSeconds = 0
|
elapsedSeconds = 0
|
||||||
onVoiceTaken(recording)
|
onVoiceTaken(recording)
|
||||||
},
|
},
|
||||||
|
maxDurationSeconds = maxDurationSeconds,
|
||||||
) { recordingState, elapsed ->
|
) { recordingState, elapsed ->
|
||||||
// Update parent state after composition completes
|
// Update parent state after composition completes
|
||||||
SideEffect {
|
SideEffect {
|
||||||
|
|||||||
@@ -113,6 +113,7 @@ import com.vitorpamplona.amethyst.service.relayClient.reqCommand.event.observeNo
|
|||||||
import com.vitorpamplona.amethyst.service.relayClient.reqCommand.nwc.NWCFinderFilterAssemblerSubscription
|
import com.vitorpamplona.amethyst.service.relayClient.reqCommand.nwc.NWCFinderFilterAssemblerSubscription
|
||||||
import com.vitorpamplona.amethyst.ui.actions.CrossfadeIfEnabled
|
import com.vitorpamplona.amethyst.ui.actions.CrossfadeIfEnabled
|
||||||
import com.vitorpamplona.amethyst.ui.actions.uploads.FloatingRecordingIndicator
|
import com.vitorpamplona.amethyst.ui.actions.uploads.FloatingRecordingIndicator
|
||||||
|
import com.vitorpamplona.amethyst.ui.actions.uploads.MAX_VOICE_RECORD_SECONDS
|
||||||
import com.vitorpamplona.amethyst.ui.actions.uploads.RecordAudioBox
|
import com.vitorpamplona.amethyst.ui.actions.uploads.RecordAudioBox
|
||||||
import com.vitorpamplona.amethyst.ui.components.AnimatedBorderTextCornerRadius
|
import com.vitorpamplona.amethyst.ui.components.AnimatedBorderTextCornerRadius
|
||||||
import com.vitorpamplona.amethyst.ui.components.ClickableBox
|
import com.vitorpamplona.amethyst.ui.components.ClickableBox
|
||||||
@@ -635,6 +636,7 @@ fun ReplyViaVoiceReaction(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
maxDurationSeconds = MAX_VOICE_RECORD_SECONDS,
|
||||||
) { isRecording, elapsedSeconds ->
|
) { isRecording, elapsedSeconds ->
|
||||||
if (voiceRecordingState != null) {
|
if (voiceRecordingState != null) {
|
||||||
SideEffect {
|
SideEffect {
|
||||||
|
|||||||
+2
@@ -59,6 +59,7 @@ import com.vitorpamplona.amethyst.R
|
|||||||
import com.vitorpamplona.amethyst.model.Note
|
import com.vitorpamplona.amethyst.model.Note
|
||||||
import com.vitorpamplona.amethyst.ui.actions.mediaServers.FileServerSelectionRow
|
import com.vitorpamplona.amethyst.ui.actions.mediaServers.FileServerSelectionRow
|
||||||
import com.vitorpamplona.amethyst.ui.actions.mediaServers.ServerType
|
import com.vitorpamplona.amethyst.ui.actions.mediaServers.ServerType
|
||||||
|
import com.vitorpamplona.amethyst.ui.actions.uploads.MAX_VOICE_RECORD_SECONDS
|
||||||
import com.vitorpamplona.amethyst.ui.actions.uploads.RecordVoiceButton
|
import com.vitorpamplona.amethyst.ui.actions.uploads.RecordVoiceButton
|
||||||
import com.vitorpamplona.amethyst.ui.actions.uploads.SelectFromGallery
|
import com.vitorpamplona.amethyst.ui.actions.uploads.SelectFromGallery
|
||||||
import com.vitorpamplona.amethyst.ui.actions.uploads.SelectedMedia
|
import com.vitorpamplona.amethyst.ui.actions.uploads.SelectedMedia
|
||||||
@@ -497,6 +498,7 @@ private fun BottomRowActions(postViewModel: ShortNotePostViewModel) {
|
|||||||
onVoiceTaken = { recording ->
|
onVoiceTaken = { recording ->
|
||||||
postViewModel.selectVoiceRecording(recording)
|
postViewModel.selectVoiceRecording(recording)
|
||||||
},
|
},
|
||||||
|
maxDurationSeconds = MAX_VOICE_RECORD_SECONDS,
|
||||||
)
|
)
|
||||||
|
|
||||||
if (postViewModel.canUsePoll) {
|
if (postViewModel.canUsePoll) {
|
||||||
|
|||||||
+2
@@ -51,6 +51,7 @@ import androidx.compose.ui.unit.dp
|
|||||||
import androidx.lifecycle.viewmodel.compose.viewModel
|
import androidx.lifecycle.viewmodel.compose.viewModel
|
||||||
import com.vitorpamplona.amethyst.R
|
import com.vitorpamplona.amethyst.R
|
||||||
import com.vitorpamplona.amethyst.ui.actions.mediaServers.FileServerSelectionRow
|
import com.vitorpamplona.amethyst.ui.actions.mediaServers.FileServerSelectionRow
|
||||||
|
import com.vitorpamplona.amethyst.ui.actions.uploads.MAX_VOICE_RECORD_SECONDS
|
||||||
import com.vitorpamplona.amethyst.ui.actions.uploads.RecordAudioBox
|
import com.vitorpamplona.amethyst.ui.actions.uploads.RecordAudioBox
|
||||||
import com.vitorpamplona.amethyst.ui.actions.uploads.UploadProgressIndicator
|
import com.vitorpamplona.amethyst.ui.actions.uploads.UploadProgressIndicator
|
||||||
import com.vitorpamplona.amethyst.ui.actions.uploads.VoiceAnonymizationSection
|
import com.vitorpamplona.amethyst.ui.actions.uploads.VoiceAnonymizationSection
|
||||||
@@ -226,6 +227,7 @@ private fun ReRecordButton(viewModel: VoiceReplyViewModel) {
|
|||||||
onRecordTaken = { recording ->
|
onRecordTaken = { recording ->
|
||||||
viewModel.selectRecording(recording)
|
viewModel.selectRecording(recording)
|
||||||
},
|
},
|
||||||
|
maxDurationSeconds = MAX_VOICE_RECORD_SECONDS,
|
||||||
) { isRecording, elapsedSeconds ->
|
) { isRecording, elapsedSeconds ->
|
||||||
val contentColor =
|
val contentColor =
|
||||||
if (isRecording) {
|
if (isRecording) {
|
||||||
|
|||||||
Reference in New Issue
Block a user