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

Commit 18f4606d authored by Yohei Yukawa's avatar Yohei Yukawa
Browse files

Propagate displayId in ImeTargetChangeListener

This is a follow up CL to our previous CLs [1][2], which added

  ImeTargetChangeListener.

To support concurrent multi-user multi-display scenarios, we need to
distinguish whose IMEs these callbacks are talking about. To do so,
with this CL the relevant display ID also starts being propagated into
ImeVisibilityStateComputer.

These display IDs are not yet used thus there must be no observable
behavior change in this CL.

 [1]: I90c59c298e2e4568e308fb2c0dc4ca309d5546a3
      f8c63371
 [2]: I3a950423f73f0a97432589d0a90ac8fd1c84f05e
      8fb9afd6

Fix: 356177006
Test: presubmit
Test: atest WmTests:WindowStateTests
Test: atest FrameworksInputMethodSystemServerTests
Flag: EXEMPT refactor
Change-Id: Ib50f7fdfb455b6d09707f680e71ad3dd7b0a18f2
parent 2e7481d1
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -220,7 +220,7 @@ public final class ImeVisibilityStateComputer {
            @Override
            public void onImeTargetOverlayVisibilityChanged(@NonNull IBinder overlayWindowToken,
                    @WindowManager.LayoutParams.WindowType int windowType, boolean visible,
                    boolean removed) {
                    boolean removed, int displayId) {
                // Ignoring the starting window since it's ok to cover the IME target
                // window in temporary without affecting the IME visibility.
                final boolean hasOverlay = visible && !removed
@@ -232,7 +232,7 @@ public final class ImeVisibilityStateComputer {

            @Override
            public void onImeInputTargetVisibilityChanged(IBinder imeInputTarget,
                    boolean visibleRequested, boolean removed) {
                    boolean visibleRequested, boolean removed, int displayId) {
                final boolean visibleAndNotRemoved = visibleRequested && !removed;
                synchronized (ImfLock.class) {
                    if (visibleAndNotRemoved) {
+3 −2
Original line number Diff line number Diff line
@@ -4415,13 +4415,14 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
                                mWmService.dispatchImeInputTargetVisibilityChanged(
                                        targetWin.mClient.asBinder(), isVisibleRequested,
                                        targetWin.mActivityRecord != null
                                                && targetWin.mActivityRecord.finishing);
                                                && targetWin.mActivityRecord.finishing,
                                        mDisplayId);
                            }
                        });
                targetWin.mToken.registerWindowContainerListener(
                        mImeTargetTokenListenerPair.second);
                mWmService.dispatchImeInputTargetVisibilityChanged(targetWin.mClient.asBinder(),
                        targetWin.isVisible() /* visible */, false /* removed */);
                        targetWin.isVisible() /* visible */, false /* removed */, mDisplayId);
            }
        }
        if (refreshImeSecureFlag(getPendingTransaction())) {
+5 −3
Original line number Diff line number Diff line
@@ -37,25 +37,27 @@ public interface ImeTargetChangeListener {
     * @param visible            the visibility of the overlay window, {@code true} means visible
     *                           and {@code false} otherwise.
     * @param removed            Whether the IME target overlay window has being removed.
     * @param displayId          display ID where the overlay window exists.
     */
    default void onImeTargetOverlayVisibilityChanged(@NonNull IBinder overlayWindowToken,
            @WindowManager.LayoutParams.WindowType int windowType,
            boolean visible, boolean removed) {
            boolean visible, boolean removed, int displayId) {
    }

    /**
     * Called when the visibility of IME input target window has changed.
     *
     * @param imeInputTarget   the window token of the IME input target window.
     * @param visible          the new window visibility made by {@param imeInputTarget}. visible is
     * @param visible          the new window visibility made by {@code imeInputTarget}. visible is
     *                         {@code true} when switching to the new visible IME input target
     *                         window and started input, or the same input target relayout to
     *                         visible from invisible. In contrast, visible is {@code false} when
     *                         closing the input target, or the same input target relayout to
     *                         invisible from visible.
     * @param removed          Whether the IME input target window has being removed.
     * @param displayId        display ID where the overlay window exists.
     */
    default void onImeInputTargetVisibilityChanged(@NonNull IBinder imeInputTarget, boolean visible,
            boolean removed) {
            boolean removed, int displayId) {
    }
}
+12 −9
Original line number Diff line number Diff line
@@ -1897,7 +1897,8 @@ public class WindowManagerService extends IWindowManager.Stub
                displayContent.computeImeTarget(true /* updateImeTarget */);
                if (win.isImeOverlayLayeringTarget()) {
                    dispatchImeTargetOverlayVisibilityChanged(client.asBinder(), win.mAttrs.type,
                            win.isVisibleRequestedOrAdding(), false /* removed */);
                            win.isVisibleRequestedOrAdding(), false /* removed */,
                            displayContent.getDisplayId());
                }
            }

@@ -2661,13 +2662,13 @@ public class WindowManagerService extends IWindowManager.Stub
            final boolean winVisibleChanged = win.isVisible() != wasVisible;
            if (win.isImeOverlayLayeringTarget() && winVisibleChanged) {
                dispatchImeTargetOverlayVisibilityChanged(client.asBinder(), win.mAttrs.type,
                        win.isVisible(), false /* removed */);
                        win.isVisible(), false /* removed */, win.getDisplayId());
            }
            // Notify listeners about IME input target window visibility change.
            final boolean isImeInputTarget = win.getDisplayContent().getImeInputTarget() == win;
            if (isImeInputTarget && winVisibleChanged) {
                dispatchImeInputTargetVisibilityChanged(win.mClient.asBinder(),
                        win.isVisible() /* visible */, false /* removed */);
                        win.isVisible() /* visible */, false /* removed */, win.getDisplayId());
            }

            if (outRelayoutResult != null) {
@@ -3515,27 +3516,29 @@ public class WindowManagerService extends IWindowManager.Stub

    void dispatchImeTargetOverlayVisibilityChanged(@NonNull IBinder token,
            @WindowManager.LayoutParams.WindowType int windowType, boolean visible,
            boolean removed) {
            boolean removed, int displayId) {
        if (mImeTargetChangeListener != null) {
            if (DEBUG_INPUT_METHOD) {
                Slog.d(TAG, "onImeTargetOverlayVisibilityChanged, win=" + mWindowMap.get(token)
                        + ", type=" + ViewDebug.intToString(WindowManager.LayoutParams.class,
                        "type", windowType) + "visible=" + visible + ", removed=" + removed);
                        "type", windowType) + "visible=" + visible + ", removed=" + removed
                        + ", displayId=" + displayId);
            }
            mH.post(() -> mImeTargetChangeListener.onImeTargetOverlayVisibilityChanged(token,
                    windowType, visible, removed));
                    windowType, visible, removed, displayId));
        }
    }

    void dispatchImeInputTargetVisibilityChanged(@NonNull IBinder token, boolean visible,
            boolean removed) {
            boolean removed, int displayId) {
        if (mImeTargetChangeListener != null) {
            if (DEBUG_INPUT_METHOD) {
                Slog.d(TAG, "onImeInputTargetVisibilityChanged, win=" + mWindowMap.get(token)
                        + "visible=" + visible + ", removed=" + removed);
                        + "visible=" + visible + ", removed=" + removed
                        + ", displayId" + displayId);
            }
            mH.post(() -> mImeTargetChangeListener.onImeInputTargetVisibilityChanged(token,
                    visible, removed));
                    visible, removed, displayId));
        }
    }

+3 −3
Original line number Diff line number Diff line
@@ -2359,11 +2359,11 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
        }
        super.removeImmediately();

        final DisplayContent dc = getDisplayContent();
        if (isImeOverlayLayeringTarget()) {
            mWmService.dispatchImeTargetOverlayVisibilityChanged(mClient.asBinder(), mAttrs.type,
                    false /* visible */, true /* removed */);
                    false /* visible */, true /* removed */, dc.getDisplayId());
        }
        final DisplayContent dc = getDisplayContent();
        if (isImeLayeringTarget()) {
            // Remove the attached IME screenshot surface.
            dc.removeImeSurfaceByTarget(this);
@@ -2374,7 +2374,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
        }
        if (dc.getImeInputTarget() == this && !inRelaunchingActivity()) {
            mWmService.dispatchImeInputTargetVisibilityChanged(mClient.asBinder(),
                    false /* visible */, true /* removed */);
                    false /* visible */, true /* removed */, dc.getDisplayId());
            dc.updateImeInputAndControlTarget(null);
        }

Loading