Auto commit Sat Mar 21 10:01:01 PM CDT 2026

This commit is contained in:
Tretzi
2026-03-21 22:01:01 -05:00
parent 93607c0d6a
commit 5c48387dc2
6 changed files with 495 additions and 153 deletions

View File

@@ -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))
}
}