summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNate Myren <ntmyren@google.com>2022-12-02 22:01:16 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2022-12-02 22:01:16 +0000
commit0a48199bf699995cda8d750ede1ba1368b3857da (patch)
tree2a7635e2c45ffb274d597a2b7e45f1dbfe44c00f
parentd315b53c1e799c574abeb6910d90b2b6f64cb05f (diff)
parentc301e8386dbfe6ade1234ff6b5c50ad56ff543ad (diff)
downloadcts-0a48199bf699995cda8d750ede1ba1368b3857da.tar.gz
Merge "RESTRICT AUTOMERGE Add test for mic finishes" into sc-v2-dev
-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 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 {