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

Commit e32289b3 authored by Tarandeep Singh's avatar Tarandeep Singh
Browse files

Skip IME show on unsecured displays

If IME is attempted to be shown on untrusted display, skip it instead of
throwing exception. Split and re-use the existing
WMS#shouldShowIme(displayId).
Since in new Insets world, IME window show is requested by client
window, INTERNAL_SYSTEM_WINDOW permission check is not required.

Bug: 111084606
Test: atest CtsWindowManagerDeviceTestCases
Change-Id: I3231e93b1d4cb79ef70e22cb620f5aaf50e0f3b1
parent 1c664739
Loading
Loading
Loading
Loading
+22 −22
Original line number Diff line number Diff line
@@ -6864,21 +6864,12 @@ public class WindowManagerService extends IWindowManager.Stub
        if (!checkCallingPermission(INTERNAL_SYSTEM_WINDOW, "shouldShowIme()")) {
            throw new SecurityException("Requires INTERNAL_SYSTEM_WINDOW permission");
        }

        boolean show;
        synchronized (mGlobalLock) {
            final DisplayContent displayContent = mRoot.getDisplayContent(displayId);
            if (displayContent == null) {
                ProtoLog.w(WM_ERROR,
                        "Attempted to get IME flag of a display that does not exist: %d",
                        displayId);
                return false;
            }
            if (displayContent.isUntrustedVirtualDisplay()) {
                return false;
            }
            return mDisplayWindowSettings.shouldShowImeLocked(displayContent)
                    || mForceDesktopModeOnExternalDisplays;
            show = shouldShowImeSystemWindowUncheckedLocked(displayId);
        }

        return show;
    }

    @Override
@@ -7301,18 +7292,12 @@ public class WindowManagerService extends IWindowManager.Stub
                if (imeTarget == null) {
                    return;
                }
                final DisplayContent displayContent = imeTarget.getDisplayContent();
                if (displayContent == null) {
                    Slog.w(TAG_WM, "Attempted to show IME on an IME target that does not exist: "
                            + imeTarget.getName());
                final int displayId = imeTarget.getDisplayId();
                if (!shouldShowImeSystemWindowUncheckedLocked(displayId)) {
                    return;
                }
                if (displayContent.isUntrustedVirtualDisplay()) {
                    throw new SecurityException("Attempted to show IME on an untrusted "
                            + "virtual display: " + displayContent.getDisplayId());
                }

                displayContent.getInsetsStateController().getImeSourceProvider()
                mRoot.getDisplayContent(displayId).getInsetsStateController().getImeSourceProvider()
                        .scheduleShowImePostLayout(imeTarget);
            }
        }
@@ -7825,4 +7810,19 @@ public class WindowManagerService extends IWindowManager.Stub

        return true;
    }

    private boolean shouldShowImeSystemWindowUncheckedLocked(final int displayId) {
        final DisplayContent displayContent = mRoot.getDisplayContent(displayId);
        if (displayContent == null) {
            ProtoLog.w(WM_ERROR,
                    "Attempted to get IME flag of a display that does not exist: %d",
                    displayId);
            return false;
        }
        if (displayContent.isUntrustedVirtualDisplay()) {
            return false;
        }
        return mDisplayWindowSettings.shouldShowImeLocked(displayContent)
                || mForceDesktopModeOnExternalDisplays;
    }
}