Skip to content

Commit e0a588a

Browse files
ADFA-2738 connectedV8DebugAndroidTest Part 1 of 2: onboarding (#1168)
ADFA-2738 Part 1: onboarding
1 parent d300cff commit e0a588a

File tree

7 files changed

+558
-300
lines changed

7 files changed

+558
-300
lines changed

app/src/androidTest/kotlin/com/itsaky/androidide/PermissionsScreenTest.kt

Lines changed: 45 additions & 179 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,17 @@ import androidx.test.espresso.matcher.ViewMatchers.isNotEnabled
44
import androidx.test.ext.junit.rules.activityScenarioRule
55
import androidx.test.ext.junit.runners.AndroidJUnit4
66
import androidx.test.platform.app.InstrumentationRegistry
7+
import com.itsaky.androidide.R
78
import com.itsaky.androidide.activities.SplashActivity
9+
import com.itsaky.androidide.helper.grantAllRequiredPermissionsThroughOnboardingUi
10+
import com.itsaky.androidide.helper.passPermissionsInfoSlideWithPrivacyDialog
811
import com.itsaky.androidide.screens.OnboardingScreen
912
import com.itsaky.androidide.screens.PermissionScreen
10-
import com.itsaky.androidide.screens.SystemPermissionsScreen
13+
import com.itsaky.androidide.utils.PermissionsHelper
1114
import com.kaspersky.kaspresso.testcases.api.testcase.TestCase
1215
import org.junit.After
1316
import org.junit.Assert.assertEquals
17+
import org.junit.Assert.assertTrue
1418
import org.junit.Rule
1519
import org.junit.Test
1620
import org.junit.runner.RunWith
@@ -23,21 +27,21 @@ class PermissionsScreenTest : TestCase() {
2327

2428
@After
2529
fun cleanUp() {
26-
InstrumentationRegistry.getInstrumentation().uiAutomation.executeShellCommand("pm clear ${BuildConfig.APPLICATION_ID} && pm reset-permissions ${BuildConfig.APPLICATION_ID}")
30+
InstrumentationRegistry.getInstrumentation().uiAutomation.executeShellCommand(
31+
"pm clear ${BuildConfig.APPLICATION_ID} && pm reset-permissions ${BuildConfig.APPLICATION_ID}",
32+
)
2733
}
2834

29-
3035
@Test
3136
fun test_permissionsScreen_greenCheckMarksAppearCorrectly() = run {
3237
step("Wait for app to start") {
33-
flakySafely(timeoutMs = 10000) {
34-
// Give app time to fully initialize
38+
flakySafely(timeoutMs = 10_000) {
3539
device.uiDevice.waitForIdle(5000)
3640
}
3741
}
3842

3943
step("Click continue button on the Welcome Screen") {
40-
flakySafely(timeoutMs = 15000) {
44+
flakySafely(timeoutMs = 15_000) {
4145
OnboardingScreen.nextButton {
4246
isVisible()
4347
isClickable()
@@ -46,10 +50,14 @@ class PermissionsScreenTest : TestCase() {
4650
}
4751
}
4852

53+
passPermissionsInfoSlideWithPrivacyDialog()
54+
55+
val targetContext = InstrumentationRegistry.getInstrumentation().targetContext
56+
val required = PermissionsHelper.getRequiredPermissions(targetContext)
57+
4958
step("Verify items on the Permission Screen") {
5059
PermissionScreen {
51-
// Wait for screen to fully load
52-
flakySafely(timeoutMs = 10000) {
60+
flakySafely(timeoutMs = 10_000) {
5361
title {
5462
isVisible()
5563
}
@@ -61,206 +69,64 @@ class PermissionsScreenTest : TestCase() {
6169
}
6270
}
6371

64-
flakySafely(timeoutMs = 15000) {
72+
flakySafely(timeoutMs = 15_000) {
6573
rvPermissions {
6674
isVisible()
67-
// Wait for RecyclerView to fully load
6875
isDisplayed()
6976
}
7077
}
7178

72-
// Make the size check flaky-safe with increased timeout
73-
flakySafely(timeoutMs = 15000) {
74-
assertEquals(2, rvPermissions.getSize())
79+
flakySafely(timeoutMs = 15_000) {
80+
assertEquals(required.size, rvPermissions.getSize())
7581
}
7682

7783
rvPermissions {
78-
flakySafely(timeoutMs = 10000) {
79-
childAt<PermissionScreen.PermissionItem>(0) {
80-
title {
81-
isVisible()
82-
hasText(R.string.permission_title_storage)
83-
}
84-
description {
85-
isVisible()
86-
hasText(R.string.permission_desc_storage)
87-
}
88-
grantButton {
89-
isVisible()
90-
isClickable()
91-
hasText(R.string.title_grant)
92-
}
93-
}
94-
}
95-
96-
flakySafely(timeoutMs = 10000) {
97-
childAt<PermissionScreen.PermissionItem>(1) {
98-
title {
99-
isVisible()
100-
hasText(R.string.permission_title_install_packages)
101-
}
102-
description {
103-
isVisible()
104-
hasText(R.string.permission_desc_install_packages)
105-
}
106-
grantButton {
107-
isVisible()
108-
isClickable()
109-
hasText(R.string.title_grant)
110-
}
111-
}
112-
}
113-
}
114-
}
115-
}
116-
117-
step("Grant Storage Permissions") {
118-
flakySafely(timeoutMs = 30000) {
119-
PermissionScreen {
120-
rvPermissions {
121-
childAt<PermissionScreen.PermissionItem>(0) {
122-
grantButton.click()
123-
}
124-
}
125-
126-
// Wait for system permission dialog to appear
127-
device.uiDevice.waitForIdle(3000)
128-
129-
SystemPermissionsScreen {
130-
try {
131-
// Try the original permission text first
132-
storagePermissionView {
133-
isDisplayed()
134-
click()
135-
}
136-
} catch (e: Exception) {
137-
println("Trying alternative text for storage permission: ${e.message}")
138-
try {
139-
storagePermissionViewAlt1 {
140-
isDisplayed()
141-
click()
84+
required.forEachIndexed { index, item ->
85+
flakySafely(timeoutMs = 10_000) {
86+
childAt<PermissionScreen.PermissionItem>(index) {
87+
title {
88+
isVisible()
89+
hasText(item.title)
14290
}
143-
} catch (e1: Exception) {
144-
try {
145-
storagePermissionViewAlt2 {
146-
isDisplayed()
147-
click()
148-
}
149-
} catch (e2: Exception) {
150-
try {
151-
storagePermissionViewAlt3 {
152-
isDisplayed()
153-
click()
154-
}
155-
} catch (e3: Exception) {
156-
try {
157-
storagePermissionViewAlt4 {
158-
isDisplayed()
159-
click()
160-
}
161-
} catch (e4: Exception) {
162-
try {
163-
storagePermissionViewAlt5 {
164-
isDisplayed()
165-
click()
166-
}
167-
} catch (e5: Exception) {
168-
try {
169-
storagePermissionViewAlt6 {
170-
isDisplayed()
171-
click()
172-
}
173-
} catch (e6: Exception) {
174-
try {
175-
storagePermissionViewAlt7 {
176-
isDisplayed()
177-
click()
178-
}
179-
} catch (e7: Exception) {
180-
storagePermissionViewAlt8 {
181-
isDisplayed()
182-
click()
183-
}
184-
}
185-
}
186-
}
187-
}
188-
}
91+
description {
92+
isVisible()
93+
hasText(item.description)
94+
}
95+
grantButton {
96+
isVisible()
97+
isClickable()
98+
hasText(R.string.title_grant)
18999
}
190100
}
191101
}
192-
193102
}
194-
195-
// Wait after click and before going back
196-
device.uiDevice.waitForIdle(2000)
197-
device.uiDevice.pressBack()
198-
device.uiDevice.waitForIdle(2000)
199103
}
200104
}
201105
}
202106

203-
step("Grant Install Packages Permissions") {
204-
flakySafely(timeoutMs = 30000) {
205-
PermissionScreen {
206-
rvPermissions {
207-
childAt<PermissionScreen.PermissionItem>(1) {
208-
grantButton.click()
209-
}
210-
}
211-
212-
// Wait for system permission dialog to appear
213-
device.uiDevice.waitForIdle(3000)
107+
grantAllRequiredPermissionsThroughOnboardingUi()
214108

215-
SystemPermissionsScreen {
216-
try {
217-
// Try the original permission text first
218-
installPackagesPermission {
219-
isDisplayed()
220-
click()
221-
}
222-
} catch (e: Exception) {
223-
println("Trying alternative text for install packages permission: ${e.message}")
224-
try {
225-
installPackagesPermissionAlt1 {
226-
isDisplayed()
227-
click()
228-
}
229-
} catch (e: Exception) {
230-
installPackagesPermissionAlt2 {
231-
isDisplayed()
232-
click()
233-
}
234-
}
235-
}
236-
}
237-
238-
// Wait after click and before going back
239-
device.uiDevice.waitForIdle(2000)
240-
device.uiDevice.pressBack()
241-
device.uiDevice.waitForIdle(2000)
242-
}
109+
step("Confirm Android reports all required permissions granted") {
110+
flakySafely(timeoutMs = 20_000) {
111+
assertTrue(PermissionsHelper.areAllPermissionsGranted(targetContext))
243112
}
244113
}
245114

246-
step("Confirm that all menu items don't have allow text") {
247-
flakySafely(timeoutMs = 15000) {
115+
step("Confirm that all grant actions are complete (buttons disabled)") {
116+
flakySafely(timeoutMs = 15_000) {
248117
device.uiDevice.waitForIdle(2000)
249118
PermissionScreen {
250119
rvPermissions {
251-
childAt<PermissionScreen.PermissionItem>(0) {
252-
grantButton {
253-
isNotEnabled()
254-
}
255-
}
256-
childAt<PermissionScreen.PermissionItem>(1) {
257-
grantButton {
258-
isNotEnabled()
120+
required.indices.forEach { index ->
121+
childAt<PermissionScreen.PermissionItem>(index) {
122+
grantButton {
123+
isNotEnabled()
124+
}
259125
}
260126
}
261127
}
262128
}
263129
}
264130
}
265131
}
266-
}
132+
}

0 commit comments

Comments
 (0)