mirror of
https://github.com/Myzel394/Alibi.git
synced 2025-06-18 23:05:26 +02:00
feat: Show hint on SettingsScreen if user is recording
This commit is contained in:
parent
8e2449ab4e
commit
86d19d6cda
@ -1,6 +1,7 @@
|
||||
package app.myzel394.locationtest.services
|
||||
|
||||
import android.app.Service
|
||||
import android.content.ComponentName
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.content.ServiceConnection
|
||||
@ -11,8 +12,14 @@ import android.os.Handler
|
||||
import android.os.IBinder
|
||||
import android.os.Looper
|
||||
import android.util.Log
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.LaunchedEffect
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.mutableStateListOf
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.runtime.setValue
|
||||
import androidx.compose.ui.platform.LocalContext
|
||||
import androidx.core.app.NotificationCompat
|
||||
import androidx.core.content.ContextCompat
|
||||
import app.myzel394.locationtest.R
|
||||
@ -397,3 +404,27 @@ data class Settings(
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun bindToRecorderService(): Pair<ServiceConnection, RecorderService?> {
|
||||
val context = LocalContext.current
|
||||
var service by remember { mutableStateOf<RecorderService?>(null) }
|
||||
|
||||
val connection = remember {
|
||||
object : ServiceConnection {
|
||||
override fun onServiceConnected(name: ComponentName?, binder: IBinder?) {
|
||||
service = (binder as RecorderService.LocalBinder).getService()
|
||||
}
|
||||
|
||||
override fun onServiceDisconnected(name: ComponentName?) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
LaunchedEffect(Unit) {
|
||||
Intent(context, RecorderService::class.java).also { intent ->
|
||||
context.bindService(intent, connection, Context.BIND_AUTO_CREATE)
|
||||
}
|
||||
}
|
||||
|
||||
return connection to service
|
||||
}
|
||||
|
@ -22,6 +22,7 @@ import androidx.compose.runtime.*
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.navigation.NavController
|
||||
import app.myzel394.locationtest.services.RecorderService
|
||||
import app.myzel394.locationtest.services.bindToRecorderService
|
||||
import app.myzel394.locationtest.ui.components.AudioRecorder.molecules.RecordingStatus
|
||||
import app.myzel394.locationtest.ui.components.AudioRecorder.molecules.StartRecording
|
||||
import app.myzel394.locationtest.ui.enums.Screen
|
||||
@ -33,21 +34,8 @@ fun AudioRecorder(
|
||||
navController: NavController,
|
||||
) {
|
||||
val context = LocalContext.current
|
||||
|
||||
val saveFile = rememberFileSaverDialog("audio/aac")
|
||||
var service by remember { mutableStateOf<RecorderService?>(null) }
|
||||
val connection = remember {
|
||||
object : ServiceConnection {
|
||||
override fun onServiceConnected(name: ComponentName?, binder: IBinder?) {
|
||||
service = (binder as RecorderService.LocalBinder).getService().also { service ->
|
||||
}
|
||||
}
|
||||
|
||||
override fun onServiceDisconnected(name: ComponentName?) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
val (connection, service) = bindToRecorderService()
|
||||
val isRecording = service?.isRecording?.value ?: false
|
||||
|
||||
LaunchedEffect(Unit) {
|
||||
|
@ -2,8 +2,10 @@ package app.myzel394.locationtest.ui.screens
|
||||
|
||||
import androidx.compose.animation.AnimatedVisibility
|
||||
import androidx.compose.foundation.layout.Arrangement
|
||||
import androidx.compose.foundation.layout.Box
|
||||
import androidx.compose.foundation.layout.Column
|
||||
import androidx.compose.foundation.layout.PaddingValues
|
||||
import androidx.compose.foundation.layout.Row
|
||||
import androidx.compose.foundation.layout.fillMaxSize
|
||||
import androidx.compose.foundation.layout.fillMaxWidth
|
||||
import androidx.compose.foundation.layout.padding
|
||||
@ -38,6 +40,7 @@ import androidx.navigation.NavController
|
||||
import app.myzel394.locationtest.dataStore
|
||||
import app.myzel394.locationtest.db.AppSettings
|
||||
import app.myzel394.locationtest.db.AudioRecorderSettings
|
||||
import app.myzel394.locationtest.services.bindToRecorderService
|
||||
import app.myzel394.locationtest.ui.components.SettingsScreen.atoms.BitrateTile
|
||||
import app.myzel394.locationtest.ui.components.SettingsScreen.atoms.EncoderTile
|
||||
import app.myzel394.locationtest.ui.components.SettingsScreen.atoms.ForceExactMaxDurationTile
|
||||
@ -46,6 +49,8 @@ import app.myzel394.locationtest.ui.components.SettingsScreen.atoms.MaxDurationT
|
||||
import app.myzel394.locationtest.ui.components.SettingsScreen.atoms.OutputFormatTile
|
||||
import app.myzel394.locationtest.ui.components.SettingsScreen.atoms.SamplingRateTile
|
||||
import app.myzel394.locationtest.ui.components.atoms.GlobalSwitch
|
||||
import app.myzel394.locationtest.ui.components.atoms.MessageBox
|
||||
import app.myzel394.locationtest.ui.components.atoms.MessageType
|
||||
import app.myzel394.locationtest.ui.components.atoms.SettingsTile
|
||||
import app.myzel394.locationtest.ui.utils.formatDuration
|
||||
import com.maxkeppeker.sheets.core.models.base.rememberUseCaseState
|
||||
@ -60,6 +65,8 @@ import kotlinx.coroutines.launch
|
||||
fun SettingsScreen(
|
||||
navController: NavController
|
||||
) {
|
||||
val (connection, service) = bindToRecorderService()
|
||||
val isRecording = service?.isRecording?.value ?: false
|
||||
val scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior(
|
||||
rememberTopAppBarState()
|
||||
)
|
||||
@ -98,6 +105,18 @@ fun SettingsScreen(
|
||||
.collectAsState(initial = AppSettings.getDefaultInstance())
|
||||
.value
|
||||
|
||||
// Show alert
|
||||
if (isRecording)
|
||||
Box(
|
||||
modifier = Modifier
|
||||
.padding(16.dp)
|
||||
) {
|
||||
MessageBox(
|
||||
type = MessageType.WARNING,
|
||||
title = "You are recording",
|
||||
message = "Your changes will be applied the next time you start recording",
|
||||
)
|
||||
}
|
||||
GlobalSwitch(
|
||||
label = "Advanced Settings",
|
||||
checked = settings.showAdvancedSettings,
|
||||
|
@ -3,19 +3,31 @@ package app.myzel394.locationtest.ui.utils
|
||||
import kotlin.math.floor
|
||||
|
||||
|
||||
fun formatDuration(durationInMilliseconds: Long): String {
|
||||
fun formatDuration(
|
||||
durationInMilliseconds: Long,
|
||||
formatFull: Boolean = false,
|
||||
): String {
|
||||
val totalSeconds = durationInMilliseconds / 1000
|
||||
|
||||
val hours = floor(totalSeconds / 3600.0).toInt()
|
||||
val minutes = floor(totalSeconds / 60.0).toInt() % 60
|
||||
val seconds = totalSeconds - (minutes * 60)
|
||||
|
||||
if (formatFull) {
|
||||
return "" +
|
||||
hours.toString().padStart(2, '0') +
|
||||
":" + minutes.toString().padStart(2, '0') +
|
||||
":" + seconds.toString().padStart(2, '0') +
|
||||
"." + (durationInMilliseconds % 1000).toString()
|
||||
}
|
||||
|
||||
if (durationInMilliseconds < 1000) {
|
||||
return "00:00.$durationInMilliseconds"
|
||||
}
|
||||
|
||||
val totalSeconds = durationInMilliseconds / 1000
|
||||
|
||||
if (totalSeconds < 60) {
|
||||
return "00:${totalSeconds.toString().padStart(2, '0')}"
|
||||
}
|
||||
|
||||
val minutes = floor(totalSeconds / 60.0).toInt()
|
||||
val seconds = totalSeconds - (minutes * 60)
|
||||
|
||||
return "${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}"
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user