diff --git a/amethyst/src/androidTest/java/com/vitorpamplona/amethyst/ImageUploadTesting.kt b/amethyst/src/androidTest/java/com/vitorpamplona/amethyst/ImageUploadTesting.kt index bd67a381d..d8fe4b70a 100644 --- a/amethyst/src/androidTest/java/com/vitorpamplona/amethyst/ImageUploadTesting.kt +++ b/amethyst/src/androidTest/java/com/vitorpamplona/amethyst/ImageUploadTesting.kt @@ -75,9 +75,21 @@ class ImageUploadTesting { ) val url = result.tags!!.first { it[0] == "url" }.get(1) - val size = result.tags!!.firstOrNull { it[0] == "size" }?.get(1)?.ifBlank { null } - val dim = result.tags!!.firstOrNull { it[0] == "dim" }?.get(1)?.ifBlank { null } - val hash = result.tags!!.firstOrNull { it[0] == "x" }?.get(1)?.ifBlank { null } + val size = + result.tags!! + .firstOrNull { it[0] == "size" } + ?.get(1) + ?.ifBlank { null } + val dim = + result.tags!! + .firstOrNull { it[0] == "dim" } + ?.get(1) + ?.ifBlank { null } + val hash = + result.tags!! + .firstOrNull { it[0] == "x" } + ?.get(1) + ?.ifBlank { null } val contentType = result.tags!!.first { it[0] == "m" }.get(1) val ox = result.tags!!.first { it[0] == "ox" }.get(1) diff --git a/amethyst/src/androidTest/java/com/vitorpamplona/amethyst/ThreadAssemblerTest.kt b/amethyst/src/androidTest/java/com/vitorpamplona/amethyst/ThreadAssemblerTest.kt index 39cf69711..cf43f6020 100644 --- a/amethyst/src/androidTest/java/com/vitorpamplona/amethyst/ThreadAssemblerTest.kt +++ b/amethyst/src/androidTest/java/com/vitorpamplona/amethyst/ThreadAssemblerTest.kt @@ -79,8 +79,7 @@ class ThreadAssemblerTest { {"id":"512962dbada5fd5015fc727a107d5c3f569662de67eab8e5da5a8065012cf11e","pubkey":"7fa56f5d6962ab1e3cd424e758c3002b8665f7b0d8dcee9fe9e288d7751ac194","created_at":1688194800,"kind":1,"tags":[["a","30023:6e468422dfb74a5738702a8823b9b28168abab8655faacb6853cd0ee15deee93:1680612926599","","root"],["e","87a5bd25aa084cefb3357fc9c2a5b327254fab35fdd7b2d4bd0acddc63d0abe8","","reply"]],"content":"another one","sig":"b4bc4d8206a08de0a918043129b27c8863d17f60e4f58b4d2b535326625870d32640b04f247eb9eb5df1d62fe98c8e1b0341bdd119655553488300ec9d5b4036"}, {"id":"ce6e32e3e17b6901d2cc70b60f3743e24f885bb6e9da6d88cff516079eac1883","pubkey":"726a1e261cc6474674e8285e3951b3bb139be9a773d1acf49dc868db861a1c11","created_at":1688234921,"kind":1,"tags":[["a","30023:6e468422dfb74a5738702a8823b9b28168abab8655faacb6853cd0ee15deee93:1680612926599","","root"],["e","512962dbada5fd5015fc727a107d5c3f569662de67eab8e5da5a8065012cf11e","","reply"]],"content":"yet another one, testing 0.0.3","sig":"13bd41c4029c6a7ee41cb03d12e831e9e9b6e14d43a61c78a72657070b45385ba2ce98e8121049fbcbdb7b2dd777c36c7867ba70b5e6a4798a9b866910ae5b62"} ] - """ - .trimIndent() + """.trimIndent() val header = """ @@ -111,8 +110,7 @@ class ThreadAssemblerTest { ["p","b9e76546ba06456ed301d9e52bc49fa48e70a6bf2282be7a1ae72947612023dc"] ] } - """ - .trimIndent() + """.trimIndent() @Test fun threadOrderTest() = diff --git a/amethyst/src/fdroid/java/com/vitorpamplona/amethyst/service/notifications/PushDistributorHandler.kt b/amethyst/src/fdroid/java/com/vitorpamplona/amethyst/service/notifications/PushDistributorHandler.kt index 3a33a77f0..c928185c2 100644 --- a/amethyst/src/fdroid/java/com/vitorpamplona/amethyst/service/notifications/PushDistributorHandler.kt +++ b/amethyst/src/fdroid/java/com/vitorpamplona/amethyst/service/notifications/PushDistributorHandler.kt @@ -55,15 +55,11 @@ object PushDistributorHandler : PushDistributorActions { endpointInternal = "" } - override fun getSavedDistributor(): String { - return unifiedPush.getSavedDistributor(appContext) ?: "" - } + override fun getSavedDistributor(): String = unifiedPush.getSavedDistributor(appContext) ?: "" fun savedDistributorExists(): Boolean = getSavedDistributor().isNotEmpty() - override fun getInstalledDistributors(): List { - return unifiedPush.getDistributors(appContext) - } + override fun getInstalledDistributors(): List = unifiedPush.getDistributors(appContext) fun formattedDistributorNames(): List { val distributorsArray = getInstalledDistributors().toTypedArray() @@ -87,8 +83,7 @@ object PushDistributorHandler : PushDistributorActions { it } as String - } - .toTypedArray() + }.toTypedArray() return distributorsNameArray.toList() } diff --git a/amethyst/src/fdroid/java/com/vitorpamplona/amethyst/service/notifications/PushMessageReceiver.kt b/amethyst/src/fdroid/java/com/vitorpamplona/amethyst/service/notifications/PushMessageReceiver.kt index b6313df50..6839761dd 100644 --- a/amethyst/src/fdroid/java/com/vitorpamplona/amethyst/service/notifications/PushMessageReceiver.kt +++ b/amethyst/src/fdroid/java/com/vitorpamplona/amethyst/service/notifications/PushMessageReceiver.kt @@ -126,8 +126,7 @@ class PushMessageReceiver : MessagingReceiver() { pushHandler.removeEndpoint() } - fun notificationManager(): NotificationManager { - return ContextCompat.getSystemService(appContext, NotificationManager::class.java) + fun notificationManager(): NotificationManager = + ContextCompat.getSystemService(appContext, NotificationManager::class.java) as NotificationManager - } } diff --git a/amethyst/src/main/java/androidx/compose/material3/pullrefresh/PullRefresh.kt b/amethyst/src/main/java/androidx/compose/material3/pullrefresh/PullRefresh.kt index 3e750ff23..5594a8418 100644 --- a/amethyst/src/main/java/androidx/compose/material3/pullrefresh/PullRefresh.kt +++ b/amethyst/src/main/java/androidx/compose/material3/pullrefresh/PullRefresh.kt @@ -118,7 +118,5 @@ private class PullRefreshNestedScrollConnection( else -> Offset.Zero } - override suspend fun onPreFling(available: Velocity): Velocity { - return Velocity(0f, onRelease(available.y)) - } + override suspend fun onPreFling(available: Velocity): Velocity = Velocity(0f, onRelease(available.y)) } diff --git a/amethyst/src/main/java/androidx/compose/material3/pullrefresh/PullRefreshIndicatorTransform.kt b/amethyst/src/main/java/androidx/compose/material3/pullrefresh/PullRefreshIndicatorTransform.kt index 68bfcd489..6e8b9853c 100644 --- a/amethyst/src/main/java/androidx/compose/material3/pullrefresh/PullRefreshIndicatorTransform.kt +++ b/amethyst/src/main/java/androidx/compose/material3/pullrefresh/PullRefreshIndicatorTransform.kt @@ -63,8 +63,7 @@ fun Modifier.pullRefreshIndicatorTransform( ) { this@drawWithContent.drawContent() } - } - .graphicsLayer { + }.graphicsLayer { translationY = state.position - size.height if (scale && !state.refreshing) { diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/Amethyst.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/Amethyst.kt index 1199f184b..152bfb9a1 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/Amethyst.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/Amethyst.kt @@ -61,7 +61,8 @@ class Amethyst : Application() { } val coilCache: DiskCache by lazy { - DiskCache.Builder() + DiskCache + .Builder() .directory(applicationContext.safeCacheDir.resolve("image_cache")) .maxSizePercent(0.2) .maximumMaxSizeBytes(500L * 1024 * 1024) // 250MB @@ -77,10 +78,18 @@ class Amethyst : Application() { if (BuildConfig.DEBUG) { StrictMode.setThreadPolicy( - ThreadPolicy.Builder().detectAll().penaltyLog().build(), + ThreadPolicy + .Builder() + .detectAll() + .penaltyLog() + .build(), ) StrictMode.setVmPolicy( - VmPolicy.Builder().detectAll().penaltyLog().build(), + VmPolicy + .Builder() + .detectAll() + .penaltyLog() + .build(), ) } @@ -94,13 +103,9 @@ class Amethyst : Application() { } } - fun imageLoaderBuilder(): ImageLoader.Builder { - return ImageLoader.Builder(applicationContext).diskCache { coilCache } - } + fun imageLoaderBuilder(): ImageLoader.Builder = ImageLoader.Builder(applicationContext).diskCache { coilCache } - fun encryptedStorage(npub: String? = null): EncryptedSharedPreferences { - return EncryptedStorage.preferences(instance, npub) - } + fun encryptedStorage(npub: String? = null): EncryptedSharedPreferences = EncryptedStorage.preferences(instance, npub) companion object { lateinit var instance: Amethyst diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/EncryptedStorage.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/EncryptedStorage.kt index 0768bfec1..7a90f89ae 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/EncryptedStorage.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/EncryptedStorage.kt @@ -29,16 +29,15 @@ class EncryptedStorage { private const val PREFERENCES_NAME = "secret_keeper" // returns the preferences for each account or a global file if null. - fun prefsFileName(npub: String? = null): String { - return if (npub == null) PREFERENCES_NAME else "${PREFERENCES_NAME}_$npub" - } + fun prefsFileName(npub: String? = null): String = if (npub == null) PREFERENCES_NAME else "${PREFERENCES_NAME}_$npub" fun preferences( applicationContext: Context, npub: String? = null, ): EncryptedSharedPreferences { val masterKey: MasterKey = - MasterKey.Builder(applicationContext, MasterKey.DEFAULT_MASTER_KEY_ALIAS) + MasterKey + .Builder(applicationContext, MasterKey.DEFAULT_MASTER_KEY_ALIAS) .setKeyScheme(MasterKey.KeyScheme.AES256_GCM) .build() diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/AntiSpamFilter.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/AntiSpamFilter.kt index 2f0911488..b68584e43 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/AntiSpamFilter.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/AntiSpamFilter.kt @@ -33,7 +33,10 @@ import com.vitorpamplona.quartz.encoders.Nip19Bech32 import com.vitorpamplona.quartz.events.Event import kotlinx.coroutines.Dispatchers -data class Spammer(val pubkeyHex: HexKey, var duplicatedMessages: Set) +data class Spammer( + val pubkeyHex: HexKey, + var duplicatedMessages: Set, +) class AntiSpamFilter { val recentMessages = LruCache(1000) @@ -109,7 +112,9 @@ class AntiSpamFilter { } @Stable -class AntiSpamLiveData(val cache: AntiSpamFilter) : LiveData(AntiSpamState(cache)) { +class AntiSpamLiveData( + val cache: AntiSpamFilter, +) : LiveData(AntiSpamState(cache)) { // Refreshes observers in batches. private val bundler = BundledUpdate(300, Dispatchers.IO) @@ -126,4 +131,6 @@ class AntiSpamLiveData(val cache: AntiSpamFilter) : LiveData(Anti } } -class AntiSpamState(val cache: AntiSpamFilter) +class AntiSpamState( + val cache: AntiSpamFilter, +) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/Channel.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/Channel.kt index 2c12a5147..b0b8a3fe4 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/Channel.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/Channel.kt @@ -37,7 +37,9 @@ import com.vitorpamplona.quartz.events.LiveActivitiesEvent import kotlinx.coroutines.Dispatchers @Stable -class PublicChatChannel(idHex: String) : Channel(idHex) { +class PublicChatChannel( + idHex: String, +) : Channel(idHex) { var info = ChannelCreateEvent.ChannelData(null, null, null) fun updateChannelInfo( @@ -49,26 +51,22 @@ class PublicChatChannel(idHex: String) : Channel(idHex) { super.updateChannelInfo(creator, updatedAt) } - override fun toBestDisplayName(): String { - return info.name ?: super.toBestDisplayName() - } + override fun toBestDisplayName(): String = info.name ?: super.toBestDisplayName() - override fun summary(): String? { - return info.about - } + override fun summary(): String? = info.about override fun profilePicture(): String? { if (info.picture.isNullOrBlank()) return super.profilePicture() return info.picture ?: super.profilePicture() } - override fun anyNameStartsWith(prefix: String): Boolean { - return listOfNotNull(info.name, info.about).filter { it.contains(prefix, true) }.isNotEmpty() - } + override fun anyNameStartsWith(prefix: String): Boolean = listOfNotNull(info.name, info.about).filter { it.contains(prefix, true) }.isNotEmpty() } @Stable -class LiveActivitiesChannel(val address: ATag) : Channel(address.toTag()) { +class LiveActivitiesChannel( + val address: ATag, +) : Channel(address.toTag()) { var info: LiveActivitiesEvent? = null override fun idNote() = address.toNAddr() @@ -86,27 +84,22 @@ class LiveActivitiesChannel(val address: ATag) : Channel(address.toTag()) { super.updateChannelInfo(creator, updatedAt) } - override fun toBestDisplayName(): String { - return info?.title() ?: super.toBestDisplayName() - } + override fun toBestDisplayName(): String = info?.title() ?: super.toBestDisplayName() - override fun summary(): String? { - return info?.summary() - } + override fun summary(): String? = info?.summary() - override fun profilePicture(): String? { - return info?.image()?.ifBlank { null } - } + override fun profilePicture(): String? = info?.image()?.ifBlank { null } - override fun anyNameStartsWith(prefix: String): Boolean { - return listOfNotNull(info?.title(), info?.summary()) + override fun anyNameStartsWith(prefix: String): Boolean = + listOfNotNull(info?.title(), info?.summary()) .filter { it.contains(prefix, true) } .isNotEmpty() - } } @Stable -abstract class Channel(val idHex: String) { +abstract class Channel( + val idHex: String, +) { var creator: User? = null var updatedMetadataAt: Long = 0 val notes = LargeCache() @@ -118,21 +111,13 @@ abstract class Channel(val idHex: String) { open fun idDisplayNote() = idNote().toShortenHex() - open fun toBestDisplayName(): String { - return idDisplayNote() - } + open fun toBestDisplayName(): String = idDisplayNote() - open fun summary(): String? { - return null - } + open fun summary(): String? = null - open fun creatorName(): String? { - return creator?.toBestDisplayName() - } + open fun creatorName(): String? = creator?.toBestDisplayName() - open fun profilePicture(): String? { - return creator?.info?.banner - } + open fun profilePicture(): String? = creator?.info?.banner open fun updateChannelInfo( creator: User, @@ -167,10 +152,10 @@ abstract class Channel(val idHex: String) { fun pruneOldAndHiddenMessages(account: Account): Set { val important = - notes.filter { key, it -> - it.author?.let { author -> account.isHidden(author) } == false - } - .sortedWith(DefaultFeedOrder) + notes + .filter { key, it -> + it.author?.let { author -> account.isHidden(author) } == false + }.sortedWith(DefaultFeedOrder) .take(500) .toSet() @@ -182,7 +167,9 @@ abstract class Channel(val idHex: String) { } } -class ChannelLiveData(val channel: Channel) : LiveData(ChannelState(channel)) { +class ChannelLiveData( + val channel: Channel, +) : LiveData(ChannelState(channel)) { // Refreshes observers in batches. private val bundler = BundledUpdate(300, Dispatchers.IO) @@ -208,4 +195,6 @@ class ChannelLiveData(val channel: Channel) : LiveData(ChannelStat } } -class ChannelState(val channel: Channel) +class ChannelState( + val channel: Channel, +) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/Chatroom.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/Chatroom.kt index f986f1fe1..63e3094ba 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/Chatroom.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/Chatroom.kt @@ -26,7 +26,7 @@ import com.vitorpamplona.quartz.encoders.HexKey import com.vitorpamplona.quartz.utils.TimeUtils @Stable -class Chatroom() { +class Chatroom { var authors: Set = setOf() var roomMessages: Set = setOf() var subject: String? = null @@ -72,9 +72,7 @@ class Chatroom() { } } - fun senderIntersects(keySet: Set): Boolean { - return authors.any { it.pubkeyHex in keySet } - } + fun senderIntersects(keySet: Set): Boolean = authors.any { it.pubkeyHex in keySet } fun pruneMessagesToTheLatestOnly(): Set { val sorted = roomMessages.sortedWith(compareBy({ it.createdAt() }, { it.idHex })).reversed() diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/HashtagIcon.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/HashtagIcon.kt index 536b96946..a27419081 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/HashtagIcon.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/HashtagIcon.kt @@ -68,8 +68,8 @@ fun RenderHashTagIcons() { } } -fun checkForHashtagWithIcon(tag: String): HashtagIcon? { - return when (tag.lowercase()) { +fun checkForHashtagWithIcon(tag: String): HashtagIcon? = + when (tag.lowercase()) { "₿itcoin", "bitcoin", "btc", "timechain", "bitcoiner", "bitcoiners" -> bitcoin "nostr", "nostrich", "nostriches", "thenostr" -> nostr "lightning", "lightningnetwork" -> lightning @@ -86,7 +86,6 @@ fun checkForHashtagWithIcon(tag: String): HashtagIcon? { "weed", "weedstr", "420", "cannabis", "marijuana" -> weed else -> null } -} val bitcoin = HashtagIcon(CustomHashTagIcons.Btc, "Bitcoin", Modifier.padding(start = 1.dp, bottom = 1.dp, top = 1.dp)) val nostr = HashtagIcon(CustomHashTagIcons.Nostr, "Nostr", Modifier.padding(start = 1.dp, bottom = 1.dp, top = 1.dp)) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/MiniFhir.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/MiniFhir.kt index 6bf60d156..e770d9d6c 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/MiniFhir.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/MiniFhir.kt @@ -66,9 +66,7 @@ class HumanName( var family: String? = null, var given: ArrayList = arrayListOf(), ) { - fun assembleName(): String { - return given.joinToString(" ") + " " + family - } + fun assembleName(): String = given.joinToString(" ") + " " + family } class Bundle( diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/ThreadAssembler.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/ThreadAssembler.kt index d8bfb83f0..8694a0825 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/ThreadAssembler.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/ThreadAssembler.kt @@ -62,8 +62,7 @@ class ThreadAssembler { } else { null } - } - ?.filterNotNull() + }?.filterNotNull() if (roots != null && roots.isNotEmpty()) { return roots[0] @@ -148,9 +147,7 @@ class OnlyLatestVersionSet : MutableSet { } } - override fun addAll(elements: Collection): Boolean { - return elements.map { add(it) }.any() - } + override fun addAll(elements: Collection): Boolean = elements.map { add(it) }.any() override val size: Int get() = set.size @@ -160,29 +157,17 @@ class OnlyLatestVersionSet : MutableSet { map.clear() } - override fun isEmpty(): Boolean { - return set.isEmpty() - } + override fun isEmpty(): Boolean = set.isEmpty() - override fun containsAll(elements: Collection): Boolean { - return set.containsAll(elements) - } + override fun containsAll(elements: Collection): Boolean = set.containsAll(elements) - override fun contains(element: Note): Boolean { - return set.contains(element) - } + override fun contains(element: Note): Boolean = set.contains(element) - override fun iterator(): MutableIterator { - return set.iterator() - } + override fun iterator(): MutableIterator = set.iterator() - override fun retainAll(elements: Collection): Boolean { - return set.retainAll(elements) - } + override fun retainAll(elements: Collection): Boolean = set.retainAll(elements) - override fun removeAll(elements: Collection): Boolean { - return elements.map { remove(it) }.any() - } + override fun removeAll(elements: Collection): Boolean = elements.map { remove(it) }.any() override fun remove(element: Note): Boolean { element.address()?.let { diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/ThreadLevelCalculator.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/ThreadLevelCalculator.kt index 0bc7518b6..3c86c6e97 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/ThreadLevelCalculator.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/ThreadLevelCalculator.kt @@ -27,16 +27,20 @@ import java.time.Instant import java.time.ZoneId import java.time.format.DateTimeFormatter -data class LevelSignature(val signature: String, val createdAt: Long?, val author: User?) +data class LevelSignature( + val signature: String, + val createdAt: Long?, + val author: User?, +) object ThreadLevelCalculator { val levelFormatter = DateTimeFormatter.ofPattern("uuuu-MM-dd-HH:mm:ss") - private fun formattedDateTime(timestamp: Long): String { - return Instant.ofEpochSecond(timestamp) + private fun formattedDateTime(timestamp: Long): String = + Instant + .ofEpochSecond(timestamp) .atZone(ZoneId.systemDefault()) .format(levelFormatter) - } /** * This method caches signatures during each execution to avoid recalculation in longer threads @@ -76,8 +80,7 @@ object ThreadLevelCalculator { accountFollowingSet, now, ).apply { cachedSignatures.put(it, this) } - } - .maxByOrNull { it.signature.length } + }.maxByOrNull { it.signature.length } ) val parentSignature = parent?.signature?.removeSuffix(";") ?: "" diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/UrlCachedPreviewer.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/UrlCachedPreviewer.kt index 79c51f801..466726a86 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/UrlCachedPreviewer.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/UrlCachedPreviewer.kt @@ -74,7 +74,6 @@ object UrlCachedPreviewer { onReady(state) } }, - ) - .fetchUrlPreview() + ).fetchUrlPreview() } } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/observables/LatestByKindAndAuthor.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/observables/LatestByKindAndAuthor.kt index 41fb72896..996e4fb51 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/observables/LatestByKindAndAuthor.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/observables/LatestByKindAndAuthor.kt @@ -27,7 +27,10 @@ import com.vitorpamplona.quartz.events.Event import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow -class LatestByKindAndAuthor(private val kind: Int, private val pubkey: String) { +class LatestByKindAndAuthor( + private val kind: Int, + private val pubkey: String, +) { private val _latest = MutableStateFlow(null) val latest = _latest.asStateFlow() @@ -41,30 +44,30 @@ class LatestByKindAndAuthor(private val kind: Int, private val pubkey } } - fun canDelete(): Boolean { - return _latest.subscriptionCount.value == 0 - } + fun canDelete(): Boolean = _latest.subscriptionCount.value == 0 suspend fun init() { val latestNote = if ((kind in 10000..19999) || (kind in 30000..39999)) { - LocalCache.addressables.maxOrNullOf( - filter = { idHex: String, note: AddressableNote -> - note.event?.let { - it.kind() == kind && it.pubKey() == pubkey - } == true - }, - comparator = CreatedAtComparatorAddresses, - )?.event as? T + LocalCache.addressables + .maxOrNullOf( + filter = { idHex: String, note: AddressableNote -> + note.event?.let { + it.kind() == kind && it.pubKey() == pubkey + } == true + }, + comparator = CreatedAtComparatorAddresses, + )?.event as? T } else { - LocalCache.notes.maxOrNullOf( - filter = { idHex: String, note: Note -> - note.event?.let { - it.kind() == kind && it.pubKey() == pubkey - } == true - }, - comparator = CreatedAtComparator, - )?.event as? T + LocalCache.notes + .maxOrNullOf( + filter = { idHex: String, note: Note -> + note.event?.let { + it.kind() == kind && it.pubKey() == pubkey + } == true + }, + comparator = CreatedAtComparator, + )?.event as? T } _latest.tryEmit(latestNote) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/observables/LatestByKindWithETag.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/observables/LatestByKindWithETag.kt index 30796daa0..4b5af6888 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/observables/LatestByKindWithETag.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/observables/LatestByKindWithETag.kt @@ -26,7 +26,10 @@ import com.vitorpamplona.quartz.events.Event import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow -class LatestByKindWithETag(private val kind: Int, private val eTag: String) { +class LatestByKindWithETag( + private val kind: Int, + private val eTag: String, +) { private val _latest = MutableStateFlow(null) val latest = _latest.asStateFlow() @@ -40,20 +43,19 @@ class LatestByKindWithETag(private val kind: Int, private val eTag: S } } - fun canDelete(): Boolean { - return _latest.subscriptionCount.value == 0 - } + fun canDelete(): Boolean = _latest.subscriptionCount.value == 0 suspend fun init() { val latestNote = - LocalCache.notes.maxOrNullOf( - filter = { idHex: String, note: Note -> - note.event?.let { - it.kind() == kind && it.isTaggedEvent(eTag) - } == true - }, - comparator = CreatedAtComparator, - )?.event as? T + LocalCache.notes + .maxOrNullOf( + filter = { idHex: String, note: Note -> + note.event?.let { + it.kind() == kind && it.isTaggedEvent(eTag) + } == true + }, + comparator = CreatedAtComparator, + )?.event as? T _latest.tryEmit(latestNote) } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/AmethystNostrDataSource.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/AmethystNostrDataSource.kt index 244d60a1f..99e7d12b2 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/AmethystNostrDataSource.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/AmethystNostrDataSource.kt @@ -26,7 +26,9 @@ import com.vitorpamplona.ammolite.relays.Relay import com.vitorpamplona.quartz.events.AddressableEvent import com.vitorpamplona.quartz.events.Event -abstract class AmethystNostrDataSource(debugName: String) : NostrDataSource(debugName) { +abstract class AmethystNostrDataSource( + debugName: String, +) : NostrDataSource(debugName) { override fun consume( event: Event, relay: Relay, diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/BlurHashImage.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/BlurHashImage.kt index 412289fbb..b87e2f570 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/BlurHashImage.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/BlurHashImage.kt @@ -59,9 +59,7 @@ class BlurHashFetcher( data: Uri, options: Options, imageLoader: ImageLoader, - ): Fetcher { - return BlurHashFetcher(options, data) - } + ): Fetcher = BlurHashFetcher(options, data) } } @@ -72,7 +70,8 @@ object BlurHashRequester { ): ImageRequest { val encodedMessage = URLEncoder.encode(message, "utf-8") - return ImageRequest.Builder(context) + return ImageRequest + .Builder(context) .data("bluehash:$encodedMessage") .fetcherFactory(BlurHashFetcher.Factory) .build() diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/EmojiUtils.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/EmojiUtils.kt index 8f1e1ab60..c47a21b0d 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/EmojiUtils.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/EmojiUtils.kt @@ -22,9 +22,7 @@ package com.vitorpamplona.amethyst.service import com.vitorpamplona.quartz.events.ImmutableListOfLists -fun String.isUTF16Char(pos: Int): Boolean { - return Character.charCount(this.codePointAt(pos)) == 2 -} +fun String.isUTF16Char(pos: Int): Boolean = Character.charCount(this.codePointAt(pos)) == 2 fun String.firstFullCharOld(): String { return when (this.length) { diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/FileHeader.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/FileHeader.kt index cdb33e6d6..1fc2400a2 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/FileHeader.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/FileHeader.kt @@ -236,10 +236,10 @@ fun MediaMetadataRetriever.prepareVideoHeight(): Int? { } } -class ByteArrayMediaDataSource(var imageData: ByteArray) : MediaDataSource() { - override fun getSize(): Long { - return imageData.size.toLong() - } +class ByteArrayMediaDataSource( + var imageData: ByteArray, +) : MediaDataSource() { + override fun getSize(): Long = imageData.size.toLong() @Throws(IOException::class) override fun readAt( diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/LocationUtil.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/LocationUtil.kt index cf02079bf..79ffb292c 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/LocationUtil.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/LocationUtil.kt @@ -33,7 +33,9 @@ import androidx.compose.runtime.mutableStateOf import kotlinx.coroutines.CancellationException import kotlinx.coroutines.flow.MutableStateFlow -class LocationUtil(context: Context) { +class LocationUtil( + context: Context, +) { companion object { const val MIN_TIME: Long = 1000L const val MIN_DISTANCE: Float = 0.0f @@ -96,9 +98,7 @@ class LocationUtil(context: Context) { object CachedGeoLocations { val locationNames = LruCache(20) - fun cached(geoHashStr: String): String? { - return locationNames[geoHashStr] - } + fun cached(geoHashStr: String): String? = locationNames[geoHashStr] suspend fun geoLocate( geoHashStr: String, diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/MainThreadChecker.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/MainThreadChecker.kt index 8d027dbdb..a985b04de 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/MainThreadChecker.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/MainThreadChecker.kt @@ -31,4 +31,6 @@ fun checkNotInMainThread() { fun isMainThread() = Looper.myLooper() == Looper.getMainLooper() -class OnMainThreadException(str: String) : RuntimeException(str) +class OnMainThreadException( + str: String, +) : RuntimeException(str) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/Nip96MediaServers.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/Nip96MediaServers.kt index 07f7244eb..3aca30ca6 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/Nip96MediaServers.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/Nip96MediaServers.kt @@ -38,7 +38,10 @@ object Nip96MediaServers { ServerName("Void.cat", "https://void.cat"), ) - data class ServerName(val name: String, val baseUrl: String) + data class ServerName( + val name: String, + val baseUrl: String, + ) val cache: MutableMap = mutableMapOf() @@ -83,7 +86,8 @@ class Nip96Retriever { checkNotInMainThread() val request: Request = - Request.Builder() + Request + .Builder() .header("Accept", "application/nostr+json") .url(baseUrl.removeSuffix("/") + "/.well-known/nostr/nip96.json") .build() diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/OnlineCheck.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/OnlineCheck.kt index 72e11ab2e..72c8fd396 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/OnlineCheck.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/OnlineCheck.kt @@ -32,7 +32,10 @@ import okhttp3.Request import okio.ByteString.Companion.toByteString import kotlin.coroutines.cancellation.CancellationException -@Immutable data class OnlineCheckResult(val timeInMs: Long, val online: Boolean) +@Immutable data class OnlineCheckResult( + val timeInMs: Long, + val online: Boolean, +) object OnlineChecker { val checkOnlineCache = LruCache(100) @@ -58,7 +61,8 @@ object OnlineChecker { val result = if (url.startsWith("wss")) { val request = - Request.Builder() + Request + .Builder() .header("User-Agent", "Amethyst/${BuildConfig.VERSION_NAME}") .url(url.replace("wss+livekit://", "wss://")) .header("Upgrade", "websocket") @@ -69,7 +73,9 @@ object OnlineChecker { .build() val client = - HttpClientManager.getHttpClient().newBuilder() + HttpClientManager + .getHttpClient() + .newBuilder() .eventListener(EventListener.NONE) .protocols(listOf(Protocol.HTTP_1_1)) .build() @@ -80,7 +86,8 @@ object OnlineChecker { } } else { val request = - Request.Builder() + Request + .Builder() .header("User-Agent", "Amethyst/${BuildConfig.VERSION_NAME}") .url(url) .get() diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/PackageUtils.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/PackageUtils.kt index 07a978d2e..736911a54 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/PackageUtils.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/PackageUtils.kt @@ -28,15 +28,12 @@ object PackageUtils { private fun isPackageInstalled( context: Context, target: String, - ): Boolean { - return context.packageManager.getInstalledApplications(0).find { info -> + ): Boolean = + context.packageManager.getInstalledApplications(0).find { info -> info.packageName == target } != null - } - fun isOrbotInstalled(context: Context): Boolean { - return isPackageInstalled(context, "org.torproject.android") - } + fun isOrbotInstalled(context: Context): Boolean = isPackageInstalled(context, "org.torproject.android") fun isExternalSignerInstalled(context: Context): Boolean { val intent = diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/lnurl/CachedLnInvoice.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/lnurl/CachedLnInvoice.kt index 67a7edcc4..cd71080f2 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/lnurl/CachedLnInvoice.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/lnurl/CachedLnInvoice.kt @@ -27,14 +27,15 @@ import kotlinx.coroutines.CancellationException import java.text.NumberFormat @Stable -data class InvoiceAmount(val invoice: String, val amount: String?) +data class InvoiceAmount( + val invoice: String, + val amount: String?, +) object CachedLnInvoiceParser { val lnInvoicesCache = LruCache(20) - fun cached(lnurl: String): InvoiceAmount? { - return lnInvoicesCache[lnurl] - } + fun cached(lnurl: String): InvoiceAmount? = lnInvoicesCache[lnurl] fun parse(lnbcWord: String): InvoiceAmount? { val myInvoice = LnInvoiceUtil.findInvoice(lnbcWord) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/ots/OkHttpBlockstreamExplorer.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/ots/OkHttpBlockstreamExplorer.kt index eeb092395..defcf6cbb 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/ots/OkHttpBlockstreamExplorer.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/ots/OkHttpBlockstreamExplorer.kt @@ -42,7 +42,8 @@ class OkHttpBlockstreamExplorer : BitcoinExplorer { val url = "$BLOCKSTREAM_API_URL/block/$hash" val request = - Request.Builder() + Request + .Builder() .header("User-Agent", "Amethyst/${BuildConfig.VERSION_NAME}") .header("Accept", "application/json") .url(url) @@ -79,7 +80,8 @@ class OkHttpBlockstreamExplorer : BitcoinExplorer { val url = "$BLOCKSTREAM_API_URL/block-height/$height" val request = - Request.Builder() + Request + .Builder() .header("User-Agent", "Amethyst/${BuildConfig.VERSION_NAME}") .url(url) .get() diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/ots/OkHttpCalendarAsyncSubmit.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/ots/OkHttpCalendarAsyncSubmit.kt index 515f9150e..855b7c761 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/ots/OkHttpCalendarAsyncSubmit.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/ots/OkHttpCalendarAsyncSubmit.kt @@ -33,7 +33,10 @@ import java.util.concurrent.BlockingQueue /** * For making async calls to a calendar server */ -class OkHttpCalendarAsyncSubmit(private val url: String, private val digest: ByteArray) : ICalendarAsyncSubmit { +class OkHttpCalendarAsyncSubmit( + private val url: String, + private val digest: ByteArray, +) : ICalendarAsyncSubmit { private var queue: BlockingQueue>? = null fun setQueue(queue: BlockingQueue>?) { @@ -49,7 +52,8 @@ class OkHttpCalendarAsyncSubmit(private val url: String, private val digest: Byt val requestBody = digest.toRequestBody(mediaType) val request = - okhttp3.Request.Builder() + okhttp3.Request + .Builder() .header("User-Agent", "Amethyst/${BuildConfig.VERSION_NAME}") .header("Accept", "application/vnd.opentimestamps.v1") .header("Content-Type", "application/x-www-form-urlencoded") diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/ots/OkHttpCalendarBuilder.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/ots/OkHttpCalendarBuilder.kt index b8f9408a8..a565d5fde 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/ots/OkHttpCalendarBuilder.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/ots/OkHttpCalendarBuilder.kt @@ -25,14 +25,10 @@ import com.vitorpamplona.quartz.ots.ICalendar import com.vitorpamplona.quartz.ots.ICalendarAsyncSubmit class OkHttpCalendarBuilder : CalendarBuilder { - override fun newSyncCalendar(url: String): ICalendar { - return OkHttpCalendar(url) - } + override fun newSyncCalendar(url: String): ICalendar = OkHttpCalendar(url) override fun newAsyncCalendar( url: String, digest: ByteArray, - ): ICalendarAsyncSubmit { - return OkHttpCalendarAsyncSubmit(url, digest) - } + ): ICalendarAsyncSubmit = OkHttpCalendarAsyncSubmit(url, digest) } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/playback/VideoCache.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/playback/VideoCache.kt index c13aeb560..cfcd9042d 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/playback/VideoCache.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/playback/VideoCache.kt @@ -59,12 +59,12 @@ class VideoCache { // This method should be called when proxy setting changes. fun renewCacheFactory(client: OkHttpClient) { cacheDataSourceFactory = - CacheDataSource.Factory() + CacheDataSource + .Factory() .setCache(simpleCache) .setUpstreamDataSourceFactory( OkHttpDataSource.Factory(client), - ) - .setFlags(CacheDataSource.FLAG_IGNORE_CACHE_ON_ERROR) + ).setFlags(CacheDataSource.FLAG_IGNORE_CACHE_ON_ERROR) } fun get(client: OkHttpClient): CacheDataSource.Factory { diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/playback/VideoViewedPositionCache.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/playback/VideoViewedPositionCache.kt index e0867cd1c..615990480 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/playback/VideoViewedPositionCache.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/playback/VideoViewedPositionCache.kt @@ -32,7 +32,5 @@ class VideoViewedPositionCache { cachedPosition.put(uri, position) } - fun get(uri: String): Long? { - return cachedPosition.get(uri) - } + fun get(uri: String): Long? = cachedPosition.get(uri) } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/playback/WssDataStreamCollector.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/playback/WssDataStreamCollector.kt index 2af443c10..49fae2804 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/playback/WssDataStreamCollector.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/playback/WssDataStreamCollector.kt @@ -44,11 +44,7 @@ class WssDataStreamCollector : WebSocketListener() { wssData.removeAll(wssData) } - fun canStream(): Boolean { - return wssData.size > 0 - } + fun canStream(): Boolean = wssData.size > 0 - fun getNextStream(): ByteString { - return wssData.pollFirst() - } + fun getNextStream(): ByteString = wssData.pollFirst() } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/playback/WssStreamDataSource.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/playback/WssStreamDataSource.kt index 0a95bd7d6..9e9be49a0 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/playback/WssStreamDataSource.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/playback/WssStreamDataSource.kt @@ -32,7 +32,9 @@ import okhttp3.WebSocket import kotlin.math.min @OptIn(UnstableApi::class) -class WssStreamDataSource(val httpClient: OkHttpClient) : BaseDataSource(true) { +class WssStreamDataSource( + val httpClient: OkHttpClient, +) : BaseDataSource(true) { val dataStreamCollector: WssDataStreamCollector = WssDataStreamCollector() var webSocketClient: WebSocket? = null @@ -46,11 +48,14 @@ class WssStreamDataSource(val httpClient: OkHttpClient) : BaseDataSource(true) { // which collects the data for us (Previous class). webSocketClient = httpClient.newWebSocket( - Request.Builder().apply { - dataSpec.httpRequestHeaders.forEach { entry -> - addHeader(entry.key, entry.value) - } - }.url(dataSpec.uri.toString()).build(), + Request + .Builder() + .apply { + dataSpec.httpRequestHeaders.forEach { entry -> + addHeader(entry.key, entry.value) + } + }.url(dataSpec.uri.toString()) + .build(), dataStreamCollector, ) @@ -106,7 +111,9 @@ class WssStreamDataSource(val httpClient: OkHttpClient) : BaseDataSource(true) { } // Factory class for DataSource - class Factory(val okHttpClient: OkHttpClient) : DataSource.Factory { + class Factory( + val okHttpClient: OkHttpClient, + ) : DataSource.Factory { override fun createDataSource(): DataSource = WssStreamDataSource(okHttpClient) } } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/previews/BahaUrlPreview.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/previews/BahaUrlPreview.kt index e5b326c9c..0678a92c5 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/previews/BahaUrlPreview.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/previews/BahaUrlPreview.kt @@ -22,7 +22,10 @@ package com.vitorpamplona.amethyst.service.previews import kotlinx.coroutines.CancellationException -class BahaUrlPreview(val url: String, var callback: IUrlPreviewCallback?) { +class BahaUrlPreview( + val url: String, + var callback: IUrlPreviewCallback?, +) { suspend fun fetchUrlPreview(timeOut: Int = 30000) = try { fetch(timeOut) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/previews/UrlInfoItem.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/previews/UrlInfoItem.kt index 5f5fb186d..720abcdab 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/previews/UrlInfoItem.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/previews/UrlInfoItem.kt @@ -40,11 +40,7 @@ class UrlInfoItem( image } - fun fetchComplete(): Boolean { - return url.isNotEmpty() && image.isNotEmpty() - } + fun fetchComplete(): Boolean = url.isNotEmpty() && image.isNotEmpty() - fun allFetchComplete(): Boolean { - return title.isNotEmpty() && description.isNotEmpty() && image.isNotEmpty() - } + fun allFetchComplete(): Boolean = title.isNotEmpty() && description.isNotEmpty() && image.isNotEmpty() } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/previews/UrlPreviewUtils.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/previews/UrlPreviewUtils.kt index 79fb36e32..fc99a7cd3 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/previews/UrlPreviewUtils.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/previews/UrlPreviewUtils.kt @@ -71,7 +71,12 @@ suspend fun getDocument( timeOut: Int = 30000, ): UrlInfoItem = withContext(Dispatchers.IO) { - val request: Request = Request.Builder().url(url).get().build() + val request: Request = + Request + .Builder() + .url(url) + .get() + .build() HttpClientManager.getHttpClient().newCall(request).execute().use { checkNotInMainThread() if (it.isSuccessful) { @@ -132,8 +137,8 @@ private val UNICODE_BOMS = "ffff0000".decodeHex(), ) -private fun BufferedSource.readBomAsCharset(): Charset? { - return when (select(UNICODE_BOMS)) { +private fun BufferedSource.readBomAsCharset(): Charset? = + when (select(UNICODE_BOMS)) { 0 -> Charsets.UTF_8 1 -> Charsets.UTF_16BE 2 -> Charsets.UTF_16LE @@ -142,7 +147,6 @@ private fun BufferedSource.readBomAsCharset(): Charset? { -1 -> null else -> throw AssertionError() } -} private val RE_CONTENT_TYPE_CHARSET = Regex("""charset=([^;]+)""") @@ -158,7 +162,8 @@ private fun detectCharset(bodyBytes: ByteArray): Charset { } } if (meta.attr(ATTRIBUTE_VALUE_HTTP_EQUIV).lowercase() == "content-type") { - RE_CONTENT_TYPE_CHARSET.find(meta.attr(CONTENT)) + RE_CONTENT_TYPE_CHARSET + .find(meta.attr(CONTENT)) ?.let { runCatching { Charset.forName(it.groupValues[1]) }.getOrNull() }?.let { diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relays/EOSE.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relays/EOSE.kt index 83f2e9729..bb3693bd9 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relays/EOSE.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relays/EOSE.kt @@ -23,7 +23,9 @@ package com.vitorpamplona.amethyst.service.relays import com.vitorpamplona.amethyst.model.User import com.vitorpamplona.ammolite.relays.EOSETime -class EOSERelayList(var relayList: Map = emptyMap()) { +class EOSERelayList( + var relayList: Map = emptyMap(), +) { fun addOrUpdate( relayUrl: String, time: Long, @@ -37,7 +39,9 @@ class EOSERelayList(var relayList: Map = emptyMap()) { } } -class EOSEFollowList(var followList: Map = emptyMap()) { +class EOSEFollowList( + var followList: Map = emptyMap(), +) { fun addOrUpdate( listCode: String, relayUrl: String, @@ -54,7 +58,9 @@ class EOSEFollowList(var followList: Map = emptyMap()) { } } -class EOSEAccount(var users: Map = emptyMap()) { +class EOSEAccount( + var users: Map = emptyMap(), +) { fun addOrUpdate( user: User, listCode: String, diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/tts/TextToSpeechHelper.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/tts/TextToSpeechHelper.kt index 26de2fed8..351267a70 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/tts/TextToSpeechHelper.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/tts/TextToSpeechHelper.kt @@ -28,150 +28,152 @@ import androidx.lifecycle.LifecycleOwner import java.lang.ref.WeakReference import java.util.Locale -class TextToSpeechHelper private constructor(private val context: WeakReference) : - LifecycleEventObserver { - private val appContext - get() = context.get()!!.applicationContext +class TextToSpeechHelper private constructor( + private val context: WeakReference, +) : LifecycleEventObserver { + private val appContext + get() = context.get()!!.applicationContext - private var message: String? = null + private var message: String? = null - private var ttsEngine: TextToSpeechEngine? = null + private var ttsEngine: TextToSpeechEngine? = null - private var onStart: (() -> Unit)? = null + private var onStart: (() -> Unit)? = null - private var onDoneListener: (() -> Unit)? = null + private var onDoneListener: (() -> Unit)? = null - private var onErrorListener: ((String) -> Unit)? = null + private var onErrorListener: ((String) -> Unit)? = null - private var onHighlightListener: ((Pair) -> Unit)? = null + private var onHighlightListener: ((Pair) -> Unit)? = null - private var customActionForDestroy: (() -> Unit)? = null + private var customActionForDestroy: (() -> Unit)? = null - init { - Log.d("Init", "Init TTS") + init { + Log.d("Init", "Init TTS") + initTTS() + } + + fun registerLifecycle(owner: LifecycleOwner): TextToSpeechHelper { + owner.lifecycle.addObserver(this) + return this + } + + private fun initTTS() = + context.get()?.run { + ttsEngine = + TextToSpeechEngine + .getInstance() + .setOnCompletionListener { onDoneListener?.invoke() } + .setOnErrorListener { onErrorListener?.invoke(it) } + .setOnStartListener { onStart?.invoke() } + } + + fun speak(message: String): TextToSpeechHelper { + if (ttsEngine == null) { initTTS() } + this.message = message - fun registerLifecycle(owner: LifecycleOwner): TextToSpeechHelper { - owner.lifecycle.addObserver(this) - return this + ttsEngine?.initTTS( + appContext, + message, + ) + return this + } + + /** + * This method will highlight the text in the textView + * + * @exception Exception("Message can't be null for highlighting !! Call speak() first") + */ + fun highlight(): TextToSpeechHelper { + if (message == null) { + throw Exception("Message can't be null for highlighting !! Call speak() first") } + ttsEngine?.setHighlightedMessage(message!!) + ttsEngine?.setOnHighlightListener { i, i2 -> onHighlightListener?.invoke(Pair(i, i2)) } + return this + } - private fun initTTS() = - context.get()?.run { - ttsEngine = - TextToSpeechEngine.getInstance() - .setOnCompletionListener { onDoneListener?.invoke() } - .setOnErrorListener { onErrorListener?.invoke(it) } - .setOnStartListener { onStart?.invoke() } - } + fun removeHighlight(): TextToSpeechHelper { + message = null + onHighlightListener = null + return this + } - fun speak(message: String): TextToSpeechHelper { - if (ttsEngine == null) { - initTTS() - } - this.message = message + fun destroy(action: (() -> Unit) = {}) { + ttsEngine?.destroy() + ttsEngine = null + action.invoke() + instance = null + } - ttsEngine?.initTTS( - appContext, - message, - ) - return this - } + fun onStart(onStartListener: () -> Unit): TextToSpeechHelper { + this.onStart = onStartListener + return this + } - /** - * This method will highlight the text in the textView - * - * @exception Exception("Message can't be null for highlighting !! Call speak() first") - */ - fun highlight(): TextToSpeechHelper { - if (message == null) { - throw Exception("Message can't be null for highlighting !! Call speak() first") - } - ttsEngine?.setHighlightedMessage(message!!) - ttsEngine?.setOnHighlightListener { i, i2 -> onHighlightListener?.invoke(Pair(i, i2)) } - return this - } + fun onDone(onCompleteListener: () -> Unit): TextToSpeechHelper { + this.onDoneListener = onCompleteListener + return this + } - fun removeHighlight(): TextToSpeechHelper { - message = null - onHighlightListener = null - return this - } + fun onError(onErrorListener: (String) -> Unit): TextToSpeechHelper { + this.onErrorListener = onErrorListener + return this + } - fun destroy(action: (() -> Unit) = {}) { - ttsEngine?.destroy() - ttsEngine = null - action.invoke() - instance = null - } + fun onHighlight(onHighlightListener: (Pair) -> Unit): TextToSpeechHelper { + this.onHighlightListener = onHighlightListener + return this + } - fun onStart(onStartListener: () -> Unit): TextToSpeechHelper { - this.onStart = onStartListener - return this - } + fun setCustomActionForDestroy(action: () -> Unit): TextToSpeechHelper { + customActionForDestroy = action + return this + } - fun onDone(onCompleteListener: () -> Unit): TextToSpeechHelper { - this.onDoneListener = onCompleteListener - return this - } + fun setLanguage(locale: Locale): TextToSpeechHelper { + ttsEngine?.setLanguage(locale) + return this + } - fun onError(onErrorListener: (String) -> Unit): TextToSpeechHelper { - this.onErrorListener = onErrorListener - return this - } + fun setPitchAndSpeed( + pitch: Float = DEF_SPEECH_AND_PITCH, + speed: Float = DEF_SPEECH_AND_PITCH, + ): TextToSpeechHelper { + ttsEngine?.setPitchAndSpeed(pitch, speed) + return this + } - fun onHighlight(onHighlightListener: (Pair) -> Unit): TextToSpeechHelper { - this.onHighlightListener = onHighlightListener - return this - } + fun resetPitchAndSpeed(): TextToSpeechHelper { + ttsEngine?.resetPitchAndSpeed() + return this + } - fun setCustomActionForDestroy(action: () -> Unit): TextToSpeechHelper { - customActionForDestroy = action - return this - } + companion object { + private var instance: TextToSpeechHelper? = null - fun setLanguage(locale: Locale): TextToSpeechHelper { - ttsEngine?.setLanguage(locale) - return this - } - - fun setPitchAndSpeed( - pitch: Float = DEF_SPEECH_AND_PITCH, - speed: Float = DEF_SPEECH_AND_PITCH, - ): TextToSpeechHelper { - ttsEngine?.setPitchAndSpeed(pitch, speed) - return this - } - - fun resetPitchAndSpeed(): TextToSpeechHelper { - ttsEngine?.resetPitchAndSpeed() - return this - } - - companion object { - private var instance: TextToSpeechHelper? = null - - fun getInstance(context: Context): TextToSpeechHelper { - synchronized(TextToSpeechHelper::class.java) { - if (instance == null) { - instance = TextToSpeechHelper(WeakReference(context)) - } - return instance!! + fun getInstance(context: Context): TextToSpeechHelper { + synchronized(TextToSpeechHelper::class.java) { + if (instance == null) { + instance = TextToSpeechHelper(WeakReference(context)) } - } - } - - override fun onStateChanged( - source: LifecycleOwner, - event: Lifecycle.Event, - ) { - if ( - event == Lifecycle.Event.ON_DESTROY || - event == Lifecycle.Event.ON_STOP || - event == Lifecycle.Event.ON_PAUSE - ) { - destroy { customActionForDestroy?.invoke() } + return instance!! } } } + + override fun onStateChanged( + source: LifecycleOwner, + event: Lifecycle.Event, + ) { + if ( + event == Lifecycle.Event.ON_DESTROY || + event == Lifecycle.Event.ON_STOP || + event == Lifecycle.Event.ON_PAUSE + ) { + destroy { customActionForDestroy?.invoke() } + } + } +} diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/ImageSaver.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/ImageSaver.kt index d044d249e..63dcd3a23 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/ImageSaver.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/ImageSaver.kt @@ -88,7 +88,8 @@ object ImageSaver { val client = HttpClientManager.getHttpClient() val request = - Request.Builder() + Request + .Builder() .header("User-Agent", "Amethyst/${BuildConfig.VERSION_NAME}") .get() .url(url) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/UrlUserTagTransformation.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/UrlUserTagTransformation.kt index 7c2c34965..265f32891 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/UrlUserTagTransformation.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/UrlUserTagTransformation.kt @@ -35,12 +35,15 @@ import com.vitorpamplona.quartz.encoders.decodePublicKey import com.vitorpamplona.quartz.encoders.toHexKey import kotlin.coroutines.cancellation.CancellationException -data class RangesChanges(val original: TextRange, val modified: TextRange) +data class RangesChanges( + val original: TextRange, + val modified: TextRange, +) -class UrlUserTagTransformation(val color: Color) : VisualTransformation { - override fun filter(text: AnnotatedString): TransformedText { - return buildAnnotatedStringWithUrlHighlighting(text, color) - } +class UrlUserTagTransformation( + val color: Color, +) : VisualTransformation { + override fun filter(text: AnnotatedString): TransformedText = buildAnnotatedStringWithUrlHighlighting(text, color) } fun buildAnnotatedStringWithUrlHighlighting( diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/relays/BasicRelaySetupInfoModel.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/relays/BasicRelaySetupInfoModel.kt index 9eea0faa9..a4f64e1b5 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/relays/BasicRelaySetupInfoModel.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/relays/BasicRelaySetupInfoModel.kt @@ -78,12 +78,15 @@ abstract class BasicRelaySetupInfoModel : ViewModel() { _relays.update { val relayList = getRelayList() ?: emptyList() - relayList.map { relayUrl -> - BasicRelaySetupInfo( - RelayUrlFormatter.normalize(relayUrl), - RelayStats.get(relayUrl), - ) - }.distinctBy { it.url }.sortedBy { it.relayStat.receivedBytes }.reversed() + relayList + .map { relayUrl -> + BasicRelaySetupInfo( + RelayUrlFormatter.normalize(relayUrl), + RelayStats.get(relayUrl), + ) + }.distinctBy { it.url } + .sortedBy { it.relayStat.receivedBytes } + .reversed() } } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/relays/DMRelayListViewModel.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/relays/DMRelayListViewModel.kt index 27c0534ec..5dff04edc 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/relays/DMRelayListViewModel.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/relays/DMRelayListViewModel.kt @@ -21,9 +21,7 @@ package com.vitorpamplona.amethyst.ui.actions.relays class DMRelayListViewModel : BasicRelaySetupInfoModel() { - override fun getRelayList(): List? { - return account.getDMRelayList()?.relays() - } + override fun getRelayList(): List? = account.getDMRelayList()?.relays() override fun saveRelayList(urlList: List) { account.saveDMRelayList(urlList) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/relays/LocalRelayListViewModel.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/relays/LocalRelayListViewModel.kt index 6c5359b36..803eb87b4 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/relays/LocalRelayListViewModel.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/relays/LocalRelayListViewModel.kt @@ -21,9 +21,7 @@ package com.vitorpamplona.amethyst.ui.actions.relays class LocalRelayListViewModel : BasicRelaySetupInfoModel() { - override fun getRelayList(): List? { - return account.localRelayServers.toList() - } + override fun getRelayList(): List? = account.localRelayServers.toList() override fun saveRelayList(urlList: List) { account.updateLocalRelayServers(urlList.toSet()) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/relays/Nip65RelayListViewModel.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/relays/Nip65RelayListViewModel.kt index c41ce2c1d..2fdfe7237 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/relays/Nip65RelayListViewModel.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/relays/Nip65RelayListViewModel.kt @@ -105,23 +105,29 @@ class Nip65RelayListViewModel : ViewModel() { _homeRelays.update { val relayList = account.getNIP65RelayList()?.writeRelays() ?: emptyList() - relayList.map { relayUrl -> - BasicRelaySetupInfo( - RelayUrlFormatter.normalize(relayUrl), - RelayStats.get(relayUrl), - ) - }.distinctBy { it.url }.sortedBy { it.relayStat.receivedBytes }.reversed() + relayList + .map { relayUrl -> + BasicRelaySetupInfo( + RelayUrlFormatter.normalize(relayUrl), + RelayStats.get(relayUrl), + ) + }.distinctBy { it.url } + .sortedBy { it.relayStat.receivedBytes } + .reversed() } _notificationRelays.update { val relayList = account.getNIP65RelayList()?.readRelays() ?: emptyList() - relayList.map { relayUrl -> - BasicRelaySetupInfo( - RelayUrlFormatter.normalize(relayUrl), - RelayStats.get(relayUrl), - ) - }.distinctBy { it.url }.sortedBy { it.relayStat.receivedBytes }.reversed() + relayList + .map { relayUrl -> + BasicRelaySetupInfo( + RelayUrlFormatter.normalize(relayUrl), + RelayStats.get(relayUrl), + ) + }.distinctBy { it.url } + .sortedBy { it.relayStat.receivedBytes } + .reversed() } } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/relays/PrivateOutboxRelayListViewModel.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/relays/PrivateOutboxRelayListViewModel.kt index 8d5ce7837..92f2c9137 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/relays/PrivateOutboxRelayListViewModel.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/relays/PrivateOutboxRelayListViewModel.kt @@ -21,9 +21,7 @@ package com.vitorpamplona.amethyst.ui.actions.relays class PrivateOutboxRelayListViewModel : BasicRelaySetupInfoModel() { - override fun getRelayList(): List? { - return account.getPrivateOutboxRelayList()?.relays() - } + override fun getRelayList(): List? = account.getPrivateOutboxRelayList()?.relays() override fun saveRelayList(urlList: List) { account.savePrivateOutboxRelayList(urlList) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/relays/SearchRelayListViewModel.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/relays/SearchRelayListViewModel.kt index da89cd245..cd1786216 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/relays/SearchRelayListViewModel.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/relays/SearchRelayListViewModel.kt @@ -21,9 +21,7 @@ package com.vitorpamplona.amethyst.ui.actions.relays class SearchRelayListViewModel : BasicRelaySetupInfoModel() { - override fun getRelayList(): List? { - return account.getSearchRelayList()?.relays() - } + override fun getRelayList(): List? = account.getSearchRelayList()?.relays() override fun saveRelayList(urlList: List) { account.saveSearchRelayList(urlList) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/components/AudioWaveformReadOnly.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/components/AudioWaveformReadOnly.kt index 7002a976e..ac1006b0f 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/components/AudioWaveformReadOnly.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/components/AudioWaveformReadOnly.kt @@ -101,11 +101,11 @@ fun AudioWaveformReadOnly( minHeight = MIN_SPIKE_HEIGHT, maxHeight = canvasSize.height.coerceAtLeast(MIN_SPIKE_HEIGHT), ) - } - .map { animateFloatAsState(it, spikeAnimationSpec).value } + }.map { animateFloatAsState(it, spikeAnimationSpec).value } Canvas( modifier = - Modifier.fillMaxWidth() + Modifier + .fillMaxWidth() .requiredHeight(48.dp) .graphicsLayer(alpha = DEFAULT_GRAPHICS_LAYER_ALPHA) .then(modifier), @@ -161,8 +161,7 @@ private fun List.toDrawableAmplitudes( AmplitudeType.Avg -> data.average() AmplitudeType.Max -> data.max() AmplitudeType.Min -> data.min() - } - .toFloat() + }.toFloat() .coerceIn(minHeight, maxHeight) } return when { @@ -198,9 +197,7 @@ internal fun Iterable.chunkToSize( internal fun Iterable.normalize( min: Float, max: Float, -): List { - return map { (max - min) * ((it - min()) / (max() - min())) + min } -} +): List = map { (max - min) * ((it - min()) / (max() - min())) + min } private fun Int.safeDiv(value: Int): Float { return if (value == 0) return 0F else this / value.toFloat() diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/components/GenericLoadable.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/components/GenericLoadable.kt index 6817b873f..f2eb7d9e1 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/components/GenericLoadable.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/components/GenericLoadable.kt @@ -26,9 +26,13 @@ import androidx.compose.runtime.Immutable sealed class GenericLoadable { @Immutable class Loading : GenericLoadable() - @Immutable class Loaded(val loaded: T) : GenericLoadable() + @Immutable class Loaded( + val loaded: T, + ) : GenericLoadable() @Immutable class Empty : GenericLoadable() - @Immutable class Error(val errorMessage: String) : GenericLoadable() + @Immutable class Error( + val errorMessage: String, + ) : GenericLoadable() } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/components/SplitItem.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/components/SplitItem.kt index 887ae463f..8998cd0a4 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/components/SplitItem.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/components/SplitItem.kt @@ -25,12 +25,14 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue import kotlin.math.abs -class SplitItem(val key: T) { +class SplitItem( + val key: T, +) { // 0 to 1 var percentage by mutableStateOf(0f) } -class Split() { +class Split { var items: List> by mutableStateOf(emptyList()) fun addItem( diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/components/UrlPreviewState.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/components/UrlPreviewState.kt index beef6d771..533acdef2 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/components/UrlPreviewState.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/components/UrlPreviewState.kt @@ -27,9 +27,13 @@ import com.vitorpamplona.amethyst.service.previews.UrlInfoItem sealed class UrlPreviewState { @Immutable object Loading : UrlPreviewState() - @Immutable class Loaded(val previewInfo: UrlInfoItem) : UrlPreviewState() + @Immutable class Loaded( + val previewInfo: UrlInfoItem, + ) : UrlPreviewState() @Immutable object Empty : UrlPreviewState() - @Immutable class Error(val errorMessage: String) : UrlPreviewState() + @Immutable class Error( + val errorMessage: String, + ) : UrlPreviewState() } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/BookmarkPrivateFeedFilter.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/BookmarkPrivateFeedFilter.kt index 107c6cb95..3cae7c2e0 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/BookmarkPrivateFeedFilter.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/BookmarkPrivateFeedFilter.kt @@ -24,10 +24,10 @@ import com.vitorpamplona.amethyst.model.Account import com.vitorpamplona.amethyst.model.LocalCache import com.vitorpamplona.amethyst.model.Note -class BookmarkPrivateFeedFilter(val account: Account) : FeedFilter() { - override fun feedKey(): String { - return account.userProfile().latestBookmarkList?.id ?: "" - } +class BookmarkPrivateFeedFilter( + val account: Account, +) : FeedFilter() { + override fun feedKey(): String = account.userProfile().latestBookmarkList?.id ?: "" override fun feed(): List { val bookmarks = account.userProfile().latestBookmarkList diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/BookmarkPublicFeedFilter.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/BookmarkPublicFeedFilter.kt index 37832131a..032c84296 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/BookmarkPublicFeedFilter.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/BookmarkPublicFeedFilter.kt @@ -24,10 +24,10 @@ import com.vitorpamplona.amethyst.model.Account import com.vitorpamplona.amethyst.model.LocalCache import com.vitorpamplona.amethyst.model.Note -class BookmarkPublicFeedFilter(val account: Account) : FeedFilter() { - override fun feedKey(): String { - return account.userProfile().latestBookmarkList?.id ?: "" - } +class BookmarkPublicFeedFilter( + val account: Account, +) : FeedFilter() { + override fun feedKey(): String = account.userProfile().latestBookmarkList?.id ?: "" override fun feed(): List { val bookmarks = account.userProfile().latestBookmarkList diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/ChannelFeedFilter.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/ChannelFeedFilter.kt index 87e113353..09cd20188 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/ChannelFeedFilter.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/ChannelFeedFilter.kt @@ -24,27 +24,24 @@ import com.vitorpamplona.amethyst.model.Account import com.vitorpamplona.amethyst.model.Channel import com.vitorpamplona.amethyst.model.Note -class ChannelFeedFilter(val channel: Channel, val account: Account) : AdditiveFeedFilter() { - override fun feedKey(): String { - return channel.idHex - } +class ChannelFeedFilter( + val channel: Channel, + val account: Account, +) : AdditiveFeedFilter() { + override fun feedKey(): String = channel.idHex // returns the last Note of each user. - override fun feed(): List { - return sort( + override fun feed(): List = + sort( channel.notes.filterIntoSet { key, it -> account.isAcceptable(it) }, ) - } - override fun applyFilter(collection: Set): Set { - return collection + override fun applyFilter(collection: Set): Set = + collection .filter { channel.notes.containsKey(it.idHex) && account.isAcceptable(it) } .toSet() - } - override fun sort(collection: Set): List { - return collection.sortedWith(DefaultFeedOrder) - } + override fun sort(collection: Set): List = collection.sortedWith(DefaultFeedOrder) } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/ChatroomFeedFilter.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/ChatroomFeedFilter.kt index 8cbd4b1fd..234da7305 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/ChatroomFeedFilter.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/ChatroomFeedFilter.kt @@ -24,12 +24,12 @@ import com.vitorpamplona.amethyst.model.Account import com.vitorpamplona.amethyst.model.Note import com.vitorpamplona.quartz.events.ChatroomKey -class ChatroomFeedFilter(val withUser: ChatroomKey, val account: Account) : - AdditiveFeedFilter() { +class ChatroomFeedFilter( + val withUser: ChatroomKey, + val account: Account, +) : AdditiveFeedFilter() { // returns the last Note of each user. - override fun feedKey(): String { - return withUser.hashCode().toString() - } + override fun feedKey(): String = withUser.hashCode().toString() override fun feed(): List { val messages = account.userProfile().privateChatrooms[withUser] ?: return emptyList() @@ -46,7 +46,5 @@ class ChatroomFeedFilter(val withUser: ChatroomKey, val account: Account) : return collection.filter { it in messages.roomMessages && account.isAcceptable(it) }.toSet() } - override fun sort(collection: Set): List { - return collection.sortedWith(DefaultFeedOrder) - } + override fun sort(collection: Set): List = collection.sortedWith(DefaultFeedOrder) } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/ChatroomListKnownFeedFilter.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/ChatroomListKnownFeedFilter.kt index 7a7846a41..70e0074c7 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/ChatroomListKnownFeedFilter.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/ChatroomListKnownFeedFilter.kt @@ -28,10 +28,10 @@ import com.vitorpamplona.quartz.events.ChannelMessageEvent import com.vitorpamplona.quartz.events.ChatroomKey import com.vitorpamplona.quartz.events.ChatroomKeyable -class ChatroomListKnownFeedFilter(val account: Account) : AdditiveFeedFilter() { - override fun feedKey(): String { - return account.userProfile().pubkeyHex - } +class ChatroomListKnownFeedFilter( + val account: Account, +) : AdditiveFeedFilter() { + override fun feedKey(): String = account.userProfile().pubkeyHex // returns the last Note of each user. override fun feed(): List { @@ -56,7 +56,8 @@ class ChatroomListKnownFeedFilter(val account: Account) : AdditiveFeedFilter - it.notes.filter { key, it -> account.isAcceptable(it) && it.event != null } + it.notes + .filter { key, it -> account.isAcceptable(it) && it.event != null } .sortedWith(DefaultFeedOrder) .firstOrNull() } @@ -136,7 +137,11 @@ class ChatroomListKnownFeedFilter(val account: Account) : AdditiveFeedFilter { val followingChannels = - account.userProfile().latestContactList?.taggedEvents()?.toSet() ?: emptySet() + account + .userProfile() + .latestContactList + ?.taggedEvents() + ?.toSet() ?: emptySet() val newRelevantPublicMessages = mutableMapOf() newItems .filter { it.event is ChannelMessageEvent } @@ -177,7 +182,8 @@ class ChatroomListKnownFeedFilter(val account: Account) : AdditiveFeedFilter): List { - return collection.sortedWith(DefaultFeedOrder) - } + override fun sort(collection: Set): List = collection.sortedWith(DefaultFeedOrder) } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/ChatroomListNewFeedFilter.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/ChatroomListNewFeedFilter.kt index 87cc2c66a..1e6589e95 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/ChatroomListNewFeedFilter.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/ChatroomListNewFeedFilter.kt @@ -27,10 +27,10 @@ import com.vitorpamplona.quartz.events.ChatroomKey import com.vitorpamplona.quartz.events.ChatroomKeyable import com.vitorpamplona.quartz.events.PrivateDmEvent -class ChatroomListNewFeedFilter(val account: Account) : AdditiveFeedFilter() { - override fun feedKey(): String { - return account.userProfile().pubkeyHex - } +class ChatroomListNewFeedFilter( + val account: Account, +) : AdditiveFeedFilter() { + override fun feedKey(): String = account.userProfile().pubkeyHex // returns the last Note of each user. override fun feed(): List { @@ -137,7 +137,5 @@ class ChatroomListNewFeedFilter(val account: Account) : AdditiveFeedFilter return newRelevantPrivateMessages } - override fun sort(collection: Set): List { - return collection.sortedWith(DefaultFeedOrder) - } + override fun sort(collection: Set): List = collection.sortedWith(DefaultFeedOrder) } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/CommunityFeedFilter.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/CommunityFeedFilter.kt index 4a30b7d77..1b3f628bf 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/CommunityFeedFilter.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/CommunityFeedFilter.kt @@ -27,10 +27,11 @@ import com.vitorpamplona.amethyst.model.Note import com.vitorpamplona.quartz.encoders.HexKey import com.vitorpamplona.quartz.events.CommunityPostApprovalEvent -class CommunityFeedFilter(val note: AddressableNote, val account: Account) : AdditiveFeedFilter() { - override fun feedKey(): String { - return account.userProfile().pubkeyHex + "-" + note.idHex - } +class CommunityFeedFilter( + val note: AddressableNote, + val account: Account, +) : AdditiveFeedFilter() { + override fun feedKey(): String = account.userProfile().pubkeyHex + "-" + note.idHex override fun feed(): List { val myPubKey = account.userProfile().pubkeyHex @@ -42,23 +43,23 @@ class CommunityFeedFilter(val note: AddressableNote, val account: Account) : Add return sort(result) } - override fun applyFilter(collection: Set): Set { - return innerApplyFilter(collection) - } + override fun applyFilter(collection: Set): Set = innerApplyFilter(collection) private fun innerApplyFilter(collection: Collection): Set { val myPubKey = account.userProfile().pubkeyHex - return collection.mapNotNull { - filterMap(it, myPubKey) - }.flatten().toSet() + return collection + .mapNotNull { + filterMap(it, myPubKey) + }.flatten() + .toSet() } private fun filterMap( note: Note, myPubKey: HexKey, - ): List? { - return if ( + ): List? = + if ( // Only Approvals note.event is CommunityPostApprovalEvent && // Of the given community @@ -74,9 +75,6 @@ class CommunityFeedFilter(val note: AddressableNote, val account: Account) : Add } else { null } - } - override fun sort(collection: Set): List { - return collection.sortedWith(DefaultFeedOrder) - } + override fun sort(collection: Set): List = collection.sortedWith(DefaultFeedOrder) } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/DiscoverChatFeedFilter.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/DiscoverChatFeedFilter.kt index 0eabe3422..92a4900d1 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/DiscoverChatFeedFilter.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/DiscoverChatFeedFilter.kt @@ -29,17 +29,16 @@ import com.vitorpamplona.quartz.events.IsInPublicChatChannel import com.vitorpamplona.quartz.events.MuteListEvent import com.vitorpamplona.quartz.events.PeopleListEvent -open class DiscoverChatFeedFilter(val account: Account) : AdditiveFeedFilter() { - override fun feedKey(): String { - return account.userProfile().pubkeyHex + "-" + account.defaultDiscoveryFollowList.value - } +open class DiscoverChatFeedFilter( + val account: Account, +) : AdditiveFeedFilter() { + override fun feedKey(): String = account.userProfile().pubkeyHex + "-" + account.defaultDiscoveryFollowList.value - override fun showHiddenKey(): Boolean { - return account.defaultDiscoveryFollowList.value == + override fun showHiddenKey(): Boolean = + account.defaultDiscoveryFollowList.value == PeopleListEvent.blockListFor(account.userProfile().pubkeyHex) || account.defaultDiscoveryFollowList.value == MuteListEvent.blockListFor(account.userProfile().pubkeyHex) - } override fun feed(): List { val params = buildFilterParams(account) @@ -63,18 +62,15 @@ open class DiscoverChatFeedFilter(val account: Account) : AdditiveFeedFilter): Set { - return innerApplyFilter(collection) - } + override fun applyFilter(collection: Set): Set = innerApplyFilter(collection) - fun buildFilterParams(account: Account): FilterByListParams { - return FilterByListParams.create( + fun buildFilterParams(account: Account): FilterByListParams = + FilterByListParams.create( userHex = account.userProfile().pubkeyHex, selectedListName = account.defaultDiscoveryFollowList.value, followLists = account.liveDiscoveryFollowLists.value, hiddenUsers = account.flowHiddenUsers.value, ) - } protected open fun innerApplyFilter(collection: Collection): Set { val params = buildFilterParams(account) @@ -120,7 +116,6 @@ open class DiscoverChatFeedFilter(val account: Account) : AdditiveFeedFilter() { - override fun feedKey(): String { - return account.userProfile().pubkeyHex + "-" + account.defaultDiscoveryFollowList.value - } +open class DiscoverCommunityFeedFilter( + val account: Account, +) : AdditiveFeedFilter() { + override fun feedKey(): String = account.userProfile().pubkeyHex + "-" + account.defaultDiscoveryFollowList.value - override fun showHiddenKey(): Boolean { - return account.defaultDiscoveryFollowList.value == + override fun showHiddenKey(): Boolean = + account.defaultDiscoveryFollowList.value == PeopleListEvent.blockListFor(account.userProfile().pubkeyHex) || account.defaultDiscoveryFollowList.value == MuteListEvent.blockListFor(account.userProfile().pubkeyHex) - } override fun feed(): List { val filterParams = @@ -67,9 +66,7 @@ open class DiscoverCommunityFeedFilter(val account: Account) : AdditiveFeedFilte return sort(notes) } - override fun applyFilter(collection: Set): Set { - return innerApplyFilter(collection) - } + override fun applyFilter(collection: Set): Set = innerApplyFilter(collection) protected open fun innerApplyFilter(collection: Collection): Set { // here, we need to look for CommunityDefinition in new collection AND new CommunityDefinition from Post Approvals @@ -81,28 +78,30 @@ open class DiscoverCommunityFeedFilter(val account: Account) : AdditiveFeedFilte hiddenUsers = account.flowHiddenUsers.value, ) - return collection.mapNotNull { note -> - // note event here will never be null - val noteEvent = note.event - if (noteEvent is CommunityDefinitionEvent && filterParams.match(noteEvent)) { - listOf(note) - } else if (noteEvent is CommunityPostApprovalEvent) { - noteEvent.communities().mapNotNull { - val definitionNote = LocalCache.getOrCreateAddressableNote(it) - val definitionEvent = definitionNote.event + return collection + .mapNotNull { note -> + // note event here will never be null + val noteEvent = note.event + if (noteEvent is CommunityDefinitionEvent && filterParams.match(noteEvent)) { + listOf(note) + } else if (noteEvent is CommunityPostApprovalEvent) { + noteEvent.communities().mapNotNull { + val definitionNote = LocalCache.getOrCreateAddressableNote(it) + val definitionEvent = definitionNote.event - if (definitionEvent == null && shouldInclude(it, filterParams)) { - definitionNote - } else if (definitionEvent is CommunityDefinitionEvent && filterParams.match(definitionEvent)) { - definitionNote - } else { - null + if (definitionEvent == null && shouldInclude(it, filterParams)) { + definitionNote + } else if (definitionEvent is CommunityDefinitionEvent && filterParams.match(definitionEvent)) { + definitionNote + } else { + null + } } + } else { + null } - } else { - null - } - }.flatten().toSet() + }.flatten() + .toSet() } private fun shouldInclude( @@ -123,7 +122,6 @@ open class DiscoverCommunityFeedFilter(val account: Account) : AdditiveFeedFilte { it.createdAt() }, { it.idHex }, ), - ) - .reversed() + ).reversed() } } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/DiscoverLiveFeedFilter.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/DiscoverLiveFeedFilter.kt index ebce2500a..abb993745 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/DiscoverLiveFeedFilter.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/DiscoverLiveFeedFilter.kt @@ -34,18 +34,13 @@ import com.vitorpamplona.quartz.events.PeopleListEvent open class DiscoverLiveFeedFilter( val account: Account, ) : AdditiveFeedFilter() { - override fun feedKey(): String { - return account.userProfile().pubkeyHex + "-" + followList() - } + override fun feedKey(): String = account.userProfile().pubkeyHex + "-" + followList() - open fun followList(): String { - return account.defaultDiscoveryFollowList.value - } + open fun followList(): String = account.defaultDiscoveryFollowList.value - override fun showHiddenKey(): Boolean { - return followList() == PeopleListEvent.blockListFor(account.userProfile().pubkeyHex) || + override fun showHiddenKey(): Boolean = + followList() == PeopleListEvent.blockListFor(account.userProfile().pubkeyHex) || followList() == MuteListEvent.blockListFor(account.userProfile().pubkeyHex) - } override fun feed(): List { val allChannelNotes = LocalCache.channels.mapNotNull { _, channel -> LocalCache.getNoteIfExists(channel.idHex) } @@ -56,9 +51,7 @@ open class DiscoverLiveFeedFilter( return sort(notes) } - override fun applyFilter(collection: Set): Set { - return innerApplyFilter(collection) - } + override fun applyFilter(collection: Set): Set = innerApplyFilter(collection) protected open fun innerApplyFilter(collection: Collection): Set { val filterParams = @@ -92,16 +85,14 @@ open class DiscoverLiveFeedFilter( { (it.event as? LiveActivitiesEvent)?.starts() ?: it.createdAt() }, { it.idHex }, ), - ) - .reversed() + ).reversed() } - fun convertStatusToOrder(status: String?): Int { - return when (status) { + fun convertStatusToOrder(status: String?): Int = + when (status) { STATUS_LIVE -> 2 STATUS_PLANNED -> 1 STATUS_ENDED -> 0 else -> 0 } - } } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/DiscoverMarketplaceFeedFilter.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/DiscoverMarketplaceFeedFilter.kt index 0be87e5b8..8d96f4b83 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/DiscoverMarketplaceFeedFilter.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/DiscoverMarketplaceFeedFilter.kt @@ -30,18 +30,13 @@ import com.vitorpamplona.quartz.events.PeopleListEvent open class DiscoverMarketplaceFeedFilter( val account: Account, ) : AdditiveFeedFilter() { - override fun feedKey(): String { - return account.userProfile().pubkeyHex + "-" + followList() - } + override fun feedKey(): String = account.userProfile().pubkeyHex + "-" + followList() - open fun followList(): String { - return account.defaultDiscoveryFollowList.value - } + open fun followList(): String = account.defaultDiscoveryFollowList.value - override fun showHiddenKey(): Boolean { - return followList() == PeopleListEvent.blockListFor(account.userProfile().pubkeyHex) || + override fun showHiddenKey(): Boolean = + followList() == PeopleListEvent.blockListFor(account.userProfile().pubkeyHex) || followList() == MuteListEvent.blockListFor(account.userProfile().pubkeyHex) - } override fun feed(): List { val params = buildFilterParams(account) @@ -55,18 +50,15 @@ open class DiscoverMarketplaceFeedFilter( return sort(notes) } - override fun applyFilter(collection: Set): Set { - return innerApplyFilter(collection) - } + override fun applyFilter(collection: Set): Set = innerApplyFilter(collection) - fun buildFilterParams(account: Account): FilterByListParams { - return FilterByListParams.create( + fun buildFilterParams(account: Account): FilterByListParams = + FilterByListParams.create( account.userProfile().pubkeyHex, account.defaultDiscoveryFollowList.value, account.liveDiscoveryFollowLists.value, account.flowHiddenUsers.value, ) - } protected open fun innerApplyFilter(collection: Collection): Set { val params = buildFilterParams(account) @@ -77,7 +69,5 @@ open class DiscoverMarketplaceFeedFilter( } } - override fun sort(collection: Set): List { - return collection.sortedWith(compareBy({ it.createdAt() }, { it.idHex })).reversed() - } + override fun sort(collection: Set): List = collection.sortedWith(compareBy({ it.createdAt() }, { it.idHex })).reversed() } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/DiscoverNIP89FeedFilter.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/DiscoverNIP89FeedFilter.kt index d57288470..abb509d0f 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/DiscoverNIP89FeedFilter.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/DiscoverNIP89FeedFilter.kt @@ -34,18 +34,13 @@ open class DiscoverNIP89FeedFilter( val lastAnnounced = 90 * 24 * 60 * 60 // 90 Days ago // TODO better than announced would be last active, as this requires the DVM provider to regularly update the NIP89 announcement - override fun feedKey(): String { - return account.userProfile().pubkeyHex + "-" + followList() - } + override fun feedKey(): String = account.userProfile().pubkeyHex + "-" + followList() - open fun followList(): String { - return account.defaultDiscoveryFollowList.value - } + open fun followList(): String = account.defaultDiscoveryFollowList.value - override fun showHiddenKey(): Boolean { - return followList() == PeopleListEvent.blockListFor(account.userProfile().pubkeyHex) || + override fun showHiddenKey(): Boolean = + followList() == PeopleListEvent.blockListFor(account.userProfile().pubkeyHex) || followList() == MuteListEvent.blockListFor(account.userProfile().pubkeyHex) - } override fun feed(): List { val filterParams = buildFilterParams(account) @@ -58,18 +53,15 @@ open class DiscoverNIP89FeedFilter( return sort(notes) } - override fun applyFilter(collection: Set): Set { - return innerApplyFilter(collection) - } + override fun applyFilter(collection: Set): Set = innerApplyFilter(collection) - fun buildFilterParams(account: Account): FilterByListParams { - return FilterByListParams.create( + fun buildFilterParams(account: Account): FilterByListParams = + FilterByListParams.create( account.userProfile().pubkeyHex, account.defaultDiscoveryFollowList.value, account.liveDiscoveryFollowLists.value, account.flowHiddenUsers.value, ) - } fun acceptDVM(note: Note): Boolean { val noteEvent = note.event @@ -88,13 +80,10 @@ open class DiscoverNIP89FeedFilter( noteEvent.createdAt > TimeUtils.now() - lastAnnounced // && params.match(noteEvent) } - protected open fun innerApplyFilter(collection: Collection): Set { - return collection.filterTo(HashSet()) { + protected open fun innerApplyFilter(collection: Collection): Set = + collection.filterTo(HashSet()) { acceptDVM(it) } - } - override fun sort(collection: Set): List { - return collection.sortedWith(compareBy({ it.createdAt() }, { it.idHex })).reversed() - } + override fun sort(collection: Set): List = collection.sortedWith(compareBy({ it.createdAt() }, { it.idHex })).reversed() } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/DraftEventsFeedFilter.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/DraftEventsFeedFilter.kt index 883bc8df0..25bebe5d6 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/DraftEventsFeedFilter.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/DraftEventsFeedFilter.kt @@ -25,16 +25,15 @@ import com.vitorpamplona.amethyst.model.LocalCache import com.vitorpamplona.amethyst.model.Note import com.vitorpamplona.quartz.events.DraftEvent -class DraftEventsFeedFilter(val account: Account) : AdditiveFeedFilter() { - override fun feedKey(): String { - return account.userProfile().pubkeyHex - } +class DraftEventsFeedFilter( + val account: Account, +) : AdditiveFeedFilter() { + override fun feedKey(): String = account.userProfile().pubkeyHex - override fun applyFilter(collection: Set): Set { - return collection.filterTo(HashSet()) { + override fun applyFilter(collection: Set): Set = + collection.filterTo(HashSet()) { acceptableEvent(it) } - } override fun feed(): List { val drafts = @@ -50,7 +49,5 @@ class DraftEventsFeedFilter(val account: Account) : AdditiveFeedFilter() { return noteEvent is DraftEvent && noteEvent.pubKey == account.userProfile().pubkeyHex } - override fun sort(collection: Set): List { - return collection.sortedWith(DefaultFeedOrder) - } + override fun sort(collection: Set): List = collection.sortedWith(DefaultFeedOrder) } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/FilterByListParams.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/FilterByListParams.kt index dad30487f..80b5bd65b 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/FilterByListParams.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/FilterByListParams.kt @@ -91,13 +91,12 @@ class FilterByListParams( selectedListName: String, followLists: Account.LiveFollowLists?, hiddenUsers: Account.LiveHiddenUsers, - ): FilterByListParams { - return FilterByListParams( + ): FilterByListParams = + FilterByListParams( isGlobal = selectedListName == GLOBAL_FOLLOWS, isHiddenList = showHiddenKey(selectedListName, userHex), followLists = followLists, hiddenLists = hiddenUsers, ) - } } } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/GeoHashFeedFilter.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/GeoHashFeedFilter.kt index e2fa72fe6..f2cd9b72e 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/GeoHashFeedFilter.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/GeoHashFeedFilter.kt @@ -31,10 +31,11 @@ import com.vitorpamplona.quartz.events.PrivateDmEvent import com.vitorpamplona.quartz.events.TextNoteEvent import com.vitorpamplona.quartz.events.WikiNoteEvent -class GeoHashFeedFilter(val tag: String, val account: Account) : AdditiveFeedFilter() { - override fun feedKey(): String { - return account.userProfile().pubkeyHex + "-" + tag - } +class GeoHashFeedFilter( + val tag: String, + val account: Account, +) : AdditiveFeedFilter() { + override fun feedKey(): String = account.userProfile().pubkeyHex + "-" + tag override fun feed(): List { val notes = @@ -45,19 +46,15 @@ class GeoHashFeedFilter(val tag: String, val account: Account) : AdditiveFeedFil return sort(notes) } - override fun applyFilter(collection: Set): Set { - return innerApplyFilter(collection) - } + override fun applyFilter(collection: Set): Set = innerApplyFilter(collection) - private fun innerApplyFilter(collection: Collection): Set { - return collection.filterTo(HashSet()) { acceptableEvent(it, tag) } - } + private fun innerApplyFilter(collection: Collection): Set = collection.filterTo(HashSet()) { acceptableEvent(it, tag) } fun acceptableEvent( it: Note, geoTag: String, - ): Boolean { - return ( + ): Boolean = + ( it.event is TextNoteEvent || it.event is LongTextNoteEvent || it.event is WikiNoteEvent || @@ -66,9 +63,6 @@ class GeoHashFeedFilter(val tag: String, val account: Account) : AdditiveFeedFil it.event is PollNoteEvent || it.event is AudioHeaderEvent ) && it.event?.isTaggedGeoHash(geoTag) == true && account.isAcceptable(it) - } - override fun sort(collection: Set): List { - return collection.sortedWith(DefaultFeedOrder) - } + override fun sort(collection: Set): List = collection.sortedWith(DefaultFeedOrder) } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/HashtagFeedFilter.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/HashtagFeedFilter.kt index 7aeebbc81..0f5c7950e 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/HashtagFeedFilter.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/HashtagFeedFilter.kt @@ -33,10 +33,11 @@ import com.vitorpamplona.quartz.events.RepostEvent import com.vitorpamplona.quartz.events.TextNoteEvent import com.vitorpamplona.quartz.events.WikiNoteEvent -class HashtagFeedFilter(val tag: String, val account: Account) : AdditiveFeedFilter() { - override fun feedKey(): String { - return account.userProfile().pubkeyHex + "-" + tag - } +class HashtagFeedFilter( + val tag: String, + val account: Account, +) : AdditiveFeedFilter() { + override fun feedKey(): String = account.userProfile().pubkeyHex + "-" + tag override fun feed(): List { val notes = @@ -47,19 +48,15 @@ class HashtagFeedFilter(val tag: String, val account: Account) : AdditiveFeedFil return sort(notes) } - override fun applyFilter(collection: Set): Set { - return innerApplyFilter(collection) - } + override fun applyFilter(collection: Set): Set = innerApplyFilter(collection) - private fun innerApplyFilter(collection: Collection): Set { - return collection.filterTo(HashSet()) { acceptableEvent(it, tag) } - } + private fun innerApplyFilter(collection: Collection): Set = collection.filterTo(HashSet()) { acceptableEvent(it, tag) } fun acceptableEvent( it: Note, hashTag: String, - ): Boolean { - return ( + ): Boolean = + ( it.event is TextNoteEvent || it.event is RepostEvent || it.event is GenericRepostEvent || @@ -69,10 +66,9 @@ class HashtagFeedFilter(val tag: String, val account: Account) : AdditiveFeedFil it.event is PrivateDmEvent || it.event is PollNoteEvent || it.event is AudioHeaderEvent - ) && it.event?.isTaggedHash(hashTag) == true && account.isAcceptable(it) - } + ) && + it.event?.isTaggedHash(hashTag) == true && + account.isAcceptable(it) - override fun sort(collection: Set): List { - return collection.sortedWith(DefaultFeedOrder) - } + override fun sort(collection: Set): List = collection.sortedWith(DefaultFeedOrder) } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/HomeConversationsFeedFilter.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/HomeConversationsFeedFilter.kt index c5c2981fb..c4a46c40e 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/HomeConversationsFeedFilter.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/HomeConversationsFeedFilter.kt @@ -30,15 +30,14 @@ import com.vitorpamplona.quartz.events.PeopleListEvent import com.vitorpamplona.quartz.events.PollNoteEvent import com.vitorpamplona.quartz.events.TextNoteEvent -class HomeConversationsFeedFilter(val account: Account) : AdditiveFeedFilter() { - override fun feedKey(): String { - return account.userProfile().pubkeyHex + "-" + account.defaultHomeFollowList.value - } +class HomeConversationsFeedFilter( + val account: Account, +) : AdditiveFeedFilter() { + override fun feedKey(): String = account.userProfile().pubkeyHex + "-" + account.defaultHomeFollowList.value - override fun showHiddenKey(): Boolean { - return account.defaultHomeFollowList.value == PeopleListEvent.blockListFor(account.userProfile().pubkeyHex) || + override fun showHiddenKey(): Boolean = + account.defaultHomeFollowList.value == PeopleListEvent.blockListFor(account.userProfile().pubkeyHex) || account.defaultHomeFollowList.value == MuteListEvent.blockListFor(account.userProfile().pubkeyHex) - } override fun feed(): List { val filterParams = buildFilterParams(account) @@ -50,18 +49,15 @@ class HomeConversationsFeedFilter(val account: Account) : AdditiveFeedFilter): Set { - return innerApplyFilter(collection) - } + override fun applyFilter(collection: Set): Set = innerApplyFilter(collection) - fun buildFilterParams(account: Account): FilterByListParams { - return FilterByListParams.create( + fun buildFilterParams(account: Account): FilterByListParams = + FilterByListParams.create( userHex = account.userProfile().pubkeyHex, selectedListName = account.defaultHomeFollowList.value, followLists = account.liveHomeFollowLists.value, hiddenUsers = account.flowHiddenUsers.value, ) - } private fun innerApplyFilter(collection: Collection): Set { val filterParams = buildFilterParams(account) @@ -74,16 +70,15 @@ class HomeConversationsFeedFilter(val account: Account) : AdditiveFeedFilter): List { - return collection.sortedWith(DefaultFeedOrder) - } + override fun sort(collection: Set): List = collection.sortedWith(DefaultFeedOrder) } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/HomeNewThreadFeedFilter.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/HomeNewThreadFeedFilter.kt index 6e1f9df7e..06bbd44dd 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/HomeNewThreadFeedFilter.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/HomeNewThreadFeedFilter.kt @@ -36,24 +36,22 @@ import com.vitorpamplona.quartz.events.RepostEvent import com.vitorpamplona.quartz.events.TextNoteEvent import com.vitorpamplona.quartz.events.WikiNoteEvent -class HomeNewThreadFeedFilter(val account: Account) : AdditiveFeedFilter() { - override fun feedKey(): String { - return account.userProfile().pubkeyHex + "-" + account.defaultHomeFollowList.value - } +class HomeNewThreadFeedFilter( + val account: Account, +) : AdditiveFeedFilter() { + override fun feedKey(): String = account.userProfile().pubkeyHex + "-" + account.defaultHomeFollowList.value - override fun showHiddenKey(): Boolean { - return account.defaultHomeFollowList.value == PeopleListEvent.blockListFor(account.userProfile().pubkeyHex) || + override fun showHiddenKey(): Boolean = + account.defaultHomeFollowList.value == PeopleListEvent.blockListFor(account.userProfile().pubkeyHex) || account.defaultHomeFollowList.value == MuteListEvent.blockListFor(account.userProfile().pubkeyHex) - } - fun buildFilterParams(account: Account): FilterByListParams { - return FilterByListParams.create( + fun buildFilterParams(account: Account): FilterByListParams = + FilterByListParams.create( userHex = account.userProfile().pubkeyHex, selectedListName = account.defaultHomeFollowList.value, followLists = account.liveHomeFollowLists.value, hiddenUsers = account.flowHiddenUsers.value, ) - } override fun feed(): List { val gRelays = account.activeGlobalRelays().toSet() @@ -73,9 +71,7 @@ class HomeNewThreadFeedFilter(val account: Account) : AdditiveFeedFilter() return sort(notes + longFormNotes) } - override fun applyFilter(collection: Set): Set { - return innerApplyFilter(collection) - } + override fun applyFilter(collection: Set): Set = innerApplyFilter(collection) private fun innerApplyFilter(collection: Collection): Set { val gRelays = account.activeGlobalRelays().toSet() @@ -107,13 +103,13 @@ class HomeNewThreadFeedFilter(val account: Account) : AdditiveFeedFilter() ) && filterParams.match(noteEvent, isGlobalRelay) && it.isNewThread() } - override fun sort(collection: Set): List { - return collection.distinctBy { - if (it.event is RepostEvent || it.event is GenericRepostEvent) { - it.replyTo?.lastOrNull()?.idHex ?: it.idHex // only the most recent repost per feed. - } else { - it.idHex - } - }.sortedWith(DefaultFeedOrder) - } + override fun sort(collection: Set): List = + collection + .distinctBy { + if (it.event is RepostEvent || it.event is GenericRepostEvent) { + it.replyTo?.lastOrNull()?.idHex ?: it.idHex // only the most recent repost per feed. + } else { + it.idHex + } + }.sortedWith(DefaultFeedOrder) } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/NIP90ContentDiscoveryResponseFilter.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/NIP90ContentDiscoveryResponseFilter.kt index fef70a0b5..3349fe331 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/NIP90ContentDiscoveryResponseFilter.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/NIP90ContentDiscoveryResponseFilter.kt @@ -35,18 +35,13 @@ open class NIP90ContentDiscoveryResponseFilter( ) : AdditiveFeedFilter() { var latestNote: Note? = null - override fun feedKey(): String { - return account.userProfile().pubkeyHex + "-" + request - } + override fun feedKey(): String = account.userProfile().pubkeyHex + "-" + request - open fun followList(): String { - return account.defaultDiscoveryFollowList.value - } + open fun followList(): String = account.defaultDiscoveryFollowList.value - override fun showHiddenKey(): Boolean { - return followList() == PeopleListEvent.blockListFor(account.userProfile().pubkeyHex) || + override fun showHiddenKey(): Boolean = + followList() == PeopleListEvent.blockListFor(account.userProfile().pubkeyHex) || followList() == MuteListEvent.blockListFor(account.userProfile().pubkeyHex) - } fun acceptableEvent(note: Note): Boolean { val noteEvent = note.event @@ -71,18 +66,15 @@ open class NIP90ContentDiscoveryResponseFilter( } } - override fun applyFilter(collection: Set): Set { - return innerApplyFilter(collection) - } + override fun applyFilter(collection: Set): Set = innerApplyFilter(collection) - fun buildFilterParams(account: Account): FilterByListParams { - return FilterByListParams.create( + fun buildFilterParams(account: Account): FilterByListParams = + FilterByListParams.create( account.userProfile().pubkeyHex, account.defaultDiscoveryFollowList.value, account.liveDiscoveryFollowLists.value, account.flowHiddenUsers.value, ) - } protected open fun innerApplyFilter(collection: Collection): Set { // val params = buildFilterParams(account) @@ -95,9 +87,11 @@ open class NIP90ContentDiscoveryResponseFilter( val noteEvent = latestNote?.event as? NIP90ContentDiscoveryResponseEvent ?: return setOf() - return noteEvent.innerTags().mapNotNull { - LocalCache.checkGetOrCreateNote(it) - }.toSet() + return noteEvent + .innerTags() + .mapNotNull { + LocalCache.checkGetOrCreateNote(it) + }.toSet() } override fun sort(collection: Set): List { diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/NotificationFeedFilter.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/NotificationFeedFilter.kt index 613d806f2..2a97d17f4 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/NotificationFeedFilter.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/NotificationFeedFilter.kt @@ -44,26 +44,24 @@ import com.vitorpamplona.quartz.events.PeopleListEvent import com.vitorpamplona.quartz.events.ReactionEvent import com.vitorpamplona.quartz.events.RepostEvent -class NotificationFeedFilter(val account: Account) : AdditiveFeedFilter() { - override fun feedKey(): String { - return account.userProfile().pubkeyHex + "-" + account.defaultNotificationFollowList.value - } +class NotificationFeedFilter( + val account: Account, +) : AdditiveFeedFilter() { + override fun feedKey(): String = account.userProfile().pubkeyHex + "-" + account.defaultNotificationFollowList.value - override fun showHiddenKey(): Boolean { - return account.defaultNotificationFollowList.value == + override fun showHiddenKey(): Boolean = + account.defaultNotificationFollowList.value == PeopleListEvent.blockListFor(account.userProfile().pubkeyHex) || account.defaultNotificationFollowList.value == MuteListEvent.blockListFor(account.userProfile().pubkeyHex) - } - fun buildFilterParams(account: Account): FilterByListParams { - return FilterByListParams.create( + fun buildFilterParams(account: Account): FilterByListParams = + FilterByListParams.create( userHex = account.userProfile().pubkeyHex, selectedListName = account.defaultNotificationFollowList.value, followLists = account.liveNotificationFollowLists.value, hiddenUsers = account.flowHiddenUsers.value, ) - } override fun feed(): List { val filterParams = buildFilterParams(account) @@ -76,9 +74,7 @@ class NotificationFeedFilter(val account: Account) : AdditiveFeedFilter() return sort(notifications) } - override fun applyFilter(collection: Set): Set { - return innerApplyFilter(collection) - } + override fun applyFilter(collection: Set): Set = innerApplyFilter(collection) private fun innerApplyFilter(collection: Collection): Set { val filterParams = buildFilterParams(account) @@ -123,9 +119,7 @@ class NotificationFeedFilter(val account: Account) : AdditiveFeedFilter() tagsAnEventByUser(it, loggedInUserHex) } - override fun sort(collection: Set): List { - return collection.sortedWith(DefaultFeedOrder) - } + override fun sort(collection: Set): List = collection.sortedWith(DefaultFeedOrder) fun tagsAnEventByUser( note: Note, @@ -153,11 +147,17 @@ class NotificationFeedFilter(val account: Account) : AdditiveFeedFilter() } if (event is ReactionEvent) { - return note.replyTo?.lastOrNull()?.author?.pubkeyHex == authorHex + return note.replyTo + ?.lastOrNull() + ?.author + ?.pubkeyHex == authorHex } if (event is RepostEvent || event is GenericRepostEvent) { - return note.replyTo?.lastOrNull()?.author?.pubkeyHex == authorHex + return note.replyTo + ?.lastOrNull() + ?.author + ?.pubkeyHex == authorHex } return true diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/ThreadFeedFilter.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/ThreadFeedFilter.kt index a981c189c..a907fc9ae 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/ThreadFeedFilter.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/ThreadFeedFilter.kt @@ -29,10 +29,11 @@ import com.vitorpamplona.amethyst.model.ThreadLevelCalculator import com.vitorpamplona.quartz.utils.TimeUtils @Immutable -class ThreadFeedFilter(val account: Account, val noteId: String) : FeedFilter() { - override fun feedKey(): String { - return noteId - } +class ThreadFeedFilter( + val account: Account, + val noteId: String, +) : FeedFilter() { + override fun feedKey(): String = noteId override fun feed(): List { val cachedSignatures: MutableMap = mutableMapOf() @@ -44,14 +45,15 @@ class ThreadFeedFilter(val account: Account, val noteId: String) : FeedFilter { - ThreadLevelCalculator.replyLevelSignature( - it, - eventsInHex, - cachedSignatures, - account.userProfile(), - followingKeySet, - now, - ).signature + ThreadLevelCalculator + .replyLevelSignature( + it, + eventsInHex, + cachedSignatures, + account.userProfile(), + followingKeySet, + now, + ).signature } return eventsToWatch.sortedWith(order) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/UserProfileAppRecommendationsFeedFilter.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/UserProfileAppRecommendationsFeedFilter.kt index 332281ce8..d85ac7d1f 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/UserProfileAppRecommendationsFeedFilter.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/UserProfileAppRecommendationsFeedFilter.kt @@ -25,10 +25,10 @@ import com.vitorpamplona.amethyst.model.Note import com.vitorpamplona.amethyst.model.User import com.vitorpamplona.quartz.events.AppRecommendationEvent -class UserProfileAppRecommendationsFeedFilter(val user: User) : AdditiveFeedFilter() { - override fun feedKey(): String { - return user.pubkeyHex - } +class UserProfileAppRecommendationsFeedFilter( + val user: User, +) : AdditiveFeedFilter() { + override fun feedKey(): String = user.pubkeyHex override fun feed(): List { val recommendations = @@ -39,13 +39,9 @@ class UserProfileAppRecommendationsFeedFilter(val user: User) : AdditiveFeedFilt return sort(recommendations) } - override fun applyFilter(collection: Set): Set { - return innerApplyFilter(collection) - } + override fun applyFilter(collection: Set): Set = innerApplyFilter(collection) - private fun innerApplyFilter(collection: Collection): Set { - return collection.mapNotNull { filterMap(it) }.flatten().toSet() - } + private fun innerApplyFilter(collection: Collection): Set = collection.mapNotNull { filterMap(it) }.flatten().toSet() fun filterMap(it: Note): List? { val noteEvent = it.event @@ -58,7 +54,5 @@ class UserProfileAppRecommendationsFeedFilter(val user: User) : AdditiveFeedFilt return null } - override fun sort(collection: Set): List { - return collection.sortedWith(DefaultFeedOrder) - } + override fun sort(collection: Set): List = collection.sortedWith(DefaultFeedOrder) } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/UserProfileBookmarksFeedFilter.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/UserProfileBookmarksFeedFilter.kt index 3ef42a225..8044ab846 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/UserProfileBookmarksFeedFilter.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/UserProfileBookmarksFeedFilter.kt @@ -25,10 +25,11 @@ import com.vitorpamplona.amethyst.model.LocalCache import com.vitorpamplona.amethyst.model.Note import com.vitorpamplona.amethyst.model.User -class UserProfileBookmarksFeedFilter(val user: User, val account: Account) : FeedFilter() { - override fun feedKey(): String { - return account.userProfile().pubkeyHex + "-" + user.pubkeyHex - } +class UserProfileBookmarksFeedFilter( + val user: User, + val account: Account, +) : FeedFilter() { + override fun feedKey(): String = account.userProfile().pubkeyHex + "-" + user.pubkeyHex override fun feed(): List { val notes = diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/UserProfileConversationsFeedFilter.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/UserProfileConversationsFeedFilter.kt index 0af8e0d6a..5c45a676e 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/UserProfileConversationsFeedFilter.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/UserProfileConversationsFeedFilter.kt @@ -29,11 +29,11 @@ import com.vitorpamplona.quartz.events.LiveActivitiesChatMessageEvent import com.vitorpamplona.quartz.events.PollNoteEvent import com.vitorpamplona.quartz.events.TextNoteEvent -class UserProfileConversationsFeedFilter(val user: User, val account: Account) : - AdditiveFeedFilter() { - override fun feedKey(): String { - return account.userProfile().pubkeyHex + "-" + user.pubkeyHex - } +class UserProfileConversationsFeedFilter( + val user: User, + val account: Account, +) : AdditiveFeedFilter() { + override fun feedKey(): String = account.userProfile().pubkeyHex + "-" + user.pubkeyHex override fun feed(): List { val notes = @@ -49,27 +49,22 @@ class UserProfileConversationsFeedFilter(val user: User, val account: Account) : return sort(notes + longFormNotes) } - override fun applyFilter(collection: Set): Set { - return innerApplyFilter(collection) - } + override fun applyFilter(collection: Set): Set = innerApplyFilter(collection) - private fun innerApplyFilter(collection: Collection): Set { - return collection.filterTo(HashSet()) { acceptableEvent(it) } - } + private fun innerApplyFilter(collection: Collection): Set = collection.filterTo(HashSet()) { acceptableEvent(it) } - fun acceptableEvent(it: Note): Boolean { - return it.author == user && + fun acceptableEvent(it: Note): Boolean = + it.author == user && ( it.event is TextNoteEvent || it.event is PollNoteEvent || it.event is ChannelMessageEvent || it.event is LiveActivitiesChatMessageEvent - ) && !it.isNewThread() && account.isAcceptable(it) - } + ) && + !it.isNewThread() && + account.isAcceptable(it) - override fun sort(collection: Set): List { - return collection.sortedWith(DefaultFeedOrder) - } + override fun sort(collection: Set): List = collection.sortedWith(DefaultFeedOrder) override fun limit() = 200 } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/UserProfileFollowersFeedFilter.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/UserProfileFollowersFeedFilter.kt index ddd9e1436..29165cb06 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/UserProfileFollowersFeedFilter.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/UserProfileFollowersFeedFilter.kt @@ -24,16 +24,16 @@ import com.vitorpamplona.amethyst.model.Account import com.vitorpamplona.amethyst.model.LocalCache import com.vitorpamplona.amethyst.model.User -class UserProfileFollowersFeedFilter(val user: User, val account: Account) : FeedFilter() { - override fun feedKey(): String { - return account.userProfile().pubkeyHex + "-" + user.pubkeyHex - } +class UserProfileFollowersFeedFilter( + val user: User, + val account: Account, +) : FeedFilter() { + override fun feedKey(): String = account.userProfile().pubkeyHex + "-" + user.pubkeyHex - override fun feed(): List { - return LocalCache.users.filter { _, it -> + override fun feed(): List = + LocalCache.users.filter { _, it -> it.isFollowing(user) && !account.isHidden(it) } - } override fun limit() = 400 } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/UserProfileFollowsFeedFilter.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/UserProfileFollowsFeedFilter.kt index 9ec0cad68..a05722c62 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/UserProfileFollowsFeedFilter.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/UserProfileFollowsFeedFilter.kt @@ -25,10 +25,11 @@ import com.vitorpamplona.amethyst.model.LocalCache import com.vitorpamplona.amethyst.model.User import com.vitorpamplona.quartz.events.ContactListEvent -class UserProfileFollowsFeedFilter(val user: User, val account: Account) : FeedFilter() { - override fun feedKey(): String { - return account.userProfile().pubkeyHex + "-" + user.pubkeyHex - } +class UserProfileFollowsFeedFilter( + val user: User, + val account: Account, +) : FeedFilter() { + override fun feedKey(): String = account.userProfile().pubkeyHex + "-" + user.pubkeyHex val cache: MutableMap> = mutableMapOf() diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/UserProfileNewThreadFeedFilter.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/UserProfileNewThreadFeedFilter.kt index 94dd77128..7a55c6dc3 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/UserProfileNewThreadFeedFilter.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/UserProfileNewThreadFeedFilter.kt @@ -37,11 +37,11 @@ import com.vitorpamplona.quartz.events.RepostEvent import com.vitorpamplona.quartz.events.TextNoteEvent import com.vitorpamplona.quartz.events.WikiNoteEvent -class UserProfileNewThreadFeedFilter(val user: User, val account: Account) : - AdditiveFeedFilter() { - override fun feedKey(): String { - return account.userProfile().pubkeyHex + "-" + user.pubkeyHex - } +class UserProfileNewThreadFeedFilter( + val user: User, + val account: Account, +) : AdditiveFeedFilter() { + override fun feedKey(): String = account.userProfile().pubkeyHex + "-" + user.pubkeyHex override fun feed(): List { val notes = @@ -57,16 +57,12 @@ class UserProfileNewThreadFeedFilter(val user: User, val account: Account) : return sort(notes + longFormNotes) } - override fun applyFilter(collection: Set): Set { - return innerApplyFilter(collection) - } + override fun applyFilter(collection: Set): Set = innerApplyFilter(collection) - private fun innerApplyFilter(collection: Collection): Set { - return collection.filterTo(HashSet()) { acceptableEvent(it) } - } + private fun innerApplyFilter(collection: Collection): Set = collection.filterTo(HashSet()) { acceptableEvent(it) } - fun acceptableEvent(it: Note): Boolean { - return it.author == user && + fun acceptableEvent(it: Note): Boolean = + it.author == user && ( it.event is TextNoteEvent || it.event is ClassifiedsEvent || @@ -79,11 +75,8 @@ class UserProfileNewThreadFeedFilter(val user: User, val account: Account) : it.event is AudioTrackEvent || it.event is AudioHeaderEvent ) && it.isNewThread() && account.isAcceptable(it) - } - override fun sort(collection: Set): List { - return collection.sortedWith(DefaultFeedOrder) - } + override fun sort(collection: Set): List = collection.sortedWith(DefaultFeedOrder) override fun limit() = 200 } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/UserProfileReportsFeedFilter.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/UserProfileReportsFeedFilter.kt index 4eeffd942..931d500a1 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/UserProfileReportsFeedFilter.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/UserProfileReportsFeedFilter.kt @@ -24,28 +24,21 @@ import com.vitorpamplona.amethyst.model.Note import com.vitorpamplona.amethyst.model.User import com.vitorpamplona.quartz.events.ReportEvent -class UserProfileReportsFeedFilter(val user: User) : AdditiveFeedFilter() { - override fun feedKey(): String { - return user.pubkeyHex - } +class UserProfileReportsFeedFilter( + val user: User, +) : AdditiveFeedFilter() { + override fun feedKey(): String = user.pubkeyHex - override fun feed(): List { - return sort(innerApplyFilter(user.reports.values.flatten())) - } + override fun feed(): List = sort(innerApplyFilter(user.reports.values.flatten())) - override fun applyFilter(collection: Set): Set { - return innerApplyFilter(collection) - } + override fun applyFilter(collection: Set): Set = innerApplyFilter(collection) - private fun innerApplyFilter(collection: Collection): Set { - return collection + private fun innerApplyFilter(collection: Collection): Set = + collection .filter { it.event is ReportEvent && it.event?.isTaggedUser(user.pubkeyHex) == true } .toSet() - } - override fun sort(collection: Set): List { - return collection.sortedWith(DefaultFeedOrder) - } + override fun sort(collection: Set): List = collection.sortedWith(DefaultFeedOrder) override fun limit() = 400 } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/UserProfileZapsFeedFilter.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/UserProfileZapsFeedFilter.kt index 075f03f2d..334152829 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/UserProfileZapsFeedFilter.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/UserProfileZapsFeedFilter.kt @@ -24,14 +24,12 @@ import com.vitorpamplona.amethyst.model.User import com.vitorpamplona.amethyst.ui.screen.ZapReqResponse import com.vitorpamplona.quartz.events.zaps.UserZaps -class UserProfileZapsFeedFilter(val user: User) : FeedFilter() { - override fun feedKey(): String { - return user.pubkeyHex - } +class UserProfileZapsFeedFilter( + val user: User, +) : FeedFilter() { + override fun feedKey(): String = user.pubkeyHex - override fun feed(): List { - return UserZaps.forProfileFeed(user.zaps) - } + override fun feed(): List = UserZaps.forProfileFeed(user.zaps) override fun limit() = 400 } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/VideoFeedFilter.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/VideoFeedFilter.kt index 664fbbb3d..20629b0d6 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/VideoFeedFilter.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/VideoFeedFilter.kt @@ -31,15 +31,14 @@ import com.vitorpamplona.quartz.events.PeopleListEvent import com.vitorpamplona.quartz.events.VideoHorizontalEvent import com.vitorpamplona.quartz.events.VideoVerticalEvent -class VideoFeedFilter(val account: Account) : AdditiveFeedFilter() { - override fun feedKey(): String { - return account.userProfile().pubkeyHex + "-" + account.defaultStoriesFollowList.value - } +class VideoFeedFilter( + val account: Account, +) : AdditiveFeedFilter() { + override fun feedKey(): String = account.userProfile().pubkeyHex + "-" + account.defaultStoriesFollowList.value - override fun showHiddenKey(): Boolean { - return account.defaultStoriesFollowList.value == PeopleListEvent.blockListFor(account.userProfile().pubkeyHex) || + override fun showHiddenKey(): Boolean = + account.defaultStoriesFollowList.value == PeopleListEvent.blockListFor(account.userProfile().pubkeyHex) || account.defaultStoriesFollowList.value == MuteListEvent.blockListFor(account.userProfile().pubkeyHex) - } override fun feed(): List { val params = buildFilterParams(account) @@ -52,9 +51,7 @@ class VideoFeedFilter(val account: Account) : AdditiveFeedFilter() { return sort(notes) } - override fun applyFilter(collection: Set): Set { - return innerApplyFilter(collection) - } + override fun applyFilter(collection: Set): Set = innerApplyFilter(collection) private fun innerApplyFilter(collection: Collection): Set { val params = buildFilterParams(account) @@ -78,16 +75,13 @@ class VideoFeedFilter(val account: Account) : AdditiveFeedFilter() { account.isAcceptable(it) } - fun buildFilterParams(account: Account): FilterByListParams { - return FilterByListParams.create( + fun buildFilterParams(account: Account): FilterByListParams = + FilterByListParams.create( userHex = account.userProfile().pubkeyHex, selectedListName = account.defaultStoriesFollowList.value, followLists = account.liveStoriesFollowLists.value, hiddenUsers = account.flowHiddenUsers.value, ) - } - override fun sort(collection: Set): List { - return collection.sortedWith(DefaultFeedOrder) - } + override fun sort(collection: Set): List = collection.sortedWith(DefaultFeedOrder) } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppNavigation.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppNavigation.kt index d0906b5f1..7debedfc5 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppNavigation.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppNavigation.kt @@ -385,7 +385,12 @@ fun AppNavigation( val activity = LocalContext.current.getActivity() var currentIntentNextPage by remember { - mutableStateOf(activity.intent?.data?.toString()?.ifBlank { null }) + mutableStateOf( + activity.intent + ?.data + ?.toString() + ?.ifBlank { null }, + ) } currentIntentNextPage?.let { intentNextPage -> diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/navigation/RouteMaker.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/navigation/RouteMaker.kt index ba50cd8b4..e3911fa22 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/navigation/RouteMaker.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/navigation/RouteMaker.kt @@ -126,18 +126,10 @@ fun routeToMessage( user: User, draftMessage: String?, accountViewModel: AccountViewModel, -): String { - return routeToMessage(user.pubkeyHex, draftMessage, accountViewModel) -} +): String = routeToMessage(user.pubkeyHex, draftMessage, accountViewModel) -fun routeFor(note: Channel): String { - return "Channel/${note.idHex}" -} +fun routeFor(note: Channel): String = "Channel/${note.idHex}" -fun routeFor(user: User): String { - return "User/${user.pubkeyHex}" -} +fun routeFor(user: User): String = "User/${user.pubkeyHex}" -fun authorRouteFor(note: Note): String { - return "User/${note.author?.pubkeyHex}" -} +fun authorRouteFor(note: Note): String = "User/${note.author?.pubkeyHex}" diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/Loaders.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/Loaders.kt index 1e2d605e9..72af667e7 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/Loaders.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/Loaders.kt @@ -206,7 +206,8 @@ fun LoadCityName( val geoHash = runCatching { geohashStr.toGeoHash() }.getOrNull() if (geoHash != null) { val newCityName = - CachedGeoLocations.geoLocate(geohashStr, geoHash.toLocation(), context) + CachedGeoLocations + .geoLocate(geohashStr, geoHash.toLocation(), context) ?.ifBlank { null } if (newCityName != null && newCityName != cityName) { cityName = newCityName diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/PollNoteViewModel.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/PollNoteViewModel.kt index 5f4949bc8..33405a42c 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/PollNoteViewModel.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/PollNoteViewModel.kt @@ -86,7 +86,11 @@ class PollNoteViewModel : ViewModel() { valueMinimumBD = valueMinimum?.let { BigDecimal(it) } valueMaximumBD = valueMaximum?.let { BigDecimal(it) } consensusThreshold = - pollEvent?.getTagLong(CONSENSUS_THRESHOLD)?.toFloat()?.div(100)?.toBigDecimal() + pollEvent + ?.getTagLong(CONSENSUS_THRESHOLD) + ?.toFloat() + ?.div(100) + ?.toBigDecimal() closedAt = pollEvent?.getTagLong(CLOSED_AT) totalZapped = BigDecimal.ZERO @@ -138,7 +142,8 @@ class PollNoteViewModel : ViewModel() { fun isVoteAmountAtomic() = valueMaximum != null && valueMinimum != null && valueMinimum == valueMaximum fun isPollClosed(): Boolean = - closedAt?.let { // allow 2 minute leeway for zap to propagate + closedAt?.let { + // allow 2 minute leeway for zap to propagate pollNote?.createdAt()?.plus(it * (86400 + 120))!! < TimeUtils.now() } == true @@ -221,17 +226,16 @@ class PollNoteViewModel : ViewModel() { fun cachedIsPollOptionZappedBy( option: Int, user: User, - ): Boolean { - return pollNote!!.zaps.any { + ): Boolean = + pollNote!!.zaps.any { val zapEvent = it.value?.event as? LnZapEvent val privateZapAuthor = (it.key.event as? LnZapRequestEvent)?.cachedPrivateZap() zapEvent?.zappedPollOption() == option && (it.key.author?.pubkeyHex == user.pubkeyHex || privateZapAuthor?.pubKey == user.pubkeyHex) } - } - private fun zappedPollOptionAmount(option: Int): BigDecimal { - return pollNote?.zaps?.values?.sumOf { + private fun zappedPollOptionAmount(option: Int): BigDecimal = + pollNote?.zaps?.values?.sumOf { val event = it?.event as? LnZapEvent val zapAmount = event?.amount ?: BigDecimal.ZERO val isValidAmount = isValidInputVoteAmount(event?.amount) @@ -243,10 +247,9 @@ class PollNoteViewModel : ViewModel() { } } ?: BigDecimal.ZERO - } - private fun totalZapped(): BigDecimal { - return pollNote?.zaps?.values?.sumOf { + private fun totalZapped(): BigDecimal = + pollNote?.zaps?.values?.sumOf { val zapEvent = (it?.event as? LnZapEvent) val zapAmount = zapEvent?.amount ?: BigDecimal.ZERO val isValidAmount = isValidInputVoteAmount(zapEvent?.amount) @@ -258,7 +261,6 @@ class PollNoteViewModel : ViewModel() { } } ?: BigDecimal.ZERO - } fun createZapOptionsThatMatchThePollingParameters(): List { val options = diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/PubKeyFormatter.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/PubKeyFormatter.kt index 1ef039515..d06ed9ccb 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/PubKeyFormatter.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/PubKeyFormatter.kt @@ -23,15 +23,11 @@ package com.vitorpamplona.amethyst.ui.note import com.vitorpamplona.quartz.encoders.HexKey import com.vitorpamplona.quartz.encoders.toHexKey -fun ByteArray.toShortenHex(): String { - return toHexKey().toShortenHex() -} +fun ByteArray.toShortenHex(): String = toHexKey().toShortenHex() fun String.toShortenHex(): String { if (length <= 16) return this return replaceRange(8, length - 8, ":") } -fun HexKey.toDisplayHexKey(): String { - return this.toShortenHex() -} +fun HexKey.toDisplayHexKey(): String = this.toShortenHex() diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/qrcode/QrCodeDrawer.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/qrcode/QrCodeDrawer.kt index 3ede38d98..a030c4dd2 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/qrcode/QrCodeDrawer.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/qrcode/QrCodeDrawer.kt @@ -161,32 +161,31 @@ fun DrawScope.drawAllQrCodeDataBits( second = bytes.height, ), ), - ) - .forEach { section -> - for (y in section.first.second until section.second.second) { - for (x in section.first.first until section.second.first) { - if (bytes[x, y] == 1.toByte()) { - drawPath( - color = color, - path = - newPath { - addRect( - rect = - Rect( - offset = - Offset( - x = QR_MARGIN_PX + x * size.width, - y = QR_MARGIN_PX + y * size.height, - ), - size = size, - ), - ) - }, - ) - } + ).forEach { section -> + for (y in section.first.second until section.second.second) { + for (x in section.first.first until section.second.first) { + if (bytes[x, y] == 1.toByte()) { + drawPath( + color = color, + path = + newPath { + addRect( + rect = + Rect( + offset = + Offset( + x = QR_MARGIN_PX + x * size.width, + y = QR_MARGIN_PX + y * size.height, + ), + size = size, + ), + ) + }, + ) } } } + } } const val FINDER_PATTERN_ROW_COUNT = 7 @@ -216,15 +215,14 @@ internal fun DrawScope.drawQrCodeFinders( Offset(x = sideLength - (QR_MARGIN_PX + finderPatternSize.width), y = QR_MARGIN_PX), // Draw bottom finder pattern. Offset(x = QR_MARGIN_PX, y = sideLength - (QR_MARGIN_PX + finderPatternSize.height)), - ) - .forEach { offset -> - drawQrCodeFinder( - topLeft = offset, - finderPatternSize = finderPatternSize, - cornerRadius = CornerRadius.Zero, - color = color, - ) - } + ).forEach { offset -> + drawQrCodeFinder( + topLeft = offset, + finderPatternSize = finderPatternSize, + cornerRadius = CornerRadius.Zero, + color = color, + ) + } } /** This func is responsible for drawing a single finder pattern, for a QR code */ diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/AccountState.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/AccountState.kt index c92cc8ed6..af7f2d5b4 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/AccountState.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/AccountState.kt @@ -27,11 +27,15 @@ sealed class AccountState { object LoggedOff : AccountState() - class LoggedInViewOnly(val account: Account) : AccountState() { + class LoggedInViewOnly( + val account: Account, + ) : AccountState() { val currentViewModelStore = AccountCentricViewModelStore(account) } - class LoggedIn(val account: Account) : AccountState() { + class LoggedIn( + val account: Account, + ) : AccountState() { val currentViewModelStore = AccountCentricViewModelStore(account) } } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedState.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedState.kt index a492d570a..1c55e5fae 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedState.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedState.kt @@ -32,37 +32,38 @@ import kotlinx.collections.immutable.toImmutableList import kotlinx.collections.immutable.toImmutableMap @Immutable -abstract class Card() { +abstract class Card { abstract fun createdAt(): Long abstract fun id(): String } @Immutable -class BadgeCard(val note: Note) : Card() { - override fun createdAt(): Long { - return note.createdAt() ?: 0 - } +class BadgeCard( + val note: Note, +) : Card() { + override fun createdAt(): Long = note.createdAt() ?: 0 override fun id() = note.idHex } @Immutable -class NoteCard(val note: Note) : Card() { - override fun createdAt(): Long { - return note.createdAt() ?: 0 - } +class NoteCard( + val note: Note, +) : Card() { + override fun createdAt(): Long = note.createdAt() ?: 0 override fun id() = note.idHex } @Immutable -class ZapUserSetCard(val user: User, val zapEvents: ImmutableList) : Card() { +class ZapUserSetCard( + val user: User, + val zapEvents: ImmutableList, +) : Card() { val createdAt = zapEvents.maxOf { it.createdAt() ?: 0 } - override fun createdAt(): Long { - return createdAt - } + override fun createdAt(): Long = createdAt override fun id() = user.pubkeyHex + "U" + createdAt } @@ -95,22 +96,19 @@ class MultiSetCard( ?.content() ?.firstFullCharOrEmoji(ImmutableListOfLists(it.event?.tags() ?: emptyArray())) ?: "+" - } - .mapValues { it.value.toImmutableList() } + }.mapValues { it.value.toImmutableList() } .toImmutableMap() - override fun createdAt(): Long { - return maxCreatedAt - } + override fun createdAt(): Long = maxCreatedAt override fun id() = note.idHex + "X" + maxCreatedAt + "X" + minCreatedAt } @Immutable -class MessageSetCard(val note: Note) : Card() { - override fun createdAt(): Long { - return note.createdAt() ?: 0 - } +class MessageSetCard( + val note: Note, +) : Card() { + override fun createdAt(): Long = note.createdAt() ?: 0 override fun id() = note.idHex } @@ -120,10 +118,14 @@ sealed class CardFeedState { @Immutable object Loading : CardFeedState() @Stable - class Loaded(val feed: MutableState>, val showHidden: MutableState) : - CardFeedState() + class Loaded( + val feed: MutableState>, + val showHidden: MutableState, + ) : CardFeedState() @Immutable object Empty : CardFeedState() - @Immutable class FeedError(val errorMessage: String) : CardFeedState() + @Immutable class FeedError( + val errorMessage: String, + ) : CardFeedState() } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedViewModel.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedViewModel.kt index d41d24623..fa8642af1 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedViewModel.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedViewModel.kt @@ -60,17 +60,21 @@ import java.time.format.DateTimeFormatter import kotlin.time.measureTimedValue @Stable -class NotificationViewModel(val account: Account) : - CardFeedViewModel(NotificationFeedFilter(account)) { - class Factory(val account: Account) : ViewModelProvider.Factory { - override fun create(modelClass: Class): NotificationViewModel { - return NotificationViewModel(account) as NotificationViewModel - } +class NotificationViewModel( + val account: Account, +) : CardFeedViewModel(NotificationFeedFilter(account)) { + class Factory( + val account: Account, + ) : ViewModelProvider.Factory { + override fun create(modelClass: Class): NotificationViewModel = NotificationViewModel(account) as NotificationViewModel } } @Stable -open class CardFeedViewModel(val localFilter: FeedFilter) : ViewModel(), InvalidatableViewModel { +open class CardFeedViewModel( + val localFilter: FeedFilter, +) : ViewModel(), + InvalidatableViewModel { private val _feedContent = MutableStateFlow(CardFeedState.Loading) val feedContent = _feedContent.asStateFlow() @@ -167,7 +171,11 @@ open class CardFeedViewModel(val localFilter: FeedFilter) : ViewModel(), I .forEach { zapEvent -> val zappedPost = zapEvent.replyTo?.lastOrNull() if (zappedPost != null) { - val zapRequest = zappedPost.zaps.filter { it.value == zapEvent }.keys.firstOrNull() + val zapRequest = + zappedPost.zaps + .filter { it.value == zapEvent } + .keys + .firstOrNull() if (zapRequest != null) { // var newZapRequestEvent = LocalCache.checkPrivateZap(zapRequest.event as Event) // zapRequest.event = newZapRequestEvent @@ -182,7 +190,11 @@ open class CardFeedViewModel(val localFilter: FeedFilter) : ViewModel(), I LocalCache.getUserIfExists(it) // don't create user if it doesn't exist } if (author != null) { - val zapRequest = author.zaps.filter { it.value == zapEvent }.keys.firstOrNull() + val zapRequest = + author.zaps + .filter { it.value == zapEvent } + .keys + .firstOrNull() if (zapRequest != null) { zapsPerUser .getOrPut(author, { mutableListOf() }) @@ -218,7 +230,8 @@ open class CardFeedViewModel(val localFilter: FeedFilter) : ViewModel(), I val singleList = (boostsInCard + zapsInCard.map { it.response } + reactionsInCard).groupBy { sdf.format( - Instant.ofEpochSecond(it.createdAt() ?: 0) + Instant + .ofEpochSecond(it.createdAt() ?: 0) .atZone(ZoneId.systemDefault()) .toLocalDateTime(), ) @@ -242,10 +255,8 @@ open class CardFeedViewModel(val localFilter: FeedFilter) : ViewModel(), I zapsInCard.filter { it.response in chunk }.toImmutableList(), ) } - } - .flatten() - } - .flatten() + }.flatten() + }.flatten() val userZaps = zapsPerUser @@ -253,7 +264,8 @@ open class CardFeedViewModel(val localFilter: FeedFilter) : ViewModel(), I val byDay = user.value.groupBy { sdf.format( - Instant.ofEpochSecond(it.createdAt() ?: 0) + Instant + .ofEpochSecond(it.createdAt() ?: 0) .atZone(ZoneId.systemDefault()) .toLocalDateTime(), ) @@ -268,8 +280,7 @@ open class CardFeedViewModel(val localFilter: FeedFilter) : ViewModel(), I .toImmutableList(), ) } - } - .flatten() + }.flatten() val textNoteCards = notes @@ -278,8 +289,7 @@ open class CardFeedViewModel(val localFilter: FeedFilter) : ViewModel(), I it.event !is RepostEvent && it.event !is GenericRepostEvent && it.event !is LnZapEvent - } - .map { + }.map { if (it.event is PrivateDmEvent || it.event is ChatMessageEvent) { MessageSetCard(it) } else if (it.event is BadgeAwardEvent) { @@ -464,7 +474,10 @@ fun equalImmutableLists( } @Immutable -data class CombinedZap(val request: Note, val response: Note) { +data class CombinedZap( + val request: Note, + val response: Note, +) { fun createdAt() = response.createdAt() fun idHex() = response.idHex diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedState.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedState.kt index 4061e144c..3e92c707a 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedState.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedState.kt @@ -34,5 +34,7 @@ sealed class FeedState { object Empty : FeedState() - class FeedError(val errorMessage: String) : FeedState() + class FeedError( + val errorMessage: String, + ) : FeedState() } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedViewModel.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedViewModel.kt index 422bd15a2..94e80f342 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedViewModel.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedViewModel.kt @@ -73,248 +73,302 @@ import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch -class NostrChannelFeedViewModel(val channel: Channel, val account: Account) : - FeedViewModel(ChannelFeedFilter(channel, account)) { - class Factory(val channel: Channel, val account: Account) : ViewModelProvider.Factory { - override fun create(modelClass: Class): NostrChannelFeedViewModel { - return NostrChannelFeedViewModel(channel, account) as NostrChannelFeedViewModel - } +class NostrChannelFeedViewModel( + val channel: Channel, + val account: Account, +) : FeedViewModel(ChannelFeedFilter(channel, account)) { + class Factory( + val channel: Channel, + val account: Account, + ) : ViewModelProvider.Factory { + override fun create(modelClass: Class): NostrChannelFeedViewModel = NostrChannelFeedViewModel(channel, account) as NostrChannelFeedViewModel } } -class NostrChatroomFeedViewModel(val user: ChatroomKey, val account: Account) : - FeedViewModel(ChatroomFeedFilter(user, account)) { - class Factory(val user: ChatroomKey, val account: Account) : ViewModelProvider.Factory { - override fun create(modelClass: Class): NostrChatRoomFeedViewModel { - return NostrChatroomFeedViewModel(user, account) as NostrChatRoomFeedViewModel - } +class NostrChatroomFeedViewModel( + val user: ChatroomKey, + val account: Account, +) : FeedViewModel(ChatroomFeedFilter(user, account)) { + class Factory( + val user: ChatroomKey, + val account: Account, + ) : ViewModelProvider.Factory { + override fun create(modelClass: Class): NostrChatRoomFeedViewModel = NostrChatroomFeedViewModel(user, account) as NostrChatRoomFeedViewModel } } @Stable -class NostrVideoFeedViewModel(val account: Account) : FeedViewModel(VideoFeedFilter(account)) { - class Factory(val account: Account) : ViewModelProvider.Factory { - override fun create(modelClass: Class): NostrVideoFeedViewModel { - return NostrVideoFeedViewModel(account) as NostrVideoFeedViewModel - } +class NostrVideoFeedViewModel( + val account: Account, +) : FeedViewModel(VideoFeedFilter(account)) { + class Factory( + val account: Account, + ) : ViewModelProvider.Factory { + override fun create(modelClass: Class): NostrVideoFeedViewModel = NostrVideoFeedViewModel(account) as NostrVideoFeedViewModel } } -class NostrDiscoverMarketplaceFeedViewModel(val account: Account) : - FeedViewModel( +class NostrDiscoverMarketplaceFeedViewModel( + val account: Account, +) : FeedViewModel( DiscoverMarketplaceFeedFilter(account), ) { - class Factory(val account: Account) : ViewModelProvider.Factory { - override fun create(modelClass: Class): NostrDiscoverMarketplaceFeedViewModel { - return NostrDiscoverMarketplaceFeedViewModel(account) as NostrDiscoverMarketplaceFeedViewModel - } + class Factory( + val account: Account, + ) : ViewModelProvider.Factory { + override fun create(modelClass: Class): NostrDiscoverMarketplaceFeedViewModel = NostrDiscoverMarketplaceFeedViewModel(account) as NostrDiscoverMarketplaceFeedViewModel } } -class NostrDiscoverNIP89FeedViewModel(val account: Account) : - FeedViewModel( +class NostrDiscoverNIP89FeedViewModel( + val account: Account, +) : FeedViewModel( DiscoverNIP89FeedFilter(account), ) { - class Factory(val account: Account) : ViewModelProvider.Factory { - override fun create(modelClass: Class): NostrDiscoverNIP89FeedViewModel { - return NostrDiscoverNIP89FeedViewModel(account) as NostrDiscoverNIP89FeedViewModel - } + class Factory( + val account: Account, + ) : ViewModelProvider.Factory { + override fun create(modelClass: Class): NostrDiscoverNIP89FeedViewModel = NostrDiscoverNIP89FeedViewModel(account) as NostrDiscoverNIP89FeedViewModel } } -class NostrDiscoverLiveFeedViewModel(val account: Account) : - FeedViewModel(DiscoverLiveFeedFilter(account)) { - class Factory(val account: Account) : ViewModelProvider.Factory { - override fun create(modelClass: Class): NostrDiscoverLiveFeedViewModel { - return NostrDiscoverLiveFeedViewModel(account) as NostrDiscoverLiveFeedViewModel - } +class NostrDiscoverLiveFeedViewModel( + val account: Account, +) : FeedViewModel(DiscoverLiveFeedFilter(account)) { + class Factory( + val account: Account, + ) : ViewModelProvider.Factory { + override fun create(modelClass: Class): NostrDiscoverLiveFeedViewModel = NostrDiscoverLiveFeedViewModel(account) as NostrDiscoverLiveFeedViewModel } } -class NostrDiscoverCommunityFeedViewModel(val account: Account) : - FeedViewModel(DiscoverCommunityFeedFilter(account)) { - class Factory(val account: Account) : ViewModelProvider.Factory { - override fun create(modelClass: Class): NostrDiscoverCommunityFeedViewModel { - return NostrDiscoverCommunityFeedViewModel(account) as NostrDiscoverCommunityFeedViewModel - } +class NostrDiscoverCommunityFeedViewModel( + val account: Account, +) : FeedViewModel(DiscoverCommunityFeedFilter(account)) { + class Factory( + val account: Account, + ) : ViewModelProvider.Factory { + override fun create(modelClass: Class): NostrDiscoverCommunityFeedViewModel = NostrDiscoverCommunityFeedViewModel(account) as NostrDiscoverCommunityFeedViewModel } } -class NostrDiscoverChatFeedViewModel(val account: Account) : - FeedViewModel(DiscoverChatFeedFilter(account)) { - class Factory(val account: Account) : ViewModelProvider.Factory { - override fun create(modelClass: Class): NostrDiscoverChatFeedViewModel { - return NostrDiscoverChatFeedViewModel(account) as NostrDiscoverChatFeedViewModel - } +class NostrDiscoverChatFeedViewModel( + val account: Account, +) : FeedViewModel(DiscoverChatFeedFilter(account)) { + class Factory( + val account: Account, + ) : ViewModelProvider.Factory { + override fun create(modelClass: Class): NostrDiscoverChatFeedViewModel = NostrDiscoverChatFeedViewModel(account) as NostrDiscoverChatFeedViewModel } } -class NostrThreadFeedViewModel(account: Account, noteId: String) : - FeedViewModel(ThreadFeedFilter(account, noteId)) { - class Factory(val account: Account, val noteId: String) : ViewModelProvider.Factory { - override fun create(modelClass: Class): NostrThreadFeedViewModel { - return NostrThreadFeedViewModel(account, noteId) as NostrThreadFeedViewModel - } +class NostrThreadFeedViewModel( + account: Account, + noteId: String, +) : FeedViewModel(ThreadFeedFilter(account, noteId)) { + class Factory( + val account: Account, + val noteId: String, + ) : ViewModelProvider.Factory { + override fun create(modelClass: Class): NostrThreadFeedViewModel = NostrThreadFeedViewModel(account, noteId) as NostrThreadFeedViewModel } } -class NostrUserProfileNewThreadsFeedViewModel(val user: User, val account: Account) : - FeedViewModel(UserProfileNewThreadFeedFilter(user, account)) { - class Factory(val user: User, val account: Account) : ViewModelProvider.Factory { - override fun create(modelClass: Class): NostrUserProfileNewThreadsFeedViewModel { - return NostrUserProfileNewThreadsFeedViewModel(user, account) +class NostrUserProfileNewThreadsFeedViewModel( + val user: User, + val account: Account, +) : FeedViewModel(UserProfileNewThreadFeedFilter(user, account)) { + class Factory( + val user: User, + val account: Account, + ) : ViewModelProvider.Factory { + override fun create(modelClass: Class): NostrUserProfileNewThreadsFeedViewModel = + NostrUserProfileNewThreadsFeedViewModel(user, account) as NostrUserProfileNewThreadsFeedViewModel - } } } -class NostrUserProfileConversationsFeedViewModel(val user: User, val account: Account) : - FeedViewModel(UserProfileConversationsFeedFilter(user, account)) { - class Factory(val user: User, val account: Account) : ViewModelProvider.Factory { - override fun create(modelClass: Class): NostrUserProfileConversationsFeedViewModel { - return NostrUserProfileConversationsFeedViewModel(user, account) +class NostrUserProfileConversationsFeedViewModel( + val user: User, + val account: Account, +) : FeedViewModel(UserProfileConversationsFeedFilter(user, account)) { + class Factory( + val user: User, + val account: Account, + ) : ViewModelProvider.Factory { + override fun create(modelClass: Class): NostrUserProfileConversationsFeedViewModel = + NostrUserProfileConversationsFeedViewModel(user, account) as NostrUserProfileConversationsFeedViewModel - } } } -class NostrHashtagFeedViewModel(val hashtag: String, val account: Account) : - FeedViewModel(HashtagFeedFilter(hashtag, account)) { - class Factory(val hashtag: String, val account: Account) : ViewModelProvider.Factory { - override fun create(modelClass: Class): NostrHashtagFeedViewModel { - return NostrHashtagFeedViewModel(hashtag, account) as NostrHashtagFeedViewModel - } +class NostrHashtagFeedViewModel( + val hashtag: String, + val account: Account, +) : FeedViewModel(HashtagFeedFilter(hashtag, account)) { + class Factory( + val hashtag: String, + val account: Account, + ) : ViewModelProvider.Factory { + override fun create(modelClass: Class): NostrHashtagFeedViewModel = NostrHashtagFeedViewModel(hashtag, account) as NostrHashtagFeedViewModel } } -class NostrGeoHashFeedViewModel(val geohash: String, val account: Account) : - FeedViewModel(GeoHashFeedFilter(geohash, account)) { - class Factory(val geohash: String, val account: Account) : ViewModelProvider.Factory { - override fun create(modelClass: Class): NostrGeoHashFeedViewModel { - return NostrGeoHashFeedViewModel(geohash, account) as NostrGeoHashFeedViewModel - } +class NostrGeoHashFeedViewModel( + val geohash: String, + val account: Account, +) : FeedViewModel(GeoHashFeedFilter(geohash, account)) { + class Factory( + val geohash: String, + val account: Account, + ) : ViewModelProvider.Factory { + override fun create(modelClass: Class): NostrGeoHashFeedViewModel = NostrGeoHashFeedViewModel(geohash, account) as NostrGeoHashFeedViewModel } } -class NostrCommunityFeedViewModel(val note: AddressableNote, val account: Account) : - FeedViewModel(CommunityFeedFilter(note, account)) { - class Factory(val note: AddressableNote, val account: Account) : ViewModelProvider.Factory { - override fun create(modelClass: Class): NostrCommunityFeedViewModel { - return NostrCommunityFeedViewModel(note, account) as NostrCommunityFeedViewModel - } +class NostrCommunityFeedViewModel( + val note: AddressableNote, + val account: Account, +) : FeedViewModel(CommunityFeedFilter(note, account)) { + class Factory( + val note: AddressableNote, + val account: Account, + ) : ViewModelProvider.Factory { + override fun create(modelClass: Class): NostrCommunityFeedViewModel = NostrCommunityFeedViewModel(note, account) as NostrCommunityFeedViewModel } } -class NostrUserProfileReportFeedViewModel(val user: User) : - FeedViewModel(UserProfileReportsFeedFilter(user)) { - class Factory(val user: User) : ViewModelProvider.Factory { - override fun create(modelClass: Class): NostrUserProfileReportFeedViewModel { - return NostrUserProfileReportFeedViewModel(user) as NostrUserProfileReportFeedViewModel - } +class NostrUserProfileReportFeedViewModel( + val user: User, +) : FeedViewModel(UserProfileReportsFeedFilter(user)) { + class Factory( + val user: User, + ) : ViewModelProvider.Factory { + override fun create(modelClass: Class): NostrUserProfileReportFeedViewModel = NostrUserProfileReportFeedViewModel(user) as NostrUserProfileReportFeedViewModel } } -class NostrUserProfileBookmarksFeedViewModel(val user: User, val account: Account) : - FeedViewModel(UserProfileBookmarksFeedFilter(user, account)) { - class Factory(val user: User, val account: Account) : ViewModelProvider.Factory { - override fun create(modelClass: Class): NostrUserProfileBookmarksFeedViewModel { - return NostrUserProfileBookmarksFeedViewModel(user, account) +class NostrUserProfileBookmarksFeedViewModel( + val user: User, + val account: Account, +) : FeedViewModel(UserProfileBookmarksFeedFilter(user, account)) { + class Factory( + val user: User, + val account: Account, + ) : ViewModelProvider.Factory { + override fun create(modelClass: Class): NostrUserProfileBookmarksFeedViewModel = + NostrUserProfileBookmarksFeedViewModel(user, account) as NostrUserProfileBookmarksFeedViewModel - } } } -class NostrChatroomListKnownFeedViewModel(val account: Account) : - FeedViewModel(ChatroomListKnownFeedFilter(account)) { - class Factory(val account: Account) : ViewModelProvider.Factory { - override fun create(modelClass: Class): NostrChatroomListKnownFeedViewModel { - return NostrChatroomListKnownFeedViewModel(account) as NostrChatroomListKnownFeedViewModel - } +class NostrChatroomListKnownFeedViewModel( + val account: Account, +) : FeedViewModel(ChatroomListKnownFeedFilter(account)) { + class Factory( + val account: Account, + ) : ViewModelProvider.Factory { + override fun create(modelClass: Class): NostrChatroomListKnownFeedViewModel = NostrChatroomListKnownFeedViewModel(account) as NostrChatroomListKnownFeedViewModel } } -class NostrChatroomListNewFeedViewModel(val account: Account) : - FeedViewModel(ChatroomListNewFeedFilter(account)) { - class Factory(val account: Account) : ViewModelProvider.Factory { - override fun create(modelClass: Class): NostrChatroomListNewFeedViewModel { - return NostrChatroomListNewFeedViewModel(account) as NostrChatroomListNewFeedViewModel - } +class NostrChatroomListNewFeedViewModel( + val account: Account, +) : FeedViewModel(ChatroomListNewFeedFilter(account)) { + class Factory( + val account: Account, + ) : ViewModelProvider.Factory { + override fun create(modelClass: Class): NostrChatroomListNewFeedViewModel = NostrChatroomListNewFeedViewModel(account) as NostrChatroomListNewFeedViewModel } } @Stable -class NostrHomeFeedViewModel(val account: Account) : - FeedViewModel(HomeNewThreadFeedFilter(account)) { - class Factory(val account: Account) : ViewModelProvider.Factory { - override fun create(modelClass: Class): NostrHomeFeedViewModel { - return NostrHomeFeedViewModel(account) as NostrHomeFeedViewModel - } +class NostrHomeFeedViewModel( + val account: Account, +) : FeedViewModel(HomeNewThreadFeedFilter(account)) { + class Factory( + val account: Account, + ) : ViewModelProvider.Factory { + override fun create(modelClass: Class): NostrHomeFeedViewModel = NostrHomeFeedViewModel(account) as NostrHomeFeedViewModel } } @Stable -class NostrHomeRepliesFeedViewModel(val account: Account) : - FeedViewModel(HomeConversationsFeedFilter(account)) { - class Factory(val account: Account) : ViewModelProvider.Factory { - override fun create(modelClass: Class): NostrHomeRepliesFeedViewModel { - return NostrHomeRepliesFeedViewModel(account) as NostrHomeRepliesFeedViewModel - } +class NostrHomeRepliesFeedViewModel( + val account: Account, +) : FeedViewModel(HomeConversationsFeedFilter(account)) { + class Factory( + val account: Account, + ) : ViewModelProvider.Factory { + override fun create(modelClass: Class): NostrHomeRepliesFeedViewModel = NostrHomeRepliesFeedViewModel(account) as NostrHomeRepliesFeedViewModel } } @Stable -class NostrBookmarkPublicFeedViewModel(val account: Account) : - FeedViewModel(BookmarkPublicFeedFilter(account)) { - class Factory(val account: Account) : ViewModelProvider.Factory { - override fun create(modelClass: Class): NostrBookmarkPublicFeedViewModel { - return NostrBookmarkPublicFeedViewModel(account) as NostrBookmarkPublicFeedViewModel - } +class NostrBookmarkPublicFeedViewModel( + val account: Account, +) : FeedViewModel(BookmarkPublicFeedFilter(account)) { + class Factory( + val account: Account, + ) : ViewModelProvider.Factory { + override fun create(modelClass: Class): NostrBookmarkPublicFeedViewModel = NostrBookmarkPublicFeedViewModel(account) as NostrBookmarkPublicFeedViewModel } } @Stable -class NostrBookmarkPrivateFeedViewModel(val account: Account) : - FeedViewModel(BookmarkPrivateFeedFilter(account)) { - class Factory(val account: Account) : ViewModelProvider.Factory { - override fun create(modelClass: Class): NostrBookmarkPrivateFeedViewModel { - return NostrBookmarkPrivateFeedViewModel(account) as NostrBookmarkPrivateFeedViewModel - } +class NostrBookmarkPrivateFeedViewModel( + val account: Account, +) : FeedViewModel(BookmarkPrivateFeedFilter(account)) { + class Factory( + val account: Account, + ) : ViewModelProvider.Factory { + override fun create(modelClass: Class): NostrBookmarkPrivateFeedViewModel = NostrBookmarkPrivateFeedViewModel(account) as NostrBookmarkPrivateFeedViewModel } } @Stable -class NostrNIP90ContentDiscoveryFeedViewModel(val account: Account, val dvmkey: String, val requestid: String) : - FeedViewModel(NIP90ContentDiscoveryResponseFilter(account, dvmkey, requestid)) { - class Factory(val account: Account, val dvmkey: String, val requestid: String) : ViewModelProvider.Factory { - override fun create(modelClass: Class): NostrNIP90ContentDiscoveryFeedViewModel { - return NostrNIP90ContentDiscoveryFeedViewModel(account, dvmkey, requestid) as NostrNIP90ContentDiscoveryFeedViewModel - } +class NostrNIP90ContentDiscoveryFeedViewModel( + val account: Account, + val dvmkey: String, + val requestid: String, +) : FeedViewModel(NIP90ContentDiscoveryResponseFilter(account, dvmkey, requestid)) { + class Factory( + val account: Account, + val dvmkey: String, + val requestid: String, + ) : ViewModelProvider.Factory { + override fun create(modelClass: Class): NostrNIP90ContentDiscoveryFeedViewModel = NostrNIP90ContentDiscoveryFeedViewModel(account, dvmkey, requestid) as NostrNIP90ContentDiscoveryFeedViewModel } } @Stable -class NostrDraftEventsFeedViewModel(val account: Account) : - FeedViewModel(DraftEventsFeedFilter(account)) { - class Factory(val account: Account) : ViewModelProvider.Factory { - override fun create(modelClass: Class): NostrDraftEventsFeedViewModel { - return NostrDraftEventsFeedViewModel(account) as NostrDraftEventsFeedViewModel - } +class NostrDraftEventsFeedViewModel( + val account: Account, +) : FeedViewModel(DraftEventsFeedFilter(account)) { + class Factory( + val account: Account, + ) : ViewModelProvider.Factory { + override fun create(modelClass: Class): NostrDraftEventsFeedViewModel = NostrDraftEventsFeedViewModel(account) as NostrDraftEventsFeedViewModel } } -class NostrUserAppRecommendationsFeedViewModel(val user: User) : - FeedViewModel(UserProfileAppRecommendationsFeedFilter(user)) { - class Factory(val user: User) : ViewModelProvider.Factory { - override fun create(modelClass: Class): NostrUserAppRecommendationsFeedViewModel { - return NostrUserAppRecommendationsFeedViewModel(user) +class NostrUserAppRecommendationsFeedViewModel( + val user: User, +) : FeedViewModel(UserProfileAppRecommendationsFeedFilter(user)) { + class Factory( + val user: User, + ) : ViewModelProvider.Factory { + override fun create(modelClass: Class): NostrUserAppRecommendationsFeedViewModel = + NostrUserAppRecommendationsFeedViewModel(user) as NostrUserAppRecommendationsFeedViewModel - } } } @Stable -abstract class FeedViewModel(val localFilter: FeedFilter) : - ViewModel(), InvalidatableViewModel { +abstract class FeedViewModel( + val localFilter: FeedFilter, +) : ViewModel(), + InvalidatableViewModel { private val _feedContent = MutableStateFlow(FeedState.Loading) val feedContent = _feedContent.asStateFlow() @@ -391,7 +445,9 @@ abstract class FeedViewModel(val localFilter: FeedFilter) : } else { val deletedEventIds = deletionEvents.flatMapTo(HashSet()) { it.deleteEvents() } val deletedEventAddresses = deletionEvents.flatMapTo(HashSet()) { it.deleteAddresses() } - oldNotesState.feed.value.filter { !it.wasOrShouldBeDeletedBy(deletedEventIds, deletedEventAddresses) }.toImmutableList() + oldNotesState.feed.value + .filter { !it.wasOrShouldBeDeletedBy(deletedEventIds, deletedEventAddresses) } + .toImmutableList() } val newList = diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/LnZapFeedState.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/LnZapFeedState.kt index 387dc1f9b..afc9e3002 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/LnZapFeedState.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/LnZapFeedState.kt @@ -26,15 +26,22 @@ import androidx.compose.runtime.Stable import com.vitorpamplona.amethyst.model.Note import kotlinx.collections.immutable.ImmutableList -@Immutable data class ZapReqResponse(val zapRequest: Note, val zapEvent: Note) +@Immutable data class ZapReqResponse( + val zapRequest: Note, + val zapEvent: Note, +) @Stable sealed class LnZapFeedState { object Loading : LnZapFeedState() - class Loaded(val feed: MutableState>) : LnZapFeedState() + class Loaded( + val feed: MutableState>, + ) : LnZapFeedState() object Empty : LnZapFeedState() - class FeedError(val errorMessage: String) : LnZapFeedState() + class FeedError( + val errorMessage: String, + ) : LnZapFeedState() } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/LnZapFeedViewModel.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/LnZapFeedViewModel.kt index a0db78fc0..0f5ba5c8c 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/LnZapFeedViewModel.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/LnZapFeedViewModel.kt @@ -41,17 +41,20 @@ import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch -class NostrUserProfileZapsFeedViewModel(user: User) : - LnZapFeedViewModel(UserProfileZapsFeedFilter(user)) { - class Factory(val user: User) : ViewModelProvider.Factory { - override fun create(modelClass: Class): NostrUserProfileZapsFeedViewModel { - return NostrUserProfileZapsFeedViewModel(user) as NostrUserProfileZapsFeedViewModel - } +class NostrUserProfileZapsFeedViewModel( + user: User, +) : LnZapFeedViewModel(UserProfileZapsFeedFilter(user)) { + class Factory( + val user: User, + ) : ViewModelProvider.Factory { + override fun create(modelClass: Class): NostrUserProfileZapsFeedViewModel = NostrUserProfileZapsFeedViewModel(user) as NostrUserProfileZapsFeedViewModel } } @Stable -open class LnZapFeedViewModel(val dataSource: FeedFilter) : ViewModel() { +open class LnZapFeedViewModel( + val dataSource: FeedFilter, +) : ViewModel() { private val _feedContent = MutableStateFlow(LnZapFeedState.Loading) val feedContent = _feedContent.asStateFlow() diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/RelayFeedView.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/RelayFeedView.kt index 38b5550b1..37889bcf8 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/RelayFeedView.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/RelayFeedView.kt @@ -50,7 +50,9 @@ import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch @Stable -class RelayFeedViewModel : ViewModel(), InvalidatableViewModel { +class RelayFeedViewModel : + ViewModel(), + InvalidatableViewModel { val order = compareByDescending { it.lastEvent } .thenByDescending { it.counter } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/StringFeedState.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/StringFeedState.kt index 14aec737f..37612a9e2 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/StringFeedState.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/StringFeedState.kt @@ -26,9 +26,13 @@ import kotlinx.collections.immutable.ImmutableList sealed class StringFeedState { object Loading : StringFeedState() - class Loaded(val feed: MutableState>) : StringFeedState() + class Loaded( + val feed: MutableState>, + ) : StringFeedState() object Empty : StringFeedState() - class FeedError(val errorMessage: String) : StringFeedState() + class FeedError( + val errorMessage: String, + ) : StringFeedState() } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/StringFeedViewModel.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/StringFeedViewModel.kt index 600d8b756..fc04151a0 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/StringFeedViewModel.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/StringFeedViewModel.kt @@ -41,20 +41,23 @@ import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch -class NostrHiddenWordsFeedViewModel(val account: Account) : - StringFeedViewModel( +class NostrHiddenWordsFeedViewModel( + val account: Account, +) : StringFeedViewModel( HiddenWordsFeedFilter(account), ) { - class Factory(val account: Account) : ViewModelProvider.Factory { - override fun create(modelClass: Class): NostrHiddenWordsFeedViewModel { - return NostrHiddenWordsFeedViewModel(account) as NostrHiddenWordsFeedViewModel - } + class Factory( + val account: Account, + ) : ViewModelProvider.Factory { + override fun create(modelClass: Class): NostrHiddenWordsFeedViewModel = NostrHiddenWordsFeedViewModel(account) as NostrHiddenWordsFeedViewModel } } @Stable -open class StringFeedViewModel(val dataSource: FeedFilter) : - ViewModel(), InvalidatableViewModel { +open class StringFeedViewModel( + val dataSource: FeedFilter, +) : ViewModel(), + InvalidatableViewModel { private val _feedContent = MutableStateFlow(StringFeedState.Loading) val feedContent = _feedContent.asStateFlow() diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/UserFeedState.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/UserFeedState.kt index 2feffee92..ceea2886e 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/UserFeedState.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/UserFeedState.kt @@ -27,9 +27,13 @@ import kotlinx.collections.immutable.ImmutableList sealed class UserFeedState { object Loading : UserFeedState() - class Loaded(val feed: MutableState>) : UserFeedState() + class Loaded( + val feed: MutableState>, + ) : UserFeedState() object Empty : UserFeedState() - class FeedError(val errorMessage: String) : UserFeedState() + class FeedError( + val errorMessage: String, + ) : UserFeedState() } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/UserFeedViewModel.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/UserFeedViewModel.kt index 252d3fdb0..8cb420a1f 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/UserFeedViewModel.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/UserFeedViewModel.kt @@ -45,47 +45,59 @@ import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch -class NostrUserProfileFollowsUserFeedViewModel(val user: User, val account: Account) : - UserFeedViewModel(UserProfileFollowsFeedFilter(user, account)) { - class Factory(val user: User, val account: Account) : ViewModelProvider.Factory { - override fun create(modelClass: Class): NostrUserProfileFollowsUserFeedViewModel { - return NostrUserProfileFollowsUserFeedViewModel(user, account) +class NostrUserProfileFollowsUserFeedViewModel( + val user: User, + val account: Account, +) : UserFeedViewModel(UserProfileFollowsFeedFilter(user, account)) { + class Factory( + val user: User, + val account: Account, + ) : ViewModelProvider.Factory { + override fun create(modelClass: Class): NostrUserProfileFollowsUserFeedViewModel = + NostrUserProfileFollowsUserFeedViewModel(user, account) as NostrUserProfileFollowsUserFeedViewModel - } } } -class NostrUserProfileFollowersUserFeedViewModel(val user: User, val account: Account) : - UserFeedViewModel(UserProfileFollowersFeedFilter(user, account)) { - class Factory(val user: User, val account: Account) : ViewModelProvider.Factory { - override fun create(modelClass: Class): NostrUserProfileFollowersUserFeedViewModel { - return NostrUserProfileFollowersUserFeedViewModel(user, account) +class NostrUserProfileFollowersUserFeedViewModel( + val user: User, + val account: Account, +) : UserFeedViewModel(UserProfileFollowersFeedFilter(user, account)) { + class Factory( + val user: User, + val account: Account, + ) : ViewModelProvider.Factory { + override fun create(modelClass: Class): NostrUserProfileFollowersUserFeedViewModel = + NostrUserProfileFollowersUserFeedViewModel(user, account) as NostrUserProfileFollowersUserFeedViewModel - } } } -class NostrHiddenAccountsFeedViewModel(val account: Account) : - UserFeedViewModel(HiddenAccountsFeedFilter(account)) { - class Factory(val account: Account) : ViewModelProvider.Factory { - override fun create(modelClass: Class): NostrHiddenAccountsFeedViewModel { - return NostrHiddenAccountsFeedViewModel(account) as NostrHiddenAccountsFeedViewModel - } +class NostrHiddenAccountsFeedViewModel( + val account: Account, +) : UserFeedViewModel(HiddenAccountsFeedFilter(account)) { + class Factory( + val account: Account, + ) : ViewModelProvider.Factory { + override fun create(modelClass: Class): NostrHiddenAccountsFeedViewModel = NostrHiddenAccountsFeedViewModel(account) as NostrHiddenAccountsFeedViewModel } } -class NostrSpammerAccountsFeedViewModel(val account: Account) : - UserFeedViewModel(SpammerAccountsFeedFilter(account)) { - class Factory(val account: Account) : ViewModelProvider.Factory { - override fun create(modelClass: Class): NostrSpammerAccountsFeedViewModel { - return NostrSpammerAccountsFeedViewModel(account) as NostrSpammerAccountsFeedViewModel - } +class NostrSpammerAccountsFeedViewModel( + val account: Account, +) : UserFeedViewModel(SpammerAccountsFeedFilter(account)) { + class Factory( + val account: Account, + ) : ViewModelProvider.Factory { + override fun create(modelClass: Class): NostrSpammerAccountsFeedViewModel = NostrSpammerAccountsFeedViewModel(account) as NostrSpammerAccountsFeedViewModel } } @Stable -open class UserFeedViewModel(val dataSource: FeedFilter) : - ViewModel(), InvalidatableViewModel { +open class UserFeedViewModel( + val dataSource: FeedFilter, +) : ViewModel(), + InvalidatableViewModel { private val _feedContent = MutableStateFlow(UserFeedState.Loading) val feedContent = _feedContent.asStateFlow() diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/HashtagScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/HashtagScreen.kt index bce5dd76b..3f9c8602e 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/HashtagScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/HashtagScreen.kt @@ -160,7 +160,11 @@ fun HashtagActionOptions( tag: String, accountViewModel: AccountViewModel, ) { - val userState by accountViewModel.userProfile().live().follows.observeAsState() + val userState by accountViewModel + .userProfile() + .live() + .follows + .observeAsState() val isFollowingTag by remember(userState) { derivedStateOf { userState?.user?.isFollowingHashtagCached(tag) ?: false } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/NotificationScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/NotificationScreen.kt index d607f0ba5..3412afeaa 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/NotificationScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/NotificationScreen.kt @@ -221,7 +221,8 @@ fun SummaryBar(model: UserReactionsViewModel) { Row( modifier = - Modifier.padding(vertical = 10.dp, horizontal = 20.dp) + Modifier + .padding(vertical = 10.dp, horizontal = 20.dp) .clickable(onClick = { showChart = !showChart }), ) { ProvideChartStyle( @@ -264,39 +265,36 @@ private fun ObserveAndShowChart( } @Stable -class LabelValueFormatter(val axisLabels: State>) : - AxisValueFormatter { +class LabelValueFormatter( + val axisLabels: State>, +) : AxisValueFormatter { override fun formatValue( value: Float, chartValues: ChartValues, - ): String { - return axisLabels.value[value.roundToInt()] - } + ): String = axisLabels.value[value.roundToInt()] } @Stable -class CountAxisValueFormatter() : AxisValueFormatter { +class CountAxisValueFormatter : AxisValueFormatter { override fun formatValue( value: Float, chartValues: ChartValues, - ): String { - return showCount(value.roundToInt()) - } + ): String = showCount(value.roundToInt()) } @Stable -class AmountAxisValueFormatter(val showDecimals: Boolean) : - AxisValueFormatter { +class AmountAxisValueFormatter( + val showDecimals: Boolean, +) : AxisValueFormatter { override fun formatValue( value: Float, chartValues: ChartValues, - ): String { - return if (showDecimals) { + ): String = + if (showDecimals) { showAmount(value.toBigDecimal()) } else { showAmountAxis(value.toBigDecimal()) } - } } var dfG: DecimalFormat = DecimalFormat("#G") diff --git a/amethyst/src/play/java/com/vitorpamplona/amethyst/service/lang/LanguageTranslatorService.kt b/amethyst/src/play/java/com/vitorpamplona/amethyst/service/lang/LanguageTranslatorService.kt index 6586a0e13..adc62a017 100644 --- a/amethyst/src/play/java/com/vitorpamplona/amethyst/service/lang/LanguageTranslatorService.kt +++ b/amethyst/src/play/java/com/vitorpamplona/amethyst/service/lang/LanguageTranslatorService.kt @@ -48,7 +48,8 @@ object LanguageTranslatorService { var executorService = Executors.newCachedThreadPool() private val options = - LanguageIdentificationOptions.Builder() + LanguageIdentificationOptions + .Builder() .setExecutor(executorService) .setConfidenceThreshold(0.6f) .build() @@ -62,9 +63,7 @@ object LanguageTranslatorService { private val translators = object : LruCache(3) { - override fun create(options: TranslatorOptions): Translator { - return Translation.getClient(options) - } + override fun create(options: TranslatorOptions): Translator = Translation.getClient(options) override fun entryRemoved( evicted: Boolean, @@ -80,9 +79,7 @@ object LanguageTranslatorService { translators.evictAll() } - fun identifyLanguage(text: String): Task { - return languageIdentification.identifyLanguage(text) - } + fun identifyLanguage(text: String): Task = languageIdentification.identifyLanguage(text) fun translate( text: String, @@ -98,7 +95,8 @@ object LanguageTranslatorService { } val options = - TranslatorOptions.Builder() + TranslatorOptions + .Builder() .setExecutor(executorService) .setSourceLanguage(sourceLangCode) .setTargetLanguage(targetLangCode) @@ -204,8 +202,8 @@ object LanguageTranslatorService { text: String, dontTranslateFrom: Set, translateTo: String, - ): Task { - return identifyLanguage(text).onSuccessTask(executorService) { + ): Task = + identifyLanguage(text).onSuccessTask(executorService) { if (it.equals(translateTo, true)) { Tasks.forCanceled() } else if (it != "und" && !dontTranslateFrom.contains(it)) { @@ -214,5 +212,4 @@ object LanguageTranslatorService { Tasks.forCanceled() } } - } } diff --git a/amethyst/src/play/java/com/vitorpamplona/amethyst/service/notifications/PushNotificationReceiverService.kt b/amethyst/src/play/java/com/vitorpamplona/amethyst/service/notifications/PushNotificationReceiverService.kt index 3b28a3843..a51e4094f 100644 --- a/amethyst/src/play/java/com/vitorpamplona/amethyst/service/notifications/PushNotificationReceiverService.kt +++ b/amethyst/src/play/java/com/vitorpamplona/amethyst/service/notifications/PushNotificationReceiverService.kt @@ -88,8 +88,7 @@ class PushNotificationReceiverService : FirebaseMessagingService() { } } - fun notificationManager(): NotificationManager { - return ContextCompat.getSystemService(applicationContext, NotificationManager::class.java) + fun notificationManager(): NotificationManager = + ContextCompat.getSystemService(applicationContext, NotificationManager::class.java) as NotificationManager - } } diff --git a/amethyst/src/test/java/com/vitorpamplona/amethyst/CharsetTest.kt b/amethyst/src/test/java/com/vitorpamplona/amethyst/CharsetTest.kt index e06bdc333..785a27140 100644 --- a/amethyst/src/test/java/com/vitorpamplona/amethyst/CharsetTest.kt +++ b/amethyst/src/test/java/com/vitorpamplona/amethyst/CharsetTest.kt @@ -104,8 +104,7 @@ class CharsetTest { "\uDEC2\uD83E\uDEC2\uD83E\uDEC2\uD83E\uDEC2\uD83E\uDEC2\uD83E\uDEC2\uD83E\uDEC2" + "\uD83E\uDEC2\uD83E\uDEC2\uD83E\uDEC2\uD83E\uDEC2\uD83E\uDEC2\uD83E\uDEC2\uD83E" + "\uDEC2\uD83E\uDEC2" - ) - .firstFullChar(), + ).firstFullChar(), ) } } diff --git a/amethyst/src/test/java/com/vitorpamplona/amethyst/NewMessageTaggerKeyParseTest.kt b/amethyst/src/test/java/com/vitorpamplona/amethyst/NewMessageTaggerKeyParseTest.kt index 7511e3123..ae82373dd 100644 --- a/amethyst/src/test/java/com/vitorpamplona/amethyst/NewMessageTaggerKeyParseTest.kt +++ b/amethyst/src/test/java/com/vitorpamplona/amethyst/NewMessageTaggerKeyParseTest.kt @@ -37,17 +37,11 @@ import org.junit.Test class NewMessageTaggerKeyParseTest { val dao: Dao = object : Dao { - override suspend fun getOrCreateUser(hex: String): User { - return User(hex) - } + override suspend fun getOrCreateUser(hex: String): User = User(hex) - override suspend fun getOrCreateNote(hex: String): Note { - return Note(hex) - } + override suspend fun getOrCreateNote(hex: String): Note = Note(hex) - override suspend fun checkGetOrCreateAddressableNote(hex: String): Note? { - return Note(hex) - } + override suspend fun checkGetOrCreateAddressableNote(hex: String): Note? = Note(hex) } @Test diff --git a/amethyst/src/test/java/com/vitorpamplona/amethyst/service/Nip96Test.kt b/amethyst/src/test/java/com/vitorpamplona/amethyst/service/Nip96Test.kt index 44a350500..d0da8d164 100644 --- a/amethyst/src/test/java/com/vitorpamplona/amethyst/service/Nip96Test.kt +++ b/amethyst/src/test/java/com/vitorpamplona/amethyst/service/Nip96Test.kt @@ -112,8 +112,7 @@ class Nip96Test { } } } - """ - .trimIndent() + """.trimIndent() @Test() fun parseNostrBuild() { @@ -132,7 +131,13 @@ class Nip96Test { assertEquals("https://nostr.build", info.plans["free"]?.url) assertEquals(26214400L, info.plans["free"]?.maxByteSize) assertEquals(listOf(0, 0), info.plans["free"]?.fileExpiration) - assertEquals(listOf("image", "video"), info.plans["free"]?.mediaTransformations?.keys?.sorted()) + assertEquals( + listOf("image", "video"), + info.plans["free"] + ?.mediaTransformations + ?.keys + ?.sorted(), + ) assertEquals(26843545600L, info.plans["creator"]?.maxByteSize) assertEquals(10737418240L, info.plans["professional"]?.maxByteSize) diff --git a/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/Constants.kt b/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/Constants.kt index 8c49189c1..fe08e6395 100644 --- a/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/Constants.kt +++ b/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/Constants.kt @@ -29,9 +29,7 @@ object Constants { setOf(FeedType.FOLLOWS, FeedType.PUBLIC_CHATS, FeedType.PRIVATE_DMS, FeedType.GLOBAL) val activeTypesSearch = setOf(FeedType.SEARCH) - fun convertDefaultRelays(): Array { - return defaultRelays.map { Relay(it.url, it.read, it.write, it.feedTypes) }.toTypedArray() - } + fun convertDefaultRelays(): Array = defaultRelays.map { Relay(it.url, it.read, it.write, it.feedTypes) }.toTypedArray() val defaultRelays = arrayOf( diff --git a/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/EOSETime.kt b/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/EOSETime.kt index 4d0ed60e4..b04236327 100644 --- a/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/EOSETime.kt +++ b/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/EOSETime.kt @@ -20,8 +20,8 @@ */ package com.vitorpamplona.ammolite.relays -class EOSETime(var time: Long) { - override fun toString(): String { - return time.toString() - } +class EOSETime( + var time: Long, +) { + override fun toString(): String = time.toString() } diff --git a/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/NostrDataSource.kt b/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/NostrDataSource.kt index 666b55061..82fa8ed8b 100644 --- a/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/NostrDataSource.kt +++ b/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/NostrDataSource.kt @@ -34,12 +34,18 @@ import kotlinx.coroutines.launch import java.util.UUID import java.util.concurrent.atomic.AtomicBoolean -abstract class NostrDataSource(val debugName: String) { +abstract class NostrDataSource( + val debugName: String, +) { private val scope = CoroutineScope(Dispatchers.IO + SupervisorJob()) private var subscriptions = mapOf() - data class Counter(val subscriptionId: String, val eventKind: Int, var counter: Int) + data class Counter( + val subscriptionId: String, + val eventKind: Int, + var counter: Int, + ) private var eventCounter = mapOf() var changingFilters = AtomicBoolean() @@ -58,9 +64,7 @@ abstract class NostrDataSource(val debugName: String) { fun hashCodeFields( str1: String, str2: Int, - ): Int { - return 31 * str1.hashCode() + str2.hashCode() - } + ): Int = 31 * str1.hashCode() + str2.hashCode() private val clientListener = object : Client.Listener() { diff --git a/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/RelayPool.kt b/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/RelayPool.kt index 0bc96ce90..40e02dbe5 100644 --- a/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/RelayPool.kt +++ b/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/RelayPool.kt @@ -47,21 +47,13 @@ object RelayPool : Relay.Listener { MutableSharedFlow(1, 1, onBufferOverflow = BufferOverflow.DROP_OLDEST) val statusFlow: SharedFlow = _statusFlow.asSharedFlow() - fun availableRelays(): Int { - return relays.size - } + fun availableRelays(): Int = relays.size - fun connectedRelays(): Int { - return relays.count { it.isConnected() } - } + fun connectedRelays(): Int = relays.count { it.isConnected() } - fun getRelay(url: String): Relay? { - return relays.firstOrNull { it.url == url } - } + fun getRelay(url: String): Relay? = relays.firstOrNull { it.url == url } - fun getRelays(url: String): List { - return relays.filter { it.url == url } - } + fun getRelays(url: String): List = relays.filter { it.url == url } fun getAll() = relays diff --git a/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/RelayStats.kt b/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/RelayStats.kt index 2db9be54f..df0f5a5d1 100644 --- a/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/RelayStats.kt +++ b/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/RelayStats.kt @@ -26,9 +26,7 @@ import com.vitorpamplona.quartz.utils.TimeUtils object RelayStats { private val innerCache = mutableMapOf() - fun get(url: String): RelayStat { - return innerCache.getOrPut(url) { RelayStat() } - } + fun get(url: String): RelayStat = innerCache.getOrPut(url) { RelayStat() } fun addBytesReceived( url: String, diff --git a/ammolite/src/main/java/com/vitorpamplona/ammolite/service/HttpClientManager.kt b/ammolite/src/main/java/com/vitorpamplona/ammolite/service/HttpClientManager.kt index 20b14bcae..62e907a61 100644 --- a/ammolite/src/main/java/com/vitorpamplona/ammolite/service/HttpClientManager.kt +++ b/ammolite/src/main/java/com/vitorpamplona/ammolite/service/HttpClientManager.kt @@ -59,9 +59,7 @@ object HttpClientManager { } } - fun getDefaultProxy(): Proxy? { - return this.internalProxy - } + fun getDefaultProxy(): Proxy? = this.internalProxy fun setDefaultTimeout(timeout: Duration) { Log.d("HttpClient", "Changing timeout to: $timeout") @@ -87,7 +85,8 @@ object HttpClientManager { ): OkHttpClient { val seconds = if (proxy != null) timeout.seconds * 3 else timeout.seconds val duration = Duration.ofSeconds(seconds) - return OkHttpClient.Builder() + return OkHttpClient + .Builder() .proxy(proxy) .readTimeout(duration) .connectTimeout(duration) @@ -123,8 +122,8 @@ object HttpClientManager { } } - fun getHttpClient(useProxy: Boolean = true): OkHttpClient { - return if (useProxy) { + fun getHttpClient(useProxy: Boolean = true): OkHttpClient = + if (useProxy) { if (this.defaultHttpClient == null) { this.defaultHttpClient = buildHttpClient(internalProxy, defaultTimeout) } @@ -135,13 +134,10 @@ object HttpClientManager { } defaultHttpClientWithoutProxy!! } - } fun initProxy( useProxy: Boolean, hostname: String, port: Int, - ): Proxy? { - return if (useProxy) Proxy(Proxy.Type.SOCKS, InetSocketAddress(hostname, port)) else null - } + ): Proxy? = if (useProxy) Proxy(Proxy.Type.SOCKS, InetSocketAddress(hostname, port)) else null } diff --git a/ammolite/src/main/java/com/vitorpamplona/ammolite/service/MainThreadChecker.kt b/ammolite/src/main/java/com/vitorpamplona/ammolite/service/MainThreadChecker.kt index 9b0996073..ff549f5e3 100644 --- a/ammolite/src/main/java/com/vitorpamplona/ammolite/service/MainThreadChecker.kt +++ b/ammolite/src/main/java/com/vitorpamplona/ammolite/service/MainThreadChecker.kt @@ -31,4 +31,6 @@ fun checkNotInMainThread() { fun isMainThread() = Looper.myLooper() == Looper.getMainLooper() -class OnMainThreadException(str: String) : RuntimeException(str) +class OnMainThreadException( + str: String, +) : RuntimeException(str) diff --git a/benchmark/src/androidTest/java/com/vitorpamplona/amethyst/benchmark/MetaTagsParserBenchmark.kt b/benchmark/src/androidTest/java/com/vitorpamplona/amethyst/benchmark/MetaTagsParserBenchmark.kt index 53df80577..273c3d775 100644 --- a/benchmark/src/androidTest/java/com/vitorpamplona/amethyst/benchmark/MetaTagsParserBenchmark.kt +++ b/benchmark/src/androidTest/java/com/vitorpamplona/amethyst/benchmark/MetaTagsParserBenchmark.kt @@ -35,8 +35,11 @@ import java.nio.charset.Charset @RunWith(AndroidJUnit4::class) class MetaTagsParserBenchmark { private val html = - getInstrumentation().context.assets.open("github_amethyst.html") - .readBytes().toString(Charset.forName("utf-8")) + getInstrumentation() + .context.assets + .open("github_amethyst.html") + .readBytes() + .toString(Charset.forName("utf-8")) @get:Rule val benchmarkRule = BenchmarkRule() diff --git a/benchmark/src/androidTest/java/com/vitorpamplona/amethyst/benchmark/RichTextParserBenchmark.kt b/benchmark/src/androidTest/java/com/vitorpamplona/amethyst/benchmark/RichTextParserBenchmark.kt index 684c1bc6a..190eb3ff9 100644 --- a/benchmark/src/androidTest/java/com/vitorpamplona/amethyst/benchmark/RichTextParserBenchmark.kt +++ b/benchmark/src/androidTest/java/com/vitorpamplona/amethyst/benchmark/RichTextParserBenchmark.kt @@ -59,11 +59,13 @@ class RichTextParserBenchmark { fun parseImageUrl() { benchmarkRule.measureRepeated { assertTrue( - RichTextParser().parseText( - "first https://m.primal.net/HeKw.jpg second", - EmptyTagList, - null, - ).paragraphs[0].words[1] is ImageSegment, + RichTextParser() + .parseText( + "first https://m.primal.net/HeKw.jpg second", + EmptyTagList, + null, + ).paragraphs[0] + .words[1] is ImageSegment, ) } } @@ -72,11 +74,13 @@ class RichTextParserBenchmark { fun parseNoSchemeUrl() { benchmarkRule.measureRepeated { assertTrue( - RichTextParser().parseText( - "first amethyst.social second", - EmptyTagList, - null, - ).paragraphs[0].words[1] is LinkSegment, + RichTextParser() + .parseText( + "first amethyst.social second", + EmptyTagList, + null, + ).paragraphs[0] + .words[1] is LinkSegment, ) } } @@ -85,11 +89,13 @@ class RichTextParserBenchmark { fun parseHashtag() { benchmarkRule.measureRepeated { assertTrue( - RichTextParser().parseText( - "first #amethyst second", - EmptyTagList, - null, - ).paragraphs[0].words[1] is HashTagSegment, + RichTextParser() + .parseText( + "first #amethyst second", + EmptyTagList, + null, + ).paragraphs[0] + .words[1] is HashTagSegment, ) } } diff --git a/benchmark/src/androidTest/java/com/vitorpamplona/quartz/benchmark/BechBenchmark.kt b/benchmark/src/androidTest/java/com/vitorpamplona/quartz/benchmark/BechBenchmark.kt index 879200c91..0bd3b3f74 100644 --- a/benchmark/src/androidTest/java/com/vitorpamplona/quartz/benchmark/BechBenchmark.kt +++ b/benchmark/src/androidTest/java/com/vitorpamplona/quartz/benchmark/BechBenchmark.kt @@ -83,8 +83,7 @@ class BechBenchmark { -123, 6, 92, - ) - .map { it.toByte() } + ).map { it.toByte() } benchmarkRule.measureRepeated { assertEquals(expected, myUser.bechToBytes().toList()) } } } diff --git a/benchmark/src/androidTest/java/com/vitorpamplona/quartz/benchmark/ContainsBenchmark.kt b/benchmark/src/androidTest/java/com/vitorpamplona/quartz/benchmark/ContainsBenchmark.kt index 112132d3b..bb5ee9238 100644 --- a/benchmark/src/androidTest/java/com/vitorpamplona/quartz/benchmark/ContainsBenchmark.kt +++ b/benchmark/src/androidTest/java/com/vitorpamplona/quartz/benchmark/ContainsBenchmark.kt @@ -38,8 +38,7 @@ class ContainsBenchmark { """Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old. Richard McClintock, a Latin professor at Hampden-Sydney College in Virginia, looked up one of the more obscure Latin words, consectetur, from a Lorem Ipsum passage, and going through the cites of the word in classical literature, discovered the undoubtable source. Lorem Ipsum comes from sections 1.10.32 and 1.10.33 of "de Finibus Bonorum et Malorum" (The Extremes of Good and Evil) by Cicero, written in 45 BC. This book is a treatise on the theory of ethics, very popular during the Renaissance. The first line of Lorem Ipsum, "Lorem ipsum dolor sit amet..", comes from a line in section 1.10.32. The standard chunk of Lorem Ipsum used since the 1500s is reproduced below for those interested. Sections 1.10.32 and 1.10.33 from "de Finibus Bonorum et Malorum" by Cicero are also reproduced in their exact original form, accompanied by English versions from the 1914 translation by H. Rackham. -""" - .intern() +""".intern() val atTheMiddle = DualCase("Lorem Ipsum".lowercase(), "Lorem Ipsum".uppercase()) val atTheBeginning = DualCase("contrAry".lowercase(), "contrAry".uppercase()) diff --git a/benchmark/src/androidTest/java/com/vitorpamplona/quartz/benchmark/HexBenchmark.kt b/benchmark/src/androidTest/java/com/vitorpamplona/quartz/benchmark/HexBenchmark.kt index 8a4744cde..b18c944c2 100644 --- a/benchmark/src/androidTest/java/com/vitorpamplona/quartz/benchmark/HexBenchmark.kt +++ b/benchmark/src/androidTest/java/com/vitorpamplona/quartz/benchmark/HexBenchmark.kt @@ -43,28 +43,48 @@ class HexBenchmark { @Test fun hexDecodeOurs() { - benchmarkRule.measureRepeated { com.vitorpamplona.quartz.encoders.Hex.decode(testHex) } + benchmarkRule.measureRepeated { + com.vitorpamplona.quartz.encoders.Hex + .decode(testHex) + } } @Test fun hexEncodeOurs() { - val bytes = com.vitorpamplona.quartz.encoders.Hex.decode(testHex) + val bytes = + com.vitorpamplona.quartz.encoders.Hex + .decode(testHex) benchmarkRule.measureRepeated { - assertEquals(testHex, com.vitorpamplona.quartz.encoders.Hex.encode(bytes)) + assertEquals( + testHex, + com.vitorpamplona.quartz.encoders.Hex + .encode(bytes), + ) } } @Test fun hexDecodeBaseSecp() { - benchmarkRule.measureRepeated { fr.acinq.secp256k1.Hex.decode(testHex) } + benchmarkRule.measureRepeated { + fr.acinq.secp256k1.Hex + .decode(testHex) + } } @Test fun hexEncodeBaseSecp() { - val bytes = fr.acinq.secp256k1.Hex.decode(testHex) + val bytes = + fr.acinq.secp256k1.Hex + .decode(testHex) - benchmarkRule.measureRepeated { assertEquals(testHex, fr.acinq.secp256k1.Hex.encode(bytes)) } + benchmarkRule.measureRepeated { + assertEquals( + testHex, + fr.acinq.secp256k1.Hex + .encode(bytes), + ) + } } @Test diff --git a/build.gradle b/build.gradle index bcfa3d173..306762d2b 100644 --- a/build.gradle +++ b/build.gradle @@ -16,7 +16,7 @@ subprojects { target '**/*.kt' targetExclude("$layout.buildDirectory/**/*.kt") - ktlint("1.1.0") + ktlint("1.3.1") licenseHeaderFile rootProject.file('spotless/copyright.kt'), "package|import|class|object|sealed|open|interface|abstract " } diff --git a/commons/src/androidTest/java/com/vitorpamplona/amethyst/commons/richtext/RichTextParserTest.kt b/commons/src/androidTest/java/com/vitorpamplona/amethyst/commons/richtext/RichTextParserTest.kt index a940c9ca7..81e444c65 100644 --- a/commons/src/androidTest/java/com/vitorpamplona/amethyst/commons/richtext/RichTextParserTest.kt +++ b/commons/src/androidTest/java/com/vitorpamplona/amethyst/commons/richtext/RichTextParserTest.kt @@ -681,8 +681,7 @@ class RichTextParserTest { 🕵️ @nostrin "The Nostr Inspector" npub17m7f7q08k4x746s2v45eyvwppck32dcahw7uj2mu5txuswldgqkqw9zms7 - """ - .trimIndent() + """.trimIndent() @Test fun testTextToParse() { @@ -4044,7 +4043,11 @@ class RichTextParserTest { org.junit.Assert.assertTrue(state.customEmoji.isEmpty()) org.junit.Assert.assertEquals( "Hi, how are you doing? ", - state.paragraphs.firstOrNull()?.words?.firstOrNull()?.segmentText, + state.paragraphs + .firstOrNull() + ?.words + ?.firstOrNull() + ?.segmentText, ) } @@ -4071,8 +4074,7 @@ class RichTextParserTest { See how it can be done here: https://lnshort.it/live-stream-embeds/ https://nostr.build/i/fd53fcf5ad950fbe45127e4bcee1b59e8301d41de6beee211f45e344db214e8a.jpg - """ - .trimIndent() + """.trimIndent() val state = RichTextParser() diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/compose/AsyncCachedState.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/compose/AsyncCachedState.kt index 87710c5b0..7d1504e68 100644 --- a/commons/src/main/java/com/vitorpamplona/amethyst/commons/compose/AsyncCachedState.kt +++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/compose/AsyncCachedState.kt @@ -29,26 +29,24 @@ import androidx.compose.runtime.produceState fun produceCachedStateAsync( cache: AsyncCachedState, key: K, -): State { - return produceState(initialValue = cache.cached(key), key1 = key) { +): State = + produceState(initialValue = cache.cached(key), key1 = key) { cache.update(key) { value = it } } -} @Composable fun produceCachedStateAsync( cache: AsyncCachedState, key: String, updateValue: K, -): State { - return produceState(initialValue = cache.cached(updateValue), key1 = key) { +): State = + produceState(initialValue = cache.cached(updateValue), key1 = key) { cache.update(updateValue) { value = it } } -} interface AsyncCachedState { fun cached(k: K): V? @@ -59,12 +57,12 @@ interface AsyncCachedState { ) } -abstract class GenericBaseCacheAsync(capacity: Int) : AsyncCachedState { +abstract class GenericBaseCacheAsync( + capacity: Int, +) : AsyncCachedState { private val cache = LruCache(capacity) - override fun cached(k: K): V? { - return cache[k] - } + override fun cached(k: K): V? = cache[k] override suspend fun update( k: K, diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/compose/CachedState.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/compose/CachedState.kt index 0e9add75f..3cc746608 100644 --- a/commons/src/main/java/com/vitorpamplona/amethyst/commons/compose/CachedState.kt +++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/compose/CachedState.kt @@ -29,22 +29,20 @@ import androidx.compose.runtime.produceState fun produceCachedState( cache: CachedState, key: K, -): State { - return produceState(initialValue = cache.cached(key), key1 = key) { +): State = + produceState(initialValue = cache.cached(key), key1 = key) { value = cache.update(key) } -} @Composable fun produceCachedState( cache: CachedState, key: String, updateValue: K, -): State { - return produceState(initialValue = cache.cached(updateValue), key1 = key) { +): State = + produceState(initialValue = cache.cached(updateValue), key1 = key) { value = cache.update(updateValue) } -} interface CachedState { fun cached(k: K): V? @@ -52,12 +50,12 @@ interface CachedState { suspend fun update(k: K): V? } -abstract class GenericBaseCache(capacity: Int) : CachedState { +abstract class GenericBaseCache( + capacity: Int, +) : CachedState { private val cache = LruCache(capacity) - override fun cached(k: K): V? { - return cache[k] - } + override fun cached(k: K): V? = cache[k] override suspend fun update(k: K): V? { cache[k]?.let { return it } diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/data/DeletionIndex.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/data/DeletionIndex.kt index 642d6f577..01f777da8 100644 --- a/commons/src/main/java/com/vitorpamplona/amethyst/commons/data/DeletionIndex.kt +++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/data/DeletionIndex.kt @@ -26,7 +26,10 @@ import com.vitorpamplona.quartz.events.DeletionEvent import com.vitorpamplona.quartz.events.Event class DeletionIndex { - data class DeletionRequest(val reference: String, val publicKey: HexKey) : Comparable { + data class DeletionRequest( + val reference: String, + val publicKey: HexKey, + ) : Comparable { override fun compareTo(other: DeletionRequest): Int { val compared = reference.compareTo(other.reference) diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/data/LargeCache.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/data/LargeCache.kt index 02e96bd2b..2df08520b 100644 --- a/commons/src/main/java/com/vitorpamplona/amethyst/commons/data/LargeCache.kt +++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/data/LargeCache.kt @@ -167,7 +167,9 @@ fun interface BiFilter { ): Boolean } -class BiFilterCollector(val filter: BiFilter) : BiConsumer { +class BiFilterCollector( + val filter: BiFilter, +) : BiConsumer { var results: ArrayList = ArrayList() override fun accept( @@ -180,7 +182,9 @@ class BiFilterCollector(val filter: BiFilter) : BiConsumer { } } -class BiFilterUniqueCollector(val filter: BiFilter) : BiConsumer { +class BiFilterUniqueCollector( + val filter: BiFilter, +) : BiConsumer { var results: HashSet = HashSet() override fun accept( @@ -200,7 +204,9 @@ fun interface BiMapper { ): R? } -class BiMapCollector(val mapper: BiMapper) : BiConsumer { +class BiMapCollector( + val mapper: BiMapper, +) : BiConsumer { var results: ArrayList = ArrayList() override fun accept( @@ -214,7 +220,9 @@ class BiMapCollector(val mapper: BiMapper) : BiConsumer } } -class BiMapUniqueCollector(val mapper: BiMapper) : BiConsumer { +class BiMapUniqueCollector( + val mapper: BiMapper, +) : BiConsumer { var results: HashSet = HashSet() override fun accept( @@ -228,7 +236,9 @@ class BiMapUniqueCollector(val mapper: BiMapper) : BiConsumer } } -class BiMapFlattenCollector(val mapper: BiMapper?>) : BiConsumer { +class BiMapFlattenCollector( + val mapper: BiMapper?>, +) : BiConsumer { var results: ArrayList = ArrayList() override fun accept( @@ -242,7 +252,9 @@ class BiMapFlattenCollector(val mapper: BiMapper?>) } } -class BiMapFlattenUniqueCollector(val mapper: BiMapper?>) : BiConsumer { +class BiMapFlattenUniqueCollector( + val mapper: BiMapper?>, +) : BiConsumer { var results: HashSet = HashSet() override fun accept( @@ -263,7 +275,9 @@ fun interface BiNotNullMapper { ): R } -class BiNotNullMapCollector(val mapper: BiNotNullMapper) : BiConsumer { +class BiNotNullMapCollector( + val mapper: BiNotNullMapper, +) : BiConsumer { var results: ArrayList = ArrayList() override fun accept( @@ -281,7 +295,10 @@ fun interface BiSumOf { ): Int } -class BiMaxOfCollector(val filter: BiFilter, val comparator: Comparator) : BiConsumer { +class BiMaxOfCollector( + val filter: BiFilter, + val comparator: Comparator, +) : BiConsumer { var maxK: K? = null var maxV: V? = null @@ -298,7 +315,9 @@ class BiMaxOfCollector(val filter: BiFilter, val comparator: Compara } } -class BiSumOfCollector(val mapper: BiSumOf) : BiConsumer { +class BiSumOfCollector( + val mapper: BiSumOf, +) : BiConsumer { var sum = 0 override fun accept( @@ -316,7 +335,9 @@ fun interface BiSumOfLong { ): Long } -class BiSumOfLongCollector(val mapper: BiSumOfLong) : BiConsumer { +class BiSumOfLongCollector( + val mapper: BiSumOfLong, +) : BiConsumer { var sum = 0L override fun accept( @@ -327,7 +348,9 @@ class BiSumOfLongCollector(val mapper: BiSumOfLong) : BiConsumer(val mapper: BiNotNullMapper) : BiConsumer { +class BiGroupByCollector( + val mapper: BiNotNullMapper, +) : BiConsumer { var results = HashMap>() override fun accept( @@ -347,7 +370,9 @@ class BiGroupByCollector(val mapper: BiNotNullMapper) : BiCons } } -class BiCountByGroupCollector(val mapper: BiNotNullMapper) : BiConsumer { +class BiCountByGroupCollector( + val mapper: BiNotNullMapper, +) : BiConsumer { var results = HashMap() override fun accept( @@ -365,7 +390,10 @@ class BiCountByGroupCollector(val mapper: BiNotNullMapper) : B } } -class BiSumByGroupCollector(val mapper: BiNotNullMapper, val sumOf: BiNotNullMapper) : BiConsumer { +class BiSumByGroupCollector( + val mapper: BiNotNullMapper, + val sumOf: BiNotNullMapper, +) : BiConsumer { var results = HashMap() override fun accept( @@ -383,7 +411,9 @@ class BiSumByGroupCollector(val mapper: BiNotNullMapper, val s } } -class BiCountIfCollector(val filter: BiFilter) : BiConsumer { +class BiCountIfCollector( + val filter: BiFilter, +) : BiConsumer { var count = 0 override fun accept( diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/hashtags/Amethyst.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/hashtags/Amethyst.kt index 7d892a11b..257dc7802 100644 --- a/commons/src/main/java/com/vitorpamplona/amethyst/commons/hashtags/Amethyst.kt +++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/hashtags/Amethyst.kt @@ -129,8 +129,7 @@ public val CustomHashTagIcons.Amethyst: ImageVector curveTo(125.96f, 142.56f, 166.87f, 142.54f, 170.13f, 142.54f) close() } - } - .build() + }.build() return customHashTagIconsAmethyst!! } diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/hashtags/Btc.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/hashtags/Btc.kt index 0b7282358..48c6f69b8 100644 --- a/commons/src/main/java/com/vitorpamplona/amethyst/commons/hashtags/Btc.kt +++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/hashtags/Btc.kt @@ -118,8 +118,7 @@ public val CustomHashTagIcons.Btc: ImageVector curveToRelative(3.1295f, 0.78f, 13.2078f, 2.2358f, 11.5799f, 8.7678f) close() } - } - .build() + }.build() return customHashTagIconsBtc!! } diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/hashtags/Cashu.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/hashtags/Cashu.kt index 3fb29a022..1f4ad7e40 100644 --- a/commons/src/main/java/com/vitorpamplona/amethyst/commons/hashtags/Cashu.kt +++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/hashtags/Cashu.kt @@ -274,8 +274,7 @@ public val CustomHashTagIcons.Cashu: ImageVector lineToRelative(-9.439f, -0.043f) close() } - } - .build() + }.build() return customHashTagIconsCashu!! } diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/hashtags/Coffee.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/hashtags/Coffee.kt index c0b4a855a..1e5c1b49d 100644 --- a/commons/src/main/java/com/vitorpamplona/amethyst/commons/hashtags/Coffee.kt +++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/hashtags/Coffee.kt @@ -344,8 +344,7 @@ public val CustomHashTagIcons.Coffee: ImageVector curveTo(338.856f, -2.773f, 332.82f, 9.412f, 335.914f, 14.7f) close() } - } - .build() + }.build() return customHashTagIconsCoffee!! } diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/hashtags/Footstr.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/hashtags/Footstr.kt index 01163d9f2..2128b1935 100644 --- a/commons/src/main/java/com/vitorpamplona/amethyst/commons/hashtags/Footstr.kt +++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/hashtags/Footstr.kt @@ -154,8 +154,7 @@ public val CustomHashTagIcons.Footstr: ImageVector curveToRelative(7.881f, -1.9f, 12.632f, -11.136f, 5.51f, -16.777f) curveToRelative(-3.211f, -2.542f, -8.913f, -2.1f, -12.721f, -1.212f) } - } - .build() + }.build() return customHashTagIconsFootStr!! } diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/hashtags/Grownostr.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/hashtags/Grownostr.kt index f2a838856..f9bf649e4 100644 --- a/commons/src/main/java/com/vitorpamplona/amethyst/commons/hashtags/Grownostr.kt +++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/hashtags/Grownostr.kt @@ -289,8 +289,7 @@ public val CustomHashTagIcons.Grownostr: ImageVector curveToRelative(-9.678f, 2.827f, -17.397f, 1.076f, -25.003f, 7.709f) close() } - } - .build() + }.build() return customHashTagIconsGrowNostr!! } diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/hashtags/Lightning.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/hashtags/Lightning.kt index f60683700..879430bc1 100644 --- a/commons/src/main/java/com/vitorpamplona/amethyst/commons/hashtags/Lightning.kt +++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/hashtags/Lightning.kt @@ -193,8 +193,7 @@ public val CustomHashTagIcons.Lightning: ImageVector lineTo(276.0f, 279.0f) close() } - } - .build() + }.build() return customHashTagIconsLightning!! } diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/hashtags/Mate.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/hashtags/Mate.kt index 63dda952e..1a95b82cb 100644 --- a/commons/src/main/java/com/vitorpamplona/amethyst/commons/hashtags/Mate.kt +++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/hashtags/Mate.kt @@ -232,8 +232,7 @@ public val CustomHashTagIcons.Mate: ImageVector curveToRelative(-2.036f, -1.667f, -3.397f, -3.386f, -4.315f, -3.471f) close() } - } - .build() + }.build() return customHashTagIconsMate!! } diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/hashtags/Nostr.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/hashtags/Nostr.kt index ebf5bfb46..c28bf3334 100644 --- a/commons/src/main/java/com/vitorpamplona/amethyst/commons/hashtags/Nostr.kt +++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/hashtags/Nostr.kt @@ -143,8 +143,7 @@ public val CustomHashTagIcons.Nostr: ImageVector curveToRelative(-1.387f, 1.776f, 0.99f, 4.574f, 1.938f, 5.986f) close() } - } - .build() + }.build() return customHashTagIconsNostr!! } diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/hashtags/Plebs.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/hashtags/Plebs.kt index e8c7ba2cb..e39b23b2c 100644 --- a/commons/src/main/java/com/vitorpamplona/amethyst/commons/hashtags/Plebs.kt +++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/hashtags/Plebs.kt @@ -166,8 +166,7 @@ public val CustomHashTagIcons.Plebs: ImageVector curveToRelative(23.685f, -4.025f, 130.22f, 11.249f, 120.457f, -7.015f) close() } - } - .build() + }.build() return customHashTagIconsPlebs!! } diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/hashtags/Skull.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/hashtags/Skull.kt index 0d489a0cd..793658b40 100644 --- a/commons/src/main/java/com/vitorpamplona/amethyst/commons/hashtags/Skull.kt +++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/hashtags/Skull.kt @@ -548,8 +548,7 @@ public val CustomHashTagIcons.Skull: ImageVector curveToRelative(2.294f, -5.109f, 2.624f, -11.389f, 1.046f, -16.732f) close() } - } - .build() + }.build() return customHashTagIconsSkull!! } diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/hashtags/Tunestr.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/hashtags/Tunestr.kt index 62f2ad074..14c3d65b4 100644 --- a/commons/src/main/java/com/vitorpamplona/amethyst/commons/hashtags/Tunestr.kt +++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/hashtags/Tunestr.kt @@ -136,8 +136,7 @@ public val CustomHashTagIcons.Tunestr: ImageVector curveTo(506.86f, 353.05f, 563.32f, 375.71f, 574.98f, 419.21f) close() } - } - .build() + }.build() return customHashTagIconsTunestr!! } diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/hashtags/Weed.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/hashtags/Weed.kt index 6cf55d6df..7d7c161a6 100644 --- a/commons/src/main/java/com/vitorpamplona/amethyst/commons/hashtags/Weed.kt +++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/hashtags/Weed.kt @@ -542,8 +542,7 @@ public val CustomHashTagIcons.Weed: ImageVector curveToRelative(-1.99f, 1.4f, -4.1f, 3.02f, -6.42f, 4.75f) close() } - } - .build() + }.build() return customHashTagIconsWeed!! } diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/hashtags/Zap.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/hashtags/Zap.kt index b318ef509..834c4b459 100644 --- a/commons/src/main/java/com/vitorpamplona/amethyst/commons/hashtags/Zap.kt +++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/hashtags/Zap.kt @@ -127,8 +127,7 @@ public val CustomHashTagIcons.Zap: ImageVector curveToRelative(4.996f, -0.006f, 7.714f, -0.11f, 12.882f, -0.037f) close() } - } - .build() + }.build() return customHashTagIconsZap!! } diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/preview/BlurHashDecoder.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/preview/BlurHashDecoder.kt index 5f6841fd7..a95e9894d 100644 --- a/commons/src/main/java/com/vitorpamplona/amethyst/commons/preview/BlurHashDecoder.kt +++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/preview/BlurHashDecoder.kt @@ -98,16 +98,12 @@ object BlurHashDecoder { private fun decode83At( str: String, at: Int = 0, - ): Int { - return charMap[str[at].code] - } + ): Int = charMap[str[at].code] private fun decode83Fixed2( str: String, from: Int = 0, - ): Int { - return charMap[str[from].code] * 83 + charMap[str[from + 1].code] - } + ): Int = charMap[str[from].code] * 83 + charMap[str[from + 1].code] private fun decode83( str: String, @@ -328,9 +324,9 @@ object BlurHashDecoder { '|', '}', '~', - ) - .mapIndexed { i, c -> c.code to i } - .toMap().let { charMap -> + ).mapIndexed { i, c -> c.code to i } + .toMap() + .let { charMap -> Array(255) { charMap[it] ?: 0 } diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/preview/BlurHashDecoderOld.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/preview/BlurHashDecoderOld.kt index fa7012e47..ee2429ce2 100644 --- a/commons/src/main/java/com/vitorpamplona/amethyst/commons/preview/BlurHashDecoderOld.kt +++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/preview/BlurHashDecoderOld.kt @@ -312,7 +312,6 @@ object BlurHashDecoderOld { '|', '}', '~', - ) - .mapIndexed { i, c -> c to i } + ).mapIndexed { i, c -> c to i } .toMap() } diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/preview/MetaTagsParser.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/preview/MetaTagsParser.kt index 9d70f8246..4ecdcf149 100644 --- a/commons/src/main/java/com/vitorpamplona/amethyst/commons/preview/MetaTagsParser.kt +++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/preview/MetaTagsParser.kt @@ -22,7 +22,9 @@ package com.vitorpamplona.amethyst.commons.preview import kotlinx.collections.immutable.toImmutableMap -data class MetaTag(private val attrs: Map) { +data class MetaTag( + private val attrs: Map, +) { /** * Returns a value of an attribute specified by its name (case insensitive), or empty string if it doesn't exist. */ @@ -51,9 +53,15 @@ object MetaTagsParser { } } - private data class RawTag(val isEnd: Boolean, val name: String, val attrPart: String) + private data class RawTag( + val isEnd: Boolean, + val name: String, + val attrPart: String, + ) - private class TagScanner(private val input: String) { + private class TagScanner( + private val input: String, + ) { private var p = 0 fun exhausted(): Boolean = p >= input.length diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/richtext/RichTextParserSegments.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/richtext/RichTextParserSegments.kt index 4937c1f40..4b2a7495e 100644 --- a/commons/src/main/java/com/vitorpamplona/amethyst/commons/richtext/RichTextParserSegments.kt +++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/richtext/RichTextParserSegments.kt @@ -35,56 +35,97 @@ data class RichTextViewerState( ) @Immutable -data class ParagraphState(val words: ImmutableList, val isRTL: Boolean) +data class ParagraphState( + val words: ImmutableList, + val isRTL: Boolean, +) @Immutable -open class Segment(val segmentText: String) +open class Segment( + val segmentText: String, +) @Immutable -class ImageSegment(segment: String) : Segment(segment) +class ImageSegment( + segment: String, +) : Segment(segment) @Immutable -class LinkSegment(segment: String) : Segment(segment) +class LinkSegment( + segment: String, +) : Segment(segment) @Immutable -class EmojiSegment(segment: String) : Segment(segment) +class EmojiSegment( + segment: String, +) : Segment(segment) @Immutable -class InvoiceSegment(segment: String) : Segment(segment) +class InvoiceSegment( + segment: String, +) : Segment(segment) @Immutable -class WithdrawSegment(segment: String) : Segment(segment) +class WithdrawSegment( + segment: String, +) : Segment(segment) @Immutable -class CashuSegment(segment: String) : Segment(segment) +class CashuSegment( + segment: String, +) : Segment(segment) @Immutable -class EmailSegment(segment: String) : Segment(segment) +class EmailSegment( + segment: String, +) : Segment(segment) @Immutable -class PhoneSegment(segment: String) : Segment(segment) +class PhoneSegment( + segment: String, +) : Segment(segment) @Immutable -class BechSegment(segment: String) : Segment(segment) +class BechSegment( + segment: String, +) : Segment(segment) @Immutable -open class HashIndexSegment(segment: String, val hex: String, val extras: String?) : - Segment(segment) +open class HashIndexSegment( + segment: String, + val hex: String, + val extras: String?, +) : Segment(segment) @Immutable -class HashIndexUserSegment(segment: String, hex: String, extras: String?) : - HashIndexSegment(segment, hex, extras) +class HashIndexUserSegment( + segment: String, + hex: String, + extras: String?, +) : HashIndexSegment(segment, hex, extras) @Immutable -class HashIndexEventSegment(segment: String, hex: String, extras: String?) : - HashIndexSegment(segment, hex, extras) +class HashIndexEventSegment( + segment: String, + hex: String, + extras: String?, +) : HashIndexSegment(segment, hex, extras) @Immutable -class HashTagSegment(segment: String, val hashtag: String, val extras: String?) : Segment(segment) +class HashTagSegment( + segment: String, + val hashtag: String, + val extras: String?, +) : Segment(segment) @Immutable -class SchemelessUrlSegment(segment: String, val url: String, val extras: String?) : - Segment(segment) +class SchemelessUrlSegment( + segment: String, + val url: String, + val extras: String?, +) : Segment(segment) @Immutable -class RegularTextSegment(segment: String) : Segment(segment) +class RegularTextSegment( + segment: String, +) : Segment(segment) diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohash/RobohashAssembler.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohash/RobohashAssembler.kt index a84ec2630..0a45343af 100644 --- a/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohash/RobohashAssembler.kt +++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohash/RobohashAssembler.kt @@ -139,9 +139,7 @@ fun RobohashPreview() { } class RobohashAssembler { - private fun byteMod10(byte: Byte): Int { - return byte.toUByte().toInt() % 10 - } + private fun byteMod10(byte: Byte): Int = byte.toUByte().toInt() % 10 private fun reduce( start: Int, @@ -153,15 +151,14 @@ class RobohashAssembler { g: Byte, b: Byte, makeLight: Boolean, - ): Color { - return if (makeLight) { + ): Color = + if (makeLight) { // > 150-256 color channels Color(reduce(150, r), reduce(150, g), reduce(150, b)) } else { // < 50-100 color channels Color(reduce(50, r), reduce(50, g), reduce(50, b)) } - } fun build( msg: String, @@ -268,13 +265,14 @@ inline fun roboBuilder( name: String = "", autoMirror: Boolean = false, block: ImageVector.Builder.() -> Unit, -) = ImageVector.Builder( - name = name, - defaultWidth = DefaultSize, - defaultHeight = DefaultSize, - viewportWidth = VIEWPORT_SIZE, - viewportHeight = VIEWPORT_SIZE, - autoMirror = autoMirror, -).apply { - block() -}.build() +) = ImageVector + .Builder( + name = name, + defaultWidth = DefaultSize, + defaultHeight = DefaultSize, + viewportWidth = VIEWPORT_SIZE, + viewportHeight = VIEWPORT_SIZE, + autoMirror = autoMirror, + ).apply { + block() + }.build() diff --git a/quartz/src/androidTest/java/com/vitorpamplona/quartz/crypto/nip06/Bip39KeyPathTest.kt b/quartz/src/androidTest/java/com/vitorpamplona/quartz/crypto/nip06/Bip39KeyPathTest.kt index 5a114de88..d60d479d8 100644 --- a/quartz/src/androidTest/java/com/vitorpamplona/quartz/crypto/nip06/Bip39KeyPathTest.kt +++ b/quartz/src/androidTest/java/com/vitorpamplona/quartz/crypto/nip06/Bip39KeyPathTest.kt @@ -33,11 +33,11 @@ class Bip39KeyPathTest { .derive(Hardener.hardened(44L)) .derive(Hardener.hardened(1237L)) - private fun nip6Path(account: Long): KeyPath { - return nip6Base.derive(Hardener.hardened(account)) + private fun nip6Path(account: Long): KeyPath = + nip6Base + .derive(Hardener.hardened(account)) .derive(0L) .derive(0L) - } @Test fun testKeyPath() { diff --git a/quartz/src/androidTest/java/com/vitorpamplona/quartz/crypto/nip06/Bip39MnemonicsTest.kt b/quartz/src/androidTest/java/com/vitorpamplona/quartz/crypto/nip06/Bip39MnemonicsTest.kt index af0697e1c..8e804f7b1 100644 --- a/quartz/src/androidTest/java/com/vitorpamplona/quartz/crypto/nip06/Bip39MnemonicsTest.kt +++ b/quartz/src/androidTest/java/com/vitorpamplona/quartz/crypto/nip06/Bip39MnemonicsTest.kt @@ -37,7 +37,10 @@ class Bip39MnemonicsTest { private val tests = jacksonObjectMapper() .readTree( - InstrumentationRegistry.getInstrumentation().context.assets.open("bip39.vectors.json"), + InstrumentationRegistry + .getInstrumentation() + .context.assets + .open("bip39.vectors.json"), ) @Test diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/crypto/KeyPair.kt b/quartz/src/main/java/com/vitorpamplona/quartz/crypto/KeyPair.kt index e06f3c3dc..d6390abc2 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/crypto/KeyPair.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/crypto/KeyPair.kt @@ -54,7 +54,5 @@ class KeyPair( } } - override fun toString(): String { - return "KeyPair(privateKey=${privKey?.toHexKey()}, publicKey=${pubKey.toHexKey()}" - } + override fun toString(): String = "KeyPair(privateKey=${privKey?.toHexKey()}, publicKey=${pubKey.toHexKey()}" } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/crypto/SharedKeyCache.kt b/quartz/src/main/java/com/vitorpamplona/quartz/crypto/SharedKeyCache.kt index 766841128..810c8925c 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/crypto/SharedKeyCache.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/crypto/SharedKeyCache.kt @@ -42,9 +42,7 @@ class SharedKeyCache { fun get( privateKey: ByteArray, pubKey: ByteArray, - ): ByteArray? { - return sharedKeyCache[combinedHashCode(privateKey, pubKey)] - } + ): ByteArray? = sharedKeyCache[combinedHashCode(privateKey, pubKey)] fun add( privateKey: ByteArray, diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/crypto/nip06/Bip39KeyPath.kt b/quartz/src/main/java/com/vitorpamplona/quartz/crypto/nip06/Bip39KeyPath.kt index f3dcf5227..e6b84ed8b 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/crypto/nip06/Bip39KeyPath.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/crypto/nip06/Bip39KeyPath.kt @@ -20,24 +20,20 @@ */ package com.vitorpamplona.quartz.crypto.nip06 -class KeyPath(val path: List) { +class KeyPath( + val path: List, +) { constructor(path: String) : this(computePath(path)) val lastChildNumber: Long get() = if (path.isEmpty()) 0L else path.last() fun derive(number: Long): KeyPath = KeyPath(path + listOf(number)) - fun append(index: Long): KeyPath { - return KeyPath(path + listOf(index)) - } + fun append(index: Long): KeyPath = KeyPath(path + listOf(index)) - fun append(indexes: List): KeyPath { - return KeyPath(path + indexes) - } + fun append(indexes: List): KeyPath = KeyPath(path + indexes) - fun append(that: KeyPath): KeyPath { - return KeyPath(path + that.path) - } + fun append(that: KeyPath): KeyPath = KeyPath(path + that.path) override fun toString(): String = asString('\'') diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/encoders/ATag.kt b/quartz/src/main/java/com/vitorpamplona/quartz/encoders/ATag.kt index 69fc67c4f..dd4dcfc7d 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/encoders/ATag.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/encoders/ATag.kt @@ -24,20 +24,23 @@ import android.util.Log import androidx.compose.runtime.Immutable @Immutable -data class ATag(val kind: Int, val pubKeyHex: String, val dTag: String, val relay: String?) { +data class ATag( + val kind: Int, + val pubKeyHex: String, + val dTag: String, + val relay: String?, +) { fun toTag() = assembleATag(kind, pubKeyHex, dTag) - fun toNAddr(): String { - return TlvBuilder() + fun toNAddr(): String = + TlvBuilder() .apply { addString(Nip19Bech32.TlvTypes.SPECIAL, dTag) addStringIfNotNull(Nip19Bech32.TlvTypes.RELAY, relay) addHex(Nip19Bech32.TlvTypes.AUTHOR, pubKeyHex) addInt(Nip19Bech32.TlvTypes.KIND, kind) - } - .build() + }.build() .toNAddress() - } companion object { fun assembleATag( @@ -46,26 +49,23 @@ data class ATag(val kind: Int, val pubKeyHex: String, val dTag: String, val rela dTag: String, ) = "$kind:$pubKeyHex:$dTag" - fun isATag(key: String): Boolean { - return key.startsWith("naddr1") || key.contains(":") - } + fun isATag(key: String): Boolean = key.startsWith("naddr1") || key.contains(":") fun parse( address: String, relay: String?, - ): ATag? { - return if (address.startsWith("naddr") || address.startsWith("nostr:naddr")) { + ): ATag? = + if (address.startsWith("naddr") || address.startsWith("nostr:naddr")) { parseNAddr(address) } else { parseAtag(address, relay) } - } fun parseAtag( atag: String, relay: String?, - ): ATag? { - return try { + ): ATag? = + try { val parts = atag.split(":") Hex.decode(parts[1]) ATag(parts[0].toInt(), parts[1], parts[2], relay) @@ -73,16 +73,14 @@ data class ATag(val kind: Int, val pubKeyHex: String, val dTag: String, val rela Log.w("ATag", "Error parsing A Tag: $atag: ${t.message}") null } - } - fun parseAtagUnckecked(atag: String): ATag? { - return try { + fun parseAtagUnckecked(atag: String): ATag? = + try { val parts = atag.split(":") ATag(parts[0].toInt(), parts[1], parts[2], null) } catch (t: Throwable) { null } - } fun parseNAddr(naddr: String): ATag? { try { diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/encoders/Bech32Util.kt b/quartz/src/main/java/com/vitorpamplona/quartz/encoders/Bech32Util.kt index f3ce3903c..643da6a5e 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/encoders/Bech32Util.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/encoders/Bech32Util.kt @@ -51,7 +51,9 @@ object Bech32 { const val ALPHABET: String = "qpzry9x8gf2tvdw0s3jn54khce6mua7l" const val ALPHABET_UPPERCASE: String = "QPZRY9X8GF2TVDW0S3JN54KHCE6MUA7L" - enum class Encoding(val constant: Int) { + enum class Encoding( + val constant: Int, + ) { Bech32(1), Bech32m(0x2bc830a3), Beck32WithoutChecksum(0), diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/encoders/HexUtils.kt b/quartz/src/main/java/com/vitorpamplona/quartz/encoders/HexUtils.kt index ec7025ad5..1dd43bae5 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/encoders/HexUtils.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/encoders/HexUtils.kt @@ -23,23 +23,18 @@ package com.vitorpamplona.quartz.encoders /** Makes the distinction between String and Hex * */ typealias HexKey = String -fun ByteArray.toHexKey(): HexKey { - return Hex.encode(this) -} +fun ByteArray.toHexKey(): HexKey = Hex.encode(this) -fun HexKey.hexToByteArray(): ByteArray { - return Hex.decode(this) -} +fun HexKey.hexToByteArray(): ByteArray = Hex.decode(this) object HexValidator { - private fun isHexChar(c: Char): Boolean { - return when (c) { + private fun isHexChar(c: Char): Boolean = + when (c) { in '0'..'9' -> true in 'a'..'f' -> true in 'A'..'F' -> true else -> false } - } fun isHex(hex: String?): Boolean { if (hex == null) return false diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/encoders/LnInvoiceUtil.kt b/quartz/src/main/java/com/vitorpamplona/quartz/encoders/LnInvoiceUtil.kt index 6fadab056..eb4d0b234 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/encoders/LnInvoiceUtil.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/encoders/LnInvoiceUtil.kt @@ -205,7 +205,9 @@ object LnInvoiceUtil { return polymod(combined) == 1 } - class AddressFormatException(message: String) : Exception(message) + class AddressFormatException( + message: String, + ) : Exception(message) fun decodeUnlimitedLength(invoice: String): Boolean { var lower = false @@ -278,19 +280,16 @@ object LnInvoiceUtil { val OneNano = BigDecimal("0.000000001") val OnePico = BigDecimal("0.000000000001") - fun getAmountInSats(invoice: String): BigDecimal { - return getAmount(invoice).multiply(OneHundredK) - } + fun getAmountInSats(invoice: String): BigDecimal = getAmount(invoice).multiply(OneHundredK) - private fun multiplier(multiplier: String): BigDecimal { - return when (multiplier.lowercase()) { + private fun multiplier(multiplier: String): BigDecimal = + when (multiplier.lowercase()) { "m" -> OneMili "u" -> OneMicro "n" -> OneNano "p" -> OnePico else -> throw IllegalArgumentException("Invalid multiplier: $multiplier") } - } /** * Finds LN invoice in the provided input string and returns it. For example for input = "aaa bbb diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/encoders/Lud06.kt b/quartz/src/main/java/com/vitorpamplona/quartz/encoders/Lud06.kt index 775a7c85f..e8c4e021d 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/encoders/Lud06.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/encoders/Lud06.kt @@ -48,13 +48,12 @@ class Lud06 { } } - fun toLnUrlp(str: String): String? { - return try { + fun toLnUrlp(str: String): String? = + try { String(Bech32.decodeBytes(str, false).second) } catch (t: Throwable) { t.printStackTrace() Log.w("Lud06ToLud16", "Fail to convert LUD06 to LUD16", t) null } - } } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/encoders/Nip01Serializer.kt b/quartz/src/main/java/com/vitorpamplona/quartz/encoders/Nip01Serializer.kt index 49bf9b846..ea9607733 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/encoders/Nip01Serializer.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/encoders/Nip01Serializer.kt @@ -47,9 +47,12 @@ class Nip01Serializer { fun dump() } - class BufferedDigestWriter(val digest: MessageDigest) : Writer { + class BufferedDigestWriter( + val digest: MessageDigest, + ) : Writer { val utf8Encoder = - Charsets.UTF_8.newEncoder() + Charsets.UTF_8 + .newEncoder() .onMalformedInput(CodingErrorAction.IGNORE) .onUnmappableCharacter(CodingErrorAction.IGNORE) @@ -151,9 +154,7 @@ class Nip01Serializer { stringBuilder.append(value.toInt().toChar()) } - override fun toString(): String { - return stringBuilder.toString() - } + override fun toString(): String = stringBuilder.toString() override fun dump() { } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/encoders/Nip30CustomEmoji.kt b/quartz/src/main/java/com/vitorpamplona/quartz/encoders/Nip30CustomEmoji.kt index 809a10fdb..40fd2cf03 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/encoders/Nip30CustomEmoji.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/encoders/Nip30CustomEmoji.kt @@ -48,9 +48,7 @@ class Nip30CustomEmoji { return input.contains(":") } - fun createEmojiMap(tags: ImmutableListOfLists): Map { - return tags.lists.filter { it.size > 2 && it[0] == "emoji" }.associate { ":${it[1]}:" to it[2] } - } + fun createEmojiMap(tags: ImmutableListOfLists): Map = tags.lists.filter { it.size > 2 && it[0] == "emoji" }.associate { ":${it[1]}:" to it[2] } fun assembleAnnotatedList( input: String, @@ -105,9 +103,13 @@ class Nip30CustomEmoji { } } - @Immutable open class Renderable() + @Immutable open class Renderable - @Immutable class TextType(val text: String) : Renderable() + @Immutable class TextType( + val text: String, + ) : Renderable() - @Immutable class ImageUrlType(val url: String) : Renderable() + @Immutable class ImageUrlType( + val url: String, + ) : Renderable() } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/encoders/Nip47WalletConnect.kt b/quartz/src/main/java/com/vitorpamplona/quartz/encoders/Nip47WalletConnect.kt index 0196b779b..ce77cf6c8 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/encoders/Nip47WalletConnect.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/encoders/Nip47WalletConnect.kt @@ -52,5 +52,9 @@ class Nip47WalletConnect { } } - data class Nip47URI(val pubKeyHex: HexKey, val relayUri: String?, val secret: HexKey?) + data class Nip47URI( + val pubKeyHex: HexKey, + val relayUri: String?, + val secret: HexKey?, + ) } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/encoders/Nip54InlineMetadata.kt b/quartz/src/main/java/com/vitorpamplona/quartz/encoders/Nip54InlineMetadata.kt index f9be3b979..f49529869 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/encoders/Nip54InlineMetadata.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/encoders/Nip54InlineMetadata.kt @@ -40,17 +40,18 @@ class Nip54InlineMetadata { tags: Array>, ): String { val extension = - tags.mapNotNull { - if (it.isNotEmpty() && it[0] != "url") { - if (it.size > 1) { - "${it[0]}=${URLEncoder.encode(it[1], "utf-8")}" + tags + .mapNotNull { + if (it.isNotEmpty() && it[0] != "url") { + if (it.size > 1) { + "${it[0]}=${URLEncoder.encode(it[1], "utf-8")}" + } else { + "${it[0]}}=" + } } else { - "${it[0]}}=" + null } - } else { - null - } - }.joinToString("&") + }.joinToString("&") return if (imageUrl.contains("#")) { "$imageUrl&$extension" @@ -59,14 +60,13 @@ class Nip54InlineMetadata { } } - fun parse(url: String): Map { - return try { + fun parse(url: String): Map = + try { fragments(URI(url)) } catch (e: Exception) { if (e is CancellationException) throw e emptyMap() } - } private fun fragments(uri: URI): Map { if (uri.rawFragment == null) return emptyMap() diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/encoders/Nip92MediaAttachments.kt b/quartz/src/main/java/com/vitorpamplona/quartz/encoders/Nip92MediaAttachments.kt index bd217f884..6bfc6ece1 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/encoders/Nip92MediaAttachments.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/encoders/Nip92MediaAttachments.kt @@ -38,8 +38,8 @@ class Nip92MediaAttachments { fun createTag( imageUrl: String, tags: Array>, - ): Array { - return arrayOf( + ): Array = + arrayOf( IMETA, "url $imageUrl", ) + @@ -54,23 +54,22 @@ class Nip92MediaAttachments { null } } - } fun parse( imageUrl: String, tags: Array>, - ): Map { - return tags.firstOrNull { - it.size > 1 && it[0] == IMETA && it[1] == "url $imageUrl" - }?.let { tagList -> - tagList.associate { tag -> - val parts = tag.split(" ", limit = 2) - when (parts.size) { - 2 -> parts[0] to parts[1] - 1 -> parts[0] to "" - else -> "" to "" + ): Map = + tags + .firstOrNull { + it.size > 1 && it[0] == IMETA && it[1] == "url $imageUrl" + }?.let { tagList -> + tagList.associate { tag -> + val parts = tag.split(" ", limit = 2) + when (parts.size) { + 2 -> parts[0] to parts[1] + 1 -> parts[0] to "" + else -> "" to "" + } } - } - } ?: emptyMap() - } + } ?: emptyMap() } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/encoders/RelayUrlFormatter.kt b/quartz/src/main/java/com/vitorpamplona/quartz/encoders/RelayUrlFormatter.kt index 2679e9a0b..bbdd0f207 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/encoders/RelayUrlFormatter.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/encoders/RelayUrlFormatter.kt @@ -24,9 +24,12 @@ import org.czeal.rfc3986.URIReference class RelayUrlFormatter { companion object { - fun displayUrl(url: String): String { - return url.trim().removePrefix("wss://").removePrefix("ws://").removeSuffix("/") - } + fun displayUrl(url: String): String = + url + .trim() + .removePrefix("wss://") + .removePrefix("ws://") + .removeSuffix("/") fun normalize(url: String): String { val newUrl = @@ -49,12 +52,11 @@ class RelayUrlFormatter { } } - fun getHttpsUrl(dirtyUrl: String): String { - return if (dirtyUrl.contains("://")) { + fun getHttpsUrl(dirtyUrl: String): String = + if (dirtyUrl.contains("://")) { dirtyUrl.replace("wss://", "https://").replace("ws://", "http://") } else { "https://$dirtyUrl" } - } } } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/encoders/Tlv.kt b/quartz/src/main/java/com/vitorpamplona/quartz/encoders/Tlv.kt index 81254a688..284a99f1f 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/encoders/Tlv.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/encoders/Tlv.kt @@ -24,7 +24,7 @@ import java.io.ByteArrayOutputStream import java.nio.ByteBuffer import java.nio.ByteOrder -class TlvBuilder() { +class TlvBuilder { val outputStream = ByteArrayOutputStream() private fun add( @@ -65,9 +65,7 @@ class TlvBuilder() { data: Int?, ) = data?.let { addInt(type, it) } - fun build(): ByteArray { - return outputStream.toByteArray() - } + fun build(): ByteArray = outputStream.toByteArray() } fun Int.to32BitByteArray(): ByteArray { @@ -81,7 +79,9 @@ fun ByteArray.toInt32(): Int? { return ByteBuffer.wrap(this, 0, 4).order(ByteOrder.BIG_ENDIAN).int } -class Tlv(val data: Map>) { +class Tlv( + val data: Map>, +) { fun asInt(type: Byte) = data[type]?.mapNotNull { it.toInt32() } fun asHex(type: Byte) = data[type]?.map { it.toHexKey().intern() } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/events/AdvertisedRelayListEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/events/AdvertisedRelayListEvent.kt index e5add50ad..8d8e03533 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/events/AdvertisedRelayListEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/events/AdvertisedRelayListEvent.kt @@ -37,8 +37,8 @@ class AdvertisedRelayListEvent( ) : BaseAddressableEvent(id, pubKey, createdAt, KIND, tags, content, sig) { override fun dTag() = FIXED_D_TAG - fun relays(): List { - return tags.mapNotNull { + fun relays(): List = + tags.mapNotNull { if (it.size > 1 && it[0] == "r") { val type = when (it.getOrNull(2)) { @@ -52,24 +52,23 @@ class AdvertisedRelayListEvent( null } } - } - fun readRelays(): List? { - return tags.mapNotNull { - if (it.size > 1 && it[0] == "r") { - when (it.getOrNull(2)) { - "read" -> it[1] - "write" -> null - else -> it[1] + fun readRelays(): List? = + tags + .mapNotNull { + if (it.size > 1 && it[0] == "r") { + when (it.getOrNull(2)) { + "read" -> it[1] + "write" -> null + else -> it[1] + } + } else { + null } - } else { - null - } - }.ifEmpty { null } - } + }.ifEmpty { null } - fun writeRelays(): List { - return tags.mapNotNull { + fun writeRelays(): List = + tags.mapNotNull { if (it.size > 1 && it[0] == "r") { when (it.getOrNull(2)) { "read" -> null @@ -80,20 +79,15 @@ class AdvertisedRelayListEvent( null } } - } companion object { const val KIND = 10002 const val FIXED_D_TAG = "" const val ALT = "Relay list to discover the user's content" - fun createAddressATag(pubKey: HexKey): ATag { - return ATag(KIND, pubKey, FIXED_D_TAG, null) - } + fun createAddressATag(pubKey: HexKey): ATag = ATag(KIND, pubKey, FIXED_D_TAG, null) - fun createAddressTag(pubKey: HexKey): String { - return ATag.assembleATag(KIND, pubKey, FIXED_D_TAG) - } + fun createAddressTag(pubKey: HexKey): String = ATag.assembleATag(KIND, pubKey, FIXED_D_TAG) fun updateRelayList( earlierVersion: AdvertisedRelayListEvent, @@ -103,9 +97,11 @@ class AdvertisedRelayListEvent( onReady: (AdvertisedRelayListEvent) -> Unit, ) { val tags = - earlierVersion.tags.filter { it[0] != "r" }.plus( - relays.map(::createRelayTag), - ).toTypedArray() + earlierVersion.tags + .filter { it[0] != "r" } + .plus( + relays.map(::createRelayTag), + ).toTypedArray() signer.sign(createdAt, KIND, tags, earlierVersion.content, onReady) } @@ -119,20 +115,18 @@ class AdvertisedRelayListEvent( create(relays, signer, createdAt, onReady) } - fun createRelayTag(relay: AdvertisedRelayInfo): Array { - return if (relay.type == AdvertisedRelayType.BOTH) { + fun createRelayTag(relay: AdvertisedRelayInfo): Array = + if (relay.type == AdvertisedRelayType.BOTH) { arrayOf("r", relay.relayUrl) } else { arrayOf("r", relay.relayUrl, relay.type.code) } - } - fun createTagArray(relays: List): Array> { - return relays + fun createTagArray(relays: List): Array> = + relays .map(::createRelayTag) .plusElement(arrayOf("alt", ALT)) .toTypedArray() - } fun create( list: List, @@ -147,10 +141,15 @@ class AdvertisedRelayListEvent( } } - @Immutable data class AdvertisedRelayInfo(val relayUrl: String, val type: AdvertisedRelayType) + @Immutable data class AdvertisedRelayInfo( + val relayUrl: String, + val type: AdvertisedRelayType, + ) @Immutable - enum class AdvertisedRelayType(val code: String) { + enum class AdvertisedRelayType( + val code: String, + ) { BOTH(""), READ("read"), WRITE("write"), diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/events/AppDefinitionEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/events/AppDefinitionEvent.kt index dacc186b9..5ccad15c8 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/events/AppDefinitionEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/events/AppDefinitionEvent.kt @@ -58,31 +58,20 @@ class AppMetadata { @Transient var tags: ImmutableListOfLists? = null - fun anyName(): String? { - return displayName ?: name ?: username - } + fun anyName(): String? = displayName ?: name ?: username - fun anyNameStartsWith(prefix: String): Boolean { - return listOfNotNull(name, username, displayName, nip05, lud06, lud16).any { + fun anyNameStartsWith(prefix: String): Boolean = + listOfNotNull(name, username, displayName, nip05, lud06, lud16).any { it.contains(prefix, true) } - } - fun lnAddress(): String? { - return lud16 ?: lud06 - } + fun lnAddress(): String? = lud16 ?: lud06 - fun bestName(): String? { - return displayName ?: name ?: username - } + fun bestName(): String? = displayName ?: name ?: username - fun nip05(): String? { - return nip05 - } + fun nip05(): String? = nip05 - fun profilePicture(): String? { - return picture - } + fun profilePicture(): String? = picture fun cleanBlankNames() { if (picture?.isNotEmpty() == true) picture = picture?.trim() diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/events/AudioHeaderEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/events/AudioHeaderEvent.kt index db596d0c0..3ddc1aca7 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/events/AudioHeaderEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/events/AudioHeaderEvent.kt @@ -76,8 +76,7 @@ class AudioHeaderEvent( } }, arrayOf("alt", ALT), - ) - .toTypedArray() + ).toTypedArray() signer.sign(createdAt, KIND, tags, description, onReady) } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/events/AudioTrackEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/events/AudioTrackEvent.kt index 3724b2b13..e250a206c 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/events/AudioTrackEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/events/AudioTrackEvent.kt @@ -73,12 +73,14 @@ class AudioTrackEvent( cover?.let { arrayOf(COVER, it) }, subject?.let { arrayOf(SUBJECT, it) }, arrayOf("alt", ALT), - ) - .toTypedArray() + ).toTypedArray() signer.sign(createdAt, KIND, tags, "", onReady) } } } -@Immutable data class Participant(val key: String, val role: String?) +@Immutable data class Participant( + val key: String, + val role: String?, +) diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/events/BadgeProfilesEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/events/BadgeProfilesEvent.kt index f38ab0e8a..e939c5857 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/events/BadgeProfilesEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/events/BadgeProfilesEvent.kt @@ -42,8 +42,6 @@ class BadgeProfilesEvent( private const val STANDARD_D_TAG = "profile_badges" private const val ALT = "List of accepted badges by the author" - fun createAddressTag(pubKey: HexKey): ATag { - return ATag(KIND, pubKey, STANDARD_D_TAG, null) - } + fun createAddressTag(pubKey: HexKey): ATag = ATag(KIND, pubKey, STANDARD_D_TAG, null) } } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/events/BaseTextNoteEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/events/BaseTextNoteEvent.kt index 39c15752a..e9c0c8f7e 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/events/BaseTextNoteEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/events/BaseTextNoteEvent.kt @@ -192,10 +192,11 @@ open class BaseTextNoteEvent( fun tagsWithoutCitations(): List { val repliesTo = replyTos() val tagAddresses = - taggedAddresses().filter { - it.kind != CommunityDefinitionEvent.KIND && (kind != WikiNoteEvent.KIND || it.kind != WikiNoteEvent.KIND) - // removes forks from itself. - }.map { it.toTag() } + taggedAddresses() + .filter { + it.kind != CommunityDefinitionEvent.KIND && (kind != WikiNoteEvent.KIND || it.kind != WikiNoteEvent.KIND) + // removes forks from itself. + }.map { it.toTag() } if (repliesTo.isEmpty() && tagAddresses.isEmpty()) return emptyList() val citations = findCitations() diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/events/ChannelCreateEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/events/ChannelCreateEvent.kt index 0d081e9fb..f3dad8aec 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/events/ChannelCreateEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/events/ChannelCreateEvent.kt @@ -54,18 +54,16 @@ class ChannelCreateEvent( signer: NostrSigner, createdAt: Long = TimeUtils.now(), onReady: (ChannelCreateEvent) -> Unit, - ) { - return create( - ChannelData( - name, - about, - picture, - ), - signer, - createdAt, - onReady, - ) - } + ) = create( + ChannelData( + name, + about, + picture, + ), + signer, + createdAt, + onReady, + ) fun create( channelInfo: ChannelData?, @@ -94,5 +92,9 @@ class ChannelCreateEvent( } } - @Immutable data class ChannelData(val name: String?, val about: String?, val picture: String?) + @Immutable data class ChannelData( + val name: String?, + val about: String?, + val picture: String?, + ) } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/events/ChannelHideMessageEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/events/ChannelHideMessageEvent.kt index 5611deb0d..7d0207c24 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/events/ChannelHideMessageEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/events/ChannelHideMessageEvent.kt @@ -33,7 +33,8 @@ class ChannelHideMessageEvent( tags: Array>, content: String, sig: HexKey, -) : Event(id, pubKey, createdAt, KIND, tags, content, sig), IsInPublicChatChannel { +) : Event(id, pubKey, createdAt, KIND, tags, content, sig), + IsInPublicChatChannel { override fun channel() = tags.firstOrNull { it.size > 3 && it[0] == "e" && it[3] == "root" }?.get(1) ?: tags.firstOrNull { it.size > 1 && it[0] == "e" }?.get(1) diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/events/ChannelListEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/events/ChannelListEvent.kt index 1837019ee..489ed4b1c 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/events/ChannelListEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/events/ChannelListEvent.kt @@ -62,9 +62,7 @@ class ChannelListEvent( const val FIXED_D_TAG = "" const val ALT = "Public Chat List" - fun blockListFor(pubKeyHex: HexKey): String { - return "$KIND:$pubKeyHex:" - } + fun blockListFor(pubKeyHex: HexKey): String = "$KIND:$pubKeyHex:" fun createListWithTag( key: String, @@ -101,9 +99,7 @@ class ChannelListEvent( signer: NostrSigner, createdAt: Long = TimeUtils.now(), onReady: (ChannelListEvent) -> Unit, - ) { - return createListWithTag("e", eventId, isPrivate, signer, createdAt, onReady) - } + ) = createListWithTag("e", eventId, isPrivate, signer, createdAt, onReady) fun addEvents( earlierVersion: ChannelListEvent, @@ -152,9 +148,7 @@ class ChannelListEvent( signer: NostrSigner, createdAt: Long = TimeUtils.now(), onReady: (ChannelListEvent) -> Unit, - ) { - return addTag(earlierVersion, "e", event, isPrivate, signer, createdAt, onReady) - } + ) = addTag(earlierVersion, "e", event, isPrivate, signer, createdAt, onReady) fun addTag( earlierVersion: ChannelListEvent, @@ -202,9 +196,7 @@ class ChannelListEvent( signer: NostrSigner, createdAt: Long = TimeUtils.now(), onReady: (ChannelListEvent) -> Unit, - ) { - return removeTag(earlierVersion, "e", event, isPrivate, signer, createdAt, onReady) - } + ) = removeTag(earlierVersion, "e", event, isPrivate, signer, createdAt, onReady) fun removeTag( earlierVersion: ChannelListEvent, diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/events/ChannelMessageEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/events/ChannelMessageEvent.kt index f9480e731..104a4aace 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/events/ChannelMessageEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/events/ChannelMessageEvent.kt @@ -34,7 +34,8 @@ class ChannelMessageEvent( tags: Array>, content: String, sig: HexKey, -) : BaseTextNoteEvent(id, pubKey, createdAt, KIND, tags, content, sig), IsInPublicChatChannel { +) : BaseTextNoteEvent(id, pubKey, createdAt, KIND, tags, content, sig), + IsInPublicChatChannel { override fun channel() = tags.firstOrNull { it.size > 3 && it[0] == "e" && it[3] == "root" }?.get(1) ?: tags.firstOrNull { it.size > 1 && it[0] == "e" }?.get(1) diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/events/ChannelMetadataEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/events/ChannelMetadataEvent.kt index 8b7b9fae3..269016804 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/events/ChannelMetadataEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/events/ChannelMetadataEvent.kt @@ -34,7 +34,8 @@ class ChannelMetadataEvent( tags: Array>, content: String, sig: HexKey, -) : Event(id, pubKey, createdAt, KIND, tags, content, sig), IsInPublicChatChannel { +) : Event(id, pubKey, createdAt, KIND, tags, content, sig), + IsInPublicChatChannel { override fun channel() = tags.firstOrNull { it.size > 1 && it[0] == "e" }?.get(1) fun channelInfo() = diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/events/ChannelMuteUserEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/events/ChannelMuteUserEvent.kt index fe9265495..d69522340 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/events/ChannelMuteUserEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/events/ChannelMuteUserEvent.kt @@ -33,7 +33,8 @@ class ChannelMuteUserEvent( tags: Array>, content: String, sig: HexKey, -) : Event(id, pubKey, createdAt, KIND, tags, content, sig), IsInPublicChatChannel { +) : Event(id, pubKey, createdAt, KIND, tags, content, sig), + IsInPublicChatChannel { override fun channel() = tags.firstOrNull { it.size > 3 && it[0] == "e" && it[3] == "root" }?.get(1) ?: tags.firstOrNull { it.size > 1 && it[0] == "e" }?.get(1) diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/events/ChatMessageRelayListEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/events/ChatMessageRelayListEvent.kt index b43188ae9..61cf8aa49 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/events/ChatMessageRelayListEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/events/ChatMessageRelayListEvent.kt @@ -37,33 +37,29 @@ class ChatMessageRelayListEvent( ) : BaseAddressableEvent(id, pubKey, createdAt, KIND, tags, content, sig) { override fun dTag() = FIXED_D_TAG - fun relays(): List { - return tags.mapNotNull { + fun relays(): List = + tags.mapNotNull { if (it.size > 1 && it[0] == "relay") { it[1] } else { null } } - } companion object { const val KIND = 10050 const val FIXED_D_TAG = "" - fun createAddressATag(pubKey: HexKey): ATag { - return ATag(KIND, pubKey, FIXED_D_TAG, null) - } + fun createAddressATag(pubKey: HexKey): ATag = ATag(KIND, pubKey, FIXED_D_TAG, null) - fun createAddressTag(pubKey: HexKey): String { - return ATag.assembleATag(KIND, pubKey, FIXED_D_TAG) - } + fun createAddressTag(pubKey: HexKey): String = ATag.assembleATag(KIND, pubKey, FIXED_D_TAG) - fun createTagArray(relays: List): Array> { - return relays.map { - arrayOf("relay", it) - }.plusElement(arrayOf("alt", "Relay list to receive private messages")).toTypedArray() - } + fun createTagArray(relays: List): Array> = + relays + .map { + arrayOf("relay", it) + }.plusElement(arrayOf("alt", "Relay list to receive private messages")) + .toTypedArray() fun updateRelayList( earlierVersion: ChatMessageRelayListEvent, @@ -73,11 +69,13 @@ class ChatMessageRelayListEvent( onReady: (ChatMessageRelayListEvent) -> Unit, ) { val tags = - earlierVersion.tags.filter { it[0] != "relay" }.plus( - relays.map { - arrayOf("relay", it) - }, - ).toTypedArray() + earlierVersion.tags + .filter { it[0] != "relay" } + .plus( + relays.map { + arrayOf("relay", it) + }, + ).toTypedArray() signer.sign(createdAt, KIND, tags, earlierVersion.content, onReady) } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/events/ClassifiedsEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/events/ClassifiedsEvent.kt index dbc6a0296..bcd9def65 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/events/ClassifiedsEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/events/ClassifiedsEvent.kt @@ -79,7 +79,9 @@ class ClassifiedsEvent( null } - enum class CONDITION(val value: String) { + enum class CONDITION( + val value: String, + ) { NEW("new"), USED_LIKE_NEW("like new"), USED_GOOD("good"), @@ -202,4 +204,8 @@ class ClassifiedsEvent( } } -data class Price(val amount: String, val currency: String?, val frequency: String?) +data class Price( + val amount: String, + val currency: String?, + val frequency: String?, +) diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/events/CommunityListEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/events/CommunityListEvent.kt index 21d692a90..9ab0866af 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/events/CommunityListEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/events/CommunityListEvent.kt @@ -67,9 +67,7 @@ class CommunityListEvent( const val FIXED_D_TAG = "" const val ALT = "Community List" - fun blockListFor(pubKeyHex: HexKey): String { - return "$KIND:$pubKeyHex:" - } + fun blockListFor(pubKeyHex: HexKey): String = "$KIND:$pubKeyHex:" fun createListWithTag( key: String, @@ -106,9 +104,7 @@ class CommunityListEvent( signer: NostrSigner, createdAt: Long = TimeUtils.now(), onReady: (CommunityListEvent) -> Unit, - ) { - return createListWithTag("a", address.toTag(), isPrivate, signer, createdAt, onReady) - } + ) = createListWithTag("a", address.toTag(), isPrivate, signer, createdAt, onReady) fun addEvents( earlierVersion: CommunityListEvent, @@ -157,9 +153,7 @@ class CommunityListEvent( signer: NostrSigner, createdAt: Long = TimeUtils.now(), onReady: (CommunityListEvent) -> Unit, - ) { - return addTag(earlierVersion, "a", address.toTag(), isPrivate, signer, createdAt, onReady) - } + ) = addTag(earlierVersion, "a", address.toTag(), isPrivate, signer, createdAt, onReady) fun addTag( earlierVersion: CommunityListEvent, @@ -207,9 +201,7 @@ class CommunityListEvent( signer: NostrSigner, createdAt: Long = TimeUtils.now(), onReady: (CommunityListEvent) -> Unit, - ) { - return removeTag(earlierVersion, "a", address.toTag(), isPrivate, signer, createdAt, onReady) - } + ) = removeTag(earlierVersion, "a", address.toTag(), isPrivate, signer, createdAt, onReady) fun removeTag( earlierVersion: CommunityListEvent, diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/events/CommunityPostApprovalEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/events/CommunityPostApprovalEvent.kt index 430ccbaae..90ef3030b 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/events/CommunityPostApprovalEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/events/CommunityPostApprovalEvent.kt @@ -68,8 +68,7 @@ class CommunityPostApprovalEvent( it[0] == "e" || (it[0] == "a" && ATag.parse(it[1], null)?.kind != CommunityDefinitionEvent.KIND) ) - } - .map { it[1] } + }.map { it[1] } companion object { const val KIND = 4550 diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/events/ContactListEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/events/ContactListEvent.kt index b782e376e..ac0135674 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/events/ContactListEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/events/ContactListEvent.kt @@ -32,7 +32,10 @@ import com.vitorpamplona.quartz.encoders.toHexKey import com.vitorpamplona.quartz.signers.NostrSigner import com.vitorpamplona.quartz.utils.TimeUtils -@Immutable data class Contact(val pubKeyHex: String, val relayUri: String?) +@Immutable data class Contact( + val pubKeyHex: String, + val relayUri: String?, +) @Stable class ContactListEvent( @@ -391,7 +394,10 @@ class ContactListEvent( } } - data class ReadWrite(val read: Boolean, val write: Boolean) + data class ReadWrite( + val read: Boolean, + val write: Boolean, + ) } @Stable @@ -420,31 +426,20 @@ class UserMetadata { @Transient var tags: ImmutableListOfLists? = null - fun anyName(): String? { - return displayName ?: name ?: username - } + fun anyName(): String? = displayName ?: name ?: username - fun anyNameStartsWith(prefix: String): Boolean { - return listOfNotNull(name, username, displayName, nip05, lud06, lud16).any { + fun anyNameStartsWith(prefix: String): Boolean = + listOfNotNull(name, username, displayName, nip05, lud06, lud16).any { it.contains(prefix, true) } - } - fun lnAddress(): String? { - return lud16 ?: lud06 - } + fun lnAddress(): String? = lud16 ?: lud06 - fun bestName(): String? { - return displayName ?: name ?: username - } + fun bestName(): String? = displayName ?: name ?: username - fun nip05(): String? { - return nip05 - } + fun nip05(): String? = nip05 - fun profilePicture(): String? { - return picture - } + fun profilePicture(): String? = picture fun cleanBlankNames() { if (picture?.isNotEmpty() == true) picture = picture?.trim() @@ -473,10 +468,10 @@ class UserMetadata { } } -@Stable class ImmutableListOfLists(val lists: Array>) +@Stable class ImmutableListOfLists( + val lists: Array>, +) val EmptyTagList = ImmutableListOfLists(emptyArray()) -fun Array>.toImmutableListOfLists(): ImmutableListOfLists { - return ImmutableListOfLists(this) -} +fun Array>.toImmutableListOfLists(): ImmutableListOfLists = ImmutableListOfLists(this) diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/events/DeletionEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/events/DeletionEvent.kt index e93dd4548..fb23c4281 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/events/DeletionEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/events/DeletionEvent.kt @@ -54,11 +54,12 @@ class DeletionEvent( val tags = mutableListOf>() val kinds = - deleteEvents.mapTo(HashSet()) { - "${it.kind}" - }.map { - arrayOf("k", it) - } + deleteEvents + .mapTo(HashSet()) { + "${it.kind}" + }.map { + arrayOf("k", it) + } tags.addAll(deleteEvents.map { arrayOf("e", it.id) }) tags.addAll(deleteEvents.mapNotNull { if (it is AddressableEvent) arrayOf("a", it.address().toTag()) else null }) @@ -78,11 +79,12 @@ class DeletionEvent( val tags = mutableListOf>() val kinds = - deleteEvents.mapTo(HashSet()) { - "${it.kind}" - }.map { - arrayOf("k", it) - } + deleteEvents + .mapTo(HashSet()) { + "${it.kind}" + }.map { + arrayOf("k", it) + } tags.addAll(deleteEvents.map { arrayOf("e", it.id) }) tags.addAll(kinds) diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/events/DraftEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/events/DraftEvent.kt index 30b762fb6..7d19975df 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/events/DraftEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/events/DraftEvent.kt @@ -41,13 +41,9 @@ class DraftEvent( fun isDeleted() = content == "" - fun preCachedDraft(signer: NostrSigner): Event? { - return cachedInnerEvent[signer.pubKey] - } + fun preCachedDraft(signer: NostrSigner): Event? = cachedInnerEvent[signer.pubKey] - fun preCachedDraft(pubKey: HexKey): Event? { - return cachedInnerEvent[pubKey] - } + fun preCachedDraft(pubKey: HexKey): Event? = cachedInnerEvent[pubKey] fun allCache() = cachedInnerEvent.values @@ -114,9 +110,7 @@ class DraftEvent( fun createAddressTag( pubKey: HexKey, dTag: String, - ): String { - return ATag.assembleATag(KIND, pubKey, dTag) - } + ): String = ATag.assembleATag(KIND, pubKey, dTag) fun create( dTag: String, diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/events/EmojiPackEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/events/EmojiPackEvent.kt index 73a09f013..0599fc9b8 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/events/EmojiPackEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/events/EmojiPackEvent.kt @@ -56,10 +56,11 @@ class EmojiPackEvent( } @Immutable -data class EmojiUrl(val code: String, val url: String) { - fun encode(): String { - return ":$code:$url" - } +data class EmojiUrl( + val code: String, + val url: String, +) { + fun encode(): String = ":$code:$url" companion object { fun decode(encodedEmojiSetup: String): EmojiUrl? { diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/events/FileHeaderEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/events/FileHeaderEvent.kt index 2dd61b26b..a477f42ae 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/events/FileHeaderEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/events/FileHeaderEvent.kt @@ -123,4 +123,7 @@ class FileHeaderEvent( } } -data class AESGCM(val key: String, val nonce: String) +data class AESGCM( + val key: String, + val nonce: String, +) diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/events/FileStorageEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/events/FileStorageEvent.kt index 0a72d616f..d65506e65 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/events/FileStorageEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/events/FileStorageEvent.kt @@ -42,14 +42,13 @@ class FileStorageEvent( fun decryptKey() = tags.firstOrNull { it.size > 2 && it[0] == DECRYPT }?.let { AESGCM(it[1], it[2]) } - fun decode(): ByteArray? { - return try { + fun decode(): ByteArray? = + try { Base64.getDecoder().decode(content) } catch (e: Exception) { Log.e("FileStorageEvent", "Unable to decode base 64 ${e.message} $content") null } - } companion object { const val KIND = 1064 @@ -58,9 +57,7 @@ class FileStorageEvent( private const val TYPE = "type" private const val DECRYPT = "decrypt" - fun encode(bytes: ByteArray): String { - return Base64.getEncoder().encodeToString(bytes) - } + fun encode(bytes: ByteArray): String = Base64.getEncoder().encodeToString(bytes) fun create( mimeType: String, diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/events/GeneralListEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/events/GeneralListEvent.kt index 5628c5820..dfa32eb79 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/events/GeneralListEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/events/GeneralListEvent.kt @@ -56,9 +56,7 @@ abstract class GeneralListEvent( fun nameOrTitle() = name() ?: title() - fun cachedPrivateTags(): Array>? { - return privateTagsCache - } + fun cachedPrivateTags(): Array>? = privateTagsCache fun filterTagList( key: String, @@ -79,16 +77,14 @@ abstract class GeneralListEvent( isPrivate: Boolean, signer: NostrSigner, onReady: (Boolean) -> Unit, - ) { - return if (isPrivate) { - privateTagsOrEmpty(signer = signer) { - onReady( - it.any { it.size > 1 && it[0] == key && it[1] == tag }, - ) - } - } else { - onReady(isTagged(key, tag)) + ) = if (isPrivate) { + privateTagsOrEmpty(signer = signer) { + onReady( + it.any { it.size > 1 && it[0] == key && it[1] == tag }, + ) } + } else { + onReady(isTagged(key, tag)) } fun privateTags( @@ -147,24 +143,16 @@ abstract class GeneralListEvent( onReady: (List) -> Unit, ) = privateTags(signer) { onReady(filterAddresses(it)) } - fun filterUsers(tags: Array>): List { - return tags.filter { it.size > 1 && it[0] == "p" }.map { it[1] } - } + fun filterUsers(tags: Array>): List = tags.filter { it.size > 1 && it[0] == "p" }.map { it[1] } - fun filterHashtags(tags: Array>): List { - return tags.filter { it.size > 1 && it[0] == "t" }.map { it[1] } - } + fun filterHashtags(tags: Array>): List = tags.filter { it.size > 1 && it[0] == "t" }.map { it[1] } - fun filterGeohashes(tags: Array>): List { - return tags.filter { it.size > 1 && it[0] == "g" }.map { it[1] } - } + fun filterGeohashes(tags: Array>): List = tags.filter { it.size > 1 && it[0] == "g" }.map { it[1] } - fun filterEvents(tags: Array>): List { - return tags.filter { it.size > 1 && it[0] == "e" }.map { it[1] } - } + fun filterEvents(tags: Array>): List = tags.filter { it.size > 1 && it[0] == "e" }.map { it[1] } - fun filterAddresses(tags: Array>): List { - return tags + fun filterAddresses(tags: Array>): List = + tags .filter { it.firstOrNull() == "a" } .mapNotNull { val aTagValue = it.getOrNull(1) @@ -172,7 +160,6 @@ abstract class GeneralListEvent( if (aTagValue != null) ATag.parse(aTagValue, relay) else null } - } companion object { fun createPrivateTags( diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/events/LnZapEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/events/LnZapEvent.kt index 50407d634..67a49a68c 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/events/LnZapEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/events/LnZapEvent.kt @@ -33,7 +33,8 @@ class LnZapEvent( tags: Array>, content: String, sig: HexKey, -) : LnZapEventInterface, Event(id, pubKey, createdAt, KIND, tags, content, sig) { +) : Event(id, pubKey, createdAt, KIND, tags, content, sig), + LnZapEventInterface { // This event is also kept in LocalCache (same object) @Transient val zapRequest: LnZapRequestEvent? @@ -55,7 +56,11 @@ class LnZapEvent( override fun zappedPollOption(): Int? = try { - zapRequest?.tags?.firstOrNull { it.size > 1 && it[0] == POLL_OPTION }?.get(1)?.toInt() + zapRequest + ?.tags + ?.firstOrNull { it.size > 1 && it[0] == POLL_OPTION } + ?.get(1) + ?.toInt() } catch (e: Exception) { Log.e("LnZapEvent", "ZappedPollOption failed to parse", e) null @@ -75,9 +80,7 @@ class LnZapEvent( } } - override fun content(): String { - return content - } + override fun content(): String = content fun lnInvoice() = tags.firstOrNull { it.size > 1 && it[0] == "bolt11" }?.get(1) @@ -88,7 +91,7 @@ class LnZapEvent( const val ALT = "Zap event" } - enum class ZapType() { + enum class ZapType { PUBLIC, PRIVATE, ANONYMOUS, diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/events/LnZapPaymentRequestEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/events/LnZapPaymentRequestEvent.kt index 8b1bde062..1727b0705 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/events/LnZapPaymentRequestEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/events/LnZapPaymentRequestEvent.kt @@ -44,9 +44,7 @@ class LnZapPaymentRequestEvent( fun walletServicePubKey() = tags.firstOrNull { it.size > 1 && it[0] == "p" }?.get(1) - fun talkingWith(oneSideHex: String): HexKey { - return if (pubKey == oneSideHex) walletServicePubKey() ?: pubKey else pubKey - } + fun talkingWith(oneSideHex: String): HexKey = if (pubKey == oneSideHex) walletServicePubKey() ?: pubKey else pubKey fun lnInvoice( signer: NostrSigner, @@ -97,16 +95,20 @@ class LnZapPaymentRequestEvent( // REQUEST OBJECTS -abstract class Request(var method: String? = null) +abstract class Request( + var method: String? = null, +) // PayInvoice Call -class PayInvoiceParams(var invoice: String? = null) +class PayInvoiceParams( + var invoice: String? = null, +) -class PayInvoiceMethod(var params: PayInvoiceParams? = null) : Request("pay_invoice") { +class PayInvoiceMethod( + var params: PayInvoiceParams? = null, +) : Request("pay_invoice") { companion object { - fun create(bolt11: String): PayInvoiceMethod { - return PayInvoiceMethod(PayInvoiceParams(bolt11)) - } + fun create(bolt11: String): PayInvoiceMethod = PayInvoiceMethod(PayInvoiceParams(bolt11)) } } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/events/LnZapPaymentResponseEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/events/LnZapPaymentResponseEvent.kt index 7bb9c1db4..45e1320b1 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/events/LnZapPaymentResponseEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/events/LnZapPaymentResponseEvent.kt @@ -46,9 +46,7 @@ class LnZapPaymentResponseEvent( fun requestId() = tags.firstOrNull { it.size > 1 && it[0] == "e" }?.get(1) - fun talkingWith(oneSideHex: String): HexKey { - return if (pubKey == oneSideHex) requestAuthor() ?: pubKey else pubKey - } + fun talkingWith(oneSideHex: String): HexKey = if (pubKey == oneSideHex) requestAuthor() ?: pubKey else pubKey private fun plainContent( signer: NostrSigner, @@ -97,13 +95,21 @@ abstract class Response( // PayInvoice Call -class PayInvoiceSuccessResponse(val result: PayInvoiceResultParams? = null) : - Response("pay_invoice") { - class PayInvoiceResultParams(val preimage: String) +class PayInvoiceSuccessResponse( + val result: PayInvoiceResultParams? = null, +) : Response("pay_invoice") { + class PayInvoiceResultParams( + val preimage: String, + ) } -class PayInvoiceErrorResponse(val error: PayInvoiceErrorParams? = null) : Response("pay_invoice") { - class PayInvoiceErrorParams(val code: ErrorType?, val message: String?) +class PayInvoiceErrorResponse( + val error: PayInvoiceErrorParams? = null, +) : Response("pay_invoice") { + class PayInvoiceErrorParams( + val code: ErrorType?, + val message: String?, + ) enum class ErrorType { @JsonProperty(value = "RATE_LIMITED") diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/events/LnZapRequestEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/events/LnZapRequestEvent.kt index f003caa4e..33727f11b 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/events/LnZapRequestEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/events/LnZapRequestEvent.kt @@ -75,9 +75,7 @@ class LnZapRequestEvent( return null } - fun cachedPrivateZap(): LnZapPrivateEvent? { - return privateZapEvent - } + fun cachedPrivateZap(): LnZapPrivateEvent? = privateZapEvent fun decryptPrivateZap( signer: NostrSigner, diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/events/LongTextNoteEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/events/LongTextNoteEvent.kt index 5f95758c2..7fbe65d57 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/events/LongTextNoteEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/events/LongTextNoteEvent.kt @@ -34,7 +34,8 @@ class LongTextNoteEvent( tags: Array>, content: String, sig: HexKey, -) : BaseTextNoteEvent(id, pubKey, createdAt, KIND, tags, content, sig), AddressableEvent { +) : BaseTextNoteEvent(id, pubKey, createdAt, KIND, tags, content, sig), + AddressableEvent { override fun dTag() = tags.firstOrNull { it.size > 1 && it[0] == "d" }?.get(1) ?: "" override fun address() = ATag(kind, pubKey, dTag(), null) diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/events/MuteListEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/events/MuteListEvent.kt index 195819b6b..a1e556813 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/events/MuteListEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/events/MuteListEvent.kt @@ -71,9 +71,7 @@ class MuteListEvent( const val FIXED_D_TAG = "" const val ALT = "Mute List" - fun blockListFor(pubKeyHex: HexKey): String { - return "10000:$pubKeyHex:" - } + fun blockListFor(pubKeyHex: HexKey): String = "10000:$pubKeyHex:" fun createListWithTag( key: String, @@ -110,9 +108,7 @@ class MuteListEvent( signer: NostrSigner, createdAt: Long = TimeUtils.now(), onReady: (MuteListEvent) -> Unit, - ) { - return createListWithTag("p", pubKeyHex, isPrivate, signer, createdAt, onReady) - } + ) = createListWithTag("p", pubKeyHex, isPrivate, signer, createdAt, onReady) fun createListWithWord( word: String, @@ -120,9 +116,7 @@ class MuteListEvent( signer: NostrSigner, createdAt: Long = TimeUtils.now(), onReady: (MuteListEvent) -> Unit, - ) { - return createListWithTag("word", word, isPrivate, signer, createdAt, onReady) - } + ) = createListWithTag("word", word, isPrivate, signer, createdAt, onReady) fun addUsers( earlierVersion: MuteListEvent, @@ -171,9 +165,7 @@ class MuteListEvent( signer: NostrSigner, createdAt: Long = TimeUtils.now(), onReady: (MuteListEvent) -> Unit, - ) { - return addTag(earlierVersion, "word", word, isPrivate, signer, createdAt, onReady) - } + ) = addTag(earlierVersion, "word", word, isPrivate, signer, createdAt, onReady) fun addUser( earlierVersion: MuteListEvent, @@ -182,9 +174,7 @@ class MuteListEvent( signer: NostrSigner, createdAt: Long = TimeUtils.now(), onReady: (MuteListEvent) -> Unit, - ) { - return addTag(earlierVersion, "p", pubKeyHex, isPrivate, signer, createdAt, onReady) - } + ) = addTag(earlierVersion, "p", pubKeyHex, isPrivate, signer, createdAt, onReady) fun addTag( earlierVersion: MuteListEvent, @@ -232,9 +222,7 @@ class MuteListEvent( signer: NostrSigner, createdAt: Long = TimeUtils.now(), onReady: (MuteListEvent) -> Unit, - ) { - return removeTag(earlierVersion, "word", word, isPrivate, signer, createdAt, onReady) - } + ) = removeTag(earlierVersion, "word", word, isPrivate, signer, createdAt, onReady) fun removeUser( earlierVersion: MuteListEvent, @@ -243,9 +231,7 @@ class MuteListEvent( signer: NostrSigner, createdAt: Long = TimeUtils.now(), onReady: (MuteListEvent) -> Unit, - ) { - return removeTag(earlierVersion, "p", pubKeyHex, isPrivate, signer, createdAt, onReady) - } + ) = removeTag(earlierVersion, "p", pubKeyHex, isPrivate, signer, createdAt, onReady) fun removeTag( earlierVersion: MuteListEvent, diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/events/NIP17Factory.kt b/quartz/src/main/java/com/vitorpamplona/quartz/events/NIP17Factory.kt index 2e3533991..370df42b7 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/events/NIP17Factory.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/events/NIP17Factory.kt @@ -24,7 +24,10 @@ import com.vitorpamplona.quartz.encoders.HexKey import com.vitorpamplona.quartz.signers.NostrSigner class NIP17Factory { - data class Result(val msg: Event, val wraps: List) + data class Result( + val msg: Event, + val wraps: List, + ) private fun recursiveGiftWrapCreation( event: Event, diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/events/NIP90StatusEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/events/NIP90StatusEvent.kt index e92ac9d32..a6cf48deb 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/events/NIP90StatusEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/events/NIP90StatusEvent.kt @@ -34,22 +34,27 @@ class NIP90StatusEvent( content: String, sig: HexKey, ) : Event(id, pubKey, createdAt, KIND, tags, content, sig) { - class StatusCode(val code: String, val description: String) + class StatusCode( + val code: String, + val description: String, + ) - class AmountInvoice(val amount: Long?, val lnInvoice: String?) + class AmountInvoice( + val amount: Long?, + val lnInvoice: String?, + ) - fun status(): StatusCode? { - return tags.firstOrNull { it.size > 1 && it[0] == "status" }?.let { + fun status(): StatusCode? = + tags.firstOrNull { it.size > 1 && it[0] == "status" }?.let { if (it.size > 2 && content == "") { StatusCode(it[1], it[2]) } else { StatusCode(it[1], content) } } - } - fun firstAmount(): AmountInvoice? { - return tags.firstOrNull { it.size > 1 && it[0] == "amount" }?.let { + fun firstAmount(): AmountInvoice? = + tags.firstOrNull { it.size > 1 && it[0] == "amount" }?.let { val amount = it[1].toLongOrNull() if (it.size > 2) { if (it[2].isNotBlank()) { @@ -65,7 +70,6 @@ class NIP90StatusEvent( } } } - } companion object { const val KIND = 7000 diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/events/OtsEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/events/OtsEvent.kt index 7b6646489..6dccecdaf 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/events/OtsEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/events/OtsEvent.kt @@ -54,22 +54,17 @@ class OtsEvent( fun digest() = digestEvent()?.hexToByteArray() - fun otsByteArray(): ByteArray { - return Base64.getDecoder().decode(content) - } + fun otsByteArray(): ByteArray = Base64.getDecoder().decode(content) - fun cacheVerify(): Long? { - return if (verifiedTime != null) { + fun cacheVerify(): Long? = + if (verifiedTime != null) { verifiedTime } else { verifiedTime = verify() verifiedTime } - } - fun verify(): Long? { - return digestEvent()?.let { OtsEvent.verify(otsByteArray(), it) } - } + fun verify(): Long? = digestEvent()?.let { OtsEvent.verify(otsByteArray(), it) } fun info(): String { val detachedOts = DetachedTimestampFile.deserialize(otsByteArray()) @@ -111,16 +106,12 @@ class OtsEvent( fun verify( otsFile: String, eventId: HexKey, - ): Long? { - return verify(Base64.getDecoder().decode(otsFile), eventId) - } + ): Long? = verify(Base64.getDecoder().decode(otsFile), eventId) fun verify( otsFile: ByteArray, eventId: HexKey, - ): Long? { - return verify(DetachedTimestampFile.deserialize(otsFile), eventId) - } + ): Long? = verify(DetachedTimestampFile.deserialize(otsFile), eventId) fun verify( detachedOts: DetachedTimestampFile, diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/events/PrivateDmEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/events/PrivateDmEvent.kt index 4ead7e44a..6dd21b030 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/events/PrivateDmEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/events/PrivateDmEvent.kt @@ -37,7 +37,8 @@ class PrivateDmEvent( tags: Array>, content: String, sig: HexKey, -) : Event(id, pubKey, createdAt, KIND, tags, content, sig), ChatroomKeyable { +) : Event(id, pubKey, createdAt, KIND, tags, content, sig), + ChatroomKeyable { @Transient private var decryptedContent: Map = mapOf() override fun isContentEncoded() = true @@ -60,13 +61,9 @@ class PrivateDmEvent( } } - fun talkingWith(oneSideHex: String): HexKey { - return if (pubKey == oneSideHex) verifiedRecipientPubKey() ?: pubKey else pubKey - } + fun talkingWith(oneSideHex: String): HexKey = if (pubKey == oneSideHex) verifiedRecipientPubKey() ?: pubKey else pubKey - override fun chatroomKey(toRemove: String): ChatroomKey { - return ChatroomKey(persistentSetOf(talkingWith(toRemove))) - } + override fun chatroomKey(toRemove: String): ChatroomKey = ChatroomKey(persistentSetOf(talkingWith(toRemove))) /** * To be fully compatible with nip-04, we read e-tags that are in violation to nip-18. @@ -76,13 +73,9 @@ class PrivateDmEvent( */ fun replyTo() = tags.firstOrNull { it.size > 1 && it[0] == "e" }?.get(1) - fun with(pubkeyHex: String): Boolean { - return pubkeyHex == pubKey || tags.any { it.size > 1 && it[0] == "p" && it[1] == pubkeyHex } - } + fun with(pubkeyHex: String): Boolean = pubkeyHex == pubKey || tags.any { it.size > 1 && it[0] == "p" && it[1] == pubkeyHex } - fun cachedContentFor(signer: NostrSigner): String? { - return decryptedContent[signer.pubKey] - } + fun cachedContentFor(signer: NostrSigner): String? = decryptedContent[signer.pubKey] fun plainContent( signer: NostrSigner, @@ -178,11 +171,10 @@ class PrivateDmEvent( } } -fun geohashMipMap(geohash: String): Array> { - return geohash.indices +fun geohashMipMap(geohash: String): Array> = + geohash.indices .asSequence() .map { arrayOf("g", geohash.substring(0, it + 1)) } .toList() .reversed() .toTypedArray() -} diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/events/ReactionEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/events/ReactionEvent.kt index a3c9b53d6..6073a9abb 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/events/ReactionEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/events/ReactionEvent.kt @@ -46,18 +46,14 @@ class ReactionEvent( signer: NostrSigner, createdAt: Long = TimeUtils.now(), onReady: (ReactionEvent) -> Unit, - ) { - return create("\u26A0\uFE0F", originalNote, signer, createdAt, onReady) - } + ) = create("\u26A0\uFE0F", originalNote, signer, createdAt, onReady) fun createLike( originalNote: EventInterface, signer: NostrSigner, createdAt: Long = TimeUtils.now(), onReady: (ReactionEvent) -> Unit, - ) { - return create("+", originalNote, signer, createdAt, onReady) - } + ) = create("+", originalNote, signer, createdAt, onReady) fun create( content: String, diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/events/SearchRelayListEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/events/SearchRelayListEvent.kt index 1514c2571..16a632600 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/events/SearchRelayListEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/events/SearchRelayListEvent.kt @@ -37,33 +37,29 @@ class SearchRelayListEvent( ) : BaseAddressableEvent(id, pubKey, createdAt, KIND, tags, content, sig) { override fun dTag() = FIXED_D_TAG - fun relays(): List { - return tags.mapNotNull { + fun relays(): List = + tags.mapNotNull { if (it.size > 1 && it[0] == "relay") { it[1] } else { null } } - } companion object { const val KIND = 10007 const val FIXED_D_TAG = "" - fun createAddressATag(pubKey: HexKey): ATag { - return ATag(KIND, pubKey, FIXED_D_TAG, null) - } + fun createAddressATag(pubKey: HexKey): ATag = ATag(KIND, pubKey, FIXED_D_TAG, null) - fun createAddressTag(pubKey: HexKey): String { - return ATag.assembleATag(KIND, pubKey, FIXED_D_TAG) - } + fun createAddressTag(pubKey: HexKey): String = ATag.assembleATag(KIND, pubKey, FIXED_D_TAG) - fun createTagArray(relays: List): Array> { - return relays.map { - arrayOf("relay", it) - }.plusElement(arrayOf("alt", "Relay list to use for Search")).toTypedArray() - } + fun createTagArray(relays: List): Array> = + relays + .map { + arrayOf("relay", it) + }.plusElement(arrayOf("alt", "Relay list to use for Search")) + .toTypedArray() fun updateRelayList( earlierVersion: SearchRelayListEvent, @@ -73,11 +69,13 @@ class SearchRelayListEvent( onReady: (SearchRelayListEvent) -> Unit, ) { val tags = - earlierVersion.tags.filter { it[0] != "relay" }.plus( - relays.map { - arrayOf("relay", it) - }, - ).toTypedArray() + earlierVersion.tags + .filter { it[0] != "relay" } + .plus( + relays.map { + arrayOf("relay", it) + }, + ).toTypedArray() signer.sign(createdAt, KIND, tags, earlierVersion.content, onReady) } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/events/TextNoteEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/events/TextNoteEvent.kt index 160871b07..da7fca088 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/events/TextNoteEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/events/TextNoteEvent.kt @@ -134,9 +134,7 @@ class TextNoteEvent( } } -fun findURLs(text: String): List { - return UrlDetector(text, UrlDetectorOptions.Default).detect().map { it.originalUrl } -} +fun findURLs(text: String): List = UrlDetector(text, UrlDetectorOptions.Default).detect().map { it.originalUrl } /** * Returns a list of NIP-10 marked tags that are also ordered at best effort to support the @@ -163,13 +161,12 @@ fun List.positionalMarkedTags( o2 == replyingTo -> -1 // reply event being responded to goes last else -> 0 // keep the relative order for any other tag } -} - .map { - when (it) { - root -> arrayOf(tagName, it, "", "root") - replyingTo -> arrayOf(tagName, it, "", "reply") - forkedFrom -> arrayOf(tagName, it, "", "fork") - in directMentions -> arrayOf(tagName, it, "", "mention") - else -> arrayOf(tagName, it) - } +}.map { + when (it) { + root -> arrayOf(tagName, it, "", "root") + replyingTo -> arrayOf(tagName, it, "", "reply") + forkedFrom -> arrayOf(tagName, it, "", "fork") + in directMentions -> arrayOf(tagName, it, "", "mention") + else -> arrayOf(tagName, it) } +} diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/events/WikiNoteEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/events/WikiNoteEvent.kt index 696e2846b..f92d8730a 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/events/WikiNoteEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/events/WikiNoteEvent.kt @@ -34,7 +34,8 @@ class WikiNoteEvent( tags: Array>, content: String, sig: HexKey, -) : BaseTextNoteEvent(id, pubKey, createdAt, KIND, tags, content, sig), AddressableEvent { +) : BaseTextNoteEvent(id, pubKey, createdAt, KIND, tags, content, sig), + AddressableEvent { override fun dTag() = tags.firstOrNull { it.size > 1 && it[0] == "d" }?.get(1) ?: "" override fun address() = ATag(kind, pubKey, dTag(), null) diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/signers/NostrSigner.kt b/quartz/src/main/java/com/vitorpamplona/quartz/signers/NostrSigner.kt index 25df198b5..dad1dac91 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/signers/NostrSigner.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/signers/NostrSigner.kt @@ -27,7 +27,9 @@ import com.vitorpamplona.quartz.events.EventFactory import com.vitorpamplona.quartz.events.LnZapPrivateEvent import com.vitorpamplona.quartz.events.LnZapRequestEvent -abstract class NostrSigner(val pubKey: HexKey) { +abstract class NostrSigner( + val pubKey: HexKey, +) { abstract fun sign( createdAt: Long, kind: Int, diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/signers/NostrSignerExternal.kt b/quartz/src/main/java/com/vitorpamplona/quartz/signers/NostrSignerExternal.kt index 0ff8dbce2..b61df49f0 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/signers/NostrSignerExternal.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/signers/NostrSignerExternal.kt @@ -66,8 +66,7 @@ class NostrSignerExternal( localEvent.content, localEvent.sig, ) as? T? - ) - ?.let { onReady(it) } + )?.let { onReady(it) } } else { ( EventFactory.create( @@ -79,8 +78,7 @@ class NostrSignerExternal( event.content, signature.split("-")[0], ) as? T? - ) - ?.let { onReady(it) } + )?.let { onReady(it) } } } } diff --git a/quartz/src/test/java/com/vitorpamplona/quartz/encoders/NIP19ParserTest.kt b/quartz/src/test/java/com/vitorpamplona/quartz/encoders/NIP19ParserTest.kt index 21f9262f3..bc5788e7d 100644 --- a/quartz/src/test/java/com/vitorpamplona/quartz/encoders/NIP19ParserTest.kt +++ b/quartz/src/test/java/com/vitorpamplona/quartz/encoders/NIP19ParserTest.kt @@ -132,9 +132,10 @@ class NIP19ParserTest { @Test fun nAddrParserPablo() { val result = - Nip19Bech32.uriToRoute( - "naddr1qq2hs7p30p6kcunxxamkgcnyd33xxve3veshyq3qyujphdcz69z6jafxpnldae3xtymdekfeatkt3r4qusr3w5krqspqxpqqqpaxjlg805f", - )?.entity as? Nip19Bech32.NAddress + Nip19Bech32 + .uriToRoute( + "naddr1qq2hs7p30p6kcunxxamkgcnyd33xxve3veshyq3qyujphdcz69z6jafxpnldae3xtymdekfeatkt3r4qusr3w5krqspqxpqqqpaxjlg805f", + )?.entity as? Nip19Bech32.NAddress assertNotNull(result) assertEquals( @@ -149,9 +150,10 @@ class NIP19ParserTest { @Test fun nAddrParserGizmo() { val result = - Nip19Bech32.uriToRoute( - "naddr1qpqrvvfnvccrzdryxgunzvtxvgukge34xfjnqdpcv9sk2desxgmrscesvserzd3h8ycrywphvg6nsvf58ycnqef3v5mnsvt98pjnqdfs8ypzq3huhccxt6h34eupz3jeynjgjgek8lel2f4adaea0svyk94a3njdqvzqqqr4gudhrkyk", - )?.entity as? Nip19Bech32.NAddress + Nip19Bech32 + .uriToRoute( + "naddr1qpqrvvfnvccrzdryxgunzvtxvgukge34xfjnqdpcv9sk2desxgmrscesvserzd3h8ycrywphvg6nsvf58ycnqef3v5mnsvt98pjnqdfs8ypzq3huhccxt6h34eupz3jeynjgjgek8lel2f4adaea0svyk94a3njdqvzqqqr4gudhrkyk", + )?.entity as? Nip19Bech32.NAddress assertNotNull(result) assertEquals( @@ -166,9 +168,10 @@ class NIP19ParserTest { @Test fun nAddrParserGizmo2() { val result = - Nip19Bech32.uriToRoute( - "naddr1qq9rzd3h8y6nqwf5xyuqygzxljlrqe027xh8sy2xtyjwfzfrxcll8afxh4hh847psjckhkxwf5psgqqqw4rsty50fx", - )?.entity as? Nip19Bech32.NAddress + Nip19Bech32 + .uriToRoute( + "naddr1qq9rzd3h8y6nqwf5xyuqygzxljlrqe027xh8sy2xtyjwfzfrxcll8afxh4hh847psjckhkxwf5psgqqqw4rsty50fx", + )?.entity as? Nip19Bech32.NAddress assertNotNull(result) assertEquals( @@ -219,9 +222,10 @@ class NIP19ParserTest { @Test fun nEventParser() { val result = - Nip19Bech32.uriToRoute( - "nostr:nevent1qqstvrl6wftd8ht4g0vrp6m30tjs6pdxcvk977g769dcvlptkzu4ftqppamhxue69uhkummnw3ezumt0d5pzp78lz8r60568sd2a8dx3wnj6gume02gxaf92vx4fk67qv5kpagt6qvzqqqqqqygqr86c", - )?.entity as? Nip19Bech32.NEvent + Nip19Bech32 + .uriToRoute( + "nostr:nevent1qqstvrl6wftd8ht4g0vrp6m30tjs6pdxcvk977g769dcvlptkzu4ftqppamhxue69uhkummnw3ezumt0d5pzp78lz8r60568sd2a8dx3wnj6gume02gxaf92vx4fk67qv5kpagt6qvzqqqqqqygqr86c", + )?.entity as? Nip19Bech32.NEvent assertNotNull(result) assertEquals("b60ffa7256d3dd7543d830eb717ae50d05a6c32c5f791ed15b867c2bb0b954ac", result?.hex) @@ -233,9 +237,10 @@ class NIP19ParserTest { @Test fun nEventParser2() { val result = - Nip19Bech32.uriToRoute( - "nostr:nevent1qqsplpuwsgrrmq85rfup6w3w777rxmcmadu590emfx6z4msj2844euqpz3mhxue69uhhyetvv9ujuerpd46hxtnfdupzq3svyhng9ld8sv44950j957j9vchdktj7cxumsep9mvvjthc2pjuqvzqqqqqqye3a70w", - )?.entity as? Nip19Bech32.NEvent + Nip19Bech32 + .uriToRoute( + "nostr:nevent1qqsplpuwsgrrmq85rfup6w3w777rxmcmadu590emfx6z4msj2844euqpz3mhxue69uhhyetvv9ujuerpd46hxtnfdupzq3svyhng9ld8sv44950j957j9vchdktj7cxumsep9mvvjthc2pjuqvzqqqqqqye3a70w", + )?.entity as? Nip19Bech32.NEvent assertNotNull(result) assertEquals("1f878e82063d80f41a781d3a2ef7bc336f1beb7942bf3b49b42aee1251eb5cf0", result?.hex) @@ -247,9 +252,10 @@ class NIP19ParserTest { @Test fun nEventParser3() { val result = - Nip19Bech32.uriToRoute( - "nostr:nevent1qqsg6gechd3dhzx38n4z8a2lylzgsmmgeamhmtzz72m9ummsnf0xjfspsdmhxue69uhkummn9ekx7mpvwaehxw309ahx7um5wghx77r5wghxgetk93mhxue69uhhyetvv9ujumn0wd68ytnzvuk8wumn8ghj7mn0wd68ytn9d9h82mny0fmkzmn6d9njuumsv93k2trhwden5te0wfjkccte9ehx7um5wghxyctwvsk8wumn8ghj7un9d3shjtnyv9kh2uewd9hs3kqsdn", - )?.entity as? Nip19Bech32.NEvent + Nip19Bech32 + .uriToRoute( + "nostr:nevent1qqsg6gechd3dhzx38n4z8a2lylzgsmmgeamhmtzz72m9ummsnf0xjfspsdmhxue69uhkummn9ekx7mpvwaehxw309ahx7um5wghx77r5wghxgetk93mhxue69uhhyetvv9ujumn0wd68ytnzvuk8wumn8ghj7mn0wd68ytn9d9h82mny0fmkzmn6d9njuumsv93k2trhwden5te0wfjkccte9ehx7um5wghxyctwvsk8wumn8ghj7un9d3shjtnyv9kh2uewd9hs3kqsdn", + )?.entity as? Nip19Bech32.NEvent assertNotNull(result) assertEquals("8d2338bb62db88d13cea23f55f27c4886f68cf777dac42f2b65e6f709a5e6926", result?.hex) @@ -262,9 +268,10 @@ class NIP19ParserTest { @Test fun nEventParserInvalidChecksum() { val result = - Nip19Bech32.uriToRoute( - "nostr:nevent1qqsyxq8v0730nz38dupnjzp5jegkyz4gu2ptwcps4v32hjnrap0q0espz3mhxue69uhhyetvv9ujuerpd46hxtnfdupzq3svyhng9ld8sv44950j957j9vchdktj7cxumsep9mvvjthc2pjuqvzqqqqqqyn3t9gj", - )?.entity as? Nip19Bech32.NEvent + Nip19Bech32 + .uriToRoute( + "nostr:nevent1qqsyxq8v0730nz38dupnjzp5jegkyz4gu2ptwcps4v32hjnrap0q0espz3mhxue69uhhyetvv9ujuerpd46hxtnfdupzq3svyhng9ld8sv44950j957j9vchdktj7cxumsep9mvvjthc2pjuqvzqqqqqqyn3t9gj", + )?.entity as? Nip19Bech32.NEvent assertNotNull(result) assertEquals("4300ec7fa2f98a276f033908349651620aa8e282b76030ab22abca63e85e07e6", result?.hex)