Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 865968ce authored by Joe Bolinger's avatar Joe Bolinger Committed by Automerger Merge Worker
Browse files

Merge "Do not show side fingerprint sensor overlay when used from settings."...

Merge "Do not show side fingerprint sensor overlay when used from settings." into sc-v2-dev am: ddbd84f4

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/16168831

Change-Id: I7961208c28032ed5fd4bd34b4045e4a4a9c9bc62
parents f543d854 ddbd84f4
Loading
Loading
Loading
Loading
+4 −1
Original line number Original line Diff line number Diff line
@@ -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 {}
}
}
+13 −2
Original line number Original line Diff line number Diff line
@@ -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) {
+9 −5
Original line number Original line Diff line number Diff line
@@ -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;
        }
        }
    }
    }
+30 −5
Original line number Original line Diff line number Diff line
@@ -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)
}
+64 −4
Original line number Original line Diff line number Diff line
@@ -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);
Loading