From 33dacaa260596a8c6ce5aab5188418befd1b15ad Mon Sep 17 00:00:00 2001 From: davotoula Date: Fri, 24 Apr 2026 11:09:14 +0200 Subject: [PATCH 1/2] fix(audio-room): give hand-raise button a visible toggled state Replace FilledTonalIconButton with FilledTonalIconToggleButton so the container color reflects raised/lowered state, and drop the tautological `if (handRaised) PanTool else PanTool` conditional flagged by Sonar. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../ui/screen/loggedIn/audiorooms/room/AudioRoomStage.kt | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/audiorooms/room/AudioRoomStage.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/audiorooms/room/AudioRoomStage.kt index 1dfc757761..5defdbb1b1 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/audiorooms/room/AudioRoomStage.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/audiorooms/room/AudioRoomStage.kt @@ -30,7 +30,7 @@ import androidx.compose.foundation.lazy.items import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Card import androidx.compose.material3.CardDefaults -import androidx.compose.material3.FilledTonalIconButton +import androidx.compose.material3.FilledTonalIconToggleButton import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text @@ -178,9 +178,12 @@ private fun AudioRoomStageContent( horizontalArrangement = Arrangement.End, verticalAlignment = Alignment.CenterVertically, ) { - FilledTonalIconButton(onClick = { handRaised = !handRaised }) { + FilledTonalIconToggleButton( + checked = handRaised, + onCheckedChange = { handRaised = it }, + ) { Icon( - symbol = if (handRaised) MaterialSymbols.PanTool else MaterialSymbols.PanTool, + symbol = MaterialSymbols.PanTool, contentDescription = stringRes( if (handRaised) R.string.audio_room_lower_hand else R.string.audio_room_raise_hand, From 20367af3dbc2385a367e84b7c50972ba64ab033c Mon Sep 17 00:00:00 2001 From: davotoula Date: Fri, 24 Apr 2026 11:10:39 +0200 Subject: [PATCH 2/2] fix(cli): warn when FileStores delete() fails Delete() returning false on a still-existing file meant we silently lost scratch state for MLS group / key-package / message stores. Route the four call sites through a `deleteOrWarn` helper that logs via the KMP-safe quartz Log when the file refuses to disappear. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../amethyst/cli/stores/FileStores.kt | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/cli/src/main/kotlin/com/vitorpamplona/amethyst/cli/stores/FileStores.kt b/cli/src/main/kotlin/com/vitorpamplona/amethyst/cli/stores/FileStores.kt index 6aa7f09076..cef8eb47b5 100644 --- a/cli/src/main/kotlin/com/vitorpamplona/amethyst/cli/stores/FileStores.kt +++ b/cli/src/main/kotlin/com/vitorpamplona/amethyst/cli/stores/FileStores.kt @@ -23,8 +23,15 @@ package com.vitorpamplona.amethyst.cli.stores import com.vitorpamplona.quartz.marmot.mip00KeyPackages.KeyPackageBundleStore import com.vitorpamplona.quartz.marmot.mls.group.MarmotMessageStore import com.vitorpamplona.quartz.marmot.mls.group.MlsGroupStateStore +import com.vitorpamplona.quartz.utils.Log import java.io.File +private fun File.deleteOrWarn(tag: String) { + if (!delete() && exists()) { + Log.w(tag) { "Failed to delete $absolutePath" } + } +} + /** * Test-harness file stores. **Unencrypted** — the production interfaces * document that implementations MUST encrypt at rest, but this CLI is a @@ -53,8 +60,8 @@ class FileMlsGroupStateStore( override suspend fun load(nostrGroupId: String): ByteArray? = stateFile(nostrGroupId).takeIf { it.exists() }?.readBytes() override suspend fun delete(nostrGroupId: String) { - stateFile(nostrGroupId).delete() - retainedFile(nostrGroupId).delete() + stateFile(nostrGroupId).deleteOrWarn("FileMlsGroupStateStore") + retainedFile(nostrGroupId).deleteOrWarn("FileMlsGroupStateStore") } override suspend fun listGroups(): List = @@ -112,7 +119,7 @@ class FileKeyPackageBundleStore( override suspend fun load(): ByteArray? = file.takeIf { it.exists() }?.readBytes() override suspend fun delete() { - file.delete() + file.deleteOrWarn("FileKeyPackageBundleStore") } } @@ -137,6 +144,6 @@ class FileMarmotMessageStore( override suspend fun loadMessages(nostrGroupId: String): List = file(nostrGroupId).takeIf { it.exists() }?.readLines()?.filter { it.isNotBlank() } ?: emptyList() override suspend fun delete(nostrGroupId: String) { - file(nostrGroupId).delete() + file(nostrGroupId).deleteOrWarn("FileMarmotMessageStore") } }