feat(mindmachine): implement Android MVP app scaffold, session flows, safety gating, and tests

This commit is contained in:
Tretzi
2026-03-10 22:50:50 -05:00
commit 83a0586d26
22 changed files with 2671 additions and 0 deletions

View File

@@ -0,0 +1,71 @@
package com.mindmachine.mvp.domain
enum class VisualPattern { FLASH, PULSE }
enum class SessionMode { AUDIO_VISUAL, AUDIO_ONLY, VISUAL_ONLY }
enum class RuntimeState { IDLE, COUNTDOWN, RUNNING, PAUSED, INTERRUPTED, COMPLETED, STOPPED, ERROR }
enum class CountdownPreference(val seconds: Int) { OFF(0), FIVE(5), TEN(10) }
data class SessionPreset(
val id: String,
val name: String,
val description: String,
val defaultDurationSec: Int,
val visualPatternType: VisualPattern,
val blinkFrequencyHz: Float,
val intensityPercent: Int,
val carrierFrequencyHz: Float,
val binauralDifferenceHz: Float,
val cautionNote: String,
val sortOrder: Int,
)
data class SessionConfig(
val presetId: String,
val durationSec: Int,
val mode: SessionMode,
val visualPatternType: VisualPattern,
val blinkFrequencyHz: Float,
val intensityPercent: Int,
val carrierFrequencyHz: Float,
val binauralDifferenceHz: Float,
)
data class AppSettings(
val safetyAcknowledged: Boolean = false,
val safetyAcknowledgedVersion: Int = 0,
val countdownPreference: CountdownPreference = CountdownPreference.FIVE,
val defaultModePreference: SessionMode = SessionMode.AUDIO_VISUAL,
val showHolderGuidanceBeforeSession: Boolean = false,
val lastPresetId: String? = null,
)
object Presets {
val builtIn = listOf(
SessionPreset(
"relax", "Relax", "Gentle pulse, slower beat", 10 * 60,
VisualPattern.PULSE, 6f, 60, 200f, 6f,
"Stop if discomfort occurs.", 1
),
SessionPreset(
"focus", "Focus", "Steady flash, conservative alert beat", 15 * 60,
VisualPattern.FLASH, 10f, 65, 220f, 10f,
"Use in a safe seated place only.", 2
),
SessionPreset(
"sleep", "Sleep Prep", "Slow pulse, low intensity", 20 * 60,
VisualPattern.PULSE, 3f, 45, 180f, 3f,
"Do not use while doing other activities.", 3
)
)
}
fun SessionPreset.toConfig(defaultMode: SessionMode = SessionMode.AUDIO_VISUAL) = SessionConfig(
presetId = id,
durationSec = defaultDurationSec,
mode = defaultMode,
visualPatternType = visualPatternType,
blinkFrequencyHz = blinkFrequencyHz,
intensityPercent = intensityPercent,
carrierFrequencyHz = carrierFrequencyHz,
binauralDifferenceHz = binauralDifferenceHz,
)