diff options
author | Nate Myren <ntmyren@google.com> | 2022-12-02 22:01:36 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2022-12-02 22:01:36 +0000 |
commit | 9df03667ef81edcfe166a26c5cf34b2ee28e182e (patch) | |
tree | 6218a6b0f44c027bee4e5f7b0dfcfd909807880a | |
parent | 3245c4a719671fac734958970283f3889e51c19f (diff) | |
parent | 00037457bdf1ffadc360399348d56d20a80548f0 (diff) | |
download | cts-9df03667ef81edcfe166a26c5cf34b2ee28e182e.tar.gz |
Merge changes from topic "cherrypick-cherrypick-attrTokens-xdkc7c9ixz-3kymu67epe" into sc-qpr1-dev
* changes:
[automerge] RESTRICT AUTOMERGE Add test for mic finishes 2p: 55ab9fe7e6
RESTRICT AUTOMERGE Add test for mic finishes
4 files changed, 65 insertions, 15 deletions
diff --git a/tests/tests/permission4/Android.bp b/tests/tests/permission4/Android.bp index 3f2d3db7430..d73c8b28b6a 100644 --- a/tests/tests/permission4/Android.bp +++ b/tests/tests/permission4/Android.bp @@ -35,6 +35,7 @@ android_test { ], test_suites: [ "cts", + "sts", "vts10", "general-tests", "mts", diff --git a/tests/tests/permission4/AppThatAccessesCameraAndMic/Android.bp b/tests/tests/permission4/AppThatAccessesCameraAndMic/Android.bp index a7e0ab6b6ec..9dc1b45cc7f 100644 --- a/tests/tests/permission4/AppThatAccessesCameraAndMic/Android.bp +++ b/tests/tests/permission4/AppThatAccessesCameraAndMic/Android.bp @@ -25,6 +25,7 @@ android_test_helper_app { // Tag this module as a cts test artifact test_suites: [ "cts", + "sts", "vts10", "general-tests", ], @@ -36,6 +37,6 @@ android_test_helper_app { ], srcs: [ - "src/**/*.kt" + "src/**/*.kt", ], } diff --git a/tests/tests/permission4/AppThatAccessesCameraAndMic/src/android/permission4/cts/appthataccessescameraandmic/AccessCameraOrMicActivity.kt b/tests/tests/permission4/AppThatAccessesCameraAndMic/src/android/permission4/cts/appthataccessescameraandmic/AccessCameraOrMicActivity.kt index 06aef15b14f..90da553d0a0 100644 --- a/tests/tests/permission4/AppThatAccessesCameraAndMic/src/android/permission4/cts/appthataccessescameraandmic/AccessCameraOrMicActivity.kt +++ b/tests/tests/permission4/AppThatAccessesCameraAndMic/src/android/permission4/cts/appthataccessescameraandmic/AccessCameraOrMicActivity.kt @@ -42,6 +42,7 @@ import kotlinx.coroutines.launch private const val USE_CAMERA = "use_camera" private const val USE_MICROPHONE = "use_microphone" private const val USE_HOTWORD = "use_hotword" +private const val FINISH_EARLY = "finish_early" private const val USE_DURATION_MS = 10000L private const val SAMPLE_RATE_HZ = 44100 @@ -62,12 +63,14 @@ class AccessCameraOrMicActivity : Activity() { private var runMic = false private var hotwordFinished = false private var runHotword = false + private var finishEarly = false override fun onStart() { super.onStart() runCamera = intent.getBooleanExtra(USE_CAMERA, false) runMic = intent.getBooleanExtra(USE_MICROPHONE, false) runHotword = intent.getBooleanExtra(USE_HOTWORD, false) + finishEarly = intent.getBooleanExtra(FINISH_EARLY, false) if (runMic) { useMic() @@ -193,6 +196,11 @@ class AccessCameraOrMicActivity : Activity() { AudioRecord.getMinBufferSize(SAMPLE_RATE_HZ, CHANNEL_IN_MONO, ENCODING_PCM_16BIT) recorder = AudioRecord(MIC, SAMPLE_RATE_HZ, CHANNEL_IN_MONO, ENCODING_PCM_16BIT, minSize) recorder?.startRecording() + if (finishEarly) { + appOpsManager = getSystemService(AppOpsManager::class.java) + appOpsManager?.finishOp(AppOpsManager.OPSTR_RECORD_AUDIO, Process.myUid(), packageName) + return + } GlobalScope.launch { delay(USE_DURATION_MS) micFinished = true diff --git a/tests/tests/permission4/src/android/permission4/cts/CameraMicIndicatorsPermissionTest.kt b/tests/tests/permission4/src/android/permission4/cts/CameraMicIndicatorsPermissionTest.kt index 174002d6149..d0e140fd096 100644 --- a/tests/tests/permission4/src/android/permission4/cts/CameraMicIndicatorsPermissionTest.kt +++ b/tests/tests/permission4/src/android/permission4/cts/CameraMicIndicatorsPermissionTest.kt @@ -24,6 +24,7 @@ import android.content.Intent import android.content.pm.PackageManager import android.hardware.camera2.CameraManager import android.os.Process +import android.platform.test.annotations.AsbSecurityTest import android.provider.DeviceConfig import android.provider.Settings import android.server.wm.WindowManagerStateHelper @@ -45,6 +46,7 @@ private const val APP_LABEL = "CtsCameraMicAccess" private const val USE_CAMERA = "use_camera" private const val USE_MICROPHONE = "use_microphone" private const val USE_HOTWORD = "use_hotword" +private const val FINISH_EARLY = "finish_early" private const val INTENT_ACTION = "test.action.USE_CAMERA_OR_MIC" private const val PRIVACY_CHIP_ID = "com.android.systemui:id/privacy_chip" private const val INDICATORS_FLAG = "camera_mic_icons_enabled" @@ -62,6 +64,7 @@ class CameraMicIndicatorsPermissionTest { private val packageManager: PackageManager = context.packageManager private val isTv = packageManager.hasSystemFeature(PackageManager.FEATURE_LEANBACK) + private val isCar = packageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE) private var wasEnabled = false private val micLabel = packageManager.getPermissionGroupInfo( Manifest.permission_group.MICROPHONE, 0).loadLabel(packageManager).toString() @@ -129,11 +132,17 @@ class CameraMicIndicatorsPermissionTest { Thread.sleep(3000) } - private fun openApp(useMic: Boolean, useCamera: Boolean, useHotword: Boolean) { + private fun openApp( + useMic: Boolean, + useCamera: Boolean, + useHotword: Boolean, + finishEarly: Boolean = false + ) { context.startActivity(Intent(INTENT_ACTION).apply { putExtra(USE_CAMERA, useCamera) putExtra(USE_MICROPHONE, useMic) putExtra(USE_HOTWORD, useHotword) + putExtra(FINISH_EARLY, finishEarly) addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) }) } @@ -151,6 +160,12 @@ class CameraMicIndicatorsPermissionTest { } @Test + @AsbSecurityTest(cveBugId = [242537498]) + fun testMicIndicatorWithManualFinishOpStillShows() { + testCameraAndMicIndicator(useMic = true, useCamera = false, finishEarly = true) + } + + @Test fun testHotwordIndicatorBehavior() { testCameraAndMicIndicator(useMic = false, useCamera = false, useHotword = true) } @@ -158,26 +173,50 @@ class CameraMicIndicatorsPermissionTest { private fun testCameraAndMicIndicator( useMic: Boolean, useCamera: Boolean, - useHotword: Boolean = false + useHotword: Boolean = false, + finishEarly: Boolean = false ) { - openApp(useMic, useCamera, useHotword) + openApp(useMic, useCamera, useHotword, finishEarly) eventually { val appView = uiDevice.findObject(UiSelector().textContains(APP_LABEL)) assertTrue("View with text $APP_LABEL not found", appView.exists()) } + if (!isTv && !isCar) { + uiDevice.openQuickSettings() + } + assertIndicatorsShown(useMic, useCamera, useHotword) + + if (finishEarly) { + // Assert that the indicator doesn't go away + val indicatorGoneException: Exception? = try { + eventually { + assertIndicatorsShown(false, false, false) + } + null + } catch (e: Exception) { + e + } + assertNotNull("Expected the indicator to be present", indicatorGoneException) + } + } + + private fun assertIndicatorsShown( + useMic: Boolean, + useCamera: Boolean, + useHotword: Boolean = false, + ) { if (isTv) { assertTvIndicatorsShown(useMic, useCamera, useHotword) - } else if (packageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)) { + } else if (isCar) { assertCarIndicatorsShown(useMic, useCamera, useHotword) } else { - uiDevice.openQuickSettings() assertPrivacyChipAndIndicatorsPresent(useMic, useCamera) } } private fun assertTvIndicatorsShown(useMic: Boolean, useCamera: Boolean, useHotword: Boolean) { - if (useMic || useHotword) { + if (useMic || useHotword || (!useMic && !useCamera && !useHotword)) { val found = WindowManagerStateHelper() .waitFor("Waiting for the mic indicator window to come up") { it.containsWindow(TV_MIC_INDICATOR_WINDOW_TITLE) && @@ -199,25 +238,25 @@ class CameraMicIndicatorsPermissionTest { val chipFound = isChipPresent() if (useMic) { assertTrue("Did not find chip", chipFound) - } else if (useHotword || useCamera) { + } else { assertFalse("Found chip, but did not expect to", chipFound) return } eventually { - if (useCamera || useHotword) { - // There should be no microphone dialog when using hot word and/or camera + if (useMic) { + val micLabelView = uiDevice.findObject(UiSelector().textContains(micLabel)) + assertTrue("View with text $micLabel not found", micLabelView.exists()) + val appView = uiDevice.findObject(UiSelector().textContains(APP_LABEL)) + assertTrue("View with text $APP_LABEL not found", appView.exists()) + } else { + // There should be no microphone dialog when using hot word and/or camera val micLabelView = uiDevice.findObject(UiSelector().textContains(micLabel)) assertFalse("View with text $micLabel found, but did not expect to", micLabelView.exists()) val appView = uiDevice.findObject(UiSelector().textContains(APP_LABEL)) assertFalse("View with text $APP_LABEL found, but did not expect to", appView.exists()) - } else if (useMic) { - val micLabelView = uiDevice.findObject(UiSelector().textContains(micLabel)) - assertTrue("View with text $micLabel not found", micLabelView.exists()) - val appView = uiDevice.findObject(UiSelector().textContains(APP_LABEL)) - assertTrue("View with text $APP_LABEL not found", appView.exists()) } } } @@ -244,6 +283,7 @@ class CameraMicIndicatorsPermissionTest { val appView = uiDevice.findObject(UiSelector().textContains(APP_LABEL)) assertTrue("View with text $APP_LABEL not found", appView.exists()) } + uiDevice.pressBack() } private fun isChipPresent(): Boolean { |