Auto commit Sat Mar 21 10:01:01 PM CDT 2026
This commit is contained in:
@@ -44,6 +44,7 @@ import androidx.compose.material3.SingleChoiceSegmentedButtonRow
|
||||
import androidx.compose.material3.Slider
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.material3.TextButton
|
||||
import androidx.compose.material3.TextField
|
||||
import androidx.compose.material3.TopAppBar
|
||||
import androidx.compose.material3.darkColorScheme
|
||||
import androidx.compose.runtime.Composable
|
||||
@@ -77,6 +78,7 @@ import androidx.navigation.compose.rememberNavController
|
||||
import com.mindmachine.mvp.audio.BinauralAudioEngine
|
||||
import com.mindmachine.mvp.audio.HeadsetMonitor
|
||||
import com.mindmachine.mvp.data.SettingsRepository
|
||||
import com.mindmachine.mvp.data.UserProgramRepository
|
||||
import com.mindmachine.mvp.domain.CountdownPreference
|
||||
import com.mindmachine.mvp.domain.RuntimeState
|
||||
import com.mindmachine.mvp.domain.SessionMode
|
||||
@@ -109,7 +111,12 @@ private val MindMachineColors = darkColorScheme(
|
||||
|
||||
class MainActivity : ComponentActivity() {
|
||||
private val vm: MainViewModel by viewModels {
|
||||
MainViewModel.Factory(SettingsRepository(applicationContext), HeadsetMonitor(applicationContext), BinauralAudioEngine())
|
||||
MainViewModel.Factory(
|
||||
SettingsRepository(applicationContext),
|
||||
UserProgramRepository(applicationContext),
|
||||
HeadsetMonitor(applicationContext),
|
||||
BinauralAudioEngine(),
|
||||
)
|
||||
}
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
@@ -158,6 +165,10 @@ fun App(vm: MainViewModel = viewModel()) {
|
||||
composable("home") {
|
||||
Column(Modifier.fillMaxSize()) {
|
||||
TopAppBar(title = { Text("MindMachine") }, actions = {
|
||||
TextButton(onClick = {
|
||||
vm.createNewProgramDraft()
|
||||
nav.navigate("setup")
|
||||
}) { Text("Add") }
|
||||
TextButton(onClick = { nav.navigate("settings") }) { Text("Settings") }
|
||||
})
|
||||
LazyColumn(Modifier.padding(12.dp), verticalArrangement = Arrangement.spacedBy(8.dp)) {
|
||||
@@ -175,10 +186,19 @@ fun App(vm: MainViewModel = viewModel()) {
|
||||
nav.navigate("setup")
|
||||
}.padding(4.dp)
|
||||
) {
|
||||
Column(Modifier.padding(12.dp)) {
|
||||
Text(p.name, style = MaterialTheme.typography.titleMedium)
|
||||
Text(p.description)
|
||||
Text("${p.defaultDurationSec / 60} min • ${p.visualPatternType} • binaural ${p.binauralDifferenceHz}")
|
||||
Row(
|
||||
modifier = Modifier.fillMaxWidth().padding(12.dp),
|
||||
horizontalArrangement = Arrangement.SpaceBetween,
|
||||
verticalAlignment = Alignment.CenterVertically,
|
||||
) {
|
||||
Column(Modifier.weight(1f)) {
|
||||
Text(p.name, style = MaterialTheme.typography.titleMedium)
|
||||
Text(p.description)
|
||||
Text("${p.defaultDurationSec / 60} min • ${p.visualPatternType} • binaural ${p.binauralDifferenceHz}")
|
||||
}
|
||||
if (p.isUserProgram) {
|
||||
TextButton(onClick = { vm.deleteProgram(p.id) }) { Text("Delete") }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -270,6 +290,8 @@ fun SetupScreen(
|
||||
.safeDrawingPadding()
|
||||
.padding(horizontal = 16.dp, vertical = 12.dp)
|
||||
|
||||
var programName by remember(ui.selectedPreset.id) { mutableStateOf(ui.selectedPreset.name) }
|
||||
|
||||
Column(
|
||||
modifier = containerModifier,
|
||||
verticalArrangement = Arrangement.spacedBy(14.dp),
|
||||
@@ -280,6 +302,13 @@ fun SetupScreen(
|
||||
color = MaterialTheme.colorScheme.onBackground,
|
||||
)
|
||||
|
||||
TextField(
|
||||
value = programName,
|
||||
onValueChange = { programName = it },
|
||||
label = { Text("Program name") },
|
||||
modifier = Modifier.fillMaxWidth(),
|
||||
)
|
||||
|
||||
DurationSliderCard(
|
||||
durationSec = ui.timeline.durationSec,
|
||||
onDurationSecChanged = { vm.setDurationSec(it) },
|
||||
@@ -292,8 +321,13 @@ fun SetupScreen(
|
||||
)
|
||||
|
||||
TextButton(onClick = onHolder) { Text("Holder Guidance") }
|
||||
if (ui.error != null) Text(ui.error!!, color = MaterialTheme.colorScheme.error)
|
||||
Button(onClick = onStart, modifier = Modifier.fillMaxWidth().height(52.dp)) { Text("Start") }
|
||||
Row(horizontalArrangement = Arrangement.spacedBy(8.dp), modifier = Modifier.fillMaxWidth()) {
|
||||
OutlinedButton(onClick = { vm.saveCurrentProgram(programName) }, modifier = Modifier.weight(1f).height(52.dp)) {
|
||||
Text("Save")
|
||||
}
|
||||
Button(onClick = onStart, modifier = Modifier.weight(1f).height(52.dp)) { Text("Start") }
|
||||
}
|
||||
if (ui.error != null) Text(ui.error!!, color = if (ui.error!!.startsWith("Saved")) Color(0xFF72E39A) else MaterialTheme.colorScheme.error)
|
||||
Spacer(Modifier.height(8.dp))
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user