summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNate Myren <ntmyren@google.com>2022-12-02 22:01:36 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2022-12-02 22:01:36 +0000
commit9df03667ef81edcfe166a26c5cf34b2ee28e182e (patch)
tree6218a6b0f44c027bee4e5f7b0dfcfd909807880a
parent3245c4a719671fac734958970283f3889e51c19f (diff)
parent00037457bdf1ffadc360399348d56d20a80548f0 (diff)
downloadcts-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
-rw-r--r--tests/tests/permission4/Android.bp1
-rw-r--r--tests/tests/permission4/AppThatAccessesCameraAndMic/Android.bp3
-rw-r--r--tests/tests/permission4/AppThatAccessesCameraAndMic/src/android/permission4/cts/appthataccessescameraandmic/AccessCameraOrMicActivity.kt8
-rw-r--r--tests/tests/permission4/src/android/permission4/cts/CameraMicIndicatorsPermissionTest.kt68
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 {