Skip to content

Commit 67b46d0

Browse files
authored
Merge pull request #259 from synonymdev/feat/onboarding-test-ids
Onboarding test ids
2 parents 93a5473 + c2a431b commit 67b46d0

File tree

11 files changed

+94
-29
lines changed

11 files changed

+94
-29
lines changed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
# Bitkit Android (Native)
22

33
> [!CAUTION]
4-
> ⚠️This **NOT** the repository of the Bitkit app from the app stores!
5-
> ⚠️Work-in-progress
4+
> ⚠️This **NOT** the repository of the Bitkit app from the app stores!<br>
5+
> ⚠️Work-in-progress<br>
66
> The Bitkit app repository is here: **[github.com/synonymdev/bitkit](https://github.com/synonymdev/bitkit)**
77
88
---

app/src/main/java/to/bitkit/ui/MainActivity.kt

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ import androidx.compose.animation.fadeOut
1010
import androidx.compose.runtime.LaunchedEffect
1111
import androidx.compose.runtime.getValue
1212
import androidx.compose.runtime.rememberCoroutineScope
13+
import androidx.compose.ui.Modifier
14+
import androidx.compose.ui.semantics.semantics
15+
import androidx.compose.ui.semantics.testTagsAsResourceId
1316
import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
1417
import androidx.fragment.app.FragmentActivity
1518
import androidx.lifecycle.compose.collectAsStateWithLifecycle
@@ -75,7 +78,11 @@ class MainActivity : FragmentActivity() {
7578
installSplashScreen()
7679
enableAppEdgeToEdge()
7780
setContent {
78-
AppThemeSurface {
81+
AppThemeSurface(
82+
modifier = Modifier.semantics {
83+
testTagsAsResourceId = true // see https://github.com/appium/appium/issues/15138
84+
}
85+
) {
7986
val scope = rememberCoroutineScope()
8087
if (!walletViewModel.walletExists) {
8188
val startupNavController = rememberNavController()

app/src/main/java/to/bitkit/ui/onboarding/CreateWalletScreen.kt

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import androidx.compose.runtime.Composable
1414
import androidx.compose.ui.Alignment
1515
import androidx.compose.ui.Modifier
1616
import androidx.compose.ui.layout.ContentScale
17+
import androidx.compose.ui.platform.testTag
1718
import androidx.compose.ui.res.painterResource
1819
import androidx.compose.ui.res.stringResource
1920
import androidx.compose.ui.text.SpanStyle
@@ -33,10 +34,11 @@ import to.bitkit.ui.utils.withAccent
3334
fun CreateWalletScreen(
3435
onCreateClick: () -> Unit,
3536
onRestoreClick: () -> Unit,
37+
modifier: Modifier = Modifier,
3638
) {
3739
Box(
3840
contentAlignment = Alignment.TopCenter,
39-
modifier = Modifier
41+
modifier = modifier
4042
.fillMaxSize()
4143
) {
4244
Image(
@@ -70,20 +72,24 @@ fun CreateWalletScreen(
7072
PrimaryButton(
7173
text = stringResource(R.string.onboarding__new_wallet),
7274
onClick = onCreateClick,
73-
modifier = Modifier.weight(1f)
75+
modifier = Modifier
76+
.weight(1f)
77+
.testTag("NewWallet")
7478
)
7579
SecondaryButton(
7680
text = stringResource(R.string.onboarding__restore),
7781
onClick = onRestoreClick,
78-
modifier = Modifier.weight(1f)
82+
modifier = Modifier
83+
.weight(1f)
84+
.testTag("RestoreWallet")
7985
)
8086
}
8187
Spacer(modifier = Modifier.height(16.dp))
8288
}
8389
}
8490
}
8591

86-
@Preview(showBackground = true)
92+
@Preview(showSystemUi = true)
8793
@Composable
8894
private fun CreateWalletScreenPreview() {
8995
AppThemeSurface {

app/src/main/java/to/bitkit/ui/onboarding/CreateWalletWithPassphraseScreen.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import androidx.compose.runtime.setValue
3232
import androidx.compose.ui.Alignment
3333
import androidx.compose.ui.Modifier
3434
import androidx.compose.ui.layout.ContentScale
35+
import androidx.compose.ui.platform.testTag
3536
import androidx.compose.ui.res.painterResource
3637
import androidx.compose.ui.res.stringResource
3738
import androidx.compose.ui.text.input.ImeAction
@@ -122,19 +123,21 @@ fun CreateWalletWithPassphraseScreen(
122123
modifier = Modifier
123124
.fillMaxWidth()
124125
.padding(top = 4.dp)
126+
.testTag("PassphraseInput")
125127
)
126128
Spacer(modifier = Modifier.height(32.dp))
127129
PrimaryButton(
128130
text = stringResource(R.string.onboarding__create_new_wallet),
129131
onClick = { onCreateClick(bip39Passphrase) },
130132
enabled = bip39Passphrase.isNotBlank(),
133+
modifier = Modifier.testTag("CreateNewWallet")
131134
)
132135
Spacer(modifier = Modifier.height(32.dp))
133136
}
134137
}
135138
}
136139

137-
@Preview(showBackground = true)
140+
@Preview(showSystemUi = true)
138141
@Composable
139142
private fun CreateWalletWithPassphraseScreenPreview() {
140143
AppThemeSurface {

app/src/main/java/to/bitkit/ui/onboarding/IntroScreen.kt

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import androidx.compose.runtime.Composable
1515
import androidx.compose.ui.Alignment
1616
import androidx.compose.ui.Modifier
1717
import androidx.compose.ui.layout.ContentScale
18+
import androidx.compose.ui.platform.testTag
1819
import androidx.compose.ui.res.painterResource
1920
import androidx.compose.ui.res.stringResource
2021
import androidx.compose.ui.tooling.preview.Preview
@@ -80,12 +81,16 @@ fun IntroScreen(
8081
PrimaryButton(
8182
text = stringResource(R.string.onboarding__get_started),
8283
onClick = onStartClick,
83-
modifier = Modifier.weight(1f)
84+
modifier = Modifier
85+
.weight(1f)
86+
.testTag("GetStarted")
8487
)
8588
SecondaryButton(
8689
text = stringResource(R.string.onboarding__skip_intro),
8790
onClick = onSkipClick,
88-
modifier = Modifier.weight(1f)
91+
modifier = Modifier
92+
.weight(1f)
93+
.testTag("SkipIntro")
8994
)
9095
}
9196
}

app/src/main/java/to/bitkit/ui/onboarding/OnboardingSlidesScreen.kt

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import androidx.compose.ui.Modifier
3333
import androidx.compose.ui.draw.alpha
3434
import androidx.compose.ui.graphics.Color
3535
import androidx.compose.ui.layout.ContentScale
36+
import androidx.compose.ui.platform.testTag
3637
import androidx.compose.ui.res.painterResource
3738
import androidx.compose.ui.res.stringResource
3839
import androidx.compose.ui.text.font.FontWeight
@@ -77,6 +78,7 @@ fun OnboardingSlidesScreen(
7778
title = stringResource(R.string.onboarding__slide0_header),
7879
titleAccentColor = Colors.Blue,
7980
text = stringResource(R.string.onboarding__slide0_text),
81+
modifier = Modifier.testTag("Slide0")
8082
)
8183

8284
1 -> OnboardingTab(
@@ -85,25 +87,29 @@ fun OnboardingSlidesScreen(
8587
titleAccentColor = Colors.Purple,
8688
text = stringResource(R.string.onboarding__slide1_text),
8789
disclaimerText = stringResource(R.string.onboarding__slide1_note), // TODO use GeoBlocking state
90+
modifier = Modifier.testTag("Slide1")
8891
)
8992

9093
2 -> OnboardingTab(
9194
imageResId = R.drawable.spark,
9295
title = stringResource(R.string.onboarding__slide2_header),
9396
titleAccentColor = Colors.Yellow,
9497
text = stringResource(R.string.onboarding__slide2_text),
98+
modifier = Modifier.testTag("Slide2")
9599
)
96100

97101
3 -> OnboardingTab(
98102
imageResId = R.drawable.shield,
99103
title = stringResource(R.string.onboarding__slide3_header),
100104
titleAccentColor = Colors.Green,
101105
text = stringResource(R.string.onboarding__slide3_text),
106+
modifier = Modifier.testTag("Slide3")
102107
)
103108

104109
4 -> CreateWalletScreen(
105110
onCreateClick = onCreateClick,
106111
onRestoreClick = onRestoreClick,
112+
modifier = Modifier.testTag("Slide4")
107113
)
108114
}
109115
}
@@ -153,7 +159,10 @@ fun OnboardingSlidesScreen(
153159
title = { },
154160
actions = {
155161
if (pagerState.currentPage == 4) {
156-
TextButton(onClick = onAdvancedSetupClick) {
162+
TextButton(
163+
onClick = onAdvancedSetupClick,
164+
modifier = Modifier.testTag("Passphrase")
165+
) {
157166
Text(
158167
text = stringResource(R.string.onboarding__advanced_setup),
159168
fontSize = 17.sp,
@@ -162,9 +171,12 @@ fun OnboardingSlidesScreen(
162171
)
163172
}
164173
} else {
165-
TextButton(onClick = {
166-
scope.launch { pagerState.animateScrollToPage(4) }
167-
}) {
174+
TextButton(
175+
onClick = {
176+
scope.launch { pagerState.animateScrollToPage(pagerState.pageCount - 1) }
177+
},
178+
modifier = Modifier.testTag("SkipButton")
179+
) {
168180
Text(
169181
text = stringResource(R.string.onboarding__skip),
170182
fontSize = 17.sp,
@@ -218,7 +230,7 @@ fun OnboardingTab(
218230
}
219231
}
220232

221-
@Preview(showSystemUi = false)
233+
@Preview(showSystemUi = true)
222234
@Composable
223235
private fun OnboardingViewPreview() {
224236
AppThemeSurface {

app/src/main/java/to/bitkit/ui/onboarding/RestoreWalletScreen.kt

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ import androidx.compose.ui.Modifier
4444
import androidx.compose.ui.focus.onFocusChanged
4545
import androidx.compose.ui.layout.onGloballyPositioned
4646
import androidx.compose.ui.layout.positionInParent
47+
import androidx.compose.ui.platform.testTag
4748
import androidx.compose.ui.res.stringResource
4849
import androidx.compose.ui.text.font.FontWeight
4950
import androidx.compose.ui.text.input.ImeAction
@@ -283,6 +284,7 @@ fun RestoreWalletView(
283284
modifier = Modifier
284285
.fillMaxWidth()
285286
.padding(top = 4.dp)
287+
.testTag("PassphraseInput")
286288
)
287289
Spacer(modifier = Modifier.height(16.dp))
288290
BodyS(
@@ -335,7 +337,9 @@ fun RestoreWalletView(
335337
bip39Passphrase = ""
336338
},
337339
enabled = areButtonsEnabled,
338-
modifier = Modifier.weight(1f)
340+
modifier = Modifier
341+
.weight(1f)
342+
.testTag("AdvancedButton")
339343
)
340344
}
341345
PrimaryButton(
@@ -344,7 +348,9 @@ fun RestoreWalletView(
344348
onRestoreClick(bip39Mnemonic, bip39Passphrase.takeIf { it.isNotEmpty() })
345349
},
346350
enabled = areButtonsEnabled,
347-
modifier = Modifier.weight(1f)
351+
modifier = Modifier
352+
.weight(1f)
353+
.testTag("RestoreButton")
348354
)
349355
}
350356
}
@@ -443,7 +449,7 @@ fun MnemonicInputField(
443449
modifier = Modifier
444450
.onFocusChanged { onFocusChanged(it.isFocused) }
445451
.onGloballyPositioned { coordinates ->
446-
val position = coordinates.positionInParent().y.toInt() * 2 //double the scroll to ensure enough space
452+
val position = coordinates.positionInParent().y.toInt() * 2 // double the scroll to ensure enough space
447453
onPositionChanged(position)
448454
}
449455
)

app/src/main/java/to/bitkit/ui/onboarding/TermsOfUseScreen.kt

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import androidx.compose.ui.Alignment
3131
import androidx.compose.ui.Modifier
3232
import androidx.compose.ui.graphics.Brush
3333
import androidx.compose.ui.graphics.Color
34+
import androidx.compose.ui.platform.testTag
3435
import androidx.compose.ui.res.stringResource
3536
import androidx.compose.ui.text.AnnotatedString
3637
import androidx.compose.ui.tooling.preview.Preview
@@ -71,6 +72,7 @@ fun TermsOfUseScreen(
7172
.fillMaxWidth()
7273
.padding(horizontal = horizontalPadding)
7374
.verticalScroll(rememberScrollState())
75+
.testTag("TOS")
7476
) {
7577
Spacer(modifier = Modifier.height(16.dp))
7678
Display(text = stringResource(R.string.onboarding__tos_header).withAccent())
@@ -102,15 +104,19 @@ fun TermsOfUseScreen(
102104
.withAccentLink(Env.TERMS_OF_USE_URL),
103105
isChecked = termsAccepted,
104106
onCheckedChange = { termsAccepted = it },
105-
modifier = Modifier.padding(horizontal = horizontalPadding)
107+
modifier = Modifier
108+
.padding(horizontal = horizontalPadding)
109+
.testTag("Check1")
106110
)
107111
CheckButton(
108112
title = stringResource(R.string.onboarding__pp_checkbox),
109113
htmlText = stringResource(R.string.onboarding__pp_checkbox_value)
110114
.withAccentLink("https://bitkit.to/privacy-policy"),
111115
isChecked = privacyAccepted,
112116
onCheckedChange = { privacyAccepted = it },
113-
modifier = Modifier.padding(horizontal = horizontalPadding)
117+
modifier = Modifier
118+
.padding(horizontal = horizontalPadding)
119+
.testTag("Check2")
114120
)
115121

116122
Spacer(modifier = Modifier.height(24.dp))
@@ -119,7 +125,9 @@ fun TermsOfUseScreen(
119125
text = stringResource(R.string.common__continue),
120126
onClick = onNavigateToIntro,
121127
enabled = termsAccepted && privacyAccepted,
122-
modifier = Modifier.padding(horizontal = horizontalPadding)
128+
modifier = Modifier
129+
.padding(horizontal = horizontalPadding)
130+
.testTag("Continue")
123131
)
124132
}
125133
}
@@ -185,7 +193,7 @@ private fun CheckmarkBox(isChecked: Boolean) {
185193
}
186194
}
187195

188-
@Preview
196+
@Preview(showSystemUi = true)
189197
@Composable
190198
private fun TermsPreview() {
191199
AppThemeSurface {

app/src/main/java/to/bitkit/ui/onboarding/WalletInitResultView.kt

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import androidx.compose.runtime.remember
1717
import androidx.compose.runtime.setValue
1818
import androidx.compose.ui.Alignment
1919
import androidx.compose.ui.Modifier
20+
import androidx.compose.ui.platform.testTag
2021
import androidx.compose.ui.res.painterResource
2122
import androidx.compose.ui.res.stringResource
2223
import androidx.compose.ui.tooling.preview.Preview
@@ -109,13 +110,20 @@ fun WalletInitResultView(
109110
}
110111
onButtonClick()
111112
},
113+
modifier = Modifier.testTag(
114+
when (result) {
115+
is WalletInitResult.Restored -> "GetStartedButton"
116+
is WalletInitResult.Failed -> "TryAgainButton"
117+
}
118+
)
112119
)
113120

114121
if (result is WalletInitResult.Failed && retryCount > 1 && onProceedWithoutRestore != null) {
115122
Spacer(modifier = Modifier.height(12.dp))
116123
SecondaryButton(
117124
text = stringResource(R.string.onboarding__restore_no_backup_button),
118-
onClick = { showProceedDialog = true }
125+
onClick = { showProceedDialog = true },
126+
modifier = Modifier.testTag("ProceedWithoutBackupButton")
119127
)
120128
}
121129

@@ -132,7 +140,8 @@ fun WalletInitResultView(
132140
retryCount = 0
133141
onProceedWithoutRestore?.invoke()
134142
},
135-
onDismiss = { showProceedDialog = false }
143+
onDismiss = { showProceedDialog = false },
144+
modifier = Modifier.testTag("ProceedWithoutBackupDialog")
136145
)
137146
}
138147
}
@@ -149,6 +158,10 @@ fun WalletInitResultViewRestoredPreview() {
149158
@Composable
150159
fun WalletInitResultViewErrorPreview() {
151160
AppThemeSurface {
152-
WalletInitResultView(result = WalletInitResult.Failed(Error("Something went wrong")), onButtonClick = {})
161+
WalletInitResultView(
162+
result = WalletInitResult.Failed(Error("Something went wrong")),
163+
onButtonClick = {},
164+
onProceedWithoutRestore = {},
165+
)
153166
}
154167
}

0 commit comments

Comments
 (0)