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

Commit 197b24b8 authored by Taran Singh's avatar Taran Singh
Browse files

Let system control IME for ineligible display

When IME is requested from a display that cannot show IME, we fallback
to StatusBar to control IME. However, StatusBar isn't always available.
In such cases, let the system control the IME.

Fix: 158122585
Fix: 148234093
Test: atest MultiDisplaySecurityTests
Change-Id: I4d2245402952590af6b5fcc91309a3b01885fd8e
parent 0811c474
Loading
Loading
Loading
Loading
+7 −4
Original line number Diff line number Diff line
@@ -3537,9 +3537,9 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
    InsetsControlTarget getImeFallback() {
        // host is in non-default display that doesn't support system decor, default to
        // default display's StatusBar to control IME (when available), else let system control it.
        WindowState statusBar = 
                mWmService.getDefaultDisplayContentLocked().getDisplayPolicy().getStatusBar();
        return statusBar != null ? statusBar : mRemoteInsetsControlTarget;
        final DisplayContent defaultDc = mWmService.getDefaultDisplayContentLocked();
        WindowState statusBar = defaultDc.getDisplayPolicy().getStatusBar();
        return statusBar != null ? statusBar : defaultDc.mRemoteInsetsControlTarget;
    }

    boolean canShowIme() {
@@ -3599,7 +3599,10 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
     */
    @VisibleForTesting
    InsetsControlTarget computeImeControlTarget() {
        if (!isImeControlledByApp() && mRemoteInsetsControlTarget != null) {
        if (!isImeControlledByApp() && mRemoteInsetsControlTarget != null
                || (mInputMethodInputTarget != null
                        && getImeHostOrFallback(mInputMethodInputTarget.getWindow())
                                == mRemoteInsetsControlTarget)) {
            return mRemoteInsetsControlTarget;
        } else {
            // Now, a special case -- if the last target's window is in the process of exiting, but
+15 −8
Original line number Diff line number Diff line
@@ -32,7 +32,7 @@ import java.io.PrintWriter;
 */
class ImeInsetsSourceProvider extends InsetsSourceProvider {

    private WindowState mImeTargetFromIme;
    private InsetsControlTarget mImeTargetFromIme;
    private Runnable mShowImeRunner;
    private boolean mIsImeLayoutDrawn;

@@ -47,10 +47,12 @@ class ImeInsetsSourceProvider extends InsetsSourceProvider {
     *
     * @param imeTarget imeTarget on which IME request is coming from.
     */
    void scheduleShowImePostLayout(WindowState imeTarget) {
    void scheduleShowImePostLayout(InsetsControlTarget imeTarget) {
        boolean targetChanged = mImeTargetFromIme != imeTarget
                && mImeTargetFromIme != null && imeTarget != null && mShowImeRunner != null
                && mImeTargetFromIme.mActivityRecord == imeTarget.mActivityRecord;
                && imeTarget.getWindow() != null && mImeTargetFromIme.getWindow() != null
                && mImeTargetFromIme.getWindow().mActivityRecord
                        == imeTarget.getWindow().mActivityRecord;
        mImeTargetFromIme = imeTarget;
        if (targetChanged) {
            // target changed, check if new target can show IME.
@@ -62,7 +64,8 @@ class ImeInsetsSourceProvider extends InsetsSourceProvider {
            return;
        }

        ProtoLog.d(WM_DEBUG_IME, "Schedule IME show for %s", mImeTargetFromIme.getName());
        ProtoLog.d(WM_DEBUG_IME, "Schedule IME show for %s", mImeTargetFromIme.getWindow() == null
                ? mImeTargetFromIme : mImeTargetFromIme.getWindow().getName());
        mShowImeRunner = () -> {
            ProtoLog.d(WM_DEBUG_IME, "Run showImeRunner");
            // Target should still be the same.
@@ -127,13 +130,17 @@ class ImeInsetsSourceProvider extends InsetsSourceProvider {
            return false;
        }
        ProtoLog.d(WM_DEBUG_IME, "dcTarget: %s mImeTargetFromIme: %s",
                dcTarget.getName(), mImeTargetFromIme.getName());
                dcTarget.getName(), mImeTargetFromIme.getWindow() == null
                        ? mImeTargetFromIme : mImeTargetFromIme.getWindow().getName());

        return (!dcTarget.isClosing() && mImeTargetFromIme == dcTarget)
                || (mImeTargetFromIme != null && dcTarget.getParentWindow() == mImeTargetFromIme
                        && dcTarget.mSubLayer > mImeTargetFromIme.mSubLayer)
                || (mImeTargetFromIme != null && mImeTargetFromIme.getWindow() != null
                        && dcTarget.getParentWindow() == mImeTargetFromIme
                        && dcTarget.mSubLayer > mImeTargetFromIme.getWindow().mSubLayer)
                || mImeTargetFromIme == mDisplayContent.getImeFallback()
                || (!mImeTargetFromIme.isClosing() && controlTarget == mImeTargetFromIme);
                || controlTarget == mImeTargetFromIme
                        && (mImeTargetFromIme.getWindow() == null 
                                || !mImeTargetFromIme.getWindow().isClosing());
    }

    @Override
+3 −2
Original line number Diff line number Diff line
@@ -7606,13 +7606,14 @@ public class WindowManagerService extends IWindowManager.Stub
                if (imeTarget == null) {
                    return;
                }
                imeTarget = imeTarget.getImeControlTarget().getWindow();
                final InsetsControlTarget controlTarget = imeTarget.getImeControlTarget();
                imeTarget = controlTarget.getWindow();
                // If InsetsControlTarget doesn't have a window, its using remoteControlTarget which
                // is controlled by default display
                final DisplayContent dc = imeTarget != null
                        ? imeTarget.getDisplayContent() : getDefaultDisplayContentLocked();
                dc.getInsetsStateController().getImeSourceProvider()
                        .scheduleShowImePostLayout(imeTarget);
                        .scheduleShowImePostLayout(controlTarget);
            }
        }