diff --git a/build-conventions-secant/src/main/kotlin/model/BuildType.kt b/build-conventions-secant/src/main/kotlin/model/BuildType.kt index aede8250e..77ae439a0 100644 --- a/build-conventions-secant/src/main/kotlin/model/BuildType.kt +++ b/build-conventions-secant/src/main/kotlin/model/BuildType.kt @@ -1,6 +1,8 @@ package model -enum class BuildType(val value: String) { +enum class BuildType( + val value: String +) { DEBUG("debug"), RELEASE("release"), BENCHMARK("benchmark") diff --git a/build-conventions-secant/src/main/kotlin/model/Dimensions.kt b/build-conventions-secant/src/main/kotlin/model/Dimensions.kt index f689a4101..647d2310d 100644 --- a/build-conventions-secant/src/main/kotlin/model/Dimensions.kt +++ b/build-conventions-secant/src/main/kotlin/model/Dimensions.kt @@ -1,6 +1,8 @@ package model -enum class NetworkDimension(val value: String) { +enum class NetworkDimension( + val value: String +) { MAINNET("zcashmainnet"), TESTNET("zcashtestnet"); @@ -9,7 +11,9 @@ enum class NetworkDimension(val value: String) { } } -enum class DistributionDimension(val value: String) { +enum class DistributionDimension( + val value: String +) { STORE("store"), FOSS("foss"); diff --git a/build-conventions-secant/src/main/kotlin/publish/ChangelogEntry.kt b/build-conventions-secant/src/main/kotlin/publish/ChangelogEntry.kt index b52c193fe..549aba987 100644 --- a/build-conventions-secant/src/main/kotlin/publish/ChangelogEntry.kt +++ b/build-conventions-secant/src/main/kotlin/publish/ChangelogEntry.kt @@ -47,7 +47,8 @@ data class ChangelogEntry( GsonBuilder() .serializeNulls() .create() - .toJson(this).replace("\"", "\\\"") + .toJson(this) + .replace("\"", "\\\"") } data class ChangelogEntrySection( diff --git a/build-conventions-secant/src/main/kotlin/publish/ChangelogParser.kt b/build-conventions-secant/src/main/kotlin/publish/ChangelogParser.kt index d670f11be..501d80b1a 100644 --- a/build-conventions-secant/src/main/kotlin/publish/ChangelogParser.kt +++ b/build-conventions-secant/src/main/kotlin/publish/ChangelogParser.kt @@ -65,7 +65,8 @@ object ChangelogParser { log("Parser: index from: $fromIndex") val toIndex = - nodes.subList(fromIndex + 1, nodes.size) + nodes + .subList(fromIndex + 1, nodes.size) .indexOfFirst { findNodeByPrefix(it) } .let { // Applies to the last or the only one entry @@ -117,24 +118,22 @@ object ChangelogParser { subNode.startsWith("### ${titleByLanguage(TitleType.FIXED, languageTag)}") || subNode.startsWith("### ${titleByLanguage(TitleType.REMOVED, languageTag)}") - private fun List.getVersionPart(versionNameFallback: String): String { - return if (this.contains("## [Unreleased]")) { + private fun List.getVersionPart(versionNameFallback: String): String = + if (this.contains("## [Unreleased]")) { versionNameFallback } else { // Parse just version name omitting version code as we currently don't need it in the UI this[0].split("[")[1].split(" ")[0].trim() } - } private val dateFormatter = SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH) - private fun List.getDatePart(): String { - return if (this.contains("## [Unreleased]")) { + private fun List.getDatePart(): String = + if (this.contains("## [Unreleased]")) { dateFormatter.format(Date()) } else { this[0].split("- ")[1].trim() } - } private fun List.getNodePart(title: String): ChangelogEntrySection? { val fromContent = "### $title" @@ -160,7 +159,8 @@ object ChangelogParser { // To remove hard line wrap from AS .map { it.replace("\n ", "") } .joinToString(prefix = "\n", separator = "\n") - .takeIf { it.isNotBlank() }?.let { + .takeIf { it.isNotBlank() } + ?.let { ChangelogEntrySection(title = title, content = it) } } @@ -168,8 +168,8 @@ object ChangelogParser { private fun titleByLanguage( type: TitleType, languageTag: LanguageTag - ): String { - return when (type) { + ): String = + when (type) { TitleType.ADDED -> when (languageTag) { is LanguageTag.English -> ADDED_PART_EN @@ -191,13 +191,18 @@ object ChangelogParser { is LanguageTag.Spanish -> REMOVED_PART_ES } } - } } -sealed class LanguageTag(open val tag: String) { - data class English(override val tag: String = ENGLISH_TAG) : LanguageTag(tag) +sealed class LanguageTag( + open val tag: String +) { + data class English( + override val tag: String = ENGLISH_TAG + ) : LanguageTag(tag) - data class Spanish(override val tag: String = SPANISH_TAG) : LanguageTag(tag) + data class Spanish( + override val tag: String = SPANISH_TAG + ) : LanguageTag(tag) } private enum class TitleType { diff --git a/buildSrc/src/main/kotlin/co/electriccoin/zcash/Git.kt b/buildSrc/src/main/kotlin/co/electriccoin/zcash/Git.kt index bc3e4fefa..2d9ef3a75 100644 --- a/buildSrc/src/main/kotlin/co/electriccoin/zcash/Git.kt +++ b/buildSrc/src/main/kotlin/co/electriccoin/zcash/Git.kt @@ -23,4 +23,7 @@ object Git { } } -data class GitInfo(val sha: String, val commitCount: Int) +data class GitInfo( + val sha: String, + val commitCount: Int +) diff --git a/configuration-api-lib/src/commonMain/kotlin/co/electriccoin/zcash/configuration/api/MergingConfigurationProvider.kt b/configuration-api-lib/src/commonMain/kotlin/co/electriccoin/zcash/configuration/api/MergingConfigurationProvider.kt index a2006e822..82e527585 100644 --- a/configuration-api-lib/src/commonMain/kotlin/co/electriccoin/zcash/configuration/api/MergingConfigurationProvider.kt +++ b/configuration-api-lib/src/commonMain/kotlin/co/electriccoin/zcash/configuration/api/MergingConfigurationProvider.kt @@ -13,32 +13,35 @@ import kotlinx.datetime.Instant class MergingConfigurationProvider( private val configurationProviders: PersistentList ) : ConfigurationProvider { - override fun peekConfiguration(): Configuration { - return MergingConfiguration(configurationProviders.map { it.peekConfiguration() }.toPersistentList()) - } + override fun peekConfiguration(): Configuration = + MergingConfiguration( + configurationProviders + .map { + it.peekConfiguration() + }.toPersistentList() + ) - override fun getConfigurationFlow(): Flow { - return if (configurationProviders.isEmpty()) { + override fun getConfigurationFlow(): Flow = + if (configurationProviders.isEmpty()) { flowOf(MergingConfiguration(persistentListOf())) } else { combine(configurationProviders.map { it.getConfigurationFlow() }) { configurations -> MergingConfiguration(configurations.toList().toPersistentList()) } } - } override fun hintToRefresh() { configurationProviders.forEach { it.hintToRefresh() } } } -private data class MergingConfiguration(private val configurations: PersistentList) : Configuration { +private data class MergingConfiguration( + private val configurations: PersistentList +) : Configuration { override val updatedAt: Instant? get() = configurations.mapNotNull { it.updatedAt }.maxOrNull() - override fun hasKey(key: ConfigKey): Boolean { - return null != configurations.firstWithKey(key) - } + override fun hasKey(key: ConfigKey): Boolean = null != configurations.firstWithKey(key) // TODO [#1373]: Catch and log Configuration Key Coercion Failures // TODO [#1373]: https://github.com/Electric-Coin-Company/zashi-android/issues/1373 diff --git a/configuration-api-lib/src/commonMain/kotlin/co/electriccoin/zcash/configuration/model/entry/ConfigKey.kt b/configuration-api-lib/src/commonMain/kotlin/co/electriccoin/zcash/configuration/model/entry/ConfigKey.kt index 3c755aa22..36f853fbd 100644 --- a/configuration-api-lib/src/commonMain/kotlin/co/electriccoin/zcash/configuration/model/entry/ConfigKey.kt +++ b/configuration-api-lib/src/commonMain/kotlin/co/electriccoin/zcash/configuration/model/entry/ConfigKey.kt @@ -7,7 +7,9 @@ package co.electriccoin.zcash.configuration.model.entry * least common denominator with some reasonable limits on what the keys can contain. */ @JvmInline -value class ConfigKey(val key: String) { +value class ConfigKey( + val key: String +) { init { requireKeyConstraints(key) } diff --git a/configuration-api-lib/src/commonMain/kotlin/co/electriccoin/zcash/configuration/model/exception/ConfigurationParseException.kt b/configuration-api-lib/src/commonMain/kotlin/co/electriccoin/zcash/configuration/model/exception/ConfigurationParseException.kt index 830598997..064fcc549 100644 --- a/configuration-api-lib/src/commonMain/kotlin/co/electriccoin/zcash/configuration/model/exception/ConfigurationParseException.kt +++ b/configuration-api-lib/src/commonMain/kotlin/co/electriccoin/zcash/configuration/model/exception/ConfigurationParseException.kt @@ -4,4 +4,7 @@ package co.electriccoin.zcash.configuration.model.exception * Exception that may occur when parsing a value from the remote configuration. This could mean that someone made an * error in the remote config console. */ -class ConfigurationParseException(message: String, cause: Throwable?) : IllegalArgumentException(message, cause) +class ConfigurationParseException( + message: String, + cause: Throwable? +) : IllegalArgumentException(message, cause) diff --git a/configuration-api-lib/src/commonTest/kotlin/co/electriccoin/zcash/configuration/api/MergingConfigurationProviderTest.kt b/configuration-api-lib/src/commonTest/kotlin/co/electriccoin/zcash/configuration/api/MergingConfigurationProviderTest.kt index 2153f4693..0f4c0700f 100644 --- a/configuration-api-lib/src/commonTest/kotlin/co/electriccoin/zcash/configuration/api/MergingConfigurationProviderTest.kt +++ b/configuration-api-lib/src/commonTest/kotlin/co/electriccoin/zcash/configuration/api/MergingConfigurationProviderTest.kt @@ -109,14 +109,12 @@ class MergingConfigurationProviderTest { } } -private class MockConfigurationProvider(private val configuration: Configuration) : ConfigurationProvider { - override fun peekConfiguration(): Configuration { - return configuration - } +private class MockConfigurationProvider( + private val configuration: Configuration +) : ConfigurationProvider { + override fun peekConfiguration(): Configuration = configuration - override fun getConfigurationFlow(): Flow { - return flowOf(configuration) - } + override fun getConfigurationFlow(): Flow = flowOf(configuration) override fun hintToRefresh() { // no-op diff --git a/configuration-api-lib/src/commonTest/kotlin/co/electriccoin/zcash/configuration/test/MockConfiguration.kt b/configuration-api-lib/src/commonTest/kotlin/co/electriccoin/zcash/configuration/test/MockConfiguration.kt index 870546baa..54f8afa9c 100644 --- a/configuration-api-lib/src/commonTest/kotlin/co/electriccoin/zcash/configuration/test/MockConfiguration.kt +++ b/configuration-api-lib/src/commonTest/kotlin/co/electriccoin/zcash/configuration/test/MockConfiguration.kt @@ -11,7 +11,9 @@ import kotlinx.datetime.Instant * mutate the configuration by mutating the original map. The mapping is stored in a val field * though, making the initial mapping thread-safe. */ -class MockConfiguration(private val configurationMapping: Map = emptyMap()) : Configuration { +class MockConfiguration( + private val configurationMapping: Map = emptyMap() +) : Configuration { override val updatedAt: Instant? = null @Throws(ConfigurationParseException::class) diff --git a/configuration-impl-android-lib/src/main/java/co/electriccoin/zcash/configuration/internal/intent/IntentConfigurationReceiver.kt b/configuration-impl-android-lib/src/main/java/co/electriccoin/zcash/configuration/internal/intent/IntentConfigurationReceiver.kt index 153e6d6db..46a0c86d5 100644 --- a/configuration-impl-android-lib/src/main/java/co/electriccoin/zcash/configuration/internal/intent/IntentConfigurationReceiver.kt +++ b/configuration-impl-android-lib/src/main/java/co/electriccoin/zcash/configuration/internal/intent/IntentConfigurationReceiver.kt @@ -34,8 +34,8 @@ class IntentConfigurationReceiver : BroadcastReceiver() { } // https://issuetracker.google.com/issues/36927401 -private fun Intent.defuse(): Intent? { - return try { +private fun Intent.defuse(): Intent? = + try { extras?.containsKey(null) this } catch ( @@ -43,4 +43,3 @@ private fun Intent.defuse(): Intent? { ) { null } -} diff --git a/crash-android-lib/src/foss/kotlin/co/electriccoin/zcash/crash/android/internal/ListCrashReportersImpl.kt b/crash-android-lib/src/foss/kotlin/co/electriccoin/zcash/crash/android/internal/ListCrashReportersImpl.kt index 5894076db..fd133a143 100644 --- a/crash-android-lib/src/foss/kotlin/co/electriccoin/zcash/crash/android/internal/ListCrashReportersImpl.kt +++ b/crash-android-lib/src/foss/kotlin/co/electriccoin/zcash/crash/android/internal/ListCrashReportersImpl.kt @@ -4,9 +4,8 @@ import android.content.Context import co.electriccoin.zcash.crash.android.internal.local.LocalCrashReporter class ListCrashReportersImpl : ListCrashReporters { - override fun provideReporters(context: Context): List { - return listOfNotNull( + override fun provideReporters(context: Context): List = + listOfNotNull( LocalCrashReporter.getInstance(context), ) - } } diff --git a/crash-android-lib/src/main/kotlin/co/electriccoin/zcash/crash/android/AndroidExceptionPath.kt b/crash-android-lib/src/main/kotlin/co/electriccoin/zcash/crash/android/AndroidExceptionPath.kt index b4b28adf6..83269ed5e 100644 --- a/crash-android-lib/src/main/kotlin/co/electriccoin/zcash/crash/android/AndroidExceptionPath.kt +++ b/crash-android-lib/src/main/kotlin/co/electriccoin/zcash/crash/android/AndroidExceptionPath.kt @@ -10,7 +10,8 @@ import java.io.File @Suppress("ReturnCount") suspend fun ExceptionPath.getExceptionDirectory(context: Context): File? { val exceptionDirectory = - context.getExternalFilesDirSuspend(null) + context + .getExternalFilesDirSuspend(null) ?.let { File(File(it, ExceptionPath.LOG_DIRECTORY_NAME), ExceptionPath.EXCEPTION_DIRECTORY_NAME) } if (null == exceptionDirectory) { diff --git a/crash-android-lib/src/main/kotlin/co/electriccoin/zcash/crash/android/GlobalCrashReporter.kt b/crash-android-lib/src/main/kotlin/co/electriccoin/zcash/crash/android/GlobalCrashReporter.kt index 60ab4b025..913889b9a 100644 --- a/crash-android-lib/src/main/kotlin/co/electriccoin/zcash/crash/android/GlobalCrashReporter.kt +++ b/crash-android-lib/src/main/kotlin/co/electriccoin/zcash/crash/android/GlobalCrashReporter.kt @@ -64,5 +64,6 @@ object GlobalCrashReporter { } private fun isCrashProcess(context: Context) = - ProcessNameCompat.getProcessName(context) + ProcessNameCompat + .getProcessName(context) .endsWith(GlobalCrashReporter.CRASH_PROCESS_NAME_SUFFIX) diff --git a/crash-android-lib/src/main/kotlin/co/electriccoin/zcash/crash/android/internal/local/LocalCrashReporter.kt b/crash-android-lib/src/main/kotlin/co/electriccoin/zcash/crash/android/internal/local/LocalCrashReporter.kt index 47aa31e70..9c3bb5aa5 100644 --- a/crash-android-lib/src/main/kotlin/co/electriccoin/zcash/crash/android/internal/local/LocalCrashReporter.kt +++ b/crash-android-lib/src/main/kotlin/co/electriccoin/zcash/crash/android/internal/local/LocalCrashReporter.kt @@ -13,7 +13,9 @@ import kotlinx.coroutines.launch /** * Registers an exception handler to write exceptions to disk. */ -internal class LocalCrashReporter(private val applicationContext: Context) : CrashReporter { +internal class LocalCrashReporter( + private val applicationContext: Context +) : CrashReporter { private val crashReportingScope = CoroutineScope(SupervisorJob() + Dispatchers.Main) @AnyThread @@ -41,8 +43,6 @@ internal class LocalCrashReporter(private val applicationContext: Context) : Cra LocalCrashReporter(it.applicationContext) } - fun getInstance(context: Context): CrashReporter { - return lazyWithArgument.getInstance(context) - } + fun getInstance(context: Context): CrashReporter = lazyWithArgument.getInstance(context) } } diff --git a/crash-android-lib/src/zcashmainnetStoreDebug/kotlin/co/electriccoin/zcash/crash/android/internal/firebase/FirebaseAppCache.kt b/crash-android-lib/src/zcashmainnetStoreDebug/kotlin/co/electriccoin/zcash/crash/android/internal/firebase/FirebaseAppCache.kt index 3862aa435..fc23f8e3d 100644 --- a/crash-android-lib/src/zcashmainnetStoreDebug/kotlin/co/electriccoin/zcash/crash/android/internal/firebase/FirebaseAppCache.kt +++ b/crash-android-lib/src/zcashmainnetStoreDebug/kotlin/co/electriccoin/zcash/crash/android/internal/firebase/FirebaseAppCache.kt @@ -36,4 +36,6 @@ private suspend fun getFirebaseAppContainer(context: Context): FirebaseAppContai FirebaseAppContainer(firebaseApp) } -private class FirebaseAppContainer(val firebaseApp: FirebaseApp?) +private class FirebaseAppContainer( + val firebaseApp: FirebaseApp? +) diff --git a/crash-android-lib/src/zcashmainnetStoreDebug/kotlin/co/electriccoin/zcash/crash/android/internal/firebase/FirebaseCrashReporter.kt b/crash-android-lib/src/zcashmainnetStoreDebug/kotlin/co/electriccoin/zcash/crash/android/internal/firebase/FirebaseCrashReporter.kt index 19b9d16a5..99e13543e 100644 --- a/crash-android-lib/src/zcashmainnetStoreDebug/kotlin/co/electriccoin/zcash/crash/android/internal/firebase/FirebaseCrashReporter.kt +++ b/crash-android-lib/src/zcashmainnetStoreDebug/kotlin/co/electriccoin/zcash/crash/android/internal/firebase/FirebaseCrashReporter.kt @@ -121,9 +121,7 @@ private class FirebaseCrashReporterImpl( } } - suspend fun getInstance(context: Context): CrashReporter? { - return lazyWithArgument.getInstance(context) - } + suspend fun getInstance(context: Context): CrashReporter? = lazyWithArgument.getInstance(context) } } diff --git a/crash-android-lib/src/zcashmainnetStoreRelease/kotlin/co/electriccoin/zcash/crash/android/internal/firebase/FirebaseAppCache.kt b/crash-android-lib/src/zcashmainnetStoreRelease/kotlin/co/electriccoin/zcash/crash/android/internal/firebase/FirebaseAppCache.kt index 3862aa435..fc23f8e3d 100644 --- a/crash-android-lib/src/zcashmainnetStoreRelease/kotlin/co/electriccoin/zcash/crash/android/internal/firebase/FirebaseAppCache.kt +++ b/crash-android-lib/src/zcashmainnetStoreRelease/kotlin/co/electriccoin/zcash/crash/android/internal/firebase/FirebaseAppCache.kt @@ -36,4 +36,6 @@ private suspend fun getFirebaseAppContainer(context: Context): FirebaseAppContai FirebaseAppContainer(firebaseApp) } -private class FirebaseAppContainer(val firebaseApp: FirebaseApp?) +private class FirebaseAppContainer( + val firebaseApp: FirebaseApp? +) diff --git a/crash-android-lib/src/zcashmainnetStoreRelease/kotlin/co/electriccoin/zcash/crash/android/internal/firebase/FirebaseCrashReporter.kt b/crash-android-lib/src/zcashmainnetStoreRelease/kotlin/co/electriccoin/zcash/crash/android/internal/firebase/FirebaseCrashReporter.kt index 19b9d16a5..99e13543e 100644 --- a/crash-android-lib/src/zcashmainnetStoreRelease/kotlin/co/electriccoin/zcash/crash/android/internal/firebase/FirebaseCrashReporter.kt +++ b/crash-android-lib/src/zcashmainnetStoreRelease/kotlin/co/electriccoin/zcash/crash/android/internal/firebase/FirebaseCrashReporter.kt @@ -121,9 +121,7 @@ private class FirebaseCrashReporterImpl( } } - suspend fun getInstance(context: Context): CrashReporter? { - return lazyWithArgument.getInstance(context) - } + suspend fun getInstance(context: Context): CrashReporter? = lazyWithArgument.getInstance(context) } } diff --git a/crash-android-lib/src/zcashtestnetStoreDebug/kotlin/co/electriccoin/zcash/crash/android/internal/firebase/FirebaseAppCache.kt b/crash-android-lib/src/zcashtestnetStoreDebug/kotlin/co/electriccoin/zcash/crash/android/internal/firebase/FirebaseAppCache.kt index 3862aa435..fc23f8e3d 100644 --- a/crash-android-lib/src/zcashtestnetStoreDebug/kotlin/co/electriccoin/zcash/crash/android/internal/firebase/FirebaseAppCache.kt +++ b/crash-android-lib/src/zcashtestnetStoreDebug/kotlin/co/electriccoin/zcash/crash/android/internal/firebase/FirebaseAppCache.kt @@ -36,4 +36,6 @@ private suspend fun getFirebaseAppContainer(context: Context): FirebaseAppContai FirebaseAppContainer(firebaseApp) } -private class FirebaseAppContainer(val firebaseApp: FirebaseApp?) +private class FirebaseAppContainer( + val firebaseApp: FirebaseApp? +) diff --git a/crash-android-lib/src/zcashtestnetStoreDebug/kotlin/co/electriccoin/zcash/crash/android/internal/firebase/FirebaseCrashReporter.kt b/crash-android-lib/src/zcashtestnetStoreDebug/kotlin/co/electriccoin/zcash/crash/android/internal/firebase/FirebaseCrashReporter.kt index 19b9d16a5..99e13543e 100644 --- a/crash-android-lib/src/zcashtestnetStoreDebug/kotlin/co/electriccoin/zcash/crash/android/internal/firebase/FirebaseCrashReporter.kt +++ b/crash-android-lib/src/zcashtestnetStoreDebug/kotlin/co/electriccoin/zcash/crash/android/internal/firebase/FirebaseCrashReporter.kt @@ -121,9 +121,7 @@ private class FirebaseCrashReporterImpl( } } - suspend fun getInstance(context: Context): CrashReporter? { - return lazyWithArgument.getInstance(context) - } + suspend fun getInstance(context: Context): CrashReporter? = lazyWithArgument.getInstance(context) } } diff --git a/crash-android-lib/src/zcashtestnetStoreRelease/kotlin/co/electriccoin/zcash/crash/android/internal/firebase/FirebaseAppCache.kt b/crash-android-lib/src/zcashtestnetStoreRelease/kotlin/co/electriccoin/zcash/crash/android/internal/firebase/FirebaseAppCache.kt index 3862aa435..fc23f8e3d 100644 --- a/crash-android-lib/src/zcashtestnetStoreRelease/kotlin/co/electriccoin/zcash/crash/android/internal/firebase/FirebaseAppCache.kt +++ b/crash-android-lib/src/zcashtestnetStoreRelease/kotlin/co/electriccoin/zcash/crash/android/internal/firebase/FirebaseAppCache.kt @@ -36,4 +36,6 @@ private suspend fun getFirebaseAppContainer(context: Context): FirebaseAppContai FirebaseAppContainer(firebaseApp) } -private class FirebaseAppContainer(val firebaseApp: FirebaseApp?) +private class FirebaseAppContainer( + val firebaseApp: FirebaseApp? +) diff --git a/crash-android-lib/src/zcashtestnetStoreRelease/kotlin/co/electriccoin/zcash/crash/android/internal/firebase/FirebaseCrashReporter.kt b/crash-android-lib/src/zcashtestnetStoreRelease/kotlin/co/electriccoin/zcash/crash/android/internal/firebase/FirebaseCrashReporter.kt index 19b9d16a5..99e13543e 100644 --- a/crash-android-lib/src/zcashtestnetStoreRelease/kotlin/co/electriccoin/zcash/crash/android/internal/firebase/FirebaseCrashReporter.kt +++ b/crash-android-lib/src/zcashtestnetStoreRelease/kotlin/co/electriccoin/zcash/crash/android/internal/firebase/FirebaseCrashReporter.kt @@ -121,9 +121,7 @@ private class FirebaseCrashReporterImpl( } } - suspend fun getInstance(context: Context): CrashReporter? { - return lazyWithArgument.getInstance(context) - } + suspend fun getInstance(context: Context): CrashReporter? = lazyWithArgument.getInstance(context) } } diff --git a/gradle.properties b/gradle.properties index 424261379..df081937c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -161,7 +161,7 @@ FULLADLE_VERSION=0.17.5 GOOGLE_PLAY_SERVICES_GRADLE_PLUGIN_VERSION=4.4.2 GRADLE_VERSIONS_PLUGIN_VERSION=0.52.0 JGIT_VERSION=6.4.0.202211300538-r -KTLINT_VERSION=1.2.1 +KTLINT_VERSION=1.5.0 KOIN_VERSION=4.0.2 ACCOMPANIST_PERMISSIONS_VERSION=0.37.2 diff --git a/preference-api-lib/src/commonMain/kotlin/co/electriccoin/zcash/preference/model/entry/PreferenceDefault.kt b/preference-api-lib/src/commonMain/kotlin/co/electriccoin/zcash/preference/model/entry/PreferenceDefault.kt index 9b72a965e..1ae040794 100644 --- a/preference-api-lib/src/commonMain/kotlin/co/electriccoin/zcash/preference/model/entry/PreferenceDefault.kt +++ b/preference-api-lib/src/commonMain/kotlin/co/electriccoin/zcash/preference/model/entry/PreferenceDefault.kt @@ -45,7 +45,8 @@ interface PreferenceDefault { * indicating what was stored in the preferences, in addition to subsequent updates. */ fun observe(preferenceProvider: PreferenceProvider): Flow = - preferenceProvider.observe(key) + preferenceProvider + .observe(key) .map { getValue(preferenceProvider) } .distinctUntilChanged() } diff --git a/preference-api-lib/src/commonMain/kotlin/co/electriccoin/zcash/preference/model/entry/PreferenceKey.kt b/preference-api-lib/src/commonMain/kotlin/co/electriccoin/zcash/preference/model/entry/PreferenceKey.kt index 68f576fe0..f005ad086 100644 --- a/preference-api-lib/src/commonMain/kotlin/co/electriccoin/zcash/preference/model/entry/PreferenceKey.kt +++ b/preference-api-lib/src/commonMain/kotlin/co/electriccoin/zcash/preference/model/entry/PreferenceKey.kt @@ -9,7 +9,9 @@ import kotlin.jvm.JvmInline * find a least common denominator with some reasonable limits on what the keys can contain. */ @JvmInline -value class PreferenceKey(val key: String) { +value class PreferenceKey( + val key: String +) { init { requireKeyConstraints(key) } diff --git a/preference-impl-android-lib/src/main/java/co/electriccoin/zcash/preference/AndroidPreferenceProvider.kt b/preference-impl-android-lib/src/main/java/co/electriccoin/zcash/preference/AndroidPreferenceProvider.kt index 370dceefe..285b382d9 100644 --- a/preference-impl-android-lib/src/main/java/co/electriccoin/zcash/preference/AndroidPreferenceProvider.kt +++ b/preference-impl-android-lib/src/main/java/co/electriccoin/zcash/preference/AndroidPreferenceProvider.kt @@ -172,9 +172,11 @@ class AndroidPreferenceProvider private constructor( val sharedPreferences = withContext(singleThreadedDispatcher) { val mainKey = - MasterKey.Builder(context).apply { - setKeyScheme(MasterKey.KeyScheme.AES256_GCM) - }.build() + MasterKey + .Builder(context) + .apply { + setKeyScheme(MasterKey.KeyScheme.AES256_GCM) + }.build() EncryptedSharedPreferences.create( context, diff --git a/preference-impl-android-lib/src/main/java/co/electriccoin/zcash/preference/EncryptedPreferenceProvider.kt b/preference-impl-android-lib/src/main/java/co/electriccoin/zcash/preference/EncryptedPreferenceProvider.kt index c2b6f95c9..0aa30fb76 100644 --- a/preference-impl-android-lib/src/main/java/co/electriccoin/zcash/preference/EncryptedPreferenceProvider.kt +++ b/preference-impl-android-lib/src/main/java/co/electriccoin/zcash/preference/EncryptedPreferenceProvider.kt @@ -3,8 +3,9 @@ package co.electriccoin.zcash.preference import android.content.Context import co.electriccoin.zcash.preference.api.PreferenceProvider -class EncryptedPreferenceProvider(private val context: Context) : PreferenceHolder() { - override suspend fun create(): PreferenceProvider { - return AndroidPreferenceProvider.newEncrypted(context, "co.electriccoin.zcash.encrypted") - } +class EncryptedPreferenceProvider( + private val context: Context +) : PreferenceHolder() { + override suspend fun create(): PreferenceProvider = + AndroidPreferenceProvider.newEncrypted(context, "co.electriccoin.zcash.encrypted") } diff --git a/preference-impl-android-lib/src/main/java/co/electriccoin/zcash/preference/StandardPreferenceProvider.kt b/preference-impl-android-lib/src/main/java/co/electriccoin/zcash/preference/StandardPreferenceProvider.kt index f698dcddd..c7df9e980 100644 --- a/preference-impl-android-lib/src/main/java/co/electriccoin/zcash/preference/StandardPreferenceProvider.kt +++ b/preference-impl-android-lib/src/main/java/co/electriccoin/zcash/preference/StandardPreferenceProvider.kt @@ -3,8 +3,9 @@ package co.electriccoin.zcash.preference import android.content.Context import co.electriccoin.zcash.preference.api.PreferenceProvider -class StandardPreferenceProvider(private val context: Context) : PreferenceHolder() { - override suspend fun create(): PreferenceProvider { - return AndroidPreferenceProvider.newStandard(context, "co.electriccoin.zcash") - } +class StandardPreferenceProvider( + private val context: Context +) : PreferenceHolder() { + override suspend fun create(): PreferenceProvider = + AndroidPreferenceProvider.newStandard(context, "co.electriccoin.zcash") } diff --git a/sdk-ext-lib/src/main/java/cash/z/ecc/sdk/extension/PercentDecimalExt.kt b/sdk-ext-lib/src/main/java/cash/z/ecc/sdk/extension/PercentDecimalExt.kt index 0c30f43bf..3ccaab920 100644 --- a/sdk-ext-lib/src/main/java/cash/z/ecc/sdk/extension/PercentDecimalExt.kt +++ b/sdk-ext-lib/src/main/java/cash/z/ecc/sdk/extension/PercentDecimalExt.kt @@ -10,9 +10,8 @@ import java.text.DecimalFormat import java.util.Locale @Suppress("MagicNumber") -fun PercentDecimal.toPercentageWithDecimal(decimalFormat: DecimalFormat = preparePercentDecimalFormat()): String { - return decimalFormat.format(decimal * 100) -} +fun PercentDecimal.toPercentageWithDecimal(decimalFormat: DecimalFormat = preparePercentDecimalFormat()): String = + decimalFormat.format(decimal * 100) private fun preparePercentDecimalFormat(): DecimalFormat = DecimalFormat().apply { diff --git a/sdk-ext-lib/src/main/java/cash/z/ecc/sdk/model/SeedPhraseValidation.kt b/sdk-ext-lib/src/main/java/cash/z/ecc/sdk/model/SeedPhraseValidation.kt index c2ca4a920..8d2171daf 100644 --- a/sdk-ext-lib/src/main/java/cash/z/ecc/sdk/model/SeedPhraseValidation.kt +++ b/sdk-ext-lib/src/main/java/cash/z/ecc/sdk/model/SeedPhraseValidation.kt @@ -15,7 +15,9 @@ sealed class SeedPhraseValidation { object FailedChecksum : SeedPhraseValidation() - class Valid(val seedPhrase: SeedPhrase) : SeedPhraseValidation() + class Valid( + val seedPhrase: SeedPhrase + ) : SeedPhraseValidation() companion object { suspend fun new(list: List): SeedPhraseValidation { diff --git a/sdk-ext-lib/src/main/java/cash/z/ecc/sdk/model/ZecRequest.kt b/sdk-ext-lib/src/main/java/cash/z/ecc/sdk/model/ZecRequest.kt index fefd27117..5f4f97ed1 100644 --- a/sdk-ext-lib/src/main/java/cash/z/ecc/sdk/model/ZecRequest.kt +++ b/sdk-ext-lib/src/main/java/cash/z/ecc/sdk/model/ZecRequest.kt @@ -3,7 +3,11 @@ package cash.z.ecc.sdk.model import cash.z.ecc.android.sdk.model.WalletAddress import cash.z.ecc.android.sdk.model.Zatoshi -data class ZecRequest(val address: WalletAddress.Unified, val amount: Zatoshi, val message: ZecRequestMessage) { +data class ZecRequest( + val address: WalletAddress.Unified, + val amount: Zatoshi, + val message: ZecRequestMessage +) { // TODO [#397]: Waiting for an implementation of Uri parser in SDK project // TODO [#397]: https://github.com/Electric-Coin-Company/zcash-android-wallet-sdk/issues/397 suspend fun toUri(): String { @@ -21,7 +25,9 @@ data class ZecRequest(val address: WalletAddress.Unified, val amount: Zatoshi, v } @JvmInline -value class ZecRequestMessage(val value: String) { +value class ZecRequestMessage( + val value: String +) { init { require(value.length <= MAX_MESSAGE_LENGTH) } diff --git a/spackle-android-lib/src/main/kotlin/co/electriccoin/zcash/spackle/AndroidApiVersion.kt b/spackle-android-lib/src/main/kotlin/co/electriccoin/zcash/spackle/AndroidApiVersion.kt index 417610477..643964c56 100644 --- a/spackle-android-lib/src/main/kotlin/co/electriccoin/zcash/spackle/AndroidApiVersion.kt +++ b/spackle-android-lib/src/main/kotlin/co/electriccoin/zcash/spackle/AndroidApiVersion.kt @@ -13,9 +13,7 @@ object AndroidApiVersion { @ChecksSdkIntAtLeast(parameter = 0) private fun isAtLeast( @IntRange(from = Build.VERSION_CODES.BASE.toLong()) sdk: Int - ): Boolean { - return Build.VERSION.SDK_INT >= sdk - } + ): Boolean = Build.VERSION.SDK_INT >= sdk /** * @param sdk SDK version number to test against the current environment. @@ -23,9 +21,7 @@ object AndroidApiVersion { */ private fun isExactly( @IntRange(from = Build.VERSION_CODES.BASE.toLong()) sdk: Int - ): Boolean { - return Build.VERSION.SDK_INT == sdk - } + ): Boolean = Build.VERSION.SDK_INT == sdk val isExactlyO = isExactly(Build.VERSION_CODES.O_MR1) diff --git a/spackle-android-lib/src/main/kotlin/co/electriccoin/zcash/spackle/CoroutineBroadcastReceiver.kt b/spackle-android-lib/src/main/kotlin/co/electriccoin/zcash/spackle/CoroutineBroadcastReceiver.kt index 7c7843bb2..4864736c2 100644 --- a/spackle-android-lib/src/main/kotlin/co/electriccoin/zcash/spackle/CoroutineBroadcastReceiver.kt +++ b/spackle-android-lib/src/main/kotlin/co/electriccoin/zcash/spackle/CoroutineBroadcastReceiver.kt @@ -10,7 +10,9 @@ import kotlinx.coroutines.launch * @param broadcastReceiverScope Scope for performing asynchronous work in the broadcast receiver. * It is not recommended to cancel this scope. */ -abstract class CoroutineBroadcastReceiver(private val broadcastReceiverScope: CoroutineScope) : BroadcastReceiver() { +abstract class CoroutineBroadcastReceiver( + private val broadcastReceiverScope: CoroutineScope +) : BroadcastReceiver() { final override fun onReceive( context: Context, intent: Intent diff --git a/spackle-android-lib/src/main/kotlin/co/electriccoin/zcash/spackle/StrictModeCompat.kt b/spackle-android-lib/src/main/kotlin/co/electriccoin/zcash/spackle/StrictModeCompat.kt index f4c1126e7..ad33de277 100644 --- a/spackle-android-lib/src/main/kotlin/co/electriccoin/zcash/spackle/StrictModeCompat.kt +++ b/spackle-android-lib/src/main/kotlin/co/electriccoin/zcash/spackle/StrictModeCompat.kt @@ -13,40 +13,44 @@ object StrictModeCompat { StrictMode.enableDefaults() StrictMode.setThreadPolicy( - StrictMode.ThreadPolicy.Builder().apply { - detectAll() - if (isCrashOnViolation) { - penaltyDeath() - } else { - penaltyLog() - } - }.build() + StrictMode.ThreadPolicy + .Builder() + .apply { + detectAll() + if (isCrashOnViolation) { + penaltyDeath() + } else { + penaltyLog() + } + }.build() ) // Don't enable missing network tags, because those are noisy. StrictMode.setVmPolicy( - StrictMode.VmPolicy.Builder().apply { - if (AndroidApiVersion.isAtLeastS) { - detectUnsafeIntentLaunch() - } - detectActivityLeaks() - detectCleartextNetwork() - detectContentUriWithoutPermission() - detectFileUriExposure() - detectLeakedClosableObjects() - detectLeakedRegistrationObjects() - detectLeakedSqlLiteObjects() - if (AndroidApiVersion.isAtLeastP) { - // Disable because this is mostly flagging Android X and Play Services - // builder.detectNonSdkApiUsage(); - } + StrictMode.VmPolicy + .Builder() + .apply { + if (AndroidApiVersion.isAtLeastS) { + detectUnsafeIntentLaunch() + } + detectActivityLeaks() + detectCleartextNetwork() + detectContentUriWithoutPermission() + detectFileUriExposure() + detectLeakedClosableObjects() + detectLeakedRegistrationObjects() + detectLeakedSqlLiteObjects() + if (AndroidApiVersion.isAtLeastP) { + // Disable because this is mostly flagging Android X and Play Services + // builder.detectNonSdkApiUsage(); + } - if (isCrashOnViolation) { - penaltyDeath() - } else { - penaltyLog() - } - }.build() + if (isCrashOnViolation) { + penaltyDeath() + } else { + penaltyLog() + } + }.build() ) } } diff --git a/spackle-android-lib/src/main/kotlin/co/electriccoin/zcash/spackle/process/AbstractProcessNameContentProvider.kt b/spackle-android-lib/src/main/kotlin/co/electriccoin/zcash/spackle/process/AbstractProcessNameContentProvider.kt index 52f0e6803..133833925 100644 --- a/spackle-android-lib/src/main/kotlin/co/electriccoin/zcash/spackle/process/AbstractProcessNameContentProvider.kt +++ b/spackle-android-lib/src/main/kotlin/co/electriccoin/zcash/spackle/process/AbstractProcessNameContentProvider.kt @@ -50,37 +50,27 @@ open class AbstractProcessNameContentProvider : ContentProvider() { selection: String?, selectionArgs: Array?, sortOrder: String? - ): Cursor? { - throw UnsupportedOperationException() - } + ): Cursor? = throw UnsupportedOperationException() - override fun getType(uri: Uri): String? { - throw UnsupportedOperationException() - } + override fun getType(uri: Uri): String? = throw UnsupportedOperationException() override fun insert( uri: Uri, values: ContentValues? - ): Uri? { - throw UnsupportedOperationException() - } + ): Uri? = throw UnsupportedOperationException() override fun delete( uri: Uri, selection: String?, selectionArgs: Array? - ): Int { - throw UnsupportedOperationException() - } + ): Int = throw UnsupportedOperationException() override fun update( uri: Uri, values: ContentValues?, selection: String?, selectionArgs: Array? - ): Int { - throw UnsupportedOperationException() - } + ): Int = throw UnsupportedOperationException() companion object { internal fun getProcessNameLegacy( diff --git a/spackle-android-lib/src/main/kotlin/co/electriccoin/zcash/spackle/process/ProcessNameCompat.kt b/spackle-android-lib/src/main/kotlin/co/electriccoin/zcash/spackle/process/ProcessNameCompat.kt index 27df8a9dd..274b12650 100644 --- a/spackle-android-lib/src/main/kotlin/co/electriccoin/zcash/spackle/process/ProcessNameCompat.kt +++ b/spackle-android-lib/src/main/kotlin/co/electriccoin/zcash/spackle/process/ProcessNameCompat.kt @@ -54,15 +54,14 @@ object ProcessNameCompat { * @return Name of the current process. May return null if a failure occurs, which is possible * due to some race conditions in Android. */ - private fun searchForProcessName(context: Context): String? { - return if (AndroidApiVersion.isAtLeastTiramisu) { + private fun searchForProcessName(context: Context): String? = + if (AndroidApiVersion.isAtLeastTiramisu) { getProcessNameTPlus() } else if (AndroidApiVersion.isAtLeastP) { getProcessNamePPlus() } else { searchForProcessNameLegacy(context) } - } @RequiresApi(api = Build.VERSION_CODES.TIRAMISU) private fun getProcessNameTPlus() = Process.myProcessName() diff --git a/spackle-lib/src/commonMain/kotlin/co/electriccoin/zcash/spackle/LazyWithArgument.kt b/spackle-lib/src/commonMain/kotlin/co/electriccoin/zcash/spackle/LazyWithArgument.kt index 0f4c6cf5f..af84e7b7e 100644 --- a/spackle-lib/src/commonMain/kotlin/co/electriccoin/zcash/spackle/LazyWithArgument.kt +++ b/spackle-lib/src/commonMain/kotlin/co/electriccoin/zcash/spackle/LazyWithArgument.kt @@ -5,7 +5,9 @@ package co.electriccoin.zcash.spackle * * This class is thread-safe. */ -class LazyWithArgument(private val deferredCreator: ((Input) -> Output)) { +class LazyWithArgument( + private val deferredCreator: ((Input) -> Output) +) { @Volatile private var singletonInstance: Output? = null diff --git a/spackle-lib/src/commonMain/kotlin/co/electriccoin/zcash/spackle/SuspendingLazy.kt b/spackle-lib/src/commonMain/kotlin/co/electriccoin/zcash/spackle/SuspendingLazy.kt index 85accf95a..967194351 100644 --- a/spackle-lib/src/commonMain/kotlin/co/electriccoin/zcash/spackle/SuspendingLazy.kt +++ b/spackle-lib/src/commonMain/kotlin/co/electriccoin/zcash/spackle/SuspendingLazy.kt @@ -8,7 +8,9 @@ import kotlinx.coroutines.sync.withLock * * This class is thread-safe. */ -class SuspendingLazy(private val deferredCreator: suspend ((Input) -> Output)) { +class SuspendingLazy( + private val deferredCreator: suspend ((Input) -> Output) +) { private var singletonInstance: Output? = null private val mutex = Mutex() diff --git a/spackle-lib/src/commonMain/kotlin/co/electriccoin/zcash/spackle/model/Index.kt b/spackle-lib/src/commonMain/kotlin/co/electriccoin/zcash/spackle/model/Index.kt index 074493e6c..091cc4849 100644 --- a/spackle-lib/src/commonMain/kotlin/co/electriccoin/zcash/spackle/model/Index.kt +++ b/spackle-lib/src/commonMain/kotlin/co/electriccoin/zcash/spackle/model/Index.kt @@ -6,7 +6,9 @@ package co.electriccoin.zcash.spackle.model * @param value A 0-based index. Must be >= 0 */ @JvmInline -value class Index(val value: Int) { +value class Index( + val value: Int +) { init { require(value >= 0) { "Index must be >= 0 but actually is $value" } } diff --git a/spackle-lib/src/commonMain/kotlin/co/electriccoin/zcash/spackle/model/Progress.kt b/spackle-lib/src/commonMain/kotlin/co/electriccoin/zcash/spackle/model/Progress.kt index 55523ee70..73ba1bcb3 100644 --- a/spackle-lib/src/commonMain/kotlin/co/electriccoin/zcash/spackle/model/Progress.kt +++ b/spackle-lib/src/commonMain/kotlin/co/electriccoin/zcash/spackle/model/Progress.kt @@ -1,6 +1,9 @@ package co.electriccoin.zcash.spackle.model -data class Progress(val current: Index, val last: Index) { +data class Progress( + val current: Index, + val last: Index +) { init { require(last.value > 0) { "last must be > 0 but was $last" } require(last.value >= current.value) { "last ($last) must be >= current ($current)" } diff --git a/test-lib/src/main/kotlin/co/electriccoin/zcash/test/UiTestPrerequisites.kt b/test-lib/src/main/kotlin/co/electriccoin/zcash/test/UiTestPrerequisites.kt index d42d21a3c..9c3ac0e60 100644 --- a/test-lib/src/main/kotlin/co/electriccoin/zcash/test/UiTestPrerequisites.kt +++ b/test-lib/src/main/kotlin/co/electriccoin/zcash/test/UiTestPrerequisites.kt @@ -28,7 +28,8 @@ open class UiTestPrerequisites { private fun isScreenOn(): Boolean { val powerService = - ApplicationProvider.getApplicationContext() + ApplicationProvider + .getApplicationContext() .getSystemService(Context.POWER_SERVICE) as PowerManager return powerService.isInteractive } @@ -41,7 +42,8 @@ open class UiTestPrerequisites { private fun isKeyguardLocked(): Boolean { val keyguardService = ( - ApplicationProvider.getApplicationContext() + ApplicationProvider + .getApplicationContext() .getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager ) diff --git a/test-lib/src/main/kotlin/co/electriccoin/zcash/test/ZcashUiTestRunner.kt b/test-lib/src/main/kotlin/co/electriccoin/zcash/test/ZcashUiTestRunner.kt index 9d9a9db3c..be847d6ff 100644 --- a/test-lib/src/main/kotlin/co/electriccoin/zcash/test/ZcashUiTestRunner.kt +++ b/test-lib/src/main/kotlin/co/electriccoin/zcash/test/ZcashUiTestRunner.kt @@ -13,7 +13,8 @@ open class ZcashUiTestRunner : AndroidJUnitRunner() { super.onCreate(arguments) val powerManager = - ApplicationProvider.getApplicationContext() + ApplicationProvider + .getApplicationContext() .getSystemService(Context.POWER_SERVICE) as PowerManager // There is no alternative to this deprecated API. The suggestion of a view to keep the screen diff --git a/tools/.editorconfig b/tools/.editorconfig index 840b2a5a4..5a90c313c 100644 --- a/tools/.editorconfig +++ b/tools/.editorconfig @@ -4,4 +4,5 @@ root = true ktlint_standard_trailing-comma-on-call-site = disabled ktlint_standard_trailing-comma-on-declaration-site = disabled # When using Compose, suppress the `function-naming` rule in favor of PascalCase naming convention -ktlint_function_naming_ignore_when_annotated_with=Composable \ No newline at end of file +ktlint_function_naming_ignore_when_annotated_with=Composable +ktlint_standard_function-signature=disabled \ No newline at end of file diff --git a/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/component/Balance.kt b/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/component/Balance.kt index 762b2f2fe..bec14502c 100644 --- a/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/component/Balance.kt +++ b/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/component/Balance.kt @@ -119,17 +119,18 @@ private fun splitBalance(balanceStringParts: ZecAmountTriple): Pair - if (separatorPosition + CUT_POSITION_OFFSET < balanceStringParts.main.length) { - separatorPosition + CUT_POSITION_OFFSET - } else { - balanceStringParts.main.length + balanceStringParts.main + .indexOf( + startIndex = 0, + char = MonetarySeparators.current(Locale.getDefault()).decimal, + ignoreCase = true + ).let { separatorPosition -> + if (separatorPosition + CUT_POSITION_OFFSET < balanceStringParts.main.length) { + separatorPosition + CUT_POSITION_OFFSET + } else { + balanceStringParts.main.length + } } - } val firstPart = buildString { @@ -160,7 +161,10 @@ data class ZecAmountTriple( ) @Immutable -data class BalanceTextStyle(val mostSignificantPart: TextStyle, val leastSignificantPart: TextStyle) +data class BalanceTextStyle( + val mostSignificantPart: TextStyle, + val leastSignificantPart: TextStyle +) object StyledBalanceDefaults { @Stable diff --git a/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/component/Checkbox.kt b/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/component/Checkbox.kt index 827c3aae8..29098b8bb 100644 --- a/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/component/Checkbox.kt +++ b/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/component/Checkbox.kt @@ -103,8 +103,7 @@ fun LabeledCheckBox( top = ZcashTheme.dimens.spacingTiny, bottom = ZcashTheme.dimens.spacingTiny, end = ZcashTheme.dimens.spacingTiny - ) - .then( + ).then( if (checkBoxTestTag != null) { Modifier.testTag(checkBoxTestTag) } else { diff --git a/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/component/Chip.kt b/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/component/Chip.kt index 75c38c675..c4d0896cc 100644 --- a/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/component/Chip.kt +++ b/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/component/Chip.kt @@ -120,8 +120,7 @@ fun ChipOnSurface( color = ZcashTheme.colors.layoutStrokeSecondary ), shape = RoundedCornerShape(size = ZcashTheme.dimens.regularRippleEffectCorner), - ) - .clickable { onClick() }, + ).clickable { onClick() }, color = ZcashTheme.colors.primaryColor, shadowElevation = ZcashTheme.dimens.chipShadowElevation, ) { @@ -134,8 +133,7 @@ fun ChipOnSurface( .padding( vertical = ZcashTheme.dimens.spacingMid, horizontal = ZcashTheme.dimens.spacingDefault - ) - .testTag(CommonTag.CHIP) + ).testTag(CommonTag.CHIP) ) } } diff --git a/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/component/Override.kt b/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/component/Override.kt index 51b7663be..b54e6d708 100644 --- a/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/component/Override.kt +++ b/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/component/Override.kt @@ -45,7 +45,10 @@ fun Override( } } -data class ConfigurationOverride(val uiMode: UiMode?, val locale: LocaleList?) { +data class ConfigurationOverride( + val uiMode: UiMode?, + val locale: LocaleList? +) { fun newConfiguration(fromConfiguration: Configuration) = Configuration(fromConfiguration).apply { this@ConfigurationOverride.uiMode?.let { diff --git a/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/component/PagerTabs.kt b/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/component/PagerTabs.kt index 9472e127c..98a0cc5fc 100644 --- a/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/component/PagerTabs.kt +++ b/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/component/PagerTabs.kt @@ -104,8 +104,7 @@ private fun PagerTab( .fillMaxSize() .background( if (selected) Color.Transparent else ZcashTheme.colors.layoutStroke - ) - .padding(vertical = ZcashTheme.dimens.spacingMid, horizontal = ZcashTheme.dimens.spacingXtiny), + ).padding(vertical = ZcashTheme.dimens.spacingMid, horizontal = ZcashTheme.dimens.spacingXtiny), contentAlignment = Alignment.Center, ) { Text( diff --git a/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/component/ScreenBrightness.kt b/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/component/ScreenBrightness.kt index 347b84d78..2626e9940 100644 --- a/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/component/ScreenBrightness.kt +++ b/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/component/ScreenBrightness.kt @@ -8,12 +8,11 @@ import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.update sealed class ScreenBrightnessState { - fun getChange(): ScreenBrightnessState { - return when (this) { + fun getChange(): ScreenBrightnessState = + when (this) { NORMAL -> FULL FULL -> NORMAL } - } data object FULL : ScreenBrightnessState() diff --git a/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/component/SwitchWithLabel.kt b/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/component/SwitchWithLabel.kt index 10dcc6b42..4e330e3d4 100644 --- a/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/component/SwitchWithLabel.kt +++ b/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/component/SwitchWithLabel.kt @@ -32,8 +32,7 @@ fun SwitchWithLabel( indication = null, role = Role.Switch, onClick = { onStateChange(!state) } - ) - .fillMaxWidth() + ).fillMaxWidth() ) { val (text, spacer, switchButton) = createRefs() Body( diff --git a/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/component/TextField.kt b/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/component/TextField.kt index 1c072752a..9247b2a71 100644 --- a/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/component/TextField.kt +++ b/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/component/TextField.kt @@ -90,8 +90,7 @@ fun FormTextField( } } } - } - .then( + }.then( if (withBorder) { Modifier.border( width = 1.dp, @@ -105,8 +104,7 @@ fun FormTextField( } else { Modifier } - ) - .then( + ).then( if (testTag.isNullOrEmpty()) { Modifier } else { diff --git a/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/component/TextFieldColorsExt.kt b/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/component/TextFieldColorsExt.kt index d831b34ea..76c9addaa 100644 --- a/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/component/TextFieldColorsExt.kt +++ b/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/component/TextFieldColorsExt.kt @@ -32,6 +32,5 @@ internal val TextFieldColors.selectionColors: TextSelectionColors @Composable get() = textSelectionColors @Composable -internal fun TextFieldColors.cursorColor(isError: Boolean): State { - return rememberUpdatedState(if (isError) errorCursorColor else cursorColor) -} +internal fun TextFieldColors.cursorColor(isError: Boolean): State = + rememberUpdatedState(if (isError) errorCursorColor else cursorColor) diff --git a/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/component/ZashiMainTopAppBar.kt b/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/component/ZashiMainTopAppBar.kt index 34a5b916d..7acb3f047 100644 --- a/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/component/ZashiMainTopAppBar.kt +++ b/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/component/ZashiMainTopAppBar.kt @@ -83,8 +83,7 @@ private fun AccountSwitch(state: AccountSwitchState) { onClick = state .onAccountTypeClick - ) - .padding(start = 4.dp), + ).padding(start = 4.dp), verticalAlignment = Alignment.CenterVertically ) { Image( diff --git a/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/component/ZashiQr.kt b/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/component/ZashiQr.kt index 612d6509f..2e48a6a23 100644 --- a/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/component/ZashiQr.kt +++ b/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/component/ZashiQr.kt @@ -163,8 +163,7 @@ private fun FullscreenDialogContent( interactionSource = remember { MutableInteractionSource() }, indication = null, onClick = onBack - ) - .padding(start = 16.dp, end = 16.dp, bottom = 64.dp) + ).padding(start = 16.dp, end = 16.dp, bottom = 64.dp) ) { ZashiQrInternal( modifier = diff --git a/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/component/ZashiRadioButton.kt b/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/component/ZashiRadioButton.kt index 55cf49c9b..b55e73807 100644 --- a/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/component/ZashiRadioButton.kt +++ b/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/component/ZashiRadioButton.kt @@ -60,8 +60,7 @@ fun RadioButton( interactionSource = remember { MutableInteractionSource() }, onClick = state.onClick, role = Role.Button, - ) - .padding(horizontal = 20.dp) + ).padding(horizontal = 20.dp) .then( if (testTag != null) { Modifier.testTag(testTag) diff --git a/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/component/listitem/ZashiListItem.kt b/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/component/listitem/ZashiListItem.kt index 50e031570..3c74db00c 100644 --- a/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/component/listitem/ZashiListItem.kt +++ b/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/component/listitem/ZashiListItem.kt @@ -260,17 +260,13 @@ object ZashiListItemDefaults { fun primaryColors( borderColor: Color = Color.Unspecified, backgroundColor: Color = Color.Transparent - ): ZashiListItemColors { - return ZashiListItemColors(borderColor = borderColor, backgroundColor = backgroundColor) - } + ): ZashiListItemColors = ZashiListItemColors(borderColor = borderColor, backgroundColor = backgroundColor) @Composable fun secondaryColors( borderColor: Color = ZashiColors.Surfaces.strokeSecondary, backgroundColor: Color = Color.Transparent - ): ZashiListItemColors { - return ZashiListItemColors(borderColor = borderColor, backgroundColor = backgroundColor) - } + ): ZashiListItemColors = ZashiListItemColors(borderColor = borderColor, backgroundColor = backgroundColor) } @PreviewScreens diff --git a/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/util/AndroidQrCodeImageGenerator.kt b/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/util/AndroidQrCodeImageGenerator.kt index cbb848a1d..2c20af817 100644 --- a/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/util/AndroidQrCodeImageGenerator.kt +++ b/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/util/AndroidQrCodeImageGenerator.kt @@ -14,7 +14,8 @@ object AndroidQrCodeImageGenerator : QrCodeImageGenerator { ): ImageBitmap { val colorArray = bitArray.toThemeColorArray(colors) - return Bitmap.createBitmap(colorArray, sizePixels, sizePixels, Bitmap.Config.ARGB_8888) + return Bitmap + .createBitmap(colorArray, sizePixels, sizePixels, Bitmap.Config.ARGB_8888) .asImageBitmap() } } diff --git a/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/util/ImageResource.kt b/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/util/ImageResource.kt index b68ad0619..0a3b91a81 100644 --- a/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/util/ImageResource.kt +++ b/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/util/ImageResource.kt @@ -14,7 +14,9 @@ sealed interface ImageResource { @JvmInline @Immutable - value class DisplayString(val value: String) : ImageResource + value class DisplayString( + val value: String + ) : ImageResource } @Stable diff --git a/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/util/ScreenHeight.kt b/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/util/ScreenHeight.kt index 36dfff285..16593db2c 100644 --- a/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/util/ScreenHeight.kt +++ b/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/util/ScreenHeight.kt @@ -62,15 +62,13 @@ data class ScreenHeight( val systemStatusBarHeight: Dp, val systemNavigationBarHeight: Dp ) { - fun overallScreenHeight(): Dp { - return (contentHeight + systemBarsHeight()).also { + fun overallScreenHeight(): Dp = + (contentHeight + systemBarsHeight()).also { Twig.debug { "Screen height: Overall height: $it" } } - } - fun systemBarsHeight(): Dp { - return (systemStatusBarHeight + systemNavigationBarHeight).also { + fun systemBarsHeight(): Dp = + (systemStatusBarHeight + systemNavigationBarHeight).also { Twig.debug { "Screen height: System bars height: $it" } } - } } diff --git a/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/util/StringResource.kt b/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/util/StringResource.kt index 36b809764..15a9be8e3 100644 --- a/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/util/StringResource.kt +++ b/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/util/StringResource.kt @@ -26,22 +26,37 @@ sealed interface StringResource { @JvmInline @Immutable - value class ByString(val value: String) : StringResource + value class ByString( + val value: String + ) : StringResource @Immutable - data class ByZatoshi(val zatoshi: Zatoshi) : StringResource + data class ByZatoshi( + val zatoshi: Zatoshi + ) : StringResource @Immutable - data class ByDateTime(val zonedDateTime: ZonedDateTime, val useFullFormat: Boolean) : StringResource + data class ByDateTime( + val zonedDateTime: ZonedDateTime, + val useFullFormat: Boolean + ) : StringResource @Immutable - data class ByYearMonth(val yearMonth: YearMonth) : StringResource + data class ByYearMonth( + val yearMonth: YearMonth + ) : StringResource @Immutable - data class ByTransactionId(val transactionId: String, val abbreviated: Boolean) : StringResource + data class ByTransactionId( + val transactionId: String, + val abbreviated: Boolean + ) : StringResource @Immutable - data class ByAddress(val address: String, val abbreviated: Boolean) : StringResource + data class ByAddress( + val address: String, + val abbreviated: Boolean + ) : StringResource } @Stable @@ -142,15 +157,28 @@ object StringResourceDefaults { .getDateTimeInstance( DateFormat.MEDIUM, DateFormat.SHORT, + ).format( + Date.from( + res.zonedDateTime + .toInstant() + .toKotlinInstant() + .toJavaInstant() + ) ) - .format(Date.from(res.zonedDateTime.toInstant().toKotlinInstant().toJavaInstant())) } else { val pattern = DateTimeFormatter.ofPattern("MMM dd") val start = res.zonedDateTime.format(pattern).orEmpty() val end = DateFormat .getTimeInstance(DateFormat.SHORT) - .format(Date.from(res.zonedDateTime.toInstant().toKotlinInstant().toJavaInstant())) + .format( + Date.from( + res.zonedDateTime + .toInstant() + .toKotlinInstant() + .toJavaInstant() + ) + ) return "$start $end" } @@ -161,23 +189,21 @@ object StringResourceDefaults { return yearMonth.format(pattern).orEmpty() } - fun convertAddress(res: StringResource.ByAddress): String { - return if (res.abbreviated && res.address.isNotBlank()) { + fun convertAddress(res: StringResource.ByAddress): String = + if (res.abbreviated && res.address.isNotBlank()) { "${res.address.take(ADDRESS_MAX_LENGTH_ABBREVIATED)}..." } else { res.address } - } - fun convertTransactionId(res: StringResource.ByTransactionId): String { - return if (res.abbreviated) { + fun convertTransactionId(res: StringResource.ByTransactionId): String = + if (res.abbreviated) { "${res.transactionId.take(TRANSACTION_MAX_PREFIX_SUFFIX_LENGHT)}...${res.transactionId.takeLast( TRANSACTION_MAX_PREFIX_SUFFIX_LENGHT )}" } else { res.transactionId } - } } private const val TRANSACTION_MAX_PREFIX_SUFFIX_LENGHT = 5 diff --git a/ui-integration-test/src/main/java/co/electriccoin/zcash/ui/integration/test/screen/scan/view/ScanViewTest.kt b/ui-integration-test/src/main/java/co/electriccoin/zcash/ui/integration/test/screen/scan/view/ScanViewTest.kt index 8215524c5..4d26f6794 100644 --- a/ui-integration-test/src/main/java/co/electriccoin/zcash/ui/integration/test/screen/scan/view/ScanViewTest.kt +++ b/ui-integration-test/src/main/java/co/electriccoin/zcash/ui/integration/test/screen/scan/view/ScanViewTest.kt @@ -101,14 +101,15 @@ class ScanViewTest : UiTestPrerequisites() { it.assertDoesNotExist() } - composeTestRule.onNodeWithText( - getStringResourceWithArgs( - resId = R.string.scan_state_permission, - getStringResource(R.string.app_name) - ) - ).also { - it.assertIsDisplayed() - } + composeTestRule + .onNodeWithText( + getStringResourceWithArgs( + resId = R.string.scan_state_permission, + getStringResource(R.string.app_name) + ) + ).also { + it.assertIsDisplayed() + } composeTestRule.onNodeWithText(getStringResource(R.string.scan_settings_button), ignoreCase = true).also { it.assertIsDisplayed() diff --git a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/common/ScreenBrightnessTest.kt b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/common/ScreenBrightnessTest.kt index 71a9e673c..79a592209 100644 --- a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/common/ScreenBrightnessTest.kt +++ b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/common/ScreenBrightnessTest.kt @@ -37,7 +37,9 @@ class ScreenBrightnessTest : UiTestPrerequisites() { assertEquals(ScreenBrightnessState.NORMAL, testSetup.getSecureBrightnessCount()) } - private class TestSetup(composeTestRule: ComposeContentTestRule) { + private class TestSetup( + composeTestRule: ComposeContentTestRule + ) { val mutableScreenBrightnessFlag = MutableStateFlow(true) private val screenBrightness = ScreenBrightness diff --git a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/common/ScreenSecurityTest.kt b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/common/ScreenSecurityTest.kt index a6e439d41..3d20e9c31 100644 --- a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/common/ScreenSecurityTest.kt +++ b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/common/ScreenSecurityTest.kt @@ -58,7 +58,9 @@ class ScreenSecurityTest : UiTestPrerequisites() { assertEquals(0, testSetup.getSecureScreenCount()) } - private class TestSetup(composeTestRule: ComposeContentTestRule) { + private class TestSetup( + composeTestRule: ComposeContentTestRule + ) { val mutableSecureScreenFlag = MutableStateFlow(true) private val screenSecurity = ScreenSecurity() diff --git a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/common/ScreenTimeoutTest.kt b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/common/ScreenTimeoutTest.kt index 6f24b329a..2e81a9d81 100644 --- a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/common/ScreenTimeoutTest.kt +++ b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/common/ScreenTimeoutTest.kt @@ -38,7 +38,9 @@ class ScreenTimeoutTest : UiTestPrerequisites() { assertEquals(0, testSetup.getScreenTimeoutCount()) } - private class TestSetup(composeTestRule: ComposeContentTestRule) { + private class TestSetup( + composeTestRule: ComposeContentTestRule + ) { val mutableScreenTimeoutFlag = MutableStateFlow(true) private val screenTimeout = ScreenTimeout() diff --git a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/configuration/ConfigurationEntriesTest.kt b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/configuration/ConfigurationEntriesTest.kt index e33a06123..996e23bc5 100644 --- a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/configuration/ConfigurationEntriesTest.kt +++ b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/configuration/ConfigurationEntriesTest.kt @@ -13,7 +13,8 @@ class ConfigurationEntriesTest { fun keys_unique() { val fieldValueSet = mutableSetOf() - ConfigurationEntries::class.memberProperties + ConfigurationEntries::class + .memberProperties .map { it.getter.call(ConfigurationEntries) } .map { it as DefaultEntry<*> } .map { it.key } diff --git a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/preference/StandardPreferenceKeysTest.kt b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/preference/StandardPreferenceKeysTest.kt index b1467c3c5..02616edde 100644 --- a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/preference/StandardPreferenceKeysTest.kt +++ b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/preference/StandardPreferenceKeysTest.kt @@ -13,7 +13,8 @@ class StandardPreferenceKeysTest { fun unique_keys() { val fieldValueSet = mutableSetOf() - StandardPreferenceKeys::class.memberProperties + StandardPreferenceKeys::class + .memberProperties .map { it.getter.call(StandardPreferenceKeys) } .map { it as PreferenceDefault<*> } .map { it.key } diff --git a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/about/view/AboutViewTest.kt b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/about/view/AboutViewTest.kt index 13ecc666b..4846d9235 100644 --- a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/about/view/AboutViewTest.kt +++ b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/about/view/AboutViewTest.kt @@ -30,8 +30,7 @@ class AboutViewTest { .onNodeWithContentDescription( getStringResource(R.string.back_navigation_content_description), ignoreCase = true - ) - .also { + ).also { it.assertExists() } @@ -60,11 +59,12 @@ class AboutViewTest { assertEquals(0, testSetup.getOnBackCount()) - composeTestRule.onNodeWithContentDescription( - getStringResource(R.string.back_navigation_content_description) - ).also { - it.performClick() - } + composeTestRule + .onNodeWithContentDescription( + getStringResource(R.string.back_navigation_content_description) + ).also { + it.performClick() + } assertEquals(1, testSetup.getOnBackCount()) } diff --git a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/account/view/AccountViewTest.kt b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/account/view/AccountViewTest.kt index 37a7b2bc9..bd4719a43 100644 --- a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/account/view/AccountViewTest.kt +++ b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/account/view/AccountViewTest.kt @@ -28,7 +28,8 @@ class AccountViewTest : UiTestPrerequisites() { fun check_all_elementary_ui_elements_displayed() { newTestSetup() - composeTestRule.onNodeWithTag(CommonTag.TOP_APP_BAR) + composeTestRule + .onNodeWithTag(CommonTag.TOP_APP_BAR) .also { it.assertIsDisplayed() } diff --git a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/balances/view/BalancesViewTest.kt b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/balances/view/BalancesViewTest.kt index 8758225c2..e88a00b61 100644 --- a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/balances/view/BalancesViewTest.kt +++ b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/balances/view/BalancesViewTest.kt @@ -35,7 +35,8 @@ class BalancesViewTest : UiTestPrerequisites() { fun check_all_elementary_ui_elements_displayed() { newTestSetup() - composeTestRule.onNodeWithTag(CommonTag.TOP_APP_BAR) + composeTestRule + .onNodeWithTag(CommonTag.TOP_APP_BAR) .also { it.assertIsDisplayed() } diff --git a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/exportdata/view/ExportPrivateDataViewTestSetup.kt b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/exportdata/view/ExportPrivateDataViewTestSetup.kt index e0befdf5b..ce970d306 100644 --- a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/exportdata/view/ExportPrivateDataViewTestSetup.kt +++ b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/exportdata/view/ExportPrivateDataViewTestSetup.kt @@ -8,7 +8,9 @@ import co.electriccoin.zcash.ui.design.theme.ZcashTheme import java.util.concurrent.atomic.AtomicBoolean import java.util.concurrent.atomic.AtomicInteger -class ExportPrivateDataViewTestSetup(private val composeTestRule: ComposeContentTestRule) { +class ExportPrivateDataViewTestSetup( + private val composeTestRule: ComposeContentTestRule +) { private val onBackCount = AtomicInteger(0) private val onAgree = AtomicBoolean(false) diff --git a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/onboarding/view/OnboardingViewTest.kt b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/onboarding/view/OnboardingViewTest.kt index 4baddde85..2abf365b8 100644 --- a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/onboarding/view/OnboardingViewTest.kt +++ b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/onboarding/view/OnboardingViewTest.kt @@ -19,34 +19,35 @@ class OnboardingViewTest : UiTestPrerequisites() { @get:Rule val composeTestRule = createComposeRule() - private fun newTestSetup(): OnboardingTestSetup { - return OnboardingTestSetup(composeTestRule).apply { + private fun newTestSetup(): OnboardingTestSetup = + OnboardingTestSetup(composeTestRule).apply { setDefaultContent() } - } @Test @MediumTest fun layout() { newTestSetup() - composeTestRule.onNodeWithText( - text = getStringResource(R.string.onboarding_create_new_wallet), - ignoreCase = true - ).also { - it.assertExists() - it.assertIsEnabled() - it.assertHasClickAction() - } + composeTestRule + .onNodeWithText( + text = getStringResource(R.string.onboarding_create_new_wallet), + ignoreCase = true + ).also { + it.assertExists() + it.assertIsEnabled() + it.assertHasClickAction() + } - composeTestRule.onNodeWithText( - text = getStringResource(R.string.onboarding_import_existing_wallet), - ignoreCase = true - ).also { - it.assertExists() - it.assertIsEnabled() - it.assertHasClickAction() - } + composeTestRule + .onNodeWithText( + text = getStringResource(R.string.onboarding_import_existing_wallet), + ignoreCase = true + ).also { + it.assertExists() + it.assertIsEnabled() + it.assertHasClickAction() + } } @Test diff --git a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/receive/view/ReceiveViewTest.kt b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/receive/view/ReceiveViewTest.kt index 9cbaf9c38..8c2c99e4d 100644 --- a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/receive/view/ReceiveViewTest.kt +++ b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/receive/view/ReceiveViewTest.kt @@ -32,11 +32,12 @@ class ReceiveViewTest { newTestSetup() // Enable substring for ellipsizing - composeTestRule.onNodeWithText( - text = "${WalletAddressFixture.UNIFIED_ADDRESS_STRING.take(20)}...", - substring = true, - useUnmergedTree = true - ).assertExists() + composeTestRule + .onNodeWithText( + text = "${WalletAddressFixture.UNIFIED_ADDRESS_STRING.take(20)}...", + substring = true, + useUnmergedTree = true + ).assertExists() } @Test @@ -47,11 +48,12 @@ class ReceiveViewTest { assertEquals(0, testSetup.getOnSettingsCount()) - composeTestRule.onNodeWithContentDescription( - getStringResource(R.string.settings_menu_content_description) - ).also { - it.performClick() - } + composeTestRule + .onNodeWithContentDescription( + getStringResource(R.string.settings_menu_content_description) + ).also { + it.performClick() + } assertEquals(1, testSetup.getOnSettingsCount()) } diff --git a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/restore/view/RestoreViewSecuredScreenTest.kt b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/restore/view/RestoreViewSecuredScreenTest.kt index 4bf01bdeb..64944693a 100644 --- a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/restore/view/RestoreViewSecuredScreenTest.kt +++ b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/restore/view/RestoreViewSecuredScreenTest.kt @@ -34,7 +34,9 @@ class RestoreViewSecuredScreenTest : UiTestPrerequisites() { assertEquals(1, testSetup.getSecureScreenCount()) } - private class TestSetup(composeTestRule: ComposeContentTestRule) { + private class TestSetup( + composeTestRule: ComposeContentTestRule + ) { private val screenSecurity = ScreenSecurity() fun getSecureScreenCount() = screenSecurity.referenceCount.value diff --git a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/restore/view/RestoreViewTest.kt b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/restore/view/RestoreViewTest.kt index a4d8018d7..8b5773895 100644 --- a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/restore/view/RestoreViewTest.kt +++ b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/restore/view/RestoreViewTest.kt @@ -61,17 +61,19 @@ class RestoreViewTest : UiTestPrerequisites() { it.assertTextContains("ab") } - composeTestRule.onNode( - matcher = hasText("abandon", substring = true) and hasTestTag(RestoreTag.AUTOCOMPLETE_ITEM) - ).also { - it.assertExists() - } + composeTestRule + .onNode( + matcher = hasText("abandon", substring = true) and hasTestTag(RestoreTag.AUTOCOMPLETE_ITEM) + ).also { + it.assertExists() + } - composeTestRule.onNode( - matcher = hasText("able", substring = true) and hasTestTag(RestoreTag.AUTOCOMPLETE_ITEM) - ).also { - it.assertExists() - } + composeTestRule + .onNode( + matcher = hasText("able", substring = true) and hasTestTag(RestoreTag.AUTOCOMPLETE_ITEM) + ).also { + it.assertExists() + } } @Test @@ -83,11 +85,12 @@ class RestoreViewTest : UiTestPrerequisites() { it.performTextInput("ab") } - composeTestRule.onNode( - matcher = hasText("abandon", substring = true) and hasTestTag(RestoreTag.AUTOCOMPLETE_ITEM) - ).also { - it.performClick() - } + composeTestRule + .onNode( + matcher = hasText("abandon", substring = true) and hasTestTag(RestoreTag.AUTOCOMPLETE_ITEM) + ).also { + it.performClick() + } composeTestRule.onNodeWithTag(RestoreTag.AUTOCOMPLETE_LAYOUT).also { it.assertDoesNotExist() @@ -119,7 +122,8 @@ class RestoreViewTest : UiTestPrerequisites() { it.assertDoesNotExist() } - composeTestRule.onNode(matcher = hasText(text = "abandon", substring = true)) + composeTestRule + .onNode(matcher = hasText(text = "abandon", substring = true)) .also { it.assertExists() } @@ -130,12 +134,13 @@ class RestoreViewTest : UiTestPrerequisites() { fun seed_invalid_phrase_does_not_progress() { newTestSetup(initialWordsList = generateSequence { "abandon" }.take(SeedPhrase.SEED_PHRASE_SIZE).toList()) - composeTestRule.onNodeWithText( - text = getStringResource(R.string.restore_seed_button_next), - ignoreCase = true - ).also { - it.assertIsNotEnabled() - } + composeTestRule + .onNodeWithText( + text = getStringResource(R.string.restore_seed_button_next), + ignoreCase = true + ).also { + it.assertIsNotEnabled() + } } @Test @@ -146,12 +151,13 @@ class RestoreViewTest : UiTestPrerequisites() { newTestSetup(initialWordsList = SeedPhraseFixture.new().split) - composeTestRule.onNodeWithText( - text = getStringResource(R.string.restore_seed_button_next), - ignoreCase = true - ).also { - it.assertExists() - } + composeTestRule + .onNodeWithText( + text = getStringResource(R.string.restore_seed_button_next), + ignoreCase = true + ).also { + it.assertExists() + } } @Test @@ -159,23 +165,25 @@ class RestoreViewTest : UiTestPrerequisites() { fun seed_clear() { newTestSetup(initialWordsList = listOf("abandon")) - composeTestRule.onNode( - matcher = hasText(text = "abandon", substring = true), - useUnmergedTree = true - ).also { - it.assertExists() - } + composeTestRule + .onNode( + matcher = hasText(text = "abandon", substring = true), + useUnmergedTree = true + ).also { + it.assertExists() + } composeTestRule.onNodeWithText(getStringResource(R.string.restore_button_clear)).also { it.performClick() } - composeTestRule.onNode( - matcher = hasText("abandon", substring = true) and hasTestTag(CommonTag.CHIP), - useUnmergedTree = true - ).also { - it.assertDoesNotExist() - } + composeTestRule + .onNode( + matcher = hasText("abandon", substring = true) and hasTestTag(CommonTag.CHIP), + useUnmergedTree = true + ).also { + it.assertDoesNotExist() + } } @Test @@ -187,14 +195,15 @@ class RestoreViewTest : UiTestPrerequisites() { initialWordsList = SeedPhraseFixture.new().split ) - composeTestRule.onNodeWithText( - text = getStringResource(R.string.restore_birthday_button_restore), - ignoreCase = true - ).also { - it.performScrollTo() - it.assertIsEnabled() - it.performClick() - } + composeTestRule + .onNodeWithText( + text = getStringResource(R.string.restore_birthday_button_restore), + ignoreCase = true + ).also { + it.performScrollTo() + it.assertIsEnabled() + it.performClick() + } assertEquals(testSetup.getRestoreHeight(), null) assertEquals(1, testSetup.getOnFinishedCount()) @@ -210,16 +219,20 @@ class RestoreViewTest : UiTestPrerequisites() { ) composeTestRule.onNodeWithTag(RestoreTag.BIRTHDAY_TEXT_FIELD).also { - it.performTextInput(ZcashNetwork.Mainnet.saplingActivationHeight.value.toString()) + it.performTextInput( + ZcashNetwork.Mainnet.saplingActivationHeight.value + .toString() + ) } - composeTestRule.onNodeWithText( - text = getStringResource(R.string.restore_birthday_button_restore), - ignoreCase = true - ).also { - it.assertIsEnabled() - it.performClick() - } + composeTestRule + .onNodeWithText( + text = getStringResource(R.string.restore_birthday_button_restore), + ignoreCase = true + ).also { + it.assertIsEnabled() + it.performClick() + } assertEquals(testSetup.getRestoreHeight(), ZcashNetwork.Mainnet.saplingActivationHeight) assertEquals(1, testSetup.getOnFinishedCount()) @@ -234,24 +247,26 @@ class RestoreViewTest : UiTestPrerequisites() { initialWordsList = SeedPhraseFixture.new().split ) - composeTestRule.onNodeWithText( - text = getStringResource(R.string.restore_birthday_button_restore), - ignoreCase = true - ).also { - it.assertIsEnabled() - } + composeTestRule + .onNodeWithText( + text = getStringResource(R.string.restore_birthday_button_restore), + ignoreCase = true + ).also { + it.assertIsEnabled() + } composeTestRule.onNodeWithTag(RestoreTag.BIRTHDAY_TEXT_FIELD).also { it.performTextInput((ZcashNetwork.Mainnet.saplingActivationHeight.value - 1L).toString()) } - composeTestRule.onNodeWithText( - text = getStringResource(R.string.restore_birthday_button_restore), - ignoreCase = true - ).also { - it.assertIsNotEnabled() - it.performClick() - } + composeTestRule + .onNodeWithText( + text = getStringResource(R.string.restore_birthday_button_restore), + ignoreCase = true + ).also { + it.assertIsNotEnabled() + it.performClick() + } assertNull(testSetup.getRestoreHeight()) assertEquals(0, testSetup.getOnFinishedCount()) @@ -270,13 +285,14 @@ class RestoreViewTest : UiTestPrerequisites() { it.performTextInput("1.2") } - composeTestRule.onNodeWithText( - text = getStringResource(R.string.restore_birthday_button_restore), - ignoreCase = true - ).also { - it.assertIsNotEnabled() - it.performClick() - } + composeTestRule + .onNodeWithText( + text = getStringResource(R.string.restore_birthday_button_restore), + ignoreCase = true + ).also { + it.assertIsNotEnabled() + it.performClick() + } assertNull(testSetup.getRestoreHeight()) assertEquals(0, testSetup.getOnFinishedCount()) @@ -293,12 +309,13 @@ class RestoreViewTest : UiTestPrerequisites() { assertEquals(0, testSetup.getOnFinishedCount()) - composeTestRule.onNodeWithText( - text = getStringResource(R.string.restore_birthday_button_restore), - ignoreCase = true - ).also { - it.performClick() - } + composeTestRule + .onNodeWithText( + text = getStringResource(R.string.restore_birthday_button_restore), + ignoreCase = true + ).also { + it.performClick() + } assertEquals(1, testSetup.getOnFinishedCount()) } @@ -310,11 +327,12 @@ class RestoreViewTest : UiTestPrerequisites() { assertEquals(0, testSetup.getOnBackCount()) - composeTestRule.onNodeWithContentDescription( - getStringResource(R.string.back_navigation_content_description) - ).also { - it.performClick() - } + composeTestRule + .onNodeWithContentDescription( + getStringResource(R.string.back_navigation_content_description) + ).also { + it.performClick() + } assertEquals(1, testSetup.getOnBackCount()) } @@ -330,11 +348,12 @@ class RestoreViewTest : UiTestPrerequisites() { assertEquals(0, testSetup.getOnBackCount()) - composeTestRule.onNodeWithContentDescription( - getStringResource(R.string.back_navigation_content_description) - ).also { - it.performClick() - } + composeTestRule + .onNodeWithContentDescription( + getStringResource(R.string.back_navigation_content_description) + ).also { + it.performClick() + } // There appears to be a bug introduced in Compose 1.4.0 which makes this necessary composeTestRule.mainClock.autoAdvance = false diff --git a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/scan/view/ScanViewBasicTest.kt b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/scan/view/ScanViewBasicTest.kt index 60244e3b8..77fc066d2 100644 --- a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/scan/view/ScanViewBasicTest.kt +++ b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/scan/view/ScanViewBasicTest.kt @@ -67,12 +67,13 @@ class ScanViewBasicTest : UiTestPrerequisites() { // Permission denied ui items (not visible): - composeTestRule.onNodeWithText( - text = getStringResource(R.string.scan_settings_button), - ignoreCase = true - ).also { - it.assertDoesNotExist() - } + composeTestRule + .onNodeWithText( + text = getStringResource(R.string.scan_settings_button), + ignoreCase = true + ).also { + it.assertDoesNotExist() + } } @Test diff --git a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/securitywarning/view/SecurityWarningViewTestSetup.kt b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/securitywarning/view/SecurityWarningViewTestSetup.kt index ce85949d4..ea13890a4 100644 --- a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/securitywarning/view/SecurityWarningViewTestSetup.kt +++ b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/securitywarning/view/SecurityWarningViewTestSetup.kt @@ -7,7 +7,9 @@ import co.electriccoin.zcash.ui.fixture.VersionInfoFixture import java.util.concurrent.atomic.AtomicBoolean import java.util.concurrent.atomic.AtomicInteger -class SecurityWarningViewTestSetup(private val composeTestRule: ComposeContentTestRule) { +class SecurityWarningViewTestSetup( + private val composeTestRule: ComposeContentTestRule +) { private val onBackCount = AtomicInteger(0) private val onAcknowledged = AtomicBoolean(false) diff --git a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/settings/view/SettingsViewTest.kt b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/settings/view/SettingsViewTest.kt index 72feb339b..41f402e86 100644 --- a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/settings/view/SettingsViewTest.kt +++ b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/settings/view/SettingsViewTest.kt @@ -29,11 +29,12 @@ class SettingsViewTest : UiTestPrerequisites() { assertEquals(0, testSetup.getBackCount()) - composeTestRule.onNodeWithContentDescription( - getStringResource(R.string.back_navigation_content_description) - ).also { - it.performClick() - } + composeTestRule + .onNodeWithContentDescription( + getStringResource(R.string.back_navigation_content_description) + ).also { + it.performClick() + } assertEquals(1, testSetup.getBackCount()) } @@ -45,12 +46,13 @@ class SettingsViewTest : UiTestPrerequisites() { assertEquals(0, testSetup.getFeedbackCount()) - composeTestRule.onNodeWithText( - text = getStringResource(R.string.settings_feedback), - ignoreCase = true - ).also { - it.performClick() - } + composeTestRule + .onNodeWithText( + text = getStringResource(R.string.settings_feedback), + ignoreCase = true + ).also { + it.performClick() + } assertEquals(1, testSetup.getFeedbackCount()) } @@ -62,12 +64,13 @@ class SettingsViewTest : UiTestPrerequisites() { assertEquals(0, testSetup.getAdvancedSettingsCount()) - composeTestRule.onNodeWithText( - text = getStringResource(R.string.settings_advanced_settings), - ignoreCase = true - ).also { - it.performClick() - } + composeTestRule + .onNodeWithText( + text = getStringResource(R.string.settings_advanced_settings), + ignoreCase = true + ).also { + it.performClick() + } assertEquals(1, testSetup.getAdvancedSettingsCount()) } @@ -79,13 +82,14 @@ class SettingsViewTest : UiTestPrerequisites() { assertEquals(0, testSetup.getAboutCount()) - composeTestRule.onNodeWithText( - text = getStringResource(R.string.settings_about_us), - ignoreCase = true - ).also { - it.performScrollTo() - it.performClick() - } + composeTestRule + .onNodeWithText( + text = getStringResource(R.string.settings_about_us), + ignoreCase = true + ).also { + it.performScrollTo() + it.performClick() + } assertEquals(1, testSetup.getAboutCount()) } @@ -145,11 +149,12 @@ class SettingsViewTest : UiTestPrerequisites() { composeTestRule.openTroubleshootingMenu() - composeTestRule.onNodeWithText( - getStringResource(R.string.settings_troubleshooting_enable_background_sync) - ).also { - it.performClick() - } + composeTestRule + .onNodeWithText( + getStringResource(R.string.settings_troubleshooting_enable_background_sync) + ).also { + it.performClick() + } assertEquals(1, testSetup.getBackgroundSyncCount()) } @@ -168,11 +173,12 @@ class SettingsViewTest : UiTestPrerequisites() { composeTestRule.openTroubleshootingMenu() - composeTestRule.onNodeWithText( - getStringResource(R.string.settings_troubleshooting_enable_keep_screen_on) - ).also { - it.performClick() - } + composeTestRule + .onNodeWithText( + getStringResource(R.string.settings_troubleshooting_enable_keep_screen_on) + ).also { + it.performClick() + } assertEquals(1, testSetup.getKeepScreenOnSyncCount()) } @@ -191,11 +197,12 @@ class SettingsViewTest : UiTestPrerequisites() { composeTestRule.openTroubleshootingMenu() - composeTestRule.onNodeWithText( - getStringResource(R.string.settings_troubleshooting_enable_analytics) - ).also { - it.performClick() - } + composeTestRule + .onNodeWithText( + getStringResource(R.string.settings_troubleshooting_enable_analytics) + ).also { + it.performClick() + } assertEquals(1, testSetup.getAnalyticsCount()) } diff --git a/ui-lib/src/foss/java/co/electriccoin/zcash/ui/screen/scan/util/QrCodeAnalyzerImpl.kt b/ui-lib/src/foss/java/co/electriccoin/zcash/ui/screen/scan/util/QrCodeAnalyzerImpl.kt index 45530643a..2df9b28cf 100644 --- a/ui-lib/src/foss/java/co/electriccoin/zcash/ui/screen/scan/util/QrCodeAnalyzerImpl.kt +++ b/ui-lib/src/foss/java/co/electriccoin/zcash/ui/screen/scan/util/QrCodeAnalyzerImpl.kt @@ -26,7 +26,11 @@ class QrCodeAnalyzerImpl( override fun analyze(image: ImageProxy) { image.use { if (image.format in supportedImageFormats) { - val bytes = image.planes.first().buffer.toByteArray() + val bytes = + image.planes + .first() + .buffer + .toByteArray() Twig.verbose { "Scan result: " + @@ -89,14 +93,15 @@ class QrCodeAnalyzerImpl( runCatching { val result = - MultiFormatReader().apply { - setHints( - mapOf( - DecodeHintType.POSSIBLE_FORMATS to arrayListOf(BarcodeFormat.QR_CODE), - DecodeHintType.ALSO_INVERTED to true + MultiFormatReader() + .apply { + setHints( + mapOf( + DecodeHintType.POSSIBLE_FORMATS to arrayListOf(BarcodeFormat.QR_CODE), + DecodeHintType.ALSO_INVERTED to true + ) ) - ) - }.decodeWithState(binaryBmp) + }.decodeWithState(binaryBmp) onQrCodeScanned(result.text) }.onFailure { diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/global/WalletCoordinator.kt b/ui-lib/src/main/java/co/electriccoin/zcash/global/WalletCoordinator.kt index d2ff2986e..6ccd3d987 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/global/WalletCoordinator.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/global/WalletCoordinator.kt @@ -12,8 +12,8 @@ fun WalletCoordinator.Companion.newInstance( context: Context, encryptedPreferenceProvider: EncryptedPreferenceProvider, persistableWalletPreference: PersistableWalletPreferenceDefault -): WalletCoordinator { - return WalletCoordinator( +): WalletCoordinator = + WalletCoordinator( context = context, persistableWallet = flow { @@ -22,6 +22,5 @@ fun WalletCoordinator.Companion.newInstance( accountName = context.getString(R.string.zashi_wallet_name), keySource = ZASHI_KEYSOURCE ) -} private const val ZASHI_KEYSOURCE = "zashi" diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/BiometricActivity.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/BiometricActivity.kt index 66d835b0d..a60bb0dbc 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/BiometricActivity.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/BiometricActivity.kt @@ -42,11 +42,11 @@ class BiometricActivity : FragmentActivity() { ) val promptInfo = - BiometricPrompt.PromptInfo.Builder() + BiometricPrompt.PromptInfo + .Builder() .setTitle( getString(R.string.authentication_system_ui_title, getString(R.string.app_name)) - ) - .setSubtitle(subtitle) + ).setSubtitle(subtitle) .setAllowedAuthenticators(biometricRepository.allowedAuthenticators) .build() diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/Navigation.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/Navigation.kt index 3c1259f93..7cb97852b 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/Navigation.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/Navigation.kt @@ -472,7 +472,11 @@ private fun MainActivity.NavigationHome( val isEnoughSpace by storageCheckViewModel.isEnoughSpace.collectAsStateWithLifecycle() - val sdkStatus = walletViewModel.currentWalletSnapshot.collectAsStateWithLifecycle().value?.status + val sdkStatus = + walletViewModel.currentWalletSnapshot + .collectAsStateWithLifecycle() + .value + ?.status val currentAppState = applicationStateProvider.state.collectAsStateWithLifecycle().value diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/NavigationRouter.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/NavigationRouter.kt index 88ac682d5..e34f73d9f 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/NavigationRouter.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/NavigationRouter.kt @@ -69,13 +69,21 @@ class NavigationRouterImpl : NavigationRouter { } sealed interface NavigationCommand { - data class Forward(val route: Any) : NavigationCommand + data class Forward( + val route: Any + ) : NavigationCommand - data class Replace(val route: Any) : NavigationCommand + data class Replace( + val route: Any + ) : NavigationCommand - data class ReplaceAll(val route: Any) : NavigationCommand + data class ReplaceAll( + val route: Any + ) : NavigationCommand - data class NewRoot(val route: Any) : NavigationCommand + data class NewRoot( + val route: Any + ) : NavigationCommand data object Back : NavigationCommand diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/datasource/AccountDataSource.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/datasource/AccountDataSource.kt index 99112717a..1032e1907 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/datasource/AccountDataSource.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/datasource/AccountDataSource.kt @@ -106,8 +106,7 @@ class AccountDataSourceImpl( ) } } - } - ?.flatMapLatest { accountsWithAddresses -> + }?.flatMapLatest { accountsWithAddresses -> if (accountsWithAddresses == null) { flowOf(null) } else { @@ -132,8 +131,7 @@ class AccountDataSourceImpl( } } } - } - ?.retryWhen { _, attempt -> + }?.retryWhen { _, attempt -> emit(null) delay(attempt.coerceAtMost(RETRY_DELAY).seconds) true @@ -189,8 +187,7 @@ class AccountDataSourceImpl( accounts.size == 1, ) } - } - ?.sortedDescending() + }?.sortedDescending() }.flowOn(Dispatchers.IO) .stateIn( scope = scope, @@ -202,15 +199,13 @@ class AccountDataSourceImpl( allAccounts .map { account -> account?.firstOrNull { it.isSelected } - } - .distinctUntilChanged() + }.distinctUntilChanged() override val zashiAccount: Flow = allAccounts .map { account -> account?.filterIsInstance()?.firstOrNull() - } - .distinctUntilChanged() + }.distinctUntilChanged() override suspend fun getAllAccounts() = withContext(Dispatchers.IO) { @@ -250,7 +245,8 @@ class AccountDataSourceImpl( index: Long ): Account = withContext(Dispatchers.IO) { - synchronizerProvider.getSynchronizer() + synchronizerProvider + .getSynchronizer() .importAccountByUfvk( AccountImportSetup( accountName = context.getString(R.string.keystone_wallet_name), diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/datasource/LocalAddressBookDataSource.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/datasource/LocalAddressBookDataSource.kt index 03dcb0920..d49e72096 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/datasource/LocalAddressBookDataSource.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/datasource/LocalAddressBookDataSource.kt @@ -108,7 +108,10 @@ class LocalAddressBookDataSourceImpl( lastUpdated = lastUpdated, version = ADDRESS_BOOK_SERIALIZATION_V1, contacts = - addressBook?.contacts.orEmpty().toMutableList() + addressBook + ?.contacts + .orEmpty() + .toMutableList() .apply { set( indexOf(contact), @@ -118,8 +121,7 @@ class LocalAddressBookDataSourceImpl( lastUpdated = Clock.System.now() ) ) - } - .toList(), + }.toList(), ).also { addressBook = it } @@ -138,11 +140,13 @@ class LocalAddressBookDataSourceImpl( lastUpdated = lastUpdated, version = ADDRESS_BOOK_SERIALIZATION_V1, contacts = - addressBook?.contacts.orEmpty().toMutableList() + addressBook + ?.contacts + .orEmpty() + .toMutableList() .apply { remove(addressBookContact) - } - .toList(), + }.toList(), ).also { addressBook = it } @@ -176,7 +180,8 @@ class LocalAddressBookDataSourceImpl( } return if (unencryptedFile != null) { - addressBookProvider.readLegacyUnencryptedAddressBookFromFile(unencryptedFile) + addressBookProvider + .readLegacyUnencryptedAddressBookFromFile(unencryptedFile) .also { unencryptedAddressBook -> writeAddressBookToLocalStorage(unencryptedAddressBook, addressBookKey) unencryptedFile.deleteSuspend() diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/datasource/MetadataDataSource.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/datasource/MetadataDataSource.kt index b1766333a..87cf4aa3f 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/datasource/MetadataDataSource.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/datasource/MetadataDataSource.kt @@ -167,8 +167,8 @@ class MetadataDataSourceImpl( txId: String, key: MetadataKey, transform: (AnnotationMetadata) -> AnnotationMetadata - ): Metadata { - return updateMetadata( + ): Metadata = + updateMetadata( key = key, transform = { metadata -> metadata.copy( @@ -184,14 +184,13 @@ class MetadataDataSourceImpl( ) } ) - } private suspend fun updateMetadataBookmark( txId: String, key: MetadataKey, transform: (BookmarkMetadata) -> BookmarkMetadata - ): Metadata { - return updateMetadata( + ): Metadata = + updateMetadata( key = key, transform = { metadata -> metadata.copy( @@ -207,13 +206,12 @@ class MetadataDataSourceImpl( ) } ) - } private suspend fun updateMetadata( key: MetadataKey, transform: (AccountMetadata) -> AccountMetadata - ): Metadata { - return withContext(Dispatchers.IO) { + ): Metadata = + withContext(Dispatchers.IO) { val metadata = getMetadataInternal(key) val accountMetadata = metadata.accountMetadata @@ -228,7 +226,6 @@ class MetadataDataSourceImpl( updatedMetadata } - } } private fun defaultAccountMetadata() = @@ -258,11 +255,11 @@ private fun List.replaceOrAdd( ): List { val index = this.indexOfFirst(predicate) return if (index != -1) { - this.toMutableList() + this + .toMutableList() .apply { set(index, transform(this[index])) - } - .toList() + }.toList() } else { this + transform(null) } diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/datasource/ProposalDataSource.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/datasource/ProposalDataSource.kt index 963aef484..b4dbb635e 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/datasource/ProposalDataSource.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/datasource/ProposalDataSource.kt @@ -62,7 +62,9 @@ interface ProposalDataSource { suspend fun redactPcztForSigner(pczt: Pczt): Pczt } -class TransactionProposalNotCreatedException(reason: Exception) : Exception(reason) +class TransactionProposalNotCreatedException( + reason: Exception +) : Exception(reason) @Suppress("TooManyFunctions") class ProposalDataSourceImpl( @@ -150,7 +152,8 @@ class ProposalDataSourceImpl( override suspend fun addProofsToPczt(pczt: Pczt): Pczt = withContext(Dispatchers.IO) { - synchronizerProvider.getSynchronizer() + synchronizerProvider + .getSynchronizer() .addProofsToPczt(pczt) } @@ -178,7 +181,8 @@ class ProposalDataSourceImpl( override suspend fun redactPcztForSigner(pczt: Pczt): Pczt = withContext(Dispatchers.IO) { - synchronizerProvider.getSynchronizer() + synchronizerProvider + .getSynchronizer() .redactPcztForSigner(pczt) } @@ -232,13 +236,12 @@ class ProposalDataSourceImpl( } @Suppress("TooGenericExceptionCaught") - private inline fun getOrThrow(block: () -> T): T { - return try { + private inline fun getOrThrow(block: () -> T): T = + try { block() } catch (e: Exception) { throw TransactionProposalNotCreatedException(e) } - } private suspend fun AddressType.toWalletAddress(value: String) = when (this) { diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/mapper/TransactionHistoryMapper.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/mapper/TransactionHistoryMapper.kt index 9ce9c5030..4aa9db491 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/mapper/TransactionHistoryMapper.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/mapper/TransactionHistoryMapper.kt @@ -23,8 +23,8 @@ class TransactionHistoryMapper { data: ListTransactionData, restoreTimestamp: Instant, onTransactionClick: (Transaction) -> Unit - ): TransactionState { - return TransactionState( + ): TransactionState = + TransactionState( key = data.transaction.id.txIdString(), icon = getIcon(data), title = getTitle(data), @@ -34,7 +34,6 @@ class TransactionHistoryMapper { onClick = { onTransactionClick(data.transaction) }, isUnread = isUnread(data, restoreTimestamp) ) - } private fun isUnread( data: ListTransactionData, diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/model/FastestServersState.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/model/FastestServersState.kt index 798ff92a6..556528102 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/model/FastestServersState.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/model/FastestServersState.kt @@ -6,4 +6,7 @@ import co.electriccoin.lightwallet.client.model.LightWalletEndpoint * @property servers an ascended sorted list of fastest servers, or null if none loaded * @property isLoading indicates whether newer data is being loaded */ -data class FastestServersState(val servers: List?, val isLoading: Boolean) +data class FastestServersState( + val servers: List?, + val isLoading: Boolean +) diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/model/SubmitResult.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/model/SubmitResult.kt index 091592dfc..07b46f80d 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/model/SubmitResult.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/model/SubmitResult.kt @@ -3,23 +3,31 @@ package co.electriccoin.zcash.ui.common.model import cash.z.ecc.android.sdk.model.TransactionSubmitResult sealed interface SubmitResult { - data class Success(val txIds: List) : SubmitResult + data class Success( + val txIds: List + ) : SubmitResult - data class MultipleTrxFailure(val results: List) : SubmitResult + data class MultipleTrxFailure( + val results: List + ) : SubmitResult sealed interface SimpleTrxFailure : SubmitResult { fun toErrorMessage(): String fun toErrorStacktrace(): String - data class SimpleTrxFailureGrpc(val result: TransactionSubmitResult.Failure) : SimpleTrxFailure { + data class SimpleTrxFailureGrpc( + val result: TransactionSubmitResult.Failure + ) : SimpleTrxFailure { // Currently, we intentionally do not include any error related details override fun toErrorMessage() = "" override fun toErrorStacktrace() = "" } - data class SimpleTrxFailureSubmit(val result: TransactionSubmitResult.Failure) : SimpleTrxFailure { + data class SimpleTrxFailureSubmit( + val result: TransactionSubmitResult.Failure + ) : SimpleTrxFailure { override fun toErrorMessage() = buildString { appendLine("Error code: ${result.code}") @@ -29,7 +37,9 @@ sealed interface SubmitResult { override fun toErrorStacktrace(): String = toErrorMessage() } - data class SimpleTrxFailureOther(val error: Throwable) : SimpleTrxFailure { + data class SimpleTrxFailureOther( + val error: Throwable + ) : SimpleTrxFailure { override fun toErrorMessage() = error.message ?: "Unknown error" override fun toErrorStacktrace(): String = error.stackTraceToString() diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/model/ValidContactName.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/model/ValidContactName.kt index 9997760a6..00c378eb8 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/model/ValidContactName.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/model/ValidContactName.kt @@ -1,4 +1,6 @@ package co.electriccoin.zcash.ui.common.model @JvmInline -value class ValidContactName(val value: String) +value class ValidContactName( + val value: String +) diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/model/VersionInfo.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/model/VersionInfo.kt index 39af0caed..ace912b51 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/model/VersionInfo.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/model/VersionInfo.kt @@ -49,17 +49,18 @@ data class VersionInfo( ) } - private fun resolveBestReleaseNotes(): String { - return if (Locale.getDefault().language.contains("es", ignoreCase = true)) { + private fun resolveBestReleaseNotes(): String = + if (Locale.getDefault().language.contains("es", ignoreCase = true)) { releaseNotesEs } else { releaseNotesEn } - } } } -enum class DistributionDimension(val value: String) { +enum class DistributionDimension( + val value: String +) { STORE("store"), FOSS("foss") } diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/provider/AddressBookKeyStorageProvider.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/provider/AddressBookKeyStorageProvider.kt index 42a38197f..5dddc86ee 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/provider/AddressBookKeyStorageProvider.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/provider/AddressBookKeyStorageProvider.kt @@ -22,9 +22,7 @@ class AddressBookKeyStorageProviderImpl( ) : AddressBookKeyStorageProvider { private val default = AddressBookKeyPreferenceDefault() - override suspend fun getAddressBookKey(): AddressBookKey? { - return default.getValue(encryptedPreferenceProvider()) - } + override suspend fun getAddressBookKey(): AddressBookKey? = default.getValue(encryptedPreferenceProvider()) override suspend fun storeAddressBookKey(addressBookKey: AddressBookKey) { default.putValue(encryptedPreferenceProvider(), addressBookKey) diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/provider/AddressBookProvider.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/provider/AddressBookProvider.kt index 016befe33..52b159408 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/provider/AddressBookProvider.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/provider/AddressBookProvider.kt @@ -43,18 +43,16 @@ class AddressBookProviderImpl( override fun readAddressBookFromFile( file: File, addressBookKey: AddressBookKey - ): AddressBook { - return file.inputStream().use { stream -> + ): AddressBook = + file.inputStream().use { stream -> addressBookEncryptor.decrypt( key = addressBookKey, inputStream = stream ) } - } - override fun readLegacyUnencryptedAddressBookFromFile(file: File): AddressBook { - return file.inputStream().use { stream -> + override fun readLegacyUnencryptedAddressBookFromFile(file: File): AddressBook = + file.inputStream().use { stream -> addressBookSerializer.deserializeAddressBook(stream) } - } } diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/provider/AddressBookStorageProvider.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/provider/AddressBookStorageProvider.kt index 05a417d4e..ff2b86071 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/provider/AddressBookStorageProvider.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/provider/AddressBookStorageProvider.kt @@ -20,15 +20,13 @@ interface AddressBookStorageProvider { class AddressBookStorageProviderImpl( private val context: Context ) : AddressBookStorageProvider { - override fun getStorageFile(addressBookKey: AddressBookKey): File? { - return File(getOrCreateAddressBookDir(), addressBookKey.fileIdentifier()) + override fun getStorageFile(addressBookKey: AddressBookKey): File? = + File(getOrCreateAddressBookDir(), addressBookKey.fileIdentifier()) .takeIf { it.exists() && it.isFile } - } - override fun getLegacyUnencryptedStorageFile(): File? { - return File(context.noBackupFilesDir, LEGACY_UNENCRYPTED_ADDRESS_BOOK_FILE_NAME) + override fun getLegacyUnencryptedStorageFile(): File? = + File(context.noBackupFilesDir, LEGACY_UNENCRYPTED_ADDRESS_BOOK_FILE_NAME) .takeIf { it.exists() && it.isFile } - } override fun getOrCreateStorageFile(addressBookKey: AddressBookKey): File { val file = File(getOrCreateAddressBookDir(), addressBookKey.fileIdentifier()) diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/provider/ApplicationStateProvider.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/provider/ApplicationStateProvider.kt index bea6a39f6..1d40f616e 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/provider/ApplicationStateProvider.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/provider/ApplicationStateProvider.kt @@ -20,9 +20,7 @@ class ApplicationStateProviderImpl : ApplicationStateProvider { override val state = _state.asStateFlow() - override suspend fun getApplicationState(): Lifecycle.Event? { - return _state.last() - } + override suspend fun getApplicationState(): Lifecycle.Event? = _state.last() override fun setApplicationState(newState: Lifecycle.Event) { _state.update { newState } diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/provider/GetDefaultServersProvider.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/provider/GetDefaultServersProvider.kt index 1e734c8b8..e11a1bfb0 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/provider/GetDefaultServersProvider.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/provider/GetDefaultServersProvider.kt @@ -8,7 +8,9 @@ import co.electriccoin.lightwallet.client.model.LightWalletEndpoint // TODO [#1273]: Add ChooseServer Tests #1273 // TODO [#1273]: https://github.com/Electric-Coin-Company/zashi-android/issues/1273 -class GetDefaultServersProvider(private val application: Application) { +class GetDefaultServersProvider( + private val application: Application +) { private val lightWalletEndpoints by lazy { if (ZcashNetwork.fromResources(application) == ZcashNetwork.Mainnet) { listOf( diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/provider/GetVersionInfoProvider.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/provider/GetVersionInfoProvider.kt index dd622bdc5..fc23d6cde 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/provider/GetVersionInfoProvider.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/provider/GetVersionInfoProvider.kt @@ -3,6 +3,8 @@ package co.electriccoin.zcash.ui.common.provider import android.app.Application import co.electriccoin.zcash.ui.common.model.VersionInfo -class GetVersionInfoProvider(private val application: Application) { +class GetVersionInfoProvider( + private val application: Application +) { operator fun invoke() = VersionInfo.new(application) } diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/provider/GetZcashCurrencyProvider.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/provider/GetZcashCurrencyProvider.kt index ca3074a85..2c761b487 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/provider/GetZcashCurrencyProvider.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/provider/GetZcashCurrencyProvider.kt @@ -3,7 +3,9 @@ package co.electriccoin.zcash.ui.common.provider import android.app.Application import cash.z.ecc.sdk.type.ZcashCurrency -class GetZcashCurrencyProvider(private val application: Application) { +class GetZcashCurrencyProvider( + private val application: Application +) { operator fun invoke() = ZcashCurrency.fromResources(application) fun getLocalizedName() = ZcashCurrency.getLocalizedName(application) diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/provider/MetadataKeyStorageProvider.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/provider/MetadataKeyStorageProvider.kt index 6063aacad..ca2177e80 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/provider/MetadataKeyStorageProvider.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/provider/MetadataKeyStorageProvider.kt @@ -25,12 +25,11 @@ class MetadataKeyStorageProviderImpl( ) : MetadataKeyStorageProvider { private val default = MetadataKeyPreferenceDefault() - override suspend fun get(account: WalletAccount): MetadataKey? { - return default.getValue( + override suspend fun get(account: WalletAccount): MetadataKey? = + default.getValue( walletAccount = account, preferenceProvider = encryptedPreferenceProvider(), ) - } override suspend fun store( key: MetadataKey, @@ -51,11 +50,11 @@ private class MetadataKeyPreferenceDefault { suspend fun getValue( walletAccount: WalletAccount, preferenceProvider: PreferenceProvider, - ): MetadataKey? { - return preferenceProvider.getStringSet( - key = getKey(walletAccount) - )?.decode() - } + ): MetadataKey? = + preferenceProvider + .getStringSet( + key = getKey(walletAccount) + )?.decode() suspend fun putValue( newValue: MetadataKey?, @@ -73,20 +72,19 @@ private class MetadataKeyPreferenceDefault { PreferenceKey("metadata_key_${walletAccount.sdkAccount.accountUuid.value.toHexString()}") @OptIn(ExperimentalEncodingApi::class) - private fun MetadataKey?.encode(): Set? { - return this + private fun MetadataKey?.encode(): Set? = + this ?.bytes ?.map { Base64.encode(it.toByteArray(secretKeyAccess)) - } - ?.toSet() - } + }?.toSet() @OptIn(ExperimentalEncodingApi::class) private fun Set?.decode() = if (this != null) { MetadataKey( - this.toList() + this + .toList() .map { SecretBytes.copyFrom(Base64.decode(it), secretKeyAccess) } diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/provider/MetadataProvider.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/provider/MetadataProvider.kt index 51301af44..3dda69945 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/provider/MetadataProvider.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/provider/MetadataProvider.kt @@ -39,12 +39,11 @@ class MetadataProviderImpl( override fun readMetadataFromFile( file: File, addressBookKey: MetadataKey - ): Metadata { - return file.inputStream().use { stream -> + ): Metadata = + file.inputStream().use { stream -> metadataEncryptor.decrypt( key = addressBookKey, inputStream = stream ) } - } } diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/provider/MetadataStorageProvider.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/provider/MetadataStorageProvider.kt index b67e85c50..31be76bdb 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/provider/MetadataStorageProvider.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/provider/MetadataStorageProvider.kt @@ -13,10 +13,9 @@ interface MetadataStorageProvider { class MetadataStorageProviderImpl( private val context: Context ) : MetadataStorageProvider { - override fun getStorageFile(key: MetadataKey): File? { - return File(getOrCreateMetadataDir(), key.fileIdentifier()) + override fun getStorageFile(key: MetadataKey): File? = + File(getOrCreateMetadataDir(), key.fileIdentifier()) .takeIf { it.exists() && it.isFile } - } override fun getOrCreateStorageFile(key: MetadataKey): File { val file = File(getOrCreateMetadataDir(), key.fileIdentifier()) diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/provider/RestoreTimestampStorageProvider.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/provider/RestoreTimestampStorageProvider.kt index a7db565ee..bfdb26980 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/provider/RestoreTimestampStorageProvider.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/provider/RestoreTimestampStorageProvider.kt @@ -19,9 +19,7 @@ class RestoreTimestampStorageProviderImpl( ) : RestoreTimestampStorageProvider { private val default = RestoreTimestampPreferenceDefault() - override suspend fun get(): Instant? { - return default.getValue(encryptedPreferenceProvider()) - } + override suspend fun get(): Instant? = default.getValue(encryptedPreferenceProvider()) override suspend fun store(key: Instant) { default.putValue(encryptedPreferenceProvider(), key) diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/provider/SelectedAccountUUIDProvider.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/provider/SelectedAccountUUIDProvider.kt index bf85ca7c3..be31605d8 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/provider/SelectedAccountUUIDProvider.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/provider/SelectedAccountUUIDProvider.kt @@ -29,9 +29,7 @@ class SelectedAccountUUIDProviderImpl( emitAll(default.observe(encryptedPreferenceProvider())) } - override suspend fun getUUID(): AccountUuid? { - return default.getValue(encryptedPreferenceProvider()) - } + override suspend fun getUUID(): AccountUuid? = default.getValue(encryptedPreferenceProvider()) override suspend fun setUUID(uuid: AccountUuid) { default.putValue(encryptedPreferenceProvider(), uuid) diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/provider/SynchronizerProvider.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/provider/SynchronizerProvider.kt index f765cfad3..28565acf3 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/provider/SynchronizerProvider.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/provider/SynchronizerProvider.kt @@ -28,7 +28,9 @@ interface SynchronizerProvider { suspend fun getSdkSynchronizer() = getSynchronizer() as SdkSynchronizer } -class SynchronizerProviderImpl(walletCoordinator: WalletCoordinator) : SynchronizerProvider { +class SynchronizerProviderImpl( + walletCoordinator: WalletCoordinator +) : SynchronizerProvider { private val scope = CoroutineScope(Dispatchers.IO + SupervisorJob()) @OptIn(ExperimentalCoroutinesApi::class) @@ -48,8 +50,7 @@ class SynchronizerProviderImpl(walletCoordinator: WalletCoordinator) : Synchroni emit(synchronizer) } } - } - .flowOn(Dispatchers.IO) + }.flowOn(Dispatchers.IO) .stateIn( scope = scope, started = SharingStarted.WhileSubscribed(Duration.ZERO, Duration.ZERO), diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/repository/AddressBookRepository.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/repository/AddressBookRepository.kt index 7412d66b0..100078b8d 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/repository/AddressBookRepository.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/repository/AddressBookRepository.kt @@ -104,18 +104,15 @@ class AddressBookRepositoryImpl( addressBookCache.update { null } } - override suspend fun getContactByAddress(address: String): AddressBookContact? { - return observeContactByAddress(address).first() - } + override suspend fun getContactByAddress(address: String): AddressBookContact? = + observeContactByAddress(address).first() - override fun observeContactByAddress(address: String): Flow { - return addressBook + override fun observeContactByAddress(address: String): Flow = + addressBook .filterNotNull() .map { it.contacts.find { contact -> contact.address == address } - } - .distinctUntilChanged() - } + }.distinctUntilChanged() private suspend fun ensureSynchronization() { if (addressBookCache.value == null) { diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/repository/BiometricRepository.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/repository/BiometricRepository.kt index c724b1573..5c65bba7f 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/repository/BiometricRepository.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/repository/BiometricRepository.kt @@ -32,11 +32,17 @@ data class BiometricRequest( sealed interface BiometricResult { val requestCode: String - data class Success(override val requestCode: String) : BiometricResult + data class Success( + override val requestCode: String + ) : BiometricResult - data class Failure(override val requestCode: String) : BiometricResult + data class Failure( + override val requestCode: String + ) : BiometricResult - data class Cancelled(override val requestCode: String) : BiometricResult + data class Cancelled( + override val requestCode: String + ) : BiometricResult } class BiometricsFailureException : Exception() diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/repository/ConfigurationRepository.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/repository/ConfigurationRepository.kt index 550e5143d..652ac78cf 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/repository/ConfigurationRepository.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/repository/ConfigurationRepository.kt @@ -40,7 +40,8 @@ class ConfigurationRepositoryImpl( private val scope = CoroutineScope(Dispatchers.IO + SupervisorJob()) override val configurationFlow: StateFlow = - androidConfigurationProvider.getConfigurationFlow() + androidConfigurationProvider + .getConfigurationFlow() .stateIn( scope = scope, started = SharingStarted.WhileSubscribed(ANDROID_STATE_FLOW_TIMEOUT), @@ -55,8 +56,7 @@ class ConfigurationRepositoryImpl( !versionInfo.isTestnet && ConfigurationEntries.IS_FLEXA_AVAILABLE.getValue(it) && BuildConfig.ZCASH_FLEXA_KEY.isNotEmpty() - } - .stateIn( + }.stateIn( scope = scope, started = SharingStarted.WhileSubscribed(ANDROID_STATE_FLOW_TIMEOUT), initialValue = null diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/repository/ExchangeRateRepository.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/repository/ExchangeRateRepository.kt index 36cf5a997..bd0abbcf7 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/repository/ExchangeRateRepository.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/repository/ExchangeRateRepository.kt @@ -59,28 +59,28 @@ class ExchangeRateRepositoryImpl( @OptIn(ExperimentalCoroutinesApi::class) private val exchangeRateUsdInternal = - isExchangeRateUsdOptedIn.flatMapLatest { optedIn -> - if (optedIn == true) { - walletRepository.synchronizer - .filterNotNull() - .flatMapLatest { synchronizer -> - synchronizer.exchangeRateUsd - } - } else { - flowOf(ObserveFiatCurrencyResult(isLoading = false, currencyConversion = null)) - } - }.stateIn( - scope = scope, - started = SharingStarted.WhileSubscribed(USD_EXCHANGE_REFRESH_LOCK_THRESHOLD), - initialValue = ObserveFiatCurrencyResult(isLoading = false, currencyConversion = null) - ) + isExchangeRateUsdOptedIn + .flatMapLatest { optedIn -> + if (optedIn == true) { + walletRepository.synchronizer + .filterNotNull() + .flatMapLatest { synchronizer -> + synchronizer.exchangeRateUsd + } + } else { + flowOf(ObserveFiatCurrencyResult(isLoading = false, currencyConversion = null)) + } + }.stateIn( + scope = scope, + started = SharingStarted.WhileSubscribed(USD_EXCHANGE_REFRESH_LOCK_THRESHOLD), + initialValue = ObserveFiatCurrencyResult(isLoading = false, currencyConversion = null) + ) private val usdExchangeRateTimestamp = exchangeRateUsdInternal .map { it.currencyConversion?.timestamp - } - .distinctUntilChanged() + }.distinctUntilChanged() private val refreshExchangeRateUsdLock = RefreshLock( @@ -149,8 +149,7 @@ class ExchangeRateRepositoryImpl( .onEach { Twig.info { "[USD] $it" } send(it) - } - .launchIn(this) + }.launchIn(this) awaitClose { // do nothing diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/repository/FlexaRepository.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/repository/FlexaRepository.kt index 9417516d8..4b4b07dcc 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/repository/FlexaRepository.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/repository/FlexaRepository.kt @@ -118,7 +118,8 @@ class FlexaRepositoryImpl( ) private fun String.toSha256() = - MessageDigest.getInstance("SHA-256") + MessageDigest + .getInstance("SHA-256") .digest(toByteArray()) .fold("") { str, value -> str + "%02x".format(value) } } diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/repository/KeystoneProposalRepository.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/repository/KeystoneProposalRepository.kt index 6fc1d8b6e..d8ca8c079 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/repository/KeystoneProposalRepository.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/repository/KeystoneProposalRepository.kt @@ -62,7 +62,9 @@ class ParsePCZTException : Exception() sealed interface SubmitProposalState { data object Submitting : SubmitProposalState - data class Result(val submitResult: SubmitResult) : SubmitProposalState + data class Result( + val submitResult: SubmitResult + ) : SubmitProposalState } @Suppress("TooManyFunctions") diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/repository/MetadataRepository.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/repository/MetadataRepository.kt index 9ad8fdd9a..f921454cd 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/repository/MetadataRepository.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/repository/MetadataRepository.kt @@ -47,7 +47,8 @@ class MetadataRepositoryImpl( private val metadataDataSource: MetadataDataSource, private val metadataKeyStorageProvider: MetadataKeyStorageProvider, private val persistableWalletProvider: PersistableWalletProvider, -) : MetadataRepository, CloseableScopeHolder by CloseableScopeHolderImpl(Dispatchers.IO) { +) : MetadataRepository, + CloseableScopeHolder by CloseableScopeHolderImpl(Dispatchers.IO) { private val command = Channel() @OptIn(ExperimentalCoroutinesApi::class) @@ -67,8 +68,7 @@ class MetadataRepositoryImpl( .receiveAsFlow() .filter { it.account.sdkAccount.accountUuid == account.sdkAccount.accountUuid - } - .collect { command -> + }.collect { command -> val new = when (command) { is Command.CreateOrUpdateTxNote -> @@ -106,8 +106,7 @@ class MetadataRepositoryImpl( // do nothing } } - } - .stateIn( + }.stateIn( scope = scope, started = SharingStarted.Lazily, initialValue = null @@ -171,8 +170,7 @@ class MetadataRepositoryImpl( isRead = accountMetadata?.read?.any { it == txId } == true, note = accountMetadata?.annotations?.find { it.txId == txId }?.content, ) - } - .distinctUntilChanged() + }.distinctUntilChanged() .onStart { emit(null) } private suspend fun getMetadataKey(selectedAccount: WalletAccount): MetadataKey { diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/repository/TransactionRepository.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/repository/TransactionRepository.kt index 8a0fb1e36..c8788cc81 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/repository/TransactionRepository.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/repository/TransactionRepository.kt @@ -64,170 +64,180 @@ class TransactionRepositoryImpl( accountDataSource.selectedAccount.map { it?.sdkAccount } ) { synchronizer, account -> synchronizer to account - }.distinctUntilChanged().flatMapLatest { (synchronizer, account) -> - if (synchronizer == null || account == null) { - flowOf(null) - } else { - channelFlow?> { - send(null) + }.distinctUntilChanged() + .flatMapLatest { (synchronizer, account) -> + if (synchronizer == null || account == null) { + flowOf(null) + } else { + channelFlow?> { + send(null) - launch { - synchronizer - .getTransactions(account.accountUuid) - .mapLatest { transactions -> - transactions.map { transaction -> - when (transaction.transactionState) { - Expired -> - when { - transaction.isShielding -> - ShieldTransaction.Failed( - timestamp = createTimestamp(transaction) ?: Instant.now(), - transactionOutputs = - synchronizer.getTransactionOutputs - (transaction), - amount = transaction.totalSpent, - id = transaction.txId, - memoCount = transaction.memoCount, - fee = transaction.netValue, - overview = transaction - ) + launch { + synchronizer + .getTransactions(account.accountUuid) + .mapLatest { transactions -> + transactions + .map { transaction -> + when (transaction.transactionState) { + Expired -> + when { + transaction.isShielding -> + ShieldTransaction.Failed( + timestamp = + createTimestamp(transaction) ?: Instant.now(), + transactionOutputs = + synchronizer.getTransactionOutputs + (transaction), + amount = transaction.totalSpent, + id = transaction.txId, + memoCount = transaction.memoCount, + fee = transaction.netValue, + overview = transaction + ) - transaction.isSentTransaction -> - SendTransaction.Failed( - timestamp = createTimestamp(transaction) ?: Instant.now(), - transactionOutputs = - synchronizer.getTransactionOutputs - (transaction), - amount = transaction.netValue, - id = transaction.txId, - memoCount = transaction.memoCount, - fee = transaction.feePaid, - overview = transaction - ) + transaction.isSentTransaction -> + SendTransaction.Failed( + timestamp = + createTimestamp(transaction) ?: Instant.now(), + transactionOutputs = + synchronizer.getTransactionOutputs + (transaction), + amount = transaction.netValue, + id = transaction.txId, + memoCount = transaction.memoCount, + fee = transaction.feePaid, + overview = transaction + ) - else -> - ReceiveTransaction.Failed( - timestamp = createTimestamp(transaction) ?: Instant.now(), - transactionOutputs = - synchronizer.getTransactionOutputs(transaction), - amount = transaction.netValue, - id = transaction.txId, - memoCount = transaction.memoCount, - overview = transaction - ) + else -> + ReceiveTransaction.Failed( + timestamp = + createTimestamp(transaction) ?: Instant.now(), + transactionOutputs = + synchronizer.getTransactionOutputs(transaction), + amount = transaction.netValue, + id = transaction.txId, + memoCount = transaction.memoCount, + overview = transaction + ) + } + + Confirmed -> + when { + transaction.isShielding -> + ShieldTransaction.Success( + timestamp = + createTimestamp(transaction) ?: Instant.now(), + transactionOutputs = + synchronizer.getTransactionOutputs + (transaction), + amount = transaction.totalSpent, + id = transaction.txId, + memoCount = transaction.memoCount, + fee = transaction.netValue, + overview = transaction + ) + + transaction.isSentTransaction -> + SendTransaction.Success( + timestamp = + createTimestamp(transaction) ?: Instant.now(), + transactionOutputs = + synchronizer.getTransactionOutputs + (transaction), + amount = transaction.netValue, + id = transaction.txId, + memoCount = transaction.memoCount, + fee = transaction.feePaid, + overview = transaction + ) + + else -> + ReceiveTransaction.Success( + timestamp = + createTimestamp(transaction) ?: Instant.now(), + transactionOutputs = + synchronizer.getTransactionOutputs + (transaction), + amount = transaction.netValue, + id = transaction.txId, + memoCount = transaction.memoCount, + overview = transaction + ) + } + + Pending -> + when { + transaction.isShielding -> + ShieldTransaction.Pending( + timestamp = createTimestamp(transaction), + transactionOutputs = + synchronizer.getTransactionOutputs + (transaction), + amount = transaction.totalSpent, + id = transaction.txId, + memoCount = transaction.memoCount, + fee = transaction.netValue, + overview = transaction + ) + + transaction.isSentTransaction -> + SendTransaction.Pending( + timestamp = createTimestamp(transaction), + transactionOutputs = + synchronizer.getTransactionOutputs + (transaction), + amount = transaction.netValue, + id = transaction.txId, + memoCount = transaction.memoCount, + fee = transaction.feePaid, + overview = transaction + ) + + else -> + ReceiveTransaction.Pending( + timestamp = createTimestamp(transaction), + transactionOutputs = + synchronizer.getTransactionOutputs + (transaction), + amount = transaction.netValue, + id = transaction.txId, + memoCount = transaction.memoCount, + overview = transaction + ) + } + + else -> error("Unexpected transaction stat") } - - Confirmed -> - when { - transaction.isShielding -> - ShieldTransaction.Success( - timestamp = createTimestamp(transaction) ?: Instant.now(), - transactionOutputs = - synchronizer.getTransactionOutputs - (transaction), - amount = transaction.totalSpent, - id = transaction.txId, - memoCount = transaction.memoCount, - fee = transaction.netValue, - overview = transaction - ) - - transaction.isSentTransaction -> - SendTransaction.Success( - timestamp = createTimestamp(transaction) ?: Instant.now(), - transactionOutputs = - synchronizer.getTransactionOutputs - (transaction), - amount = transaction.netValue, - id = transaction.txId, - memoCount = transaction.memoCount, - fee = transaction.feePaid, - overview = transaction - ) - - else -> - ReceiveTransaction.Success( - timestamp = createTimestamp(transaction) ?: Instant.now(), - transactionOutputs = - synchronizer.getTransactionOutputs - (transaction), - amount = transaction.netValue, - id = transaction.txId, - memoCount = transaction.memoCount, - overview = transaction - ) - } - - Pending -> - when { - transaction.isShielding -> - ShieldTransaction.Pending( - timestamp = createTimestamp(transaction), - transactionOutputs = - synchronizer.getTransactionOutputs - (transaction), - amount = transaction.totalSpent, - id = transaction.txId, - memoCount = transaction.memoCount, - fee = transaction.netValue, - overview = transaction - ) - - transaction.isSentTransaction -> - SendTransaction.Pending( - timestamp = createTimestamp(transaction), - transactionOutputs = - synchronizer.getTransactionOutputs - (transaction), - amount = transaction.netValue, - id = transaction.txId, - memoCount = transaction.memoCount, - fee = transaction.feePaid, - overview = transaction - ) - - else -> - ReceiveTransaction.Pending( - timestamp = createTimestamp(transaction), - transactionOutputs = - synchronizer.getTransactionOutputs - (transaction), - amount = transaction.netValue, - id = transaction.txId, - memoCount = transaction.memoCount, - overview = transaction - ) - } - - else -> error("Unexpected transaction stat") - } - }.sortedByDescending { transaction -> - transaction.timestamp ?: Instant.now() + }.sortedByDescending { transaction -> + transaction.timestamp ?: Instant.now() + } + }.collect { + send(it) } - } - .collect { - send(it) - } - } + } - awaitClose { - // do nothing + awaitClose { + // do nothing + } } } - } - }.stateIn( - scope = scope, - started = SharingStarted.WhileSubscribed(5.seconds, Duration.ZERO), - initialValue = null - ) + }.stateIn( + scope = scope, + started = SharingStarted.WhileSubscribed(5.seconds, Duration.ZERO), + initialValue = null + ) - private fun createTimestamp(transaction: TransactionOverview): Instant? { - return transaction.blockTimeEpochSeconds?.let { Instant.ofEpochSecond(it) } - } + private fun createTimestamp(transaction: TransactionOverview): Instant? = + transaction.blockTimeEpochSeconds?.let { + Instant.ofEpochSecond(it) + } override suspend fun getMemos(transaction: Transaction): List = withContext(Dispatchers.IO) { - synchronizerProvider.getSynchronizer().getMemos(transaction.overview) + synchronizerProvider + .getSynchronizer() + .getMemos(transaction.overview) .mapNotNull { memo -> memo.takeIf { it.isNotEmpty() } } .toList() } @@ -257,8 +267,7 @@ class TransactionRepositoryImpl( .synchronizer .flatMapLatest { synchronizer -> synchronizer?.getTransactionsByMemoSubstring(memo)?.onEmpty { emit(listOf()) } ?: flowOf(null) - } - .distinctUntilChanged() + }.distinctUntilChanged() override suspend fun getTransactions(): List = currentTransactions.filterNotNull().first() } diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/repository/WalletRepository.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/repository/WalletRepository.kt index 2e7cd5885..45ab5cae6 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/repository/WalletRepository.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/repository/WalletRepository.kt @@ -192,12 +192,10 @@ class WalletRepositoryImpl( FastestServersState(servers = it.servers, isLoading = false) } } ?: emptyFlow() - } - .onEach { + }.onEach { previousFastestServerState = it send(it) - } - .launchIn(this) + }.launchIn(this) }.stateIn( scope = scope, started = SharingStarted.WhileSubscribed(ANDROID_STATE_FLOW_TIMEOUT), @@ -213,19 +211,17 @@ class WalletRepositoryImpl( override val currentWalletSnapshot: StateFlow = combine(synchronizer, currentAccount) { synchronizer, currentAccount -> synchronizer to currentAccount - } - .flatMapLatest { (synchronizer, currentAccount) -> - if (synchronizer == null || currentAccount == null) { - flowOf(null) - } else { - toWalletSnapshot(synchronizer, currentAccount) - } + }.flatMapLatest { (synchronizer, currentAccount) -> + if (synchronizer == null || currentAccount == null) { + flowOf(null) + } else { + toWalletSnapshot(synchronizer, currentAccount) } - .stateIn( - scope = scope, - started = SharingStarted.WhileSubscribed(ANDROID_STATE_FLOW_TIMEOUT), - initialValue = null - ) + }.stateIn( + scope = scope, + started = SharingStarted.WhileSubscribed(ANDROID_STATE_FLOW_TIMEOUT), + initialValue = null + ) /** * A flow of the wallet block synchronization state. @@ -234,7 +230,8 @@ class WalletRepositoryImpl( flow { emitAll( StandardPreferenceKeys.WALLET_RESTORING_STATE - .observe(standardPreferenceProvider()).map { persistedNumber -> + .observe(standardPreferenceProvider()) + .map { persistedNumber -> WalletRestoringState.fromNumber(persistedNumber) } ) @@ -316,14 +313,12 @@ class WalletRepositoryImpl( } } - override suspend fun getSelectedServer(): LightWalletEndpoint { - return persistableWallet + override suspend fun getSelectedServer(): LightWalletEndpoint = + persistableWallet .map { it?.endpoint - } - .filterNotNull() + }.filterNotNull() .first() - } override suspend fun getAllServers(): List { val defaultServers = getDefaultServers() diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/serialization/BaseSerializer.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/serialization/BaseSerializer.kt index a9d30a8c6..2ec1d3d77 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/serialization/BaseSerializer.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/serialization/BaseSerializer.kt @@ -4,22 +4,21 @@ import java.io.InputStream import java.nio.ByteBuffer abstract class BaseSerializer { - protected fun Int.createByteArray(): ByteArray { - return this.toLong().createByteArray() - } + protected fun Int.createByteArray(): ByteArray = this.toLong().createByteArray() - protected fun Long.createByteArray(): ByteArray { - return ByteBuffer.allocate(Long.SIZE_BYTES).order(ADDRESS_BOOK_BYTE_ORDER).putLong(this).array() - } + protected fun Long.createByteArray(): ByteArray = + ByteBuffer + .allocate(Long.SIZE_BYTES) + .order(ADDRESS_BOOK_BYTE_ORDER) + .putLong(this) + .array() protected fun String.createByteArray(): ByteArray { val byteArray = this.toByteArray() return byteArray.size.createByteArray() + byteArray } - protected fun InputStream.readInt(): Int { - return readLong().toInt() - } + protected fun InputStream.readInt(): Int = readLong().toInt() protected fun InputStream.readLong(): Long { val buffer = ByteArray(Long.SIZE_BYTES) diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/serialization/InstantSerializer.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/serialization/InstantSerializer.kt index 86752a012..5ff2bbeb9 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/serialization/InstantSerializer.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/serialization/InstantSerializer.kt @@ -19,7 +19,5 @@ object InstantSerializer : KSerializer { encoder.encodeLong(value.toEpochMilli()) } - override fun deserialize(decoder: Decoder): Instant { - return Instant.ofEpochMilli(decoder.decodeLong()) - } + override fun deserialize(decoder: Decoder): Instant = Instant.ofEpochMilli(decoder.decodeLong()) } diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/serialization/addressbook/AddressBookEncryptor.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/serialization/addressbook/AddressBookEncryptor.kt index f244539fe..620761e4e 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/serialization/addressbook/AddressBookEncryptor.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/serialization/addressbook/AddressBookEncryptor.kt @@ -27,7 +27,8 @@ interface AddressBookEncryptor { class AddressBookEncryptorImpl( private val addressBookSerializer: AddressBookSerializer, -) : AddressBookEncryptor, BaseSerializer() { +) : BaseSerializer(), + AddressBookEncryptor { private val version: Int = ADDRESS_BOOK_ENCRYPTION_V1 private val saltSize: Int = ADDRESS_BOOK_SALT_SIZE @@ -85,7 +86,6 @@ class AddressBookEncryptorImpl( addressBookSerializer.serializeAddressBook(outputStream, data) } - private fun deserialize(inputStream: ByteArrayInputStream): AddressBook { - return addressBookSerializer.deserializeAddressBook(inputStream) - } + private fun deserialize(inputStream: ByteArrayInputStream): AddressBook = + addressBookSerializer.deserializeAddressBook(inputStream) } diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/serialization/addressbook/AddressBookKey.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/serialization/addressbook/AddressBookKey.kt index fdbc4e12e..70c4e6c74 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/serialization/addressbook/AddressBookKey.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/serialization/addressbook/AddressBookKey.kt @@ -16,7 +16,9 @@ import com.google.crypto.tink.util.SecretBytes /** * The long-term key that can decrypt an account's encrypted address book. */ -class AddressBookKey(val key: SecretBytes) : Key { +class AddressBookKey( + val key: SecretBytes +) : Key { /** * Derives the filename that this key is able to decrypt. */ diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/serialization/addressbook/AddressBookSerializer.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/serialization/addressbook/AddressBookSerializer.kt index 7a8a1f256..9c62e6610 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/serialization/addressbook/AddressBookSerializer.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/serialization/addressbook/AddressBookSerializer.kt @@ -23,8 +23,8 @@ class AddressBookSerializer : BaseSerializer() { } } - fun deserializeAddressBook(inputStream: InputStream): AddressBook { - return AddressBook( + fun deserializeAddressBook(inputStream: InputStream): AddressBook = + AddressBook( version = inputStream.readInt(), lastUpdated = inputStream.readLong().let { Instant.fromEpochMilliseconds(it) }, contacts = @@ -38,5 +38,4 @@ class AddressBookSerializer : BaseSerializer() { } } ) - } } diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/serialization/metada/MetadaEncryptor.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/serialization/metada/MetadaEncryptor.kt index 0ecc64760..848aec882 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/serialization/metada/MetadaEncryptor.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/serialization/metada/MetadaEncryptor.kt @@ -29,7 +29,8 @@ interface MetadataEncryptor { class MetadataEncryptorImpl( private val metadataSerializer: MetadataSerializer, -) : MetadataEncryptor, BaseSerializer() { +) : BaseSerializer(), + MetadataEncryptor { private val version: Int = METADATA_ENCRYPTION_V1 private val saltSize: Int = METADATA_SALT_SIZE @@ -73,12 +74,12 @@ class MetadataEncryptorImpl( val ciphertext = inputStream.readBytes() - return key.deriveDecryptionKeys(salt) + return key + .deriveDecryptionKeys(salt) .asSequence() .mapNotNull { decrypt(it, ciphertext) - } - .firstOrNull() ?: throw DecryptionException() + }.firstOrNull() ?: throw DecryptionException() } private fun decrypt( @@ -101,9 +102,7 @@ class MetadataEncryptorImpl( metadataSerializer.serialize(outputStream, data) } - private fun deserialize(inputStream: ByteArrayInputStream): Metadata { - return metadataSerializer.deserialize(inputStream) - } + private fun deserialize(inputStream: ByteArrayInputStream): Metadata = metadataSerializer.deserialize(inputStream) } class DecryptionException : Exception() diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/serialization/metada/MetadataKey.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/serialization/metada/MetadataKey.kt index 43b0ed37e..9454cd792 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/serialization/metada/MetadataKey.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/serialization/metada/MetadataKey.kt @@ -37,21 +37,19 @@ class MetadataKey( return "zashi-metadata-" + fileIdentifier.toHexString() } - fun deriveEncryptionKey(salt: ByteArray): ChaCha20Poly1305Key { - return deriveKey( + fun deriveEncryptionKey(salt: ByteArray): ChaCha20Poly1305Key = + deriveKey( salt = salt, bytes = bytes.first() ) - } - fun deriveDecryptionKeys(salt: ByteArray): List { - return bytes.map { secretBytes -> + fun deriveDecryptionKeys(salt: ByteArray): List = + bytes.map { secretBytes -> deriveKey( salt = salt, bytes = secretBytes ) } - } private fun deriveKey( salt: ByteArray, @@ -78,13 +76,13 @@ class MetadataKey( selectedAccount: WalletAccount ): MetadataKey { val key = - DerivationTool.getInstance() + DerivationTool + .getInstance() .deriveAccountMetadataKey( seed = seedPhrase.toByteArray(), network = network, accountIndex = zashiAccount.hdAccountIndex, - ) - .derivePrivateUseMetadataKey( + ).derivePrivateUseMetadataKey( ufvk = when (selectedAccount) { is KeystoneAccount -> selectedAccount.sdkAccount.ufvk diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/serialization/metada/MetadataSerializer.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/serialization/metada/MetadataSerializer.kt index ce3d58623..7ef5d5a9c 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/serialization/metada/MetadataSerializer.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/serialization/metada/MetadataSerializer.kt @@ -18,7 +18,5 @@ class MetadataSerializer { } @OptIn(ExperimentalSerializationApi::class) - fun deserialize(inputStream: InputStream): Metadata { - return Json.decodeFromStream(inputStream) - } + fun deserialize(inputStream: InputStream): Metadata = Json.decodeFromStream(inputStream) } diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/CreateKeystoneProposalPCZTEncoderUseCase.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/CreateKeystoneProposalPCZTEncoderUseCase.kt index 41019f712..87b98187e 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/CreateKeystoneProposalPCZTEncoderUseCase.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/CreateKeystoneProposalPCZTEncoderUseCase.kt @@ -6,7 +6,5 @@ import com.sparrowwallet.hummingbird.UREncoder class CreateKeystoneProposalPCZTEncoderUseCase( private val keystoneProposalRepository: KeystoneProposalRepository, ) { - suspend operator fun invoke(): UREncoder { - return keystoneProposalRepository.createPCZTEncoder() - } + suspend operator fun invoke(): UREncoder = keystoneProposalRepository.createPCZTEncoder() } diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/ExportTaxUseCase.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/ExportTaxUseCase.kt index 927434a2f..7aed1e70c 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/ExportTaxUseCase.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/ExportTaxUseCase.kt @@ -34,7 +34,9 @@ class ExportTaxUseCase( suspend operator fun invoke() = withContext(Dispatchers.IO) { val previousYear = - Year.now().minusYears(1) + Year + .now() + .minusYears(1) .let { val formatter: DateTimeFormatter = DateTimeFormatter.ofPattern("yyyy") it.format(formatter) @@ -111,7 +113,8 @@ class ExportTaxUseCase( } private suspend fun getCsvEntries() = - transactionRepository.getTransactions() + transactionRepository + .getTransactions() .mapNotNull { transaction -> val previousYear = Year.now().minusYears(1) @@ -121,7 +124,8 @@ class ExportTaxUseCase( val dateString = date.let { val formatter = - DateTimeFormatter.ofPattern("MM/dd/yyyy HH:mm:ss") + DateTimeFormatter + .ofPattern("MM/dd/yyyy HH:mm:ss") .withZone(ZoneOffset.UTC) formatter.format(date) diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/GetCurrentFilteredTransactionsUseCase.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/GetCurrentFilteredTransactionsUseCase.kt index d1b705119..f6ff6f774 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/GetCurrentFilteredTransactionsUseCase.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/GetCurrentFilteredTransactionsUseCase.kt @@ -58,16 +58,17 @@ class GetCurrentFilteredTransactionsUseCase( val recipient = transactionRepository.getRecipients(transaction) if (recipient == null) { - metadataRepository.observeTransactionMetadataByTxId( - transaction.id.txIdString() - ).map { - FilterTransactionData( - transaction = transaction, - contact = null, - recipientAddress = null, - transactionMetadata = it - ) - } + metadataRepository + .observeTransactionMetadataByTxId( + transaction.id.txIdString() + ).map { + FilterTransactionData( + transaction = transaction, + contact = null, + recipientAddress = null, + transactionMetadata = it + ) + } } else { combine( addressBookRepository.observeContactByAddress(recipient), @@ -86,8 +87,7 @@ class GetCurrentFilteredTransactionsUseCase( } enhancedTransactions?.combineToFlow() ?: flowOf(null) - } - .shareIn( + }.shareIn( scope = scope, started = SharingStarted.WhileSubscribed(5.seconds, 5.seconds), replay = 1 @@ -125,8 +125,7 @@ class GetCurrentFilteredTransactionsUseCase( } ) } - } - .distinctUntilChanged() + }.distinctUntilChanged() @OptIn(ExperimentalCoroutinesApi::class) val result = @@ -140,15 +139,13 @@ class GetCurrentFilteredTransactionsUseCase( transactions ?.filter { transaction -> filterBySentReceived(filters, transaction) - } - ?.filter { transaction -> + }?.filter { transaction -> filterByGeneralFilters( filters = filters, transaction = transaction, restoreTimestamp = restoreTimestampDataSource.getOrCreate() ) - } - ?.map { transaction -> + }?.map { transaction -> ListTransactionData( transaction = transaction.transaction, metadata = transaction.transactionMetadata @@ -157,8 +154,7 @@ class GetCurrentFilteredTransactionsUseCase( } ) } - } - .distinctUntilChanged() + }.distinctUntilChanged() fun observe() = result @@ -199,8 +195,8 @@ class GetCurrentFilteredTransactionsUseCase( private fun filterBySentReceived( filters: List, transaction: FilterTransactionData - ): Boolean { - return if (filters.contains(TransactionFilter.SENT) || filters.contains(TransactionFilter.RECEIVED)) { + ): Boolean = + if (filters.contains(TransactionFilter.SENT) || filters.contains(TransactionFilter.RECEIVED)) { when { filters.contains(TransactionFilter.SENT) && transaction.transaction is SendTransaction -> true @@ -214,14 +210,15 @@ class GetCurrentFilteredTransactionsUseCase( } else { true } - } private fun isUnread( transaction: FilterTransactionData, restoreTimestamp: Instant, ): Boolean { val transactionDate = - transaction.transaction.timestamp?.atZone(ZoneId.systemDefault())?.toLocalDate() + transaction.transaction.timestamp + ?.atZone(ZoneId.systemDefault()) + ?.toLocalDate() ?: LocalDate.now() val hasMemo = transaction.transaction.memoCount > 0 @@ -236,25 +233,22 @@ class GetCurrentFilteredTransactionsUseCase( } } - private fun isBookmark(transaction: FilterTransactionData): Boolean { - return transaction.transactionMetadata?.isBookmarked ?: false - } + private fun isBookmark(transaction: FilterTransactionData): Boolean = + transaction.transactionMetadata?.isBookmarked ?: false - private fun hasNotes(transaction: FilterTransactionData): Boolean { - return transaction.transactionMetadata?.note != null - } + private fun hasNotes(transaction: FilterTransactionData): Boolean = transaction.transactionMetadata?.note != null private fun hasNotesWithFulltext( transaction: FilterTransactionData, fulltextFilter: String - ): Boolean { - return transaction.transactionMetadata?.note + ): Boolean = + transaction.transactionMetadata + ?.note ?.contains( fulltextFilter, ignoreCase = true ) ?: false - } private fun hasAmountWithFulltext( transaction: FilterTransactionData, @@ -267,16 +261,12 @@ class GetCurrentFilteredTransactionsUseCase( private fun hasAddressWithFulltext( transaction: FilterTransactionData, fulltextFilter: String - ): Boolean { - return transaction.recipientAddress?.contains(fulltextFilter, ignoreCase = true) ?: false - } + ): Boolean = transaction.recipientAddress?.contains(fulltextFilter, ignoreCase = true) ?: false private fun hasContactInAddressBookWithFulltext( transaction: FilterTransactionData, fulltextFilter: String - ): Boolean { - return transaction.contact?.name?.contains(fulltextFilter, ignoreCase = true) ?: false - } + ): Boolean = transaction.contact?.name?.contains(fulltextFilter, ignoreCase = true) ?: false private fun hasMemoInFilteredIds( memoTxIds: List?, diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/GetCurrentTransactionsUseCase.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/GetCurrentTransactionsUseCase.kt index f2786a3d5..99c67744b 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/GetCurrentTransactionsUseCase.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/GetCurrentTransactionsUseCase.kt @@ -25,15 +25,15 @@ class GetCurrentTransactionsUseCase( } else { transactions .map { - metadataRepository.observeTransactionMetadataByTxId(it.id.txIdString()) + metadataRepository + .observeTransactionMetadataByTxId(it.id.txIdString()) .mapLatest { metadata -> ListTransactionData( transaction = it, metadata = metadata ) } - } - .combineToFlow() + }.combineToFlow() } } } diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/GetProposalUseCase.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/GetProposalUseCase.kt index 5241b2e4c..661d68c5e 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/GetProposalUseCase.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/GetProposalUseCase.kt @@ -12,10 +12,9 @@ class GetProposalUseCase( private val zashiProposalRepository: ZashiProposalRepository, private val accountDataSource: AccountDataSource, ) { - suspend operator fun invoke(): TransactionProposal { - return when (accountDataSource.getSelectedAccount()) { + suspend operator fun invoke(): TransactionProposal = + when (accountDataSource.getSelectedAccount()) { is KeystoneAccount -> keystoneProposalRepository.getTransactionProposal() is ZashiAccount -> zashiProposalRepository.getTransactionProposal() } - } } diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/GetSelectedWalletAccountUseCase.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/GetSelectedWalletAccountUseCase.kt index ecc303a61..6bb1eb0df 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/GetSelectedWalletAccountUseCase.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/GetSelectedWalletAccountUseCase.kt @@ -2,6 +2,8 @@ package co.electriccoin.zcash.ui.common.usecase import co.electriccoin.zcash.ui.common.datasource.AccountDataSource -class GetSelectedWalletAccountUseCase(private val accountDataSource: AccountDataSource) { +class GetSelectedWalletAccountUseCase( + private val accountDataSource: AccountDataSource +) { suspend operator fun invoke() = accountDataSource.getSelectedAccount() } diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/GetTransactionDetailByIdUseCase.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/GetTransactionDetailByIdUseCase.kt index 19e8fb549..7e520537b 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/GetTransactionDetailByIdUseCase.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/GetTransactionDetailByIdUseCase.kt @@ -31,7 +31,9 @@ class GetTransactionDetailByIdUseCase( @OptIn(ExperimentalCoroutinesApi::class) fun observe(txId: String) = transactionRepository - .observeTransaction(txId).filterNotNull().flatMapLatest { transaction -> + .observeTransaction(txId) + .filterNotNull() + .flatMapLatest { transaction -> channelFlow { launch { combine( @@ -66,7 +68,8 @@ class GetTransactionDetailByIdUseCase( // do nothing } } - }.distinctUntilChanged().flowOn(Dispatchers.Default) + }.distinctUntilChanged() + .flowOn(Dispatchers.Default) private suspend fun getWalletAddress(address: String?): WalletAddress? { if (address == null) return null diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/GetZashiAccountUseCase.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/GetZashiAccountUseCase.kt index 1ee0328ec..837ef6cbd 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/GetZashiAccountUseCase.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/GetZashiAccountUseCase.kt @@ -4,6 +4,8 @@ import co.electriccoin.zcash.ui.common.datasource.AccountDataSource import kotlinx.coroutines.flow.filterNotNull import kotlinx.coroutines.flow.first -class GetZashiAccountUseCase(private val accountDataSource: AccountDataSource) { +class GetZashiAccountUseCase( + private val accountDataSource: AccountDataSource +) { suspend operator fun invoke() = accountDataSource.zashiAccount.filterNotNull().first() } diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/ObserveFastestServersUseCase.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/ObserveFastestServersUseCase.kt index a82ef038c..041d0ba18 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/ObserveFastestServersUseCase.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/ObserveFastestServersUseCase.kt @@ -2,6 +2,8 @@ package co.electriccoin.zcash.ui.common.usecase import co.electriccoin.zcash.ui.common.repository.WalletRepository -class ObserveFastestServersUseCase(private val walletRepository: WalletRepository) { +class ObserveFastestServersUseCase( + private val walletRepository: WalletRepository +) { operator fun invoke() = walletRepository.fastestServers } diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/ObserveOnAccountChangedUseCase.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/ObserveOnAccountChangedUseCase.kt index 7fa43b8a0..9854e009d 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/ObserveOnAccountChangedUseCase.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/ObserveOnAccountChangedUseCase.kt @@ -2,6 +2,8 @@ package co.electriccoin.zcash.ui.common.usecase import co.electriccoin.zcash.ui.common.datasource.AccountDataSource -class ObserveOnAccountChangedUseCase(private val accountDataSource: AccountDataSource) { +class ObserveOnAccountChangedUseCase( + private val accountDataSource: AccountDataSource +) { operator fun invoke() = accountDataSource.onAccountChanged } diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/ObserveProposalUseCase.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/ObserveProposalUseCase.kt index 6ff2ae429..dd936d880 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/ObserveProposalUseCase.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/ObserveProposalUseCase.kt @@ -25,8 +25,7 @@ class ObserveProposalUseCase( is KeystoneAccount -> keystoneProposalRepository.transactionProposal is ZashiAccount -> zashiProposalRepository.transactionProposal } - } - .filterNotNull() + }.filterNotNull() fun filterSendTransactions() = this() diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/ObserveSelectedEndpointUseCase.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/ObserveSelectedEndpointUseCase.kt index 91f0d767c..a677f814d 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/ObserveSelectedEndpointUseCase.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/ObserveSelectedEndpointUseCase.kt @@ -11,6 +11,5 @@ class ObserveSelectedEndpointUseCase( walletRepository.persistableWallet .map { it?.endpoint - } - .distinctUntilChanged() + }.distinctUntilChanged() } diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/ObserveSelectedWalletAccountUseCase.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/ObserveSelectedWalletAccountUseCase.kt index 20e1507a4..8a89cb0a3 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/ObserveSelectedWalletAccountUseCase.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/ObserveSelectedWalletAccountUseCase.kt @@ -3,7 +3,9 @@ package co.electriccoin.zcash.ui.common.usecase import co.electriccoin.zcash.ui.common.datasource.AccountDataSource import kotlinx.coroutines.flow.filterNotNull -class ObserveSelectedWalletAccountUseCase(private val accountDataSource: AccountDataSource) { +class ObserveSelectedWalletAccountUseCase( + private val accountDataSource: AccountDataSource +) { operator fun invoke() = accountDataSource.selectedAccount fun require() = accountDataSource.selectedAccount.filterNotNull() diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/ObserveWalletAccountsUseCase.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/ObserveWalletAccountsUseCase.kt index da584c13f..5549c28ef 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/ObserveWalletAccountsUseCase.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/ObserveWalletAccountsUseCase.kt @@ -3,7 +3,9 @@ package co.electriccoin.zcash.ui.common.usecase import co.electriccoin.zcash.ui.common.datasource.AccountDataSource import kotlinx.coroutines.flow.filterNotNull -class ObserveWalletAccountsUseCase(private val accountDataSource: AccountDataSource) { +class ObserveWalletAccountsUseCase( + private val accountDataSource: AccountDataSource +) { operator fun invoke() = accountDataSource.allAccounts fun require() = accountDataSource.allAccounts.filterNotNull() diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/ObserveZashiAccountUseCase.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/ObserveZashiAccountUseCase.kt index d01874f54..baa7d3ba9 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/ObserveZashiAccountUseCase.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/ObserveZashiAccountUseCase.kt @@ -2,6 +2,8 @@ package co.electriccoin.zcash.ui.common.usecase import co.electriccoin.zcash.ui.common.datasource.AccountDataSource -class ObserveZashiAccountUseCase(private val accountDataSource: AccountDataSource) { +class ObserveZashiAccountUseCase( + private val accountDataSource: AccountDataSource +) { operator fun invoke() = accountDataSource.zashiAccount } diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/ParseKeystonePCZTUseCase.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/ParseKeystonePCZTUseCase.kt index 401434e9f..bb91c47b3 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/ParseKeystonePCZTUseCase.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/ParseKeystonePCZTUseCase.kt @@ -72,13 +72,12 @@ abstract class BaseKeystoneScanner { abstract suspend fun onSuccess(ur: UR) - private fun decodeResult(result: String): DecodeResult { - return try { + private fun decodeResult(result: String): DecodeResult = + try { keystoneSDK.decodeQR(result) } catch (_: Exception) { throw InvalidKeystonePCZTQRException() } - } private suspend fun withSemaphore(block: suspend () -> T) = mutex.withLock { diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/ParseKeystoneSignInRequestUseCase.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/ParseKeystoneSignInRequestUseCase.kt index 955b96723..8598ff506 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/ParseKeystoneSignInRequestUseCase.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/ParseKeystoneSignInRequestUseCase.kt @@ -26,4 +26,6 @@ class ParseKeystoneSignInRequestUseCase( } } -class InvalidKeystoneSignInQRException(cause: Throwable) : Exception(cause) +class InvalidKeystoneSignInQRException( + cause: Throwable +) : Exception(cause) diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/ParseKeystoneUrToZashiAccountsUseCase.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/ParseKeystoneUrToZashiAccountsUseCase.kt index ef815750c..7a5db581d 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/ParseKeystoneUrToZashiAccountsUseCase.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/ParseKeystoneUrToZashiAccountsUseCase.kt @@ -15,9 +15,8 @@ class ParseKeystoneUrToZashiAccountsUseCase { } @Suppress("TooGenericExceptionCaught") - private fun getAccountsFromKeystone(ur: UR): ZcashAccounts { - return sdk.parseZcashAccounts(ur).also { + private fun getAccountsFromKeystone(ur: UR): ZcashAccounts = + sdk.parseZcashAccounts(ur).also { Twig.debug { "=========> progress: $it" } } - } } diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/PersistEndpointUseCase.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/PersistEndpointUseCase.kt index 5b22302ca..71d1385d7 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/PersistEndpointUseCase.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/PersistEndpointUseCase.kt @@ -30,7 +30,8 @@ class PersistEndpointUseCase( } private suspend fun validateServerEndpoint(endpoint: LightWalletEndpoint) = - synchronizerProvider.getSynchronizer() + synchronizerProvider + .getSynchronizer() .validateServerEndpoint(application, endpoint) private fun persistWallet(persistableWallet: PersistableWallet) { @@ -38,4 +39,6 @@ class PersistEndpointUseCase( } } -class PersistEndpointException(message: String?) : Exception(message) +class PersistEndpointException( + message: String? +) : Exception(message) diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/SendEmailUseCase.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/SendEmailUseCase.kt index 8c28b03c1..95d5a053c 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/SendEmailUseCase.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/SendEmailUseCase.kt @@ -20,13 +20,14 @@ class SendEmailUseCase( message: StringResource ) { val intent = - EmailUtil.newMailActivityIntent( - recipientAddress = address.getString(context), - messageSubject = subject.getString(context), - messageBody = message.getString(context) - ).apply { - flags = Intent.FLAG_ACTIVITY_NEW_TASK - } + EmailUtil + .newMailActivityIntent( + recipientAddress = address.getString(context), + messageSubject = subject.getString(context), + messageBody = message.getString(context) + ).apply { + flags = Intent.FLAG_ACTIVITY_NEW_TASK + } context.startActivity(intent) } @@ -53,21 +54,22 @@ class SendEmailUseCase( } val mailIntent = - EmailUtil.newMailActivityIntent( - context.getString(R.string.support_email_address), - context.getString(R.string.app_name), - fullMessage - ).apply { - flags = Intent.FLAG_ACTIVITY_NEW_TASK - } + EmailUtil + .newMailActivityIntent( + context.getString(R.string.support_email_address), + context.getString(R.string.app_name), + fullMessage + ).apply { + flags = Intent.FLAG_ACTIVITY_NEW_TASK + } runCatching { context.startActivity(mailIntent) } } - private fun List.toSupportString(context: Context): String { - return buildString { + private fun List.toSupportString(context: Context): String = + buildString { appendLine(context.getString(R.string.send_confirmation_multiple_report_statuses)) this@toSupportString.forEachIndexed { index, result -> @@ -104,5 +106,4 @@ class SendEmailUseCase( } } } - } } diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/SendSupportEmailUseCase.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/SendSupportEmailUseCase.kt index 59372ad09..b35a7c31f 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/SendSupportEmailUseCase.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/SendSupportEmailUseCase.kt @@ -18,27 +18,28 @@ class SendSupportEmailUseCase( message: StringResource ) { val intent = - EmailUtil.newMailActivityIntent( - recipientAddress = context.getString(R.string.support_email_address), - messageSubject = context.getString(R.string.app_name), - messageBody = - buildString { - appendLine( - context.getString( - R.string.support_email_part_1, - emoji.encoding, - emoji.order.toString() + EmailUtil + .newMailActivityIntent( + recipientAddress = context.getString(R.string.support_email_address), + messageSubject = context.getString(R.string.app_name), + messageBody = + buildString { + appendLine( + context.getString( + R.string.support_email_part_1, + emoji.encoding, + emoji.order.toString() + ) ) - ) - appendLine() - appendLine(context.getString(R.string.support_email_part_2, message.getString(context))) - appendLine() - appendLine() - appendLine(getSupport().toSupportString(SupportInfoType.entries.toSet())) - } - ).apply { - flags = Intent.FLAG_ACTIVITY_NEW_TASK - } + appendLine() + appendLine(context.getString(R.string.support_email_part_2, message.getString(context))) + appendLine() + appendLine() + appendLine(getSupport().toSupportString(SupportInfoType.entries.toSet())) + } + ).apply { + flags = Intent.FLAG_ACTIVITY_NEW_TASK + } context.startActivity(intent) } diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/ShareImageUseCase.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/ShareImageUseCase.kt index 87255feb9..a7d06601e 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/ShareImageUseCase.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/ShareImageUseCase.kt @@ -51,13 +51,14 @@ class ShareImageUseCase( // Save the bitmap to a temporary file in the cache directory val bitmapFile = withContext(Dispatchers.IO) { - File.createTempFile( - filePrefix, - fileSuffix, - cacheDir, - ).also { - it.storeBitmap(shareImageBitmap) - } + File + .createTempFile( + filePrefix, + fileSuffix, + cacheDir, + ).also { + it.storeBitmap(shareImageBitmap) + } } // Example of the expected temporary file path: diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/ValidateContactAddressUseCase.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/ValidateContactAddressUseCase.kt index ad0ed5584..565992e80 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/ValidateContactAddressUseCase.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/ValidateContactAddressUseCase.kt @@ -17,11 +17,13 @@ class ValidateContactAddressUseCase( val result = walletRepository.getSynchronizer().validateAddress(address) return when { result.isNotValid -> Result.Invalid - addressBookRepository.addressBook.filterNotNull().first().contacts + addressBookRepository.addressBook + .filterNotNull() + .first() + .contacts .filter { if (exclude == null) true else it != exclude - } - .any { it.address == address.trim() } -> Result.NotUnique + }.any { it.address == address.trim() } -> Result.NotUnique else -> Result.Valid } diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/ValidateContactNameUseCase.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/ValidateContactNameUseCase.kt index f2c8e611c..885d971bf 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/ValidateContactNameUseCase.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/ValidateContactNameUseCase.kt @@ -13,11 +13,13 @@ class ValidateContactNameUseCase( exclude: AddressBookContact? = null ) = when { name.length > CONTACT_NAME_MAX_LENGTH -> Result.TooLong - addressBookRepository.addressBook.filterNotNull().first().contacts + addressBookRepository.addressBook + .filterNotNull() + .first() + .contacts .filter { if (exclude == null) true else it != exclude - } - .any { it.name == name.trim() } -> Result.NotUnique + }.any { it.name == name.trim() } -> Result.NotUnique else -> Result.Valid } diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/Zip321ParseUriValidationUseCase.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/Zip321ParseUriValidationUseCase.kt index 3e99d349a..c0686b4cd 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/Zip321ParseUriValidationUseCase.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/usecase/Zip321ParseUriValidationUseCase.kt @@ -49,9 +49,13 @@ internal class Zip321ParseUriValidationUseCase( } internal sealed class Zip321ParseUriValidation { - data class Valid(val zip321Uri: String) : Zip321ParseUriValidation() + data class Valid( + val zip321Uri: String + ) : Zip321ParseUriValidation() - data class SingleAddress(val address: String) : Zip321ParseUriValidation() + data class SingleAddress( + val address: String + ) : Zip321ParseUriValidation() data object Invalid : Zip321ParseUriValidation() } diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/viewmodel/AuthenticationViewModel.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/viewmodel/AuthenticationViewModel.kt index dd7e3cd6b..a0ed5b142 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/viewmodel/AuthenticationViewModel.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/viewmodel/AuthenticationViewModel.kt @@ -298,13 +298,13 @@ class AuthenticationViewModel( ) promptInfo = - BiometricPrompt.PromptInfo.Builder() + BiometricPrompt.PromptInfo + .Builder() .setTitle( getApplication().applicationContext.run { getString(R.string.authentication_system_ui_title, getString(R.string.app_name)) } - ) - .setSubtitle( + ).setSubtitle( getApplication().applicationContext.run { getString( R.string.authentication_system_ui_subtitle, @@ -328,8 +328,7 @@ class AuthenticationViewModel( ) ) } - ) - .setConfirmationRequired(false) + ).setConfirmationRequired(false) .setAllowedAuthenticators(allowedAuthenticators) .build() @@ -342,8 +341,8 @@ class AuthenticationViewModel( } } - private fun getBiometricAuthenticationSupport(allowedAuthenticators: Int): BiometricSupportResult { - return when (biometricManager.canAuthenticate(allowedAuthenticators)) { + private fun getBiometricAuthenticationSupport(allowedAuthenticators: Int): BiometricSupportResult = + when (biometricManager.canAuthenticate(allowedAuthenticators)) { BiometricManager.BIOMETRIC_SUCCESS -> { Twig.debug { "Auth canAuthenticate BIOMETRIC_SUCCESS: App can authenticate using biometrics." } BiometricSupportResult.Success @@ -406,7 +405,6 @@ class AuthenticationViewModel( BiometricSupportResult.StatusUnexpected } } - } private fun booleanStateFlow(default: BooleanPreferenceDefault): StateFlow = flow { @@ -433,7 +431,10 @@ sealed class AuthenticationResult { data object Success : AuthenticationResult() - data class Error(val errorCode: Int, val errorMessage: String) : AuthenticationResult() + data class Error( + val errorCode: Int, + val errorMessage: String + ) : AuthenticationResult() data object Canceled : AuthenticationResult() diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/viewmodel/WalletViewModel.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/viewmodel/WalletViewModel.kt index c9dc2f8dc..29d24baaa 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/viewmodel/WalletViewModel.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/viewmodel/WalletViewModel.kt @@ -193,9 +193,13 @@ sealed class SecretState { object NeedsWarning : SecretState() - class NeedsBackup(val persistableWallet: PersistableWallet) : SecretState() + class NeedsBackup( + val persistableWallet: PersistableWallet + ) : SecretState() - class Ready(val persistableWallet: PersistableWallet) : SecretState() + class Ready( + val persistableWallet: PersistableWallet + ) : SecretState() } /** @@ -223,7 +227,9 @@ sealed class SynchronizerError { null } - class Critical(val error: Throwable?) : SynchronizerError() { + class Critical( + val error: Throwable? + ) : SynchronizerError() { override fun getCauseMessage(): String? = error?.message override fun getStackTrace(limit: Int?): String? = @@ -234,7 +240,9 @@ sealed class SynchronizerError { } } - class Processor(val error: Throwable?) : SynchronizerError() { + class Processor( + val error: Throwable? + ) : SynchronizerError() { override fun getCauseMessage(): String? = error?.message override fun getStackTrace(limit: Int?): String? = @@ -245,7 +253,9 @@ sealed class SynchronizerError { } } - class Submission(val error: Throwable?) : SynchronizerError() { + class Submission( + val error: Throwable? + ) : SynchronizerError() { override fun getCauseMessage(): String? = error?.message override fun getStackTrace(limit: Int?): String? = @@ -256,7 +266,9 @@ sealed class SynchronizerError { } } - class Setup(val error: Throwable?) : SynchronizerError() { + class Setup( + val error: Throwable? + ) : SynchronizerError() { override fun getCauseMessage(): String? = error?.message override fun getStackTrace(limit: Int?): String? = @@ -267,7 +279,10 @@ sealed class SynchronizerError { } } - class Chain(val x: BlockHeight, val y: BlockHeight) : SynchronizerError() { + class Chain( + val x: BlockHeight, + val y: BlockHeight + ) : SynchronizerError() { override fun getCauseMessage(): String = "$x, $y" override fun getStackTrace(limit: Int?): String? = null diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/wallet/RefreshLock.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/wallet/RefreshLock.kt index f908f3db1..0bdddfffe 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/wallet/RefreshLock.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/wallet/RefreshLock.kt @@ -37,8 +37,7 @@ internal class RefreshLock( emitWithLock(true) } } - } - .distinctUntilChanged() + }.distinctUntilChanged() private suspend fun FlowCollector.emitWithLock(value: T) = mutex.withLock { diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/wallet/StaleLock.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/wallet/StaleLock.kt index 36d13770c..a15c0da5e 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/wallet/StaleLock.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/wallet/StaleLock.kt @@ -39,8 +39,7 @@ internal class StaleLock( emitWithLock(true) } } - } - .distinctUntilChanged() + }.distinctUntilChanged() private suspend fun FlowCollector.emitWithLock(value: T) = mutex.withLock { diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/fixture/ConfigInfoFixture.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/fixture/ConfigInfoFixture.kt index b47bfe702..a6f9e5a77 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/fixture/ConfigInfoFixture.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/fixture/ConfigInfoFixture.kt @@ -2,7 +2,6 @@ package co.electriccoin.zcash.ui.fixture import co.electriccoin.zcash.ui.screen.support.model.ConfigInfo import kotlinx.datetime.Instant -import kotlinx.datetime.toInstant object ConfigInfoFixture { val UPDATED_AT = Instant.parse("2023-01-15T08:38:45.415Z") diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/ExternalUrl.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/ExternalUrl.kt index 7d3d8ec37..1af0cb4b0 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/ExternalUrl.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/ExternalUrl.kt @@ -3,4 +3,6 @@ package co.electriccoin.zcash.ui.screen import kotlinx.serialization.Serializable @Serializable -data class ExternalUrl(val url: String) +data class ExternalUrl( + val url: String +) diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/about/util/WebBrowserUtil.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/about/util/WebBrowserUtil.kt index b1ed771c7..a11dadece 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/about/util/WebBrowserUtil.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/about/util/WebBrowserUtil.kt @@ -12,7 +12,8 @@ object WebBrowserUtil { url: String ) { val intent = - CustomTabsIntent.Builder() + CustomTabsIntent + .Builder() .setUrlBarHidingEnabled(true) .setShowTitle(true) .setShareState(CustomTabsIntent.SHARE_STATE_OFF) diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/about/view/AboutView.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/about/view/AboutView.kt index 413a29c1e..91d42abaa 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/about/view/AboutView.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/about/view/AboutView.kt @@ -76,8 +76,7 @@ fun About( .fillMaxHeight() .verticalScroll( rememberScrollState() - ) - .scaffoldScrollPadding(paddingValues) + ).scaffoldScrollPadding(paddingValues) ) } } diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/account/AndroidAccount.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/account/AndroidAccount.kt index b1187c7a2..b147dbff3 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/account/AndroidAccount.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/account/AndroidAccount.kt @@ -123,13 +123,14 @@ internal fun WrapAccount( supportInfo = supportInfo?.toSupportString(SupportInfoType.entries.toSet()) ) val mailIntent = - EmailUtil.newMailActivityIntent( - context.getString(R.string.support_email_address), - context.getString(R.string.app_name), - fullMessage - ).apply { - flags = Intent.FLAG_ACTIVITY_NEW_TASK - } + EmailUtil + .newMailActivityIntent( + context.getString(R.string.support_email_address), + context.getString(R.string.app_name), + fullMessage + ).apply { + flags = Intent.FLAG_ACTIVITY_NEW_TASK + } runCatching { context.startActivity(mailIntent) }.onFailure { diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/accountlist/model/AccountListState.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/accountlist/model/AccountListState.kt index f1d58d626..6b00fd43a 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/accountlist/model/AccountListState.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/accountlist/model/AccountListState.kt @@ -22,7 +22,11 @@ data class ZashiAccountListItemState( ) sealed interface AccountListItem { - data class Account(val state: ZashiAccountListItemState) : AccountListItem + data class Account( + val state: ZashiAccountListItemState + ) : AccountListItem - data class Other(val state: ZashiListItemState) : AccountListItem + data class Other( + val state: ZashiListItemState + ) : AccountListItem } diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/accountlist/viewmodel/AccountListViewModel.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/accountlist/viewmodel/AccountListViewModel.kt index 0833e78d4..1acc79c24 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/accountlist/viewmodel/AccountListViewModel.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/accountlist/viewmodel/AccountListViewModel.kt @@ -38,60 +38,64 @@ class AccountListViewModel( @Suppress("SpreadOperator") val state = - observeWalletAccounts().map { accounts -> - val items = - listOfNotNull( - *accounts.orEmpty() - .map { account -> - AccountListItem.Account( - ZashiAccountListItemState( - title = account.name, + observeWalletAccounts() + .map { accounts -> + val items = + listOfNotNull( + *accounts + .orEmpty() + .map { account -> + AccountListItem.Account( + ZashiAccountListItemState( + title = account.name, + subtitle = + stringRes( + "${account.unified.address.address.take(ADDRESS_MAX_LENGTH)}...", + ), + icon = + when (account) { + is KeystoneAccount -> R.drawable.ic_item_keystone + is ZashiAccount -> R.drawable.ic_item_zashi + }, + isSelected = account.isSelected, + onClick = { onAccountClicked(account) } + ) + ) + }.toTypedArray(), + AccountListItem + .Other( + ZashiListItemState( + title = + stringRes(co.electriccoin.zcash.ui.R.string.account_list_keystone_promo_title), subtitle = stringRes( - "${account.unified.address.address.take(ADDRESS_MAX_LENGTH)}...", + co.electriccoin.zcash.ui.R.string.account_list_keystone_promo_subtitle, ), - icon = - when (account) { - is KeystoneAccount -> R.drawable.ic_item_keystone - is ZashiAccount -> R.drawable.ic_item_zashi - }, - isSelected = account.isSelected, - onClick = { onAccountClicked(account) } + onClick = ::onShowKeystonePromoClicked ) - ) - }.toTypedArray(), - AccountListItem.Other( - ZashiListItemState( - title = stringRes(co.electriccoin.zcash.ui.R.string.account_list_keystone_promo_title), - subtitle = - stringRes( - co.electriccoin.zcash.ui.R.string.account_list_keystone_promo_subtitle, - ), - onClick = ::onShowKeystonePromoClicked - ) - ).takeIf { - accounts.orEmpty().none { it is KeystoneAccount } - } - ) + ).takeIf { + accounts.orEmpty().none { it is KeystoneAccount } + } + ) - AccountListState( - items = items, - isLoading = accounts == null, - onBottomSheetHidden = ::onBottomSheetHidden, - onBack = ::onBack, - addWalletButton = - ButtonState( - text = stringRes(co.electriccoin.zcash.ui.R.string.account_list_keystone_primary), - onClick = ::onAddWalletButtonClicked - ).takeIf { - accounts.orEmpty().none { it is KeystoneAccount } - } + AccountListState( + items = items, + isLoading = accounts == null, + onBottomSheetHidden = ::onBottomSheetHidden, + onBack = ::onBack, + addWalletButton = + ButtonState( + text = stringRes(co.electriccoin.zcash.ui.R.string.account_list_keystone_primary), + onClick = ::onAddWalletButtonClicked + ).takeIf { + accounts.orEmpty().none { it is KeystoneAccount } + } + ) + }.stateIn( + scope = viewModelScope, + started = SharingStarted.WhileSubscribed(ANDROID_STATE_FLOW_TIMEOUT), + initialValue = null ) - }.stateIn( - scope = viewModelScope, - started = SharingStarted.WhileSubscribed(ANDROID_STATE_FLOW_TIMEOUT), - initialValue = null - ) private fun onShowKeystonePromoClicked() = viewModelScope.launch { diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/addressbook/model/AddressBookState.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/addressbook/model/AddressBookState.kt index 958d2949c..5669244bd 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/addressbook/model/AddressBookState.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/addressbook/model/AddressBookState.kt @@ -15,7 +15,9 @@ data class AddressBookState( ) sealed interface AddressBookItem : Itemizable { - data class Title(val title: StringResource) : AddressBookItem { + data class Title( + val title: StringResource + ) : AddressBookItem { override val contentType = "Title" override val key = Empty.contentType } diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/addressbook/viewmodel/AddressBookViewModel.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/addressbook/viewmodel/AddressBookViewModel.kt index 475e59266..9d9b6cc75 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/addressbook/viewmodel/AddressBookViewModel.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/addressbook/viewmodel/AddressBookViewModel.kt @@ -41,17 +41,18 @@ class AddressBookViewModel( AddressBookState( isLoading = contacts == null, items = - contacts?.map { contact -> - AddressBookItem.Contact( - ZashiContactListItemState( - icon = getContactInitials(contact), - isShielded = false, - name = stringRes(contact.name), - address = stringRes("${contact.address.take(ADDRESS_MAX_LENGTH)}..."), - onClick = { onContactClick(contact) } + contacts + ?.map { contact -> + AddressBookItem.Contact( + ZashiContactListItemState( + icon = getContactInitials(contact), + isShielded = false, + name = stringRes(contact.name), + address = stringRes("${contact.address.take(ADDRESS_MAX_LENGTH)}..."), + onClick = { onContactClick(contact) } + ) ) - ) - }.orEmpty(), + }.orEmpty(), onBack = ::onBack, manualButton = ButtonState( @@ -72,8 +73,7 @@ class AddressBookViewModel( .split(" ") .mapNotNull { part -> part.takeIf { it.isNotEmpty() }?.first()?.toString() - } - .take(2) + }.take(2) .joinToString(separator = "") ) diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/addressbook/viewmodel/SelectRecipientViewModel.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/addressbook/viewmodel/SelectRecipientViewModel.kt index 479dadb8c..fc5970f4c 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/addressbook/viewmodel/SelectRecipientViewModel.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/addressbook/viewmodel/SelectRecipientViewModel.kt @@ -57,25 +57,26 @@ class SelectRecipientViewModel( val accountItems = listOf( AddressBookItem.Title(stringRes(R.string.address_book_multiple_wallets_title)), - *accounts.map { account -> - AddressBookItem.Contact( - ZashiContactListItemState( - icon = - imageRes( - when (account) { - is KeystoneAccount -> - co.electriccoin.zcash.ui.design.R.drawable.ic_item_keystone - is ZashiAccount -> - co.electriccoin.zcash.ui.design.R.drawable.ic_item_zashi - } - ), - isShielded = false, - name = account.name, - address = stringRes("${account.unified.address.address.take(ADDRESS_MAX_LENGTH)}..."), - onClick = { onWalletAccountClick(account) } + *accounts + .map { account -> + AddressBookItem.Contact( + ZashiContactListItemState( + icon = + imageRes( + when (account) { + is KeystoneAccount -> + co.electriccoin.zcash.ui.design.R.drawable.ic_item_keystone + is ZashiAccount -> + co.electriccoin.zcash.ui.design.R.drawable.ic_item_zashi + } + ), + isShielded = false, + name = account.name, + address = stringRes("${account.unified.address.address.take(ADDRESS_MAX_LENGTH)}..."), + onClick = { onWalletAccountClick(account) } + ) ) - ) - }.toTypedArray() + }.toTypedArray() ) val addressBookItems = @@ -84,17 +85,18 @@ class SelectRecipientViewModel( } else { listOf( AddressBookItem.Title(stringRes(R.string.address_book_multiple_wallets_contacts_title)), - *contacts.map { contact -> - AddressBookItem.Contact( - ZashiContactListItemState( - icon = getContactInitials(contact), - isShielded = false, - name = stringRes(contact.name), - address = stringRes("${contact.address.take(ADDRESS_MAX_LENGTH)}..."), - onClick = { onContactClick(contact) } + *contacts + .map { contact -> + AddressBookItem.Contact( + ZashiContactListItemState( + icon = getContactInitials(contact), + isShielded = false, + name = stringRes(contact.name), + address = stringRes("${contact.address.take(ADDRESS_MAX_LENGTH)}..."), + onClick = { onContactClick(contact) } + ) ) - ) - }.toTypedArray() + }.toTypedArray() ) } @@ -116,21 +118,22 @@ class SelectRecipientViewModel( ) } - private fun createStateWithoutAccounts(contacts: List?): AddressBookState { - return AddressBookState( + private fun createStateWithoutAccounts(contacts: List?): AddressBookState = + AddressBookState( isLoading = contacts == null, items = - contacts?.map { contact -> - AddressBookItem.Contact( - ZashiContactListItemState( - icon = getContactInitials(contact), - isShielded = false, - name = stringRes(contact.name), - address = stringRes("${contact.address.take(ADDRESS_MAX_LENGTH)}..."), - onClick = { onContactClick(contact) } + contacts + ?.map { contact -> + AddressBookItem.Contact( + ZashiContactListItemState( + icon = getContactInitials(contact), + isShielded = false, + name = stringRes(contact.name), + address = stringRes("${contact.address.take(ADDRESS_MAX_LENGTH)}..."), + onClick = { onContactClick(contact) } + ) ) - ) - }.orEmpty(), + }.orEmpty(), onBack = ::onBack, manualButton = ButtonState( @@ -144,7 +147,6 @@ class SelectRecipientViewModel( ), title = stringRes(R.string.address_book_select_recipient_title) ) - } private fun onWalletAccountClick(account: WalletAccount) = viewModelScope.launch { @@ -152,17 +154,15 @@ class SelectRecipientViewModel( navigationRouter.back() } - private fun getContactInitials(contact: AddressBookContact): ImageResource { - return imageRes( + private fun getContactInitials(contact: AddressBookContact): ImageResource = + imageRes( contact.name .split(" ") .mapNotNull { part -> part.takeIf { it.isNotEmpty() }?.first()?.toString() - } - .take(2) + }.take(2) .joinToString(separator = "") ) - } private fun onBack() = navigationRouter.back() diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/advancedsettings/AndroidAdvancedSettings.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/advancedsettings/AndroidAdvancedSettings.kt index 578b34973..bd17b5284 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/advancedsettings/AndroidAdvancedSettings.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/advancedsettings/AndroidAdvancedSettings.kt @@ -26,13 +26,14 @@ internal fun WrapAdvancedSettings( originalState.copy( deleteButton = originalState.deleteButton.copy(onClick = goDeleteWallet), items = - originalState.items.mapIndexed { index, item -> - when (index) { - 0 -> item.copy(onClick = goSeedRecovery) - 1 -> item.copy(onClick = goExportPrivateData) - else -> item - } - }.toImmutableList() + originalState.items + .mapIndexed { index, item -> + when (index) { + 0 -> item.copy(onClick = goSeedRecovery) + 1 -> item.copy(onClick = goExportPrivateData) + else -> item + } + }.toImmutableList() ) BackHandler { diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/advancedsettings/viewmodel/AdvancedSettingsViewModel.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/advancedsettings/viewmodel/AdvancedSettingsViewModel.kt index 7be2b82a0..44a014ba2 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/advancedsettings/viewmodel/AdvancedSettingsViewModel.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/advancedsettings/viewmodel/AdvancedSettingsViewModel.kt @@ -27,11 +27,11 @@ class AdvancedSettingsViewModel( private val navigateToTaxExport: NavigateToTaxExportUseCase, ) : ViewModel() { val state: StateFlow = - getWalletRestoringState.observe() + getWalletRestoringState + .observe() .map { walletState -> createState(walletState) - } - .stateIn( + }.stateIn( scope = viewModelScope, started = SharingStarted.WhileSubscribed(ANDROID_STATE_FLOW_TIMEOUT), initialValue = createState(getWalletRestoringState.observe().value) diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/authentication/AndroidAuthentication.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/authentication/AndroidAuthentication.kt index efc818793..05cde1899 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/authentication/AndroidAuthentication.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/authentication/AndroidAuthentication.kt @@ -117,7 +117,8 @@ private fun WrapDeleteWalletAuth( val authenticationResult = authenticationViewModel.authenticationResult - .collectAsStateWithLifecycle(initialValue = AuthenticationResult.None).value + .collectAsStateWithLifecycle(initialValue = AuthenticationResult.None) + .value when (authenticationResult) { AuthenticationResult.None -> { @@ -138,7 +139,8 @@ private fun WrapDeleteWalletAuth( Twig.warn { "Authentication result: failed" } authenticationViewModel.resetAuthenticationResult() onFailed() - Toast.makeText(activity, activity.getString(R.string.authentication_toast_failed), Toast.LENGTH_SHORT) + Toast + .makeText(activity, activity.getString(R.string.authentication_toast_failed), Toast.LENGTH_SHORT) .show() } is AuthenticationResult.Error -> { @@ -190,7 +192,8 @@ private fun WrapAppExportPrivateDataAuth( val authenticationResult = authenticationViewModel.authenticationResult - .collectAsStateWithLifecycle(initialValue = AuthenticationResult.None).value + .collectAsStateWithLifecycle(initialValue = AuthenticationResult.None) + .value when (authenticationResult) { AuthenticationResult.None -> { @@ -211,7 +214,8 @@ private fun WrapAppExportPrivateDataAuth( Twig.warn { "Authentication result: failed" } authenticationViewModel.resetAuthenticationResult() onFailed() - Toast.makeText(activity, stringResource(id = R.string.authentication_toast_failed), Toast.LENGTH_SHORT) + Toast + .makeText(activity, stringResource(id = R.string.authentication_toast_failed), Toast.LENGTH_SHORT) .show() } is AuthenticationResult.Error -> { @@ -263,7 +267,8 @@ private fun WrapSeedRecoveryAuth( val authenticationResult = authenticationViewModel.authenticationResult - .collectAsStateWithLifecycle(initialValue = AuthenticationResult.None).value + .collectAsStateWithLifecycle(initialValue = AuthenticationResult.None) + .value when (authenticationResult) { AuthenticationResult.None -> { @@ -284,7 +289,8 @@ private fun WrapSeedRecoveryAuth( Twig.warn { "Authentication result: failed" } authenticationViewModel.resetAuthenticationResult() onFailed() - Toast.makeText(activity, stringResource(id = R.string.authentication_toast_failed), Toast.LENGTH_SHORT) + Toast + .makeText(activity, stringResource(id = R.string.authentication_toast_failed), Toast.LENGTH_SHORT) .show() } is AuthenticationResult.Error -> { @@ -337,7 +343,8 @@ private fun WrapSendFundsAuth( val authenticationResult = authenticationViewModel.authenticationResult - .collectAsStateWithLifecycle(initialValue = AuthenticationResult.None).value + .collectAsStateWithLifecycle(initialValue = AuthenticationResult.None) + .value when (authenticationResult) { AuthenticationResult.None -> { @@ -358,7 +365,8 @@ private fun WrapSendFundsAuth( Twig.warn { "Authentication result: failed" } authenticationViewModel.resetAuthenticationResult() onFailed() - Toast.makeText(activity, stringResource(id = R.string.authentication_toast_failed), Toast.LENGTH_SHORT) + Toast + .makeText(activity, stringResource(id = R.string.authentication_toast_failed), Toast.LENGTH_SHORT) .show() } is AuthenticationResult.Error -> { @@ -427,7 +435,8 @@ private fun WrapAppAccessAuth( val authenticationResult = authenticationViewModel.authenticationResult - .collectAsStateWithLifecycle(initialValue = AuthenticationResult.None).value + .collectAsStateWithLifecycle(initialValue = AuthenticationResult.None) + .value when (authenticationResult) { AuthenticationResult.None -> { @@ -443,7 +452,8 @@ private fun WrapAppAccessAuth( AuthenticationResult.Canceled -> { Twig.info { "Authentication result: canceled: shutting down" } authenticationViewModel.resetAuthenticationResult() - Toast.makeText(activity, stringResource(id = R.string.authentication_toast_canceled), Toast.LENGTH_SHORT) + Toast + .makeText(activity, stringResource(id = R.string.authentication_toast_canceled), Toast.LENGTH_SHORT) .show() onCancel() } diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/authentication/view/WelcomeAnimation.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/authentication/view/WelcomeAnimation.kt index f89a8c4df..66fc3db59 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/authentication/view/WelcomeAnimation.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/authentication/view/WelcomeAnimation.kt @@ -123,8 +123,7 @@ fun WelcomeScreenView( .verticalScroll( state = rememberScrollState(), enabled = false - ) - .wrapContentSize() + ).wrapContentSize() ) ) { AnimatedVisibility( diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/balances/AndroidBalances.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/balances/AndroidBalances.kt index 78a535035..226743b3b 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/balances/AndroidBalances.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/balances/AndroidBalances.kt @@ -285,13 +285,14 @@ internal fun WrapBalances( supportInfo = supportInfo?.toSupportString(SupportInfoType.entries.toSet()) ) val mailIntent = - EmailUtil.newMailActivityIntent( - context.getString(R.string.support_email_address), - context.getString(R.string.app_name), - fullMessage - ).apply { - flags = Intent.FLAG_ACTIVITY_NEW_TASK - } + EmailUtil + .newMailActivityIntent( + context.getString(R.string.support_email_address), + context.getString(R.string.app_name), + fullMessage + ).apply { + flags = Intent.FLAG_ACTIVITY_NEW_TASK + } runCatching { context.startActivity(mailIntent) }.onFailure { @@ -313,14 +314,13 @@ internal fun WrapBalances( private fun updateTransparentBalanceState( currentShieldState: ShieldState, walletSnapshot: WalletSnapshot? -): ShieldState { - return when { +): ShieldState = + when { (walletSnapshot == null) -> currentShieldState (walletSnapshot.transparentBalance >= Zatoshi(DEFAULT_SHIELDING_THRESHOLD) && currentShieldState.isEnabled()) -> ShieldState.Available else -> currentShieldState } -} private fun openPlayStoreAppSite( context: Context, diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/balances/model/WalletDisplayValues.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/balances/model/WalletDisplayValues.kt index 6ec5683d4..eabf153a2 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/balances/model/WalletDisplayValues.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/balances/model/WalletDisplayValues.kt @@ -119,11 +119,17 @@ sealed class StatusAction { data object AppUpdate : StatusAction() - sealed class Detailed(open val details: String) : StatusAction() + sealed class Detailed( + open val details: String + ) : StatusAction() - data class Disconnected(override val details: String) : Detailed(details) + data class Disconnected( + override val details: String + ) : Detailed(details) - data class Stopped(override val details: String) : Detailed(details) + data class Stopped( + override val details: String + ) : Detailed(details) data class Error( override val details: String, @@ -136,8 +142,8 @@ fun StatusAction.isReportable() = this is StatusAction.Error && fullStackTrace ! private fun getFiatCurrencyRateValue( context: Context, fiatCurrencyAmountState: FiatCurrencyConversionRateState -): String { - return fiatCurrencyAmountState.let { state -> +): String = + fiatCurrencyAmountState.let { state -> when (state) { is FiatCurrencyConversionRateState.Current -> state.formattedFiatValue is FiatCurrencyConversionRateState.Stale -> state.formattedFiatValue @@ -146,4 +152,3 @@ private fun getFiatCurrencyRateValue( } } } -} diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/chooseserver/ChooseServerState.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/chooseserver/ChooseServerState.kt index 955dfa2b9..348927a23 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/chooseserver/ChooseServerState.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/chooseserver/ChooseServerState.kt @@ -54,5 +54,8 @@ sealed interface ServerState : Itemizable { sealed interface ServerDialogState { val state: AlertDialogState - data class Validation(override val state: AlertDialogState, val reason: StringResource?) : ServerDialogState + data class Validation( + override val state: AlertDialogState, + val reason: StringResource? + ) : ServerDialogState } diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/chooseserver/ChooseServerView.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/chooseserver/ChooseServerView.kt index 15e06dd1c..c4edca332 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/chooseserver/ChooseServerView.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/chooseserver/ChooseServerView.kt @@ -183,7 +183,10 @@ private fun ErrorDialog(dialogState: ServerDialogState) { } } }, - confirmButtonText = dialogState.state.confirmButtonState?.text?.getValue(), + confirmButtonText = + dialogState.state.confirmButtonState + ?.text + ?.getValue(), onConfirmButtonClick = dialogState.state.confirmButtonState?.onClick ) } diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/chooseserver/ChooseServerViewModel.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/chooseserver/ChooseServerViewModel.kt index 4c9b8fbae..75bbaee11 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/chooseserver/ChooseServerViewModel.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/chooseserver/ChooseServerViewModel.kt @@ -59,8 +59,7 @@ class ChooseServerViewModel( fastestServers.servers ?.map { endpoint -> createDefaultServerState(endpoint, userEndpointSelection, selectedEndpoint) - } - .orEmpty(), + }.orEmpty(), isLoading = fastestServers.isLoading, retryButton = ButtonState( @@ -97,16 +96,13 @@ class ChooseServerViewModel( getAvailableServers() .filter { !fastest.servers.orEmpty().contains(it) - } - .map { endpoint -> + }.map { endpoint -> createDefaultServerState(endpoint, userEndpointSelection, selectedEndpoint) - } - .toMutableList() + }.toMutableList() .apply { val index = 1.coerceIn(0, size.coerceAtLeast(0)) add(index, customEndpointState) - } - .toList() + }.toList() ) } @@ -133,7 +129,8 @@ class ChooseServerViewModel( val isSelectedEndpointCustom = !getAvailableServers().contains(selectedEndpoint) when { isSelectedEndpointCustom && userCustomEndpointText == null -> false - isSelectedEndpointCustom && selectedEndpoint?.generateUserString() != + isSelectedEndpointCustom && + selectedEndpoint?.generateUserString() != userCustomEndpointText -> true else -> false } @@ -153,8 +150,12 @@ class ChooseServerViewModel( } val state = - combine(fastest, other, buttonState, dialogState) { fastest, all, - buttonState, dialogState -> + combine(fastest, other, buttonState, dialogState) { + fastest, + all, + buttonState, + dialogState + -> if (all == null) { // not loaded yet return@combine null } @@ -272,8 +273,8 @@ class ChooseServerViewModel( * @return an endpoint selected by user or null if user didn't select any new endpoint explicitly or if selected * custom endpoint is invalid */ - private fun getUserEndpointSelectionOrShowError(): LightWalletEndpoint? { - return when (val selection = userEndpointSelection.value) { + private fun getUserEndpointSelectionOrShowError(): LightWalletEndpoint? = + when (val selection = userEndpointSelection.value) { is Selection.Custom -> { val endpoint = userCustomEndpointText.value val validated = validateEndpoint(endpoint.orEmpty()) @@ -286,7 +287,6 @@ class ChooseServerViewModel( is Selection.Endpoint -> selection.endpoint null -> null } - } private fun showValidationErrorDialog(reason: String?) { dialogState.update { @@ -305,14 +305,15 @@ class ChooseServerViewModel( } } - private fun LightWalletEndpoint.generateUserString(): String { - return stringRes(resource = R.string.choose_server_full_server_name_text_field, host, port) + private fun LightWalletEndpoint.generateUserString(): String = + stringRes(resource = R.string.choose_server_full_server_name_text_field, host, port) .getString(getApplication()) - } } private sealed interface Selection { data object Custom : Selection - data class Endpoint(val endpoint: LightWalletEndpoint) : Selection + data class Endpoint( + val endpoint: LightWalletEndpoint + ) : Selection } diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/contact/viewmodel/AddContactViewModel.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/contact/viewmodel/AddContactViewModel.kt index 5dbed3adf..f3f0b42ec 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/contact/viewmodel/AddContactViewModel.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/contact/viewmodel/AddContactViewModel.kt @@ -34,25 +34,26 @@ class AddContactViewModel( @OptIn(ExperimentalCoroutinesApi::class) private val contactAddressError = - contactAddress.mapLatest { address -> - if (address.isEmpty()) { - null - } else { - when (validateContactAddress(address)) { - ValidateContactAddressUseCase.Result.Invalid -> - stringRes(R.string.contact_address_error_invalid) + contactAddress + .mapLatest { address -> + if (address.isEmpty()) { + null + } else { + when (validateContactAddress(address)) { + ValidateContactAddressUseCase.Result.Invalid -> + stringRes(R.string.contact_address_error_invalid) - ValidateContactAddressUseCase.Result.NotUnique -> - stringRes(R.string.contact_address_error_not_unique) + ValidateContactAddressUseCase.Result.NotUnique -> + stringRes(R.string.contact_address_error_not_unique) - ValidateContactAddressUseCase.Result.Valid -> null + ValidateContactAddressUseCase.Result.Valid -> null + } } - } - }.stateIn( - scope = viewModelScope, - started = SharingStarted.WhileSubscribed(ANDROID_STATE_FLOW_TIMEOUT), - initialValue = null - ) + }.stateIn( + scope = viewModelScope, + started = SharingStarted.WhileSubscribed(ANDROID_STATE_FLOW_TIMEOUT), + initialValue = null + ) private val contactAddressState = combine(contactAddress, contactAddressError) { address, contactAddressError -> @@ -67,26 +68,27 @@ class AddContactViewModel( @OptIn(ExperimentalCoroutinesApi::class) private val contactNameError = - contactName.mapLatest { name -> - if (name.isEmpty()) { - null - } else { - when (validateContactName(name)) { - ValidateContactNameUseCase.Result.TooLong -> - stringRes(R.string.contact_name_error_too_long) + contactName + .mapLatest { name -> + if (name.isEmpty()) { + null + } else { + when (validateContactName(name)) { + ValidateContactNameUseCase.Result.TooLong -> + stringRes(R.string.contact_name_error_too_long) - ValidateContactNameUseCase.Result.NotUnique -> - stringRes(R.string.contact_name_error_not_unique) + ValidateContactNameUseCase.Result.NotUnique -> + stringRes(R.string.contact_name_error_not_unique) - ValidateContactNameUseCase.Result.Valid -> - null + ValidateContactNameUseCase.Result.Valid -> + null + } } - } - }.stateIn( - scope = viewModelScope, - started = SharingStarted.WhileSubscribed(ANDROID_STATE_FLOW_TIMEOUT), - initialValue = null - ) + }.stateIn( + scope = viewModelScope, + started = SharingStarted.WhileSubscribed(ANDROID_STATE_FLOW_TIMEOUT), + initialValue = null + ) private val contactNameState = combine(contactName, contactNameError) { name, contactNameError -> diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/contact/viewmodel/UpdateContactViewModel.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/contact/viewmodel/UpdateContactViewModel.kt index 8ba1ee7cc..e3667adb1 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/contact/viewmodel/UpdateContactViewModel.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/contact/viewmodel/UpdateContactViewModel.kt @@ -102,8 +102,12 @@ class UpdateContactViewModel( } private val updateButtonState = - combine(contactAddressState, contactNameState, isUpdatingContact, contact) { address, name, - isUpdatingContact, contact -> + combine(contactAddressState, contactNameState, isUpdatingContact, contact) { + address, + name, + isUpdatingContact, + contact + -> ButtonState( text = stringRes(R.string.update_contact_primary_btn), isEnabled = diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/exchangerate/widget/StyledExchangeRateOptIn.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/exchangerate/widget/StyledExchangeRateOptIn.kt index 45a0178df..1ca6fff4b 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/exchangerate/widget/StyledExchangeRateOptIn.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/exchangerate/widget/StyledExchangeRateOptIn.kt @@ -91,7 +91,9 @@ fun StyledExchangeOptIn( ) { scope -> Text( text = stringResource(R.string.exchange_rate_opt_in_primary_btn), - style = ZcashTheme.typography.primary.titleSmall.copy(fontWeight = FontWeight.SemiBold), + style = + ZcashTheme.typography.primary.titleSmall + .copy(fontWeight = FontWeight.SemiBold), fontSize = 14.sp ) scope.Loading() diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/feedback/view/FeedbackView.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/feedback/view/FeedbackView.kt index 01b632ef7..02384eba3 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/feedback/view/FeedbackView.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/feedback/view/FeedbackView.kt @@ -225,13 +225,11 @@ private fun Emoji( width = 2.5.dp, color = if (isSelected) ZashiColors.Text.textPrimary else Color.Transparent, shape = RoundedCornerShape(ZashiDimensions.Radius.radiusXl) - ) - .padding(4.5.dp) + ).padding(4.5.dp) .background( color = ZashiColors.Surfaces.bgSecondary, shape = RoundedCornerShape(8.dp) - ) - .clip(RoundedCornerShape(8.dp)) + ).clip(RoundedCornerShape(8.dp)) .clickable(onClick = onClick), contentAlignment = Alignment.Center ) { diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/feedback/viewmodel/FeedbackViewModel.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/feedback/viewmodel/FeedbackViewModel.kt index a41c9ec24..14098600d 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/feedback/viewmodel/FeedbackViewModel.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/feedback/viewmodel/FeedbackViewModel.kt @@ -55,23 +55,24 @@ class FeedbackViewModel( }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(ANDROID_STATE_FLOW_TIMEOUT), null) val dialogState = - isDialogShown.map { isShown -> - AlertDialogState( - title = stringRes(R.string.support_confirmation_dialog_title), - text = stringRes(R.string.support_confirmation_explanation), - confirmButtonState = - ButtonState( - text = stringRes(R.string.support_confirmation_dialog_ok), - onClick = ::onConfirmSendFeedback - ), - dismissButtonState = - ButtonState( - text = stringRes(R.string.support_confirmation_dialog_cancel), - onClick = { isDialogShown.update { false } } - ), - onDismissRequest = { isDialogShown.update { false } } - ).takeIf { isShown } - }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(ANDROID_STATE_FLOW_TIMEOUT), null) + isDialogShown + .map { isShown -> + AlertDialogState( + title = stringRes(R.string.support_confirmation_dialog_title), + text = stringRes(R.string.support_confirmation_explanation), + confirmButtonState = + ButtonState( + text = stringRes(R.string.support_confirmation_dialog_ok), + onClick = ::onConfirmSendFeedback + ), + dismissButtonState = + ButtonState( + text = stringRes(R.string.support_confirmation_dialog_cancel), + onClick = { isDialogShown.update { false } } + ), + onDismissRequest = { isDialogShown.update { false } } + ).takeIf { isShown } + }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(ANDROID_STATE_FLOW_TIMEOUT), null) private fun onConfirmSendFeedback() = viewModelScope.launch { diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/home/AndroidHome.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/home/AndroidHome.kt index c7660e021..9c005da44 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/home/AndroidHome.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/home/AndroidHome.kt @@ -222,7 +222,9 @@ internal fun WrapHome( * Enum of the Home screen sub-screens */ @Suppress("MagicNumber") -enum class HomeScreenIndex(val pageIndex: Int) { +enum class HomeScreenIndex( + val pageIndex: Int +) { ACCOUNT(0), SEND(1), RECEIVE(2), diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/home/view/HomeView.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/home/view/HomeView.kt index 3a6dad0aa..c1a83361e 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/home/view/HomeView.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/home/view/HomeView.kt @@ -170,8 +170,7 @@ private fun HomeContent( .padding( horizontal = ZcashTheme.dimens.spacingXtiny, vertical = ZcashTheme.dimens.spacingDefault - ) - .testTag(item.testTag) + ).testTag(item.testTag) ) } } diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/integrations/AndroidIntegrations.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/integrations/AndroidIntegrations.kt index 3b6522213..c87026d9e 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/integrations/AndroidIntegrations.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/integrations/AndroidIntegrations.kt @@ -24,11 +24,11 @@ internal fun WrapIntegrations() { LaunchedEffect(Unit) { viewModel.flexaNavigationCommand.collect { - Flexa.buildSpend() + Flexa + .buildSpend() .onTransactionRequest { viewModel.onFlexaResultCallback(it) - } - .build() + }.build() .open(activity) } } diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/integrations/viewmodel/IntegrationsViewModel.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/integrations/viewmodel/IntegrationsViewModel.kt index 5a0bb9f1a..2eaf6021e 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/integrations/viewmodel/IntegrationsViewModel.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/integrations/viewmodel/IntegrationsViewModel.kt @@ -157,7 +157,8 @@ class IntegrationsViewModel( when (val output = result.first) { is SubmitResult.Success -> { Twig.debug { "Transaction successful $result" } - Flexa.buildSpend() + Flexa + .buildSpend() .transactionSent( commerceSessionId = transaction.getOrNull()?.commerceSessionId.orEmpty(), txSignature = result.second.orEmpty() @@ -165,7 +166,8 @@ class IntegrationsViewModel( } is SubmitResult.SimpleTrxFailure.SimpleTrxFailureGrpc -> { Twig.warn { "Transaction grpc failure $result" } - Flexa.buildSpend() + Flexa + .buildSpend() .transactionSent( commerceSessionId = transaction.getOrNull()?.commerceSessionId.orEmpty(), txSignature = output.result.txIdString() @@ -212,13 +214,14 @@ class IntegrationsViewModel( val submitResults = mutableListOf() return runCatching { - synchronizer.createProposedTransactions( - proposal = proposal, - usk = spendingKey - ).collect { submitResult -> - Twig.info { "Transaction submit result: $submitResult" } - submitResults.add(submitResult) - } + synchronizer + .createProposedTransactions( + proposal = proposal, + usk = spendingKey + ).collect { submitResult -> + Twig.info { "Transaction submit result: $submitResult" } + submitResults.add(submitResult) + } if (submitResults.find { it is TransactionSubmitResult.Failure } != null) { if (submitResults.size == 1) { // The first transaction submission failed - user might just be able to re-submit the transaction @@ -237,8 +240,10 @@ class IntegrationsViewModel( } else { // All transaction submissions were successful SubmitResult.Success(emptyList()) to - submitResults.filterIsInstance() - .map { it.txIdString() }.firstOrNull() + submitResults + .filterIsInstance() + .map { it.txIdString() } + .firstOrNull() } }.onSuccess { Twig.debug { "Transactions submitted successfully" } diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/qrcode/viewmodel/QrCodeViewModel.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/qrcode/viewmodel/QrCodeViewModel.kt index e7e42ee9c..3cdff1836 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/qrcode/viewmodel/QrCodeViewModel.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/qrcode/viewmodel/QrCodeViewModel.kt @@ -47,29 +47,31 @@ class QrCodeViewModel( private val versionInfo by lazy { getVersionInfo() } internal val state = - observeSelectedWalletAccount.require().map { account -> - val walletAddress = account.fromReceiveAddressType(ReceiveAddressType.fromOrdinal(addressTypeOrdinal)) + observeSelectedWalletAccount + .require() + .map { account -> + val walletAddress = account.fromReceiveAddressType(ReceiveAddressType.fromOrdinal(addressTypeOrdinal)) - if (walletAddress == null) { - QrCodeState.Loading - } else { - QrCodeState.Prepared( - walletAddress = walletAddress, - onAddressCopy = { address -> onAddressCopyClick(address) }, - onQrCodeShare = { onQrCodeShareClick(it, versionInfo) }, - onBack = ::onBack, - qrCodeType = - when (account) { - is KeystoneAccount -> QrCodeType.KEYSTONE - is ZashiAccount -> QrCodeType.ZASHI - } - ) - } - }.stateIn( - scope = viewModelScope, - started = SharingStarted.WhileSubscribed(ANDROID_STATE_FLOW_TIMEOUT), - initialValue = QrCodeState.Loading - ) + if (walletAddress == null) { + QrCodeState.Loading + } else { + QrCodeState.Prepared( + walletAddress = walletAddress, + onAddressCopy = { address -> onAddressCopyClick(address) }, + onQrCodeShare = { onQrCodeShareClick(it, versionInfo) }, + onBack = ::onBack, + qrCodeType = + when (account) { + is KeystoneAccount -> QrCodeType.KEYSTONE + is ZashiAccount -> QrCodeType.ZASHI + } + ) + } + }.stateIn( + scope = viewModelScope, + started = SharingStarted.WhileSubscribed(ANDROID_STATE_FLOW_TIMEOUT), + initialValue = QrCodeState.Loading + ) val shareResultCommand = MutableSharedFlow() @@ -117,13 +119,14 @@ fun shareData( // Save the bitmap to a temporary file in the cache directory val bitmapFile = withContext(Dispatchers.IO) { - File.createTempFile( - TEMP_FILE_NAME_PREFIX, - TEMP_FILE_NAME_SUFFIX, - cacheDir, - ).also { - it.storeBitmap(qrImageBitmap) - } + File + .createTempFile( + TEMP_FILE_NAME_PREFIX, + TEMP_FILE_NAME_SUFFIX, + cacheDir, + ).also { + it.storeBitmap(qrImageBitmap) + } } // Example of the expected temporary file path: diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/receive/view/ReceiveView.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/receive/view/ReceiveView.kt index 823a1885a..7ebef44f9 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/receive/view/ReceiveView.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/receive/view/ReceiveView.kt @@ -139,8 +139,7 @@ private fun AddressPanel( ZashiColors.Utility.Gray.utilityGray50 }, RoundedCornerShape(ZashiDimensions.Radius.radius3xl) - ) - .clip(RoundedCornerShape(ZashiDimensions.Radius.radius3xl)) + ).clip(RoundedCornerShape(ZashiDimensions.Radius.radius3xl)) .clickable(onClick = state.onClick) .padding(all = ZcashTheme.dimens.spacingLarge) ) { diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/request/model/OnAmount.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/request/model/OnAmount.kt index 9ba676f28..4c54c66a8 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/request/model/OnAmount.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/request/model/OnAmount.kt @@ -1,9 +1,13 @@ package co.electriccoin.zcash.ui.screen.request.model internal sealed class OnAmount { - data class Number(val number: Int) : OnAmount() + data class Number( + val number: Int + ) : OnAmount() - data class Separator(val separator: String) : OnAmount() + data class Separator( + val separator: String + ) : OnAmount() data object Delete : OnAmount() } diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/request/model/Request.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/request/model/Request.kt index a3efc15da..02667b73c 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/request/model/Request.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/request/model/Request.kt @@ -37,12 +37,13 @@ sealed class AmountState( context: Context, conversion: FiatCurrencyConversion ): String = - kotlin.runCatching { - Zatoshi.fromZecString(context, amount, Locale.getDefault())?.toFiatString( - currencyConversion = conversion, - locale = Locale.getDefault() - ) ?: "" - }.getOrElse { "" } + kotlin + .runCatching { + Zatoshi.fromZecString(context, amount, Locale.getDefault())?.toFiatString( + currencyConversion = conversion, + locale = Locale.getDefault() + ) ?: "" + }.getOrElse { "" } data class Valid( override val amount: String, diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/request/model/RequestState.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/request/model/RequestState.kt index 854e819ff..d47dd29a5 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/request/model/RequestState.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/request/model/RequestState.kt @@ -11,7 +11,9 @@ import co.electriccoin.zcash.ui.design.util.StringResource internal sealed class RequestState { data object Loading : RequestState() - sealed class Prepared(open val onBack: () -> Unit) : RequestState() + sealed class Prepared( + open val onBack: () -> Unit + ) : RequestState() data class Amount( val request: Request, diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/request/viewmodel/RequestViewModel.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/request/viewmodel/RequestViewModel.kt index 1d50d8759..09e2fb907 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/request/viewmodel/RequestViewModel.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/request/viewmodel/RequestViewModel.kt @@ -169,8 +169,8 @@ class RequestViewModel( val shareResultCommand = MutableSharedFlow() - private fun resolveExchangeRateValue(exchangeRateUsd: ExchangeRateState): FiatCurrencyConversion? { - return when (exchangeRateUsd) { + private fun resolveExchangeRateValue(exchangeRateUsd: ExchangeRateState): FiatCurrencyConversion? = + when (exchangeRateUsd) { is ExchangeRateState.Data -> { if (exchangeRateUsd.currencyConversion == null) { Twig.warn { "Currency conversion is currently not available" } @@ -185,7 +185,6 @@ class RequestViewModel( null } } - } private fun onAmount( conversion: FiatCurrencyConversion?, @@ -210,11 +209,17 @@ class RequestViewModel( // Deleting up to the last character AmountState.Default(defaultAmount, request.value.amountState.currency) } else { - validateAmountState(conversion, request.value.amountState.amount.dropLast(1)) + validateAmountState( + conversion, + request.value.amountState.amount + .dropLast(1) + ) } } is OnAmount.Separator -> { - if (request.value.amountState.amount.contains(onAmount.separator)) { + if (request.value.amountState.amount + .contains(onAmount.separator) + ) { // Separator already present validateAmountState(conversion, request.value.amountState.amount) } else { @@ -237,7 +242,9 @@ class RequestViewModel( // Note that this regex aligns with the one from ZcashSDK (sdk-incubator-lib/src/main/res/values/strings-regex.xml) // It only adds check for 0-8 digits after the decimal separator at maximum @Suppress("MaxLineLength", "ktlint:standard:max-line-length") - private val allowedNumberFormatValidationRegex = "^([0-9]*([0-9]+([${getMonetarySeparators().grouping}]\$|[${getMonetarySeparators().grouping}][0-9]+))*([${getMonetarySeparators().decimal}]\$|[${getMonetarySeparators().decimal}][0-9]{0,8})?)?\$".toRegex() + private val allowedNumberFormatValidationRegex = + "^([0-9]*([0-9]+([${getMonetarySeparators().grouping}]\$|[${getMonetarySeparators().grouping}][0-9]+))*([${getMonetarySeparators().decimal}]\$|[${getMonetarySeparators().decimal}][0-9]{0,8})?)?\$" + .toRegex() private fun validateAmountState( conversion: FiatCurrencyConversion?, diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/restore/model/ParseResult.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/restore/model/ParseResult.kt index 33c5915c4..baafdd091 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/restore/model/ParseResult.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/restore/model/ParseResult.kt @@ -9,17 +9,23 @@ internal sealed class ParseResult { override fun toString() = "Continue" } - data class Add(val words: List) : ParseResult() { + data class Add( + val words: List + ) : ParseResult() { // Override to prevent logging of user secrets override fun toString() = "Add" } - data class Autocomplete(val suggestions: List) : ParseResult() { + data class Autocomplete( + val suggestions: List + ) : ParseResult() { // Override to prevent logging of user secrets override fun toString() = "Autocomplete" } - data class Warn(val suggestions: List) : ParseResult() { + data class Warn( + val suggestions: List + ) : ParseResult() { // Override to prevent logging of user secrets override fun toString() = "Warn" } @@ -49,7 +55,8 @@ internal sealed class ParseResult { } val multiple = - trimmed.split(SeedPhrase.DEFAULT_DELIMITER) + trimmed + .split(SeedPhrase.DEFAULT_DELIMITER) .filter { completeWordList.contains(it) } .first(SeedPhrase.SEED_PHRASE_SIZE) if (multiple.isNotEmpty()) { @@ -60,20 +67,17 @@ internal sealed class ParseResult { } } - override fun toString(): String { - return "ParseResult()" - } + override fun toString(): String = "ParseResult()" } internal fun findSuggestions( input: String, completeWordList: Set -): List { - return if (input.isBlank()) { +): List = + if (input.isBlank()) { emptyList() } else { completeWordList.filter { it.startsWith(input) }.ifEmpty { findSuggestions(input.dropLast(1), completeWordList) } } -} diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/restore/state/RestoreState.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/restore/state/RestoreState.kt index 384496ffa..5662f1835 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/restore/state/RestoreState.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/restore/state/RestoreState.kt @@ -9,7 +9,9 @@ import kotlinx.coroutines.flow.StateFlow * primarily useful on Android, for automated tests, and for iterative debugging with the Compose * layout preview. The default constructor argument is generally fine for other platforms. */ -class RestoreState(initialState: RestoreStage = RestoreStage.values().first()) { +class RestoreState( + initialState: RestoreStage = RestoreStage.values().first() +) { private val mutableState = MutableStateFlow(initialState) val current: StateFlow = mutableState diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/restore/state/WordList.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/restore/state/WordList.kt index a8a48bc28..0d6d11f9f 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/restore/state/WordList.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/restore/state/WordList.kt @@ -9,7 +9,9 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.map -class WordList(initial: List = emptyList()) { +class WordList( + initial: List = emptyList() +) { private val mutableState: MutableStateFlow> = MutableStateFlow(initial.toPersistentList()) val current: StateFlow> = mutableState diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/restore/view/RestoreView.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/restore/view/RestoreView.kt index 97323effd..8c8670469 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/restore/view/RestoreView.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/restore/view/RestoreView.kt @@ -556,8 +556,7 @@ private fun SeedGridWithText( width = ZcashTheme.dimens.layoutStroke, color = ZcashTheme.colors.layoutStroke ) - ) - .fillMaxWidth() + ).fillMaxWidth() .defaultMinSize(minHeight = ZcashTheme.dimens.textFieldSeedPanelDefaultHeight) .then(modifier) .testTag(RestoreTag.CHIP_LAYOUT) @@ -829,9 +828,10 @@ private fun RestoreBirthdayMainContent( // Empty birthday value is a valid birthday height too, thus run validation only in case of non-empty heights. val isBirthdayValid = - height.isEmpty() || height.toLongOrNull()?.let { - it >= zcashNetwork.saplingActivationHeight.value - } ?: false + height.isEmpty() || + height.toLongOrNull()?.let { + it >= zcashNetwork.saplingActivationHeight.value + } ?: false val isEmptyBirthday = height.isEmpty() diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/restore/viewmodel/RestoreViewModel.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/restore/viewmodel/RestoreViewModel.kt index c7fe875e5..f8b888766 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/restore/viewmodel/RestoreViewModel.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/restore/viewmodel/RestoreViewModel.kt @@ -22,7 +22,10 @@ import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.withContext import java.util.Locale -class RestoreViewModel(application: Application, savedStateHandle: SavedStateHandle) : AndroidViewModel(application) { +class RestoreViewModel( + application: Application, + savedStateHandle: SavedStateHandle +) : AndroidViewModel(application) { val restoreState: RestoreState = run { val initialValue = @@ -107,5 +110,7 @@ class RestoreViewModel(application: Application, savedStateHandle: SavedStateHan sealed class CompleteWordSetState { object Loading : CompleteWordSetState() - data class Loaded(val list: ImmutableSet) : CompleteWordSetState() + data class Loaded( + val list: ImmutableSet + ) : CompleteWordSetState() } diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/reviewtransaction/ReviewTransactionViewModel.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/reviewtransaction/ReviewTransactionViewModel.kt index df79f13fa..b3b37e4e6 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/reviewtransaction/ReviewTransactionViewModel.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/reviewtransaction/ReviewTransactionViewModel.kt @@ -131,14 +131,14 @@ class ReviewTransactionViewModel( title = stringRes(R.string.send_confirmation_fee), amount = transactionProposal.proposal.totalFeeRequired() ), - transactionProposal.memo.takeIf { it.value.isNotEmpty() } + transactionProposal.memo + .takeIf { it.value.isNotEmpty() } ?.let { MessageState( title = stringRes(R.string.send_memo_label), message = stringRes(it.value) ) - } - ?.takeIf { transactionProposal.destination !is WalletAddress.Transparent }, + }?.takeIf { transactionProposal.destination !is WalletAddress.Transparent }, MessagePlaceholderState( title = stringRes(R.string.send_memo_label), message = stringRes(R.string.send_transparent_memo), diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/scan/model/ScanResultState.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/scan/model/ScanResultState.kt index e0597eb1d..ff7a761c7 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/scan/model/ScanResultState.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/scan/model/ScanResultState.kt @@ -1,7 +1,11 @@ package co.electriccoin.zcash.ui.screen.scan.model sealed class ScanResultState { - data class Address(val address: String) : ScanResultState() + data class Address( + val address: String + ) : ScanResultState() - data class Zip321Uri(val zip321Uri: String) : ScanResultState() + data class Zip321Uri( + val zip321Uri: String + ) : ScanResultState() } diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/scan/util/ImageUriToQrCodeConverter.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/scan/util/ImageUriToQrCodeConverter.kt index f0518d384..25e6632b6 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/scan/util/ImageUriToQrCodeConverter.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/scan/util/ImageUriToQrCodeConverter.kt @@ -21,7 +21,8 @@ class ImageUriToQrCodeConverter { ): String? = withContext(Dispatchers.IO) { runCatching { - uri.toBitmap(context) + uri + .toBitmap(context) .toBinaryBitmap() .toQRCode() }.onFailure { @@ -30,7 +31,8 @@ class ImageUriToQrCodeConverter { } private fun Uri.toBitmap(context: Context): Bitmap = - context.contentResolver.openInputStream(this) + context.contentResolver + .openInputStream(this) .use { BitmapFactory.decodeStream(it) } @@ -54,6 +56,6 @@ class ImageUriToQrCodeConverter { DecodeHintType.ALSO_INVERTED to true ) ) - } - .decodeWithState(this@toQRCode).text + }.decodeWithState(this@toQRCode) + .text } diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/scan/view/ScanView.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/scan/view/ScanView.kt index 8c3770a36..74388f2bc 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/scan/view/ScanView.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/scan/view/ScanView.kt @@ -116,7 +116,8 @@ fun Scan( onScanStateChanged: (ScanScreenState) -> Unit, topAppBarSubTitleState: TopAppBarSubTitleState, validationResult: ScanValidationState -) = ZcashTheme(forceDarkMode = true) { // forces dark theme for this screen +) = ZcashTheme(forceDarkMode = true) { + // forces dark theme for this screen val permissionState = if (LocalInspectionMode.current) { remember { @@ -449,8 +450,7 @@ private fun ScanMainContent( .offset( x = 0.dp, y = with(density) { framePosition.bottom.toDp() } - ) - .padding(top = 36.dp), + ).padding(top = 36.dp), horizontalArrangement = Arrangement.Center ) { ImageButton( @@ -491,8 +491,7 @@ private fun ScanMainContent( bottom.linkTo(bottomItems.top) width = Dimension.matchParent height = Dimension.fillToConstraints - } - .onSizeChanged { + }.onSizeChanged { scanFrameLayoutSizeWindow = it } ) @@ -507,8 +506,7 @@ private fun ScanMainContent( bottom.linkTo(bottomItems.top) this.height = Dimension.ratio("1:1.08") // height is 8% larger than width width = Dimension.matchParent - } - .onSizeChanged { + }.onSizeChanged { scanFrameLayoutSize = it }, contentAlignment = Alignment.Center @@ -643,7 +641,8 @@ fun ScanCameraView( val contentDescription = stringResource(id = R.string.scan_preview_content_description) val imageAnalysis = - ImageAnalysis.Builder() + ImageAnalysis + .Builder() .setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST) .build() @@ -660,7 +659,8 @@ fun ScanCameraView( } previewView.contentDescription = contentDescription val selector = - CameraSelector.Builder() + CameraSelector + .Builder() .requireLensFacing(CameraSelector.LENS_FACING_BACK) .build() val preview = @@ -672,12 +672,13 @@ fun ScanCameraView( // We must unbind the use-cases before rebinding them collectedCameraProvider.unbindAll() cameraController.value = - collectedCameraProvider.bindToLifecycle( - lifecycleOwner, - selector, - preview, - imageAnalysis - ).cameraControl + collectedCameraProvider + .bindToLifecycle( + lifecycleOwner, + selector, + preview, + imageAnalysis + ).cameraControl }.onFailure { Twig.error { "Scan QR failed in bind phase with: ${it.message}" } setScanState(ScanScreenState.Failed) @@ -691,11 +692,14 @@ fun ScanCameraView( .testTag(ScanTag.CAMERA_VIEW) ) - imageAnalysis.qrCodeFlow( - framePosition = framePosition, - ).collectAsState(initial = null).value?.let { - onScanned(it) - } + imageAnalysis + .qrCodeFlow( + framePosition = framePosition, + ).collectAsState(initial = null) + .value + ?.let { + onScanned(it) + } } } diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/scankeystone/view/ScanKeystoneView.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/scankeystone/view/ScanKeystoneView.kt index 668f4043c..883c527fe 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/scankeystone/view/ScanKeystoneView.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/scankeystone/view/ScanKeystoneView.kt @@ -114,7 +114,8 @@ fun ScanKeystoneView( topAppBarSubTitleState: TopAppBarSubTitleState, validationResult: ScanValidationState, state: ScanKeystoneState, -) = ZcashTheme(forceDarkMode = true) { // forces dark theme for this screen +) = ZcashTheme(forceDarkMode = true) { + // forces dark theme for this screen val permissionState = if (LocalInspectionMode.current) { remember { @@ -478,8 +479,7 @@ private fun ScanMainContent( .offset( x = 0.dp, y = with(density) { framePosition.bottom.toDp() } - ) - .padding(top = 36.dp), + ).padding(top = 36.dp), horizontalArrangement = Arrangement.Center ) { ImageButton( @@ -511,8 +511,7 @@ private fun ScanMainContent( bottom.linkTo(bottomItems.top) width = Dimension.matchParent height = Dimension.fillToConstraints - } - .onSizeChanged { + }.onSizeChanged { scanFrameLayoutSizeWindow = it } ) @@ -527,8 +526,7 @@ private fun ScanMainContent( bottom.linkTo(bottomItems.top) this.height = Dimension.ratio("1:1.08") // height is 8% larger than width width = Dimension.matchParent - } - .onSizeChanged { + }.onSizeChanged { scanFrameLayoutSize = it }, contentAlignment = Alignment.Center @@ -664,7 +662,8 @@ fun ScanCameraView( val contentDescription = stringResource(id = R.string.scan_preview_content_description) val imageAnalysis = - ImageAnalysis.Builder() + ImageAnalysis + .Builder() .setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST) .build() @@ -681,7 +680,8 @@ fun ScanCameraView( } previewView.contentDescription = contentDescription val selector = - CameraSelector.Builder() + CameraSelector + .Builder() .requireLensFacing(CameraSelector.LENS_FACING_BACK) .build() val preview = @@ -693,12 +693,13 @@ fun ScanCameraView( // We must unbind the use-cases before rebinding them collectedCameraProvider.unbindAll() cameraController.value = - collectedCameraProvider.bindToLifecycle( - lifecycleOwner, - selector, - preview, - imageAnalysis - ).cameraControl + collectedCameraProvider + .bindToLifecycle( + lifecycleOwner, + selector, + preview, + imageAnalysis + ).cameraControl }.onFailure { Twig.error { "Scan QR failed in bind phase with: ${it.message}" } setScanState(ScanScreenState.Failed) @@ -712,11 +713,14 @@ fun ScanCameraView( .testTag(ScanTag.CAMERA_VIEW) ) - imageAnalysis.qrCodeFlow( - framePosition = framePosition, - ).collectAsState(initial = null).value?.let { - onScanned(it) - } + imageAnalysis + .qrCodeFlow( + framePosition = framePosition, + ).collectAsState(initial = null) + .value + ?.let { + onScanned(it) + } } } diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/seed/view/SeedView.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/seed/view/SeedView.kt index 2f7f3be33..4d05043cc 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/seed/view/SeedView.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/seed/view/SeedView.kt @@ -205,8 +205,7 @@ private fun SeedSecret( tooltipState.show() } } - } - .padding( + }.padding( horizontal = ZashiDimensions.Spacing.spacingXs, vertical = ZashiDimensions.Spacing.spacingSm ) @@ -337,15 +336,14 @@ private fun SecretContent(state: SeedSecretState) { private fun Modifier.blurCompat( radius: Dp, max: Dp -): Modifier { - return if (AndroidApiVersion.isAtLeastS) { +): Modifier = + if (AndroidApiVersion.isAtLeastS) { this.blur(radius) } else { val progression = 1 - (radius.value / max.value) this .alpha(progression) } -} @Composable private fun SecretBirthdayContent( diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/seed/viewmodel/SeedViewModel.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/seed/viewmodel/SeedViewModel.kt index 05320033c..0638be2c9 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/seed/viewmodel/SeedViewModel.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/seed/viewmodel/SeedViewModel.kt @@ -74,7 +74,14 @@ class SeedViewModel( birthday = SeedSecretState( title = stringRes(R.string.seed_recovery_bday_title), - text = stringRes(wallet?.birthday?.value?.toString().orEmpty()), + text = + stringRes( + wallet + ?.birthday + ?.value + ?.toString() + .orEmpty() + ), isRevealed = isRevealed, tooltip = SeedSecretStateTooltip( diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/selectkeystoneaccount/SelectKeystoneAccount.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/selectkeystoneaccount/SelectKeystoneAccount.kt index 9b4d7f5ee..84f357f50 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/selectkeystoneaccount/SelectKeystoneAccount.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/selectkeystoneaccount/SelectKeystoneAccount.kt @@ -3,4 +3,6 @@ package co.electriccoin.zcash.ui.screen.selectkeystoneaccount import kotlinx.serialization.Serializable @Serializable -data class SelectKeystoneAccount(val ur: String) +data class SelectKeystoneAccount( + val ur: String +) diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/selectkeystoneaccount/viewmodel/SelectKeystoneAccountViewModel.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/selectkeystoneaccount/viewmodel/SelectKeystoneAccountViewModel.kt index b8cbc927c..b4c9f20b6 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/selectkeystoneaccount/viewmodel/SelectKeystoneAccountViewModel.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/selectkeystoneaccount/viewmodel/SelectKeystoneAccountViewModel.kt @@ -55,8 +55,8 @@ class SelectKeystoneAccountViewModel( private suspend fun createState( selection: ZcashAccount?, isCreatingAccount: Boolean - ): SelectKeystoneAccountState { - return SelectKeystoneAccountState( + ): SelectKeystoneAccountState = + SelectKeystoneAccountState( onBackClick = ::onBackClick, title = stringRes(co.electriccoin.zcash.ui.R.string.select_keystone_account_title), subtitle = stringRes(co.electriccoin.zcash.ui.R.string.select_keystone_account_subtitle), @@ -83,7 +83,6 @@ class SelectKeystoneAccountViewModel( onClick = ::onForgetDeviceClick, ), ) - } private suspend fun createCheckboxState( account: ZcashAccount, diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/send/SendViewModel.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/send/SendViewModel.kt index 4feab193f..d8230fbb5 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/send/SendViewModel.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/send/SendViewModel.kt @@ -44,62 +44,64 @@ class SendViewModel( @OptIn(ExperimentalCoroutinesApi::class) val sendAddressBookState = - recipientAddressState.flatMapLatest { recipientAddressState -> - combine(observeWalletAccounts.require(), observeContactByAddress(recipientAddressState.address)) { - accounts, contact -> - accounts to contact - }.flatMapLatest { (accounts, contact) -> - flow { - val exists = - contact != null || - accounts.any { it.unified.address.address == recipientAddressState.address } - val isValid = recipientAddressState.type?.isNotValid == false - val mode = - if (isValid) { - if (exists) { - SendAddressBookState.Mode.PICK_FROM_ADDRESS_BOOK - } else { - SendAddressBookState.Mode.ADD_TO_ADDRESS_BOOK - } - } else { - SendAddressBookState.Mode.PICK_FROM_ADDRESS_BOOK - } - val isHintVisible = !exists && isValid + recipientAddressState + .flatMapLatest { recipientAddressState -> + combine( + observeWalletAccounts.require(), + observeContactByAddress(recipientAddressState.address) + ) { accounts, contact -> accounts to contact } + .flatMapLatest { (accounts, contact) -> + flow { + val exists = + contact != null || + accounts.any { it.unified.address.address == recipientAddressState.address } + val isValid = recipientAddressState.type?.isNotValid == false + val mode = + if (isValid) { + if (exists) { + SendAddressBookState.Mode.PICK_FROM_ADDRESS_BOOK + } else { + SendAddressBookState.Mode.ADD_TO_ADDRESS_BOOK + } + } else { + SendAddressBookState.Mode.PICK_FROM_ADDRESS_BOOK + } + val isHintVisible = !exists && isValid - emit( - SendAddressBookState( - mode = mode, - isHintVisible = isHintVisible, - onButtonClick = { onAddressBookButtonClicked(mode, recipientAddressState) } - ) - ) - - if (isHintVisible) { - delay(3.seconds) - emit( - SendAddressBookState( - mode = mode, - isHintVisible = false, - onButtonClick = { onAddressBookButtonClicked(mode, recipientAddressState) } + emit( + SendAddressBookState( + mode = mode, + isHintVisible = isHintVisible, + onButtonClick = { onAddressBookButtonClicked(mode, recipientAddressState) } + ) ) + + if (isHintVisible) { + delay(3.seconds) + emit( + SendAddressBookState( + mode = mode, + isHintVisible = false, + onButtonClick = { onAddressBookButtonClicked(mode, recipientAddressState) } + ) + ) + } + } + } + }.stateIn( + viewModelScope, + SharingStarted.WhileSubscribed(ANDROID_STATE_FLOW_TIMEOUT), + SendAddressBookState( + mode = SendAddressBookState.Mode.PICK_FROM_ADDRESS_BOOK, + isHintVisible = false, + onButtonClick = { + onAddressBookButtonClicked( + mode = SendAddressBookState.Mode.PICK_FROM_ADDRESS_BOOK, + recipient = recipientAddressState.value ) } - } - } - }.stateIn( - viewModelScope, - SharingStarted.WhileSubscribed(ANDROID_STATE_FLOW_TIMEOUT), - SendAddressBookState( - mode = SendAddressBookState.Mode.PICK_FROM_ADDRESS_BOOK, - isHintVisible = false, - onButtonClick = { - onAddressBookButtonClicked( - mode = SendAddressBookState.Mode.PICK_FROM_ADDRESS_BOOK, - recipient = recipientAddressState.value - ) - } + ) ) - ) init { viewModelScope.launch { diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/send/ext/MemoExt.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/send/ext/MemoExt.kt index 366a5f2c9..2789fb2ff 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/send/ext/MemoExt.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/send/ext/MemoExt.kt @@ -15,6 +15,4 @@ internal fun Memo.valueOrEmptyChar(): String { return valueOrEmptyChar(LocalContext.current) } -internal fun Memo.valueOrEmptyChar(context: Context): String { - return value.ifEmpty { context.getString(R.string.empty_char) } -} +internal fun Memo.valueOrEmptyChar(context: Context): String = value.ifEmpty { context.getString(R.string.empty_char) } diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/send/model/AmountState.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/send/model/AmountState.kt index cc1d26400..dd03a37c3 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/send/model/AmountState.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/send/model/AmountState.kt @@ -23,7 +23,10 @@ sealed interface AmountState { val zatoshi: Zatoshi ) : AmountState - data class Invalid(override val value: String, override val fiatValue: String) : AmountState + data class Invalid( + override val value: String, + override val fiatValue: String + ) : AmountState companion object { @Suppress("LongParameterList") diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/send/model/SendStage.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/send/model/SendStage.kt index 3d083288f..de1f16987 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/send/model/SendStage.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/send/model/SendStage.kt @@ -7,7 +7,9 @@ sealed class SendStage { data object Proposing : SendStage() - data class SendFailure(val error: String) : SendStage() + data class SendFailure( + val error: String + ) : SendStage() companion object { private const val TYPE_FORM = "form" // $NON-NLS diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/sendconfirmation/viewmodel/CreateTransactionsViewModel.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/sendconfirmation/viewmodel/CreateTransactionsViewModel.kt index 27fba951d..cfe56264e 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/sendconfirmation/viewmodel/CreateTransactionsViewModel.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/sendconfirmation/viewmodel/CreateTransactionsViewModel.kt @@ -22,13 +22,14 @@ class CreateTransactionsViewModel : ViewModel() { val submitResults = mutableListOf() return runCatching { - synchronizer.createProposedTransactions( - proposal = proposal, - usk = spendingKey - ).collect { submitResult -> - Twig.info { "Transaction submit result: $submitResult" } - submitResults.add(submitResult) - } + synchronizer + .createProposedTransactions( + proposal = proposal, + usk = spendingKey + ).collect { submitResult -> + Twig.info { "Transaction submit result: $submitResult" } + submitResults.add(submitResult) + } if (submitResults.find { it is TransactionSubmitResult.Failure } != null) { if (submitResults.size == 1) { // The first transaction submission failed - user might just be able to re-submit the transaction diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/settings/viewmodel/ScreenBrightnessViewModel.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/settings/viewmodel/ScreenBrightnessViewModel.kt index bf5b5f69d..310773e12 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/settings/viewmodel/ScreenBrightnessViewModel.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/settings/viewmodel/ScreenBrightnessViewModel.kt @@ -5,7 +5,9 @@ import androidx.lifecycle.AndroidViewModel import co.electriccoin.zcash.ui.design.component.ScreenBrightness import kotlinx.coroutines.flow.MutableStateFlow -class ScreenBrightnessViewModel(application: Application) : AndroidViewModel(application) { +class ScreenBrightnessViewModel( + application: Application +) : AndroidViewModel(application) { private val screenBrightness: MutableStateFlow = MutableStateFlow(ScreenBrightness) val screenBrightnessState = screenBrightness.value.referenceSwitch diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/signkeystonetransaction/viewmodel/SignKeystoneTransactionViewModel.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/signkeystonetransaction/viewmodel/SignKeystoneTransactionViewModel.kt index 1657f7e3d..bde23d842 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/signkeystonetransaction/viewmodel/SignKeystoneTransactionViewModel.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/signkeystonetransaction/viewmodel/SignKeystoneTransactionViewModel.kt @@ -66,8 +66,7 @@ class SignKeystoneTransactionViewModel( } else { null } - } - .stateIn( + }.stateIn( scope = viewModelScope, started = SharingStarted.WhileSubscribed(ANDROID_STATE_FLOW_TIMEOUT), initialValue = null diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/support/model/ConfigInfo.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/support/model/ConfigInfo.kt index c7942595c..a6aa7f111 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/support/model/ConfigInfo.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/support/model/ConfigInfo.kt @@ -6,7 +6,9 @@ import kotlinx.datetime.Instant // TODO [#1301]: Localize support text content // TODO [#1301]: https://github.com/Electric-Coin-Company/zashi-android/issues/1301 -data class ConfigInfo(val configurationUpdatedAt: Instant?) { +data class ConfigInfo( + val configurationUpdatedAt: Instant? +) { fun toSupportString() = buildString { append("Configuration: $configurationUpdatedAt") diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/support/model/CrashInfo.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/support/model/CrashInfo.kt index 062734187..82f2d0227 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/support/model/CrashInfo.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/support/model/CrashInfo.kt @@ -12,7 +12,11 @@ import java.io.File // TODO [#1301]: Localize feedback text content // TODO [#1301]: https://github.com/Electric-Coin-Company/zashi-android/issues/1301 -data class CrashInfo(val exceptionClassName: String, val isUncaught: Boolean, val timestamp: Instant) { +data class CrashInfo( + val exceptionClassName: String, + val isUncaught: Boolean, + val timestamp: Instant +) { fun toSupportString() = buildString { appendLine("Exception") diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/support/model/DeviceInfo.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/support/model/DeviceInfo.kt index f064bf0db..d645c74d6 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/support/model/DeviceInfo.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/support/model/DeviceInfo.kt @@ -5,7 +5,11 @@ import android.os.Build // TODO [#1301]: Localize support text content // TODO [#1301]: https://github.com/Electric-Coin-Company/zashi-android/issues/1301 -data class DeviceInfo(val manufacturer: String, val device: String, val model: String) { +data class DeviceInfo( + val manufacturer: String, + val device: String, + val model: String +) { fun toSupportString() = buildString { appendLine("Device: $manufacturer $device $model") diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/support/model/OperatingSystemInfo.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/support/model/OperatingSystemInfo.kt index da03fd828..4a8d55aab 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/support/model/OperatingSystemInfo.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/support/model/OperatingSystemInfo.kt @@ -6,7 +6,10 @@ import co.electriccoin.zcash.spackle.AndroidApiVersion // TODO [#1301]: Localize support text content // TODO [#1301]: https://github.com/Electric-Coin-Company/zashi-android/issues/1301 -data class OperatingSystemInfo(val sdkInt: Int, val isPreview: Boolean) { +data class OperatingSystemInfo( + val sdkInt: Int, + val isPreview: Boolean +) { fun toSupportString() = buildString { appendLine("Platform: Android") diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/support/model/PermissionInfo.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/support/model/PermissionInfo.kt index 3fa9eb7ff..37431e924 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/support/model/PermissionInfo.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/support/model/PermissionInfo.kt @@ -9,7 +9,10 @@ import co.electriccoin.zcash.spackle.getPackageInfoCompatSuspend // TODO [#1301]: Localize support text content // TODO [#1301]: https://github.com/Electric-Coin-Company/zashi-android/issues/1301 -data class PermissionInfo(val permissionName: String, val permissionStatus: PermissionStatus) { +data class PermissionInfo( + val permissionName: String, + val permissionStatus: PermissionStatus +) { fun toSupportString() = buildString { appendLine("$permissionName $permissionStatus") @@ -30,15 +33,14 @@ data class PermissionInfo(val permissionName: String, val permissionStatus: Perm context: Context, packageInfo: PackageInfo, permissionName: String - ): PermissionInfo { - return if (isPermissionGrantedByUser(context, permissionName)) { + ): PermissionInfo = + if (isPermissionGrantedByUser(context, permissionName)) { PermissionInfo(permissionName, PermissionStatus.Granted) } else if (isPermissionGrantedByManifest(packageInfo, permissionName)) { PermissionInfo(permissionName, PermissionStatus.NotGrantedByUser) } else { PermissionInfo(permissionName, PermissionStatus.NotGrantedByManifest) } - } private fun isPermissionGrantedByUser( context: Context, @@ -52,9 +54,7 @@ data class PermissionInfo(val permissionName: String, val permissionStatus: Perm private fun isPermissionGrantedByManifest( packageInfo: PackageInfo, permissionName: String - ): Boolean { - return packageInfo.requestedPermissions?.any { permissionName == it } ?: false - } + ): Boolean = packageInfo.requestedPermissions?.any { permissionName == it } ?: false } } diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/support/viewmodel/SupportViewModel.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/support/viewmodel/SupportViewModel.kt index 1a9c957bd..e7d0fa595 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/support/viewmodel/SupportViewModel.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/support/viewmodel/SupportViewModel.kt @@ -23,6 +23,5 @@ class SupportViewModel( val supportInfo: StateFlow = flow { emit(SupportInfo.new(application, androidConfigurationProvider)) - } - .stateIn(viewModelScope, SharingStarted.WhileSubscribed(ANDROID_STATE_FLOW_TIMEOUT, Duration.ZERO), null) + }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(ANDROID_STATE_FLOW_TIMEOUT, Duration.ZERO), null) } diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/transactiondetail/TransactionDetailView.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/transactiondetail/TransactionDetailView.kt index 8bd0facb5..419d703e8 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/transactiondetail/TransactionDetailView.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/transactiondetail/TransactionDetailView.kt @@ -169,8 +169,8 @@ private fun BottomBar( } } -fun getHeaderIconState(info: TransactionDetailInfoState): TransactionDetailIconHeaderState { - return TransactionDetailIconHeaderState( +fun getHeaderIconState(info: TransactionDetailInfoState): TransactionDetailIconHeaderState = + TransactionDetailIconHeaderState( when (info) { is ReceiveShieldedState -> listOf( @@ -204,7 +204,6 @@ fun getHeaderIconState(info: TransactionDetailInfoState): TransactionDetailIconH ) } ) -} @Composable private fun TransactionDetailTopAppBar( diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/transactiondetail/TransactionDetailViewModel.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/transactiondetail/TransactionDetailViewModel.kt index f85a9613a..166380992 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/transactiondetail/TransactionDetailViewModel.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/transactiondetail/TransactionDetailViewModel.kt @@ -66,38 +66,40 @@ class TransactionDetailViewModel( @OptIn(ExperimentalCoroutinesApi::class) val state = - transaction.filterNotNull().mapLatest { transaction -> - TransactionDetailState( - onBack = ::onBack, - header = createTransactionHeaderState(transaction), - info = createTransactionInfoState(transaction), - primaryButton = createPrimaryButtonState(transaction), - secondaryButton = - ButtonState( - text = - if (transaction.metadata?.note != null) { - stringRes(R.string.transaction_detail_edit_note) - } else { - stringRes(R.string.transaction_detail_add_a_note) - }, - onClick = ::onAddOrEditNoteClick - ), - bookmarkButton = - IconButtonState( - icon = - if (transaction.metadata?.isBookmarked == true) { - R.drawable.ic_transaction_detail_bookmark - } else { - R.drawable.ic_transaction_detail_no_bookmark - }, - onClick = ::onBookmarkClick - ) + transaction + .filterNotNull() + .mapLatest { transaction -> + TransactionDetailState( + onBack = ::onBack, + header = createTransactionHeaderState(transaction), + info = createTransactionInfoState(transaction), + primaryButton = createPrimaryButtonState(transaction), + secondaryButton = + ButtonState( + text = + if (transaction.metadata?.note != null) { + stringRes(R.string.transaction_detail_edit_note) + } else { + stringRes(R.string.transaction_detail_add_a_note) + }, + onClick = ::onAddOrEditNoteClick + ), + bookmarkButton = + IconButtonState( + icon = + if (transaction.metadata?.isBookmarked == true) { + R.drawable.ic_transaction_detail_bookmark + } else { + R.drawable.ic_transaction_detail_no_bookmark + }, + onClick = ::onBookmarkClick + ) + ) + }.stateIn( + scope = viewModelScope, + started = SharingStarted.WhileSubscribed(ANDROID_STATE_FLOW_TIMEOUT), + initialValue = null ) - }.stateIn( - scope = viewModelScope, - started = SharingStarted.WhileSubscribed(ANDROID_STATE_FLOW_TIMEOUT), - initialValue = null - ) init { viewModelScope.launch { @@ -114,8 +116,8 @@ class TransactionDetailViewModel( navigationRouter.forward(TransactionNote(transactionDetail.transactionId)) } - private fun createTransactionInfoState(transaction: DetailedTransactionData): TransactionDetailInfoState { - return when (transaction.transaction) { + private fun createTransactionInfoState(transaction: DetailedTransactionData): TransactionDetailInfoState = + when (transaction.transaction) { is SendTransaction -> { if (transaction.recipientAddress is WalletAddress.Transparent) { SendTransparentState( @@ -155,7 +157,8 @@ class TransactionDetailViewModel( completedTimestamp = createTimestampStringRes(transaction), memo = TransactionDetailMemosState( - transaction.memos.orEmpty() + transaction.memos + .orEmpty() .map { memo -> TransactionDetailMemoState( content = stringRes(memo), @@ -195,7 +198,8 @@ class TransactionDetailViewModel( completedTimestamp = createTimestampStringRes(transaction), memo = TransactionDetailMemosState( - transaction.memos.orEmpty() + transaction.memos + .orEmpty() .map { memo -> TransactionDetailMemoState( content = stringRes(memo), @@ -224,7 +228,6 @@ class TransactionDetailViewModel( ) } } - } private fun createFeeStringRes(data: DetailedTransactionData): StringResource { val feePaid = diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/transactiondetail/infoitems/TransactionDetailInfoMemo.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/transactiondetail/infoitems/TransactionDetailInfoMemo.kt index e42e1e77a..4519e86b0 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/transactiondetail/infoitems/TransactionDetailInfoMemo.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/transactiondetail/infoitems/TransactionDetailInfoMemo.kt @@ -162,8 +162,7 @@ private fun TransactionDetailInfoMemo( interactionSource = remember { MutableInteractionSource() }, onClick = state.bottomButton.onClick, role = Role.Button, - ) - .padding(12.dp), + ).padding(12.dp), verticalAlignment = CenterVertically ) { SelectionContainer { diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/transactionfilters/viewmodel/TransactionFiltersViewModel.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/transactionfilters/viewmodel/TransactionFiltersViewModel.kt index 10a469404..fdc80e6df 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/transactionfilters/viewmodel/TransactionFiltersViewModel.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/transactionfilters/viewmodel/TransactionFiltersViewModel.kt @@ -43,67 +43,68 @@ internal class TransactionFiltersViewModel( @OptIn(ExperimentalCoroutinesApi::class) val state: StateFlow = - selectedFilters.mapLatest { current -> - TransactionFiltersState( - filters = - TransactionFilter.entries.map { - when (it) { - SENT -> - TransactionFilterState( - text = stringRes(R.string.transaction_filters_sent), - isSelected = current.contains(SENT), - onClick = { onTransactionFilterClicked(it) } - ) - RECEIVED -> - TransactionFilterState( - text = stringRes(R.string.transaction_filters_received), - isSelected = current.contains(RECEIVED), - onClick = { onTransactionFilterClicked(it) } - ) - MEMOS -> - TransactionFilterState( - text = stringRes(R.string.transaction_filters_memos), - isSelected = current.contains(MEMOS), - onClick = { onTransactionFilterClicked(it) } - ) - UNREAD -> - TransactionFilterState( - text = stringRes(R.string.transaction_filters_unread), - isSelected = current.contains(UNREAD), - onClick = { onTransactionFilterClicked(it) } - ) - BOOKMARKED -> - TransactionFilterState( - text = stringRes(R.string.transaction_filters_bookmarked), - isSelected = current.contains(BOOKMARKED), - onClick = { onTransactionFilterClicked(it) } - ) - NOTES -> - TransactionFilterState( - text = stringRes(R.string.transaction_filters_notes), - isSelected = current.contains(NOTES), - onClick = { onTransactionFilterClicked(it) } - ) - } - }, - onBack = ::onBack, - onBottomSheetHidden = ::onBottomSheetHidden, - primaryButton = - ButtonState( - text = stringRes(R.string.transaction_filters_btn_apply), - onClick = ::onApplyTransactionFiltersClick, - ), - secondaryButton = - ButtonState( - text = stringRes(R.string.transaction_filters_btn_reset), - onClick = ::onResetTransactionFiltersClick, - ), + selectedFilters + .mapLatest { current -> + TransactionFiltersState( + filters = + TransactionFilter.entries.map { + when (it) { + SENT -> + TransactionFilterState( + text = stringRes(R.string.transaction_filters_sent), + isSelected = current.contains(SENT), + onClick = { onTransactionFilterClicked(it) } + ) + RECEIVED -> + TransactionFilterState( + text = stringRes(R.string.transaction_filters_received), + isSelected = current.contains(RECEIVED), + onClick = { onTransactionFilterClicked(it) } + ) + MEMOS -> + TransactionFilterState( + text = stringRes(R.string.transaction_filters_memos), + isSelected = current.contains(MEMOS), + onClick = { onTransactionFilterClicked(it) } + ) + UNREAD -> + TransactionFilterState( + text = stringRes(R.string.transaction_filters_unread), + isSelected = current.contains(UNREAD), + onClick = { onTransactionFilterClicked(it) } + ) + BOOKMARKED -> + TransactionFilterState( + text = stringRes(R.string.transaction_filters_bookmarked), + isSelected = current.contains(BOOKMARKED), + onClick = { onTransactionFilterClicked(it) } + ) + NOTES -> + TransactionFilterState( + text = stringRes(R.string.transaction_filters_notes), + isSelected = current.contains(NOTES), + onClick = { onTransactionFilterClicked(it) } + ) + } + }, + onBack = ::onBack, + onBottomSheetHidden = ::onBottomSheetHidden, + primaryButton = + ButtonState( + text = stringRes(R.string.transaction_filters_btn_apply), + onClick = ::onApplyTransactionFiltersClick, + ), + secondaryButton = + ButtonState( + text = stringRes(R.string.transaction_filters_btn_reset), + onClick = ::onResetTransactionFiltersClick, + ), + ) + }.stateIn( + viewModelScope, + SharingStarted.WhileSubscribed(ANDROID_STATE_FLOW_TIMEOUT), + null ) - }.stateIn( - viewModelScope, - SharingStarted.WhileSubscribed(ANDROID_STATE_FLOW_TIMEOUT), - null - ) private fun onTransactionFilterClicked(filter: TransactionFilter) { selectedFilters.update { diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/transactionhistory/Transaction.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/transactionhistory/Transaction.kt index e98b70f3a..7cfd395d6 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/transactionhistory/Transaction.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/transactionhistory/Transaction.kt @@ -66,8 +66,7 @@ fun Transaction( interactionSource = remember { MutableInteractionSource() }, onClick = state.onClick, role = Role.Button, - ) - .padding(contentPadding), + ).padding(contentPadding), verticalAlignment = Alignment.CenterVertically ) { Box { diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/transactionhistory/TransactionHistoryViewModel.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/transactionhistory/TransactionHistoryViewModel.kt index cef182936..5e4b5bc06 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/transactionhistory/TransactionHistoryViewModel.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/transactionhistory/TransactionHistoryViewModel.kt @@ -44,19 +44,20 @@ class TransactionHistoryViewModel( private val restoreTimestampDataSource: RestoreTimestampDataSource ) : ViewModel() { val search = - transactionFilterRepository.fulltextFilter.map { - TextFieldState(stringRes(it.orEmpty()), onValueChange = ::onFulltextFilterChanged) - }.stateIn( - scope = viewModelScope, - started = SharingStarted.WhileSubscribed(ANDROID_STATE_FLOW_TIMEOUT), - initialValue = - TextFieldState( - stringRes( - transactionFilterRepository.fulltextFilter.value.orEmpty() - ), - onValueChange = ::onFulltextFilterChanged - ) - ) + transactionFilterRepository.fulltextFilter + .map { + TextFieldState(stringRes(it.orEmpty()), onValueChange = ::onFulltextFilterChanged) + }.stateIn( + scope = viewModelScope, + started = SharingStarted.WhileSubscribed(ANDROID_STATE_FLOW_TIMEOUT), + initialValue = + TextFieldState( + stringRes( + transactionFilterRepository.fulltextFilter.value.orEmpty() + ), + onValueChange = ::onFulltextFilterChanged + ) + ) @OptIn(ExperimentalCoroutinesApi::class) val state = @@ -84,14 +85,15 @@ class TransactionHistoryViewModel( restoreTimestamp = restoreTimestampDataSource.getOrCreate() ) } - }.flowOn(Dispatchers.Default).stateIn( - scope = viewModelScope, - started = SharingStarted.Lazily, - initialValue = - createLoadingState( - filtersSize = 0, - ) - ) + }.flowOn(Dispatchers.Default) + .stateIn( + scope = viewModelScope, + started = SharingStarted.Lazily, + initialValue = + createLoadingState( + filtersSize = 0, + ) + ) override fun onCleared() { resetTransactionFilters() @@ -109,7 +111,9 @@ class TransactionHistoryViewModel( transactions .groupBy { val other = - it.transaction.timestamp?.atZone(ZoneId.systemDefault())?.toLocalDate() ?: now + it.transaction.timestamp + ?.atZone(ZoneId.systemDefault()) + ?.toLocalDate() ?: now when { now == other -> stringRes(R.string.transaction_history_today) to "today" @@ -128,8 +132,7 @@ class TransactionHistoryViewModel( stringRes(yearMonth) to yearMonth.toString() } } - } - .map { (entry, transactions) -> + }.map { (entry, transactions) -> val (headerStringRes, headerId) = entry listOf( TransactionHistoryItem.Header( @@ -147,8 +150,7 @@ class TransactionHistoryViewModel( ) ) } - } - .flatten() + }.flatten() return TransactionHistoryState.Data( onBack = ::onBack, diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/transactionnote/TransactionNote.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/transactionnote/TransactionNote.kt index 4a92b4937..02930eaf7 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/transactionnote/TransactionNote.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/transactionnote/TransactionNote.kt @@ -3,4 +3,6 @@ package co.electriccoin.zcash.ui.screen.transactionnote import kotlinx.serialization.Serializable @Serializable -data class TransactionNote(val txId: String) +data class TransactionNote( + val txId: String +) diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/transactionprogress/TransactionProgressView.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/transactionprogress/TransactionProgressView.kt index a99283a9c..30d65aa7b 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/transactionprogress/TransactionProgressView.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/transactionprogress/TransactionProgressView.kt @@ -608,8 +608,7 @@ private fun MultipleFailureTransaction( .background( shape = RoundedCornerShape(ZashiDimensions.Radius.radiusIg), color = ZashiColors.Inputs.Default.bg - ) - .padding( + ).padding( horizontal = ZashiDimensions.Spacing.spacingLg, vertical = ZashiDimensions.Spacing.spacingMd ) diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/whatsnew/model/WhatsNewState.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/whatsnew/model/WhatsNewState.kt index 4ef6d4716..c711f4e54 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/whatsnew/model/WhatsNewState.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/whatsnew/model/WhatsNewState.kt @@ -32,4 +32,7 @@ data class WhatsNewState( } } -data class WhatsNewSectionState(val title: StringResource, val content: StringResource) +data class WhatsNewSectionState( + val title: StringResource, + val content: StringResource +) diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/whatsnew/view/WhatsNewView.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/whatsnew/view/WhatsNewView.kt index 6264e5664..799c9aea3 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/whatsnew/view/WhatsNewView.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/whatsnew/view/WhatsNewView.kt @@ -108,12 +108,13 @@ private fun WhatsNewSection(state: WhatsNewSectionState) { val bulletRestLine = with(LocalDensity.current) { bulletStringWidth.toSp() } val bulletParagraphStyle = ParagraphStyle(textIndent = TextIndent(restLine = bulletRestLine)) val bulletStyle = - state.content.getValue().split("\n-") + state.content + .getValue() + .split("\n-") .filter { it.isNotBlank() } .map { it.replace("\n-", "").trim() - } - .let { text -> + }.let { text -> buildAnnotatedString { text.forEach { withStyle(style = bulletParagraphStyle) { diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/whatsnew/viewmodel/WhatsNewViewModel.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/whatsnew/viewmodel/WhatsNewViewModel.kt index ee0c6b9a9..5a377d5ec 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/whatsnew/viewmodel/WhatsNewViewModel.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/whatsnew/viewmodel/WhatsNewViewModel.kt @@ -12,7 +12,9 @@ import kotlinx.coroutines.flow.WhileSubscribed import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.stateIn -class WhatsNewViewModel(application: Application) : AndroidViewModel(application) { +class WhatsNewViewModel( + application: Application +) : AndroidViewModel(application) { val state: StateFlow = flow { val versionInfo = VersionInfo.new(application) diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/util/EmailUtil.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/util/EmailUtil.kt index 9558fd9c1..d7a88321f 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/util/EmailUtil.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/util/EmailUtil.kt @@ -57,8 +57,8 @@ object EmailUtil { recipientAddress: String, messageSubject: String, messageBody: String - ): Intent { - return Intent(Intent.ACTION_SEND).apply { + ): Intent = + Intent(Intent.ACTION_SEND).apply { type = RFC2822_MIMETPYE putExtra( Intent.EXTRA_EMAIL, @@ -69,7 +69,6 @@ object EmailUtil { putExtra(Intent.EXTRA_SUBJECT, messageSubject) putExtra(Intent.EXTRA_TEXT, messageBody) } - } // This approach combines both adding data to Uri and Extras to ensure that most of the available e-mail client // apps can understand the output Intent. Tested with Gmail, Proton mail, Yahoo, and Seznam.cz. diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/util/FileShareUtil.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/util/FileShareUtil.kt index f78fe26af..7262055c2 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/util/FileShareUtil.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/util/FileShareUtil.kt @@ -44,8 +44,8 @@ object FileShareUtil { shareText: String? = null, sharePickerText: String, versionInfo: VersionInfo, - ): Intent { - return newShareContentIntent( + ): Intent = + newShareContentIntent( context = context, file = File(dataFilePath), shareText = shareText, @@ -53,7 +53,6 @@ object FileShareUtil { versionInfo = versionInfo, fileType = fileType, ) - } internal fun newShareContentIntent( context: Context, @@ -84,15 +83,16 @@ object FileShareUtil { } val shareDataIntent = - Intent.createChooser( - dataIntent, - sharePickerText - ).apply { - addFlags( - SHARE_CONTENT_PERMISSION_FLAGS or - SHARE_OUTSIDE_THE_APP_FLAGS - ) - } + Intent + .createChooser( + dataIntent, + sharePickerText + ).apply { + addFlags( + SHARE_CONTENT_PERMISSION_FLAGS or + SHARE_OUTSIDE_THE_APP_FLAGS + ) + } return shareDataIntent } diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/util/FlowExt.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/util/FlowExt.kt index 0c464ff49..1d941ecfc 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/util/FlowExt.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/util/FlowExt.kt @@ -3,6 +3,5 @@ package co.electriccoin.zcash.ui.util import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.combine -inline fun List>.combineToFlow(): Flow> { - return combine(this.map { flow -> flow }) { items -> items.toList() } -} +inline fun List>.combineToFlow(): Flow> = + combine(this.map { flow -> flow }) { items -> items.toList() } diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/util/SettingsUtil.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/util/SettingsUtil.kt index 20f518504..05791bcd2 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/util/SettingsUtil.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/util/SettingsUtil.kt @@ -19,22 +19,20 @@ object SettingsUtil { * * @return Intent for launching the system Settings app */ - internal fun newSettingsIntent(packageName: String): Intent { - return Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).apply { + internal fun newSettingsIntent(packageName: String): Intent = + Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).apply { addCategory(Intent.CATEGORY_DEFAULT) data = Uri.parse("$SETTINGS_URI_PREFIX$packageName") flags = FLAGS } - } /** * Returns an intent to the system Storage Settings page. * * @return Intent for launching the system Settings app */ - internal fun newStorageSettingsIntent(): Intent { - return Intent(Settings.ACTION_INTERNAL_STORAGE_SETTINGS).apply { + internal fun newStorageSettingsIntent(): Intent = + Intent(Settings.ACTION_INTERNAL_STORAGE_SETTINGS).apply { flags = FLAGS } - } } diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/work/SyncWorker.kt b/ui-lib/src/main/java/co/electriccoin/zcash/work/SyncWorker.kt index 1c5f15de8..7a6fb6b14 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/work/SyncWorker.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/work/SyncWorker.kt @@ -43,7 +43,8 @@ import kotlin.time.toJavaDuration class SyncWorker( context: Context, workerParameters: WorkerParameters -) : CoroutineWorker(context, workerParameters), KoinComponent { +) : CoroutineWorker(context, workerParameters), + KoinComponent { private val observeSynchronizer: ObserveSynchronizerUseCase by inject() @OptIn(ExperimentalCoroutinesApi::class) @@ -59,12 +60,10 @@ class SyncWorker( Twig.debug { "BG Sync: result: $it" } } } ?: emptyFlow() - } - .takeWhile { + }.takeWhile { it.status != Synchronizer.Status.DISCONNECTED && it.status != Synchronizer.Status.SYNCED - } - .collect() + }.collect() Twig.debug { "BG Sync: terminating..." } @@ -83,7 +82,8 @@ class SyncWorker( Twig.debug { "BG Sync: necessary trigger delay time: $targetTimeDiff" } val constraints = - Constraints.Builder() + Constraints + .Builder() .setRequiresStorageNotLow(true) .setRequiredNetworkType(NetworkType.UNMETERED) .setRequiresCharging(true) @@ -117,11 +117,12 @@ class SyncWorker( Twig.debug { "BG Sync: calculated target time: ${targetTime.time}" } - return now.until( - other = targetTime.toInstant(currentTimeZone), - unit = DateTimeUnit.MILLISECOND, - timeZone = currentTimeZone - ).toDuration(DurationUnit.MILLISECONDS) + return now + .until( + other = targetTime.toInstant(currentTimeZone), + unit = DateTimeUnit.MILLISECOND, + timeZone = currentTimeZone + ).toDuration(DurationUnit.MILLISECONDS) } } } diff --git a/ui-lib/src/store/java/co/electriccoin/zcash/ui/screen/scan/util/QrCodeAnalyzerImpl.kt b/ui-lib/src/store/java/co/electriccoin/zcash/ui/screen/scan/util/QrCodeAnalyzerImpl.kt index 9f8bee901..76507227e 100644 --- a/ui-lib/src/store/java/co/electriccoin/zcash/ui/screen/scan/util/QrCodeAnalyzerImpl.kt +++ b/ui-lib/src/store/java/co/electriccoin/zcash/ui/screen/scan/util/QrCodeAnalyzerImpl.kt @@ -42,7 +42,8 @@ class QrCodeAnalyzerImpl( // Configure Barcode Scanner Options val options = - BarcodeScannerOptions.Builder() + BarcodeScannerOptions + .Builder() .setBarcodeFormats(supportedImageFormat) // We could optionally use this to enhance scan success ratio. If it's specified, then the library // will suggest zooming the camera if the barcode is too far away or too small to be detected. @@ -52,7 +53,8 @@ class QrCodeAnalyzerImpl( // Initialize Barcode Scanner val scanner = BarcodeScanning.getClient(options) - scanner.process(image) + scanner + .process(image) .addOnSuccessListener { barcodes -> for (barcode in barcodes) { barcode.rawValue?.let { value -> @@ -62,11 +64,9 @@ class QrCodeAnalyzerImpl( return@addOnSuccessListener } } - } - .addOnFailureListener { e -> + }.addOnFailureListener { e -> Twig.error(e) { "Barcode detection failed" } - } - .addOnCompleteListener { + }.addOnCompleteListener { // Close the image proxy imageProxy.close() } diff --git a/ui-screenshot-test/src/main/java/co/electroniccoin/zcash/ui/screenshot/ScreenshotTest.kt b/ui-screenshot-test/src/main/java/co/electroniccoin/zcash/ui/screenshot/ScreenshotTest.kt index 0ad78a7d5..fb8fb9e3a 100644 --- a/ui-screenshot-test/src/main/java/co/electroniccoin/zcash/ui/screenshot/ScreenshotTest.kt +++ b/ui-screenshot-test/src/main/java/co/electroniccoin/zcash/ui/screenshot/ScreenshotTest.kt @@ -191,17 +191,18 @@ class ScreenshotTest : UiTestPrerequisites() { composeTestRule.waitUntilDoesNotExist(hasTestTag(WELCOME_ANIM_TEST_TAG), DEFAULT_TIMEOUT_MILLISECONDS) - composeTestRule.onNodeWithText( - text = - resContext.getString( - R.string.onboarding_import_existing_wallet - ), - ignoreCase = true - ).also { - it.performScrollTo() - it.assertExists() - it.performClick() - } + composeTestRule + .onNodeWithText( + text = + resContext.getString( + R.string.onboarding_import_existing_wallet + ), + ignoreCase = true + ).also { + it.performScrollTo() + it.assertExists() + it.performClick() + } // To ensure that the new screen is available, or wait until it is composeTestRule.waitUntilAtLeastOneExists( @@ -228,21 +229,25 @@ class ScreenshotTest : UiTestPrerequisites() { } composeTestRule.waitUntil { - composeTestRule.activity.viewModels().value.userWordList.current.value.size == + composeTestRule.activity + .viewModels() + .value.userWordList.current.value.size == SeedPhrase.SEED_PHRASE_SIZE } - composeTestRule.onNodeWithText( - text = resContext.getString(R.string.restore_seed_button_next), - ignoreCase = true - ).also { - // Even with waiting for the word list in the view model, there's some latency before the button is enabled - composeTestRule.waitUntil(5.seconds.inWholeMilliseconds) { - runCatching { it.assertIsEnabled() }.isSuccess + composeTestRule + .onNodeWithText( + text = resContext.getString(R.string.restore_seed_button_next), + ignoreCase = true + ).also { + // Even with waiting for the word list in the view model, there's some latency before the button is + // enabled + composeTestRule.waitUntil(5.seconds.inWholeMilliseconds) { + runCatching { it.assertIsEnabled() }.isSuccess + } + it.performScrollTo() + it.performClick() } - it.performScrollTo() - it.performClick() - } composeTestRule.onNodeWithText(resContext.getString(R.string.restore_birthday_header)).also { it.assertExists() @@ -250,28 +255,31 @@ class ScreenshotTest : UiTestPrerequisites() { takeScreenshot(tag, "Import 3") - composeTestRule.onNodeWithText( - text = resContext.getString(R.string.restore_birthday_button_restore), - ignoreCase = true - ).also { - it.performScrollTo() - it.performClick() - } + composeTestRule + .onNodeWithText( + text = resContext.getString(R.string.restore_birthday_button_restore), + ignoreCase = true + ).also { + it.performScrollTo() + it.performClick() + } composeTestRule.waitUntil(DEFAULT_TIMEOUT_MILLISECONDS) { - composeTestRule.onNodeWithText( - text = resContext.getString(R.string.restore_success_button), - ignoreCase = true - ).exists() + composeTestRule + .onNodeWithText( + text = resContext.getString(R.string.restore_success_button), + ignoreCase = true + ).exists() } - composeTestRule.onNodeWithText( - text = resContext.getString(R.string.restore_success_button), - ignoreCase = true - ).also { - it.performScrollTo() - it.performClick() - } + composeTestRule + .onNodeWithText( + text = resContext.getString(R.string.restore_success_button), + ignoreCase = true + ).also { + it.performScrollTo() + it.performClick() + } composeTestRule.waitUntil(DEFAULT_TIMEOUT_MILLISECONDS) { composeTestRule.activity.walletViewModel.currentWalletSnapshot.value != null @@ -390,58 +398,64 @@ private fun onboardingScreenshots( } // Welcome screen - composeTestRule.onNodeWithText( - resContext.getString(R.string.onboarding_header, ZcashCurrency.getLocalizedName(resContext)), - useUnmergedTree = true - ).also { - it.assertExists() - ScreenshotTest.takeScreenshot(tag, "Onboarding 1") - } + composeTestRule + .onNodeWithText( + resContext.getString(R.string.onboarding_header, ZcashCurrency.getLocalizedName(resContext)), + useUnmergedTree = true + ).also { + it.assertExists() + ScreenshotTest.takeScreenshot(tag, "Onboarding 1") + } composeTestRule.waitUntilDoesNotExist(hasTestTag(WELCOME_ANIM_TEST_TAG), DEFAULT_TIMEOUT_MILLISECONDS) - composeTestRule.onNodeWithText( - text = resContext.getString(R.string.onboarding_create_new_wallet), - ignoreCase = true, - useUnmergedTree = true - ).also { - it.performClick() - } + composeTestRule + .onNodeWithText( + text = resContext.getString(R.string.onboarding_create_new_wallet), + ignoreCase = true, + useUnmergedTree = true + ).also { + it.performClick() + } // Security Warning screen - composeTestRule.onNodeWithText( - text = resContext.getString(R.string.security_warning_acknowledge), - ignoreCase = true, - useUnmergedTree = true - ).also { - it.assertExists() - it.performClick() - ScreenshotTest.takeScreenshot(tag, "Security Warning") - } - composeTestRule.onNodeWithText( - text = resContext.getString(R.string.security_warning_confirm), - ignoreCase = true, - useUnmergedTree = true - ).performClick() + composeTestRule + .onNodeWithText( + text = resContext.getString(R.string.security_warning_acknowledge), + ignoreCase = true, + useUnmergedTree = true + ).also { + it.assertExists() + it.performClick() + ScreenshotTest.takeScreenshot(tag, "Security Warning") + } + composeTestRule + .onNodeWithText( + text = resContext.getString(R.string.security_warning_confirm), + ignoreCase = true, + useUnmergedTree = true + ).performClick() composeTestRule.waitForIdle() composeTestRule.waitUntil { - composeTestRule.onNodeWithText( + composeTestRule + .onNodeWithText( + text = resContext.getString(R.string.seed_recovery_next_button), + ignoreCase = true, + useUnmergedTree = true + ).exists() + } + + composeTestRule + .onNodeWithText( text = resContext.getString(R.string.seed_recovery_next_button), ignoreCase = true, useUnmergedTree = true - ).exists() - } - - composeTestRule.onNodeWithText( - text = resContext.getString(R.string.seed_recovery_next_button), - ignoreCase = true, - useUnmergedTree = true - ).also { - it.performScrollTo() - it.performClick() - } + ).also { + it.performScrollTo() + it.performClick() + } } private fun accountScreenshots( @@ -480,11 +494,12 @@ private fun settingsScreenshots( tag: String, composeTestRule: ComposeTestRule ) { - composeTestRule.onNode( - hasText(resContext.getString(R.string.settings_feedback), ignoreCase = true) - ).also { - it.assertExists() - } + composeTestRule + .onNode( + hasText(resContext.getString(R.string.settings_feedback), ignoreCase = true) + ).also { + it.assertExists() + } ScreenshotTest.takeScreenshot(tag, "Settings 1") } @@ -494,14 +509,15 @@ private fun receiveZecScreenshots( tag: String, composeTestRule: AndroidComposeTestRule, MainActivity> ) { - composeTestRule.onNode( - hasText( - text = resContext.getString(R.string.receive_header), - ignoreCase = true - ) - ).also { - it.assertExists() - } + composeTestRule + .onNode( + hasText( + text = resContext.getString(R.string.receive_header), + ignoreCase = true + ) + ).also { + it.assertExists() + } ScreenshotTest.takeScreenshot(tag, "Receive 1") } @@ -525,13 +541,14 @@ private fun sendZecScreenshots( // Screenshot: Empty form ScreenshotTest.takeScreenshot(tag, "Send 1") - composeTestRule.onNode( - hasTestTag(SendTag.SEND_AMOUNT_FIELD) - ).also { - val separators = MonetarySeparators.current() + composeTestRule + .onNode( + hasTestTag(SendTag.SEND_AMOUNT_FIELD) + ).also { + val separators = MonetarySeparators.current() - it.performTextInput("0${separators.decimal}123") - } + it.performTextInput("0${separators.decimal}123") + } composeTestRule.onNodeWithText(resContext.getString(R.string.send_address_hint)).also { it.performTextInput(WalletAddressFixture.UNIFIED_ADDRESS_STRING) @@ -580,11 +597,12 @@ private fun aboutScreenshots( tag: String, composeTestRule: ComposeTestRule ) { - composeTestRule.onNode( - hasText(resContext.getString(R.string.about_title).uppercase()) - ).also { - it.assertExists() - } + composeTestRule + .onNode( + hasText(resContext.getString(R.string.about_title).uppercase()) + ).also { + it.assertExists() + } ScreenshotTest.takeScreenshot(tag, "About 1") } @@ -602,11 +620,10 @@ private fun seedScreenshots( } @Suppress("SwallowedException", "TooGenericExceptionCaught") -private fun SemanticsNodeInteraction.exists(): Boolean { - return try { +private fun SemanticsNodeInteraction.exists(): Boolean = + try { this.assertExists() true } catch (e: Throwable) { false } -} diff --git a/ui-screenshot-test/src/main/java/co/electroniccoin/zcash/ui/screenshot/ZcashUiTestRunner.kt b/ui-screenshot-test/src/main/java/co/electroniccoin/zcash/ui/screenshot/ZcashUiTestRunner.kt index d8b657f8c..3b7287501 100644 --- a/ui-screenshot-test/src/main/java/co/electroniccoin/zcash/ui/screenshot/ZcashUiTestRunner.kt +++ b/ui-screenshot-test/src/main/java/co/electroniccoin/zcash/ui/screenshot/ZcashUiTestRunner.kt @@ -21,9 +21,7 @@ class ZcashScreenshotTestRunner : ZcashUiTestRunner() { cl: ClassLoader?, className: String?, context: Context? - ): Application { - return super.newApplication(cl, ZcashUiTestApplication::class.java.name, context) - } + ): Application = super.newApplication(cl, ZcashUiTestApplication::class.java.name, context) } class ZcashUiTestApplication : Application() {