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

Commit c83cc01b authored by kwaky's avatar kwaky
Browse files

DO NOT MERGE Update current user for passwordEntry and restart input on user switch.

This prevents IME not working due to the passwordEntry input field
drawn for a wrong user or due to having an invalid token.

Test: Manual
Bug: 168825956
Change-Id: I28e38a523e67011df680c9dfb21907047c0e3278
parent abeb5773
Loading
Loading
Loading
Loading
+29 −10
Original line number Diff line number Diff line
@@ -21,10 +21,13 @@ import android.car.user.CarUserManager;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.UserHandle;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewRootImpl;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;

import androidx.annotation.VisibleForTesting;

@@ -61,7 +64,7 @@ import dagger.Lazy;
public class CarKeyguardViewController extends OverlayViewController implements
        KeyguardViewController {
    private static final String TAG = "CarKeyguardViewController";
    private static final boolean DEBUG = true;
    private static final boolean DEBUG = false;

    private final Context mContext;
    private final Handler mHandler;
@@ -75,9 +78,10 @@ public class CarKeyguardViewController extends OverlayViewController implements
    private final DismissCallbackRegistry mDismissCallbackRegistry;
    private final ViewMediatorCallback mViewMediatorCallback;
    private final CarNavigationBarController mCarNavigationBarController;
    private final InputMethodManager mInputMethodManager;
    // Needed to instantiate mBouncer.
    private final KeyguardBouncer.BouncerExpansionCallback
            mExpansionCallback = new KeyguardBouncer.BouncerExpansionCallback() {
    private final KeyguardBouncer.BouncerExpansionCallback mExpansionCallback =
            new KeyguardBouncer.BouncerExpansionCallback() {
                @Override
                public void onFullyShown() {
                }
@@ -96,7 +100,8 @@ public class CarKeyguardViewController extends OverlayViewController implements
            };
    private final CarUserManager.UserLifecycleListener mUserLifecycleListener = (e) -> {
        if (e.getEventType() == CarUserManager.USER_LIFECYCLE_EVENT_TYPE_SWITCHING) {
            revealKeyguardIfBouncerPrepared();
            UserHandle currentUser = e.getUserHandle();
            revealKeyguardIfBouncerPrepared(currentUser);
        }
    };

@@ -136,6 +141,8 @@ public class CarKeyguardViewController extends OverlayViewController implements
        mDismissCallbackRegistry = dismissCallbackRegistry;
        mViewMediatorCallback = viewMediatorCallback;
        mCarNavigationBarController = carNavigationBarController;
        // TODO(b/169280588): Inject InputMethodManager instead.
        mInputMethodManager = mContext.getSystemService(InputMethodManager.class);

        registerUserSwitchedListener();
    }
@@ -376,7 +383,7 @@ public class CarKeyguardViewController extends OverlayViewController implements
        mBouncer = keyguardBouncer;
    }

    private void revealKeyguardIfBouncerPrepared() {
    private void revealKeyguardIfBouncerPrepared(UserHandle currentUser) {
        int reattemptDelayMillis = 50;
        Runnable revealKeyguard = () -> {
            if (mBouncer == null) {
@@ -388,17 +395,29 @@ public class CarKeyguardViewController extends OverlayViewController implements
            }
            if (!mBouncer.inTransit() || !mBouncer.isSecure()) {
                getLayout().setVisibility(View.VISIBLE);
                updateCurrentUserForPasswordEntry(currentUser);
            } else {
                if (DEBUG) {
                    Log.d(TAG, "revealKeyguardIfBouncerPrepared: Bouncer is not prepared "
                            + "yet so reattempting after " + reattemptDelayMillis + "ms.");
                }
                mHandler.postDelayed(this::revealKeyguardIfBouncerPrepared, reattemptDelayMillis);
                mHandler.postDelayed(() -> revealKeyguardIfBouncerPrepared(currentUser),
                        reattemptDelayMillis);
            }
        };
        mHandler.post(revealKeyguard);
    }

    private void updateCurrentUserForPasswordEntry(UserHandle currentUser) {
        EditText passwordEntry = getLayout().findViewById(R.id.passwordEntry);
        if (passwordEntry != null) {
            mHandler.post(() -> {
                mInputMethodManager.restartInput(passwordEntry);
                passwordEntry.setTextOperationUser(currentUser);
            });
        }
    }

    private void notifyKeyguardUpdateMonitor() {
        mKeyguardUpdateMonitor.onKeyguardVisibilityChanged(mShowing);
        if (mBouncer != null) {