chore(ui): Improve structure for settings

This commit is contained in:
Myzel394 2023-12-02 16:47:11 +01:00
parent b98718214c
commit d4a5612b77
No known key found for this signature in database
GPG Key ID: 79CC92F37B3E1A2B
18 changed files with 70 additions and 86 deletions

View File

@ -9,6 +9,7 @@ import android.media.MediaRecorder.OnErrorListener
import android.os.Build
import android.os.Handler
import android.os.Looper
import app.myzel394.alibi.db.AppSettings
import app.myzel394.alibi.db.AudioRecorderSettings
import app.myzel394.alibi.db.RecordingInformation
import app.myzel394.alibi.enums.RecorderState
@ -296,14 +297,14 @@ class AudioRecorderService :
}
companion object {
fun from(audioRecorderSettings: AudioRecorderSettings): Settings {
fun from(appSettings: AppSettings): Settings {
return Settings(
intervalDuration = audioRecorderSettings.intervalDuration,
bitRate = audioRecorderSettings.bitRate,
samplingRate = audioRecorderSettings.getSamplingRate(),
outputFormat = audioRecorderSettings.getOutputFormat(),
encoder = audioRecorderSettings.getEncoder(),
maxDuration = audioRecorderSettings.maxDuration,
intervalDuration = appSettings.intervalDuration,
maxDuration = appSettings.maxDuration,
bitRate = appSettings.audioRecorderSettings.bitRate,
samplingRate = appSettings.audioRecorderSettings.getSamplingRate(),
outputFormat = appSettings.audioRecorderSettings.getOutputFormat(),
encoder = appSettings.audioRecorderSettings.getEncoder(),
)
}
}

View File

@ -226,10 +226,9 @@ class VideoRecorderService :
companion object {
fun from(appSettings: AppSettings) = Settings(
// TODO: Migrate audioSettings
maxDuration = appSettings.audioRecorderSettings.maxDuration,
intervalDuration = appSettings.audioRecorderSettings.intervalDuration,
folder = appSettings.audioRecorderSettings.saveFolder,
maxDuration = appSettings.maxDuration,
intervalDuration = appSettings.intervalDuration,
folder = appSettings.saveFolder,
targetVideoBitRate = appSettings.videoRecorderSettings.targetedVideoBitRate,
targetFrameRate = appSettings.videoRecorderSettings.targetFrameRate,
quality = appSettings.videoRecorderSettings.getQualitySelector()

View File

@ -120,7 +120,7 @@ fun StartRecording(
Text(
stringResource(
R.string.ui_audioRecorder_action_start_description,
settings.audioRecorderSettings.maxDuration / 1000 / 60
settings.maxDuration / 1000 / 60
),
style = MaterialTheme.typography.bodySmall.copy(
color = MaterialTheme.colorScheme.onSurfaceVariant,

View File

@ -1,4 +1,4 @@
package app.myzel394.alibi.ui.components.SettingsScreen.atoms
package app.myzel394.alibi.ui.components.SettingsScreen.Tiles
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable

View File

@ -1,8 +1,7 @@
package app.myzel394.alibi.ui.components.SettingsScreen.atoms
package app.myzel394.alibi.ui.components.SettingsScreen.Tiles
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Mic
import androidx.compose.material.icons.filled.Tune
import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults
@ -11,7 +10,6 @@ import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
@ -36,7 +34,7 @@ import kotlinx.coroutines.launch
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun BitrateTile(
fun AudioRecorderBitrateTile(
settings: AppSettings,
) {
val scope = rememberCoroutineScope()

View File

@ -1,4 +1,4 @@
package app.myzel394.alibi.ui.components.SettingsScreen.atoms
package app.myzel394.alibi.ui.components.SettingsScreen.Tiles
import android.media.MediaRecorder
import androidx.compose.material.icons.Icons
@ -12,7 +12,6 @@ import androidx.compose.material3.SnackbarDuration
import androidx.compose.material3.SnackbarHostState
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
@ -33,7 +32,7 @@ import kotlinx.coroutines.launch
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun EncoderTile(
fun AudioRecorderEncoderTile(
snackbarHostState: SnackbarHostState,
settings: AppSettings,
) {

View File

@ -1,4 +1,4 @@
package app.myzel394.alibi.ui.components.SettingsScreen.atoms
package app.myzel394.alibi.ui.components.SettingsScreen.Tiles
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.AudioFile
@ -29,7 +29,7 @@ import kotlinx.coroutines.launch
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun OutputFormatTile(
fun AudioRecorderOutputFormatTile(
settings: AppSettings,
) {
val scope = rememberCoroutineScope()

View File

@ -1,9 +1,8 @@
package app.myzel394.alibi.ui.components.SettingsScreen.atoms
package app.myzel394.alibi.ui.components.SettingsScreen.Tiles
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.RadioButtonChecked
import androidx.compose.material.icons.filled.Tune
import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.ExperimentalMaterial3Api
@ -11,7 +10,6 @@ import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
@ -36,7 +34,7 @@ import kotlinx.coroutines.launch
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun SamplingRateTile(
fun AudioRecorderSamplingRateTile(
settings: AppSettings,
) {
val scope = rememberCoroutineScope()

View File

@ -1,12 +1,10 @@
package app.myzel394.alibi.ui.components.SettingsScreen.atoms
package app.myzel394.alibi.ui.components.SettingsScreen.Tiles
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.GraphicEq
import androidx.compose.material.icons.filled.MicExternalOn
import androidx.compose.material3.Icon
import androidx.compose.material3.Switch
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
@ -14,12 +12,11 @@ import app.myzel394.alibi.R
import app.myzel394.alibi.dataStore
import app.myzel394.alibi.db.AppSettings
import app.myzel394.alibi.ui.components.atoms.SettingsTile
import com.maxkeppeker.sheets.core.models.base.rememberUseCaseState
import kotlinx.coroutines.launch
@Composable
fun ShowAllMicrophonesTile(
fun AudioRecorderShowAllMicrophonesTile(
settings: AppSettings,
) {
val scope = rememberCoroutineScope()

View File

@ -1,4 +1,4 @@
package app.myzel394.alibi.ui.components.SettingsScreen.atoms
package app.myzel394.alibi.ui.components.SettingsScreen.Tiles
import androidx.compose.foundation.clickable
import androidx.compose.material.icons.Icons

View File

@ -1,4 +1,4 @@
package app.myzel394.alibi.ui.components.SettingsScreen.atoms
package app.myzel394.alibi.ui.components.SettingsScreen.Tiles
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.DeleteSweep
@ -34,13 +34,11 @@ fun DeleteRecordingsImmediatelyTile(
},
trailing = {
Switch(
checked = settings.audioRecorderSettings.deleteRecordingsImmediately,
checked = settings.deleteRecordingsImmediately,
onCheckedChange = {
scope.launch {
dataStore.updateData {
it.setAudioRecorderSettings(
it.audioRecorderSettings.setDeleteRecordingsImmediately(it.audioRecorderSettings.deleteRecordingsImmediately.not())
)
it.setDeleteRecordingsImmediately(it.deleteRecordingsImmediately.not())
}
}
}

View File

@ -1,4 +1,4 @@
package app.myzel394.alibi.ui.components.SettingsScreen.atoms
package app.myzel394.alibi.ui.components.SettingsScreen.Tiles
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Row
@ -6,7 +6,6 @@ import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.size
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Check
import androidx.compose.material.icons.filled.CheckCircle
import androidx.compose.material.icons.filled.Download
import androidx.compose.material.icons.filled.Upload
@ -16,7 +15,6 @@ import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.Icon
import androidx.compose.material3.SnackbarDuration
import androidx.compose.material3.SnackbarHostState
import androidx.compose.material3.SnackbarVisuals
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState

View File

@ -1,4 +1,4 @@
package app.myzel394.alibi.ui.components.SettingsScreen.atoms
package app.myzel394.alibi.ui.components.SettingsScreen.Tiles
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Mic
@ -44,9 +44,7 @@ fun IntervalDurationTile(
fun updateValue(intervalDuration: Long) {
scope.launch {
dataStore.updateData {
it.setAudioRecorderSettings(
it.audioRecorderSettings.setIntervalDuration(intervalDuration)
)
it.setIntervalDuration(intervalDuration)
}
}
}
@ -65,7 +63,7 @@ fun IntervalDurationTile(
},
config = DurationConfig(
timeFormat = DurationFormat.MM_SS,
currentTime = settings.audioRecorderSettings.intervalDuration / 1000,
currentTime = settings.intervalDuration / 1000,
minTime = 10,
maxTime = 60 * 60,
)
@ -88,7 +86,7 @@ fun IntervalDurationTile(
shape = MaterialTheme.shapes.medium,
) {
Text(
text = formatDuration(settings.audioRecorderSettings.intervalDuration),
text = formatDuration(settings.intervalDuration),
)
}
},
@ -96,7 +94,7 @@ fun IntervalDurationTile(
ExampleListRoulette(
items = AudioRecorderSettings.EXAMPLE_DURATION_TIMES,
onItemSelected = ::updateValue,
) {duration ->
) { duration ->
Text(
text = formatDuration(duration),
)

View File

@ -1,4 +1,4 @@
package app.myzel394.alibi.ui.components.SettingsScreen.atoms
package app.myzel394.alibi.ui.components.SettingsScreen.Tiles
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Memory
@ -43,9 +43,7 @@ fun MaxDurationTile(
fun updateValue(maxDuration: Long) {
scope.launch {
dataStore.updateData {
it.setAudioRecorderSettings(
it.audioRecorderSettings.setMaxDuration(maxDuration)
)
it.setMaxDuration(maxDuration)
}
}
}
@ -64,7 +62,7 @@ fun MaxDurationTile(
},
config = DurationConfig(
timeFormat = DurationFormat.HH_MM,
currentTime = settings.audioRecorderSettings.maxDuration / 1000,
currentTime = settings.maxDuration / 1000,
minTime = 60,
maxTime = 10 * 24 * 60 * 60,
)
@ -86,7 +84,7 @@ fun MaxDurationTile(
),
shape = MaterialTheme.shapes.medium,
) {
Text(formatDuration(settings.audioRecorderSettings.maxDuration))
Text(formatDuration(settings.maxDuration))
}
},
extra = {

View File

@ -1,8 +1,7 @@
package app.myzel394.alibi.ui.components.SettingsScreen.atoms
package app.myzel394.alibi.ui.components.SettingsScreen.Tiles
import android.content.Intent
import android.net.Uri
import android.text.TextUtils.split
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
@ -50,10 +49,10 @@ fun SaveFolderTile(
val dataStore = context.dataStore
fun updateValue(path: String?) {
if (settings.audioRecorderSettings.saveFolder != null) {
if (settings.saveFolder != null) {
runCatching {
context.contentResolver.releasePersistableUriPermission(
Uri.parse(settings.audioRecorderSettings.saveFolder),
Uri.parse(settings.saveFolder),
Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION
)
}
@ -61,9 +60,7 @@ fun SaveFolderTile(
scope.launch {
dataStore.updateData {
it.setAudioRecorderSettings(
it.audioRecorderSettings.setSaveFolder(path)
)
it.setSaveFolder(path)
}
}
}
@ -172,11 +169,11 @@ fun SaveFolderTile(
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.spacedBy(8.dp),
) {
if (settings.audioRecorderSettings.saveFolder != null) {
if (settings.saveFolder != null) {
Text(
text = stringResource(
R.string.form_value_selected,
splitPath(settings.audioRecorderSettings.saveFolder).joinToString(" > ")
splitPath(settings.saveFolder).joinToString(" > ")
),
style = MaterialTheme.typography.bodySmall,
color = MaterialTheme.colorScheme.onSurfaceVariant,

View File

@ -43,7 +43,7 @@ class AudioRecorderModel :
microphoneStatus = MicrophoneConnectivityStatus.CONNECTED
}
service.settings =
AudioRecorderService.Settings.from(settings.audioRecorderSettings)
AudioRecorderService.Settings.from(settings)
service.clearAllRecordings()
service.startRecording()
@ -55,14 +55,14 @@ class AudioRecorderModel :
}
override fun startRecording(context: Context, settings: AppSettings) {
batchesFolder = if (settings.audioRecorderSettings.saveFolder == null)
batchesFolder = if (settings.saveFolder == null)
AudioBatchesFolder.viaInternalFolder(context)
else
AudioBatchesFolder.viaCustomFolder(
context,
DocumentFile.fromTreeUri(
context,
Uri.parse(settings.audioRecorderSettings.saveFolder)
Uri.parse(settings.saveFolder)
)!!
)

View File

@ -67,7 +67,7 @@ fun AudioRecorderScreen(
val saveFile = rememberFileSaverDialog(
settings.audioRecorderSettings.getMimeType()
) {
if (settings.audioRecorderSettings.deleteRecordingsImmediately) {
if (settings.deleteRecordingsImmediately) {
audioRecorder.batchesFolder!!.deleteRecordings()
}
@ -84,7 +84,7 @@ fun AudioRecorderScreen(
var showRecorderError by remember { mutableStateOf(false) }
fun saveAsLastRecording() {
if (!settings.audioRecorderSettings.deleteRecordingsImmediately) {
if (!settings.deleteRecordingsImmediately) {
scope.launch {
dataStore.updateData {
it.setLastRecording(
@ -156,7 +156,7 @@ fun AudioRecorderScreen(
BatchesFolder.BatchType.CUSTOM -> {
showSnackbar(batchesFolder.customFolder!!.uri)
if (settings.audioRecorderSettings.deleteRecordingsImmediately) {
if (settings.deleteRecordingsImmediately) {
batchesFolder.deleteRecordings()
}
}

View File

@ -25,7 +25,6 @@ import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.material3.rememberTopAppBarState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Alignment
@ -38,19 +37,20 @@ import androidx.navigation.NavController
import app.myzel394.alibi.R
import app.myzel394.alibi.dataStore
import app.myzel394.alibi.ui.SUPPORTS_DARK_MODE_NATIVELY
import app.myzel394.alibi.ui.components.SettingsScreen.atoms.AboutTile
import app.myzel394.alibi.ui.components.SettingsScreen.atoms.BitrateTile
import app.myzel394.alibi.ui.components.SettingsScreen.atoms.CustomNotificationTile
import app.myzel394.alibi.ui.components.SettingsScreen.atoms.DeleteRecordingsImmediatelyTile
import app.myzel394.alibi.ui.components.SettingsScreen.atoms.EncoderTile
import app.myzel394.alibi.ui.components.SettingsScreen.atoms.ImportExport
import app.myzel394.alibi.ui.components.SettingsScreen.Tiles.AboutTile
import app.myzel394.alibi.ui.components.SettingsScreen.Tiles.AudioRecorderBitrateTile
import app.myzel394.alibi.ui.components.SettingsScreen.Tiles.CustomNotificationTile
import app.myzel394.alibi.ui.components.SettingsScreen.Tiles.DeleteRecordingsImmediatelyTile
import app.myzel394.alibi.ui.components.SettingsScreen.Tiles.DividerTitle
import app.myzel394.alibi.ui.components.SettingsScreen.Tiles.AudioRecorderEncoderTile
import app.myzel394.alibi.ui.components.SettingsScreen.Tiles.ImportExport
import app.myzel394.alibi.ui.components.SettingsScreen.atoms.InAppLanguagePicker
import app.myzel394.alibi.ui.components.SettingsScreen.atoms.IntervalDurationTile
import app.myzel394.alibi.ui.components.SettingsScreen.atoms.MaxDurationTile
import app.myzel394.alibi.ui.components.SettingsScreen.atoms.OutputFormatTile
import app.myzel394.alibi.ui.components.SettingsScreen.atoms.SamplingRateTile
import app.myzel394.alibi.ui.components.SettingsScreen.atoms.SaveFolderTile
import app.myzel394.alibi.ui.components.SettingsScreen.atoms.ShowAllMicrophonesTile
import app.myzel394.alibi.ui.components.SettingsScreen.Tiles.IntervalDurationTile
import app.myzel394.alibi.ui.components.SettingsScreen.Tiles.MaxDurationTile
import app.myzel394.alibi.ui.components.SettingsScreen.Tiles.AudioRecorderOutputFormatTile
import app.myzel394.alibi.ui.components.SettingsScreen.Tiles.AudioRecorderSamplingRateTile
import app.myzel394.alibi.ui.components.SettingsScreen.Tiles.SaveFolderTile
import app.myzel394.alibi.ui.components.SettingsScreen.Tiles.AudioRecorderShowAllMicrophonesTile
import app.myzel394.alibi.ui.components.SettingsScreen.atoms.ThemeSelector
import app.myzel394.alibi.ui.components.atoms.GlobalSwitch
import app.myzel394.alibi.ui.components.atoms.MessageBox
@ -160,11 +160,14 @@ fun SettingsScreen(
.padding(horizontal = 16.dp, vertical = 32.dp)
)
SaveFolderTile(settings = settings)
ShowAllMicrophonesTile(settings = settings)
BitrateTile(settings = settings)
SamplingRateTile(settings = settings)
EncoderTile(snackbarHostState = snackbarHostState, settings = settings)
OutputFormatTile(settings = settings)
AudioRecorderShowAllMicrophonesTile(settings = settings)
AudioRecorderBitrateTile(settings = settings)
AudioRecorderSamplingRateTile(settings = settings)
AudioRecorderEncoderTile(
snackbarHostState = snackbarHostState,
settings = settings
)
AudioRecorderOutputFormatTile(settings = settings)
}
Divider(
modifier = Modifier