Loading packages/SystemUI/multivalentTests/src/com/android/systemui/screenrecord/ScreenRecordPermissionDialogDelegateTest.kt +37 −2 Original line number Diff line number Diff line Loading @@ -21,9 +21,11 @@ import android.hardware.display.DisplayManager import android.hardware.display.VirtualDisplay import android.hardware.display.VirtualDisplayConfig import android.os.UserHandle import android.platform.test.annotations.EnableFlags import android.platform.test.annotations.RequiresFlagsEnabled import android.testing.TestableLooper import android.view.View import android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR import android.widget.Spinner import android.widget.TextView import androidx.test.ext.junit.runners.AndroidJUnit4 Loading @@ -33,6 +35,7 @@ import com.android.systemui.SysuiTestCase import com.android.systemui.animation.DialogTransitionAnimator import com.android.systemui.broadcast.BroadcastDispatcher import com.android.systemui.common.domain.interactor.SysUIStateDisplaysInteractor import com.android.systemui.display.data.repository.FakeDisplayWindowPropertiesRepository import com.android.systemui.mediaprojection.MediaProjectionMetricsLogger import com.android.systemui.mediaprojection.appselector.MediaProjectionAppSelectorActivity import com.android.systemui.mediaprojection.permission.ENTIRE_SCREEN Loading @@ -40,6 +43,7 @@ import com.android.systemui.mediaprojection.permission.SINGLE_APP import com.android.systemui.plugins.ActivityStarter import com.android.systemui.res.R import com.android.systemui.settings.UserContextProvider import com.android.systemui.shade.shared.flag.ShadeWindowGoesAround import com.android.systemui.statusbar.phone.SystemUIDialog import com.android.systemui.statusbar.phone.SystemUIDialogManager import com.android.systemui.util.mockito.argumentCaptor Loading Loading @@ -67,8 +71,11 @@ class ScreenRecordPermissionDialogDelegateTest : SysuiTestCase() { @Mock private lateinit var userContextProvider: UserContextProvider @Mock private lateinit var onStartRecordingClicked: Runnable @Mock private lateinit var mediaProjectionMetricsLogger: MediaProjectionMetricsLogger private val fakeDisplayWindowPropertiesRepository = FakeDisplayWindowPropertiesRepository(context) private lateinit var dialog: SystemUIDialog private lateinit var underTest: ScreenRecordPermissionDialogDelegate @Before fun setUp() { Loading @@ -83,7 +90,7 @@ class ScreenRecordPermissionDialogDelegateTest : SysuiTestCase() { Dependency.get(DialogTransitionAnimator::class.java), ) val delegate = underTest = ScreenRecordPermissionDialogDelegate( UserHandle.of(0), TEST_HOST_UID, Loading @@ -95,8 +102,9 @@ class ScreenRecordPermissionDialogDelegateTest : SysuiTestCase() { systemUIDialogFactory, context, context.getSystemService(DisplayManager::class.java)!!, fakeDisplayWindowPropertiesRepository, ) dialog = delegate.createDialog() dialog = underTest.createDialog() } @After Loading Loading @@ -256,6 +264,33 @@ class ScreenRecordPermissionDialogDelegateTest : SysuiTestCase() { } } @Test @EnableFlags(ShadeWindowGoesAround.FLAG_NAME) fun createDialog_usesDisplayContextInsteadOfDefaultOne() { val shadeContext = context val displayManager = context.getSystemService(DisplayManager::class.java)!! var virtualDisplay: VirtualDisplay? = null try { virtualDisplay = displayManager.createVirtualDisplay( VirtualDisplayConfig.Builder("virtual display", 1, 1, 160).build() )!! val displayContext = context.createDisplayContext(virtualDisplay.display) fakeDisplayWindowPropertiesRepository.insertForContext( displayId = virtualDisplay.display.displayId, TYPE_STATUS_BAR, displayContext, ) shadeContext.display = virtualDisplay.display dialog = underTest.createDialog() assertThat(dialog.context.displayId).isEqualTo(virtualDisplay.display.displayId) } finally { virtualDisplay?.release() } } private fun showDialog() { dialog.show() } Loading packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordPermissionDialogDelegate.kt +20 −1 Original line number Diff line number Diff line Loading @@ -20,7 +20,9 @@ import android.hardware.display.DisplayManager import android.os.Bundle import android.os.UserHandle import android.view.View import android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR import androidx.annotation.StyleRes import com.android.systemui.display.data.repository.DisplayWindowPropertiesRepository import com.android.systemui.mediaprojection.MediaProjectionMetricsLogger import com.android.systemui.mediaprojection.permission.BaseMediaProjectionPermissionContentManager import com.android.systemui.mediaprojection.permission.BaseMediaProjectionPermissionDialogDelegate Loading @@ -30,6 +32,7 @@ import com.android.systemui.plugins.ActivityStarter import com.android.systemui.res.R import com.android.systemui.settings.UserContextProvider import com.android.systemui.shade.ShadeDisplayAware import com.android.systemui.shade.shared.flag.ShadeWindowGoesAround import com.android.systemui.statusbar.phone.SystemUIDialog import dagger.assisted.Assisted import dagger.assisted.AssistedFactory Loading @@ -49,6 +52,7 @@ class ScreenRecordPermissionDialogDelegate( @StyleRes private val theme: Int, private val context: Context, private val displayManager: DisplayManager, private val displayWindowPropertiesRepository: DisplayWindowPropertiesRepository, ) : BaseMediaProjectionPermissionDialogDelegate<SystemUIDialog>( ScreenRecordPermissionContentManager.createOptionList(displayManager), Loading @@ -72,6 +76,7 @@ class ScreenRecordPermissionDialogDelegate( systemUIDialogFactory: SystemUIDialog.Factory, @ShadeDisplayAware context: Context, displayManager: DisplayManager, displayWindowPropertiesRepository: DisplayWindowPropertiesRepository, ) : this( hostUserHandle, hostUid, Loading @@ -85,6 +90,7 @@ class ScreenRecordPermissionDialogDelegate( theme = SystemUIDialog.DEFAULT_THEME, context, displayManager, displayWindowPropertiesRepository, ) @AssistedFactory Loading Loading @@ -112,7 +118,20 @@ class ScreenRecordPermissionDialogDelegate( } override fun createDialog(): SystemUIDialog { return systemUIDialogFactory.create(this, context, theme) val displayContext = if (ShadeWindowGoesAround.isEnabled) { // This dialog needs to stay visible even if the notification shade closes, // for example, after unlocking the device. If we used the shade's own context, the // dialog would be tied to the shade and disappear when the shade collapses. // To avoid this, we get a context associated with the status bar on the current // display. This ensures the dialog remains visible independently of the shade. displayWindowPropertiesRepository.get(context.displayId, TYPE_STATUS_BAR)?.context // falls back to the default context if the status bar context is not available ?: context } else { context } return systemUIDialogFactory.create(this, displayContext, theme) } override fun onCreate(dialog: SystemUIDialog, savedInstanceState: Bundle?) { Loading Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/screenrecord/ScreenRecordPermissionDialogDelegateTest.kt +37 −2 Original line number Diff line number Diff line Loading @@ -21,9 +21,11 @@ import android.hardware.display.DisplayManager import android.hardware.display.VirtualDisplay import android.hardware.display.VirtualDisplayConfig import android.os.UserHandle import android.platform.test.annotations.EnableFlags import android.platform.test.annotations.RequiresFlagsEnabled import android.testing.TestableLooper import android.view.View import android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR import android.widget.Spinner import android.widget.TextView import androidx.test.ext.junit.runners.AndroidJUnit4 Loading @@ -33,6 +35,7 @@ import com.android.systemui.SysuiTestCase import com.android.systemui.animation.DialogTransitionAnimator import com.android.systemui.broadcast.BroadcastDispatcher import com.android.systemui.common.domain.interactor.SysUIStateDisplaysInteractor import com.android.systemui.display.data.repository.FakeDisplayWindowPropertiesRepository import com.android.systemui.mediaprojection.MediaProjectionMetricsLogger import com.android.systemui.mediaprojection.appselector.MediaProjectionAppSelectorActivity import com.android.systemui.mediaprojection.permission.ENTIRE_SCREEN Loading @@ -40,6 +43,7 @@ import com.android.systemui.mediaprojection.permission.SINGLE_APP import com.android.systemui.plugins.ActivityStarter import com.android.systemui.res.R import com.android.systemui.settings.UserContextProvider import com.android.systemui.shade.shared.flag.ShadeWindowGoesAround import com.android.systemui.statusbar.phone.SystemUIDialog import com.android.systemui.statusbar.phone.SystemUIDialogManager import com.android.systemui.util.mockito.argumentCaptor Loading Loading @@ -67,8 +71,11 @@ class ScreenRecordPermissionDialogDelegateTest : SysuiTestCase() { @Mock private lateinit var userContextProvider: UserContextProvider @Mock private lateinit var onStartRecordingClicked: Runnable @Mock private lateinit var mediaProjectionMetricsLogger: MediaProjectionMetricsLogger private val fakeDisplayWindowPropertiesRepository = FakeDisplayWindowPropertiesRepository(context) private lateinit var dialog: SystemUIDialog private lateinit var underTest: ScreenRecordPermissionDialogDelegate @Before fun setUp() { Loading @@ -83,7 +90,7 @@ class ScreenRecordPermissionDialogDelegateTest : SysuiTestCase() { Dependency.get(DialogTransitionAnimator::class.java), ) val delegate = underTest = ScreenRecordPermissionDialogDelegate( UserHandle.of(0), TEST_HOST_UID, Loading @@ -95,8 +102,9 @@ class ScreenRecordPermissionDialogDelegateTest : SysuiTestCase() { systemUIDialogFactory, context, context.getSystemService(DisplayManager::class.java)!!, fakeDisplayWindowPropertiesRepository, ) dialog = delegate.createDialog() dialog = underTest.createDialog() } @After Loading Loading @@ -256,6 +264,33 @@ class ScreenRecordPermissionDialogDelegateTest : SysuiTestCase() { } } @Test @EnableFlags(ShadeWindowGoesAround.FLAG_NAME) fun createDialog_usesDisplayContextInsteadOfDefaultOne() { val shadeContext = context val displayManager = context.getSystemService(DisplayManager::class.java)!! var virtualDisplay: VirtualDisplay? = null try { virtualDisplay = displayManager.createVirtualDisplay( VirtualDisplayConfig.Builder("virtual display", 1, 1, 160).build() )!! val displayContext = context.createDisplayContext(virtualDisplay.display) fakeDisplayWindowPropertiesRepository.insertForContext( displayId = virtualDisplay.display.displayId, TYPE_STATUS_BAR, displayContext, ) shadeContext.display = virtualDisplay.display dialog = underTest.createDialog() assertThat(dialog.context.displayId).isEqualTo(virtualDisplay.display.displayId) } finally { virtualDisplay?.release() } } private fun showDialog() { dialog.show() } Loading
packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordPermissionDialogDelegate.kt +20 −1 Original line number Diff line number Diff line Loading @@ -20,7 +20,9 @@ import android.hardware.display.DisplayManager import android.os.Bundle import android.os.UserHandle import android.view.View import android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR import androidx.annotation.StyleRes import com.android.systemui.display.data.repository.DisplayWindowPropertiesRepository import com.android.systemui.mediaprojection.MediaProjectionMetricsLogger import com.android.systemui.mediaprojection.permission.BaseMediaProjectionPermissionContentManager import com.android.systemui.mediaprojection.permission.BaseMediaProjectionPermissionDialogDelegate Loading @@ -30,6 +32,7 @@ import com.android.systemui.plugins.ActivityStarter import com.android.systemui.res.R import com.android.systemui.settings.UserContextProvider import com.android.systemui.shade.ShadeDisplayAware import com.android.systemui.shade.shared.flag.ShadeWindowGoesAround import com.android.systemui.statusbar.phone.SystemUIDialog import dagger.assisted.Assisted import dagger.assisted.AssistedFactory Loading @@ -49,6 +52,7 @@ class ScreenRecordPermissionDialogDelegate( @StyleRes private val theme: Int, private val context: Context, private val displayManager: DisplayManager, private val displayWindowPropertiesRepository: DisplayWindowPropertiesRepository, ) : BaseMediaProjectionPermissionDialogDelegate<SystemUIDialog>( ScreenRecordPermissionContentManager.createOptionList(displayManager), Loading @@ -72,6 +76,7 @@ class ScreenRecordPermissionDialogDelegate( systemUIDialogFactory: SystemUIDialog.Factory, @ShadeDisplayAware context: Context, displayManager: DisplayManager, displayWindowPropertiesRepository: DisplayWindowPropertiesRepository, ) : this( hostUserHandle, hostUid, Loading @@ -85,6 +90,7 @@ class ScreenRecordPermissionDialogDelegate( theme = SystemUIDialog.DEFAULT_THEME, context, displayManager, displayWindowPropertiesRepository, ) @AssistedFactory Loading Loading @@ -112,7 +118,20 @@ class ScreenRecordPermissionDialogDelegate( } override fun createDialog(): SystemUIDialog { return systemUIDialogFactory.create(this, context, theme) val displayContext = if (ShadeWindowGoesAround.isEnabled) { // This dialog needs to stay visible even if the notification shade closes, // for example, after unlocking the device. If we used the shade's own context, the // dialog would be tied to the shade and disappear when the shade collapses. // To avoid this, we get a context associated with the status bar on the current // display. This ensures the dialog remains visible independently of the shade. displayWindowPropertiesRepository.get(context.displayId, TYPE_STATUS_BAR)?.context // falls back to the default context if the status bar context is not available ?: context } else { context } return systemUIDialogFactory.create(this, displayContext, theme) } override fun onCreate(dialog: SystemUIDialog, savedInstanceState: Bundle?) { Loading