Merge "Do not show side fingerprint sensor overlay when used from settings." into sc-v2-dev
This commit is contained in:
@@ -38,13 +38,16 @@ public interface BiometricOverlayConstants {
|
|||||||
int REASON_AUTH_KEYGUARD = 4;
|
int REASON_AUTH_KEYGUARD = 4;
|
||||||
/** Non-specific usage (from FingerprintManager). */
|
/** Non-specific usage (from FingerprintManager). */
|
||||||
int REASON_AUTH_OTHER = 5;
|
int REASON_AUTH_OTHER = 5;
|
||||||
|
/** Usage from Settings. */
|
||||||
|
int REASON_AUTH_SETTINGS = 6;
|
||||||
|
|
||||||
@IntDef({REASON_UNKNOWN,
|
@IntDef({REASON_UNKNOWN,
|
||||||
REASON_ENROLL_FIND_SENSOR,
|
REASON_ENROLL_FIND_SENSOR,
|
||||||
REASON_ENROLL_ENROLLING,
|
REASON_ENROLL_ENROLLING,
|
||||||
REASON_AUTH_BP,
|
REASON_AUTH_BP,
|
||||||
REASON_AUTH_KEYGUARD,
|
REASON_AUTH_KEYGUARD,
|
||||||
REASON_AUTH_OTHER})
|
REASON_AUTH_OTHER,
|
||||||
|
REASON_AUTH_SETTINGS})
|
||||||
@Retention(RetentionPolicy.SOURCE)
|
@Retention(RetentionPolicy.SOURCE)
|
||||||
@interface ShowReason {}
|
@interface ShowReason {}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ package com.android.systemui.biometrics
|
|||||||
|
|
||||||
import android.animation.Animator
|
import android.animation.Animator
|
||||||
import android.animation.AnimatorListenerAdapter
|
import android.animation.AnimatorListenerAdapter
|
||||||
|
import android.app.ActivityTaskManager
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.graphics.PixelFormat
|
import android.graphics.PixelFormat
|
||||||
import android.graphics.PorterDuff
|
import android.graphics.PorterDuff
|
||||||
@@ -24,6 +25,7 @@ import android.graphics.PorterDuffColorFilter
|
|||||||
import android.graphics.Rect
|
import android.graphics.Rect
|
||||||
import android.hardware.biometrics.BiometricOverlayConstants
|
import android.hardware.biometrics.BiometricOverlayConstants
|
||||||
import android.hardware.biometrics.BiometricOverlayConstants.REASON_AUTH_KEYGUARD
|
import android.hardware.biometrics.BiometricOverlayConstants.REASON_AUTH_KEYGUARD
|
||||||
|
import android.hardware.biometrics.BiometricOverlayConstants.REASON_AUTH_SETTINGS
|
||||||
import android.hardware.display.DisplayManager
|
import android.hardware.display.DisplayManager
|
||||||
import android.hardware.fingerprint.FingerprintManager
|
import android.hardware.fingerprint.FingerprintManager
|
||||||
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal
|
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal
|
||||||
@@ -61,6 +63,7 @@ class SidefpsController @Inject constructor(
|
|||||||
private val layoutInflater: LayoutInflater,
|
private val layoutInflater: LayoutInflater,
|
||||||
fingerprintManager: FingerprintManager?,
|
fingerprintManager: FingerprintManager?,
|
||||||
private val windowManager: WindowManager,
|
private val windowManager: WindowManager,
|
||||||
|
private val activityTaskManager: ActivityTaskManager,
|
||||||
overviewProxyService: OverviewProxyService,
|
overviewProxyService: OverviewProxyService,
|
||||||
displayManager: DisplayManager,
|
displayManager: DisplayManager,
|
||||||
@Main mainExecutor: DelayableExecutor,
|
@Main mainExecutor: DelayableExecutor,
|
||||||
@@ -130,7 +133,7 @@ class SidefpsController @Inject constructor(
|
|||||||
override fun show(
|
override fun show(
|
||||||
sensorId: Int,
|
sensorId: Int,
|
||||||
@BiometricOverlayConstants.ShowReason reason: Int
|
@BiometricOverlayConstants.ShowReason reason: Int
|
||||||
) = if (reason.isReasonToShow()) doShow() else hide(sensorId)
|
) = if (reason.isReasonToShow(activityTaskManager)) doShow() else hide(sensorId)
|
||||||
|
|
||||||
private fun doShow() = mainExecutor.execute {
|
private fun doShow() = mainExecutor.execute {
|
||||||
if (overlayView == null) {
|
if (overlayView == null) {
|
||||||
@@ -228,10 +231,18 @@ class SidefpsController @Inject constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
@BiometricOverlayConstants.ShowReason
|
@BiometricOverlayConstants.ShowReason
|
||||||
private fun Int.isReasonToShow(): Boolean = when (this) {
|
private fun Int.isReasonToShow(activityTaskManager: ActivityTaskManager): Boolean = when (this) {
|
||||||
REASON_AUTH_KEYGUARD -> false
|
REASON_AUTH_KEYGUARD -> false
|
||||||
|
REASON_AUTH_SETTINGS -> when (activityTaskManager.topClass()) {
|
||||||
|
// TODO(b/186176653): exclude fingerprint overlays from this list view
|
||||||
|
"com.android.settings.biometrics.fingerprint.FingerprintSettings" -> false
|
||||||
else -> true
|
else -> true
|
||||||
}
|
}
|
||||||
|
else -> true
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun ActivityTaskManager.topClass(): String =
|
||||||
|
getTasks(1).firstOrNull()?.topActivity?.className ?: ""
|
||||||
|
|
||||||
@RawRes
|
@RawRes
|
||||||
private fun Display.asSideFpsAnimation(): Int = when (rotation) {
|
private fun Display.asSideFpsAnimation(): Int = when (rotation) {
|
||||||
|
|||||||
@@ -760,10 +760,12 @@ public class UdfpsController implements DozeReceiver {
|
|||||||
mOnFingerDown = false;
|
mOnFingerDown = false;
|
||||||
mView.setSensorProperties(mSensorProps);
|
mView.setSensorProperties(mSensorProps);
|
||||||
mView.setHbmProvider(mHbmProvider);
|
mView.setHbmProvider(mHbmProvider);
|
||||||
UdfpsAnimationViewController animation = inflateUdfpsAnimation(reason);
|
UdfpsAnimationViewController<?> animation = inflateUdfpsAnimation(reason);
|
||||||
mAttemptedToDismissKeyguard = false;
|
mAttemptedToDismissKeyguard = false;
|
||||||
|
if (animation != null) {
|
||||||
animation.init();
|
animation.init();
|
||||||
mView.setAnimationViewController(animation);
|
mView.setAnimationViewController(animation);
|
||||||
|
}
|
||||||
mOrientationListener.enable();
|
mOrientationListener.enable();
|
||||||
|
|
||||||
// This view overlaps the sensor area, so prevent it from being selectable
|
// This view overlaps the sensor area, so prevent it from being selectable
|
||||||
@@ -786,7 +788,8 @@ public class UdfpsController implements DozeReceiver {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private UdfpsAnimationViewController inflateUdfpsAnimation(int reason) {
|
@Nullable
|
||||||
|
private UdfpsAnimationViewController<?> inflateUdfpsAnimation(int reason) {
|
||||||
switch (reason) {
|
switch (reason) {
|
||||||
case BiometricOverlayConstants.REASON_ENROLL_FIND_SENSOR:
|
case BiometricOverlayConstants.REASON_ENROLL_FIND_SENSOR:
|
||||||
case BiometricOverlayConstants.REASON_ENROLL_ENROLLING:
|
case BiometricOverlayConstants.REASON_ENROLL_ENROLLING:
|
||||||
@@ -830,6 +833,7 @@ public class UdfpsController implements DozeReceiver {
|
|||||||
mDumpManager
|
mDumpManager
|
||||||
);
|
);
|
||||||
case BiometricOverlayConstants.REASON_AUTH_OTHER:
|
case BiometricOverlayConstants.REASON_AUTH_OTHER:
|
||||||
|
case BiometricOverlayConstants.REASON_AUTH_SETTINGS:
|
||||||
UdfpsFpmOtherView authOtherView = (UdfpsFpmOtherView)
|
UdfpsFpmOtherView authOtherView = (UdfpsFpmOtherView)
|
||||||
mInflater.inflate(R.layout.udfps_fpm_other_view, null);
|
mInflater.inflate(R.layout.udfps_fpm_other_view, null);
|
||||||
mView.addView(authOtherView);
|
mView.addView(authOtherView);
|
||||||
@@ -840,7 +844,7 @@ public class UdfpsController implements DozeReceiver {
|
|||||||
mDumpManager
|
mDumpManager
|
||||||
);
|
);
|
||||||
default:
|
default:
|
||||||
Log.d(TAG, "Animation for reason " + reason + " not supported yet");
|
Log.e(TAG, "Animation for reason " + reason + " not supported yet");
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,8 +18,12 @@ package com.android.systemui.biometrics
|
|||||||
|
|
||||||
import android.animation.Animator
|
import android.animation.Animator
|
||||||
import android.graphics.Insets
|
import android.graphics.Insets
|
||||||
|
import android.app.ActivityManager
|
||||||
|
import android.app.ActivityTaskManager
|
||||||
|
import android.content.ComponentName
|
||||||
import android.graphics.Rect
|
import android.graphics.Rect
|
||||||
import android.hardware.biometrics.BiometricOverlayConstants.REASON_AUTH_KEYGUARD
|
import android.hardware.biometrics.BiometricOverlayConstants.REASON_AUTH_KEYGUARD
|
||||||
|
import android.hardware.biometrics.BiometricOverlayConstants.REASON_AUTH_SETTINGS
|
||||||
import android.hardware.biometrics.BiometricOverlayConstants.REASON_UNKNOWN
|
import android.hardware.biometrics.BiometricOverlayConstants.REASON_UNKNOWN
|
||||||
import android.hardware.biometrics.SensorProperties
|
import android.hardware.biometrics.SensorProperties
|
||||||
import android.hardware.display.DisplayManager
|
import android.hardware.display.DisplayManager
|
||||||
@@ -60,9 +64,11 @@ import org.mockito.Mockito.`when`
|
|||||||
import org.mockito.Mockito.any
|
import org.mockito.Mockito.any
|
||||||
import org.mockito.Mockito.anyFloat
|
import org.mockito.Mockito.anyFloat
|
||||||
import org.mockito.Mockito.anyLong
|
import org.mockito.Mockito.anyLong
|
||||||
|
import org.mockito.Mockito.anyInt
|
||||||
import org.mockito.Mockito.mock
|
import org.mockito.Mockito.mock
|
||||||
import org.mockito.Mockito.never
|
import org.mockito.Mockito.never
|
||||||
import org.mockito.Mockito.reset
|
import org.mockito.Mockito.reset
|
||||||
|
import org.mockito.Mockito.times
|
||||||
import org.mockito.Mockito.verify
|
import org.mockito.Mockito.verify
|
||||||
import org.mockito.junit.MockitoJUnit
|
import org.mockito.junit.MockitoJUnit
|
||||||
|
|
||||||
@@ -84,6 +90,8 @@ class SidefpsControllerTest : SysuiTestCase() {
|
|||||||
@Mock
|
@Mock
|
||||||
lateinit var windowManager: WindowManager
|
lateinit var windowManager: WindowManager
|
||||||
@Mock
|
@Mock
|
||||||
|
lateinit var activityTaskManager: ActivityTaskManager
|
||||||
|
@Mock
|
||||||
lateinit var sidefpsView: View
|
lateinit var sidefpsView: View
|
||||||
@Mock
|
@Mock
|
||||||
lateinit var displayManager: DisplayManager
|
lateinit var displayManager: DisplayManager
|
||||||
@@ -144,7 +152,8 @@ class SidefpsControllerTest : SysuiTestCase() {
|
|||||||
|
|
||||||
sideFpsController = SidefpsController(
|
sideFpsController = SidefpsController(
|
||||||
context.createDisplayContext(display), layoutInflater, fingerprintManager,
|
context.createDisplayContext(display), layoutInflater, fingerprintManager,
|
||||||
windowManager, overviewProxyService, displayManager, executor, handler
|
windowManager, activityTaskManager, overviewProxyService, displayManager, executor,
|
||||||
|
handler
|
||||||
)
|
)
|
||||||
|
|
||||||
overlayController = ArgumentCaptor.forClass(ISidefpsController::class.java).apply {
|
overlayController = ArgumentCaptor.forClass(ISidefpsController::class.java).apply {
|
||||||
@@ -211,12 +220,23 @@ class SidefpsControllerTest : SysuiTestCase() {
|
|||||||
testIgnoredFor(REASON_AUTH_KEYGUARD)
|
testIgnoredFor(REASON_AUTH_KEYGUARD)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun testIgnoredFor(reason: Int) {
|
@Test
|
||||||
overlayController.show(SENSOR_ID, reason)
|
fun testShowsForMostSettings() = testWithDisplay {
|
||||||
|
`when`(activityTaskManager.getTasks(anyInt())).thenReturn(listOf(fpEnrollTask()))
|
||||||
|
testIgnoredFor(REASON_AUTH_SETTINGS, ignored = false)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testIgnoredForVerySpecificSettings() = testWithDisplay {
|
||||||
|
`when`(activityTaskManager.getTasks(anyInt())).thenReturn(listOf(fpSettingsTask()))
|
||||||
|
testIgnoredFor(REASON_AUTH_SETTINGS)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun testIgnoredFor(reason: Int, ignored: Boolean = true) {
|
||||||
|
overlayController.show(SENSOR_ID, reason)
|
||||||
executor.runAllReady()
|
executor.runAllReady()
|
||||||
|
|
||||||
verify(windowManager, never()).addView(any(), any())
|
verify(windowManager, if (ignored) never() else times(1)).addView(any(), any())
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -268,3 +288,8 @@ private fun insetsForLargeNavbar() = insetsWithBottom(100)
|
|||||||
private fun insetsWithBottom(bottom: Int) = WindowInsets.Builder()
|
private fun insetsWithBottom(bottom: Int) = WindowInsets.Builder()
|
||||||
.setInsets(WindowInsets.Type.navigationBars(), Insets.of(0, 0, 0, bottom))
|
.setInsets(WindowInsets.Type.navigationBars(), Insets.of(0, 0, 0, bottom))
|
||||||
.build()
|
.build()
|
||||||
|
private fun fpEnrollTask() = settingsTask(".biometrics.fingerprint.FingerprintEnrollEnrolling")
|
||||||
|
private fun fpSettingsTask() = settingsTask(".biometrics.fingerprint.FingerprintSettings")
|
||||||
|
private fun settingsTask(cls: String) = ActivityManager.RunningTaskInfo().apply {
|
||||||
|
topActivity = ComponentName.createRelative("com.android.settings", cls)
|
||||||
|
}
|
||||||
|
|||||||
@@ -405,15 +405,75 @@ public class UdfpsControllerTest extends SysuiTestCase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void showUdfpsOverlay_addsViewToWindow() throws RemoteException {
|
public void showUdfpsOverlay_addsViewToWindow_bp() throws RemoteException {
|
||||||
mOverlayController.showUdfpsOverlay(TEST_UDFPS_SENSOR_ID,
|
showUdfpsOverlay_addsViewToWindow(BiometricOverlayConstants.REASON_AUTH_BP);
|
||||||
BiometricOverlayConstants.REASON_AUTH_KEYGUARD, mUdfpsOverlayControllerCallback);
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void showUdfpsOverlay_addsViewToWindow_keyguard() throws RemoteException {
|
||||||
|
showUdfpsOverlay_addsViewToWindow(BiometricOverlayConstants.REASON_AUTH_KEYGUARD);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void showUdfpsOverlay_addsViewToWindow_settings() throws RemoteException {
|
||||||
|
showUdfpsOverlay_addsViewToWindow(BiometricOverlayConstants.REASON_AUTH_SETTINGS);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void showUdfpsOverlay_addsViewToWindow_enroll_locate() throws RemoteException {
|
||||||
|
showUdfpsOverlay_addsViewToWindow(BiometricOverlayConstants.REASON_ENROLL_FIND_SENSOR);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void showUdfpsOverlay_addsViewToWindow_enroll() throws RemoteException {
|
||||||
|
showUdfpsOverlay_addsViewToWindow(BiometricOverlayConstants.REASON_ENROLL_ENROLLING);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void showUdfpsOverlay_addsViewToWindow_other() throws RemoteException {
|
||||||
|
showUdfpsOverlay_addsViewToWindow(BiometricOverlayConstants.REASON_AUTH_OTHER);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void showUdfpsOverlay_addsViewToWindow(
|
||||||
|
@BiometricOverlayConstants.ShowReason int reason) throws RemoteException {
|
||||||
|
mOverlayController.showUdfpsOverlay(TEST_UDFPS_SENSOR_ID, reason,
|
||||||
|
mUdfpsOverlayControllerCallback);
|
||||||
mFgExecutor.runAllReady();
|
mFgExecutor.runAllReady();
|
||||||
verify(mWindowManager).addView(eq(mUdfpsView), any());
|
verify(mWindowManager).addView(eq(mUdfpsView), any());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void hideUdfpsOverlay_removesViewFromWindow() throws RemoteException {
|
public void hideUdfpsOverlay_removesViewFromWindow_bp() throws RemoteException {
|
||||||
|
hideUdfpsOverlay_removesViewFromWindow(BiometricOverlayConstants.REASON_AUTH_BP);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void hideUdfpsOverlay_removesViewFromWindow_keyguard() throws RemoteException {
|
||||||
|
hideUdfpsOverlay_removesViewFromWindow(BiometricOverlayConstants.REASON_AUTH_KEYGUARD);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void hideUdfpsOverlay_removesViewFromWindow_settings() throws RemoteException {
|
||||||
|
hideUdfpsOverlay_removesViewFromWindow(BiometricOverlayConstants.REASON_AUTH_SETTINGS);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void hideUdfpsOverlay_removesViewFromWindow_enroll_locate() throws RemoteException {
|
||||||
|
hideUdfpsOverlay_removesViewFromWindow(BiometricOverlayConstants.REASON_ENROLL_FIND_SENSOR);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void hideUdfpsOverlay_removesViewFromWindow_enroll() throws RemoteException {
|
||||||
|
hideUdfpsOverlay_removesViewFromWindow(BiometricOverlayConstants.REASON_ENROLL_ENROLLING);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void hideUdfpsOverlay_removesViewFromWindow_other() throws RemoteException {
|
||||||
|
hideUdfpsOverlay_removesViewFromWindow(BiometricOverlayConstants.REASON_AUTH_OTHER);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void hideUdfpsOverlay_removesViewFromWindow(
|
||||||
|
@BiometricOverlayConstants.ShowReason int reason) throws RemoteException {
|
||||||
mOverlayController.showUdfpsOverlay(TEST_UDFPS_SENSOR_ID,
|
mOverlayController.showUdfpsOverlay(TEST_UDFPS_SENSOR_ID,
|
||||||
BiometricOverlayConstants.REASON_AUTH_KEYGUARD, mUdfpsOverlayControllerCallback);
|
BiometricOverlayConstants.REASON_AUTH_KEYGUARD, mUdfpsOverlayControllerCallback);
|
||||||
mOverlayController.hideUdfpsOverlay(TEST_UDFPS_SENSOR_ID);
|
mOverlayController.hideUdfpsOverlay(TEST_UDFPS_SENSOR_ID);
|
||||||
|
|||||||
@@ -168,6 +168,10 @@ public abstract class AuthenticationClient<T> extends AcquisitionClient<T>
|
|||||||
return Utils.isKeyguard(getContext(), getOwnerString());
|
return Utils.isKeyguard(getContext(), getOwnerString());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean isSettings() {
|
||||||
|
return Utils.isSettings(getContext(), getOwnerString());
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected boolean isCryptoOperation() {
|
protected boolean isCryptoOperation() {
|
||||||
return mOperationId != 0;
|
return mOperationId != 0;
|
||||||
@@ -499,6 +503,8 @@ public abstract class AuthenticationClient<T> extends AcquisitionClient<T>
|
|||||||
protected int getShowOverlayReason() {
|
protected int getShowOverlayReason() {
|
||||||
if (isKeyguard()) {
|
if (isKeyguard()) {
|
||||||
return BiometricOverlayConstants.REASON_AUTH_KEYGUARD;
|
return BiometricOverlayConstants.REASON_AUTH_KEYGUARD;
|
||||||
|
} else if (isSettings()) {
|
||||||
|
return BiometricOverlayConstants.REASON_AUTH_SETTINGS;
|
||||||
} else if (isBiometricPrompt()) {
|
} else if (isBiometricPrompt()) {
|
||||||
return BiometricOverlayConstants.REASON_AUTH_BP;
|
return BiometricOverlayConstants.REASON_AUTH_BP;
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
Reference in New Issue
Block a user