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

Commit e0980501 authored by John Spurlock's avatar John Spurlock
Browse files

Simplify IME policy and enforce in binder calls.

Revert the overly complicated bc7b6fc2.

Since setImeWindowStatus can be called externally, enforce similar keyguard
policy so that this is not a backdoor for IMEs bound under the keyguard to
drive IME visibility.

Policy is simplified, we keep track of whether the keyguard is locked
when the current IME switches.

This fixes b/7498792 (activity under lockscreen drives IME visibility
when lockscreen is rotated) and does not break b/11186297 (IME visible
when BT keyboard is attached).

Bug:7498792
Change-Id: Idd335cc8259c3532fa869449a9048b420f286e6d
parent 2b5297a4
Loading
Loading
Loading
Loading
+17 −16
Original line number Diff line number Diff line
@@ -309,6 +309,9 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
            mShortcutInputMethodsAndSubtypes =
                new HashMap<InputMethodInfo, ArrayList<InputMethodSubtype>>();

    // Was the keyguard locked when this client became current?
    private boolean mCurClientInKeyguard;

    /**
     * Set to true if our ServiceConnection is currently actively bound to
     * a service (whether or not we have gotten its IBinder back yet).
@@ -385,7 +388,6 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
    private Locale mLastSystemLocale;
    private final MyPackageMonitor mMyPackageMonitor = new MyPackageMonitor();
    private final IPackageManager mIPackageManager;
    private boolean mInputBoundToKeyguard;

    class SettingsObserver extends ContentObserver {
        String mLastEnabled = "";
@@ -874,12 +876,9 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
        final boolean hardKeyShown = haveHardKeyboard
                && conf.hardKeyboardHidden
                        != Configuration.HARDKEYBOARDHIDDEN_YES;
        final boolean isScreenLocked =
                mKeyguardManager != null && mKeyguardManager.isKeyguardLocked();
        final boolean isScreenSecurelyLocked =
                isScreenLocked && mKeyguardManager.isKeyguardSecure();
        final boolean inputShown = mInputShown && (!isScreenLocked || mInputBoundToKeyguard);
        final boolean inputActive = !isScreenSecurelyLocked && (inputShown || hardKeyShown);

        final boolean isScreenLocked = isKeyguardLocked();
        final boolean inputActive = !isScreenLocked && (mInputShown || hardKeyShown);
        // We assume the softkeyboard is shown when the input is active as long as the
        // hard keyboard is not shown.
        final boolean inputVisible = inputActive && !hardKeyShown;
@@ -1135,19 +1134,14 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
            return mNoBinding;
        }

        if (mCurClient == null) {
            mInputBoundToKeyguard = mKeyguardManager != null && mKeyguardManager.isKeyguardLocked();
            if (DEBUG) {
                Slog.v(TAG, "New bind. keyguard = " +  mInputBoundToKeyguard);
            }
        }

        if (mCurClient != cs) {
            // Was the keyguard locked when switching over to the new client?
            mCurClientInKeyguard = isKeyguardLocked();
            // If the client is changing, we need to switch over to the new
            // one.
            unbindCurrentClientLocked();
            if (DEBUG) Slog.v(TAG, "switching to client: client = "
                    + cs.client.asBinder());
                    + cs.client.asBinder() + " keyguard=" + mCurClientInKeyguard);

            // If the screen is on, inform the new client it is active
            if (mScreenOn) {
@@ -1499,6 +1493,10 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
        }
    }

    private boolean isKeyguardLocked() {
        return mKeyguardManager != null && mKeyguardManager.isKeyguardLocked();
    }

    // Caution! This method is called in this class. Handle multi-user carefully
    @SuppressWarnings("deprecation")
    @Override
@@ -1510,8 +1508,11 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
                Slog.w(TAG, "Ignoring setImeWindowStatus of uid " + uid + " token: " + token);
                return;
            }

            synchronized (mMethodMap) {
                // apply policy for binder calls
                if (vis != 0 && isKeyguardLocked() && !mCurClientInKeyguard) {
                    vis = 0;
                }
                mImeWindowVis = vis;
                mBackDisposition = backDisposition;
                if (mStatusBar != null) {