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

Commit a46ec407 authored by Lucas Dupin's avatar Lucas Dupin Committed by android-build-merger
Browse files

Merge "Do not show status bar on first bypass attempt" into qt-qpr1-dev

am: bdab885d

Change-Id: I5ee771a6a5ecf6cbbad1d1eaed097d5307dcd683
parents b6fc557e bdab885d
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -1688,7 +1688,10 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
        return shouldListen;
    }

    private boolean shouldListenForFace() {
    /**
     * If face auth is allows to scan on this exact moment.
     */
    public boolean shouldListenForFace() {
        final boolean awakeKeyguard = mKeyguardIsVisible && mDeviceInteractive && !mGoingToSleep;
        final int user = getCurrentUser();
        final int strongAuth = mStrongAuthTracker.getStrongAuthForUser(user);
+30 −3
Original line number Diff line number Diff line
@@ -39,6 +39,7 @@ import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.Region;
import android.hardware.biometrics.BiometricSourceType;
import android.os.PowerManager;
import android.os.SystemClock;
import android.util.AttributeSet;
@@ -59,6 +60,7 @@ import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.keyguard.KeyguardClockSwitch;
import com.android.keyguard.KeyguardStatusView;
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.keyguard.KeyguardUpdateMonitorCallback;
import com.android.systemui.DejankUtils;
import com.android.systemui.Dependency;
import com.android.systemui.Interpolators;
@@ -164,6 +166,25 @@ public class NotificationPanelView extends PanelView implements
            R.id.keyguard_hun_animator_start_tag);
    private static final AnimationProperties KEYGUARD_HUN_PROPERTIES =
            new AnimationProperties().setDuration(StackStateAnimator.ANIMATION_DURATION_STANDARD);
    @VisibleForTesting
    final KeyguardUpdateMonitorCallback mKeyguardUpdateCallback =
            new KeyguardUpdateMonitorCallback() {
                @Override
                public void onBiometricRunningStateChanged(boolean running,
                        BiometricSourceType biometricSourceType) {
                    boolean keyguardOrShadeLocked = mBarState == StatusBarState.KEYGUARD
                            || mBarState == StatusBarState.SHADE_LOCKED;
                    if (!running && mFirstBypassAttempt && keyguardOrShadeLocked && !mDozing) {
                        mFirstBypassAttempt = false;
                        animateKeyguardStatusBarIn(StackStateAnimator.ANIMATION_DURATION_STANDARD);
                    }
                }

                @Override
                public void onFinishedGoingToSleep(int why) {
                    mFirstBypassAttempt = mKeyguardBypassController.getBypassEnabled();
                }
            };

    private final InjectionInflationController mInjectionInflationController;
    private final PowerManager mPowerManager;
@@ -171,8 +192,8 @@ public class NotificationPanelView extends PanelView implements
    private final NotificationWakeUpCoordinator mWakeUpCoordinator;
    private final PulseExpansionHandler mPulseExpansionHandler;
    private final KeyguardBypassController mKeyguardBypassController;
    private final KeyguardUpdateMonitor mUpdateMonitor;

    @VisibleForTesting
    protected KeyguardUpdateMonitor mUpdateMonitor;
    @VisibleForTesting
    protected KeyguardAffordanceHelper mAffordanceHelper;
    private KeyguardUserSwitcher mKeyguardUserSwitcher;
@@ -383,6 +404,7 @@ public class NotificationPanelView extends PanelView implements
    private boolean mShowingKeyguardHeadsUp;
    private boolean mAllowExpandForSmallExpansion;
    private Runnable mExpandAfterLayoutRunnable;
    private boolean mFirstBypassAttempt;

    @Inject
    public NotificationPanelView(@Named(VIEW_CONTEXT) Context context, AttributeSet attrs,
@@ -413,6 +435,7 @@ public class NotificationPanelView extends PanelView implements
        mThemeResId = context.getThemeResId();
        mKeyguardBypassController = bypassController;
        mUpdateMonitor = KeyguardUpdateMonitor.getInstance(mContext);
        mFirstBypassAttempt = mKeyguardBypassController.getBypassEnabled();
        dynamicPrivacyController.addListener(this);

        mBottomAreaShadeAlphaAnimator = ValueAnimator.ofFloat(1f, 0);
@@ -485,6 +508,7 @@ public class NotificationPanelView extends PanelView implements
        Dependency.get(StatusBarStateController.class).addCallback(this);
        Dependency.get(ZenModeController.class).addCallback(this);
        Dependency.get(ConfigurationController.class).addCallback(this);
        mUpdateMonitor.registerCallback(mKeyguardUpdateCallback);
        // Theme might have changed between inflating this view and attaching it to the window, so
        // force a call to onThemeChanged
        onThemeChanged();
@@ -497,6 +521,7 @@ public class NotificationPanelView extends PanelView implements
        Dependency.get(StatusBarStateController.class).removeCallback(this);
        Dependency.get(ZenModeController.class).removeCallback(this);
        Dependency.get(ConfigurationController.class).removeCallback(this);
        mUpdateMonitor.removeCallback(mKeyguardUpdateCallback);
    }

    @Override
@@ -2238,7 +2263,9 @@ public class NotificationPanelView extends PanelView implements
                * mKeyguardStatusBarAnimateAlpha;
        newAlpha *= 1.0f - mKeyguardHeadsUpShowingAmount;
        mKeyguardStatusBar.setAlpha(newAlpha);
        mKeyguardStatusBar.setVisibility(newAlpha != 0f && !mDozing ? VISIBLE : INVISIBLE);
        boolean hideForBypass = mFirstBypassAttempt && mUpdateMonitor.shouldListenForFace();
        mKeyguardStatusBar.setVisibility(newAlpha != 0f && !mDozing && !hideForBypass
                ? VISIBLE : INVISIBLE);
    }

    private void updateKeyguardBottomAreaAlpha() {
+27 −7
Original line number Diff line number Diff line
@@ -21,19 +21,23 @@ import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import android.app.StatusBarManager;
import android.hardware.biometrics.BiometricSourceType;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;

import androidx.test.filters.SmallTest;

import com.android.keyguard.KeyguardStatusView;
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.systemui.SystemUIFactory;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.plugins.FalsingManager;
@@ -50,7 +54,6 @@ import com.android.systemui.statusbar.notification.stack.NotificationRoundnessMa
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout;
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.ZenModeController;
import com.android.systemui.tuner.TunerService;
import com.android.systemui.util.InjectionInflationController;

import org.junit.Before;
@@ -100,7 +103,11 @@ public class NotificationPanelViewTest extends SysuiTestCase {
    @Mock
    private KeyguardAffordanceHelper mAffordanceHelper;
    @Mock
    private KeyguardUpdateMonitor mUpdateMonitor;
    @Mock
    private FalsingManager mFalsingManager;
    @Mock
    private KeyguardBypassController mKeyguardBypassController;
    private NotificationPanelView mNotificationPanelView;

    @Before
@@ -115,18 +122,16 @@ public class NotificationPanelViewTest extends SysuiTestCase {
        mDependency.injectMockDependency(NotificationLockscreenUserManager.class);
        mDependency.injectMockDependency(ConfigurationController.class);
        mDependency.injectMockDependency(ZenModeController.class);
        KeyguardBypassController bypassController = new KeyguardBypassController(mContext,
                mock(TunerService.class), mStatusBarStateController,
                mock(NotificationLockscreenUserManager.class));
        NotificationWakeUpCoordinator coordinator =
                new NotificationWakeUpCoordinator(mContext,
                        mock(HeadsUpManagerPhone.class),
                        new StatusBarStateControllerImpl(),
                        bypassController);
                        mKeyguardBypassController);
        PulseExpansionHandler expansionHandler = new PulseExpansionHandler(mContext, coordinator,
                bypassController, mHeadsUpManager, mock(NotificationRoundnessManager.class));
                mKeyguardBypassController, mHeadsUpManager,
                mock(NotificationRoundnessManager.class));
        mNotificationPanelView = new TestableNotificationPanelView(coordinator, expansionHandler,
                bypassController);
                mKeyguardBypassController);
        mNotificationPanelView.setHeadsUpManager(mHeadsUpManager);
        mNotificationPanelView.setBar(mPanelBar);

@@ -186,6 +191,20 @@ public class NotificationPanelViewTest extends SysuiTestCase {
        assertThat(mNotificationPanelView.isTrackingBlocked()).isFalse();
    }

    @Test
    public void testKeyguardStatusBarVisibility_hiddenForBypass() {
        when(mUpdateMonitor.shouldListenForFace()).thenReturn(true);
        mNotificationPanelView.mKeyguardUpdateCallback.onBiometricRunningStateChanged(true,
                BiometricSourceType.FACE);
        verify(mKeyguardStatusBar, never()).setVisibility(View.VISIBLE);

        when(mKeyguardBypassController.getBypassEnabled()).thenReturn(true);
        mNotificationPanelView.mKeyguardUpdateCallback.onFinishedGoingToSleep(0);
        mNotificationPanelView.mKeyguardUpdateCallback.onBiometricRunningStateChanged(true,
                BiometricSourceType.FACE);
        verify(mKeyguardStatusBar, never()).setVisibility(View.VISIBLE);
    }

    private class TestableNotificationPanelView extends NotificationPanelView {
        TestableNotificationPanelView(NotificationWakeUpCoordinator coordinator,
                PulseExpansionHandler expansionHandler,
@@ -203,6 +222,7 @@ public class NotificationPanelViewTest extends SysuiTestCase {
            mBigClockContainer = NotificationPanelViewTest.this.mBigClockContainer;
            mQsFrame = NotificationPanelViewTest.this.mQsFrame;
            mAffordanceHelper = NotificationPanelViewTest.this.mAffordanceHelper;
            mUpdateMonitor = NotificationPanelViewTest.this.mUpdateMonitor;
            initDependencies(NotificationPanelViewTest.this.mStatusBar,
                    NotificationPanelViewTest.this.mGroupManager,
                    NotificationPanelViewTest.this.mNotificationShelf,