Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cc9d7f03 authored by Vadim Caen's avatar Vadim Caen Committed by Android (Google) Code Review
Browse files

Merge "Only show physical display as recording targed for screen recording" into main

parents 8a5d8c5f 72526261
Loading
Loading
Loading
Loading
+13 −1
Original line number Diff line number Diff line
@@ -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
}
+32 −0
Original line number Diff line number Diff line
@@ -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
@@ -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
@@ -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()
    }
+17 −1
Original line number Diff line number Diff line
@@ -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(
@@ -302,6 +314,7 @@ class ScreenRecordPermissionDialogDelegate(
                    ),
                )
            }

            return listOf(
                ScreenShareOption(
                    SINGLE_APP,
@@ -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,