sonodrill

Sonodrill, app iOS/Android d’entraînement musical (repères, boucles, vitesse), Kotlin Multiplatform + Compose
git clone https://git.schurger.org/sonodrill.git
Log | Files | Refs

commit c11498b838af7782187c1dbb8cf6fa02b0467c2c
parent 57eec87cd4e91b34ced9c0dcf39061ddcba8e47a
Author: Jean Schurger <jean@schurger.org>
Date:   Fri, 16 Oct 2026 15:56:09 -0400

Launch argument -open-file <id> opens a file in the player (App Store screenshots)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0141Zm4UQq8PATQAG98MdNCc

Diffstat:
McomposeApp/src/commonMain/kotlin/ubi2/sonodrill/ui/app.kt | 20+++++++++++++++-----
McomposeApp/src/iosMain/kotlin/ubi2/sonodrill/main_ios.kt | 5+++++
2 files changed, 20 insertions(+), 5 deletions(-)

diff --git a/composeApp/src/commonMain/kotlin/ubi2/sonodrill/ui/app.kt b/composeApp/src/commonMain/kotlin/ubi2/sonodrill/ui/app.kt @@ -23,7 +23,12 @@ private val dark_scheme = darkColorScheme( enum class Screen { LIBRARY, PLAYER } @Composable -fun SonodrillApp(player: AudioPlayer, repo: AudioRepository, on_import: (on_done: () -> Unit) -> Unit, is_dark: Boolean = isSystemInDarkTheme()) { +fun SonodrillApp( + player: AudioPlayer, repo: AudioRepository, on_import: (on_done: () -> Unit) -> Unit, + is_dark: Boolean = isSystemInDarkTheme(), + // Opens this file in the player at launch (used to take App Store screenshots) + initial_file_id: String? = null, +) { val scheme = if (is_dark) dark_scheme else light_scheme var screen by remember { mutableStateOf(Screen.LIBRARY) } var player_vm by remember { mutableStateOf<PlayerViewModel?>(null) } @@ -31,15 +36,20 @@ fun SonodrillApp(player: AudioPlayer, repo: AudioRepository, on_import: (on_done fun refresh_files() { files = repo.sync_library() } - LaunchedEffect(Unit) { refresh_files() } + fun open(file: AudioFileInfo) { + val vm = PlayerViewModel(player, repo); vm.load_file(file); player_vm = vm; screen = Screen.PLAYER + } + + LaunchedEffect(Unit) { + refresh_files() + files.firstOrNull { it.id == initial_file_id && !it.missing }?.let { open(it) } + } MaterialTheme(colorScheme = scheme) { when (screen) { Screen.LIBRARY -> LibraryScreen( files = files, - on_file_click = { file -> - val vm = PlayerViewModel(player, repo); vm.load_file(file); player_vm = vm; screen = Screen.PLAYER - }, + on_file_click = { file -> open(file) }, on_import = { on_import { refresh_files() } }, on_delete = { file -> repo.delete_file(file); refresh_files() }, ) diff --git a/composeApp/src/iosMain/kotlin/ubi2/sonodrill/main_ios.kt b/composeApp/src/iosMain/kotlin/ubi2/sonodrill/main_ios.kt @@ -30,11 +30,16 @@ fun main_view_controller(): UIViewController { val repo = AudioRepository(db) val player = IosAudioPlayer() + // Launch argument "-open-file <id>": open that file in the player (App Store screenshots) + val args = NSProcessInfo.processInfo.arguments.map { it.toString() } + val initial_file_id = args.indexOf("-open-file").takeIf { it >= 0 }?.let { args.getOrNull(it + 1) } + return ComposeUIViewController { SonodrillApp( player = player, repo = repo, on_import = { on_done -> show_audio_picker(repo, on_done) }, + initial_file_id = initial_file_id, ) } }