summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/hardware/fingerprint/FingerprintManager.java19
-rw-r--r--core/java/android/hardware/fingerprint/FingerprintSensorPropertiesInternal.java14
-rw-r--r--core/java/android/hardware/fingerprint/IFingerprintService.aidl4
-rw-r--r--core/java/android/hardware/fingerprint/ISidefpsController.aidl29
-rw-r--r--packages/SystemUI/res/layout/sidefps_view.xml24
-rw-r--r--packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java20
-rw-r--r--packages/SystemUI/src/com/android/systemui/biometrics/SidefpsController.java182
-rw-r--r--packages/SystemUI/src/com/android/systemui/biometrics/SidefpsView.java87
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthControllerTest.java10
-rw-r--r--services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java10
-rw-r--r--services/core/java/com/android/server/biometrics/sensors/fingerprint/ServiceProvider.java7
-rw-r--r--services/core/java/com/android/server/biometrics/sensors/fingerprint/SidefpsHelper.java60
-rw-r--r--services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintEnrollClient.java14
-rw-r--r--services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java9
-rw-r--r--services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java9
-rw-r--r--services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintEnrollClient.java10
16 files changed, 499 insertions, 9 deletions
diff --git a/core/java/android/hardware/fingerprint/FingerprintManager.java b/core/java/android/hardware/fingerprint/FingerprintManager.java
index 8aeb5cd8f428..e5946663df47 100644
--- a/core/java/android/hardware/fingerprint/FingerprintManager.java
+++ b/core/java/android/hardware/fingerprint/FingerprintManager.java
@@ -85,7 +85,6 @@ import javax.crypto.Mac;
@SystemService(Context.FINGERPRINT_SERVICE)
@RequiresFeature(PackageManager.FEATURE_FINGERPRINT)
public class FingerprintManager implements BiometricAuthenticator, BiometricFingerprintConstants {
-
private static final String TAG = "FingerprintManager";
private static final boolean DEBUG = true;
private static final int MSG_ENROLL_RESULT = 100;
@@ -882,6 +881,24 @@ public class FingerprintManager implements BiometricAuthenticator, BiometricFing
}
/**
+ * @hide
+ */
+ @RequiresPermission(USE_BIOMETRIC_INTERNAL)
+ public void setSidefpsController(@NonNull ISidefpsController controller) {
+ if (mService == null) {
+ Slog.w(TAG, "setSidefpsController: no fingerprint service");
+ return;
+ }
+
+ try {
+ mService.setSidefpsController(controller);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+
+ /**
* Forwards FingerprintStateListener to FingerprintService
* @param listener new FingerprintStateListener being added
* @hide
diff --git a/core/java/android/hardware/fingerprint/FingerprintSensorPropertiesInternal.java b/core/java/android/hardware/fingerprint/FingerprintSensorPropertiesInternal.java
index 4ffe5f189661..45c6b290be11 100644
--- a/core/java/android/hardware/fingerprint/FingerprintSensorPropertiesInternal.java
+++ b/core/java/android/hardware/fingerprint/FingerprintSensorPropertiesInternal.java
@@ -16,6 +16,7 @@
package android.hardware.fingerprint;
+import static android.hardware.fingerprint.FingerprintSensorProperties.TYPE_POWER_BUTTON;
import static android.hardware.fingerprint.FingerprintSensorProperties.TYPE_UDFPS_OPTICAL;
import static android.hardware.fingerprint.FingerprintSensorProperties.TYPE_UDFPS_ULTRASONIC;
@@ -136,6 +137,19 @@ public class FingerprintSensorPropertiesInternal extends SensorPropertiesInterna
}
}
+ /**
+ * Returns if sensor type is side-FPS
+ * @return true if sensor is side-fps, false otherwise
+ */
+ public boolean isAnySidefpsType() {
+ switch (sensorType) {
+ case TYPE_POWER_BUTTON:
+ return true;
+ default:
+ return false;
+ }
+ }
+
@Override
public String toString() {
return "ID: " + sensorId + ", Strength: " + sensorStrength + ", Type: " + sensorType;
diff --git a/core/java/android/hardware/fingerprint/IFingerprintService.aidl b/core/java/android/hardware/fingerprint/IFingerprintService.aidl
index 936f3d6b2788..3979afe80d17 100644
--- a/core/java/android/hardware/fingerprint/IFingerprintService.aidl
+++ b/core/java/android/hardware/fingerprint/IFingerprintService.aidl
@@ -25,6 +25,7 @@ import android.hardware.fingerprint.IFingerprintAuthenticatorsRegisteredCallback
import android.hardware.fingerprint.IFingerprintServiceReceiver;
import android.hardware.fingerprint.IFingerprintStateListener;
import android.hardware.fingerprint.IUdfpsOverlayController;
+import android.hardware.fingerprint.ISidefpsController;
import android.hardware.fingerprint.Fingerprint;
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
import java.util.List;
@@ -166,6 +167,9 @@ interface IFingerprintService {
// Sets the controller for managing the UDFPS overlay.
void setUdfpsOverlayController(in IUdfpsOverlayController controller);
+ // Sets the controller for managing the SideFPS overlay.
+ void setSidefpsController(in ISidefpsController controller);
+
// Registers FingerprintStateListener in list stored by FingerprintService.
void registerFingerprintStateListener(IFingerprintStateListener listener);
}
diff --git a/core/java/android/hardware/fingerprint/ISidefpsController.aidl b/core/java/android/hardware/fingerprint/ISidefpsController.aidl
new file mode 100644
index 000000000000..00f40048cbae
--- /dev/null
+++ b/core/java/android/hardware/fingerprint/ISidefpsController.aidl
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2021 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 android.hardware.fingerprint;
+
+/**
+ * Interface for interacting with the side fingerprint sensor (side-fps) overlay.
+ * @hide
+ */
+oneway interface ISidefpsController {
+
+ // Shows the overlay.
+ void show();
+
+ // Hides the overlay.
+ void hide();
+}
diff --git a/packages/SystemUI/res/layout/sidefps_view.xml b/packages/SystemUI/res/layout/sidefps_view.xml
new file mode 100644
index 000000000000..397763531eb9
--- /dev/null
+++ b/packages/SystemUI/res/layout/sidefps_view.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2021 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.
+ -->
+<com.android.systemui.biometrics.SidefpsView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:systemui="http://schemas.android.com/apk/res-auto"
+ android:id="@+id/sidefps_view"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:contentDescription="@string/accessibility_fingerprint_label">
+</com.android.systemui.biometrics.SidefpsView>
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java
index 179b077a3714..6db44edcde70 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java
@@ -83,6 +83,7 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks,
@Nullable private final FingerprintManager mFingerprintManager;
@Nullable private final FaceManager mFaceManager;
private final Provider<UdfpsController> mUdfpsControllerFactory;
+ private final Provider<SidefpsController> mSidefpsControllerFactory;
@Nullable private final PointF mFaceAuthSensorLocation;
// TODO: These should just be saved from onSaveState
@@ -93,6 +94,8 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks,
private WindowManager mWindowManager;
@Nullable
private UdfpsController mUdfpsController;
+ @Nullable
+ private SidefpsController mSidefpsController;
@VisibleForTesting
TaskStackListener mTaskStackListener;
@VisibleForTesting
@@ -100,6 +103,7 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks,
@Nullable private final List<FaceSensorPropertiesInternal> mFaceProps;
@Nullable private List<FingerprintSensorPropertiesInternal> mFpProps;
@Nullable private List<FingerprintSensorPropertiesInternal> mUdfpsProps;
+ @Nullable private List<FingerprintSensorPropertiesInternal> mSidefpsProps;
private class BiometricTaskStackListener extends TaskStackListener {
@Override
@@ -120,15 +124,23 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks,
}
mFpProps = sensors;
List<FingerprintSensorPropertiesInternal> udfpsProps = new ArrayList<>();
+ List<FingerprintSensorPropertiesInternal> sidefpsProps = new ArrayList<>();
for (FingerprintSensorPropertiesInternal props : mFpProps) {
if (props.isAnyUdfpsType()) {
udfpsProps.add(props);
}
+ if (props.isAnySidefpsType()) {
+ sidefpsProps.add(props);
+ }
}
mUdfpsProps = !udfpsProps.isEmpty() ? udfpsProps : null;
if (mUdfpsProps != null) {
mUdfpsController = mUdfpsControllerFactory.get();
}
+ mSidefpsProps = !sidefpsProps.isEmpty() ? sidefpsProps : null;
+ if (mSidefpsProps != null) {
+ mSidefpsController = mSidefpsControllerFactory.get();
+ }
}
};
@@ -364,7 +376,8 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks,
ActivityTaskManager activityTaskManager,
@Nullable FingerprintManager fingerprintManager,
@Nullable FaceManager faceManager,
- Provider<UdfpsController> udfpsControllerFactory) {
+ Provider<UdfpsController> udfpsControllerFactory,
+ Provider<SidefpsController> sidefpsControllerFactory) {
super(context);
mCommandQueue = commandQueue;
mStatusBarStateController = statusBarStateController;
@@ -372,6 +385,7 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks,
mFingerprintManager = fingerprintManager;
mFaceManager = faceManager;
mUdfpsControllerFactory = udfpsControllerFactory;
+ mSidefpsControllerFactory = sidefpsControllerFactory;
mFaceProps = mFaceManager != null ? mFaceManager.getSensorPropertiesInternal() : null;
@@ -618,6 +632,10 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks,
mUdfpsController.onConfigurationChanged();
}
+ if (mSidefpsController != null) {
+ mSidefpsController.onConfigurationChanged();
+ }
+
// Save the state of the current dialog (buttons showing, etc)
if (mCurrentDialog != null) {
final Bundle savedState = new Bundle();
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/SidefpsController.java b/packages/SystemUI/src/com/android/systemui/biometrics/SidefpsController.java
new file mode 100644
index 000000000000..7fc67bcf79e0
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/SidefpsController.java
@@ -0,0 +1,182 @@
+/*
+ * Copyright (C) 2021 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;
+
+import static com.android.internal.util.Preconditions.checkArgument;
+import static com.android.internal.util.Preconditions.checkNotNull;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.content.Context;
+import android.graphics.PixelFormat;
+import android.hardware.fingerprint.FingerprintManager;
+import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
+import android.hardware.fingerprint.ISidefpsController;
+import android.util.Log;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.WindowManager;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.systemui.R;
+import com.android.systemui.dagger.SysUISingleton;
+import com.android.systemui.dagger.qualifiers.Main;
+import com.android.systemui.util.concurrency.DelayableExecutor;
+
+import javax.inject.Inject;
+
+/**
+ * Shows and hides the side fingerprint sensor (side-fps) overlay and handles side fps touch events.
+ */
+@SysUISingleton
+public class SidefpsController {
+ private static final String TAG = "SidefpsController";
+ // TODO (b/188690214): define and retrieve values from framework via SensorProps
+ static final int DISPLAY_HEIGHT = 1804;
+ static final int DISPLAY_WIDTH = 2208;
+ static final int SFPS_INDICATOR_HEIGHT = 225;
+ static final int SFPS_Y = 500;
+ static final int SFPS_INDICATOR_WIDTH = 50;
+
+ @Nullable private SidefpsView mView;
+ private final FingerprintManager mFingerprintManager;
+ private final Context mContext;
+ @NonNull private final LayoutInflater mInflater;
+ private final WindowManager mWindowManager;
+ private final DelayableExecutor mFgExecutor;
+ private boolean mIsVisible = false;
+
+ @NonNull
+ private final ISidefpsController mSidefpsControllerImpl = new ISidefpsController.Stub() {
+ @Override
+ public void show() {
+ mFgExecutor.execute(() -> {
+ SidefpsController.this.show();
+ mIsVisible = true;
+ });
+ }
+
+ @Override
+ public void hide() {
+ mFgExecutor.execute(() -> {
+ SidefpsController.this.hide();
+ mIsVisible = false;
+ });
+ }
+ };
+
+ @VisibleForTesting
+ final FingerprintSensorPropertiesInternal mSensorProps;
+ private final WindowManager.LayoutParams mCoreLayoutParams;
+
+ @Inject
+ public SidefpsController(@NonNull Context context,
+ @NonNull LayoutInflater inflater,
+ @Nullable FingerprintManager fingerprintManager,
+ @NonNull WindowManager windowManager,
+ @Main DelayableExecutor fgExecutor) {
+ mContext = context;
+ mInflater = inflater;
+ mFingerprintManager = checkNotNull(fingerprintManager);
+ mWindowManager = windowManager;
+ mFgExecutor = fgExecutor;
+
+ mSensorProps = findFirstSidefps();
+ checkArgument(mSensorProps != null);
+
+ mCoreLayoutParams = new WindowManager.LayoutParams(
+ WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG,
+ getCoreLayoutParamFlags(),
+ PixelFormat.TRANSLUCENT);
+ mCoreLayoutParams.setTitle(TAG);
+ // Overrides default, avoiding status bars during layout
+ mCoreLayoutParams.setFitInsetsTypes(0);
+ mCoreLayoutParams.gravity = Gravity.TOP | Gravity.LEFT;
+ mCoreLayoutParams.layoutInDisplayCutoutMode =
+ WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
+ mCoreLayoutParams.privateFlags = WindowManager.LayoutParams.PRIVATE_FLAG_TRUSTED_OVERLAY;
+
+ mFingerprintManager.setSidefpsController(mSidefpsControllerImpl);
+ }
+
+ void show() {
+ mView = (SidefpsView) mInflater.inflate(R.layout.sidefps_view, null, false);
+ mView.setSensorProperties(mSensorProps);
+ mWindowManager.addView(mView, computeLayoutParams());
+
+ }
+
+ void hide() {
+ if (mView != null) {
+ Log.v(TAG, "hideUdfpsOverlay | removing window");
+ mWindowManager.removeView(mView);
+ mView.setOnTouchListener(null);
+ mView.setOnHoverListener(null);
+ mView = null;
+ } else {
+ Log.v(TAG, "hideUdfpsOverlay | the overlay is already hidden");
+ }
+ }
+
+ void onConfigurationChanged() {
+ // If overlay was hidden, it should remain hidden
+ if (!mIsVisible) {
+ return;
+ }
+ // If the overlay needs to be shown, destroy the current overlay, and re-create and show
+ // the overlay with the updated LayoutParams.
+ hide();
+ show();
+ }
+
+ @Nullable
+ private FingerprintSensorPropertiesInternal findFirstSidefps() {
+ for (FingerprintSensorPropertiesInternal props :
+ mFingerprintManager.getSensorPropertiesInternal()) {
+ if (props.isAnySidefpsType()) {
+ return props;
+ }
+ }
+ return null;
+ }
+
+ private int getCoreLayoutParamFlags() {
+ return WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
+ | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
+ | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
+ | WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED;
+ }
+
+ /**
+ * Computes layout params depending on orientation & folding configuration of device
+ */
+ private WindowManager.LayoutParams computeLayoutParams() {
+ mCoreLayoutParams.flags = getCoreLayoutParamFlags();
+
+ // Default dimensions assume portrait mode.
+ mCoreLayoutParams.x = DISPLAY_WIDTH - SFPS_INDICATOR_WIDTH;
+ mCoreLayoutParams.y = SFPS_Y;
+ mCoreLayoutParams.height = SFPS_INDICATOR_HEIGHT;
+ mCoreLayoutParams.width = SFPS_INDICATOR_WIDTH;
+
+ /*
+ TODO (b/188692405): recalculate coordinates for non-portrait configurations and folding
+ states
+ */
+ return mCoreLayoutParams;
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/SidefpsView.java b/packages/SystemUI/src/com/android/systemui/biometrics/SidefpsView.java
new file mode 100644
index 000000000000..b9e9b596f54a
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/SidefpsView.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2021 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;
+
+import static com.android.systemui.biometrics.SidefpsController.SFPS_INDICATOR_HEIGHT;
+import static com.android.systemui.biometrics.SidefpsController.SFPS_INDICATOR_WIDTH;
+
+import android.annotation.NonNull;
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.graphics.RectF;
+import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
+import android.util.AttributeSet;
+import android.widget.FrameLayout;
+
+/**
+ * A view containing a normal drawable view for sidefps events.
+ */
+public class SidefpsView extends FrameLayout {
+ private static final String TAG = "SidefpsView";
+ @NonNull private final RectF mSensorRect;
+ @NonNull private final Paint mSensorRectPaint;
+ @NonNull private final Paint mPointerText;
+ private static final int POINTER_SIZE_PX = 50;
+
+ // Used to obtain the sensor location.
+ @NonNull private FingerprintSensorPropertiesInternal mSensorProps;
+
+ public SidefpsView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ super.setWillNotDraw(false);
+
+ mPointerText = new Paint(0 /* flags */);
+ mPointerText.setAntiAlias(true);
+ mPointerText.setColor(Color.WHITE);
+ mPointerText.setTextSize(POINTER_SIZE_PX);
+
+ mSensorRect = new RectF();
+ mSensorRectPaint = new Paint(0 /* flags */);
+ mSensorRectPaint.setAntiAlias(true);
+ mSensorRectPaint.setColor(Color.BLUE);
+ mSensorRectPaint.setStyle(Paint.Style.FILL);
+ }
+
+ void setSensorProperties(@NonNull FingerprintSensorPropertiesInternal properties) {
+ mSensorProps = properties;
+ }
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ super.onDraw(canvas);
+ canvas.drawRect(mSensorRect, mSensorRectPaint);
+ canvas.drawText(
+ ">",
+ SFPS_INDICATOR_WIDTH / 2 - 10, // TODO(b/188690214): retrieve from sensorProps
+ SFPS_INDICATOR_HEIGHT / 2 + 30, //TODO(b/188690214): retrieve from sensorProps
+ mPointerText
+ );
+ }
+
+ @Override
+ protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
+ super.onLayout(changed, left, top, right, bottom);
+
+ mSensorRect.set(
+ 0,
+ 0,
+ SFPS_INDICATOR_WIDTH, //TODO(b/188690214): retrieve from sensorProps
+ SFPS_INDICATOR_HEIGHT); //TODO(b/188690214): retrieve from sensorProps
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthControllerTest.java
index 1b464a9b971b..47fdcaf39784 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthControllerTest.java
@@ -103,6 +103,8 @@ public class AuthControllerTest extends SysuiTestCase {
private FaceManager mFaceManager;
@Mock
private UdfpsController mUdfpsController;
+ @Mock
+ private SidefpsController mSidefpsController;
@Captor
ArgumentCaptor<IFingerprintAuthenticatorsRegisteredCallback> mAuthenticatorsRegisteredCaptor;
@@ -149,7 +151,7 @@ public class AuthControllerTest extends SysuiTestCase {
mAuthController = new TestableAuthController(context, mCommandQueue,
mStatusBarStateController, mActivityTaskManager, mFingerprintManager, mFaceManager,
- () -> mUdfpsController);
+ () -> mUdfpsController, () -> mSidefpsController);
mAuthController.start();
verify(mFingerprintManager).addAuthenticatorsRegisteredCallback(
@@ -560,9 +562,11 @@ public class AuthControllerTest extends SysuiTestCase {
ActivityTaskManager activityTaskManager,
FingerprintManager fingerprintManager,
FaceManager faceManager,
- Provider<UdfpsController> udfpsControllerFactory) {
+ Provider<UdfpsController> udfpsControllerFactory,
+ Provider<SidefpsController> sidefpsControllerFactory) {
super(context, commandQueue, statusBarStateController, activityTaskManager,
- fingerprintManager, faceManager, udfpsControllerFactory);
+ fingerprintManager, faceManager, udfpsControllerFactory,
+ sidefpsControllerFactory);
}
@Override
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java
index 6382950711ce..54abc639ad55 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java
@@ -55,6 +55,7 @@ import android.hardware.fingerprint.IFingerprintClientActiveCallback;
import android.hardware.fingerprint.IFingerprintService;
import android.hardware.fingerprint.IFingerprintServiceReceiver;
import android.hardware.fingerprint.IFingerprintStateListener;
+import android.hardware.fingerprint.ISidefpsController;
import android.hardware.fingerprint.IUdfpsOverlayController;
import android.os.Binder;
import android.os.Build;
@@ -946,6 +947,15 @@ public class FingerprintService extends SystemService {
}
@Override
+ public void setSidefpsController(@NonNull ISidefpsController controller) {
+ Utils.checkPermission(getContext(), USE_BIOMETRIC_INTERNAL);
+
+ for (ServiceProvider provider : mServiceProviders) {
+ provider.setSidefpsController(controller);
+ }
+ }
+
+ @Override
public void registerFingerprintStateListener(@NonNull IFingerprintStateListener listener) {
FingerprintService.this.registerFingerprintStateListener(listener);
}
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/ServiceProvider.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/ServiceProvider.java
index 4cbe031d0141..3a214f44c0a8 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/ServiceProvider.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/ServiceProvider.java
@@ -25,6 +25,7 @@ import android.hardware.fingerprint.Fingerprint;
import android.hardware.fingerprint.FingerprintManager;
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
import android.hardware.fingerprint.IFingerprintServiceReceiver;
+import android.hardware.fingerprint.ISidefpsController;
import android.hardware.fingerprint.IUdfpsOverlayController;
import android.os.IBinder;
import android.util.proto.ProtoOutputStream;
@@ -144,6 +145,12 @@ public interface ServiceProvider {
void setUdfpsOverlayController(@NonNull IUdfpsOverlayController controller);
+ /**
+ * Sets side-fps controller
+ * @param controller side-fps controller
+ */
+ void setSidefpsController(@NonNull ISidefpsController controller);
+
void dumpProtoState(int sensorId, @NonNull ProtoOutputStream proto,
boolean clearSchedulerBuffer);
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/SidefpsHelper.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/SidefpsHelper.java
new file mode 100644
index 000000000000..474066c227d2
--- /dev/null
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/SidefpsHelper.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2020 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.server.biometrics.sensors.fingerprint;
+
+import android.annotation.Nullable;
+import android.hardware.fingerprint.ISidefpsController;
+import android.os.RemoteException;
+import android.util.Slog;
+
+/**
+ * Contains helper methods for side-fps fingerprint controller.
+ */
+public class SidefpsHelper {
+ private static final String TAG = "SidefpsHelper";
+
+ /**
+ * Shows the side-fps affordance
+ * @param sidefpsController controller that shows and hides the side-fps affordance
+ */
+ public static void showOverlay(@Nullable ISidefpsController sidefpsController) {
+ if (sidefpsController == null) {
+ return;
+ }
+
+ try {
+ sidefpsController.show();
+ } catch (RemoteException e) {
+ Slog.e(TAG, "Remote exception when showing the side-fps overlay", e);
+ }
+ }
+
+ /**
+ * Hides the side-fps affordance
+ * @param sidefpsController controller that shows and hides the side-fps affordance
+ */
+ public static void hideOverlay(@Nullable ISidefpsController sidefpsController) {
+ if (sidefpsController == null) {
+ return;
+ }
+ try {
+ sidefpsController.hide();
+ } catch (RemoteException e) {
+ Slog.e(TAG, "Remote exception when hiding the side-fps overlay", e);
+ }
+ }
+}
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintEnrollClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintEnrollClient.java
index 790b38c07bf5..ed886fe166e0 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintEnrollClient.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintEnrollClient.java
@@ -26,6 +26,7 @@ import android.hardware.biometrics.common.ICancellationSignal;
import android.hardware.biometrics.fingerprint.ISession;
import android.hardware.fingerprint.Fingerprint;
import android.hardware.fingerprint.FingerprintManager;
+import android.hardware.fingerprint.ISidefpsController;
import android.hardware.fingerprint.IUdfpsOverlayController;
import android.os.IBinder;
import android.os.RemoteException;
@@ -36,6 +37,7 @@ import com.android.server.biometrics.sensors.BiometricUtils;
import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
import com.android.server.biometrics.sensors.EnrollClient;
import com.android.server.biometrics.sensors.fingerprint.FingerprintUtils;
+import com.android.server.biometrics.sensors.fingerprint.SidefpsHelper;
import com.android.server.biometrics.sensors.fingerprint.Udfps;
import com.android.server.biometrics.sensors.fingerprint.UdfpsHelper;
@@ -44,6 +46,8 @@ class FingerprintEnrollClient extends EnrollClient<ISession> implements Udfps {
private static final String TAG = "FingerprintEnrollClient";
@Nullable private final IUdfpsOverlayController mUdfpsOverlayController;
+ @Nullable private final ISidefpsController mSidefpsController;
+
private final @FingerprintManager.EnrollReason int mEnrollReason;
@Nullable private ICancellationSignal mCancellationSignal;
private final int mMaxTemplatesPerUser;
@@ -53,12 +57,14 @@ class FingerprintEnrollClient extends EnrollClient<ISession> implements Udfps {
@NonNull ClientMonitorCallbackConverter listener, int userId,
@NonNull byte[] hardwareAuthToken, @NonNull String owner,
@NonNull BiometricUtils<Fingerprint> utils, int sensorId,
- @Nullable IUdfpsOverlayController udfpsOvelayController, int maxTemplatesPerUser,
- @FingerprintManager.EnrollReason int enrollReason) {
+ @Nullable IUdfpsOverlayController udfpsOvelayController,
+ @Nullable ISidefpsController sidefpsController,
+ int maxTemplatesPerUser, @FingerprintManager.EnrollReason int enrollReason) {
super(context, lazyDaemon, token, listener, userId, hardwareAuthToken, owner, utils,
0 /* timeoutSec */, BiometricsProtoEnums.MODALITY_FINGERPRINT, sensorId,
true /* shouldVibrate */);
mUdfpsOverlayController = udfpsOvelayController;
+ mSidefpsController = sidefpsController;
mMaxTemplatesPerUser = maxTemplatesPerUser;
mEnrollReason = enrollReason;
@@ -75,6 +81,7 @@ class FingerprintEnrollClient extends EnrollClient<ISession> implements Udfps {
if (remaining == 0) {
UdfpsHelper.hideUdfpsOverlay(getSensorId(), mUdfpsOverlayController);
+ SidefpsHelper.hideOverlay(mSidefpsController);
}
}
@@ -93,6 +100,7 @@ class FingerprintEnrollClient extends EnrollClient<ISession> implements Udfps {
super.onError(errorCode, vendorCode);
UdfpsHelper.hideUdfpsOverlay(getSensorId(), mUdfpsOverlayController);
+ SidefpsHelper.hideOverlay(mSidefpsController);
}
@Override
@@ -105,6 +113,7 @@ class FingerprintEnrollClient extends EnrollClient<ISession> implements Udfps {
@Override
protected void stopHalOperation() {
UdfpsHelper.hideUdfpsOverlay(getSensorId(), mUdfpsOverlayController);
+ SidefpsHelper.hideOverlay(mSidefpsController);
if (mCancellationSignal != null) {
try {
mCancellationSignal.cancel();
@@ -122,6 +131,7 @@ class FingerprintEnrollClient extends EnrollClient<ISession> implements Udfps {
UdfpsHelper.showUdfpsOverlay(getSensorId(),
UdfpsHelper.getReasonFromEnrollReason(mEnrollReason),
mUdfpsOverlayController, this);
+ SidefpsHelper.showOverlay(mSidefpsController);
try {
mCancellationSignal = getFreshDaemon().enroll(
HardwareAuthTokenUtils.toHardwareAuthToken(mHardwareAuthToken));
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java
index e5fafcd1bd3b..14024d0e7478 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java
@@ -36,6 +36,7 @@ import android.hardware.fingerprint.Fingerprint;
import android.hardware.fingerprint.FingerprintManager;
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
import android.hardware.fingerprint.IFingerprintServiceReceiver;
+import android.hardware.fingerprint.ISidefpsController;
import android.hardware.fingerprint.IUdfpsOverlayController;
import android.os.Binder;
import android.os.Handler;
@@ -90,6 +91,7 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi
@Nullable private IFingerprint mDaemon;
@Nullable private IUdfpsOverlayController mUdfpsOverlayController;
+ @Nullable private ISidefpsController mSidefpsController;
private final class BiometricTaskStackListener extends TaskStackListener {
@Override
@@ -330,7 +332,7 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi
mSensors.get(sensorId).getLazySession(), token,
new ClientMonitorCallbackConverter(receiver), userId, hardwareAuthToken,
opPackageName, FingerprintUtils.getInstance(sensorId), sensorId,
- mUdfpsOverlayController, maxTemplatesPerUser, enrollReason);
+ mUdfpsOverlayController, mSidefpsController, maxTemplatesPerUser, enrollReason);
scheduleForSensor(sensorId, client, new BaseClientMonitor.Callback() {
@Override
@@ -531,6 +533,11 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi
}
@Override
+ public void setSidefpsController(@NonNull ISidefpsController controller) {
+ mSidefpsController = controller;
+ }
+
+ @Override
public void dumpProtoState(int sensorId, @NonNull ProtoOutputStream proto,
boolean clearSchedulerBuffer) {
if (mSensors.contains(sensorId)) {
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java
index 33532643b719..102aeccc6bbe 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java
@@ -37,6 +37,7 @@ import android.hardware.fingerprint.FingerprintManager;
import android.hardware.fingerprint.FingerprintSensorProperties;
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
import android.hardware.fingerprint.IFingerprintServiceReceiver;
+import android.hardware.fingerprint.ISidefpsController;
import android.hardware.fingerprint.IUdfpsOverlayController;
import android.os.Handler;
import android.os.IBinder;
@@ -113,6 +114,7 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider
@Nullable private IBiometricsFingerprint mDaemon;
@NonNull private final HalResultController mHalResultController;
@Nullable private IUdfpsOverlayController mUdfpsOverlayController;
+ @Nullable private ISidefpsController mSidefpsController;
private int mCurrentUserId = UserHandle.USER_NULL;
private final boolean mIsUdfps;
private final int mSensorId;
@@ -558,7 +560,7 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider
mLazyDaemon, token, new ClientMonitorCallbackConverter(receiver), userId,
hardwareAuthToken, opPackageName, FingerprintUtils.getLegacyInstance(mSensorId),
ENROLL_TIMEOUT_SEC, mSensorProperties.sensorId, mUdfpsOverlayController,
- enrollReason);
+ mSidefpsController, enrollReason);
mScheduler.scheduleClientMonitor(client, new BaseClientMonitor.Callback() {
@Override
public void onClientStarted(@NonNull BaseClientMonitor clientMonitor) {
@@ -754,6 +756,11 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider
}
@Override
+ public void setSidefpsController(@NonNull ISidefpsController controller) {
+ mSidefpsController = controller;
+ }
+
+ @Override
public void dumpProtoState(int sensorId, @NonNull ProtoOutputStream proto,
boolean clearSchedulerBuffer) {
final long sensorToken = proto.start(SensorServiceStateProto.SENSOR_STATES);
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintEnrollClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintEnrollClient.java
index 4265f4082ff4..4f3e930c4e88 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintEnrollClient.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintEnrollClient.java
@@ -25,6 +25,7 @@ import android.hardware.biometrics.BiometricsProtoEnums;
import android.hardware.biometrics.fingerprint.V2_1.IBiometricsFingerprint;
import android.hardware.fingerprint.Fingerprint;
import android.hardware.fingerprint.FingerprintManager;
+import android.hardware.fingerprint.ISidefpsController;
import android.hardware.fingerprint.IUdfpsOverlayController;
import android.os.IBinder;
import android.os.RemoteException;
@@ -33,6 +34,7 @@ import android.util.Slog;
import com.android.server.biometrics.sensors.BiometricUtils;
import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
import com.android.server.biometrics.sensors.EnrollClient;
+import com.android.server.biometrics.sensors.fingerprint.SidefpsHelper;
import com.android.server.biometrics.sensors.fingerprint.Udfps;
import com.android.server.biometrics.sensors.fingerprint.UdfpsHelper;
@@ -47,6 +49,7 @@ public class FingerprintEnrollClient extends EnrollClient<IBiometricsFingerprint
private static final String TAG = "FingerprintEnrollClient";
@Nullable private final IUdfpsOverlayController mUdfpsOverlayController;
+ @Nullable private final ISidefpsController mSidefpsController;
private final @FingerprintManager.EnrollReason int mEnrollReason;
FingerprintEnrollClient(@NonNull Context context,
@@ -55,11 +58,13 @@ public class FingerprintEnrollClient extends EnrollClient<IBiometricsFingerprint
@NonNull byte[] hardwareAuthToken, @NonNull String owner,
@NonNull BiometricUtils<Fingerprint> utils, int timeoutSec, int sensorId,
@Nullable IUdfpsOverlayController udfpsOverlayController,
+ @Nullable ISidefpsController sidefpsController,
@FingerprintManager.EnrollReason int enrollReason) {
super(context, lazyDaemon, token, listener, userId, hardwareAuthToken, owner, utils,
timeoutSec, BiometricsProtoEnums.MODALITY_FINGERPRINT, sensorId,
true /* shouldVibrate */);
mUdfpsOverlayController = udfpsOverlayController;
+ mSidefpsController = sidefpsController;
mEnrollReason = enrollReason;
if (enrollReason == FingerprintManager.ENROLL_FIND_SENSOR) {
@@ -85,6 +90,7 @@ public class FingerprintEnrollClient extends EnrollClient<IBiometricsFingerprint
UdfpsHelper.showUdfpsOverlay(getSensorId(),
UdfpsHelper.getReasonFromEnrollReason(mEnrollReason),
mUdfpsOverlayController, this);
+ SidefpsHelper.showOverlay(mSidefpsController);
try {
// GroupId was never used. In fact, groupId is always the same as userId.
getFreshDaemon().enroll(mHardwareAuthToken, getTargetUserId(), mTimeoutSec);
@@ -93,6 +99,7 @@ public class FingerprintEnrollClient extends EnrollClient<IBiometricsFingerprint
onError(BiometricFingerprintConstants.FINGERPRINT_ERROR_HW_UNAVAILABLE,
0 /* vendorCode */);
UdfpsHelper.hideUdfpsOverlay(getSensorId(), mUdfpsOverlayController);
+ SidefpsHelper.hideOverlay(mSidefpsController);
mCallback.onClientFinished(this, false /* success */);
}
}
@@ -100,6 +107,7 @@ public class FingerprintEnrollClient extends EnrollClient<IBiometricsFingerprint
@Override
protected void stopHalOperation() {
UdfpsHelper.hideUdfpsOverlay(getSensorId(), mUdfpsOverlayController);
+ SidefpsHelper.hideOverlay(mSidefpsController);
try {
getFreshDaemon().cancel();
} catch (RemoteException e) {
@@ -118,6 +126,7 @@ public class FingerprintEnrollClient extends EnrollClient<IBiometricsFingerprint
if (remaining == 0) {
UdfpsHelper.hideUdfpsOverlay(getSensorId(), mUdfpsOverlayController);
+ SidefpsHelper.hideOverlay(mSidefpsController);
}
}
@@ -135,6 +144,7 @@ public class FingerprintEnrollClient extends EnrollClient<IBiometricsFingerprint
super.onError(errorCode, vendorCode);
UdfpsHelper.hideUdfpsOverlay(getSensorId(), mUdfpsOverlayController);
+ SidefpsHelper.hideOverlay(mSidefpsController);
}
@Override