summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.kt2
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardSecurityViewFlipperControllerTest.java38
-rw-r--r--packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java2
-rw-r--r--packages/SystemUI/src/com/android/keyguard/KeyguardSecurityViewFlipperController.java40
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);
}
});
}