mirror of
https://github.com/Myzel394/Alibi.git
synced 2025-06-19 07:15:25 +02:00
chore(ui): Improve structure for settings
This commit is contained in:
parent
b98718214c
commit
d4a5612b77
@ -9,6 +9,7 @@ import android.media.MediaRecorder.OnErrorListener
|
|||||||
import android.os.Build
|
import android.os.Build
|
||||||
import android.os.Handler
|
import android.os.Handler
|
||||||
import android.os.Looper
|
import android.os.Looper
|
||||||
|
import app.myzel394.alibi.db.AppSettings
|
||||||
import app.myzel394.alibi.db.AudioRecorderSettings
|
import app.myzel394.alibi.db.AudioRecorderSettings
|
||||||
import app.myzel394.alibi.db.RecordingInformation
|
import app.myzel394.alibi.db.RecordingInformation
|
||||||
import app.myzel394.alibi.enums.RecorderState
|
import app.myzel394.alibi.enums.RecorderState
|
||||||
@ -296,14 +297,14 @@ class AudioRecorderService :
|
|||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
fun from(audioRecorderSettings: AudioRecorderSettings): Settings {
|
fun from(appSettings: AppSettings): Settings {
|
||||||
return Settings(
|
return Settings(
|
||||||
intervalDuration = audioRecorderSettings.intervalDuration,
|
intervalDuration = appSettings.intervalDuration,
|
||||||
bitRate = audioRecorderSettings.bitRate,
|
maxDuration = appSettings.maxDuration,
|
||||||
samplingRate = audioRecorderSettings.getSamplingRate(),
|
bitRate = appSettings.audioRecorderSettings.bitRate,
|
||||||
outputFormat = audioRecorderSettings.getOutputFormat(),
|
samplingRate = appSettings.audioRecorderSettings.getSamplingRate(),
|
||||||
encoder = audioRecorderSettings.getEncoder(),
|
outputFormat = appSettings.audioRecorderSettings.getOutputFormat(),
|
||||||
maxDuration = audioRecorderSettings.maxDuration,
|
encoder = appSettings.audioRecorderSettings.getEncoder(),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -226,10 +226,9 @@ class VideoRecorderService :
|
|||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
fun from(appSettings: AppSettings) = Settings(
|
fun from(appSettings: AppSettings) = Settings(
|
||||||
// TODO: Migrate audioSettings
|
maxDuration = appSettings.maxDuration,
|
||||||
maxDuration = appSettings.audioRecorderSettings.maxDuration,
|
intervalDuration = appSettings.intervalDuration,
|
||||||
intervalDuration = appSettings.audioRecorderSettings.intervalDuration,
|
folder = appSettings.saveFolder,
|
||||||
folder = appSettings.audioRecorderSettings.saveFolder,
|
|
||||||
targetVideoBitRate = appSettings.videoRecorderSettings.targetedVideoBitRate,
|
targetVideoBitRate = appSettings.videoRecorderSettings.targetedVideoBitRate,
|
||||||
targetFrameRate = appSettings.videoRecorderSettings.targetFrameRate,
|
targetFrameRate = appSettings.videoRecorderSettings.targetFrameRate,
|
||||||
quality = appSettings.videoRecorderSettings.getQualitySelector()
|
quality = appSettings.videoRecorderSettings.getQualitySelector()
|
||||||
|
@ -120,7 +120,7 @@ fun StartRecording(
|
|||||||
Text(
|
Text(
|
||||||
stringResource(
|
stringResource(
|
||||||
R.string.ui_audioRecorder_action_start_description,
|
R.string.ui_audioRecorder_action_start_description,
|
||||||
settings.audioRecorderSettings.maxDuration / 1000 / 60
|
settings.maxDuration / 1000 / 60
|
||||||
),
|
),
|
||||||
style = MaterialTheme.typography.bodySmall.copy(
|
style = MaterialTheme.typography.bodySmall.copy(
|
||||||
color = MaterialTheme.colorScheme.onSurfaceVariant,
|
color = MaterialTheme.colorScheme.onSurfaceVariant,
|
||||||
|
@ -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.background
|
||||||
import androidx.compose.foundation.clickable
|
import androidx.compose.foundation.clickable
|
@ -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.foundation.text.KeyboardOptions
|
||||||
import androidx.compose.material.icons.Icons
|
import androidx.compose.material.icons.Icons
|
||||||
import androidx.compose.material.icons.filled.Mic
|
|
||||||
import androidx.compose.material.icons.filled.Tune
|
import androidx.compose.material.icons.filled.Tune
|
||||||
import androidx.compose.material3.Button
|
import androidx.compose.material3.Button
|
||||||
import androidx.compose.material3.ButtonDefaults
|
import androidx.compose.material3.ButtonDefaults
|
||||||
@ -11,7 +10,6 @@ import androidx.compose.material3.Icon
|
|||||||
import androidx.compose.material3.MaterialTheme
|
import androidx.compose.material3.MaterialTheme
|
||||||
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.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
|
||||||
@ -36,7 +34,7 @@ import kotlinx.coroutines.launch
|
|||||||
|
|
||||||
@OptIn(ExperimentalMaterial3Api::class)
|
@OptIn(ExperimentalMaterial3Api::class)
|
||||||
@Composable
|
@Composable
|
||||||
fun BitrateTile(
|
fun AudioRecorderBitrateTile(
|
||||||
settings: AppSettings,
|
settings: AppSettings,
|
||||||
) {
|
) {
|
||||||
val scope = rememberCoroutineScope()
|
val scope = rememberCoroutineScope()
|
@ -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 android.media.MediaRecorder
|
||||||
import androidx.compose.material.icons.Icons
|
import androidx.compose.material.icons.Icons
|
||||||
@ -12,7 +12,6 @@ import androidx.compose.material3.SnackbarDuration
|
|||||||
import androidx.compose.material3.SnackbarHostState
|
import androidx.compose.material3.SnackbarHostState
|
||||||
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.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
|
||||||
@ -33,7 +32,7 @@ import kotlinx.coroutines.launch
|
|||||||
|
|
||||||
@OptIn(ExperimentalMaterial3Api::class)
|
@OptIn(ExperimentalMaterial3Api::class)
|
||||||
@Composable
|
@Composable
|
||||||
fun EncoderTile(
|
fun AudioRecorderEncoderTile(
|
||||||
snackbarHostState: SnackbarHostState,
|
snackbarHostState: SnackbarHostState,
|
||||||
settings: AppSettings,
|
settings: AppSettings,
|
||||||
) {
|
) {
|
@ -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.Icons
|
||||||
import androidx.compose.material.icons.filled.AudioFile
|
import androidx.compose.material.icons.filled.AudioFile
|
||||||
@ -29,7 +29,7 @@ import kotlinx.coroutines.launch
|
|||||||
|
|
||||||
@OptIn(ExperimentalMaterial3Api::class)
|
@OptIn(ExperimentalMaterial3Api::class)
|
||||||
@Composable
|
@Composable
|
||||||
fun OutputFormatTile(
|
fun AudioRecorderOutputFormatTile(
|
||||||
settings: AppSettings,
|
settings: AppSettings,
|
||||||
) {
|
) {
|
||||||
val scope = rememberCoroutineScope()
|
val scope = rememberCoroutineScope()
|
@ -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.foundation.text.KeyboardOptions
|
||||||
import androidx.compose.material.icons.Icons
|
import androidx.compose.material.icons.Icons
|
||||||
import androidx.compose.material.icons.filled.RadioButtonChecked
|
import androidx.compose.material.icons.filled.RadioButtonChecked
|
||||||
import androidx.compose.material.icons.filled.Tune
|
|
||||||
import androidx.compose.material3.Button
|
import androidx.compose.material3.Button
|
||||||
import androidx.compose.material3.ButtonDefaults
|
import androidx.compose.material3.ButtonDefaults
|
||||||
import androidx.compose.material3.ExperimentalMaterial3Api
|
import androidx.compose.material3.ExperimentalMaterial3Api
|
||||||
@ -11,7 +10,6 @@ import androidx.compose.material3.Icon
|
|||||||
import androidx.compose.material3.MaterialTheme
|
import androidx.compose.material3.MaterialTheme
|
||||||
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.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
|
||||||
@ -36,7 +34,7 @@ import kotlinx.coroutines.launch
|
|||||||
|
|
||||||
@OptIn(ExperimentalMaterial3Api::class)
|
@OptIn(ExperimentalMaterial3Api::class)
|
||||||
@Composable
|
@Composable
|
||||||
fun SamplingRateTile(
|
fun AudioRecorderSamplingRateTile(
|
||||||
settings: AppSettings,
|
settings: AppSettings,
|
||||||
) {
|
) {
|
||||||
val scope = rememberCoroutineScope()
|
val scope = rememberCoroutineScope()
|
@ -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.Icons
|
||||||
import androidx.compose.material.icons.filled.GraphicEq
|
|
||||||
import androidx.compose.material.icons.filled.MicExternalOn
|
import androidx.compose.material.icons.filled.MicExternalOn
|
||||||
import androidx.compose.material3.Icon
|
import androidx.compose.material3.Icon
|
||||||
import androidx.compose.material3.Switch
|
import androidx.compose.material3.Switch
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.collectAsState
|
|
||||||
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
|
||||||
@ -14,12 +12,11 @@ import app.myzel394.alibi.R
|
|||||||
import app.myzel394.alibi.dataStore
|
import app.myzel394.alibi.dataStore
|
||||||
import app.myzel394.alibi.db.AppSettings
|
import app.myzel394.alibi.db.AppSettings
|
||||||
import app.myzel394.alibi.ui.components.atoms.SettingsTile
|
import app.myzel394.alibi.ui.components.atoms.SettingsTile
|
||||||
import com.maxkeppeker.sheets.core.models.base.rememberUseCaseState
|
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
|
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun ShowAllMicrophonesTile(
|
fun AudioRecorderShowAllMicrophonesTile(
|
||||||
settings: AppSettings,
|
settings: AppSettings,
|
||||||
) {
|
) {
|
||||||
val scope = rememberCoroutineScope()
|
val scope = rememberCoroutineScope()
|
@ -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.foundation.clickable
|
||||||
import androidx.compose.material.icons.Icons
|
import androidx.compose.material.icons.Icons
|
@ -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.Icons
|
||||||
import androidx.compose.material.icons.filled.DeleteSweep
|
import androidx.compose.material.icons.filled.DeleteSweep
|
||||||
@ -34,13 +34,11 @@ fun DeleteRecordingsImmediatelyTile(
|
|||||||
},
|
},
|
||||||
trailing = {
|
trailing = {
|
||||||
Switch(
|
Switch(
|
||||||
checked = settings.audioRecorderSettings.deleteRecordingsImmediately,
|
checked = settings.deleteRecordingsImmediately,
|
||||||
onCheckedChange = {
|
onCheckedChange = {
|
||||||
scope.launch {
|
scope.launch {
|
||||||
dataStore.updateData {
|
dataStore.updateData {
|
||||||
it.setAudioRecorderSettings(
|
it.setDeleteRecordingsImmediately(it.deleteRecordingsImmediately.not())
|
||||||
it.audioRecorderSettings.setDeleteRecordingsImmediately(it.audioRecorderSettings.deleteRecordingsImmediately.not())
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -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.Arrangement
|
||||||
import androidx.compose.foundation.layout.Row
|
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.fillMaxWidth
|
||||||
import androidx.compose.foundation.layout.size
|
import androidx.compose.foundation.layout.size
|
||||||
import androidx.compose.material.icons.Icons
|
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.CheckCircle
|
||||||
import androidx.compose.material.icons.filled.Download
|
import androidx.compose.material.icons.filled.Download
|
||||||
import androidx.compose.material.icons.filled.Upload
|
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.Icon
|
||||||
import androidx.compose.material3.SnackbarDuration
|
import androidx.compose.material3.SnackbarDuration
|
||||||
import androidx.compose.material3.SnackbarHostState
|
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.collectAsState
|
@ -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.Icons
|
||||||
import androidx.compose.material.icons.filled.Mic
|
import androidx.compose.material.icons.filled.Mic
|
||||||
@ -44,9 +44,7 @@ fun IntervalDurationTile(
|
|||||||
fun updateValue(intervalDuration: Long) {
|
fun updateValue(intervalDuration: Long) {
|
||||||
scope.launch {
|
scope.launch {
|
||||||
dataStore.updateData {
|
dataStore.updateData {
|
||||||
it.setAudioRecorderSettings(
|
it.setIntervalDuration(intervalDuration)
|
||||||
it.audioRecorderSettings.setIntervalDuration(intervalDuration)
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -65,7 +63,7 @@ fun IntervalDurationTile(
|
|||||||
},
|
},
|
||||||
config = DurationConfig(
|
config = DurationConfig(
|
||||||
timeFormat = DurationFormat.MM_SS,
|
timeFormat = DurationFormat.MM_SS,
|
||||||
currentTime = settings.audioRecorderSettings.intervalDuration / 1000,
|
currentTime = settings.intervalDuration / 1000,
|
||||||
minTime = 10,
|
minTime = 10,
|
||||||
maxTime = 60 * 60,
|
maxTime = 60 * 60,
|
||||||
)
|
)
|
||||||
@ -88,7 +86,7 @@ fun IntervalDurationTile(
|
|||||||
shape = MaterialTheme.shapes.medium,
|
shape = MaterialTheme.shapes.medium,
|
||||||
) {
|
) {
|
||||||
Text(
|
Text(
|
||||||
text = formatDuration(settings.audioRecorderSettings.intervalDuration),
|
text = formatDuration(settings.intervalDuration),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -96,7 +94,7 @@ fun IntervalDurationTile(
|
|||||||
ExampleListRoulette(
|
ExampleListRoulette(
|
||||||
items = AudioRecorderSettings.EXAMPLE_DURATION_TIMES,
|
items = AudioRecorderSettings.EXAMPLE_DURATION_TIMES,
|
||||||
onItemSelected = ::updateValue,
|
onItemSelected = ::updateValue,
|
||||||
) {duration ->
|
) { duration ->
|
||||||
Text(
|
Text(
|
||||||
text = formatDuration(duration),
|
text = formatDuration(duration),
|
||||||
)
|
)
|
@ -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.Icons
|
||||||
import androidx.compose.material.icons.filled.Memory
|
import androidx.compose.material.icons.filled.Memory
|
||||||
@ -43,9 +43,7 @@ fun MaxDurationTile(
|
|||||||
fun updateValue(maxDuration: Long) {
|
fun updateValue(maxDuration: Long) {
|
||||||
scope.launch {
|
scope.launch {
|
||||||
dataStore.updateData {
|
dataStore.updateData {
|
||||||
it.setAudioRecorderSettings(
|
it.setMaxDuration(maxDuration)
|
||||||
it.audioRecorderSettings.setMaxDuration(maxDuration)
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -64,7 +62,7 @@ fun MaxDurationTile(
|
|||||||
},
|
},
|
||||||
config = DurationConfig(
|
config = DurationConfig(
|
||||||
timeFormat = DurationFormat.HH_MM,
|
timeFormat = DurationFormat.HH_MM,
|
||||||
currentTime = settings.audioRecorderSettings.maxDuration / 1000,
|
currentTime = settings.maxDuration / 1000,
|
||||||
minTime = 60,
|
minTime = 60,
|
||||||
maxTime = 10 * 24 * 60 * 60,
|
maxTime = 10 * 24 * 60 * 60,
|
||||||
)
|
)
|
||||||
@ -86,7 +84,7 @@ fun MaxDurationTile(
|
|||||||
),
|
),
|
||||||
shape = MaterialTheme.shapes.medium,
|
shape = MaterialTheme.shapes.medium,
|
||||||
) {
|
) {
|
||||||
Text(formatDuration(settings.audioRecorderSettings.maxDuration))
|
Text(formatDuration(settings.maxDuration))
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
extra = {
|
extra = {
|
@ -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.content.Intent
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import android.text.TextUtils.split
|
|
||||||
import androidx.compose.foundation.layout.Arrangement
|
import androidx.compose.foundation.layout.Arrangement
|
||||||
import androidx.compose.foundation.layout.Column
|
import androidx.compose.foundation.layout.Column
|
||||||
import androidx.compose.foundation.layout.Spacer
|
import androidx.compose.foundation.layout.Spacer
|
||||||
@ -50,10 +49,10 @@ fun SaveFolderTile(
|
|||||||
val dataStore = context.dataStore
|
val dataStore = context.dataStore
|
||||||
|
|
||||||
fun updateValue(path: String?) {
|
fun updateValue(path: String?) {
|
||||||
if (settings.audioRecorderSettings.saveFolder != null) {
|
if (settings.saveFolder != null) {
|
||||||
runCatching {
|
runCatching {
|
||||||
context.contentResolver.releasePersistableUriPermission(
|
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
|
Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -61,9 +60,7 @@ fun SaveFolderTile(
|
|||||||
|
|
||||||
scope.launch {
|
scope.launch {
|
||||||
dataStore.updateData {
|
dataStore.updateData {
|
||||||
it.setAudioRecorderSettings(
|
it.setSaveFolder(path)
|
||||||
it.audioRecorderSettings.setSaveFolder(path)
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -172,11 +169,11 @@ fun SaveFolderTile(
|
|||||||
horizontalAlignment = Alignment.CenterHorizontally,
|
horizontalAlignment = Alignment.CenterHorizontally,
|
||||||
verticalArrangement = Arrangement.spacedBy(8.dp),
|
verticalArrangement = Arrangement.spacedBy(8.dp),
|
||||||
) {
|
) {
|
||||||
if (settings.audioRecorderSettings.saveFolder != null) {
|
if (settings.saveFolder != null) {
|
||||||
Text(
|
Text(
|
||||||
text = stringResource(
|
text = stringResource(
|
||||||
R.string.form_value_selected,
|
R.string.form_value_selected,
|
||||||
splitPath(settings.audioRecorderSettings.saveFolder).joinToString(" > ")
|
splitPath(settings.saveFolder).joinToString(" > ")
|
||||||
),
|
),
|
||||||
style = MaterialTheme.typography.bodySmall,
|
style = MaterialTheme.typography.bodySmall,
|
||||||
color = MaterialTheme.colorScheme.onSurfaceVariant,
|
color = MaterialTheme.colorScheme.onSurfaceVariant,
|
@ -43,7 +43,7 @@ class AudioRecorderModel :
|
|||||||
microphoneStatus = MicrophoneConnectivityStatus.CONNECTED
|
microphoneStatus = MicrophoneConnectivityStatus.CONNECTED
|
||||||
}
|
}
|
||||||
service.settings =
|
service.settings =
|
||||||
AudioRecorderService.Settings.from(settings.audioRecorderSettings)
|
AudioRecorderService.Settings.from(settings)
|
||||||
|
|
||||||
service.clearAllRecordings()
|
service.clearAllRecordings()
|
||||||
service.startRecording()
|
service.startRecording()
|
||||||
@ -55,14 +55,14 @@ class AudioRecorderModel :
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun startRecording(context: Context, settings: AppSettings) {
|
override fun startRecording(context: Context, settings: AppSettings) {
|
||||||
batchesFolder = if (settings.audioRecorderSettings.saveFolder == null)
|
batchesFolder = if (settings.saveFolder == null)
|
||||||
AudioBatchesFolder.viaInternalFolder(context)
|
AudioBatchesFolder.viaInternalFolder(context)
|
||||||
else
|
else
|
||||||
AudioBatchesFolder.viaCustomFolder(
|
AudioBatchesFolder.viaCustomFolder(
|
||||||
context,
|
context,
|
||||||
DocumentFile.fromTreeUri(
|
DocumentFile.fromTreeUri(
|
||||||
context,
|
context,
|
||||||
Uri.parse(settings.audioRecorderSettings.saveFolder)
|
Uri.parse(settings.saveFolder)
|
||||||
)!!
|
)!!
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -67,7 +67,7 @@ fun AudioRecorderScreen(
|
|||||||
val saveFile = rememberFileSaverDialog(
|
val saveFile = rememberFileSaverDialog(
|
||||||
settings.audioRecorderSettings.getMimeType()
|
settings.audioRecorderSettings.getMimeType()
|
||||||
) {
|
) {
|
||||||
if (settings.audioRecorderSettings.deleteRecordingsImmediately) {
|
if (settings.deleteRecordingsImmediately) {
|
||||||
audioRecorder.batchesFolder!!.deleteRecordings()
|
audioRecorder.batchesFolder!!.deleteRecordings()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -84,7 +84,7 @@ fun AudioRecorderScreen(
|
|||||||
var showRecorderError by remember { mutableStateOf(false) }
|
var showRecorderError by remember { mutableStateOf(false) }
|
||||||
|
|
||||||
fun saveAsLastRecording() {
|
fun saveAsLastRecording() {
|
||||||
if (!settings.audioRecorderSettings.deleteRecordingsImmediately) {
|
if (!settings.deleteRecordingsImmediately) {
|
||||||
scope.launch {
|
scope.launch {
|
||||||
dataStore.updateData {
|
dataStore.updateData {
|
||||||
it.setLastRecording(
|
it.setLastRecording(
|
||||||
@ -156,7 +156,7 @@ fun AudioRecorderScreen(
|
|||||||
BatchesFolder.BatchType.CUSTOM -> {
|
BatchesFolder.BatchType.CUSTOM -> {
|
||||||
showSnackbar(batchesFolder.customFolder!!.uri)
|
showSnackbar(batchesFolder.customFolder!!.uri)
|
||||||
|
|
||||||
if (settings.audioRecorderSettings.deleteRecordingsImmediately) {
|
if (settings.deleteRecordingsImmediately) {
|
||||||
batchesFolder.deleteRecordings()
|
batchesFolder.deleteRecordings()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -25,7 +25,6 @@ import androidx.compose.material3.Text
|
|||||||
import androidx.compose.material3.TopAppBarDefaults
|
import androidx.compose.material3.TopAppBarDefaults
|
||||||
import androidx.compose.material3.rememberTopAppBarState
|
import androidx.compose.material3.rememberTopAppBarState
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.collectAsState
|
|
||||||
import androidx.compose.runtime.remember
|
import androidx.compose.runtime.remember
|
||||||
import androidx.compose.runtime.rememberCoroutineScope
|
import androidx.compose.runtime.rememberCoroutineScope
|
||||||
import androidx.compose.ui.Alignment
|
import androidx.compose.ui.Alignment
|
||||||
@ -38,19 +37,20 @@ import androidx.navigation.NavController
|
|||||||
import app.myzel394.alibi.R
|
import app.myzel394.alibi.R
|
||||||
import app.myzel394.alibi.dataStore
|
import app.myzel394.alibi.dataStore
|
||||||
import app.myzel394.alibi.ui.SUPPORTS_DARK_MODE_NATIVELY
|
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.Tiles.AboutTile
|
||||||
import app.myzel394.alibi.ui.components.SettingsScreen.atoms.BitrateTile
|
import app.myzel394.alibi.ui.components.SettingsScreen.Tiles.AudioRecorderBitrateTile
|
||||||
import app.myzel394.alibi.ui.components.SettingsScreen.atoms.CustomNotificationTile
|
import app.myzel394.alibi.ui.components.SettingsScreen.Tiles.CustomNotificationTile
|
||||||
import app.myzel394.alibi.ui.components.SettingsScreen.atoms.DeleteRecordingsImmediatelyTile
|
import app.myzel394.alibi.ui.components.SettingsScreen.Tiles.DeleteRecordingsImmediatelyTile
|
||||||
import app.myzel394.alibi.ui.components.SettingsScreen.atoms.EncoderTile
|
import app.myzel394.alibi.ui.components.SettingsScreen.Tiles.DividerTitle
|
||||||
import app.myzel394.alibi.ui.components.SettingsScreen.atoms.ImportExport
|
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.InAppLanguagePicker
|
||||||
import app.myzel394.alibi.ui.components.SettingsScreen.atoms.IntervalDurationTile
|
import app.myzel394.alibi.ui.components.SettingsScreen.Tiles.IntervalDurationTile
|
||||||
import app.myzel394.alibi.ui.components.SettingsScreen.atoms.MaxDurationTile
|
import app.myzel394.alibi.ui.components.SettingsScreen.Tiles.MaxDurationTile
|
||||||
import app.myzel394.alibi.ui.components.SettingsScreen.atoms.OutputFormatTile
|
import app.myzel394.alibi.ui.components.SettingsScreen.Tiles.AudioRecorderOutputFormatTile
|
||||||
import app.myzel394.alibi.ui.components.SettingsScreen.atoms.SamplingRateTile
|
import app.myzel394.alibi.ui.components.SettingsScreen.Tiles.AudioRecorderSamplingRateTile
|
||||||
import app.myzel394.alibi.ui.components.SettingsScreen.atoms.SaveFolderTile
|
import app.myzel394.alibi.ui.components.SettingsScreen.Tiles.SaveFolderTile
|
||||||
import app.myzel394.alibi.ui.components.SettingsScreen.atoms.ShowAllMicrophonesTile
|
import app.myzel394.alibi.ui.components.SettingsScreen.Tiles.AudioRecorderShowAllMicrophonesTile
|
||||||
import app.myzel394.alibi.ui.components.SettingsScreen.atoms.ThemeSelector
|
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
|
||||||
@ -160,11 +160,14 @@ fun SettingsScreen(
|
|||||||
.padding(horizontal = 16.dp, vertical = 32.dp)
|
.padding(horizontal = 16.dp, vertical = 32.dp)
|
||||||
)
|
)
|
||||||
SaveFolderTile(settings = settings)
|
SaveFolderTile(settings = settings)
|
||||||
ShowAllMicrophonesTile(settings = settings)
|
AudioRecorderShowAllMicrophonesTile(settings = settings)
|
||||||
BitrateTile(settings = settings)
|
AudioRecorderBitrateTile(settings = settings)
|
||||||
SamplingRateTile(settings = settings)
|
AudioRecorderSamplingRateTile(settings = settings)
|
||||||
EncoderTile(snackbarHostState = snackbarHostState, settings = settings)
|
AudioRecorderEncoderTile(
|
||||||
OutputFormatTile(settings = settings)
|
snackbarHostState = snackbarHostState,
|
||||||
|
settings = settings
|
||||||
|
)
|
||||||
|
AudioRecorderOutputFormatTile(settings = settings)
|
||||||
}
|
}
|
||||||
Divider(
|
Divider(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
|
Loading…
x
Reference in New Issue
Block a user