Skip to content

Commit bdd8b99

Browse files
feat: display current Esplora server endpoint
1 parent 59b6f7c commit bdd8b99

File tree

10 files changed

+86
-51
lines changed

10 files changed

+86
-51
lines changed

app/src/main/java/org/bitcoindevkit/devkitwallet/domain/BlockchainClient.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ interface BlockchainClient {
1919
fun sync(syncRequest: SyncRequest): Update
2020

2121
fun broadcast(transaction: Transaction): Unit
22+
23+
fun endpoint(): String
2224
}
2325

2426
class EsploraClient(private val url: String) : BlockchainClient {
@@ -39,4 +41,8 @@ class EsploraClient(private val url: String) : BlockchainClient {
3941
override fun broadcast(transaction: Transaction) {
4042
client.broadcast(transaction)
4143
}
44+
45+
override fun endpoint(): String {
46+
return url
47+
}
4248
}

app/src/main/java/org/bitcoindevkit/devkitwallet/domain/Wallet.kt

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -154,14 +154,6 @@ class Wallet private constructor(
154154
// return null
155155
// }
156156

157-
// fun sync() {
158-
// val fullScanRequest = wallet.startFullScan().build()
159-
// val update: Update = currentBlockchainClient?.fullScan(fullScanRequest, 20u) ?: throw IllegalStateException("Blockchain client not initialized")
160-
// Log.i(TAG, "Wallet sync complete with update $update")
161-
// wallet.applyUpdate(update)
162-
// wallet.persist(connection)
163-
// }
164-
165157
private fun fullScan() {
166158
val fullScanRequest = wallet.startFullScan().build()
167159
val update: Update = currentBlockchainClient?.fullScan(
@@ -195,14 +187,8 @@ class Wallet private constructor(
195187

196188
fun getNewAddress(): AddressInfo = wallet.revealNextAddress(KeychainKind.EXTERNAL)
197189

198-
// fun getLastUnusedAddress(): AddressInfo = wallet.getAddress(AddressIndex.LastUnused)
199-
200-
// fun isBlockChainCreated() = ::electrumServer.isInitialized
201-
202-
// fun getElectrumURL(): String = electrumServer.getElectrumURL()
203-
204-
// fun isElectrumServerDefault(): Boolean = electrumServer.isElectrumServerDefault()
205-
190+
fun getClientEndpoint(): String = currentBlockchainClient?.endpoint() ?: "No active client"
191+
206192
// fun setElectrumSettings(electrumSettings: ElectrumSettings) {
207193
// when (electrumSettings) {
208194
// ElectrumSettings.DEFAULT -> electrumServer.useDefaultElectrum()

app/src/main/java/org/bitcoindevkit/devkitwallet/presentation/navigation/Destinations.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ object AboutScreen
2525
@Serializable
2626
object RecoveryPhraseScreen
2727
@Serializable
28-
object CustomBlockchainClientScreen
28+
object BlockchainClientScreen
2929

3030
// Wallet navigation destinations
3131
@Serializable

app/src/main/java/org/bitcoindevkit/devkitwallet/presentation/navigation/HomeNavigation.kt

Lines changed: 25 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,18 @@ import androidx.navigation.compose.composable
1515
import org.bitcoindevkit.devkitwallet.domain.Wallet
1616
import org.bitcoindevkit.devkitwallet.presentation.ui.screens.WalletRoot
1717
import org.bitcoindevkit.devkitwallet.presentation.ui.screens.drawer.AboutScreen
18-
import org.bitcoindevkit.devkitwallet.presentation.ui.screens.drawer.CustomBlockchainClient
18+
import org.bitcoindevkit.devkitwallet.presentation.ui.screens.drawer.BlockchainClientScreen
1919
import org.bitcoindevkit.devkitwallet.presentation.ui.screens.drawer.RecoveryPhraseScreen
20+
import org.bitcoindevkit.devkitwallet.presentation.viewmodels.WalletViewModel
21+
22+
private const val ANIMATION_DURATION: Int = 400
2023

2124
@Composable
2225
fun HomeNavigation(
2326
activeWallet: Wallet
2427
) {
2528
val navController: NavHostController = rememberNavController()
26-
val animationDuration = 400
29+
val walletViewModel = WalletViewModel(activeWallet)
2730

2831
NavHost(
2932
navController = navController,
@@ -32,56 +35,59 @@ fun HomeNavigation(
3235

3336
composable<WalletScreen>(
3437
exitTransition = {
35-
slideOutOfContainer(AnimatedContentTransitionScope.SlideDirection.Start, animationSpec = tween(animationDuration))
38+
slideOutOfContainer(AnimatedContentTransitionScope.SlideDirection.Start, animationSpec = tween(ANIMATION_DURATION))
3639
},
3740
popEnterTransition = {
38-
slideIntoContainer(AnimatedContentTransitionScope.SlideDirection.End, animationSpec = tween(animationDuration))
41+
slideIntoContainer(AnimatedContentTransitionScope.SlideDirection.End, animationSpec = tween(ANIMATION_DURATION))
3942
},
40-
) { WalletRoot(navController = navController, activeWallet = activeWallet) }
43+
) { WalletRoot(navController = navController, activeWallet = activeWallet, walletViewModel = walletViewModel) }
4144

4245
composable<AboutScreen>(
4346
enterTransition = {
44-
slideIntoContainer(AnimatedContentTransitionScope.SlideDirection.Start, animationSpec = tween(animationDuration))
47+
slideIntoContainer(AnimatedContentTransitionScope.SlideDirection.Start, animationSpec = tween(ANIMATION_DURATION))
4548
},
4649
popEnterTransition = {
47-
slideIntoContainer(AnimatedContentTransitionScope.SlideDirection.Start, animationSpec = tween(animationDuration))
50+
slideIntoContainer(AnimatedContentTransitionScope.SlideDirection.Start, animationSpec = tween(ANIMATION_DURATION))
4851
},
4952
exitTransition = {
50-
slideOutOfContainer(AnimatedContentTransitionScope.SlideDirection.Start, animationSpec = tween(animationDuration))
53+
slideOutOfContainer(AnimatedContentTransitionScope.SlideDirection.Start, animationSpec = tween(ANIMATION_DURATION))
5154
},
5255
popExitTransition = {
53-
slideOutOfContainer(AnimatedContentTransitionScope.SlideDirection.Start, animationSpec = tween(animationDuration))
56+
slideOutOfContainer(AnimatedContentTransitionScope.SlideDirection.Start, animationSpec = tween(ANIMATION_DURATION))
5457
},
5558
) { AboutScreen(navController = navController) }
5659

5760
composable<RecoveryPhraseScreen>(
5861
enterTransition = {
59-
slideIntoContainer(AnimatedContentTransitionScope.SlideDirection.Start, animationSpec = tween(animationDuration))
62+
slideIntoContainer(AnimatedContentTransitionScope.SlideDirection.Start, animationSpec = tween(ANIMATION_DURATION))
6063
},
6164
popEnterTransition = {
62-
slideIntoContainer(AnimatedContentTransitionScope.SlideDirection.Start, animationSpec = tween(animationDuration))
65+
slideIntoContainer(AnimatedContentTransitionScope.SlideDirection.Start, animationSpec = tween(ANIMATION_DURATION))
6366
},
6467
exitTransition = {
65-
slideOutOfContainer(AnimatedContentTransitionScope.SlideDirection.Start, animationSpec = tween(animationDuration))
68+
slideOutOfContainer(AnimatedContentTransitionScope.SlideDirection.Start, animationSpec = tween(ANIMATION_DURATION))
6669
},
6770
popExitTransition = {
68-
slideOutOfContainer(AnimatedContentTransitionScope.SlideDirection.Start, animationSpec = tween(animationDuration))
71+
slideOutOfContainer(AnimatedContentTransitionScope.SlideDirection.Start, animationSpec = tween(ANIMATION_DURATION))
6972
}
7073
) { RecoveryPhraseScreen(activeWallet.getRecoveryPhrase(), navController = navController) }
7174

72-
composable<CustomBlockchainClientScreen>(
75+
composable<BlockchainClientScreen>(
7376
enterTransition = {
74-
slideIntoContainer(AnimatedContentTransitionScope.SlideDirection.Start, animationSpec = tween(animationDuration))
77+
slideIntoContainer(AnimatedContentTransitionScope.SlideDirection.Start, animationSpec = tween(ANIMATION_DURATION))
7578
},
7679
popEnterTransition = {
77-
slideIntoContainer(AnimatedContentTransitionScope.SlideDirection.Start, animationSpec = tween(animationDuration))
80+
slideIntoContainer(AnimatedContentTransitionScope.SlideDirection.Start, animationSpec = tween(ANIMATION_DURATION))
7881
},
7982
exitTransition = {
80-
slideOutOfContainer(AnimatedContentTransitionScope.SlideDirection.Start, animationSpec = tween(animationDuration))
83+
slideOutOfContainer(AnimatedContentTransitionScope.SlideDirection.Start, animationSpec = tween(ANIMATION_DURATION))
8184
},
8285
popExitTransition = {
83-
slideOutOfContainer(AnimatedContentTransitionScope.SlideDirection.Start, animationSpec = tween(animationDuration))
86+
slideOutOfContainer(AnimatedContentTransitionScope.SlideDirection.Start, animationSpec = tween(ANIMATION_DURATION))
8487
}
85-
) { CustomBlockchainClient(navController = navController) }
88+
) { BlockchainClientScreen(
89+
state = walletViewModel.state,
90+
navController = navController
91+
) }
8692
}
8793
}

app/src/main/java/org/bitcoindevkit/devkitwallet/presentation/navigation/WalletNavigation.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,10 @@ private const val ANIMATION_DURATION: Int = 400
3030
@Composable
3131
fun WalletNavigation(
3232
drawerState: DrawerState,
33-
activeWallet: Wallet
33+
activeWallet: Wallet,
34+
walletViewModel: WalletViewModel
3435
) {
3536
val navController: NavHostController = rememberNavController()
36-
val walletViewModel = WalletViewModel(activeWallet)
3737
val addressViewModel = AddressViewModel(activeWallet)
3838
val sendViewModel = SendViewModel(activeWallet)
3939

app/src/main/java/org/bitcoindevkit/devkitwallet/presentation/ui/screens/WalletRoot.kt

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,22 +41,23 @@ import androidx.navigation.NavController
4141
import com.composables.icons.lucide.History
4242
import com.composables.icons.lucide.Info
4343
import com.composables.icons.lucide.Lucide
44-
import com.composables.icons.lucide.Satellite
4544
import com.composables.icons.lucide.SatelliteDish
4645
import org.bitcoindevkit.devkitwallet.presentation.theme.DevkitWalletColors
4746
import org.bitcoindevkit.devkitwallet.presentation.navigation.WalletNavigation
4847
import org.bitcoindevkit.devkitwallet.R
4948
import org.bitcoindevkit.devkitwallet.domain.Wallet
5049
import org.bitcoindevkit.devkitwallet.presentation.navigation.AboutScreen
51-
import org.bitcoindevkit.devkitwallet.presentation.navigation.CustomBlockchainClientScreen
50+
import org.bitcoindevkit.devkitwallet.presentation.navigation.BlockchainClientScreen
5251
import org.bitcoindevkit.devkitwallet.presentation.navigation.RecoveryPhraseScreen
5352
import org.bitcoindevkit.devkitwallet.presentation.theme.quattroRegular
53+
import org.bitcoindevkit.devkitwallet.presentation.viewmodels.WalletViewModel
5454

5555
@OptIn(androidx.compose.animation.ExperimentalAnimationApi::class)
5656
@Composable
5757
internal fun WalletRoot(
5858
navController: NavController,
59-
activeWallet: Wallet
59+
activeWallet: Wallet,
60+
walletViewModel: WalletViewModel
6061
) {
6162
val drawerState = rememberDrawerState(DrawerValue.Closed)
6263

@@ -139,7 +140,7 @@ internal fun WalletRoot(
139140
icon = { Icon(Lucide.SatelliteDish, contentDescription = "Esplora Client", tint = DevkitWalletColors.white) },
140141
label = { DrawerItemLabel("Esplora Client") },
141142
selected = items[2] == selectedItem.value,
142-
onClick = { navController.navigate(CustomBlockchainClientScreen) },
143+
onClick = { navController.navigate(BlockchainClientScreen) },
143144
colors = navigationItemColors,
144145
modifier = Modifier.padding(NavigationDrawerItemDefaults.ItemPadding),
145146
)
@@ -149,7 +150,8 @@ internal fun WalletRoot(
149150
content = {
150151
WalletNavigation(
151152
drawerState = drawerState,
152-
activeWallet = activeWallet
153+
activeWallet = activeWallet,
154+
walletViewModel = walletViewModel
153155
)
154156
}
155157
)
Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,23 +9,31 @@ import androidx.compose.foundation.layout.Column
99
import androidx.compose.foundation.layout.fillMaxSize
1010
import androidx.compose.foundation.layout.padding
1111
import androidx.compose.material3.Scaffold
12+
import androidx.compose.material3.Text
1213
import androidx.compose.runtime.Composable
1314
import androidx.compose.runtime.MutableState
1415
import androidx.compose.runtime.mutableStateOf
1516
import androidx.compose.runtime.remember
1617
import androidx.compose.ui.Modifier
1718
import androidx.compose.ui.platform.LocalFocusManager
1819
import androidx.compose.ui.unit.dp
20+
import androidx.compose.ui.unit.sp
1921
import androidx.navigation.NavController
2022
import org.bitcoindevkit.devkitwallet.presentation.navigation.WalletScreen
2123
import org.bitcoindevkit.devkitwallet.presentation.ui.components.SecondaryScreensAppBar
2224
import org.bitcoindevkit.devkitwallet.presentation.theme.DevkitWalletColors
25+
import org.bitcoindevkit.devkitwallet.presentation.theme.quattroBold
26+
import org.bitcoindevkit.devkitwallet.presentation.theme.quattroRegular
27+
import org.bitcoindevkit.devkitwallet.presentation.viewmodels.mvi.WalletScreenState
2328

2429
@Composable
25-
internal fun CustomBlockchainClient(navController: NavController) {
30+
internal fun BlockchainClientScreen(
31+
state: WalletScreenState,
32+
navController: NavController
33+
) {
2634
val focusManager = LocalFocusManager.current
2735
// val isBlockChainCreated = Wallet.isBlockChainCreated()
28-
val electrumServer: MutableState<String> = remember { mutableStateOf("") }
36+
val serverEndpoint: MutableState<String> = remember { mutableStateOf("") }
2937
val isChecked: MutableState<Boolean> = remember { mutableStateOf(false) }
3038
// if (isBlockChainCreated) {
3139
// electrumServer.value = Wallet.getElectrumURL()
@@ -47,7 +55,18 @@ internal fun CustomBlockchainClient(navController: NavController) {
4755
.padding(paddingValues)
4856
.padding(all = 16.dp),
4957
) {
50-
58+
Text(
59+
text = "Current Esplora client endpoint",
60+
color = DevkitWalletColors.white,
61+
fontSize = 18.sp,
62+
fontFamily = quattroBold,
63+
)
64+
Text(
65+
text = state.esploraEndpoint,
66+
color = DevkitWalletColors.white,
67+
fontSize = 14.sp,
68+
fontFamily = quattroRegular,
69+
)
5170
// Row(verticalAlignment = Alignment.CenterVertically) {
5271
// Text(
5372
// text = "Use default electrum URL",

app/src/main/java/org/bitcoindevkit/devkitwallet/presentation/ui/screens/intro/ActiveWalletsScreen.kt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
package org.bitcoindevkit.devkitwallet.presentation.ui.screens.intro
77

8+
import android.util.Log
89
import androidx.compose.foundation.background
910
import androidx.compose.foundation.clickable
1011
import androidx.compose.foundation.layout.Arrangement
@@ -15,7 +16,6 @@ import androidx.compose.foundation.layout.fillMaxSize
1516
import androidx.compose.foundation.layout.fillMaxWidth
1617
import androidx.compose.foundation.layout.height
1718
import androidx.compose.foundation.layout.padding
18-
import androidx.compose.foundation.layout.windowInsetsTopHeight
1919
import androidx.compose.foundation.shape.RoundedCornerShape
2020
import androidx.compose.material3.Scaffold
2121
import androidx.compose.material3.Text
@@ -29,16 +29,18 @@ import org.bitcoindevkit.devkitwallet.presentation.WalletCreateType
2929
import org.bitcoindevkit.devkitwallet.data.SingleWallet
3030
import org.bitcoindevkit.devkitwallet.presentation.ui.components.SecondaryScreensAppBar
3131
import org.bitcoindevkit.devkitwallet.presentation.theme.DevkitWalletColors
32-
import org.bitcoindevkit.devkitwallet.presentation.theme.monoRegular
33-
import org.bitcoindevkit.devkitwallet.presentation.theme.quattroBold
3432
import org.bitcoindevkit.devkitwallet.presentation.theme.quattroRegular
3533

34+
private const val TAG = "ActiveWalletsScreen"
35+
3636
@Composable
3737
internal fun ActiveWalletsScreen(
3838
activeWallets: List<SingleWallet>,
3939
navController: NavController,
4040
onBuildWalletButtonClicked: (WalletCreateType) -> Unit
4141
) {
42+
Log.i(TAG, "Active wallets = $activeWallets")
43+
Log.i(TAG, "Active wallets script types = ${activeWallets.first().scriptType}")
4244
Scaffold(
4345
topBar = {
4446
SecondaryScreensAppBar(title = "Choose a Wallet", navigation = { navController.navigateUp() })

app/src/main/java/org/bitcoindevkit/devkitwallet/presentation/viewmodels/WalletViewModel.kt

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,17 @@ import org.bitcoindevkit.devkitwallet.presentation.viewmodels.mvi.WalletScreenSt
2121

2222
private const val TAG = "WalletViewModel"
2323

24-
internal class WalletViewModel(
24+
class WalletViewModel(
2525
private val wallet: Wallet
2626
) : ViewModel() {
2727

2828
var state: WalletScreenState by mutableStateOf(WalletScreenState())
2929
private set
3030

31+
init {
32+
updateClientEndpoint()
33+
}
34+
3135
fun onAction(action: WalletScreenAction) {
3236
when (action) {
3337
WalletScreenAction.UpdateBalance -> updateBalance()
@@ -53,4 +57,13 @@ internal class WalletViewModel(
5357
}
5458
}
5559
}
60+
61+
private fun updateClientEndpoint() {
62+
viewModelScope.launch(Dispatchers.IO) {
63+
val endpoint = wallet.getClientEndpoint()
64+
withContext(Dispatchers.Main) {
65+
state = state.copy(esploraEndpoint = endpoint)
66+
}
67+
}
68+
}
5669
}

app/src/main/java/org/bitcoindevkit/devkitwallet/presentation/viewmodels/mvi/MviWalletScreen.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ import org.bitcoindevkit.devkitwallet.domain.CurrencyUnit
1010
data class WalletScreenState(
1111
val balance: ULong = 0u,
1212
val syncing: Boolean = false,
13-
val unit: CurrencyUnit = CurrencyUnit.Bitcoin
13+
val unit: CurrencyUnit = CurrencyUnit.Bitcoin,
14+
val esploraEndpoint: String = ""
1415
)
1516

1617
sealed interface WalletScreenAction {

0 commit comments

Comments
 (0)