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

Commit 63b2f545 authored by Matt Pietal's avatar Matt Pietal Committed by Android (Google) Code Review
Browse files

Merge "Prevent multiple bouncer inflations" into main

parents 2af01947 83ee1661
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -783,7 +783,7 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() {
        underTest.reinflateViewFlipper(onViewInflatedCallback)
        verify(viewFlipperController).clearViews()
        verify(viewFlipperController)
            .asynchronouslyInflateView(any(), any(), onViewInflatedCallbackArgumentCaptor.capture())
            .getSecurityView(any(), any(), onViewInflatedCallbackArgumentCaptor.capture())
        onViewInflatedCallbackArgumentCaptor.value.onViewInflated(inputViewController)
        verify(view).updateSecurityViewFlipper()
    }
+28 −10
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.verify;
@@ -129,23 +130,40 @@ public class KeyguardSecurityViewFlipperControllerTest extends SysuiTestCase {
    }

    @Test
    public void asynchronouslyInflateView() {
        mKeyguardSecurityViewFlipperController.asynchronouslyInflateView(SecurityMode.PIN,
                mKeyguardSecurityCallback, null);
        verify(mAsyncLayoutInflater).inflate(anyInt(), eq(mView), any(
                AsyncLayoutInflater.OnInflateFinishedListener.class));
    public void asynchronouslyInflateView_setNeedsInput() {
        mKeyguardSecurityViewFlipperController.clearViews();
        ArgumentCaptor<AsyncLayoutInflater.OnInflateFinishedListener> argumentCaptor =
                ArgumentCaptor.forClass(AsyncLayoutInflater.OnInflateFinishedListener.class);
        mKeyguardSecurityViewFlipperController.getSecurityView(SecurityMode.PIN,
                mKeyguardSecurityCallback, controller -> {});
        verify(mAsyncLayoutInflater).inflate(anyInt(), eq(mView), argumentCaptor.capture());
        argumentCaptor.getValue().onInflateFinished(
                LayoutInflater.from(getContext()).inflate(R.layout.keyguard_pin_view, null),
                R.layout.keyguard_pin_view, mView);
    }

    @Test
    public void asynchronouslyInflateView_setNeedsInput() {
    public void getSecurityView_multipleInvocations_callsAsyncInflateOnce() {
        mKeyguardSecurityViewFlipperController.clearViews();
        // Make 2 calls to get security view
        var callback1 = mock(KeyguardSecurityViewFlipperController.OnViewInflatedCallback.class);
        var callback2 = mock(KeyguardSecurityViewFlipperController.OnViewInflatedCallback.class);
        mKeyguardSecurityViewFlipperController.getSecurityView(SecurityMode.PIN,
                mKeyguardSecurityCallback, callback1);
        mKeyguardSecurityViewFlipperController.getSecurityView(SecurityMode.PIN,
                mKeyguardSecurityCallback, callback2);

        // Verify inflation is called once...
        ArgumentCaptor<AsyncLayoutInflater.OnInflateFinishedListener> argumentCaptor =
                ArgumentCaptor.forClass(AsyncLayoutInflater.OnInflateFinishedListener.class);
        mKeyguardSecurityViewFlipperController.asynchronouslyInflateView(SecurityMode.PIN,
                mKeyguardSecurityCallback, null);
        verify(mAsyncLayoutInflater).inflate(anyInt(), eq(mView), argumentCaptor.capture());
        argumentCaptor.getValue().onInflateFinished(
                LayoutInflater.from(getContext()).inflate(R.layout.keyguard_password_view, null),
                R.layout.keyguard_password_view, mView);
                LayoutInflater.from(getContext()).inflate(R.layout.keyguard_pin_view, null),
                R.layout.keyguard_pin_view, mView);

        // ... and both callbacks get invoked
        verify(callback1).onViewInflated(mKeyguardInputViewController);
        verify(callback2).onViewInflated(mKeyguardInputViewController);
    }

    @Test
+1 −1
Original line number Diff line number Diff line
@@ -1242,7 +1242,7 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard
    public void reinflateViewFlipper(
            KeyguardSecurityViewFlipperController.OnViewInflatedCallback onViewInflatedListener) {
        mSecurityViewFlipperController.clearViews();
        mSecurityViewFlipperController.asynchronouslyInflateView(mCurrentSecurityMode,
        mSecurityViewFlipperController.getSecurityView(mCurrentSecurityMode,
                mKeyguardSecurityCallback, (controller) -> {
                mView.updateSecurityViewFlipper();
                onViewInflatedListener.onViewInflated(controller);
+25 −15
Original line number Diff line number Diff line
@@ -23,7 +23,6 @@ import static com.android.systemui.flags.Flags.LOCKSCREEN_ENABLE_LANDSCAPE;
import android.util.Log;
import android.view.LayoutInflater;

import androidx.annotation.Nullable;
import androidx.asynclayoutinflater.view.AsyncLayoutInflater;

import com.android.internal.annotations.VisibleForTesting;
@@ -35,7 +34,9 @@ import com.android.systemui.res.R;
import com.android.systemui.util.ViewController;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.inject.Inject;

@@ -56,6 +57,8 @@ public class KeyguardSecurityViewFlipperController
    private final EmergencyButtonController.Factory mEmergencyButtonControllerFactory;
    private final Factory mKeyguardSecurityViewControllerFactory;
    private final FeatureFlags mFeatureFlags;
    private final List<OnViewInflatedCallback> mOnViewInflatedListeners = new ArrayList<>();
    private final Set<SecurityMode> mSecurityModeInProgress = new HashSet<>();

    @Inject
    protected KeyguardSecurityViewFlipperController(KeyguardSecurityViewFlipper view,
@@ -106,7 +109,13 @@ public class KeyguardSecurityViewFlipperController
            }
        }

        asynchronouslyInflateView(securityMode, keyguardSecurityCallback, onViewInflatedCallback);
        // Prevent multiple inflations for the same security mode. Instead, add callback to a list
        // and then notify each in order when the view is inflated.
        mOnViewInflatedListeners.add(onViewInflatedCallback);
        if (!mSecurityModeInProgress.contains(securityMode)) {
            mSecurityModeInProgress.add(securityMode);
            asynchronouslyInflateView(securityMode, keyguardSecurityCallback);
        }
    }

    /**
@@ -117,9 +126,8 @@ public class KeyguardSecurityViewFlipperController
     * @param securityMode
     * @param keyguardSecurityCallback
     */
    public void asynchronouslyInflateView(SecurityMode securityMode,
            KeyguardSecurityCallback keyguardSecurityCallback,
            @Nullable OnViewInflatedCallback onViewInflatedListener) {
    private void asynchronouslyInflateView(SecurityMode securityMode,
            KeyguardSecurityCallback keyguardSecurityCallback) {
        int layoutId = mFeatureFlags.isEnabled(LOCKSCREEN_ENABLE_LANDSCAPE)
                ? getLayoutIdFor(securityMode) : getLegacyLayoutIdFor(securityMode);
        if (layoutId != 0) {
@@ -129,14 +137,18 @@ public class KeyguardSecurityViewFlipperController
            mAsyncLayoutInflater.inflate(layoutId, mView,
                    (view, resId, parent) -> {
                        mView.addView(view);
                        mSecurityModeInProgress.remove(securityMode);
                        KeyguardInputViewController<KeyguardInputView> childController =
                                mKeyguardSecurityViewControllerFactory.create(
                                        (KeyguardInputView) view,
                                        securityMode, keyguardSecurityCallback);
                        childController.init();
                        mChildren.add(childController);
                        if (onViewInflatedListener != null) {
                            onViewInflatedListener.onViewInflated(childController);

                        for (OnViewInflatedCallback callback : mOnViewInflatedListeners) {
                            callback.onViewInflated(childController);
                        }
                        mOnViewInflatedListeners.clear();

                        // Single bouncer constrains are default
                        if (mFeatureFlags.isEnabled(LOCKSCREEN_ENABLE_LANDSCAPE)) {
@@ -144,10 +156,8 @@ public class KeyguardSecurityViewFlipperController
                                    getResources().getBoolean(R.bool.update_bouncer_constraints)
                                        && getResources().getConfiguration().orientation
                                            == ORIENTATION_LANDSCAPE;

                            updateConstraints(useSplitBouncer);
                        }
                        }
                    });
        }
    }