Loading core/java/android/hardware/fingerprint/IUdfpsHbmListener.aidl +2 −13 Original line number Diff line number Diff line Loading @@ -24,31 +24,20 @@ package android.hardware.fingerprint; * @hide */ oneway interface IUdfpsHbmListener { /** HBM that applies to the whole screen. */ const int GLOBAL_HBM = 0; /** HBM that only applies to a portion of the screen. */ const int LOCAL_HBM = 1; /** * UdfpsController will call this method when the HBM is enabled. * * @param hbmType The type of HBM that was enabled. See * {@link com.android.systemui.biometrics.UdfpsHbmTypes}. * @param displayId The displayId for which the HBM is enabled. See * {@link android.view.Display#getDisplayId()}. */ void onHbmEnabled(int hbmType, int displayId); void onHbmEnabled(int displayId); /** * UdfpsController will call this method when the HBM is disabled. * * @param hbmType The type of HBM that was disabled. See * {@link com.android.systemui.biometrics.UdfpsHbmTypes}. * @param displayId The displayId for which the HBM is disabled. See * {@link android.view.Display#getDisplayId()}. */ void onHbmDisabled(int hbmType, int displayId); void onHbmDisabled(int displayId); } packages/SystemUI/res/layout/udfps_view.xml +0 −6 Original line number Diff line number Diff line Loading @@ -28,10 +28,4 @@ android:layout_width="match_parent" android:layout_height="match_parent"/> <com.android.systemui.biometrics.UdfpsSurfaceView android:id="@+id/hbm_view" android:layout_width="match_parent" android:layout_height="match_parent" android:visibility="invisible"/> </com.android.systemui.biometrics.UdfpsView> packages/SystemUI/src/com/android/systemui/biometrics/UdfpsHbmProvider.java +6 −12 Original line number Diff line number Diff line Loading @@ -17,9 +17,6 @@ package com.android.systemui.biometrics; import android.annotation.Nullable; import android.view.Surface; import com.android.systemui.biometrics.UdfpsHbmTypes.HbmType; /** * Interface for controlling the high-brightness mode (HBM). UdfpsView can use this callback to Loading @@ -36,24 +33,21 @@ public interface UdfpsHbmProvider { * This method must be called from the UI thread. The callback, if provided, will also be * invoked from the UI thread. * * @param hbmType The type of HBM that should be enabled. See {@link UdfpsHbmTypes}. * @param surface The surface for which the HBM is requested, in case the HBM implementation * needs to set special surface flags to enable the HBM. Can be null. * @param onHbmEnabled A runnable that will be executed once HBM is enabled. */ void enableHbm(@HbmType int hbmType, @Nullable Surface surface, @Nullable Runnable onHbmEnabled); void enableHbm(@Nullable Runnable onHbmEnabled); /** * UdfpsView will call this to disable the HBM when the illumination is not longer needed. * UdfpsView will call this to disable HBM when illumination is no longer needed. * * This method is a no-op when HBM is already disabled. If HBM is enabled, this method will * disable HBM for the {@code hbmType} and {@code surface} that were provided to the * corresponding {@link #enableHbm(int, Surface, Runnable)}. * This method will disable HBM if HBM is enabled. Otherwise, if HBM is already disabled, * this method is a no-op. * * The call must be made from the UI thread. The callback, if provided, will also be invoked * from the UI thread. * * * * @param onHbmDisabled A runnable that will be executed once HBM is disabled. */ void disableHbm(@Nullable Runnable onHbmDisabled); Loading packages/SystemUI/src/com/android/systemui/biometrics/UdfpsHbmTypes.javadeleted 100644 → 0 +0 −39 Original line number Diff line number Diff line /* * 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 android.annotation.IntDef; import android.hardware.fingerprint.IUdfpsHbmListener; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; /** * Different high-brightness mode (HBM) types that are relevant to this package. */ public final class UdfpsHbmTypes { /** HBM that applies to the whole screen. */ public static final int GLOBAL_HBM = IUdfpsHbmListener.GLOBAL_HBM; /** HBM that only applies to a portion of the screen. */ public static final int LOCAL_HBM = IUdfpsHbmListener.LOCAL_HBM; @Retention(RetentionPolicy.SOURCE) @IntDef({GLOBAL_HBM, LOCAL_HBM}) public @interface HbmType { } } packages/SystemUI/src/com/android/systemui/biometrics/UdfpsSurfaceView.javadeleted 100644 → 0 +0 −145 Original line number Diff line number Diff line /* * 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 android.annotation.NonNull; import android.annotation.Nullable; import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.PixelFormat; import android.graphics.RectF; import android.util.AttributeSet; import android.util.Log; import android.view.Surface; import android.view.SurfaceHolder; import android.view.SurfaceView; /** * Surface View for providing the Global High-Brightness Mode (GHBM) illumination for UDFPS. */ public class UdfpsSurfaceView extends SurfaceView implements SurfaceHolder.Callback { private static final String TAG = "UdfpsSurfaceView"; /** * Notifies {@link UdfpsView} when to enable GHBM illumination. */ interface GhbmIlluminationListener { /** * @param surface the surface for which GHBM should be enabled. * @param onIlluminatedRunnable a runnable that should be run after GHBM is enabled. */ void enableGhbm(@NonNull Surface surface, @Nullable Runnable onIlluminatedRunnable); } @NonNull private final SurfaceHolder mHolder; @NonNull private final Paint mSensorPaint; @Nullable private GhbmIlluminationListener mGhbmIlluminationListener; @Nullable private Runnable mOnIlluminatedRunnable; boolean mAwaitingSurfaceToStartIllumination; boolean mHasValidSurface; public UdfpsSurfaceView(Context context, AttributeSet attrs) { super(context, attrs); // Make this SurfaceView draw on top of everything else in this window. This allows us to // 1) Always show the HBM circle on top of everything else, and // 2) Properly composite this view with any other animations in the same window no matter // what contents are added in which order to this view hierarchy. setZOrderOnTop(true); mHolder = getHolder(); mHolder.addCallback(this); mHolder.setFormat(PixelFormat.RGBA_8888); mSensorPaint = new Paint(0 /* flags */); mSensorPaint.setAntiAlias(true); mSensorPaint.setARGB(255, 255, 255, 255); mSensorPaint.setStyle(Paint.Style.FILL); } @Override public void surfaceCreated(SurfaceHolder holder) { mHasValidSurface = true; if (mAwaitingSurfaceToStartIllumination) { doIlluminate(mOnIlluminatedRunnable); mOnIlluminatedRunnable = null; mAwaitingSurfaceToStartIllumination = false; } } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // Unused. } @Override public void surfaceDestroyed(SurfaceHolder holder) { mHasValidSurface = false; } void setGhbmIlluminationListener(@Nullable GhbmIlluminationListener listener) { mGhbmIlluminationListener = listener; } /** * Note: there is no corresponding method to stop GHBM illumination. It is expected that * {@link UdfpsView} will hide this view, which would destroy the surface and remove the * illumination dot. */ void startGhbmIllumination(@Nullable Runnable onIlluminatedRunnable) { if (mGhbmIlluminationListener == null) { Log.e(TAG, "startIllumination | mGhbmIlluminationListener is null"); return; } if (mHasValidSurface) { doIlluminate(onIlluminatedRunnable); } else { mAwaitingSurfaceToStartIllumination = true; mOnIlluminatedRunnable = onIlluminatedRunnable; } } private void doIlluminate(@Nullable Runnable onIlluminatedRunnable) { if (mGhbmIlluminationListener == null) { Log.e(TAG, "doIlluminate | mGhbmIlluminationListener is null"); return; } mGhbmIlluminationListener.enableGhbm(mHolder.getSurface(), onIlluminatedRunnable); } /** * Immediately draws the illumination dot on this SurfaceView's surface. */ void drawIlluminationDot(@NonNull RectF sensorRect) { if (!mHasValidSurface) { Log.e(TAG, "drawIlluminationDot | the surface is destroyed or was never created."); return; } Canvas canvas = null; try { canvas = mHolder.lockCanvas(); canvas.drawOval(sensorRect, mSensorPaint); } finally { // Make sure the surface is never left in a bad state. if (canvas != null) { mHolder.unlockCanvasAndPost(canvas); } } } } Loading
core/java/android/hardware/fingerprint/IUdfpsHbmListener.aidl +2 −13 Original line number Diff line number Diff line Loading @@ -24,31 +24,20 @@ package android.hardware.fingerprint; * @hide */ oneway interface IUdfpsHbmListener { /** HBM that applies to the whole screen. */ const int GLOBAL_HBM = 0; /** HBM that only applies to a portion of the screen. */ const int LOCAL_HBM = 1; /** * UdfpsController will call this method when the HBM is enabled. * * @param hbmType The type of HBM that was enabled. See * {@link com.android.systemui.biometrics.UdfpsHbmTypes}. * @param displayId The displayId for which the HBM is enabled. See * {@link android.view.Display#getDisplayId()}. */ void onHbmEnabled(int hbmType, int displayId); void onHbmEnabled(int displayId); /** * UdfpsController will call this method when the HBM is disabled. * * @param hbmType The type of HBM that was disabled. See * {@link com.android.systemui.biometrics.UdfpsHbmTypes}. * @param displayId The displayId for which the HBM is disabled. See * {@link android.view.Display#getDisplayId()}. */ void onHbmDisabled(int hbmType, int displayId); void onHbmDisabled(int displayId); }
packages/SystemUI/res/layout/udfps_view.xml +0 −6 Original line number Diff line number Diff line Loading @@ -28,10 +28,4 @@ android:layout_width="match_parent" android:layout_height="match_parent"/> <com.android.systemui.biometrics.UdfpsSurfaceView android:id="@+id/hbm_view" android:layout_width="match_parent" android:layout_height="match_parent" android:visibility="invisible"/> </com.android.systemui.biometrics.UdfpsView>
packages/SystemUI/src/com/android/systemui/biometrics/UdfpsHbmProvider.java +6 −12 Original line number Diff line number Diff line Loading @@ -17,9 +17,6 @@ package com.android.systemui.biometrics; import android.annotation.Nullable; import android.view.Surface; import com.android.systemui.biometrics.UdfpsHbmTypes.HbmType; /** * Interface for controlling the high-brightness mode (HBM). UdfpsView can use this callback to Loading @@ -36,24 +33,21 @@ public interface UdfpsHbmProvider { * This method must be called from the UI thread. The callback, if provided, will also be * invoked from the UI thread. * * @param hbmType The type of HBM that should be enabled. See {@link UdfpsHbmTypes}. * @param surface The surface for which the HBM is requested, in case the HBM implementation * needs to set special surface flags to enable the HBM. Can be null. * @param onHbmEnabled A runnable that will be executed once HBM is enabled. */ void enableHbm(@HbmType int hbmType, @Nullable Surface surface, @Nullable Runnable onHbmEnabled); void enableHbm(@Nullable Runnable onHbmEnabled); /** * UdfpsView will call this to disable the HBM when the illumination is not longer needed. * UdfpsView will call this to disable HBM when illumination is no longer needed. * * This method is a no-op when HBM is already disabled. If HBM is enabled, this method will * disable HBM for the {@code hbmType} and {@code surface} that were provided to the * corresponding {@link #enableHbm(int, Surface, Runnable)}. * This method will disable HBM if HBM is enabled. Otherwise, if HBM is already disabled, * this method is a no-op. * * The call must be made from the UI thread. The callback, if provided, will also be invoked * from the UI thread. * * * * @param onHbmDisabled A runnable that will be executed once HBM is disabled. */ void disableHbm(@Nullable Runnable onHbmDisabled); Loading
packages/SystemUI/src/com/android/systemui/biometrics/UdfpsHbmTypes.javadeleted 100644 → 0 +0 −39 Original line number Diff line number Diff line /* * 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 android.annotation.IntDef; import android.hardware.fingerprint.IUdfpsHbmListener; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; /** * Different high-brightness mode (HBM) types that are relevant to this package. */ public final class UdfpsHbmTypes { /** HBM that applies to the whole screen. */ public static final int GLOBAL_HBM = IUdfpsHbmListener.GLOBAL_HBM; /** HBM that only applies to a portion of the screen. */ public static final int LOCAL_HBM = IUdfpsHbmListener.LOCAL_HBM; @Retention(RetentionPolicy.SOURCE) @IntDef({GLOBAL_HBM, LOCAL_HBM}) public @interface HbmType { } }
packages/SystemUI/src/com/android/systemui/biometrics/UdfpsSurfaceView.javadeleted 100644 → 0 +0 −145 Original line number Diff line number Diff line /* * 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 android.annotation.NonNull; import android.annotation.Nullable; import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.PixelFormat; import android.graphics.RectF; import android.util.AttributeSet; import android.util.Log; import android.view.Surface; import android.view.SurfaceHolder; import android.view.SurfaceView; /** * Surface View for providing the Global High-Brightness Mode (GHBM) illumination for UDFPS. */ public class UdfpsSurfaceView extends SurfaceView implements SurfaceHolder.Callback { private static final String TAG = "UdfpsSurfaceView"; /** * Notifies {@link UdfpsView} when to enable GHBM illumination. */ interface GhbmIlluminationListener { /** * @param surface the surface for which GHBM should be enabled. * @param onIlluminatedRunnable a runnable that should be run after GHBM is enabled. */ void enableGhbm(@NonNull Surface surface, @Nullable Runnable onIlluminatedRunnable); } @NonNull private final SurfaceHolder mHolder; @NonNull private final Paint mSensorPaint; @Nullable private GhbmIlluminationListener mGhbmIlluminationListener; @Nullable private Runnable mOnIlluminatedRunnable; boolean mAwaitingSurfaceToStartIllumination; boolean mHasValidSurface; public UdfpsSurfaceView(Context context, AttributeSet attrs) { super(context, attrs); // Make this SurfaceView draw on top of everything else in this window. This allows us to // 1) Always show the HBM circle on top of everything else, and // 2) Properly composite this view with any other animations in the same window no matter // what contents are added in which order to this view hierarchy. setZOrderOnTop(true); mHolder = getHolder(); mHolder.addCallback(this); mHolder.setFormat(PixelFormat.RGBA_8888); mSensorPaint = new Paint(0 /* flags */); mSensorPaint.setAntiAlias(true); mSensorPaint.setARGB(255, 255, 255, 255); mSensorPaint.setStyle(Paint.Style.FILL); } @Override public void surfaceCreated(SurfaceHolder holder) { mHasValidSurface = true; if (mAwaitingSurfaceToStartIllumination) { doIlluminate(mOnIlluminatedRunnable); mOnIlluminatedRunnable = null; mAwaitingSurfaceToStartIllumination = false; } } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // Unused. } @Override public void surfaceDestroyed(SurfaceHolder holder) { mHasValidSurface = false; } void setGhbmIlluminationListener(@Nullable GhbmIlluminationListener listener) { mGhbmIlluminationListener = listener; } /** * Note: there is no corresponding method to stop GHBM illumination. It is expected that * {@link UdfpsView} will hide this view, which would destroy the surface and remove the * illumination dot. */ void startGhbmIllumination(@Nullable Runnable onIlluminatedRunnable) { if (mGhbmIlluminationListener == null) { Log.e(TAG, "startIllumination | mGhbmIlluminationListener is null"); return; } if (mHasValidSurface) { doIlluminate(onIlluminatedRunnable); } else { mAwaitingSurfaceToStartIllumination = true; mOnIlluminatedRunnable = onIlluminatedRunnable; } } private void doIlluminate(@Nullable Runnable onIlluminatedRunnable) { if (mGhbmIlluminationListener == null) { Log.e(TAG, "doIlluminate | mGhbmIlluminationListener is null"); return; } mGhbmIlluminationListener.enableGhbm(mHolder.getSurface(), onIlluminatedRunnable); } /** * Immediately draws the illumination dot on this SurfaceView's surface. */ void drawIlluminationDot(@NonNull RectF sensorRect) { if (!mHasValidSurface) { Log.e(TAG, "drawIlluminationDot | the surface is destroyed or was never created."); return; } Canvas canvas = null; try { canvas = mHolder.lockCanvas(); canvas.drawOval(sensorRect, mSensorPaint); } finally { // Make sure the surface is never left in a bad state. if (canvas != null) { mHolder.unlockCanvasAndPost(canvas); } } } }