From 8273c50a2c2eef634cc66a2a0190a2ec060061f3 Mon Sep 17 00:00:00 2001 From: Jorge Gil Date: Tue, 12 Nov 2024 23:12:29 +0000 Subject: Fix TaskInfo#requestedVisibleTypes update conditions 1) Force a task info changed dispatch whenever the window's requested visible types change, otherwise WMShell window decorations might show the wrong UI if it's out of sync with the true window state. 2) Obtain the requested types from top app window *excluding* the starting window Flag: com.android.window.flags.enable_fully_immersive_in_desktop Fix: 375509830 Test: open Candy Crush in desktop, immersive icon is shown on launch without having to move the window first to trigger an update Change-Id: I23eca5da60fcb5f9b167c64be7b8aaa94139a3ba --- services/core/java/com/android/server/wm/Session.java | 4 ++++ services/core/java/com/android/server/wm/Task.java | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/wm/Session.java b/services/core/java/com/android/server/wm/Session.java index 1bb4c41e79e0..0f66b93ca273 100644 --- a/services/core/java/com/android/server/wm/Session.java +++ b/services/core/java/com/android/server/wm/Session.java @@ -706,6 +706,10 @@ class Session extends IWindowSession.Stub implements IBinder.DeathRecipient { win.setRequestedVisibleTypes(requestedVisibleTypes); win.getDisplayContent().getInsetsPolicy().onRequestedVisibleTypesChanged(win, imeStatsToken); + final Task task = win.getTask(); + if (task != null) { + task.dispatchTaskInfoChangedIfNeeded(/* forced= */ true); + } } else { EmbeddedWindowController.EmbeddedWindow embeddedWindow = null; if (android.view.inputmethod.Flags.refactorInsetsController()) { diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index 352dc528f815..dbc3b76c22a1 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -3436,7 +3436,8 @@ class Task extends TaskFragment { info.isSleeping = shouldSleepActivities(); info.isTopActivityTransparent = top != null && !top.fillsParent(); info.lastNonFullscreenBounds = topTask.mLastNonFullscreenBounds; - final WindowState windowState = top != null ? top.findMainWindow() : null; + final WindowState windowState = top != null + ? top.findMainWindow(/* includeStartingApp= */ false) : null; info.requestedVisibleTypes = (windowState != null && Flags.enableFullyImmersiveInDesktop()) ? windowState.getRequestedVisibleTypes() : WindowInsets.Type.defaultVisible(); AppCompatUtils.fillAppCompatTaskInfo(this, info, top); -- cgit v1.2.3-59-g8ed1b