diff options
-rw-r--r-- | tests/cts/permissionui/src/android/permissionui/cts/PhotoPickerPermissionTest.kt | 67 | ||||
-rw-r--r-- | tests/cts/permissionui/src/android/permissionui/cts/PhotoPickerUtils.kt | 59 |
2 files changed, 93 insertions, 33 deletions
diff --git a/tests/cts/permissionui/src/android/permissionui/cts/PhotoPickerPermissionTest.kt b/tests/cts/permissionui/src/android/permissionui/cts/PhotoPickerPermissionTest.kt index 9f76479e3..09941722b 100644 --- a/tests/cts/permissionui/src/android/permissionui/cts/PhotoPickerPermissionTest.kt +++ b/tests/cts/permissionui/src/android/permissionui/cts/PhotoPickerPermissionTest.kt @@ -39,6 +39,7 @@ import com.android.compatibility.common.util.SystemUtil.eventually import com.android.compatibility.common.util.SystemUtil.runWithShellPermissionIdentity import com.android.compatibility.common.util.UiAutomatorUtils2 import org.junit.AfterClass +import org.junit.Assert import org.junit.Assert.assertFalse import org.junit.Assert.assertNotNull import org.junit.Assert.assertTrue @@ -68,7 +69,7 @@ class PhotoPickerPermissionTest : BaseUsePermissionTest() { NAMESPACE_PRIVACY, PICKER_ENABLED_SETTING, true.toString(), - false + false, ) } photoUri = PhotoPickerUtils.createImage(context) @@ -85,7 +86,7 @@ class PhotoPickerPermissionTest : BaseUsePermissionTest() { NAMESPACE_PRIVACY, PICKER_ENABLED_SETTING, false.toString(), - false + false, ) } } @@ -110,7 +111,7 @@ class PhotoPickerPermissionTest : BaseUsePermissionTest() { val permissions = packageInfo.requestedPermissions?.toList() ?: emptyList<String>() assertFalse( "Expected app to not request READ_MEDIA_VISUAL_USER_SELECTED", - permissions.contains(READ_MEDIA_VISUAL_USER_SELECTED) + permissions.contains(READ_MEDIA_VISUAL_USER_SELECTED), ) } } @@ -125,7 +126,7 @@ class PhotoPickerPermissionTest : BaseUsePermissionTest() { val permissions = packageInfo.requestedPermissions?.toList() ?: emptyList<String>() assertTrue( "Expected app to request READ_MEDIA_VISUAL_USER_SELECTED", - permissions.contains(READ_MEDIA_VISUAL_USER_SELECTED) + permissions.contains(READ_MEDIA_VISUAL_USER_SELECTED), ) } } @@ -145,7 +146,7 @@ class PhotoPickerPermissionTest : BaseUsePermissionTest() { requestAppPermissionsAndAssertResult( arrayOf(READ_MEDIA_IMAGES, READ_MEDIA_VISUAL_USER_SELECTED), arrayOf(READ_MEDIA_IMAGES to false, READ_MEDIA_VISUAL_USER_SELECTED to false), - waitForWindowTransition = false + waitForWindowTransition = false, ) { doAndWaitForWindowTransition { click(By.res(SELECT_BUTTON)) } findImageOrVideo(expected = true) @@ -161,7 +162,7 @@ class PhotoPickerPermissionTest : BaseUsePermissionTest() { requestAppPermissionsAndAssertResult( arrayOf(READ_MEDIA_IMAGES), arrayOf(READ_MEDIA_IMAGES to true), - waitForWindowTransition = false + waitForWindowTransition = false, ) { doAndWaitForWindowTransition { click(By.res(SELECT_BUTTON)) } clickImageOrVideo() @@ -174,17 +175,17 @@ class PhotoPickerPermissionTest : BaseUsePermissionTest() { assertPermissionFlags( READ_MEDIA_IMAGES, FLAG_PERMISSION_ONE_TIME to true, - FLAG_PERMISSION_REVOKED_COMPAT to true + FLAG_PERMISSION_REVOKED_COMPAT to true, ) assertPermissionFlags( READ_MEDIA_VIDEO, FLAG_PERMISSION_ONE_TIME to true, - FLAG_PERMISSION_REVOKED_COMPAT to true + FLAG_PERMISSION_REVOKED_COMPAT to true, ) assertPermissionFlags( READ_MEDIA_VISUAL_USER_SELECTED, FLAG_PERMISSION_ONE_TIME to false, - FLAG_PERMISSION_REVOKED_COMPAT to false + FLAG_PERMISSION_REVOKED_COMPAT to false, ) } } @@ -209,7 +210,7 @@ class PhotoPickerPermissionTest : BaseUsePermissionTest() { requestAppPermissionsAndAssertResult( arrayOf(READ_MEDIA_IMAGES, READ_MEDIA_VISUAL_USER_SELECTED), arrayOf(READ_MEDIA_IMAGES to false, READ_MEDIA_VISUAL_USER_SELECTED to true), - waitForWindowTransition = false + waitForWindowTransition = false, ) { doAndWaitForWindowTransition { click(By.res(SELECT_BUTTON)) } clickImageOrVideo() @@ -265,7 +266,7 @@ class PhotoPickerPermissionTest : BaseUsePermissionTest() { installPackage(APP_APK_PATH_IMPLICIT_USER_SELECT_STORAGE) requestAppPermissionsAndAssertResult( arrayOf(READ_MEDIA_IMAGES), - arrayOf(READ_MEDIA_IMAGES to true) + arrayOf(READ_MEDIA_IMAGES to true), ) { click(By.res(ALLOW_ALL_BUTTON)) } @@ -278,7 +279,7 @@ class PhotoPickerPermissionTest : BaseUsePermissionTest() { installPackage(APP_APK_PATH_LATEST) requestAppPermissionsAndAssertResult( arrayOf(READ_MEDIA_IMAGES, READ_MEDIA_VISUAL_USER_SELECTED), - arrayOf(READ_MEDIA_IMAGES to true, READ_MEDIA_VISUAL_USER_SELECTED to true) + arrayOf(READ_MEDIA_IMAGES to true, READ_MEDIA_VISUAL_USER_SELECTED to true), ) { click(By.res(ALLOW_ALL_BUTTON)) } @@ -338,7 +339,7 @@ class PhotoPickerPermissionTest : BaseUsePermissionTest() { .toList() assertTrue( "Expected package to have USER_SELECTED", - requestedPerms.contains(READ_MEDIA_VISUAL_USER_SELECTED) + requestedPerms.contains(READ_MEDIA_VISUAL_USER_SELECTED), ) } @@ -363,7 +364,7 @@ class PhotoPickerPermissionTest : BaseUsePermissionTest() { .toList() assertTrue( "Expected package to have USER_SELECTED", - requestedPerms.contains(READ_MEDIA_VISUAL_USER_SELECTED) + requestedPerms.contains(READ_MEDIA_VISUAL_USER_SELECTED), ) } @@ -381,14 +382,14 @@ class PhotoPickerPermissionTest : BaseUsePermissionTest() { installPackage(APP_APK_PATH_IMPLICIT_USER_SELECT_STORAGE) requestAppPermissionsAndAssertResult( READ_MEDIA_VISUAL_USER_SELECTED to false, - waitForWindowTransition = false + waitForWindowTransition = false, ) {} uninstallPackage(APP_PACKAGE_NAME) installPackage(APP_APK_PATH_LATEST) requestAppPermissionsAndAssertResult( READ_MEDIA_VISUAL_USER_SELECTED to false, ACCESS_MEDIA_LOCATION to false, - waitForWindowTransition = false + waitForWindowTransition = false, ) {} } @@ -399,7 +400,7 @@ class PhotoPickerPermissionTest : BaseUsePermissionTest() { requestAppPermissionsAndAssertResult( READ_MEDIA_IMAGES to true, READ_MEDIA_VIDEO to true, - waitForWindowTransition = false + waitForWindowTransition = false, ) {} } @@ -410,7 +411,7 @@ class PhotoPickerPermissionTest : BaseUsePermissionTest() { READ_MEDIA_IMAGES to false, ACCESS_MEDIA_LOCATION to true, READ_MEDIA_VISUAL_USER_SELECTED to true, - waitForWindowTransition = false + waitForWindowTransition = false, ) { doAndWaitForWindowTransition { click(By.res(SELECT_BUTTON)) } clickImageOrVideo() @@ -427,7 +428,7 @@ class PhotoPickerPermissionTest : BaseUsePermissionTest() { requestAppPermissionsAndAssertResult( ACCESS_MEDIA_LOCATION to false, READ_MEDIA_VISUAL_USER_SELECTED to false, - waitForWindowTransition = false + waitForWindowTransition = false, ) { findView(By.res(SELECT_BUTTON), expected = false) } @@ -440,7 +441,7 @@ class PhotoPickerPermissionTest : BaseUsePermissionTest() { READ_MEDIA_IMAGES to false, ACCESS_MEDIA_LOCATION to true, READ_MEDIA_VISUAL_USER_SELECTED to true, - waitForWindowTransition = false + waitForWindowTransition = false, ) { doAndWaitForWindowTransition { click(By.res(SELECT_BUTTON)) } clickImageOrVideo() @@ -459,7 +460,7 @@ class PhotoPickerPermissionTest : BaseUsePermissionTest() { requestAppPermissionsAndAssertResult( READ_MEDIA_IMAGES to false, READ_MEDIA_VISUAL_USER_SELECTED to true, - waitForWindowTransition = false + waitForWindowTransition = false, ) { doAndWaitForWindowTransition { click(By.res(SELECT_BUTTON)) } clickImageOrVideo() @@ -474,7 +475,7 @@ class PhotoPickerPermissionTest : BaseUsePermissionTest() { requestAppPermissionsAndAssertResult( READ_MEDIA_IMAGES to false, READ_MEDIA_VISUAL_USER_SELECTED to true, - waitForWindowTransition = false + waitForWindowTransition = false, ) { doAndWaitForWindowTransition { click(By.res(SELECT_BUTTON)) } try { @@ -506,18 +507,32 @@ class PhotoPickerPermissionTest : BaseUsePermissionTest() { } private fun clickImageOrVideo() { - click(By.res(PhotoPickerUtils.getImageOrVideoResId(context))) + PhotoPickerUtils.clickAndWait(uiDevice, PhotoPickerUtils.getMediaItem(uiDevice)) } private fun clickAllow() { - click(By.res(PhotoPickerUtils.getAllowId(context))) + PhotoPickerUtils.clickAndWait(uiDevice, PhotoPickerUtils.findAddOrDoneButton()) } private fun findImageOrVideo(expected: Boolean) { - findView(By.res(PhotoPickerUtils.getImageOrVideoResId(context)), expected) + eventually { + val item = PhotoPickerUtils.getMediaItem(uiDevice) + if (!expected && item.exists()) { + Assert.fail("Found image or video, when not expecting it") + } else if (expected && !item.exists()) { + Assert.fail("Failed to find image or video") + } + } } private fun findVideo(expected: Boolean) { - findView(By.res(PhotoPickerUtils.getVideoResId(context)), expected) + eventually { + val item = PhotoPickerUtils.getVideoItem(uiDevice) + if (!expected && item.exists()) { + Assert.fail("Found video, when not expecting it") + } else if (expected && !item.exists()) { + Assert.fail("Failed to find video") + } + } } } diff --git a/tests/cts/permissionui/src/android/permissionui/cts/PhotoPickerUtils.kt b/tests/cts/permissionui/src/android/permissionui/cts/PhotoPickerUtils.kt index db6c412db..aea5637df 100644 --- a/tests/cts/permissionui/src/android/permissionui/cts/PhotoPickerUtils.kt +++ b/tests/cts/permissionui/src/android/permissionui/cts/PhotoPickerUtils.kt @@ -21,23 +21,27 @@ import android.content.pm.PackageManager import android.net.Uri import android.os.Bundle import android.os.FileUtils +import android.provider.DeviceConfig import android.provider.MediaStore import android.provider.cts.media.MediaProviderTestUtils import android.provider.cts.media.MediaStoreUtils +import androidx.test.uiautomator.UiDevice +import androidx.test.uiautomator.UiObject +import androidx.test.uiautomator.UiSelector import com.android.compatibility.common.util.SystemUtil.callWithShellPermissionIdentity import java.io.IOException +import org.junit.Assert +// TODO: b/393428835: We need to merge these utils with the Photo Picker CTS ones object PhotoPickerUtils { private const val DISPLAY_NAME_PREFIX = "ctsPermissionPhotoPicker" private const val VIDEO_ICON_ID = ":id/icon_video" - private const val IMAGE_CHECK_BOX_ID = ":id/icon_check" private const val ALLOW_ID = ":id/button_add" + private const val REGEX_MEDIA_ITEM_CONTENT_DESCRIPTION = "^(Media|Photo|Video|GIF|Motion)[^s].*" + private const val REGEX_VIDEO_ITEM_CONTENT_DESCRIPTION = "^(Video)[^s].*" + private const val REGEX_CONTAINS_DONE = ".*[Dd]one.*" private var mediaProviderPkgName: String? = null - fun getImageOrVideoResId(context: Context): String { - return "${getMediaProviderPkgName(context)!!}$IMAGE_CHECK_BOX_ID" - } - fun getVideoResId(context: Context): String { return "${getMediaProviderPkgName(context)!!}$VIDEO_ICON_ID" } @@ -70,7 +74,7 @@ object PhotoPickerUtils { context, R.raw.lg_g4_iso_800_jpg, MediaStore.Images.Media.EXTERNAL_CONTENT_URI, - "image/jpeg" + "image/jpeg", ) .first } @@ -81,7 +85,7 @@ object PhotoPickerUtils { context, R.raw.test_video, MediaStore.Video.Media.EXTERNAL_CONTENT_URI, - "video/mp4" + "video/mp4", ) .first } @@ -108,6 +112,7 @@ object PhotoPickerUtils { stageMedia(context, resId, collectionUri, mimeType) } } + @Throws(IOException::class) private fun stageMedia( context: Context, @@ -125,4 +130,44 @@ object PhotoPickerUtils { return session.publish() to displayName } } + + /** Find a media item to perform click events */ + @Throws(Exception::class) + fun getMediaItem(device: UiDevice): UiObject { + val mediaItemSelector = + UiSelector().descriptionMatches(REGEX_MEDIA_ITEM_CONTENT_DESCRIPTION) + return device.findObject(mediaItemSelector) + } + + /** Find a media item to perform click events */ + @Throws(Exception::class) + fun getVideoItem(device: UiDevice): UiObject { + val mediaItemSelector = + UiSelector().descriptionMatches(REGEX_VIDEO_ITEM_CONTENT_DESCRIPTION) + return device.findObject(mediaItemSelector) + } + + fun findAddOrDoneButton(): UiObject { + if (isModernPickerEnabled()) { + return UiObject(UiSelector().textMatches(REGEX_CONTAINS_DONE)) + } + return UiObject(UiSelector().resourceIdMatches("$mediaProviderPkgName:id/button_add")) + } + + @Throws(Exception::class) + fun clickAndWait(uiDevice: UiDevice, uiObject: UiObject) { + uiObject.click() + uiDevice.waitForIdle() + } + + fun isModernPickerEnabled(): Boolean { + return try { + callWithShellPermissionIdentity { + DeviceConfig.getBoolean("mediaprovider", "enable_modern_picker", false) + } + } catch (e: Exception) { + Assert.fail("Failed to check if modern media provider is enabled") + false + } + } } |