diff options
author | Nate Myren <ntmyren@google.com> | 2022-12-02 22:01:16 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2022-12-02 22:01:16 +0000 |
commit | 0a48199bf699995cda8d750ede1ba1368b3857da (patch) | |
tree | 2a7635e2c45ffb274d597a2b7e45f1dbfe44c00f | |
parent | d315b53c1e799c574abeb6910d90b2b6f64cb05f (diff) | |
parent | c301e8386dbfe6ade1234ff6b5c50ad56ff543ad (diff) | |
download | cts-0a48199bf699995cda8d750ede1ba1368b3857da.tar.gz |
Merge "RESTRICT AUTOMERGE Add test for mic finishes" into sc-v2-dev
4 files changed, 65 insertions, 15 deletions
diff --git a/tests/tests/permission4/Android.bp b/tests/tests/permission4/Android.bp index e01cb11e4af..0b1cba0dafe 100644 --- a/tests/tests/permission4/Android.bp +++ b/tests/tests/permission4/Android.bp @@ -34,6 +34,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 e8f503e7f4e..d54fb055e89 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 @@ -50,6 +51,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" @@ -67,6 +69,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() @@ -134,11 +137,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) }) } @@ -156,6 +165,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) } @@ -163,26 +178,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) && @@ -204,24 +243,24 @@ 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) } 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()) } } } @@ -248,6 +287,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 { |