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

Commit 3359c447 authored by Toshiki Kikuchi's avatar Toshiki Kikuchi
Browse files

Set override windowing mode of WallpaperActivity

This CL lets the override windowing mode of DesktopWallpaper to be
fullscreen when display windowing mode switching happens.
Otherwise, it may show up in freeform unexpectedly on freeform-first
displays after the wallpaper is opened on fullscreen-first display.
That's because when display windowing mode matches launch windowing
mode, Core doesn't set the override windowing mode to let the task
inherit the display windowing mode. So when the wallpaper is opened in
fullscreen-first display, the override windowing mode is UNDEFINED while
the resolved windowing mode is FULLSCREEN.

Flag: com.android.window.flags.enable_display_windowing_mode_switching
Bug: 397243360
Test: DesktopTasksControllerTest
Change-Id: I3d56929dcd1f13d1a7df328a8841263b6b9b164d
parent 53854039
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -1383,7 +1383,8 @@ public abstract class WMShellModule {
            Transitions transitions,
            RootTaskDisplayAreaOrganizer rootTaskDisplayAreaOrganizer,
            IWindowManager windowManager,
            ShellTaskOrganizer shellTaskOrganizer
            ShellTaskOrganizer shellTaskOrganizer,
            DesktopWallpaperActivityTokenProvider desktopWallpaperActivityTokenProvider
    ) {
        if (!DesktopModeStatus.canEnterDesktopMode(context)) {
            return Optional.empty();
@@ -1394,7 +1395,8 @@ public abstract class WMShellModule {
                        transitions,
                        rootTaskDisplayAreaOrganizer,
                        windowManager,
                        shellTaskOrganizer));
                        shellTaskOrganizer,
                        desktopWallpaperActivityTokenProvider));
    }

    //
+9 −0
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.wm.shell.desktopmode

import android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD
import android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM
import android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN
import android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED
import android.app.WindowConfiguration.windowingModeToString
import android.content.Context
@@ -31,6 +32,7 @@ import com.android.internal.protolog.ProtoLog
import com.android.window.flags.Flags
import com.android.wm.shell.RootTaskDisplayAreaOrganizer
import com.android.wm.shell.ShellTaskOrganizer
import com.android.wm.shell.desktopmode.desktopwallpaperactivity.DesktopWallpaperActivityTokenProvider
import com.android.wm.shell.protolog.ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE
import com.android.wm.shell.transition.Transitions

@@ -41,6 +43,7 @@ class DesktopDisplayModeController(
    private val rootTaskDisplayAreaOrganizer: RootTaskDisplayAreaOrganizer,
    private val windowManager: IWindowManager,
    private val shellTaskOrganizer: ShellTaskOrganizer,
    private val desktopWallpaperActivityTokenProvider: DesktopWallpaperActivityTokenProvider,
) {

    fun refreshDisplayWindowingMode() {
@@ -99,6 +102,12 @@ class DesktopDisplayModeController(
                    }
                }
            }
        // The override windowing mode of DesktopWallpaper can be UNDEFINED on fullscreen-display
        // right after the first launch while its resolved windowing mode is FULLSCREEN. We here
        // it has the FULLSCREEN override windowing mode.
        desktopWallpaperActivityTokenProvider.getToken(DEFAULT_DISPLAY)?.let { token ->
            wct.setWindowingMode(token, WINDOWING_MODE_FULLSCREEN)
        }
        transitions.startTransition(TRANSIT_CHANGE, wct, /* handler= */ null)
    }

+10 −0
Original line number Diff line number Diff line
@@ -37,6 +37,7 @@ import com.android.wm.shell.RootTaskDisplayAreaOrganizer
import com.android.wm.shell.ShellTaskOrganizer
import com.android.wm.shell.ShellTestCase
import com.android.wm.shell.TestRunningTaskInfoBuilder
import com.android.wm.shell.desktopmode.desktopwallpaperactivity.DesktopWallpaperActivityTokenProvider
import com.android.wm.shell.transition.Transitions
import com.google.common.truth.Truth.assertThat
import org.junit.Before
@@ -64,6 +65,8 @@ class DesktopDisplayModeControllerTest : ShellTestCase() {
    private val rootTaskDisplayAreaOrganizer = mock<RootTaskDisplayAreaOrganizer>()
    private val mockWindowManager = mock<IWindowManager>()
    private val shellTaskOrganizer = mock<ShellTaskOrganizer>()
    private val desktopWallpaperActivityTokenProvider =
        mock<DesktopWallpaperActivityTokenProvider>()

    private lateinit var controller: DesktopDisplayModeController

@@ -73,6 +76,7 @@ class DesktopDisplayModeControllerTest : ShellTestCase() {
    private val fullscreenTask =
        TestRunningTaskInfoBuilder().setWindowingMode(WINDOWING_MODE_FULLSCREEN).build()
    private val defaultTDA = DisplayAreaInfo(MockToken().token(), DEFAULT_DISPLAY, 0)
    private val wallpaperToken = MockToken().token()

    @Before
    fun setUp() {
@@ -86,10 +90,12 @@ class DesktopDisplayModeControllerTest : ShellTestCase() {
                rootTaskDisplayAreaOrganizer,
                mockWindowManager,
                shellTaskOrganizer,
                desktopWallpaperActivityTokenProvider,
            )
        runningTasks.add(freeformTask)
        runningTasks.add(fullscreenTask)
        whenever(shellTaskOrganizer.getRunningTasks(anyInt())).thenReturn(ArrayList(runningTasks))
        whenever(desktopWallpaperActivityTokenProvider.getToken()).thenReturn(wallpaperToken)
    }

    private fun testDisplayWindowingModeSwitch(
@@ -116,8 +122,12 @@ class DesktopDisplayModeControllerTest : ShellTestCase() {
                    .startTransition(eq(TRANSIT_CHANGE), arg.capture(), isNull())
                assertThat(arg.firstValue.changes[defaultTDA.token.asBinder()]?.windowingMode)
                    .isEqualTo(WINDOWING_MODE_FREEFORM)
                assertThat(arg.firstValue.changes[wallpaperToken.asBinder()]?.windowingMode)
                    .isEqualTo(WINDOWING_MODE_FULLSCREEN)
                assertThat(arg.secondValue.changes[defaultTDA.token.asBinder()]?.windowingMode)
                    .isEqualTo(defaultWindowingMode)
                assertThat(arg.secondValue.changes[wallpaperToken.asBinder()]?.windowingMode)
                    .isEqualTo(WINDOWING_MODE_FULLSCREEN)
            } else {
                verify(transitions, never()).startTransition(eq(TRANSIT_CHANGE), any(), isNull())
            }