feat(mindmachine): implement Android MVP app scaffold, session flows, safety gating, and tests
This commit is contained in:
71
app/src/main/java/com/mindmachine/mvp/domain/Models.kt
Normal file
71
app/src/main/java/com/mindmachine/mvp/domain/Models.kt
Normal 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,
|
||||
)
|
||||
Reference in New Issue
Block a user