diff options
| -rw-r--r-- | packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java | 12 | ||||
| -rw-r--r-- | packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java | 18 |
2 files changed, 24 insertions, 6 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java index 2eb533029cf5..2985b180d2aa 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java @@ -188,6 +188,8 @@ public class UdfpsController implements DozeReceiver, Dumpable { @Nullable private VelocityTracker mVelocityTracker; // The ID of the pointer for which ACTION_DOWN has occurred. -1 means no pointer is active. private int mActivePointerId = -1; + // Whether a pointer has been pilfered for current gesture + private boolean mPointerPilfered = false; // The timestamp of the most recent touch log. private long mTouchLogTime; // The timestamp of the most recent log of a touch InteractionEvent. @@ -557,6 +559,11 @@ public class UdfpsController implements DozeReceiver, Dumpable { || mPrimaryBouncerInteractor.isInTransit()) { return false; } + if (event.getAction() == MotionEvent.ACTION_DOWN + || event.getAction() == MotionEvent.ACTION_HOVER_ENTER) { + // Reset on ACTION_DOWN, start of new gesture + mPointerPilfered = false; + } final TouchProcessorResult result = mTouchProcessor.processTouch(event, mActivePointerId, mOverlayParams); @@ -630,10 +637,11 @@ public class UdfpsController implements DozeReceiver, Dumpable { shouldPilfer = true; } - // Execute the pilfer - if (shouldPilfer) { + // Pilfer only once per gesture + if (shouldPilfer && !mPointerPilfered) { mInputManager.pilferPointers( mOverlay.getOverlayView().getViewRootImpl().getInputToken()); + mPointerPilfered = true; } return processedTouch.getTouchData().isWithinBounds(mOverlayParams.getNativeSensorBounds()); 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 b2ccd60216d7..92033b864d1f 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java @@ -1300,12 +1300,22 @@ public class UdfpsControllerTest extends SysuiTestCase { // WHEN ACTION_DOWN is received when(mSinglePointerTouchProcessor.processTouch(any(), anyInt(), any())).thenReturn( processorResultDown); - MotionEvent downEvent = MotionEvent.obtain(0, 0, ACTION_DOWN, 0, 0, 0); - mTouchListenerCaptor.getValue().onTouch(mUdfpsView, downEvent); + MotionEvent event = MotionEvent.obtain(0, 0, ACTION_DOWN, 0, 0, 0); + mTouchListenerCaptor.getValue().onTouch(mUdfpsView, event); mBiometricExecutor.runAllReady(); - downEvent.recycle(); - // THEN the touch is pilfered + // WHEN ACTION_MOVE is received after + final TouchProcessorResult processorResultUnchanged = + new TouchProcessorResult.ProcessedTouch( + InteractionEvent.UNCHANGED, 1 /* pointerId */, touchData); + when(mSinglePointerTouchProcessor.processTouch(any(), anyInt(), any())).thenReturn( + processorResultUnchanged); + event.setAction(ACTION_MOVE); + mTouchListenerCaptor.getValue().onTouch(mUdfpsView, event); + mBiometricExecutor.runAllReady(); + event.recycle(); + + // THEN only pilfer once on the initial down verify(mInputManager).pilferPointers(any()); } |