summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/hardware/fingerprint/IUdfpsHbmListener.aidl15
-rw-r--r--packages/SystemUI/res/layout/udfps_view.xml6
-rw-r--r--packages/SystemUI/src/com/android/systemui/biometrics/UdfpsHbmProvider.java18
-rw-r--r--packages/SystemUI/src/com/android/systemui/biometrics/UdfpsHbmTypes.java39
-rw-r--r--packages/SystemUI/src/com/android/systemui/biometrics/UdfpsSurfaceView.java145
-rw-r--r--packages/SystemUI/src/com/android/systemui/biometrics/UdfpsView.kt55
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsViewTest.kt4
-rw-r--r--services/core/java/com/android/server/display/DisplayModeDirector.java34
-rw-r--r--services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java12
9 files changed, 21 insertions, 307 deletions
diff --git a/core/java/android/hardware/fingerprint/IUdfpsHbmListener.aidl b/core/java/android/hardware/fingerprint/IUdfpsHbmListener.aidl
index f4d22dac3b72..9c2aa6699334 100644
--- a/core/java/android/hardware/fingerprint/IUdfpsHbmListener.aidl
+++ b/core/java/android/hardware/fingerprint/IUdfpsHbmListener.aidl
@@ -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);
}
diff --git a/packages/SystemUI/res/layout/udfps_view.xml b/packages/SystemUI/res/layout/udfps_view.xml
index 0fcbfa161ddf..257d238f5c54 100644
--- a/packages/SystemUI/res/layout/udfps_view.xml
+++ b/packages/SystemUI/res/layout/udfps_view.xml
@@ -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>
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsHbmProvider.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsHbmProvider.java
index da24a8f744be..38c937feb941 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsHbmProvider.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsHbmProvider.java
@@ -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
@@ -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);
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsHbmTypes.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsHbmTypes.java
deleted file mode 100644
index 3ab0bd62eec8..000000000000
--- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsHbmTypes.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * 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 {
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsSurfaceView.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsSurfaceView.java
deleted file mode 100644
index 77fad35d32d4..000000000000
--- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsSurfaceView.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- * 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);
- }
- }
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsView.kt b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsView.kt
index 9fbc458cb082..75e6aa032343 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsView.kt
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsView.kt
@@ -22,26 +22,17 @@ import android.graphics.Paint
import android.graphics.PointF
import android.graphics.RectF
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal
-import android.os.Build
-import android.os.UserHandle
-import android.provider.Settings
import android.util.AttributeSet
import android.util.Log
import android.view.MotionEvent
-import android.view.Surface
import android.widget.FrameLayout
import com.android.systemui.R
import com.android.systemui.doze.DozeReceiver
-import com.android.systemui.biometrics.UdfpsHbmTypes.HbmType
private const val TAG = "UdfpsView"
-private const val SETTING_HBM_TYPE = "com.android.systemui.biometrics.UdfpsSurfaceView.hbmType"
-@HbmType
-private const val DEFAULT_HBM_TYPE = UdfpsHbmTypes.LOCAL_HBM
/**
- * A view containing 1) A SurfaceView for HBM, and 2) A normal drawable view for all other
- * animations.
+ * The main view group containing all UDFPS animations.
*/
class UdfpsView(
context: Context,
@@ -68,21 +59,6 @@ class UdfpsView(
com.android.internal.R.integer.config_udfps_illumination_transition_ms
).toLong()
- @HbmType
- private val hbmType = if (Build.IS_ENG || Build.IS_USERDEBUG) {
- Settings.Secure.getIntForUser(
- context.contentResolver,
- SETTING_HBM_TYPE,
- DEFAULT_HBM_TYPE,
- UserHandle.USER_CURRENT
- )
- } else {
- DEFAULT_HBM_TYPE
- }
-
- // Only used for UdfpsHbmTypes.GLOBAL_HBM.
- private var ghbmView: UdfpsSurfaceView? = null
-
/** View controller (can be different for enrollment, BiometricPrompt, Keyguard, etc.). */
var animationViewController: UdfpsAnimationViewController<*>? = null
@@ -109,12 +85,6 @@ class UdfpsView(
return (animationViewController == null || !animationViewController!!.shouldPauseAuth())
}
- override fun onFinishInflate() {
- if (hbmType == UdfpsHbmTypes.GLOBAL_HBM) {
- ghbmView = findViewById(R.id.hbm_view)
- }
- }
-
override fun dozeTimeTick() {
animationViewController?.dozeTimeTick()
}
@@ -180,24 +150,11 @@ class UdfpsView(
override fun startIllumination(onIlluminatedRunnable: Runnable?) {
isIlluminationRequested = true
animationViewController?.onIlluminationStarting()
-
- val gView = ghbmView
- if (gView != null) {
- gView.setGhbmIlluminationListener(this::doIlluminate)
- gView.visibility = VISIBLE
- gView.startGhbmIllumination(onIlluminatedRunnable)
- } else {
- doIlluminate(null /* surface */, onIlluminatedRunnable)
- }
+ doIlluminate(onIlluminatedRunnable)
}
- private fun doIlluminate(surface: Surface?, onIlluminatedRunnable: Runnable?) {
- if (ghbmView != null && surface == null) {
- Log.e(TAG, "doIlluminate | surface must be non-null for GHBM")
- }
-
- hbmProvider?.enableHbm(hbmType, surface) {
- ghbmView?.drawIlluminationDot(sensorRect)
+ private fun doIlluminate(onIlluminatedRunnable: Runnable?) {
+ hbmProvider?.enableHbm() {
if (onIlluminatedRunnable != null) {
// No framework API can reliably tell when a frame reaches the panel. A timeout
// is the safest solution.
@@ -211,10 +168,6 @@ class UdfpsView(
override fun stopIllumination() {
isIlluminationRequested = false
animationViewController?.onIlluminationStopped()
- ghbmView?.let { view ->
- view.setGhbmIlluminationListener(null)
- view.visibility = INVISIBLE
- }
hbmProvider?.disableHbm(null /* onHbmDisabled */)
}
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsViewTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsViewTest.kt
index 3d8d1282e184..6d4cc4c96e0b 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsViewTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsViewTest.kt
@@ -23,7 +23,6 @@ import android.testing.AndroidTestingRunner
import android.testing.TestableLooper
import android.testing.ViewUtils
import android.view.LayoutInflater
-import android.view.Surface
import androidx.test.filters.SmallTest
import com.android.systemui.R
import com.android.systemui.SysuiTestCase
@@ -37,7 +36,6 @@ import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mock
-import org.mockito.Mockito.anyInt
import org.mockito.Mockito.never
import org.mockito.Mockito.nullable
import org.mockito.Mockito.verify
@@ -148,7 +146,7 @@ class UdfpsViewTest : SysuiTestCase() {
view.startIllumination(onDone)
val illuminator = withArgCaptor<Runnable> {
- verify(hbmProvider).enableHbm(anyInt(), nullable(Surface::class.java), capture())
+ verify(hbmProvider).enableHbm(capture())
}
assertThat(view.isIlluminationRequested).isTrue()
diff --git a/services/core/java/com/android/server/display/DisplayModeDirector.java b/services/core/java/com/android/server/display/DisplayModeDirector.java
index efd2f6f1bfe1..ac72b1725432 100644
--- a/services/core/java/com/android/server/display/DisplayModeDirector.java
+++ b/services/core/java/com/android/server/display/DisplayModeDirector.java
@@ -2098,7 +2098,6 @@ public class DisplayModeDirector {
private class UdfpsObserver extends IUdfpsHbmListener.Stub {
private final SparseBooleanArray mLocalHbmEnabled = new SparseBooleanArray();
- private final SparseBooleanArray mGlobalHbmEnabled = new SparseBooleanArray();
public void observe() {
StatusBarManagerInternal statusBar =
@@ -2109,39 +2108,27 @@ public class DisplayModeDirector {
}
@Override
- public void onHbmEnabled(int hbmType, int displayId) {
+ public void onHbmEnabled(int displayId) {
synchronized (mLock) {
- updateHbmStateLocked(hbmType, displayId, true /*enabled*/);
+ updateHbmStateLocked(displayId, true /*enabled*/);
}
}
@Override
- public void onHbmDisabled(int hbmType, int displayId) {
+ public void onHbmDisabled(int displayId) {
synchronized (mLock) {
- updateHbmStateLocked(hbmType, displayId, false /*enabled*/);
+ updateHbmStateLocked(displayId, false /*enabled*/);
}
}
- private void updateHbmStateLocked(int hbmType, int displayId, boolean enabled) {
- switch (hbmType) {
- case UdfpsObserver.LOCAL_HBM:
- mLocalHbmEnabled.put(displayId, enabled);
- break;
- case UdfpsObserver.GLOBAL_HBM:
- mGlobalHbmEnabled.put(displayId, enabled);
- break;
- default:
- Slog.w(TAG, "Unknown HBM type reported. Ignoring.");
- return;
- }
+ private void updateHbmStateLocked(int displayId, boolean enabled) {
+ mLocalHbmEnabled.put(displayId, enabled);
updateVoteLocked(displayId);
}
private void updateVoteLocked(int displayId) {
final Vote vote;
- if (mGlobalHbmEnabled.get(displayId)) {
- vote = Vote.forRefreshRates(60f, 60f);
- } else if (mLocalHbmEnabled.get(displayId)) {
+ if (mLocalHbmEnabled.get(displayId)) {
Display.Mode[] modes = mSupportedModesByDisplay.get(displayId);
float maxRefreshRate = 0f;
for (Display.Mode mode : modes) {
@@ -2165,13 +2152,6 @@ public class DisplayModeDirector {
final String enabled = mLocalHbmEnabled.valueAt(i) ? "enabled" : "disabled";
pw.println(" Display " + displayId + ": " + enabled);
}
- pw.println(" mGlobalHbmEnabled: ");
- for (int i = 0; i < mGlobalHbmEnabled.size(); i++) {
- final int displayId = mGlobalHbmEnabled.keyAt(i);
- final String enabled = mGlobalHbmEnabled.valueAt(i) ? "enabled" : "disabled";
- pw.println(" Display " + displayId + ": " + enabled);
- }
-
}
}
diff --git a/services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java b/services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java
index 40c039210939..864f31552ae3 100644
--- a/services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java
+++ b/services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java
@@ -20,8 +20,8 @@ import static android.hardware.display.DisplayManager.DeviceConfig.KEY_FIXED_REF
import static android.hardware.display.DisplayManager.DeviceConfig.KEY_FIXED_REFRESH_RATE_HIGH_DISPLAY_BRIGHTNESS_THRESHOLDS;
import static android.hardware.display.DisplayManager.DeviceConfig.KEY_FIXED_REFRESH_RATE_LOW_AMBIENT_BRIGHTNESS_THRESHOLDS;
import static android.hardware.display.DisplayManager.DeviceConfig.KEY_FIXED_REFRESH_RATE_LOW_DISPLAY_BRIGHTNESS_THRESHOLDS;
-import static android.hardware.display.DisplayManager.DeviceConfig.KEY_REFRESH_RATE_IN_HBM_SUNLIGHT;
import static android.hardware.display.DisplayManager.DeviceConfig.KEY_REFRESH_RATE_IN_HBM_HDR;
+import static android.hardware.display.DisplayManager.DeviceConfig.KEY_REFRESH_RATE_IN_HBM_SUNLIGHT;
import static android.hardware.display.DisplayManager.DeviceConfig.KEY_REFRESH_RATE_IN_HIGH_ZONE;
import static android.hardware.display.DisplayManager.DeviceConfig.KEY_REFRESH_RATE_IN_LOW_ZONE;
@@ -919,16 +919,6 @@ public class DisplayModeDirectorTest {
// Should be no vote initially
Vote vote = director.getVote(DISPLAY_ID, Vote.PRIORITY_UDFPS);
assertNull(vote);
-
- // Enabling GHBM votes for 60hz
- hbmListener.onHbmEnabled(IUdfpsHbmListener.GLOBAL_HBM, DISPLAY_ID);
- vote = director.getVote(DISPLAY_ID, Vote.PRIORITY_UDFPS);
- assertVoteForRefreshRate(vote, 60.f);
-
- // Disabling GHBM removes the vote
- hbmListener.onHbmDisabled(IUdfpsHbmListener.GLOBAL_HBM, DISPLAY_ID);
- vote = director.getVote(DISPLAY_ID, Vote.PRIORITY_UDFPS);
- assertNull(vote);
}
@Test