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 636d1dbfcf4c4016720b27e5a17e055a98648f1a
parent 2f76dfe373c5ff81e9ed0fcab5f818dab46599bf
Author: Jean Schurger <jean@schurger.org>
Date:   Wed,  1 Apr 2026 08:55:18 -0400

Add Ko-fi support link to library screen

Heart icon in the top bar opens ko-fi.com/jeanschurger.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

Diffstat:
McomposeApp/src/androidMain/kotlin/ubi2/sonodrill/model/android_platform.kt | 3+++
McomposeApp/src/commonMain/kotlin/ubi2/sonodrill/model/platform.kt | 1+
McomposeApp/src/commonMain/kotlin/ubi2/sonodrill/ui/library/library_screen.kt | 12+++++++++++-
McomposeApp/src/iosMain/kotlin/ubi2/sonodrill/model/ios_platform.kt | 4++++
4 files changed, 19 insertions(+), 1 deletion(-)

diff --git a/composeApp/src/androidMain/kotlin/ubi2/sonodrill/model/android_platform.kt b/composeApp/src/androidMain/kotlin/ubi2/sonodrill/model/android_platform.kt @@ -3,3 +3,6 @@ package ubi2.sonodrill.model actual fun current_time_ms(): Long = System.currentTimeMillis() actual fun generate_uuid(): String = java.util.UUID.randomUUID().toString() actual fun file_exists(path: String): Boolean = java.io.File(path).exists() +actual fun open_url(url: String) { + // No-op: needs Activity context, will implement if needed +} diff --git a/composeApp/src/commonMain/kotlin/ubi2/sonodrill/model/platform.kt b/composeApp/src/commonMain/kotlin/ubi2/sonodrill/model/platform.kt @@ -3,3 +3,4 @@ package ubi2.sonodrill.model expect fun current_time_ms(): Long expect fun generate_uuid(): String expect fun file_exists(path: String): Boolean +expect fun open_url(url: String) diff --git a/composeApp/src/commonMain/kotlin/ubi2/sonodrill/ui/library/library_screen.kt b/composeApp/src/commonMain/kotlin/ubi2/sonodrill/ui/library/library_screen.kt @@ -16,6 +16,7 @@ import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import ubi2.sonodrill.model.AudioFileInfo +import ubi2.sonodrill.model.open_url import ubi2.sonodrill.ui.player.format_time @OptIn(ExperimentalMaterial3Api::class) @@ -30,7 +31,16 @@ fun LibraryScreen( val filtered = if (search.isBlank()) files else files.filter { it.title.contains(search, ignoreCase = true) } Scaffold( - topBar = { TopAppBar(title = { Text("Sonodrill") }) }, + topBar = { + TopAppBar( + title = { Text("Sonodrill") }, + actions = { + IconButton(onClick = { open_url("https://ko-fi.com/jeanschurger") }) { + Icon(Icons.Default.Favorite, "Support on Ko-fi", tint = MaterialTheme.colorScheme.error) + } + }, + ) + }, floatingActionButton = { FloatingActionButton(onClick = on_import) { Icon(Icons.Default.Add, "Import audio") } }, ) { padding -> Column(Modifier.fillMaxSize().padding(padding)) { diff --git a/composeApp/src/iosMain/kotlin/ubi2/sonodrill/model/ios_platform.kt b/composeApp/src/iosMain/kotlin/ubi2/sonodrill/model/ios_platform.kt @@ -7,3 +7,7 @@ import platform.Foundation.timeIntervalSince1970 actual fun current_time_ms(): Long = (NSDate().timeIntervalSince1970 * 1000).toLong() actual fun generate_uuid(): String = NSUUID().UUIDString() actual fun file_exists(path: String): Boolean = platform.Foundation.NSFileManager.defaultManager.fileExistsAtPath(path) +actual fun open_url(url: String) { + val nsurl = platform.Foundation.NSURL.URLWithString(url) ?: return + platform.UIKit.UIApplication.sharedApplication.openURL(nsurl, options = emptyMap<Any?, Any>(), completionHandler = null) +}