diff --git a/app/src/main/java/com/m57/hermescontrol/Navigation.kt b/app/src/main/java/com/m57/hermescontrol/Navigation.kt index 13f4404f..31cddd6a 100644 --- a/app/src/main/java/com/m57/hermescontrol/Navigation.kt +++ b/app/src/main/java/com/m57/hermescontrol/Navigation.kt @@ -177,7 +177,7 @@ private val DRAWER_ENTRIES = DrawerEntry(AchievementsScreen, "Achievements", Icons.Filled.Info, DrawerSection.INSPECT), ) -private val DRAWER_GESTURE_SCREENS: Set = ALL_NAV_ITEMS.map { it.key }.toSet() +private val DRAWER_GESTURE_SCREENS: Set = ALL_NAV_ITEMS.mapTo(mutableSetOf()) { it.key } @Composable fun MainNavigation(sessionId: String? = null) { diff --git a/app/src/main/java/com/m57/hermescontrol/data/local/HermesDatabase.kt b/app/src/main/java/com/m57/hermescontrol/data/local/HermesDatabase.kt index fc8b3f4a..417bbfb6 100644 --- a/app/src/main/java/com/m57/hermescontrol/data/local/HermesDatabase.kt +++ b/app/src/main/java/com/m57/hermescontrol/data/local/HermesDatabase.kt @@ -29,8 +29,7 @@ abstract class HermesDatabase : RoomDatabase() { if (BuildConfig.DEBUG) { fallbackToDestructiveMigration(false) } - } - .build() + }.build() .also { instance = it } } diff --git a/app/src/main/java/com/m57/hermescontrol/ui/chat/ChatBubble.kt b/app/src/main/java/com/m57/hermescontrol/ui/chat/ChatBubble.kt index ba79c8f6..0d6c6654 100644 --- a/app/src/main/java/com/m57/hermescontrol/ui/chat/ChatBubble.kt +++ b/app/src/main/java/com/m57/hermescontrol/ui/chat/ChatBubble.kt @@ -812,12 +812,11 @@ private fun RichText( } private val TIMESTAMP_FORMATTER = - DateTimeFormatter.ofPattern("HH:mm") + DateTimeFormatter + .ofPattern("HH:mm") .withZone(ZoneId.systemDefault()) -private fun formatTimestamp(timestamp: Long): String { - return TIMESTAMP_FORMATTER.format(Instant.ofEpochMilli(timestamp)) -} +private fun formatTimestamp(timestamp: Long): String = TIMESTAMP_FORMATTER.format(Instant.ofEpochMilli(timestamp)) /** * Build an AnnotatedString with search matches highlighted. diff --git a/app/src/main/java/com/m57/hermescontrol/util/CronExpressionFormatter.kt b/app/src/main/java/com/m57/hermescontrol/util/CronExpressionFormatter.kt index 238d497e..30ce9c94 100644 --- a/app/src/main/java/com/m57/hermescontrol/util/CronExpressionFormatter.kt +++ b/app/src/main/java/com/m57/hermescontrol/util/CronExpressionFormatter.kt @@ -19,7 +19,10 @@ object CronExpressionFormatter { // 1. Check for common simple shortcuts // Every X minutes: */X * * * * - if (minutePart.startsWith("*/") && hourPart == "*" && domPart == "*" && monthPart == "*" && + if (minutePart.startsWith("*/") && + hourPart == "*" && + domPart == "*" && + monthPart == "*" && dowPart == "*" ) { val step = minutePart.substring(2).toIntOrNull() @@ -27,7 +30,10 @@ object CronExpressionFormatter { } // Every X hours: 0 */X * * * - if (minutePart == "0" && hourPart.startsWith("*/") && domPart == "*" && monthPart == "*" && + if (minutePart == "0" && + hourPart.startsWith("*/") && + domPart == "*" && + monthPart == "*" && dowPart == "*" ) { val step = hourPart.substring(2).toIntOrNull() diff --git a/app/src/test/java/com/m57/hermescontrol/E2eIntegrationTest.kt b/app/src/test/java/com/m57/hermescontrol/E2eIntegrationTest.kt index 9c9a44d4..8c9d7d5b 100644 --- a/app/src/test/java/com/m57/hermescontrol/E2eIntegrationTest.kt +++ b/app/src/test/java/com/m57/hermescontrol/E2eIntegrationTest.kt @@ -425,10 +425,26 @@ class E2eIntegrationTest { assertFalse(viewModel.uiState.value.isLoading) assertEquals(1, viewModel.uiState.value.sessions.size) - assertEquals("session-123", viewModel.uiState.value.sessions[0].id) - assertEquals("Session 1", viewModel.uiState.value.sessions[0].title) - assertEquals(5, viewModel.uiState.value.sessions[0].message_count) - assertEquals("active", viewModel.uiState.value.sessions[0].status) + assertEquals( + "session-123", + viewModel.uiState.value.sessions[0] + .id, + ) + assertEquals( + "Session 1", + viewModel.uiState.value.sessions[0] + .title, + ) + assertEquals( + 5, + viewModel.uiState.value.sessions[0] + .message_count, + ) + assertEquals( + "active", + viewModel.uiState.value.sessions[0] + .status, + ) } @Test diff --git a/app/src/test/java/com/m57/hermescontrol/NavigationBenchmarkTest.kt b/app/src/test/java/com/m57/hermescontrol/NavigationBenchmarkTest.kt new file mode 100644 index 00000000..01fe7e63 --- /dev/null +++ b/app/src/test/java/com/m57/hermescontrol/NavigationBenchmarkTest.kt @@ -0,0 +1,38 @@ +package com.m57.hermescontrol + +import org.junit.Test +import kotlin.system.measureNanoTime + +class NavigationBenchmarkTest { + @Test + fun benchmarkMapToSet() { + // Simulate ALL_NAV_ITEMS which has 20 items + val items = (1..20).toList() + + // Warmup + for (i in 1..10000) { + val a = items.map { it }.toSet() + val b = items.mapTo(mutableSetOf()) { it } + } + + var timeMapToSet: Long = 0 + var timeMapTo: Long = 0 + + val iterations = 100000 + for (i in 1..iterations) { + timeMapToSet += + measureNanoTime { + items.map { it }.toSet() + } + timeMapTo += + measureNanoTime { + items.mapTo(mutableSetOf()) { it } + } + } + + println("============================") + println("Baseline (.map.toSet): ${timeMapToSet / iterations} ns/op") + println("Optimized (.mapTo): ${timeMapTo / iterations} ns/op") + println("============================") + } +}