summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java77
-rw-r--r--packages/SystemUI/src/com/android/systemui/biometrics/UdfpsView.java10
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java10
3 files changed, 66 insertions, 31 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java
index 6451ad9fd5d2..71fba3302abc 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java
@@ -68,6 +68,7 @@ public class UdfpsController implements DozeReceiver, HbmCallback {
private final Context mContext;
private final FingerprintManager mFingerprintManager;
+ @NonNull private final LayoutInflater mInflater;
private final WindowManager mWindowManager;
private final DelayableExecutor mFgExecutor;
private final StatusBarStateController mStatusBarStateController;
@@ -75,10 +76,8 @@ public class UdfpsController implements DozeReceiver, HbmCallback {
// sensors, this, in addition to a lot of the code here, will be updated.
@VisibleForTesting final FingerprintSensorPropertiesInternal mSensorProps;
private final WindowManager.LayoutParams mCoreLayoutParams;
- private final UdfpsView mView;
- // Indicates whether the overlay is currently showing. Even if it has been requested, it might
- // not be showing.
- private boolean mIsOverlayShowing;
+
+ @Nullable private UdfpsView mView;
// Indicates whether the overlay has been requested.
private boolean mIsOverlayRequested;
// Reason the overlay has been requested. See IUdfpsOverlayController for definitions.
@@ -111,20 +110,48 @@ public class UdfpsController implements DozeReceiver, HbmCallback {
@Override
public void onEnrollmentProgress(int sensorId, int remaining) {
+ if (mView == null) {
+ return;
+ }
mView.onEnrollmentProgress(remaining);
}
@Override
public void onEnrollmentHelp(int sensorId) {
+ if (mView == null) {
+ return;
+ }
mView.onEnrollmentHelp();
}
@Override
public void setDebugMessage(int sensorId, String message) {
+ if (mView == null) {
+ return;
+ }
mView.setDebugMessage(message);
}
}
+ @VisibleForTesting
+ final StatusBar.ExpansionChangedListener mStatusBarExpansionListener =
+ (expansion, expanded) -> {
+ if (mView != null) {
+ mView.onExpansionChanged(expansion, expanded);
+ }
+ };
+
+ @VisibleForTesting
+ final StatusBarStateController.StateListener mStatusBarStateListener =
+ new StatusBarStateController.StateListener() {
+ @Override
+ public void onStateChanged(int newState) {
+ if (mView != null) {
+ mView.onStateChanged(newState);
+ }
+ }
+ };
+
@SuppressLint("ClickableViewAccessibility")
private final UdfpsView.OnTouchListener mOnTouchListener = (v, event) -> {
UdfpsView view = (UdfpsView) v;
@@ -157,13 +184,14 @@ public class UdfpsController implements DozeReceiver, HbmCallback {
@Inject
public UdfpsController(@NonNull Context context,
@Main Resources resources,
- LayoutInflater inflater,
+ @NonNull LayoutInflater inflater,
@Nullable FingerprintManager fingerprintManager,
WindowManager windowManager,
@NonNull StatusBarStateController statusBarStateController,
@Main DelayableExecutor fgExecutor,
@Nullable StatusBar statusBar) {
mContext = context;
+ mInflater = inflater;
// The fingerprint manager is queried for UDFPS before this class is constructed, so the
// fingerprint manager should never be null.
mFingerprintManager = checkNotNull(fingerprintManager);
@@ -189,15 +217,10 @@ public class UdfpsController implements DozeReceiver, HbmCallback {
WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
mCoreLayoutParams.privateFlags = WindowManager.LayoutParams.PRIVATE_FLAG_TRUSTED_OVERLAY;
- mView = (UdfpsView) inflater.inflate(R.layout.udfps_view, null, false);
- mView.setSensorProperties(mSensorProps);
- mView.setHbmCallback(this);
-
- statusBar.addExpansionChangedListener(mView);
- statusBarStateController.addCallback(mView);
+ statusBar.addExpansionChangedListener(mStatusBarExpansionListener);
+ mStatusBarStateController.addCallback(mStatusBarStateListener);
mFingerprintManager.setUdfpsOverlayController(new UdfpsOverlayController());
- mIsOverlayShowing = false;
}
@Nullable
@@ -220,7 +243,13 @@ public class UdfpsController implements DozeReceiver, HbmCallback {
* @return where the UDFPS exists on the screen in pixels.
*/
public RectF getSensorLocation() {
- return mView.getSensorRect();
+ // This is currently used to calculate the amount of space available for notifications
+ // on lockscreen. Keyguard is only shown in portrait mode for now, so this will need to
+ // be updated if that ever changes.
+ return new RectF(mSensorProps.sensorLocationX - mSensorProps.sensorRadius,
+ mSensorProps.sensorLocationY - mSensorProps.sensorRadius,
+ mSensorProps.sensorLocationX + mSensorProps.sensorRadius,
+ mSensorProps.sensorLocationY + mSensorProps.sensorRadius);
}
private void showOverlay(int reason) {
@@ -298,14 +327,18 @@ public class UdfpsController implements DozeReceiver, HbmCallback {
private void showUdfpsOverlay(int reason) {
mFgExecutor.execute(() -> {
- if (!mIsOverlayShowing) {
+ if (mView == null) {
try {
Log.v(TAG, "showUdfpsOverlay | adding window");
+
+ mView = (UdfpsView) mInflater.inflate(R.layout.udfps_view, null, false);
+ mView.setSensorProperties(mSensorProps);
+ mView.setHbmCallback(this);
+
final UdfpsAnimation animation = getUdfpsAnimationForReason(reason);
mView.setExtras(animation, mEnrollHelper);
mWindowManager.addView(mView, computeLayoutParams(animation));
mView.setOnTouchListener(mOnTouchListener);
- mIsOverlayShowing = true;
} catch (RuntimeException e) {
Log.e(TAG, "showUdfpsOverlay | failed to add window", e);
}
@@ -334,14 +367,12 @@ public class UdfpsController implements DozeReceiver, HbmCallback {
private void hideUdfpsOverlay() {
mFgExecutor.execute(() -> {
- if (mIsOverlayShowing) {
+ if (mView != null) {
Log.v(TAG, "hideUdfpsOverlay | removing window");
- mView.setExtras(null, null);
- mView.setOnTouchListener(null);
// Reset the controller back to its starting state.
onFingerUp();
mWindowManager.removeView(mView);
- mIsOverlayShowing = false;
+ mView = null;
} else {
Log.v(TAG, "hideUdfpsOverlay | the overlay is already hidden");
}
@@ -388,12 +419,20 @@ public class UdfpsController implements DozeReceiver, HbmCallback {
// This method can be called from the UI thread.
private void onFingerDown(int x, int y, float minor, float major) {
+ if (mView == null) {
+ Log.w(TAG, "Null view in onFingerDown");
+ return;
+ }
mView.startIllumination(() ->
mFingerprintManager.onPointerDown(mSensorProps.sensorId, x, y, minor, major));
}
// This method can be called from the UI thread.
private void onFingerUp() {
+ if (mView == null) {
+ Log.w(TAG, "Null view in onFingerUp");
+ return;
+ }
mFingerprintManager.onPointerUp(mSensorProps.sensorId);
mView.stopIllumination();
}
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsView.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsView.java
index 6ffecdba883b..399794391700 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsView.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsView.java
@@ -136,17 +136,13 @@ public class UdfpsView extends FrameLayout implements DozeReceiver, UdfpsIllumin
}
@Override
- public void onExpandedChanged(boolean isExpanded) {
- mNotificationShadeExpanded = isExpanded;
- }
-
- @Override
public void onStateChanged(int newState) {
mStatusBarState = newState;
}
@Override
public void onExpansionChanged(float expansion, boolean expanded) {
+ mNotificationShadeExpanded = expanded;
mAnimationView.onExpansionChanged(expansion, expanded);
}
@@ -192,10 +188,6 @@ public class UdfpsView extends FrameLayout implements DozeReceiver, UdfpsIllumin
}
}
- RectF getSensorRect() {
- return new RectF(mSensorRect);
- }
-
void setDebugMessage(String message) {
mDebugMessage = message;
postInvalidate();
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java
index 3e873d1985fb..700f101e44b8 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java
@@ -150,7 +150,10 @@ public class UdfpsControllerTest extends SysuiTestCase {
}
@Test
- public void dozeTimeTick() {
+ public void dozeTimeTick() throws RemoteException {
+ mOverlayController.showUdfpsOverlay(TEST_UDFPS_SENSOR_ID,
+ IUdfpsOverlayController.REASON_AUTH_FPM_KEYGUARD);
+ mFgExecutor.runAllReady();
mUdfpsController.dozeTimeTick();
verify(mUdfpsView).dozeTimeTick();
}
@@ -240,7 +243,8 @@ public class UdfpsControllerTest extends SysuiTestCase {
@Test
public void registersViewForCallbacks() throws RemoteException {
- verify(mStatusBarStateController).addCallback(mUdfpsView);
- verify(mStatusBar).addExpansionChangedListener(mUdfpsView);
+ verify(mStatusBarStateController).addCallback(mUdfpsController.mStatusBarStateListener);
+ verify(mStatusBar).addExpansionChangedListener(
+ mUdfpsController.mStatusBarExpansionListener);
}
}