1 /*
2  * Copyright (C) 2022 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.permissioncontroller.permissionui.ui.handheld
18 
19 import android.content.Intent
20 import android.permission.cts.PermissionUtils.grantPermission
21 import android.permission.cts.PermissionUtils.install
22 import android.permission.cts.PermissionUtils.revokePermission
23 import android.permission.cts.PermissionUtils.uninstallApp
24 import androidx.test.ext.junit.runners.AndroidJUnit4
25 import androidx.test.uiautomator.By
26 import com.android.compatibility.common.util.SystemUtil.eventually
27 import com.android.compatibility.common.util.SystemUtil.runWithShellPermissionIdentity
28 import com.android.compatibility.common.util.UiAutomatorUtils2.waitFindObject
29 import com.android.compatibility.common.util.UiAutomatorUtils2.waitFindObjectOrNull
30 import com.android.permissioncontroller.permissionui.getUsageCountsFromUi
31 import com.android.permissioncontroller.permissionui.wakeUpScreen
32 import com.google.common.truth.Truth.assertThat
33 import org.junit.After
34 import org.junit.Assert.assertNotNull
35 import org.junit.Before
36 import org.junit.Test
37 import org.junit.runner.RunWith
38 
39 /** Simple tests for {@link ManageCustomPermissionsFragment} */
40 @RunWith(AndroidJUnit4::class)
41 class ManageCustomPermissionsFragmentTest : BaseHandheldPermissionUiTest() {
42     private val ONE_PERMISSION_DEFINER_APK =
43         "/data/local/tmp/pc-permissionui/" + "PermissionUiDefineAdditionalPermissionApp.apk"
44     private val PERMISSION_USER_APK =
45         "/data/local/tmp/pc-permissionui/" + "PermissionUiUseAdditionalPermissionApp.apk"
46     private val DEFINER_PKG = "com.android.permissioncontroller.tests.appthatdefinespermission"
47     private val USER_PKG = "com.android.permissioncontroller.tests.appthatrequestpermission"
48 
49     private val PERM_LABEL = "Permission A"
50     private val PERM = "com.android.permissioncontroller.tests.A"
51     private val ADDITIONAL_PERMISSIONS_LABEL = "Additional permissions"
52     private val BODY_SENSORS_LABEL = "Body sensors"
53 
54     @Before
setupnull55     fun setup() {
56         wakeUpScreen()
57 
58         runWithShellPermissionIdentity {
59             instrumentationContext.startActivity(
60                 Intent(Intent.ACTION_MANAGE_PERMISSIONS).apply {
61                     addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
62                 }
63             )
64         }
65     }
66 
67     @Test
groupSummaryGetsUpdatedWhenPermissionGetsGrantednull68     fun groupSummaryGetsUpdatedWhenPermissionGetsGranted() {
69         install(ONE_PERMISSION_DEFINER_APK)
70         install(PERMISSION_USER_APK)
71         waitFindObject(By.textContains(ADDITIONAL_PERMISSIONS_LABEL)).click()
72         waitFindObject(By.textContains(PERM_LABEL))
73 
74         val original = getUsageCountsFromUi(PERM_LABEL)
75 
76         grantPermission(USER_PKG, PERM)
77         eventually {
78             assertThat(getUsageCountsFromUi(PERM_LABEL).granted).isEqualTo(original.granted + 1)
79         }
80     }
81 
82     @Test
groupSummaryGetsUpdatedWhenPermissionGetsRevokednull83     fun groupSummaryGetsUpdatedWhenPermissionGetsRevoked() {
84         install(ONE_PERMISSION_DEFINER_APK)
85         install(PERMISSION_USER_APK)
86         waitFindObject(By.textContains(ADDITIONAL_PERMISSIONS_LABEL)).click()
87         waitFindObject(By.textContains(PERM_LABEL))
88 
89         val original = getUsageCountsFromUi(PERM_LABEL)
90 
91         grantPermission(USER_PKG, PERM)
92         eventually { assertThat(getUsageCountsFromUi(PERM_LABEL)).isNotEqualTo(original) }
93 
94         revokePermission(USER_PKG, PERM)
95         eventually { assertThat(getUsageCountsFromUi(PERM_LABEL)).isEqualTo(original) }
96     }
97 
98     @Test
bodySensorsEitherDisplayedInMainPageOrInAdditionalnull99     fun bodySensorsEitherDisplayedInMainPageOrInAdditional() {
100         if (waitFindObjectOrNull(By.textContains(BODY_SENSORS_LABEL)) == null) {
101             waitFindObject(By.textContains(ADDITIONAL_PERMISSIONS_LABEL)).click()
102             assertNotNull(waitFindObjectOrNull(By.textContains(BODY_SENSORS_LABEL)))
103         }
104     }
105 
106     @After
tearDownnull107     fun tearDown() {
108         uninstallApp(DEFINER_PKG)
109         uninstallApp(USER_PKG)
110 
111         uiDevice.pressBack()
112     }
113 }
114