diff options
4 files changed, 55 insertions, 27 deletions
diff --git a/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.kt index 1841d2ea6132..d2b61c0ab745 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.kt @@ -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() } diff --git a/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardSecurityViewFlipperControllerTest.java b/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardSecurityViewFlipperControllerTest.java index 7bb6ef1c8895..23e07b185a2e 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardSecurityViewFlipperControllerTest.java +++ b/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardSecurityViewFlipperControllerTest.java @@ -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 diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java index 8cfb4c5592aa..ff7b2b025539 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java @@ -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); diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityViewFlipperController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityViewFlipperController.java index 120045fc058b..641cac51785f 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityViewFlipperController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityViewFlipperController.java @@ -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,24 +137,26 @@ 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); - // Single bouncer constrains are default - if (mFeatureFlags.isEnabled(LOCKSCREEN_ENABLE_LANDSCAPE)) { - boolean useSplitBouncer = - getResources().getBoolean(R.bool.update_bouncer_constraints) - && getResources().getConfiguration().orientation - == ORIENTATION_LANDSCAPE; + for (OnViewInflatedCallback callback : mOnViewInflatedListeners) { + callback.onViewInflated(childController); + } + mOnViewInflatedListeners.clear(); - updateConstraints(useSplitBouncer); - } + // Single bouncer constrains are default + if (mFeatureFlags.isEnabled(LOCKSCREEN_ENABLE_LANDSCAPE)) { + boolean useSplitBouncer = + getResources().getBoolean(R.bool.update_bouncer_constraints) + && getResources().getConfiguration().orientation + == ORIENTATION_LANDSCAPE; + updateConstraints(useSplitBouncer); } }); } |