diff --git a/.github/workflows/docs.yaml b/.github/workflows/docs.yaml deleted file mode 100644 index e9205ae..0000000 --- a/.github/workflows/docs.yaml +++ /dev/null @@ -1,14 +0,0 @@ -name: Deploy Companion Documentation Website - -on: workflow_dispatch - -jobs: - deploy: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - uses: actions/setup-python@v2 - with: - python-version: 3.x - - run: pip install mkdocs-material - - run: mkdocs gh-deploy --force diff --git a/.github/workflows/format-check.yaml b/.github/workflows/format-check.yaml new file mode 100644 index 0000000..e297ed3 --- /dev/null +++ b/.github/workflows/format-check.yaml @@ -0,0 +1,25 @@ +name: Format Check + +on: [pull_request, workflow_dispatch] + +jobs: + format_check: + name: "Check Kotlin formatting" + runs-on: ubuntu-24.04 + steps: + - name: "Check out PR branch" + uses: actions/checkout@v4 + with: + fetch-depth: 1 + + - name: "Set up JDK" + uses: actions/setup-java@v4 + with: + distribution: temurin + java-version: 17 + + - name: "Download ktfmt" + run: curl -fsSLo ktfmt.jar https://github.com/facebook/ktfmt/releases/download/v0.64/ktfmt-0.64-with-dependencies.jar + + - name: "Check formatting" + run: java -jar ktfmt.jar --dry-run --set-exit-if-changed --kotlinlang-style --enable-editorconfig src/ diff --git a/justfile b/justfile index ff919f7..9d16e9a 100644 --- a/justfile +++ b/justfile @@ -17,3 +17,7 @@ docs-clean: rm -rf .venv/ rm -rf .cache/ rm -rf site/ + +# Format app using ktfmt +format: + ktfmt --kotlinlang-style --enable-editorconfig src/ diff --git a/src/org/bitcoindevkit/devkitwallet/data/Kyoto.kt b/src/org/bitcoindevkit/devkitwallet/data/Kyoto.kt index 9a73ceb..d4db8da 100644 --- a/src/org/bitcoindevkit/devkitwallet/data/Kyoto.kt +++ b/src/org/bitcoindevkit/devkitwallet/data/Kyoto.kt @@ -6,6 +6,7 @@ package org.bitcoindevkit.devkitwallet.data import android.util.Log +import kotlin.collections.listOf import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.Flow @@ -26,12 +27,12 @@ import org.bitcoindevkit.Update import org.bitcoindevkit.Wallet import org.bitcoindevkit.Warning import org.bitcoindevkit.Wtxid -import kotlin.collections.listOf private const val TAG = "KyotoClient" // TODO: Document this class well -class Kyoto private constructor( +class Kyoto +private constructor( private val kyotoNode: CbfNode, private val kyotoClient: CbfClient, ) { @@ -111,31 +112,27 @@ class Kyoto private constructor( fun create(wallet: Wallet, dataDir: String, network: Network): Kyoto { Log.i(TAG, "Starting Kyoto node") - val peers: List = when (network) { - Network.REGTEST -> { - val ip: IpAddress = IpAddress.fromIpv4(10u, 0u, 2u, 2u) - val peer1: Peer = Peer(ip, 18444u, false) - listOf(peer1) - } - - Network.SIGNET -> { - val ip: IpAddress = IpAddress.fromIpv4(68u, 47u, 229u, 218u) - val peer1: Peer = Peer(ip, null, false) - listOf(peer1) + val peers: List = + when (network) { + Network.REGTEST -> { + val ip: IpAddress = IpAddress.fromIpv4(10u, 0u, 2u, 2u) + val peer1: Peer = Peer(ip, 18444u, false) + listOf(peer1) + } + + Network.SIGNET -> { + val ip: IpAddress = IpAddress.fromIpv4(68u, 47u, 229u, 218u) + val peer1: Peer = Peer(ip, null, false) + listOf(peer1) + } + + else -> { + listOf() + } } - else -> { - listOf() - } - } - val (client, node) = - CbfBuilder() - .dataDir(dataDir) - .peers(peers) - .connections(1u) - .scanType(ScanType.Sync) - .build(wallet) + CbfBuilder().dataDir(dataDir).peers(peers).connections(1u).scanType(ScanType.Sync).build(wallet) return Kyoto(node, client).also { instance = it } } diff --git a/src/org/bitcoindevkit/devkitwallet/data/TxDetails.kt b/src/org/bitcoindevkit/devkitwallet/data/TxDetails.kt index 15036eb..685f36b 100644 --- a/src/org/bitcoindevkit/devkitwallet/data/TxDetails.kt +++ b/src/org/bitcoindevkit/devkitwallet/data/TxDetails.kt @@ -20,8 +20,6 @@ data class TxDetails( val confirmationTimestamp: Timestamp?, ) -@JvmInline -value class Timestamp(val timestamp: ULong) +@JvmInline value class Timestamp(val timestamp: ULong) -@JvmInline -value class ConfirmationBlock(val height: UInt) +@JvmInline value class ConfirmationBlock(val height: UInt) diff --git a/src/org/bitcoindevkit/devkitwallet/data/datastore/AppSettings.kt b/src/org/bitcoindevkit/devkitwallet/data/datastore/AppSettings.kt index 9f62427..4a5c80b 100644 --- a/src/org/bitcoindevkit/devkitwallet/data/datastore/AppSettings.kt +++ b/src/org/bitcoindevkit/devkitwallet/data/datastore/AppSettings.kt @@ -7,11 +7,11 @@ package org.bitcoindevkit.devkitwallet.data.datastore import androidx.datastore.core.CorruptionException import androidx.datastore.core.Serializer +import java.io.InputStream +import java.io.OutputStream import kotlinx.serialization.Serializable import kotlinx.serialization.SerializationException import kotlinx.serialization.json.Json -import java.io.InputStream -import java.io.OutputStream @Serializable data class AppSettings( diff --git a/src/org/bitcoindevkit/devkitwallet/data/datastore/WalletData.kt b/src/org/bitcoindevkit/devkitwallet/data/datastore/WalletData.kt index 760c811..6bd2c59 100644 --- a/src/org/bitcoindevkit/devkitwallet/data/datastore/WalletData.kt +++ b/src/org/bitcoindevkit/devkitwallet/data/datastore/WalletData.kt @@ -2,11 +2,11 @@ package org.bitcoindevkit.devkitwallet.data.datastore import androidx.datastore.core.CorruptionException import androidx.datastore.core.Serializer +import java.io.InputStream +import java.io.OutputStream import kotlinx.serialization.Serializable import kotlinx.serialization.SerializationException import kotlinx.serialization.json.Json -import java.io.InputStream -import java.io.OutputStream @Serializable enum class ActiveWalletNetwork { @@ -36,7 +36,7 @@ data class StoredWallet( @Serializable data class WalletData( - val wallets: List = emptyList(), + val wallets: List = emptyList() // network config fields go here alongside wallets ) diff --git a/src/org/bitcoindevkit/devkitwallet/domain/DwLogger.kt b/src/org/bitcoindevkit/devkitwallet/domain/DwLogger.kt index 293fff0..2c5d935 100644 --- a/src/org/bitcoindevkit/devkitwallet/domain/DwLogger.kt +++ b/src/org/bitcoindevkit/devkitwallet/domain/DwLogger.kt @@ -21,8 +21,7 @@ object DwLogger { } val millis = System.currentTimeMillis() val dateTime = - Instant - .ofEpochMilli(millis) + Instant.ofEpochMilli(millis) .atZone(ZoneId.systemDefault()) .toLocalDateTime() .truncatedTo(ChronoUnit.SECONDS) @@ -40,8 +39,7 @@ object DwLogger { enum class LogLevel { INFO, WARN, - ERROR, - ; + ERROR; override fun toString(): String { return when (this) { diff --git a/src/org/bitcoindevkit/devkitwallet/domain/Wallet.kt b/src/org/bitcoindevkit/devkitwallet/domain/Wallet.kt index 29fd725..7b29781 100644 --- a/src/org/bitcoindevkit/devkitwallet/domain/Wallet.kt +++ b/src/org/bitcoindevkit/devkitwallet/domain/Wallet.kt @@ -6,6 +6,7 @@ package org.bitcoindevkit.devkitwallet.domain import android.util.Log +import java.util.UUID import kotlinx.coroutines.runBlocking import org.bitcoindevkit.Address import org.bitcoindevkit.AddressInfo @@ -24,6 +25,7 @@ import org.bitcoindevkit.Psbt import org.bitcoindevkit.Script import org.bitcoindevkit.TxBuilder import org.bitcoindevkit.Update +import org.bitcoindevkit.Wallet as BdkWallet import org.bitcoindevkit.WordCount import org.bitcoindevkit.devkitwallet.data.ConfirmationBlock import org.bitcoindevkit.devkitwallet.data.NewWalletConfig @@ -35,12 +37,11 @@ import org.bitcoindevkit.devkitwallet.data.datastore.StoredWallet import org.bitcoindevkit.devkitwallet.domain.utils.intoDomain import org.bitcoindevkit.devkitwallet.domain.utils.intoProto import org.bitcoindevkit.devkitwallet.presentation.viewmodels.mvi.Recipient -import java.util.UUID -import org.bitcoindevkit.Wallet as BdkWallet private const val TAG = "Wallet" -class Wallet private constructor( +class Wallet +private constructor( val wallet: BdkWallet, private val walletSecrets: WalletSecrets, private val connection: Persister, @@ -161,7 +162,7 @@ class Wallet private constructor( feeRate, pending, confirmationBlock, - confirmationTimestamp + confirmationTimestamp, ) } } @@ -218,7 +219,7 @@ class Wallet private constructor( scriptType = ActiveWalletScriptType.P2WPKH, descriptor = descriptor.toStringWithSecret(), changeDescriptor = changeDescriptor.toStringWithSecret(), - recoveryPhrase = mnemonic.toString() + recoveryPhrase = mnemonic.toString(), ) // TODO: launch this correctly, not on the main thread // Save the new wallet to the datastore @@ -242,7 +243,7 @@ class Wallet private constructor( walletId = walletId, walletRepository = walletRepository, internalAppFilesPath = internalAppFilesPath, - network = newWalletConfig.network + network = newWalletConfig.network, ) } @@ -270,7 +271,7 @@ class Wallet private constructor( walletId = activeWallet.id, walletRepository = walletRepository, internalAppFilesPath = internalAppFilesPath, - network = activeWallet.network.intoDomain() + network = activeWallet.network.intoDomain(), ) } @@ -317,7 +318,7 @@ class Wallet private constructor( scriptType = ActiveWalletScriptType.P2WPKH, descriptor = descriptor.toStringWithSecret(), changeDescriptor = changeDescriptor.toStringWithSecret(), - recoveryPhrase = mnemonicString + recoveryPhrase = mnemonicString, ) // TODO: launch this correctly, not on the main thread @@ -341,7 +342,7 @@ class Wallet private constructor( walletId = walletId, walletRepository = walletRepository, internalAppFilesPath = internalAppFilesPath, - network = recoverWalletConfig.network + network = recoverWalletConfig.network, ) } } @@ -356,7 +357,7 @@ fun createScriptAppropriateDescriptor( ActiveWalletScriptType.P2WPKH -> Descriptor.newBip84(bip32ExtendedRootKey, keychain, NetworkKind.TEST) ActiveWalletScriptType.P2TR -> Descriptor.newBip86(bip32ExtendedRootKey, keychain, NetworkKind.TEST) ActiveWalletScriptType.UNKNOWN -> TODO() - // ActiveWalletScriptType.UNRECOGNIZED -> TODO() + // ActiveWalletScriptType.UNRECOGNIZED -> TODO() } } diff --git a/src/org/bitcoindevkit/devkitwallet/domain/WalletRepository.kt b/src/org/bitcoindevkit/devkitwallet/domain/WalletRepository.kt index 8c9e204..87ed05f 100644 --- a/src/org/bitcoindevkit/devkitwallet/domain/WalletRepository.kt +++ b/src/org/bitcoindevkit/devkitwallet/domain/WalletRepository.kt @@ -15,12 +15,12 @@ class WalletRepository(private val store: DataStore) { suspend fun addWallet(wallet: StoredWallet) = store.updateData { it.copy(wallets = it.wallets + wallet) } - suspend fun setFullScanCompleted(walletId: String) = - store.updateData { data -> - data.copy( - wallets = data.wallets.map { + suspend fun setFullScanCompleted(walletId: String) = store.updateData { data -> + data.copy( + wallets = + data.wallets.map { if (it.id == walletId) it.copy(fullScanCompleted = true) else it } - ) - } + ) + } } diff --git a/src/org/bitcoindevkit/devkitwallet/domain/utils/ProtobufExtensions.kt b/src/org/bitcoindevkit/devkitwallet/domain/utils/ProtobufExtensions.kt index d8d505b..ef2d21d 100644 --- a/src/org/bitcoindevkit/devkitwallet/domain/utils/ProtobufExtensions.kt +++ b/src/org/bitcoindevkit/devkitwallet/domain/utils/ProtobufExtensions.kt @@ -23,6 +23,6 @@ fun ActiveWalletNetwork.intoDomain(): Network { ActiveWalletNetwork.TESTNET -> Network.TESTNET ActiveWalletNetwork.SIGNET -> Network.SIGNET ActiveWalletNetwork.REGTEST -> Network.REGTEST - // ActiveWalletNetwork.UNRECOGNIZED -> throw IllegalArgumentException("Unrecognized network") + // ActiveWalletNetwork.UNRECOGNIZED -> throw IllegalArgumentException("Unrecognized network") } } diff --git a/src/org/bitcoindevkit/devkitwallet/presentation/DevkitWalletActivity.kt b/src/org/bitcoindevkit/devkitwallet/presentation/DevkitWalletActivity.kt index b064ded..58047fa 100644 --- a/src/org/bitcoindevkit/devkitwallet/presentation/DevkitWalletActivity.kt +++ b/src/org/bitcoindevkit/devkitwallet/presentation/DevkitWalletActivity.kt @@ -39,14 +39,16 @@ import org.bitcoindevkit.devkitwallet.presentation.theme.themeSurfaceColor import org.bitcoindevkit.devkitwallet.presentation.ui.screens.intro.OnboardingScreen private const val TAG = "DevkitWalletActivity" -private val Context.appSettingsStore: DataStore by dataStore( - fileName = "app_settings.json", - serializer = AppSettingsSerializer, -) -private val Context.walletDataStore: DataStore by dataStore( - fileName = "wallet_data.json", - serializer = WalletDataSerializer, -) +private val Context.appSettingsStore: DataStore by + dataStore( + fileName = "app_settings.json", + serializer = AppSettingsSerializer, + ) +private val Context.walletDataStore: DataStore by + dataStore( + fileName = "wallet_data.json", + serializer = WalletDataSerializer, + ) class DevkitWalletActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { @@ -112,17 +114,20 @@ class DevkitWalletActivity : ComponentActivity() { activeWallets = async { walletRepository.fetchWallets() - }.await() + } + .await() onboardingDone = async { appSettingsRepository.fetchIntroDone() - }.await() + } + .await() useDarkTheme = async { appSettingsRepository.fetchDarkTheme() - }.await() + } + .await() // Set the window background before allowing the UI to render for the first time, // so the correct surface color is already in place when Compose draws its first frame. diff --git a/src/org/bitcoindevkit/devkitwallet/presentation/navigation/AppNavigation.kt b/src/org/bitcoindevkit/devkitwallet/presentation/navigation/AppNavigation.kt index 48b1364..8c3af68 100644 --- a/src/org/bitcoindevkit/devkitwallet/presentation/navigation/AppNavigation.kt +++ b/src/org/bitcoindevkit/devkitwallet/presentation/navigation/AppNavigation.kt @@ -59,36 +59,28 @@ private val m3ForwardEnter: EnterTransition = slideInHorizontally( animationSpec = tween(ENTER_DURATION, easing = EmphasizedDecelerate), initialOffsetX = { SLIDE_DISTANCE_DP * 3 }, - ) + fadeIn( - animationSpec = tween(FADE_IN_DURATION, delayMillis = 50, easing = EmphasizedDecelerate), - ) + ) + fadeIn(animationSpec = tween(FADE_IN_DURATION, delayMillis = 50, easing = EmphasizedDecelerate)) // Forward: outgoing screen slides out to left and fades out (accelerate) private val m3ForwardExit: ExitTransition = slideOutHorizontally( animationSpec = tween(EXIT_DURATION, easing = EmphasizedAccelerate), targetOffsetX = { -SLIDE_DISTANCE_DP * 3 }, - ) + fadeOut( - animationSpec = tween(FADE_OUT_DURATION, easing = EmphasizedAccelerate), - ) + ) + fadeOut(animationSpec = tween(FADE_OUT_DURATION, easing = EmphasizedAccelerate)) // Backward: returning screen slides in from left and fades in (decelerate) private val m3BackwardEnter: EnterTransition = slideInHorizontally( animationSpec = tween(ENTER_DURATION, easing = EmphasizedDecelerate), initialOffsetX = { -SLIDE_DISTANCE_DP * 3 }, - ) + fadeIn( - animationSpec = tween(FADE_IN_DURATION, delayMillis = 50, easing = EmphasizedDecelerate), - ) + ) + fadeIn(animationSpec = tween(FADE_IN_DURATION, delayMillis = 50, easing = EmphasizedDecelerate)) // Backward: outgoing screen slides out to right and fades out (accelerate) private val m3BackwardExit: ExitTransition = slideOutHorizontally( animationSpec = tween(EXIT_DURATION, easing = EmphasizedAccelerate), targetOffsetX = { SLIDE_DISTANCE_DP * 3 }, - ) + fadeOut( - animationSpec = tween(FADE_OUT_DURATION, easing = EmphasizedAccelerate), - ) + ) + fadeOut(animationSpec = tween(FADE_OUT_DURATION, easing = EmphasizedAccelerate)) @Composable fun AppNavigation( @@ -129,7 +121,7 @@ fun AppNavigation( ActiveWalletsScreen( activeWallets = activeWallets, navController = navController, - onBuildWalletButtonClicked + onBuildWalletButtonClicked, ) } diff --git a/src/org/bitcoindevkit/devkitwallet/presentation/navigation/Destinations.kt b/src/org/bitcoindevkit/devkitwallet/presentation/navigation/Destinations.kt index 917f863..fe5e3c6 100644 --- a/src/org/bitcoindevkit/devkitwallet/presentation/navigation/Destinations.kt +++ b/src/org/bitcoindevkit/devkitwallet/presentation/navigation/Destinations.kt @@ -8,52 +8,36 @@ package org.bitcoindevkit.devkitwallet.presentation.navigation import kotlinx.serialization.Serializable // Create wallet navigation destinations -@Serializable -object WalletChoiceScreen +@Serializable object WalletChoiceScreen -@Serializable -object ActiveWalletsScreen +@Serializable object ActiveWalletsScreen -@Serializable -object CreateNewWalletScreen +@Serializable object CreateNewWalletScreen -@Serializable -object WalletRecoveryScreen +@Serializable object WalletRecoveryScreen // Home navigation destinations -@Serializable -object SettingsScreen +@Serializable object SettingsScreen -@Serializable -object AboutScreen +@Serializable object AboutScreen -@Serializable -object RecoveryPhraseScreen +@Serializable object RecoveryPhraseScreen -@Serializable -object BlockchainClientScreen +@Serializable object BlockchainClientScreen -@Serializable -object LogsScreen +@Serializable object LogsScreen -@Serializable -object ThemeScreen +@Serializable object ThemeScreen // Wallet navigation destinations -@Serializable -object HomeScreen +@Serializable object HomeScreen -@Serializable -object ReceiveScreen +@Serializable object ReceiveScreen -@Serializable -object SendScreen +@Serializable object SendScreen -@Serializable -object TransactionHistoryScreen +@Serializable object TransactionHistoryScreen -@Serializable -data class TransactionScreen(val txid: String) +@Serializable data class TransactionScreen(val txid: String) -@Serializable -data class RbfScreen(val txid: String) +@Serializable data class RbfScreen(val txid: String) diff --git a/src/org/bitcoindevkit/devkitwallet/presentation/theme/Fonts.kt b/src/org/bitcoindevkit/devkitwallet/presentation/theme/Fonts.kt index c1843ba..23f5869 100644 --- a/src/org/bitcoindevkit/devkitwallet/presentation/theme/Fonts.kt +++ b/src/org/bitcoindevkit/devkitwallet/presentation/theme/Fonts.kt @@ -35,7 +35,7 @@ val googleSansCode = resId = R.font.google_sans_code_light, weight = FontWeight.Light, style = FontStyle.Normal, - ), + ) ) val inter = diff --git a/src/org/bitcoindevkit/devkitwallet/presentation/theme/Theme.kt b/src/org/bitcoindevkit/devkitwallet/presentation/theme/Theme.kt index f2e9f60..c8c5ea3 100644 --- a/src/org/bitcoindevkit/devkitwallet/presentation/theme/Theme.kt +++ b/src/org/bitcoindevkit/devkitwallet/presentation/theme/Theme.kt @@ -11,39 +11,41 @@ import androidx.compose.material3.lightColorScheme import androidx.compose.runtime.Composable import androidx.compose.ui.graphics.Color -private val NightGlowColorScheme = darkColorScheme( - surface = Color(0xFF1C1B1F), - onSurface = Color(0xFFE6E1E5), - surfaceVariant = Color(0xFF49454F), - onSurfaceVariant = Color(0xFFCAC4D0), - background = Color(0xFF1C1B1F), - onBackground = Color(0xFFE6E1E5), - outline = Color(0xFFCAC4D0), - outlineVariant = Color(0xFF49454F), - primary = Color(0xFFF2D2B6), - onPrimary = Color(0xFF1C1B1F), - secondary = Color(0xFFC6B2E0), - onSecondary = Color(0xFF1C1B1F), - tertiary = Color(0xFF8FD998), - onTertiary = Color(0xFF1C1B1F), -) +private val NightGlowColorScheme = + darkColorScheme( + surface = Color(0xFF1C1B1F), + onSurface = Color(0xFFE6E1E5), + surfaceVariant = Color(0xFF49454F), + onSurfaceVariant = Color(0xFFCAC4D0), + background = Color(0xFF1C1B1F), + onBackground = Color(0xFFE6E1E5), + outline = Color(0xFFCAC4D0), + outlineVariant = Color(0xFF49454F), + primary = Color(0xFFF2D2B6), + onPrimary = Color(0xFF1C1B1F), + secondary = Color(0xFFC6B2E0), + onSecondary = Color(0xFF1C1B1F), + tertiary = Color(0xFF8FD998), + onTertiary = Color(0xFF1C1B1F), + ) -private val DayGlowColorScheme = lightColorScheme( - surface = Color(0xFFFFF8F4), - onSurface = Color(0xFF1C1B1F), - surfaceVariant = Color(0xFFEDE5DF), - onSurfaceVariant = Color(0xFF49454F), - background = Color(0xFFFFF8F4), - onBackground = Color(0xFF1C1B1F), - outline = Color(0xFF79747E), - outlineVariant = Color(0xFFCAC4D0), - primary = Color(0xFF7D5260), - onPrimary = Color(0xFFFFFFFF), - secondary = Color(0xFF625B71), - onSecondary = Color(0xFFFFFFFF), - tertiary = Color(0xFF2E6A3C), - onTertiary = Color(0xFFFFFFFF), -) +private val DayGlowColorScheme = + lightColorScheme( + surface = Color(0xFFFFF8F4), + onSurface = Color(0xFF1C1B1F), + surfaceVariant = Color(0xFFEDE5DF), + onSurfaceVariant = Color(0xFF49454F), + background = Color(0xFFFFF8F4), + onBackground = Color(0xFF1C1B1F), + outline = Color(0xFF79747E), + outlineVariant = Color(0xFFCAC4D0), + primary = Color(0xFF7D5260), + onPrimary = Color(0xFFFFFFFF), + secondary = Color(0xFF625B71), + onSecondary = Color(0xFFFFFFFF), + tertiary = Color(0xFF2E6A3C), + onTertiary = Color(0xFFFFFFFF), + ) // Returns the surface color for the given theme as an ARGB int for use outside of Compose (e.g. // setting the window background from the Activity). Keeps the values co-located with the color diff --git a/src/org/bitcoindevkit/devkitwallet/presentation/theme/Type.kt b/src/org/bitcoindevkit/devkitwallet/presentation/theme/Type.kt index b18f25e..a58037d 100644 --- a/src/org/bitcoindevkit/devkitwallet/presentation/theme/Type.kt +++ b/src/org/bitcoindevkit/devkitwallet/presentation/theme/Type.kt @@ -18,5 +18,5 @@ internal val devkitTypography = fontWeight = FontWeight.Normal, fontSize = 16.sp, lineHeight = 28.sp, - ), + ) ) diff --git a/src/org/bitcoindevkit/devkitwallet/presentation/ui/components/CustomSnackbar.kt b/src/org/bitcoindevkit/devkitwallet/presentation/ui/components/CustomSnackbar.kt index 8f98067..cc1b915 100644 --- a/src/org/bitcoindevkit/devkitwallet/presentation/ui/components/CustomSnackbar.kt +++ b/src/org/bitcoindevkit/devkitwallet/presentation/ui/components/CustomSnackbar.kt @@ -26,9 +26,7 @@ fun CustomSnackbar(data: SnackbarData) { Snackbar( modifier = Modifier.padding(12.dp), action = { - IconButton( - onClick = { data.performAction() }, - ) { + IconButton(onClick = { data.performAction() }) { Icon( imageVector = Lucide.X, contentDescription = "Ok", diff --git a/src/org/bitcoindevkit/devkitwallet/presentation/ui/components/LoadingAnimation.kt b/src/org/bitcoindevkit/devkitwallet/presentation/ui/components/LoadingAnimation.kt index 50fc018..9ce89b3 100644 --- a/src/org/bitcoindevkit/devkitwallet/presentation/ui/components/LoadingAnimation.kt +++ b/src/org/bitcoindevkit/devkitwallet/presentation/ui/components/LoadingAnimation.kt @@ -49,10 +49,7 @@ fun LoadingAnimation( targetValue = 1f, animationSpec = infiniteRepeatable( - animation = - tween( - durationMillis = animationDelay, - ), + animation = tween(durationMillis = animationDelay), repeatMode = RepeatMode.Reverse, ), ) @@ -67,10 +64,9 @@ fun LoadingAnimation( Box( modifier = - Modifier - .size(size = circleSize) + Modifier.size(size = circleSize) .clip(shape = CircleShape) - .background(circleColor.copy(alpha = animatable.value)), + .background(circleColor.copy(alpha = animatable.value)) ) } } diff --git a/src/org/bitcoindevkit/devkitwallet/presentation/ui/components/NeutralButton.kt b/src/org/bitcoindevkit/devkitwallet/presentation/ui/components/NeutralButton.kt index f44b605..4f815e5 100644 --- a/src/org/bitcoindevkit/devkitwallet/presentation/ui/components/NeutralButton.kt +++ b/src/org/bitcoindevkit/devkitwallet/presentation/ui/components/NeutralButton.kt @@ -30,11 +30,7 @@ fun NeutralButton(text: String, enabled: Boolean, modifier: Modifier? = null, on ), shape = RoundedCornerShape(16.dp), enabled = enabled, - modifier = - modifier ?: Modifier - .height(60.dp) - .fillMaxWidth(0.9f) - .padding(vertical = 4.dp, horizontal = 8.dp), + modifier = modifier ?: Modifier.height(60.dp).fillMaxWidth(0.9f).padding(vertical = 4.dp, horizontal = 8.dp), ) { Text( text = text, diff --git a/src/org/bitcoindevkit/devkitwallet/presentation/ui/components/RadioButtonWithLabel.kt b/src/org/bitcoindevkit/devkitwallet/presentation/ui/components/RadioButtonWithLabel.kt index 9a702da..4ef40a6 100644 --- a/src/org/bitcoindevkit/devkitwallet/presentation/ui/components/RadioButtonWithLabel.kt +++ b/src/org/bitcoindevkit/devkitwallet/presentation/ui/components/RadioButtonWithLabel.kt @@ -29,8 +29,7 @@ fun RadioButtonWithLabel(label: String, isSelected: Boolean, onSelect: () -> Uni verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(4.dp), modifier = - Modifier - .padding(0.dp) + Modifier.padding(0.dp) .selectable( selected = isSelected, onClick = onSelect, @@ -44,20 +43,14 @@ fun RadioButtonWithLabel(label: String, isSelected: Boolean, onSelect: () -> Uni selectedColor = colorScheme.primary, unselectedColor = colorScheme.outline, ), - modifier = - Modifier - .padding(start = 8.dp) - .size(40.dp), + modifier = Modifier.padding(start = 8.dp).size(40.dp), ) Text( text = label, color = colorScheme.onSurface, fontFamily = inter, fontSize = 12.sp, - modifier = - Modifier - .clickable(onClick = onSelect) - .padding(0.dp), + modifier = Modifier.clickable(onClick = onSelect).padding(0.dp), ) } } diff --git a/src/org/bitcoindevkit/devkitwallet/presentation/ui/components/SecondaryScreensAppBar.kt b/src/org/bitcoindevkit/devkitwallet/presentation/ui/components/SecondaryScreensAppBar.kt index f572c5b..37d25a8 100644 --- a/src/org/bitcoindevkit/devkitwallet/presentation/ui/components/SecondaryScreensAppBar.kt +++ b/src/org/bitcoindevkit/devkitwallet/presentation/ui/components/SecondaryScreensAppBar.kt @@ -42,8 +42,6 @@ internal fun SecondaryScreensAppBar(title: String, navigation: () -> Unit) { ) } }, - colors = TopAppBarDefaults.topAppBarColors( - containerColor = colorScheme.surface, - ), + colors = TopAppBarDefaults.topAppBarColors(containerColor = colorScheme.surface), ) } diff --git a/src/org/bitcoindevkit/devkitwallet/presentation/ui/components/TransactionCards.kt b/src/org/bitcoindevkit/devkitwallet/presentation/ui/components/TransactionCards.kt index f2b04b1..2bfc565 100644 --- a/src/org/bitcoindevkit/devkitwallet/presentation/ui/components/TransactionCards.kt +++ b/src/org/bitcoindevkit/devkitwallet/presentation/ui/components/TransactionCards.kt @@ -38,17 +38,18 @@ private const val TAG = "TransactionCards" fun ConfirmedTransactionCard(details: TxDetails, navController: NavController) { val colorScheme = MaterialTheme.colorScheme Row( - Modifier - .padding(horizontal = 8.dp, vertical = 6.dp) + Modifier.padding(horizontal = 8.dp, vertical = 6.dp) .fillMaxWidth() .background( color = colorScheme.surfaceVariant.copy(alpha = 0.5f), shape = RoundedCornerShape(16.dp), - ).border( + ) + .border( width = 1.dp, color = colorScheme.outline.copy(alpha = 0.08f), shape = RoundedCornerShape(16.dp), - ).clickable { viewTransaction(navController = navController, txid = details.txid) }, + ) + .clickable { viewTransaction(navController = navController, txid = details.txid) }, verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.Absolute.SpaceBetween, ) { @@ -62,12 +63,11 @@ fun ConfirmedTransactionCard(details: TxDetails, navController: NavController) { ) Box( modifier = - Modifier - .padding(top = 16.dp, end = 16.dp) + Modifier.padding(top = 16.dp, end = 16.dp) .size(24.dp) .clip(shape = CircleShape) .background(colorScheme.tertiary.copy(alpha = 0.6f)) - .align(Alignment.Top), + .align(Alignment.Top) ) } } @@ -76,17 +76,18 @@ fun ConfirmedTransactionCard(details: TxDetails, navController: NavController) { fun PendingTransactionCard(details: TxDetails, navController: NavController) { val colorScheme = MaterialTheme.colorScheme Row( - Modifier - .padding(horizontal = 8.dp, vertical = 6.dp) + Modifier.padding(horizontal = 8.dp, vertical = 6.dp) .fillMaxWidth() .background( color = colorScheme.surfaceVariant.copy(alpha = 0.5f), shape = RoundedCornerShape(16.dp), - ).border( + ) + .border( width = 1.5.dp, color = DayGlowHistoryAccent.copy(alpha = 0.5f), shape = RoundedCornerShape(16.dp), - ).clickable { + ) + .clickable { viewTransaction( navController = navController, txid = details.txid, @@ -104,12 +105,11 @@ fun PendingTransactionCard(details: TxDetails, navController: NavController) { ) Box( modifier = - Modifier - .padding(top = 16.dp, end = 16.dp) + Modifier.padding(top = 16.dp, end = 16.dp) .size(24.dp) .clip(shape = CircleShape) .background(DayGlowHistoryAccent.copy(alpha = 0.6f)) - .align(Alignment.Top), + .align(Alignment.Top) ) } } diff --git a/src/org/bitcoindevkit/devkitwallet/presentation/ui/components/WalletOptionsCard.kt b/src/org/bitcoindevkit/devkitwallet/presentation/ui/components/WalletOptionsCard.kt index b5d5c41..9cd04af 100644 --- a/src/org/bitcoindevkit/devkitwallet/presentation/ui/components/WalletOptionsCard.kt +++ b/src/org/bitcoindevkit/devkitwallet/presentation/ui/components/WalletOptionsCard.kt @@ -35,8 +35,7 @@ fun WalletOptionsCard( ) { val colorScheme = MaterialTheme.colorScheme Column( - Modifier - .fillMaxWidth() + Modifier.fillMaxWidth() .background( color = colorScheme.surfaceVariant, shape = RoundedCornerShape(16.dp), @@ -49,10 +48,7 @@ fun WalletOptionsCard( fontFamily = inter, fontSize = 14.sp, color = colorScheme.onSurface, - modifier = - Modifier - .align(Alignment.CenterHorizontally) - .padding(top = 8.dp, bottom = 8.dp), + modifier = Modifier.align(Alignment.CenterHorizontally).padding(top = 8.dp, bottom = 8.dp), ) HorizontalDivider( @@ -75,10 +71,7 @@ fun WalletOptionsCard( fontFamily = inter, fontSize = 14.sp, color = colorScheme.onSurface, - modifier = - Modifier - .align(Alignment.CenterHorizontally) - .padding(top = 16.dp, bottom = 8.dp), + modifier = Modifier.align(Alignment.CenterHorizontally).padding(top = 16.dp, bottom = 8.dp), ) HorizontalDivider( @@ -102,8 +95,7 @@ fun WalletOptionsCard( fun NetworkOptionsCard(selectedNetwork: MutableState) { val colorScheme = MaterialTheme.colorScheme Column( - Modifier - .fillMaxWidth() + Modifier.fillMaxWidth() .background( color = colorScheme.surfaceVariant, shape = RoundedCornerShape(16.dp), @@ -116,10 +108,7 @@ fun NetworkOptionsCard(selectedNetwork: MutableState) { fontFamily = inter, fontSize = 14.sp, color = colorScheme.onSurface, - modifier = - Modifier - .align(Alignment.CenterHorizontally) - .padding(top = 8.dp, bottom = 8.dp), + modifier = Modifier.align(Alignment.CenterHorizontally).padding(top = 8.dp, bottom = 8.dp), ) HorizontalDivider( diff --git a/src/org/bitcoindevkit/devkitwallet/presentation/ui/screens/intro/ActiveWalletsScreen.kt b/src/org/bitcoindevkit/devkitwallet/presentation/ui/screens/intro/ActiveWalletsScreen.kt index ff638d3..958b72c 100644 --- a/src/org/bitcoindevkit/devkitwallet/presentation/ui/screens/intro/ActiveWalletsScreen.kt +++ b/src/org/bitcoindevkit/devkitwallet/presentation/ui/screens/intro/ActiveWalletsScreen.kt @@ -51,13 +51,10 @@ internal fun ActiveWalletsScreen( Scaffold( topBar = { SecondaryScreensAppBar(title = "Choose a Wallet", navigation = { navController.navigateUp() }) - }, + } ) { paddingValues -> Column( - modifier = Modifier - .fillMaxSize() - .padding(paddingValues) - .padding(horizontal = 24.dp, vertical = 16.dp), + modifier = Modifier.fillMaxSize().padding(paddingValues).padding(horizontal = 24.dp, vertical = 16.dp), verticalArrangement = Arrangement.spacedBy(10.dp), ) { if (activeWallets.isEmpty()) { @@ -79,9 +76,7 @@ internal fun ActiveWalletsScreen( colors = CardDefaults.outlinedCardColors(containerColor = Color.Transparent), ) { Row( - modifier = Modifier - .fillMaxWidth() - .padding(20.dp), + modifier = Modifier.fillMaxWidth().padding(20.dp), verticalAlignment = Alignment.CenterVertically, ) { Column(modifier = Modifier.weight(1f)) { @@ -123,7 +118,6 @@ private fun WalletChip(text: String) { fontSize = 11.sp, fontWeight = FontWeight.Medium, color = colorScheme.onSurfaceVariant, - modifier = Modifier - .padding(0.dp), + modifier = Modifier.padding(0.dp), ) } diff --git a/src/org/bitcoindevkit/devkitwallet/presentation/ui/screens/intro/CreateNewWallet.kt b/src/org/bitcoindevkit/devkitwallet/presentation/ui/screens/intro/CreateNewWallet.kt index 3da5792..a40ea8e 100644 --- a/src/org/bitcoindevkit/devkitwallet/presentation/ui/screens/intro/CreateNewWallet.kt +++ b/src/org/bitcoindevkit/devkitwallet/presentation/ui/screens/intro/CreateNewWallet.kt @@ -58,21 +58,17 @@ internal fun CreateNewWalletScreen( val walletName = remember { mutableStateOf("") } val selectedNetwork: MutableState = remember { mutableStateOf(Network.SIGNET) } - val selectedScriptType: MutableState = - remember { mutableStateOf(ActiveWalletScriptType.P2TR) } + val selectedScriptType: MutableState = remember { + mutableStateOf(ActiveWalletScriptType.P2TR) + } val scriptTypes = listOf(ActiveWalletScriptType.P2TR, ActiveWalletScriptType.P2WPKH) Scaffold( topBar = { SecondaryScreensAppBar(title = "Create a New Wallet", navigation = { navController.navigateUp() }) - }, + } ) { paddingValues -> - Column( - modifier = Modifier - .fillMaxSize() - .padding(paddingValues) - .padding(horizontal = 24.dp), - ) { + Column(modifier = Modifier.fillMaxSize().padding(paddingValues).padding(horizontal = 24.dp)) { Spacer(Modifier.height(20.dp)) // Wallet name @@ -91,11 +87,12 @@ internal fun CreateNewWalletScreen( }, singleLine = true, textStyle = TextStyle(fontFamily = inter, color = colorScheme.onSurface, fontSize = 15.sp), - colors = OutlinedTextFieldDefaults.colors( - cursorColor = colorScheme.primary, - focusedBorderColor = colorScheme.primary.copy(alpha = 0.40f), - unfocusedBorderColor = colorScheme.outline.copy(alpha = 0.15f), - ), + colors = + OutlinedTextFieldDefaults.colors( + cursorColor = colorScheme.primary, + focusedBorderColor = colorScheme.primary.copy(alpha = 0.40f), + unfocusedBorderColor = colorScheme.outline.copy(alpha = 0.15f), + ), shape = RoundedCornerShape(16.dp), ) @@ -132,22 +129,22 @@ internal fun CreateNewWalletScreen( // Create button Button( onClick = { - val newWalletConfig = NewWalletConfig( - name = walletName.value, - network = selectedNetwork.value, - scriptType = selectedScriptType.value, - ) + val newWalletConfig = + NewWalletConfig( + name = walletName.value, + network = selectedNetwork.value, + scriptType = selectedScriptType.value, + ) DwLogger.log(INFO, "Creating new wallet named ${newWalletConfig.name}") onBuildWalletButtonClicked(WalletCreateType.FROMSCRATCH(newWalletConfig)) }, - modifier = Modifier - .fillMaxWidth() - .height(56.dp), + modifier = Modifier.fillMaxWidth().height(56.dp), shape = RoundedCornerShape(20.dp), - colors = ButtonDefaults.buttonColors( - containerColor = colorScheme.tertiary, - contentColor = colorScheme.onTertiary, - ), + colors = + ButtonDefaults.buttonColors( + containerColor = colorScheme.tertiary, + contentColor = colorScheme.onTertiary, + ), ) { Text( text = "Create Wallet", @@ -178,13 +175,14 @@ internal fun FormLabel(text: String) { internal fun OptionGroup(content: @Composable () -> Unit) { val colorScheme = MaterialTheme.colorScheme Column( - modifier = Modifier - .fillMaxWidth() - .border( - width = 1.5.dp, - color = colorScheme.outline.copy(alpha = 0.10f), - shape = RoundedCornerShape(20.dp), - ).padding(8.dp), + modifier = + Modifier.fillMaxWidth() + .border( + width = 1.5.dp, + color = colorScheme.outline.copy(alpha = 0.10f), + shape = RoundedCornerShape(20.dp), + ) + .padding(8.dp) ) { content() } @@ -196,27 +194,23 @@ internal fun ThemedRadioOption(label: String, isSelected: Boolean, onSelect: () Row( verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(10.dp), - modifier = Modifier - .fillMaxWidth() - .selectable(selected = isSelected, onClick = onSelect) - .padding(horizontal = 16.dp, vertical = 12.dp), + modifier = + Modifier.fillMaxWidth() + .selectable(selected = isSelected, onClick = onSelect) + .padding(horizontal = 16.dp, vertical = 12.dp), ) { Box( - modifier = Modifier - .size(22.dp) - .border( - width = 2.dp, - color = if (isSelected) colorScheme.tertiary else colorScheme.outlineVariant, - shape = CircleShape, - ), + modifier = + Modifier.size(22.dp) + .border( + width = 2.dp, + color = if (isSelected) colorScheme.tertiary else colorScheme.outlineVariant, + shape = CircleShape, + ), contentAlignment = Alignment.Center, ) { if (isSelected) { - Box( - modifier = Modifier - .size(10.dp) - .background(colorScheme.tertiary, CircleShape), - ) + Box(modifier = Modifier.size(10.dp).background(colorScheme.tertiary, CircleShape)) } } Text( diff --git a/src/org/bitcoindevkit/devkitwallet/presentation/ui/screens/intro/OnboardingScreen.kt b/src/org/bitcoindevkit/devkitwallet/presentation/ui/screens/intro/OnboardingScreen.kt index 8ad9962..2bf8f68 100644 --- a/src/org/bitcoindevkit/devkitwallet/presentation/ui/screens/intro/OnboardingScreen.kt +++ b/src/org/bitcoindevkit/devkitwallet/presentation/ui/screens/intro/OnboardingScreen.kt @@ -51,31 +51,29 @@ fun OnboardingScreen(onFinishOnboarding: () -> Unit) { val pagerState = rememberPagerState(initialPage = 1, pageCount = { 4 }) val coroutineScope = rememberCoroutineScope() - val messages = listOf( - "Easter egg #1: \uD83E\uDD5A", - "Welcome to the Devkit Wallet! This app is a playground for developers and bitcoin enthusiasts to experiment with bitcoin's test networks.", - "It is developed with the Bitcoin Dev Kit, a powerful set of libraries produced and maintained by the Bitcoin Dev Kit Foundation.\n\nThis version of the app is using Compact Block Filters to sync its wallets.", - "The Foundation maintains this app as a way to showcase the capabilities of the Bitcoin Dev Kit and to provide a starting point for developers to build their own apps.\n\nIt is not a production application, and only works for testnet3, testnet4, signet, and regtest. Have fun!" - ) + val messages = + listOf( + "Easter egg #1: \uD83E\uDD5A", + "Welcome to the Devkit Wallet! This app is a playground for developers and bitcoin enthusiasts to experiment with bitcoin's test networks.", + "It is developed with the Bitcoin Dev Kit, a powerful set of libraries produced and maintained by the Bitcoin Dev Kit Foundation.\n\nThis version of the app is using Compact Block Filters to sync its wallets.", + "The Foundation maintains this app as a way to showcase the capabilities of the Bitcoin Dev Kit and to provide a starting point for developers to build their own apps.\n\nIt is not a production application, and only works for testnet3, testnet4, signet, and regtest. Have fun!", + ) Column( - modifier = Modifier - .fillMaxSize() - .background(surface) - .padding(horizontal = 32.dp), + modifier = Modifier.fillMaxSize().background(surface).padding(horizontal = 32.dp), horizontalAlignment = Alignment.CenterHorizontally, ) { Spacer(Modifier.height(120.dp)) // Logo Box( - modifier = Modifier - .size(100.dp) - .border( - width = 2.dp, - color = accent.copy(alpha = 0.20f), - shape = CircleShape, - ), + modifier = + Modifier.size(100.dp) + .border( + width = 2.dp, + color = accent.copy(alpha = 0.20f), + shape = CircleShape, + ), contentAlignment = Alignment.Center, ) { Image( @@ -107,9 +105,7 @@ fun OnboardingScreen(onFinishOnboarding: () -> Unit) { // Pager HorizontalPager( state = pagerState, - modifier = Modifier - .fillMaxWidth() - .weight(1f), + modifier = Modifier.fillMaxWidth().weight(1f), ) { page -> Text( text = messages[page], @@ -118,9 +114,7 @@ fun OnboardingScreen(onFinishOnboarding: () -> Unit) { lineHeight = 24.sp, color = onSurface.copy(alpha = 0.85f), textAlign = TextAlign.Center, - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 8.dp), + modifier = Modifier.fillMaxWidth().padding(horizontal = 8.dp), ) } @@ -132,22 +126,18 @@ fun OnboardingScreen(onFinishOnboarding: () -> Unit) { repeat(3) { index -> val isSelected = pagerState.currentPage == index + 1 Box( - modifier = Modifier - .padding(horizontal = 6.dp) - .size(if (isSelected) 10.dp else 8.dp) - .clip(CircleShape) - .background( - if (isSelected) accent else accent.copy(alpha = 0.25f) - ), + modifier = + Modifier.padding(horizontal = 6.dp) + .size(if (isSelected) 10.dp else 8.dp) + .clip(CircleShape) + .background(if (isSelected) accent else accent.copy(alpha = 0.25f)) ) } } // Navigation buttons Row( - modifier = Modifier - .fillMaxWidth() - .padding(bottom = 40.dp), + modifier = Modifier.fillMaxWidth().padding(bottom = 40.dp), horizontalArrangement = Arrangement.SpaceBetween, ) { Text( @@ -156,19 +146,21 @@ fun OnboardingScreen(onFinishOnboarding: () -> Unit) { fontSize = 14.sp, fontWeight = FontWeight.Medium, color = subtle, - modifier = Modifier - .clickable( - indication = null, - interactionSource = remember { MutableInteractionSource() }, - ) { - coroutineScope.launch { - pagerState.animateScrollToPage((pagerState.currentPage - 1).coerceIn(0, 3)) + modifier = + Modifier.clickable( + indication = null, + interactionSource = remember { MutableInteractionSource() }, + ) { + coroutineScope.launch { + pagerState.animateScrollToPage((pagerState.currentPage - 1).coerceIn(0, 3)) + } } - }.border( - width = 1.5.dp, - color = subtle.copy(alpha = 0.20f), - shape = RoundedCornerShape(12.dp), - ).padding(horizontal = 20.dp, vertical = 10.dp), + .border( + width = 1.5.dp, + color = subtle.copy(alpha = 0.20f), + shape = RoundedCornerShape(12.dp), + ) + .padding(horizontal = 20.dp, vertical = 10.dp), ) Text( text = if (pagerState.currentPage < 3) "Next" else "Get Started", @@ -176,30 +168,31 @@ fun OnboardingScreen(onFinishOnboarding: () -> Unit) { fontSize = 14.sp, fontWeight = FontWeight.Medium, color = if (pagerState.currentPage < 3) onSurface else surface, - modifier = Modifier - .clickable( - indication = null, - interactionSource = remember { MutableInteractionSource() }, - ) { - if (pagerState.currentPage < 3) { - coroutineScope.launch { - pagerState.animateScrollToPage((pagerState.currentPage + 1).coerceIn(0, 3)) + modifier = + Modifier.clickable( + indication = null, + interactionSource = remember { MutableInteractionSource() }, + ) { + if (pagerState.currentPage < 3) { + coroutineScope.launch { + pagerState.animateScrollToPage((pagerState.currentPage + 1).coerceIn(0, 3)) + } + } else { + onFinishOnboarding() } - } else { - onFinishOnboarding() - } - }.then( - if (pagerState.currentPage < 3) { - Modifier.border( - width = 1.5.dp, - color = accent.copy(alpha = 0.30f), - shape = RoundedCornerShape(12.dp), - ) - } else { - Modifier - .background(accent, RoundedCornerShape(12.dp)) } - ).padding(horizontal = 20.dp, vertical = 10.dp), + .then( + if (pagerState.currentPage < 3) { + Modifier.border( + width = 1.5.dp, + color = accent.copy(alpha = 0.30f), + shape = RoundedCornerShape(12.dp), + ) + } else { + Modifier.background(accent, RoundedCornerShape(12.dp)) + } + ) + .padding(horizontal = 20.dp, vertical = 10.dp), ) } } diff --git a/src/org/bitcoindevkit/devkitwallet/presentation/ui/screens/intro/RecoverWalletScreen.kt b/src/org/bitcoindevkit/devkitwallet/presentation/ui/screens/intro/RecoverWalletScreen.kt index 14e20ff..f6cd4e7 100644 --- a/src/org/bitcoindevkit/devkitwallet/presentation/ui/screens/intro/RecoverWalletScreen.kt +++ b/src/org/bitcoindevkit/devkitwallet/presentation/ui/screens/intro/RecoverWalletScreen.kt @@ -71,8 +71,9 @@ internal fun RecoverWalletScreen(onAction: (WalletCreateType) -> Unit, navContro var walletName by remember { mutableStateOf("") } val selectedNetwork: MutableState = remember { mutableStateOf(Network.SIGNET) } - val selectedScriptType: MutableState = - remember { mutableStateOf(ActiveWalletScriptType.P2TR) } + val selectedScriptType: MutableState = remember { + mutableStateOf(ActiveWalletScriptType.P2TR) + } val scriptTypes = listOf(ActiveWalletScriptType.P2TR, ActiveWalletScriptType.P2WPKH) var recoveryPhrase by remember { mutableStateOf("") } @@ -88,24 +89,25 @@ internal fun RecoverWalletScreen(onAction: (WalletCreateType) -> Unit, navContro }, ) { paddingValues -> Column( - modifier = Modifier - .fillMaxSize() - .padding(paddingValues) - .padding(horizontal = 24.dp) - .verticalScroll(rememberScrollState()), + modifier = + Modifier.fillMaxSize() + .padding(paddingValues) + .padding(horizontal = 24.dp) + .verticalScroll(rememberScrollState()) ) { Spacer(Modifier.height(20.dp)) // Tab selector FormLabel("Recovery Method") Row( - modifier = Modifier - .fillMaxWidth() - .border( - width = 1.5.dp, - color = colorScheme.outline.copy(alpha = 0.10f), - shape = RoundedCornerShape(20.dp), - ).padding(4.dp), + modifier = + Modifier.fillMaxWidth() + .border( + width = 1.5.dp, + color = colorScheme.outline.copy(alpha = 0.10f), + shape = RoundedCornerShape(20.dp), + ) + .padding(4.dp), horizontalArrangement = Arrangement.spacedBy(0.dp), ) { tabs.forEachIndexed { index, label -> @@ -113,20 +115,21 @@ internal fun RecoverWalletScreen(onAction: (WalletCreateType) -> Unit, navContro Row( verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.Center, - modifier = Modifier - .weight(1f) - .selectable(selected = isSelected, onClick = { selectedTab = index }) - .then( - if (isSelected) { - Modifier.border( - width = 1.5.dp, - color = colorScheme.primary.copy(alpha = 0.30f), - shape = RoundedCornerShape(16.dp), - ) - } else { - Modifier - } - ).padding(horizontal = 16.dp, vertical = 12.dp), + modifier = + Modifier.weight(1f) + .selectable(selected = isSelected, onClick = { selectedTab = index }) + .then( + if (isSelected) { + Modifier.border( + width = 1.5.dp, + color = colorScheme.primary.copy(alpha = 0.30f), + shape = RoundedCornerShape(16.dp), + ) + } else { + Modifier + } + ) + .padding(horizontal = 16.dp, vertical = 12.dp), ) { Text( text = label, @@ -157,11 +160,12 @@ internal fun RecoverWalletScreen(onAction: (WalletCreateType) -> Unit, navContro }, singleLine = true, textStyle = TextStyle(fontFamily = inter, color = colorScheme.onSurface, fontSize = 15.sp), - colors = OutlinedTextFieldDefaults.colors( - cursorColor = colorScheme.primary, - focusedBorderColor = colorScheme.primary.copy(alpha = 0.40f), - unfocusedBorderColor = colorScheme.outline.copy(alpha = 0.15f), - ), + colors = + OutlinedTextFieldDefaults.colors( + cursorColor = colorScheme.primary, + focusedBorderColor = colorScheme.primary.copy(alpha = 0.40f), + unfocusedBorderColor = colorScheme.outline.copy(alpha = 0.15f), + ), shape = RoundedCornerShape(16.dp), ) @@ -214,11 +218,12 @@ internal fun RecoverWalletScreen(onAction: (WalletCreateType) -> Unit, navContro singleLine = false, minLines = 3, textStyle = TextStyle(fontFamily = inter, color = colorScheme.onSurface, fontSize = 14.sp), - colors = OutlinedTextFieldDefaults.colors( - cursorColor = colorScheme.primary, - focusedBorderColor = colorScheme.primary.copy(alpha = 0.40f), - unfocusedBorderColor = colorScheme.outline.copy(alpha = 0.15f), - ), + colors = + OutlinedTextFieldDefaults.colors( + cursorColor = colorScheme.primary, + focusedBorderColor = colorScheme.primary.copy(alpha = 0.40f), + unfocusedBorderColor = colorScheme.outline.copy(alpha = 0.15f), + ), shape = RoundedCornerShape(16.dp), ) } else { @@ -254,11 +259,12 @@ internal fun RecoverWalletScreen(onAction: (WalletCreateType) -> Unit, navContro singleLine = false, minLines = 4, textStyle = TextStyle(fontFamily = inter, color = colorScheme.onSurface, fontSize = 13.sp), - colors = OutlinedTextFieldDefaults.colors( - cursorColor = colorScheme.primary, - focusedBorderColor = colorScheme.primary.copy(alpha = 0.40f), - unfocusedBorderColor = colorScheme.outline.copy(alpha = 0.15f), - ), + colors = + OutlinedTextFieldDefaults.colors( + cursorColor = colorScheme.primary, + focusedBorderColor = colorScheme.primary.copy(alpha = 0.40f), + unfocusedBorderColor = colorScheme.outline.copy(alpha = 0.15f), + ), shape = RoundedCornerShape(16.dp), ) @@ -281,11 +287,12 @@ internal fun RecoverWalletScreen(onAction: (WalletCreateType) -> Unit, navContro singleLine = false, minLines = 4, textStyle = TextStyle(fontFamily = inter, color = colorScheme.onSurface, fontSize = 13.sp), - colors = OutlinedTextFieldDefaults.colors( - cursorColor = colorScheme.primary, - focusedBorderColor = colorScheme.primary.copy(alpha = 0.40f), - unfocusedBorderColor = colorScheme.outline.copy(alpha = 0.15f), - ), + colors = + OutlinedTextFieldDefaults.colors( + cursorColor = colorScheme.primary, + focusedBorderColor = colorScheme.primary.copy(alpha = 0.40f), + unfocusedBorderColor = colorScheme.outline.copy(alpha = 0.15f), + ), shape = RoundedCornerShape(16.dp), ) } @@ -300,7 +307,7 @@ internal fun RecoverWalletScreen(onAction: (WalletCreateType) -> Unit, navContro if (recoveryPhrase.isEmpty()) { scope.launch { snackbarHostState.showSnackbar( - "You must provide a recovery phrase to recover a wallet.", + "You must provide a recovery phrase to recover a wallet." ) } return@Button @@ -344,7 +351,7 @@ internal fun RecoverWalletScreen(onAction: (WalletCreateType) -> Unit, navContro if (descriptorString.isEmpty() || changeDescriptorString.isEmpty()) { scope.launch { snackbarHostState.showSnackbar( - "You must provide both a descriptor and a change descriptor.", + "You must provide both a descriptor and a change descriptor." ) } return@Button @@ -365,14 +372,13 @@ internal fun RecoverWalletScreen(onAction: (WalletCreateType) -> Unit, navContro onAction(WalletCreateType.RECOVER(recoverWalletConfig)) } }, - modifier = Modifier - .fillMaxWidth() - .height(56.dp), + modifier = Modifier.fillMaxWidth().height(56.dp), shape = RoundedCornerShape(20.dp), - colors = ButtonDefaults.buttonColors( - containerColor = colorScheme.primary, - contentColor = colorScheme.onPrimary, - ), + colors = + ButtonDefaults.buttonColors( + containerColor = colorScheme.primary, + contentColor = colorScheme.onPrimary, + ), ) { Text( text = "Recover Wallet", diff --git a/src/org/bitcoindevkit/devkitwallet/presentation/ui/screens/intro/WalletChoiceScreen.kt b/src/org/bitcoindevkit/devkitwallet/presentation/ui/screens/intro/WalletChoiceScreen.kt index 84749ce..71b2189 100644 --- a/src/org/bitcoindevkit/devkitwallet/presentation/ui/screens/intro/WalletChoiceScreen.kt +++ b/src/org/bitcoindevkit/devkitwallet/presentation/ui/screens/intro/WalletChoiceScreen.kt @@ -49,21 +49,19 @@ internal fun WalletChoiceScreen(navController: NavController) { Scaffold { paddingValues -> Column( - modifier = Modifier - .fillMaxSize() - .padding(paddingValues), + modifier = Modifier.fillMaxSize().padding(paddingValues), horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Center, ) { // Logo area Box( - modifier = Modifier - .size(72.dp) - .border( - width = 2.dp, - color = colorScheme.primary.copy(alpha = 0.20f), - shape = CircleShape, - ), + modifier = + Modifier.size(72.dp) + .border( + width = 2.dp, + color = colorScheme.primary.copy(alpha = 0.20f), + shape = CircleShape, + ), contentAlignment = Alignment.Center, ) { Text( @@ -94,9 +92,7 @@ internal fun WalletChoiceScreen(navController: NavController) { // Buttons Column( - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 48.dp), + modifier = Modifier.fillMaxWidth().padding(horizontal = 48.dp), verticalArrangement = Arrangement.spacedBy(12.dp), ) { WelcomeButton( @@ -144,20 +140,18 @@ private fun WelcomeButton( colors = CardDefaults.outlinedCardColors(containerColor = Color.Transparent), ) { Row( - modifier = Modifier - .fillMaxWidth() - .padding(20.dp), + modifier = Modifier.fillMaxWidth().padding(20.dp), verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(16.dp), ) { Box( - modifier = Modifier - .size(44.dp) - .border( - width = 1.dp, - color = iconTint.copy(alpha = 0.15f), - shape = RoundedCornerShape(14.dp), - ), + modifier = + Modifier.size(44.dp) + .border( + width = 1.dp, + color = iconTint.copy(alpha = 0.15f), + shape = RoundedCornerShape(14.dp), + ), contentAlignment = Alignment.Center, ) { Icon( diff --git a/src/org/bitcoindevkit/devkitwallet/presentation/ui/screens/settings/AboutScreen.kt b/src/org/bitcoindevkit/devkitwallet/presentation/ui/screens/settings/AboutScreen.kt index e14c22f..bd2b903 100644 --- a/src/org/bitcoindevkit/devkitwallet/presentation/ui/screens/settings/AboutScreen.kt +++ b/src/org/bitcoindevkit/devkitwallet/presentation/ui/screens/settings/AboutScreen.kt @@ -40,14 +40,16 @@ private val message: String = 1. Developers interested in learning how to leverage the Bitcoin Development Kit on Android. 2. Any bitcoiner looking for a Signet/Testnet/Regtest wallet! - """.trimIndent() + """ + .trimIndent() @Composable internal fun AboutScreen(navController: NavController) { val colorScheme = MaterialTheme.colorScheme val mUriHandler = LocalUriHandler.current - val openSourceRepository = - remember { { mUriHandler.openUri("https://github.com/bitcoindevkit/bdk-kotlin-example-wallet") } } + val openSourceRepository = remember { + { mUriHandler.openUri("https://github.com/bitcoindevkit/bdk-kotlin-example-wallet") } + } Scaffold( topBar = { @@ -60,8 +62,7 @@ internal fun AboutScreen(navController: NavController) { ) { paddingValues -> Column( modifier = - Modifier - .fillMaxSize() + Modifier.fillMaxSize() .padding(paddingValues) .padding(start = 16.dp, end = 16.dp, top = 16.dp, bottom = 100.dp), verticalArrangement = Arrangement.Top, @@ -99,10 +100,7 @@ internal fun AboutScreen(navController: NavController) { fontSize = 16.sp, textDecoration = TextDecoration.Underline, lineHeight = 26.sp, - modifier = - Modifier - .padding(all = 8.dp) - .clickable(onClick = openSourceRepository), + modifier = Modifier.padding(all = 8.dp).clickable(onClick = openSourceRepository), ) } } diff --git a/src/org/bitcoindevkit/devkitwallet/presentation/ui/screens/settings/BlockchainClientScreen.kt b/src/org/bitcoindevkit/devkitwallet/presentation/ui/screens/settings/BlockchainClientScreen.kt index 7b4e1e6..5ad4cd4 100644 --- a/src/org/bitcoindevkit/devkitwallet/presentation/ui/screens/settings/BlockchainClientScreen.kt +++ b/src/org/bitcoindevkit/devkitwallet/presentation/ui/screens/settings/BlockchainClientScreen.kt @@ -55,11 +55,7 @@ internal fun BlockchainClientScreen( Column( verticalArrangement = Arrangement.Top, horizontalAlignment = Alignment.CenterHorizontally, - modifier = - Modifier - .fillMaxSize() - .padding(paddingValues) - .padding(vertical = 32.dp, horizontal = 16.dp), + modifier = Modifier.fillMaxSize().padding(paddingValues).padding(vertical = 32.dp, horizontal = 16.dp), ) { Row( verticalAlignment = Alignment.CenterVertically, @@ -76,8 +72,7 @@ internal fun BlockchainClientScreen( ) Box( modifier = - Modifier - .padding(horizontal = 8.dp) + Modifier.padding(horizontal = 8.dp) .size(size = 21.dp) .clip(shape = CircleShape) .background( @@ -86,7 +81,7 @@ internal fun BlockchainClientScreen( } else { Color(0xFFE76F51) } - ), + ) ) } diff --git a/src/org/bitcoindevkit/devkitwallet/presentation/ui/screens/settings/CustomBlockchainClient.kt b/src/org/bitcoindevkit/devkitwallet/presentation/ui/screens/settings/CustomBlockchainClient.kt index 7cff349..e8f3e0a 100644 --- a/src/org/bitcoindevkit/devkitwallet/presentation/ui/screens/settings/CustomBlockchainClient.kt +++ b/src/org/bitcoindevkit/devkitwallet/presentation/ui/screens/settings/CustomBlockchainClient.kt @@ -35,13 +35,6 @@ internal fun CustomBlockchainClient(navController: NavController) { }, containerColor = MaterialTheme.colorScheme.surface, ) { paddingValues -> - Column( - modifier = - Modifier - .fillMaxSize() - .padding(paddingValues) - .padding(all = 16.dp), - ) { - } + Column(modifier = Modifier.fillMaxSize().padding(paddingValues).padding(all = 16.dp)) {} } } diff --git a/src/org/bitcoindevkit/devkitwallet/presentation/ui/screens/settings/LogsScreen.kt b/src/org/bitcoindevkit/devkitwallet/presentation/ui/screens/settings/LogsScreen.kt index b1118af..b520234 100644 --- a/src/org/bitcoindevkit/devkitwallet/presentation/ui/screens/settings/LogsScreen.kt +++ b/src/org/bitcoindevkit/devkitwallet/presentation/ui/screens/settings/LogsScreen.kt @@ -40,13 +40,7 @@ fun LogsScreen(navController: NavController) { }, containerColor = colorScheme.surface, ) { paddingValues -> - LazyColumn( - modifier = - Modifier - .fillMaxSize() - .padding(paddingValues) - .padding(16.dp), - ) { + LazyColumn(modifier = Modifier.fillMaxSize().padding(paddingValues).padding(16.dp)) { items(logs) { logLine -> Text( text = logLine, @@ -55,10 +49,7 @@ fun LogsScreen(navController: NavController) { fontSize = 14.sp, maxLines = 1, overflow = TextOverflow.Visible, - modifier = - Modifier - .fillMaxWidth() - .horizontalScroll(rememberScrollState()), + modifier = Modifier.fillMaxWidth().horizontalScroll(rememberScrollState()), ) } } diff --git a/src/org/bitcoindevkit/devkitwallet/presentation/ui/screens/settings/RecoveryDataScreen.kt b/src/org/bitcoindevkit/devkitwallet/presentation/ui/screens/settings/RecoveryDataScreen.kt index d02b277..9f1c68d 100644 --- a/src/org/bitcoindevkit/devkitwallet/presentation/ui/screens/settings/RecoveryDataScreen.kt +++ b/src/org/bitcoindevkit/devkitwallet/presentation/ui/screens/settings/RecoveryDataScreen.kt @@ -44,7 +44,8 @@ import org.bitcoindevkit.devkitwallet.presentation.ui.components.SecondaryScreen private val MESSAGE: String = """ The next screen will show your recovery phrase and descriptors. Make sure no one else is looking at your screen. - """.trimIndent() + """ + .trimIndent() @Composable internal fun RecoveryDataScreen(walletSecrets: WalletSecrets, navController: NavController) { @@ -82,10 +83,7 @@ internal fun RecoveryDataScreen(walletSecrets: WalletSecrets, navController: Nav fun WarningText(setCurrentIndex: (Int) -> Unit) { val colorScheme = MaterialTheme.colorScheme Column( - modifier = - Modifier - .fillMaxSize() - .padding(horizontal = 32.dp, vertical = 16.dp), + modifier = Modifier.fillMaxSize().padding(horizontal = 32.dp, vertical = 16.dp), horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Center, ) { @@ -98,7 +96,9 @@ fun WarningText(setCurrentIndex: (Int) -> Unit) { NeutralButton( text = "See my recovery data", enabled = true, - ) { setCurrentIndex(1) } + ) { + setCurrentIndex(1) + } } } @@ -106,12 +106,7 @@ fun WarningText(setCurrentIndex: (Int) -> Unit) { fun RecoveryPhrase(walletSecrets: WalletSecrets) { val context = LocalContext.current val colorScheme = MaterialTheme.colorScheme - Column( - modifier = - Modifier - .fillMaxSize() - .padding(all = 32.dp), - ) { + Column(modifier = Modifier.fillMaxSize().padding(all = 32.dp)) { Text( text = "Write down your recovery phrase and keep it in a safe place.", color = colorScheme.onSurface, @@ -122,16 +117,17 @@ fun RecoveryPhrase(walletSecrets: WalletSecrets) { SelectionContainer { Text( modifier = - Modifier - .clickable { + Modifier.clickable { simpleCopyClipboard( walletSecrets.recoveryPhrase, context, ) - }.background( + } + .background( color = colorScheme.surfaceVariant, shape = RoundedCornerShape(16.dp), - ).padding(12.dp), + ) + .padding(12.dp), text = walletSecrets.recoveryPhrase, fontFamily = googleSansCode, color = colorScheme.onSurface, @@ -141,11 +137,7 @@ fun RecoveryPhrase(walletSecrets: WalletSecrets) { Lucide.ClipboardCopy, tint = colorScheme.onSurface.copy(alpha = 0.5f), contentDescription = "Copy to clipboard", - modifier = - Modifier - .padding(8.dp) - .size(20.dp) - .align(Alignment.BottomEnd), + modifier = Modifier.padding(8.dp).size(20.dp).align(Alignment.BottomEnd), ) } Spacer(modifier = Modifier.padding(16.dp)) @@ -159,16 +151,17 @@ fun RecoveryPhrase(walletSecrets: WalletSecrets) { SelectionContainer { Text( modifier = - Modifier - .clickable { + Modifier.clickable { simpleCopyClipboard( walletSecrets.descriptor.toStringWithSecret(), context, ) - }.background( + } + .background( color = colorScheme.surfaceVariant, shape = RoundedCornerShape(16.dp), - ).padding(12.dp), + ) + .padding(12.dp), text = walletSecrets.descriptor.toStringWithSecret(), fontFamily = googleSansCode, color = colorScheme.onSurface, @@ -178,11 +171,7 @@ fun RecoveryPhrase(walletSecrets: WalletSecrets) { Lucide.ClipboardCopy, tint = colorScheme.onSurface.copy(alpha = 0.5f), contentDescription = "Copy to clipboard", - modifier = - Modifier - .padding(8.dp) - .size(20.dp) - .align(Alignment.BottomEnd), + modifier = Modifier.padding(8.dp).size(20.dp).align(Alignment.BottomEnd), ) } Spacer(modifier = Modifier.padding(4.dp)) @@ -190,16 +179,17 @@ fun RecoveryPhrase(walletSecrets: WalletSecrets) { SelectionContainer { Text( modifier = - Modifier - .clickable { + Modifier.clickable { simpleCopyClipboard( walletSecrets.changeDescriptor.toStringWithSecret(), context, ) - }.background( + } + .background( color = colorScheme.surfaceVariant, shape = RoundedCornerShape(16.dp), - ).padding(12.dp), + ) + .padding(12.dp), text = walletSecrets.changeDescriptor.toStringWithSecret(), fontFamily = googleSansCode, color = colorScheme.onSurface, @@ -209,11 +199,7 @@ fun RecoveryPhrase(walletSecrets: WalletSecrets) { Lucide.ClipboardCopy, tint = colorScheme.onSurface.copy(alpha = 0.5f), contentDescription = "Copy to clipboard", - modifier = - Modifier - .padding(8.dp) - .size(20.dp) - .align(Alignment.BottomEnd), + modifier = Modifier.padding(8.dp).size(20.dp).align(Alignment.BottomEnd), ) } } diff --git a/src/org/bitcoindevkit/devkitwallet/presentation/ui/screens/settings/SettingsScreen.kt b/src/org/bitcoindevkit/devkitwallet/presentation/ui/screens/settings/SettingsScreen.kt index df8fcd7..63a4b7e 100644 --- a/src/org/bitcoindevkit/devkitwallet/presentation/ui/screens/settings/SettingsScreen.kt +++ b/src/org/bitcoindevkit/devkitwallet/presentation/ui/screens/settings/SettingsScreen.kt @@ -57,20 +57,16 @@ internal fun SettingsScreen(navController: NavController) { }, containerColor = colorScheme.surface, ) { paddingValues -> - Column( - modifier = Modifier - .fillMaxSize() - .padding(paddingValues) - .padding(horizontal = 20.dp, vertical = 16.dp), - ) { + Column(modifier = Modifier.fillMaxSize().padding(paddingValues).padding(horizontal = 20.dp, vertical = 16.dp)) { Column( - modifier = Modifier - .fillMaxWidth() - .border( - width = 1.5.dp, - color = colorScheme.outline.copy(alpha = 0.10f), - shape = RoundedCornerShape(20.dp), - ).clip(RoundedCornerShape(20.dp)), + modifier = + Modifier.fillMaxWidth() + .border( + width = 1.5.dp, + color = colorScheme.outline.copy(alpha = 0.10f), + shape = RoundedCornerShape(20.dp), + ) + .clip(RoundedCornerShape(20.dp)) ) { SettingsItem( icon = Lucide.Info, @@ -117,22 +113,19 @@ private fun SettingsItem( val colorScheme = MaterialTheme.colorScheme Row( - modifier = Modifier - .fillMaxWidth() - .clickable(onClick = onClick) - .padding(horizontal = 16.dp, vertical = 14.dp), + modifier = Modifier.fillMaxWidth().clickable(onClick = onClick).padding(horizontal = 16.dp, vertical = 14.dp), verticalAlignment = Alignment.CenterVertically, ) { Box( - modifier = Modifier - .size(44.dp) - .clip(RoundedCornerShape(14.dp)) - .background(iconTint.copy(alpha = 0.08f)) - .border( - width = 1.dp, - color = iconTint.copy(alpha = 0.12f), - shape = RoundedCornerShape(14.dp), - ), + modifier = + Modifier.size(44.dp) + .clip(RoundedCornerShape(14.dp)) + .background(iconTint.copy(alpha = 0.08f)) + .border( + width = 1.dp, + color = iconTint.copy(alpha = 0.12f), + shape = RoundedCornerShape(14.dp), + ), contentAlignment = Alignment.Center, ) { Icon( diff --git a/src/org/bitcoindevkit/devkitwallet/presentation/ui/screens/settings/ThemeScreen.kt b/src/org/bitcoindevkit/devkitwallet/presentation/ui/screens/settings/ThemeScreen.kt index 1827e3f..c1f734d 100644 --- a/src/org/bitcoindevkit/devkitwallet/presentation/ui/screens/settings/ThemeScreen.kt +++ b/src/org/bitcoindevkit/devkitwallet/presentation/ui/screens/settings/ThemeScreen.kt @@ -53,20 +53,16 @@ internal fun ThemeScreen(useDarkTheme: Boolean, onToggleTheme: () -> Unit, navCo }, containerColor = colorScheme.surface, ) { paddingValues -> - Column( - modifier = Modifier - .fillMaxSize() - .padding(paddingValues) - .padding(horizontal = 20.dp, vertical = 16.dp), - ) { + Column(modifier = Modifier.fillMaxSize().padding(paddingValues).padding(horizontal = 20.dp, vertical = 16.dp)) { Column( - modifier = Modifier - .fillMaxWidth() - .border( - width = 1.5.dp, - color = colorScheme.outline.copy(alpha = 0.10f), - shape = RoundedCornerShape(20.dp), - ).clip(RoundedCornerShape(20.dp)), + modifier = + Modifier.fillMaxWidth() + .border( + width = 1.5.dp, + color = colorScheme.outline.copy(alpha = 0.10f), + shape = RoundedCornerShape(20.dp), + ) + .clip(RoundedCornerShape(20.dp)) ) { ThemeItem( icon = Lucide.Sun, @@ -105,22 +101,19 @@ private fun ThemeItem( val colorScheme = MaterialTheme.colorScheme Row( - modifier = Modifier - .fillMaxWidth() - .clickable(onClick = onClick) - .padding(horizontal = 16.dp, vertical = 14.dp), + modifier = Modifier.fillMaxWidth().clickable(onClick = onClick).padding(horizontal = 16.dp, vertical = 14.dp), verticalAlignment = Alignment.CenterVertically, ) { Box( - modifier = Modifier - .size(44.dp) - .clip(RoundedCornerShape(14.dp)) - .background(iconTint.copy(alpha = if (isSelected) 0.10f else 0.05f)) - .border( - width = 1.dp, - color = iconTint.copy(alpha = if (isSelected) 0.15f else 0.07f), - shape = RoundedCornerShape(14.dp), - ), + modifier = + Modifier.size(44.dp) + .clip(RoundedCornerShape(14.dp)) + .background(iconTint.copy(alpha = if (isSelected) 0.10f else 0.05f)) + .border( + width = 1.dp, + color = iconTint.copy(alpha = if (isSelected) 0.15f else 0.07f), + shape = RoundedCornerShape(14.dp), + ), contentAlignment = Alignment.Center, ) { Icon( diff --git a/src/org/bitcoindevkit/devkitwallet/presentation/ui/screens/wallet/RBFScreen.kt b/src/org/bitcoindevkit/devkitwallet/presentation/ui/screens/wallet/RBFScreen.kt index 0e77b91..9786817 100644 --- a/src/org/bitcoindevkit/devkitwallet/presentation/ui/screens/wallet/RBFScreen.kt +++ b/src/org/bitcoindevkit/devkitwallet/presentation/ui/screens/wallet/RBFScreen.kt @@ -18,110 +18,110 @@ internal fun RBFScreen( navController: NavController, paddingValues: PaddingValues = PaddingValues(0.dp), ) { -// if (txid.isNullOrEmpty()) { -// navController.popBackStack() -// } -// var transaction: TransactionDetails? = getTransaction(txid = txid) -// if (transaction == null) { -// navController.popBackStack() -// } -// transaction = transaction as TransactionDetails -// val context = LocalContext.current -// -// val amount = (transaction.sent - transaction.received - (transaction.fee ?: 0UL)).toString() -// val feeRate: MutableState = rememberSaveable { mutableStateOf("") } -// val (showDialog, setShowDialog) = rememberSaveable { mutableStateOf(false) } -// -// ConstraintLayout( -// modifier = Modifier -// .fillMaxSize() -// .padding(paddingValues) -// .background(DevkitWalletColors.primary) -// ) { -// val (screenTitle, transactionInputs, bottomButtons) = createRefs() -// -// Text( -// text = "Send Bitcoin", -// color = DevkitWalletColors.white, -// fontSize = 28.sp, -// textAlign = TextAlign.Center, -// modifier = Modifier -// .constrainAs(screenTitle) { -// top.linkTo(parent.top) -// start.linkTo(parent.start) -// end.linkTo(parent.end) -// } -// .padding(top = 70.dp) -// ) -// -// Column( -// horizontalAlignment = Alignment.CenterHorizontally, -// verticalArrangement = Arrangement.Center, -// modifier = Modifier.constrainAs(transactionInputs) { -// top.linkTo(screenTitle.bottom) -// bottom.linkTo(bottomButtons.top) -// start.linkTo(parent.start) -// end.linkTo(parent.end) -// height = Dimension.fillToConstraints -// } -// ) { -// ShowTxnDetail(name = "Transaction Id",content = txid!!) -// ShowTxnDetail(name = "Amount", content = amount) -// TransactionFeeInput(feeRate = feeRate) -// BumpFeeDialog( -// txid = txid, -// amount = amount, -// feeRate = feeRate, -// showDialog = showDialog, -// setShowDialog = setShowDialog, -// context = context -// ) -// } -// Column( -// Modifier -// .constrainAs(bottomButtons) { -// bottom.linkTo(parent.bottom) -// start.linkTo(parent.start) -// end.linkTo(parent.end) -// } -// .padding(bottom = 32.dp) -// ) { -// Button( -// onClick = { setShowDialog(true) }, -// colors = ButtonDefaults.buttonColors(DevkitWalletColors.accent2), -// shape = RoundedCornerShape(16.dp), -// modifier = Modifier -// .height(80.dp) -// .fillMaxWidth(0.9f) -// .padding(vertical = 8.dp, horizontal = 8.dp) -// .shadow(elevation = 4.dp, shape = RoundedCornerShape(16.dp)) -// ) { -// Text( -// text = "broadcast transaction", -// fontSize = 14.sp, -// textAlign = TextAlign.Center, -// lineHeight = 28.sp, -// ) -// } -// Button( -// onClick = { navController.navigate(Screen.HomeScreen.route) }, -// colors = ButtonDefaults.buttonColors(DevkitWalletColors.primaryLight), -// shape = RoundedCornerShape(16.dp), -// modifier = Modifier -// .height(80.dp) -// .fillMaxWidth(0.9f) -// .padding(vertical = 8.dp, horizontal = 8.dp) -// .shadow(elevation = 4.dp, shape = RoundedCornerShape(16.dp)) -// ) { -// Text( -// text = "back to wallet", -// fontSize = 14.sp, -// textAlign = TextAlign.Center, -// lineHeight = 28.sp, -// ) -// } -// } -// } + // if (txid.isNullOrEmpty()) { + // navController.popBackStack() + // } + // var transaction: TransactionDetails? = getTransaction(txid = txid) + // if (transaction == null) { + // navController.popBackStack() + // } + // transaction = transaction as TransactionDetails + // val context = LocalContext.current + // + // val amount = (transaction.sent - transaction.received - (transaction.fee ?: 0UL)).toString() + // val feeRate: MutableState = rememberSaveable { mutableStateOf("") } + // val (showDialog, setShowDialog) = rememberSaveable { mutableStateOf(false) } + // + // ConstraintLayout( + // modifier = Modifier + // .fillMaxSize() + // .padding(paddingValues) + // .background(DevkitWalletColors.primary) + // ) { + // val (screenTitle, transactionInputs, bottomButtons) = createRefs() + // + // Text( + // text = "Send Bitcoin", + // color = DevkitWalletColors.white, + // fontSize = 28.sp, + // textAlign = TextAlign.Center, + // modifier = Modifier + // .constrainAs(screenTitle) { + // top.linkTo(parent.top) + // start.linkTo(parent.start) + // end.linkTo(parent.end) + // } + // .padding(top = 70.dp) + // ) + // + // Column( + // horizontalAlignment = Alignment.CenterHorizontally, + // verticalArrangement = Arrangement.Center, + // modifier = Modifier.constrainAs(transactionInputs) { + // top.linkTo(screenTitle.bottom) + // bottom.linkTo(bottomButtons.top) + // start.linkTo(parent.start) + // end.linkTo(parent.end) + // height = Dimension.fillToConstraints + // } + // ) { + // ShowTxnDetail(name = "Transaction Id",content = txid!!) + // ShowTxnDetail(name = "Amount", content = amount) + // TransactionFeeInput(feeRate = feeRate) + // BumpFeeDialog( + // txid = txid, + // amount = amount, + // feeRate = feeRate, + // showDialog = showDialog, + // setShowDialog = setShowDialog, + // context = context + // ) + // } + // Column( + // Modifier + // .constrainAs(bottomButtons) { + // bottom.linkTo(parent.bottom) + // start.linkTo(parent.start) + // end.linkTo(parent.end) + // } + // .padding(bottom = 32.dp) + // ) { + // Button( + // onClick = { setShowDialog(true) }, + // colors = ButtonDefaults.buttonColors(DevkitWalletColors.accent2), + // shape = RoundedCornerShape(16.dp), + // modifier = Modifier + // .height(80.dp) + // .fillMaxWidth(0.9f) + // .padding(vertical = 8.dp, horizontal = 8.dp) + // .shadow(elevation = 4.dp, shape = RoundedCornerShape(16.dp)) + // ) { + // Text( + // text = "broadcast transaction", + // fontSize = 14.sp, + // textAlign = TextAlign.Center, + // lineHeight = 28.sp, + // ) + // } + // Button( + // onClick = { navController.navigate(Screen.HomeScreen.route) }, + // colors = ButtonDefaults.buttonColors(DevkitWalletColors.primaryLight), + // shape = RoundedCornerShape(16.dp), + // modifier = Modifier + // .height(80.dp) + // .fillMaxWidth(0.9f) + // .padding(vertical = 8.dp, horizontal = 8.dp) + // .shadow(elevation = 4.dp, shape = RoundedCornerShape(16.dp)) + // ) { + // Text( + // text = "back to wallet", + // fontSize = 14.sp, + // textAlign = TextAlign.Center, + // lineHeight = 28.sp, + // ) + // } + // } + // } } // // @OptIn(ExperimentalMaterial3Api::class) diff --git a/src/org/bitcoindevkit/devkitwallet/presentation/ui/screens/wallet/ReceiveScreen.kt b/src/org/bitcoindevkit/devkitwallet/presentation/ui/screens/wallet/ReceiveScreen.kt index 9b8d70a..67f3132 100644 --- a/src/org/bitcoindevkit/devkitwallet/presentation/ui/screens/wallet/ReceiveScreen.kt +++ b/src/org/bitcoindevkit/devkitwallet/presentation/ui/screens/wallet/ReceiveScreen.kt @@ -85,10 +85,7 @@ internal fun ReceiveScreen( containerColor = colorScheme.surface, ) { paddingValues -> Column( - modifier = Modifier - .fillMaxSize() - .padding(paddingValues) - .verticalScroll(rememberScrollState()), + modifier = Modifier.fillMaxSize().padding(paddingValues).verticalScroll(rememberScrollState()), horizontalAlignment = Alignment.CenterHorizontally, ) { Spacer(Modifier.height(24.dp)) @@ -99,21 +96,20 @@ internal fun ReceiveScreen( if (qrBitmap != null) { // QR code in outlined container Box( - modifier = Modifier - .border( - width = 1.5.dp, - color = colorScheme.outline.copy(alpha = 0.10f), - shape = RoundedCornerShape(24.dp), - ).clip(RoundedCornerShape(24.dp)) - .padding(20.dp), + modifier = + Modifier.border( + width = 1.5.dp, + color = colorScheme.outline.copy(alpha = 0.10f), + shape = RoundedCornerShape(24.dp), + ) + .clip(RoundedCornerShape(24.dp)) + .padding(20.dp), contentAlignment = Alignment.Center, ) { Image( bitmap = qrBitmap, contentDescription = "Bitcoin address QR code", - Modifier - .size(230.dp) - .clip(RoundedCornerShape(12.dp)), + Modifier.size(230.dp).clip(RoundedCornerShape(12.dp)), ) } @@ -121,15 +117,16 @@ internal fun ReceiveScreen( // Address card with copy button Box( - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 24.dp) - .border( - width = 1.5.dp, - color = colorScheme.outline.copy(alpha = 0.10f), - shape = RoundedCornerShape(16.dp), - ).clip(RoundedCornerShape(16.dp)) - .padding(horizontal = 16.dp, vertical = 14.dp), + modifier = + Modifier.fillMaxWidth() + .padding(horizontal = 24.dp) + .border( + width = 1.5.dp, + color = colorScheme.outline.copy(alpha = 0.10f), + shape = RoundedCornerShape(16.dp), + ) + .clip(RoundedCornerShape(16.dp)) + .padding(horizontal = 16.dp, vertical = 14.dp) ) { Text( text = state.address.chunked(4).joinToString(" "), @@ -137,9 +134,7 @@ internal fun ReceiveScreen( fontSize = 13.sp, fontWeight = FontWeight.Light, color = colorScheme.onSurface, - modifier = Modifier - .align(Alignment.CenterStart) - .padding(end = 40.dp), + modifier = Modifier.align(Alignment.CenterStart).padding(end = 40.dp), ) IconButton( onClick = { @@ -151,9 +146,7 @@ internal fun ReceiveScreen( null, ) }, - modifier = Modifier - .size(28.dp) - .align(Alignment.CenterEnd), + modifier = Modifier.size(28.dp).align(Alignment.CenterEnd), ) { Icon( Lucide.ClipboardCopy, @@ -180,10 +173,7 @@ internal fun ReceiveScreen( onClick = { onAction(ReceiveScreenAction.UpdateAddress) }, shape = RoundedCornerShape(16.dp), border = BorderStroke(1.5.dp, colorScheme.primary), - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 24.dp) - .height(52.dp), + modifier = Modifier.fillMaxWidth().padding(horizontal = 24.dp).height(52.dp), ) { Text( text = "Generate New Address", @@ -221,9 +211,7 @@ fun copyToClipboard( context: Context, scope: CoroutineScope, snackbarHostState: SnackbarHostState, - setCopyClicked: ( - (Boolean) -> Unit - )?, + setCopyClicked: ((Boolean) -> Unit)?, ) { val clipboard: ClipboardManager = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager val clip: ClipData = ClipData.newPlainText("", content) diff --git a/src/org/bitcoindevkit/devkitwallet/presentation/ui/screens/wallet/SendScreen.kt b/src/org/bitcoindevkit/devkitwallet/presentation/ui/screens/wallet/SendScreen.kt index 12c4186..8c9dd40 100644 --- a/src/org/bitcoindevkit/devkitwallet/presentation/ui/screens/wallet/SendScreen.kt +++ b/src/org/bitcoindevkit/devkitwallet/presentation/ui/screens/wallet/SendScreen.kt @@ -69,13 +69,14 @@ internal fun SendScreen(navController: NavController, sendViewModel: SendViewMod val opReturnMsg: MutableState = remember { mutableStateOf(null) } val (showAdvanced, setShowAdvanced) = rememberSaveable { mutableStateOf(false) } - val textFieldColors = OutlinedTextFieldDefaults.colors( - focusedBorderColor = colorScheme.primary, - unfocusedBorderColor = colorScheme.outline.copy(alpha = 0.30f), - cursorColor = colorScheme.primary, - focusedLabelColor = colorScheme.primary, - unfocusedLabelColor = colorScheme.onSurface.copy(alpha = 0.5f), - ) + val textFieldColors = + OutlinedTextFieldDefaults.colors( + focusedBorderColor = colorScheme.primary, + unfocusedBorderColor = colorScheme.outline.copy(alpha = 0.30f), + cursorColor = colorScheme.primary, + focusedLabelColor = colorScheme.primary, + unfocusedLabelColor = colorScheme.onSurface.copy(alpha = 0.5f), + ) Scaffold( topBar = { @@ -87,11 +88,11 @@ internal fun SendScreen(navController: NavController, sendViewModel: SendViewMod containerColor = colorScheme.surface, ) { paddingValues -> Column( - modifier = Modifier - .fillMaxSize() - .padding(paddingValues) - .verticalScroll(rememberScrollState()) - .padding(horizontal = 24.dp), + modifier = + Modifier.fillMaxSize() + .padding(paddingValues) + .verticalScroll(rememberScrollState()) + .padding(horizontal = 24.dp), horizontalAlignment = Alignment.CenterHorizontally, ) { Spacer(Modifier.height(16.dp)) @@ -116,11 +117,12 @@ internal fun SendScreen(navController: NavController, sendViewModel: SendViewMod ) }, singleLine = true, - textStyle = TextStyle( - color = colorScheme.onSurface, - fontFamily = inter, - fontSize = 15.sp, - ), + textStyle = + TextStyle( + color = colorScheme.onSurface, + fontFamily = inter, + fontSize = 15.sp, + ), colors = textFieldColors, shape = RoundedCornerShape(12.dp), ) @@ -133,11 +135,12 @@ internal fun SendScreen(navController: NavController, sendViewModel: SendViewMod val transactionType = if (sendAll.value) TransactionType.SEND_ALL else TransactionType.STANDARD FormLabel( - text = when { - transactionType == TransactionType.SEND_ALL -> "Amount (Send All)" - recipientList.size > 1 -> "Amount ${index + 1}" - else -> "Amount" - } + text = + when { + transactionType == TransactionType.SEND_ALL -> "Amount (Send All)" + recipientList.size > 1 -> "Amount ${index + 1}" + else -> "Amount" + } ) OutlinedTextField( modifier = Modifier.fillMaxWidth(), @@ -156,11 +159,12 @@ internal fun SendScreen(navController: NavController, sendViewModel: SendViewMod ) }, singleLine = true, - textStyle = TextStyle( - color = colorScheme.onSurface, - fontFamily = inter, - fontSize = 15.sp, - ), + textStyle = + TextStyle( + color = colorScheme.onSurface, + fontFamily = inter, + fontSize = 15.sp, + ), colors = textFieldColors, shape = RoundedCornerShape(12.dp), enabled = transactionType != TransactionType.SEND_ALL, @@ -186,11 +190,12 @@ internal fun SendScreen(navController: NavController, sendViewModel: SendViewMod ) }, singleLine = true, - textStyle = TextStyle( - color = colorScheme.onSurface, - fontFamily = inter, - fontSize = 15.sp, - ), + textStyle = + TextStyle( + color = colorScheme.onSurface, + fontFamily = inter, + fontSize = 15.sp, + ), colors = textFieldColors, shape = RoundedCornerShape(12.dp), ) @@ -199,17 +204,13 @@ internal fun SendScreen(navController: NavController, sendViewModel: SendViewMod color = colorScheme.onSurface.copy(alpha = 0.35f), fontFamily = inter, fontSize = 12.sp, - modifier = Modifier - .fillMaxWidth() - .padding(start = 4.dp, top = 4.dp), + modifier = Modifier.fillMaxWidth().padding(start = 4.dp, top = 4.dp), ) Spacer(Modifier.height(20.dp)) // Advanced options toggle - TextButton( - onClick = { setShowAdvanced(!showAdvanced) }, - ) { + TextButton(onClick = { setShowAdvanced(!showAdvanced) }) { Text( text = if (showAdvanced) "Hide advanced options" else "Advanced options", color = colorScheme.primary, @@ -219,9 +220,7 @@ internal fun SendScreen(navController: NavController, sendViewModel: SendViewMod } AnimatedVisibility(visible = showAdvanced) { - Column( - modifier = Modifier.fillMaxWidth(), - ) { + Column(modifier = Modifier.fillMaxWidth()) { Spacer(Modifier.height(8.dp)) // Send all switch @@ -244,13 +243,14 @@ internal fun SendScreen(navController: NavController, sendViewModel: SendViewMod recipientList.removeAt(recipientList.lastIndex) } }, - colors = SwitchDefaults.colors( - uncheckedBorderColor = colorScheme.outline.copy(alpha = 0.30f), - uncheckedThumbColor = colorScheme.outline, - uncheckedTrackColor = colorScheme.surface, - checkedThumbColor = colorScheme.surface, - checkedTrackColor = colorScheme.primary, - ), + colors = + SwitchDefaults.colors( + uncheckedBorderColor = colorScheme.outline.copy(alpha = 0.30f), + uncheckedThumbColor = colorScheme.outline, + uncheckedTrackColor = colorScheme.surface, + checkedThumbColor = colorScheme.surface, + checkedTrackColor = colorScheme.primary, + ), ) } @@ -263,11 +263,12 @@ internal fun SendScreen(navController: NavController, sendViewModel: SendViewMod value = opReturnMsg.value ?: "", onValueChange = { opReturnMsg.value = it }, singleLine = true, - textStyle = TextStyle( - color = colorScheme.onSurface, - fontFamily = inter, - fontSize = 15.sp, - ), + textStyle = + TextStyle( + color = colorScheme.onSurface, + fontFamily = inter, + fontSize = 15.sp, + ), colors = textFieldColors, shape = RoundedCornerShape(12.dp), ) @@ -295,9 +296,7 @@ internal fun SendScreen(navController: NavController, sendViewModel: SendViewMod } }, enabled = !sendAll.value, - colors = ButtonDefaults.buttonColors( - containerColor = colorScheme.secondary, - ), + colors = ButtonDefaults.buttonColors(containerColor = colorScheme.secondary), shape = RoundedCornerShape(12.dp), modifier = Modifier.width(70.dp), ) { @@ -314,9 +313,7 @@ internal fun SendScreen(navController: NavController, sendViewModel: SendViewMod Button( onClick = { recipientList.add(Recipient("", 0u)) }, enabled = !sendAll.value, - colors = ButtonDefaults.buttonColors( - containerColor = colorScheme.primary, - ), + colors = ButtonDefaults.buttonColors(containerColor = colorScheme.primary), shape = RoundedCornerShape(12.dp), modifier = Modifier.width(70.dp), ) { @@ -333,13 +330,9 @@ internal fun SendScreen(navController: NavController, sendViewModel: SendViewMod // Broadcast button Button( onClick = { setShowDialog(true) }, - colors = ButtonDefaults.buttonColors( - containerColor = colorScheme.secondary, - ), + colors = ButtonDefaults.buttonColors(containerColor = colorScheme.secondary), shape = RoundedCornerShape(16.dp), - modifier = Modifier - .fillMaxWidth() - .height(52.dp), + modifier = Modifier.fillMaxWidth().height(52.dp), ) { Text( text = "Broadcast Transaction", @@ -373,9 +366,7 @@ private fun FormLabel(text: String) { color = colorScheme.onSurface.copy(alpha = 0.6f), fontFamily = inter, fontSize = 13.sp, - modifier = Modifier - .fillMaxWidth() - .padding(bottom = 6.dp), + modifier = Modifier.fillMaxWidth().padding(bottom = 6.dp), ) } @@ -455,7 +446,7 @@ private fun ConfirmDialog( onAction(SendScreenAction.Broadcast(txDataBundle)) setShowDialog(false) } - }, + } ) { Text( text = "Confirm", @@ -465,9 +456,7 @@ private fun ConfirmDialog( } }, dismissButton = { - TextButton( - onClick = { setShowDialog(false) }, - ) { + TextButton(onClick = { setShowDialog(false) }) { Text( text = "Cancel", color = colorScheme.onSurface.copy(alpha = 0.5f), diff --git a/src/org/bitcoindevkit/devkitwallet/presentation/ui/screens/wallet/TransactionHistoryScreen.kt b/src/org/bitcoindevkit/devkitwallet/presentation/ui/screens/wallet/TransactionHistoryScreen.kt index dbbfd51..3f9ea83 100644 --- a/src/org/bitcoindevkit/devkitwallet/presentation/ui/screens/wallet/TransactionHistoryScreen.kt +++ b/src/org/bitcoindevkit/devkitwallet/presentation/ui/screens/wallet/TransactionHistoryScreen.kt @@ -41,11 +41,7 @@ internal fun TransactionHistoryScreen(navController: NavController, activeWallet val scrollState = rememberScrollState() Column( modifier = - Modifier - .padding(paddingValues) - .fillMaxSize() - .padding(top = 6.dp) - .verticalScroll(state = scrollState), + Modifier.padding(paddingValues).fillMaxSize().padding(top = 6.dp).verticalScroll(state = scrollState) ) { if (pendingTransactions.isNotEmpty()) { pendingTransactions.forEach { @@ -53,9 +49,11 @@ internal fun TransactionHistoryScreen(navController: NavController, activeWallet } } if (confirmedTransactions.isNotEmpty()) { - confirmedTransactions.sortedBy { it.confirmationBlock?.height }.forEach { - ConfirmedTransactionCard(it, navController) - } + confirmedTransactions + .sortedBy { it.confirmationBlock?.height } + .forEach { + ConfirmedTransactionCard(it, navController) + } } } } diff --git a/src/org/bitcoindevkit/devkitwallet/presentation/ui/screens/wallet/TransactionScreen.kt b/src/org/bitcoindevkit/devkitwallet/presentation/ui/screens/wallet/TransactionScreen.kt index 2c2a8e5..36efe69 100644 --- a/src/org/bitcoindevkit/devkitwallet/presentation/ui/screens/wallet/TransactionScreen.kt +++ b/src/org/bitcoindevkit/devkitwallet/presentation/ui/screens/wallet/TransactionScreen.kt @@ -45,8 +45,7 @@ internal fun TransactionScreen(txid: String?, navController: NavController) { ) { paddingValues -> Column( modifier = - Modifier - .fillMaxSize() + Modifier.fillMaxSize() .padding(paddingValues) .verticalScroll(rememberScrollState()) .padding(horizontal = 24.dp), @@ -93,10 +92,7 @@ fun TransactionDetailButton(content: String, navController: NavController, txid: }, colors = ButtonDefaults.buttonColors(colorScheme.secondary), shape = RoundedCornerShape(16.dp), - modifier = - Modifier - .height(52.dp) - .fillMaxWidth(), + modifier = Modifier.height(52.dp).fillMaxWidth(), ) { Text( text = content, diff --git a/src/org/bitcoindevkit/devkitwallet/presentation/ui/screens/wallet/WalletHomeScreen.kt b/src/org/bitcoindevkit/devkitwallet/presentation/ui/screens/wallet/WalletHomeScreen.kt index 72ceeeb..faba035 100644 --- a/src/org/bitcoindevkit/devkitwallet/presentation/ui/screens/wallet/WalletHomeScreen.kt +++ b/src/org/bitcoindevkit/devkitwallet/presentation/ui/screens/wallet/WalletHomeScreen.kt @@ -117,8 +117,7 @@ internal fun WalletHomeScreen( Column( modifier = - Modifier - .fillMaxSize() + Modifier.fillMaxSize() .padding(paddingValues) .clickable( interactionSource = interactionSource, @@ -170,32 +169,26 @@ internal fun WalletHomeScreen( // Receive card OutlinedCard( onClick = { navController.navigate(ReceiveScreen) }, - modifier = Modifier - .weight(1f) - .height(120.dp), + modifier = Modifier.weight(1f).height(120.dp), shape = RoundedCornerShape(24.dp), border = BorderStroke(1.5.dp, colorScheme.outline.copy(alpha = 0.15f)), - colors = CardDefaults.outlinedCardColors( - containerColor = Color.Transparent, - ), + colors = CardDefaults.outlinedCardColors(containerColor = Color.Transparent), ) { Column( - modifier = Modifier - .fillMaxSize() - .padding(16.dp), + modifier = Modifier.fillMaxSize().padding(16.dp), verticalArrangement = Arrangement.Center, horizontalAlignment = Alignment.CenterHorizontally, ) { Box( - modifier = Modifier - .size(52.dp) - .clip(RoundedCornerShape(16.dp)) - .background(colorScheme.onSurfaceVariant.copy(alpha = 0.08f)) - .border( - width = 1.dp, - color = colorScheme.onSurfaceVariant.copy(alpha = 0.12f), - shape = RoundedCornerShape(16.dp), - ), + modifier = + Modifier.size(52.dp) + .clip(RoundedCornerShape(16.dp)) + .background(colorScheme.onSurfaceVariant.copy(alpha = 0.08f)) + .border( + width = 1.dp, + color = colorScheme.onSurfaceVariant.copy(alpha = 0.12f), + shape = RoundedCornerShape(16.dp), + ), contentAlignment = Alignment.Center, ) { Icon( @@ -220,32 +213,26 @@ internal fun WalletHomeScreen( OutlinedCard( onClick = { navController.navigate(SendScreen) }, enabled = networkAvailable, - modifier = Modifier - .weight(1f) - .height(120.dp), + modifier = Modifier.weight(1f).height(120.dp), shape = RoundedCornerShape(24.dp), border = BorderStroke(1.5.dp, colorScheme.outline.copy(alpha = 0.15f)), - colors = CardDefaults.outlinedCardColors( - containerColor = Color.Transparent, - ), + colors = CardDefaults.outlinedCardColors(containerColor = Color.Transparent), ) { Column( - modifier = Modifier - .fillMaxSize() - .padding(16.dp), + modifier = Modifier.fillMaxSize().padding(16.dp), verticalArrangement = Arrangement.Center, horizontalAlignment = Alignment.CenterHorizontally, ) { Box( - modifier = Modifier - .size(52.dp) - .clip(RoundedCornerShape(16.dp)) - .background(colorScheme.onSurfaceVariant.copy(alpha = 0.08f)) - .border( - width = 1.dp, - color = colorScheme.onSurfaceVariant.copy(alpha = 0.12f), - shape = RoundedCornerShape(16.dp), - ), + modifier = + Modifier.size(52.dp) + .clip(RoundedCornerShape(16.dp)) + .background(colorScheme.onSurfaceVariant.copy(alpha = 0.08f)) + .border( + width = 1.dp, + color = colorScheme.onSurfaceVariant.copy(alpha = 0.12f), + shape = RoundedCornerShape(16.dp), + ), contentAlignment = Alignment.Center, ) { Icon( @@ -310,10 +297,7 @@ internal fun WalletHomeScreen( if (!networkAvailable) { Spacer(Modifier.height(16.dp)) Row( - Modifier - .fillMaxWidth() - .background(color = colorScheme.primary.copy(alpha = 0.12f)) - .height(40.dp), + Modifier.fillMaxWidth().background(color = colorScheme.primary.copy(alpha = 0.12f)).height(40.dp), verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.Center, ) { @@ -333,18 +317,16 @@ internal fun WalletHomeScreen( private fun QuickAction(icon: ImageVector, label: String, tint: Color, onClick: () -> Unit) { Column( horizontalAlignment = Alignment.CenterHorizontally, - modifier = Modifier - .clickable(onClick = onClick) - .padding(horizontal = 4.dp), + modifier = Modifier.clickable(onClick = onClick).padding(horizontal = 4.dp), ) { Box( - modifier = Modifier - .size(56.dp) - .border( - width = 1.5.dp, - color = tint.copy(alpha = 0.20f), - shape = CircleShape, - ), + modifier = + Modifier.size(56.dp) + .border( + width = 1.5.dp, + color = tint.copy(alpha = 0.20f), + shape = CircleShape, + ), contentAlignment = Alignment.Center, ) { Icon( @@ -388,10 +370,8 @@ internal fun WalletAppBar(onSettingsClick: () -> Unit) { } fun isOnline(context: Context): Boolean { - val connectivityManager = - context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager - val capabilities = - connectivityManager.getNetworkCapabilities(connectivityManager.activeNetwork) + val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager + val capabilities = connectivityManager.getNetworkCapabilities(connectivityManager.activeNetwork) if (capabilities != null) { when { capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> { diff --git a/src/org/bitcoindevkit/devkitwallet/presentation/viewmodels/SendViewModel.kt b/src/org/bitcoindevkit/devkitwallet/presentation/viewmodels/SendViewModel.kt index 3a0a345..2f0a704 100644 --- a/src/org/bitcoindevkit/devkitwallet/presentation/viewmodels/SendViewModel.kt +++ b/src/org/bitcoindevkit/devkitwallet/presentation/viewmodels/SendViewModel.kt @@ -44,7 +44,8 @@ internal class SendViewModel(private val wallet: Wallet) : ViewModel() { ) } - // TransactionType.SEND_ALL -> Wallet.createSendAllTransaction(recipientList[0].address, FeeRate.fromSatPerVb(feeRate), rbfEnabled, opReturnMsg) + // TransactionType.SEND_ALL -> Wallet.createSendAllTransaction(recipientList[0].address, + // FeeRate.fromSatPerVb(feeRate), rbfEnabled, opReturnMsg) TransactionType.SEND_ALL -> { throw NotImplementedError("Send all not implemented") } diff --git a/src/org/bitcoindevkit/devkitwallet/presentation/viewmodels/WalletViewModel.kt b/src/org/bitcoindevkit/devkitwallet/presentation/viewmodels/WalletViewModel.kt index e9ed163..01dd42e 100644 --- a/src/org/bitcoindevkit/devkitwallet/presentation/viewmodels/WalletViewModel.kt +++ b/src/org/bitcoindevkit/devkitwallet/presentation/viewmodels/WalletViewModel.kt @@ -24,9 +24,7 @@ import org.bitcoindevkit.devkitwallet.presentation.viewmodels.mvi.WalletScreenSt private const val TAG = "WalletViewModel" -internal class WalletViewModel( - private val wallet: Wallet, -) : ViewModel() { +internal class WalletViewModel(private val wallet: Wallet) : ViewModel() { var state: WalletScreenState by mutableStateOf(WalletScreenState()) private set @@ -35,11 +33,11 @@ internal class WalletViewModel( fun onAction(action: WalletScreenAction) { when (action) { - WalletScreenAction.SwitchUnit -> switchUnit() - WalletScreenAction.UpdateBalance -> updateBalance() + WalletScreenAction.SwitchUnit -> switchUnit() + WalletScreenAction.UpdateBalance -> updateBalance() WalletScreenAction.ActivateCbfNode -> activateKyoto() - WalletScreenAction.StopKyotoNode -> stopKyotoNode() - WalletScreenAction.ClearSnackbar -> clearSnackbar() + WalletScreenAction.StopKyotoNode -> stopKyotoNode() + WalletScreenAction.ClearSnackbar -> clearSnackbar() } }