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

Commit fb5cb195 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Fix udfps flicker on camera launch + exit"

parents c299543b 38106414
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -785,6 +785,7 @@ public class UdfpsController implements DozeReceiver {
                        mLockscreenShadeTransitionController,
                        mConfigurationController,
                        mSystemClock,
                        mKeyguardStateController,
                        this
                );
            case IUdfpsOverlayController.REASON_AUTH_BP:
+45 −2
Original line number Diff line number Diff line
@@ -34,6 +34,7 @@ import com.android.systemui.statusbar.phone.KeyguardBouncer;
import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.util.concurrency.DelayableExecutor;
import com.android.systemui.util.time.SystemClock;

@@ -53,6 +54,7 @@ public class UdfpsKeyguardViewController extends UdfpsAnimationViewController<Ud
    @NonNull private final LockscreenShadeTransitionController mLockScreenShadeTransitionController;
    @NonNull private final ConfigurationController mConfigurationController;
    @NonNull private final SystemClock mSystemClock;
    @NonNull private final KeyguardStateController mKeyguardStateController;
    @NonNull private final UdfpsController mUdfpsController;

    private boolean mShowingUdfpsBouncer;
@@ -63,6 +65,8 @@ public class UdfpsKeyguardViewController extends UdfpsAnimationViewController<Ud
    private float mTransitionToFullShadeProgress;
    private float mLastDozeAmount;
    private long mLastUdfpsBouncerShowTime = -1;
    private float mStatusBarExpansion;
    private boolean mLaunchTransitionFadingAway;

    /**
     * hidden amount of pin/pattern/password bouncer
@@ -84,6 +88,7 @@ public class UdfpsKeyguardViewController extends UdfpsAnimationViewController<Ud
            @NonNull LockscreenShadeTransitionController transitionController,
            @NonNull ConfigurationController configurationController,
            @NonNull SystemClock systemClock,
            @NonNull KeyguardStateController keyguardStateController,
            @NonNull UdfpsController udfpsController) {
        super(view, statusBarStateController, statusBarOptional, dumpManager);
        mKeyguardViewManager = statusBarKeyguardViewManager;
@@ -93,6 +98,7 @@ public class UdfpsKeyguardViewController extends UdfpsAnimationViewController<Ud
        mLockScreenShadeTransitionController = transitionController;
        mConfigurationController = configurationController;
        mSystemClock = systemClock;
        mKeyguardStateController = keyguardStateController;
        mUdfpsController = udfpsController;
    }

@@ -111,11 +117,16 @@ public class UdfpsKeyguardViewController extends UdfpsAnimationViewController<Ud

        mUdfpsRequested = false;

        mLaunchTransitionFadingAway = mKeyguardStateController.isLaunchTransitionFadingAway();
        mKeyguardStateController.addCallback(mKeyguardStateControllerCallback);
        mStatusBarState = mStatusBarStateController.getState();
        mQsExpanded = mKeyguardViewManager.isQsExpanded();
        mInputBouncerHiddenAmount = KeyguardBouncer.EXPANSION_HIDDEN;
        mIsBouncerVisible = mKeyguardViewManager.bouncerIsOrWillBeShowing();
        mConfigurationController.addCallback(mConfigurationListener);
        mStatusBarOptional.ifPresent(
                statusBar -> statusBar.addExpansionChangedListener(
                        mStatusBarExpansionChangedListener));
        updateAlpha();
        updatePauseAuth();

@@ -128,10 +139,14 @@ public class UdfpsKeyguardViewController extends UdfpsAnimationViewController<Ud
        super.onViewDetached();
        mFaceDetectRunning = false;

        mKeyguardStateController.removeCallback(mKeyguardStateControllerCallback);
        mStatusBarStateController.removeCallback(mStateListener);
        mKeyguardViewManager.removeAlternateAuthInterceptor(mAlternateAuthInterceptor);
        mKeyguardUpdateMonitor.requestFaceAuthOnOccludingApp(false);
        mConfigurationController.removeCallback(mConfigurationListener);
        mStatusBarOptional.ifPresent(
                statusBar -> statusBar.removeExpansionChangedListener(
                        mStatusBarExpansionChangedListener));
        if (mLockScreenShadeTransitionController.getUdfpsKeyguardViewController() == this) {
            mLockScreenShadeTransitionController.setUdfpsKeyguardViewController(null);
        }
@@ -146,9 +161,11 @@ public class UdfpsKeyguardViewController extends UdfpsAnimationViewController<Ud
        pw.println("mQsExpanded=" + mQsExpanded);
        pw.println("mIsBouncerVisible=" + mIsBouncerVisible);
        pw.println("mInputBouncerHiddenAmount=" + mInputBouncerHiddenAmount);
        pw.println("mStatusBarExpansion=" + mStatusBarExpansion);
        pw.println("mAlpha=" + mView.getAlpha());
        pw.println("mUdfpsRequested=" + mUdfpsRequested);
        pw.println("mView.mUdfpsRequested=" + mView.mUdfpsRequested);
        pw.println("mLaunchTransitionFadingAway=" + mLaunchTransitionFadingAway);
    }

    /**
@@ -198,6 +215,10 @@ public class UdfpsKeyguardViewController extends UdfpsAnimationViewController<Ud
            return false;
        }

        if (mLaunchTransitionFadingAway) {
            return true;
        }

        if (mStatusBarState != KEYGUARD) {
            return true;
        }
@@ -255,10 +276,13 @@ public class UdfpsKeyguardViewController extends UdfpsAnimationViewController<Ud
    }

    private void updateAlpha() {
        // fade icon on transition to showing bouncer
        // fade icon on transitions to showing the status bar, but if mUdfpsRequested, then
        // the keyguard is occluded by some application - so instead use the input bouncer
        // hidden amount to determine the fade
        float expansion = mUdfpsRequested ? mInputBouncerHiddenAmount : mStatusBarExpansion;
        int alpha = mShowingUdfpsBouncer ? 255
                : (int) MathUtils.constrain(
                    MathUtils.map(.5f, .9f, 0f, 255f, mInputBouncerHiddenAmount),
                    MathUtils.map(.5f, .9f, 0f, 255f, expansion),
                    0f, 255f);
        alpha *= (1.0f - mTransitionToFullShadeProgress);
        mView.setUnpausedAlpha(alpha);
@@ -374,4 +398,23 @@ public class UdfpsKeyguardViewController extends UdfpsAnimationViewController<Ud
                    mView.updateColor();
                }
            };

    private final StatusBar.ExpansionChangedListener mStatusBarExpansionChangedListener =
            new StatusBar.ExpansionChangedListener() {
                @Override
                public void onExpansionChanged(float expansion, boolean expanded) {
                    mStatusBarExpansion = expansion;
                    updateAlpha();
                }
            };

    private final KeyguardStateController.Callback mKeyguardStateControllerCallback =
            new KeyguardStateController.Callback() {
                @Override
                public void onLaunchTransitionFadingAwayChanged() {
                    mLaunchTransitionFadingAway =
                            mKeyguardStateController.isLaunchTransitionFadingAway();
                    updatePauseAuth();
                }
            };
}
+6 −0
Original line number Diff line number Diff line
@@ -251,5 +251,11 @@ public interface KeyguardStateController extends CallbackController<Callback> {
         * {@link KeyguardStateController#isFaceAuthEnabled()}.
         */
        default void onFaceAuthEnabledChanged() {}

        /**
         * Triggered when the notification panel is starting or has finished
         * fading away on transition to an app.
         */
        default void onLaunchTransitionFadingAwayChanged() {}
    }
}
+1 −0
Original line number Diff line number Diff line
@@ -343,6 +343,7 @@ public class KeyguardStateControllerImpl implements KeyguardStateController, Dum
    @Override
    public void setLaunchTransitionFadingAway(boolean fadingAway) {
        mLaunchTransitionFadingAway = fadingAway;
        new ArrayList<>(mCallbacks).forEach(Callback::onLaunchTransitionFadingAwayChanged);
    }

    @Override
+67 −19
Original line number Diff line number Diff line
@@ -23,6 +23,8 @@ import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.atLeast;
import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

@@ -33,7 +35,6 @@ import android.testing.TestableLooper.RunWithLooper;
import androidx.test.filters.SmallTest;

import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.keyguard.KeyguardUpdateMonitorCallback;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.dump.DumpManager;
import com.android.systemui.keyguard.KeyguardViewMediator;
@@ -43,6 +44,7 @@ import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.util.concurrency.DelayableExecutor;
import com.android.systemui.util.time.FakeSystemClock;

@@ -55,6 +57,7 @@ import org.mockito.Mock;
import org.mockito.MockitoAnnotations;

import java.util.Optional;
import java.util.List;

@SmallTest
@RunWith(AndroidTestingRunner.class)
@@ -80,6 +83,8 @@ public class UdfpsKeyguardViewControllerTest extends SysuiTestCase {
    @Mock
    private KeyguardUpdateMonitor mKeyguardUpdateMonitor;
    @Mock
    private KeyguardStateController mKeyguardStateController;
    @Mock
    private KeyguardViewMediator mKeyguardViewMediator;
    @Mock
    private ConfigurationController mConfigurationController;
@@ -94,14 +99,15 @@ public class UdfpsKeyguardViewControllerTest extends SysuiTestCase {
    private StatusBarStateController.StateListener mStatusBarStateListener;

    @Captor private ArgumentCaptor<StatusBar.ExpansionChangedListener> mExpansionListenerCaptor;
    private StatusBar.ExpansionChangedListener mExpansionListener;
    private List<StatusBar.ExpansionChangedListener> mExpansionListeners;

    @Captor private ArgumentCaptor<StatusBarKeyguardViewManager.AlternateAuthInterceptor>
            mAltAuthInterceptorCaptor;
    private StatusBarKeyguardViewManager.AlternateAuthInterceptor mAltAuthInterceptor;

    @Captor private ArgumentCaptor<KeyguardUpdateMonitorCallback> mUpdateMonitorCallbackCaptor;
    private KeyguardUpdateMonitorCallback mKeyguardUpdateMonitorCallback;
    @Captor private ArgumentCaptor<KeyguardStateController.Callback>
            mKeyguardStateControllerCallbackCaptor;
    private KeyguardStateController.Callback mKeyguardStateControllerCallback;

    @Before
    public void setUp() {
@@ -121,13 +127,14 @@ public class UdfpsKeyguardViewControllerTest extends SysuiTestCase {
                mLockscreenShadeTransitionController,
                mConfigurationController,
                mSystemClock,
                mKeyguardStateController,
                mUdfpsController);
    }

    @Test
    public void testRegistersExpansionChangedListenerOnAttached() {
        mController.onViewAttached();
        captureExpansionListener();
        captureExpansionListeners();
    }

    @Test
@@ -156,11 +163,15 @@ public class UdfpsKeyguardViewControllerTest extends SysuiTestCase {
    public void testListenersUnregisteredOnDetached() {
        mController.onViewAttached();
        captureStatusBarStateListeners();
        captureExpansionListener();
        captureExpansionListeners();
        captureKeyguardStateControllerCallback();
        mController.onViewDetached();

        verify(mStatusBarStateController).removeCallback(mStatusBarStateListener);
        verify(mStatusBar).removeExpansionChangedListener(mExpansionListener);
        for (StatusBar.ExpansionChangedListener listener : mExpansionListeners) {
            verify(mStatusBar).removeExpansionChangedListener(listener);
        }
        verify(mKeyguardStateController).removeCallback(mKeyguardStateControllerCallback);
    }

    @Test
@@ -179,7 +190,6 @@ public class UdfpsKeyguardViewControllerTest extends SysuiTestCase {
    public void testShouldPauseAuthBouncerShowing() {
        mController.onViewAttached();
        captureStatusBarStateListeners();
        captureExpansionListener();

        sendStatusBarStateChanged(StatusBarState.KEYGUARD);

@@ -190,18 +200,32 @@ public class UdfpsKeyguardViewControllerTest extends SysuiTestCase {
    public void testShouldNotPauseAuthOnKeyguard() {
        mController.onViewAttached();
        captureStatusBarStateListeners();
        captureExpansionListener();

        sendStatusBarStateChanged(StatusBarState.KEYGUARD);

        assertFalse(mController.shouldPauseAuth());
    }

    @Test
    public void testShouldPauseAuthIsLaunchTransitionFadingAway() {
        // GIVEN view is attached and we're on the keyguard (see testShouldNotPauseAuthOnKeyguard)
        mController.onViewAttached();
        captureStatusBarStateListeners();
        sendStatusBarStateChanged(StatusBarState.KEYGUARD);

        // WHEN isLaunchTransitionFadingAway=true
        captureKeyguardStateControllerCallback();
        when(mKeyguardStateController.isLaunchTransitionFadingAway()).thenReturn(true);
        mKeyguardStateControllerCallback.onLaunchTransitionFadingAwayChanged();

        // THEN pause auth
        assertTrue(mController.shouldPauseAuth());
    }

    @Test
    public void testShouldPauseAuthOnShadeLocked() {
        mController.onViewAttached();
        captureStatusBarStateListeners();
        captureExpansionListener();

        sendStatusBarStateChanged(StatusBarState.SHADE_LOCKED);

@@ -212,7 +236,6 @@ public class UdfpsKeyguardViewControllerTest extends SysuiTestCase {
    public void testShouldPauseAuthOnShade() {
        mController.onViewAttached();
        captureStatusBarStateListeners();
        captureExpansionListener();

        // WHEN not on keyguard yet (shade = home)
        sendStatusBarStateChanged(StatusBarState.SHADE);
@@ -225,7 +248,6 @@ public class UdfpsKeyguardViewControllerTest extends SysuiTestCase {
    public void testShouldPauseAuthAnimatingScreenOffFromShade() {
        mController.onViewAttached();
        captureStatusBarStateListeners();
        captureExpansionListener();

        // WHEN transitioning from home/shade => keyguard + animating screen off
        mStatusBarStateListener.onStatePreChange(StatusBarState.SHADE, StatusBarState.KEYGUARD);
@@ -239,7 +261,6 @@ public class UdfpsKeyguardViewControllerTest extends SysuiTestCase {
    public void testDoNotPauseAuthAnimatingScreenOffFromLS() {
        mController.onViewAttached();
        captureStatusBarStateListeners();
        captureExpansionListener();

        // WHEN animating screen off transition from LS => AOD
        sendStatusBarStateChanged(StatusBarState.KEYGUARD);
@@ -333,6 +354,21 @@ public class UdfpsKeyguardViewControllerTest extends SysuiTestCase {
        verify(mStatusBarKeyguardViewManager).resetAlternateAuth(anyBoolean());
    }

    @Test
    public void testFadeInWithStatusBarExpansion() {
        // GIVEN view is attached
        mController.onViewAttached();
        captureExpansionListeners();
        captureKeyguardStateControllerCallback();
        reset(mView);

        // WHEN status bar expansion is 0
        updateStatusBarExpansion(0, true);

        // THEN alpha is 0
        verify(mView).setUnpausedAlpha(0);
    }

    private void sendStatusBarStateChanged(int statusBarState) {
        mStatusBarStateListener.onStateChanged(statusBarState);
    }
@@ -342,9 +378,18 @@ public class UdfpsKeyguardViewControllerTest extends SysuiTestCase {
        mStatusBarStateListener = mStateListenerCaptor.getValue();
    }

    private void captureExpansionListener() {
        verify(mStatusBar).addExpansionChangedListener(mExpansionListenerCaptor.capture());
        mExpansionListener = mExpansionListenerCaptor.getValue();
    private void captureExpansionListeners() {
        verify(mStatusBar, times(2))
                .addExpansionChangedListener(mExpansionListenerCaptor.capture());
        // first (index=0) is from super class, UdfpsAnimationViewController.
        // second (index=1) is from UdfpsKeyguardViewController
        mExpansionListeners = mExpansionListenerCaptor.getAllValues();
    }

    private void updateStatusBarExpansion(float expansion, boolean expanded) {
        for (StatusBar.ExpansionChangedListener listener : mExpansionListeners) {
            listener.onExpansionChanged(expansion, expanded);
        }
    }

    private void captureAltAuthInterceptor() {
@@ -353,8 +398,11 @@ public class UdfpsKeyguardViewControllerTest extends SysuiTestCase {
        mAltAuthInterceptor = mAltAuthInterceptorCaptor.getValue();
    }

    private void captureKeyguardUpdateMonitorCallback() {
        verify(mKeyguardUpdateMonitor).registerCallback(mUpdateMonitorCallbackCaptor.capture());
        mKeyguardUpdateMonitorCallback = mUpdateMonitorCallbackCaptor.getValue();


    private void captureKeyguardStateControllerCallback() {
        verify(mKeyguardStateController).addCallback(
                mKeyguardStateControllerCallbackCaptor.capture());
        mKeyguardStateControllerCallback = mKeyguardStateControllerCallbackCaptor.getValue();
    }
}