chore: change applicationId/package to solutions.tretter.mindmachine

This commit is contained in:
Tretzi
2026-04-10 16:14:31 -05:00
parent b291c378f6
commit 931077c7aa
45 changed files with 122 additions and 122 deletions

View File

@@ -4,11 +4,11 @@ plugins {
}
android {
namespace = "com.mindmachine.mvp"
namespace = "solutions.tretter.mindmachine"
compileSdk = 35
defaultConfig {
applicationId = "com.mindmachine.mvp"
applicationId = "solutions.tretter.mindmachine"
minSdk = 26
targetSdk = 35
versionCode = 5

View File

@@ -1,4 +1,4 @@
package com.mindmachine.mvp.session
package solutions.tretter.mindmachine.session
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf

View File

@@ -1,4 +1,4 @@
package com.mindmachine.mvp
package solutions.tretter.mindmachine
import android.app.Activity
import android.content.pm.ActivityInfo
@@ -9,8 +9,8 @@ import androidx.activity.compose.BackHandler
import androidx.activity.compose.setContent
import androidx.activity.viewModels
import androidx.compose.foundation.background
import com.mindmachine.mvp.session.DurationSliderCard
import com.mindmachine.mvp.session.SetupTimelineEditor
import solutions.tretter.mindmachine.session.DurationSliderCard
import solutions.tretter.mindmachine.session.SetupTimelineEditor
import androidx.compose.foundation.clickable
import androidx.compose.foundation.gestures.detectTapGestures
import androidx.compose.foundation.layout.Arrangement
@@ -98,24 +98,24 @@ import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
import androidx.navigation.navArgument
import com.google.android.gms.ads.MobileAds
import com.mindmachine.mvp.audio.BinauralAudioEngine
import com.mindmachine.mvp.audio.HeadsetMonitor
import com.mindmachine.mvp.ads.AdBanner
import com.mindmachine.mvp.ads.rememberInterstitialController
import com.mindmachine.mvp.data.SettingsRepository
import com.mindmachine.mvp.data.UserProgramRepository
import com.mindmachine.mvp.domain.RuntimeState
import com.mindmachine.mvp.session.FlashColor
import com.mindmachine.mvp.session.MainViewModel
import com.mindmachine.mvp.session.SplitFlashFrame
import solutions.tretter.mindmachine.audio.BinauralAudioEngine
import solutions.tretter.mindmachine.audio.HeadsetMonitor
import solutions.tretter.mindmachine.ads.AdBanner
import solutions.tretter.mindmachine.ads.rememberInterstitialController
import solutions.tretter.mindmachine.data.SettingsRepository
import solutions.tretter.mindmachine.data.UserProgramRepository
import solutions.tretter.mindmachine.domain.RuntimeState
import solutions.tretter.mindmachine.session.FlashColor
import solutions.tretter.mindmachine.session.MainViewModel
import solutions.tretter.mindmachine.session.SplitFlashFrame
import kotlinx.coroutines.launch
import com.mindmachine.mvp.session.SplitFlashSequencer
import com.mindmachine.mvp.session.flashIntervalMsToSeconds
import com.mindmachine.mvp.session.flashIntervalSecondsToMs
import com.mindmachine.mvp.session.formatDuration
import com.mindmachine.mvp.session.sessionProgressFraction
import com.mindmachine.mvp.session.shouldShowActiveControlsByDefault
import com.mindmachine.mvp.session.shouldUseImmersiveFullscreen
import solutions.tretter.mindmachine.session.SplitFlashSequencer
import solutions.tretter.mindmachine.session.flashIntervalMsToSeconds
import solutions.tretter.mindmachine.session.flashIntervalSecondsToMs
import solutions.tretter.mindmachine.session.formatDuration
import solutions.tretter.mindmachine.session.sessionProgressFraction
import solutions.tretter.mindmachine.session.shouldShowActiveControlsByDefault
import solutions.tretter.mindmachine.session.shouldUseImmersiveFullscreen
import kotlinx.coroutines.delay
import kotlin.math.roundToInt
import java.util.Locale
@@ -142,7 +142,7 @@ private val MindMachineColors = darkColorScheme(
class MainActivity : ComponentActivity() {
private val settingsRepo by lazy { SettingsRepository(applicationContext) }
private val billingManager by lazy {
com.mindmachine.mvp.billing.BillingManager(
solutions.tretter.mindmachine.billing.BillingManager(
applicationContext,
onNoAdsEntitlementChanged = { hasNoAds ->
lifecycleScope.launch { settingsRepo.updateNoAds(hasNoAds) }
@@ -173,7 +173,7 @@ class MainActivity : ComponentActivity() {
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun App(vm: MainViewModel = viewModel(), billingManager: com.mindmachine.mvp.billing.BillingManager) {
fun App(vm: MainViewModel = viewModel(), billingManager: solutions.tretter.mindmachine.billing.BillingManager) {
val nav = rememberNavController()
val ui by vm.ui.collectAsStateWithLifecycle()
val lifecycle = LocalLifecycleOwner.current.lifecycle
@@ -876,7 +876,7 @@ fun SettingsScreen(vm: MainViewModel, onRemoveAds: () -> Unit) {
}
@Composable
fun RemoveAdsScreen(billingManager: com.mindmachine.mvp.billing.BillingManager, vm: MainViewModel) {
fun RemoveAdsScreen(billingManager: solutions.tretter.mindmachine.billing.BillingManager, vm: MainViewModel) {
val ui by vm.ui.collectAsStateWithLifecycle()
val activity = LocalContext.current as? Activity
val details by billingManager.productDetails.collectAsStateWithLifecycle()
@@ -898,19 +898,19 @@ fun RemoveAdsScreen(billingManager: com.mindmachine.mvp.billing.BillingManager,
Button(
enabled = activity != null && !ui.settings.noAds,
onClick = {
activity?.let { billingManager.launchPurchase(it, com.mindmachine.mvp.billing.BillingProducts.SUB_REMOVE_ADS_MONTHLY) }
activity?.let { billingManager.launchPurchase(it, solutions.tretter.mindmachine.billing.BillingProducts.SUB_REMOVE_ADS_MONTHLY) }
}
) {
Text(details[com.mindmachine.mvp.billing.BillingProducts.SUB_REMOVE_ADS_MONTHLY]?.name ?: "Subscribe: $1/month")
Text(details[solutions.tretter.mindmachine.billing.BillingProducts.SUB_REMOVE_ADS_MONTHLY]?.name ?: "Subscribe: $1/month")
}
Button(
enabled = activity != null && !ui.settings.noAds,
onClick = {
activity?.let { billingManager.launchPurchase(it, com.mindmachine.mvp.billing.BillingProducts.INAPP_REMOVE_ADS_FOREVER) }
activity?.let { billingManager.launchPurchase(it, solutions.tretter.mindmachine.billing.BillingProducts.INAPP_REMOVE_ADS_FOREVER) }
}
) {
Text(details[com.mindmachine.mvp.billing.BillingProducts.INAPP_REMOVE_ADS_FOREVER]?.name ?: "Buy: $20 one-time")
Text(details[solutions.tretter.mindmachine.billing.BillingProducts.INAPP_REMOVE_ADS_FOREVER]?.name ?: "Buy: $20 one-time")
}
TextButton(onClick = { billingManager.refresh() }) { Text("Restore / Refresh purchases") }

View File

@@ -1,4 +1,4 @@
package com.mindmachine.mvp.ads
package solutions.tretter.mindmachine.ads
object AdUnits {
// Google test ad unit ids. Replace with your real unit ids before release.

View File

@@ -1,4 +1,4 @@
package com.mindmachine.mvp.ads
package solutions.tretter.mindmachine.ads
import android.app.Activity
import android.view.ViewGroup

View File

@@ -1,4 +1,4 @@
package com.mindmachine.mvp.audio
package solutions.tretter.mindmachine.audio
import android.media.AudioAttributes
import android.media.AudioFormat

View File

@@ -1,4 +1,4 @@
package com.mindmachine.mvp.audio
package solutions.tretter.mindmachine.audio
import android.content.Context
import android.media.AudioDeviceInfo

View File

@@ -1,4 +1,4 @@
package com.mindmachine.mvp.billing
package solutions.tretter.mindmachine.billing
import android.app.Activity
import android.content.Context

View File

@@ -1,4 +1,4 @@
package com.mindmachine.mvp.billing
package solutions.tretter.mindmachine.billing
object BillingProducts {
// Configure these in Google Play Console

View File

@@ -1,4 +1,4 @@
package com.mindmachine.mvp.data
package solutions.tretter.mindmachine.data
import android.content.Context
import androidx.datastore.preferences.core.booleanPreferencesKey
@@ -6,7 +6,7 @@ import androidx.datastore.preferences.core.edit
import androidx.datastore.preferences.core.intPreferencesKey
import androidx.datastore.preferences.core.stringPreferencesKey
import androidx.datastore.preferences.preferencesDataStore
import com.mindmachine.mvp.domain.AppSettings
import solutions.tretter.mindmachine.domain.AppSettings
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map

View File

@@ -1,15 +1,15 @@
package com.mindmachine.mvp.data
package solutions.tretter.mindmachine.data
import android.content.Context
import androidx.datastore.preferences.core.edit
import androidx.datastore.preferences.core.stringPreferencesKey
import androidx.datastore.preferences.preferencesDataStore
import com.mindmachine.mvp.session.TimelineCurve
import com.mindmachine.mvp.session.TimelineEditorState
import com.mindmachine.mvp.session.TimelinePoint
import com.mindmachine.mvp.session.TIMELINE_DEFAULT_GRANULARITY_SEC
import com.mindmachine.mvp.session.TimelineSelection
import com.mindmachine.mvp.session.TimelineViewport
import solutions.tretter.mindmachine.session.TimelineCurve
import solutions.tretter.mindmachine.session.TimelineEditorState
import solutions.tretter.mindmachine.session.TimelinePoint
import solutions.tretter.mindmachine.session.TIMELINE_DEFAULT_GRANULARITY_SEC
import solutions.tretter.mindmachine.session.TimelineSelection
import solutions.tretter.mindmachine.session.TimelineViewport
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map
import org.json.JSONArray

View File

@@ -1,4 +1,4 @@
package com.mindmachine.mvp.domain
package solutions.tretter.mindmachine.domain
enum class VisualPattern { FLASH, PULSE }
enum class SessionMode { AUDIO_VISUAL, AUDIO_ONLY, VISUAL_ONLY }

View File

@@ -1,6 +1,6 @@
package com.mindmachine.mvp.session
package solutions.tretter.mindmachine.session
import com.mindmachine.mvp.domain.RuntimeState
import solutions.tretter.mindmachine.domain.RuntimeState
fun shouldShowActiveControlsByDefault(runtimeState: RuntimeState): Boolean {
return runtimeState != RuntimeState.RUNNING && runtimeState != RuntimeState.COUNTDOWN

View File

@@ -1,4 +1,4 @@
package com.mindmachine.mvp.session
package solutions.tretter.mindmachine.session
import java.util.Locale

View File

@@ -1,4 +1,4 @@
package com.mindmachine.mvp.session
package solutions.tretter.mindmachine.session
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement

View File

@@ -1,4 +1,4 @@
package com.mindmachine.mvp.session
package solutions.tretter.mindmachine.session
import kotlin.math.roundToInt

View File

@@ -1,6 +1,6 @@
package com.mindmachine.mvp.session
package solutions.tretter.mindmachine.session
import com.mindmachine.mvp.domain.RuntimeState
import solutions.tretter.mindmachine.domain.RuntimeState
fun shouldUseImmersiveFullscreen(isVisualMode: Boolean, runtimeState: RuntimeState): Boolean {
return isVisualMode && (runtimeState == RuntimeState.COUNTDOWN || runtimeState == RuntimeState.RUNNING)

View File

@@ -1,20 +1,20 @@
package com.mindmachine.mvp.session
package solutions.tretter.mindmachine.session
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.viewModelScope
import com.mindmachine.mvp.audio.BinauralAudioEngine
import com.mindmachine.mvp.audio.HeadsetMonitor
import com.mindmachine.mvp.data.SettingsRepository
import com.mindmachine.mvp.data.UserProgramEntity
import com.mindmachine.mvp.data.UserProgramRepository
import com.mindmachine.mvp.domain.AppSettings
import com.mindmachine.mvp.domain.Presets
import com.mindmachine.mvp.domain.RuntimeState
import com.mindmachine.mvp.domain.SessionConfig
import com.mindmachine.mvp.domain.SessionMode
import com.mindmachine.mvp.domain.SessionPreset
import com.mindmachine.mvp.domain.toConfig
import solutions.tretter.mindmachine.audio.BinauralAudioEngine
import solutions.tretter.mindmachine.audio.HeadsetMonitor
import solutions.tretter.mindmachine.data.SettingsRepository
import solutions.tretter.mindmachine.data.UserProgramEntity
import solutions.tretter.mindmachine.data.UserProgramRepository
import solutions.tretter.mindmachine.domain.AppSettings
import solutions.tretter.mindmachine.domain.Presets
import solutions.tretter.mindmachine.domain.RuntimeState
import solutions.tretter.mindmachine.domain.SessionConfig
import solutions.tretter.mindmachine.domain.SessionMode
import solutions.tretter.mindmachine.domain.SessionPreset
import solutions.tretter.mindmachine.domain.toConfig
import kotlinx.coroutines.Job
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.MutableStateFlow
@@ -80,7 +80,7 @@ class MainViewModel(
private val userProgramRepository: UserProgramRepository,
private val headsetMonitor: HeadsetMonitor,
private val audioEngine: BinauralAudioEngine,
private val billingManager: com.mindmachine.mvp.billing.BillingManager,
private val billingManager: solutions.tretter.mindmachine.billing.BillingManager,
) : ViewModel() {
private val _ui = MutableStateFlow(UiState())
val ui: StateFlow<UiState> = _ui.asStateFlow()
@@ -488,7 +488,7 @@ class MainViewModel(
private val userProgramRepository: UserProgramRepository,
private val headsetMonitor: HeadsetMonitor,
private val audioEngine: BinauralAudioEngine,
private val billingManager: com.mindmachine.mvp.billing.BillingManager,
private val billingManager: solutions.tretter.mindmachine.billing.BillingManager,
) : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T =
MainViewModel(settingsRepository, userProgramRepository, headsetMonitor, audioEngine, billingManager) as T

View File

@@ -1,4 +1,4 @@
package com.mindmachine.mvp.session
package solutions.tretter.mindmachine.session
import kotlin.math.ln
import kotlin.math.pow

View File

@@ -1,4 +1,4 @@
package com.mindmachine.mvp.session
package solutions.tretter.mindmachine.session
object ParameterRanges {
const val FLASH_INTERVAL_MS_MIN = 50f

View File

@@ -1,4 +1,4 @@
package com.mindmachine.mvp.session
package solutions.tretter.mindmachine.session
/**
* Concrete runtime parameters evaluated from the timeline curves at a specific time.

View File

@@ -1,6 +1,6 @@
package com.mindmachine.mvp.session
package solutions.tretter.mindmachine.session
import com.mindmachine.mvp.domain.SessionConfig
import solutions.tretter.mindmachine.domain.SessionConfig
object SessionValidator {
fun validate(config: SessionConfig): String? {
if (config.durationSec !in 60..(8 * 60 * 60)) return "Duration must be 1 minute to 8 hours."

View File

@@ -1,4 +1,4 @@
package com.mindmachine.mvp.session
package solutions.tretter.mindmachine.session
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column

View File

@@ -1,4 +1,4 @@
package com.mindmachine.mvp.session
package solutions.tretter.mindmachine.session
import android.view.HapticFeedbackConstants
import androidx.activity.compose.BackHandler
@@ -45,7 +45,7 @@ import androidx.compose.ui.unit.dp
import androidx.core.view.WindowCompat
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.WindowInsetsControllerCompat
import com.mindmachine.mvp.session.TimelineEditorState.ActiveCurve
import solutions.tretter.mindmachine.session.TimelineEditorState.ActiveCurve
import kotlin.math.abs
import kotlin.math.max
import kotlin.math.min

View File

@@ -1,4 +1,4 @@
package com.mindmachine.mvp.session
package solutions.tretter.mindmachine.session
import kotlin.math.max
import kotlin.math.min

View File

@@ -1,8 +1,8 @@
package com.mindmachine.mvp.session
package solutions.tretter.mindmachine.session
import com.mindmachine.mvp.domain.SessionConfig
import com.mindmachine.mvp.domain.SessionMode
import com.mindmachine.mvp.domain.SessionPreset
import solutions.tretter.mindmachine.domain.SessionConfig
import solutions.tretter.mindmachine.domain.SessionMode
import solutions.tretter.mindmachine.domain.SessionPreset
import kotlin.math.roundToInt
/**

View File

@@ -1,4 +1,4 @@
package com.mindmachine.mvp.session
package solutions.tretter.mindmachine.session
import androidx.compose.foundation.layout.*
import androidx.compose.material3.MaterialTheme

View File

@@ -1,4 +1,4 @@
package com.mindmachine.mvp.session
package solutions.tretter.mindmachine.session
import kotlin.math.ln
import kotlin.math.pow

View File

@@ -1,7 +1,7 @@
package com.mindmachine.mvp.session
package solutions.tretter.mindmachine.session
import com.mindmachine.mvp.domain.SessionPreset
import com.mindmachine.mvp.domain.VisualPattern
import solutions.tretter.mindmachine.domain.SessionPreset
import solutions.tretter.mindmachine.domain.VisualPattern
object TimelineProgramFactory {
fun fromPreset(preset: SessionPreset): TimelineEditorState {

View File

@@ -1,4 +1,4 @@
package com.mindmachine.mvp.session
package solutions.tretter.mindmachine.session
object TimelineRuntimeEvaluator {
fun evaluate(state: TimelineEditorState, tSec: Float): RuntimeParams {

View File

@@ -1,4 +1,4 @@
package com.mindmachine.mvp.session
package solutions.tretter.mindmachine.session
enum class FlashColor {
RED,

View File

@@ -1,10 +1,10 @@
package com.mindmachine.mvp
package solutions.tretter.mindmachine
import com.mindmachine.mvp.domain.RuntimeState
import com.mindmachine.mvp.session.sessionProgressFraction
import com.mindmachine.mvp.session.shouldRevealSystemBarsOnTap
import com.mindmachine.mvp.session.shouldShowActiveControlsByDefault
import com.mindmachine.mvp.session.shouldUseImmersiveFullscreen
import solutions.tretter.mindmachine.domain.RuntimeState
import solutions.tretter.mindmachine.session.sessionProgressFraction
import solutions.tretter.mindmachine.session.shouldRevealSystemBarsOnTap
import solutions.tretter.mindmachine.session.shouldShowActiveControlsByDefault
import solutions.tretter.mindmachine.session.shouldUseImmersiveFullscreen
import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue
import org.junit.Test

View File

@@ -1,4 +1,4 @@
package com.mindmachine.mvp.session
package solutions.tretter.mindmachine.session
import androidx.compose.ui.geometry.Offset
import org.junit.Assert.*

View File

@@ -1,6 +1,6 @@
package com.mindmachine.mvp
package solutions.tretter.mindmachine
import com.mindmachine.mvp.session.TimelineEditorState
import solutions.tretter.mindmachine.session.TimelineEditorState
import org.junit.Assert.assertEquals
import org.junit.Test

View File

@@ -1,7 +1,7 @@
package com.mindmachine.mvp
package solutions.tretter.mindmachine
import com.mindmachine.mvp.session.flashIntervalMsToSeconds
import com.mindmachine.mvp.session.flashIntervalSecondsToMs
import solutions.tretter.mindmachine.session.flashIntervalMsToSeconds
import solutions.tretter.mindmachine.session.flashIntervalSecondsToMs
import org.junit.Assert.assertEquals
import org.junit.Test

View File

@@ -1,4 +1,4 @@
package com.mindmachine.mvp.session
package solutions.tretter.mindmachine.session
import org.junit.Assert.*
import org.junit.Test

View File

@@ -1,7 +1,7 @@
package com.mindmachine.mvp
package solutions.tretter.mindmachine
import com.mindmachine.mvp.domain.Presets
import com.mindmachine.mvp.domain.VisualPattern
import solutions.tretter.mindmachine.domain.Presets
import solutions.tretter.mindmachine.domain.VisualPattern
import org.junit.Assert.assertEquals
import org.junit.Test

View File

@@ -1,9 +1,9 @@
package com.mindmachine.mvp
package solutions.tretter.mindmachine
import com.mindmachine.mvp.domain.SessionConfig
import com.mindmachine.mvp.domain.SessionMode
import com.mindmachine.mvp.domain.VisualPattern
import com.mindmachine.mvp.session.SessionValidator
import solutions.tretter.mindmachine.domain.SessionConfig
import solutions.tretter.mindmachine.domain.SessionMode
import solutions.tretter.mindmachine.domain.VisualPattern
import solutions.tretter.mindmachine.session.SessionValidator
import org.junit.Assert.assertEquals
import org.junit.Assert.assertNull
import org.junit.Test

View File

@@ -1,4 +1,4 @@
package com.mindmachine.mvp
package solutions.tretter.mindmachine
import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse

View File

@@ -1,4 +1,4 @@
package com.mindmachine.mvp.session
package solutions.tretter.mindmachine.session
import androidx.compose.ui.geometry.Offset
import org.junit.Assert.*

View File

@@ -1,7 +1,7 @@
package com.mindmachine.mvp
package solutions.tretter.mindmachine
import androidx.compose.ui.graphics.toArgb
import com.mindmachine.mvp.session.TimelineCurveColors
import solutions.tretter.mindmachine.session.TimelineCurveColors
import org.junit.Assert.assertEquals
import org.junit.Test

View File

@@ -1,7 +1,7 @@
package com.mindmachine.mvp
package solutions.tretter.mindmachine
import com.mindmachine.mvp.session.TimelineEditorState
import com.mindmachine.mvp.session.TimelineParameters
import solutions.tretter.mindmachine.session.TimelineEditorState
import solutions.tretter.mindmachine.session.TimelineParameters
import org.junit.Assert.assertEquals
import org.junit.Assert.assertTrue
import org.junit.Test

View File

@@ -1,4 +1,4 @@
package com.mindmachine.mvp.session
package solutions.tretter.mindmachine.session
import org.junit.Assert.assertEquals
import org.junit.Assert.assertTrue

View File

@@ -1,8 +1,8 @@
package com.mindmachine.mvp
package solutions.tretter.mindmachine
import com.mindmachine.mvp.session.FlashColor
import com.mindmachine.mvp.session.SplitFlashSequencer
import com.mindmachine.mvp.session.computeSplitFlashFrame
import solutions.tretter.mindmachine.session.FlashColor
import solutions.tretter.mindmachine.session.SplitFlashSequencer
import solutions.tretter.mindmachine.session.computeSplitFlashFrame
import org.junit.Assert.assertEquals
import org.junit.Test

View File

@@ -1,4 +1,4 @@
package com.mindmachine.mvp.session
package solutions.tretter.mindmachine.session
import org.junit.Assert.assertEquals
import org.junit.Test