Merge "[User Switcher] Remove falsing check for a11y." into tm-qpr-dev
This commit is contained in:
@@ -89,6 +89,7 @@ import com.android.settingslib.Utils;
|
|||||||
import com.android.systemui.Gefingerpoken;
|
import com.android.systemui.Gefingerpoken;
|
||||||
import com.android.systemui.R;
|
import com.android.systemui.R;
|
||||||
import com.android.systemui.animation.Interpolators;
|
import com.android.systemui.animation.Interpolators;
|
||||||
|
import com.android.systemui.classifier.FalsingA11yDelegate;
|
||||||
import com.android.systemui.plugins.FalsingManager;
|
import com.android.systemui.plugins.FalsingManager;
|
||||||
import com.android.systemui.shared.system.SysUiStatsLog;
|
import com.android.systemui.shared.system.SysUiStatsLog;
|
||||||
import com.android.systemui.statusbar.policy.BaseUserSwitcherAdapter;
|
import com.android.systemui.statusbar.policy.BaseUserSwitcherAdapter;
|
||||||
@@ -136,6 +137,7 @@ public class KeyguardSecurityContainer extends ConstraintLayout {
|
|||||||
private GlobalSettings mGlobalSettings;
|
private GlobalSettings mGlobalSettings;
|
||||||
private FalsingManager mFalsingManager;
|
private FalsingManager mFalsingManager;
|
||||||
private UserSwitcherController mUserSwitcherController;
|
private UserSwitcherController mUserSwitcherController;
|
||||||
|
private FalsingA11yDelegate mFalsingA11yDelegate;
|
||||||
private AlertDialog mAlertDialog;
|
private AlertDialog mAlertDialog;
|
||||||
private boolean mSwipeUpToRetry;
|
private boolean mSwipeUpToRetry;
|
||||||
|
|
||||||
@@ -318,7 +320,8 @@ public class KeyguardSecurityContainer extends ConstraintLayout {
|
|||||||
|
|
||||||
void initMode(@Mode int mode, GlobalSettings globalSettings, FalsingManager falsingManager,
|
void initMode(@Mode int mode, GlobalSettings globalSettings, FalsingManager falsingManager,
|
||||||
UserSwitcherController userSwitcherController,
|
UserSwitcherController userSwitcherController,
|
||||||
UserSwitcherViewMode.UserSwitcherCallback userSwitcherCallback) {
|
UserSwitcherViewMode.UserSwitcherCallback userSwitcherCallback,
|
||||||
|
FalsingA11yDelegate falsingA11yDelegate) {
|
||||||
if (mCurrentMode == mode) return;
|
if (mCurrentMode == mode) return;
|
||||||
Log.i(TAG, "Switching mode from " + modeToString(mCurrentMode) + " to "
|
Log.i(TAG, "Switching mode from " + modeToString(mCurrentMode) + " to "
|
||||||
+ modeToString(mode));
|
+ modeToString(mode));
|
||||||
@@ -337,6 +340,7 @@ public class KeyguardSecurityContainer extends ConstraintLayout {
|
|||||||
}
|
}
|
||||||
mGlobalSettings = globalSettings;
|
mGlobalSettings = globalSettings;
|
||||||
mFalsingManager = falsingManager;
|
mFalsingManager = falsingManager;
|
||||||
|
mFalsingA11yDelegate = falsingA11yDelegate;
|
||||||
mUserSwitcherController = userSwitcherController;
|
mUserSwitcherController = userSwitcherController;
|
||||||
setupViewMode();
|
setupViewMode();
|
||||||
}
|
}
|
||||||
@@ -361,7 +365,7 @@ public class KeyguardSecurityContainer extends ConstraintLayout {
|
|||||||
}
|
}
|
||||||
|
|
||||||
mViewMode.init(this, mGlobalSettings, mSecurityViewFlipper, mFalsingManager,
|
mViewMode.init(this, mGlobalSettings, mSecurityViewFlipper, mFalsingManager,
|
||||||
mUserSwitcherController);
|
mUserSwitcherController, mFalsingA11yDelegate);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Mode int getMode() {
|
@Mode int getMode() {
|
||||||
@@ -723,7 +727,8 @@ public class KeyguardSecurityContainer extends ConstraintLayout {
|
|||||||
default void init(@NonNull ConstraintLayout v, @NonNull GlobalSettings globalSettings,
|
default void init(@NonNull ConstraintLayout v, @NonNull GlobalSettings globalSettings,
|
||||||
@NonNull KeyguardSecurityViewFlipper viewFlipper,
|
@NonNull KeyguardSecurityViewFlipper viewFlipper,
|
||||||
@NonNull FalsingManager falsingManager,
|
@NonNull FalsingManager falsingManager,
|
||||||
@NonNull UserSwitcherController userSwitcherController) {};
|
@NonNull UserSwitcherController userSwitcherController,
|
||||||
|
@NonNull FalsingA11yDelegate falsingA11yDelegate) {};
|
||||||
|
|
||||||
/** Reinitialize the location */
|
/** Reinitialize the location */
|
||||||
default void updateSecurityViewLocation() {};
|
default void updateSecurityViewLocation() {};
|
||||||
@@ -828,7 +833,8 @@ public class KeyguardSecurityContainer extends ConstraintLayout {
|
|||||||
public void init(@NonNull ConstraintLayout v, @NonNull GlobalSettings globalSettings,
|
public void init(@NonNull ConstraintLayout v, @NonNull GlobalSettings globalSettings,
|
||||||
@NonNull KeyguardSecurityViewFlipper viewFlipper,
|
@NonNull KeyguardSecurityViewFlipper viewFlipper,
|
||||||
@NonNull FalsingManager falsingManager,
|
@NonNull FalsingManager falsingManager,
|
||||||
@NonNull UserSwitcherController userSwitcherController) {
|
@NonNull UserSwitcherController userSwitcherController,
|
||||||
|
@NonNull FalsingA11yDelegate falsingA11yDelegate) {
|
||||||
mView = v;
|
mView = v;
|
||||||
mViewFlipper = viewFlipper;
|
mViewFlipper = viewFlipper;
|
||||||
|
|
||||||
@@ -865,6 +871,7 @@ public class KeyguardSecurityContainer extends ConstraintLayout {
|
|||||||
this::setupUserSwitcher;
|
this::setupUserSwitcher;
|
||||||
|
|
||||||
private UserSwitcherCallback mUserSwitcherCallback;
|
private UserSwitcherCallback mUserSwitcherCallback;
|
||||||
|
private FalsingA11yDelegate mFalsingA11yDelegate;
|
||||||
|
|
||||||
UserSwitcherViewMode(UserSwitcherCallback userSwitcherCallback) {
|
UserSwitcherViewMode(UserSwitcherCallback userSwitcherCallback) {
|
||||||
mUserSwitcherCallback = userSwitcherCallback;
|
mUserSwitcherCallback = userSwitcherCallback;
|
||||||
@@ -874,13 +881,15 @@ public class KeyguardSecurityContainer extends ConstraintLayout {
|
|||||||
public void init(@NonNull ConstraintLayout v, @NonNull GlobalSettings globalSettings,
|
public void init(@NonNull ConstraintLayout v, @NonNull GlobalSettings globalSettings,
|
||||||
@NonNull KeyguardSecurityViewFlipper viewFlipper,
|
@NonNull KeyguardSecurityViewFlipper viewFlipper,
|
||||||
@NonNull FalsingManager falsingManager,
|
@NonNull FalsingManager falsingManager,
|
||||||
@NonNull UserSwitcherController userSwitcherController) {
|
@NonNull UserSwitcherController userSwitcherController,
|
||||||
|
@NonNull FalsingA11yDelegate falsingA11yDelegate) {
|
||||||
init(v, viewFlipper, globalSettings, /* leftAlignedByDefault= */false);
|
init(v, viewFlipper, globalSettings, /* leftAlignedByDefault= */false);
|
||||||
mView = v;
|
mView = v;
|
||||||
mViewFlipper = viewFlipper;
|
mViewFlipper = viewFlipper;
|
||||||
mFalsingManager = falsingManager;
|
mFalsingManager = falsingManager;
|
||||||
mUserSwitcherController = userSwitcherController;
|
mUserSwitcherController = userSwitcherController;
|
||||||
mResources = v.getContext().getResources();
|
mResources = v.getContext().getResources();
|
||||||
|
mFalsingA11yDelegate = falsingA11yDelegate;
|
||||||
|
|
||||||
if (mUserSwitcherViewGroup == null) {
|
if (mUserSwitcherViewGroup == null) {
|
||||||
LayoutInflater.from(v.getContext()).inflate(
|
LayoutInflater.from(v.getContext()).inflate(
|
||||||
@@ -978,6 +987,7 @@ public class KeyguardSecurityContainer extends ConstraintLayout {
|
|||||||
mUserSwitcher.setText(currentUserName);
|
mUserSwitcher.setText(currentUserName);
|
||||||
|
|
||||||
KeyguardUserSwitcherAnchor anchor = mView.findViewById(R.id.user_switcher_anchor);
|
KeyguardUserSwitcherAnchor anchor = mView.findViewById(R.id.user_switcher_anchor);
|
||||||
|
anchor.setAccessibilityDelegate(mFalsingA11yDelegate);
|
||||||
|
|
||||||
BaseUserSwitcherAdapter adapter = new BaseUserSwitcherAdapter(mUserSwitcherController) {
|
BaseUserSwitcherAdapter adapter = new BaseUserSwitcherAdapter(mUserSwitcherController) {
|
||||||
@Override
|
@Override
|
||||||
@@ -1048,7 +1058,7 @@ public class KeyguardSecurityContainer extends ConstraintLayout {
|
|||||||
|
|
||||||
anchor.setOnClickListener((v) -> {
|
anchor.setOnClickListener((v) -> {
|
||||||
if (mFalsingManager.isFalseTap(LOW_PENALTY)) return;
|
if (mFalsingManager.isFalseTap(LOW_PENALTY)) return;
|
||||||
mPopup = new KeyguardUserSwitcherPopupMenu(v.getContext(), mFalsingManager);
|
mPopup = new KeyguardUserSwitcherPopupMenu(mView.getContext(), mFalsingManager);
|
||||||
mPopup.setAnchorView(anchor);
|
mPopup.setAnchorView(anchor);
|
||||||
mPopup.setAdapter(adapter);
|
mPopup.setAdapter(adapter);
|
||||||
mPopup.setOnItemClickListener((parent, view, pos, id) -> {
|
mPopup.setOnItemClickListener((parent, view, pos, id) -> {
|
||||||
@@ -1137,7 +1147,8 @@ public class KeyguardSecurityContainer extends ConstraintLayout {
|
|||||||
public void init(@NonNull ConstraintLayout v, @NonNull GlobalSettings globalSettings,
|
public void init(@NonNull ConstraintLayout v, @NonNull GlobalSettings globalSettings,
|
||||||
@NonNull KeyguardSecurityViewFlipper viewFlipper,
|
@NonNull KeyguardSecurityViewFlipper viewFlipper,
|
||||||
@NonNull FalsingManager falsingManager,
|
@NonNull FalsingManager falsingManager,
|
||||||
@NonNull UserSwitcherController userSwitcherController) {
|
@NonNull UserSwitcherController userSwitcherController,
|
||||||
|
@NonNull FalsingA11yDelegate falsingA11yDelegate) {
|
||||||
init(v, viewFlipper, globalSettings, /* leftAlignedByDefault= */true);
|
init(v, viewFlipper, globalSettings, /* leftAlignedByDefault= */true);
|
||||||
mView = v;
|
mView = v;
|
||||||
mViewFlipper = viewFlipper;
|
mViewFlipper = viewFlipper;
|
||||||
|
|||||||
@@ -59,6 +59,7 @@ import com.android.settingslib.utils.ThreadUtils;
|
|||||||
import com.android.systemui.Gefingerpoken;
|
import com.android.systemui.Gefingerpoken;
|
||||||
import com.android.systemui.R;
|
import com.android.systemui.R;
|
||||||
import com.android.systemui.biometrics.SidefpsController;
|
import com.android.systemui.biometrics.SidefpsController;
|
||||||
|
import com.android.systemui.classifier.FalsingA11yDelegate;
|
||||||
import com.android.systemui.classifier.FalsingCollector;
|
import com.android.systemui.classifier.FalsingCollector;
|
||||||
import com.android.systemui.flags.FeatureFlags;
|
import com.android.systemui.flags.FeatureFlags;
|
||||||
import com.android.systemui.flags.Flags;
|
import com.android.systemui.flags.Flags;
|
||||||
@@ -100,6 +101,7 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard
|
|||||||
private final FeatureFlags mFeatureFlags;
|
private final FeatureFlags mFeatureFlags;
|
||||||
private final SessionTracker mSessionTracker;
|
private final SessionTracker mSessionTracker;
|
||||||
private final Optional<SidefpsController> mSidefpsController;
|
private final Optional<SidefpsController> mSidefpsController;
|
||||||
|
private final FalsingA11yDelegate mFalsingA11yDelegate;
|
||||||
|
|
||||||
private int mLastOrientation = Configuration.ORIENTATION_UNDEFINED;
|
private int mLastOrientation = Configuration.ORIENTATION_UNDEFINED;
|
||||||
|
|
||||||
@@ -288,7 +290,8 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard
|
|||||||
FeatureFlags featureFlags,
|
FeatureFlags featureFlags,
|
||||||
GlobalSettings globalSettings,
|
GlobalSettings globalSettings,
|
||||||
SessionTracker sessionTracker,
|
SessionTracker sessionTracker,
|
||||||
Optional<SidefpsController> sidefpsController) {
|
Optional<SidefpsController> sidefpsController,
|
||||||
|
FalsingA11yDelegate falsingA11yDelegate) {
|
||||||
super(view);
|
super(view);
|
||||||
mLockPatternUtils = lockPatternUtils;
|
mLockPatternUtils = lockPatternUtils;
|
||||||
mUpdateMonitor = keyguardUpdateMonitor;
|
mUpdateMonitor = keyguardUpdateMonitor;
|
||||||
@@ -309,6 +312,7 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard
|
|||||||
mGlobalSettings = globalSettings;
|
mGlobalSettings = globalSettings;
|
||||||
mSessionTracker = sessionTracker;
|
mSessionTracker = sessionTracker;
|
||||||
mSidefpsController = sidefpsController;
|
mSidefpsController = sidefpsController;
|
||||||
|
mFalsingA11yDelegate = falsingA11yDelegate;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -625,7 +629,7 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard
|
|||||||
|
|
||||||
mView.initMode(mode, mGlobalSettings, mFalsingManager, mUserSwitcherController,
|
mView.initMode(mode, mGlobalSettings, mFalsingManager, mUserSwitcherController,
|
||||||
() -> showMessage(getContext().getString(R.string.keyguard_unlock_to_continue),
|
() -> showMessage(getContext().getString(R.string.keyguard_unlock_to_continue),
|
||||||
null));
|
null), mFalsingA11yDelegate);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void reportFailedUnlockAttempt(int userId, int timeoutMs) {
|
public void reportFailedUnlockAttempt(int userId, int timeoutMs) {
|
||||||
@@ -730,6 +734,7 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard
|
|||||||
private final UserSwitcherController mUserSwitcherController;
|
private final UserSwitcherController mUserSwitcherController;
|
||||||
private final SessionTracker mSessionTracker;
|
private final SessionTracker mSessionTracker;
|
||||||
private final Optional<SidefpsController> mSidefpsController;
|
private final Optional<SidefpsController> mSidefpsController;
|
||||||
|
private final FalsingA11yDelegate mFalsingA11yDelegate;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
Factory(KeyguardSecurityContainer view,
|
Factory(KeyguardSecurityContainer view,
|
||||||
@@ -749,7 +754,8 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard
|
|||||||
FeatureFlags featureFlags,
|
FeatureFlags featureFlags,
|
||||||
GlobalSettings globalSettings,
|
GlobalSettings globalSettings,
|
||||||
SessionTracker sessionTracker,
|
SessionTracker sessionTracker,
|
||||||
Optional<SidefpsController> sidefpsController) {
|
Optional<SidefpsController> sidefpsController,
|
||||||
|
FalsingA11yDelegate falsingA11yDelegate) {
|
||||||
mView = view;
|
mView = view;
|
||||||
mAdminSecondaryLockScreenControllerFactory = adminSecondaryLockScreenControllerFactory;
|
mAdminSecondaryLockScreenControllerFactory = adminSecondaryLockScreenControllerFactory;
|
||||||
mLockPatternUtils = lockPatternUtils;
|
mLockPatternUtils = lockPatternUtils;
|
||||||
@@ -767,6 +773,7 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard
|
|||||||
mUserSwitcherController = userSwitcherController;
|
mUserSwitcherController = userSwitcherController;
|
||||||
mSessionTracker = sessionTracker;
|
mSessionTracker = sessionTracker;
|
||||||
mSidefpsController = sidefpsController;
|
mSidefpsController = sidefpsController;
|
||||||
|
mFalsingA11yDelegate = falsingA11yDelegate;
|
||||||
}
|
}
|
||||||
|
|
||||||
public KeyguardSecurityContainerController create(
|
public KeyguardSecurityContainerController create(
|
||||||
@@ -777,7 +784,7 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard
|
|||||||
mKeyguardStateController, securityCallback, mSecurityViewFlipperController,
|
mKeyguardStateController, securityCallback, mSecurityViewFlipperController,
|
||||||
mConfigurationController, mFalsingCollector, mFalsingManager,
|
mConfigurationController, mFalsingCollector, mFalsingManager,
|
||||||
mUserSwitcherController, mFeatureFlags, mGlobalSettings, mSessionTracker,
|
mUserSwitcherController, mFeatureFlags, mGlobalSettings, mSessionTracker,
|
||||||
mSidefpsController);
|
mSidefpsController, mFalsingA11yDelegate);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -337,7 +337,8 @@ public class BrightLineFalsingManager implements FalsingManager {
|
|||||||
|| mTestHarness
|
|| mTestHarness
|
||||||
|| mDataProvider.isJustUnlockedWithFace()
|
|| mDataProvider.isJustUnlockedWithFace()
|
||||||
|| mDataProvider.isDocked()
|
|| mDataProvider.isDocked()
|
||||||
|| mAccessibilityManager.isTouchExplorationEnabled();
|
|| mAccessibilityManager.isTouchExplorationEnabled()
|
||||||
|
|| mDataProvider.isA11yAction();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -132,5 +132,8 @@ public interface FalsingCollector {
|
|||||||
|
|
||||||
/** */
|
/** */
|
||||||
void updateFalseConfidence(FalsingClassifier.Result result);
|
void updateFalseConfidence(FalsingClassifier.Result result);
|
||||||
|
|
||||||
|
/** Indicates an a11y action was made. */
|
||||||
|
void onA11yAction();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -157,4 +157,8 @@ public class FalsingCollectorFake implements FalsingCollector {
|
|||||||
@Override
|
@Override
|
||||||
public void updateFalseConfidence(FalsingClassifier.Result result) {
|
public void updateFalseConfidence(FalsingClassifier.Result result) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onA11yAction() {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -375,6 +375,15 @@ class FalsingCollectorImpl implements FalsingCollector {
|
|||||||
mHistoryTracker.addResults(Collections.singleton(result), mSystemClock.uptimeMillis());
|
mHistoryTracker.addResults(Collections.singleton(result), mSystemClock.uptimeMillis());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onA11yAction() {
|
||||||
|
if (mPendingDownEvent != null) {
|
||||||
|
mPendingDownEvent.recycle();
|
||||||
|
mPendingDownEvent = null;
|
||||||
|
}
|
||||||
|
mFalsingDataProvider.onA11yAction();
|
||||||
|
}
|
||||||
|
|
||||||
private boolean shouldSessionBeActive() {
|
private boolean shouldSessionBeActive() {
|
||||||
return mScreenOn && (mState == StatusBarState.KEYGUARD) && !mShowingAod;
|
return mScreenOn && (mState == StatusBarState.KEYGUARD) && !mShowingAod;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -59,6 +59,7 @@ public class FalsingDataProvider {
|
|||||||
private MotionEvent mFirstRecentMotionEvent;
|
private MotionEvent mFirstRecentMotionEvent;
|
||||||
private MotionEvent mLastMotionEvent;
|
private MotionEvent mLastMotionEvent;
|
||||||
private boolean mJustUnlockedWithFace;
|
private boolean mJustUnlockedWithFace;
|
||||||
|
private boolean mA11YAction;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public FalsingDataProvider(
|
public FalsingDataProvider(
|
||||||
@@ -124,6 +125,7 @@ public class FalsingDataProvider {
|
|||||||
mPriorMotionEvents = mRecentMotionEvents;
|
mPriorMotionEvents = mRecentMotionEvents;
|
||||||
mRecentMotionEvents = new TimeLimitedMotionEventBuffer(MOTION_EVENT_AGE_MS);
|
mRecentMotionEvents = new TimeLimitedMotionEventBuffer(MOTION_EVENT_AGE_MS);
|
||||||
}
|
}
|
||||||
|
mA11YAction = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Returns screen width in pixels. */
|
/** Returns screen width in pixels. */
|
||||||
@@ -334,6 +336,17 @@ public class FalsingDataProvider {
|
|||||||
mGestureFinalizedListeners.remove(listener);
|
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() {
|
void onSessionStarted() {
|
||||||
mSessionListeners.forEach(SessionListener::onSessionStarted);
|
mSessionListeners.forEach(SessionListener::onSessionStarted);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -55,6 +55,7 @@ import com.android.keyguard.KeyguardSecurityModel.SecurityMode;
|
|||||||
import com.android.systemui.R;
|
import com.android.systemui.R;
|
||||||
import com.android.systemui.SysuiTestCase;
|
import com.android.systemui.SysuiTestCase;
|
||||||
import com.android.systemui.biometrics.SidefpsController;
|
import com.android.systemui.biometrics.SidefpsController;
|
||||||
|
import com.android.systemui.classifier.FalsingA11yDelegate;
|
||||||
import com.android.systemui.classifier.FalsingCollector;
|
import com.android.systemui.classifier.FalsingCollector;
|
||||||
import com.android.systemui.flags.FeatureFlags;
|
import com.android.systemui.flags.FeatureFlags;
|
||||||
import com.android.systemui.log.SessionTracker;
|
import com.android.systemui.log.SessionTracker;
|
||||||
@@ -143,6 +144,8 @@ public class KeyguardSecurityContainerControllerTest extends SysuiTestCase {
|
|||||||
private SidefpsController mSidefpsController;
|
private SidefpsController mSidefpsController;
|
||||||
@Mock
|
@Mock
|
||||||
private KeyguardPasswordViewController mKeyguardPasswordViewControllerMock;
|
private KeyguardPasswordViewController mKeyguardPasswordViewControllerMock;
|
||||||
|
@Mock
|
||||||
|
private FalsingA11yDelegate mFalsingA11yDelegate;
|
||||||
|
|
||||||
@Captor
|
@Captor
|
||||||
private ArgumentCaptor<KeyguardUpdateMonitorCallback> mKeyguardUpdateMonitorCallback;
|
private ArgumentCaptor<KeyguardUpdateMonitorCallback> mKeyguardUpdateMonitorCallback;
|
||||||
@@ -186,7 +189,8 @@ public class KeyguardSecurityContainerControllerTest extends SysuiTestCase {
|
|||||||
mKeyguardStateController, mKeyguardSecurityViewFlipperController,
|
mKeyguardStateController, mKeyguardSecurityViewFlipperController,
|
||||||
mConfigurationController, mFalsingCollector, mFalsingManager,
|
mConfigurationController, mFalsingCollector, mFalsingManager,
|
||||||
mUserSwitcherController, mFeatureFlags, mGlobalSettings,
|
mUserSwitcherController, mFeatureFlags, mGlobalSettings,
|
||||||
mSessionTracker, Optional.of(mSidefpsController)).create(mSecurityCallback);
|
mSessionTracker, Optional.of(mSidefpsController), mFalsingA11yDelegate).create(
|
||||||
|
mSecurityCallback);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -225,7 +229,8 @@ public class KeyguardSecurityContainerControllerTest extends SysuiTestCase {
|
|||||||
mKeyguardSecurityContainerController.updateResources();
|
mKeyguardSecurityContainerController.updateResources();
|
||||||
verify(mView, never()).initMode(eq(MODE_DEFAULT), eq(mGlobalSettings), eq(mFalsingManager),
|
verify(mView, never()).initMode(eq(MODE_DEFAULT), eq(mGlobalSettings), eq(mFalsingManager),
|
||||||
eq(mUserSwitcherController),
|
eq(mUserSwitcherController),
|
||||||
any(KeyguardSecurityContainer.UserSwitcherViewMode.UserSwitcherCallback.class));
|
any(KeyguardSecurityContainer.UserSwitcherViewMode.UserSwitcherCallback.class),
|
||||||
|
eq(mFalsingA11yDelegate));
|
||||||
|
|
||||||
// Update rotation. Should trigger update
|
// Update rotation. Should trigger update
|
||||||
mConfiguration.orientation = Configuration.ORIENTATION_LANDSCAPE;
|
mConfiguration.orientation = Configuration.ORIENTATION_LANDSCAPE;
|
||||||
@@ -233,7 +238,8 @@ public class KeyguardSecurityContainerControllerTest extends SysuiTestCase {
|
|||||||
mKeyguardSecurityContainerController.updateResources();
|
mKeyguardSecurityContainerController.updateResources();
|
||||||
verify(mView).initMode(eq(MODE_DEFAULT), eq(mGlobalSettings), eq(mFalsingManager),
|
verify(mView).initMode(eq(MODE_DEFAULT), eq(mGlobalSettings), eq(mFalsingManager),
|
||||||
eq(mUserSwitcherController),
|
eq(mUserSwitcherController),
|
||||||
any(KeyguardSecurityContainer.UserSwitcherViewMode.UserSwitcherCallback.class));
|
any(KeyguardSecurityContainer.UserSwitcherViewMode.UserSwitcherCallback.class),
|
||||||
|
eq(mFalsingA11yDelegate));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void touchDown() {
|
private void touchDown() {
|
||||||
@@ -269,7 +275,8 @@ public class KeyguardSecurityContainerControllerTest extends SysuiTestCase {
|
|||||||
mKeyguardSecurityContainerController.showSecurityScreen(SecurityMode.Pattern);
|
mKeyguardSecurityContainerController.showSecurityScreen(SecurityMode.Pattern);
|
||||||
verify(mView).initMode(eq(MODE_DEFAULT), eq(mGlobalSettings), eq(mFalsingManager),
|
verify(mView).initMode(eq(MODE_DEFAULT), eq(mGlobalSettings), eq(mFalsingManager),
|
||||||
eq(mUserSwitcherController),
|
eq(mUserSwitcherController),
|
||||||
any(KeyguardSecurityContainer.UserSwitcherViewMode.UserSwitcherCallback.class));
|
any(KeyguardSecurityContainer.UserSwitcherViewMode.UserSwitcherCallback.class),
|
||||||
|
eq(mFalsingA11yDelegate));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -282,7 +289,8 @@ public class KeyguardSecurityContainerControllerTest extends SysuiTestCase {
|
|||||||
mKeyguardSecurityContainerController.showSecurityScreen(SecurityMode.Pattern);
|
mKeyguardSecurityContainerController.showSecurityScreen(SecurityMode.Pattern);
|
||||||
verify(mView).initMode(eq(MODE_ONE_HANDED), eq(mGlobalSettings), eq(mFalsingManager),
|
verify(mView).initMode(eq(MODE_ONE_HANDED), eq(mGlobalSettings), eq(mFalsingManager),
|
||||||
eq(mUserSwitcherController),
|
eq(mUserSwitcherController),
|
||||||
any(KeyguardSecurityContainer.UserSwitcherViewMode.UserSwitcherCallback.class));
|
any(KeyguardSecurityContainer.UserSwitcherViewMode.UserSwitcherCallback.class),
|
||||||
|
eq(mFalsingA11yDelegate));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -293,7 +301,8 @@ public class KeyguardSecurityContainerControllerTest extends SysuiTestCase {
|
|||||||
mKeyguardSecurityContainerController.showSecurityScreen(SecurityMode.Password);
|
mKeyguardSecurityContainerController.showSecurityScreen(SecurityMode.Password);
|
||||||
verify(mView).initMode(eq(MODE_DEFAULT), eq(mGlobalSettings), eq(mFalsingManager),
|
verify(mView).initMode(eq(MODE_DEFAULT), eq(mGlobalSettings), eq(mFalsingManager),
|
||||||
eq(mUserSwitcherController),
|
eq(mUserSwitcherController),
|
||||||
any(KeyguardSecurityContainer.UserSwitcherViewMode.UserSwitcherCallback.class));
|
any(KeyguardSecurityContainer.UserSwitcherViewMode.UserSwitcherCallback.class),
|
||||||
|
eq(mFalsingA11yDelegate));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -307,7 +316,8 @@ public class KeyguardSecurityContainerControllerTest extends SysuiTestCase {
|
|||||||
mKeyguardSecurityContainerController.showSecurityScreen(SecurityMode.Password);
|
mKeyguardSecurityContainerController.showSecurityScreen(SecurityMode.Password);
|
||||||
verify(mView).initMode(anyInt(), any(GlobalSettings.class), any(FalsingManager.class),
|
verify(mView).initMode(anyInt(), any(GlobalSettings.class), any(FalsingManager.class),
|
||||||
any(UserSwitcherController.class),
|
any(UserSwitcherController.class),
|
||||||
captor.capture());
|
captor.capture(),
|
||||||
|
eq(mFalsingA11yDelegate));
|
||||||
captor.getValue().showUnlockToContinueMessage();
|
captor.getValue().showUnlockToContinueMessage();
|
||||||
verify(mKeyguardPasswordViewControllerMock).showMessage(
|
verify(mKeyguardPasswordViewControllerMock).showMessage(
|
||||||
getContext().getString(R.string.keyguard_unlock_to_continue), null);
|
getContext().getString(R.string.keyguard_unlock_to_continue), null);
|
||||||
|
|||||||
@@ -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_DEFAULT;
|
||||||
import static com.android.keyguard.KeyguardSecurityContainer.MODE_ONE_HANDED;
|
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;
|
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.R;
|
||||||
import com.android.systemui.SysuiTestCase;
|
import com.android.systemui.SysuiTestCase;
|
||||||
|
import com.android.systemui.classifier.FalsingA11yDelegate;
|
||||||
import com.android.systemui.plugins.FalsingManager;
|
import com.android.systemui.plugins.FalsingManager;
|
||||||
import com.android.systemui.statusbar.policy.UserSwitcherController;
|
import com.android.systemui.statusbar.policy.UserSwitcherController;
|
||||||
import com.android.systemui.user.data.source.UserRecord;
|
import com.android.systemui.user.data.source.UserRecord;
|
||||||
@@ -87,6 +89,8 @@ public class KeyguardSecurityContainerTest extends SysuiTestCase {
|
|||||||
private FalsingManager mFalsingManager;
|
private FalsingManager mFalsingManager;
|
||||||
@Mock
|
@Mock
|
||||||
private UserSwitcherController mUserSwitcherController;
|
private UserSwitcherController mUserSwitcherController;
|
||||||
|
@Mock
|
||||||
|
private FalsingA11yDelegate mFalsingA11yDelegate;
|
||||||
|
|
||||||
private KeyguardSecurityContainer mKeyguardSecurityContainer;
|
private KeyguardSecurityContainer mKeyguardSecurityContainer;
|
||||||
|
|
||||||
@@ -111,15 +115,14 @@ public class KeyguardSecurityContainerTest extends SysuiTestCase {
|
|||||||
when(mUserSwitcherController.getCurrentUserName()).thenReturn("Test User");
|
when(mUserSwitcherController.getCurrentUserName()).thenReturn("Test User");
|
||||||
when(mUserSwitcherController.isKeyguardShowing()).thenReturn(true);
|
when(mUserSwitcherController.isKeyguardShowing()).thenReturn(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testOnApplyWindowInsets() {
|
public void testOnApplyWindowInsets() {
|
||||||
int paddingBottom = getContext().getResources()
|
int paddingBottom = getContext().getResources()
|
||||||
.getDimensionPixelSize(R.dimen.keyguard_security_view_bottom_margin);
|
.getDimensionPixelSize(R.dimen.keyguard_security_view_bottom_margin);
|
||||||
int imeInsetAmount = paddingBottom + 1;
|
int imeInsetAmount = paddingBottom + 1;
|
||||||
int systemBarInsetAmount = 0;
|
int systemBarInsetAmount = 0;
|
||||||
|
initMode(MODE_DEFAULT);
|
||||||
mKeyguardSecurityContainer.initMode(MODE_DEFAULT, mGlobalSettings, mFalsingManager,
|
|
||||||
mUserSwitcherController, () -> {});
|
|
||||||
|
|
||||||
Insets imeInset = Insets.of(0, 0, 0, imeInsetAmount);
|
Insets imeInset = Insets.of(0, 0, 0, imeInsetAmount);
|
||||||
Insets systemBarInset = Insets.of(0, 0, 0, systemBarInsetAmount);
|
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);
|
.getDimensionPixelSize(R.dimen.keyguard_security_view_bottom_margin);
|
||||||
int systemBarInsetAmount = paddingBottom + 1;
|
int systemBarInsetAmount = paddingBottom + 1;
|
||||||
|
|
||||||
mKeyguardSecurityContainer.initMode(MODE_DEFAULT, mGlobalSettings, mFalsingManager,
|
initMode(MODE_DEFAULT);
|
||||||
mUserSwitcherController, () -> {});
|
|
||||||
|
|
||||||
Insets imeInset = Insets.of(0, 0, 0, imeInsetAmount);
|
Insets imeInset = Insets.of(0, 0, 0, imeInsetAmount);
|
||||||
Insets systemBarInset = Insets.of(0, 0, 0, systemBarInsetAmount);
|
Insets systemBarInset = Insets.of(0, 0, 0, systemBarInsetAmount);
|
||||||
@@ -157,11 +159,8 @@ public class KeyguardSecurityContainerTest extends SysuiTestCase {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testDefaultViewMode() {
|
public void testDefaultViewMode() {
|
||||||
mKeyguardSecurityContainer.initMode(MODE_ONE_HANDED, mGlobalSettings, mFalsingManager,
|
initMode(MODE_ONE_HANDED);
|
||||||
mUserSwitcherController, () -> {
|
initMode(MODE_DEFAULT);
|
||||||
});
|
|
||||||
mKeyguardSecurityContainer.initMode(MODE_DEFAULT, mGlobalSettings, mFalsingManager,
|
|
||||||
mUserSwitcherController, () -> {});
|
|
||||||
ConstraintSet.Constraint viewFlipperConstraint =
|
ConstraintSet.Constraint viewFlipperConstraint =
|
||||||
getViewConstraint(mSecurityViewFlipper.getId());
|
getViewConstraint(mSecurityViewFlipper.getId());
|
||||||
assertThat(viewFlipperConstraint.layout.topToTop).isEqualTo(PARENT_ID);
|
assertThat(viewFlipperConstraint.layout.topToTop).isEqualTo(PARENT_ID);
|
||||||
@@ -377,8 +376,7 @@ public class KeyguardSecurityContainerTest extends SysuiTestCase {
|
|||||||
|
|
||||||
private void setupUserSwitcher() {
|
private void setupUserSwitcher() {
|
||||||
when(mGlobalSettings.getInt(any(), anyInt())).thenReturn(ONE_HANDED_KEYGUARD_SIDE_RIGHT);
|
when(mGlobalSettings.getInt(any(), anyInt())).thenReturn(ONE_HANDED_KEYGUARD_SIDE_RIGHT);
|
||||||
mKeyguardSecurityContainer.initMode(KeyguardSecurityContainer.MODE_USER_SWITCHER,
|
initMode(MODE_USER_SWITCHER);
|
||||||
mGlobalSettings, mFalsingManager, mUserSwitcherController, () -> {});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private ArrayList<UserRecord> buildUserRecords(int count) {
|
private ArrayList<UserRecord> buildUserRecords(int count) {
|
||||||
@@ -396,8 +394,7 @@ public class KeyguardSecurityContainerTest extends SysuiTestCase {
|
|||||||
|
|
||||||
private void setupForUpdateKeyguardPosition(boolean oneHandedMode) {
|
private void setupForUpdateKeyguardPosition(boolean oneHandedMode) {
|
||||||
int mode = oneHandedMode ? MODE_ONE_HANDED : MODE_DEFAULT;
|
int mode = oneHandedMode ? MODE_ONE_HANDED : MODE_DEFAULT;
|
||||||
mKeyguardSecurityContainer.initMode(mode, mGlobalSettings, mFalsingManager,
|
initMode(mode);
|
||||||
mUserSwitcherController, () -> {});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Get the ConstraintLayout constraint of the view. */
|
/** Get the ConstraintLayout constraint of the view. */
|
||||||
@@ -406,4 +403,10 @@ public class KeyguardSecurityContainerTest extends SysuiTestCase {
|
|||||||
constraintSet.clone(mKeyguardSecurityContainer);
|
constraintSet.clone(mKeyguardSecurityContainer);
|
||||||
return constraintSet.getConstraint(viewId);
|
return constraintSet.getConstraint(viewId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void initMode(int mode) {
|
||||||
|
mKeyguardSecurityContainer.initMode(mode, mGlobalSettings, mFalsingManager,
|
||||||
|
mUserSwitcherController, () -> {
|
||||||
|
}, mFalsingA11yDelegate);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -96,7 +96,6 @@ public class BrightLineFalsingManagerTest extends SysuiTestCase {
|
|||||||
assertThat(mBrightLineFalsingManager.isFalseTap(1)).isFalse();
|
assertThat(mBrightLineFalsingManager.isFalseTap(1)).isFalse();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testA11yDisablesTap() {
|
public void testA11yDisablesTap() {
|
||||||
assertThat(mBrightLineFalsingManager.isFalseTouch(Classifier.GENERIC)).isTrue();
|
assertThat(mBrightLineFalsingManager.isFalseTouch(Classifier.GENERIC)).isTrue();
|
||||||
@@ -159,4 +158,11 @@ public class BrightLineFalsingManagerTest extends SysuiTestCase {
|
|||||||
});
|
});
|
||||||
assertThat(mBrightLineFalsingManager.isProximityNear()).isFalse();
|
assertThat(mBrightLineFalsingManager.isProximityNear()).isFalse();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testA11yAction() {
|
||||||
|
assertThat(mBrightLineFalsingManager.isFalseTap(1)).isTrue();
|
||||||
|
when(mFalsingDataProvider.isA11yAction()).thenReturn(true);
|
||||||
|
assertThat(mBrightLineFalsingManager.isFalseTap(1)).isFalse();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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()
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -267,4 +267,10 @@ public class FalsingCollectorImplTest extends SysuiTestCase {
|
|||||||
mFalsingCollector.onTouchEvent(up);
|
mFalsingCollector.onTouchEvent(up);
|
||||||
verify(mFalsingDataProvider, times(2)).onMotionEvent(any(MotionEvent.class));
|
verify(mFalsingDataProvider, times(2)).onMotionEvent(any(MotionEvent.class));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testOnA11yAction() {
|
||||||
|
mFalsingCollector.onA11yAction();
|
||||||
|
verify(mFalsingDataProvider).onA11yAction();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -310,4 +310,10 @@ public class FalsingDataProviderTest extends ClassifierTest {
|
|||||||
// an empty array.
|
// an empty array.
|
||||||
assertThat(mDataProvider.getPriorMotionEvents()).isNotNull();
|
assertThat(mDataProvider.getPriorMotionEvents()).isNotNull();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test_MotionEventComplete_A11yAction() {
|
||||||
|
mDataProvider.onA11yAction();
|
||||||
|
assertThat(mDataProvider.isA11yAction()).isTrue();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user