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

Commit a72db652 authored by Beverly's avatar Beverly
Browse files

Don't request focus on PIN's passwordView unless view is visible

Rather than fixing the bouncer lifecycle issue, manually
check the PIN view is visible before ever requesting focus
on its password entry view.

Test: atest KeyguardPinBasedInputViewControllerTest
Test: manually set pin; then set swipe; then set pin;
press power button to screen off, then to lockscreen;
send keycode events for pin and then enter;
observe device doesn't get unlocked without showing
the bouncer
Bug: 417307529
Flag: com.android.systemui.bouncer_lifecycle_fix

Change-Id: If4d5f2fb13e653adb97eaeaab6a177602da06ccb
parent 3bf9f89b
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -17,11 +17,13 @@
package com.android.keyguard;

import static com.android.internal.widget.flags.Flags.FLAG_HIDE_LAST_CHAR_WITH_PHYSICAL_INPUT;
import static com.android.systemui.Flags.FLAG_BOUNCER_LIFECYCLE_FIX;

import static com.google.common.truth.Truth.assertThat;

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.when;
@@ -142,11 +144,20 @@ public class KeyguardPinBasedInputViewControllerTest extends SysuiTestCase {
    }

    @Test
    @EnableFlags(FLAG_BOUNCER_LIFECYCLE_FIX)
    public void onResume_requestsFocus() {
        when(mPinBasedInputView.isVisibleToUser()).thenReturn(true);
        mKeyguardPinViewController.onResume(KeyguardSecurityView.SCREEN_ON);
        verify(mPasswordEntry).requestFocus();
    }

    @Test
    public void onResume_doesNotRequestFocusIfNotVisible() {
        when(mPinBasedInputView.isVisibleToUser()).thenReturn(false);
        mKeyguardPinViewController.onResume(KeyguardSecurityView.SCREEN_ON);
        verify(mPasswordEntry, never()).requestFocus();
    }

    @Test
    public void testGetInitialMessageResId() {
        assertThat(mKeyguardPinViewController.getInitialMessageResId()).isNotEqualTo(0);
+7 −3
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ import static com.android.keyguard.KeyguardSecurityView.PROMPT_REASON_RESTART_FO
import static com.android.keyguard.KeyguardSecurityView.PROMPT_REASON_TIMEOUT;
import static com.android.keyguard.KeyguardSecurityView.PROMPT_REASON_TRUSTAGENT_EXPIRED;
import static com.android.keyguard.KeyguardSecurityView.PROMPT_REASON_USER_REQUEST;
import static com.android.systemui.Flags.bouncerLifecycleFix;
import static com.android.systemui.Flags.pinInputFieldStyledFocusState;

import android.animation.Animator;
@@ -79,7 +80,8 @@ public abstract class KeyguardPinBasedInputView extends KeyguardAbsKeyInputView
    protected void setPasswordEntryEnabled(boolean enabled) {
        mPasswordEntry.setEnabled(enabled);
        mOkButton.setEnabled(enabled);
        if (enabled && !mPasswordEntry.hasFocus()) {
        if (enabled && !mPasswordEntry.hasFocus()
                && (!bouncerLifecycleFix() || isVisibleToUser())) {
            mPasswordEntry.requestFocus();
        }
    }
@@ -88,7 +90,7 @@ public abstract class KeyguardPinBasedInputView extends KeyguardAbsKeyInputView
    protected void setPasswordEntryInputEnabled(boolean enabled) {
        mPasswordEntry.setEnabled(enabled);
        mOkButton.setEnabled(enabled);
        if (enabled) {
        if (enabled && (!bouncerLifecycleFix() || isVisibleToUser())) {
            mPasswordEntry.requestFocus();
        }
    }
@@ -201,7 +203,9 @@ public abstract class KeyguardPinBasedInputView extends KeyguardAbsKeyInputView
        mButtons[8] = findViewById(R.id.key8);
        mButtons[9] = findViewById(R.id.key9);

        if ((!bouncerLifecycleFix() || isVisibleToUser())) {
            mPasswordEntry.requestFocus();
        }
        super.onFinishInflate();
        reloadColors();
    }
+7 −0
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.keyguard;
import static android.view.accessibility.AccessibilityEvent.TYPE_VIEW_FOCUSED;

import static com.android.internal.widget.flags.Flags.hideLastCharWithPhysicalInput;
import static com.android.systemui.Flags.bouncerLifecycleFix;
import static com.android.systemui.Flags.pinInputFieldStyledFocusState;
import static com.android.systemui.util.kotlin.JavaAdapterKt.collectFlow;

@@ -262,6 +263,12 @@ public abstract class KeyguardPinBasedInputViewController<T extends KeyguardPinB
    @Override
    public void onResume(int reason) {
        super.onResume(reason);

        if (bouncerLifecycleFix() && !mView.isVisibleToUser()) {
            // don't request focus if view isn't visible
            return;
        }

        // It's possible to reach a state here where mPasswordEntry believes it is focused
        // but it is not actually focused. This state will prevent the view from gaining focus,
        // as requestFocus will no-op since the focus flag is already set. By clearing focus first,
+1 −23
Original line number Diff line number Diff line
@@ -429,30 +429,8 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard

                @Override
                public void onDevicePolicyManagerStateChanged() {
                    if (Flags.bouncerLifecycleFix()) {
                        // Update the current security mode without showing it
                        SecurityMode currSecurityMode = whitelistIpcs(
                                () -> mSecurityModel.getSecurityMode(
                                        mSelectedUserInteractor.getSelectedUserId())
                        );
                        if (DEBUG) {
                            Log.d(TAG, "onDevicePolicyManagerStateChanged("
                                    + currSecurityMode + ")");
                        }

                        if (currSecurityMode == SecurityMode.Invalid
                                || currSecurityMode == mCurrentSecurityMode
                                || currSecurityMode == SimPuk
                                || currSecurityMode == SimPin) {
                            return;
                        }

                        getCurrentSecurityController(oldView -> oldView.onPause());
                        mCurrentSecurityMode = currSecurityMode;
                    } else {
                    showPrimarySecurityScreen(false);
                }
                }
            };
    private final SelectedUserInteractor mSelectedUserInteractor;
    private final Provider<DeviceEntryInteractor> mDeviceEntryInteractor;