diff --git a/app/src/main/java/app/myzel394/alibi/services/AudioRecorderService.kt b/app/src/main/java/app/myzel394/alibi/services/AudioRecorderService.kt index f95b913..0ba3e88 100644 --- a/app/src/main/java/app/myzel394/alibi/services/AudioRecorderService.kt +++ b/app/src/main/java/app/myzel394/alibi/services/AudioRecorderService.kt @@ -155,7 +155,19 @@ class AudioRecorderService : IntervalRecorderService() { return; } - if (addedDevices?.find { it.id == selectedMicrophone!!.deviceInfo.id } != null) { + // We can't compare the ID, as it seems to be changing on each reconnect + val newDevice = addedDevices?.find { + it.productName == selectedMicrophone!!.deviceInfo.productName && + it.isSink == selectedMicrophone!!.deviceInfo.isSink && + it.type == selectedMicrophone!!.deviceInfo.type && ( + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + it.address == selectedMicrophone!!.deviceInfo.address + } else true + ) + } + if (newDevice != null) { + changeMicrophone(MicrophoneInfo.fromDeviceInfo(newDevice)) + onMicrophoneReconnected() } } diff --git a/app/src/main/java/app/myzel394/alibi/ui/components/AudioRecorder/atoms/MicrophoneDisconnectedDialog.kt b/app/src/main/java/app/myzel394/alibi/ui/components/AudioRecorder/atoms/MicrophoneDisconnectedDialog.kt index 338293b..e15cba5 100644 --- a/app/src/main/java/app/myzel394/alibi/ui/components/AudioRecorder/atoms/MicrophoneDisconnectedDialog.kt +++ b/app/src/main/java/app/myzel394/alibi/ui/components/AudioRecorder/atoms/MicrophoneDisconnectedDialog.kt @@ -36,6 +36,7 @@ fun MicrophoneDisconnectedDialog( stringResource( R.string.ui_audioRecorder_error_microphoneDisconnected_message, microphoneName, + microphoneName, ) ) }, diff --git a/app/src/main/java/app/myzel394/alibi/ui/components/AudioRecorder/atoms/MicrophoneReconnectedDialog.kt b/app/src/main/java/app/myzel394/alibi/ui/components/AudioRecorder/atoms/MicrophoneReconnectedDialog.kt new file mode 100644 index 0000000..b8825ac --- /dev/null +++ b/app/src/main/java/app/myzel394/alibi/ui/components/AudioRecorder/atoms/MicrophoneReconnectedDialog.kt @@ -0,0 +1,63 @@ +package app.myzel394.alibi.ui.components.AudioRecorder.atoms + +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.MicOff +import androidx.compose.material.icons.filled.Star +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.Button +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.semantics.contentDescription +import androidx.compose.ui.semantics.semantics +import androidx.compose.ui.text.style.TextAlign +import app.myzel394.alibi.R + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun MicrophoneReconnectedDialog( + microphoneName: String, + onClose: () -> Unit, +) { + AlertDialog( + onDismissRequest = onClose, + title = { + Text( + stringResource( + R.string.ui_audioRecorder_error_microphoneReconnected_title, + ), + textAlign = TextAlign.Center, + ) + }, + text = { + Text( + stringResource( + R.string.ui_audioRecorder_error_microphoneReconnected_message, + microphoneName, + ) + ) + }, + icon = { + Icon( + Icons.Default.Star, + contentDescription = null, + ) + }, + confirmButton = { + val label = stringResource(R.string.dialog_close_neutral_label) + + Button( + modifier = Modifier + .semantics { + contentDescription = label + }, + onClick = onClose, + ) { + Text(label) + } + } + ) +} \ No newline at end of file diff --git a/app/src/main/java/app/myzel394/alibi/ui/components/AudioRecorder/organisms/RecordingStatus.kt b/app/src/main/java/app/myzel394/alibi/ui/components/AudioRecorder/organisms/RecordingStatus.kt index c2c1cb2..930afc6 100644 --- a/app/src/main/java/app/myzel394/alibi/ui/components/AudioRecorder/organisms/RecordingStatus.kt +++ b/app/src/main/java/app/myzel394/alibi/ui/components/AudioRecorder/organisms/RecordingStatus.kt @@ -25,6 +25,7 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.dp import app.myzel394.alibi.ui.components.AudioRecorder.atoms.DeleteButton import app.myzel394.alibi.ui.components.AudioRecorder.atoms.MicrophoneDisconnectedDialog +import app.myzel394.alibi.ui.components.AudioRecorder.atoms.MicrophoneReconnectedDialog import app.myzel394.alibi.ui.components.AudioRecorder.atoms.PauseResumeButton import app.myzel394.alibi.ui.components.AudioRecorder.atoms.RealtimeAudioVisualizer import app.myzel394.alibi.ui.components.AudioRecorder.atoms.RecordingTime @@ -166,6 +167,15 @@ fun RecordingStatus( ) } + if (showMicrophoneStatusDialog == AudioRecorderModel.MicrophoneConnectivityStatus.CONNECTED) { + MicrophoneReconnectedDialog( + onClose = { + showMicrophoneStatusDialog = null + }, + microphoneName = audioRecorder.selectedMicrophone?.name ?: "", + ) + } + if (microphones.isNotEmpty()) { MicrophoneSelection( microphones = microphones, diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 653871b..607a281 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -66,5 +66,7 @@ Device Microphone The selected microphone will be immediately activated Microphone disconnected - %s disconnected. Alibi will use the default microphone instead. We will automatically switch back to %s once it reconnects. + %s disconnected. Alibi will use the default microphone instead. We will automatically switch back to %s once it reconnects. + Microphone reconnected + %s reconnected! Alibi automatically changed the microphone input to it. \ No newline at end of file