Skip to content

Commit 1ebdd90

Browse files
committed
feat: add hardware connect flow screens
1 parent 12c2814 commit 1ebdd90

4 files changed

Lines changed: 363 additions & 0 deletions

File tree

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
package to.bitkit.ui.sheets.hardware
2+
3+
import androidx.compose.foundation.Image
4+
import androidx.compose.foundation.layout.Arrangement
5+
import androidx.compose.foundation.layout.Box
6+
import androidx.compose.foundation.layout.Column
7+
import androidx.compose.foundation.layout.Row
8+
import androidx.compose.foundation.layout.fillMaxSize
9+
import androidx.compose.foundation.layout.fillMaxWidth
10+
import androidx.compose.foundation.layout.navigationBarsPadding
11+
import androidx.compose.foundation.layout.padding
12+
import androidx.compose.foundation.layout.size
13+
import androidx.compose.runtime.Composable
14+
import androidx.compose.ui.Alignment
15+
import androidx.compose.ui.Modifier
16+
import androidx.compose.ui.platform.testTag
17+
import androidx.compose.ui.res.painterResource
18+
import androidx.compose.ui.res.stringResource
19+
import androidx.compose.ui.tooling.preview.Preview
20+
import androidx.compose.ui.unit.dp
21+
import to.bitkit.R
22+
import to.bitkit.ui.components.BodyM
23+
import to.bitkit.ui.components.BottomSheetPreview
24+
import to.bitkit.ui.components.Display
25+
import to.bitkit.ui.components.PrimaryButton
26+
import to.bitkit.ui.components.SecondaryButton
27+
import to.bitkit.ui.components.VerticalSpacer
28+
import to.bitkit.ui.scaffold.SheetTopBar
29+
import to.bitkit.ui.shared.util.gradientBackground
30+
import to.bitkit.ui.theme.AppThemeSurface
31+
import to.bitkit.ui.theme.Colors
32+
import to.bitkit.ui.utils.withAccent
33+
34+
@Composable
35+
fun HwFoundSheet(
36+
deviceModel: String,
37+
modifier: Modifier = Modifier,
38+
isConnecting: Boolean = false,
39+
onConnect: () -> Unit = {},
40+
onCancel: () -> Unit = {},
41+
) {
42+
Content(
43+
deviceModel = deviceModel,
44+
isConnecting = isConnecting,
45+
onConnect = onConnect,
46+
onCancel = onCancel,
47+
modifier = modifier
48+
)
49+
}
50+
51+
@Composable
52+
private fun Content(
53+
deviceModel: String,
54+
modifier: Modifier = Modifier,
55+
isConnecting: Boolean = false,
56+
onConnect: () -> Unit = {},
57+
onCancel: () -> Unit = {},
58+
) {
59+
Column(
60+
modifier = modifier
61+
.fillMaxSize()
62+
.gradientBackground()
63+
.navigationBarsPadding()
64+
.testTag("hw_found_screen")
65+
) {
66+
SheetTopBar(titleText = stringResource(R.string.hardware__found_title))
67+
Column(
68+
modifier = Modifier
69+
.fillMaxWidth()
70+
.padding(horizontal = 32.dp)
71+
) {
72+
Display(stringResource(R.string.hardware__found_header).withAccent(accentColor = Colors.Blue))
73+
VerticalSpacer(8.dp)
74+
BodyM(stringResource(R.string.hardware__found_text, deviceModel), color = Colors.White64)
75+
}
76+
Box(
77+
contentAlignment = Alignment.Center,
78+
modifier = Modifier
79+
.fillMaxWidth()
80+
.weight(1f)
81+
) {
82+
Image(
83+
painter = painterResource(R.drawable.trezor),
84+
contentDescription = null,
85+
modifier = Modifier.size(256.dp)
86+
)
87+
}
88+
Row(
89+
horizontalArrangement = Arrangement.spacedBy(16.dp),
90+
modifier = Modifier
91+
.fillMaxWidth()
92+
.padding(horizontal = 32.dp)
93+
) {
94+
SecondaryButton(
95+
text = stringResource(R.string.common__cancel),
96+
onClick = onCancel,
97+
modifier = Modifier.weight(1f)
98+
)
99+
PrimaryButton(
100+
text = stringResource(R.string.common__connect),
101+
onClick = onConnect,
102+
isLoading = isConnecting,
103+
enabled = !isConnecting,
104+
modifier = Modifier.weight(1f)
105+
)
106+
}
107+
VerticalSpacer(16.dp)
108+
}
109+
}
110+
111+
@Preview(showSystemUi = true)
112+
@Composable
113+
private fun Preview() {
114+
AppThemeSurface {
115+
BottomSheetPreview {
116+
Content(deviceModel = "Trezor Safe 3")
117+
}
118+
}
119+
}
Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
package to.bitkit.ui.sheets.hardware
2+
3+
import androidx.compose.foundation.Image
4+
import androidx.compose.foundation.layout.Box
5+
import androidx.compose.foundation.layout.Column
6+
import androidx.compose.foundation.layout.Row
7+
import androidx.compose.foundation.layout.fillMaxSize
8+
import androidx.compose.foundation.layout.fillMaxWidth
9+
import androidx.compose.foundation.layout.imePadding
10+
import androidx.compose.foundation.layout.navigationBarsPadding
11+
import androidx.compose.foundation.layout.padding
12+
import androidx.compose.foundation.layout.size
13+
import androidx.compose.runtime.Composable
14+
import androidx.compose.ui.Alignment
15+
import androidx.compose.ui.Modifier
16+
import androidx.compose.ui.layout.ContentScale
17+
import androidx.compose.ui.platform.testTag
18+
import androidx.compose.ui.res.painterResource
19+
import androidx.compose.ui.res.stringResource
20+
import androidx.compose.ui.tooling.preview.Preview
21+
import androidx.compose.ui.unit.dp
22+
import to.bitkit.R
23+
import to.bitkit.ui.components.BodyM
24+
import to.bitkit.ui.components.BottomSheetPreview
25+
import to.bitkit.ui.components.Caption13Up
26+
import to.bitkit.ui.components.Display
27+
import to.bitkit.ui.components.PrimaryButton
28+
import to.bitkit.ui.components.TextInput
29+
import to.bitkit.ui.components.VerticalSpacer
30+
import to.bitkit.ui.components.WalletBalanceView
31+
import to.bitkit.ui.scaffold.SheetTopBar
32+
import to.bitkit.ui.shared.util.gradientBackground
33+
import to.bitkit.ui.theme.AppThemeSurface
34+
import to.bitkit.ui.theme.Colors
35+
import to.bitkit.ui.utils.withAccent
36+
37+
@Composable
38+
fun HwPairedSheet(
39+
uiState: HwConnectUiState,
40+
modifier: Modifier = Modifier,
41+
onLabelChange: (String) -> Unit = {},
42+
onFinish: () -> Unit = {},
43+
) {
44+
Content(
45+
uiState = uiState,
46+
onLabelChange = onLabelChange,
47+
onFinish = onFinish,
48+
modifier = modifier
49+
)
50+
}
51+
52+
@Composable
53+
private fun Content(
54+
uiState: HwConnectUiState,
55+
modifier: Modifier = Modifier,
56+
onLabelChange: (String) -> Unit = {},
57+
onFinish: () -> Unit = {},
58+
) {
59+
Column(
60+
modifier = modifier
61+
.fillMaxSize()
62+
.gradientBackground()
63+
.navigationBarsPadding()
64+
.imePadding()
65+
.testTag("hw_paired_screen")
66+
) {
67+
SheetTopBar(titleText = stringResource(R.string.hardware__paired_title))
68+
Column(
69+
modifier = Modifier
70+
.fillMaxWidth()
71+
.padding(horizontal = 32.dp)
72+
) {
73+
Display(stringResource(R.string.hardware__paired_header).withAccent(accentColor = Colors.Blue))
74+
VerticalSpacer(8.dp)
75+
BodyM(stringResource(R.string.hardware__paired_text), color = Colors.White64)
76+
VerticalSpacer(32.dp)
77+
Row(modifier = Modifier.fillMaxWidth()) {
78+
WalletBalanceView(
79+
title = uiState.deviceName,
80+
sats = uiState.balanceSats.toLong(),
81+
icon = painterResource(R.drawable.ic_btc_circle_blue),
82+
)
83+
}
84+
VerticalSpacer(32.dp)
85+
Caption13Up(stringResource(R.string.hardware__paired_label), color = Colors.White64)
86+
VerticalSpacer(8.dp)
87+
TextInput(
88+
value = uiState.labelInput,
89+
onValueChange = onLabelChange,
90+
singleLine = true,
91+
modifier = Modifier
92+
.fillMaxWidth()
93+
.testTag("hw_paired_label_field")
94+
)
95+
}
96+
Box(
97+
contentAlignment = Alignment.Center,
98+
modifier = Modifier
99+
.fillMaxWidth()
100+
.weight(1f)
101+
) {
102+
Image(
103+
painter = painterResource(R.drawable.coin_stack),
104+
contentDescription = null,
105+
contentScale = ContentScale.Fit,
106+
modifier = Modifier.size(220.dp)
107+
)
108+
}
109+
Column(
110+
modifier = Modifier
111+
.fillMaxWidth()
112+
.padding(horizontal = 32.dp)
113+
) {
114+
PrimaryButton(
115+
text = stringResource(R.string.hardware__paired_finish),
116+
onClick = onFinish,
117+
modifier = Modifier.testTag("hw_paired_finish")
118+
)
119+
VerticalSpacer(16.dp)
120+
}
121+
}
122+
}
123+
124+
@Preview(showSystemUi = true)
125+
@Composable
126+
private fun Preview() {
127+
AppThemeSurface {
128+
BottomSheetPreview {
129+
Content(
130+
uiState = HwConnectUiState(
131+
deviceName = "Trezor Safe 3",
132+
balanceSats = 10_562_411uL,
133+
labelInput = "Trezor Safe 3",
134+
),
135+
)
136+
}
137+
}
138+
}
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
package to.bitkit.ui.sheets.hardware
2+
3+
import androidx.compose.foundation.layout.Box
4+
import androidx.compose.foundation.layout.Column
5+
import androidx.compose.foundation.layout.fillMaxSize
6+
import androidx.compose.foundation.layout.fillMaxWidth
7+
import androidx.compose.foundation.layout.navigationBarsPadding
8+
import androidx.compose.foundation.layout.padding
9+
import androidx.compose.runtime.Composable
10+
import androidx.compose.ui.Alignment
11+
import androidx.compose.ui.Modifier
12+
import androidx.compose.ui.platform.testTag
13+
import androidx.compose.ui.res.stringResource
14+
import androidx.compose.ui.tooling.preview.Preview
15+
import androidx.compose.ui.unit.dp
16+
import to.bitkit.R
17+
import to.bitkit.ui.components.BodyM
18+
import to.bitkit.ui.components.BottomSheetPreview
19+
import to.bitkit.ui.components.Display
20+
import to.bitkit.ui.components.SecondaryButton
21+
import to.bitkit.ui.components.VerticalSpacer
22+
import to.bitkit.ui.scaffold.SheetTopBar
23+
import to.bitkit.ui.screens.transfer.components.TransferAnimationView
24+
import to.bitkit.ui.shared.util.gradientBackground
25+
import to.bitkit.ui.theme.AppThemeSurface
26+
import to.bitkit.ui.theme.Colors
27+
import to.bitkit.ui.utils.withAccent
28+
29+
@Composable
30+
fun HwSearchingSheet(
31+
modifier: Modifier = Modifier,
32+
onCancel: () -> Unit = {},
33+
) {
34+
Content(
35+
onCancel = onCancel,
36+
modifier = modifier
37+
)
38+
}
39+
40+
@Composable
41+
private fun Content(
42+
modifier: Modifier = Modifier,
43+
onCancel: () -> Unit = {},
44+
) {
45+
Column(
46+
modifier = modifier
47+
.fillMaxSize()
48+
.gradientBackground()
49+
.navigationBarsPadding()
50+
.testTag("hw_searching_screen")
51+
) {
52+
SheetTopBar(titleText = stringResource(R.string.hardware__connect_title))
53+
Column(
54+
modifier = Modifier
55+
.fillMaxWidth()
56+
.padding(horizontal = 32.dp)
57+
) {
58+
Display(stringResource(R.string.hardware__connect_header).withAccent(accentColor = Colors.Blue))
59+
VerticalSpacer(8.dp)
60+
BodyM(stringResource(R.string.hardware__connect_text), color = Colors.White64)
61+
}
62+
Box(
63+
contentAlignment = Alignment.Center,
64+
modifier = Modifier
65+
.fillMaxWidth()
66+
.weight(1f)
67+
) {
68+
TransferAnimationView(
69+
largeCircleRes = R.drawable.ln_sync_large,
70+
smallCircleRes = R.drawable.ln_sync_small,
71+
)
72+
}
73+
Column(
74+
modifier = Modifier
75+
.fillMaxWidth()
76+
.padding(horizontal = 32.dp)
77+
) {
78+
SecondaryButton(
79+
text = stringResource(R.string.common__cancel),
80+
onClick = onCancel,
81+
)
82+
VerticalSpacer(16.dp)
83+
}
84+
}
85+
}
86+
87+
@Preview(showSystemUi = true)
88+
@Composable
89+
private fun Preview() {
90+
AppThemeSurface {
91+
BottomSheetPreview {
92+
Content()
93+
}
94+
}
95+
}

app/src/main/res/values/strings.xml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,13 +164,24 @@
164164
<string name="fee__slow__description">±1-2 hours</string>
165165
<string name="fee__slow__shortDescription">±1h</string>
166166
<string name="fee__slow__title">Slow</string>
167+
<string name="hardware__connect_header">Searching for &lt;accent&gt;devices&lt;/accent&gt;</string>
168+
<string name="hardware__connect_text">Please connect your hardware wallet now via USB or Bluetooth.</string>
169+
<string name="hardware__connect_title">Connect Device</string>
167170
<string name="hardware__connection_badge_connected_bluetooth">Connected via Bluetooth</string>
168171
<string name="hardware__connection_badge_connected_usb">Connected via USB</string>
169172
<string name="hardware__connection_badge_disconnected_bluetooth">Disconnected via Bluetooth</string>
170173
<string name="hardware__connection_badge_disconnected_usb">Disconnected via USB</string>
174+
<string name="hardware__found_header">Found &lt;accent&gt;Trezor&lt;/accent&gt;</string>
175+
<string name="hardware__found_text">Would you like to securely pair this %1$s with Bitkit?</string>
176+
<string name="hardware__found_title">Found Device</string>
171177
<string name="hardware__intro_header">Add your &lt;accent&gt;hardware wallet&lt;/accent&gt;</string>
172178
<string name="hardware__intro_text">Connect your hardware device to watch or manage your long-term funds.</string>
173179
<string name="hardware__intro_title">Hardware Wallet</string>
180+
<string name="hardware__paired_finish">Finish</string>
181+
<string name="hardware__paired_header">Paired &lt;accent&gt;Trezor&lt;/accent&gt;</string>
182+
<string name="hardware__paired_label">Label Funds</string>
183+
<string name="hardware__paired_text">Bitkit found funds on your device and added these to your balance.</string>
184+
<string name="hardware__paired_title">Device Connected</string>
174185
<string name="hardware__pairing_text">Enter the 6-digit code shown on your hardware device.</string>
175186
<string name="hardware__pairing_title">Pair Device</string>
176187
<string name="hardware__remove_button">Remove %1$s</string>

0 commit comments

Comments
 (0)