Loading media/java/android/media/flags/projection.aconfig +13 −1 Original line number Diff line number Diff line Loading @@ -17,3 +17,15 @@ flag { description: "Stops MediaProjection sessions when a call ends" bug: "368336349" } flag { name: "media_projection_connected_display_no_virtual_device" namespace: "media_projection" description: "Filter out display associated with a virtual device for media projection use case" bug: "362720120" metadata { purpose: PURPOSE_BUGFIX } is_exported: true } packages/SystemUI/multivalentTests/src/com/android/systemui/screenrecord/ScreenRecordPermissionDialogDelegateTest.kt +32 −0 Original line number Diff line number Diff line Loading @@ -18,7 +18,10 @@ package com.android.systemui.screenrecord import android.content.Intent import android.hardware.display.DisplayManager import android.hardware.display.VirtualDisplay import android.hardware.display.VirtualDisplayConfig import android.os.UserHandle import android.platform.test.annotations.RequiresFlagsEnabled import android.testing.TestableLooper import android.view.View import android.widget.Spinner Loading @@ -42,6 +45,7 @@ import com.android.systemui.statusbar.phone.SystemUIDialogManager import com.android.systemui.util.mockito.argumentCaptor import com.android.systemui.util.mockito.mock import com.google.common.truth.Truth.assertThat import com.google.common.truth.Truth.assertWithMessage import junit.framework.Assert.assertEquals import org.junit.After import org.junit.Before Loading Loading @@ -224,6 +228,34 @@ class ScreenRecordPermissionDialogDelegateTest : SysuiTestCase() { .notifyProjectionRequestCancelled(TEST_HOST_UID) } @Test @RequiresFlagsEnabled( com.android.media.projection.flags.Flags .FLAG_MEDIA_PROJECTION_CONNECTED_DISPLAY_NO_VIRTUAL_DEVICE ) fun doNotShowVirtualDisplayInDialog() { val displayManager = context.getSystemService(DisplayManager::class.java)!! var virtualDisplay: VirtualDisplay? = null try { virtualDisplay = displayManager.createVirtualDisplay( VirtualDisplayConfig.Builder("virtual display", 1, 1, 160).build() ) showDialog() val spinner = dialog.requireViewById<Spinner>(R.id.screen_share_mode_options) val adapter = spinner.adapter val virtualDisplayAvailable = (0 until adapter.count) .mapNotNull { adapter.getItem(it) as? String } .any { it.contains("virtual display", ignoreCase = true) } assertWithMessage("A Virtual Display was shown in the list of display to record") .that(virtualDisplayAvailable) .isFalse() } finally { virtualDisplay?.release() } } private fun showDialog() { dialog.show() } Loading packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordPermissionDialogDelegate.kt +17 −1 Original line number Diff line number Diff line Loading @@ -280,6 +280,18 @@ class ScreenRecordPermissionDialogDelegate( private const val DELAY_MS: Long = 3000 private const val INTERVAL_MS: Long = 1000 private val RECORDABLE_DISPLAY_TYPES = intArrayOf( Display.TYPE_OVERLAY, Display.TYPE_EXTERNAL, Display.TYPE_INTERNAL, Display.TYPE_WIFI, ) private val filterDeviceTypeFlag: Boolean = com.android.media.projection.flags.Flags .mediaProjectionConnectedDisplayNoVirtualDevice() private fun createOptionList(displayManager: DisplayManager): List<ScreenShareOption> { if (!com.android.media.projection.flags.Flags.mediaProjectionConnectedDisplay()) { return listOf( Loading @@ -302,6 +314,7 @@ class ScreenRecordPermissionDialogDelegate( ), ) } return listOf( ScreenShareOption( SINGLE_APP, Loading @@ -322,7 +335,10 @@ class ScreenRecordPermissionDialogDelegate( ), ) + displayManager.displays .filter { it.displayId != Display.DEFAULT_DISPLAY } .filter { it.displayId != Display.DEFAULT_DISPLAY && (!filterDeviceTypeFlag || it.type in RECORDABLE_DISPLAY_TYPES) } .map { ScreenShareOption( ENTIRE_SCREEN, Loading Loading
media/java/android/media/flags/projection.aconfig +13 −1 Original line number Diff line number Diff line Loading @@ -17,3 +17,15 @@ flag { description: "Stops MediaProjection sessions when a call ends" bug: "368336349" } flag { name: "media_projection_connected_display_no_virtual_device" namespace: "media_projection" description: "Filter out display associated with a virtual device for media projection use case" bug: "362720120" metadata { purpose: PURPOSE_BUGFIX } is_exported: true }
packages/SystemUI/multivalentTests/src/com/android/systemui/screenrecord/ScreenRecordPermissionDialogDelegateTest.kt +32 −0 Original line number Diff line number Diff line Loading @@ -18,7 +18,10 @@ package com.android.systemui.screenrecord import android.content.Intent import android.hardware.display.DisplayManager import android.hardware.display.VirtualDisplay import android.hardware.display.VirtualDisplayConfig import android.os.UserHandle import android.platform.test.annotations.RequiresFlagsEnabled import android.testing.TestableLooper import android.view.View import android.widget.Spinner Loading @@ -42,6 +45,7 @@ import com.android.systemui.statusbar.phone.SystemUIDialogManager import com.android.systemui.util.mockito.argumentCaptor import com.android.systemui.util.mockito.mock import com.google.common.truth.Truth.assertThat import com.google.common.truth.Truth.assertWithMessage import junit.framework.Assert.assertEquals import org.junit.After import org.junit.Before Loading Loading @@ -224,6 +228,34 @@ class ScreenRecordPermissionDialogDelegateTest : SysuiTestCase() { .notifyProjectionRequestCancelled(TEST_HOST_UID) } @Test @RequiresFlagsEnabled( com.android.media.projection.flags.Flags .FLAG_MEDIA_PROJECTION_CONNECTED_DISPLAY_NO_VIRTUAL_DEVICE ) fun doNotShowVirtualDisplayInDialog() { val displayManager = context.getSystemService(DisplayManager::class.java)!! var virtualDisplay: VirtualDisplay? = null try { virtualDisplay = displayManager.createVirtualDisplay( VirtualDisplayConfig.Builder("virtual display", 1, 1, 160).build() ) showDialog() val spinner = dialog.requireViewById<Spinner>(R.id.screen_share_mode_options) val adapter = spinner.adapter val virtualDisplayAvailable = (0 until adapter.count) .mapNotNull { adapter.getItem(it) as? String } .any { it.contains("virtual display", ignoreCase = true) } assertWithMessage("A Virtual Display was shown in the list of display to record") .that(virtualDisplayAvailable) .isFalse() } finally { virtualDisplay?.release() } } private fun showDialog() { dialog.show() } Loading
packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordPermissionDialogDelegate.kt +17 −1 Original line number Diff line number Diff line Loading @@ -280,6 +280,18 @@ class ScreenRecordPermissionDialogDelegate( private const val DELAY_MS: Long = 3000 private const val INTERVAL_MS: Long = 1000 private val RECORDABLE_DISPLAY_TYPES = intArrayOf( Display.TYPE_OVERLAY, Display.TYPE_EXTERNAL, Display.TYPE_INTERNAL, Display.TYPE_WIFI, ) private val filterDeviceTypeFlag: Boolean = com.android.media.projection.flags.Flags .mediaProjectionConnectedDisplayNoVirtualDevice() private fun createOptionList(displayManager: DisplayManager): List<ScreenShareOption> { if (!com.android.media.projection.flags.Flags.mediaProjectionConnectedDisplay()) { return listOf( Loading @@ -302,6 +314,7 @@ class ScreenRecordPermissionDialogDelegate( ), ) } return listOf( ScreenShareOption( SINGLE_APP, Loading @@ -322,7 +335,10 @@ class ScreenRecordPermissionDialogDelegate( ), ) + displayManager.displays .filter { it.displayId != Display.DEFAULT_DISPLAY } .filter { it.displayId != Display.DEFAULT_DISPLAY && (!filterDeviceTypeFlag || it.type in RECORDABLE_DISPLAY_TYPES) } .map { ScreenShareOption( ENTIRE_SCREEN, Loading