From 4015fb145d0cf2a32ec2ccfe738946c8bfaf4aa8 Mon Sep 17 00:00:00 2001 From: Bryan Van Deusen Date: Fri, 29 May 2026 14:38:52 -0400 Subject: [PATCH] refactor(android): add shared formatDuration + ms/sec conversion helpers --- .../fabledsword/minstrel/shared/Formatting.kt | 23 ++++++++++++++++ .../minstrel/shared/FormattingTest.kt | 27 +++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 android/app/src/main/java/com/fabledsword/minstrel/shared/Formatting.kt create mode 100644 android/app/src/test/java/com/fabledsword/minstrel/shared/FormattingTest.kt diff --git a/android/app/src/main/java/com/fabledsword/minstrel/shared/Formatting.kt b/android/app/src/main/java/com/fabledsword/minstrel/shared/Formatting.kt new file mode 100644 index 00000000..effba8d9 --- /dev/null +++ b/android/app/src/main/java/com/fabledsword/minstrel/shared/Formatting.kt @@ -0,0 +1,23 @@ +package com.fabledsword.minstrel.shared + +const val MILLIS_PER_SECOND = 1000 + +private const val SECONDS_PER_MINUTE = 60 + +/** + * Formats [seconds] as m:ss. Returns [zero] when [seconds] <= 0 — pass + * "--:--" for unknown track durations, "0:00" (default) for playback + * position/duration. The single mm:ss formatter for the client. + */ +fun formatDuration(seconds: Int, zero: String = "0:00"): String = + if (seconds <= 0) { + zero + } else { + "%d:%02d".format(seconds / SECONDS_PER_MINUTE, seconds % SECONDS_PER_MINUTE) + } + +fun Int.secondsToMillis(): Int = this * MILLIS_PER_SECOND + +fun Int.millisToSeconds(): Int = this / MILLIS_PER_SECOND + +fun Long.millisToSeconds(): Int = (this / MILLIS_PER_SECOND).toInt() diff --git a/android/app/src/test/java/com/fabledsword/minstrel/shared/FormattingTest.kt b/android/app/src/test/java/com/fabledsword/minstrel/shared/FormattingTest.kt new file mode 100644 index 00000000..9713947e --- /dev/null +++ b/android/app/src/test/java/com/fabledsword/minstrel/shared/FormattingTest.kt @@ -0,0 +1,27 @@ +package com.fabledsword.minstrel.shared + +import org.junit.jupiter.api.Test +import kotlin.test.assertEquals + +class FormattingTest { + @Test + fun `formatDuration formats minutes and seconds`() { + assertEquals("0:05", formatDuration(5)) + assertEquals("2:05", formatDuration(125)) + assertEquals("10:00", formatDuration(600)) + } + + @Test + fun `formatDuration uses the zero string for non-positive input`() { + assertEquals("0:00", formatDuration(0)) + assertEquals("0:00", formatDuration(-3)) + assertEquals("--:--", formatDuration(0, zero = "--:--")) + } + + @Test + fun `conversions round-trip seconds and millis`() { + assertEquals(5000, 5.secondsToMillis()) + assertEquals(5, 5000.millisToSeconds()) + assertEquals(5, 5000L.millisToSeconds()) + } +}