diff --git a/.gitignore b/.gitignore index 56cc6425..25585289 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,20 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +local.properties + + # Built application files *.apk *.aar diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 00000000..26d33521 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 00000000..fb7f4a8a --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 00000000..ed76bea3 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,37 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 00000000..360e6d41 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,10 @@ + + + + + + + + + \ No newline at end of file diff --git a/amethyst.png b/amethyst.png new file mode 100644 index 00000000..b869584e Binary files /dev/null and b/amethyst.png differ diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 00000000..42afabfd --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 00000000..abe2b1dc --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,101 @@ +plugins { + id 'com.android.application' + id 'org.jetbrains.kotlin.android' +} + +android { + namespace 'com.vitorpamplona.amethyst' + compileSdk 33 + + defaultConfig { + applicationId "com.vitorpamplona.amethyst" + minSdk 26 + targetSdk 33 + versionCode 1 + versionName "0.1" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + vectorDrawables { + useSupportLibrary true + } + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_11 + targetCompatibility JavaVersion.VERSION_11 + } + kotlinOptions { + jvmTarget = '11' + } + buildFeatures { + compose true + } + composeOptions { + kotlinCompilerExtensionVersion '1.3.2' + } + packagingOptions { + resources { + excludes += '/META-INF/{AL2.0,LGPL2.1}' + } + } +} + +dependencies { + implementation 'androidx.core:core-ktx:1.9.0' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' + implementation 'androidx.activity:activity-compose:1.6.1' + implementation "androidx.compose.ui:ui:$compose_ui_version" + implementation "androidx.compose.ui:ui-tooling-preview:$compose_ui_version" + implementation 'androidx.compose.material:material:1.3.1' + + // Navigation + implementation("androidx.navigation:navigation-compose:$nav_version") + implementation 'androidx.lifecycle:lifecycle-runtime-compose:2.6.0-alpha03' + implementation 'androidx.compose.runtime:runtime-livedata:1.4.0-alpha03' + + // Input + implementation 'androidx.lifecycle:lifecycle-viewmodel-compose:2.5.1' + + // Swipe Refresh + implementation 'com.google.accompanist:accompanist-swiperefresh:0.24.13-rc' + + // Load images from the web. + implementation "io.coil-kt:coil-compose:2.2.2" + + // Bitcoin secp256k1 bindings to Android + implementation 'fr.acinq.secp256k1:secp256k1-kmp-jni-android:0.7.0' + + // Nostr Base Protocol + implementation('com.github.vitorpamplona.NostrPostr:nostrpostrlib:master-SNAPSHOT') { + exclude group:'fr.acinq.secp256k1' + exclude module: 'guava' + exclude module: 'guava-testlib' + } + + implementation 'com.squareup.retrofit2:converter-gson:2.8.1' + // Websockets API + implementation 'com.squareup.okhttp3:okhttp:4.10.0' + + // Json Serialization + implementation 'com.fasterxml.jackson.module:jackson-module-kotlin:2.14.1' + + // Rendering clickable text + implementation "com.google.accompanist:accompanist-flowlayout:0.28.0" + + // link preview + implementation 'tw.com.oneup.www:Baha-UrlPreview:1.0.1' + implementation 'androidx.security:security-crypto-ktx:1.1.0-alpha03' + + testImplementation 'junit:junit:4.13.2' + androidTestImplementation 'androidx.test.ext:junit:1.1.5' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' + androidTestImplementation "androidx.compose.ui:ui-test-junit4:$compose_ui_version" + debugImplementation "androidx.compose.ui:ui-tooling:$compose_ui_version" + debugImplementation "androidx.compose.ui:ui-test-manifest:$compose_ui_version" +} \ No newline at end of file diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 00000000..481bb434 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/app/src/androidTest/java/com/vitorpamplona/amethyst/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/vitorpamplona/amethyst/ExampleInstrumentedTest.kt new file mode 100644 index 00000000..937e4751 --- /dev/null +++ b/app/src/androidTest/java/com/vitorpamplona/amethyst/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.vitorpamplona.amethyst + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.vitorpamplona.amethyst", appContext.packageName) + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000..d01064bd --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/vitorpamplona/amethyst/KeyStorage.kt b/app/src/main/java/com/vitorpamplona/amethyst/KeyStorage.kt new file mode 100644 index 00000000..612ce133 --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/KeyStorage.kt @@ -0,0 +1,22 @@ +package com.vitorpamplona.amethyst + +import android.content.Context +import androidx.security.crypto.EncryptedSharedPreferences +import androidx.security.crypto.MasterKeys + +class KeyStorage { + + fun encryptedPreferences(context: Context): EncryptedSharedPreferences { + val secretKey: String = MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC); + val preferencesName = "secret_keeper" + + return EncryptedSharedPreferences.create( + preferencesName, + secretKey, + context, + EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV, + EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM + ) as EncryptedSharedPreferences + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt new file mode 100644 index 00000000..308e65c2 --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt @@ -0,0 +1,92 @@ +package com.vitorpamplona.amethyst.model + +import androidx.lifecycle.LiveData +import com.vitorpamplona.amethyst.service.model.ReactionEvent +import com.vitorpamplona.amethyst.service.model.RepostEvent +import com.vitorpamplona.amethyst.service.relays.Client +import nostr.postr.Persona +import nostr.postr.events.TextNoteEvent +import nostr.postr.toHex + +class Account(val loggedIn: Persona) { + var seeReplies: Boolean = true + + fun userProfile(): User { + return LocalCache.getOrCreateUser(loggedIn.pubKey) + } + + fun isWriteable(): Boolean { + return loggedIn.privKey != null + } + + fun reactTo(note: Note) { + if (!isWriteable()) return + + note.event?.let { + val event = ReactionEvent.create(it, loggedIn.privKey!!) + Client.send(event) + LocalCache.consume(event) + } + } + + fun boost(note: Note) { + if (!isWriteable()) return + + note.event?.let { + val event = RepostEvent.create(it, loggedIn.privKey!!) + Client.send(event) + LocalCache.consume(event) + } + } + + fun sendPost(message: String, replyingTo: Note?) { + if (!isWriteable()) return + + val replyToEvent = replyingTo?.event + if (replyToEvent is TextNoteEvent) { + val repliesTo = replyToEvent.replyTos.plus(replyToEvent.id.toHex()) + val mentions = replyToEvent.mentions.plus(replyToEvent.pubKey.toHex()) + + val signedEvent = TextNoteEvent.create( + msg = message, + replyTos = repliesTo, + mentions = mentions, + privateKey = loggedIn.privKey!! + ) + Client.send(signedEvent) + LocalCache.consume(signedEvent) + } else { + val signedEvent = TextNoteEvent.create( + msg = message, + replyTos = null, + mentions = null, + privateKey = loggedIn.privKey!! + ) + Client.send(signedEvent) + LocalCache.consume(signedEvent) + } + } + + // Observers line up here. + val live: AccountLiveData = AccountLiveData(this) + + private fun refreshObservers() { + live.refresh() + } +} + +class AccountLiveData(private val account: Account): LiveData(AccountState(account)) { + fun refresh() { + postValue(AccountState(account)) + } + + override fun onActive() { + super.onActive() + } + + override fun onInactive() { + super.onInactive() + } +} + +class AccountState(val account: Account) \ No newline at end of file diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/Hex.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/Hex.kt new file mode 100644 index 00000000..49eed2d8 --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/Hex.kt @@ -0,0 +1,36 @@ +package com.vitorpamplona.amethyst.model + +import com.vitorpamplona.amethyst.ui.note.toDisplayHex +import fr.acinq.secp256k1.Hex +import java.util.regex.Pattern +import nostr.postr.Persona +import nostr.postr.bechToBytes +import nostr.postr.toHex + +/** Makes the distinction between String and Hex **/ +typealias HexKey = String + +fun ByteArray.toHexKey(): HexKey { + return toHex() +} + +fun HexKey.toByteArray(): ByteArray { + return Hex.decode(this) +} + +fun HexKey.toDisplayHexKey(): String { + return this.toDisplayHex() +} + +fun decodePublicKey(key: String): ByteArray { + val pattern = Pattern.compile(".+@.+\\.[a-z]+") + + return if (key.startsWith("nsec")) { + Persona(privKey = key.bechToBytes()).pubKey + } else if (key.startsWith("npub")) { + key.bechToBytes() + } else { //if (pattern.matcher(key).matches()) { + //} else { + Hex.decode(key) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt new file mode 100644 index 00000000..6b079d31 --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt @@ -0,0 +1,224 @@ +package com.vitorpamplona.amethyst.model + +import android.util.Log +import androidx.lifecycle.LiveData +import com.fasterxml.jackson.databind.DeserializationFeature +import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper +import com.vitorpamplona.amethyst.service.model.ReactionEvent +import com.vitorpamplona.amethyst.service.model.RepostEvent +import java.io.ByteArrayInputStream +import java.time.Instant +import java.time.ZoneId +import java.time.format.DateTimeFormatter +import java.util.Collections +import java.util.concurrent.ConcurrentHashMap +import nostr.postr.events.ContactListEvent +import nostr.postr.events.DeletionEvent +import nostr.postr.events.MetadataEvent +import nostr.postr.events.PrivateDmEvent +import nostr.postr.events.RecommendRelayEvent +import nostr.postr.events.TextNoteEvent +import nostr.postr.toHex + + +object LocalCache { + val metadataParser = jacksonObjectMapper() + .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) + .readerFor(UserMetadata::class.java) + + val users = ConcurrentHashMap() + val notes = ConcurrentHashMap() + + @Synchronized + fun getOrCreateUser(pubkey: ByteArray): User { + val key = pubkey.toHexKey() + return users[key] ?: run { + val answer = User(pubkey) + users.put(key, answer) + answer + } + } + + @Synchronized + fun getOrCreateNote(idHex: String): Note { + return notes[idHex] ?: run { + val answer = Note(idHex) + notes.put(idHex, answer) + answer + } + } + + fun consume(event: MetadataEvent) { + //Log.d("MT", "New User ${users.size} ${event.contactMetaData.name}") + + // new event + val oldUser = getOrCreateUser(event.pubKey) + if (event.createdAt > oldUser.updatedMetadataAt) { + val newUser = try { + metadataParser.readValue(ByteArrayInputStream(event.content.toByteArray(Charsets.UTF_8)), UserMetadata::class.java) + } catch (e: Exception) { + e.printStackTrace() + Log.w("MT", "Content Parse Error ${e.localizedMessage} ${event.content}") + return + } + + oldUser.updateUserInfo(newUser, event.createdAt) + } else { + //Log.d("MT","Relay sent a previous Metadata Event ${oldUser.toBestDisplayName()} ${formattedDateTime(event.createdAt)} > ${formattedDateTime(oldUser.updatedAt)}") + } + } + + fun formattedDateTime(timestamp: Long): String { + return Instant.ofEpochSecond(timestamp).atZone(ZoneId.systemDefault()) + .format(DateTimeFormatter.ofPattern("uuuu MMM d hh:mm a")) + } + + fun consume(event: TextNoteEvent) { + val note = getOrCreateNote(event.id.toHex()) + + // Already processed this event. + if (note.event != null) return + + val author = getOrCreateUser(event.pubKey) + val mentions = Collections.synchronizedList(event.mentions.map { getOrCreateUser(decodePublicKey(it)) }) + val replyTo = Collections.synchronizedList(event.replyTos.map { getOrCreateNote(it) }.toMutableList()) + + note.loadEvent(event, author, mentions, replyTo) + + //Log.d("TN", "New Note (${notes.size},${users.size}) ${note.author?.toBestDisplayName()} ${note.event?.content} ${formattedDateTime(event.createdAt)}") + + // Prepares user's profile view. + author.notes.add(note) + + // Adds notifications to users. + mentions.forEach { + it.taggedPosts.add(note) + } + replyTo.forEach { + it.author?.taggedPosts?.add(note) + } + + // Counts the replies + replyTo.forEach { + it.addReply(note) + } + + refreshObservers() + } + + fun consume(event: RecommendRelayEvent) { + //Log.d("RR", event.toJson()) + } + + fun consume(event: ContactListEvent) { + val user = getOrCreateUser(event.pubKey) + //Log.d("CL", "${user.toBestDisplayName()} ${event.follows}") + + if (event.createdAt > user.updatedFollowsAt) { + user.updateFollows( + event.follows.map { + try { + val pubKey = decodePublicKey(it.pubKeyHex) + getOrCreateUser(pubKey) + } catch (e: Exception) { + println("Could not parse Hex key: ${it.pubKeyHex}") + println(event.toJson()) + e.printStackTrace() + null + } + }.filterNotNull(), + event.createdAt + ) + } + + refreshObservers() + } + + fun consume(event: PrivateDmEvent) { + //Log.d("PM", event.toJson()) + } + + fun consume(event: DeletionEvent) { + //Log.d("DEL", event.toJson()) + } + + fun consume(event: RepostEvent) { + val note = getOrCreateNote(event.id.toHex()) + + // Already processed this event. + if (note.event != null) return + + //Log.d("TN", "New Boost (${notes.size},${users.size}) ${note.author.toBestDisplayName()} ${formattedDateTime(event.createdAt)}") + + val author = getOrCreateUser(event.pubKey) + val mentions = event.originalAuthor.map { getOrCreateUser(decodePublicKey(it)) }.toList() + val repliesTo = event.boostedPost.map { getOrCreateNote(it) }.toMutableList() + + note.loadEvent(event, author, mentions, repliesTo) + + // Prepares user's profile view. + author.notes.add(note) + + // Adds notifications to users. + mentions.forEach { + it.taggedPosts.add(note) + } + repliesTo.forEach { + it.author?.taggedPosts?.add(note) + } + + // Counts the replies + repliesTo.forEach { + it.addBoost(note) + } + + refreshObservers() + } + + fun consume(event: ReactionEvent) { + val note = getOrCreateNote(event.id.toHex()) + + // Already processed this event. + if (note.event != null) return + + val author = getOrCreateUser(event.pubKey) + val mentions = event.originalAuthor.map { getOrCreateUser(decodePublicKey(it)) } + val repliesTo = event.originalPost.map { getOrCreateNote(it) }.toMutableList() + + note.loadEvent(event, author, mentions, repliesTo) + + //Log.d("RE", "New Reaction ${event.content} (${notes.size},${users.size}) ${note.author?.toBestDisplayName()} ${formattedDateTime(event.createdAt)}") + + // Adds notifications to users. + mentions.forEach { + it.taggedPosts.add(note) + } + repliesTo.forEach { + it.author?.taggedPosts?.add(note) + } + + if (event.content == "" || event.content == "+" || event.content == "\uD83E\uDD19") { + // Counts the replies + repliesTo.forEach { + it.addReaction(note) + } + } + } + + // Observers line up here. + val live: LocalCacheLiveData = LocalCacheLiveData(this) + + private fun refreshObservers() { + live.refresh() + } +} + +class LocalCacheLiveData(val cache: LocalCache): LiveData(LocalCacheState(cache)) { + fun refresh() { + postValue(LocalCacheState(cache)) + } +} + +class LocalCacheState(val cache: LocalCache) { + +} \ No newline at end of file diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/Note.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/Note.kt new file mode 100644 index 00000000..0ac85eef --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/Note.kt @@ -0,0 +1,79 @@ +package com.vitorpamplona.amethyst.model + +import androidx.lifecycle.LiveData +import com.vitorpamplona.amethyst.service.NostrSingleEventDataSource +import com.vitorpamplona.amethyst.ui.note.toDisplayHex +import fr.acinq.secp256k1.Hex +import java.util.Collections +import nostr.postr.events.Event + +class Note(val idHex: String) { + val id = Hex.decode(idHex) + val idDisplayHex = id.toDisplayHex() + + var event: Event? = null + var author: User? = null + var mentions: List? = null + var replyTo: MutableList? = null + + val replies = Collections.synchronizedSet(mutableSetOf()) + val reactions = Collections.synchronizedSet(mutableSetOf()) + val boosts = Collections.synchronizedSet(mutableSetOf()) + + fun loadEvent(event: Event, author: User, mentions: List, replyTo: MutableList) { + this.event = event + this.author = author + this.mentions = mentions + this.replyTo = replyTo + + refreshObservers() + } + + fun addReply(note: Note) { + if (replies.add(note)) + refreshObservers() + } + + fun addBoost(note: Note) { + if (boosts.add(note)) + refreshObservers() + } + + fun addReaction(note: Note) { + if (reactions.add(note)) + refreshObservers() + } + + fun isReactedBy(user: User): Boolean { + return reactions.any { it.author == user } + } + + fun isBoostedBy(user: User): Boolean { + return boosts.any { it.author == user } + } + + // Observers line up here. + val live: NoteLiveData = NoteLiveData(this) + + private fun refreshObservers() { + live.refresh() + } +} + +class NoteLiveData(val note: Note): LiveData(NoteState(note)) { + fun refresh() { + postValue(NoteState(note)) + } + + override fun onActive() { + super.onActive() + NostrSingleEventDataSource.add(note.idHex) + } + + override fun onInactive() { + super.onInactive() + NostrSingleEventDataSource.remove(note.idHex) + } +} + +class NoteState(val note: Note) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/User.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/User.kt new file mode 100644 index 00000000..d5bd240c --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/User.kt @@ -0,0 +1,98 @@ +package com.vitorpamplona.amethyst.model + +import androidx.lifecycle.LiveData +import com.vitorpamplona.amethyst.service.NostrSingleUserDataSource +import com.vitorpamplona.amethyst.ui.note.toDisplayHex +import java.util.Collections + +class User(val pubkey: ByteArray) { + val pubkeyHex = pubkey.toHexKey() + val pubkeyDisplayHex = pubkey.toDisplayHex() + + var info = UserMetadata() + + var updatedMetadataAt: Long = 0; + var updatedFollowsAt: Long = 0; + + val notes = Collections.synchronizedSet(mutableSetOf()) + val follows = Collections.synchronizedSet(mutableSetOf()) + val taggedPosts = Collections.synchronizedSet(mutableSetOf()) + + var follower: Number? = null + + fun toBestDisplayName(): String { + return bestDisplayName() ?: bestUsername() ?: pubkeyDisplayHex + } + + fun bestUsername(): String? { + return info.name?.ifBlank { null } ?: info.username?.ifBlank { null } + } + + fun bestDisplayName(): String? { + return info.displayName?.ifBlank { null } ?: info.display_name?.ifBlank { null } + } + + fun profilePicture(): String { + if (info.picture.isNullOrBlank()) info.picture = null + return info.picture ?: "https://robohash.org/${pubkeyHex}.png" + } + + fun updateFollows(newFollows: List, updateAt: Long) { + follows.clear() + follows.addAll(newFollows) + updatedFollowsAt = updateAt + + live.refresh() + } + + fun updateUserInfo(newUserInfo: UserMetadata, updateAt: Long) { + info = newUserInfo + updatedMetadataAt = updateAt + + live.refresh() + } + + // Observers line up here. + val live: UserLiveData = UserLiveData(this) + + private fun refreshObservers() { + live.refresh() + } +} + +class UserMetadata { + var name: String? = null + var username: String? = null + var display_name: String? = null + var displayName: String? = null + var picture: String? = null + var website: String? = null + var about: String? = null + var nip05: String? = null + var domain: String? = null + var lud06: String? = null + var lud16: String? = null + + var publish: String? = null + var iris: String? = null + var main_relay: String? = null + var twitter: String? = null +} + +class UserLiveData(val user: User): LiveData(UserState(user)) { + fun refresh() { + postValue(UserState(user)) + } + + override fun onActive() { + super.onActive() + NostrSingleUserDataSource.add(user.pubkeyHex) + } + + override fun onInactive() { + super.onInactive() + NostrSingleUserDataSource.remove(user.pubkeyHex) + } +} + +class UserState(val user: User) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/Channel.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/Channel.kt new file mode 100644 index 00000000..f2bdeada --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/Channel.kt @@ -0,0 +1,10 @@ +package com.vitorpamplona.amethyst.service + +import java.util.UUID +import nostr.postr.JsonFilter + +data class Channel ( + val id: String = UUID.randomUUID().toString().substring(0,4) +) { + var filter: JsonFilter? = null // Inactive when null +} \ No newline at end of file diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/Constants.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/Constants.kt new file mode 100644 index 00000000..a4ef69d7 --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/Constants.kt @@ -0,0 +1,24 @@ +package com.vitorpamplona.amethyst.service + +import com.vitorpamplona.amethyst.service.relays.Relay + +object Constants { + val defaultRelays = arrayOf( + Relay("wss://nostr.bitcoiner.social", read = true, write = true), + Relay("wss://relay.nostr.bg", read = true, write = true), + //Relay("wss://brb.io", read = true, write = true), + Relay("wss://nostr.v0l.io", read = true, write = true), + Relay("wss://nostr.rocks", read = true, write = true), + Relay("wss://relay.damus.io", read = true, write = true), + Relay("wss://nostr.fmt.wiz.biz", read = true, write = true), + Relay("wss://nostr.oxtr.dev", read = true, write = true), + Relay("wss://nostr-relay.wlvs.space", read = true, write = true), + //Relay("wss://nostr-2.zebedee.cloud", read = true, write = true), + Relay("wss://nostr-pub.wellorder.net", read = true, write = true), + Relay("wss://nostr.mom", read = true, write = true), + Relay("wss://nostr.orangepill.dev", read = true, write = true), + //Relay("wss://nostr-pub.semisol.dev", read = true, write = true), + Relay("wss://nostr.onsats.org", read = true, write = true), + Relay("wss://nostr.sandwich.farm", read = true, write = true) + ) +} \ No newline at end of file diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/NostrAccountDataSource.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrAccountDataSource.kt new file mode 100644 index 00000000..b07b8d31 --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrAccountDataSource.kt @@ -0,0 +1,74 @@ +package com.vitorpamplona.amethyst.service + +import com.vitorpamplona.amethyst.model.Account +import com.vitorpamplona.amethyst.model.LocalCache +import com.vitorpamplona.amethyst.model.Note +import com.vitorpamplona.amethyst.model.UserState +import com.vitorpamplona.amethyst.service.model.RepostEvent +import nostr.postr.JsonFilter +import nostr.postr.events.TextNoteEvent +import nostr.postr.toHex + +object NostrAccountDataSource: NostrDataSource("AccountData") { + lateinit var account: Account + + private val cacheListener: (UserState) -> Unit = { + resetFilters() + } + + override fun start() { + if (this::account.isInitialized) + account.userProfile().live.observeForever(cacheListener) + super.start() + } + + override fun stop() { + super.stop() + if (this::account.isInitialized) + account.userProfile().live.removeObserver(cacheListener) + } + + fun createAccountFilter(): JsonFilter { + return JsonFilter( + authors = listOf(account.userProfile().pubkeyHex), + since = System.currentTimeMillis() / 1000 - (60 * 60 * 24 * 4), // 4 days + ) + } + + val accountChannel = requestNewChannel() + + fun equalsIgnoreOrder(list1:List?, list2:List?): Boolean { + if (list1 == null && list2 == null) return true + if (list1 == null) return false + if (list2 == null) return false + + return list1.size == list2.size && list1.toSet() == list2.toSet() + } + + fun equalAuthors(list1:JsonFilter?, list2:JsonFilter?): Boolean { + if (list1 == null && list2 == null) return true + if (list1 == null) return false + if (list2 == null) return false + + return equalsIgnoreOrder(list1.authors, list2.authors) + } + + override fun feed(): List { + val user = account.userProfile() + val follows = user.follows.map { it.pubkeyHex }.plus(user.pubkeyHex).toSet() + + return LocalCache.notes.values + .filter { (it.event is TextNoteEvent || it.event is RepostEvent) && it.author?.pubkeyHex in follows } + .sortedBy { it.event!!.createdAt } + .reversed() + } + + override fun updateChannelFilters() { + // gets everthing about the user logged in + val newAccountFilter = createAccountFilter() + + if (!equalAuthors(newAccountFilter, accountChannel.filter)) { + accountChannel.filter = newAccountFilter + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/NostrDataSource.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrDataSource.kt new file mode 100644 index 00000000..090e29dc --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrDataSource.kt @@ -0,0 +1,135 @@ +package com.vitorpamplona.amethyst.service + +import com.vitorpamplona.amethyst.model.LocalCache +import com.vitorpamplona.amethyst.model.Note +import com.vitorpamplona.amethyst.service.model.ReactionEvent +import com.vitorpamplona.amethyst.service.model.RepostEvent +import com.vitorpamplona.amethyst.service.relays.Client +import com.vitorpamplona.amethyst.service.relays.Relay +import java.util.Collections +import nostr.postr.events.ContactListEvent +import nostr.postr.events.DeletionEvent +import nostr.postr.events.Event +import nostr.postr.events.MetadataEvent +import nostr.postr.events.PrivateDmEvent +import nostr.postr.events.RecommendRelayEvent +import nostr.postr.events.TextNoteEvent + +abstract class NostrDataSource(val debugName: String) { + private val channels = Collections.synchronizedSet(mutableSetOf()) + private val channelIds = Collections.synchronizedSet(mutableSetOf()) + + private val clientListener = object : Client.Listener() { + override fun onEvent(event: Event, subscriptionId: String, relay: Relay) { + if (subscriptionId in channelIds) { + when (event) { + is MetadataEvent -> LocalCache.consume(event) + is TextNoteEvent -> LocalCache.consume(event) + is RecommendRelayEvent -> LocalCache.consume(event) + is ContactListEvent -> LocalCache.consume(event) + is PrivateDmEvent -> LocalCache.consume(event) + is DeletionEvent -> LocalCache.consume(event) + is RepostEvent -> LocalCache.consume(event) + is ReactionEvent -> LocalCache.consume(event) + else -> when (event.kind) { + RepostEvent.kind -> LocalCache.consume(RepostEvent(event.id, event.pubKey, event.createdAt, event.tags, event.content, event.sig)) + ReactionEvent.kind -> LocalCache.consume(ReactionEvent(event.id, event.pubKey, event.createdAt, event.tags, event.content, event.sig)) + } + } + } + } + + override fun onError(error: Error, subscriptionId: String, relay: Relay) { + //Log.e("ERROR", "Relay ${relay.url}: ${error.message}") + } + + override fun onRelayStateChange(type: Relay.Type, relay: Relay) { + //Log.d("RELAY", "Relay ${relay.url} ${when (type) { + // Relay.Type.CONNECT -> "connected." + // Relay.Type.DISCONNECT -> "disconnected." + // Relay.Type.DISCONNECTING -> "disconnecting." + // Relay.Type.EOSE -> "sent all events it had stored." + //}}") + + /* + if (type == Relay.Type.EOSE) { + // One everything is loaded, if new users are found, update filters + resetFilters() + }*/ + } + } + + init { + Client.subscribe(clientListener) + } + + open fun start() { + resetFilters() + } + + open fun stop() { + channels.forEach { channel -> + if (channel.filter != null) // if it is active, close + Client.close(channel.id) + } + } + + fun loadTop(): List { + return feed().take(100) + } + + fun requestNewChannel(): Channel { + val newChannel = Channel() + channels.add(newChannel) + channelIds.add(newChannel.id) + return newChannel + } + + fun dismissChannel(channel: Channel) { + Client.close(channel.id) + channels.remove(channel) + channelIds.remove(channel.id) + } + + fun resetFilters() { + // saves the channels that are currently active + val activeChannels = channels.filter { it.filter != null } + // saves the current content to only update if it changes + val currentFilter = activeChannels.associate { it.id to it.filter!!.toJson() } + + updateChannelFilters() + + // Makes sure to only send an updated filter when it actually changes. + channels.forEach { channel -> + val channelsNewFilter = channel.filter + + if (channel in activeChannels) { + if (channelsNewFilter == null) { + // was active and is not active anymore, just close. + Client.close(channel.id) + } else { + // was active and is still active, check if it has changed. + if (channelsNewFilter.toJson() != currentFilter[channel.id]) { + Client.close(channel.id) + Client.sendFilter(channel.id, mutableListOf(channelsNewFilter)) + } else { + // hasn't changed, does nothing. + Client.sendFilterOnlyIfDisconnected(channel.id, mutableListOf(channelsNewFilter)) + } + } + } else { + if (channelsNewFilter == null) { + // was not active and is still not active, does nothing + } else { + // was not active and becomes active, sends the filter. + if (channelsNewFilter.toJson() != currentFilter[channel.id]) { + Client.sendFilter(channel.id, mutableListOf(channelsNewFilter)) + } + } + } + } + } + + abstract fun updateChannelFilters() + abstract fun feed(): List +} \ No newline at end of file diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/NostrGlobalDataSource.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrGlobalDataSource.kt new file mode 100644 index 00000000..d9aa365e --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrGlobalDataSource.kt @@ -0,0 +1,47 @@ +package com.vitorpamplona.amethyst.service + +import com.vitorpamplona.amethyst.model.LocalCache +import nostr.postr.JsonFilter +import nostr.postr.events.TextNoteEvent + +object NostrGlobalDataSource: NostrDataSource("GlobalFeed") { + val fifteenMinutes = (60*15) // 15 mins + + fun createGlobalFilter() = JsonFilter( + kinds = listOf(TextNoteEvent.kind), + since = System.currentTimeMillis() / 1000 - fifteenMinutes + ) + + val globalFeedChannel = requestNewChannel() + + fun equalTime(list1:Long?, list2:Long?): Boolean { + if (list1 == null && list2 == null) return true + if (list1 == null) return false + if (list2 == null) return false + + return Math.abs(list1 - list2) < (4*fifteenMinutes) + } + + fun equalFilters(list1:JsonFilter?, list2:JsonFilter?): Boolean { + if (list1 == null && list2 == null) return true + if (list1 == null) return false + if (list2 == null) return false + + return equalTime(list1.since, list2.since) + } + + override fun feed() = LocalCache.notes.values + .filter { + it.event is TextNoteEvent && (it.event as TextNoteEvent).replyTos.isEmpty() + } + .sortedBy { it.event!!.createdAt } + .reversed() + + override fun updateChannelFilters() { + val newFilter = createGlobalFilter() + + if (!equalFilters(newFilter, globalFeedChannel.filter)) { + globalFeedChannel.filter = newFilter + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/NostrHomeDataSource.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrHomeDataSource.kt new file mode 100644 index 00000000..7e9e241c --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrHomeDataSource.kt @@ -0,0 +1,80 @@ +package com.vitorpamplona.amethyst.service + +import com.vitorpamplona.amethyst.model.Account +import com.vitorpamplona.amethyst.model.LocalCache +import com.vitorpamplona.amethyst.model.Note +import com.vitorpamplona.amethyst.model.UserState +import com.vitorpamplona.amethyst.service.model.RepostEvent +import nostr.postr.JsonFilter +import nostr.postr.events.TextNoteEvent +import nostr.postr.toHex + +object NostrHomeDataSource: NostrDataSource("HomeFeed") { + lateinit var account: Account + + private val cacheListener: (UserState) -> Unit = { + resetFilters() + } + + override fun start() { + if (this::account.isInitialized) + account.userProfile().live.observeForever(cacheListener) + super.start() + } + + override fun stop() { + super.stop() + if (this::account.isInitialized) + account.userProfile().live.removeObserver(cacheListener) + } + + fun createFollowAccountsFilter(): JsonFilter? { + val follows = account.userProfile().follows?.map { + it.pubkey.toHex().substring(0, 6) + } + + if (follows == null || follows.isEmpty()) return null + + return JsonFilter( + kinds = listOf(TextNoteEvent.kind, RepostEvent.kind), + authors = follows, + since = System.currentTimeMillis() / 1000 - (60 * 60 * 24 * 1), // 24 hours + ) + } + + val followAccountChannel = requestNewChannel() + + fun equalsIgnoreOrder(list1:List?, list2:List?): Boolean { + if (list1 == null && list2 == null) return true + if (list1 == null) return false + if (list2 == null) return false + + return list1.size == list2.size && list1.toSet() == list2.toSet() + } + + fun equalAuthors(list1:JsonFilter?, list2:JsonFilter?): Boolean { + if (list1 == null && list2 == null) return true + if (list1 == null) return false + if (list2 == null) return false + + return equalsIgnoreOrder(list1.authors, list2.authors) + } + + override fun feed(): List { + val user = account.userProfile() + val follows = user.follows.map { it.pubkeyHex }.plus(user.pubkeyHex).toSet() + + return LocalCache.notes.values + .filter { (it.event is TextNoteEvent || it.event is RepostEvent) && it.author?.pubkeyHex in follows } + .sortedBy { it.event!!.createdAt } + .reversed() + } + + override fun updateChannelFilters() { + val newFollowAccountsFilter = createFollowAccountsFilter() + + if (!equalAuthors(newFollowAccountsFilter, followAccountChannel.filter)) { + followAccountChannel.filter = newFollowAccountsFilter + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/NostrNotificationDataSource.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrNotificationDataSource.kt new file mode 100644 index 00000000..b8066eca --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrNotificationDataSource.kt @@ -0,0 +1,48 @@ +package com.vitorpamplona.amethyst.service + +import com.vitorpamplona.amethyst.model.Account +import com.vitorpamplona.amethyst.model.Note +import nostr.postr.JsonFilter + +object NostrNotificationDataSource: NostrDataSource("GlobalFeed") { + lateinit var account: Account + + fun createGlobalFilter() = JsonFilter( + since = System.currentTimeMillis() / 1000 - (60 * 60 * 24 * 7), // 2 days + tags = mapOf("p" to listOf(account.userProfile().pubkeyHex).filterNotNull()) + ) + + val notificationChannel = requestNewChannel() + + fun equalsIgnoreOrder(list1:List?, list2:List?): Boolean { + if (list1 == null && list2 == null) return true + if (list1 == null) return false + if (list2 == null) return false + + return list1.size == list2.size && list1.toSet() == list2.toSet() + } + + fun equalFilters(list1:JsonFilter?, list2:JsonFilter?): Boolean { + if (list1 == null && list2 == null) return true + if (list1 == null) return false + if (list2 == null) return false + + return equalsIgnoreOrder(list1.tags?.get("p"), list2.tags?.get("p")) + && equalsIgnoreOrder(list1.tags?.get("e"), list2.tags?.get("e")) + } + + override fun feed(): List { + return account.userProfile().taggedPosts + .filter { it.event != null } + .sortedBy { it.event!!.createdAt } + .reversed() + } + + override fun updateChannelFilters() { + val newFilter = createGlobalFilter() + + if (!equalFilters(newFilter, notificationChannel.filter)) { + notificationChannel.filter = newFilter + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/NostrSingleEventDataSource.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrSingleEventDataSource.kt new file mode 100644 index 00000000..5faeeef5 --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrSingleEventDataSource.kt @@ -0,0 +1,62 @@ +package com.vitorpamplona.amethyst.service + +import com.vitorpamplona.amethyst.model.LocalCache +import com.vitorpamplona.amethyst.model.Note +import java.util.Collections +import nostr.postr.JsonFilter + +object NostrSingleEventDataSource: NostrDataSource("SingleEventFeed") { + val eventsToWatch = Collections.synchronizedList(mutableListOf()) + + fun createRepliesAndReactionsFilter(): JsonFilter? { + val reactionsToWatch = eventsToWatch.map { it.substring(0, 8) } + + if (reactionsToWatch.isEmpty()) { + return null + } + + return JsonFilter( + tags = mapOf("e" to reactionsToWatch) + ) + } + + fun createLoadEventsIfNotLoadedFilter(): JsonFilter? { + val eventsToLoad = eventsToWatch + .map { LocalCache.notes[it] } + .filterNotNull() + .filter { it.event == null } + .map { it.idHex.substring(0, 8) } + + if (eventsToLoad.isEmpty()) { + return null + } + + return JsonFilter( + ids = eventsToLoad + ) + } + + val repliesAndReactionsChannel = requestNewChannel() + val loadEventsChannel = requestNewChannel() + + override fun feed(): List { + return eventsToWatch.map { + LocalCache.notes[it] + }.filterNotNull() + } + + override fun updateChannelFilters() { + repliesAndReactionsChannel.filter = createRepliesAndReactionsFilter() + loadEventsChannel.filter = createLoadEventsIfNotLoadedFilter() + } + + fun add(eventId: String) { + eventsToWatch.add(eventId) + resetFilters() + } + + fun remove(eventId: String) { + eventsToWatch.remove(eventId) + resetFilters() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/NostrSingleUserDataSource.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrSingleUserDataSource.kt new file mode 100644 index 00000000..8cef8403 --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrSingleUserDataSource.kt @@ -0,0 +1,42 @@ +package com.vitorpamplona.amethyst.service + +import com.vitorpamplona.amethyst.model.LocalCache +import com.vitorpamplona.amethyst.model.Note +import java.util.Collections +import nostr.postr.JsonFilter +import nostr.postr.events.MetadataEvent + +object NostrSingleUserDataSource: NostrDataSource("SingleUserFeed") { + val usersToWatch = Collections.synchronizedList(mutableListOf()) + + fun createUserFilter(): JsonFilter? { + if (usersToWatch.isEmpty()) return null + + return JsonFilter( + kinds = listOf(MetadataEvent.kind), + authors = usersToWatch.map { it.substring(0, 8) } + ) + } + + val userChannel = requestNewChannel() + + override fun feed(): List { + return usersToWatch.map { + LocalCache.notes[it] + }.filterNotNull() + } + + override fun updateChannelFilters() { + userChannel.filter = createUserFilter() + } + + fun add(userId: String) { + usersToWatch.add(userId) + resetFilters() + } + + fun remove(userId: String) { + usersToWatch.remove(userId) + resetFilters() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/ReactionEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/ReactionEvent.kt new file mode 100644 index 00000000..85b26bfa --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/ReactionEvent.kt @@ -0,0 +1,37 @@ +package com.vitorpamplona.amethyst.service.model + +import java.util.Date +import nostr.postr.Utils +import nostr.postr.events.Event +import nostr.postr.toHex + +class ReactionEvent ( + id: ByteArray, + pubKey: ByteArray, + createdAt: Long, + tags: List>, + content: String, + sig: ByteArray +): Event(id, pubKey, createdAt, kind, tags, content, sig) { + + @Transient val originalPost: List + @Transient val originalAuthor: List + + init { + originalPost = tags.filter { it.firstOrNull() == "e" }.mapNotNull { it.getOrNull(1) } + originalAuthor = tags.filter { it.firstOrNull() == "p" }.mapNotNull { it.getOrNull(1) } + } + + companion object { + const val kind = 7 + + fun create(originalNote: Event, privateKey: ByteArray, createdAt: Long = Date().time / 1000): ReactionEvent { + val content = "+" + val pubKey = Utils.pubkeyCreate(privateKey) + val tags = listOf( listOf("e", originalNote.id.toHex()), listOf("p", originalNote.pubKey.toHex())) + val id = generateId(pubKey, createdAt, kind, tags, content) + val sig = Utils.sign(id, privateKey) + return ReactionEvent(id, pubKey, createdAt, tags, content, sig) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/RepostEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/RepostEvent.kt new file mode 100644 index 00000000..caf31c34 --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/RepostEvent.kt @@ -0,0 +1,41 @@ +package com.vitorpamplona.amethyst.service.model + +import java.util.Date +import nostr.postr.Utils +import nostr.postr.events.Event +import nostr.postr.toHex + +class RepostEvent ( + id: ByteArray, + pubKey: ByteArray, + createdAt: Long, + tags: List>, + content: String, + sig: ByteArray +): Event(id, pubKey, createdAt, kind, tags, content, sig) { + + @Transient val boostedPost: List + @Transient val originalAuthor: List + + init { + boostedPost = tags.filter { it.firstOrNull() == "e" }.mapNotNull { it.getOrNull(1) } + originalAuthor = tags.filter { it.firstOrNull() == "p" }.mapNotNull { it.getOrNull(1) } + } + + companion object { + const val kind = 6 + + fun create(boostedPost: Event, privateKey: ByteArray, createdAt: Long = Date().time / 1000): RepostEvent { + val content = "" + + val replyToPost = listOf("e", boostedPost.id.toHex()) + val replyToAuthor = listOf("p", boostedPost.pubKey.toHex()) + + val pubKey = Utils.pubkeyCreate(privateKey) + val tags:List> = boostedPost.tags.plus(listOf(replyToPost, replyToAuthor)) + val id = generateId(pubKey, createdAt, kind, tags, content) + val sig = Utils.sign(id, privateKey) + return RepostEvent(id, pubKey, createdAt, tags, content, sig) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Client.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Client.kt new file mode 100644 index 00000000..5396db17 --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Client.kt @@ -0,0 +1,113 @@ +package com.vitorpamplona.amethyst.service.relays + +import com.vitorpamplona.amethyst.service.Constants +import java.util.Collections +import java.util.UUID +import java.util.concurrent.ConcurrentHashMap +import nostr.postr.JsonFilter +import nostr.postr.events.Event + +/** + * The Nostr Client manages multiple personae the user may switch between. Events are received and + * published through multiple relays. + * Events are stored with their respective persona. + */ +object Client: RelayPool.Listener { + /** + * Lenient mode: + * + * true: For maximum compatibility. If you want to play ball with sloppy counterparts, use + * this. + * false: For developers who want to make protocol compliant counterparts. If your software + * produces events that fail to deserialize in strict mode, you should probably fix + * something. + **/ + var lenient: Boolean = false + private val listeners = Collections.synchronizedSet(HashSet()) + internal var relays = Constants.defaultRelays + internal val subscriptions = ConcurrentHashMap>() + + fun connect( + relays: Array = Constants.defaultRelays + ) { + RelayPool.register(this) + RelayPool.loadRelays(relays.toList()) + this.relays = relays + } + + fun requestAndWatch( + subscriptionId: String = UUID.randomUUID().toString().substring(0..10), + filters: MutableList = mutableListOf(JsonFilter()) + ) { + subscriptions[subscriptionId] = filters + RelayPool.requestAndWatch() + } + + fun sendFilter( + subscriptionId: String = UUID.randomUUID().toString().substring(0..10), + filters: MutableList = mutableListOf(JsonFilter()) + ) { + subscriptions[subscriptionId] = filters + RelayPool.sendFilter(subscriptionId) + } + + fun sendFilterOnlyIfDisconnected( + subscriptionId: String = UUID.randomUUID().toString().substring(0..10), + filters: MutableList = mutableListOf(JsonFilter()) + ) { + subscriptions[subscriptionId] = filters + RelayPool.sendFilterOnlyIfDisconnected(subscriptionId) + } + + fun send(signedEvent: Event) { + RelayPool.send(signedEvent) + } + + fun close(subscriptionId: String){ + RelayPool.close(subscriptionId) + } + + fun disconnect() { + RelayPool.unregister(this) + RelayPool.disconnect() + RelayPool.unloadRelays() + } + + override fun onEvent(event: Event, subscriptionId: String, relay: Relay) { + listeners.forEach { it.onEvent(event, subscriptionId, relay) } + } + + override fun onError(error: Error, subscriptionId: String, relay: Relay) { + listeners.forEach { it.onError(error, subscriptionId, relay) } + } + + override fun onRelayStateChange(type: Relay.Type, relay: Relay) { + listeners.forEach { it.onRelayStateChange(type, relay) } + } + + fun subscribe(listener: Listener) { + listeners.add(listener) + } + + fun unsubscribe(listener: Listener): Boolean { + return listeners.remove(listener) + } + + + abstract class Listener { + /** + * A new message was received + */ + open fun onEvent(event: Event, subscriptionId: String, relay: Relay) = Unit + + /** + * A new or repeat message was received + */ + open fun onError(error: Error, subscriptionId: String, relay: Relay) = Unit + + /** + * Connected to or disconnected from a relay + */ + open fun onRelayStateChange(type: Relay.Type, relay: Relay) = Unit + } +} \ No newline at end of file diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Relay.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Relay.kt new file mode 100644 index 00000000..b5770cbe --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Relay.kt @@ -0,0 +1,165 @@ +package com.vitorpamplona.amethyst.service.relays + +import com.google.gson.JsonElement +import java.util.Collections +import nostr.postr.JsonFilter +import nostr.postr.events.Event +import okhttp3.OkHttpClient +import okhttp3.Request +import okhttp3.Response +import okhttp3.WebSocket +import okhttp3.WebSocketListener + +class Relay( + val url: String, + var read: Boolean = true, + var write: Boolean = true +) { + private val httpClient = OkHttpClient() + private val listeners = Collections.synchronizedSet(HashSet()) + private var socket: WebSocket? = null + + fun register(listener: Listener) { + listeners.add(listener) + } + + fun isConnected(): Boolean { + return socket != null + } + + fun unregister(listener: Listener) = listeners.remove(listener) + + fun requestAndWatch(reconnectTs: Long? = null) { + val request = Request.Builder().url(url).build() + val listener = object : WebSocketListener() { + + override fun onOpen(webSocket: WebSocket, response: Response) { + // Sends everything. + Client.subscriptions.forEach { + sendFilter(requestId = it.key, reconnectTs = reconnectTs) + } + listeners.forEach { it.onRelayStateChange(this@Relay, Type.CONNECT) } + } + + override fun onMessage(webSocket: WebSocket, text: String) { + try { + val msg = Event.gson.fromJson(text, JsonElement::class.java).asJsonArray + val type = msg[0].asString + val channel = msg[1].asString + when (type) { + "EVENT" -> { + val event = Event.fromJson(msg[2], Client.lenient) + listeners.forEach { it.onEvent(this@Relay, channel, event) } + } + "EOSE" -> listeners.forEach { + it.onRelayStateChange(this@Relay, Type.EOSE) + } + "NOTICE" -> listeners.forEach { + // "channel" being the second string in the string array ... + it.onError(this@Relay, channel, Error("Relay sent notice: $channel")) + } + "OK" -> listeners.forEach { + // "channel" being the second string in the string array ... + // Event was saved correctly? + } + else -> listeners.forEach { + it.onError( + this@Relay, + channel, + Error("Unknown type $type on channel $channel. Msg was $text") + ) + } + } + } catch (t: Throwable) { + t.printStackTrace() + text.chunked(2000) { chunked -> + listeners.forEach { it.onError(this@Relay, "", Error("Problem with $chunked")) } + } + } + } + + override fun onClosing(webSocket: WebSocket, code: Int, reason: String) { + listeners.forEach { it.onRelayStateChange(this@Relay, Type.DISCONNECTING) } + } + + override fun onClosed(webSocket: WebSocket, code: Int, reason: String) { + socket = null + listeners.forEach { it.onRelayStateChange(this@Relay, Type.DISCONNECT) } + } + + override fun onFailure(webSocket: WebSocket, t: Throwable, response: Response?) { + t.printStackTrace() + listeners.forEach { + it.onError(this@Relay, "", Error("WebSocket Failure. Response: ${response}. Exception: ${t.message}", t)) + } + } + } + socket = httpClient.newWebSocket(request, listener) + } + + fun disconnect() { + //httpClient.dispatcher.executorService.shutdown() + socket?.close(1000, "Normal close") + } + + fun sendFilter(requestId: String, reconnectTs: Long? = null) { + if (socket == null) { + requestAndWatch(reconnectTs) + } else { + val filters = if (reconnectTs != null) { + Client.subscriptions[requestId]?.let { + it.map { filter -> + JsonFilter(filter.ids, filter.authors, filter.kinds, filter.tags, since = reconnectTs) + } + } ?: error("No filter(s) found.") + } else { + Client.subscriptions[requestId] ?: error("No filter(s) found.") + } + val request = """["REQ","$requestId",${filters.joinToString(",") { it.toJson() }}]""" + //println("FILTERSSENT " + """["REQ","$requestId",${filters.joinToString(",") { it.toJson() }}]""") + socket!!.send(request) + } + } + + fun sendFilterOnlyIfDisconnected(requestId: String, reconnectTs: Long? = null) { + if (socket == null) { + requestAndWatch(reconnectTs) + } + } + + fun send(signedEvent: Event) { + if (write) + socket?.send("""["EVENT",${signedEvent.toJson()}]""") + } + + fun close(subscriptionId: String){ + socket?.send("""["CLOSE","$subscriptionId"]""") + } + + enum class Type { + // Websocket connected + CONNECT, + // Websocket disconnecting + DISCONNECTING, + // Websocket disconnected + DISCONNECT, + // End Of Stored Events + EOSE + } + + interface Listener { + /** + * A new message was received + */ + fun onEvent(relay: Relay, subscriptionId: String, event: Event) + + fun onError(relay: Relay, subscriptionId: String, error: Error) + + /** + * Connected to or disconnected from a relay + * + * @param type is 0 for disconnect and 1 for connect + */ + fun onRelayStateChange(relay: Relay, type: Type) + } +} diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/relays/RelayPool.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/relays/RelayPool.kt new file mode 100644 index 00000000..7172ab76 --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/relays/RelayPool.kt @@ -0,0 +1,113 @@ +package com.vitorpamplona.amethyst.service.relays + +import androidx.lifecycle.LiveData +import com.vitorpamplona.amethyst.service.Constants +import java.util.Collections +import nostr.postr.events.Event + +/** + * RelayPool manages the connection to multiple Relays and lets consumers deal with simple events. + */ +object RelayPool: Relay.Listener { + private val relays = Collections.synchronizedList(ArrayList()) + private val listeners = Collections.synchronizedSet(HashSet()) + + fun report(): String { + val connected = relays.filter { it.isConnected() } + return "${connected.size}/${relays.size}" + } + + fun loadRelays(relayList: List? = null){ + if (!relayList.isNullOrEmpty()){ + relayList.forEach { addRelay(it) } + } else { + Constants.defaultRelays.forEach { addRelay(it) } + } + } + + fun unloadRelays() { + relays.toList().forEach { removeRelay(it) } + } + + fun requestAndWatch() { + relays.forEach { it.requestAndWatch() } + } + + fun sendFilter(subscriptionId: String) { + relays.forEach { it.sendFilter(subscriptionId) } + } + + fun sendFilterOnlyIfDisconnected(subscriptionId: String) { + relays.forEach { it.sendFilterOnlyIfDisconnected(subscriptionId) } + } + + fun send(signedEvent: Event) { + relays.forEach { it.send(signedEvent) } + } + + fun close(subscriptionId: String){ + relays.forEach { it.close(subscriptionId) } + } + + fun disconnect() { + relays.forEach { it.disconnect() } + } + + fun addRelay(relay: Relay) { + relay.register(this) + relays += relay + } + + fun removeRelay(relay: Relay): Boolean { + relay.unregister(this) + return relays.remove(relay) + } + + fun getRelays(): List = relays + + fun register(listener: Listener) { + listeners.add(listener) + } + + fun unregister(listener: Listener): Boolean { + return listeners.remove(listener) + } + + interface Listener { + fun onEvent(event: Event, subscriptionId: String, relay: Relay) + + fun onError(error: Error, subscriptionId: String, relay: Relay) + + fun onRelayStateChange(type: Relay.Type, relay: Relay) + } + + @Synchronized + override fun onEvent(relay: Relay, subscriptionId: String, event: Event) { + listeners.forEach { it.onEvent(event, subscriptionId, relay) } + } + + override fun onError(relay: Relay, subscriptionId: String, error: Error) { + listeners.forEach { it.onError(error, subscriptionId, relay) } + refreshObservers() + } + + override fun onRelayStateChange(relay: Relay, type: Relay.Type) { + listeners.forEach { it.onRelayStateChange(type, relay) } + refreshObservers() + } + + // Observers line up here. + val live: RelayPoolLiveData = RelayPoolLiveData(this) + + private fun refreshObservers() { + live.refresh() + } +} + +class RelayPoolLiveData(val relays: RelayPool): LiveData(RelayPoolState(relays)) { + fun refresh() { + postValue(RelayPoolState(relays)) + } +} + +class RelayPoolState(val relays: RelayPool) \ No newline at end of file diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/MainActivity.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/MainActivity.kt new file mode 100644 index 00000000..c873ec92 --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/MainActivity.kt @@ -0,0 +1,60 @@ +package com.vitorpamplona.amethyst.ui + +import android.os.Bundle +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.material.MaterialTheme +import androidx.compose.material.Surface +import androidx.compose.ui.Modifier +import androidx.lifecycle.viewmodel.compose.viewModel +import com.vitorpamplona.amethyst.KeyStorage +import com.vitorpamplona.amethyst.service.NostrAccountDataSource +import com.vitorpamplona.amethyst.service.NostrGlobalDataSource +import com.vitorpamplona.amethyst.service.NostrHomeDataSource +import com.vitorpamplona.amethyst.service.NostrNotificationDataSource +import com.vitorpamplona.amethyst.service.NostrSingleEventDataSource +import com.vitorpamplona.amethyst.service.NostrSingleUserDataSource +import com.vitorpamplona.amethyst.service.relays.Client +import com.vitorpamplona.amethyst.ui.screen.AccountScreen +import com.vitorpamplona.amethyst.ui.screen.AccountStateViewModel +import com.vitorpamplona.amethyst.ui.theme.AmethystTheme + +class MainActivity : ComponentActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + setContent { + AmethystTheme { + // A surface container using the 'background' color from the theme + Surface(modifier = Modifier.fillMaxSize(), color = MaterialTheme.colors.background) { + + val accountViewModel: AccountStateViewModel = viewModel { + AccountStateViewModel(KeyStorage().encryptedPreferences(applicationContext)) + } + + AccountScreen(accountViewModel) + } + } + } + + Client.lenient = true + } + + override fun onResume() { + super.onResume() + Client.connect() + } + + override fun onPause() { + NostrAccountDataSource.stop() + NostrHomeDataSource.stop() + + NostrGlobalDataSource.stop() + NostrNotificationDataSource.stop() + NostrSingleEventDataSource.stop() + NostrSingleUserDataSource.stop() + Client.disconnect() + super.onPause() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostView.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostView.kt new file mode 100644 index 00000000..42fa5f57 --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostView.kt @@ -0,0 +1,157 @@ +package com.vitorpamplona.amethyst.ui.actions + +import androidx.compose.foundation.border +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.material.Button +import androidx.compose.material.ButtonDefaults +import androidx.compose.material.MaterialTheme +import androidx.compose.material.OutlinedTextField +import androidx.compose.material.Surface +import androidx.compose.material.Text +import androidx.compose.material.TextFieldDefaults +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.input.KeyboardCapitalization +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.compose.ui.window.Dialog +import androidx.compose.ui.window.DialogProperties +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewmodel.compose.viewModel +import com.vitorpamplona.amethyst.model.Account +import com.vitorpamplona.amethyst.model.Note +import nostr.postr.events.TextNoteEvent + +class PostViewModel: ViewModel() { + var account: Account? = null + var message by mutableStateOf("") + var replyingTo: Note? = null + + fun sendPost() { + account?.sendPost(message, replyingTo) + } +} + +@Composable +fun NewPostView(onClose: () -> Unit, replyingTo: Note? = null, account: Account) { + val postViewModel: PostViewModel = viewModel().apply { + this.replyingTo = replyingTo + this.account = account + } + + val dialogProperties = DialogProperties() + Dialog( + onDismissRequest = { onClose() }, properties = dialogProperties + ) { + Surface( + modifier = Modifier + .fillMaxWidth() + .fillMaxHeight(0.5f) + ) { + Column( + modifier = Modifier.padding(10.dp) + ) { + Row( + modifier = Modifier + .fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically + ) { + CloseButton(onCancel = onClose) + + PostButton( + onPost = { + postViewModel.sendPost() + onClose() + } + ) + } + + if (replyingTo != null && replyingTo.event is TextNoteEvent) { + Row( + verticalAlignment = Alignment.CenterVertically, + ) { + val replyList = replyingTo.replyTo!!.plus(replyingTo).joinToString(", ", "", "", 2) { it.idDisplayHex } + val withList = replyingTo.mentions!!.plus(replyingTo.author!!).joinToString(", ", "", "", 2) { it.toBestDisplayName() } + + Text( + "in reply to ${replyList} with ${withList}", + fontSize = 13.sp, + color = MaterialTheme.colors.onSurface.copy(alpha = 0.32f) + ) + } + } + + OutlinedTextField( + value = postViewModel.message, + onValueChange = { postViewModel.message = it }, + keyboardOptions = KeyboardOptions.Default.copy( + capitalization = KeyboardCapitalization.Sentences + ), + modifier = Modifier.fillMaxWidth().fillMaxHeight() + .border( + width = 1.dp, + color = MaterialTheme.colors.surface, + shape = RoundedCornerShape(8.dp) + ), + placeholder = { + Text( + text = "What's on your mind?", + color = MaterialTheme.colors.onSurface.copy(alpha = 0.32f) + ) + }, + colors = TextFieldDefaults + .outlinedTextFieldColors( + unfocusedBorderColor = Color.Transparent, + focusedBorderColor = Color.Transparent + ) + + ) + } + } + } +} + +@Composable +private fun CloseButton(onCancel: () -> Unit) { + Button( + onClick = { + onCancel() + }, + shape = RoundedCornerShape(20.dp), + colors = ButtonDefaults + .buttonColors( + backgroundColor = Color.Gray + ) + ) { + Text(text = "Cancel", color = Color.White) + } +} + +@Composable +private fun PostButton(onPost: () -> Unit = {}) { + Button( + onClick = { + onPost() + }, + shape = RoundedCornerShape(20.dp), + colors = ButtonDefaults + .buttonColors( + backgroundColor = MaterialTheme.colors.primary + ) + ) { + Text(text = "Post", color = Color.White) + } +} diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/buttons/NewNoteButton.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/buttons/NewNoteButton.kt new file mode 100644 index 00000000..78e251a1 --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/buttons/NewNoteButton.kt @@ -0,0 +1,46 @@ +package com.vitorpamplona.amethyst.buttons + +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.material.ButtonDefaults +import androidx.compose.material.Icon +import androidx.compose.material.MaterialTheme +import androidx.compose.material.OutlinedButton +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.unit.dp +import com.vitorpamplona.amethyst.R +import com.vitorpamplona.amethyst.model.Account +import com.vitorpamplona.amethyst.ui.actions.NewPostView + +@Composable +fun NewNoteButton(account: Account) { + var wantsToPost by remember { + mutableStateOf(false) + } + + if (wantsToPost) + NewPostView({ wantsToPost = false }, account = account) + + OutlinedButton( + onClick = { wantsToPost = true }, + modifier = Modifier.size(55.dp), + shape = CircleShape, + colors = ButtonDefaults.outlinedButtonColors(backgroundColor = MaterialTheme.colors.primary), + contentPadding = PaddingValues(0.dp), + ) { + Icon( + painter = painterResource(R.drawable.ic_compose), + null, + modifier = Modifier.size(26.dp), + tint = Color.White + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RichTextViewer.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RichTextViewer.kt new file mode 100644 index 00000000..51258144 --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RichTextViewer.kt @@ -0,0 +1,115 @@ +package com.vitorpamplona.amethyst.ui.components + +import androidx.compose.foundation.border +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.MaterialTheme +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.livedata.observeAsState +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.unit.dp +import coil.compose.AsyncImage +import com.google.accompanist.flowlayout.FlowRow +import com.vitorpamplona.amethyst.model.LocalCache +import java.net.MalformedURLException +import java.net.URISyntaxException +import java.net.URL +import java.util.regex.Pattern + +val imageExtension = Pattern.compile("(.*/)*.+\\.(png|jpg|gif|bmp|jpeg|webp)$") +val noProtocolUrlValidator = Pattern.compile("^[-a-zA-Z0-9@:%._\\+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b(?:[-a-zA-Z0-9()@:%_\\+.~#?&//=]*)$") +val tagIndex = Pattern.compile("\\#\\[([0-9]*)\\]") + +fun isValidURL(url: String?): Boolean { + return try { + URL(url).toURI() + true + } catch (e: MalformedURLException) { + false + } catch (e: URISyntaxException) { + false + } +} + +@Composable +fun RichTextViewer(content: String, tags: List>?) { + Column(modifier = Modifier.padding(top = 5.dp)) { + // FlowRow doesn't work well with paragraphs. So we need to split them + content.split('\n').forEach { paragraph -> + + FlowRow() { + paragraph.split(' ').forEach { word: String -> + // Explicit URL + if (isValidURL(word)) { + val removedParamsFromUrl = word.split("?")[0].toLowerCase() + if (imageExtension.matcher(removedParamsFromUrl).matches()) { + AsyncImage( + model = word, + contentDescription = word, + contentScale = ContentScale.FillWidth, + modifier = Modifier + .padding(top = 4.dp) + .fillMaxWidth() + .clip(shape = RoundedCornerShape(15.dp)) + .border(1.dp, MaterialTheme.colors.onSurface.copy(alpha = 0.12f), RoundedCornerShape(15.dp)) + ) + } else { + UrlPreview(word, word) + } + } else if (noProtocolUrlValidator.matcher(word).matches()) { + UrlPreview("https://$word", word) + } else if (tagIndex.matcher(word).matches() && tags != null) { + TagLink(word, tags) + } else { + Text(text = "$word ") + } + } + } + + } + } +} + +@Composable +fun TagLink(word: String, tags: List>) { + val matcher = tagIndex.matcher(word) + + val index = try { + matcher.find() + matcher.group(1).toInt() + } catch (e: Exception) { + println("Couldn't link tag ${word}") + null + } + + if (index == null) { + return Text(text = "$word ") + } + + if (index > 0 && index < tags.size) { + if (tags[index][0] == "p") { + val user = LocalCache.users[tags[index][1]] + if (user != null) { + val innerUserState by user.live.observeAsState() + Text( + "${innerUserState?.user?.toBestDisplayName()}" + ) + } + } else if (tags[index][0] == "e") { + val note = LocalCache.notes[tags[index][1]] + if (note != null) { + val innerNoteState by note.live.observeAsState() + Text( + "${innerNoteState?.note?.idDisplayHex}" + ) + } + } else + Text(text = "$word ") + } +} \ No newline at end of file diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/UrlPreview.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/UrlPreview.kt new file mode 100644 index 00000000..3b92ea1b --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/UrlPreview.kt @@ -0,0 +1,109 @@ +package com.vitorpamplona.amethyst.ui.components + +import androidx.compose.animation.Crossfade +import androidx.compose.foundation.border +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.text.ClickableText +import androidx.compose.material.LocalTextStyle +import androidx.compose.material.MaterialTheme +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.platform.LocalUriHandler +import androidx.compose.ui.text.AnnotatedString +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import coil.compose.AsyncImage +import com.baha.url.preview.BahaUrlPreview +import com.baha.url.preview.IUrlPreviewCallback +import com.baha.url.preview.UrlInfoItem + + +@Composable +fun UrlPreview(url: String, urlText: String) { + var urlPreviewState by remember { mutableStateOf(UrlPreviewState.Loading) } + + // Doesn't use a viewModel because of viewModel reusing issues (too many UrlPreview are created). + LaunchedEffect(urlPreviewState) { + if (urlPreviewState == UrlPreviewState.Loading) { + val urlPreview = BahaUrlPreview(url, object : IUrlPreviewCallback { + override fun onComplete(urlInfo: UrlInfoItem) { + if (urlInfo.allFetchComplete() && urlInfo.url == url) + urlPreviewState = UrlPreviewState.Loaded(urlInfo) + else + urlPreviewState = UrlPreviewState.Empty + } + + override fun onFailed(throwable: Throwable) { + urlPreviewState = UrlPreviewState.Error("Error parsing preview for ${url}: ${throwable.message}") + } + }) + + urlPreview.fetchUrlPreview() + } + } + + val uri = LocalUriHandler.current + + Crossfade(targetState = urlPreviewState) { state -> + when (state) { + is UrlPreviewState.Loaded -> { + Row( + modifier = Modifier.clickable { runCatching { uri.openUri(url) } } + .clip(shape = RoundedCornerShape(15.dp)) + .border(1.dp, MaterialTheme.colors.onSurface.copy(alpha = 0.12f), RoundedCornerShape(15.dp)) + ) { + Column { + AsyncImage( + model = state.previewInfo.image, + contentDescription = "Profile Image", + contentScale = ContentScale.FillWidth, + modifier = Modifier.fillMaxWidth() + ) + + Text( + text = state.previewInfo.title, + style = MaterialTheme.typography.body2, + modifier = Modifier.fillMaxWidth().padding(start = 10.dp, end = 10.dp, top= 10.dp), + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + + Text( + text = state.previewInfo.description, + style = MaterialTheme.typography.caption, + modifier = Modifier + .fillMaxWidth() + .padding(start = 10.dp, end = 10.dp, bottom = 10.dp), + color = Color.Gray, + maxLines = 3, + overflow = TextOverflow.Ellipsis + ) + } + } + } + else -> { + ClickableText( + text = AnnotatedString("$urlText "), + onClick = { runCatching { uri.openUri(url) } }, + style = LocalTextStyle.current.copy(color = MaterialTheme.colors.primary), + ) + } + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/UrlPreviewState.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/UrlPreviewState.kt new file mode 100644 index 00000000..1a99d16c --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/UrlPreviewState.kt @@ -0,0 +1,10 @@ +package com.vitorpamplona.amethyst.ui.components + +import com.baha.url.preview.UrlInfoItem + +sealed class UrlPreviewState { + object Loading: UrlPreviewState() + class Loaded(val previewInfo: UrlInfoItem): UrlPreviewState() + object Empty: UrlPreviewState() + class Error(val errorMessage: String): UrlPreviewState() +} diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppBottomBar.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppBottomBar.kt new file mode 100644 index 00000000..c1a7470e --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppBottomBar.kt @@ -0,0 +1,60 @@ +package com.vitorpamplona.amethyst.ui.navigation + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.size +import androidx.compose.material.BottomNavigation +import androidx.compose.material.BottomNavigationItem +import androidx.compose.material.Divider +import androidx.compose.material.Icon +import androidx.compose.material.MaterialTheme +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.unit.dp +import androidx.navigation.NavHostController + +val bottomNavigationItems = listOf( + Route.Home, + Route.Message, + Route.Search, + Route.Notification +) + +@Composable +fun AppBottomBar(navController: NavHostController) { + val currentRoute = currentRoute(navController) + + Column() { + Divider( + thickness = 0.25.dp + ) + BottomNavigation( + modifier = Modifier, + elevation = 0.dp, + backgroundColor = MaterialTheme.colors.background + ) { + bottomNavigationItems.forEach { item -> + BottomNavigationItem( + icon = { + Icon( + painter = painterResource(id = item.icon), + null, + modifier = Modifier.size(if ("Home" == item.route) 24.dp else 20.dp), + tint = if (currentRoute == item.route) MaterialTheme.colors.primary else Color.Unspecified + ) + }, + selected = currentRoute == item.route, + onClick = { + if (currentRoute != item.route) { + navController.navigate(item.route) + } else { + // TODO: Make it scrool to the top + navController.navigate(item.route) + } + } + ) + } + } + } +} diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppNavigation.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppNavigation.kt new file mode 100644 index 00000000..1728df7e --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppNavigation.kt @@ -0,0 +1,19 @@ +package com.vitorpamplona.amethyst.ui.navigation + +import androidx.compose.runtime.Composable +import androidx.navigation.NavHostController +import androidx.navigation.compose.NavHost +import androidx.navigation.compose.composable +import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel + +@Composable +fun AppNavigation( + navController: NavHostController, + accountViewModel: AccountViewModel +) { + NavHost(navController, startDestination = Route.Home.route) { + Routes.forEach { + composable(it.route, content = it.buildScreen(accountViewModel)) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppTopBar.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppTopBar.kt new file mode 100644 index 00000000..290f880b --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppTopBar.kt @@ -0,0 +1,154 @@ +package com.vitorpamplona.amethyst.ui.navigation + +import android.util.Log +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.material.Divider +import androidx.compose.material.Icon +import androidx.compose.material.IconButton +import androidx.compose.material.MaterialTheme +import androidx.compose.material.ScaffoldState +import androidx.compose.material.Text +import androidx.compose.material.TopAppBar +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.ArrowBack +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.livedata.observeAsState +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.unit.dp +import androidx.lifecycle.viewmodel.compose.viewModel +import androidx.navigation.NavHostController +import coil.compose.AsyncImage +import com.vitorpamplona.amethyst.R +import com.vitorpamplona.amethyst.service.relays.Client +import com.vitorpamplona.amethyst.ui.screen.RelayPoolViewModel +import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel +import kotlinx.coroutines.launch + +@Composable +fun AppTopBar(navController: NavHostController, scaffoldState: ScaffoldState, accountViewModel: AccountViewModel) { + when (currentRoute(navController)) { + Route.Profile.route, + Route.Lists.route, + Route.Topics.route, + Route.Bookmarks.route, + Route.Moments.route -> TopBarWithBackButton(navController) + else -> MainTopBar(scaffoldState, accountViewModel) + } +} + +@Composable +fun MainTopBar(scaffoldState: ScaffoldState, accountViewModel: AccountViewModel) { + val accountUserState by accountViewModel.userLiveData.observeAsState() + val accountUser = accountUserState?.user + + val relayViewModel: RelayPoolViewModel = viewModel { RelayPoolViewModel() } + val relayPoolLiveData by relayViewModel.relayPoolLiveData.observeAsState() + + val coroutineScope = rememberCoroutineScope() + + Column() { + TopAppBar( + elevation = 0.dp, + backgroundColor = Color(0xFFFFFF), + title = { + Column( + modifier = Modifier + .padding(start = 22.dp, end = 0.dp) + .fillMaxWidth(), + horizontalAlignment = Alignment.CenterHorizontally + ) { + IconButton( + onClick = { + Client.subscriptions.map { "${it.key} ${it.value.joinToString { it.toJson() }}" }.forEach { + Log.d("CURRENT FILTERS", it) + } + } + ) { + Icon( + painter = painterResource(R.drawable.ic_amethyst), + null, + modifier = Modifier.size(32.dp), + tint = MaterialTheme.colors.primary + ) + } + } + + }, + navigationIcon = { + IconButton( + onClick = { + coroutineScope.launch { + scaffoldState.drawerState.open() + } + }, + modifier = Modifier + ) { + AsyncImage( + model = accountUser?.profilePicture() ?: "https://robohash.org/ohno.png", + contentDescription = "Profile Image", + modifier = Modifier + .width(34.dp) + .clip(shape = CircleShape), + ) + } + }, + actions = { + Text( + relayPoolLiveData ?: "--/--", + color = MaterialTheme.colors.onSurface.copy(alpha = 0.32f) + ) + + IconButton( + onClick = {}, modifier = Modifier + ) { + Icon( + painter = painterResource(R.drawable.ic_trends), + null, + modifier = Modifier.size(24.dp), + tint = Color.Unspecified + ) + } + } + ) + Divider(thickness = 0.25.dp) + } +} + +@Composable +fun TopBarWithBackButton(navController: NavHostController) { + Column() { + TopAppBar( + elevation = 0.dp, + backgroundColor = Color(0xFFFFFF), + title = {}, + navigationIcon = { + IconButton( + onClick = { + navController.popBackStack() + }, + modifier = Modifier + ) { + Icon( + imageVector = Icons.Filled.ArrowBack, + null, + modifier = Modifier.size(28.dp), + tint = MaterialTheme.colors.primary + ) + } + }, + actions = {} + ) + Divider(thickness = 0.25.dp) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/DrawerContent.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/DrawerContent.kt new file mode 100644 index 00000000..a7cb8697 --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/DrawerContent.kt @@ -0,0 +1,201 @@ +package com.vitorpamplona.amethyst.ui.navigation + +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.material.Divider +import androidx.compose.material.Icon +import androidx.compose.material.IconButton +import androidx.compose.material.MaterialTheme +import androidx.compose.material.ScaffoldState +import androidx.compose.material.Surface +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.livedata.observeAsState +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.font.FontWeight.Companion.W500 +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.navigation.NavHostController +import coil.compose.AsyncImage +import com.vitorpamplona.amethyst.R +import com.vitorpamplona.amethyst.model.User +import com.vitorpamplona.amethyst.ui.screen.AccountStateViewModel +import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel +import kotlinx.coroutines.launch + +val bottomNavigations = listOf( + Route.Profile, + Route.Lists, + //Route.Topics, + Route.Bookmarks, + //Route.Moments +) + +@Composable +fun DrawerContent(navController: NavHostController, + scaffoldState: ScaffoldState, + accountViewModel: AccountViewModel, + accountStateViewModel: AccountStateViewModel) { + + val accountUserState by accountViewModel.userLiveData.observeAsState() + val accountUser = accountUserState?.user + + Surface( + modifier = Modifier.fillMaxWidth(), + color = MaterialTheme.colors.background + ) { + Column() { + Box { + Image( + painter = painterResource(R.drawable.profile_banner), + contentDescription = "Profile Banner", + contentScale = ContentScale.FillWidth, + modifier = Modifier.fillMaxWidth() + ) + + ProfileContent( + accountUser, + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 25.dp) + .padding(top = 125.dp) + ) + } + Divider( + thickness = 0.25.dp, + modifier = Modifier.padding(top = 20.dp) + ) + ListContent( + navController, + scaffoldState, + modifier = Modifier + .fillMaxWidth() + .weight(1F), + accountStateViewModel + ) + } + } +} + +@Composable +fun ProfileContent(accountUser: User?, modifier: Modifier = Modifier) { + Column(modifier = modifier) { + AsyncImage( + model = accountUser?.profilePicture() ?: "https://robohash.org/ohno.png", + contentDescription = "Profile Image", + modifier = Modifier + .width(100.dp) + .clip(shape = CircleShape) + .border(3.dp, MaterialTheme.colors.background, CircleShape) + .background(MaterialTheme.colors.background) + ) + Text( + accountUser?.bestDisplayName() ?: "", + modifier = Modifier.padding(top = 7.dp), + fontWeight = FontWeight.Bold, + fontSize = 18.sp + ) + Text(" @${accountUser?.bestUsername()}", color = Color.LightGray) + Row(modifier = Modifier.padding(top = 15.dp)) { + Row() { + Text("${accountUser?.follows?.size}", fontWeight = FontWeight.Bold) + Text(" Following") + } + Row(modifier = Modifier.padding(start = 10.dp)) { + Text("${accountUser?.follower ?: "--"}", fontWeight = FontWeight.Bold) + Text(" Followers") + } + } + } +} + +@Composable +fun ListContent( + navController: NavHostController, + scaffoldState: ScaffoldState, + modifier: Modifier, + accountViewModel: AccountStateViewModel +) { + Column( + modifier = modifier + ) { + LazyColumn() { + items(items = bottomNavigations) { + NavigationRow(navController, scaffoldState, it) + } + item { + Divider( + modifier = Modifier.padding(vertical = 15.dp), + thickness = 0.25.dp + ) + Column(modifier = modifier.padding(horizontal = 25.dp)) { + Text( + text = "Settings", + fontSize = 18.sp, + fontWeight = W500 + ) + Row( + modifier = Modifier.clickable(onClick = { accountViewModel.logOff() }), + ) { + Text( + text = "Log out", + modifier = Modifier.padding(vertical = 15.dp), + fontSize = 18.sp, + fontWeight = W500 + ) + } + } + } + } + } +} + +@Composable +fun NavigationRow(navController: NavHostController, scaffoldState: ScaffoldState, route: Route) { + val coroutineScope = rememberCoroutineScope() + val currentRoute = currentRoute(navController) + Row( + modifier = Modifier + .padding(vertical = 15.dp, horizontal = 25.dp) + .clickable(onClick = { + if (currentRoute != route.route) { + navController.navigate(route.route) + } + coroutineScope.launch { + scaffoldState.drawerState.close() + } + }), + verticalAlignment = Alignment.CenterVertically + ) { + Icon( + painter = painterResource(route.icon), null, + modifier = Modifier.size(22.dp), + tint = MaterialTheme.colors.primary + ) + Text( + modifier = Modifier.padding(start = 16.dp), + text = route.route, + fontSize = 18.sp, + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/Routes.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/Routes.kt new file mode 100644 index 00000000..a347d2ef --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/Routes.kt @@ -0,0 +1,52 @@ +package com.vitorpamplona.amethyst.ui.navigation + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.navigation.NavBackStackEntry +import androidx.navigation.NavHostController +import androidx.navigation.compose.currentBackStackEntryAsState +import com.vitorpamplona.amethyst.R +import com.vitorpamplona.amethyst.ui.screen.HomeScreen +import com.vitorpamplona.amethyst.ui.screen.MessageScreen +import com.vitorpamplona.amethyst.ui.screen.NotificationScreen +import com.vitorpamplona.amethyst.ui.screen.ProfileScreen +import com.vitorpamplona.amethyst.ui.screen.SearchScreen +import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel + + +sealed class Route( + val route: String, + val icon: Int, + val buildScreen: (AccountViewModel) -> @Composable (NavBackStackEntry) -> Unit +) { + object Home : Route("Home", R.drawable.ic_home, { acc -> { _ -> HomeScreen(acc) } }) + object Search : Route("Search", R.drawable.ic_search, { acc -> { _ -> SearchScreen(acc) }}) + object Notification : Route("Notification", R.drawable.ic_notifications, { acc -> { _ -> NotificationScreen(acc) }}) + object Message : Route("Message", R.drawable.ic_dm, { acc -> { _ -> MessageScreen(acc) }}) + object Profile : Route("Profile", R.drawable.ic_profile, { acc -> { _ -> ProfileScreen(acc) }}) + object Lists : Route("Lists", R.drawable.ic_lists, { acc -> { _ -> ProfileScreen(acc) }}) + object Topics : Route("Topics", R.drawable.ic_topics, { acc -> { _ -> ProfileScreen(acc) }}) + object Bookmarks : Route("Bookmarks", R.drawable.ic_bookmarks, { acc -> { _ -> ProfileScreen(acc) }}) + object Moments : Route("Moments", R.drawable.ic_moments, { acc -> { _ -> ProfileScreen(acc) }}) +} + +val Routes = listOf( + // bottom + Route.Home, + Route.Message, + Route.Search, + Route.Notification, + + //drawer + Route.Profile, + Route.Lists, + Route.Topics, + Route.Bookmarks, + Route.Moments +) + +@Composable +public fun currentRoute(navController: NavHostController): String? { + val navBackStackEntry by navController.currentBackStackEntryAsState() + return navBackStackEntry?.destination?.route +} \ No newline at end of file diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/BlankNote.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/BlankNote.kt new file mode 100644 index 00000000..053ed149 --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/BlankNote.kt @@ -0,0 +1,42 @@ +package com.vitorpamplona.amethyst.ui.note + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.padding +import androidx.compose.material.Divider +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.unit.dp + +@Composable +fun BlankNote(modifier: Modifier = Modifier, isQuote: Boolean) { + Column(modifier = modifier) { + Row(modifier = Modifier.padding(horizontal = if (!isQuote) 12.dp else 6.dp)) { + Column(modifier = Modifier.padding(start = if (!isQuote) 10.dp else 5.dp)) { + Row( + modifier = Modifier.padding( + start = 20.dp, + end = 20.dp, + bottom = 25.dp, + top = 15.dp + ), + verticalAlignment = Alignment.CenterVertically + ) { + Text( + text = "Referenced event not found", + modifier = Modifier.padding(30.dp), + color = Color.Gray, + ) + } + + Divider( + modifier = Modifier.padding(vertical = 10.dp), + thickness = 0.25.dp + ) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/BoostSetCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/BoostSetCompose.kt new file mode 100644 index 00000000..dea521c0 --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/BoostSetCompose.kt @@ -0,0 +1,92 @@ +package com.vitorpamplona.amethyst.ui.note + +import android.text.format.DateUtils +import android.text.format.DateUtils.getRelativeTimeSpanString +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.material.Divider +import androidx.compose.material.Icon +import androidx.compose.material.MaterialTheme +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.livedata.observeAsState +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import coil.compose.AsyncImage +import com.google.accompanist.flowlayout.FlowRow +import com.vitorpamplona.amethyst.R +import com.vitorpamplona.amethyst.model.Note +import com.vitorpamplona.amethyst.service.model.ReactionEvent +import com.vitorpamplona.amethyst.service.model.RepostEvent +import com.vitorpamplona.amethyst.ui.components.RichTextViewer +import com.vitorpamplona.amethyst.ui.screen.BoostSetCard +import com.vitorpamplona.amethyst.ui.screen.LikeSetCard +import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel +import nostr.postr.events.TextNoteEvent + +@Composable +fun BoostSetCompose(likeSetCard: BoostSetCard, modifier: Modifier = Modifier, isInnerNote: Boolean = false, accountViewModel: AccountViewModel) { + val noteState by likeSetCard.note.live.observeAsState() + val note = noteState?.note + + if (note?.event == null) { + BlankNote(modifier, isInnerNote) + } else { + Column(modifier = modifier) { + Row(modifier = Modifier.padding(horizontal = if (!isInnerNote) 12.dp else 0.dp)) { + + // Draws the like picture outside the boosted card. + if (!isInnerNote) { + Box(modifier = Modifier + .width(55.dp) + .padding(0.dp)) { + Icon( + painter = painterResource(R.drawable.ic_retweeted), + null, + modifier = Modifier.size(16.dp).align(Alignment.TopEnd), + tint = Color.Unspecified + ) + } + } + + Column(modifier = Modifier.padding(start = if (!isInnerNote) 10.dp else 0.dp)) { + FlowRow() { + likeSetCard.boostEvents.forEach { + val cardNoteState by it.live.observeAsState() + val cardNote = cardNoteState?.note + + if (cardNote?.author != null) { + val userState by cardNote.author!!.live.observeAsState() + + AsyncImage( + model = userState?.user?.profilePicture(), + contentDescription = "Profile Image", + modifier = Modifier + .width(35.dp) + .height(35.dp) + .clip(shape = CircleShape) + ) + } + } + } + + NoteCompose(note, modifier = Modifier.padding(top = 5.dp), isInnerNote = true, accountViewModel = accountViewModel) + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/LikeSetCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/LikeSetCompose.kt new file mode 100644 index 00000000..870821df --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/LikeSetCompose.kt @@ -0,0 +1,91 @@ +package com.vitorpamplona.amethyst.ui.note + +import android.text.format.DateUtils +import android.text.format.DateUtils.getRelativeTimeSpanString +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.material.Divider +import androidx.compose.material.Icon +import androidx.compose.material.MaterialTheme +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.livedata.observeAsState +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import coil.compose.AsyncImage +import com.google.accompanist.flowlayout.FlowRow +import com.vitorpamplona.amethyst.R +import com.vitorpamplona.amethyst.model.Note +import com.vitorpamplona.amethyst.service.model.ReactionEvent +import com.vitorpamplona.amethyst.service.model.RepostEvent +import com.vitorpamplona.amethyst.ui.components.RichTextViewer +import com.vitorpamplona.amethyst.ui.screen.LikeSetCard +import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel +import nostr.postr.events.TextNoteEvent + +@Composable +fun LikeSetCompose(likeSetCard: LikeSetCard, modifier: Modifier = Modifier, isInnerNote: Boolean = false, accountViewModel: AccountViewModel) { + val noteState by likeSetCard.note.live.observeAsState() + val note = noteState?.note + + if (note?.event == null) { + BlankNote(modifier, isInnerNote) + } else { + Column(modifier = modifier) { + Row(modifier = Modifier.padding(horizontal = if (!isInnerNote) 12.dp else 0.dp)) { + + // Draws the like picture outside the boosted card. + if (!isInnerNote) { + Box(modifier = Modifier + .width(55.dp) + .padding(0.dp)) { + Icon( + painter = painterResource(R.drawable.ic_liked), + null, + modifier = Modifier.size(16.dp).align(Alignment.TopEnd), + tint = Color.Unspecified + ) + } + } + + Column(modifier = Modifier.padding(start = if (!isInnerNote) 10.dp else 0.dp)) { + FlowRow() { + likeSetCard.likeEvents.forEach { + val cardNoteState by it.live.observeAsState() + val cardNote = cardNoteState?.note + + if (cardNote?.author != null) { + val userState by cardNote.author!!.live.observeAsState() + + AsyncImage( + model = userState?.user?.profilePicture(), + contentDescription = "Profile Image", + modifier = Modifier + .width(35.dp) + .height(35.dp) + .clip(shape = CircleShape) + ) + } + } + } + + NoteCompose(note, modifier = Modifier.padding(top = 5.dp), isInnerNote = true, accountViewModel = accountViewModel) + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/Note.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/Note.kt new file mode 100644 index 00000000..301b157a --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/Note.kt @@ -0,0 +1,132 @@ +package com.vitorpamplona.amethyst.ui.note + +import android.text.format.DateUtils +import android.text.format.DateUtils.getRelativeTimeSpanString +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.material.Divider +import androidx.compose.material.MaterialTheme +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.livedata.observeAsState +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import coil.compose.AsyncImage +import com.vitorpamplona.amethyst.model.Note +import com.vitorpamplona.amethyst.service.model.ReactionEvent +import com.vitorpamplona.amethyst.service.model.RepostEvent +import com.vitorpamplona.amethyst.ui.components.RichTextViewer +import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel +import nostr.postr.events.TextNoteEvent + +@Composable +fun NoteCompose(baseNote: Note, modifier: Modifier = Modifier, isInnerNote: Boolean = false, accountViewModel: AccountViewModel) { + val noteState by baseNote.live.observeAsState() + val note = noteState?.note + + if (note?.event == null) { + BlankNote(modifier, isInnerNote) + } else { + val authorState by note.author!!.live.observeAsState() + val author = authorState?.user + + Column(modifier = modifier) { + Row(modifier = Modifier.padding(horizontal = if (!isInnerNote) 12.dp else 0.dp)) { + + // Draws the boosted picture outside the boosted card. + if (!isInnerNote) { + Box(modifier = Modifier.width(55.dp).padding(0.dp)) { + AsyncImage( + model = author?.profilePicture(), + contentDescription = "Profile Image", + modifier = Modifier + .width(55.dp) + .clip(shape = CircleShape) + ) + + // boosted picture + val boostedPosts = note.replyTo + if (note.event is RepostEvent && boostedPosts != null && boostedPosts.isNotEmpty()) { + AsyncImage( + model = boostedPosts[0].author?.profilePicture(), + contentDescription = "Profile Image", + modifier = Modifier + .width(35.dp) + .clip(shape = CircleShape) + .align(Alignment.BottomEnd) + .background(MaterialTheme.colors.background) + .border(2.dp, MaterialTheme.colors.primary, CircleShape) + ) + } + } + } + + Column(modifier = Modifier.padding(start = if (!isInnerNote) 10.dp else 0.dp)) { + Row(verticalAlignment = Alignment.CenterVertically) { + if (author != null) + UserDisplay(author) + + if (note.event !is RepostEvent) { + Text( + " " + timeAgo(note.event?.createdAt), + color = MaterialTheme.colors.onSurface.copy(alpha = 0.32f) + ) + } else { + Text( + " boosted", + fontWeight = FontWeight.Bold, + color = MaterialTheme.colors.onSurface.copy(alpha = 0.32f) + ) + } + } + + if (note.event is TextNoteEvent && (note.replyTo != null || note.mentions != null)) { + ReplyInformation(note.replyTo, note.mentions) + } + + if (note.event is ReactionEvent || note.event is RepostEvent) { + note.replyTo?.mapIndexed { index, note -> + NoteCompose( + note, + modifier = Modifier.padding(top = 5.dp), + isInnerNote = true, + accountViewModel = accountViewModel + ) + } + + // Reposts have trash in their contents. + if (note.event is ReactionEvent) { + val refactorReactionText = + if (note.event?.content == "+") "❤" else note.event?.content ?: " " + + Text( + text = refactorReactionText + ) + } + } else { + val eventContent = note.event?.content + if (eventContent != null) + RichTextViewer(eventContent, note.event?.tags) + + ReactionsRowState(note, accountViewModel) + + Divider( + modifier = Modifier.padding(vertical = 10.dp), + thickness = 0.25.dp + ) + } + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/PubKeyFormatter.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/PubKeyFormatter.kt new file mode 100644 index 00000000..67a100bc --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/PubKeyFormatter.kt @@ -0,0 +1,12 @@ +package com.vitorpamplona.amethyst.ui.note + +import nostr.postr.toHex + +fun ByteArray.toDisplayHex(): String { + return toHex().toDisplayHex() +} + +fun String.toDisplayHex(): String { + return replaceRange(6, length-6, ":") +} + diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ReactionsRow.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ReactionsRow.kt new file mode 100644 index 00000000..a7797453 --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ReactionsRow.kt @@ -0,0 +1,141 @@ +package com.vitorpamplona.amethyst.ui.note + +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.material.Icon +import androidx.compose.material.IconButton +import androidx.compose.material.MaterialTheme +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import com.vitorpamplona.amethyst.R +import com.vitorpamplona.amethyst.model.Account +import com.vitorpamplona.amethyst.model.Note +import com.vitorpamplona.amethyst.ui.actions.NewPostView + +@Composable +fun ReactionsRow(note: Note, account: Account, boost: (Note) -> Unit, reactTo: (Note) -> Unit) { + val grayTint = MaterialTheme.colors.onSurface.copy(alpha = 0.32f) + + var wantsToReplyTo by remember { + mutableStateOf(null) + } + + if (wantsToReplyTo != null) + NewPostView({ wantsToReplyTo = null }, wantsToReplyTo, account) + + Row(modifier = Modifier.padding(top = 8.dp)) { + Row(verticalAlignment = Alignment.CenterVertically) { + IconButton( + modifier = Modifier.then(Modifier.size(24.dp)), + onClick = { if (account.isWriteable()) wantsToReplyTo = note } + ) { + Icon( + painter = painterResource(R.drawable.ic_comment), + null, + modifier = Modifier.size(15.dp), + tint = grayTint, + ) + } + + Text( + " ${showCount(note.replies?.size)}", + fontSize = 14.sp, + color = grayTint + ) + } + Row( + modifier = Modifier.padding(start = 40.dp), + verticalAlignment = Alignment.CenterVertically + ) { + IconButton( + modifier = Modifier.then(Modifier.size(24.dp)), + onClick = { if (account.isWriteable()) boost(note) } + ) { + if (note.isBoostedBy(account.userProfile())) { + Icon( + painter = painterResource(R.drawable.ic_retweeted), + null, + modifier = Modifier.size(20.dp), + tint = Color.Unspecified + ) + } else { + Icon( + painter = painterResource(R.drawable.ic_retweet), + null, + modifier = Modifier.size(20.dp), + tint = grayTint + ) + } + } + + Text( + " ${showCount(note.boosts?.size)}", + fontSize = 14.sp, + color = MaterialTheme.colors.onSurface.copy(alpha = 0.32f) + ) + } + Row( + modifier = Modifier.padding(start = 40.dp), + verticalAlignment = Alignment.CenterVertically + ) { + IconButton( + modifier = Modifier.then(Modifier.size(24.dp)), + onClick = { if (account.isWriteable()) reactTo(note) } + ) { + if (note.isReactedBy(account.userProfile())) { + Icon( + painter = painterResource(R.drawable.ic_liked), + null, + modifier = Modifier.size(16.dp), + tint = Color.Unspecified + ) + } else { + Icon( + painter = painterResource(R.drawable.ic_like), + null, + modifier = Modifier.size(16.dp), + tint = grayTint + ) + } + } + + Text( + " ${showCount(note.reactions?.size)}", + fontSize = 14.sp, + color = MaterialTheme.colors.onSurface.copy(alpha = 0.32f) + ) + } + Row( + modifier = Modifier.padding(start = 40.dp), + verticalAlignment = Alignment.CenterVertically + ) { + IconButton( + modifier = Modifier.then(Modifier.size(24.dp)), + onClick = { } + ) { + Icon( + painter = painterResource(R.drawable.ic_share), + null, + modifier = Modifier.size(16.dp), + tint = grayTint + ) + } + } + } +} + +fun showCount(size: Int?): String { + if (size == null) return " " + return if (size == 0) return " " else "$size" +} \ No newline at end of file diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ReactionsRowState.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ReactionsRowState.kt new file mode 100644 index 00000000..1bcec3b3 --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ReactionsRowState.kt @@ -0,0 +1,20 @@ +package com.vitorpamplona.amethyst.ui.note + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.livedata.observeAsState +import com.vitorpamplona.amethyst.model.Note +import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel + +@Composable +fun ReactionsRowState(baseNote: Note, accountViewModel: AccountViewModel) { + val accountState by accountViewModel.accountLiveData.observeAsState() + val account = accountState?.account + + val noteState by baseNote.live.observeAsState() + val note = noteState?.note + + if (account == null || note == null) return + + ReactionsRow(note, account, accountViewModel::boost, accountViewModel::reactTo) +} \ No newline at end of file diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ReplyInformation.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ReplyInformation.kt new file mode 100644 index 00000000..273e46b5 --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ReplyInformation.kt @@ -0,0 +1,63 @@ +package com.vitorpamplona.amethyst.ui.note + +import androidx.compose.material.MaterialTheme +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.livedata.observeAsState +import androidx.compose.ui.unit.sp +import com.google.accompanist.flowlayout.FlowRow +import com.vitorpamplona.amethyst.model.Note +import com.vitorpamplona.amethyst.model.User + +@Composable +fun ReplyInformation(replyTo: MutableList?, mentions: List?) { + FlowRow() { + /* + if (replyTo != null && replyTo.isNotEmpty()) { + Text( + " in reply to ", + fontSize = 13.sp, + color = MaterialTheme.colors.onSurface.copy(alpha = 0.32f) + ) + replyTo.toSet().forEachIndexed { idx, note -> + val innerNoteState by note.live.observeAsState() + Text( + "${innerNoteState?.note?.idDisplayHex}${if (idx < replyTo.size - 1) ", " else ""}", + fontSize = 13.sp, + color = MaterialTheme.colors.onSurface.copy(alpha = 0.32f) + ) + } + } + */ + if (mentions != null && mentions.isNotEmpty()) { + Text( + "replying to ", + fontSize = 13.sp, + color = MaterialTheme.colors.onSurface.copy(alpha = 0.32f) + ) + mentions.toSet().forEachIndexed { idx, user -> + val innerUserState by user.live.observeAsState() + Text( + "${innerUserState?.user?.toBestDisplayName()}", + fontSize = 13.sp, + color = MaterialTheme.colors.onSurface.copy(alpha = 0.32f) + ) + + if (idx < mentions.size - 2) { + Text( + ", ", + fontSize = 13.sp, + color = MaterialTheme.colors.onSurface.copy(alpha = 0.32f) + ) + } else if (idx < mentions.size - 1) { + Text( + " and ", + fontSize = 13.sp, + color = MaterialTheme.colors.onSurface.copy(alpha = 0.32f) + ) + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/TimeAgoFormatter.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/TimeAgoFormatter.kt new file mode 100644 index 00000000..ed641900 --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/TimeAgoFormatter.kt @@ -0,0 +1,18 @@ +package com.vitorpamplona.amethyst.ui.note + +import android.text.format.DateUtils + +fun timeAgo(mills: Long?): String { + if (mills == null) return " " + + var humanReadable = DateUtils.getRelativeTimeSpanString( + mills * 1000, + System.currentTimeMillis(), + DateUtils.MINUTE_IN_MILLIS, + DateUtils.FORMAT_ABBREV_ALL + ).toString() + if (humanReadable.startsWith("In") || humanReadable.startsWith("0")) { + humanReadable = "now"; + } + return humanReadable +} \ No newline at end of file diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/UserDisplay.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/UserDisplay.kt new file mode 100644 index 00000000..6cfc378b --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/UserDisplay.kt @@ -0,0 +1,26 @@ +package com.vitorpamplona.amethyst.ui.note + +import androidx.compose.material.MaterialTheme +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.text.font.FontWeight +import com.vitorpamplona.amethyst.model.User + +@Composable +fun UserDisplay(user: User) { + if (user.bestUsername() != null || user.bestDisplayName() != null) { + Text( + user.bestDisplayName() ?: "", + fontWeight = FontWeight.Bold, + ) + Text( + "@${(user.bestUsername() ?: "")}", + color = MaterialTheme.colors.onSurface.copy(alpha = 0.32f), + ) + } else { + Text( + user.pubkeyDisplayHex, + fontWeight = FontWeight.Bold, + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/AccountScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/AccountScreen.kt new file mode 100644 index 00000000..71310415 --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/AccountScreen.kt @@ -0,0 +1,32 @@ +package com.vitorpamplona.amethyst.ui.screen + +import androidx.compose.animation.Crossfade +import androidx.compose.foundation.layout.Column +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.lifecycle.compose.ExperimentalLifecycleComposeApi +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel + +@OptIn(ExperimentalLifecycleComposeApi::class) +@Composable +fun AccountScreen(accountStateViewModel: AccountStateViewModel) { + val accountState by accountStateViewModel.accountContent.collectAsStateWithLifecycle() + + Column() { + Crossfade(targetState = accountState) { state -> + when (state) { + is AccountState.LoggedOff -> { + LoginPage(accountStateViewModel) + } + is AccountState.LoggedIn -> { + MainScreen(AccountViewModel(state.account), accountStateViewModel) + } + is AccountState.LoggedInViewOnly -> { + MainScreen(AccountViewModel(state.account), accountStateViewModel) + } + } + } + } +} + diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/AccountState.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/AccountState.kt new file mode 100644 index 00000000..df6488b0 --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/AccountState.kt @@ -0,0 +1,9 @@ +package com.vitorpamplona.amethyst.ui.screen + +import com.vitorpamplona.amethyst.model.Account + +sealed class AccountState { + object LoggedOff: AccountState() + class LoggedInViewOnly(val account: Account): AccountState() + class LoggedIn(val account: Account): AccountState() +} diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/AccountStateViewModel.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/AccountStateViewModel.kt new file mode 100644 index 00000000..e09385e0 --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/AccountStateViewModel.kt @@ -0,0 +1,106 @@ +package com.vitorpamplona.amethyst.ui.screen + +import androidx.lifecycle.ViewModel +import androidx.security.crypto.EncryptedSharedPreferences +import com.vitorpamplona.amethyst.model.Account +import com.vitorpamplona.amethyst.model.toByteArray +import com.vitorpamplona.amethyst.service.NostrAccountDataSource +import com.vitorpamplona.amethyst.service.NostrGlobalDataSource +import com.vitorpamplona.amethyst.service.NostrHomeDataSource +import com.vitorpamplona.amethyst.service.NostrNotificationDataSource +import com.vitorpamplona.amethyst.service.NostrSingleEventDataSource +import com.vitorpamplona.amethyst.service.NostrSingleUserDataSource +import fr.acinq.secp256k1.Hex +import java.util.regex.Pattern +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.update +import nostr.postr.Persona +import nostr.postr.bechToBytes +import nostr.postr.toHex + +class AccountStateViewModel(private val encryptedPreferences: EncryptedSharedPreferences): ViewModel() { + private val _accountContent = MutableStateFlow(AccountState.LoggedOff) + val accountContent = _accountContent.asStateFlow() + + init { + // pulls account from storage. + loadFromEncryptedStorage()?.let { login(it) } + } + + fun login(key: String) { + val pattern = Pattern.compile(".+@.+\\.[a-z]+") + + login( + if (key.startsWith("nsec")) { + Persona(privKey = key.bechToBytes()) + } else if (key.startsWith("npub")) { + Persona(pubKey = key.bechToBytes()) + } else if (pattern.matcher(key).matches()) { + // Evaluate NIP-5 + Persona() + } else { + Persona(Hex.decode(key)) + } + ) + } + + fun login(person: Persona) { + val loggedIn = Account(person) + + if (person.privKey != null) + _accountContent.update { AccountState.LoggedIn ( loggedIn ) } + else + _accountContent.update { AccountState.LoggedInViewOnly ( Account(person) ) } + + saveToEncryptedStorage(person) + + NostrAccountDataSource.account = loggedIn + NostrHomeDataSource.account = loggedIn + NostrNotificationDataSource.account = loggedIn + + NostrAccountDataSource.start() + NostrGlobalDataSource.start() + NostrHomeDataSource.start() + NostrNotificationDataSource.start() + NostrSingleEventDataSource.start() + NostrSingleUserDataSource.start() + } + + fun newKey() { + login(Persona()) + } + + fun logOff() { + _accountContent.update { AccountState.LoggedOff } + + clearEncryptedStorage() + } + + fun clearEncryptedStorage() { + encryptedPreferences.edit().apply { + remove("nostr_privkey") + remove("nostr_pubkey") + }.apply() + } + + fun saveToEncryptedStorage(login: Persona) { + encryptedPreferences.edit().apply { + login.privKey?.let { putString("nostr_privkey", it.toHex()) } + login.pubKey.let { putString("nostr_pubkey", it.toHex()) } + }.apply() + } + + fun loadFromEncryptedStorage(): Persona? { + encryptedPreferences.apply { + val privKey = getString("nostr_privkey", null) + val pubKey = getString("nostr_pubkey", null) + + if (pubKey != null) { + return Persona(privKey = privKey?.toByteArray(), pubKey = pubKey.toByteArray()) + } else { + return null + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedState.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedState.kt new file mode 100644 index 00000000..665838e7 --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedState.kt @@ -0,0 +1,36 @@ +package com.vitorpamplona.amethyst.ui.screen + +import com.vitorpamplona.amethyst.model.Note + +abstract class Card() { + abstract fun createdAt(): Long +} + +class NoteCard(val note: Note): Card() { + override fun createdAt(): Long { + return note.event?.createdAt ?: 0 + } +} + +class LikeSetCard(val note: Note, val likeEvents: List): Card() { + val createdAt = likeEvents.maxOf { it.event?.createdAt ?: 0 } + + override fun createdAt(): Long { + return createdAt + } +} + +class BoostSetCard(val note: Note, val boostEvents: List): Card() { + val createdAt = boostEvents.maxOf { it.event?.createdAt ?: 0 } + + override fun createdAt(): Long { + return createdAt + } +} + +sealed class CardFeedState { + object Loading: CardFeedState() + class Loaded(val feed: List): CardFeedState() + object Empty: CardFeedState() + class FeedError(val errorMessage: String): CardFeedState() +} diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedView.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedView.kt new file mode 100644 index 00000000..b4d2eaa1 --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedView.kt @@ -0,0 +1,93 @@ +package com.vitorpamplona.amethyst.ui.screen + +import androidx.compose.animation.Crossfade +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.itemsIndexed +import androidx.compose.foundation.lazy.rememberLazyListState +import androidx.compose.material.Button +import androidx.compose.material.OutlinedButton +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import androidx.lifecycle.compose.ExperimentalLifecycleComposeApi +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.google.accompanist.swiperefresh.SwipeRefresh +import com.google.accompanist.swiperefresh.rememberSwipeRefreshState +import com.vitorpamplona.amethyst.ui.note.BoostSetCompose +import com.vitorpamplona.amethyst.ui.note.LikeSetCompose +import com.vitorpamplona.amethyst.ui.note.NoteCompose +import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel + +@OptIn(ExperimentalLifecycleComposeApi::class) +@Composable +fun CardFeedView(viewModel: CardFeedViewModel, accountViewModel: AccountViewModel) { + val feedState by viewModel.feedContent.collectAsStateWithLifecycle() + + var isRefreshing by remember { mutableStateOf(false) } + val swipeRefreshState = rememberSwipeRefreshState(isRefreshing) + + val listState = rememberLazyListState() + + LaunchedEffect(isRefreshing) { + if (isRefreshing) { + viewModel.refresh() + isRefreshing = false + } + } + + SwipeRefresh( + state = swipeRefreshState, + onRefresh = { + isRefreshing = true + }, + ) { + Column() { + Crossfade(targetState = feedState) { state -> + when (state) { + is CardFeedState.Empty -> { + FeedEmpty { + isRefreshing = true + } + } + is CardFeedState.FeedError -> { + FeedError(state.errorMessage) { + isRefreshing = true + } + } + is CardFeedState.Loaded -> { + LazyColumn( + contentPadding = PaddingValues( + top = 10.dp, + bottom = 10.dp + ), + state = listState + ) { + itemsIndexed(state.feed) { index, item -> + when (item) { + is NoteCard -> NoteCompose(item.note, isInnerNote = false, accountViewModel = accountViewModel) + is LikeSetCard -> LikeSetCompose(item, isInnerNote = false, accountViewModel = accountViewModel) + is BoostSetCard -> BoostSetCompose(item, isInnerNote = false, accountViewModel = accountViewModel) + } + } + } + } + CardFeedState.Loading -> { + LoadingFeed() + } + } + } + } + } +} diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedViewModel.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedViewModel.kt new file mode 100644 index 00000000..1d52992f --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedViewModel.kt @@ -0,0 +1,107 @@ +package com.vitorpamplona.amethyst.ui.screen + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.vitorpamplona.amethyst.model.LocalCache +import com.vitorpamplona.amethyst.model.LocalCacheState +import com.vitorpamplona.amethyst.model.Note +import com.vitorpamplona.amethyst.service.NostrDataSource +import com.vitorpamplona.amethyst.service.model.ReactionEvent +import com.vitorpamplona.amethyst.service.model.RepostEvent +import kotlinx.coroutines.cancel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch + +class CardFeedViewModel(val dataSource: NostrDataSource): ViewModel() { + private val _feedContent = MutableStateFlow(CardFeedState.Loading) + val feedContent = _feedContent.asStateFlow() + + private var lastNotes: List? = null + + fun refresh() { + // For some reason, view Model Scope doesn't call + viewModelScope.launch { + refreshSuspend() + } + } + + fun refreshSuspend() { + val notes = dataSource.loadTop() + + val lastNotesCopy = lastNotes + + val oldNotesState = feedContent.value + if (lastNotesCopy != null && oldNotesState is CardFeedState.Loaded) { + val newCards = convertToCard(notes.minus(lastNotesCopy)) + if (newCards.isNotEmpty()) { + lastNotes = notes + updateFeed((oldNotesState.feed + newCards).sortedBy { it.createdAt() }.reversed()) + } + } else { + val cards = convertToCard(notes) + lastNotes = notes + updateFeed(cards) + } + } + + private fun convertToCard(notes: List): List { + val reactionsPerEvent = mutableMapOf>() + notes + .filter { it.event is ReactionEvent } + .forEach { + val reactedPost = it.replyTo?.last() + if (reactedPost != null) + reactionsPerEvent.getOrPut(reactedPost, { mutableListOf() }).add(it) + } + + val reactionCards = reactionsPerEvent.map { LikeSetCard(it.key, it.value) } + + val boostsPerEvent = mutableMapOf>() + notes + .filter { it.event is RepostEvent } + .forEach { + val boostedPost = it.replyTo?.last() + if (boostedPost != null) + boostsPerEvent.getOrPut(boostedPost, { mutableListOf() }).add(it) + } + + val boostCards = boostsPerEvent.map { BoostSetCard(it.key, it.value) } + + val textNoteCards = notes.filter { it.event !is ReactionEvent && it.event !is RepostEvent }.map { NoteCard(it) } + + return (reactionCards + boostCards + textNoteCards).sortedBy { it.createdAt() }.reversed() + } + + fun updateFeed(notes: List) { + if (notes.isEmpty()) { + _feedContent.update { CardFeedState.Empty } + } else { + _feedContent.update { CardFeedState.Loaded(notes) } + } + } + + fun refreshCurrentList() { + val state = feedContent.value + if (state is CardFeedState.Loaded) { + _feedContent.update { CardFeedState.Loaded(state.feed) } + } + } + + private val cacheListener: (LocalCacheState) -> Unit = { + refresh() + } + + init { + LocalCache.live.observeForever(cacheListener) + } + + override fun onCleared() { + LocalCache.live.removeObserver(cacheListener) + + dataSource.stop() + viewModelScope.cancel() + super.onCleared() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedState.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedState.kt new file mode 100644 index 00000000..fe3361e7 --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedState.kt @@ -0,0 +1,11 @@ +package com.vitorpamplona.amethyst.ui.screen + +import com.vitorpamplona.amethyst.model.Note + + +sealed class FeedState { + object Loading : FeedState() + class Loaded(val feed: List) : FeedState() + object Empty : FeedState() + class FeedError(val errorMessage: String) : FeedState() +} \ No newline at end of file diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedView.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedView.kt new file mode 100644 index 00000000..87fdf99b --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedView.kt @@ -0,0 +1,188 @@ +package com.vitorpamplona.amethyst.ui.screen + +import androidx.compose.animation.Crossfade +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.itemsIndexed +import androidx.compose.foundation.lazy.rememberLazyListState +import androidx.compose.material.Button +import androidx.compose.material.OutlinedButton +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import androidx.lifecycle.compose.ExperimentalLifecycleComposeApi +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.google.accompanist.swiperefresh.SwipeRefresh +import com.google.accompanist.swiperefresh.rememberSwipeRefreshState +import com.vitorpamplona.amethyst.ui.note.NoteCompose +import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel + +@OptIn(ExperimentalLifecycleComposeApi::class) +@Composable +fun FeedView(viewModel: FeedViewModel, accountViewModel: AccountViewModel) { + val feedState by viewModel.feedContent.collectAsStateWithLifecycle() + + var isRefreshing by remember { mutableStateOf(false) } + val swipeRefreshState = rememberSwipeRefreshState(isRefreshing) + + val listState = rememberLazyListState() + + LaunchedEffect(isRefreshing) { + if (isRefreshing) { + viewModel.refresh() + isRefreshing = false + } + } + + SwipeRefresh( + state = swipeRefreshState, + onRefresh = { + isRefreshing = true + }, + ) { + Column() { + Crossfade(targetState = feedState) { state -> + when (state) { + is FeedState.Empty -> { + FeedEmpty { + isRefreshing = true + } + } + is FeedState.FeedError -> { + FeedError(state.errorMessage) { + isRefreshing = true + } + } + is FeedState.Loaded -> { + LazyColumn( + contentPadding = PaddingValues( + top = 10.dp, + bottom = 10.dp + ), + state = listState + ) { + itemsIndexed(state.feed, key = { _, item -> item.idHex }) { index, item -> + NoteCompose(item, isInnerNote = false, accountViewModel = accountViewModel) + } + } + } + FeedState.Loading -> { + LoadingFeed() + } + } + } + } + } +} + +@Composable +fun LoadingFeed() { + Column( + Modifier + .fillMaxHeight() + .fillMaxWidth(), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center, + ) { + Text("Loading feed") + } +} + +@Composable +fun FeedError(errorMessage: String, onRefresh: () -> Unit) { + Column( + Modifier + .fillMaxHeight() + .fillMaxWidth(), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center, + ) { + Text("Error loading replies: $errorMessage") + Button( + modifier = Modifier.align(Alignment.CenterHorizontally), + onClick = onRefresh + ) { + Text(text = "Try again") + } + } +} + +@Composable +fun FeedEmpty(onRefresh: () -> Unit) { + Column( + Modifier + .fillMaxHeight() + .fillMaxWidth(), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center, + ) { + Text("Feed is empty.") + OutlinedButton(onClick = onRefresh) { + Text(text = "Refresh") + } + } +} + + +// Bosted code to be deleted: + +/* + + Boosted By: removed because it was ugly + + if (item.event is RepostEvent) { + Row( + modifier = Modifier.padding( + start = 12.dp, + end = 12.dp, + bottom = 8.dp + ), + verticalAlignment = Alignment.CenterVertically + ) { + Icon( + painter = painterResource(R.drawable.ic_retweet), + null, + modifier = Modifier.size(20.dp), + tint = Color.Gray + ) + Text( + text = "Boosted by ${item.author.toBestDisplayName()}", + modifier = Modifier.padding(start = 10.dp), + fontWeight = FontWeight.Bold, + color = Color.Gray, + ) + } + val refNote = item.replyTo.firstOrNull() + if (refNote != null) { + NoteCompose(index, refNote) + } else { + Row( + modifier = Modifier.padding( + start = 40.dp, + end = 40.dp, + bottom = 25.dp, + top = 15.dp + ), + verticalAlignment = Alignment.CenterVertically + ) { + Text( + text = "Could not find referenced event", + modifier = Modifier.padding(30.dp), + color = Color.Gray, + ) + } + } + } else { + NoteCompose(index, item) + }*/ \ No newline at end of file diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedViewModel.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedViewModel.kt new file mode 100644 index 00000000..db3cb174 --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedViewModel.kt @@ -0,0 +1,71 @@ +package com.vitorpamplona.amethyst.ui.screen + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.vitorpamplona.amethyst.model.LocalCache +import com.vitorpamplona.amethyst.model.LocalCacheState +import com.vitorpamplona.amethyst.model.Note +import com.vitorpamplona.amethyst.service.NostrDataSource +import com.vitorpamplona.amethyst.service.model.ReactionEvent +import kotlinx.coroutines.cancel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch + + +class FeedViewModel(val dataSource: NostrDataSource): ViewModel() { + private val _feedContent = MutableStateFlow(FeedState.Loading) + val feedContent = _feedContent.asStateFlow() + + fun refresh() { + // For some reason, view Model Scope doesn't call + viewModelScope.launch { + refreshSuspend() + } + } + + fun refreshSuspend() { + val notes = dataSource.loadTop() + + val oldNotesState = feedContent.value + if (oldNotesState is FeedState.Loaded) { + if (notes != oldNotesState.feed) { + updateFeed(notes) + } + } else { + updateFeed(notes) + } + } + + fun updateFeed(notes: List) { + if (notes.isEmpty()) { + _feedContent.update { FeedState.Empty } + } else { + _feedContent.update { FeedState.Loaded(notes) } + } + } + + fun refreshCurrentList() { + val state = feedContent.value + if (state is FeedState.Loaded) { + _feedContent.update { FeedState.Loaded(state.feed) } + } + } + + private val cacheListener: (LocalCacheState) -> Unit = { + refresh() + } + + init { + LocalCache.live.observeForever(cacheListener) + } + + override fun onCleared() { + LocalCache.live.removeObserver(cacheListener) + + dataSource.stop() + viewModelScope.cancel() + super.onCleared() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/RelayPoolViewModel.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/RelayPoolViewModel.kt new file mode 100644 index 00000000..26c86135 --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/RelayPoolViewModel.kt @@ -0,0 +1,12 @@ +package com.vitorpamplona.amethyst.ui.screen + +import androidx.lifecycle.LiveData +import androidx.lifecycle.Transformations +import androidx.lifecycle.ViewModel +import com.vitorpamplona.amethyst.service.relays.RelayPool + +class RelayPoolViewModel: ViewModel() { + val relayPoolLiveData: LiveData = Transformations.map(RelayPool.live) { + it.relays.report() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/AccountViewModel.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/AccountViewModel.kt new file mode 100644 index 00000000..7fa0aa1e --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/AccountViewModel.kt @@ -0,0 +1,22 @@ +package com.vitorpamplona.amethyst.ui.screen.loggedIn + +import androidx.lifecycle.LiveData +import androidx.lifecycle.Transformations +import androidx.lifecycle.ViewModel +import com.vitorpamplona.amethyst.model.Account +import com.vitorpamplona.amethyst.model.AccountState +import com.vitorpamplona.amethyst.model.Note +import com.vitorpamplona.amethyst.model.UserState + +class AccountViewModel(private val account: Account): ViewModel() { + val accountLiveData: LiveData = Transformations.map(account.live) { it } + val userLiveData: LiveData = Transformations.map(account.userProfile().live) { it } + + fun reactTo(note: Note) { + account.reactTo(note) + } + + fun boost(note: Note) { + account.boost(note) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/HomeScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/HomeScreen.kt new file mode 100644 index 00000000..6f97b1a0 --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/HomeScreen.kt @@ -0,0 +1,32 @@ +package com.vitorpamplona.amethyst.ui.screen + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.padding +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.livedata.observeAsState +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import androidx.lifecycle.compose.ExperimentalLifecycleComposeApi +import androidx.lifecycle.viewmodel.compose.viewModel +import com.vitorpamplona.amethyst.service.NostrHomeDataSource +import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel + +@OptIn(ExperimentalLifecycleComposeApi::class) +@Composable +fun HomeScreen(accountViewModel: AccountViewModel) { + val account by accountViewModel.accountLiveData.observeAsState() + + if (account != null) { + val feedViewModel: FeedViewModel = viewModel { FeedViewModel( NostrHomeDataSource ) } + + Column(Modifier.fillMaxHeight()) { + Column( + modifier = Modifier.padding(vertical = 0.dp) + ) { + FeedView(feedViewModel, accountViewModel) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/MainScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/MainScreen.kt new file mode 100644 index 00000000..668432e7 --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/MainScreen.kt @@ -0,0 +1,74 @@ +package com.vitorpamplona.amethyst.ui.screen + +import androidx.compose.animation.Crossfade +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.statusBarsPadding +import androidx.compose.material.* +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.ui.Modifier +import androidx.lifecycle.compose.ExperimentalLifecycleComposeApi +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import androidx.navigation.NavHostController +import androidx.navigation.compose.rememberNavController +import com.vitorpamplona.amethyst.buttons.NewNoteButton +import com.vitorpamplona.amethyst.ui.navigation.AppBottomBar +import com.vitorpamplona.amethyst.ui.navigation.AppNavigation +import com.vitorpamplona.amethyst.ui.navigation.AppTopBar +import com.vitorpamplona.amethyst.ui.navigation.DrawerContent +import com.vitorpamplona.amethyst.ui.navigation.Route +import com.vitorpamplona.amethyst.ui.navigation.currentRoute +import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel + +@Composable +fun MainScreen(accountViewModel: AccountViewModel, accountStateViewModel: AccountStateViewModel) { + val navController = rememberNavController() + val scaffoldState = rememberScaffoldState(rememberDrawerState(DrawerValue.Closed)) + + Scaffold( + modifier = Modifier + .background(MaterialTheme.colors.primaryVariant) + .statusBarsPadding(), + bottomBar = { + AppBottomBar(navController) + }, + topBar = { + AppTopBar(navController, scaffoldState, accountViewModel) + }, + drawerContent = { + DrawerContent(navController, scaffoldState, accountViewModel, accountStateViewModel) + }, + floatingActionButton = { + FloatingButton(navController, accountStateViewModel) + }, + scaffoldState = scaffoldState + ) { + Column(modifier = Modifier.padding(bottom = it.calculateBottomPadding())) { + AppNavigation(navController, accountViewModel) + } + } +} + +@OptIn(ExperimentalLifecycleComposeApi::class) +@Composable +fun FloatingButton(navController: NavHostController, accountViewModel: AccountStateViewModel) { + val accountState by accountViewModel.accountContent.collectAsStateWithLifecycle() + + if (currentRoute(navController) == Route.Home.route) { + Crossfade(targetState = accountState) { state -> + when (state) { + is AccountState.LoggedInViewOnly -> { + // Does nothing. + } + is AccountState.LoggedOff -> { + // Does nothing. + } + is AccountState.LoggedIn -> { + NewNoteButton(state.account) + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/MessageScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/MessageScreen.kt new file mode 100644 index 00000000..5b2dc24c --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/MessageScreen.kt @@ -0,0 +1,29 @@ +package com.vitorpamplona.amethyst.ui.screen + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.material.Text +import androidx.compose.material.rememberScaffoldState +import androidx.compose.runtime.Composable +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel + +@Composable +fun MessageScreen(accountViewModel: AccountViewModel) { + val state = rememberScaffoldState() + val scope = rememberCoroutineScope() + + Column( + Modifier + .fillMaxHeight() + .fillMaxWidth(), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center, + ) { + Text("Message Screen") + } +} \ No newline at end of file diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/NotificationScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/NotificationScreen.kt new file mode 100644 index 00000000..61cd681f --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/NotificationScreen.kt @@ -0,0 +1,33 @@ +package com.vitorpamplona.amethyst.ui.screen + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.padding +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.livedata.observeAsState +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import androidx.lifecycle.compose.ExperimentalLifecycleComposeApi +import androidx.lifecycle.viewmodel.compose.viewModel +import com.vitorpamplona.amethyst.service.NostrNotificationDataSource +import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel + +@OptIn(ExperimentalLifecycleComposeApi::class) +@Composable +fun NotificationScreen(accountViewModel: AccountViewModel) { + val account by accountViewModel.accountLiveData.observeAsState() + + if (account != null) { + val feedViewModel: CardFeedViewModel = + viewModel { CardFeedViewModel( NostrNotificationDataSource ) } + + Column(Modifier.fillMaxHeight()) { + Column( + modifier = Modifier.padding(vertical = 0.dp) + ) { + CardFeedView(feedViewModel, accountViewModel = accountViewModel) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ProfileScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ProfileScreen.kt new file mode 100644 index 00000000..df3d4c9e --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ProfileScreen.kt @@ -0,0 +1,29 @@ +package com.vitorpamplona.amethyst.ui.screen + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.material.Text +import androidx.compose.material.rememberScaffoldState +import androidx.compose.runtime.Composable +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel + +@Composable +fun ProfileScreen(accountViewModel: AccountViewModel) { + val state = rememberScaffoldState() + val scope = rememberCoroutineScope() + + Column( + Modifier + .fillMaxHeight() + .fillMaxWidth(), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center, + ) { + Text("Profile Screen") + } +} \ No newline at end of file diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/SearchScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/SearchScreen.kt new file mode 100644 index 00000000..c9cbc7ae --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/SearchScreen.kt @@ -0,0 +1,26 @@ +package com.vitorpamplona.amethyst.ui.screen + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.padding +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import androidx.lifecycle.compose.ExperimentalLifecycleComposeApi +import androidx.lifecycle.viewmodel.compose.viewModel +import com.vitorpamplona.amethyst.service.NostrGlobalDataSource +import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel + +@OptIn(ExperimentalLifecycleComposeApi::class) +@Composable +fun SearchScreen(accountViewModel: AccountViewModel) { + val feedViewModel: FeedViewModel = viewModel { FeedViewModel( NostrGlobalDataSource ) } + + Column(Modifier.fillMaxHeight()) { + Column( + modifier = Modifier.padding(vertical = 0.dp) + ) { + FeedView(feedViewModel, accountViewModel) + } + } +} diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedOff/LoginScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedOff/LoginScreen.kt new file mode 100644 index 00000000..8bfc09ce --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedOff/LoginScreen.kt @@ -0,0 +1,104 @@ +package com.vitorpamplona.amethyst.ui.screen + +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.text.ClickableText +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.material.Button +import androidx.compose.material.MaterialTheme +import androidx.compose.material.OutlinedTextField +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.AnnotatedString +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.input.ImeAction +import androidx.compose.ui.text.input.KeyboardType +import androidx.compose.ui.text.input.TextFieldValue +import androidx.compose.ui.text.style.TextDecoration +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import com.vitorpamplona.amethyst.R +import com.vitorpamplona.amethyst.ui.theme.Purple700 + +@Composable +fun LoginPage(accountViewModel: AccountStateViewModel) { + Box(modifier = Modifier.fillMaxSize()) { + ClickableText( + text = AnnotatedString("Generate a new key"), + modifier = Modifier + .align(Alignment.BottomCenter) + .padding(20.dp), + onClick = { accountViewModel.newKey() }, + style = TextStyle( + fontSize = 14.sp, + textDecoration = TextDecoration.Underline, + color = Purple700 + ) + ) + } + Column( + modifier = Modifier.padding(20.dp).fillMaxSize(), + verticalArrangement = Arrangement.Center, + horizontalAlignment = Alignment.CenterHorizontally, + ) { + + val key = remember { mutableStateOf(TextFieldValue("")) } + + Image( + painterResource(id = R.drawable.amethyst_logo), + contentDescription = "App Logo", + modifier = Modifier.size(300.dp), + contentScale = ContentScale.Inside + ) + + Spacer(modifier = Modifier.height(20.dp)) + + //Text(text = "Insert your private or public key (view-only)") + + OutlinedTextField( + value = key.value, + onValueChange = { key.value = it }, + keyboardOptions = KeyboardOptions( + autoCorrect = false, + keyboardType = KeyboardType.Ascii, + imeAction = ImeAction.Next + ), + placeholder = { + Text( + text = "nsec / npub / hex private key", + color = MaterialTheme.colors.onSurface.copy(alpha = 0.32f) + ) + } + ) + + Spacer(modifier = Modifier.height(20.dp)) + + Box(modifier = Modifier.padding(40.dp, 0.dp, 40.dp, 0.dp)) { + Button( + onClick = { accountViewModel.login(key.value.text) }, + shape = RoundedCornerShape(35.dp), + modifier = Modifier + .fillMaxWidth() + .height(50.dp) + ) { + Text(text = "Login") + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/theme/Color.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/theme/Color.kt new file mode 100644 index 00000000..74b3e6c4 --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/theme/Color.kt @@ -0,0 +1,8 @@ +package com.vitorpamplona.amethyst.ui.theme + +import androidx.compose.ui.graphics.Color + +val Purple200 = Color(0xFFBB86FC) +val Purple500 = Color(0xFF6200EE) +val Purple700 = Color(0xFF3700B3) +val Teal200 = Color(0xFF03DAC5) \ No newline at end of file diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/theme/Shape.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/theme/Shape.kt new file mode 100644 index 00000000..809cbc6b --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/theme/Shape.kt @@ -0,0 +1,11 @@ +package com.vitorpamplona.amethyst.ui.theme + +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.Shapes +import androidx.compose.ui.unit.dp + +val Shapes = Shapes( + small = RoundedCornerShape(4.dp), + medium = RoundedCornerShape(4.dp), + large = RoundedCornerShape(0.dp) +) \ No newline at end of file diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/theme/Theme.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/theme/Theme.kt new file mode 100644 index 00000000..b40bbbe3 --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/theme/Theme.kt @@ -0,0 +1,56 @@ +package com.vitorpamplona.amethyst.ui.theme + +import android.app.Activity +import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.material.MaterialTheme +import androidx.compose.material.darkColors +import androidx.compose.material.lightColors +import androidx.compose.runtime.Composable +import androidx.compose.runtime.SideEffect +import androidx.compose.ui.graphics.toArgb +import androidx.compose.ui.platform.LocalView + +private val DarkColorPalette = darkColors( + primary = Purple200, + primaryVariant = Purple700, + secondary = Teal200, +) + +private val LightColorPalette = lightColors( + primary = Purple500, + primaryVariant = Purple700, + secondary = Teal200, + + /* Other default colors to override + background = Color.White, + surface = Color.White, + onPrimary = Color.White, + onSecondary = Color.Black, + onBackground = Color.Black, + onSurface = Color.Black, + */ +) + +@Composable +fun AmethystTheme(darkTheme: Boolean = isSystemInDarkTheme(), content: @Composable () -> Unit) { + val colors = if (darkTheme) { + DarkColorPalette + } else { + LightColorPalette + } + + MaterialTheme( + colors = colors, + typography = Typography, + shapes = Shapes, + content = content + ) + + val view = LocalView.current + if (!view.isInEditMode && darkTheme) { + SideEffect { + val window = (view.context as Activity).window + window.statusBarColor = colors.background.toArgb() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/theme/Type.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/theme/Type.kt new file mode 100644 index 00000000..c5a8ccc9 --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/theme/Type.kt @@ -0,0 +1,28 @@ +package com.vitorpamplona.amethyst.ui.theme + +import androidx.compose.material.Typography +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.FontFamily +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.sp + +// Set of Material typography styles to start with +val Typography = Typography( + body1 = TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Normal, + fontSize = 16.sp + ) + /* Other default text styles to override + button = TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.W500, + fontSize = 14.sp + ), + caption = TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Normal, + fontSize = 12.sp + ) + */ +) \ No newline at end of file diff --git a/app/src/main/res/drawable-hdpi/ic_amethyst.png b/app/src/main/res/drawable-hdpi/ic_amethyst.png new file mode 100644 index 00000000..813f42f7 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_amethyst.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_bookmarks.png b/app/src/main/res/drawable-hdpi/ic_bookmarks.png new file mode 100644 index 00000000..8a7cf8be Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_bookmarks.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_comment.png b/app/src/main/res/drawable-hdpi/ic_comment.png new file mode 100644 index 00000000..0ae259d4 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_comment.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_compose.png b/app/src/main/res/drawable-hdpi/ic_compose.png new file mode 100644 index 00000000..047712d6 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_compose.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_dm.png b/app/src/main/res/drawable-hdpi/ic_dm.png new file mode 100644 index 00000000..a611ebc7 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_dm.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_home.png b/app/src/main/res/drawable-hdpi/ic_home.png new file mode 100644 index 00000000..f0b2cc7a Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_home.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_like.png b/app/src/main/res/drawable-hdpi/ic_like.png new file mode 100644 index 00000000..1ff6f577 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_like.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_liked.png b/app/src/main/res/drawable-hdpi/ic_liked.png new file mode 100644 index 00000000..b5247d64 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_liked.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_lists.png b/app/src/main/res/drawable-hdpi/ic_lists.png new file mode 100644 index 00000000..521f277f Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_lists.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_moments.png b/app/src/main/res/drawable-hdpi/ic_moments.png new file mode 100644 index 00000000..9f211310 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_moments.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_notifications.png b/app/src/main/res/drawable-hdpi/ic_notifications.png new file mode 100644 index 00000000..cd68c7ad Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_notifications.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_profile.png b/app/src/main/res/drawable-hdpi/ic_profile.png new file mode 100644 index 00000000..da70047c Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_profile.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_qrcode.png b/app/src/main/res/drawable-hdpi/ic_qrcode.png new file mode 100644 index 00000000..31b0439c Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_qrcode.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_retweet.png b/app/src/main/res/drawable-hdpi/ic_retweet.png new file mode 100644 index 00000000..89cb87ed Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_retweet.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_retweeted.png b/app/src/main/res/drawable-hdpi/ic_retweeted.png new file mode 100644 index 00000000..c7e2b0ab Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_retweeted.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_search.png b/app/src/main/res/drawable-hdpi/ic_search.png new file mode 100644 index 00000000..353391ca Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_search.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_share.png b/app/src/main/res/drawable-hdpi/ic_share.png new file mode 100644 index 00000000..cd4b166e Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_share.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_theme.png b/app/src/main/res/drawable-hdpi/ic_theme.png new file mode 100644 index 00000000..b2b5876a Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_theme.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_topics.png b/app/src/main/res/drawable-hdpi/ic_topics.png new file mode 100644 index 00000000..1b097381 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_topics.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_trends.png b/app/src/main/res/drawable-hdpi/ic_trends.png new file mode 100644 index 00000000..7fa5184a Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_trends.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_verified.png b/app/src/main/res/drawable-hdpi/ic_verified.png new file mode 100644 index 00000000..994fb02f Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_verified.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_amethyst.png b/app/src/main/res/drawable-mdpi/ic_amethyst.png new file mode 100644 index 00000000..32891ab1 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_amethyst.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_bookmarks.png b/app/src/main/res/drawable-mdpi/ic_bookmarks.png new file mode 100644 index 00000000..ecb040b7 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_bookmarks.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_comment.png b/app/src/main/res/drawable-mdpi/ic_comment.png new file mode 100644 index 00000000..893bb49f Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_comment.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_compose.png b/app/src/main/res/drawable-mdpi/ic_compose.png new file mode 100644 index 00000000..28f42a0c Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_compose.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_dm.png b/app/src/main/res/drawable-mdpi/ic_dm.png new file mode 100644 index 00000000..25bc3ac9 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_dm.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_home.png b/app/src/main/res/drawable-mdpi/ic_home.png new file mode 100644 index 00000000..fd3a0655 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_home.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_like.png b/app/src/main/res/drawable-mdpi/ic_like.png new file mode 100644 index 00000000..babf38b7 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_like.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_liked.png b/app/src/main/res/drawable-mdpi/ic_liked.png new file mode 100644 index 00000000..194ff9f9 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_liked.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_lists.png b/app/src/main/res/drawable-mdpi/ic_lists.png new file mode 100644 index 00000000..e5e10a55 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_lists.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_moments.png b/app/src/main/res/drawable-mdpi/ic_moments.png new file mode 100644 index 00000000..a6e689fb Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_moments.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_notifications.png b/app/src/main/res/drawable-mdpi/ic_notifications.png new file mode 100644 index 00000000..aa8fffa3 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_notifications.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_profile.png b/app/src/main/res/drawable-mdpi/ic_profile.png new file mode 100644 index 00000000..8eec4f1e Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_profile.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_qrcode.png b/app/src/main/res/drawable-mdpi/ic_qrcode.png new file mode 100644 index 00000000..ff1e8916 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_qrcode.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_retweet.png b/app/src/main/res/drawable-mdpi/ic_retweet.png new file mode 100644 index 00000000..0e36ae06 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_retweet.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_retweeted.png b/app/src/main/res/drawable-mdpi/ic_retweeted.png new file mode 100644 index 00000000..39545e50 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_retweeted.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_search.png b/app/src/main/res/drawable-mdpi/ic_search.png new file mode 100644 index 00000000..02672327 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_search.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_share.png b/app/src/main/res/drawable-mdpi/ic_share.png new file mode 100644 index 00000000..f08ff4f5 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_share.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_theme.png b/app/src/main/res/drawable-mdpi/ic_theme.png new file mode 100644 index 00000000..616707d8 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_theme.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_topics.png b/app/src/main/res/drawable-mdpi/ic_topics.png new file mode 100644 index 00000000..aebed8f6 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_topics.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_trends.png b/app/src/main/res/drawable-mdpi/ic_trends.png new file mode 100644 index 00000000..3275536a Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_trends.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_verified.png b/app/src/main/res/drawable-mdpi/ic_verified.png new file mode 100644 index 00000000..8a70ec1d Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_verified.png differ diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 00000000..2b068d11 --- /dev/null +++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable-xhdpi/ic_amethyst.png b/app/src/main/res/drawable-xhdpi/ic_amethyst.png new file mode 100644 index 00000000..21f7a7d2 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_amethyst.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_bookmarks.png b/app/src/main/res/drawable-xhdpi/ic_bookmarks.png new file mode 100644 index 00000000..5b04fca6 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_bookmarks.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_comment.png b/app/src/main/res/drawable-xhdpi/ic_comment.png new file mode 100644 index 00000000..6687355e Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_comment.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_compose.png b/app/src/main/res/drawable-xhdpi/ic_compose.png new file mode 100644 index 00000000..323e9d50 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_compose.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_dm.png b/app/src/main/res/drawable-xhdpi/ic_dm.png new file mode 100644 index 00000000..2c56264d Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_dm.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_home.png b/app/src/main/res/drawable-xhdpi/ic_home.png new file mode 100644 index 00000000..15a0e17d Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_home.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_like.png b/app/src/main/res/drawable-xhdpi/ic_like.png new file mode 100644 index 00000000..89dc58fd Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_like.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_liked.png b/app/src/main/res/drawable-xhdpi/ic_liked.png new file mode 100644 index 00000000..d6f1bb5c Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_liked.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_lists.png b/app/src/main/res/drawable-xhdpi/ic_lists.png new file mode 100644 index 00000000..92f7f235 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_lists.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_moments.png b/app/src/main/res/drawable-xhdpi/ic_moments.png new file mode 100644 index 00000000..cadbb748 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_moments.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_notifications.png b/app/src/main/res/drawable-xhdpi/ic_notifications.png new file mode 100644 index 00000000..4fe3bcbf Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_notifications.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_profile.png b/app/src/main/res/drawable-xhdpi/ic_profile.png new file mode 100644 index 00000000..67c2513f Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_profile.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_qrcode.png b/app/src/main/res/drawable-xhdpi/ic_qrcode.png new file mode 100644 index 00000000..e6f4bb45 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_qrcode.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_retweet.png b/app/src/main/res/drawable-xhdpi/ic_retweet.png new file mode 100644 index 00000000..dbcd7480 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_retweet.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_retweeted.png b/app/src/main/res/drawable-xhdpi/ic_retweeted.png new file mode 100644 index 00000000..2b1222f9 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_retweeted.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_search.png b/app/src/main/res/drawable-xhdpi/ic_search.png new file mode 100644 index 00000000..1da2ab0b Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_search.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_share.png b/app/src/main/res/drawable-xhdpi/ic_share.png new file mode 100644 index 00000000..97c9b2e9 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_share.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_theme.png b/app/src/main/res/drawable-xhdpi/ic_theme.png new file mode 100644 index 00000000..59b9eeee Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_theme.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_topics.png b/app/src/main/res/drawable-xhdpi/ic_topics.png new file mode 100644 index 00000000..f235e5d2 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_topics.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_trends.png b/app/src/main/res/drawable-xhdpi/ic_trends.png new file mode 100644 index 00000000..fb979bb7 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_trends.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_verified.png b/app/src/main/res/drawable-xhdpi/ic_verified.png new file mode 100644 index 00000000..27ee31f9 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_verified.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_amethyst.png b/app/src/main/res/drawable-xxhdpi/ic_amethyst.png new file mode 100644 index 00000000..0fa65e03 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_amethyst.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_bookmarks.png b/app/src/main/res/drawable-xxhdpi/ic_bookmarks.png new file mode 100644 index 00000000..b810d48c Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_bookmarks.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_comment.png b/app/src/main/res/drawable-xxhdpi/ic_comment.png new file mode 100644 index 00000000..b73c0d88 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_comment.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_compose.png b/app/src/main/res/drawable-xxhdpi/ic_compose.png new file mode 100644 index 00000000..de56c926 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_compose.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_dm.png b/app/src/main/res/drawable-xxhdpi/ic_dm.png new file mode 100644 index 00000000..bfccc81e Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_dm.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_home.png b/app/src/main/res/drawable-xxhdpi/ic_home.png new file mode 100644 index 00000000..95134129 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_home.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_like.png b/app/src/main/res/drawable-xxhdpi/ic_like.png new file mode 100644 index 00000000..0ad7f67c Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_like.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_liked.png b/app/src/main/res/drawable-xxhdpi/ic_liked.png new file mode 100644 index 00000000..ab0b6d88 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_liked.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_lists.png b/app/src/main/res/drawable-xxhdpi/ic_lists.png new file mode 100644 index 00000000..a8ae988a Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_lists.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_moments.png b/app/src/main/res/drawable-xxhdpi/ic_moments.png new file mode 100644 index 00000000..6d3b8233 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_moments.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_notifications.png b/app/src/main/res/drawable-xxhdpi/ic_notifications.png new file mode 100644 index 00000000..ef693ff9 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_notifications.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_profile.png b/app/src/main/res/drawable-xxhdpi/ic_profile.png new file mode 100644 index 00000000..118d4eb7 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_profile.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_qrcode.png b/app/src/main/res/drawable-xxhdpi/ic_qrcode.png new file mode 100644 index 00000000..c35c205d Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_qrcode.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_retweet.png b/app/src/main/res/drawable-xxhdpi/ic_retweet.png new file mode 100644 index 00000000..ec694172 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_retweet.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_retweeted.png b/app/src/main/res/drawable-xxhdpi/ic_retweeted.png new file mode 100644 index 00000000..5a3025a5 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_retweeted.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_search.png b/app/src/main/res/drawable-xxhdpi/ic_search.png new file mode 100644 index 00000000..1b101887 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_search.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_share.png b/app/src/main/res/drawable-xxhdpi/ic_share.png new file mode 100644 index 00000000..63728b0e Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_share.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_theme.png b/app/src/main/res/drawable-xxhdpi/ic_theme.png new file mode 100644 index 00000000..d58f977f Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_theme.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_topics.png b/app/src/main/res/drawable-xxhdpi/ic_topics.png new file mode 100644 index 00000000..d65cc49b Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_topics.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_trends.png b/app/src/main/res/drawable-xxhdpi/ic_trends.png new file mode 100644 index 00000000..858746bb Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_trends.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_verified.png b/app/src/main/res/drawable-xxhdpi/ic_verified.png new file mode 100644 index 00000000..76f53908 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_verified.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/amethyst_logo.png b/app/src/main/res/drawable-xxxhdpi/amethyst_logo.png new file mode 100644 index 00000000..b869584e Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/amethyst_logo.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_amethyst.png b/app/src/main/res/drawable-xxxhdpi/ic_amethyst.png new file mode 100644 index 00000000..1842fce4 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_amethyst.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_bookmarks.png b/app/src/main/res/drawable-xxxhdpi/ic_bookmarks.png new file mode 100644 index 00000000..165366df Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_bookmarks.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_comment.png b/app/src/main/res/drawable-xxxhdpi/ic_comment.png new file mode 100644 index 00000000..924df613 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_comment.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_compose.png b/app/src/main/res/drawable-xxxhdpi/ic_compose.png new file mode 100644 index 00000000..f14f01ab Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_compose.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_dm.png b/app/src/main/res/drawable-xxxhdpi/ic_dm.png new file mode 100644 index 00000000..9172d971 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_dm.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_home.png b/app/src/main/res/drawable-xxxhdpi/ic_home.png new file mode 100644 index 00000000..4809c13c Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_home.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_like.png b/app/src/main/res/drawable-xxxhdpi/ic_like.png new file mode 100644 index 00000000..2883a642 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_like.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_liked.png b/app/src/main/res/drawable-xxxhdpi/ic_liked.png new file mode 100644 index 00000000..526a7080 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_liked.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_lists.png b/app/src/main/res/drawable-xxxhdpi/ic_lists.png new file mode 100644 index 00000000..e0036399 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_lists.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_moments.png b/app/src/main/res/drawable-xxxhdpi/ic_moments.png new file mode 100644 index 00000000..cc2d6490 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_moments.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_notifications.png b/app/src/main/res/drawable-xxxhdpi/ic_notifications.png new file mode 100644 index 00000000..98130ffe Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_notifications.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_profile.png b/app/src/main/res/drawable-xxxhdpi/ic_profile.png new file mode 100644 index 00000000..ee8bcf94 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_profile.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_qrcode.png b/app/src/main/res/drawable-xxxhdpi/ic_qrcode.png new file mode 100644 index 00000000..bffe18dc Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_qrcode.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_retweet.png b/app/src/main/res/drawable-xxxhdpi/ic_retweet.png new file mode 100644 index 00000000..afe333ed Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_retweet.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_retweeted.png b/app/src/main/res/drawable-xxxhdpi/ic_retweeted.png new file mode 100644 index 00000000..4306931b Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_retweeted.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_search.png b/app/src/main/res/drawable-xxxhdpi/ic_search.png new file mode 100644 index 00000000..9c50ac7b Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_search.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_share.png b/app/src/main/res/drawable-xxxhdpi/ic_share.png new file mode 100644 index 00000000..1b556d7d Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_share.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_theme.png b/app/src/main/res/drawable-xxxhdpi/ic_theme.png new file mode 100644 index 00000000..432b8953 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_theme.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_topics.png b/app/src/main/res/drawable-xxxhdpi/ic_topics.png new file mode 100644 index 00000000..c40d9f9a Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_topics.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_trends.png b/app/src/main/res/drawable-xxxhdpi/ic_trends.png new file mode 100644 index 00000000..b7a948c4 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_trends.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_verified.png b/app/src/main/res/drawable-xxxhdpi/ic_verified.png new file mode 100644 index 00000000..8213c188 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_verified.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/profile_banner.jpeg b/app/src/main/res/drawable-xxxhdpi/profile_banner.jpeg new file mode 100644 index 00000000..ee5baffe Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/profile_banner.jpeg differ diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 00000000..07d5da9c --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 00000000..eca70cfe --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 00000000..eca70cfe --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/app/src/main/res/mipmap-hdpi/ic_launcher.webp new file mode 100644 index 00000000..c209e78e Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp new file mode 100644 index 00000000..b2dfe3d1 Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/app/src/main/res/mipmap-mdpi/ic_launcher.webp new file mode 100644 index 00000000..4f0f1d64 Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp new file mode 100644 index 00000000..62b611da Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher.webp new file mode 100644 index 00000000..948a3070 Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp new file mode 100644 index 00000000..1b9a6956 Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp new file mode 100644 index 00000000..28d4b77f Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp new file mode 100644 index 00000000..9287f508 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp new file mode 100644 index 00000000..aa7d6427 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp new file mode 100644 index 00000000..9126ae37 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml new file mode 100644 index 00000000..0589574d --- /dev/null +++ b/app/src/main/res/values-night/themes.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml new file mode 100644 index 00000000..f8c6127d --- /dev/null +++ b/app/src/main/res/values/colors.xml @@ -0,0 +1,10 @@ + + + #FFBB86FC + #FF6200EE + #FF3700B3 + #FF03DAC5 + #FF018786 + #FF000000 + #FFFFFFFF + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml new file mode 100644 index 00000000..e296a558 --- /dev/null +++ b/app/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + Amethyst + \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml new file mode 100644 index 00000000..e3dcd4fc --- /dev/null +++ b/app/src/main/res/values/themes.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/backup_rules.xml b/app/src/main/res/xml/backup_rules.xml new file mode 100644 index 00000000..fa0f996d --- /dev/null +++ b/app/src/main/res/xml/backup_rules.xml @@ -0,0 +1,13 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/data_extraction_rules.xml b/app/src/main/res/xml/data_extraction_rules.xml new file mode 100644 index 00000000..9ee9997b --- /dev/null +++ b/app/src/main/res/xml/data_extraction_rules.xml @@ -0,0 +1,19 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/test/java/com/vitorpamplona/amethyst/ExampleUnitTest.kt b/app/src/test/java/com/vitorpamplona/amethyst/ExampleUnitTest.kt new file mode 100644 index 00000000..664fbe1d --- /dev/null +++ b/app/src/test/java/com/vitorpamplona/amethyst/ExampleUnitTest.kt @@ -0,0 +1,17 @@ +package com.vitorpamplona.amethyst + +import org.junit.Test + +import org.junit.Assert.* + +/** + * Example local unit test, which will execute on the development machine (host). + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +class ExampleUnitTest { + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} \ No newline at end of file diff --git a/build.gradle b/build.gradle new file mode 100644 index 00000000..c22aaf30 --- /dev/null +++ b/build.gradle @@ -0,0 +1,13 @@ +buildscript { + ext { + compose_ui_version = '1.3.2' + nav_version = "2.5.3" + room_version = "2.4.3" + } +}// Top-level build file where you can add configuration options common to all sub-projects/modules. +plugins { + id 'com.android.application' version '7.3.1' apply false + id 'com.android.library' version '7.3.1' apply false + id 'org.jetbrains.kotlin.android' version '1.6.10' apply false + id 'org.jetbrains.kotlin.jvm' version '1.7.20' apply false +} \ No newline at end of file diff --git a/deps.txt b/deps.txt new file mode 100644 index 00000000..9cb0db71 --- /dev/null +++ b/deps.txt @@ -0,0 +1,4330 @@ + +> Task :app:dependencies + +------------------------------------------------------------ +Project ':app' +------------------------------------------------------------ + +androidApis - Configuration providing various types of Android JAR file +No dependencies + +androidJacocoAnt - The Jacoco agent to use to get coverage data. +\--- org.jacoco:org.jacoco.ant:0.8.7 + +--- org.jacoco:org.jacoco.core:0.8.7 + | +--- org.ow2.asm:asm:9.1 + | +--- org.ow2.asm:asm-commons:9.1 + | | +--- org.ow2.asm:asm:9.1 + | | +--- org.ow2.asm:asm-tree:9.1 + | | | \--- org.ow2.asm:asm:9.1 + | | \--- org.ow2.asm:asm-analysis:9.1 + | | \--- org.ow2.asm:asm-tree:9.1 (*) + | \--- org.ow2.asm:asm-tree:9.1 (*) + +--- org.jacoco:org.jacoco.report:0.8.7 + | \--- org.jacoco:org.jacoco.core:0.8.7 (*) + \--- org.jacoco:org.jacoco.agent:0.8.7 + +androidJdkImage - Configuration providing JDK image for compiling Java 9+ sources +No dependencies + +androidTestAnnotationProcessor - Classpath for the annotation processor for 'androidTest'. (n) +No dependencies + +androidTestApi (n) +No dependencies + +androidTestApiDependenciesMetadata +No dependencies + +androidTestCompileOnly - Compile only dependencies for 'androidTest' sources. (n) +No dependencies + +androidTestCompileOnlyDependenciesMetadata +No dependencies + +androidTestDebugAnnotationProcessor - Classpath for the annotation processor for 'androidTestDebug'. (n) +No dependencies + +androidTestDebugApi (n) +No dependencies + +androidTestDebugApiDependenciesMetadata +No dependencies + +androidTestDebugCompileOnly - Compile only dependencies for 'androidTestDebug' sources. (n) +No dependencies + +androidTestDebugCompileOnlyDependenciesMetadata +No dependencies + +androidTestDebugImplementation - Implementation only dependencies for 'androidTestDebug' sources. (n) +No dependencies + +androidTestDebugImplementationDependenciesMetadata +No dependencies + +androidTestDebugIntransitiveDependenciesMetadata +No dependencies + +androidTestDebugRuntimeOnly - Runtime only dependencies for 'androidTestDebug' sources. (n) +No dependencies + +androidTestDebugRuntimeOnlyDependenciesMetadata +No dependencies + +androidTestDebugWearApp - Link to a wear app to embed for object 'androidTestDebug'. (n) +No dependencies + +androidTestImplementation - Implementation only dependencies for 'androidTest' sources. (n) ++--- androidx.test.ext:junit:1.1.5 (n) ++--- androidx.test.espresso:espresso-core:3.5.1 (n) +\--- androidx.compose.ui:ui-test-junit4:1.3.2 (n) + +androidTestImplementationDependenciesMetadata ++--- androidx.test.ext:junit:1.1.5 +| +--- junit:junit:4.13.2 +| | \--- org.hamcrest:hamcrest-core:1.3 +| +--- androidx.test:core:1.5.0 +| | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 +| | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10 +| | | \--- org.jetbrains:annotations:13.0 +| | +--- androidx.test:monitor:1.6.0 -> 1.6.1 +| | | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) +| | | +--- androidx.test:annotation:1.0.1 +| | | | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) +| | | | \--- androidx.annotation:annotation-experimental:1.1.0 +| | | \--- androidx.tracing:tracing:1.0.0 +| | +--- androidx.test.services:storage:1.4.2 +| | | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) +| | | +--- androidx.test:monitor:1.6.0 -> 1.6.1 (*) +| | | +--- com.google.code.findbugs:jsr305:2.0.2 +| | | \--- androidx.test:annotation:1.0.1 (*) +| | +--- androidx.lifecycle:lifecycle-common:2.3.1 +| | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | +--- androidx.tracing:tracing:1.0.0 +| | +--- com.google.guava:listenablefuture:1.0 +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 (*) +| | \--- androidx.concurrent:concurrent-futures:1.1.0 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | \--- com.google.guava:listenablefuture:1.0 +| +--- androidx.test:monitor:1.6.1 (*) +| \--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) ++--- androidx.test.espresso:espresso-core:3.5.1 +| +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) +| +--- androidx.test:core:1.5.0 (*) +| +--- androidx.test:runner:1.5.2 +| | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) +| | +--- androidx.test:annotation:1.0.1 (*) +| | +--- androidx.test:monitor:1.6.1 (*) +| | +--- androidx.test.services:storage:1.4.2 (*) +| | +--- androidx.tracing:tracing:1.0.0 +| | \--- junit:junit:4.13.2 (*) +| +--- androidx.test.espresso:espresso-idling-resource:3.5.1 +| +--- com.squareup:javawriter:2.1.1 +| +--- javax.inject:javax.inject:1 +| +--- org.hamcrest:hamcrest-library:1.3 +| | \--- org.hamcrest:hamcrest-core:1.3 +| +--- org.hamcrest:hamcrest-integration:1.3 +| | \--- org.hamcrest:hamcrest-library:1.3 (*) +| +--- com.google.code.findbugs:jsr305:2.0.2 +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 (*) +| \--- androidx.test:annotation:1.0.1 (*) +\--- androidx.compose.ui:ui-test-junit4:1.3.2 + +--- androidx.activity:activity:1.2.0 + | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) + | +--- androidx.core:core:1.1.0 + | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) + | | +--- androidx.lifecycle:lifecycle-runtime:2.0.0 -> 2.3.0 + | | | +--- androidx.lifecycle:lifecycle-common:2.3.0 -> 2.3.1 (*) + | | | +--- androidx.arch.core:core-common:2.1.0 + | | | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) + | | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) + | | +--- androidx.versionedparcelable:versionedparcelable:1.1.0 + | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) + | | | \--- androidx.collection:collection:1.0.0 + | | | \--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*) + | | \--- androidx.collection:collection:1.0.0 (*) + | +--- androidx.lifecycle:lifecycle-runtime:2.3.0 (*) + | +--- androidx.lifecycle:lifecycle-viewmodel:2.3.0 + | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) + | +--- androidx.savedstate:savedstate:1.1.0 + | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) + | \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.3.0 + | +--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*) + | +--- androidx.savedstate:savedstate:1.1.0 (*) + | +--- androidx.lifecycle:lifecycle-livedata-core:2.3.0 + | | \--- androidx.lifecycle:lifecycle-common:2.3.0 -> 2.3.1 (*) + | \--- androidx.lifecycle:lifecycle-viewmodel:2.3.0 (*) + +--- androidx.compose.ui:ui-test:1.3.2 + | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 + | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 + | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 + | | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.10 + | | | \--- org.jetbrains.kotlinx:atomicfu:0.17.3 + | | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.20 -> 1.7.10 + | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4 + | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (c) + | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (c) + | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.4 (c) + | | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 + | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.10 (*) + | | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.6.21 + | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.10 (*) + | +--- androidx.compose.ui:ui:1.3.2 + | | +--- androidx.annotation:annotation:1.5.0 (*) + | | +--- androidx.compose.runtime:runtime-saveable:1.3.2 + | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) + | | | \--- androidx.compose.runtime:runtime:1.3.2 (*) + | | +--- androidx.compose.ui:ui-geometry:1.3.2 + | | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) + | | +--- androidx.compose.ui:ui-graphics:1.3.2 + | | | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) + | | | \--- androidx.compose.ui:ui-unit:1.3.2 + | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) + | | | \--- androidx.compose.ui:ui-geometry:1.3.2 (*) + | | +--- androidx.compose.ui:ui-text:1.3.2 + | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) + | | | +--- androidx.compose.ui:ui-graphics:1.3.2 (*) + | | | \--- androidx.compose.ui:ui-unit:1.3.2 (*) + | | \--- androidx.compose.ui:ui-unit:1.3.2 (*) + | +--- androidx.compose.ui:ui-graphics:1.3.2 (*) + | +--- androidx.compose.ui:ui-text:1.3.2 (*) + | +--- androidx.compose.ui:ui-unit:1.3.2 (*) + | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 (*) + | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10 + | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (*) + | \--- org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.4 + | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (*) + | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.10 + | \--- org.jetbrains.kotlinx:atomicfu:0.17.3 (*) + +--- androidx.test.ext:junit:1.1.3 -> 1.1.5 (*) + +--- junit:junit:4.13.2 (*) + +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 (*) + \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10 + +androidTestIntransitiveDependenciesMetadata +No dependencies + +androidTestReleaseAnnotationProcessor - Classpath for the annotation processor for 'androidTestRelease'. (n) +No dependencies + +androidTestReleaseApi (n) +No dependencies + +androidTestReleaseApiDependenciesMetadata +No dependencies + +androidTestReleaseCompileOnly - Compile only dependencies for 'androidTestRelease' sources. (n) +No dependencies + +androidTestReleaseCompileOnlyDependenciesMetadata +No dependencies + +androidTestReleaseImplementation - Implementation only dependencies for 'androidTestRelease' sources. (n) +No dependencies + +androidTestReleaseImplementationDependenciesMetadata +No dependencies + +androidTestReleaseIntransitiveDependenciesMetadata +No dependencies + +androidTestReleaseRuntimeOnly - Runtime only dependencies for 'androidTestRelease' sources. (n) +No dependencies + +androidTestReleaseRuntimeOnlyDependenciesMetadata +No dependencies + +androidTestReleaseWearApp - Link to a wear app to embed for object 'androidTestRelease'. (n) +No dependencies + +androidTestRuntimeOnly - Runtime only dependencies for 'androidTest' sources. (n) +No dependencies + +androidTestRuntimeOnlyDependenciesMetadata +No dependencies + +androidTestUtil - Additional APKs used during instrumentation testing. +No dependencies + +androidTestWearApp - Link to a wear app to embed for object 'androidTest'. (n) +No dependencies + +annotationProcessor - Classpath for the annotation processor for 'main'. (n) +No dependencies + +api - API dependencies for 'main' sources. (n) +No dependencies + +apiDependenciesMetadata +\--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.20 + +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20 + | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.20 + | \--- org.jetbrains:annotations:13.0 + \--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.20 + \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20 (*) + +archives - Configuration for archive artifacts. (n) +No dependencies + +compileOnly - Compile only dependencies for 'main' sources. (n) +No dependencies + +compileOnlyDependenciesMetadata +No dependencies + +coreLibraryDesugaring - Configuration to desugar libraries +No dependencies + +debugAabPublication - Bundle Publication for debug (n) +No dependencies + +debugAndroidTestAnnotationProcessorClasspath - Resolved configuration for annotation-processor for variant: debugAndroidTest +No dependencies + +debugAndroidTestApi - API dependencies for compilation 'debugAndroidTest' (target (androidJvm)). (n) +No dependencies + +debugAndroidTestApiDependenciesMetadata +No dependencies + +debugAndroidTestCompileClasspath - Compile classpath for compilation 'debugAndroidTest' (target (androidJvm)). ++--- androidx.test.ext:junit:1.1.5 +| +--- junit:junit:4.13.2 +| | \--- org.hamcrest:hamcrest-core:1.3 +| +--- androidx.test:core:1.5.0 +| | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 +| | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.20 +| | | \--- org.jetbrains:annotations:13.0 +| | +--- androidx.test:monitor:1.6.0 -> 1.6.1 +| | | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) +| | | +--- androidx.test:annotation:1.0.1 +| | | | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) +| | | | \--- androidx.annotation:annotation-experimental:1.1.0 -> 1.3.0 +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | | \--- androidx.tracing:tracing:1.0.0 +| | +--- androidx.test.services:storage:1.4.2 +| | | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) +| | | +--- androidx.test:monitor:1.6.0 -> 1.6.1 (*) +| | | +--- com.google.code.findbugs:jsr305:2.0.2 +| | | \--- androidx.test:annotation:1.0.1 (*) +| | +--- androidx.lifecycle:lifecycle-common:2.3.1 -> 2.5.1 +| | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | +--- androidx.tracing:tracing:1.0.0 +| | +--- com.google.guava:listenablefuture:1.0 +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | \--- androidx.concurrent:concurrent-futures:1.1.0 -> 1.0.0 +| | +--- com.google.guava:listenablefuture:1.0 +| | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| +--- androidx.test:monitor:1.6.1 (*) +| \--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) ++--- androidx.test.espresso:espresso-core:3.5.1 +| +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) +| +--- androidx.test:core:1.5.0 (*) +| +--- androidx.test:runner:1.5.2 +| | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) +| | +--- androidx.test:annotation:1.0.1 (*) +| | +--- androidx.test:monitor:1.6.1 (*) +| | +--- androidx.test.services:storage:1.4.2 (*) +| | +--- androidx.tracing:tracing:1.0.0 +| | \--- junit:junit:4.13.2 (*) +| +--- androidx.test.espresso:espresso-idling-resource:3.5.1 +| +--- com.squareup:javawriter:2.1.1 +| +--- javax.inject:javax.inject:1 +| +--- org.hamcrest:hamcrest-library:1.3 +| | \--- org.hamcrest:hamcrest-core:1.3 +| +--- org.hamcrest:hamcrest-integration:1.3 +| | \--- org.hamcrest:hamcrest-library:1.3 (*) +| +--- com.google.code.findbugs:jsr305:2.0.2 +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| \--- androidx.test:annotation:1.0.1 (*) ++--- androidx.compose.ui:ui-test-junit4:1.3.2 +| +--- androidx.activity:activity:1.2.0 -> 1.6.1 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | +--- androidx.core:core:1.8.0 -> 1.9.0 +| | | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) +| | | +--- androidx.annotation:annotation-experimental:1.3.0 (*) +| | | +--- androidx.lifecycle:lifecycle-runtime:2.3.1 -> 2.5.1 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | +--- androidx.arch.core:core-common:2.1.0 +| | | | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | \--- androidx.lifecycle:lifecycle-common:2.5.1 (*) +| | | \--- androidx.versionedparcelable:versionedparcelable:1.1.1 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | \--- androidx.collection:collection:1.0.0 -> 1.2.0 +| | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | +--- androidx.lifecycle:lifecycle-runtime:2.5.1 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 +| | | +--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*) +| | | +--- androidx.core:core-ktx:1.2.0 -> 1.9.0 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | +--- androidx.core:core:1.9.0 (*) +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | | +--- androidx.lifecycle:lifecycle-livedata-core:2.5.1 +| | | | \--- androidx.lifecycle:lifecycle-common:2.5.1 (*) +| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 (*) +| | | +--- androidx.savedstate:savedstate:1.2.0 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 +| | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.4 +| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4 +| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (c) +| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.4 (c) +| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (c) +| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-test-jvm:1.6.4 (c) +| | | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.4 (c) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20 (*) +| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.20 +| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20 (*) +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.20 +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*) +| | +--- androidx.savedstate:savedstate:1.2.0 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| +--- androidx.compose.ui:ui-test:1.3.2 +| | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 +| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (*) +| | +--- androidx.compose.ui:ui:1.3.2 +| | | +--- androidx.annotation:annotation:1.5.0 (*) +| | | +--- androidx.compose.runtime:runtime-saveable:1.3.2 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | \--- androidx.compose.runtime:runtime:1.3.2 (*) +| | | +--- androidx.compose.ui:ui-geometry:1.3.2 +| | | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | +--- androidx.compose.ui:ui-graphics:1.3.2 +| | | | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) +| | | | \--- androidx.compose.ui:ui-unit:1.3.2 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | \--- androidx.compose.ui:ui-geometry:1.3.2 (*) +| | | +--- androidx.compose.ui:ui-text:1.3.2 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | +--- androidx.compose.ui:ui-graphics:1.3.2 (*) +| | | | \--- androidx.compose.ui:ui-unit:1.3.2 (*) +| | | \--- androidx.compose.ui:ui-unit:1.3.2 (*) +| | +--- androidx.compose.ui:ui-graphics:1.3.2 (*) +| | +--- androidx.compose.ui:ui-text:1.3.2 (*) +| | +--- androidx.compose.ui:ui-unit:1.3.2 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10 -> 1.7.20 +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (*) +| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.4 +| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-test-jvm:1.6.4 +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.20 +| +--- androidx.test.ext:junit:1.1.3 -> 1.1.5 (*) +| +--- junit:junit:4.13.2 (*) +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10 -> 1.7.20 ++--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.20 (*) ++--- project :app (*) ++--- androidx.test.ext:junit:{strictly 1.1.5} -> 1.1.5 (c) ++--- androidx.test.espresso:espresso-core:{strictly 3.5.1} -> 3.5.1 (c) ++--- androidx.compose.ui:ui-test-junit4:{strictly 1.3.2} -> 1.3.2 (c) ++--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:{strictly 1.7.20} -> 1.7.20 (c) ++--- androidx.compose.ui:ui-tooling:1.3.2 +| +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*) +| +--- androidx.compose.ui:ui:1.3.2 (*) +| +--- androidx.compose.ui:ui-tooling-data:1.3.2 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | +--- androidx.compose.runtime:runtime:1.2.0 -> 1.3.2 (*) +| | \--- androidx.compose.ui:ui:1.3.2 (*) +| \--- androidx.compose.ui:ui-tooling-preview:1.3.2 +| +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) +| \--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*) ++--- androidx.compose.ui:ui-test-manifest:1.3.2 +| \--- androidx.activity:activity:1.2.0 -> 1.6.1 (*) ++--- androidx.core:core-ktx:1.9.0 (*) ++--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 +| +--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*) +| +--- androidx.lifecycle:lifecycle-runtime:2.5.1 (*) +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 (*) ++--- androidx.activity:activity-compose:1.6.1 +| +--- androidx.activity:activity-ktx:1.6.1 +| | +--- androidx.activity:activity:1.6.1 (*) +| | +--- androidx.core:core-ktx:1.1.0 -> 1.9.0 (*) +| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 +| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 (*) +| | +--- androidx.savedstate:savedstate-ktx:1.2.0 +| | | +--- androidx.savedstate:savedstate:1.2.0 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2 (*) +| +--- androidx.compose.runtime:runtime-saveable:1.0.1 -> 1.3.2 (*) +| \--- androidx.compose.ui:ui:1.0.1 -> 1.3.2 (*) ++--- androidx.compose.ui:ui:1.3.2 (*) ++--- androidx.compose.ui:ui-tooling-preview:1.3.2 (*) ++--- androidx.compose.material:material:1.3.1 +| +--- androidx.compose.animation:animation-core:1.0.0 -> 1.1.1 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.2 -> 1.6.4 (*) +| +--- androidx.compose.foundation:foundation:1.2.0 -> 1.2.1 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | +--- androidx.compose.animation:animation:1.1.1 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | +--- androidx.compose.animation:animation-core:1.1.1 (*) +| | | +--- androidx.compose.foundation:foundation-layout:1.0.0 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | \--- androidx.compose.ui:ui:1.0.0 -> 1.3.2 (*) +| | | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*) +| | | +--- androidx.compose.ui:ui:1.0.0 -> 1.3.2 (*) +| | | \--- androidx.compose.ui:ui-geometry:1.0.0 -> 1.3.2 (*) +| | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.3.2 (*) +| | \--- androidx.compose.ui:ui:1.2.1 -> 1.3.2 (*) +| +--- androidx.compose.material:material-icons-core:1.3.1 +| | \--- androidx.compose.ui:ui:1.0.0 -> 1.3.2 (*) +| +--- androidx.compose.material:material-ripple:1.3.1 +| | +--- androidx.compose.foundation:foundation:1.1.1 -> 1.2.1 (*) +| | \--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*) +| +--- androidx.compose.runtime:runtime:1.2.0 -> 1.3.2 (*) +| +--- androidx.compose.ui:ui:1.2.0 -> 1.3.2 (*) +| \--- androidx.compose.ui:ui-text:1.2.0 -> 1.3.2 (*) ++--- androidx.navigation:navigation-compose:2.5.3 +| +--- androidx.activity:activity-compose:1.5.1 -> 1.6.1 (*) +| +--- androidx.compose.animation:animation:1.0.1 -> 1.1.1 (*) +| +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2 (*) +| +--- androidx.compose.runtime:runtime-saveable:1.0.1 -> 1.3.2 (*) +| +--- androidx.compose.ui:ui:1.0.1 -> 1.3.2 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.5.1 +| | +--- androidx.annotation:annotation-experimental:1.1.0 -> 1.3.0 (*) +| | +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2 (*) +| | +--- androidx.compose.ui:ui:1.0.1 -> 1.3.2 (*) +| | +--- androidx.lifecycle:lifecycle-common-java8:2.5.1 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | \--- androidx.lifecycle:lifecycle-common:2.5.1 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 (*) +| | \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 (*) +| \--- androidx.navigation:navigation-runtime-ktx:2.5.3 +| +--- androidx.navigation:navigation-common-ktx:2.5.3 +| | \--- androidx.navigation:navigation-common:2.5.3 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 (*) +| | +--- androidx.savedstate:savedstate-ktx:1.2.0 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| \--- androidx.navigation:navigation-runtime:2.5.3 +| +--- androidx.activity:activity-ktx:1.5.1 -> 1.6.1 (*) +| +--- androidx.annotation:annotation-experimental:1.1.0 -> 1.3.0 (*) +| +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 (*) +| +--- androidx.navigation:navigation-common:2.5.3 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) ++--- io.coil-kt:coil-compose:2.2.2 +| +--- io.coil-kt:coil-compose-base:2.2.2 +| | +--- io.coil-kt:coil-base:2.2.2 +| | | +--- androidx.lifecycle:lifecycle-runtime:2.4.1 -> 2.5.1 (*) +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10 -> 1.7.20 (*) +| | | +--- com.squareup.okhttp3:okhttp:4.10.0 +| | | | +--- com.squareup.okio:okio:3.0.0 -> 3.2.0 +| | | | | \--- com.squareup.okio:okio-jvm:3.2.0 +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.20 -> 1.7.20 (*) +| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.20 -> 1.7.20 +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*) +| | | \--- com.squareup.okio:okio:3.2.0 (*) +| | \--- androidx.compose.foundation:foundation:1.2.1 (*) +| \--- io.coil-kt:coil:2.2.2 +| \--- io.coil-kt:coil-base:2.2.2 (*) ++--- fr.acinq.secp256k1:secp256k1-kmp-jni-android:0.7.0 +| +--- fr.acinq.secp256k1:secp256k1-kmp-jni-common:0.7.0 +| | +--- fr.acinq.secp256k1:secp256k1-kmp:0.7.0 +| | | \--- fr.acinq.secp256k1:secp256k1-kmp-jvm:0.7.0 +| | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.20 +| | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*) ++--- com.github.Giszmo.NostrPostr:nostrpostrlib:master-SNAPSHOT ++--- androidx.core:core-ktx:{strictly 1.9.0} -> 1.9.0 (c) ++--- androidx.lifecycle:lifecycle-runtime-ktx:{strictly 2.5.1} -> 2.5.1 (c) ++--- androidx.activity:activity-compose:{strictly 1.6.1} -> 1.6.1 (c) ++--- androidx.compose.ui:ui:{strictly 1.3.2} -> 1.3.2 (c) ++--- junit:junit:{strictly 4.13.2} -> 4.13.2 (c) ++--- androidx.test:core:{strictly 1.5.0} -> 1.5.0 (c) ++--- androidx.test:monitor:{strictly 1.6.1} -> 1.6.1 (c) ++--- androidx.annotation:annotation:{strictly 1.5.0} -> 1.5.0 (c) ++--- androidx.test:runner:{strictly 1.5.2} -> 1.5.2 (c) ++--- androidx.test.espresso:espresso-idling-resource:{strictly 3.5.1} -> 3.5.1 (c) ++--- com.squareup:javawriter:{strictly 2.1.1} -> 2.1.1 (c) ++--- javax.inject:javax.inject:{strictly 1} -> 1 (c) ++--- org.hamcrest:hamcrest-library:{strictly 1.3} -> 1.3 (c) ++--- org.hamcrest:hamcrest-integration:{strictly 1.3} -> 1.3 (c) ++--- com.google.code.findbugs:jsr305:{strictly 2.0.2} -> 2.0.2 (c) ++--- org.jetbrains.kotlin:kotlin-stdlib:{strictly 1.7.20} -> 1.7.20 (c) ++--- androidx.test:annotation:{strictly 1.0.1} -> 1.0.1 (c) ++--- androidx.activity:activity:{strictly 1.6.1} -> 1.6.1 (c) ++--- androidx.compose.ui:ui-test:{strictly 1.3.2} -> 1.3.2 (c) ++--- org.jetbrains.kotlin:kotlin-stdlib-common:{strictly 1.7.20} -> 1.7.20 (c) ++--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:{strictly 1.7.20} -> 1.7.20 (c) ++--- androidx.compose.runtime:runtime:{strictly 1.3.2} -> 1.3.2 (c) ++--- androidx.compose.ui:ui-text:{strictly 1.3.2} -> 1.3.2 (c) ++--- androidx.compose.runtime:runtime-saveable:{strictly 1.3.2} -> 1.3.2 (c) ++--- androidx.core:core:{strictly 1.9.0} -> 1.9.0 (c) ++--- androidx.lifecycle:lifecycle-runtime:{strictly 2.5.1} -> 2.5.1 (c) ++--- org.jetbrains.kotlinx:kotlinx-coroutines-android:{strictly 1.6.4} -> 1.6.4 (c) ++--- androidx.activity:activity-ktx:{strictly 1.6.1} -> 1.6.1 (c) ++--- androidx.compose.ui:ui-geometry:{strictly 1.3.2} -> 1.3.2 (c) ++--- androidx.compose.ui:ui-graphics:{strictly 1.3.2} -> 1.3.2 (c) ++--- androidx.compose.ui:ui-unit:{strictly 1.3.2} -> 1.3.2 (c) ++--- org.hamcrest:hamcrest-core:{strictly 1.3} -> 1.3 (c) ++--- androidx.test.services:storage:{strictly 1.4.2} -> 1.4.2 (c) ++--- androidx.lifecycle:lifecycle-common:{strictly 2.5.1} -> 2.5.1 (c) ++--- androidx.tracing:tracing:{strictly 1.0.0} -> 1.0.0 (c) ++--- com.google.guava:listenablefuture:{strictly 1.0} -> 1.0 (c) ++--- androidx.concurrent:concurrent-futures:{strictly 1.0.0} -> 1.0.0 (c) ++--- org.jetbrains:annotations:{strictly 13.0} -> 13.0 (c) ++--- androidx.annotation:annotation-experimental:{strictly 1.3.0} -> 1.3.0 (c) ++--- androidx.lifecycle:lifecycle-viewmodel:{strictly 2.5.1} -> 2.5.1 (c) ++--- androidx.lifecycle:lifecycle-viewmodel-savedstate:{strictly 2.5.1} -> 2.5.1 (c) ++--- androidx.savedstate:savedstate:{strictly 1.2.0} -> 1.2.0 (c) ++--- org.jetbrains.kotlinx:kotlinx-coroutines-core:{strictly 1.6.4} -> 1.6.4 (c) ++--- org.jetbrains.kotlinx:kotlinx-coroutines-test:{strictly 1.6.4} -> 1.6.4 (c) ++--- androidx.lifecycle:lifecycle-common-java8:{strictly 2.5.1} -> 2.5.1 (c) ++--- androidx.lifecycle:lifecycle-viewmodel-ktx:{strictly 2.5.1} -> 2.5.1 (c) ++--- androidx.versionedparcelable:versionedparcelable:{strictly 1.1.1} -> 1.1.1 (c) ++--- androidx.arch.core:core-common:{strictly 2.1.0} -> 2.1.0 (c) ++--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:{strictly 1.6.4} -> 1.6.4 (c) ++--- androidx.savedstate:savedstate-ktx:{strictly 1.2.0} -> 1.2.0 (c) ++--- androidx.lifecycle:lifecycle-livedata-core:{strictly 2.5.1} -> 2.5.1 (c) ++--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:{strictly 1.6.4} -> 1.6.4 (c) ++--- org.jetbrains.kotlinx:kotlinx-coroutines-test-jvm:{strictly 1.6.4} -> 1.6.4 (c) +\--- androidx.collection:collection:{strictly 1.2.0} -> 1.2.0 (c) + +debugAndroidTestCompileOnly - Compile only dependencies for compilation 'debugAndroidTest' (target (androidJvm)). (n) +No dependencies + +debugAndroidTestCompileOnlyDependenciesMetadata +No dependencies + +debugAndroidTestImplementation - Implementation only dependencies for compilation 'debugAndroidTest' (target (androidJvm)). (n) +No dependencies + +debugAndroidTestImplementationDependenciesMetadata ++--- androidx.test.ext:junit:1.1.5 +| +--- junit:junit:4.13.2 +| | \--- org.hamcrest:hamcrest-core:1.3 +| +--- androidx.test:core:1.5.0 +| | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 +| | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10 +| | | \--- org.jetbrains:annotations:13.0 +| | +--- androidx.test:monitor:1.6.0 -> 1.6.1 +| | | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) +| | | +--- androidx.test:annotation:1.0.1 +| | | | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) +| | | | \--- androidx.annotation:annotation-experimental:1.1.0 +| | | \--- androidx.tracing:tracing:1.0.0 +| | +--- androidx.test.services:storage:1.4.2 +| | | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) +| | | +--- androidx.test:monitor:1.6.0 -> 1.6.1 (*) +| | | +--- com.google.code.findbugs:jsr305:2.0.2 +| | | \--- androidx.test:annotation:1.0.1 (*) +| | +--- androidx.lifecycle:lifecycle-common:2.3.1 +| | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | +--- androidx.tracing:tracing:1.0.0 +| | +--- com.google.guava:listenablefuture:1.0 +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 (*) +| | \--- androidx.concurrent:concurrent-futures:1.1.0 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | \--- com.google.guava:listenablefuture:1.0 +| +--- androidx.test:monitor:1.6.1 (*) +| \--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) ++--- androidx.test.espresso:espresso-core:3.5.1 +| +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) +| +--- androidx.test:core:1.5.0 (*) +| +--- androidx.test:runner:1.5.2 +| | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) +| | +--- androidx.test:annotation:1.0.1 (*) +| | +--- androidx.test:monitor:1.6.1 (*) +| | +--- androidx.test.services:storage:1.4.2 (*) +| | +--- androidx.tracing:tracing:1.0.0 +| | \--- junit:junit:4.13.2 (*) +| +--- androidx.test.espresso:espresso-idling-resource:3.5.1 +| +--- com.squareup:javawriter:2.1.1 +| +--- javax.inject:javax.inject:1 +| +--- org.hamcrest:hamcrest-library:1.3 +| | \--- org.hamcrest:hamcrest-core:1.3 +| +--- org.hamcrest:hamcrest-integration:1.3 +| | \--- org.hamcrest:hamcrest-library:1.3 (*) +| +--- com.google.code.findbugs:jsr305:2.0.2 +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 (*) +| \--- androidx.test:annotation:1.0.1 (*) +\--- androidx.compose.ui:ui-test-junit4:1.3.2 + +--- androidx.activity:activity:1.2.0 + | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) + | +--- androidx.core:core:1.1.0 + | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) + | | +--- androidx.lifecycle:lifecycle-runtime:2.0.0 -> 2.3.0 + | | | +--- androidx.lifecycle:lifecycle-common:2.3.0 -> 2.3.1 (*) + | | | +--- androidx.arch.core:core-common:2.1.0 + | | | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) + | | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) + | | +--- androidx.versionedparcelable:versionedparcelable:1.1.0 + | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) + | | | \--- androidx.collection:collection:1.0.0 + | | | \--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*) + | | \--- androidx.collection:collection:1.0.0 (*) + | +--- androidx.lifecycle:lifecycle-runtime:2.3.0 (*) + | +--- androidx.lifecycle:lifecycle-viewmodel:2.3.0 + | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) + | +--- androidx.savedstate:savedstate:1.1.0 + | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) + | \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.3.0 + | +--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*) + | +--- androidx.savedstate:savedstate:1.1.0 (*) + | +--- androidx.lifecycle:lifecycle-livedata-core:2.3.0 + | | \--- androidx.lifecycle:lifecycle-common:2.3.0 -> 2.3.1 (*) + | \--- androidx.lifecycle:lifecycle-viewmodel:2.3.0 (*) + +--- androidx.compose.ui:ui-test:1.3.2 + | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 + | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 + | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 + | | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.10 + | | | \--- org.jetbrains.kotlinx:atomicfu:0.17.3 + | | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.20 -> 1.7.10 + | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4 + | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (c) + | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (c) + | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.4 (c) + | | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 + | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.10 (*) + | | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.6.21 + | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.10 (*) + | +--- androidx.compose.ui:ui:1.3.2 + | | +--- androidx.annotation:annotation:1.5.0 (*) + | | +--- androidx.compose.runtime:runtime-saveable:1.3.2 + | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) + | | | \--- androidx.compose.runtime:runtime:1.3.2 (*) + | | +--- androidx.compose.ui:ui-geometry:1.3.2 + | | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) + | | +--- androidx.compose.ui:ui-graphics:1.3.2 + | | | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) + | | | \--- androidx.compose.ui:ui-unit:1.3.2 + | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) + | | | \--- androidx.compose.ui:ui-geometry:1.3.2 (*) + | | +--- androidx.compose.ui:ui-text:1.3.2 + | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) + | | | +--- androidx.compose.ui:ui-graphics:1.3.2 (*) + | | | \--- androidx.compose.ui:ui-unit:1.3.2 (*) + | | \--- androidx.compose.ui:ui-unit:1.3.2 (*) + | +--- androidx.compose.ui:ui-graphics:1.3.2 (*) + | +--- androidx.compose.ui:ui-text:1.3.2 (*) + | +--- androidx.compose.ui:ui-unit:1.3.2 (*) + | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 (*) + | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10 + | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (*) + | \--- org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.4 + | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (*) + | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.10 + | \--- org.jetbrains.kotlinx:atomicfu:0.17.3 (*) + +--- androidx.test.ext:junit:1.1.3 -> 1.1.5 (*) + +--- junit:junit:4.13.2 (*) + +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 (*) + \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10 + +debugAndroidTestIntransitiveDependenciesMetadata +No dependencies + +debugAndroidTestRuntimeClasspath - Runtime classpath of compilation 'debugAndroidTest' (target (androidJvm)). ++--- androidx.test.ext:junit:1.1.5 +| +--- junit:junit:4.13.2 +| | \--- org.hamcrest:hamcrest-core:1.3 +| +--- androidx.test:core:1.5.0 +| | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 +| | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.20 +| | | \--- org.jetbrains:annotations:13.0 +| | +--- androidx.test:monitor:1.6.0 -> 1.6.1 +| | | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) +| | | +--- androidx.test:annotation:1.0.1 +| | | | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) +| | | | \--- androidx.annotation:annotation-experimental:1.1.0 -> 1.3.0 +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | | \--- androidx.tracing:tracing:1.0.0 +| | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | +--- androidx.test.services:storage:1.4.2 +| | | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) +| | | +--- androidx.test:monitor:1.6.0 -> 1.6.1 (*) +| | | +--- com.google.code.findbugs:jsr305:2.0.2 +| | | \--- androidx.test:annotation:1.0.1 (*) +| | +--- androidx.lifecycle:lifecycle-common:2.3.1 -> 2.5.1 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | \--- androidx.lifecycle:lifecycle-common-java8:2.5.1 (c) +| | +--- androidx.tracing:tracing:1.0.0 (*) +| | +--- com.google.guava:listenablefuture:1.0 +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | \--- androidx.concurrent:concurrent-futures:1.1.0 -> 1.0.0 +| | +--- com.google.guava:listenablefuture:1.0 +| | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| +--- androidx.test:monitor:1.6.1 (*) +| \--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) ++--- androidx.test.espresso:espresso-core:3.5.1 +| +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) +| +--- androidx.test:core:1.5.0 (*) +| +--- androidx.test:runner:1.5.2 +| | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) +| | +--- androidx.test:annotation:1.0.1 (*) +| | +--- androidx.test:monitor:1.6.1 (*) +| | +--- androidx.test.services:storage:1.4.2 (*) +| | +--- androidx.tracing:tracing:1.0.0 (*) +| | \--- junit:junit:4.13.2 (*) +| +--- androidx.test.espresso:espresso-idling-resource:3.5.1 +| +--- com.squareup:javawriter:2.1.1 +| +--- javax.inject:javax.inject:1 +| +--- org.hamcrest:hamcrest-library:1.3 +| | \--- org.hamcrest:hamcrest-core:1.3 +| +--- org.hamcrest:hamcrest-integration:1.3 +| | \--- org.hamcrest:hamcrest-library:1.3 (*) +| +--- com.google.code.findbugs:jsr305:2.0.2 +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| \--- androidx.test:annotation:1.0.1 (*) ++--- androidx.compose.ui:ui-test-junit4:1.3.2 +| +--- androidx.activity:activity:1.2.0 -> 1.6.1 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | +--- androidx.collection:collection:1.0.0 -> 1.2.0 +| | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | +--- androidx.core:core:1.8.0 -> 1.9.0 +| | | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) +| | | +--- androidx.annotation:annotation-experimental:1.3.0 (*) +| | | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*) +| | | +--- androidx.concurrent:concurrent-futures:1.0.0 (*) +| | | +--- androidx.lifecycle:lifecycle-runtime:2.3.1 -> 2.5.1 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | +--- androidx.arch.core:core-common:2.1.0 +| | | | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | +--- androidx.arch.core:core-runtime:2.1.0 +| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | | \--- androidx.arch.core:core-common:2.1.0 (*) +| | | | \--- androidx.lifecycle:lifecycle-common:2.5.1 (*) +| | | +--- androidx.versionedparcelable:versionedparcelable:1.1.1 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | \--- androidx.collection:collection:1.0.0 -> 1.2.0 (*) +| | | \--- androidx.core:core-ktx:1.9.0 (c) +| | +--- androidx.lifecycle:lifecycle-runtime:2.5.1 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| | | \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 +| | | +--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*) +| | | +--- androidx.core:core-ktx:1.2.0 -> 1.9.0 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | +--- androidx.core:core:1.9.0 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | | | \--- androidx.core:core:1.9.0 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata-core:2.5.1 +| | | | +--- androidx.arch.core:core-common:2.1.0 (*) +| | | | +--- androidx.arch.core:core-runtime:2.1.0 (*) +| | | | \--- androidx.lifecycle:lifecycle-common:2.5.1 (*) +| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 (*) +| | | +--- androidx.savedstate:savedstate:1.2.0 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | +--- androidx.arch.core:core-common:2.1.0 (*) +| | | | +--- androidx.lifecycle:lifecycle-common:2.4.0 -> 2.5.1 (*) +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 +| | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.4 +| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4 +| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (c) +| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.4 (c) +| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (c) +| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-test-jvm:1.6.4 (c) +| | | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.4 (c) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20 (*) +| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.20 +| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20 (*) +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.20 +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*) +| | +--- androidx.savedstate:savedstate:1.2.0 (*) +| | +--- androidx.tracing:tracing:1.0.0 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | \--- androidx.activity:activity-ktx:1.6.1 (c) +| +--- androidx.activity:activity-compose:1.3.0 -> 1.6.1 +| | +--- androidx.activity:activity-ktx:1.6.1 +| | | +--- androidx.activity:activity:1.6.1 (*) +| | | +--- androidx.core:core-ktx:1.1.0 -> 1.9.0 (*) +| | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 +| | | | +--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*) +| | | | +--- androidx.lifecycle:lifecycle-runtime:2.5.1 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 (*) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 +| | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 (*) +| | | +--- androidx.savedstate:savedstate-ktx:1.2.0 +| | | | +--- androidx.savedstate:savedstate:1.2.0 (*) +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | | \--- androidx.activity:activity:1.6.1 (c) +| | +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (*) +| | +--- androidx.compose.runtime:runtime-saveable:1.0.1 -> 1.3.2 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | +--- androidx.compose.runtime:runtime:1.3.2 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | +--- androidx.compose.ui:ui:1.0.1 -> 1.3.2 +| | | +--- androidx.activity:activity-ktx:1.5.1 -> 1.6.1 (*) +| | | +--- androidx.annotation:annotation:1.5.0 (*) +| | | +--- androidx.autofill:autofill:1.0.0 +| | | | \--- androidx.core:core:1.1.0 -> 1.9.0 (*) +| | | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*) +| | | +--- androidx.compose.runtime:runtime:1.3.2 (*) +| | | +--- androidx.compose.runtime:runtime-saveable:1.3.2 (*) +| | | +--- androidx.compose.ui:ui-geometry:1.3.2 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*) +| | | | +--- androidx.compose.ui:ui-util:1.3.2 +| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | | +--- androidx.compose.ui:ui-graphics:1.3.2 +| | | | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) +| | | | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*) +| | | | +--- androidx.compose.ui:ui-unit:1.3.2 +| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*) +| | | | | +--- androidx.compose.ui:ui-geometry:1.3.2 (*) +| | | | | +--- androidx.compose.ui:ui-util:1.3.2 (*) +| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | | | +--- androidx.compose.ui:ui-util:1.3.2 (*) +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10 -> 1.7.20 +| | | +--- androidx.compose.ui:ui-text:1.3.2 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*) +| | | | +--- androidx.compose.runtime:runtime:1.2.0 -> 1.3.2 (*) +| | | | +--- androidx.compose.runtime:runtime-saveable:1.2.0 -> 1.3.2 (*) +| | | | +--- androidx.compose.ui:ui-graphics:1.3.2 (*) +| | | | +--- androidx.compose.ui:ui-unit:1.3.2 (*) +| | | | +--- androidx.compose.ui:ui-util:1.3.2 (*) +| | | | +--- androidx.core:core:1.7.0 -> 1.9.0 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10 -> 1.7.20 +| | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (*) +| | | +--- androidx.compose.ui:ui-unit:1.3.2 (*) +| | | +--- androidx.compose.ui:ui-util:1.3.2 (*) +| | | +--- androidx.core:core:1.5.0 -> 1.9.0 (*) +| | | +--- androidx.customview:customview-poolingcontainer:1.0.0 +| | | | +--- androidx.core:core-ktx:1.5.0 -> 1.9.0 (*) +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| | | +--- androidx.lifecycle:lifecycle-common-java8:2.3.0 -> 2.5.1 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | \--- androidx.lifecycle:lifecycle-common:2.5.1 (*) +| | | +--- androidx.lifecycle:lifecycle-runtime:2.3.0 -> 2.5.1 (*) +| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.3.0 -> 2.5.1 (*) +| | | +--- androidx.profileinstaller:profileinstaller:1.2.0 +| | | | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) +| | | | \--- androidx.startup:startup-runtime:1.1.1 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | \--- androidx.tracing:tracing:1.0.0 (*) +| | | +--- androidx.savedstate:savedstate-ktx:1.2.0 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10 -> 1.7.20 +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (*) +| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (*) +| | +--- androidx.lifecycle:lifecycle-common-java8:2.5.1 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| +--- androidx.compose.runtime:runtime-saveable:1.1.1 -> 1.3.2 (*) +| +--- androidx.compose.ui:ui-test:1.3.2 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*) +| | +--- androidx.compose.ui:ui:1.3.2 (*) +| | +--- androidx.compose.ui:ui-graphics:1.3.2 (*) +| | +--- androidx.compose.ui:ui-text:1.3.2 (*) +| | +--- androidx.compose.ui:ui-unit:1.3.2 (*) +| | +--- androidx.compose.ui:ui-util:1.3.2 (*) +| | +--- androidx.core:core-ktx:1.1.0 -> 1.9.0 (*) +| | +--- androidx.test:monitor:1.5.0 -> 1.6.1 (*) +| | +--- androidx.test.espresso:espresso-core:3.3.0 -> 3.5.1 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10 -> 1.7.20 +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (*) +| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.4 +| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-test-jvm:1.6.4 +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.20 +| +--- androidx.lifecycle:lifecycle-common:2.3.0 -> 2.5.1 (*) +| +--- androidx.lifecycle:lifecycle-runtime:2.3.0 -> 2.5.1 (*) +| +--- androidx.test:core:1.4.0 -> 1.5.0 (*) +| +--- androidx.test:monitor:1.5.0 -> 1.6.1 (*) +| +--- androidx.test.espresso:espresso-core:3.3.0 -> 3.5.1 (*) +| +--- androidx.test.espresso:espresso-idling-resource:3.3.0 -> 3.5.1 +| +--- androidx.test.ext:junit:1.1.3 -> 1.1.5 (*) +| +--- junit:junit:4.13.2 (*) +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10 -> 1.7.20 +| +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (*) +| \--- org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.4 (*) ++--- androidx.annotation:annotation:{strictly 1.5.0} -> 1.5.0 (c) ++--- org.jetbrains.kotlin:kotlin-stdlib:{strictly 1.7.20} -> 1.7.20 (c) ++--- androidx.activity:activity:{strictly 1.6.1} -> 1.6.1 (c) ++--- androidx.activity:activity-compose:{strictly 1.6.1} -> 1.6.1 (c) ++--- androidx.compose.runtime:runtime-saveable:{strictly 1.3.2} -> 1.3.2 (c) ++--- androidx.lifecycle:lifecycle-common:{strictly 2.5.1} -> 2.5.1 (c) ++--- androidx.lifecycle:lifecycle-runtime:{strictly 2.5.1} -> 2.5.1 (c) ++--- org.jetbrains.kotlin:kotlin-stdlib-common:{strictly 1.7.20} -> 1.7.20 (c) ++--- org.jetbrains.kotlinx:kotlinx-coroutines-core:{strictly 1.6.4} -> 1.6.4 (c) ++--- androidx.tracing:tracing:{strictly 1.0.0} -> 1.0.0 (c) ++--- androidx.concurrent:concurrent-futures:{strictly 1.0.0} -> 1.0.0 (c) ++--- androidx.annotation:annotation-experimental:{strictly 1.3.0} -> 1.3.0 (c) ++--- org.jetbrains:annotations:{strictly 13.0} -> 13.0 (c) ++--- androidx.compose.runtime:runtime:{strictly 1.3.2} -> 1.3.2 (c) ++--- androidx.compose.ui:ui:{strictly 1.3.2} -> 1.3.2 (c) ++--- androidx.compose.ui:ui-graphics:{strictly 1.3.2} -> 1.3.2 (c) ++--- androidx.compose.ui:ui-text:{strictly 1.3.2} -> 1.3.2 (c) ++--- androidx.compose.ui:ui-unit:{strictly 1.3.2} -> 1.3.2 (c) ++--- androidx.compose.ui:ui-util:{strictly 1.3.2} -> 1.3.2 (c) ++--- androidx.core:core-ktx:{strictly 1.9.0} -> 1.9.0 (c) ++--- androidx.collection:collection:{strictly 1.2.0} -> 1.2.0 (c) ++--- androidx.core:core:{strictly 1.9.0} -> 1.9.0 (c) ++--- androidx.lifecycle:lifecycle-viewmodel:{strictly 2.5.1} -> 2.5.1 (c) ++--- androidx.lifecycle:lifecycle-viewmodel-savedstate:{strictly 2.5.1} -> 2.5.1 (c) ++--- androidx.savedstate:savedstate:{strictly 1.2.0} -> 1.2.0 (c) ++--- androidx.activity:activity-ktx:{strictly 1.6.1} -> 1.6.1 (c) ++--- androidx.lifecycle:lifecycle-common-java8:{strictly 2.5.1} -> 2.5.1 (c) ++--- androidx.arch.core:core-common:{strictly 2.1.0} -> 2.1.0 (c) ++--- androidx.arch.core:core-runtime:{strictly 2.1.0} -> 2.1.0 (c) ++--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:{strictly 1.6.4} -> 1.6.4 (c) ++--- org.jetbrains.kotlinx:kotlinx-coroutines-android:{strictly 1.6.4} -> 1.6.4 (c) ++--- androidx.autofill:autofill:{strictly 1.0.0} -> 1.0.0 (c) ++--- androidx.compose.ui:ui-geometry:{strictly 1.3.2} -> 1.3.2 (c) ++--- androidx.customview:customview-poolingcontainer:{strictly 1.0.0} -> 1.0.0 (c) ++--- androidx.profileinstaller:profileinstaller:{strictly 1.2.0} -> 1.2.0 (c) ++--- androidx.savedstate:savedstate-ktx:{strictly 1.2.0} -> 1.2.0 (c) ++--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:{strictly 1.6.4} -> 1.6.4 (c) ++--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:{strictly 1.7.20} -> 1.7.20 (c) ++--- androidx.versionedparcelable:versionedparcelable:{strictly 1.1.1} -> 1.1.1 (c) ++--- androidx.lifecycle:lifecycle-livedata-core:{strictly 2.5.1} -> 2.5.1 (c) ++--- androidx.lifecycle:lifecycle-runtime-ktx:{strictly 2.5.1} -> 2.5.1 (c) ++--- androidx.lifecycle:lifecycle-viewmodel-ktx:{strictly 2.5.1} -> 2.5.1 (c) ++--- androidx.startup:startup-runtime:{strictly 1.1.1} -> 1.1.1 (c) +\--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:{strictly 1.7.20} -> 1.7.20 (c) + +debugAndroidTestRuntimeOnly - Runtime only dependencies for compilation 'debugAndroidTest' (target (androidJvm)). (n) +No dependencies + +debugAndroidTestRuntimeOnlyDependenciesMetadata +No dependencies + +debugAnnotationProcessor - Classpath for the annotation processor for 'debug'. (n) +No dependencies + +debugAnnotationProcessorClasspath - Resolved configuration for annotation-processor for variant: debug +No dependencies + +debugApi - API dependencies for compilation 'debug' (target (androidJvm)). (n) +No dependencies + +debugApiDependenciesMetadata +\--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.20 + +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20 + | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.20 + | \--- org.jetbrains:annotations:13.0 + \--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.20 + \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20 (*) + +debugApiElements - API elements for debug (n) +No dependencies + +debugApkPublication - APK publication for debug (n) +No dependencies + +debugCompileClasspath - Compile classpath for compilation 'debug' (target (androidJvm)). ++--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.20 +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20 +| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.20 +| | \--- org.jetbrains:annotations:13.0 +| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.20 +| \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20 (*) ++--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:{strictly 1.7.20} -> 1.7.20 (c) ++--- androidx.compose.ui:ui-tooling:1.3.2 +| +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 +| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 +| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.4 +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4 +| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (c) +| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.4 (c) +| | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (c) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.20 +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*) +| +--- androidx.compose.ui:ui:1.3.2 +| | +--- androidx.annotation:annotation:1.5.0 (*) +| | +--- androidx.compose.runtime:runtime-saveable:1.3.2 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | \--- androidx.compose.runtime:runtime:1.3.2 (*) +| | +--- androidx.compose.ui:ui-geometry:1.3.2 +| | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | +--- androidx.compose.ui:ui-graphics:1.3.2 +| | | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) +| | | \--- androidx.compose.ui:ui-unit:1.3.2 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | \--- androidx.compose.ui:ui-geometry:1.3.2 (*) +| | +--- androidx.compose.ui:ui-text:1.3.2 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | +--- androidx.compose.ui:ui-graphics:1.3.2 (*) +| | | \--- androidx.compose.ui:ui-unit:1.3.2 (*) +| | \--- androidx.compose.ui:ui-unit:1.3.2 (*) +| +--- androidx.compose.ui:ui-tooling-data:1.3.2 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | +--- androidx.compose.runtime:runtime:1.2.0 -> 1.3.2 (*) +| | \--- androidx.compose.ui:ui:1.3.2 (*) +| \--- androidx.compose.ui:ui-tooling-preview:1.3.2 +| +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) +| \--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*) ++--- androidx.compose.ui:ui-test-manifest:1.3.2 +| \--- androidx.activity:activity:1.2.0 -> 1.6.1 +| +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| +--- androidx.core:core:1.8.0 -> 1.9.0 +| | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) +| | +--- androidx.annotation:annotation-experimental:1.3.0 +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | +--- androidx.lifecycle:lifecycle-runtime:2.3.1 -> 2.5.1 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | +--- androidx.arch.core:core-common:2.1.0 +| | | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | \--- androidx.lifecycle:lifecycle-common:2.5.1 +| | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | \--- androidx.versionedparcelable:versionedparcelable:1.1.1 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | \--- androidx.collection:collection:1.0.0 -> 1.2.0 +| | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| +--- androidx.lifecycle:lifecycle-runtime:2.5.1 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 +| | +--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*) +| | +--- androidx.core:core-ktx:1.2.0 -> 1.9.0 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | +--- androidx.core:core:1.9.0 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | +--- androidx.lifecycle:lifecycle-livedata-core:2.5.1 +| | | \--- androidx.lifecycle:lifecycle-common:2.5.1 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 (*) +| | +--- androidx.savedstate:savedstate:1.2.0 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 (*) +| +--- androidx.savedstate:savedstate:1.2.0 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) ++--- androidx.core:core-ktx:1.9.0 (*) ++--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 +| +--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*) +| +--- androidx.lifecycle:lifecycle-runtime:2.5.1 (*) +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 (*) ++--- androidx.activity:activity-compose:1.6.1 +| +--- androidx.activity:activity-ktx:1.6.1 +| | +--- androidx.activity:activity:1.6.1 (*) +| | +--- androidx.core:core-ktx:1.1.0 -> 1.9.0 (*) +| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 +| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 (*) +| | +--- androidx.savedstate:savedstate-ktx:1.2.0 +| | | +--- androidx.savedstate:savedstate:1.2.0 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2 (*) +| +--- androidx.compose.runtime:runtime-saveable:1.0.1 -> 1.3.2 (*) +| \--- androidx.compose.ui:ui:1.0.1 -> 1.3.2 (*) ++--- androidx.compose.ui:ui:1.3.2 (*) ++--- androidx.compose.ui:ui-tooling-preview:1.3.2 (*) ++--- androidx.compose.material:material:1.3.1 +| +--- androidx.compose.animation:animation-core:1.0.0 -> 1.3.2 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (*) +| +--- androidx.compose.foundation:foundation:1.2.0 -> 1.2.1 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | +--- androidx.compose.animation:animation:1.1.1 -> 1.3.2 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | +--- androidx.compose.animation:animation-core:1.3.2 (*) +| | | +--- androidx.compose.foundation:foundation-layout:1.0.0 -> 1.2.1 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | +--- androidx.compose.ui:ui:1.2.1 -> 1.3.2 (*) +| | | | \--- androidx.compose.ui:ui-unit:1.1.1 -> 1.3.2 (*) +| | | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*) +| | | +--- androidx.compose.ui:ui:1.0.0 -> 1.3.2 (*) +| | | \--- androidx.compose.ui:ui-geometry:1.0.0 -> 1.3.2 (*) +| | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.3.2 (*) +| | \--- androidx.compose.ui:ui:1.2.1 -> 1.3.2 (*) +| +--- androidx.compose.material:material-icons-core:1.3.1 +| | \--- androidx.compose.ui:ui:1.0.0 -> 1.3.2 (*) +| +--- androidx.compose.material:material-ripple:1.3.1 +| | +--- androidx.compose.foundation:foundation:1.1.1 -> 1.2.1 (*) +| | \--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*) +| +--- androidx.compose.runtime:runtime:1.2.0 -> 1.3.2 (*) +| +--- androidx.compose.ui:ui:1.2.0 -> 1.3.2 (*) +| \--- androidx.compose.ui:ui-text:1.2.0 -> 1.3.2 (*) ++--- androidx.navigation:navigation-compose:2.5.3 +| +--- androidx.activity:activity-compose:1.5.1 -> 1.6.1 (*) +| +--- androidx.compose.animation:animation:1.0.1 -> 1.3.2 (*) +| +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2 (*) +| +--- androidx.compose.runtime:runtime-saveable:1.0.1 -> 1.3.2 (*) +| +--- androidx.compose.ui:ui:1.0.1 -> 1.3.2 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.5.1 +| | +--- androidx.annotation:annotation-experimental:1.1.0 -> 1.3.0 (*) +| | +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2 (*) +| | +--- androidx.compose.ui:ui:1.0.1 -> 1.3.2 (*) +| | +--- androidx.lifecycle:lifecycle-common-java8:2.5.1 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | \--- androidx.lifecycle:lifecycle-common:2.5.1 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 (*) +| | \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 (*) +| \--- androidx.navigation:navigation-runtime-ktx:2.5.3 +| +--- androidx.navigation:navigation-common-ktx:2.5.3 +| | \--- androidx.navigation:navigation-common:2.5.3 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 (*) +| | +--- androidx.savedstate:savedstate-ktx:1.2.0 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| \--- androidx.navigation:navigation-runtime:2.5.3 +| +--- androidx.activity:activity-ktx:1.5.1 -> 1.6.1 (*) +| +--- androidx.annotation:annotation-experimental:1.1.0 -> 1.3.0 (*) +| +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 (*) +| +--- androidx.navigation:navigation-common:2.5.3 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) ++--- io.coil-kt:coil-compose:2.2.2 +| +--- io.coil-kt:coil-compose-base:2.2.2 +| | +--- io.coil-kt:coil-base:2.2.2 +| | | +--- androidx.lifecycle:lifecycle-runtime:2.4.1 -> 2.5.1 (*) +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10 -> 1.7.20 (*) +| | | +--- com.squareup.okhttp3:okhttp:4.10.0 +| | | | +--- com.squareup.okio:okio:3.0.0 -> 3.2.0 +| | | | | \--- com.squareup.okio:okio-jvm:3.2.0 +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.20 -> 1.7.20 (*) +| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.20 -> 1.7.20 +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*) +| | | \--- com.squareup.okio:okio:3.2.0 (*) +| | \--- androidx.compose.foundation:foundation:1.2.1 (*) +| \--- io.coil-kt:coil:2.2.2 +| \--- io.coil-kt:coil-base:2.2.2 (*) ++--- fr.acinq.secp256k1:secp256k1-kmp-jni-android:0.7.0 +| +--- fr.acinq.secp256k1:secp256k1-kmp-jni-common:0.7.0 +| | +--- fr.acinq.secp256k1:secp256k1-kmp:0.7.0 +| | | \--- fr.acinq.secp256k1:secp256k1-kmp-jvm:0.7.0 +| | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.20 +| | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*) ++--- com.github.Giszmo.NostrPostr:nostrpostrlib:master-SNAPSHOT ++--- androidx.compose.ui:ui-tooling:{strictly 1.3.2} -> 1.3.2 (c) ++--- androidx.compose.ui:ui-test-manifest:{strictly 1.3.2} -> 1.3.2 (c) ++--- androidx.core:core-ktx:{strictly 1.9.0} -> 1.9.0 (c) ++--- androidx.lifecycle:lifecycle-runtime-ktx:{strictly 2.5.1} -> 2.5.1 (c) ++--- androidx.activity:activity-compose:{strictly 1.6.1} -> 1.6.1 (c) ++--- androidx.compose.ui:ui:{strictly 1.3.2} -> 1.3.2 (c) ++--- androidx.compose.ui:ui-tooling-preview:{strictly 1.3.2} -> 1.3.2 (c) ++--- androidx.compose.material:material:{strictly 1.3.1} -> 1.3.1 (c) ++--- androidx.navigation:navigation-compose:{strictly 2.5.3} -> 2.5.3 (c) ++--- io.coil-kt:coil-compose:{strictly 2.2.2} -> 2.2.2 (c) ++--- fr.acinq.secp256k1:secp256k1-kmp-jni-android:{strictly 0.7.0} -> 0.7.0 (c) ++--- com.github.Giszmo.NostrPostr:nostrpostrlib:{strictly master-SNAPSHOT} -> master-SNAPSHOT (c) ++--- org.jetbrains.kotlin:kotlin-stdlib:{strictly 1.7.20} -> 1.7.20 (c) ++--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:{strictly 1.7.20} -> 1.7.20 (c) ++--- androidx.annotation:annotation:{strictly 1.5.0} -> 1.5.0 (c) ++--- androidx.compose.runtime:runtime:{strictly 1.3.2} -> 1.3.2 (c) ++--- androidx.compose.ui:ui-tooling-data:{strictly 1.3.2} -> 1.3.2 (c) ++--- androidx.activity:activity:{strictly 1.6.1} -> 1.6.1 (c) ++--- androidx.core:core:{strictly 1.9.0} -> 1.9.0 (c) ++--- androidx.lifecycle:lifecycle-runtime:{strictly 2.5.1} -> 2.5.1 (c) ++--- org.jetbrains.kotlinx:kotlinx-coroutines-android:{strictly 1.6.4} -> 1.6.4 (c) ++--- androidx.activity:activity-ktx:{strictly 1.6.1} -> 1.6.1 (c) ++--- androidx.compose.runtime:runtime-saveable:{strictly 1.3.2} -> 1.3.2 (c) ++--- androidx.compose.ui:ui-geometry:{strictly 1.3.2} -> 1.3.2 (c) ++--- androidx.compose.ui:ui-graphics:{strictly 1.3.2} -> 1.3.2 (c) ++--- androidx.compose.ui:ui-text:{strictly 1.3.2} -> 1.3.2 (c) ++--- androidx.compose.ui:ui-unit:{strictly 1.3.2} -> 1.3.2 (c) ++--- androidx.compose.animation:animation-core:{strictly 1.3.2} -> 1.3.2 (c) ++--- androidx.compose.foundation:foundation:{strictly 1.2.1} -> 1.2.1 (c) ++--- androidx.compose.material:material-icons-core:{strictly 1.3.1} -> 1.3.1 (c) ++--- androidx.compose.material:material-ripple:{strictly 1.3.1} -> 1.3.1 (c) ++--- androidx.compose.animation:animation:{strictly 1.3.2} -> 1.3.2 (c) ++--- androidx.lifecycle:lifecycle-viewmodel-compose:{strictly 2.5.1} -> 2.5.1 (c) ++--- androidx.navigation:navigation-runtime-ktx:{strictly 2.5.3} -> 2.5.3 (c) ++--- io.coil-kt:coil-compose-base:{strictly 2.2.2} -> 2.2.2 (c) ++--- io.coil-kt:coil:{strictly 2.2.2} -> 2.2.2 (c) ++--- fr.acinq.secp256k1:secp256k1-kmp-jni-common:{strictly 0.7.0} -> 0.7.0 (c) ++--- org.jetbrains.kotlin:kotlin-stdlib-common:{strictly 1.7.20} -> 1.7.20 (c) ++--- org.jetbrains:annotations:{strictly 13.0} -> 13.0 (c) ++--- androidx.lifecycle:lifecycle-viewmodel:{strictly 2.5.1} -> 2.5.1 (c) ++--- androidx.lifecycle:lifecycle-viewmodel-savedstate:{strictly 2.5.1} -> 2.5.1 (c) ++--- androidx.savedstate:savedstate:{strictly 1.2.0} -> 1.2.0 (c) ++--- androidx.annotation:annotation-experimental:{strictly 1.3.0} -> 1.3.0 (c) ++--- androidx.versionedparcelable:versionedparcelable:{strictly 1.1.1} -> 1.1.1 (c) ++--- androidx.arch.core:core-common:{strictly 2.1.0} -> 2.1.0 (c) ++--- androidx.lifecycle:lifecycle-common:{strictly 2.5.1} -> 2.5.1 (c) ++--- org.jetbrains.kotlinx:kotlinx-coroutines-core:{strictly 1.6.4} -> 1.6.4 (c) ++--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:{strictly 1.6.4} -> 1.6.4 (c) ++--- androidx.lifecycle:lifecycle-viewmodel-ktx:{strictly 2.5.1} -> 2.5.1 (c) ++--- androidx.savedstate:savedstate-ktx:{strictly 1.2.0} -> 1.2.0 (c) ++--- androidx.compose.foundation:foundation-layout:{strictly 1.2.1} -> 1.2.1 (c) ++--- androidx.lifecycle:lifecycle-common-java8:{strictly 2.5.1} -> 2.5.1 (c) ++--- androidx.navigation:navigation-common-ktx:{strictly 2.5.3} -> 2.5.3 (c) ++--- androidx.navigation:navigation-runtime:{strictly 2.5.3} -> 2.5.3 (c) ++--- io.coil-kt:coil-base:{strictly 2.2.2} -> 2.2.2 (c) ++--- fr.acinq.secp256k1:secp256k1-kmp:{strictly 0.7.0} -> 0.7.0 (c) ++--- androidx.lifecycle:lifecycle-livedata-core:{strictly 2.5.1} -> 2.5.1 (c) ++--- androidx.collection:collection:{strictly 1.2.0} -> 1.2.0 (c) ++--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:{strictly 1.6.4} -> 1.6.4 (c) ++--- androidx.navigation:navigation-common:{strictly 2.5.3} -> 2.5.3 (c) ++--- com.squareup.okhttp3:okhttp:{strictly 4.10.0} -> 4.10.0 (c) ++--- com.squareup.okio:okio:{strictly 3.2.0} -> 3.2.0 (c) ++--- fr.acinq.secp256k1:secp256k1-kmp-jvm:{strictly 0.7.0} -> 0.7.0 (c) +\--- com.squareup.okio:okio-jvm:{strictly 3.2.0} -> 3.2.0 (c) + +debugCompileOnly - Compile only dependencies for compilation 'debug' (target (androidJvm)). (n) +No dependencies + +debugCompileOnlyDependenciesMetadata +No dependencies + +debugImplementation - Implementation only dependencies for compilation 'debug' (target (androidJvm)). (n) ++--- androidx.compose.ui:ui-tooling:1.3.2 (n) +\--- androidx.compose.ui:ui-test-manifest:1.3.2 (n) + +debugImplementationDependenciesMetadata ++--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.20 +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20 +| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.20 +| | \--- org.jetbrains:annotations:13.0 +| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.20 +| \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20 (*) ++--- androidx.compose.ui:ui-tooling:1.3.2 +| +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 +| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 +| | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.20 +| | | \--- org.jetbrains.kotlinx:atomicfu:0.17.3 +| | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.20 -> 1.7.20 +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4 +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (c) +| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (c) +| | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*) +| +--- androidx.compose.ui:ui:1.3.2 +| | +--- androidx.annotation:annotation:1.5.0 (*) +| | +--- androidx.compose.runtime:runtime-saveable:1.3.2 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | \--- androidx.compose.runtime:runtime:1.3.2 (*) +| | +--- androidx.compose.ui:ui-geometry:1.3.2 +| | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | +--- androidx.compose.ui:ui-graphics:1.3.2 +| | | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) +| | | \--- androidx.compose.ui:ui-unit:1.3.2 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | \--- androidx.compose.ui:ui-geometry:1.3.2 (*) +| | +--- androidx.compose.ui:ui-text:1.3.2 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | +--- androidx.compose.ui:ui-graphics:1.3.2 (*) +| | | \--- androidx.compose.ui:ui-unit:1.3.2 (*) +| | \--- androidx.compose.ui:ui-unit:1.3.2 (*) +| +--- androidx.compose.ui:ui-tooling-data:1.3.2 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | +--- androidx.compose.runtime:runtime:1.2.0 -> 1.3.2 (*) +| | \--- androidx.compose.ui:ui:1.3.2 (*) +| \--- androidx.compose.ui:ui-tooling-preview:1.3.2 +| +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) +| \--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*) ++--- androidx.compose.ui:ui-test-manifest:1.3.2 +| \--- androidx.activity:activity:1.2.0 -> 1.6.1 +| +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| +--- androidx.core:core:1.8.0 -> 1.9.0 +| | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) +| | +--- androidx.annotation:annotation-experimental:1.3.0 +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | +--- androidx.lifecycle:lifecycle-runtime:2.3.1 -> 2.5.1 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | +--- androidx.arch.core:core-common:2.1.0 +| | | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | \--- androidx.lifecycle:lifecycle-common:2.5.1 +| | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | \--- androidx.versionedparcelable:versionedparcelable:1.1.1 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | \--- androidx.collection:collection:1.0.0 +| | \--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*) +| +--- androidx.lifecycle:lifecycle-runtime:2.5.1 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 +| | +--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*) +| | +--- androidx.core:core-ktx:1.2.0 -> 1.9.0 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | +--- androidx.core:core:1.9.0 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | +--- androidx.lifecycle:lifecycle-livedata-core:2.5.1 +| | | \--- androidx.lifecycle:lifecycle-common:2.5.1 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 (*) +| | +--- androidx.savedstate:savedstate:1.2.0 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 (*) +| +--- androidx.savedstate:savedstate:1.2.0 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) ++--- androidx.core:core-ktx:1.9.0 (*) ++--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 +| +--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*) +| +--- androidx.lifecycle:lifecycle-runtime:2.5.1 (*) +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 (*) ++--- androidx.activity:activity-compose:1.6.1 +| +--- androidx.activity:activity-ktx:1.6.1 +| | +--- androidx.activity:activity:1.6.1 (*) +| | +--- androidx.core:core-ktx:1.1.0 -> 1.9.0 (*) +| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 +| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 (*) +| | +--- androidx.savedstate:savedstate-ktx:1.2.0 +| | | +--- androidx.savedstate:savedstate:1.2.0 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2 (*) +| +--- androidx.compose.runtime:runtime-saveable:1.0.1 -> 1.3.2 (*) +| \--- androidx.compose.ui:ui:1.0.1 -> 1.3.2 (*) ++--- androidx.compose.ui:ui:1.3.2 (*) ++--- androidx.compose.ui:ui-tooling-preview:1.3.2 (*) ++--- androidx.compose.material:material:1.3.1 +| +--- androidx.compose.animation:animation-core:1.0.0 -> 1.1.1 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.2 -> 1.6.4 (*) +| +--- androidx.compose.foundation:foundation:1.2.0 -> 1.2.1 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | +--- androidx.compose.animation:animation:1.1.1 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | +--- androidx.compose.animation:animation-core:1.1.1 (*) +| | | +--- androidx.compose.foundation:foundation-layout:1.0.0 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | \--- androidx.compose.ui:ui:1.0.0 -> 1.3.2 (*) +| | | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*) +| | | +--- androidx.compose.ui:ui:1.0.0 -> 1.3.2 (*) +| | | \--- androidx.compose.ui:ui-geometry:1.0.0 -> 1.3.2 (*) +| | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.3.2 (*) +| | \--- androidx.compose.ui:ui:1.2.1 -> 1.3.2 (*) +| +--- androidx.compose.material:material-icons-core:1.3.1 +| | \--- androidx.compose.ui:ui:1.0.0 -> 1.3.2 (*) +| +--- androidx.compose.material:material-ripple:1.3.1 +| | +--- androidx.compose.foundation:foundation:1.1.1 -> 1.2.1 (*) +| | \--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*) +| +--- androidx.compose.runtime:runtime:1.2.0 -> 1.3.2 (*) +| +--- androidx.compose.ui:ui:1.2.0 -> 1.3.2 (*) +| \--- androidx.compose.ui:ui-text:1.2.0 -> 1.3.2 (*) ++--- androidx.navigation:navigation-compose:2.5.3 +| +--- androidx.activity:activity-compose:1.5.1 -> 1.6.1 (*) +| +--- androidx.compose.animation:animation:1.0.1 -> 1.1.1 (*) +| +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2 (*) +| +--- androidx.compose.runtime:runtime-saveable:1.0.1 -> 1.3.2 (*) +| +--- androidx.compose.ui:ui:1.0.1 -> 1.3.2 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.5.1 +| | +--- androidx.annotation:annotation-experimental:1.1.0 -> 1.3.0 (*) +| | +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2 (*) +| | +--- androidx.compose.ui:ui:1.0.1 -> 1.3.2 (*) +| | +--- androidx.lifecycle:lifecycle-common-java8:2.5.1 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | \--- androidx.lifecycle:lifecycle-common:2.5.1 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 (*) +| | \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 (*) +| \--- androidx.navigation:navigation-runtime-ktx:2.5.3 +| +--- androidx.navigation:navigation-common-ktx:2.5.3 +| | \--- androidx.navigation:navigation-common:2.5.3 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 (*) +| | +--- androidx.savedstate:savedstate-ktx:1.2.0 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| \--- androidx.navigation:navigation-runtime:2.5.3 +| +--- androidx.activity:activity-ktx:1.5.1 -> 1.6.1 (*) +| +--- androidx.annotation:annotation-experimental:1.1.0 -> 1.3.0 (*) +| +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 (*) +| +--- androidx.navigation:navigation-common:2.5.3 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) ++--- io.coil-kt:coil-compose:2.2.2 +| +--- io.coil-kt:coil-compose-base:2.2.2 +| | +--- io.coil-kt:coil-base:2.2.2 +| | | +--- androidx.lifecycle:lifecycle-runtime:2.4.1 -> 2.5.1 (*) +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10 -> 1.7.20 (*) +| | | +--- com.squareup.okhttp3:okhttp:4.10.0 +| | | | +--- com.squareup.okio:okio:3.0.0 -> 3.2.0 +| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.20 -> 1.7.20 +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*) +| | | \--- com.squareup.okio:okio:3.2.0 (*) +| | \--- androidx.compose.foundation:foundation:1.2.1 (*) +| \--- io.coil-kt:coil:2.2.2 +| \--- io.coil-kt:coil-base:2.2.2 (*) ++--- fr.acinq.secp256k1:secp256k1-kmp-jni-android:0.7.0 +| +--- fr.acinq.secp256k1:secp256k1-kmp-jni-common:0.7.0 +| | +--- fr.acinq.secp256k1:secp256k1-kmp:0.7.0 +| | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.20 +| | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*) +\--- com.github.Giszmo.NostrPostr:nostrpostrlib:master-SNAPSHOT + +debugIntransitiveDependenciesMetadata +No dependencies + +debugReverseMetadataValues - Metadata Values dependencies for the base Split +No dependencies + +debugRuntimeClasspath - Runtime classpath of compilation 'debug' (target (androidJvm)). ++--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.20 +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20 +| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.20 +| | \--- org.jetbrains:annotations:13.0 +| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.20 +| \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20 (*) ++--- androidx.compose.ui:ui-tooling:1.3.2 +| +--- androidx.activity:activity-compose:1.3.0 -> 1.6.1 +| | +--- androidx.activity:activity-ktx:1.6.1 +| | | +--- androidx.activity:activity:1.6.1 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 +| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | | | +--- androidx.collection:collection:1.0.0 -> 1.2.0 +| | | | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | +--- androidx.core:core:1.8.0 -> 1.9.0 +| | | | | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) +| | | | | +--- androidx.annotation:annotation-experimental:1.3.0 +| | | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | | | | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*) +| | | | | +--- androidx.concurrent:concurrent-futures:1.0.0 +| | | | | | +--- com.google.guava:listenablefuture:1.0 +| | | | | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | | +--- androidx.lifecycle:lifecycle-runtime:2.3.1 -> 2.5.1 +| | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | | | +--- androidx.arch.core:core-common:2.1.0 +| | | | | | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | | | +--- androidx.arch.core:core-runtime:2.1.0 +| | | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | | | | \--- androidx.arch.core:core-common:2.1.0 (*) +| | | | | | \--- androidx.lifecycle:lifecycle-common:2.5.1 +| | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | | | \--- androidx.lifecycle:lifecycle-common-java8:2.5.1 (c) +| | | | | +--- androidx.versionedparcelable:versionedparcelable:1.1.1 +| | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | | | \--- androidx.collection:collection:1.0.0 -> 1.2.0 (*) +| | | | | \--- androidx.core:core-ktx:1.9.0 (c) +| | | | +--- androidx.lifecycle:lifecycle-runtime:2.5.1 (*) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 +| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| | | | | \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 +| | | | | +--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*) +| | | | | +--- androidx.core:core-ktx:1.2.0 -> 1.9.0 +| | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | | | +--- androidx.core:core:1.9.0 (*) +| | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | | | | | \--- androidx.core:core:1.9.0 (c) +| | | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.5.1 +| | | | | | +--- androidx.arch.core:core-common:2.1.0 (*) +| | | | | | +--- androidx.arch.core:core-runtime:2.1.0 (*) +| | | | | | \--- androidx.lifecycle:lifecycle-common:2.5.1 (*) +| | | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 (*) +| | | | | +--- androidx.savedstate:savedstate:1.2.0 +| | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | | | +--- androidx.arch.core:core-common:2.1.0 (*) +| | | | | | +--- androidx.lifecycle:lifecycle-common:2.4.0 -> 2.5.1 (*) +| | | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*) +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| | | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 +| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 +| | | | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.4 +| | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4 +| | | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (c) +| | | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.4 (c) +| | | | | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (c) +| | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*) +| | | | | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.20 +| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4 (*) +| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*) +| | | | +--- androidx.savedstate:savedstate:1.2.0 (*) +| | | | +--- androidx.tracing:tracing:1.0.0 +| | | | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | | | \--- androidx.activity:activity-ktx:1.6.1 (c) +| | | +--- androidx.core:core-ktx:1.1.0 -> 1.9.0 (*) +| | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 +| | | | +--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*) +| | | | +--- androidx.lifecycle:lifecycle-runtime:2.5.1 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 (*) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 +| | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 (*) +| | | +--- androidx.savedstate:savedstate-ktx:1.2.0 +| | | | +--- androidx.savedstate:savedstate:1.2.0 (*) +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | | \--- androidx.activity:activity:1.6.1 (c) +| | +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (*) +| | +--- androidx.compose.runtime:runtime-saveable:1.0.1 -> 1.3.2 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | +--- androidx.compose.runtime:runtime:1.3.2 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | +--- androidx.compose.ui:ui:1.0.1 -> 1.3.2 +| | | +--- androidx.activity:activity-ktx:1.5.1 -> 1.6.1 (*) +| | | +--- androidx.annotation:annotation:1.5.0 (*) +| | | +--- androidx.autofill:autofill:1.0.0 +| | | | \--- androidx.core:core:1.1.0 -> 1.9.0 (*) +| | | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*) +| | | +--- androidx.compose.runtime:runtime:1.3.2 (*) +| | | +--- androidx.compose.runtime:runtime-saveable:1.3.2 (*) +| | | +--- androidx.compose.ui:ui-geometry:1.3.2 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*) +| | | | +--- androidx.compose.ui:ui-util:1.3.2 +| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | | +--- androidx.compose.ui:ui-graphics:1.3.2 +| | | | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) +| | | | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*) +| | | | +--- androidx.compose.ui:ui-unit:1.3.2 +| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*) +| | | | | +--- androidx.compose.ui:ui-geometry:1.3.2 (*) +| | | | | +--- androidx.compose.ui:ui-util:1.3.2 (*) +| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | | | +--- androidx.compose.ui:ui-util:1.3.2 (*) +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10 -> 1.7.20 +| | | +--- androidx.compose.ui:ui-text:1.3.2 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*) +| | | | +--- androidx.compose.runtime:runtime:1.2.0 -> 1.3.2 (*) +| | | | +--- androidx.compose.runtime:runtime-saveable:1.2.0 -> 1.3.2 (*) +| | | | +--- androidx.compose.ui:ui-graphics:1.3.2 (*) +| | | | +--- androidx.compose.ui:ui-unit:1.3.2 (*) +| | | | +--- androidx.compose.ui:ui-util:1.3.2 (*) +| | | | +--- androidx.core:core:1.7.0 -> 1.9.0 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10 -> 1.7.20 +| | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (*) +| | | +--- androidx.compose.ui:ui-unit:1.3.2 (*) +| | | +--- androidx.compose.ui:ui-util:1.3.2 (*) +| | | +--- androidx.core:core:1.5.0 -> 1.9.0 (*) +| | | +--- androidx.customview:customview-poolingcontainer:1.0.0 +| | | | +--- androidx.core:core-ktx:1.5.0 -> 1.9.0 (*) +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| | | +--- androidx.lifecycle:lifecycle-common-java8:2.3.0 -> 2.5.1 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | \--- androidx.lifecycle:lifecycle-common:2.5.1 (*) +| | | +--- androidx.lifecycle:lifecycle-runtime:2.3.0 -> 2.5.1 (*) +| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.3.0 -> 2.5.1 (*) +| | | +--- androidx.profileinstaller:profileinstaller:1.2.0 +| | | | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) +| | | | \--- androidx.startup:startup-runtime:1.1.1 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | \--- androidx.tracing:tracing:1.0.0 (*) +| | | +--- androidx.savedstate:savedstate-ktx:1.2.0 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10 -> 1.7.20 +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (*) +| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (*) +| | +--- androidx.lifecycle:lifecycle-common-java8:2.5.1 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| +--- androidx.compose.animation:animation:1.3.2 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | +--- androidx.compose.animation:animation-core:1.3.2 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*) +| | | +--- androidx.compose.ui:ui:1.2.0 -> 1.3.2 (*) +| | | +--- androidx.compose.ui:ui-unit:1.0.0 -> 1.3.2 (*) +| | | +--- androidx.compose.ui:ui-util:1.0.0 -> 1.3.2 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (*) +| | +--- androidx.compose.foundation:foundation-layout:1.0.0 -> 1.2.1 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | +--- androidx.compose.animation:animation-core:1.1.1 -> 1.3.2 (*) +| | | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.3.2 (*) +| | | +--- androidx.compose.ui:ui:1.2.1 -> 1.3.2 (*) +| | | +--- androidx.compose.ui:ui-unit:1.1.1 -> 1.3.2 (*) +| | | +--- androidx.compose.ui:ui-util:1.0.0 -> 1.3.2 (*) +| | | +--- androidx.core:core:1.7.0 -> 1.9.0 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.20 +| | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*) +| | +--- androidx.compose.ui:ui:1.0.0 -> 1.3.2 (*) +| | +--- androidx.compose.ui:ui-geometry:1.0.0 -> 1.3.2 (*) +| | +--- androidx.compose.ui:ui-util:1.0.0 -> 1.3.2 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10 -> 1.7.20 +| +--- androidx.compose.material:material:1.0.0 -> 1.3.1 +| | +--- androidx.compose.animation:animation:1.0.0 -> 1.3.2 (*) +| | +--- androidx.compose.animation:animation-core:1.0.0 -> 1.3.2 (*) +| | +--- androidx.compose.foundation:foundation:1.2.0 -> 1.2.1 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | +--- androidx.compose.animation:animation:1.1.1 -> 1.3.2 (*) +| | | +--- androidx.compose.foundation:foundation-layout:1.2.1 (*) +| | | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.3.2 (*) +| | | +--- androidx.compose.ui:ui:1.2.1 -> 1.3.2 (*) +| | | +--- androidx.compose.ui:ui-graphics:1.1.1 -> 1.3.2 (*) +| | | +--- androidx.compose.ui:ui-text:1.0.0 -> 1.3.2 (*) +| | | +--- androidx.compose.ui:ui-util:1.0.0 -> 1.3.2 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.20 +| | +--- androidx.compose.foundation:foundation-layout:1.1.1 -> 1.2.1 (*) +| | +--- androidx.compose.material:material-icons-core:1.3.1 +| | | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*) +| | | +--- androidx.compose.ui:ui:1.0.0 -> 1.3.2 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | +--- androidx.compose.material:material-ripple:1.3.1 +| | | +--- androidx.compose.animation:animation:1.0.0 -> 1.3.2 (*) +| | | +--- androidx.compose.foundation:foundation:1.1.1 -> 1.2.1 (*) +| | | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*) +| | | +--- androidx.compose.ui:ui-util:1.0.0 -> 1.3.2 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10 -> 1.7.20 +| | +--- androidx.compose.runtime:runtime:1.2.0 -> 1.3.2 (*) +| | +--- androidx.compose.ui:ui:1.2.0 -> 1.3.2 (*) +| | +--- androidx.compose.ui:ui-text:1.2.0 -> 1.3.2 (*) +| | +--- androidx.compose.ui:ui-util:1.0.0 -> 1.3.2 (*) +| | +--- androidx.lifecycle:lifecycle-runtime:2.3.0 -> 2.5.1 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel:2.3.0 -> 2.5.1 (*) +| | +--- androidx.savedstate:savedstate:1.1.0 -> 1.2.0 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10 -> 1.7.20 +| +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*) +| +--- androidx.compose.ui:ui:1.3.2 (*) +| +--- androidx.compose.ui:ui-tooling-data:1.3.2 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | +--- androidx.compose.runtime:runtime:1.2.0 -> 1.3.2 (*) +| | +--- androidx.compose.ui:ui:1.3.2 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| +--- androidx.compose.ui:ui-tooling-preview:1.3.2 +| | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) +| | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| +--- androidx.savedstate:savedstate-ktx:1.2.0 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) ++--- androidx.compose.ui:ui-test-manifest:1.3.2 +| \--- androidx.activity:activity:1.2.0 -> 1.6.1 (*) ++--- androidx.core:core-ktx:1.9.0 (*) ++--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (*) ++--- androidx.activity:activity-compose:1.6.1 (*) ++--- androidx.compose.ui:ui:1.3.2 (*) ++--- androidx.compose.ui:ui-tooling-preview:1.3.2 (*) ++--- androidx.compose.material:material:1.3.1 (*) ++--- androidx.navigation:navigation-compose:2.5.3 +| +--- androidx.activity:activity-compose:1.5.1 -> 1.6.1 (*) +| +--- androidx.compose.animation:animation:1.0.1 -> 1.3.2 (*) +| +--- androidx.compose.foundation:foundation-layout:1.0.1 -> 1.2.1 (*) +| +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2 (*) +| +--- androidx.compose.runtime:runtime-saveable:1.0.1 -> 1.3.2 (*) +| +--- androidx.compose.ui:ui:1.0.1 -> 1.3.2 (*) +| +--- androidx.lifecycle:lifecycle-common-java8:2.5.1 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.5.1 +| | +--- androidx.annotation:annotation-experimental:1.1.0 -> 1.3.0 (*) +| | +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2 (*) +| | +--- androidx.compose.ui:ui:1.0.1 -> 1.3.2 (*) +| | +--- androidx.lifecycle:lifecycle-common-java8:2.5.1 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| +--- androidx.navigation:navigation-runtime-ktx:2.5.3 +| | +--- androidx.navigation:navigation-common-ktx:2.5.3 +| | | \--- androidx.navigation:navigation-common:2.5.3 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | +--- androidx.collection:collection-ktx:1.1.0 +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.3.20 -> 1.7.20 (*) +| | | | \--- androidx.collection:collection:1.1.0 -> 1.2.0 (*) +| | | +--- androidx.core:core-ktx:1.1.0 -> 1.9.0 (*) +| | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (*) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 (*) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 (*) +| | | +--- androidx.savedstate:savedstate-ktx:1.2.0 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| | \--- androidx.navigation:navigation-runtime:2.5.3 +| | +--- androidx.activity:activity-ktx:1.5.1 -> 1.6.1 (*) +| | +--- androidx.annotation:annotation-experimental:1.1.0 -> 1.3.0 (*) +| | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*) +| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 (*) +| | +--- androidx.navigation:navigation-common:2.5.3 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) ++--- io.coil-kt:coil-compose:2.2.2 +| +--- io.coil-kt:coil-compose-base:2.2.2 +| | +--- io.coil-kt:coil-base:2.2.2 +| | | +--- androidx.lifecycle:lifecycle-runtime:2.4.1 -> 2.5.1 (*) +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10 -> 1.7.20 (*) +| | | +--- com.squareup.okhttp3:okhttp:4.10.0 +| | | | +--- com.squareup.okio:okio:3.0.0 -> 3.2.0 +| | | | | \--- com.squareup.okio:okio-jvm:3.2.0 +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.20 -> 1.7.20 (*) +| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.20 -> 1.7.20 +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*) +| | | +--- com.squareup.okio:okio:3.2.0 (*) +| | | +--- androidx.annotation:annotation:1.5.0 (*) +| | | +--- androidx.appcompat:appcompat-resources:1.4.2 +| | | | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*) +| | | | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) +| | | | +--- androidx.core:core:1.0.1 -> 1.9.0 (*) +| | | | +--- androidx.vectordrawable:vectordrawable:1.1.0 +| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | | +--- androidx.core:core:1.1.0 -> 1.9.0 (*) +| | | | | \--- androidx.collection:collection:1.1.0 -> 1.2.0 (*) +| | | | \--- androidx.vectordrawable:vectordrawable-animated:1.1.0 +| | | | +--- androidx.vectordrawable:vectordrawable:1.1.0 (*) +| | | | +--- androidx.interpolator:interpolator:1.0.0 +| | | | | \--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*) +| | | | \--- androidx.collection:collection:1.1.0 -> 1.2.0 (*) +| | | +--- androidx.collection:collection:1.2.0 (*) +| | | +--- androidx.core:core-ktx:1.8.0 -> 1.9.0 (*) +| | | \--- androidx.exifinterface:exifinterface:1.3.3 +| | | \--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) +| | +--- androidx.compose.foundation:foundation:1.2.1 (*) +| | +--- androidx.core:core-ktx:1.8.0 -> 1.9.0 (*) +| | \--- com.google.accompanist:accompanist-drawablepainter:0.25.1 +| | \--- androidx.compose.ui:ui:1.2.1 -> 1.3.2 (*) +| \--- io.coil-kt:coil:2.2.2 +| \--- io.coil-kt:coil-base:2.2.2 (*) ++--- fr.acinq.secp256k1:secp256k1-kmp-jni-android:0.7.0 +| +--- fr.acinq.secp256k1:secp256k1-kmp-jni-common:0.7.0 +| | +--- fr.acinq.secp256k1:secp256k1-kmp:0.7.0 +| | | \--- fr.acinq.secp256k1:secp256k1-kmp-jvm:0.7.0 +| | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.20 +| | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*) +\--- com.github.Giszmo.NostrPostr:nostrpostrlib:master-SNAPSHOT + +--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.10 -> 1.7.20 (*) + +--- com.squareup.retrofit2:retrofit:2.8.1 + | \--- com.squareup.okhttp3:okhttp:3.14.7 -> 4.10.0 (*) + +--- com.squareup.retrofit2:converter-gson:2.8.1 + | +--- com.squareup.retrofit2:retrofit:2.8.1 (*) + | \--- com.google.code.gson:gson:2.8.5 + +--- com.squareup.okhttp3:okhttp:4.9.3 -> 4.10.0 (*) + +--- com.madgag.spongycastle:core:1.51.0.0 + +--- com.madgag.spongycastle:prov:1.51.0.0 + | \--- com.madgag.spongycastle:core:1.51.0.0 + \--- com.github.mgunlogson:cuckoofilter4j:1.0.1 + \--- com.google.guava:guava:19.0 + +debugRuntimeElements - Runtime elements for debug (n) +No dependencies + +debugRuntimeOnly - Runtime only dependencies for compilation 'debug' (target (androidJvm)). (n) +No dependencies + +debugRuntimeOnlyDependenciesMetadata +No dependencies + +debugUnitTestAnnotationProcessorClasspath - Resolved configuration for annotation-processor for variant: debugUnitTest +No dependencies + +debugUnitTestApi - API dependencies for compilation 'debugUnitTest' (target (androidJvm)). (n) +No dependencies + +debugUnitTestApiDependenciesMetadata +No dependencies + +debugUnitTestCompileClasspath - Compile classpath for compilation 'debugUnitTest' (target (androidJvm)). ++--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.20 +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20 +| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.20 +| | \--- org.jetbrains:annotations:13.0 +| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.20 +| \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20 (*) ++--- androidx.compose.ui:ui-tooling:1.3.2 +| +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 +| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 +| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.4 +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4 +| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (c) +| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.4 (c) +| | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (c) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.20 +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*) +| +--- androidx.compose.ui:ui:1.3.2 +| | +--- androidx.annotation:annotation:1.5.0 (*) +| | +--- androidx.compose.runtime:runtime-saveable:1.3.2 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | \--- androidx.compose.runtime:runtime:1.3.2 (*) +| | +--- androidx.compose.ui:ui-geometry:1.3.2 +| | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | +--- androidx.compose.ui:ui-graphics:1.3.2 +| | | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) +| | | \--- androidx.compose.ui:ui-unit:1.3.2 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | \--- androidx.compose.ui:ui-geometry:1.3.2 (*) +| | +--- androidx.compose.ui:ui-text:1.3.2 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | +--- androidx.compose.ui:ui-graphics:1.3.2 (*) +| | | \--- androidx.compose.ui:ui-unit:1.3.2 (*) +| | \--- androidx.compose.ui:ui-unit:1.3.2 (*) +| +--- androidx.compose.ui:ui-tooling-data:1.3.2 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | +--- androidx.compose.runtime:runtime:1.2.0 -> 1.3.2 (*) +| | \--- androidx.compose.ui:ui:1.3.2 (*) +| \--- androidx.compose.ui:ui-tooling-preview:1.3.2 +| +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) +| \--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*) ++--- androidx.compose.ui:ui-test-manifest:1.3.2 +| \--- androidx.activity:activity:1.2.0 -> 1.6.1 +| +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| +--- androidx.core:core:1.8.0 -> 1.9.0 +| | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) +| | +--- androidx.annotation:annotation-experimental:1.3.0 +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | +--- androidx.lifecycle:lifecycle-runtime:2.3.1 -> 2.5.1 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | +--- androidx.arch.core:core-common:2.1.0 +| | | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | \--- androidx.lifecycle:lifecycle-common:2.5.1 +| | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | \--- androidx.versionedparcelable:versionedparcelable:1.1.1 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | \--- androidx.collection:collection:1.0.0 -> 1.2.0 +| | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| +--- androidx.lifecycle:lifecycle-runtime:2.5.1 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 +| | +--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*) +| | +--- androidx.core:core-ktx:1.2.0 -> 1.9.0 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | +--- androidx.core:core:1.9.0 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | +--- androidx.lifecycle:lifecycle-livedata-core:2.5.1 +| | | \--- androidx.lifecycle:lifecycle-common:2.5.1 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 (*) +| | +--- androidx.savedstate:savedstate:1.2.0 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 (*) +| +--- androidx.savedstate:savedstate:1.2.0 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) ++--- project :app (*) ++--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:{strictly 1.7.20} -> 1.7.20 (c) ++--- androidx.compose.ui:ui-tooling:{strictly 1.3.2} -> 1.3.2 (c) ++--- androidx.compose.ui:ui-test-manifest:{strictly 1.3.2} -> 1.3.2 (c) ++--- androidx.core:core-ktx:1.9.0 (*) ++--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 +| +--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*) +| +--- androidx.lifecycle:lifecycle-runtime:2.5.1 (*) +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 (*) ++--- androidx.activity:activity-compose:1.6.1 +| +--- androidx.activity:activity-ktx:1.6.1 +| | +--- androidx.activity:activity:1.6.1 (*) +| | +--- androidx.core:core-ktx:1.1.0 -> 1.9.0 (*) +| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 +| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 (*) +| | +--- androidx.savedstate:savedstate-ktx:1.2.0 +| | | +--- androidx.savedstate:savedstate:1.2.0 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2 (*) +| +--- androidx.compose.runtime:runtime-saveable:1.0.1 -> 1.3.2 (*) +| \--- androidx.compose.ui:ui:1.0.1 -> 1.3.2 (*) ++--- androidx.compose.ui:ui:1.3.2 (*) ++--- androidx.compose.ui:ui-tooling-preview:1.3.2 (*) ++--- androidx.compose.material:material:1.3.1 +| +--- androidx.compose.animation:animation-core:1.0.0 -> 1.3.2 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (*) +| +--- androidx.compose.foundation:foundation:1.2.0 -> 1.2.1 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | +--- androidx.compose.animation:animation:1.1.1 -> 1.3.2 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | +--- androidx.compose.animation:animation-core:1.3.2 (*) +| | | +--- androidx.compose.foundation:foundation-layout:1.0.0 -> 1.2.1 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | +--- androidx.compose.ui:ui:1.2.1 -> 1.3.2 (*) +| | | | \--- androidx.compose.ui:ui-unit:1.1.1 -> 1.3.2 (*) +| | | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*) +| | | +--- androidx.compose.ui:ui:1.0.0 -> 1.3.2 (*) +| | | \--- androidx.compose.ui:ui-geometry:1.0.0 -> 1.3.2 (*) +| | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.3.2 (*) +| | \--- androidx.compose.ui:ui:1.2.1 -> 1.3.2 (*) +| +--- androidx.compose.material:material-icons-core:1.3.1 +| | \--- androidx.compose.ui:ui:1.0.0 -> 1.3.2 (*) +| +--- androidx.compose.material:material-ripple:1.3.1 +| | +--- androidx.compose.foundation:foundation:1.1.1 -> 1.2.1 (*) +| | \--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*) +| +--- androidx.compose.runtime:runtime:1.2.0 -> 1.3.2 (*) +| +--- androidx.compose.ui:ui:1.2.0 -> 1.3.2 (*) +| \--- androidx.compose.ui:ui-text:1.2.0 -> 1.3.2 (*) ++--- androidx.navigation:navigation-compose:2.5.3 +| +--- androidx.activity:activity-compose:1.5.1 -> 1.6.1 (*) +| +--- androidx.compose.animation:animation:1.0.1 -> 1.3.2 (*) +| +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2 (*) +| +--- androidx.compose.runtime:runtime-saveable:1.0.1 -> 1.3.2 (*) +| +--- androidx.compose.ui:ui:1.0.1 -> 1.3.2 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.5.1 +| | +--- androidx.annotation:annotation-experimental:1.1.0 -> 1.3.0 (*) +| | +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2 (*) +| | +--- androidx.compose.ui:ui:1.0.1 -> 1.3.2 (*) +| | +--- androidx.lifecycle:lifecycle-common-java8:2.5.1 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | \--- androidx.lifecycle:lifecycle-common:2.5.1 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 (*) +| | \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 (*) +| \--- androidx.navigation:navigation-runtime-ktx:2.5.3 +| +--- androidx.navigation:navigation-common-ktx:2.5.3 +| | \--- androidx.navigation:navigation-common:2.5.3 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 (*) +| | +--- androidx.savedstate:savedstate-ktx:1.2.0 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| \--- androidx.navigation:navigation-runtime:2.5.3 +| +--- androidx.activity:activity-ktx:1.5.1 -> 1.6.1 (*) +| +--- androidx.annotation:annotation-experimental:1.1.0 -> 1.3.0 (*) +| +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 (*) +| +--- androidx.navigation:navigation-common:2.5.3 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) ++--- io.coil-kt:coil-compose:2.2.2 +| +--- io.coil-kt:coil-compose-base:2.2.2 +| | +--- io.coil-kt:coil-base:2.2.2 +| | | +--- androidx.lifecycle:lifecycle-runtime:2.4.1 -> 2.5.1 (*) +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10 -> 1.7.20 (*) +| | | +--- com.squareup.okhttp3:okhttp:4.10.0 +| | | | +--- com.squareup.okio:okio:3.0.0 -> 3.2.0 +| | | | | \--- com.squareup.okio:okio-jvm:3.2.0 +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.20 -> 1.7.20 (*) +| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.20 -> 1.7.20 +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*) +| | | \--- com.squareup.okio:okio:3.2.0 (*) +| | \--- androidx.compose.foundation:foundation:1.2.1 (*) +| \--- io.coil-kt:coil:2.2.2 +| \--- io.coil-kt:coil-base:2.2.2 (*) ++--- fr.acinq.secp256k1:secp256k1-kmp-jni-android:0.7.0 +| +--- fr.acinq.secp256k1:secp256k1-kmp-jni-common:0.7.0 +| | +--- fr.acinq.secp256k1:secp256k1-kmp:0.7.0 +| | | \--- fr.acinq.secp256k1:secp256k1-kmp-jvm:0.7.0 +| | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.20 +| | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*) ++--- com.github.Giszmo.NostrPostr:nostrpostrlib:master-SNAPSHOT ++--- junit:junit:4.13.2 +| \--- org.hamcrest:hamcrest-core:1.3 ++--- androidx.core:core-ktx:{strictly 1.9.0} -> 1.9.0 (c) ++--- androidx.lifecycle:lifecycle-runtime-ktx:{strictly 2.5.1} -> 2.5.1 (c) ++--- androidx.activity:activity-compose:{strictly 1.6.1} -> 1.6.1 (c) ++--- androidx.compose.ui:ui:{strictly 1.3.2} -> 1.3.2 (c) ++--- androidx.compose.ui:ui-tooling-preview:{strictly 1.3.2} -> 1.3.2 (c) ++--- androidx.compose.material:material:{strictly 1.3.1} -> 1.3.1 (c) ++--- androidx.navigation:navigation-compose:{strictly 2.5.3} -> 2.5.3 (c) ++--- io.coil-kt:coil-compose:{strictly 2.2.2} -> 2.2.2 (c) ++--- fr.acinq.secp256k1:secp256k1-kmp-jni-android:{strictly 0.7.0} -> 0.7.0 (c) ++--- com.github.Giszmo.NostrPostr:nostrpostrlib:{strictly master-SNAPSHOT} -> master-SNAPSHOT (c) ++--- junit:junit:{strictly 4.13.2} -> 4.13.2 (c) ++--- org.jetbrains.kotlin:kotlin-stdlib:{strictly 1.7.20} -> 1.7.20 (c) ++--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:{strictly 1.7.20} -> 1.7.20 (c) ++--- androidx.annotation:annotation:{strictly 1.5.0} -> 1.5.0 (c) ++--- androidx.compose.runtime:runtime:{strictly 1.3.2} -> 1.3.2 (c) ++--- androidx.compose.ui:ui-tooling-data:{strictly 1.3.2} -> 1.3.2 (c) ++--- androidx.activity:activity:{strictly 1.6.1} -> 1.6.1 (c) ++--- androidx.core:core:{strictly 1.9.0} -> 1.9.0 (c) ++--- androidx.lifecycle:lifecycle-runtime:{strictly 2.5.1} -> 2.5.1 (c) ++--- org.jetbrains.kotlinx:kotlinx-coroutines-android:{strictly 1.6.4} -> 1.6.4 (c) ++--- androidx.activity:activity-ktx:{strictly 1.6.1} -> 1.6.1 (c) ++--- androidx.compose.runtime:runtime-saveable:{strictly 1.3.2} -> 1.3.2 (c) ++--- androidx.compose.ui:ui-geometry:{strictly 1.3.2} -> 1.3.2 (c) ++--- androidx.compose.ui:ui-graphics:{strictly 1.3.2} -> 1.3.2 (c) ++--- androidx.compose.ui:ui-text:{strictly 1.3.2} -> 1.3.2 (c) ++--- androidx.compose.ui:ui-unit:{strictly 1.3.2} -> 1.3.2 (c) ++--- androidx.compose.animation:animation-core:{strictly 1.3.2} -> 1.3.2 (c) ++--- androidx.compose.foundation:foundation:{strictly 1.2.1} -> 1.2.1 (c) ++--- androidx.compose.material:material-icons-core:{strictly 1.3.1} -> 1.3.1 (c) ++--- androidx.compose.material:material-ripple:{strictly 1.3.1} -> 1.3.1 (c) ++--- androidx.compose.animation:animation:{strictly 1.3.2} -> 1.3.2 (c) ++--- androidx.lifecycle:lifecycle-viewmodel-compose:{strictly 2.5.1} -> 2.5.1 (c) ++--- androidx.navigation:navigation-runtime-ktx:{strictly 2.5.3} -> 2.5.3 (c) ++--- io.coil-kt:coil-compose-base:{strictly 2.2.2} -> 2.2.2 (c) ++--- io.coil-kt:coil:{strictly 2.2.2} -> 2.2.2 (c) ++--- fr.acinq.secp256k1:secp256k1-kmp-jni-common:{strictly 0.7.0} -> 0.7.0 (c) ++--- org.hamcrest:hamcrest-core:{strictly 1.3} -> 1.3 (c) ++--- org.jetbrains.kotlin:kotlin-stdlib-common:{strictly 1.7.20} -> 1.7.20 (c) ++--- org.jetbrains:annotations:{strictly 13.0} -> 13.0 (c) ++--- androidx.lifecycle:lifecycle-viewmodel:{strictly 2.5.1} -> 2.5.1 (c) ++--- androidx.lifecycle:lifecycle-viewmodel-savedstate:{strictly 2.5.1} -> 2.5.1 (c) ++--- androidx.savedstate:savedstate:{strictly 1.2.0} -> 1.2.0 (c) ++--- androidx.annotation:annotation-experimental:{strictly 1.3.0} -> 1.3.0 (c) ++--- androidx.versionedparcelable:versionedparcelable:{strictly 1.1.1} -> 1.1.1 (c) ++--- androidx.arch.core:core-common:{strictly 2.1.0} -> 2.1.0 (c) ++--- androidx.lifecycle:lifecycle-common:{strictly 2.5.1} -> 2.5.1 (c) ++--- org.jetbrains.kotlinx:kotlinx-coroutines-core:{strictly 1.6.4} -> 1.6.4 (c) ++--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:{strictly 1.6.4} -> 1.6.4 (c) ++--- androidx.lifecycle:lifecycle-viewmodel-ktx:{strictly 2.5.1} -> 2.5.1 (c) ++--- androidx.savedstate:savedstate-ktx:{strictly 1.2.0} -> 1.2.0 (c) ++--- androidx.compose.foundation:foundation-layout:{strictly 1.2.1} -> 1.2.1 (c) ++--- androidx.lifecycle:lifecycle-common-java8:{strictly 2.5.1} -> 2.5.1 (c) ++--- androidx.navigation:navigation-common-ktx:{strictly 2.5.3} -> 2.5.3 (c) ++--- androidx.navigation:navigation-runtime:{strictly 2.5.3} -> 2.5.3 (c) ++--- io.coil-kt:coil-base:{strictly 2.2.2} -> 2.2.2 (c) ++--- fr.acinq.secp256k1:secp256k1-kmp:{strictly 0.7.0} -> 0.7.0 (c) ++--- androidx.lifecycle:lifecycle-livedata-core:{strictly 2.5.1} -> 2.5.1 (c) ++--- androidx.collection:collection:{strictly 1.2.0} -> 1.2.0 (c) ++--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:{strictly 1.6.4} -> 1.6.4 (c) ++--- androidx.navigation:navigation-common:{strictly 2.5.3} -> 2.5.3 (c) ++--- com.squareup.okhttp3:okhttp:{strictly 4.10.0} -> 4.10.0 (c) ++--- com.squareup.okio:okio:{strictly 3.2.0} -> 3.2.0 (c) ++--- fr.acinq.secp256k1:secp256k1-kmp-jvm:{strictly 0.7.0} -> 0.7.0 (c) +\--- com.squareup.okio:okio-jvm:{strictly 3.2.0} -> 3.2.0 (c) + +debugUnitTestCompileOnly - Compile only dependencies for compilation 'debugUnitTest' (target (androidJvm)). (n) +No dependencies + +debugUnitTestCompileOnlyDependenciesMetadata +No dependencies + +debugUnitTestImplementation - Implementation only dependencies for compilation 'debugUnitTest' (target (androidJvm)). (n) +No dependencies + +debugUnitTestImplementationDependenciesMetadata +\--- junit:junit:4.13.2 + \--- org.hamcrest:hamcrest-core:1.3 + +debugUnitTestIntransitiveDependenciesMetadata +No dependencies + +debugUnitTestRuntimeClasspath - Runtime classpath of compilation 'debugUnitTest' (target (androidJvm)). ++--- project :app (*) ++--- junit:junit:4.13.2 +| \--- org.hamcrest:hamcrest-core:1.3 ++--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.20 +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20 +| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.20 +| | \--- org.jetbrains:annotations:13.0 +| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.20 +| \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20 (*) ++--- androidx.compose.ui:ui-tooling:1.3.2 +| +--- androidx.activity:activity-compose:1.3.0 -> 1.6.1 +| | +--- androidx.activity:activity-ktx:1.6.1 +| | | +--- androidx.activity:activity:1.6.1 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 +| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | | | +--- androidx.collection:collection:1.0.0 -> 1.2.0 +| | | | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | +--- androidx.core:core:1.8.0 -> 1.9.0 +| | | | | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) +| | | | | +--- androidx.annotation:annotation-experimental:1.3.0 +| | | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | | | | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*) +| | | | | +--- androidx.concurrent:concurrent-futures:1.0.0 +| | | | | | +--- com.google.guava:listenablefuture:1.0 +| | | | | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | | +--- androidx.lifecycle:lifecycle-runtime:2.3.1 -> 2.5.1 +| | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | | | +--- androidx.arch.core:core-common:2.1.0 +| | | | | | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | | | +--- androidx.arch.core:core-runtime:2.1.0 +| | | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | | | | \--- androidx.arch.core:core-common:2.1.0 (*) +| | | | | | \--- androidx.lifecycle:lifecycle-common:2.5.1 +| | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | | | \--- androidx.lifecycle:lifecycle-common-java8:2.5.1 (c) +| | | | | +--- androidx.versionedparcelable:versionedparcelable:1.1.1 +| | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | | | \--- androidx.collection:collection:1.0.0 -> 1.2.0 (*) +| | | | | \--- androidx.core:core-ktx:1.9.0 (c) +| | | | +--- androidx.lifecycle:lifecycle-runtime:2.5.1 (*) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 +| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| | | | | \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 +| | | | | +--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*) +| | | | | +--- androidx.core:core-ktx:1.2.0 -> 1.9.0 +| | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | | | +--- androidx.core:core:1.9.0 (*) +| | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | | | | | \--- androidx.core:core:1.9.0 (c) +| | | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.5.1 +| | | | | | +--- androidx.arch.core:core-common:2.1.0 (*) +| | | | | | +--- androidx.arch.core:core-runtime:2.1.0 (*) +| | | | | | \--- androidx.lifecycle:lifecycle-common:2.5.1 (*) +| | | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 (*) +| | | | | +--- androidx.savedstate:savedstate:1.2.0 +| | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | | | +--- androidx.arch.core:core-common:2.1.0 (*) +| | | | | | +--- androidx.lifecycle:lifecycle-common:2.4.0 -> 2.5.1 (*) +| | | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*) +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| | | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 +| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 +| | | | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.4 +| | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4 +| | | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (c) +| | | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.4 (c) +| | | | | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (c) +| | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*) +| | | | | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.20 +| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4 (*) +| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*) +| | | | +--- androidx.savedstate:savedstate:1.2.0 (*) +| | | | +--- androidx.tracing:tracing:1.0.0 +| | | | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | | | \--- androidx.activity:activity-ktx:1.6.1 (c) +| | | +--- androidx.core:core-ktx:1.1.0 -> 1.9.0 (*) +| | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 +| | | | +--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*) +| | | | +--- androidx.lifecycle:lifecycle-runtime:2.5.1 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 (*) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 +| | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 (*) +| | | +--- androidx.savedstate:savedstate-ktx:1.2.0 +| | | | +--- androidx.savedstate:savedstate:1.2.0 (*) +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | | \--- androidx.activity:activity:1.6.1 (c) +| | +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (*) +| | +--- androidx.compose.runtime:runtime-saveable:1.0.1 -> 1.3.2 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | +--- androidx.compose.runtime:runtime:1.3.2 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | +--- androidx.compose.ui:ui:1.0.1 -> 1.3.2 +| | | +--- androidx.activity:activity-ktx:1.5.1 -> 1.6.1 (*) +| | | +--- androidx.annotation:annotation:1.5.0 (*) +| | | +--- androidx.autofill:autofill:1.0.0 +| | | | \--- androidx.core:core:1.1.0 -> 1.9.0 (*) +| | | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*) +| | | +--- androidx.compose.runtime:runtime:1.3.2 (*) +| | | +--- androidx.compose.runtime:runtime-saveable:1.3.2 (*) +| | | +--- androidx.compose.ui:ui-geometry:1.3.2 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*) +| | | | +--- androidx.compose.ui:ui-util:1.3.2 +| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | | +--- androidx.compose.ui:ui-graphics:1.3.2 +| | | | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) +| | | | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*) +| | | | +--- androidx.compose.ui:ui-unit:1.3.2 +| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*) +| | | | | +--- androidx.compose.ui:ui-geometry:1.3.2 (*) +| | | | | +--- androidx.compose.ui:ui-util:1.3.2 (*) +| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | | | +--- androidx.compose.ui:ui-util:1.3.2 (*) +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10 -> 1.7.20 +| | | +--- androidx.compose.ui:ui-text:1.3.2 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*) +| | | | +--- androidx.compose.runtime:runtime:1.2.0 -> 1.3.2 (*) +| | | | +--- androidx.compose.runtime:runtime-saveable:1.2.0 -> 1.3.2 (*) +| | | | +--- androidx.compose.ui:ui-graphics:1.3.2 (*) +| | | | +--- androidx.compose.ui:ui-unit:1.3.2 (*) +| | | | +--- androidx.compose.ui:ui-util:1.3.2 (*) +| | | | +--- androidx.core:core:1.7.0 -> 1.9.0 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10 -> 1.7.20 +| | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (*) +| | | +--- androidx.compose.ui:ui-unit:1.3.2 (*) +| | | +--- androidx.compose.ui:ui-util:1.3.2 (*) +| | | +--- androidx.core:core:1.5.0 -> 1.9.0 (*) +| | | +--- androidx.customview:customview-poolingcontainer:1.0.0 +| | | | +--- androidx.core:core-ktx:1.5.0 -> 1.9.0 (*) +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| | | +--- androidx.lifecycle:lifecycle-common-java8:2.3.0 -> 2.5.1 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | \--- androidx.lifecycle:lifecycle-common:2.5.1 (*) +| | | +--- androidx.lifecycle:lifecycle-runtime:2.3.0 -> 2.5.1 (*) +| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.3.0 -> 2.5.1 (*) +| | | +--- androidx.profileinstaller:profileinstaller:1.2.0 +| | | | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) +| | | | \--- androidx.startup:startup-runtime:1.1.1 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | \--- androidx.tracing:tracing:1.0.0 (*) +| | | +--- androidx.savedstate:savedstate-ktx:1.2.0 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10 -> 1.7.20 +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (*) +| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (*) +| | +--- androidx.lifecycle:lifecycle-common-java8:2.5.1 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| +--- androidx.compose.animation:animation:1.3.2 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | +--- androidx.compose.animation:animation-core:1.3.2 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*) +| | | +--- androidx.compose.ui:ui:1.2.0 -> 1.3.2 (*) +| | | +--- androidx.compose.ui:ui-unit:1.0.0 -> 1.3.2 (*) +| | | +--- androidx.compose.ui:ui-util:1.0.0 -> 1.3.2 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (*) +| | +--- androidx.compose.foundation:foundation-layout:1.0.0 -> 1.2.1 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | +--- androidx.compose.animation:animation-core:1.1.1 -> 1.3.2 (*) +| | | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.3.2 (*) +| | | +--- androidx.compose.ui:ui:1.2.1 -> 1.3.2 (*) +| | | +--- androidx.compose.ui:ui-unit:1.1.1 -> 1.3.2 (*) +| | | +--- androidx.compose.ui:ui-util:1.0.0 -> 1.3.2 (*) +| | | +--- androidx.core:core:1.7.0 -> 1.9.0 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.20 +| | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*) +| | +--- androidx.compose.ui:ui:1.0.0 -> 1.3.2 (*) +| | +--- androidx.compose.ui:ui-geometry:1.0.0 -> 1.3.2 (*) +| | +--- androidx.compose.ui:ui-util:1.0.0 -> 1.3.2 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10 -> 1.7.20 +| +--- androidx.compose.material:material:1.0.0 -> 1.3.1 +| | +--- androidx.compose.animation:animation:1.0.0 -> 1.3.2 (*) +| | +--- androidx.compose.animation:animation-core:1.0.0 -> 1.3.2 (*) +| | +--- androidx.compose.foundation:foundation:1.2.0 -> 1.2.1 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | +--- androidx.compose.animation:animation:1.1.1 -> 1.3.2 (*) +| | | +--- androidx.compose.foundation:foundation-layout:1.2.1 (*) +| | | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.3.2 (*) +| | | +--- androidx.compose.ui:ui:1.2.1 -> 1.3.2 (*) +| | | +--- androidx.compose.ui:ui-graphics:1.1.1 -> 1.3.2 (*) +| | | +--- androidx.compose.ui:ui-text:1.0.0 -> 1.3.2 (*) +| | | +--- androidx.compose.ui:ui-util:1.0.0 -> 1.3.2 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.20 +| | +--- androidx.compose.foundation:foundation-layout:1.1.1 -> 1.2.1 (*) +| | +--- androidx.compose.material:material-icons-core:1.3.1 +| | | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*) +| | | +--- androidx.compose.ui:ui:1.0.0 -> 1.3.2 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | +--- androidx.compose.material:material-ripple:1.3.1 +| | | +--- androidx.compose.animation:animation:1.0.0 -> 1.3.2 (*) +| | | +--- androidx.compose.foundation:foundation:1.1.1 -> 1.2.1 (*) +| | | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*) +| | | +--- androidx.compose.ui:ui-util:1.0.0 -> 1.3.2 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10 -> 1.7.20 +| | +--- androidx.compose.runtime:runtime:1.2.0 -> 1.3.2 (*) +| | +--- androidx.compose.ui:ui:1.2.0 -> 1.3.2 (*) +| | +--- androidx.compose.ui:ui-text:1.2.0 -> 1.3.2 (*) +| | +--- androidx.compose.ui:ui-util:1.0.0 -> 1.3.2 (*) +| | +--- androidx.lifecycle:lifecycle-runtime:2.3.0 -> 2.5.1 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel:2.3.0 -> 2.5.1 (*) +| | +--- androidx.savedstate:savedstate:1.1.0 -> 1.2.0 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10 -> 1.7.20 +| +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*) +| +--- androidx.compose.ui:ui:1.3.2 (*) +| +--- androidx.compose.ui:ui-tooling-data:1.3.2 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | +--- androidx.compose.runtime:runtime:1.2.0 -> 1.3.2 (*) +| | +--- androidx.compose.ui:ui:1.3.2 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| +--- androidx.compose.ui:ui-tooling-preview:1.3.2 +| | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) +| | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| +--- androidx.savedstate:savedstate-ktx:1.2.0 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) ++--- androidx.compose.ui:ui-test-manifest:1.3.2 +| \--- androidx.activity:activity:1.2.0 -> 1.6.1 (*) ++--- androidx.core:core-ktx:1.9.0 (*) ++--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (*) ++--- androidx.activity:activity-compose:1.6.1 (*) ++--- androidx.compose.ui:ui:1.3.2 (*) ++--- androidx.compose.ui:ui-tooling-preview:1.3.2 (*) ++--- androidx.compose.material:material:1.3.1 (*) ++--- androidx.navigation:navigation-compose:2.5.3 +| +--- androidx.activity:activity-compose:1.5.1 -> 1.6.1 (*) +| +--- androidx.compose.animation:animation:1.0.1 -> 1.3.2 (*) +| +--- androidx.compose.foundation:foundation-layout:1.0.1 -> 1.2.1 (*) +| +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2 (*) +| +--- androidx.compose.runtime:runtime-saveable:1.0.1 -> 1.3.2 (*) +| +--- androidx.compose.ui:ui:1.0.1 -> 1.3.2 (*) +| +--- androidx.lifecycle:lifecycle-common-java8:2.5.1 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.5.1 +| | +--- androidx.annotation:annotation-experimental:1.1.0 -> 1.3.0 (*) +| | +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2 (*) +| | +--- androidx.compose.ui:ui:1.0.1 -> 1.3.2 (*) +| | +--- androidx.lifecycle:lifecycle-common-java8:2.5.1 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| +--- androidx.navigation:navigation-runtime-ktx:2.5.3 +| | +--- androidx.navigation:navigation-common-ktx:2.5.3 +| | | \--- androidx.navigation:navigation-common:2.5.3 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | +--- androidx.collection:collection-ktx:1.1.0 +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.3.20 -> 1.7.20 (*) +| | | | \--- androidx.collection:collection:1.1.0 -> 1.2.0 (*) +| | | +--- androidx.core:core-ktx:1.1.0 -> 1.9.0 (*) +| | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (*) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 (*) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 (*) +| | | +--- androidx.savedstate:savedstate-ktx:1.2.0 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| | \--- androidx.navigation:navigation-runtime:2.5.3 +| | +--- androidx.activity:activity-ktx:1.5.1 -> 1.6.1 (*) +| | +--- androidx.annotation:annotation-experimental:1.1.0 -> 1.3.0 (*) +| | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*) +| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 (*) +| | +--- androidx.navigation:navigation-common:2.5.3 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) ++--- io.coil-kt:coil-compose:2.2.2 +| +--- io.coil-kt:coil-compose-base:2.2.2 +| | +--- io.coil-kt:coil-base:2.2.2 +| | | +--- androidx.lifecycle:lifecycle-runtime:2.4.1 -> 2.5.1 (*) +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10 -> 1.7.20 (*) +| | | +--- com.squareup.okhttp3:okhttp:4.10.0 +| | | | +--- com.squareup.okio:okio:3.0.0 -> 3.2.0 +| | | | | \--- com.squareup.okio:okio-jvm:3.2.0 +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.20 -> 1.7.20 (*) +| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.20 -> 1.7.20 +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*) +| | | +--- com.squareup.okio:okio:3.2.0 (*) +| | | +--- androidx.annotation:annotation:1.5.0 (*) +| | | +--- androidx.appcompat:appcompat-resources:1.4.2 +| | | | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*) +| | | | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) +| | | | +--- androidx.core:core:1.0.1 -> 1.9.0 (*) +| | | | +--- androidx.vectordrawable:vectordrawable:1.1.0 +| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | | +--- androidx.core:core:1.1.0 -> 1.9.0 (*) +| | | | | \--- androidx.collection:collection:1.1.0 -> 1.2.0 (*) +| | | | \--- androidx.vectordrawable:vectordrawable-animated:1.1.0 +| | | | +--- androidx.vectordrawable:vectordrawable:1.1.0 (*) +| | | | +--- androidx.interpolator:interpolator:1.0.0 +| | | | | \--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*) +| | | | \--- androidx.collection:collection:1.1.0 -> 1.2.0 (*) +| | | +--- androidx.collection:collection:1.2.0 (*) +| | | +--- androidx.core:core-ktx:1.8.0 -> 1.9.0 (*) +| | | \--- androidx.exifinterface:exifinterface:1.3.3 +| | | \--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) +| | +--- androidx.compose.foundation:foundation:1.2.1 (*) +| | +--- androidx.core:core-ktx:1.8.0 -> 1.9.0 (*) +| | \--- com.google.accompanist:accompanist-drawablepainter:0.25.1 +| | \--- androidx.compose.ui:ui:1.2.1 -> 1.3.2 (*) +| \--- io.coil-kt:coil:2.2.2 +| \--- io.coil-kt:coil-base:2.2.2 (*) ++--- fr.acinq.secp256k1:secp256k1-kmp-jni-android:0.7.0 +| +--- fr.acinq.secp256k1:secp256k1-kmp-jni-common:0.7.0 +| | +--- fr.acinq.secp256k1:secp256k1-kmp:0.7.0 +| | | \--- fr.acinq.secp256k1:secp256k1-kmp-jvm:0.7.0 +| | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.20 +| | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*) +\--- com.github.Giszmo.NostrPostr:nostrpostrlib:master-SNAPSHOT + +--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.10 -> 1.7.20 (*) + +--- com.squareup.retrofit2:retrofit:2.8.1 + | \--- com.squareup.okhttp3:okhttp:3.14.7 -> 4.10.0 (*) + +--- com.squareup.retrofit2:converter-gson:2.8.1 + | +--- com.squareup.retrofit2:retrofit:2.8.1 (*) + | \--- com.google.code.gson:gson:2.8.5 + +--- com.squareup.okhttp3:okhttp:4.9.3 -> 4.10.0 (*) + +--- com.madgag.spongycastle:core:1.51.0.0 + +--- com.madgag.spongycastle:prov:1.51.0.0 + | \--- com.madgag.spongycastle:core:1.51.0.0 + \--- com.github.mgunlogson:cuckoofilter4j:1.0.1 + \--- com.google.guava:guava:19.0 + +debugUnitTestRuntimeOnly - Runtime only dependencies for compilation 'debugUnitTest' (target (androidJvm)). (n) +No dependencies + +debugUnitTestRuntimeOnlyDependenciesMetadata +No dependencies + +debugWearApp - Link to a wear app to embed for object 'debug'. (n) +No dependencies + +debugWearBundling - Resolved Configuration for wear app bundling for variant: debug +No dependencies + +default - Configuration for default artifacts. (n) +No dependencies + +implementation - Implementation only dependencies for 'main' sources. (n) ++--- androidx.core:core-ktx:1.9.0 (n) ++--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (n) ++--- androidx.activity:activity-compose:1.6.1 (n) ++--- androidx.compose.ui:ui:1.3.2 (n) ++--- androidx.compose.ui:ui-tooling-preview:1.3.2 (n) ++--- androidx.compose.material:material:1.3.1 (n) ++--- androidx.navigation:navigation-compose:2.5.3 (n) ++--- io.coil-kt:coil-compose:2.2.2 (n) ++--- fr.acinq.secp256k1:secp256k1-kmp-jni-android:0.7.0 (n) +\--- com.github.Giszmo.NostrPostr:nostrpostrlib:master-SNAPSHOT (n) + +implementationDependenciesMetadata ++--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.20 +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20 +| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.20 +| | \--- org.jetbrains:annotations:13.0 +| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.20 +| \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20 (*) ++--- androidx.core:core-ktx:1.9.0 +| +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| +--- androidx.core:core:1.9.0 +| | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) +| | +--- androidx.annotation:annotation-experimental:1.3.0 +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | +--- androidx.lifecycle:lifecycle-runtime:2.3.1 -> 2.5.1 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | +--- androidx.arch.core:core-common:2.1.0 +| | | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | \--- androidx.lifecycle:lifecycle-common:2.5.1 +| | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | \--- androidx.versionedparcelable:versionedparcelable:1.1.1 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | \--- androidx.collection:collection:1.0.0 +| | \--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) ++--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 +| +--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*) +| +--- androidx.lifecycle:lifecycle-runtime:2.5.1 (*) +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 +| +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 +| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.20 +| | \--- org.jetbrains.kotlinx:atomicfu:0.17.3 +| | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.20 -> 1.7.20 +| +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4 +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (c) +| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (c) +| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*) ++--- androidx.activity:activity-compose:1.6.1 +| +--- androidx.activity:activity-ktx:1.6.1 +| | +--- androidx.activity:activity:1.6.1 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | +--- androidx.core:core:1.8.0 -> 1.9.0 (*) +| | | +--- androidx.lifecycle:lifecycle-runtime:2.5.1 (*) +| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 +| | | | +--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*) +| | | | +--- androidx.core:core-ktx:1.2.0 -> 1.9.0 (*) +| | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.5.1 +| | | | | \--- androidx.lifecycle:lifecycle-common:2.5.1 (*) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 (*) +| | | | +--- androidx.savedstate:savedstate:1.2.0 +| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 (*) +| | | +--- androidx.savedstate:savedstate:1.2.0 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | +--- androidx.core:core-ktx:1.1.0 -> 1.9.0 (*) +| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 +| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 (*) +| | +--- androidx.savedstate:savedstate-ktx:1.2.0 +| | | +--- androidx.savedstate:savedstate:1.2.0 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2 +| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (*) +| +--- androidx.compose.runtime:runtime-saveable:1.0.1 -> 1.3.2 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | \--- androidx.compose.runtime:runtime:1.3.2 (*) +| \--- androidx.compose.ui:ui:1.0.1 -> 1.3.2 +| +--- androidx.annotation:annotation:1.5.0 (*) +| +--- androidx.compose.runtime:runtime-saveable:1.3.2 (*) +| +--- androidx.compose.ui:ui-geometry:1.3.2 +| | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| +--- androidx.compose.ui:ui-graphics:1.3.2 +| | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) +| | \--- androidx.compose.ui:ui-unit:1.3.2 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | \--- androidx.compose.ui:ui-geometry:1.3.2 (*) +| +--- androidx.compose.ui:ui-text:1.3.2 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | +--- androidx.compose.ui:ui-graphics:1.3.2 (*) +| | \--- androidx.compose.ui:ui-unit:1.3.2 (*) +| \--- androidx.compose.ui:ui-unit:1.3.2 (*) ++--- androidx.compose.ui:ui:1.3.2 (*) ++--- androidx.compose.ui:ui-tooling-preview:1.3.2 +| +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) +| \--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*) ++--- androidx.compose.material:material:1.3.1 +| +--- androidx.compose.animation:animation-core:1.0.0 -> 1.1.1 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.2 -> 1.6.4 (*) +| +--- androidx.compose.foundation:foundation:1.2.0 -> 1.2.1 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | +--- androidx.compose.animation:animation:1.1.1 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | +--- androidx.compose.animation:animation-core:1.1.1 (*) +| | | +--- androidx.compose.foundation:foundation-layout:1.0.0 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | \--- androidx.compose.ui:ui:1.0.0 -> 1.3.2 (*) +| | | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*) +| | | +--- androidx.compose.ui:ui:1.0.0 -> 1.3.2 (*) +| | | \--- androidx.compose.ui:ui-geometry:1.0.0 -> 1.3.2 (*) +| | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.3.2 (*) +| | \--- androidx.compose.ui:ui:1.2.1 -> 1.3.2 (*) +| +--- androidx.compose.material:material-icons-core:1.3.1 +| | \--- androidx.compose.ui:ui:1.0.0 -> 1.3.2 (*) +| +--- androidx.compose.material:material-ripple:1.3.1 +| | +--- androidx.compose.foundation:foundation:1.1.1 -> 1.2.1 (*) +| | \--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*) +| +--- androidx.compose.runtime:runtime:1.2.0 -> 1.3.2 (*) +| +--- androidx.compose.ui:ui:1.2.0 -> 1.3.2 (*) +| \--- androidx.compose.ui:ui-text:1.2.0 -> 1.3.2 (*) ++--- androidx.navigation:navigation-compose:2.5.3 +| +--- androidx.activity:activity-compose:1.5.1 -> 1.6.1 (*) +| +--- androidx.compose.animation:animation:1.0.1 -> 1.1.1 (*) +| +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2 (*) +| +--- androidx.compose.runtime:runtime-saveable:1.0.1 -> 1.3.2 (*) +| +--- androidx.compose.ui:ui:1.0.1 -> 1.3.2 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.5.1 +| | +--- androidx.annotation:annotation-experimental:1.1.0 -> 1.3.0 (*) +| | +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2 (*) +| | +--- androidx.compose.ui:ui:1.0.1 -> 1.3.2 (*) +| | +--- androidx.lifecycle:lifecycle-common-java8:2.5.1 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | \--- androidx.lifecycle:lifecycle-common:2.5.1 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 (*) +| | \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 (*) +| \--- androidx.navigation:navigation-runtime-ktx:2.5.3 +| +--- androidx.navigation:navigation-common-ktx:2.5.3 +| | \--- androidx.navigation:navigation-common:2.5.3 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 (*) +| | +--- androidx.savedstate:savedstate-ktx:1.2.0 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| \--- androidx.navigation:navigation-runtime:2.5.3 +| +--- androidx.activity:activity-ktx:1.5.1 -> 1.6.1 (*) +| +--- androidx.annotation:annotation-experimental:1.1.0 -> 1.3.0 (*) +| +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 (*) +| +--- androidx.navigation:navigation-common:2.5.3 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) ++--- io.coil-kt:coil-compose:2.2.2 +| +--- io.coil-kt:coil-compose-base:2.2.2 +| | +--- io.coil-kt:coil-base:2.2.2 +| | | +--- androidx.lifecycle:lifecycle-runtime:2.4.1 -> 2.5.1 (*) +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10 -> 1.7.20 (*) +| | | +--- com.squareup.okhttp3:okhttp:4.10.0 +| | | | +--- com.squareup.okio:okio:3.0.0 -> 3.2.0 +| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.20 -> 1.7.20 +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*) +| | | \--- com.squareup.okio:okio:3.2.0 (*) +| | \--- androidx.compose.foundation:foundation:1.2.1 (*) +| \--- io.coil-kt:coil:2.2.2 +| \--- io.coil-kt:coil-base:2.2.2 (*) ++--- fr.acinq.secp256k1:secp256k1-kmp-jni-android:0.7.0 +| +--- fr.acinq.secp256k1:secp256k1-kmp-jni-common:0.7.0 +| | +--- fr.acinq.secp256k1:secp256k1-kmp:0.7.0 +| | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.20 +| | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*) +\--- com.github.Giszmo.NostrPostr:nostrpostrlib:master-SNAPSHOT + +intransitiveDependenciesMetadata +No dependencies + +kotlin-extension - Configuration for Compose related kotlin compiler extension +\--- androidx.compose.compiler:compiler:1.3.2 + +kotlinCompilerClasspath +\--- org.jetbrains.kotlin:kotlin-compiler-embeddable:1.7.20 + +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20 + | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.20 + | \--- org.jetbrains:annotations:13.0 + +--- org.jetbrains.kotlin:kotlin-script-runtime:1.7.20 + +--- org.jetbrains.kotlin:kotlin-reflect:1.7.20 + | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20 (*) + +--- org.jetbrains.kotlin:kotlin-daemon-embeddable:1.7.20 + +--- org.jetbrains.intellij.deps:trove4j:1.0.20200330 + \--- net.java.dev.jna:jna:5.6.0 + +kotlinCompilerPluginClasspath +No dependencies + +kotlinCompilerPluginClasspathDebug - Kotlin compiler plugins for compilation 'debug' (target (androidJvm)) +No dependencies + +kotlinCompilerPluginClasspathDebugAndroidTest - Kotlin compiler plugins for compilation 'debugAndroidTest' (target (androidJvm)) +No dependencies + +kotlinCompilerPluginClasspathDebugUnitTest - Kotlin compiler plugins for compilation 'debugUnitTest' (target (androidJvm)) +No dependencies + +kotlinCompilerPluginClasspathRelease - Kotlin compiler plugins for compilation 'release' (target (androidJvm)) +No dependencies + +kotlinCompilerPluginClasspathReleaseUnitTest - Kotlin compiler plugins for compilation 'releaseUnitTest' (target (androidJvm)) +No dependencies + +kotlinKlibCommonizerClasspath +\--- org.jetbrains.kotlin:kotlin-klib-commonizer-embeddable:1.7.20 + +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20 + | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.20 + | \--- org.jetbrains:annotations:13.0 + \--- org.jetbrains.kotlin:kotlin-compiler-embeddable:1.7.20 + +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20 (*) + +--- org.jetbrains.kotlin:kotlin-script-runtime:1.7.20 + +--- org.jetbrains.kotlin:kotlin-reflect:1.7.20 + | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20 (*) + +--- org.jetbrains.kotlin:kotlin-daemon-embeddable:1.7.20 + +--- org.jetbrains.intellij.deps:trove4j:1.0.20200330 + \--- net.java.dev.jna:jna:5.6.0 + +kotlinNativeCompilerPluginClasspath +No dependencies + +lintChecks - Configuration to apply external lint check jar +No dependencies + +lintPublish - Configuration to publish external lint check jar +No dependencies + +releaseAabPublication - Bundle Publication for release (n) +No dependencies + +releaseAnnotationProcessor - Classpath for the annotation processor for 'release'. (n) +No dependencies + +releaseAnnotationProcessorClasspath - Resolved configuration for annotation-processor for variant: release +No dependencies + +releaseApi - API dependencies for compilation 'release' (target (androidJvm)). (n) +No dependencies + +releaseApiDependenciesMetadata +\--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.20 + +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20 + | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.20 + | \--- org.jetbrains:annotations:13.0 + \--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.20 + \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20 (*) + +releaseApiElements - API elements for release (n) +No dependencies + +releaseApkPublication - APK publication for release (n) +No dependencies + +releaseCompileClasspath - Compile classpath for compilation 'release' (target (androidJvm)). ++--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.20 +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20 +| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.20 +| | \--- org.jetbrains:annotations:13.0 +| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.20 +| \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20 (*) ++--- androidx.core:core-ktx:1.9.0 +| +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| +--- androidx.core:core:1.9.0 +| | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) +| | +--- androidx.annotation:annotation-experimental:1.3.0 +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | +--- androidx.lifecycle:lifecycle-runtime:2.3.1 -> 2.5.1 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | +--- androidx.arch.core:core-common:2.1.0 +| | | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | \--- androidx.lifecycle:lifecycle-common:2.5.1 +| | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | \--- androidx.versionedparcelable:versionedparcelable:1.1.1 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | \--- androidx.collection:collection:1.0.0 -> 1.2.0 +| | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) ++--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 +| +--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*) +| +--- androidx.lifecycle:lifecycle-runtime:2.5.1 (*) +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 +| +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 +| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.4 +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4 +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (c) +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.4 (c) +| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (c) +| | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.20 +| +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*) ++--- androidx.activity:activity-compose:1.6.1 +| +--- androidx.activity:activity-ktx:1.6.1 +| | +--- androidx.activity:activity:1.6.1 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | +--- androidx.core:core:1.8.0 -> 1.9.0 (*) +| | | +--- androidx.lifecycle:lifecycle-runtime:2.5.1 (*) +| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 +| | | | +--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*) +| | | | +--- androidx.core:core-ktx:1.2.0 -> 1.9.0 (*) +| | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.5.1 +| | | | | \--- androidx.lifecycle:lifecycle-common:2.5.1 (*) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 (*) +| | | | +--- androidx.savedstate:savedstate:1.2.0 +| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 (*) +| | | +--- androidx.savedstate:savedstate:1.2.0 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | +--- androidx.core:core-ktx:1.1.0 -> 1.9.0 (*) +| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 +| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 (*) +| | +--- androidx.savedstate:savedstate-ktx:1.2.0 +| | | +--- androidx.savedstate:savedstate:1.2.0 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2 +| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (*) +| +--- androidx.compose.runtime:runtime-saveable:1.0.1 -> 1.3.2 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | \--- androidx.compose.runtime:runtime:1.3.2 (*) +| \--- androidx.compose.ui:ui:1.0.1 -> 1.3.2 +| +--- androidx.annotation:annotation:1.5.0 (*) +| +--- androidx.compose.runtime:runtime-saveable:1.3.2 (*) +| +--- androidx.compose.ui:ui-geometry:1.3.2 +| | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| +--- androidx.compose.ui:ui-graphics:1.3.2 +| | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) +| | \--- androidx.compose.ui:ui-unit:1.3.2 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | \--- androidx.compose.ui:ui-geometry:1.3.2 (*) +| +--- androidx.compose.ui:ui-text:1.3.2 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | +--- androidx.compose.ui:ui-graphics:1.3.2 (*) +| | \--- androidx.compose.ui:ui-unit:1.3.2 (*) +| \--- androidx.compose.ui:ui-unit:1.3.2 (*) ++--- androidx.compose.ui:ui:1.3.2 (*) ++--- androidx.compose.ui:ui-tooling-preview:1.3.2 +| +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) +| \--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*) ++--- androidx.compose.material:material:1.3.1 +| +--- androidx.compose.animation:animation-core:1.0.0 -> 1.1.1 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.2 -> 1.6.4 (*) +| +--- androidx.compose.foundation:foundation:1.2.0 -> 1.2.1 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | +--- androidx.compose.animation:animation:1.1.1 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | +--- androidx.compose.animation:animation-core:1.1.1 (*) +| | | +--- androidx.compose.foundation:foundation-layout:1.0.0 -> 1.2.1 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | +--- androidx.compose.ui:ui:1.2.1 -> 1.3.2 (*) +| | | | \--- androidx.compose.ui:ui-unit:1.1.1 -> 1.3.2 (*) +| | | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*) +| | | +--- androidx.compose.ui:ui:1.0.0 -> 1.3.2 (*) +| | | \--- androidx.compose.ui:ui-geometry:1.0.0 -> 1.3.2 (*) +| | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.3.2 (*) +| | \--- androidx.compose.ui:ui:1.2.1 -> 1.3.2 (*) +| +--- androidx.compose.material:material-icons-core:1.3.1 +| | \--- androidx.compose.ui:ui:1.0.0 -> 1.3.2 (*) +| +--- androidx.compose.material:material-ripple:1.3.1 +| | +--- androidx.compose.foundation:foundation:1.1.1 -> 1.2.1 (*) +| | \--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*) +| +--- androidx.compose.runtime:runtime:1.2.0 -> 1.3.2 (*) +| +--- androidx.compose.ui:ui:1.2.0 -> 1.3.2 (*) +| \--- androidx.compose.ui:ui-text:1.2.0 -> 1.3.2 (*) ++--- androidx.navigation:navigation-compose:2.5.3 +| +--- androidx.activity:activity-compose:1.5.1 -> 1.6.1 (*) +| +--- androidx.compose.animation:animation:1.0.1 -> 1.1.1 (*) +| +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2 (*) +| +--- androidx.compose.runtime:runtime-saveable:1.0.1 -> 1.3.2 (*) +| +--- androidx.compose.ui:ui:1.0.1 -> 1.3.2 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.5.1 +| | +--- androidx.annotation:annotation-experimental:1.1.0 -> 1.3.0 (*) +| | +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2 (*) +| | +--- androidx.compose.ui:ui:1.0.1 -> 1.3.2 (*) +| | +--- androidx.lifecycle:lifecycle-common-java8:2.5.1 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | \--- androidx.lifecycle:lifecycle-common:2.5.1 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 (*) +| | \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 (*) +| \--- androidx.navigation:navigation-runtime-ktx:2.5.3 +| +--- androidx.navigation:navigation-common-ktx:2.5.3 +| | \--- androidx.navigation:navigation-common:2.5.3 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 (*) +| | +--- androidx.savedstate:savedstate-ktx:1.2.0 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| \--- androidx.navigation:navigation-runtime:2.5.3 +| +--- androidx.activity:activity-ktx:1.5.1 -> 1.6.1 (*) +| +--- androidx.annotation:annotation-experimental:1.1.0 -> 1.3.0 (*) +| +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 (*) +| +--- androidx.navigation:navigation-common:2.5.3 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) ++--- io.coil-kt:coil-compose:2.2.2 +| +--- io.coil-kt:coil-compose-base:2.2.2 +| | +--- io.coil-kt:coil-base:2.2.2 +| | | +--- androidx.lifecycle:lifecycle-runtime:2.4.1 -> 2.5.1 (*) +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10 -> 1.7.20 (*) +| | | +--- com.squareup.okhttp3:okhttp:4.10.0 +| | | | +--- com.squareup.okio:okio:3.0.0 -> 3.2.0 +| | | | | \--- com.squareup.okio:okio-jvm:3.2.0 +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.20 -> 1.7.20 (*) +| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.20 -> 1.7.20 +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*) +| | | \--- com.squareup.okio:okio:3.2.0 (*) +| | \--- androidx.compose.foundation:foundation:1.2.1 (*) +| \--- io.coil-kt:coil:2.2.2 +| \--- io.coil-kt:coil-base:2.2.2 (*) ++--- fr.acinq.secp256k1:secp256k1-kmp-jni-android:0.7.0 +| +--- fr.acinq.secp256k1:secp256k1-kmp-jni-common:0.7.0 +| | +--- fr.acinq.secp256k1:secp256k1-kmp:0.7.0 +| | | \--- fr.acinq.secp256k1:secp256k1-kmp-jvm:0.7.0 +| | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.20 +| | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*) ++--- com.github.Giszmo.NostrPostr:nostrpostrlib:master-SNAPSHOT ++--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:{strictly 1.7.20} -> 1.7.20 (c) ++--- androidx.core:core-ktx:{strictly 1.9.0} -> 1.9.0 (c) ++--- androidx.lifecycle:lifecycle-runtime-ktx:{strictly 2.5.1} -> 2.5.1 (c) ++--- androidx.activity:activity-compose:{strictly 1.6.1} -> 1.6.1 (c) ++--- androidx.compose.ui:ui:{strictly 1.3.2} -> 1.3.2 (c) ++--- androidx.compose.ui:ui-tooling-preview:{strictly 1.3.2} -> 1.3.2 (c) ++--- androidx.compose.material:material:{strictly 1.3.1} -> 1.3.1 (c) ++--- androidx.navigation:navigation-compose:{strictly 2.5.3} -> 2.5.3 (c) ++--- io.coil-kt:coil-compose:{strictly 2.2.2} -> 2.2.2 (c) ++--- fr.acinq.secp256k1:secp256k1-kmp-jni-android:{strictly 0.7.0} -> 0.7.0 (c) ++--- com.github.Giszmo.NostrPostr:nostrpostrlib:{strictly master-SNAPSHOT} -> master-SNAPSHOT (c) ++--- org.jetbrains.kotlin:kotlin-stdlib:{strictly 1.7.20} -> 1.7.20 (c) ++--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:{strictly 1.7.20} -> 1.7.20 (c) ++--- androidx.annotation:annotation:{strictly 1.5.0} -> 1.5.0 (c) ++--- androidx.core:core:{strictly 1.9.0} -> 1.9.0 (c) ++--- androidx.lifecycle:lifecycle-runtime:{strictly 2.5.1} -> 2.5.1 (c) ++--- org.jetbrains.kotlinx:kotlinx-coroutines-android:{strictly 1.6.4} -> 1.6.4 (c) ++--- androidx.activity:activity-ktx:{strictly 1.6.1} -> 1.6.1 (c) ++--- androidx.compose.runtime:runtime:{strictly 1.3.2} -> 1.3.2 (c) ++--- androidx.compose.runtime:runtime-saveable:{strictly 1.3.2} -> 1.3.2 (c) ++--- androidx.compose.ui:ui-geometry:{strictly 1.3.2} -> 1.3.2 (c) ++--- androidx.compose.ui:ui-graphics:{strictly 1.3.2} -> 1.3.2 (c) ++--- androidx.compose.ui:ui-text:{strictly 1.3.2} -> 1.3.2 (c) ++--- androidx.compose.ui:ui-unit:{strictly 1.3.2} -> 1.3.2 (c) ++--- androidx.compose.animation:animation-core:{strictly 1.1.1} -> 1.1.1 (c) ++--- androidx.compose.foundation:foundation:{strictly 1.2.1} -> 1.2.1 (c) ++--- androidx.compose.material:material-icons-core:{strictly 1.3.1} -> 1.3.1 (c) ++--- androidx.compose.material:material-ripple:{strictly 1.3.1} -> 1.3.1 (c) ++--- androidx.compose.animation:animation:{strictly 1.1.1} -> 1.1.1 (c) ++--- androidx.lifecycle:lifecycle-viewmodel-compose:{strictly 2.5.1} -> 2.5.1 (c) ++--- androidx.navigation:navigation-runtime-ktx:{strictly 2.5.3} -> 2.5.3 (c) ++--- io.coil-kt:coil-compose-base:{strictly 2.2.2} -> 2.2.2 (c) ++--- io.coil-kt:coil:{strictly 2.2.2} -> 2.2.2 (c) ++--- fr.acinq.secp256k1:secp256k1-kmp-jni-common:{strictly 0.7.0} -> 0.7.0 (c) ++--- org.jetbrains.kotlin:kotlin-stdlib-common:{strictly 1.7.20} -> 1.7.20 (c) ++--- org.jetbrains:annotations:{strictly 13.0} -> 13.0 (c) ++--- androidx.annotation:annotation-experimental:{strictly 1.3.0} -> 1.3.0 (c) ++--- androidx.versionedparcelable:versionedparcelable:{strictly 1.1.1} -> 1.1.1 (c) ++--- androidx.arch.core:core-common:{strictly 2.1.0} -> 2.1.0 (c) ++--- androidx.lifecycle:lifecycle-common:{strictly 2.5.1} -> 2.5.1 (c) ++--- org.jetbrains.kotlinx:kotlinx-coroutines-core:{strictly 1.6.4} -> 1.6.4 (c) ++--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:{strictly 1.6.4} -> 1.6.4 (c) ++--- androidx.activity:activity:{strictly 1.6.1} -> 1.6.1 (c) ++--- androidx.lifecycle:lifecycle-viewmodel-ktx:{strictly 2.5.1} -> 2.5.1 (c) ++--- androidx.savedstate:savedstate-ktx:{strictly 1.2.0} -> 1.2.0 (c) ++--- androidx.compose.foundation:foundation-layout:{strictly 1.2.1} -> 1.2.1 (c) ++--- androidx.lifecycle:lifecycle-common-java8:{strictly 2.5.1} -> 2.5.1 (c) ++--- androidx.lifecycle:lifecycle-viewmodel-savedstate:{strictly 2.5.1} -> 2.5.1 (c) ++--- androidx.navigation:navigation-common-ktx:{strictly 2.5.3} -> 2.5.3 (c) ++--- androidx.navigation:navigation-runtime:{strictly 2.5.3} -> 2.5.3 (c) ++--- io.coil-kt:coil-base:{strictly 2.2.2} -> 2.2.2 (c) ++--- fr.acinq.secp256k1:secp256k1-kmp:{strictly 0.7.0} -> 0.7.0 (c) ++--- androidx.collection:collection:{strictly 1.2.0} -> 1.2.0 (c) ++--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:{strictly 1.6.4} -> 1.6.4 (c) ++--- androidx.lifecycle:lifecycle-viewmodel:{strictly 2.5.1} -> 2.5.1 (c) ++--- androidx.savedstate:savedstate:{strictly 1.2.0} -> 1.2.0 (c) ++--- androidx.lifecycle:lifecycle-livedata-core:{strictly 2.5.1} -> 2.5.1 (c) ++--- androidx.navigation:navigation-common:{strictly 2.5.3} -> 2.5.3 (c) ++--- com.squareup.okhttp3:okhttp:{strictly 4.10.0} -> 4.10.0 (c) ++--- com.squareup.okio:okio:{strictly 3.2.0} -> 3.2.0 (c) ++--- fr.acinq.secp256k1:secp256k1-kmp-jvm:{strictly 0.7.0} -> 0.7.0 (c) +\--- com.squareup.okio:okio-jvm:{strictly 3.2.0} -> 3.2.0 (c) + +releaseCompileOnly - Compile only dependencies for compilation 'release' (target (androidJvm)). (n) +No dependencies + +releaseCompileOnlyDependenciesMetadata +No dependencies + +releaseImplementation - Implementation only dependencies for compilation 'release' (target (androidJvm)). (n) +No dependencies + +releaseImplementationDependenciesMetadata ++--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.20 +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20 +| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.20 +| | \--- org.jetbrains:annotations:13.0 +| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.20 +| \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20 (*) ++--- androidx.core:core-ktx:1.9.0 +| +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| +--- androidx.core:core:1.9.0 +| | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) +| | +--- androidx.annotation:annotation-experimental:1.3.0 +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | +--- androidx.lifecycle:lifecycle-runtime:2.3.1 -> 2.5.1 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | +--- androidx.arch.core:core-common:2.1.0 +| | | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | \--- androidx.lifecycle:lifecycle-common:2.5.1 +| | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | \--- androidx.versionedparcelable:versionedparcelable:1.1.1 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | \--- androidx.collection:collection:1.0.0 +| | \--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) ++--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 +| +--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*) +| +--- androidx.lifecycle:lifecycle-runtime:2.5.1 (*) +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 +| +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 +| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.20 +| | \--- org.jetbrains.kotlinx:atomicfu:0.17.3 +| | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.20 -> 1.7.20 +| +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4 +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (c) +| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (c) +| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*) ++--- androidx.activity:activity-compose:1.6.1 +| +--- androidx.activity:activity-ktx:1.6.1 +| | +--- androidx.activity:activity:1.6.1 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | +--- androidx.core:core:1.8.0 -> 1.9.0 (*) +| | | +--- androidx.lifecycle:lifecycle-runtime:2.5.1 (*) +| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 +| | | | +--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*) +| | | | +--- androidx.core:core-ktx:1.2.0 -> 1.9.0 (*) +| | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.5.1 +| | | | | \--- androidx.lifecycle:lifecycle-common:2.5.1 (*) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 (*) +| | | | +--- androidx.savedstate:savedstate:1.2.0 +| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 (*) +| | | +--- androidx.savedstate:savedstate:1.2.0 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | +--- androidx.core:core-ktx:1.1.0 -> 1.9.0 (*) +| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 +| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 (*) +| | +--- androidx.savedstate:savedstate-ktx:1.2.0 +| | | +--- androidx.savedstate:savedstate:1.2.0 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2 +| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (*) +| +--- androidx.compose.runtime:runtime-saveable:1.0.1 -> 1.3.2 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | \--- androidx.compose.runtime:runtime:1.3.2 (*) +| \--- androidx.compose.ui:ui:1.0.1 -> 1.3.2 +| +--- androidx.annotation:annotation:1.5.0 (*) +| +--- androidx.compose.runtime:runtime-saveable:1.3.2 (*) +| +--- androidx.compose.ui:ui-geometry:1.3.2 +| | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| +--- androidx.compose.ui:ui-graphics:1.3.2 +| | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) +| | \--- androidx.compose.ui:ui-unit:1.3.2 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | \--- androidx.compose.ui:ui-geometry:1.3.2 (*) +| +--- androidx.compose.ui:ui-text:1.3.2 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | +--- androidx.compose.ui:ui-graphics:1.3.2 (*) +| | \--- androidx.compose.ui:ui-unit:1.3.2 (*) +| \--- androidx.compose.ui:ui-unit:1.3.2 (*) ++--- androidx.compose.ui:ui:1.3.2 (*) ++--- androidx.compose.ui:ui-tooling-preview:1.3.2 +| +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) +| \--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*) ++--- androidx.compose.material:material:1.3.1 +| +--- androidx.compose.animation:animation-core:1.0.0 -> 1.1.1 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.2 -> 1.6.4 (*) +| +--- androidx.compose.foundation:foundation:1.2.0 -> 1.2.1 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | +--- androidx.compose.animation:animation:1.1.1 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | +--- androidx.compose.animation:animation-core:1.1.1 (*) +| | | +--- androidx.compose.foundation:foundation-layout:1.0.0 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | \--- androidx.compose.ui:ui:1.0.0 -> 1.3.2 (*) +| | | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*) +| | | +--- androidx.compose.ui:ui:1.0.0 -> 1.3.2 (*) +| | | \--- androidx.compose.ui:ui-geometry:1.0.0 -> 1.3.2 (*) +| | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.3.2 (*) +| | \--- androidx.compose.ui:ui:1.2.1 -> 1.3.2 (*) +| +--- androidx.compose.material:material-icons-core:1.3.1 +| | \--- androidx.compose.ui:ui:1.0.0 -> 1.3.2 (*) +| +--- androidx.compose.material:material-ripple:1.3.1 +| | +--- androidx.compose.foundation:foundation:1.1.1 -> 1.2.1 (*) +| | \--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*) +| +--- androidx.compose.runtime:runtime:1.2.0 -> 1.3.2 (*) +| +--- androidx.compose.ui:ui:1.2.0 -> 1.3.2 (*) +| \--- androidx.compose.ui:ui-text:1.2.0 -> 1.3.2 (*) ++--- androidx.navigation:navigation-compose:2.5.3 +| +--- androidx.activity:activity-compose:1.5.1 -> 1.6.1 (*) +| +--- androidx.compose.animation:animation:1.0.1 -> 1.1.1 (*) +| +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2 (*) +| +--- androidx.compose.runtime:runtime-saveable:1.0.1 -> 1.3.2 (*) +| +--- androidx.compose.ui:ui:1.0.1 -> 1.3.2 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.5.1 +| | +--- androidx.annotation:annotation-experimental:1.1.0 -> 1.3.0 (*) +| | +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2 (*) +| | +--- androidx.compose.ui:ui:1.0.1 -> 1.3.2 (*) +| | +--- androidx.lifecycle:lifecycle-common-java8:2.5.1 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | \--- androidx.lifecycle:lifecycle-common:2.5.1 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 (*) +| | \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 (*) +| \--- androidx.navigation:navigation-runtime-ktx:2.5.3 +| +--- androidx.navigation:navigation-common-ktx:2.5.3 +| | \--- androidx.navigation:navigation-common:2.5.3 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 (*) +| | +--- androidx.savedstate:savedstate-ktx:1.2.0 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| \--- androidx.navigation:navigation-runtime:2.5.3 +| +--- androidx.activity:activity-ktx:1.5.1 -> 1.6.1 (*) +| +--- androidx.annotation:annotation-experimental:1.1.0 -> 1.3.0 (*) +| +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 (*) +| +--- androidx.navigation:navigation-common:2.5.3 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) ++--- io.coil-kt:coil-compose:2.2.2 +| +--- io.coil-kt:coil-compose-base:2.2.2 +| | +--- io.coil-kt:coil-base:2.2.2 +| | | +--- androidx.lifecycle:lifecycle-runtime:2.4.1 -> 2.5.1 (*) +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10 -> 1.7.20 (*) +| | | +--- com.squareup.okhttp3:okhttp:4.10.0 +| | | | +--- com.squareup.okio:okio:3.0.0 -> 3.2.0 +| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.20 -> 1.7.20 +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*) +| | | \--- com.squareup.okio:okio:3.2.0 (*) +| | \--- androidx.compose.foundation:foundation:1.2.1 (*) +| \--- io.coil-kt:coil:2.2.2 +| \--- io.coil-kt:coil-base:2.2.2 (*) ++--- fr.acinq.secp256k1:secp256k1-kmp-jni-android:0.7.0 +| +--- fr.acinq.secp256k1:secp256k1-kmp-jni-common:0.7.0 +| | +--- fr.acinq.secp256k1:secp256k1-kmp:0.7.0 +| | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.20 +| | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*) +\--- com.github.Giszmo.NostrPostr:nostrpostrlib:master-SNAPSHOT + +releaseIntransitiveDependenciesMetadata +No dependencies + +releaseReverseMetadataValues - Metadata Values dependencies for the base Split +No dependencies + +releaseRuntimeClasspath - Runtime classpath of compilation 'release' (target (androidJvm)). ++--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.20 +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20 +| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.20 +| | \--- org.jetbrains:annotations:13.0 +| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.20 +| \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20 (*) ++--- androidx.core:core-ktx:1.9.0 +| +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| +--- androidx.core:core:1.9.0 +| | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) +| | +--- androidx.annotation:annotation-experimental:1.3.0 +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | +--- androidx.collection:collection:1.0.0 -> 1.2.0 +| | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | +--- androidx.concurrent:concurrent-futures:1.0.0 +| | | +--- com.google.guava:listenablefuture:1.0 +| | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | +--- androidx.lifecycle:lifecycle-runtime:2.3.1 -> 2.5.1 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | +--- androidx.arch.core:core-common:2.1.0 +| | | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | +--- androidx.arch.core:core-runtime:2.1.0 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | \--- androidx.arch.core:core-common:2.1.0 (*) +| | | \--- androidx.lifecycle:lifecycle-common:2.5.1 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | \--- androidx.lifecycle:lifecycle-common-java8:2.5.1 (c) +| | +--- androidx.versionedparcelable:versionedparcelable:1.1.1 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | \--- androidx.collection:collection:1.0.0 -> 1.2.0 (*) +| | \--- androidx.core:core-ktx:1.9.0 (c) +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| \--- androidx.core:core:1.9.0 (c) ++--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 +| +--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*) +| +--- androidx.lifecycle:lifecycle-runtime:2.5.1 (*) +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 +| +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 +| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.4 +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4 +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (c) +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.4 (c) +| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (c) +| | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.20 +| +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*) ++--- androidx.activity:activity-compose:1.6.1 +| +--- androidx.activity:activity-ktx:1.6.1 +| | +--- androidx.activity:activity:1.6.1 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*) +| | | +--- androidx.core:core:1.8.0 -> 1.9.0 (*) +| | | +--- androidx.lifecycle:lifecycle-runtime:2.5.1 (*) +| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| | | | \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 +| | | | +--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*) +| | | | +--- androidx.core:core-ktx:1.2.0 -> 1.9.0 (*) +| | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.5.1 +| | | | | +--- androidx.arch.core:core-common:2.1.0 (*) +| | | | | +--- androidx.arch.core:core-runtime:2.1.0 (*) +| | | | | \--- androidx.lifecycle:lifecycle-common:2.5.1 (*) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 (*) +| | | | +--- androidx.savedstate:savedstate:1.2.0 +| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | | +--- androidx.arch.core:core-common:2.1.0 (*) +| | | | | +--- androidx.lifecycle:lifecycle-common:2.4.0 -> 2.5.1 (*) +| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 (*) +| | | +--- androidx.savedstate:savedstate:1.2.0 (*) +| | | +--- androidx.tracing:tracing:1.0.0 +| | | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | | \--- androidx.activity:activity-ktx:1.6.1 (c) +| | +--- androidx.core:core-ktx:1.1.0 -> 1.9.0 (*) +| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 +| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 (*) +| | +--- androidx.savedstate:savedstate-ktx:1.2.0 +| | | +--- androidx.savedstate:savedstate:1.2.0 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | \--- androidx.activity:activity:1.6.1 (c) +| +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (*) +| +--- androidx.compose.runtime:runtime-saveable:1.0.1 -> 1.3.2 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | +--- androidx.compose.runtime:runtime:1.3.2 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| +--- androidx.compose.ui:ui:1.0.1 -> 1.3.2 +| | +--- androidx.activity:activity-ktx:1.5.1 -> 1.6.1 (*) +| | +--- androidx.annotation:annotation:1.5.0 (*) +| | +--- androidx.autofill:autofill:1.0.0 +| | | \--- androidx.core:core:1.1.0 -> 1.9.0 (*) +| | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*) +| | +--- androidx.compose.runtime:runtime:1.3.2 (*) +| | +--- androidx.compose.runtime:runtime-saveable:1.3.2 (*) +| | +--- androidx.compose.ui:ui-geometry:1.3.2 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*) +| | | +--- androidx.compose.ui:ui-util:1.3.2 +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | +--- androidx.compose.ui:ui-graphics:1.3.2 +| | | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) +| | | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*) +| | | +--- androidx.compose.ui:ui-unit:1.3.2 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*) +| | | | +--- androidx.compose.ui:ui-geometry:1.3.2 (*) +| | | | +--- androidx.compose.ui:ui-util:1.3.2 (*) +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | | +--- androidx.compose.ui:ui-util:1.3.2 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10 -> 1.7.20 +| | +--- androidx.compose.ui:ui-text:1.3.2 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*) +| | | +--- androidx.compose.runtime:runtime:1.2.0 -> 1.3.2 (*) +| | | +--- androidx.compose.runtime:runtime-saveable:1.2.0 -> 1.3.2 (*) +| | | +--- androidx.compose.ui:ui-graphics:1.3.2 (*) +| | | +--- androidx.compose.ui:ui-unit:1.3.2 (*) +| | | +--- androidx.compose.ui:ui-util:1.3.2 (*) +| | | +--- androidx.core:core:1.7.0 -> 1.9.0 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10 -> 1.7.20 +| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (*) +| | +--- androidx.compose.ui:ui-unit:1.3.2 (*) +| | +--- androidx.compose.ui:ui-util:1.3.2 (*) +| | +--- androidx.core:core:1.5.0 -> 1.9.0 (*) +| | +--- androidx.customview:customview-poolingcontainer:1.0.0 +| | | +--- androidx.core:core-ktx:1.5.0 -> 1.9.0 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| | +--- androidx.lifecycle:lifecycle-common-java8:2.3.0 -> 2.5.1 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | \--- androidx.lifecycle:lifecycle-common:2.5.1 (*) +| | +--- androidx.lifecycle:lifecycle-runtime:2.3.0 -> 2.5.1 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel:2.3.0 -> 2.5.1 (*) +| | +--- androidx.profileinstaller:profileinstaller:1.2.0 +| | | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) +| | | \--- androidx.startup:startup-runtime:1.1.1 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | \--- androidx.tracing:tracing:1.0.0 (*) +| | +--- androidx.savedstate:savedstate-ktx:1.2.0 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10 -> 1.7.20 +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (*) +| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (*) +| +--- androidx.lifecycle:lifecycle-common-java8:2.5.1 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) ++--- androidx.compose.ui:ui:1.3.2 (*) ++--- androidx.compose.ui:ui-tooling-preview:1.3.2 +| +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) +| +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) ++--- androidx.compose.material:material:1.3.1 +| +--- androidx.compose.animation:animation:1.0.0 -> 1.1.1 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | +--- androidx.compose.animation:animation-core:1.1.1 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.2 -> 1.6.4 (*) +| | | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*) +| | | +--- androidx.compose.ui:ui:1.0.0 -> 1.3.2 (*) +| | | +--- androidx.compose.ui:ui-unit:1.0.0 -> 1.3.2 (*) +| | | +--- androidx.compose.ui:ui-util:1.0.0 -> 1.3.2 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.10 -> 1.7.20 (*) +| | +--- androidx.compose.foundation:foundation-layout:1.0.0 -> 1.2.1 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | +--- androidx.compose.animation:animation-core:1.1.1 (*) +| | | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.3.2 (*) +| | | +--- androidx.compose.ui:ui:1.2.1 -> 1.3.2 (*) +| | | +--- androidx.compose.ui:ui-unit:1.1.1 -> 1.3.2 (*) +| | | +--- androidx.compose.ui:ui-util:1.0.0 -> 1.3.2 (*) +| | | +--- androidx.core:core:1.7.0 -> 1.9.0 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.20 +| | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*) +| | +--- androidx.compose.ui:ui:1.0.0 -> 1.3.2 (*) +| | +--- androidx.compose.ui:ui-geometry:1.0.0 -> 1.3.2 (*) +| | +--- androidx.compose.ui:ui-util:1.0.0 -> 1.3.2 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.10 -> 1.7.20 +| +--- androidx.compose.animation:animation-core:1.0.0 -> 1.1.1 (*) +| +--- androidx.compose.foundation:foundation:1.2.0 -> 1.2.1 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | +--- androidx.compose.animation:animation:1.1.1 (*) +| | +--- androidx.compose.foundation:foundation-layout:1.2.1 (*) +| | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.3.2 (*) +| | +--- androidx.compose.ui:ui:1.2.1 -> 1.3.2 (*) +| | +--- androidx.compose.ui:ui-graphics:1.1.1 -> 1.3.2 (*) +| | +--- androidx.compose.ui:ui-text:1.0.0 -> 1.3.2 (*) +| | +--- androidx.compose.ui:ui-util:1.0.0 -> 1.3.2 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.20 +| +--- androidx.compose.foundation:foundation-layout:1.1.1 -> 1.2.1 (*) +| +--- androidx.compose.material:material-icons-core:1.3.1 +| | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*) +| | +--- androidx.compose.ui:ui:1.0.0 -> 1.3.2 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| +--- androidx.compose.material:material-ripple:1.3.1 +| | +--- androidx.compose.animation:animation:1.0.0 -> 1.1.1 (*) +| | +--- androidx.compose.foundation:foundation:1.1.1 -> 1.2.1 (*) +| | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*) +| | +--- androidx.compose.ui:ui-util:1.0.0 -> 1.3.2 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10 -> 1.7.20 +| +--- androidx.compose.runtime:runtime:1.2.0 -> 1.3.2 (*) +| +--- androidx.compose.ui:ui:1.2.0 -> 1.3.2 (*) +| +--- androidx.compose.ui:ui-text:1.2.0 -> 1.3.2 (*) +| +--- androidx.compose.ui:ui-util:1.0.0 -> 1.3.2 (*) +| +--- androidx.lifecycle:lifecycle-runtime:2.3.0 -> 2.5.1 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel:2.3.0 -> 2.5.1 (*) +| +--- androidx.savedstate:savedstate:1.1.0 -> 1.2.0 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10 -> 1.7.20 ++--- androidx.navigation:navigation-compose:2.5.3 +| +--- androidx.activity:activity-compose:1.5.1 -> 1.6.1 (*) +| +--- androidx.compose.animation:animation:1.0.1 -> 1.1.1 (*) +| +--- androidx.compose.foundation:foundation-layout:1.0.1 -> 1.2.1 (*) +| +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2 (*) +| +--- androidx.compose.runtime:runtime-saveable:1.0.1 -> 1.3.2 (*) +| +--- androidx.compose.ui:ui:1.0.1 -> 1.3.2 (*) +| +--- androidx.lifecycle:lifecycle-common-java8:2.5.1 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.5.1 +| | +--- androidx.annotation:annotation-experimental:1.1.0 -> 1.3.0 (*) +| | +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2 (*) +| | +--- androidx.compose.ui:ui:1.0.1 -> 1.3.2 (*) +| | +--- androidx.lifecycle:lifecycle-common-java8:2.5.1 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| +--- androidx.navigation:navigation-runtime-ktx:2.5.3 +| | +--- androidx.navigation:navigation-common-ktx:2.5.3 +| | | \--- androidx.navigation:navigation-common:2.5.3 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | +--- androidx.collection:collection-ktx:1.1.0 +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.3.20 -> 1.7.20 (*) +| | | | \--- androidx.collection:collection:1.1.0 -> 1.2.0 (*) +| | | +--- androidx.core:core-ktx:1.1.0 -> 1.9.0 (*) +| | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (*) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 (*) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 (*) +| | | +--- androidx.savedstate:savedstate-ktx:1.2.0 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| | \--- androidx.navigation:navigation-runtime:2.5.3 +| | +--- androidx.activity:activity-ktx:1.5.1 -> 1.6.1 (*) +| | +--- androidx.annotation:annotation-experimental:1.1.0 -> 1.3.0 (*) +| | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*) +| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 (*) +| | +--- androidx.navigation:navigation-common:2.5.3 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) ++--- io.coil-kt:coil-compose:2.2.2 +| +--- io.coil-kt:coil-compose-base:2.2.2 +| | +--- io.coil-kt:coil-base:2.2.2 +| | | +--- androidx.lifecycle:lifecycle-runtime:2.4.1 -> 2.5.1 (*) +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10 -> 1.7.20 (*) +| | | +--- com.squareup.okhttp3:okhttp:4.10.0 +| | | | +--- com.squareup.okio:okio:3.0.0 -> 3.2.0 +| | | | | \--- com.squareup.okio:okio-jvm:3.2.0 +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.20 -> 1.7.20 (*) +| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.20 -> 1.7.20 +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*) +| | | +--- com.squareup.okio:okio:3.2.0 (*) +| | | +--- androidx.annotation:annotation:1.5.0 (*) +| | | +--- androidx.appcompat:appcompat-resources:1.4.2 +| | | | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*) +| | | | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) +| | | | +--- androidx.core:core:1.0.1 -> 1.9.0 (*) +| | | | +--- androidx.vectordrawable:vectordrawable:1.1.0 +| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | | +--- androidx.core:core:1.1.0 -> 1.9.0 (*) +| | | | | \--- androidx.collection:collection:1.1.0 -> 1.2.0 (*) +| | | | \--- androidx.vectordrawable:vectordrawable-animated:1.1.0 +| | | | +--- androidx.vectordrawable:vectordrawable:1.1.0 (*) +| | | | +--- androidx.interpolator:interpolator:1.0.0 +| | | | | \--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*) +| | | | \--- androidx.collection:collection:1.1.0 -> 1.2.0 (*) +| | | +--- androidx.collection:collection:1.2.0 (*) +| | | +--- androidx.core:core-ktx:1.8.0 -> 1.9.0 (*) +| | | \--- androidx.exifinterface:exifinterface:1.3.3 +| | | \--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) +| | +--- androidx.compose.foundation:foundation:1.2.1 (*) +| | +--- androidx.core:core-ktx:1.8.0 -> 1.9.0 (*) +| | \--- com.google.accompanist:accompanist-drawablepainter:0.25.1 +| | \--- androidx.compose.ui:ui:1.2.1 -> 1.3.2 (*) +| \--- io.coil-kt:coil:2.2.2 +| \--- io.coil-kt:coil-base:2.2.2 (*) ++--- fr.acinq.secp256k1:secp256k1-kmp-jni-android:0.7.0 +| +--- fr.acinq.secp256k1:secp256k1-kmp-jni-common:0.7.0 +| | +--- fr.acinq.secp256k1:secp256k1-kmp:0.7.0 +| | | \--- fr.acinq.secp256k1:secp256k1-kmp-jvm:0.7.0 +| | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.20 +| | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*) +\--- com.github.Giszmo.NostrPostr:nostrpostrlib:master-SNAPSHOT + +--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.10 -> 1.7.20 (*) + +--- com.squareup.retrofit2:retrofit:2.8.1 + | \--- com.squareup.okhttp3:okhttp:3.14.7 -> 4.10.0 (*) + +--- com.squareup.retrofit2:converter-gson:2.8.1 + | +--- com.squareup.retrofit2:retrofit:2.8.1 (*) + | \--- com.google.code.gson:gson:2.8.5 + +--- com.squareup.okhttp3:okhttp:4.9.3 -> 4.10.0 (*) + +--- com.madgag.spongycastle:core:1.51.0.0 + +--- com.madgag.spongycastle:prov:1.51.0.0 + | \--- com.madgag.spongycastle:core:1.51.0.0 + \--- com.github.mgunlogson:cuckoofilter4j:1.0.1 + \--- com.google.guava:guava:19.0 + +releaseRuntimeElements - Runtime elements for release (n) +No dependencies + +releaseRuntimeOnly - Runtime only dependencies for compilation 'release' (target (androidJvm)). (n) +No dependencies + +releaseRuntimeOnlyDependenciesMetadata +No dependencies + +releaseUnitTestAnnotationProcessorClasspath - Resolved configuration for annotation-processor for variant: releaseUnitTest +No dependencies + +releaseUnitTestApi - API dependencies for compilation 'releaseUnitTest' (target (androidJvm)). (n) +No dependencies + +releaseUnitTestApiDependenciesMetadata +No dependencies + +releaseUnitTestCompileClasspath - Compile classpath for compilation 'releaseUnitTest' (target (androidJvm)). ++--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.20 +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20 +| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.20 +| | \--- org.jetbrains:annotations:13.0 +| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.20 +| \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20 (*) ++--- androidx.core:core-ktx:1.9.0 +| +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| +--- androidx.core:core:1.9.0 +| | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) +| | +--- androidx.annotation:annotation-experimental:1.3.0 +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | +--- androidx.lifecycle:lifecycle-runtime:2.3.1 -> 2.5.1 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | +--- androidx.arch.core:core-common:2.1.0 +| | | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | \--- androidx.lifecycle:lifecycle-common:2.5.1 +| | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | \--- androidx.versionedparcelable:versionedparcelable:1.1.1 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | \--- androidx.collection:collection:1.0.0 -> 1.2.0 +| | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) ++--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 +| +--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*) +| +--- androidx.lifecycle:lifecycle-runtime:2.5.1 (*) +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 +| +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 +| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.4 +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4 +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (c) +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.4 (c) +| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (c) +| | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.20 +| +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*) ++--- androidx.activity:activity-compose:1.6.1 +| +--- androidx.activity:activity-ktx:1.6.1 +| | +--- androidx.activity:activity:1.6.1 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | +--- androidx.core:core:1.8.0 -> 1.9.0 (*) +| | | +--- androidx.lifecycle:lifecycle-runtime:2.5.1 (*) +| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 +| | | | +--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*) +| | | | +--- androidx.core:core-ktx:1.2.0 -> 1.9.0 (*) +| | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.5.1 +| | | | | \--- androidx.lifecycle:lifecycle-common:2.5.1 (*) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 (*) +| | | | +--- androidx.savedstate:savedstate:1.2.0 +| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 (*) +| | | +--- androidx.savedstate:savedstate:1.2.0 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | +--- androidx.core:core-ktx:1.1.0 -> 1.9.0 (*) +| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 +| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 (*) +| | +--- androidx.savedstate:savedstate-ktx:1.2.0 +| | | +--- androidx.savedstate:savedstate:1.2.0 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2 +| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (*) +| +--- androidx.compose.runtime:runtime-saveable:1.0.1 -> 1.3.2 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | \--- androidx.compose.runtime:runtime:1.3.2 (*) +| \--- androidx.compose.ui:ui:1.0.1 -> 1.3.2 +| +--- androidx.annotation:annotation:1.5.0 (*) +| +--- androidx.compose.runtime:runtime-saveable:1.3.2 (*) +| +--- androidx.compose.ui:ui-geometry:1.3.2 +| | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| +--- androidx.compose.ui:ui-graphics:1.3.2 +| | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) +| | \--- androidx.compose.ui:ui-unit:1.3.2 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | \--- androidx.compose.ui:ui-geometry:1.3.2 (*) +| +--- androidx.compose.ui:ui-text:1.3.2 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | +--- androidx.compose.ui:ui-graphics:1.3.2 (*) +| | \--- androidx.compose.ui:ui-unit:1.3.2 (*) +| \--- androidx.compose.ui:ui-unit:1.3.2 (*) ++--- androidx.compose.ui:ui:1.3.2 (*) ++--- androidx.compose.ui:ui-tooling-preview:1.3.2 +| +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) +| \--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*) ++--- androidx.compose.material:material:1.3.1 +| +--- androidx.compose.animation:animation-core:1.0.0 -> 1.1.1 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.2 -> 1.6.4 (*) +| +--- androidx.compose.foundation:foundation:1.2.0 -> 1.2.1 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | +--- androidx.compose.animation:animation:1.1.1 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | +--- androidx.compose.animation:animation-core:1.1.1 (*) +| | | +--- androidx.compose.foundation:foundation-layout:1.0.0 -> 1.2.1 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | +--- androidx.compose.ui:ui:1.2.1 -> 1.3.2 (*) +| | | | \--- androidx.compose.ui:ui-unit:1.1.1 -> 1.3.2 (*) +| | | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*) +| | | +--- androidx.compose.ui:ui:1.0.0 -> 1.3.2 (*) +| | | \--- androidx.compose.ui:ui-geometry:1.0.0 -> 1.3.2 (*) +| | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.3.2 (*) +| | \--- androidx.compose.ui:ui:1.2.1 -> 1.3.2 (*) +| +--- androidx.compose.material:material-icons-core:1.3.1 +| | \--- androidx.compose.ui:ui:1.0.0 -> 1.3.2 (*) +| +--- androidx.compose.material:material-ripple:1.3.1 +| | +--- androidx.compose.foundation:foundation:1.1.1 -> 1.2.1 (*) +| | \--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*) +| +--- androidx.compose.runtime:runtime:1.2.0 -> 1.3.2 (*) +| +--- androidx.compose.ui:ui:1.2.0 -> 1.3.2 (*) +| \--- androidx.compose.ui:ui-text:1.2.0 -> 1.3.2 (*) ++--- androidx.navigation:navigation-compose:2.5.3 +| +--- androidx.activity:activity-compose:1.5.1 -> 1.6.1 (*) +| +--- androidx.compose.animation:animation:1.0.1 -> 1.1.1 (*) +| +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2 (*) +| +--- androidx.compose.runtime:runtime-saveable:1.0.1 -> 1.3.2 (*) +| +--- androidx.compose.ui:ui:1.0.1 -> 1.3.2 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.5.1 +| | +--- androidx.annotation:annotation-experimental:1.1.0 -> 1.3.0 (*) +| | +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2 (*) +| | +--- androidx.compose.ui:ui:1.0.1 -> 1.3.2 (*) +| | +--- androidx.lifecycle:lifecycle-common-java8:2.5.1 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | \--- androidx.lifecycle:lifecycle-common:2.5.1 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 (*) +| | \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 (*) +| \--- androidx.navigation:navigation-runtime-ktx:2.5.3 +| +--- androidx.navigation:navigation-common-ktx:2.5.3 +| | \--- androidx.navigation:navigation-common:2.5.3 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 (*) +| | +--- androidx.savedstate:savedstate-ktx:1.2.0 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| \--- androidx.navigation:navigation-runtime:2.5.3 +| +--- androidx.activity:activity-ktx:1.5.1 -> 1.6.1 (*) +| +--- androidx.annotation:annotation-experimental:1.1.0 -> 1.3.0 (*) +| +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 (*) +| +--- androidx.navigation:navigation-common:2.5.3 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) ++--- io.coil-kt:coil-compose:2.2.2 +| +--- io.coil-kt:coil-compose-base:2.2.2 +| | +--- io.coil-kt:coil-base:2.2.2 +| | | +--- androidx.lifecycle:lifecycle-runtime:2.4.1 -> 2.5.1 (*) +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10 -> 1.7.20 (*) +| | | +--- com.squareup.okhttp3:okhttp:4.10.0 +| | | | +--- com.squareup.okio:okio:3.0.0 -> 3.2.0 +| | | | | \--- com.squareup.okio:okio-jvm:3.2.0 +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.20 -> 1.7.20 (*) +| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.20 -> 1.7.20 +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*) +| | | \--- com.squareup.okio:okio:3.2.0 (*) +| | \--- androidx.compose.foundation:foundation:1.2.1 (*) +| \--- io.coil-kt:coil:2.2.2 +| \--- io.coil-kt:coil-base:2.2.2 (*) ++--- fr.acinq.secp256k1:secp256k1-kmp-jni-android:0.7.0 +| +--- fr.acinq.secp256k1:secp256k1-kmp-jni-common:0.7.0 +| | +--- fr.acinq.secp256k1:secp256k1-kmp:0.7.0 +| | | \--- fr.acinq.secp256k1:secp256k1-kmp-jvm:0.7.0 +| | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.20 +| | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*) ++--- com.github.Giszmo.NostrPostr:nostrpostrlib:master-SNAPSHOT ++--- project :app (*) ++--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:{strictly 1.7.20} -> 1.7.20 (c) ++--- androidx.core:core-ktx:{strictly 1.9.0} -> 1.9.0 (c) ++--- androidx.lifecycle:lifecycle-runtime-ktx:{strictly 2.5.1} -> 2.5.1 (c) ++--- androidx.activity:activity-compose:{strictly 1.6.1} -> 1.6.1 (c) ++--- androidx.compose.ui:ui:{strictly 1.3.2} -> 1.3.2 (c) ++--- androidx.compose.ui:ui-tooling-preview:{strictly 1.3.2} -> 1.3.2 (c) ++--- androidx.compose.material:material:{strictly 1.3.1} -> 1.3.1 (c) ++--- androidx.navigation:navigation-compose:{strictly 2.5.3} -> 2.5.3 (c) ++--- io.coil-kt:coil-compose:{strictly 2.2.2} -> 2.2.2 (c) ++--- fr.acinq.secp256k1:secp256k1-kmp-jni-android:{strictly 0.7.0} -> 0.7.0 (c) ++--- com.github.Giszmo.NostrPostr:nostrpostrlib:{strictly master-SNAPSHOT} -> master-SNAPSHOT (c) ++--- junit:junit:4.13.2 +| \--- org.hamcrest:hamcrest-core:1.3 ++--- junit:junit:{strictly 4.13.2} -> 4.13.2 (c) ++--- org.jetbrains.kotlin:kotlin-stdlib:{strictly 1.7.20} -> 1.7.20 (c) ++--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:{strictly 1.7.20} -> 1.7.20 (c) ++--- androidx.annotation:annotation:{strictly 1.5.0} -> 1.5.0 (c) ++--- androidx.core:core:{strictly 1.9.0} -> 1.9.0 (c) ++--- androidx.lifecycle:lifecycle-runtime:{strictly 2.5.1} -> 2.5.1 (c) ++--- org.jetbrains.kotlinx:kotlinx-coroutines-android:{strictly 1.6.4} -> 1.6.4 (c) ++--- androidx.activity:activity-ktx:{strictly 1.6.1} -> 1.6.1 (c) ++--- androidx.compose.runtime:runtime:{strictly 1.3.2} -> 1.3.2 (c) ++--- androidx.compose.runtime:runtime-saveable:{strictly 1.3.2} -> 1.3.2 (c) ++--- androidx.compose.ui:ui-geometry:{strictly 1.3.2} -> 1.3.2 (c) ++--- androidx.compose.ui:ui-graphics:{strictly 1.3.2} -> 1.3.2 (c) ++--- androidx.compose.ui:ui-text:{strictly 1.3.2} -> 1.3.2 (c) ++--- androidx.compose.ui:ui-unit:{strictly 1.3.2} -> 1.3.2 (c) ++--- androidx.compose.animation:animation-core:{strictly 1.1.1} -> 1.1.1 (c) ++--- androidx.compose.foundation:foundation:{strictly 1.2.1} -> 1.2.1 (c) ++--- androidx.compose.material:material-icons-core:{strictly 1.3.1} -> 1.3.1 (c) ++--- androidx.compose.material:material-ripple:{strictly 1.3.1} -> 1.3.1 (c) ++--- androidx.compose.animation:animation:{strictly 1.1.1} -> 1.1.1 (c) ++--- androidx.lifecycle:lifecycle-viewmodel-compose:{strictly 2.5.1} -> 2.5.1 (c) ++--- androidx.navigation:navigation-runtime-ktx:{strictly 2.5.3} -> 2.5.3 (c) ++--- io.coil-kt:coil-compose-base:{strictly 2.2.2} -> 2.2.2 (c) ++--- io.coil-kt:coil:{strictly 2.2.2} -> 2.2.2 (c) ++--- fr.acinq.secp256k1:secp256k1-kmp-jni-common:{strictly 0.7.0} -> 0.7.0 (c) ++--- org.hamcrest:hamcrest-core:{strictly 1.3} -> 1.3 (c) ++--- org.jetbrains.kotlin:kotlin-stdlib-common:{strictly 1.7.20} -> 1.7.20 (c) ++--- org.jetbrains:annotations:{strictly 13.0} -> 13.0 (c) ++--- androidx.annotation:annotation-experimental:{strictly 1.3.0} -> 1.3.0 (c) ++--- androidx.versionedparcelable:versionedparcelable:{strictly 1.1.1} -> 1.1.1 (c) ++--- androidx.arch.core:core-common:{strictly 2.1.0} -> 2.1.0 (c) ++--- androidx.lifecycle:lifecycle-common:{strictly 2.5.1} -> 2.5.1 (c) ++--- org.jetbrains.kotlinx:kotlinx-coroutines-core:{strictly 1.6.4} -> 1.6.4 (c) ++--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:{strictly 1.6.4} -> 1.6.4 (c) ++--- androidx.activity:activity:{strictly 1.6.1} -> 1.6.1 (c) ++--- androidx.lifecycle:lifecycle-viewmodel-ktx:{strictly 2.5.1} -> 2.5.1 (c) ++--- androidx.savedstate:savedstate-ktx:{strictly 1.2.0} -> 1.2.0 (c) ++--- androidx.compose.foundation:foundation-layout:{strictly 1.2.1} -> 1.2.1 (c) ++--- androidx.lifecycle:lifecycle-common-java8:{strictly 2.5.1} -> 2.5.1 (c) ++--- androidx.lifecycle:lifecycle-viewmodel-savedstate:{strictly 2.5.1} -> 2.5.1 (c) ++--- androidx.navigation:navigation-common-ktx:{strictly 2.5.3} -> 2.5.3 (c) ++--- androidx.navigation:navigation-runtime:{strictly 2.5.3} -> 2.5.3 (c) ++--- io.coil-kt:coil-base:{strictly 2.2.2} -> 2.2.2 (c) ++--- fr.acinq.secp256k1:secp256k1-kmp:{strictly 0.7.0} -> 0.7.0 (c) ++--- androidx.collection:collection:{strictly 1.2.0} -> 1.2.0 (c) ++--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:{strictly 1.6.4} -> 1.6.4 (c) ++--- androidx.lifecycle:lifecycle-viewmodel:{strictly 2.5.1} -> 2.5.1 (c) ++--- androidx.savedstate:savedstate:{strictly 1.2.0} -> 1.2.0 (c) ++--- androidx.lifecycle:lifecycle-livedata-core:{strictly 2.5.1} -> 2.5.1 (c) ++--- androidx.navigation:navigation-common:{strictly 2.5.3} -> 2.5.3 (c) ++--- com.squareup.okhttp3:okhttp:{strictly 4.10.0} -> 4.10.0 (c) ++--- com.squareup.okio:okio:{strictly 3.2.0} -> 3.2.0 (c) ++--- fr.acinq.secp256k1:secp256k1-kmp-jvm:{strictly 0.7.0} -> 0.7.0 (c) +\--- com.squareup.okio:okio-jvm:{strictly 3.2.0} -> 3.2.0 (c) + +releaseUnitTestCompileOnly - Compile only dependencies for compilation 'releaseUnitTest' (target (androidJvm)). (n) +No dependencies + +releaseUnitTestCompileOnlyDependenciesMetadata +No dependencies + +releaseUnitTestImplementation - Implementation only dependencies for compilation 'releaseUnitTest' (target (androidJvm)). (n) +No dependencies + +releaseUnitTestImplementationDependenciesMetadata +\--- junit:junit:4.13.2 + \--- org.hamcrest:hamcrest-core:1.3 + +releaseUnitTestIntransitiveDependenciesMetadata +No dependencies + +releaseUnitTestRuntimeClasspath - Runtime classpath of compilation 'releaseUnitTest' (target (androidJvm)). ++--- project :app (*) ++--- junit:junit:4.13.2 +| \--- org.hamcrest:hamcrest-core:1.3 ++--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.20 +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20 +| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.20 +| | \--- org.jetbrains:annotations:13.0 +| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.20 +| \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20 (*) ++--- androidx.core:core-ktx:1.9.0 +| +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| +--- androidx.core:core:1.9.0 +| | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) +| | +--- androidx.annotation:annotation-experimental:1.3.0 +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | +--- androidx.collection:collection:1.0.0 -> 1.2.0 +| | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | +--- androidx.concurrent:concurrent-futures:1.0.0 +| | | +--- com.google.guava:listenablefuture:1.0 +| | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | +--- androidx.lifecycle:lifecycle-runtime:2.3.1 -> 2.5.1 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | +--- androidx.arch.core:core-common:2.1.0 +| | | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | +--- androidx.arch.core:core-runtime:2.1.0 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | \--- androidx.arch.core:core-common:2.1.0 (*) +| | | \--- androidx.lifecycle:lifecycle-common:2.5.1 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | \--- androidx.lifecycle:lifecycle-common-java8:2.5.1 (c) +| | +--- androidx.versionedparcelable:versionedparcelable:1.1.1 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | \--- androidx.collection:collection:1.0.0 -> 1.2.0 (*) +| | \--- androidx.core:core-ktx:1.9.0 (c) +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| \--- androidx.core:core:1.9.0 (c) ++--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 +| +--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*) +| +--- androidx.lifecycle:lifecycle-runtime:2.5.1 (*) +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 +| +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 +| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.4 +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4 +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (c) +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.4 (c) +| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (c) +| | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.20 +| +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*) ++--- androidx.activity:activity-compose:1.6.1 +| +--- androidx.activity:activity-ktx:1.6.1 +| | +--- androidx.activity:activity:1.6.1 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*) +| | | +--- androidx.core:core:1.8.0 -> 1.9.0 (*) +| | | +--- androidx.lifecycle:lifecycle-runtime:2.5.1 (*) +| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| | | | \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 +| | | | +--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*) +| | | | +--- androidx.core:core-ktx:1.2.0 -> 1.9.0 (*) +| | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.5.1 +| | | | | +--- androidx.arch.core:core-common:2.1.0 (*) +| | | | | +--- androidx.arch.core:core-runtime:2.1.0 (*) +| | | | | \--- androidx.lifecycle:lifecycle-common:2.5.1 (*) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 (*) +| | | | +--- androidx.savedstate:savedstate:1.2.0 +| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | | +--- androidx.arch.core:core-common:2.1.0 (*) +| | | | | +--- androidx.lifecycle:lifecycle-common:2.4.0 -> 2.5.1 (*) +| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 (*) +| | | +--- androidx.savedstate:savedstate:1.2.0 (*) +| | | +--- androidx.tracing:tracing:1.0.0 +| | | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | | \--- androidx.activity:activity-ktx:1.6.1 (c) +| | +--- androidx.core:core-ktx:1.1.0 -> 1.9.0 (*) +| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 +| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 (*) +| | +--- androidx.savedstate:savedstate-ktx:1.2.0 +| | | +--- androidx.savedstate:savedstate:1.2.0 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | \--- androidx.activity:activity:1.6.1 (c) +| +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (*) +| +--- androidx.compose.runtime:runtime-saveable:1.0.1 -> 1.3.2 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | +--- androidx.compose.runtime:runtime:1.3.2 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| +--- androidx.compose.ui:ui:1.0.1 -> 1.3.2 +| | +--- androidx.activity:activity-ktx:1.5.1 -> 1.6.1 (*) +| | +--- androidx.annotation:annotation:1.5.0 (*) +| | +--- androidx.autofill:autofill:1.0.0 +| | | \--- androidx.core:core:1.1.0 -> 1.9.0 (*) +| | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*) +| | +--- androidx.compose.runtime:runtime:1.3.2 (*) +| | +--- androidx.compose.runtime:runtime-saveable:1.3.2 (*) +| | +--- androidx.compose.ui:ui-geometry:1.3.2 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*) +| | | +--- androidx.compose.ui:ui-util:1.3.2 +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | +--- androidx.compose.ui:ui-graphics:1.3.2 +| | | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) +| | | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*) +| | | +--- androidx.compose.ui:ui-unit:1.3.2 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*) +| | | | +--- androidx.compose.ui:ui-geometry:1.3.2 (*) +| | | | +--- androidx.compose.ui:ui-util:1.3.2 (*) +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | | +--- androidx.compose.ui:ui-util:1.3.2 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10 -> 1.7.20 +| | +--- androidx.compose.ui:ui-text:1.3.2 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*) +| | | +--- androidx.compose.runtime:runtime:1.2.0 -> 1.3.2 (*) +| | | +--- androidx.compose.runtime:runtime-saveable:1.2.0 -> 1.3.2 (*) +| | | +--- androidx.compose.ui:ui-graphics:1.3.2 (*) +| | | +--- androidx.compose.ui:ui-unit:1.3.2 (*) +| | | +--- androidx.compose.ui:ui-util:1.3.2 (*) +| | | +--- androidx.core:core:1.7.0 -> 1.9.0 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10 -> 1.7.20 +| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (*) +| | +--- androidx.compose.ui:ui-unit:1.3.2 (*) +| | +--- androidx.compose.ui:ui-util:1.3.2 (*) +| | +--- androidx.core:core:1.5.0 -> 1.9.0 (*) +| | +--- androidx.customview:customview-poolingcontainer:1.0.0 +| | | +--- androidx.core:core-ktx:1.5.0 -> 1.9.0 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| | +--- androidx.lifecycle:lifecycle-common-java8:2.3.0 -> 2.5.1 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | \--- androidx.lifecycle:lifecycle-common:2.5.1 (*) +| | +--- androidx.lifecycle:lifecycle-runtime:2.3.0 -> 2.5.1 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel:2.3.0 -> 2.5.1 (*) +| | +--- androidx.profileinstaller:profileinstaller:1.2.0 +| | | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) +| | | \--- androidx.startup:startup-runtime:1.1.1 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | \--- androidx.tracing:tracing:1.0.0 (*) +| | +--- androidx.savedstate:savedstate-ktx:1.2.0 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10 -> 1.7.20 +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (*) +| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (*) +| +--- androidx.lifecycle:lifecycle-common-java8:2.5.1 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) ++--- androidx.compose.ui:ui:1.3.2 (*) ++--- androidx.compose.ui:ui-tooling-preview:1.3.2 +| +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) +| +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) ++--- androidx.compose.material:material:1.3.1 +| +--- androidx.compose.animation:animation:1.0.0 -> 1.1.1 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | +--- androidx.compose.animation:animation-core:1.1.1 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.2 -> 1.6.4 (*) +| | | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*) +| | | +--- androidx.compose.ui:ui:1.0.0 -> 1.3.2 (*) +| | | +--- androidx.compose.ui:ui-unit:1.0.0 -> 1.3.2 (*) +| | | +--- androidx.compose.ui:ui-util:1.0.0 -> 1.3.2 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.10 -> 1.7.20 (*) +| | +--- androidx.compose.foundation:foundation-layout:1.0.0 -> 1.2.1 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | +--- androidx.compose.animation:animation-core:1.1.1 (*) +| | | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.3.2 (*) +| | | +--- androidx.compose.ui:ui:1.2.1 -> 1.3.2 (*) +| | | +--- androidx.compose.ui:ui-unit:1.1.1 -> 1.3.2 (*) +| | | +--- androidx.compose.ui:ui-util:1.0.0 -> 1.3.2 (*) +| | | +--- androidx.core:core:1.7.0 -> 1.9.0 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.20 +| | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*) +| | +--- androidx.compose.ui:ui:1.0.0 -> 1.3.2 (*) +| | +--- androidx.compose.ui:ui-geometry:1.0.0 -> 1.3.2 (*) +| | +--- androidx.compose.ui:ui-util:1.0.0 -> 1.3.2 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.10 -> 1.7.20 +| +--- androidx.compose.animation:animation-core:1.0.0 -> 1.1.1 (*) +| +--- androidx.compose.foundation:foundation:1.2.0 -> 1.2.1 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | +--- androidx.compose.animation:animation:1.1.1 (*) +| | +--- androidx.compose.foundation:foundation-layout:1.2.1 (*) +| | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.3.2 (*) +| | +--- androidx.compose.ui:ui:1.2.1 -> 1.3.2 (*) +| | +--- androidx.compose.ui:ui-graphics:1.1.1 -> 1.3.2 (*) +| | +--- androidx.compose.ui:ui-text:1.0.0 -> 1.3.2 (*) +| | +--- androidx.compose.ui:ui-util:1.0.0 -> 1.3.2 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.20 +| +--- androidx.compose.foundation:foundation-layout:1.1.1 -> 1.2.1 (*) +| +--- androidx.compose.material:material-icons-core:1.3.1 +| | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*) +| | +--- androidx.compose.ui:ui:1.0.0 -> 1.3.2 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*) +| +--- androidx.compose.material:material-ripple:1.3.1 +| | +--- androidx.compose.animation:animation:1.0.0 -> 1.1.1 (*) +| | +--- androidx.compose.foundation:foundation:1.1.1 -> 1.2.1 (*) +| | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*) +| | +--- androidx.compose.ui:ui-util:1.0.0 -> 1.3.2 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10 -> 1.7.20 +| +--- androidx.compose.runtime:runtime:1.2.0 -> 1.3.2 (*) +| +--- androidx.compose.ui:ui:1.2.0 -> 1.3.2 (*) +| +--- androidx.compose.ui:ui-text:1.2.0 -> 1.3.2 (*) +| +--- androidx.compose.ui:ui-util:1.0.0 -> 1.3.2 (*) +| +--- androidx.lifecycle:lifecycle-runtime:2.3.0 -> 2.5.1 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel:2.3.0 -> 2.5.1 (*) +| +--- androidx.savedstate:savedstate:1.1.0 -> 1.2.0 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10 -> 1.7.20 ++--- androidx.navigation:navigation-compose:2.5.3 +| +--- androidx.activity:activity-compose:1.5.1 -> 1.6.1 (*) +| +--- androidx.compose.animation:animation:1.0.1 -> 1.1.1 (*) +| +--- androidx.compose.foundation:foundation-layout:1.0.1 -> 1.2.1 (*) +| +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2 (*) +| +--- androidx.compose.runtime:runtime-saveable:1.0.1 -> 1.3.2 (*) +| +--- androidx.compose.ui:ui:1.0.1 -> 1.3.2 (*) +| +--- androidx.lifecycle:lifecycle-common-java8:2.5.1 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.5.1 +| | +--- androidx.annotation:annotation-experimental:1.1.0 -> 1.3.0 (*) +| | +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2 (*) +| | +--- androidx.compose.ui:ui:1.0.1 -> 1.3.2 (*) +| | +--- androidx.lifecycle:lifecycle-common-java8:2.5.1 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| +--- androidx.navigation:navigation-runtime-ktx:2.5.3 +| | +--- androidx.navigation:navigation-common-ktx:2.5.3 +| | | \--- androidx.navigation:navigation-common:2.5.3 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | +--- androidx.collection:collection-ktx:1.1.0 +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.3.20 -> 1.7.20 (*) +| | | | \--- androidx.collection:collection:1.1.0 -> 1.2.0 (*) +| | | +--- androidx.core:core-ktx:1.1.0 -> 1.9.0 (*) +| | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (*) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 (*) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 (*) +| | | +--- androidx.savedstate:savedstate-ktx:1.2.0 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| | \--- androidx.navigation:navigation-runtime:2.5.3 +| | +--- androidx.activity:activity-ktx:1.5.1 -> 1.6.1 (*) +| | +--- androidx.annotation:annotation-experimental:1.1.0 -> 1.3.0 (*) +| | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*) +| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 (*) +| | +--- androidx.navigation:navigation-common:2.5.3 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*) ++--- io.coil-kt:coil-compose:2.2.2 +| +--- io.coil-kt:coil-compose-base:2.2.2 +| | +--- io.coil-kt:coil-base:2.2.2 +| | | +--- androidx.lifecycle:lifecycle-runtime:2.4.1 -> 2.5.1 (*) +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10 -> 1.7.20 (*) +| | | +--- com.squareup.okhttp3:okhttp:4.10.0 +| | | | +--- com.squareup.okio:okio:3.0.0 -> 3.2.0 +| | | | | \--- com.squareup.okio:okio-jvm:3.2.0 +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.20 -> 1.7.20 (*) +| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.20 -> 1.7.20 +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*) +| | | +--- com.squareup.okio:okio:3.2.0 (*) +| | | +--- androidx.annotation:annotation:1.5.0 (*) +| | | +--- androidx.appcompat:appcompat-resources:1.4.2 +| | | | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*) +| | | | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) +| | | | +--- androidx.core:core:1.0.1 -> 1.9.0 (*) +| | | | +--- androidx.vectordrawable:vectordrawable:1.1.0 +| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*) +| | | | | +--- androidx.core:core:1.1.0 -> 1.9.0 (*) +| | | | | \--- androidx.collection:collection:1.1.0 -> 1.2.0 (*) +| | | | \--- androidx.vectordrawable:vectordrawable-animated:1.1.0 +| | | | +--- androidx.vectordrawable:vectordrawable:1.1.0 (*) +| | | | +--- androidx.interpolator:interpolator:1.0.0 +| | | | | \--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*) +| | | | \--- androidx.collection:collection:1.1.0 -> 1.2.0 (*) +| | | +--- androidx.collection:collection:1.2.0 (*) +| | | +--- androidx.core:core-ktx:1.8.0 -> 1.9.0 (*) +| | | \--- androidx.exifinterface:exifinterface:1.3.3 +| | | \--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*) +| | +--- androidx.compose.foundation:foundation:1.2.1 (*) +| | +--- androidx.core:core-ktx:1.8.0 -> 1.9.0 (*) +| | \--- com.google.accompanist:accompanist-drawablepainter:0.25.1 +| | \--- androidx.compose.ui:ui:1.2.1 -> 1.3.2 (*) +| \--- io.coil-kt:coil:2.2.2 +| \--- io.coil-kt:coil-base:2.2.2 (*) ++--- fr.acinq.secp256k1:secp256k1-kmp-jni-android:0.7.0 +| +--- fr.acinq.secp256k1:secp256k1-kmp-jni-common:0.7.0 +| | +--- fr.acinq.secp256k1:secp256k1-kmp:0.7.0 +| | | \--- fr.acinq.secp256k1:secp256k1-kmp-jvm:0.7.0 +| | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.20 +| | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*) +\--- com.github.Giszmo.NostrPostr:nostrpostrlib:master-SNAPSHOT + +--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.10 -> 1.7.20 (*) + +--- com.squareup.retrofit2:retrofit:2.8.1 + | \--- com.squareup.okhttp3:okhttp:3.14.7 -> 4.10.0 (*) + +--- com.squareup.retrofit2:converter-gson:2.8.1 + | +--- com.squareup.retrofit2:retrofit:2.8.1 (*) + | \--- com.google.code.gson:gson:2.8.5 + +--- com.squareup.okhttp3:okhttp:4.9.3 -> 4.10.0 (*) + +--- com.madgag.spongycastle:core:1.51.0.0 + +--- com.madgag.spongycastle:prov:1.51.0.0 + | \--- com.madgag.spongycastle:core:1.51.0.0 + \--- com.github.mgunlogson:cuckoofilter4j:1.0.1 + \--- com.google.guava:guava:19.0 + +releaseUnitTestRuntimeOnly - Runtime only dependencies for compilation 'releaseUnitTest' (target (androidJvm)). (n) +No dependencies + +releaseUnitTestRuntimeOnlyDependenciesMetadata +No dependencies + +releaseWearApp - Link to a wear app to embed for object 'release'. (n) +No dependencies + +releaseWearBundling - Resolved Configuration for wear app bundling for variant: release +No dependencies + +runtimeOnly - Runtime only dependencies for 'main' sources. (n) +No dependencies + +runtimeOnlyDependenciesMetadata +No dependencies + +testAnnotationProcessor - Classpath for the annotation processor for 'test'. (n) +No dependencies + +testApi (n) +No dependencies + +testApiDependenciesMetadata +No dependencies + +testCompileOnly - Compile only dependencies for 'test' sources. (n) +No dependencies + +testCompileOnlyDependenciesMetadata +No dependencies + +testDebugAnnotationProcessor - Classpath for the annotation processor for 'testDebug'. (n) +No dependencies + +testDebugApi (n) +No dependencies + +testDebugApiDependenciesMetadata +No dependencies + +testDebugCompileOnly - Compile only dependencies for 'testDebug' sources. (n) +No dependencies + +testDebugCompileOnlyDependenciesMetadata +No dependencies + +testDebugImplementation - Implementation only dependencies for 'testDebug' sources. (n) +No dependencies + +testDebugImplementationDependenciesMetadata +No dependencies + +testDebugIntransitiveDependenciesMetadata +No dependencies + +testDebugRuntimeOnly - Runtime only dependencies for 'testDebug' sources. (n) +No dependencies + +testDebugRuntimeOnlyDependenciesMetadata +No dependencies + +testDebugWearApp - Link to a wear app to embed for object 'testDebug'. (n) +No dependencies + +testFixturesAnnotationProcessor - Classpath for the annotation processor for 'testFixtures'. (n) +No dependencies + +testFixturesApi - API dependencies for 'testFixtures' sources. (n) +No dependencies + +testFixturesApiDependenciesMetadata +No dependencies + +testFixturesCompileOnly - Compile only dependencies for 'testFixtures' sources. (n) +No dependencies + +testFixturesCompileOnlyDependenciesMetadata +No dependencies + +testFixturesDebugAnnotationProcessor - Classpath for the annotation processor for 'testFixturesDebug'. (n) +No dependencies + +testFixturesDebugApi - API dependencies for 'testFixturesDebug' sources. (n) +No dependencies + +testFixturesDebugApiDependenciesMetadata +No dependencies + +testFixturesDebugCompileOnly - Compile only dependencies for 'testFixturesDebug' sources. (n) +No dependencies + +testFixturesDebugCompileOnlyDependenciesMetadata +No dependencies + +testFixturesDebugImplementation - Implementation only dependencies for 'testFixturesDebug' sources. (n) +No dependencies + +testFixturesDebugImplementationDependenciesMetadata +No dependencies + +testFixturesDebugIntransitiveDependenciesMetadata +No dependencies + +testFixturesDebugRuntimeOnly - Runtime only dependencies for 'testFixturesDebug' sources. (n) +No dependencies + +testFixturesDebugRuntimeOnlyDependenciesMetadata +No dependencies + +testFixturesDebugWearApp - Link to a wear app to embed for object 'testFixturesDebug'. (n) +No dependencies + +testFixturesImplementation - Implementation only dependencies for 'testFixtures' sources. (n) +No dependencies + +testFixturesImplementationDependenciesMetadata +No dependencies + +testFixturesIntransitiveDependenciesMetadata +No dependencies + +testFixturesReleaseAnnotationProcessor - Classpath for the annotation processor for 'testFixturesRelease'. (n) +No dependencies + +testFixturesReleaseApi - API dependencies for 'testFixturesRelease' sources. (n) +No dependencies + +testFixturesReleaseApiDependenciesMetadata +No dependencies + +testFixturesReleaseCompileOnly - Compile only dependencies for 'testFixturesRelease' sources. (n) +No dependencies + +testFixturesReleaseCompileOnlyDependenciesMetadata +No dependencies + +testFixturesReleaseImplementation - Implementation only dependencies for 'testFixturesRelease' sources. (n) +No dependencies + +testFixturesReleaseImplementationDependenciesMetadata +No dependencies + +testFixturesReleaseIntransitiveDependenciesMetadata +No dependencies + +testFixturesReleaseRuntimeOnly - Runtime only dependencies for 'testFixturesRelease' sources. (n) +No dependencies + +testFixturesReleaseRuntimeOnlyDependenciesMetadata +No dependencies + +testFixturesReleaseWearApp - Link to a wear app to embed for object 'testFixturesRelease'. (n) +No dependencies + +testFixturesRuntimeOnly - Runtime only dependencies for 'testFixtures' sources. (n) +No dependencies + +testFixturesRuntimeOnlyDependenciesMetadata +No dependencies + +testFixturesWearApp - Link to a wear app to embed for object 'testFixtures'. (n) +No dependencies + +testImplementation - Implementation only dependencies for 'test' sources. (n) +\--- junit:junit:4.13.2 (n) + +testImplementationDependenciesMetadata +\--- junit:junit:4.13.2 + \--- org.hamcrest:hamcrest-core:1.3 + +testIntransitiveDependenciesMetadata +No dependencies + +testReleaseAnnotationProcessor - Classpath for the annotation processor for 'testRelease'. (n) +No dependencies + +testReleaseApi (n) +No dependencies + +testReleaseApiDependenciesMetadata +No dependencies + +testReleaseCompileOnly - Compile only dependencies for 'testRelease' sources. (n) +No dependencies + +testReleaseCompileOnlyDependenciesMetadata +No dependencies + +testReleaseImplementation - Implementation only dependencies for 'testRelease' sources. (n) +No dependencies + +testReleaseImplementationDependenciesMetadata +No dependencies + +testReleaseIntransitiveDependenciesMetadata +No dependencies + +testReleaseRuntimeOnly - Runtime only dependencies for 'testRelease' sources. (n) +No dependencies + +testReleaseRuntimeOnlyDependenciesMetadata +No dependencies + +testReleaseWearApp - Link to a wear app to embed for object 'testRelease'. (n) +No dependencies + +testRuntimeOnly - Runtime only dependencies for 'test' sources. (n) +No dependencies + +testRuntimeOnlyDependenciesMetadata +No dependencies + +testWearApp - Link to a wear app to embed for object 'test'. (n) +No dependencies + +wearApp - Link to a wear app to embed for object 'main'. (n) +No dependencies + +(c) - dependency constraint +(*) - dependencies omitted (listed previously) + +(n) - Not resolved (configuration is not meant to be resolved) + +A web-based, searchable dependency report is available by adding the --scan option. + +BUILD SUCCESSFUL in 2s +1 actionable task: 1 executed diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 00000000..3c5031eb --- /dev/null +++ b/gradle.properties @@ -0,0 +1,23 @@ +# Project-wide Gradle settings. +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true +# AndroidX package structure to make it clearer which packages are bundled with the +# Android operating system, and which are packaged with your app's APK +# https://developer.android.com/topic/libraries/support-library/androidx-rn +android.useAndroidX=true +# Kotlin code style for this project: "official" or "obsolete": +kotlin.code.style=official +# Enables namespacing of each library's R class so that its R class includes only the +# resources declared in the library itself and none from the library's dependencies, +# thereby reducing the size of the R class for that library +android.nonTransitiveRClass=true \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 00000000..e708b1c0 Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..898b49ae --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Wed Jan 04 09:23:50 EST 2023 +distributionBase=GRADLE_USER_HOME +distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip +distributionPath=wrapper/dists +zipStorePath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew new file mode 100755 index 00000000..4f906e0c --- /dev/null +++ b/gradlew @@ -0,0 +1,185 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 00000000..ac1b06f9 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 00000000..a62027f5 --- /dev/null +++ b/settings.gradle @@ -0,0 +1,18 @@ +pluginManagement { + repositories { + gradlePluginPortal() + google() + mavenCentral() + maven { url "https://jitpack.io" } + } +} +dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) + repositories { + google() + mavenCentral() + maven { url "https://jitpack.io" } + } +} +rootProject.name = "Amethyst" +include ':app'