@@ -4,13 +4,17 @@ import androidx.test.espresso.matcher.ViewMatchers.isNotEnabled
44import androidx.test.ext.junit.rules.activityScenarioRule
55import androidx.test.ext.junit.runners.AndroidJUnit4
66import androidx.test.platform.app.InstrumentationRegistry
7+ import com.itsaky.androidide.R
78import com.itsaky.androidide.activities.SplashActivity
9+ import com.itsaky.androidide.helper.grantAllRequiredPermissionsThroughOnboardingUi
10+ import com.itsaky.androidide.helper.passPermissionsInfoSlideWithPrivacyDialog
811import com.itsaky.androidide.screens.OnboardingScreen
912import com.itsaky.androidide.screens.PermissionScreen
10- import com.itsaky.androidide.screens.SystemPermissionsScreen
13+ import com.itsaky.androidide.utils.PermissionsHelper
1114import com.kaspersky.kaspresso.testcases.api.testcase.TestCase
1215import org.junit.After
1316import org.junit.Assert.assertEquals
17+ import org.junit.Assert.assertTrue
1418import org.junit.Rule
1519import org.junit.Test
1620import 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