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

Commit e6fd7bbf authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Ask users with a11y services enabled to swipe up" into tm-d1-dev am: 53bac464

parents 485e68cf 53bac464
Loading
Loading
Loading
Loading
+8 −11
Original line number Original line Diff line number Diff line
@@ -62,6 +62,7 @@ import android.text.format.Formatter;
import android.util.Log;
import android.util.Log;
import android.view.View;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup;
import android.view.accessibility.AccessibilityManager;


import androidx.annotation.Nullable;
import androidx.annotation.Nullable;


@@ -142,6 +143,7 @@ public class KeyguardIndicationController {
    private final IActivityManager mIActivityManager;
    private final IActivityManager mIActivityManager;
    private final FalsingManager mFalsingManager;
    private final FalsingManager mFalsingManager;
    private final KeyguardBypassController mKeyguardBypassController;
    private final KeyguardBypassController mKeyguardBypassController;
    private final AccessibilityManager mAccessibilityManager;
    private final Handler mHandler;
    private final Handler mHandler;


    protected KeyguardIndicationRotateTextViewController mRotateTextViewController;
    protected KeyguardIndicationRotateTextViewController mRotateTextViewController;
@@ -218,7 +220,8 @@ public class KeyguardIndicationController {
            LockPatternUtils lockPatternUtils,
            LockPatternUtils lockPatternUtils,
            ScreenLifecycle screenLifecycle,
            ScreenLifecycle screenLifecycle,
            IActivityManager iActivityManager,
            IActivityManager iActivityManager,
            KeyguardBypassController keyguardBypassController) {
            KeyguardBypassController keyguardBypassController,
            AccessibilityManager accessibilityManager) {
        mContext = context;
        mContext = context;
        mBroadcastDispatcher = broadcastDispatcher;
        mBroadcastDispatcher = broadcastDispatcher;
        mDevicePolicyManager = devicePolicyManager;
        mDevicePolicyManager = devicePolicyManager;
@@ -236,6 +239,7 @@ public class KeyguardIndicationController {
        mIActivityManager = iActivityManager;
        mIActivityManager = iActivityManager;
        mFalsingManager = falsingManager;
        mFalsingManager = falsingManager;
        mKeyguardBypassController = keyguardBypassController;
        mKeyguardBypassController = keyguardBypassController;
        mAccessibilityManager = accessibilityManager;
        mScreenLifecycle = screenLifecycle;
        mScreenLifecycle = screenLifecycle;
        mScreenLifecycle.addObserver(mScreenObserver);
        mScreenLifecycle.addObserver(mScreenObserver);


@@ -905,7 +909,9 @@ public class KeyguardIndicationController {
                mStatusBarKeyguardViewManager.showBouncerMessage(message, mInitialTextColorState);
                mStatusBarKeyguardViewManager.showBouncerMessage(message, mInitialTextColorState);
            }
            }
        } else {
        } else {
            if (mKeyguardUpdateMonitor.isUdfpsSupported()
            if (!mAccessibilityManager.isEnabled()
                    && !mAccessibilityManager.isTouchExplorationEnabled()
                    && mKeyguardUpdateMonitor.isUdfpsSupported()
                    && mKeyguardUpdateMonitor.getUserCanSkipBouncer(
                    && mKeyguardUpdateMonitor.getUserCanSkipBouncer(
                    KeyguardUpdateMonitor.getCurrentUser())) {
                    KeyguardUpdateMonitor.getCurrentUser())) {
                final int stringId = mKeyguardUpdateMonitor.getIsFaceAuthenticated()
                final int stringId = mKeyguardUpdateMonitor.getIsFaceAuthenticated()
@@ -918,15 +924,6 @@ public class KeyguardIndicationController {
        }
        }
    }
    }


    private void showFaceFailedTryFingerprintMsg(int msgId, String a11yString) {
        showBiometricMessage(R.string.keyguard_face_failed_use_fp);

        // Although we suppress face auth errors visually, we still announce them for a11y
        if (!TextUtils.isEmpty(a11yString)) {
            mLockScreenIndicationView.announceForAccessibility(a11yString);
        }
    }

    public void dump(PrintWriter pw, String[] args) {
    public void dump(PrintWriter pw, String[] args) {
        pw.println("KeyguardIndicationController:");
        pw.println("KeyguardIndicationController:");
        pw.println("  mInitialTextColorState: " + mInitialTextColorState);
        pw.println("  mInitialTextColorState: " + mInitialTextColorState);
+66 −3
Original line number Original line Diff line number Diff line
@@ -71,6 +71,7 @@ import android.os.UserManager;
import android.testing.AndroidTestingRunner;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.testing.TestableLooper;
import android.view.ViewGroup;
import android.view.ViewGroup;
import android.view.accessibility.AccessibilityManager;


import androidx.test.InstrumentationRegistry;
import androidx.test.InstrumentationRegistry;
import androidx.test.filters.SmallTest;
import androidx.test.filters.SmallTest;
@@ -124,7 +125,6 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase {


    private static final int TEST_STRING_RES = R.string.keyguard_indication_trust_unlocked;
    private static final int TEST_STRING_RES = R.string.keyguard_indication_trust_unlocked;


    private String mKeyguardTryFingerprintMsg;
    private String mDisclosureWithOrganization;
    private String mDisclosureWithOrganization;
    private String mDisclosureGeneric;
    private String mDisclosureGeneric;
    private String mFinancedDisclosureWithOrganization;
    private String mFinancedDisclosureWithOrganization;
@@ -164,6 +164,8 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase {
    @Mock
    @Mock
    private KeyguardBypassController mKeyguardBypassController;
    private KeyguardBypassController mKeyguardBypassController;
    @Mock
    @Mock
    private AccessibilityManager mAccessibilityManager;
    @Mock
    private ScreenLifecycle mScreenLifecycle;
    private ScreenLifecycle mScreenLifecycle;
    @Captor
    @Captor
    private ArgumentCaptor<DockManager.AlignmentStateListener> mAlignmentListener;
    private ArgumentCaptor<DockManager.AlignmentStateListener> mAlignmentListener;
@@ -203,7 +205,6 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase {
        mContext.addMockSystemService(UserManager.class, mUserManager);
        mContext.addMockSystemService(UserManager.class, mUserManager);
        mContext.addMockSystemService(Context.TRUST_SERVICE, mock(TrustManager.class));
        mContext.addMockSystemService(Context.TRUST_SERVICE, mock(TrustManager.class));
        mContext.addMockSystemService(Context.FINGERPRINT_SERVICE, mock(FingerprintManager.class));
        mContext.addMockSystemService(Context.FINGERPRINT_SERVICE, mock(FingerprintManager.class));
        mKeyguardTryFingerprintMsg = mContext.getString(R.string.keyguard_try_fingerprint);
        mDisclosureWithOrganization = mContext.getString(R.string.do_disclosure_with_name,
        mDisclosureWithOrganization = mContext.getString(R.string.do_disclosure_with_name,
                ORGANIZATION_NAME);
                ORGANIZATION_NAME);
        mDisclosureGeneric = mContext.getString(R.string.do_disclosure_generic);
        mDisclosureGeneric = mContext.getString(R.string.do_disclosure_generic);
@@ -254,7 +255,8 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase {
                mKeyguardStateController, mStatusBarStateController, mKeyguardUpdateMonitor,
                mKeyguardStateController, mStatusBarStateController, mKeyguardUpdateMonitor,
                mDockManager, mBroadcastDispatcher, mDevicePolicyManager, mIBatteryStats,
                mDockManager, mBroadcastDispatcher, mDevicePolicyManager, mIBatteryStats,
                mUserManager, mExecutor, mExecutor,  mFalsingManager, mLockPatternUtils,
                mUserManager, mExecutor, mExecutor,  mFalsingManager, mLockPatternUtils,
                mScreenLifecycle, mIActivityManager, mKeyguardBypassController);
                mScreenLifecycle, mIActivityManager, mKeyguardBypassController,
                mAccessibilityManager);
        mController.init();
        mController.init();
        mController.setIndicationArea(mIndicationArea);
        mController.setIndicationArea(mIndicationArea);
        verify(mStatusBarStateController).addCallback(mStatusBarStateListenerCaptor.capture());
        verify(mStatusBarStateController).addCallback(mStatusBarStateListenerCaptor.capture());
@@ -925,6 +927,67 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase {
                trustGrantedMsg);
                trustGrantedMsg);
    }
    }


    @Test
    public void nonBypassFaceSuccess_touchExplorationEnabled_showsSwipeToOpen() {
        // GIVEN non bypass face auth and touch exploration is enabled
        when(mKeyguardBypassController.canBypass()).thenReturn(false);
        when(mAccessibilityManager.isTouchExplorationEnabled()).thenReturn(true);
        when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
        createController();
        String swipeToOpen = mContext.getString(R.string.keyguard_unlock);
        mController.setVisible(true);

        // WHEN face authenticated
        mController.getKeyguardCallback().onBiometricAuthenticated(0,
                BiometricSourceType.FACE, false);

        // THEN show 'swipe up to open' message
        verifyIndicationMessage(INDICATION_TYPE_BIOMETRIC_MESSAGE, swipeToOpen);
    }

    @Test
    public void nonBypassFaceSuccess_a11yEnabled_showsSwipeToOpen() {
        // GIVEN non bypass face auth and a11y is enabled
        when(mKeyguardBypassController.canBypass()).thenReturn(false);
        when(mAccessibilityManager.isEnabled()).thenReturn(true);
        when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
        createController();
        String swipeToOpen = mContext.getString(R.string.keyguard_unlock);
        mController.setVisible(true);

        // WHEN face auth is successful
        mController.getKeyguardCallback().onBiometricAuthenticated(0,
                BiometricSourceType.FACE, false);

        // THEN show 'swipe up to open' message
        verifyIndicationMessage(INDICATION_TYPE_BIOMETRIC_MESSAGE, swipeToOpen);
    }

    @Test
    public void coEx_nonBypassFaceSuccess_showsPressLockIcon() {
        // GIVEN udfps is supported, non-bypass face auth, and no a11y enabled
        when(mKeyguardUpdateMonitor.isUdfpsSupported()).thenReturn(true);
        when(mKeyguardBypassController.canBypass()).thenReturn(false);
        when(mKeyguardUpdateMonitor.getIsFaceAuthenticated()).thenReturn(true);
        when(mAccessibilityManager.isEnabled()).thenReturn(false);
        when(mAccessibilityManager.isTouchExplorationEnabled()).thenReturn(false);
        when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
        when(mKeyguardUpdateMonitor.getUserCanSkipBouncer(KeyguardUpdateMonitor.getCurrentUser()))
                .thenReturn(true);
        createController();
        mController.setVisible(true);

        // WHEN face auth succeeds
        mController.getKeyguardCallback().onBiometricAuthenticated(0,
                BiometricSourceType.FACE, false);

        // THEN press unlock icon to open message shows
        String pressLockIcon = mContext.getString(R.string.keyguard_face_successful_unlock_press);
        verifyIndicationMessage(INDICATION_TYPE_BIOMETRIC_MESSAGE, pressLockIcon);

        assertThat(mTextView.getText()).isNotEqualTo(pressLockIcon);
    }

    private void sendUpdateDisclosureBroadcast() {
    private void sendUpdateDisclosureBroadcast() {
        mBroadcastReceiver.onReceive(mContext, new Intent());
        mBroadcastReceiver.onReceive(mContext, new Intent());
    }
    }