Add falsing checks to udfps affordance
Check falsing manager to determine whether taps on the DisabledUdfps affordances should be used. Update logic for showing DisabledUdfps controller and UdfpsKeyguardView so that they don't show when QS is expanded. Show DisabledUdfps view on tap and on long press. Test: manual Bug: 184290268 Bug: 183910378 Change-Id: I677062b0990ac450589e29e293f7c9de41296dd5
This commit is contained in:
@@ -18,11 +18,12 @@ package com.android.keyguard;
|
||||
|
||||
import static android.hardware.biometrics.BiometricSourceType.FINGERPRINT;
|
||||
|
||||
import static com.android.systemui.classifier.Classifier.DISABLED_UDFPS_AFFORDANCE;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.graphics.drawable.InsetDrawable;
|
||||
import android.hardware.biometrics.BiometricSourceType;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
@@ -33,7 +34,9 @@ import com.android.systemui.Dumpable;
|
||||
import com.android.systemui.R;
|
||||
import com.android.systemui.biometrics.AuthController;
|
||||
import com.android.systemui.dagger.SysUISingleton;
|
||||
import com.android.systemui.plugins.FalsingManager;
|
||||
import com.android.systemui.plugins.statusbar.StatusBarStateController;
|
||||
import com.android.systemui.statusbar.StatusBarState;
|
||||
import com.android.systemui.statusbar.policy.KeyguardStateController;
|
||||
import com.android.systemui.util.ViewController;
|
||||
|
||||
@@ -53,14 +56,16 @@ public class DisabledUdfpsController extends ViewController<DisabledUdfpsView> i
|
||||
@NonNull private final KeyguardViewController mKeyguardViewController;
|
||||
@NonNull private final StatusBarStateController mStatusBarStateController;
|
||||
@NonNull private final KeyguardStateController mKeyguardStateController;
|
||||
@NonNull private final FalsingManager mFalsingManager;
|
||||
@NonNull private final Drawable mButton;
|
||||
@NonNull private final Drawable mUnlockIcon;
|
||||
|
||||
private boolean mIsDozing;
|
||||
private boolean mIsBouncerShowing;
|
||||
private boolean mIsKeyguardShowing;
|
||||
private boolean mRunningFPS;
|
||||
private boolean mCanDismissLockScreen;
|
||||
private boolean mQsExpanded;
|
||||
private int mStatusBarState;
|
||||
|
||||
private boolean mShowButton;
|
||||
private boolean mShowUnlockIcon;
|
||||
@@ -71,16 +76,19 @@ public class DisabledUdfpsController extends ViewController<DisabledUdfpsView> i
|
||||
@NonNull KeyguardUpdateMonitor keyguardUpdateMonitor,
|
||||
@NonNull AuthController authController,
|
||||
@NonNull KeyguardViewController keyguardViewController,
|
||||
@NonNull KeyguardStateController keyguardStateController
|
||||
@NonNull KeyguardStateController keyguardStateController,
|
||||
@NonNull FalsingManager falsingManager
|
||||
) {
|
||||
super(view);
|
||||
mView.setOnTouchListener(mOnTouchListener);
|
||||
mView.setOnClickListener(v -> onAffordanceClick());
|
||||
mView.setOnLongClickListener(v -> onAffordanceClick());
|
||||
mView.setSensorProperties(authController.getUdfpsProps().get(0));
|
||||
|
||||
mStatusBarStateController = statusBarStateController;
|
||||
mKeyguardUpdateMonitor = keyguardUpdateMonitor;
|
||||
mKeyguardViewController = keyguardViewController;
|
||||
mKeyguardStateController = keyguardStateController;
|
||||
mFalsingManager = falsingManager;
|
||||
|
||||
final Context context = view.getContext();
|
||||
mButton = context.getResources().getDrawable(
|
||||
@@ -94,10 +102,10 @@ public class DisabledUdfpsController extends ViewController<DisabledUdfpsView> i
|
||||
@Override
|
||||
protected void onViewAttached() {
|
||||
mIsBouncerShowing = mKeyguardViewController.isBouncerShowing();
|
||||
mIsKeyguardShowing = mKeyguardStateController.isShowing();
|
||||
mIsDozing = mStatusBarStateController.isDozing();
|
||||
mRunningFPS = mKeyguardUpdateMonitor.isFingerprintDetectionRunning();
|
||||
mCanDismissLockScreen = mKeyguardStateController.canDismissLockScreen();
|
||||
mStatusBarState = mStatusBarStateController.getState();
|
||||
mUnlockIcon.setTint(Utils.getColorAttrDefaultColor(mView.getContext(),
|
||||
R.attr.wallpaperTextColorAccent));
|
||||
updateVisibility();
|
||||
@@ -114,6 +122,15 @@ public class DisabledUdfpsController extends ViewController<DisabledUdfpsView> i
|
||||
mKeyguardStateController.removeCallback(mKeyguardStateCallback);
|
||||
}
|
||||
|
||||
private boolean onAffordanceClick() {
|
||||
if (mFalsingManager.isFalseTouch(DISABLED_UDFPS_AFFORDANCE)) {
|
||||
return false;
|
||||
}
|
||||
mView.setVisibility(View.INVISIBLE);
|
||||
mKeyguardViewController.showBouncer(/* scrim */ true);
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Call when this controller is no longer needed. This will remove the view from its parent.
|
||||
*/
|
||||
@@ -123,6 +140,14 @@ public class DisabledUdfpsController extends ViewController<DisabledUdfpsView> i
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set whether qs is expanded. When QS is expanded, don't show a DisabledUdfps affordance.
|
||||
*/
|
||||
public void setQsExpanded(boolean expanded) {
|
||||
mQsExpanded = expanded;
|
||||
updateVisibility();
|
||||
}
|
||||
|
||||
private void updateVisibility() {
|
||||
mShowButton = !mCanDismissLockScreen && !mRunningFPS && isLockScreen();
|
||||
mShowUnlockIcon = mCanDismissLockScreen && isLockScreen();
|
||||
@@ -139,7 +164,10 @@ public class DisabledUdfpsController extends ViewController<DisabledUdfpsView> i
|
||||
}
|
||||
|
||||
private boolean isLockScreen() {
|
||||
return mIsKeyguardShowing && !mIsDozing && !mIsBouncerShowing;
|
||||
return !mIsDozing
|
||||
&& !mIsBouncerShowing
|
||||
&& !mQsExpanded
|
||||
&& mStatusBarState == StatusBarState.KEYGUARD;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -148,20 +176,13 @@ public class DisabledUdfpsController extends ViewController<DisabledUdfpsView> i
|
||||
pw.println(" mShowBouncerButton: " + mShowButton);
|
||||
pw.println(" mShowUnlockIcon: " + mShowUnlockIcon);
|
||||
pw.println(" mIsDozing: " + mIsDozing);
|
||||
pw.println(" mIsKeyguardShowing: " + mIsKeyguardShowing);
|
||||
pw.println(" mIsBouncerShowing: " + mIsBouncerShowing);
|
||||
pw.println(" mRunningFPS: " + mRunningFPS);
|
||||
pw.println(" mCanDismissLockScreen: " + mCanDismissLockScreen);
|
||||
pw.println(" mStatusBarState: " + StatusBarState.toShortString(mStatusBarState));
|
||||
pw.println(" mQsExpanded: " + mQsExpanded);
|
||||
}
|
||||
|
||||
private final View.OnTouchListener mOnTouchListener = new View.OnTouchListener() {
|
||||
@Override
|
||||
public boolean onTouch(View v, MotionEvent event) {
|
||||
mKeyguardViewController.showBouncer(/* scrim */ true);
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
private StatusBarStateController.StateListener mStatusBarStateListener =
|
||||
new StatusBarStateController.StateListener() {
|
||||
@Override
|
||||
@@ -169,6 +190,12 @@ public class DisabledUdfpsController extends ViewController<DisabledUdfpsView> i
|
||||
mIsDozing = isDozing;
|
||||
updateVisibility();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStateChanged(int statusBarState) {
|
||||
mStatusBarState = statusBarState;
|
||||
updateVisibility();
|
||||
}
|
||||
};
|
||||
|
||||
private final KeyguardUpdateMonitorCallback mKeyguardUpdateMonitorCallback =
|
||||
@@ -192,22 +219,10 @@ public class DisabledUdfpsController extends ViewController<DisabledUdfpsView> i
|
||||
|
||||
private final KeyguardStateController.Callback mKeyguardStateCallback =
|
||||
new KeyguardStateController.Callback() {
|
||||
@Override
|
||||
public void onKeyguardShowingChanged() {
|
||||
updateIsKeyguardShowing();
|
||||
updateVisibility();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onUnlockedChanged() {
|
||||
updateIsKeyguardShowing();
|
||||
mCanDismissLockScreen = mKeyguardStateController.canDismissLockScreen();
|
||||
updateVisibility();
|
||||
}
|
||||
|
||||
private void updateIsKeyguardShowing() {
|
||||
mIsKeyguardShowing = mKeyguardStateController.isShowing()
|
||||
&& !mKeyguardStateController.isKeyguardGoingAway();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@@ -23,7 +23,6 @@ import android.graphics.RectF;
|
||||
import com.android.systemui.Dumpable;
|
||||
import com.android.systemui.dump.DumpManager;
|
||||
import com.android.systemui.plugins.statusbar.StatusBarStateController;
|
||||
import com.android.systemui.statusbar.StatusBarState;
|
||||
import com.android.systemui.statusbar.phone.StatusBar;
|
||||
import com.android.systemui.util.ViewController;
|
||||
|
||||
@@ -47,7 +46,6 @@ abstract class UdfpsAnimationViewController<T extends UdfpsAnimationView>
|
||||
@NonNull final DumpManager mDumpManger;
|
||||
|
||||
private boolean mNotificationShadeExpanded;
|
||||
private int mStatusBarState;
|
||||
|
||||
protected UdfpsAnimationViewController(
|
||||
T view,
|
||||
@@ -86,7 +84,6 @@ abstract class UdfpsAnimationViewController<T extends UdfpsAnimationView>
|
||||
|
||||
@Override
|
||||
public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
|
||||
pw.println("mStatusBarState=" + StatusBarState.toShortString(mStatusBarState));
|
||||
pw.println("mNotificationShadeExpanded=" + mNotificationShadeExpanded);
|
||||
pw.println("shouldPauseAuth()=" + shouldPauseAuth());
|
||||
pw.println("isPauseAuth=" + mView.isPauseAuth());
|
||||
|
||||
@@ -18,6 +18,7 @@ package com.android.systemui.biometrics;
|
||||
|
||||
import static com.android.internal.util.Preconditions.checkArgument;
|
||||
import static com.android.internal.util.Preconditions.checkNotNull;
|
||||
import static com.android.systemui.classifier.Classifier.UDFPS_AUTHENTICATION;
|
||||
|
||||
import android.annotation.NonNull;
|
||||
import android.annotation.Nullable;
|
||||
@@ -53,6 +54,7 @@ import com.android.systemui.dagger.qualifiers.Main;
|
||||
import com.android.systemui.doze.DozeReceiver;
|
||||
import com.android.systemui.dump.DumpManager;
|
||||
import com.android.systemui.keyguard.KeyguardViewMediator;
|
||||
import com.android.systemui.plugins.FalsingManager;
|
||||
import com.android.systemui.plugins.statusbar.StatusBarStateController;
|
||||
import com.android.systemui.statusbar.phone.StatusBar;
|
||||
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
|
||||
@@ -91,6 +93,7 @@ public class UdfpsController implements DozeReceiver, HbmCallback {
|
||||
@NonNull private final DumpManager mDumpManager;
|
||||
@NonNull private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
|
||||
@NonNull private final KeyguardViewMediator mKeyguardViewMediator;
|
||||
@NonNull private FalsingManager mFalsingManager;
|
||||
// Currently the UdfpsController supports a single UDFPS sensor. If devices have multiple
|
||||
// sensors, this, in addition to a lot of the code here, will be updated.
|
||||
@VisibleForTesting final FingerprintSensorPropertiesInternal mSensorProps;
|
||||
@@ -291,6 +294,8 @@ public class UdfpsController implements DozeReceiver, HbmCallback {
|
||||
Log.v(TAG, "onTouch | finger up");
|
||||
onFingerUp();
|
||||
}
|
||||
mFalsingManager.isFalseTouch(UDFPS_AUTHENTICATION);
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
@@ -311,7 +316,8 @@ public class UdfpsController implements DozeReceiver, HbmCallback {
|
||||
@NonNull StatusBarKeyguardViewManager statusBarKeyguardViewManager,
|
||||
@NonNull DumpManager dumpManager,
|
||||
@NonNull KeyguardUpdateMonitor keyguardUpdateMonitor,
|
||||
@NonNull KeyguardViewMediator keyguardViewMediator) {
|
||||
@NonNull KeyguardViewMediator keyguardViewMediator,
|
||||
@NonNull FalsingManager falsingManager) {
|
||||
mContext = context;
|
||||
mInflater = inflater;
|
||||
// The fingerprint manager is queried for UDFPS before this class is constructed, so the
|
||||
@@ -325,6 +331,7 @@ public class UdfpsController implements DozeReceiver, HbmCallback {
|
||||
mDumpManager = dumpManager;
|
||||
mKeyguardUpdateMonitor = keyguardUpdateMonitor;
|
||||
mKeyguardViewMediator = keyguardViewMediator;
|
||||
mFalsingManager = falsingManager;
|
||||
|
||||
mSensorProps = findFirstUdfps();
|
||||
// At least one UDFPS sensor exists
|
||||
|
||||
@@ -91,6 +91,7 @@ public class UdfpsKeyguardViewController extends UdfpsAnimationViewController<Ud
|
||||
mStatusBarStateController.addCallback(mStateListener);
|
||||
mStateListener.onDozeAmountChanged(dozeAmount, dozeAmount);
|
||||
mStateListener.onStateChanged(mStatusBarStateController.getState());
|
||||
mAlternateAuthInterceptor.setQsExpanded(mKeyguardViewManager.isQsExpanded());
|
||||
mKeyguardViewManager.setAlternateAuthInterceptor(mAlternateAuthInterceptor);
|
||||
}
|
||||
|
||||
@@ -117,6 +118,8 @@ public class UdfpsKeyguardViewController extends UdfpsAnimationViewController<Ud
|
||||
pw.println("mShowBouncer=" + mShowBouncer);
|
||||
pw.println("mFaceDetectRunning=" + mFaceDetectRunning);
|
||||
pw.println("mTransitioningFromHomeToKeyguard=" + mTransitioningFromHome);
|
||||
pw.println("mStatusBarState" + StatusBarState.toShortString(mStatusBarState));
|
||||
pw.println("mQsExpanded=" + mQsExpanded);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -215,6 +218,7 @@ public class UdfpsKeyguardViewController extends UdfpsAnimationViewController<Ud
|
||||
public void onStateChanged(int statusBarState) {
|
||||
mStatusBarState = statusBarState;
|
||||
mView.setStatusBarState(statusBarState);
|
||||
updatePauseAuth();
|
||||
}
|
||||
};
|
||||
|
||||
@@ -283,7 +287,7 @@ public class UdfpsKeyguardViewController extends UdfpsAnimationViewController<Ud
|
||||
|
||||
@Override
|
||||
public void dump(PrintWriter pw) {
|
||||
pw.print(getTag());
|
||||
pw.println(getTag());
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@@ -38,6 +38,8 @@ public abstract class Classifier {
|
||||
public static final int BOUNCER_UNLOCK = 8;
|
||||
public static final int PULSE_EXPAND = 9;
|
||||
public static final int BRIGHTNESS_SLIDER = 10;
|
||||
public static final int UDFPS_AUTHENTICATION = 11;
|
||||
public static final int DISABLED_UDFPS_AFFORDANCE = 12;
|
||||
|
||||
@IntDef({
|
||||
QUICK_SETTINGS,
|
||||
@@ -50,7 +52,9 @@ public abstract class Classifier {
|
||||
GENERIC,
|
||||
BOUNCER_UNLOCK,
|
||||
PULSE_EXPAND,
|
||||
BRIGHTNESS_SLIDER
|
||||
BRIGHTNESS_SLIDER,
|
||||
UDFPS_AUTHENTICATION,
|
||||
DISABLED_UDFPS_AFFORDANCE
|
||||
})
|
||||
@Retention(RetentionPolicy.SOURCE)
|
||||
public @interface InteractionType {}
|
||||
|
||||
@@ -148,7 +148,9 @@ class DistanceClassifier extends FalsingClassifier {
|
||||
Result calculateFalsingResult(
|
||||
@Classifier.InteractionType int interactionType,
|
||||
double historyBelief, double historyConfidence) {
|
||||
if (interactionType == Classifier.BRIGHTNESS_SLIDER) {
|
||||
if (interactionType == Classifier.BRIGHTNESS_SLIDER
|
||||
|| interactionType == Classifier.UDFPS_AUTHENTICATION
|
||||
|| interactionType == Classifier.DISABLED_UDFPS_AFFORDANCE) {
|
||||
return Result.passed(0);
|
||||
}
|
||||
|
||||
|
||||
@@ -42,6 +42,11 @@ public class TypeClassifier extends FalsingClassifier {
|
||||
Result calculateFalsingResult(
|
||||
@Classifier.InteractionType int interactionType,
|
||||
double historyBelief, double historyConfidence) {
|
||||
if (interactionType == Classifier.UDFPS_AUTHENTICATION
|
||||
|| interactionType == Classifier.DISABLED_UDFPS_AFFORDANCE) {
|
||||
return Result.passed(0);
|
||||
}
|
||||
|
||||
boolean vertical = isVertical();
|
||||
boolean up = isUp();
|
||||
boolean right = isRight();
|
||||
|
||||
@@ -1844,6 +1844,10 @@ public class NotificationPanelViewController extends PanelViewController {
|
||||
mPulseExpansionHandler.setQsExpanded(expanded);
|
||||
mKeyguardBypassController.setQSExpanded(expanded);
|
||||
mStatusBarKeyguardViewManager.setQsExpanded(expanded);
|
||||
|
||||
if (mDisabledUdfpsController != null) {
|
||||
mDisabledUdfpsController.setQsExpanded(expanded);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3544,7 +3548,8 @@ public class NotificationPanelViewController extends PanelViewController {
|
||||
mUpdateMonitor,
|
||||
mAuthController,
|
||||
mStatusBarKeyguardViewManager,
|
||||
mKeyguardStateController);
|
||||
mKeyguardStateController,
|
||||
mFalsingManager);
|
||||
mDisabledUdfpsController.init();
|
||||
} else if (mDisabledUdfpsController != null && !udfpsEnrolled) {
|
||||
mDisabledUdfpsController.destroy();
|
||||
|
||||
@@ -187,6 +187,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
|
||||
private int mLastBiometricMode;
|
||||
private boolean mLastLockVisible;
|
||||
private boolean mLastLockOrientationIsPortrait;
|
||||
private boolean mQsExpanded;
|
||||
|
||||
private OnDismissAction mAfterKeyguardGoneAction;
|
||||
private Runnable mKeyguardGoneCancelAction;
|
||||
@@ -1127,10 +1128,17 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
|
||||
setDozing(isDozing);
|
||||
}
|
||||
|
||||
/**
|
||||
* Whether qs is currently expanded.
|
||||
*/
|
||||
public boolean isQsExpanded() {
|
||||
return mQsExpanded;
|
||||
}
|
||||
/**
|
||||
* Set whether qs is currently expanded
|
||||
*/
|
||||
public void setQsExpanded(boolean expanded) {
|
||||
mQsExpanded = expanded;
|
||||
if (mAlternateAuthInterceptor != null) {
|
||||
mAlternateAuthInterceptor.setQsExpanded(expanded);
|
||||
}
|
||||
|
||||
@@ -48,6 +48,7 @@ import com.android.systemui.R;
|
||||
import com.android.systemui.SysuiTestCase;
|
||||
import com.android.systemui.dump.DumpManager;
|
||||
import com.android.systemui.keyguard.KeyguardViewMediator;
|
||||
import com.android.systemui.plugins.FalsingManager;
|
||||
import com.android.systemui.plugins.statusbar.StatusBarStateController;
|
||||
import com.android.systemui.statusbar.phone.StatusBar;
|
||||
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
|
||||
@@ -105,6 +106,8 @@ public class UdfpsControllerTest extends SysuiTestCase {
|
||||
private KeyguardViewMediator mKeyguardViewMediator;
|
||||
@Mock
|
||||
private IUdfpsOverlayControllerCallback mUdfpsOverlayControllerCallback;
|
||||
@Mock
|
||||
private FalsingManager mFalsingManager;
|
||||
|
||||
private FakeExecutor mFgExecutor;
|
||||
|
||||
@@ -156,7 +159,8 @@ public class UdfpsControllerTest extends SysuiTestCase {
|
||||
mStatusBarKeyguardViewManager,
|
||||
mDumpManager,
|
||||
mKeyguardUpdateMonitor,
|
||||
mKeyguardViewMediator);
|
||||
mKeyguardViewMediator,
|
||||
mFalsingManager);
|
||||
verify(mFingerprintManager).setUdfpsOverlayController(mOverlayCaptor.capture());
|
||||
mOverlayController = mOverlayCaptor.getValue();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user