mirror of
https://github.com/Myzel394/Alibi.git
synced 2025-06-19 07:15:25 +02:00
refactor: Move settings out of SettingsScreen's atoms
This commit is contained in:
parent
ca33e57069
commit
68438a6a0b
@ -1,110 +0,0 @@
|
|||||||
package app.myzel394.alibi.ui.components.AudioRecorder.atoms
|
|
||||||
|
|
||||||
import android.util.Log
|
|
||||||
import androidx.compose.foundation.layout.Column
|
|
||||||
import androidx.compose.foundation.layout.Spacer
|
|
||||||
import androidx.compose.foundation.layout.fillMaxWidth
|
|
||||||
import androidx.compose.foundation.layout.height
|
|
||||||
import androidx.compose.foundation.layout.padding
|
|
||||||
import androidx.compose.foundation.layout.size
|
|
||||||
import androidx.compose.foundation.layout.width
|
|
||||||
import androidx.compose.material.icons.Icons
|
|
||||||
import androidx.compose.material.icons.filled.Memory
|
|
||||||
import androidx.compose.material.icons.filled.Save
|
|
||||||
import androidx.compose.material3.AlertDialog
|
|
||||||
import androidx.compose.material3.Button
|
|
||||||
import androidx.compose.material3.ButtonDefaults
|
|
||||||
import androidx.compose.material3.Icon
|
|
||||||
import androidx.compose.material3.LinearProgressIndicator
|
|
||||||
import androidx.compose.material3.MaterialTheme
|
|
||||||
import androidx.compose.material3.Text
|
|
||||||
import androidx.compose.runtime.Composable
|
|
||||||
import androidx.compose.runtime.getValue
|
|
||||||
import androidx.compose.runtime.mutableStateOf
|
|
||||||
import androidx.compose.runtime.remember
|
|
||||||
import androidx.compose.runtime.rememberCoroutineScope
|
|
||||||
import androidx.compose.runtime.setValue
|
|
||||||
import androidx.compose.ui.Alignment
|
|
||||||
import androidx.compose.ui.Modifier
|
|
||||||
import androidx.compose.ui.graphics.graphicsLayer
|
|
||||||
import androidx.compose.ui.platform.LocalContext
|
|
||||||
import androidx.compose.ui.res.stringResource
|
|
||||||
import androidx.compose.ui.semantics.contentDescription
|
|
||||||
import androidx.compose.ui.semantics.semantics
|
|
||||||
import androidx.compose.ui.unit.dp
|
|
||||||
import app.myzel394.alibi.R
|
|
||||||
import app.myzel394.alibi.services.RecorderService
|
|
||||||
import app.myzel394.alibi.ui.BIG_PRIMARY_BUTTON_SIZE
|
|
||||||
import kotlinx.coroutines.launch
|
|
||||||
import java.io.File
|
|
||||||
|
|
||||||
@Composable
|
|
||||||
fun SaveRecordingButton(
|
|
||||||
modifier: Modifier = Modifier,
|
|
||||||
service: RecorderService,
|
|
||||||
onSaveFile: (File) -> Unit,
|
|
||||||
label: String = stringResource(R.string.ui_audioRecorder_action_save_label),
|
|
||||||
) {
|
|
||||||
val context = LocalContext.current
|
|
||||||
val scope = rememberCoroutineScope()
|
|
||||||
|
|
||||||
var isProcessingAudio by remember { mutableStateOf(false) }
|
|
||||||
|
|
||||||
if (isProcessingAudio)
|
|
||||||
AlertDialog(
|
|
||||||
onDismissRequest = { },
|
|
||||||
icon = {
|
|
||||||
Icon(
|
|
||||||
Icons.Default.Memory,
|
|
||||||
contentDescription = null,
|
|
||||||
)
|
|
||||||
},
|
|
||||||
title = {
|
|
||||||
Text(
|
|
||||||
stringResource(R.string.ui_audioRecorder_action_save_processing_dialog_title),
|
|
||||||
)
|
|
||||||
},
|
|
||||||
text = {
|
|
||||||
Column(
|
|
||||||
horizontalAlignment = Alignment.CenterHorizontally,
|
|
||||||
) {
|
|
||||||
Text(
|
|
||||||
stringResource(R.string.ui_audioRecorder_action_save_processing_dialog_description),
|
|
||||||
)
|
|
||||||
Spacer(modifier = Modifier.height(32.dp))
|
|
||||||
LinearProgressIndicator()
|
|
||||||
}
|
|
||||||
},
|
|
||||||
confirmButton = {}
|
|
||||||
)
|
|
||||||
Button(
|
|
||||||
modifier = Modifier
|
|
||||||
.padding(16.dp)
|
|
||||||
.fillMaxWidth()
|
|
||||||
.height(BIG_PRIMARY_BUTTON_SIZE)
|
|
||||||
.semantics {
|
|
||||||
contentDescription = label
|
|
||||||
}
|
|
||||||
.then(modifier),
|
|
||||||
onClick = {
|
|
||||||
isProcessingAudio = true
|
|
||||||
|
|
||||||
scope.launch {
|
|
||||||
try {
|
|
||||||
} catch (error: Exception) {
|
|
||||||
Log.getStackTraceString(error)
|
|
||||||
} finally {
|
|
||||||
isProcessingAudio = false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
) {
|
|
||||||
Icon(
|
|
||||||
Icons.Default.Save,
|
|
||||||
contentDescription = null,
|
|
||||||
modifier = Modifier.size(ButtonDefaults.IconSize),
|
|
||||||
)
|
|
||||||
Spacer(modifier = Modifier.width(ButtonDefaults.IconSpacing))
|
|
||||||
Text(label)
|
|
||||||
}
|
|
||||||
}
|
|
@ -36,14 +36,12 @@ import kotlinx.coroutines.launch
|
|||||||
|
|
||||||
@OptIn(ExperimentalMaterial3Api::class)
|
@OptIn(ExperimentalMaterial3Api::class)
|
||||||
@Composable
|
@Composable
|
||||||
fun BitrateTile() {
|
fun BitrateTile(
|
||||||
|
settings: AppSettings,
|
||||||
|
) {
|
||||||
val scope = rememberCoroutineScope()
|
val scope = rememberCoroutineScope()
|
||||||
val showDialog = rememberUseCaseState()
|
val showDialog = rememberUseCaseState()
|
||||||
val dataStore = LocalContext.current.dataStore
|
val dataStore = LocalContext.current.dataStore
|
||||||
val settings = dataStore
|
|
||||||
.data
|
|
||||||
.collectAsState(initial = AppSettings.getDefaultInstance())
|
|
||||||
.value
|
|
||||||
|
|
||||||
fun updateValue(bitRate: Int) {
|
fun updateValue(bitRate: Int) {
|
||||||
scope.launch {
|
scope.launch {
|
||||||
|
@ -22,12 +22,9 @@ import app.myzel394.alibi.ui.enums.Screen
|
|||||||
@Composable
|
@Composable
|
||||||
fun CustomNotificationTile(
|
fun CustomNotificationTile(
|
||||||
navController: NavController,
|
navController: NavController,
|
||||||
|
settings: AppSettings,
|
||||||
) {
|
) {
|
||||||
val dataStore = LocalContext.current.dataStore
|
val dataStore = LocalContext.current.dataStore
|
||||||
val settings = dataStore
|
|
||||||
.data
|
|
||||||
.collectAsState(initial = AppSettings.getDefaultInstance())
|
|
||||||
.value
|
|
||||||
|
|
||||||
val label = if (settings.notificationSettings == null)
|
val label = if (settings.notificationSettings == null)
|
||||||
stringResource(R.string.ui_settings_option_customNotification_description_setup)
|
stringResource(R.string.ui_settings_option_customNotification_description_setup)
|
||||||
|
@ -16,14 +16,12 @@ import app.myzel394.alibi.ui.components.atoms.SettingsTile
|
|||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun DeleteRecordingsImmediatelyTile() {
|
fun DeleteRecordingsImmediatelyTile(
|
||||||
|
settings: AppSettings,
|
||||||
|
) {
|
||||||
val scope = rememberCoroutineScope()
|
val scope = rememberCoroutineScope()
|
||||||
|
|
||||||
val dataStore = LocalContext.current.dataStore
|
val dataStore = LocalContext.current.dataStore
|
||||||
val settings = dataStore
|
|
||||||
.data
|
|
||||||
.collectAsState(initial = AppSettings.getDefaultInstance())
|
|
||||||
.value
|
|
||||||
|
|
||||||
SettingsTile(
|
SettingsTile(
|
||||||
title = stringResource(R.string.ui_settings_option_deleteRecordingsImmediately_title),
|
title = stringResource(R.string.ui_settings_option_deleteRecordingsImmediately_title),
|
||||||
|
@ -2,7 +2,6 @@ package app.myzel394.alibi.ui.components.SettingsScreen.atoms
|
|||||||
|
|
||||||
import android.media.MediaRecorder
|
import android.media.MediaRecorder
|
||||||
import androidx.compose.material.icons.Icons
|
import androidx.compose.material.icons.Icons
|
||||||
import androidx.compose.material.icons.filled.AudioFile
|
|
||||||
import androidx.compose.material.icons.filled.Memory
|
import androidx.compose.material.icons.filled.Memory
|
||||||
import androidx.compose.material3.Button
|
import androidx.compose.material3.Button
|
||||||
import androidx.compose.material3.ButtonDefaults
|
import androidx.compose.material3.ButtonDefaults
|
||||||
@ -35,17 +34,15 @@ import kotlinx.coroutines.launch
|
|||||||
@OptIn(ExperimentalMaterial3Api::class)
|
@OptIn(ExperimentalMaterial3Api::class)
|
||||||
@Composable
|
@Composable
|
||||||
fun EncoderTile(
|
fun EncoderTile(
|
||||||
snackbarHostState: SnackbarHostState
|
snackbarHostState: SnackbarHostState,
|
||||||
|
settings: AppSettings,
|
||||||
) {
|
) {
|
||||||
val scope = rememberCoroutineScope()
|
val scope = rememberCoroutineScope()
|
||||||
val showDialog = rememberUseCaseState()
|
val showDialog = rememberUseCaseState()
|
||||||
val dataStore = LocalContext.current.dataStore
|
val dataStore = LocalContext.current.dataStore
|
||||||
val settings = dataStore
|
|
||||||
.data
|
|
||||||
.collectAsState(initial = AppSettings.getDefaultInstance())
|
|
||||||
.value
|
|
||||||
|
|
||||||
val updatedOutputFormatLabel = stringResource(R.string.ui_settings_option_encoder_extra_outputFormatChanged)
|
val updatedOutputFormatLabel =
|
||||||
|
stringResource(R.string.ui_settings_option_encoder_extra_outputFormatChanged)
|
||||||
|
|
||||||
fun updateValue(encoder: Int?) {
|
fun updateValue(encoder: Int?) {
|
||||||
scope.launch {
|
scope.launch {
|
||||||
@ -92,7 +89,7 @@ fun EncoderTile(
|
|||||||
selected = settings.audioRecorderSettings.encoder == index,
|
selected = settings.audioRecorderSettings.encoder == index,
|
||||||
)
|
)
|
||||||
}.toList()
|
}.toList()
|
||||||
) {index, option ->
|
) { index, _ ->
|
||||||
updateValue(index)
|
updateValue(index)
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -18,14 +18,11 @@ import kotlinx.coroutines.launch
|
|||||||
|
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun ForceExactMaxDurationTile() {
|
fun ForceExactMaxDurationTile(
|
||||||
|
settings: AppSettings,
|
||||||
|
) {
|
||||||
val scope = rememberCoroutineScope()
|
val scope = rememberCoroutineScope()
|
||||||
val showDialog = rememberUseCaseState()
|
|
||||||
val dataStore = LocalContext.current.dataStore
|
val dataStore = LocalContext.current.dataStore
|
||||||
val settings = dataStore
|
|
||||||
.data
|
|
||||||
.collectAsState(initial = AppSettings.getDefaultInstance())
|
|
||||||
.value
|
|
||||||
|
|
||||||
fun updateValue(forceExactMaxDuration: Boolean) {
|
fun updateValue(forceExactMaxDuration: Boolean) {
|
||||||
scope.launch {
|
scope.launch {
|
||||||
|
@ -24,6 +24,7 @@ import androidx.compose.ui.res.stringResource
|
|||||||
import androidx.core.os.LocaleListCompat
|
import androidx.core.os.LocaleListCompat
|
||||||
import app.myzel394.alibi.R
|
import app.myzel394.alibi.R
|
||||||
import app.myzel394.alibi.SUPPORTED_LOCALES
|
import app.myzel394.alibi.SUPPORTED_LOCALES
|
||||||
|
import app.myzel394.alibi.db.AppSettings
|
||||||
import app.myzel394.alibi.db.AudioRecorderSettings
|
import app.myzel394.alibi.db.AudioRecorderSettings
|
||||||
import app.myzel394.alibi.ui.components.atoms.SettingsTile
|
import app.myzel394.alibi.ui.components.atoms.SettingsTile
|
||||||
import app.myzel394.alibi.ui.utils.IconResource
|
import app.myzel394.alibi.ui.utils.IconResource
|
||||||
|
@ -34,14 +34,12 @@ import kotlinx.coroutines.launch
|
|||||||
|
|
||||||
@OptIn(ExperimentalMaterial3Api::class)
|
@OptIn(ExperimentalMaterial3Api::class)
|
||||||
@Composable
|
@Composable
|
||||||
fun IntervalDurationTile() {
|
fun IntervalDurationTile(
|
||||||
|
settings: AppSettings,
|
||||||
|
) {
|
||||||
val scope = rememberCoroutineScope()
|
val scope = rememberCoroutineScope()
|
||||||
val showDialog = rememberUseCaseState()
|
val showDialog = rememberUseCaseState()
|
||||||
val dataStore = LocalContext.current.dataStore
|
val dataStore = LocalContext.current.dataStore
|
||||||
val settings = dataStore
|
|
||||||
.data
|
|
||||||
.collectAsState(initial = AppSettings.getDefaultInstance())
|
|
||||||
.value
|
|
||||||
|
|
||||||
fun updateValue(intervalDuration: Long) {
|
fun updateValue(intervalDuration: Long) {
|
||||||
scope.launch {
|
scope.launch {
|
||||||
|
@ -33,14 +33,12 @@ import kotlinx.coroutines.launch
|
|||||||
|
|
||||||
@OptIn(ExperimentalMaterial3Api::class)
|
@OptIn(ExperimentalMaterial3Api::class)
|
||||||
@Composable
|
@Composable
|
||||||
fun MaxDurationTile() {
|
fun MaxDurationTile(
|
||||||
|
settings: AppSettings,
|
||||||
|
) {
|
||||||
val scope = rememberCoroutineScope()
|
val scope = rememberCoroutineScope()
|
||||||
val showDialog = rememberUseCaseState()
|
val showDialog = rememberUseCaseState()
|
||||||
val dataStore = LocalContext.current.dataStore
|
val dataStore = LocalContext.current.dataStore
|
||||||
val settings = dataStore
|
|
||||||
.data
|
|
||||||
.collectAsState(initial = AppSettings.getDefaultInstance())
|
|
||||||
.value
|
|
||||||
|
|
||||||
fun updateValue(maxDuration: Long) {
|
fun updateValue(maxDuration: Long) {
|
||||||
scope.launch {
|
scope.launch {
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
package app.myzel394.alibi.ui.components.SettingsScreen.atoms
|
package app.myzel394.alibi.ui.components.SettingsScreen.atoms
|
||||||
|
|
||||||
import android.media.MediaRecorder
|
|
||||||
import androidx.compose.material.icons.Icons
|
import androidx.compose.material.icons.Icons
|
||||||
import androidx.compose.material.icons.filled.AudioFile
|
import androidx.compose.material.icons.filled.AudioFile
|
||||||
import androidx.compose.material3.Button
|
import androidx.compose.material3.Button
|
||||||
@ -8,13 +7,8 @@ import androidx.compose.material3.ButtonDefaults
|
|||||||
import androidx.compose.material3.ExperimentalMaterial3Api
|
import androidx.compose.material3.ExperimentalMaterial3Api
|
||||||
import androidx.compose.material3.Icon
|
import androidx.compose.material3.Icon
|
||||||
import androidx.compose.material3.MaterialTheme
|
import androidx.compose.material3.MaterialTheme
|
||||||
import androidx.compose.material3.SnackbarDuration
|
|
||||||
import androidx.compose.material3.SnackbarHostState
|
|
||||||
import androidx.compose.material3.SnackbarVisuals
|
|
||||||
import androidx.compose.material3.Text
|
import androidx.compose.material3.Text
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.collectAsState
|
|
||||||
import androidx.compose.runtime.remember
|
|
||||||
import androidx.compose.runtime.rememberCoroutineScope
|
import androidx.compose.runtime.rememberCoroutineScope
|
||||||
import androidx.compose.ui.platform.LocalContext
|
import androidx.compose.ui.platform.LocalContext
|
||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
@ -35,14 +29,12 @@ import kotlinx.coroutines.launch
|
|||||||
|
|
||||||
@OptIn(ExperimentalMaterial3Api::class)
|
@OptIn(ExperimentalMaterial3Api::class)
|
||||||
@Composable
|
@Composable
|
||||||
fun OutputFormatTile() {
|
fun OutputFormatTile(
|
||||||
|
settings: AppSettings,
|
||||||
|
) {
|
||||||
val scope = rememberCoroutineScope()
|
val scope = rememberCoroutineScope()
|
||||||
val showDialog = rememberUseCaseState()
|
val showDialog = rememberUseCaseState()
|
||||||
val dataStore = LocalContext.current.dataStore
|
val dataStore = LocalContext.current.dataStore
|
||||||
val settings = dataStore
|
|
||||||
.data
|
|
||||||
.collectAsState(initial = AppSettings.getDefaultInstance())
|
|
||||||
.value
|
|
||||||
val availableOptions = if (settings.audioRecorderSettings.encoder == null)
|
val availableOptions = if (settings.audioRecorderSettings.encoder == null)
|
||||||
AudioRecorderSettings.OUTPUT_FORMAT_INDEX_TEXT_MAP.keys.toTypedArray()
|
AudioRecorderSettings.OUTPUT_FORMAT_INDEX_TEXT_MAP.keys.toTypedArray()
|
||||||
else AudioRecorderSettings.ENCODER_SUPPORTED_OUTPUT_FORMATS_MAP[settings.audioRecorderSettings.encoder]!!
|
else AudioRecorderSettings.ENCODER_SUPPORTED_OUTPUT_FORMATS_MAP[settings.audioRecorderSettings.encoder]!!
|
||||||
@ -74,7 +66,7 @@ fun OutputFormatTile() {
|
|||||||
selected = settings.audioRecorderSettings.outputFormat == option,
|
selected = settings.audioRecorderSettings.outputFormat == option,
|
||||||
)
|
)
|
||||||
}.toList()
|
}.toList()
|
||||||
) {index, option ->
|
) { index, _ ->
|
||||||
updateValue(availableOptions[index])
|
updateValue(availableOptions[index])
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -36,14 +36,12 @@ import kotlinx.coroutines.launch
|
|||||||
|
|
||||||
@OptIn(ExperimentalMaterial3Api::class)
|
@OptIn(ExperimentalMaterial3Api::class)
|
||||||
@Composable
|
@Composable
|
||||||
fun SamplingRateTile() {
|
fun SamplingRateTile(
|
||||||
|
settings: AppSettings,
|
||||||
|
) {
|
||||||
val scope = rememberCoroutineScope()
|
val scope = rememberCoroutineScope()
|
||||||
val showDialog = rememberUseCaseState()
|
val showDialog = rememberUseCaseState()
|
||||||
val dataStore = LocalContext.current.dataStore
|
val dataStore = LocalContext.current.dataStore
|
||||||
val settings = dataStore
|
|
||||||
.data
|
|
||||||
.collectAsState(initial = AppSettings.getDefaultInstance())
|
|
||||||
.value
|
|
||||||
|
|
||||||
fun updateValue(samplingRate: Int?) {
|
fun updateValue(samplingRate: Int?) {
|
||||||
scope.launch {
|
scope.launch {
|
||||||
|
@ -19,13 +19,11 @@ import kotlinx.coroutines.launch
|
|||||||
|
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun ShowAllMicrophonesTile() {
|
fun ShowAllMicrophonesTile(
|
||||||
|
settings: AppSettings,
|
||||||
|
) {
|
||||||
val scope = rememberCoroutineScope()
|
val scope = rememberCoroutineScope()
|
||||||
val dataStore = LocalContext.current.dataStore
|
val dataStore = LocalContext.current.dataStore
|
||||||
val settings = dataStore
|
|
||||||
.data
|
|
||||||
.collectAsState(initial = AppSettings.getDefaultInstance())
|
|
||||||
.value
|
|
||||||
|
|
||||||
fun updateValue(showAllMicrophones: Boolean) {
|
fun updateValue(showAllMicrophones: Boolean) {
|
||||||
scope.launch {
|
scope.launch {
|
||||||
|
@ -56,6 +56,7 @@ import app.myzel394.alibi.ui.components.SettingsScreen.atoms.ThemeSelector
|
|||||||
import app.myzel394.alibi.ui.components.atoms.GlobalSwitch
|
import app.myzel394.alibi.ui.components.atoms.GlobalSwitch
|
||||||
import app.myzel394.alibi.ui.components.atoms.MessageBox
|
import app.myzel394.alibi.ui.components.atoms.MessageBox
|
||||||
import app.myzel394.alibi.ui.components.atoms.MessageType
|
import app.myzel394.alibi.ui.components.atoms.MessageType
|
||||||
|
import app.myzel394.alibi.ui.effects.rememberSettings
|
||||||
import app.myzel394.alibi.ui.models.AudioRecorderModel
|
import app.myzel394.alibi.ui.models.AudioRecorderModel
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
|
|
||||||
@ -114,10 +115,7 @@ fun SettingsScreen(
|
|||||||
) {
|
) {
|
||||||
val scope = rememberCoroutineScope()
|
val scope = rememberCoroutineScope()
|
||||||
val dataStore = LocalContext.current.dataStore
|
val dataStore = LocalContext.current.dataStore
|
||||||
val settings = dataStore
|
val settings = rememberSettings()
|
||||||
.data
|
|
||||||
.collectAsState(initial = AppSettings.getDefaultInstance())
|
|
||||||
.value
|
|
||||||
|
|
||||||
// Show alert
|
// Show alert
|
||||||
if (audioRecorder.isInRecording)
|
if (audioRecorder.isInRecording)
|
||||||
@ -145,12 +143,12 @@ fun SettingsScreen(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
MaxDurationTile()
|
MaxDurationTile(settings = settings)
|
||||||
IntervalDurationTile()
|
IntervalDurationTile(settings = settings)
|
||||||
ForceExactMaxDurationTile()
|
ForceExactMaxDurationTile(settings = settings)
|
||||||
InAppLanguagePicker()
|
InAppLanguagePicker()
|
||||||
DeleteRecordingsImmediatelyTile()
|
DeleteRecordingsImmediatelyTile(settings = settings)
|
||||||
CustomNotificationTile(navController = navController)
|
CustomNotificationTile(navController = navController, settings = settings)
|
||||||
AboutTile(navController = navController)
|
AboutTile(navController = navController)
|
||||||
AnimatedVisibility(visible = settings.showAdvancedSettings) {
|
AnimatedVisibility(visible = settings.showAdvancedSettings) {
|
||||||
Column(
|
Column(
|
||||||
@ -163,11 +161,11 @@ fun SettingsScreen(
|
|||||||
.fillMaxWidth()
|
.fillMaxWidth()
|
||||||
.padding(horizontal = 16.dp, vertical = 32.dp)
|
.padding(horizontal = 16.dp, vertical = 32.dp)
|
||||||
)
|
)
|
||||||
ShowAllMicrophonesTile()
|
ShowAllMicrophonesTile(settings = settings)
|
||||||
BitrateTile()
|
BitrateTile(settings = settings)
|
||||||
SamplingRateTile()
|
SamplingRateTile(settings = settings)
|
||||||
EncoderTile(snackbarHostState = snackbarHostState)
|
EncoderTile(snackbarHostState = snackbarHostState, settings = settings)
|
||||||
OutputFormatTile()
|
OutputFormatTile(settings = settings)
|
||||||
}
|
}
|
||||||
Divider(
|
Divider(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
|
Loading…
x
Reference in New Issue
Block a user