diff options
| author | 2022-10-26 11:19:19 -0700 | |
|---|---|---|
| committer | 2022-10-28 09:27:18 -0700 | |
| commit | e2bdfdadbe9aa684155c018233aa7faa4b6785d5 (patch) | |
| tree | 2431197eeb1bd994ccdb7ba73cb7eedebef45848 | |
| parent | d779fab0e634950115e72984af8cded14426997d (diff) | |
[User Switcher] Remove falsing check for a11y.
The user switcher on the bouncer has a bunch of falsing checks. Check to
see if the click that is performed is from an accessibility action. If
this is the case, we do not perform a falsing check.
Test: Add a unit test. Used voice access and switch access to open the
user switcher and select an item in that list.
Bug: 221370490, 222211112
Change-Id: Ie9fce53ce11b68dc10f5c2513d3c6a600c51fafa
14 files changed, 208 insertions, 34 deletions
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java index 93ee151f26c5..c756a17976bf 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java @@ -89,6 +89,7 @@ import com.android.settingslib.Utils; import com.android.systemui.Gefingerpoken; import com.android.systemui.R; import com.android.systemui.animation.Interpolators; +import com.android.systemui.classifier.FalsingA11yDelegate; import com.android.systemui.plugins.FalsingManager; import com.android.systemui.shared.system.SysUiStatsLog; import com.android.systemui.statusbar.policy.BaseUserSwitcherAdapter; @@ -136,6 +137,7 @@ public class KeyguardSecurityContainer extends ConstraintLayout { private GlobalSettings mGlobalSettings; private FalsingManager mFalsingManager; private UserSwitcherController mUserSwitcherController; + private FalsingA11yDelegate mFalsingA11yDelegate; private AlertDialog mAlertDialog; private boolean mSwipeUpToRetry; @@ -318,7 +320,8 @@ public class KeyguardSecurityContainer extends ConstraintLayout { void initMode(@Mode int mode, GlobalSettings globalSettings, FalsingManager falsingManager, UserSwitcherController userSwitcherController, - UserSwitcherViewMode.UserSwitcherCallback userSwitcherCallback) { + UserSwitcherViewMode.UserSwitcherCallback userSwitcherCallback, + FalsingA11yDelegate falsingA11yDelegate) { if (mCurrentMode == mode) return; Log.i(TAG, "Switching mode from " + modeToString(mCurrentMode) + " to " + modeToString(mode)); @@ -337,6 +340,7 @@ public class KeyguardSecurityContainer extends ConstraintLayout { } mGlobalSettings = globalSettings; mFalsingManager = falsingManager; + mFalsingA11yDelegate = falsingA11yDelegate; mUserSwitcherController = userSwitcherController; setupViewMode(); } @@ -361,7 +365,7 @@ public class KeyguardSecurityContainer extends ConstraintLayout { } mViewMode.init(this, mGlobalSettings, mSecurityViewFlipper, mFalsingManager, - mUserSwitcherController); + mUserSwitcherController, mFalsingA11yDelegate); } @Mode int getMode() { @@ -723,7 +727,8 @@ public class KeyguardSecurityContainer extends ConstraintLayout { default void init(@NonNull ConstraintLayout v, @NonNull GlobalSettings globalSettings, @NonNull KeyguardSecurityViewFlipper viewFlipper, @NonNull FalsingManager falsingManager, - @NonNull UserSwitcherController userSwitcherController) {}; + @NonNull UserSwitcherController userSwitcherController, + @NonNull FalsingA11yDelegate falsingA11yDelegate) {}; /** Reinitialize the location */ default void updateSecurityViewLocation() {}; @@ -828,7 +833,8 @@ public class KeyguardSecurityContainer extends ConstraintLayout { public void init(@NonNull ConstraintLayout v, @NonNull GlobalSettings globalSettings, @NonNull KeyguardSecurityViewFlipper viewFlipper, @NonNull FalsingManager falsingManager, - @NonNull UserSwitcherController userSwitcherController) { + @NonNull UserSwitcherController userSwitcherController, + @NonNull FalsingA11yDelegate falsingA11yDelegate) { mView = v; mViewFlipper = viewFlipper; @@ -865,6 +871,7 @@ public class KeyguardSecurityContainer extends ConstraintLayout { this::setupUserSwitcher; private UserSwitcherCallback mUserSwitcherCallback; + private FalsingA11yDelegate mFalsingA11yDelegate; UserSwitcherViewMode(UserSwitcherCallback userSwitcherCallback) { mUserSwitcherCallback = userSwitcherCallback; @@ -874,13 +881,15 @@ public class KeyguardSecurityContainer extends ConstraintLayout { public void init(@NonNull ConstraintLayout v, @NonNull GlobalSettings globalSettings, @NonNull KeyguardSecurityViewFlipper viewFlipper, @NonNull FalsingManager falsingManager, - @NonNull UserSwitcherController userSwitcherController) { + @NonNull UserSwitcherController userSwitcherController, + @NonNull FalsingA11yDelegate falsingA11yDelegate) { init(v, viewFlipper, globalSettings, /* leftAlignedByDefault= */false); mView = v; mViewFlipper = viewFlipper; mFalsingManager = falsingManager; mUserSwitcherController = userSwitcherController; mResources = v.getContext().getResources(); + mFalsingA11yDelegate = falsingA11yDelegate; if (mUserSwitcherViewGroup == null) { LayoutInflater.from(v.getContext()).inflate( @@ -978,6 +987,7 @@ public class KeyguardSecurityContainer extends ConstraintLayout { mUserSwitcher.setText(currentUserName); KeyguardUserSwitcherAnchor anchor = mView.findViewById(R.id.user_switcher_anchor); + anchor.setAccessibilityDelegate(mFalsingA11yDelegate); BaseUserSwitcherAdapter adapter = new BaseUserSwitcherAdapter(mUserSwitcherController) { @Override @@ -1048,7 +1058,7 @@ public class KeyguardSecurityContainer extends ConstraintLayout { anchor.setOnClickListener((v) -> { if (mFalsingManager.isFalseTap(LOW_PENALTY)) return; - mPopup = new KeyguardUserSwitcherPopupMenu(v.getContext(), mFalsingManager); + mPopup = new KeyguardUserSwitcherPopupMenu(mView.getContext(), mFalsingManager); mPopup.setAnchorView(anchor); mPopup.setAdapter(adapter); mPopup.setOnItemClickListener((parent, view, pos, id) -> { @@ -1137,7 +1147,8 @@ public class KeyguardSecurityContainer extends ConstraintLayout { public void init(@NonNull ConstraintLayout v, @NonNull GlobalSettings globalSettings, @NonNull KeyguardSecurityViewFlipper viewFlipper, @NonNull FalsingManager falsingManager, - @NonNull UserSwitcherController userSwitcherController) { + @NonNull UserSwitcherController userSwitcherController, + @NonNull FalsingA11yDelegate falsingA11yDelegate) { init(v, viewFlipper, globalSettings, /* leftAlignedByDefault= */true); mView = v; mViewFlipper = viewFlipper; diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java index 81305f90e2b8..152de268886f 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java @@ -59,6 +59,7 @@ import com.android.settingslib.utils.ThreadUtils; import com.android.systemui.Gefingerpoken; import com.android.systemui.R; import com.android.systemui.biometrics.SidefpsController; +import com.android.systemui.classifier.FalsingA11yDelegate; import com.android.systemui.classifier.FalsingCollector; import com.android.systemui.flags.FeatureFlags; import com.android.systemui.flags.Flags; @@ -100,6 +101,7 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard private final FeatureFlags mFeatureFlags; private final SessionTracker mSessionTracker; private final Optional<SidefpsController> mSidefpsController; + private final FalsingA11yDelegate mFalsingA11yDelegate; private int mLastOrientation = Configuration.ORIENTATION_UNDEFINED; @@ -288,7 +290,8 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard FeatureFlags featureFlags, GlobalSettings globalSettings, SessionTracker sessionTracker, - Optional<SidefpsController> sidefpsController) { + Optional<SidefpsController> sidefpsController, + FalsingA11yDelegate falsingA11yDelegate) { super(view); mLockPatternUtils = lockPatternUtils; mUpdateMonitor = keyguardUpdateMonitor; @@ -309,6 +312,7 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard mGlobalSettings = globalSettings; mSessionTracker = sessionTracker; mSidefpsController = sidefpsController; + mFalsingA11yDelegate = falsingA11yDelegate; } @Override @@ -625,7 +629,7 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard mView.initMode(mode, mGlobalSettings, mFalsingManager, mUserSwitcherController, () -> showMessage(getContext().getString(R.string.keyguard_unlock_to_continue), - null)); + null), mFalsingA11yDelegate); } public void reportFailedUnlockAttempt(int userId, int timeoutMs) { @@ -730,6 +734,7 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard private final UserSwitcherController mUserSwitcherController; private final SessionTracker mSessionTracker; private final Optional<SidefpsController> mSidefpsController; + private final FalsingA11yDelegate mFalsingA11yDelegate; @Inject Factory(KeyguardSecurityContainer view, @@ -749,7 +754,8 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard FeatureFlags featureFlags, GlobalSettings globalSettings, SessionTracker sessionTracker, - Optional<SidefpsController> sidefpsController) { + Optional<SidefpsController> sidefpsController, + FalsingA11yDelegate falsingA11yDelegate) { mView = view; mAdminSecondaryLockScreenControllerFactory = adminSecondaryLockScreenControllerFactory; mLockPatternUtils = lockPatternUtils; @@ -767,6 +773,7 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard mUserSwitcherController = userSwitcherController; mSessionTracker = sessionTracker; mSidefpsController = sidefpsController; + mFalsingA11yDelegate = falsingA11yDelegate; } public KeyguardSecurityContainerController create( @@ -777,7 +784,7 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard mKeyguardStateController, securityCallback, mSecurityViewFlipperController, mConfigurationController, mFalsingCollector, mFalsingManager, mUserSwitcherController, mFeatureFlags, mGlobalSettings, mSessionTracker, - mSidefpsController); + mSidefpsController, mFalsingA11yDelegate); } } } diff --git a/packages/SystemUI/src/com/android/systemui/classifier/BrightLineFalsingManager.java b/packages/SystemUI/src/com/android/systemui/classifier/BrightLineFalsingManager.java index 500f28004429..2245d8462c31 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/BrightLineFalsingManager.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/BrightLineFalsingManager.java @@ -337,7 +337,8 @@ public class BrightLineFalsingManager implements FalsingManager { || mTestHarness || mDataProvider.isJustUnlockedWithFace() || mDataProvider.isDocked() - || mAccessibilityManager.isTouchExplorationEnabled(); + || mAccessibilityManager.isTouchExplorationEnabled() + || mDataProvider.isA11yAction(); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingA11yDelegate.kt b/packages/SystemUI/src/com/android/systemui/classifier/FalsingA11yDelegate.kt new file mode 100644 index 000000000000..63d57cc3fc8d --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingA11yDelegate.kt @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.classifier + +import android.os.Bundle +import android.view.View +import android.view.accessibility.AccessibilityNodeInfo.ACTION_CLICK +import javax.inject.Inject + +/** + * Class that injects an artificial tap into the falsing collector. + * + * This is used for views that can be interacted with by A11y services and have falsing checks, as + * the gestures made by the A11y framework do not propagate motion events down the view hierarchy. + */ +class FalsingA11yDelegate @Inject constructor(private val falsingCollector: FalsingCollector) : + View.AccessibilityDelegate() { + override fun performAccessibilityAction(host: View?, action: Int, args: Bundle?): Boolean { + if (action == ACTION_CLICK) { + falsingCollector.onA11yAction() + } + return super.performAccessibilityAction(host, action, args) + } +} diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollector.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollector.java index 858bac30880b..66701080ddfb 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollector.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollector.java @@ -132,5 +132,8 @@ public interface FalsingCollector { /** */ void updateFalseConfidence(FalsingClassifier.Result result); + + /** Indicates an a11y action was made. */ + void onA11yAction(); } diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorFake.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorFake.java index 0b7d6ab5acf7..cc25368161eb 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorFake.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorFake.java @@ -157,4 +157,8 @@ public class FalsingCollectorFake implements FalsingCollector { @Override public void updateFalseConfidence(FalsingClassifier.Result result) { } + + @Override + public void onA11yAction() { + } } diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorImpl.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorImpl.java index da3d293d543b..8bdef1304fa4 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorImpl.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorImpl.java @@ -375,6 +375,15 @@ class FalsingCollectorImpl implements FalsingCollector { mHistoryTracker.addResults(Collections.singleton(result), mSystemClock.uptimeMillis()); } + @Override + public void onA11yAction() { + if (mPendingDownEvent != null) { + mPendingDownEvent.recycle(); + mPendingDownEvent = null; + } + mFalsingDataProvider.onA11yAction(); + } + private boolean shouldSessionBeActive() { return mScreenOn && (mState == StatusBarState.KEYGUARD) && !mShowingAod; } diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingDataProvider.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingDataProvider.java index 3991a35e958a..09ebeeac163f 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingDataProvider.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingDataProvider.java @@ -59,6 +59,7 @@ public class FalsingDataProvider { private MotionEvent mFirstRecentMotionEvent; private MotionEvent mLastMotionEvent; private boolean mJustUnlockedWithFace; + private boolean mA11YAction; @Inject public FalsingDataProvider( @@ -124,6 +125,7 @@ public class FalsingDataProvider { mPriorMotionEvents = mRecentMotionEvents; mRecentMotionEvents = new TimeLimitedMotionEventBuffer(MOTION_EVENT_AGE_MS); } + mA11YAction = false; } /** Returns screen width in pixels. */ @@ -334,6 +336,17 @@ public class FalsingDataProvider { mGestureFinalizedListeners.remove(listener); } + /** Return whether last gesture was an A11y action. */ + public boolean isA11yAction() { + return mA11YAction; + } + + /** Set whether last gesture was an A11y action. */ + public void onA11yAction() { + completePriorGesture(); + this.mA11YAction = true; + } + void onSessionStarted() { mSessionListeners.forEach(SessionListener::onSessionStarted); } diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.java index b885d546c517..64d6b98a63a7 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.java @@ -55,6 +55,7 @@ import com.android.keyguard.KeyguardSecurityModel.SecurityMode; import com.android.systemui.R; import com.android.systemui.SysuiTestCase; import com.android.systemui.biometrics.SidefpsController; +import com.android.systemui.classifier.FalsingA11yDelegate; import com.android.systemui.classifier.FalsingCollector; import com.android.systemui.flags.FeatureFlags; import com.android.systemui.log.SessionTracker; @@ -143,6 +144,8 @@ public class KeyguardSecurityContainerControllerTest extends SysuiTestCase { private SidefpsController mSidefpsController; @Mock private KeyguardPasswordViewController mKeyguardPasswordViewControllerMock; + @Mock + private FalsingA11yDelegate mFalsingA11yDelegate; @Captor private ArgumentCaptor<KeyguardUpdateMonitorCallback> mKeyguardUpdateMonitorCallback; @@ -186,7 +189,8 @@ public class KeyguardSecurityContainerControllerTest extends SysuiTestCase { mKeyguardStateController, mKeyguardSecurityViewFlipperController, mConfigurationController, mFalsingCollector, mFalsingManager, mUserSwitcherController, mFeatureFlags, mGlobalSettings, - mSessionTracker, Optional.of(mSidefpsController)).create(mSecurityCallback); + mSessionTracker, Optional.of(mSidefpsController), mFalsingA11yDelegate).create( + mSecurityCallback); } @Test @@ -225,7 +229,8 @@ public class KeyguardSecurityContainerControllerTest extends SysuiTestCase { mKeyguardSecurityContainerController.updateResources(); verify(mView, never()).initMode(eq(MODE_DEFAULT), eq(mGlobalSettings), eq(mFalsingManager), eq(mUserSwitcherController), - any(KeyguardSecurityContainer.UserSwitcherViewMode.UserSwitcherCallback.class)); + any(KeyguardSecurityContainer.UserSwitcherViewMode.UserSwitcherCallback.class), + eq(mFalsingA11yDelegate)); // Update rotation. Should trigger update mConfiguration.orientation = Configuration.ORIENTATION_LANDSCAPE; @@ -233,7 +238,8 @@ public class KeyguardSecurityContainerControllerTest extends SysuiTestCase { mKeyguardSecurityContainerController.updateResources(); verify(mView).initMode(eq(MODE_DEFAULT), eq(mGlobalSettings), eq(mFalsingManager), eq(mUserSwitcherController), - any(KeyguardSecurityContainer.UserSwitcherViewMode.UserSwitcherCallback.class)); + any(KeyguardSecurityContainer.UserSwitcherViewMode.UserSwitcherCallback.class), + eq(mFalsingA11yDelegate)); } private void touchDown() { @@ -269,7 +275,8 @@ public class KeyguardSecurityContainerControllerTest extends SysuiTestCase { mKeyguardSecurityContainerController.showSecurityScreen(SecurityMode.Pattern); verify(mView).initMode(eq(MODE_DEFAULT), eq(mGlobalSettings), eq(mFalsingManager), eq(mUserSwitcherController), - any(KeyguardSecurityContainer.UserSwitcherViewMode.UserSwitcherCallback.class)); + any(KeyguardSecurityContainer.UserSwitcherViewMode.UserSwitcherCallback.class), + eq(mFalsingA11yDelegate)); } @Test @@ -282,7 +289,8 @@ public class KeyguardSecurityContainerControllerTest extends SysuiTestCase { mKeyguardSecurityContainerController.showSecurityScreen(SecurityMode.Pattern); verify(mView).initMode(eq(MODE_ONE_HANDED), eq(mGlobalSettings), eq(mFalsingManager), eq(mUserSwitcherController), - any(KeyguardSecurityContainer.UserSwitcherViewMode.UserSwitcherCallback.class)); + any(KeyguardSecurityContainer.UserSwitcherViewMode.UserSwitcherCallback.class), + eq(mFalsingA11yDelegate)); } @Test @@ -293,7 +301,8 @@ public class KeyguardSecurityContainerControllerTest extends SysuiTestCase { mKeyguardSecurityContainerController.showSecurityScreen(SecurityMode.Password); verify(mView).initMode(eq(MODE_DEFAULT), eq(mGlobalSettings), eq(mFalsingManager), eq(mUserSwitcherController), - any(KeyguardSecurityContainer.UserSwitcherViewMode.UserSwitcherCallback.class)); + any(KeyguardSecurityContainer.UserSwitcherViewMode.UserSwitcherCallback.class), + eq(mFalsingA11yDelegate)); } @Test @@ -307,7 +316,8 @@ public class KeyguardSecurityContainerControllerTest extends SysuiTestCase { mKeyguardSecurityContainerController.showSecurityScreen(SecurityMode.Password); verify(mView).initMode(anyInt(), any(GlobalSettings.class), any(FalsingManager.class), any(UserSwitcherController.class), - captor.capture()); + captor.capture(), + eq(mFalsingA11yDelegate)); captor.getValue().showUnlockToContinueMessage(); verify(mKeyguardPasswordViewControllerMock).showMessage( getContext().getString(R.string.keyguard_unlock_to_continue), null); diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerTest.java index 82d3ca785161..1bd14e558fa0 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerTest.java +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerTest.java @@ -31,6 +31,7 @@ import static androidx.constraintlayout.widget.ConstraintSet.WRAP_CONTENT; import static com.android.keyguard.KeyguardSecurityContainer.MODE_DEFAULT; import static com.android.keyguard.KeyguardSecurityContainer.MODE_ONE_HANDED; +import static com.android.keyguard.KeyguardSecurityContainer.MODE_USER_SWITCHER; import static com.google.common.truth.Truth.assertThat; @@ -54,6 +55,7 @@ import androidx.test.filters.SmallTest; import com.android.systemui.R; import com.android.systemui.SysuiTestCase; +import com.android.systemui.classifier.FalsingA11yDelegate; import com.android.systemui.plugins.FalsingManager; import com.android.systemui.statusbar.policy.UserSwitcherController; import com.android.systemui.user.data.source.UserRecord; @@ -87,6 +89,8 @@ public class KeyguardSecurityContainerTest extends SysuiTestCase { private FalsingManager mFalsingManager; @Mock private UserSwitcherController mUserSwitcherController; + @Mock + private FalsingA11yDelegate mFalsingA11yDelegate; private KeyguardSecurityContainer mKeyguardSecurityContainer; @@ -111,15 +115,14 @@ public class KeyguardSecurityContainerTest extends SysuiTestCase { when(mUserSwitcherController.getCurrentUserName()).thenReturn("Test User"); when(mUserSwitcherController.isKeyguardShowing()).thenReturn(true); } + @Test public void testOnApplyWindowInsets() { int paddingBottom = getContext().getResources() .getDimensionPixelSize(R.dimen.keyguard_security_view_bottom_margin); int imeInsetAmount = paddingBottom + 1; int systemBarInsetAmount = 0; - - mKeyguardSecurityContainer.initMode(MODE_DEFAULT, mGlobalSettings, mFalsingManager, - mUserSwitcherController, () -> {}); + initMode(MODE_DEFAULT); Insets imeInset = Insets.of(0, 0, 0, imeInsetAmount); Insets systemBarInset = Insets.of(0, 0, 0, systemBarInsetAmount); @@ -140,8 +143,7 @@ public class KeyguardSecurityContainerTest extends SysuiTestCase { .getDimensionPixelSize(R.dimen.keyguard_security_view_bottom_margin); int systemBarInsetAmount = paddingBottom + 1; - mKeyguardSecurityContainer.initMode(MODE_DEFAULT, mGlobalSettings, mFalsingManager, - mUserSwitcherController, () -> {}); + initMode(MODE_DEFAULT); Insets imeInset = Insets.of(0, 0, 0, imeInsetAmount); Insets systemBarInset = Insets.of(0, 0, 0, systemBarInsetAmount); @@ -157,11 +159,8 @@ public class KeyguardSecurityContainerTest extends SysuiTestCase { @Test public void testDefaultViewMode() { - mKeyguardSecurityContainer.initMode(MODE_ONE_HANDED, mGlobalSettings, mFalsingManager, - mUserSwitcherController, () -> { - }); - mKeyguardSecurityContainer.initMode(MODE_DEFAULT, mGlobalSettings, mFalsingManager, - mUserSwitcherController, () -> {}); + initMode(MODE_ONE_HANDED); + initMode(MODE_DEFAULT); ConstraintSet.Constraint viewFlipperConstraint = getViewConstraint(mSecurityViewFlipper.getId()); assertThat(viewFlipperConstraint.layout.topToTop).isEqualTo(PARENT_ID); @@ -377,8 +376,7 @@ public class KeyguardSecurityContainerTest extends SysuiTestCase { private void setupUserSwitcher() { when(mGlobalSettings.getInt(any(), anyInt())).thenReturn(ONE_HANDED_KEYGUARD_SIDE_RIGHT); - mKeyguardSecurityContainer.initMode(KeyguardSecurityContainer.MODE_USER_SWITCHER, - mGlobalSettings, mFalsingManager, mUserSwitcherController, () -> {}); + initMode(MODE_USER_SWITCHER); } private ArrayList<UserRecord> buildUserRecords(int count) { @@ -396,8 +394,7 @@ public class KeyguardSecurityContainerTest extends SysuiTestCase { private void setupForUpdateKeyguardPosition(boolean oneHandedMode) { int mode = oneHandedMode ? MODE_ONE_HANDED : MODE_DEFAULT; - mKeyguardSecurityContainer.initMode(mode, mGlobalSettings, mFalsingManager, - mUserSwitcherController, () -> {}); + initMode(mode); } /** Get the ConstraintLayout constraint of the view. */ @@ -406,4 +403,10 @@ public class KeyguardSecurityContainerTest extends SysuiTestCase { constraintSet.clone(mKeyguardSecurityContainer); return constraintSet.getConstraint(viewId); } + + private void initMode(int mode) { + mKeyguardSecurityContainer.initMode(mode, mGlobalSettings, mFalsingManager, + mUserSwitcherController, () -> { + }, mFalsingA11yDelegate); + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/classifier/BrightLineFalsingManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/classifier/BrightLineFalsingManagerTest.java index 94813497cb4c..b811aab6d35f 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/classifier/BrightLineFalsingManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/classifier/BrightLineFalsingManagerTest.java @@ -96,7 +96,6 @@ public class BrightLineFalsingManagerTest extends SysuiTestCase { assertThat(mBrightLineFalsingManager.isFalseTap(1)).isFalse(); } - @Test public void testA11yDisablesTap() { assertThat(mBrightLineFalsingManager.isFalseTouch(Classifier.GENERIC)).isTrue(); @@ -159,4 +158,11 @@ public class BrightLineFalsingManagerTest extends SysuiTestCase { }); assertThat(mBrightLineFalsingManager.isProximityNear()).isFalse(); } + + @Test + public void testA11yAction() { + assertThat(mBrightLineFalsingManager.isFalseTap(1)).isTrue(); + when(mFalsingDataProvider.isA11yAction()).thenReturn(true); + assertThat(mBrightLineFalsingManager.isFalseTap(1)).isFalse(); + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingA11yDelegateTest.kt b/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingA11yDelegateTest.kt new file mode 100644 index 000000000000..2c904e7e3735 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingA11yDelegateTest.kt @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.classifier + +import android.testing.AndroidTestingRunner +import android.view.View +import android.view.accessibility.AccessibilityNodeInfo.ACTION_CLICK +import android.view.accessibility.AccessibilityNodeInfo.ACTION_LONG_CLICK +import androidx.test.filters.SmallTest +import com.android.systemui.SysuiTestCase +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Mock +import org.mockito.Mockito.never +import org.mockito.Mockito.verify +import org.mockito.MockitoAnnotations + +@SmallTest +@RunWith(AndroidTestingRunner::class) +class FalsingA11yDelegateTest : SysuiTestCase() { + @Mock lateinit var falsingCollector: FalsingCollector + @Mock lateinit var view: View + lateinit var underTest: FalsingA11yDelegate + + @Before + fun setup() { + MockitoAnnotations.initMocks(this) + underTest = FalsingA11yDelegate(falsingCollector) + } + + @Test + fun testPerformAccessibilityAction_ACTION_CLICK() { + underTest.performAccessibilityAction(view, ACTION_CLICK, null) + verify(falsingCollector).onA11yAction() + } + + @Test + fun testPerformAccessibilityAction_not_ACTION_CLICK() { + underTest.performAccessibilityAction(view, ACTION_LONG_CLICK, null) + verify(falsingCollector, never()).onA11yAction() + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingCollectorImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingCollectorImplTest.java index fa9c41a3cbb6..442bf918ad8c 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingCollectorImplTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingCollectorImplTest.java @@ -267,4 +267,10 @@ public class FalsingCollectorImplTest extends SysuiTestCase { mFalsingCollector.onTouchEvent(up); verify(mFalsingDataProvider, times(2)).onMotionEvent(any(MotionEvent.class)); } + + @Test + public void testOnA11yAction() { + mFalsingCollector.onA11yAction(); + verify(mFalsingDataProvider).onA11yAction(); + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingDataProviderTest.java b/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingDataProviderTest.java index 5dc607fd342b..d315c2da0703 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingDataProviderTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingDataProviderTest.java @@ -310,4 +310,10 @@ public class FalsingDataProviderTest extends ClassifierTest { // an empty array. assertThat(mDataProvider.getPriorMotionEvents()).isNotNull(); } + + @Test + public void test_MotionEventComplete_A11yAction() { + mDataProvider.onA11yAction(); + assertThat(mDataProvider.isA11yAction()).isTrue(); + } } |