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

Commit d2815c0b authored by lbill's avatar lbill
Browse files

Dismiss Auth Biometric Prompt when expanding shade

Test: manual launch Auth Biometric Prompt and expand shade
Test: atest SystemUITests
Test: atest com.android.systemui.biometrics.UdfpsBpViewControllerTest
Bug: 216743197
Change-Id: Iba67b2cf6bbea1ba4c2a41de24d85044e2b03174
parent dc25f23c
Loading
Loading
Loading
Loading
+28 −0
Original line number Diff line number Diff line
@@ -15,9 +15,11 @@
 */
package com.android.systemui.biometrics

import com.android.systemui.broadcast.BroadcastSender
import com.android.systemui.dump.DumpManager
import com.android.systemui.plugins.statusbar.StatusBarStateController
import com.android.systemui.statusbar.phone.SystemUIDialogManager
import com.android.systemui.statusbar.phone.panelstate.PanelExpansionListener
import com.android.systemui.statusbar.phone.panelstate.PanelExpansionStateManager

/**
@@ -28,6 +30,7 @@ class UdfpsBpViewController(
    statusBarStateController: StatusBarStateController,
    panelExpansionStateManager: PanelExpansionStateManager,
    systemUIDialogManager: SystemUIDialogManager,
    val broadcastSender: BroadcastSender,
    dumpManager: DumpManager
) : UdfpsAnimationViewController<UdfpsBpView>(
    view,
@@ -37,4 +40,29 @@ class UdfpsBpViewController(
    dumpManager
) {
    override val tag = "UdfpsBpViewController"
    private val bpPanelExpansionListener = PanelExpansionListener { event ->
        // Notification shade can be expanded but not visible (fraction: 0.0), for example
        // when a heads-up notification (HUN) is showing.
        notificationShadeVisible = event.expanded && event.fraction > 0f
        view.onExpansionChanged(event.fraction)
        cancelAuth()
    }

    fun cancelAuth() {
        if (shouldPauseAuth()) {
            broadcastSender.closeSystemDialogs()
        }
    }

    override fun onViewAttached() {
        super.onViewAttached()

        panelExpansionStateManager.addExpansionListener(bpPanelExpansionListener)
    }

    override fun onViewDetached() {
        super.onViewDetached()

        panelExpansionStateManager.removeExpansionListener(bpPanelExpansionListener)
    }
}
+6 −2
Original line number Diff line number Diff line
@@ -54,6 +54,7 @@ import com.android.internal.util.LatencyTracker;
import com.android.keyguard.ActiveUnlockConfig;
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.systemui.animation.ActivityLaunchAnimator;
import com.android.systemui.broadcast.BroadcastSender;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.doze.DozeReceiver;
@@ -125,6 +126,7 @@ public class UdfpsController implements DozeReceiver {
    @NonNull private final UnlockedScreenOffAnimationController
            mUnlockedScreenOffAnimationController;
    @NonNull private final LatencyTracker mLatencyTracker;
    @NonNull private final BroadcastSender mBroadcastSender;
    @VisibleForTesting @NonNull final BiometricDisplayListener mOrientationListener;
    @NonNull private final ActivityLaunchAnimator mActivityLaunchAnimator;

@@ -205,7 +207,7 @@ public class UdfpsController implements DozeReceiver {
                            mUnlockedScreenOffAnimationController, mHalControlsIllumination,
                            mHbmProvider, requestId, reason, callback,
                            (view, event, fromUdfpsView) -> onTouch(requestId, event,
                                    fromUdfpsView), mActivityLaunchAnimator)));
                                    fromUdfpsView), mActivityLaunchAnimator, mBroadcastSender)));
        }

        @Override
@@ -574,7 +576,8 @@ public class UdfpsController implements DozeReceiver {
            @NonNull SystemUIDialogManager dialogManager,
            @NonNull LatencyTracker latencyTracker,
            @NonNull ActivityLaunchAnimator activityLaunchAnimator,
            @NonNull Optional<AlternateUdfpsTouchProvider> aternateTouchProvider) {
            @NonNull Optional<AlternateUdfpsTouchProvider> aternateTouchProvider,
            @NonNull BroadcastSender broadcastSender) {
        mContext = context;
        mExecution = execution;
        mVibrator = vibrator;
@@ -604,6 +607,7 @@ public class UdfpsController implements DozeReceiver {
        mLatencyTracker = latencyTracker;
        mActivityLaunchAnimator = activityLaunchAnimator;
        mAlternateTouchProvider = aternateTouchProvider.orElse(null);
        mBroadcastSender = broadcastSender;

        mOrientationListener = new BiometricDisplayListener(
                context,
+6 −3
Original line number Diff line number Diff line
@@ -41,6 +41,7 @@ import androidx.annotation.LayoutRes
import com.android.keyguard.KeyguardUpdateMonitor
import com.android.systemui.R
import com.android.systemui.animation.ActivityLaunchAnimator
import com.android.systemui.broadcast.BroadcastSender
import com.android.systemui.dump.DumpManager
import com.android.systemui.plugins.statusbar.StatusBarStateController
import com.android.systemui.statusbar.LockscreenShadeTransitionController
@@ -83,7 +84,8 @@ class UdfpsControllerOverlay(
    @ShowReason val requestReason: Int,
    private val controllerCallback: IUdfpsOverlayControllerCallback,
    private val onTouch: (View, MotionEvent, Boolean) -> Boolean,
    private val activityLaunchAnimator: ActivityLaunchAnimator
    private val activityLaunchAnimator: ActivityLaunchAnimator,
    private val broadcastSender: BroadcastSender
) {
    /** The view, when [isShowing], or null. */
    var overlayView: UdfpsView? = null
@@ -102,8 +104,8 @@ class UdfpsControllerOverlay(
        fitInsetsTypes = 0
        gravity = android.view.Gravity.TOP or android.view.Gravity.LEFT
        layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS
        flags =
            (Utils.FINGERPRINT_OVERLAY_LAYOUT_PARAM_FLAGS or WindowManager.LayoutParams.FLAG_SPLIT_TOUCH)
        flags = (Utils.FINGERPRINT_OVERLAY_LAYOUT_PARAM_FLAGS
            or WindowManager.LayoutParams.FLAG_SPLIT_TOUCH)
        privateFlags = WindowManager.LayoutParams.PRIVATE_FLAG_TRUSTED_OVERLAY
        // Avoid announcing window title.
        accessibilityTitle = " "
@@ -221,6 +223,7 @@ class UdfpsControllerOverlay(
                    statusBarStateController,
                    panelExpansionStateManager,
                    dialogManager,
                    broadcastSender,
                    dumpManager
                )
            }
+118 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2022 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.app.Instrumentation
import android.testing.AndroidTestingRunner
import android.testing.TestableLooper
import android.testing.ViewUtils
import androidx.test.filters.SmallTest
import androidx.test.platform.app.InstrumentationRegistry.getInstrumentation
import com.android.internal.jank.InteractionJankMonitor
import com.android.internal.logging.testing.UiEventLoggerFake
import com.android.systemui.R
import com.android.systemui.SysuiTestCase
import com.android.systemui.broadcast.BroadcastSender
import com.android.systemui.dump.DumpManager
import com.android.systemui.statusbar.StatusBarStateControllerImpl
import com.android.systemui.statusbar.phone.SystemUIDialogManager
import com.android.systemui.statusbar.phone.panelstate.PanelExpansionStateManager
import com.android.systemui.util.mockito.any
import org.junit.After
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mock
import org.mockito.Mockito.spy
import org.mockito.Mockito.times
import org.mockito.Mockito.verify
import org.mockito.junit.MockitoJUnit

@SmallTest
@RunWith(AndroidTestingRunner::class)
@TestableLooper.RunWithLooper
class UdfpsBpViewControllerTest : SysuiTestCase() {

    @JvmField @Rule var rule = MockitoJUnit.rule()

    @Mock lateinit var dumpManager: DumpManager
    @Mock lateinit var systemUIDialogManager: SystemUIDialogManager
    @Mock lateinit var broadcastSender: BroadcastSender
    @Mock lateinit var interactionJankMonitor: InteractionJankMonitor
    @Mock lateinit var panelExpansionStateManager: PanelExpansionStateManager

    private lateinit var instrumentation: Instrumentation
    private lateinit var uiEventLogger: UiEventLoggerFake
    private lateinit var udfpsBpView: UdfpsBpView
    private lateinit var statusBarStateController: StatusBarStateControllerImpl
    private lateinit var udfpsBpViewController: UdfpsBpViewController

    @Before
    fun setup() {
        instrumentation = getInstrumentation()
        instrumentation.runOnMainSync { createUdfpsView() }
        instrumentation.waitForIdleSync()

        uiEventLogger = UiEventLoggerFake()
        statusBarStateController =
            StatusBarStateControllerImpl(uiEventLogger, dumpManager, interactionJankMonitor)
        udfpsBpViewController = UdfpsBpViewController(
            udfpsBpView,
            statusBarStateController,
            panelExpansionStateManager,
            systemUIDialogManager,
            broadcastSender,
            dumpManager)
        udfpsBpViewController.init()
    }

    @After
    fun tearDown() {
        if (udfpsBpViewController.isAttachedToWindow) {
            instrumentation.runOnMainSync { ViewUtils.detachView(udfpsBpView) }
            instrumentation.waitForIdleSync()
        }
    }

    private fun createUdfpsView() {
        context.setTheme(R.style.Theme_AppCompat)
        context.orCreateTestableResources.addOverride(
            com.android.internal.R.integer.config_udfps_illumination_transition_ms, 0)
        udfpsBpView = UdfpsBpView(context, null)
    }

    @Test
    fun addExpansionListener() {
        instrumentation.runOnMainSync { ViewUtils.attachView(udfpsBpView) }
        instrumentation.waitForIdleSync()

        // Both UdfpsBpViewController & UdfpsAnimationViewController add listener
        verify(panelExpansionStateManager, times(2)).addExpansionListener(any())
    }

    @Test
    fun removeExpansionListener() {
        instrumentation.runOnMainSync { ViewUtils.attachView(udfpsBpView) }
        instrumentation.waitForIdleSync()
        instrumentation.runOnMainSync { ViewUtils.detachView(udfpsBpView) }
        instrumentation.waitForIdleSync()

        // Both UdfpsBpViewController & UdfpsAnimationViewController remove listener
        verify(panelExpansionStateManager, times(2)).removeExpansionListener(any())
    }
}
+4 −1
Original line number Diff line number Diff line
@@ -40,6 +40,7 @@ import com.android.keyguard.KeyguardUpdateMonitor
import com.android.systemui.R
import com.android.systemui.SysuiTestCase
import com.android.systemui.animation.ActivityLaunchAnimator
import com.android.systemui.broadcast.BroadcastSender
import com.android.systemui.dump.DumpManager
import com.android.systemui.plugins.statusbar.StatusBarStateController
import com.android.systemui.statusbar.LockscreenShadeTransitionController
@@ -102,6 +103,7 @@ class UdfpsControllerOverlayTest : SysuiTestCase() {
    @Mock private lateinit var udfpsView: UdfpsView
    @Mock private lateinit var udfpsEnrollView: UdfpsEnrollView
    @Mock private lateinit var activityLaunchAnimator: ActivityLaunchAnimator
    @Mock private lateinit var broadcastSender: BroadcastSender
    @Captor private lateinit var layoutParamsCaptor: ArgumentCaptor<WindowManager.LayoutParams>

    private val onTouch = { _: View, _: MotionEvent, _: Boolean -> true }
@@ -131,7 +133,8 @@ class UdfpsControllerOverlayTest : SysuiTestCase() {
            keyguardUpdateMonitor, dialogManager, dumpManager, transitionController,
            configurationController, systemClock, keyguardStateController,
            unlockedScreenOffAnimationController, HAL_CONTROLS_ILLUMINATION, hbmProvider,
            REQUEST_ID, reason, controllerCallback, onTouch, activityLaunchAnimator)
            REQUEST_ID, reason, controllerCallback, onTouch, activityLaunchAnimator,
            broadcastSender)
        block()
    }

Loading