From 3ffa259cff6a0cef33f1eca7e2d50bef30e61949 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 28 Jul 2026 15:37:01 +0000 Subject: [PATCH] fix: resolve LocalCache override, dropdown deprecation, and shadowed extension warnings - Rename LocalCache Dao overrides to match supertype parameter names (getOrCreateUser: pubkey->hex, getOrCreateNote: idHex->hex, getOrCreateAddressableNote: key->address) so named-argument calls stay safe. - Replace deprecated MenuAnchorType with ExposedDropdownMenuAnchorType in the Buzz dropdown composables. - Remove the buzzChannelType() extension in BuzzChannelMetadata, now shadowed by the equivalent (stricter) member on GroupMetadataEvent, and drop its unused imports. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_018VBP6HGj9M2kzA4WKAivjC --- .../amethyst/model/LocalCache.kt | 20 +++++++++---------- .../loggedIn/buzz/BuzzOptionDropdown.kt | 4 ++-- .../loggedIn/buzz/WorkflowRunBoardScreen.kt | 4 ++-- .../relayGroup/RelayGroupChannelListScreen.kt | 1 - .../relayGroup/RelayGroupThreadsScreen.kt | 1 - .../buzz/workspace/BuzzChannelMetadata.kt | 4 ---- 6 files changed, 14 insertions(+), 20 deletions(-) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt index 1ade9dc675..820cbcaa1a 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt @@ -687,12 +687,12 @@ object LocalCache : ILocalCache, ICacheProvider, Dao { fun load(keys: Set): Set = keys.mapNotNullTo(mutableSetOf(), ::checkGetOrCreateUser) - override fun getOrCreateUser(pubkey: HexKey): User { - require(isValidHex(key = pubkey)) { "$pubkey is not a valid hex" } + override fun getOrCreateUser(hex: HexKey): User { + require(isValidHex(key = hex)) { "$hex is not a valid hex" } // Pass `this` as the UserContext — User now resolves each pinned // addressable note (kind:10002 / 10050 / 10019) lazily on first // read, instead of all-or-nothing at construction time. - return users.getOrCreate(pubkey) { User(it, userContext) } + return users.getOrCreate(hex) { User(it, userContext) } } /** [UserContext] bridge to this cache's addressable lookup. */ @@ -823,11 +823,11 @@ object LocalCache : ILocalCache, ICacheProvider, Dao { } } - override fun getOrCreateNote(idHex: String): Note { - require(isValidHex(idHex)) { "$idHex is not a valid hex" } + override fun getOrCreateNote(hex: String): Note { + require(isValidHex(hex)) { "$hex is not a valid hex" } - return notes.getOrCreate(idHex) { - Note(idHex) + return notes.getOrCreate(hex) { + Note(hex) } } @@ -945,11 +945,11 @@ object LocalCache : ILocalCache, ICacheProvider, Dao { fun getOrCreateAddressableNoteInternal(key: Address): AddressableNote = addressables.getOrCreate(key) { AddressableNote(key) } - override fun getOrCreateAddressableNote(key: Address): AddressableNote { - val note = getOrCreateAddressableNoteInternal(key) + override fun getOrCreateAddressableNote(address: Address): AddressableNote { + val note = getOrCreateAddressableNoteInternal(address) // Loads the user outside a Syncronized block to avoid blocking if (note.author == null) { - note.author = checkGetOrCreateUser(key.pubKeyHex) + note.author = checkGetOrCreateUser(address.pubKeyHex) } return note } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/buzz/BuzzOptionDropdown.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/buzz/BuzzOptionDropdown.kt index 4d39c69d4e..a70c48abc6 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/buzz/BuzzOptionDropdown.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/buzz/BuzzOptionDropdown.kt @@ -24,9 +24,9 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.ExposedDropdownMenuAnchorType import androidx.compose.material3.ExposedDropdownMenuBox import androidx.compose.material3.ExposedDropdownMenuDefaults -import androidx.compose.material3.MenuAnchorType import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -77,7 +77,7 @@ fun EditableSuggestDropdown( trailingIcon = { ExposedDropdownMenuDefaults.TrailingIcon(expanded = showMenu) }, keyboardOptions = keyboardOptions, supportingText = supportingText?.let { { Text(it) } }, - modifier = modifier.fillMaxWidth().menuAnchor(MenuAnchorType.PrimaryEditable), + modifier = modifier.fillMaxWidth().menuAnchor(ExposedDropdownMenuAnchorType.PrimaryEditable), ) ExposedDropdownMenu(expanded = showMenu, onDismissRequest = { expanded = false }) { filtered.forEach { opt -> diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/buzz/WorkflowRunBoardScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/buzz/WorkflowRunBoardScreen.kt index 1525e7dba2..dfd1857703 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/buzz/WorkflowRunBoardScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/buzz/WorkflowRunBoardScreen.kt @@ -55,13 +55,13 @@ import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.ColorScheme import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.ExposedDropdownMenuAnchorType import androidx.compose.material3.ExposedDropdownMenuBox import androidx.compose.material3.ExposedDropdownMenuDefaults import androidx.compose.material3.ExtendedFloatingActionButton import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.LinearProgressIndicator import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.MenuAnchorType import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.OutlinedButton import androidx.compose.material3.OutlinedTextField @@ -823,7 +823,7 @@ private fun WorkflowPicker( label = { Text(stringRes(R.string.buzz_workflow_picker_label)) }, placeholder = { Text(if (definitions.isEmpty()) stringRes(R.string.buzz_workflow_picker_empty) else stringRes(R.string.buzz_workflow_picker_choose)) }, trailingIcon = { ExposedDropdownMenuDefaults.TrailingIcon(expanded = expanded) }, - modifier = Modifier.fillMaxWidth().menuAnchor(MenuAnchorType.PrimaryNotEditable), + modifier = Modifier.fillMaxWidth().menuAnchor(ExposedDropdownMenuAnchorType.PrimaryNotEditable), ) ExposedDropdownMenu(expanded = expanded, onDismissRequest = { expanded = false }) { definitions.forEach { def -> diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chats/publicChannels/relayGroup/RelayGroupChannelListScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chats/publicChannels/relayGroup/RelayGroupChannelListScreen.kt index fed4acca93..d41cc2aed0 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chats/publicChannels/relayGroup/RelayGroupChannelListScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chats/publicChannels/relayGroup/RelayGroupChannelListScreen.kt @@ -98,7 +98,6 @@ import com.vitorpamplona.amethyst.ui.stringRes import com.vitorpamplona.amethyst.ui.theme.warningColor import com.vitorpamplona.quartz.buzz.workspace.BUZZ_CHANNEL_TYPE_DM import com.vitorpamplona.quartz.buzz.workspace.BUZZ_CHANNEL_TYPE_FORUM -import com.vitorpamplona.quartz.buzz.workspace.buzzChannelType import com.vitorpamplona.quartz.nip01Core.core.HexKey import com.vitorpamplona.quartz.nip01Core.relay.filters.Filter import com.vitorpamplona.quartz.nip01Core.relay.normalizer.RelayUrlNormalizer diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chats/publicChannels/relayGroup/RelayGroupThreadsScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chats/publicChannels/relayGroup/RelayGroupThreadsScreen.kt index f49f63c876..560003d92c 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chats/publicChannels/relayGroup/RelayGroupThreadsScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chats/publicChannels/relayGroup/RelayGroupThreadsScreen.kt @@ -71,7 +71,6 @@ import com.vitorpamplona.amethyst.ui.stringRes import com.vitorpamplona.amethyst.ui.theme.Size35dp import com.vitorpamplona.quartz.buzz.forum.ForumPostEvent import com.vitorpamplona.quartz.buzz.workspace.BUZZ_CHANNEL_TYPE_FORUM -import com.vitorpamplona.quartz.buzz.workspace.buzzChannelType import com.vitorpamplona.quartz.nip01Core.core.HexKey import com.vitorpamplona.quartz.nip01Core.relay.normalizer.RelayUrlNormalizer import com.vitorpamplona.quartz.nip29RelayGroups.GroupId diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/buzz/workspace/BuzzChannelMetadata.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/buzz/workspace/BuzzChannelMetadata.kt index 676ba91902..79b3aedbd3 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/buzz/workspace/BuzzChannelMetadata.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/buzz/workspace/BuzzChannelMetadata.kt @@ -21,7 +21,6 @@ package com.vitorpamplona.quartz.buzz.workspace import com.vitorpamplona.quartz.nip01Core.core.HexKey -import com.vitorpamplona.quartz.nip01Core.core.firstTagValue import com.vitorpamplona.quartz.nip01Core.core.toHexKey import com.vitorpamplona.quartz.nip01Core.tags.people.PTag import com.vitorpamplona.quartz.nip29RelayGroups.metadata.GroupMetadataEvent @@ -38,9 +37,6 @@ import com.vitorpamplona.quartz.utils.RandomInstance * (emit_group_discovery_events). */ -/** The Buzz channel type from the relay's `t` tag ("stream" / "forum" / "dm"), or null. */ -fun GroupMetadataEvent.buzzChannelType(): String? = tags.firstTagValue("t") - /** True when the relay marks this channel a DM (`t` = "dm"). */ fun GroupMetadataEvent.isBuzzDm(): Boolean = buzzChannelType() == BUZZ_CHANNEL_TYPE_DM