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:
Beverly
2021-04-06 11:47:23 -04:00
parent 764d281680
commit 1951b0b366
10 changed files with 87 additions and 36 deletions

View File

@@ -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();
}
};
}

View File

@@ -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());

View File

@@ -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

View File

@@ -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());
}
};
}

View File

@@ -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 {}

View File

@@ -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);
}

View File

@@ -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();

View File

@@ -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();

View File

@@ -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);
}

View File

@@ -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();