Merge "Added TouchProvider" into tm-dev am: 73a728edfd
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/17517174 Change-Id: Icb74c9c2b8b2de76306363fae2f8e487de760ac7 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
@@ -0,0 +1,42 @@
|
|||||||
|
/*
|
||||||
|
* 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.biometrics
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Interface for controlling the on finger down & on finger up events.
|
||||||
|
*/
|
||||||
|
interface AlternateUdfpsTouchProvider {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This operation is used to notify the Fingerprint HAL that
|
||||||
|
* a fingerprint has been detected on the device's screen.
|
||||||
|
*
|
||||||
|
* See fingerprint/ISession#onPointerDown for more details.
|
||||||
|
*/
|
||||||
|
fun onPointerDown(pointerId: Long, x: Int, y: Int, minor: Float, major: Float)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* onPointerUp:
|
||||||
|
*
|
||||||
|
* This operation can be invoked when the HAL is performing any one of: ISession#authenticate,
|
||||||
|
* ISession#enroll, ISession#detectInteraction. This operation is used to indicate
|
||||||
|
* that a fingerprint that was previously down, is now up.
|
||||||
|
*
|
||||||
|
* See fingerprint/ISession#onPointerUp for more details.
|
||||||
|
*/
|
||||||
|
fun onPointerUp(pointerId: Long)
|
||||||
|
}
|
||||||
@@ -133,6 +133,7 @@ public class UdfpsController implements DozeReceiver {
|
|||||||
// sensors, this, in addition to a lot of the code here, will be updated.
|
// sensors, this, in addition to a lot of the code here, will be updated.
|
||||||
@VisibleForTesting final FingerprintSensorPropertiesInternal mSensorProps;
|
@VisibleForTesting final FingerprintSensorPropertiesInternal mSensorProps;
|
||||||
@NonNull private final ActivityLaunchAnimator mActivityLaunchAnimator;
|
@NonNull private final ActivityLaunchAnimator mActivityLaunchAnimator;
|
||||||
|
@Nullable private final AlternateUdfpsTouchProvider mAlternateTouchProvider;
|
||||||
|
|
||||||
// Tracks the velocity of a touch to help filter out the touches that move too fast.
|
// Tracks the velocity of a touch to help filter out the touches that move too fast.
|
||||||
@Nullable private VelocityTracker mVelocityTracker;
|
@Nullable private VelocityTracker mVelocityTracker;
|
||||||
@@ -537,7 +538,8 @@ public class UdfpsController implements DozeReceiver {
|
|||||||
@NonNull UnlockedScreenOffAnimationController unlockedScreenOffAnimationController,
|
@NonNull UnlockedScreenOffAnimationController unlockedScreenOffAnimationController,
|
||||||
@NonNull SystemUIDialogManager dialogManager,
|
@NonNull SystemUIDialogManager dialogManager,
|
||||||
@NonNull LatencyTracker latencyTracker,
|
@NonNull LatencyTracker latencyTracker,
|
||||||
@NonNull ActivityLaunchAnimator activityLaunchAnimator) {
|
@NonNull ActivityLaunchAnimator activityLaunchAnimator,
|
||||||
|
@NonNull Optional<AlternateUdfpsTouchProvider> aternateTouchProvider) {
|
||||||
mContext = context;
|
mContext = context;
|
||||||
mExecution = execution;
|
mExecution = execution;
|
||||||
mVibrator = vibrator;
|
mVibrator = vibrator;
|
||||||
@@ -566,6 +568,7 @@ public class UdfpsController implements DozeReceiver {
|
|||||||
mUnlockedScreenOffAnimationController = unlockedScreenOffAnimationController;
|
mUnlockedScreenOffAnimationController = unlockedScreenOffAnimationController;
|
||||||
mLatencyTracker = latencyTracker;
|
mLatencyTracker = latencyTracker;
|
||||||
mActivityLaunchAnimator = activityLaunchAnimator;
|
mActivityLaunchAnimator = activityLaunchAnimator;
|
||||||
|
mAlternateTouchProvider = aternateTouchProvider.orElse(null);
|
||||||
|
|
||||||
mSensorProps = findFirstUdfps();
|
mSensorProps = findFirstUdfps();
|
||||||
// At least one UDFPS sensor exists
|
// At least one UDFPS sensor exists
|
||||||
@@ -782,6 +785,7 @@ public class UdfpsController implements DozeReceiver {
|
|||||||
|
|
||||||
private void onFingerDown(long requestId, int x, int y, float minor, float major) {
|
private void onFingerDown(long requestId, int x, int y, float minor, float major) {
|
||||||
mExecution.assertIsMainThread();
|
mExecution.assertIsMainThread();
|
||||||
|
|
||||||
if (mOverlay == null) {
|
if (mOverlay == null) {
|
||||||
Log.w(TAG, "Null request in onFingerDown");
|
Log.w(TAG, "Null request in onFingerDown");
|
||||||
return;
|
return;
|
||||||
@@ -806,7 +810,11 @@ public class UdfpsController implements DozeReceiver {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
mOnFingerDown = true;
|
mOnFingerDown = true;
|
||||||
mFingerprintManager.onPointerDown(requestId, mSensorProps.sensorId, x, y, minor, major);
|
if (mAlternateTouchProvider != null) {
|
||||||
|
mAlternateTouchProvider.onPointerDown(requestId, x, y, minor, major);
|
||||||
|
} else {
|
||||||
|
mFingerprintManager.onPointerDown(requestId, mSensorProps.sensorId, x, y, minor, major);
|
||||||
|
}
|
||||||
Trace.endAsyncSection("UdfpsController.e2e.onPointerDown", 0);
|
Trace.endAsyncSection("UdfpsController.e2e.onPointerDown", 0);
|
||||||
|
|
||||||
final UdfpsView view = mOverlay.getOverlayView();
|
final UdfpsView view = mOverlay.getOverlayView();
|
||||||
@@ -827,7 +835,11 @@ public class UdfpsController implements DozeReceiver {
|
|||||||
mActivePointerId = -1;
|
mActivePointerId = -1;
|
||||||
mAcquiredReceived = false;
|
mAcquiredReceived = false;
|
||||||
if (mOnFingerDown) {
|
if (mOnFingerDown) {
|
||||||
mFingerprintManager.onPointerUp(requestId, mSensorProps.sensorId);
|
if (mAlternateTouchProvider != null) {
|
||||||
|
mAlternateTouchProvider.onPointerUp(requestId);
|
||||||
|
} else {
|
||||||
|
mFingerprintManager.onPointerUp(requestId, mSensorProps.sensorId);
|
||||||
|
}
|
||||||
for (Callback cb : mCallbacks) {
|
for (Callback cb : mCallbacks) {
|
||||||
cb.onFingerUp();
|
cb.onFingerUp();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ import com.android.systemui.BootCompleteCacheImpl;
|
|||||||
import com.android.systemui.SystemUIFactory;
|
import com.android.systemui.SystemUIFactory;
|
||||||
import com.android.systemui.appops.dagger.AppOpsModule;
|
import com.android.systemui.appops.dagger.AppOpsModule;
|
||||||
import com.android.systemui.assist.AssistModule;
|
import com.android.systemui.assist.AssistModule;
|
||||||
|
import com.android.systemui.biometrics.AlternateUdfpsTouchProvider;
|
||||||
import com.android.systemui.biometrics.UdfpsHbmProvider;
|
import com.android.systemui.biometrics.UdfpsHbmProvider;
|
||||||
import com.android.systemui.biometrics.dagger.BiometricsModule;
|
import com.android.systemui.biometrics.dagger.BiometricsModule;
|
||||||
import com.android.systemui.classifier.FalsingModule;
|
import com.android.systemui.classifier.FalsingModule;
|
||||||
@@ -182,6 +183,9 @@ public abstract class SystemUIModule {
|
|||||||
@BindsOptionalOf
|
@BindsOptionalOf
|
||||||
abstract UdfpsHbmProvider optionalUdfpsHbmProvider();
|
abstract UdfpsHbmProvider optionalUdfpsHbmProvider();
|
||||||
|
|
||||||
|
@BindsOptionalOf
|
||||||
|
abstract AlternateUdfpsTouchProvider optionalUdfpsTouchProvider();
|
||||||
|
|
||||||
@SysUISingleton
|
@SysUISingleton
|
||||||
@Binds
|
@Binds
|
||||||
abstract SystemClock bindSystemClock(SystemClockImpl systemClock);
|
abstract SystemClock bindSystemClock(SystemClockImpl systemClock);
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ import static org.mockito.ArgumentMatchers.any;
|
|||||||
import static org.mockito.ArgumentMatchers.anyBoolean;
|
import static org.mockito.ArgumentMatchers.anyBoolean;
|
||||||
import static org.mockito.ArgumentMatchers.anyFloat;
|
import static org.mockito.ArgumentMatchers.anyFloat;
|
||||||
import static org.mockito.ArgumentMatchers.anyInt;
|
import static org.mockito.ArgumentMatchers.anyInt;
|
||||||
|
import static org.mockito.ArgumentMatchers.anyLong;
|
||||||
import static org.mockito.ArgumentMatchers.anyString;
|
import static org.mockito.ArgumentMatchers.anyString;
|
||||||
import static org.mockito.ArgumentMatchers.eq;
|
import static org.mockito.ArgumentMatchers.eq;
|
||||||
import static org.mockito.Mockito.inOrder;
|
import static org.mockito.Mockito.inOrder;
|
||||||
@@ -183,6 +184,8 @@ public class UdfpsControllerTest extends SysuiTestCase {
|
|||||||
private SystemUIDialogManager mSystemUIDialogManager;
|
private SystemUIDialogManager mSystemUIDialogManager;
|
||||||
@Mock
|
@Mock
|
||||||
private ActivityLaunchAnimator mActivityLaunchAnimator;
|
private ActivityLaunchAnimator mActivityLaunchAnimator;
|
||||||
|
@Mock
|
||||||
|
private AlternateUdfpsTouchProvider mTouchProvider;
|
||||||
|
|
||||||
// Capture listeners so that they can be used to send events
|
// Capture listeners so that they can be used to send events
|
||||||
@Captor private ArgumentCaptor<IUdfpsOverlayController> mOverlayCaptor;
|
@Captor private ArgumentCaptor<IUdfpsOverlayController> mOverlayCaptor;
|
||||||
@@ -256,7 +259,8 @@ public class UdfpsControllerTest extends SysuiTestCase {
|
|||||||
mUnlockedScreenOffAnimationController,
|
mUnlockedScreenOffAnimationController,
|
||||||
mSystemUIDialogManager,
|
mSystemUIDialogManager,
|
||||||
mLatencyTracker,
|
mLatencyTracker,
|
||||||
mActivityLaunchAnimator);
|
mActivityLaunchAnimator,
|
||||||
|
Optional.of(mTouchProvider));
|
||||||
verify(mFingerprintManager).setUdfpsOverlayController(mOverlayCaptor.capture());
|
verify(mFingerprintManager).setUdfpsOverlayController(mOverlayCaptor.capture());
|
||||||
mOverlayController = mOverlayCaptor.getValue();
|
mOverlayController = mOverlayCaptor.getValue();
|
||||||
verify(mScreenLifecycle).addObserver(mScreenObserverCaptor.capture());
|
verify(mScreenLifecycle).addObserver(mScreenObserverCaptor.capture());
|
||||||
@@ -418,9 +422,10 @@ public class UdfpsControllerTest extends SysuiTestCase {
|
|||||||
mTouchListenerCaptor.getValue().onTouch(mUdfpsView, moveEvent);
|
mTouchListenerCaptor.getValue().onTouch(mUdfpsView, moveEvent);
|
||||||
moveEvent.recycle();
|
moveEvent.recycle();
|
||||||
// THEN FingerprintManager is notified about onPointerDown
|
// THEN FingerprintManager is notified about onPointerDown
|
||||||
verify(mFingerprintManager).onPointerDown(eq(TEST_REQUEST_ID),
|
verify(mTouchProvider).onPointerDown(eq(TEST_REQUEST_ID),
|
||||||
eq(mUdfpsController.mSensorProps.sensorId),
|
|
||||||
eq(0), eq(0), eq(0f), eq(0f));
|
eq(0), eq(0), eq(0f), eq(0f));
|
||||||
|
verify(mFingerprintManager, never()).onPointerDown(anyLong(), anyInt(), anyInt(), anyInt(),
|
||||||
|
anyFloat(), anyFloat());
|
||||||
verify(mLatencyTracker).onActionStart(eq(LatencyTracker.ACTION_UDFPS_ILLUMINATE));
|
verify(mLatencyTracker).onActionStart(eq(LatencyTracker.ACTION_UDFPS_ILLUMINATE));
|
||||||
// AND illumination begins
|
// AND illumination begins
|
||||||
verify(mUdfpsView).startIllumination(mOnIlluminatedRunnableCaptor.capture());
|
verify(mUdfpsView).startIllumination(mOnIlluminatedRunnableCaptor.capture());
|
||||||
@@ -447,9 +452,10 @@ public class UdfpsControllerTest extends SysuiTestCase {
|
|||||||
// AND onIlluminatedRunnable that notifies FingerprintManager is set
|
// AND onIlluminatedRunnable that notifies FingerprintManager is set
|
||||||
verify(mUdfpsView).startIllumination(mOnIlluminatedRunnableCaptor.capture());
|
verify(mUdfpsView).startIllumination(mOnIlluminatedRunnableCaptor.capture());
|
||||||
mOnIlluminatedRunnableCaptor.getValue().run();
|
mOnIlluminatedRunnableCaptor.getValue().run();
|
||||||
verify(mFingerprintManager).onPointerDown(eq(TEST_REQUEST_ID),
|
verify(mTouchProvider).onPointerDown(eq(TEST_REQUEST_ID),
|
||||||
eq(mUdfpsController.mSensorProps.sensorId),
|
|
||||||
eq(0), eq(0), eq(3f) /* minor */, eq(2f) /* major */);
|
eq(0), eq(0), eq(3f) /* minor */, eq(2f) /* major */);
|
||||||
|
verify(mFingerprintManager, never()).onPointerDown(anyLong(), anyInt(), anyInt(), anyInt(),
|
||||||
|
anyFloat(), anyFloat());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|||||||
Reference in New Issue
Block a user