Merge pull request #1780 from davotoula/lint-fixes-pt2

Lint fixes pt2
This commit is contained in:
Vitor Pamplona
2026-03-06 20:21:54 -05:00
committed by GitHub
32 changed files with 116 additions and 129 deletions
@@ -127,7 +127,7 @@ class ImageUploadTesting {
// assertEquals(server.baseUrl, "${server.baseUrl}/$initialHash", result.url?.removeSuffix(".png")) // assertEquals(server.baseUrl, "${server.baseUrl}/$initialHash", result.url?.removeSuffix(".png"))
val imageData: ByteArray = val imageData: ByteArray =
ImageDownloader().waitAndGetImage(result.url!!, { client })?.bytes ImageDownloader().waitAndGetImage(result.url!!) { client }?.bytes
?: run { ?: run {
fail("${server.name}: Should not be null") fail("${server.name}: Should not be null")
return return
@@ -142,8 +142,7 @@ class ImageUploadTesting {
ServerInfoRetriever() ServerInfoRetriever()
.loadInfo( .loadInfo(
server.baseUrl, server.baseUrl,
{ client }, ) { client }
)
val payload = getBitmap() val payload = getBitmap()
val inputStream = payload.inputStream() val inputStream = payload.inputStream()
@@ -172,7 +171,7 @@ class ImageUploadTesting {
Assert.assertTrue("${server.name}: Invalid result url", url.startsWith("http")) Assert.assertTrue("${server.name}: Invalid result url", url.startsWith("http"))
val imageData: ByteArray = val imageData: ByteArray =
ImageDownloader().waitAndGetImage(url, { client })?.bytes ImageDownloader().waitAndGetImage(url) { client }?.bytes
?: run { ?: run {
fail("${server.name}: Should not be null") fail("${server.name}: Should not be null")
return return
@@ -1240,7 +1240,7 @@ class Account(
val event = signer.sign(template) val event = signer.sign(template)
cache.justConsumeMyOwnEvent(event) cache.justConsumeMyOwnEvent(event)
val relays = relayList(event) val relays = relayList(event)
if (relays != null && relays.isNotEmpty()) { if (!relays.isNullOrEmpty()) {
client.send(event, relays.toSet()) client.send(event, relays.toSet())
} else { } else {
client.send(event, computeRelayListToBroadcast(event)) client.send(event, computeRelayListToBroadcast(event))
@@ -1898,7 +1898,7 @@ class Account(
fun getRelevantReports(note: Note): Set<Note> { fun getRelevantReports(note: Note): Set<Note> {
val innerReports = val innerReports =
if (note.event is RepostEvent || note.event is GenericRepostEvent) { if (note.event is RepostEvent || note.event is GenericRepostEvent) {
note.replyTo?.map { getRelevantReports(it) }?.flatten() ?: emptyList() note.replyTo?.flatMap { getRelevantReports(it) } ?: emptyList()
} else { } else {
emptyList() emptyList()
} }
@@ -2770,10 +2770,9 @@ object LocalCache : ILocalCache, ICacheProvider {
val childrenToBeRemoved = mutableListOf<Note>() val childrenToBeRemoved = mutableListOf<Note>()
val toBeRemoved = val toBeRemoved =
account.hiddenUsers.flow.value.hiddenUsers account.hiddenUsers.flow.value.hiddenUsers.flatMap { userHex ->
.map { userHex -> (notes.filter { _, it -> it.event?.pubKey == userHex } + addressables.filter { _, it -> it.event?.pubKey == userHex }).toSet()
(notes.filter { _, it -> it.event?.pubKey == userHex } + addressables.filter { _, it -> it.event?.pubKey == userHex }).toSet() }
}.flatten()
toBeRemoved.forEach { toBeRemoved.forEach {
removeFromCache(it) removeFromCache(it)
@@ -34,9 +34,9 @@ data class LabeledBookmarkList(
val privateBookmarks: Set<BookmarkIdTag> = emptySet(), val privateBookmarks: Set<BookmarkIdTag> = emptySet(),
val publicBookmarks: Set<BookmarkIdTag> = emptySet(), val publicBookmarks: Set<BookmarkIdTag> = emptySet(),
) { ) {
val privatePostBookmarks = privateBookmarks.filter { it is EventBookmark }.map { bookmarkIdTag -> bookmarkIdTag as EventBookmark } val privatePostBookmarks = privateBookmarks.filterIsInstance<EventBookmark>()
val publicPostBookmarks = publicBookmarks.filter { it is EventBookmark }.map { bookmarkIdTag -> bookmarkIdTag as EventBookmark } val publicPostBookmarks = publicBookmarks.filterIsInstance<EventBookmark>()
val privateArticleBookmarks = privateBookmarks.filter { it is AddressBookmark }.map { bookmarkIdTag -> bookmarkIdTag as AddressBookmark } val privateArticleBookmarks = privateBookmarks.filterIsInstance<AddressBookmark>()
val publicArticleBookmarks = publicBookmarks.filter { it is AddressBookmark }.map { bookmarkIdTag -> bookmarkIdTag as AddressBookmark } val publicArticleBookmarks = publicBookmarks.filterIsInstance<AddressBookmark>()
} }
@@ -65,14 +65,11 @@ class LightningAddressResolver {
okHttpClient: (String) -> OkHttpClient, okHttpClient: (String) -> OkHttpClient,
context: Context, context: Context,
): String { ): String {
val url = assembleUrl(lnAddress) val url =
assembleUrl(lnAddress) ?: throw LightningAddressError(
if (url == null) {
throw LightningAddressError(
stringRes(context, R.string.error_unable_to_fetch_invoice), stringRes(context, R.string.error_unable_to_fetch_invoice),
stringRes(context, R.string.could_not_assemble_lnurl_from_lightning_address_check_the_user_s_setup, lnAddress), stringRes(context, R.string.could_not_assemble_lnurl_from_lightning_address_check_the_user_s_setup, lnAddress),
) )
}
val client = okHttpClient(url) val client = okHttpClient(url)
@@ -48,8 +48,7 @@ class OkHttpWebSocket(
override fun needsReconnect(): Boolean { override fun needsReconnect(): Boolean {
if (socket == null) return true if (socket == null) return true
val myUsingOkHttp = usingOkHttp val myUsingOkHttp = usingOkHttp ?: return true
if (myUsingOkHttp == null) return true
val currentOkHttp = httpClient(url) val currentOkHttp = httpClient(url)
@@ -41,7 +41,7 @@ class ListWithUniqueSetCache<T, U>(
} }
fun distinct(): Set<U> { fun distinct(): Set<U> {
var currentSet = cacheSet.get() val currentSet = cacheSet.get()
// Check if the cached set is based on the current list // Check if the cached set is based on the current list
if (currentSet != null) { if (currentSet != null) {
@@ -36,7 +36,7 @@ fun filterDraftsFromKey(
pubkey: HexKey?, pubkey: HexKey?,
since: Long?, since: Long?,
): List<RelayBasedFilter> { ): List<RelayBasedFilter> {
if (pubkey == null || pubkey.isEmpty()) return emptyList() if (pubkey.isNullOrEmpty()) return emptyList()
return listOf( return listOf(
RelayBasedFilter( RelayBasedFilter(
@@ -92,7 +92,7 @@ fun pickRelaysToLoadUsers(
val outbox = key.authorRelayList()?.writeRelaysNorm() val outbox = key.authorRelayList()?.writeRelaysNorm()
if (outbox != null && outbox.isNotEmpty()) { if (!outbox.isNullOrEmpty()) {
// If there is a home, get from it. // If there is a home, get from it.
// if it tried all outbox relays, stop. // if it tried all outbox relays, stop.
@@ -70,7 +70,7 @@ fun filterBasicAccountInfoFromKeys(
otherAccounts: List<HexKey>?, otherAccounts: List<HexKey>?,
since: Long?, since: Long?,
): List<RelayBasedFilter> { ): List<RelayBasedFilter> {
if (otherAccounts == null || otherAccounts.isEmpty()) return emptyList() if (otherAccounts.isNullOrEmpty()) return emptyList()
return listOf( return listOf(
RelayBasedFilter( RelayBasedFilter(
@@ -38,7 +38,7 @@ fun filterBookmarksAndReportsFromKey(
pubkey: HexKey?, pubkey: HexKey?,
since: Long?, since: Long?,
): List<RelayBasedFilter> { ): List<RelayBasedFilter> {
if (pubkey == null || pubkey.isEmpty()) return emptyList() if (pubkey.isNullOrEmpty()) return emptyList()
return listOf( return listOf(
RelayBasedFilter( RelayBasedFilter(
@@ -90,7 +90,7 @@ fun filterSummaryNotificationsToPubkey(
pubkey: HexKey?, pubkey: HexKey?,
since: Long?, since: Long?,
): List<RelayBasedFilter> { ): List<RelayBasedFilter> {
if (pubkey == null || pubkey.isEmpty()) return emptyList() if (pubkey.isNullOrEmpty()) return emptyList()
return listOf( return listOf(
RelayBasedFilter( RelayBasedFilter(
@@ -111,7 +111,7 @@ fun filterNotificationsToPubkey(
pubkey: HexKey?, pubkey: HexKey?,
since: Long?, since: Long?,
): List<RelayBasedFilter> { ): List<RelayBasedFilter> {
if (pubkey == null || pubkey.isEmpty()) return emptyList() if (pubkey.isNullOrEmpty()) return emptyList()
return listOf( return listOf(
RelayBasedFilter( RelayBasedFilter(
@@ -142,7 +142,7 @@ fun filterJustTheLatestNotificationsToPubkeyFromRandomRelays(
pubkey: HexKey?, pubkey: HexKey?,
since: Long?, since: Long?,
): List<RelayBasedFilter> { ): List<RelayBasedFilter> {
if (pubkey == null || pubkey.isEmpty()) return emptyList() if (pubkey.isNullOrEmpty()) return emptyList()
return listOf( return listOf(
RelayBasedFilter( RelayBasedFilter(
@@ -32,7 +32,7 @@ fun filterGiftWrapsToPubkey(
pubkey: HexKey?, pubkey: HexKey?,
since: Long?, since: Long?,
): List<RelayBasedFilter> { ): List<RelayBasedFilter> {
if (pubkey == null || pubkey.isEmpty()) return emptyList() if (pubkey.isNullOrEmpty()) return emptyList()
return listOf( return listOf(
RelayBasedFilter( RelayBasedFilter(
@@ -40,7 +40,7 @@ fun potentialRelaysToFindAddress(note: AddressableNote): Set<NormalizedRelayUrl>
LocalCache.getAnyChannel(note)?.relays()?.let { set.addAll(it) } LocalCache.getAnyChannel(note)?.relays()?.let { set.addAll(it) }
note.replyTo?.map { parentNote -> note.replyTo?.forEach { parentNote ->
set.addAll(parentNote.relays) set.addAll(parentNote.relays)
LocalCache.getAnyChannel(parentNote)?.relays()?.let { set.addAll(it) } LocalCache.getAnyChannel(parentNote)?.relays()?.let { set.addAll(it) }
@@ -48,7 +48,7 @@ fun potentialRelaysToFindAddress(note: AddressableNote): Set<NormalizedRelayUrl>
parentNote.author?.inboxRelays()?.let { set.addAll(it) } parentNote.author?.inboxRelays()?.let { set.addAll(it) }
} }
note.replies.map { childNote -> note.replies.forEach { childNote ->
set.addAll(childNote.relays) set.addAll(childNote.relays)
LocalCache.getAnyChannel(childNote)?.relays()?.let { set.addAll(it) } LocalCache.getAnyChannel(childNote)?.relays()?.let { set.addAll(it) }
@@ -63,7 +63,7 @@ fun potentialRelaysToFindAddress(note: AddressableNote): Set<NormalizedRelayUrl>
} }
} }
note.boosts.map { childNote -> note.boosts.forEach { childNote ->
set.addAll(childNote.relays) set.addAll(childNote.relays)
childNote.author?.outboxRelays()?.let { set.addAll(it) } childNote.author?.outboxRelays()?.let { set.addAll(it) }
} }
@@ -36,7 +36,7 @@ fun potentialRelaysToFindEvent(note: Note): Set<NormalizedRelayUrl> {
LocalCache.getAnyChannel(note)?.relays()?.let { set.addAll(it) } LocalCache.getAnyChannel(note)?.relays()?.let { set.addAll(it) }
note.replyTo?.map { parentNote -> note.replyTo?.forEach { parentNote ->
set.addAll(parentNote.relays) set.addAll(parentNote.relays)
LocalCache.getAnyChannel(parentNote)?.relays()?.let { set.addAll(it) } LocalCache.getAnyChannel(parentNote)?.relays()?.let { set.addAll(it) }
@@ -44,7 +44,7 @@ fun potentialRelaysToFindEvent(note: Note): Set<NormalizedRelayUrl> {
parentNote.author?.inboxRelays()?.let { set.addAll(it) } parentNote.author?.inboxRelays()?.let { set.addAll(it) }
} }
note.replies.map { childNote -> note.replies.forEach { childNote ->
set.addAll(childNote.relays) set.addAll(childNote.relays)
LocalCache.getAnyChannel(childNote)?.relays()?.let { set.addAll(it) } LocalCache.getAnyChannel(childNote)?.relays()?.let { set.addAll(it) }
@@ -59,7 +59,7 @@ fun potentialRelaysToFindEvent(note: Note): Set<NormalizedRelayUrl> {
} }
} }
note.boosts.map { childNote -> note.boosts.forEach { childNote ->
set.addAll(childNote.relays) set.addAll(childNote.relays)
childNote.author?.outboxRelays()?.let { set.addAll(it) } childNote.author?.outboxRelays()?.let { set.addAll(it) }
} }
@@ -68,7 +68,7 @@ class UserCardsSubAssembler(
val trustedAccounts: Map<NormalizedRelayUrl, Set<HexKey>> = val trustedAccounts: Map<NormalizedRelayUrl, Set<HexKey>> =
mapOfSet { mapOfSet {
accounts.forEach { account -> accounts.forEach { account ->
account.homeRelays.flow.value.map { account.homeRelays.flow.value.forEach {
add(it, account.userProfile().pubkeyHex) add(it, account.userProfile().pubkeyHex)
} }
} }
@@ -170,7 +170,7 @@ internal fun <T> Iterable<T>.fillToSize(
transform: (List<T>) -> T, transform: (List<T>) -> T,
): List<T> { ): List<T> {
val capacity = ceil(size.safeDiv(count())).roundToInt() val capacity = ceil(size.safeDiv(count())).roundToInt()
return map { data -> List(capacity) { data } }.flatten().chunkToSize(size, transform) return flatMap { data -> List(capacity) { data } }.chunkToSize(size, transform)
} }
internal fun <T> Iterable<T>.chunkToSize( internal fun <T> Iterable<T>.chunkToSize(
@@ -117,7 +117,7 @@ fun SensitivityWarning(
@Composable @Composable
fun ContentWarningNotePreview() { fun ContentWarningNotePreview() {
ThemeComparisonColumn { ThemeComparisonColumn {
ContentWarningNote({}) ContentWarningNote {}
} }
} }
@@ -167,7 +167,7 @@ fun ObserveAllStatusesToAvoidSwitchigAllTheTime(
statuses: ImmutableList<AddressableNote>, statuses: ImmutableList<AddressableNote>,
accountViewModel: AccountViewModel, accountViewModel: AccountViewModel,
) { ) {
statuses.map { statuses.forEach {
EventFinderFilterAssemblerSubscription(it, accountViewModel) EventFinderFilterAssemblerSubscription(it, accountViewModel)
} }
} }
@@ -86,8 +86,8 @@ fun ReplyInformationChannel(
onUserTagClick: (User) -> Unit, onUserTagClick: (User) -> Unit,
) { ) {
FlowRow { FlowRow {
if (mentions != null && mentions.isNotEmpty()) { if (!mentions.isNullOrEmpty()) {
if (replyTo != null && replyTo.isNotEmpty()) { if (!replyTo.isNullOrEmpty()) {
Text( Text(
stringRes(id = R.string.replying_to), stringRes(id = R.string.replying_to),
fontSize = 13.sp, fontSize = 13.sp,
@@ -66,15 +66,15 @@ fun DisplayUncitedHashtags(
val tagsInContent = val tagsInContent =
state state
.paragraphs .paragraphs
.map { .flatMap { paragraphState ->
it.words.mapNotNull { paragraphState.words.mapNotNull {
if (it is HashTagSegment) { if (it is HashTagSegment) {
it.hashtag it.hashtag
} else { } else {
null null
} }
} }
}.flatten() }
val unusedHashtags = val unusedHashtags =
tagsInEvent.filterNot { eventTag -> tagsInEvent.filterNot { eventTag ->
@@ -35,7 +35,7 @@ fun filterNip04DMs(
account: Account?, account: Account?,
since: SincePerRelayMap?, since: SincePerRelayMap?,
): List<RelayBasedFilter>? { ): List<RelayBasedFilter>? {
if (group == null || group.isEmpty() || account == null) return null if (group.isNullOrEmpty() || account == null) return null
val userOutboxRelays = account.homeRelays.flow.value val userOutboxRelays = account.homeRelays.flow.value
val userInboxRelays = account.dmRelays.flow.value val userInboxRelays = account.dmRelays.flow.value
@@ -596,7 +596,7 @@ class ChatNewMessageViewModel :
toUsersTagger.run() toUsersTagger.run()
val users = toUsersTagger.pTags?.mapTo(mutableSetOf()) { it.pubkeyHex } val users = toUsersTagger.pTags?.mapTo(mutableSetOf()) { it.pubkeyHex }
if (users == null || users.isEmpty()) { if (users.isNullOrEmpty()) {
room = null room = null
updateNIP17StatusFromRoom() updateNIP17StatusFromRoom()
} else { } else {
@@ -117,8 +117,7 @@ open class DiscoverLiveFeedFilter(
fun convertStatusToOrder(event: LiveActivitiesEvent?): Int { fun convertStatusToOrder(event: LiveActivitiesEvent?): Int {
if (event == null) return 0 if (event == null) return 0
val url = event.streaming() val url = event.streaming() ?: return 0
if (url == null) return 0
return when (event.status()) { return when (event.status()) {
StatusTag.STATUS.LIVE -> { StatusTag.STATUS.LIVE -> {
if (OnlineChecker.isCachedAndOffline(url)) { if (OnlineChecker.isCachedAndOffline(url)) {
@@ -34,7 +34,7 @@ fun filterCommunitiesByHashtag(
hashtags: Set<String>?, hashtags: Set<String>?,
since: Long?, since: Long?,
): List<RelayBasedFilter> { ): List<RelayBasedFilter> {
if (hashtags == null || hashtags.isEmpty()) return emptyList() if (hashtags.isNullOrEmpty()) return emptyList()
val hashtags = hashtags.flatMap(::hashtagAlts).distinct().sorted() val hashtags = hashtags.flatMap(::hashtagAlts).distinct().sorted()
@@ -33,7 +33,7 @@ fun filterClassifiedsByHashtag(
hashtags: Set<String>?, hashtags: Set<String>?,
since: Long?, since: Long?,
): List<RelayBasedFilter>? { ): List<RelayBasedFilter>? {
if (hashtags == null || hashtags.isEmpty()) return null if (hashtags.isNullOrEmpty()) return null
val hashtags = hashtags.flatMap(::hashtagAlts).distinct().sorted() val hashtags = hashtags.flatMap(::hashtagAlts).distinct().sorted()
@@ -555,8 +555,8 @@ open class ShortNotePostViewModel :
val serverToUse = voiceSelectedServer ?: accountViewModel.account.settings.defaultFileServer val serverToUse = voiceSelectedServer ?: accountViewModel.account.settings.defaultFileServer
uploadVoiceMessageSync( uploadVoiceMessageSync(
serverToUse, serverToUse,
{ _, _ -> }, // Error handling is done by checking voiceMetadata below ) { _, _ -> } // Error handling is done by checking voiceMetadata below
)
// Abort if upload failed - don't post without voice data // Abort if upload failed - don't post without voice data
if (voiceMetadata == null) { if (voiceMetadata == null) {
Log.w("ShortNotePostViewModel", "Voice upload failed, aborting post") Log.w("ShortNotePostViewModel", "Voice upload failed, aborting post")
@@ -160,10 +160,8 @@ class HomeLiveFilter(
val noteEvent = note.event val noteEvent = note.event
if (noteEvent is LiveActivitiesChatMessageEvent) { if (noteEvent is LiveActivitiesChatMessageEvent) {
val stream = noteEvent.activityAddress() val stream = noteEvent.activityAddress() ?: return false
if (stream == null) return false val streamChannel = LocalCache.getLiveActivityChannelIfExists(stream) ?: return false
val streamChannel = LocalCache.getLiveActivityChannelIfExists(stream)
if (streamChannel == null) return false
if (streamChannel.info?.status() != StatusTag.STATUS.LIVE) return false if (streamChannel.info?.status() != StatusTag.STATUS.LIVE) return false
} }
@@ -165,13 +165,13 @@ class CardFeedContentState(
val reactionsPerEvent = mutableMapOf<Note, MutableList<Note>>() val reactionsPerEvent = mutableMapOf<Note, MutableList<Note>>()
notes notes
.filter { it.event is ReactionEvent } .filter { it.event is ReactionEvent }
.forEach { .forEach { note ->
val reactedPost = val reactedPost =
it.replyTo?.lastOrNull { note.replyTo?.lastOrNull {
it.event !is ChannelMetadataEvent && it.event !is ChannelCreateEvent it.event !is ChannelMetadataEvent && it.event !is ChannelCreateEvent
} }
if (reactedPost != null) { if (reactedPost != null) {
reactionsPerEvent.getOrPut(reactedPost, { mutableListOf() }).add(it) reactionsPerEvent.getOrPut(reactedPost) { mutableListOf() }.add(note)
} }
} }
@@ -192,7 +192,7 @@ class CardFeedContentState(
// var newZapRequestEvent = LocalCache.checkPrivateZap(zapRequest.event as Event) // var newZapRequestEvent = LocalCache.checkPrivateZap(zapRequest.event as Event)
// zapRequest.event = newZapRequestEvent // zapRequest.event = newZapRequestEvent
zapsPerEvent zapsPerEvent
.getOrPut(zappedPost, { mutableListOf() }) .getOrPut(zappedPost) { mutableListOf() }
.add(CombinedZap(zapRequest, zapEvent)) .add(CombinedZap(zapRequest, zapEvent))
} }
} else { } else {
@@ -215,7 +215,7 @@ class CardFeedContentState(
val zapRequestNote = getNoteIfExists(zapRequest.id) val zapRequestNote = getNoteIfExists(zapRequest.id)
if (zapRequestNote != null) { if (zapRequestNote != null) {
zapsPerUser zapsPerUser
.getOrPut(author, { mutableListOf() }) .getOrPut(author) { mutableListOf() }
.add(CombinedZap(zapRequestNote, zapEvent)) .add(CombinedZap(zapRequestNote, zapEvent))
} }
} }
@@ -226,13 +226,13 @@ class CardFeedContentState(
val boostsPerEvent = mutableMapOf<Note, MutableList<Note>>() val boostsPerEvent = mutableMapOf<Note, MutableList<Note>>()
notes notes
.filter { it.event is RepostEvent || it.event is GenericRepostEvent } .filter { it.event is RepostEvent || it.event is GenericRepostEvent }
.forEach { .forEach { note ->
val boostedPost = val boostedPost =
it.replyTo?.lastOrNull { note.replyTo?.lastOrNull {
it.event !is ChannelMetadataEvent && it.event !is ChannelCreateEvent it.event !is ChannelMetadataEvent && it.event !is ChannelCreateEvent
} }
if (boostedPost != null) { if (boostedPost != null) {
boostsPerEvent.getOrPut(boostedPost, { mutableListOf() }).add(it) boostsPerEvent.getOrPut(boostedPost) { mutableListOf() }.add(note)
} }
} }
@@ -240,42 +240,41 @@ class CardFeedContentState(
val allBaseNotes = zapsPerEvent.keys + boostsPerEvent.keys + reactionsPerEvent.keys val allBaseNotes = zapsPerEvent.keys + boostsPerEvent.keys + reactionsPerEvent.keys
val multiCards = val multiCards =
allBaseNotes allBaseNotes.flatMap { baseNote ->
.map { baseNote -> val boostsInCard = boostsPerEvent[baseNote] ?: emptyList()
val boostsInCard = boostsPerEvent[baseNote] ?: emptyList() val reactionsInCard = reactionsPerEvent[baseNote] ?: emptyList()
val reactionsInCard = reactionsPerEvent[baseNote] ?: emptyList() val zapsInCard = zapsPerEvent[baseNote] ?: emptyList()
val zapsInCard = zapsPerEvent[baseNote] ?: emptyList()
val singleList = val singleList =
(boostsInCard + zapsInCard.map { it.response } + reactionsInCard).groupBy { (boostsInCard + zapsInCard.map { it.response } + reactionsInCard).groupBy {
sdf.format( sdf.format(
Instant Instant
.ofEpochSecond(it.createdAt() ?: 0L) .ofEpochSecond(it.createdAt() ?: 0L)
.atZone(ZoneId.systemDefault()) .atZone(ZoneId.systemDefault())
.toLocalDateTime(), .toLocalDateTime(),
)
}
val days = singleList.keys.sortedBy { it }
days
.mapNotNull { string ->
val sortedList =
singleList
.get(string)
?.sortedWith(compareBy({ it.createdAt() }, { it.idHex }))
?.reversed()
sortedList?.chunked(30)?.map { chunk ->
MultiSetCard(
baseNote,
boostsInCard.filter { it in chunk }.toImmutableList(),
reactionsInCard.filter { it in chunk }.toImmutableList(),
zapsInCard.filter { it.response in chunk }.toImmutableList(),
) )
} }
}.flatten()
val days = singleList.keys.sortedBy { it } }
days
.mapNotNull {
val sortedList =
singleList
.get(it)
?.sortedWith(compareBy({ it.createdAt() }, { it.idHex }))
?.reversed()
sortedList?.chunked(30)?.map { chunk ->
MultiSetCard(
baseNote,
boostsInCard.filter { it in chunk }.toImmutableList(),
reactionsInCard.filter { it in chunk }.toImmutableList(),
zapsInCard.filter { it.response in chunk }.toImmutableList(),
)
}
}.flatten()
}.flatten()
val userZaps = val userZaps =
zapsPerUser zapsPerUser
@@ -290,10 +289,10 @@ class CardFeedContentState(
) )
} }
byDay.values.map { byDay.values.map { zaps ->
ZapUserSetCard( ZapUserSetCard(
user.key, user.key,
it zaps
.sortedWith(compareBy({ it.createdAt() }, { it.idHex() })) .sortedWith(compareBy({ it.createdAt() }, { it.idHex() }))
.reversed() .reversed()
.toImmutableList(), .toImmutableList(),
@@ -37,9 +37,7 @@ class UserProfileBookmarksFeedFilter(
override fun feed(): List<Note> { override fun feed(): List<Note> {
val note = LocalCache.getOrCreateAddressableNote(BookmarkListEvent.createBookmarkAddress(user.pubkeyHex)) val note = LocalCache.getOrCreateAddressableNote(BookmarkListEvent.createBookmarkAddress(user.pubkeyHex))
val noteEvent = note.event as? BookmarkListEvent val noteEvent = note.event as? BookmarkListEvent ?: return emptyList()
if (noteEvent == null) return emptyList()
val notes = val notes =
noteEvent.publicBookmarks().mapNotNull { noteEvent.publicBookmarks().mapNotNull {
@@ -76,29 +76,28 @@ fun filterUserProfilePosts(
user.outboxRelays()?.ifEmpty { null } user.outboxRelays()?.ifEmpty { null }
?: (user.allUsedRelays() + LocalCache.relayHints.hintsForKey(user.pubkeyHex)) ?: (user.allUsedRelays() + LocalCache.relayHints.hintsForKey(user.pubkeyHex))
return relays return relays.flatMap { relay ->
.map { relay -> listOf(
listOf( RelayBasedFilter(
RelayBasedFilter( relay = relay,
relay = relay, filter =
filter = Filter(
Filter( kinds = UserProfilePostKinds1,
kinds = UserProfilePostKinds1, authors = listOf(user.pubkeyHex),
authors = listOf(user.pubkeyHex), limit = 500,
limit = 500, since = since?.get(relay)?.time,
since = since?.get(relay)?.time, ),
), ),
), RelayBasedFilter(
RelayBasedFilter( relay = relay,
relay = relay, filter =
filter = Filter(
Filter( kinds = UserProfilePostKinds2,
kinds = UserProfilePostKinds2, authors = listOf(user.pubkeyHex),
authors = listOf(user.pubkeyHex), limit = 50,
limit = 50, since = since?.get(relay)?.time,
since = since?.get(relay)?.time, ),
), ),
), )
) }
}.flatten()
} }
@@ -842,7 +842,7 @@ private fun RenderClassifiedsReaderForThread(
Row(modifier = Modifier.padding(start = 12.dp, end = 12.dp, bottom = 12.dp)) { Row(modifier = Modifier.padding(start = 12.dp, end = 12.dp, bottom = 12.dp)) {
Column { Column {
if (imageSet != null && imageSet.isNotEmpty()) { if (!imageSet.isNullOrEmpty()) {
AutoNonlazyGrid(imageSet.size) { AutoNonlazyGrid(imageSet.size) {
ZoomableContentView( ZoomableContentView(
content = imageSet[it], content = imageSet[it],