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

Commit 03df85e0 authored by chaviw's avatar chaviw
Browse files

Set focus to WMS computed focus when embedded window drops focus

If an internal system window wants to drop focus from an embedded
window, requestFocusTransfer doesn't need to be called and instead we
can directly call setFocusedWindow. This fixes the case where transfer
focus fails if the old focused window loses visibility by the time the
transfer request arrives. The transfer won't be allowed because the old
window isn't focused anymore so we can't honor the transfer request.

This fix is fine for internal system windows because there's no security
issue with transferring focus from embedded to something WMS computes.
However, there's still a race condition for cases where apps want to
transfer focus from embedded back to host when they are setting
visibility on the embedded window since the embedded window can become
invisible before the transfer goes through.

Test: Pip Menu focus lost
Fixes: 230851770
Change-Id: I09db0bbdf4db6eeaffa30275233811b13ea31132
parent e69a969f
Loading
Loading
Loading
Loading
+6 −6
Original line number Diff line number Diff line
@@ -2581,12 +2581,6 @@
      "group": "WM_DEBUG_ANIM",
      "at": "com\/android\/server\/wm\/WindowContainer.java"
    },
    "397105698": {
      "message": "grantEmbeddedWindowFocus remove request for win=%s dropped since no candidate was found",
      "level": "VERBOSE",
      "group": "WM_DEBUG_FOCUS",
      "at": "com\/android\/server\/wm\/WindowManagerService.java"
    },
    "397382873": {
      "message": "Moving to PAUSED: %s %s",
      "level": "VERBOSE",
@@ -3109,6 +3103,12 @@
      "group": "WM_DEBUG_LOCKTASK",
      "at": "com\/android\/server\/wm\/LockTaskController.java"
    },
    "958338552": {
      "message": "grantEmbeddedWindowFocus win=%s dropped focus so setting focus to null since no candidate was found",
      "level": "VERBOSE",
      "group": "WM_DEBUG_FOCUS",
      "at": "com\/android\/server\/wm\/WindowManagerService.java"
    },
    "959486822": {
      "message": "setSyncGroup #%d on %s",
      "level": "VERBOSE",
+7 −5
Original line number Diff line number Diff line
@@ -8857,16 +8857,18 @@ public class WindowManagerService extends IWindowManager.Stub
                WindowState newFocusTarget =  displayContent == null
                        ? null : displayContent.findFocusedWindow();
                if (newFocusTarget == null) {
                    ProtoLog.v(WM_DEBUG_FOCUS, "grantEmbeddedWindowFocus remove request for "
                                    + "win=%s dropped since no candidate was found",
                    t.setFocusedWindow(null, null, displayId).apply();
                    ProtoLog.v(WM_DEBUG_FOCUS, "grantEmbeddedWindowFocus win=%s"
                                    + " dropped focus so setting focus to null since no candidate"
                                    + " was found",
                            embeddedWindow);
                    return;
                }
                t.requestFocusTransfer(newFocusTarget.mInputChannelToken, newFocusTarget.getName(),
                        inputToken, embeddedWindow.toString(),
                t.setFocusedWindow(newFocusTarget.mInputChannelToken, newFocusTarget.getName(),
                        displayId).apply();

                EventLog.writeEvent(LOGTAG_INPUT_FOCUS,
                        "Transfer focus request " + newFocusTarget,
                        "Focus request " + newFocusTarget,
                        "reason=grantEmbeddedWindowFocus(false)");
            }
            ProtoLog.v(WM_DEBUG_FOCUS, "grantEmbeddedWindowFocus win=%s grantFocus=%s",