Merge "Asynchronously inflate the bouncer." into tm-qpr-dev am: bbb5aea293

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/21801838

Change-Id: I5fa31104ad87b04b5e63a9fa2ed26f41abde7ad6
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Aaron Liu
2023-03-14 19:24:07 +00:00
committed by Automerger Merge Worker
9 changed files with 178 additions and 68 deletions

View File

@@ -18,13 +18,9 @@ package com.android.keyguard;
import android.content.Context; import android.content.Context;
import android.content.res.TypedArray; import android.content.res.TypedArray;
import android.os.Handler;
import android.os.Looper;
import android.os.SystemClock;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.util.TypedValue; import android.util.TypedValue;
import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.TextView; import android.widget.TextView;
@@ -33,22 +29,10 @@ import androidx.annotation.Nullable;
import com.android.internal.policy.SystemBarUtils; import com.android.internal.policy.SystemBarUtils;
import com.android.systemui.R; import com.android.systemui.R;
import java.lang.ref.WeakReference;
/*** /***
* Manages a number of views inside of the given layout. See below for a list of widgets. * Manages a number of views inside of the given layout. See below for a list of widgets.
*/ */
public abstract class KeyguardMessageArea extends TextView implements SecurityMessageDisplay { public abstract class KeyguardMessageArea extends TextView implements SecurityMessageDisplay {
/** Handler token posted with accessibility announcement runnables. */
private static final Object ANNOUNCE_TOKEN = new Object();
/**
* Delay before speaking an accessibility announcement. Used to prevent
* lift-to-type from interrupting itself.
*/
private static final long ANNOUNCEMENT_DELAY = 250;
private final Handler mHandler;
private CharSequence mMessage; private CharSequence mMessage;
private boolean mIsVisible; private boolean mIsVisible;
@@ -65,7 +49,6 @@ public abstract class KeyguardMessageArea extends TextView implements SecurityMe
super(context, attrs); super(context, attrs);
setLayerType(LAYER_TYPE_HARDWARE, null); // work around nested unclipped SaveLayer bug setLayerType(LAYER_TYPE_HARDWARE, null); // work around nested unclipped SaveLayer bug
mHandler = new Handler(Looper.myLooper());
onThemeChanged(); onThemeChanged();
} }
@@ -127,9 +110,6 @@ public abstract class KeyguardMessageArea extends TextView implements SecurityMe
private void securityMessageChanged(CharSequence message) { private void securityMessageChanged(CharSequence message) {
mMessage = message; mMessage = message;
update(); update();
mHandler.removeCallbacksAndMessages(ANNOUNCE_TOKEN);
mHandler.postAtTime(new AnnounceRunnable(this, getText()), ANNOUNCE_TOKEN,
(SystemClock.uptimeMillis() + ANNOUNCEMENT_DELAY));
} }
private void clearMessage() { private void clearMessage() {
@@ -156,25 +136,4 @@ public abstract class KeyguardMessageArea extends TextView implements SecurityMe
/** Set the text color */ /** Set the text color */
protected abstract void updateTextColor(); protected abstract void updateTextColor();
/**
* Runnable used to delay accessibility announcements.
*/
private static class AnnounceRunnable implements Runnable {
private final WeakReference<View> mHost;
private final CharSequence mTextToAnnounce;
AnnounceRunnable(View host, CharSequence textToAnnounce) {
mHost = new WeakReference<View>(host);
mTextToAnnounce = textToAnnounce;
}
@Override
public void run() {
final View host = mHost.get();
if (host != null) {
host.announceForAccessibility(mTextToAnnounce);
}
}
}
} }

View File

@@ -18,11 +18,17 @@ package com.android.keyguard;
import android.content.res.ColorStateList; import android.content.res.ColorStateList;
import android.content.res.Configuration; import android.content.res.Configuration;
import android.text.TextUtils;
import android.view.View;
import androidx.annotation.VisibleForTesting;
import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener; import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener;
import com.android.systemui.util.ViewController; import com.android.systemui.util.ViewController;
import java.lang.ref.WeakReference;
import javax.inject.Inject; import javax.inject.Inject;
/** /**
@@ -31,8 +37,14 @@ import javax.inject.Inject;
*/ */
public class KeyguardMessageAreaController<T extends KeyguardMessageArea> public class KeyguardMessageAreaController<T extends KeyguardMessageArea>
extends ViewController<T> { extends ViewController<T> {
/**
* Delay before speaking an accessibility announcement. Used to prevent
* lift-to-type from interrupting itself.
*/
private static final long ANNOUNCEMENT_DELAY = 250;
private final KeyguardUpdateMonitor mKeyguardUpdateMonitor; private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
private final ConfigurationController mConfigurationController; private final ConfigurationController mConfigurationController;
private final AnnounceRunnable mAnnounceRunnable;
private KeyguardUpdateMonitorCallback mInfoCallback = new KeyguardUpdateMonitorCallback() { private KeyguardUpdateMonitorCallback mInfoCallback = new KeyguardUpdateMonitorCallback() {
public void onFinishedGoingToSleep(int why) { public void onFinishedGoingToSleep(int why) {
@@ -68,6 +80,7 @@ public class KeyguardMessageAreaController<T extends KeyguardMessageArea>
mKeyguardUpdateMonitor = keyguardUpdateMonitor; mKeyguardUpdateMonitor = keyguardUpdateMonitor;
mConfigurationController = configurationController; mConfigurationController = configurationController;
mAnnounceRunnable = new AnnounceRunnable(mView);
} }
@Override @Override
@@ -100,6 +113,12 @@ public class KeyguardMessageAreaController<T extends KeyguardMessageArea>
*/ */
public void setMessage(CharSequence s, boolean animate) { public void setMessage(CharSequence s, boolean animate) {
mView.setMessage(s, animate); mView.setMessage(s, animate);
CharSequence msg = mView.getText();
if (!TextUtils.isEmpty(msg)) {
mView.removeCallbacks(mAnnounceRunnable);
mAnnounceRunnable.setTextToAnnounce(msg);
mView.postDelayed(mAnnounceRunnable, ANNOUNCEMENT_DELAY);
}
} }
public void setMessage(int resId) { public void setMessage(int resId) {
@@ -134,4 +153,30 @@ public class KeyguardMessageAreaController<T extends KeyguardMessageArea>
view, mKeyguardUpdateMonitor, mConfigurationController); view, mKeyguardUpdateMonitor, mConfigurationController);
} }
} }
/**
* Runnable used to delay accessibility announcements.
*/
@VisibleForTesting
public static class AnnounceRunnable implements Runnable {
private final WeakReference<View> mHost;
private CharSequence mTextToAnnounce;
AnnounceRunnable(View host) {
mHost = new WeakReference<>(host);
}
/** Sets the text to announce. */
public void setTextToAnnounce(CharSequence textToAnnounce) {
mTextToAnnounce = textToAnnounce;
}
@Override
public void run() {
final View host = mHost.get();
if (host != null) {
host.announceForAccessibility(mTextToAnnounce);
}
}
}
} }

View File

@@ -1065,23 +1065,28 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard
} }
private void reloadColors() { private void reloadColors() {
reinflateViewFlipper(); reinflateViewFlipper(() -> mView.reloadColors());
mView.reloadColors();
} }
/** Handles density or font scale changes. */ /** Handles density or font scale changes. */
private void onDensityOrFontScaleChanged() { private void onDensityOrFontScaleChanged() {
reinflateViewFlipper(); reinflateViewFlipper(() -> mView.onDensityOrFontScaleChanged());
mView.onDensityOrFontScaleChanged();
} }
/** /**
* Reinflate the view flipper child view. * Reinflate the view flipper child view.
*/ */
public void reinflateViewFlipper() { public void reinflateViewFlipper(
KeyguardSecurityViewFlipperController.OnViewInflatedListener onViewInflatedListener) {
mSecurityViewFlipperController.clearViews(); mSecurityViewFlipperController.clearViews();
mSecurityViewFlipperController.getSecurityView(mCurrentSecurityMode, if (mFeatureFlags.isEnabled(Flags.ASYNC_INFLATE_BOUNCER)) {
mKeyguardSecurityCallback); mSecurityViewFlipperController.asynchronouslyInflateView(mCurrentSecurityMode,
mKeyguardSecurityCallback, onViewInflatedListener);
} else {
mSecurityViewFlipperController.getSecurityView(mCurrentSecurityMode,
mKeyguardSecurityCallback);
onViewInflatedListener.onViewInflated();
}
} }
/** /**

View File

@@ -19,11 +19,16 @@ package com.android.keyguard;
import android.util.Log; import android.util.Log;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import androidx.annotation.Nullable;
import androidx.asynclayoutinflater.view.AsyncLayoutInflater;
import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting;
import com.android.keyguard.KeyguardInputViewController.Factory; import com.android.keyguard.KeyguardInputViewController.Factory;
import com.android.keyguard.KeyguardSecurityModel.SecurityMode; import com.android.keyguard.KeyguardSecurityModel.SecurityMode;
import com.android.keyguard.dagger.KeyguardBouncerScope; import com.android.keyguard.dagger.KeyguardBouncerScope;
import com.android.systemui.R; import com.android.systemui.R;
import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.flags.Flags;
import com.android.systemui.util.ViewController; import com.android.systemui.util.ViewController;
import java.util.ArrayList; import java.util.ArrayList;
@@ -44,18 +49,24 @@ public class KeyguardSecurityViewFlipperController
private final List<KeyguardInputViewController<KeyguardInputView>> mChildren = private final List<KeyguardInputViewController<KeyguardInputView>> mChildren =
new ArrayList<>(); new ArrayList<>();
private final LayoutInflater mLayoutInflater; private final LayoutInflater mLayoutInflater;
private final AsyncLayoutInflater mAsyncLayoutInflater;
private final EmergencyButtonController.Factory mEmergencyButtonControllerFactory; private final EmergencyButtonController.Factory mEmergencyButtonControllerFactory;
private final Factory mKeyguardSecurityViewControllerFactory; private final Factory mKeyguardSecurityViewControllerFactory;
private final FeatureFlags mFeatureFlags;
@Inject @Inject
protected KeyguardSecurityViewFlipperController(KeyguardSecurityViewFlipper view, protected KeyguardSecurityViewFlipperController(KeyguardSecurityViewFlipper view,
LayoutInflater layoutInflater, LayoutInflater layoutInflater,
AsyncLayoutInflater asyncLayoutInflater,
KeyguardInputViewController.Factory keyguardSecurityViewControllerFactory, KeyguardInputViewController.Factory keyguardSecurityViewControllerFactory,
EmergencyButtonController.Factory emergencyButtonControllerFactory) { EmergencyButtonController.Factory emergencyButtonControllerFactory,
FeatureFlags featureFlags) {
super(view); super(view);
mKeyguardSecurityViewControllerFactory = keyguardSecurityViewControllerFactory; mKeyguardSecurityViewControllerFactory = keyguardSecurityViewControllerFactory;
mLayoutInflater = layoutInflater; mLayoutInflater = layoutInflater;
mEmergencyButtonControllerFactory = emergencyButtonControllerFactory; mEmergencyButtonControllerFactory = emergencyButtonControllerFactory;
mAsyncLayoutInflater = asyncLayoutInflater;
mFeatureFlags = featureFlags;
} }
@Override @Override
@@ -92,13 +103,12 @@ public class KeyguardSecurityViewFlipperController
} }
} }
if (childController == null if (!mFeatureFlags.isEnabled(Flags.ASYNC_INFLATE_BOUNCER) && childController == null
&& securityMode != SecurityMode.None && securityMode != SecurityMode.Invalid) { && securityMode != SecurityMode.None && securityMode != SecurityMode.Invalid) {
int layoutId = getLayoutIdFor(securityMode); int layoutId = getLayoutIdFor(securityMode);
KeyguardInputView view = null; KeyguardInputView view = null;
if (layoutId != 0) { if (layoutId != 0) {
if (DEBUG) Log.v(TAG, "inflating id = " + layoutId); if (DEBUG) Log.v(TAG, "inflating on main thread id = " + layoutId);
view = (KeyguardInputView) mLayoutInflater.inflate( view = (KeyguardInputView) mLayoutInflater.inflate(
layoutId, mView, false); layoutId, mView, false);
mView.addView(view); mView.addView(view);
@@ -119,6 +129,36 @@ public class KeyguardSecurityViewFlipperController
return childController; return childController;
} }
/**
* Asynchronously inflate view and then add it to view flipper on the main thread when complete.
*
* OnInflateFinishedListener will be called on the main thread.
*
* @param securityMode
* @param keyguardSecurityCallback
*/
public void asynchronouslyInflateView(SecurityMode securityMode,
KeyguardSecurityCallback keyguardSecurityCallback,
@Nullable OnViewInflatedListener onViewInflatedListener) {
int layoutId = getLayoutIdFor(securityMode);
if (layoutId != 0) {
if (DEBUG) Log.v(TAG, "inflating on bg thread id = " + layoutId);
mAsyncLayoutInflater.inflate(layoutId, mView,
(view, resId, parent) -> {
mView.addView(view);
KeyguardInputViewController<KeyguardInputView> childController =
mKeyguardSecurityViewControllerFactory.create(
(KeyguardInputView) view, securityMode,
keyguardSecurityCallback);
childController.init();
mChildren.add(childController);
if (onViewInflatedListener != null) {
onViewInflatedListener.onViewInflated();
}
});
}
}
private int getLayoutIdFor(SecurityMode securityMode) { private int getLayoutIdFor(SecurityMode securityMode) {
switch (securityMode) { switch (securityMode) {
case Pattern: return R.layout.keyguard_pattern_view; case Pattern: return R.layout.keyguard_pattern_view;
@@ -162,4 +202,10 @@ public class KeyguardSecurityViewFlipperController
return 0; return 0;
} }
} }
/** Listener to when view has finished inflation. */
public interface OnViewInflatedListener {
/** Notifies that view has been inflated */
void onViewInflated();
}
} }

View File

@@ -97,6 +97,7 @@ import android.view.accessibility.CaptioningManager;
import android.view.inputmethod.InputMethodManager; import android.view.inputmethod.InputMethodManager;
import android.view.textclassifier.TextClassificationManager; import android.view.textclassifier.TextClassificationManager;
import androidx.asynclayoutinflater.view.AsyncLayoutInflater;
import androidx.core.app.NotificationManagerCompat; import androidx.core.app.NotificationManagerCompat;
import com.android.internal.app.IBatteryStats; import com.android.internal.app.IBatteryStats;
@@ -388,6 +389,13 @@ public class FrameworkServicesModule {
return LayoutInflater.from(context); return LayoutInflater.from(context);
} }
/** */
@Provides
@Singleton
public AsyncLayoutInflater provideAsyncLayoutInflater(Context context) {
return new AsyncLayoutInflater(context);
}
@Provides @Provides
static MediaProjectionManager provideMediaProjectionManager(Context context) { static MediaProjectionManager provideMediaProjectionManager(Context context) {
return context.getSystemService(MediaProjectionManager.class); return context.getSystemService(MediaProjectionManager.class);

View File

@@ -34,7 +34,6 @@ import com.android.systemui.keyguard.ui.viewmodel.PrimaryBouncerToGoneTransition
import com.android.systemui.lifecycle.repeatWhenAttached import com.android.systemui.lifecycle.repeatWhenAttached
import com.android.systemui.plugins.ActivityStarter import com.android.systemui.plugins.ActivityStarter
import kotlinx.coroutines.awaitCancellation import kotlinx.coroutines.awaitCancellation
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@@ -112,16 +111,18 @@ object KeyguardBouncerViewBinder {
launch { launch {
viewModel.show.collect { viewModel.show.collect {
// Reset Security Container entirely. // Reset Security Container entirely.
view.visibility = View.VISIBLE securityContainerController.reinflateViewFlipper {
securityContainerController.onBouncerVisibilityChanged( // Reset Security Container entirely.
/* isVisible= */ true view.visibility = View.VISIBLE
) securityContainerController.onBouncerVisibilityChanged(
securityContainerController.reinflateViewFlipper() /* isVisible= */ true
securityContainerController.showPrimarySecurityScreen( )
/* turningOff= */ false securityContainerController.showPrimarySecurityScreen(
) /* turningOff= */ false
securityContainerController.appear() )
securityContainerController.onResume(KeyguardSecurityView.SCREEN_ON) securityContainerController.appear()
securityContainerController.onResume(KeyguardSecurityView.SCREEN_ON)
}
} }
} }

View File

@@ -18,12 +18,15 @@ package com.android.keyguard;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import android.test.suitebuilder.annotation.SmallTest; import android.test.suitebuilder.annotation.SmallTest;
import android.testing.AndroidTestingRunner; import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import com.android.systemui.SysuiTestCase; import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.ConfigurationController;
@@ -37,6 +40,7 @@ import org.mockito.Mock;
import org.mockito.MockitoAnnotations; import org.mockito.MockitoAnnotations;
@SmallTest @SmallTest
@TestableLooper.RunWithLooper
@RunWith(AndroidTestingRunner.class) @RunWith(AndroidTestingRunner.class)
public class KeyguardMessageAreaControllerTest extends SysuiTestCase { public class KeyguardMessageAreaControllerTest extends SysuiTestCase {
@Mock @Mock
@@ -45,14 +49,14 @@ public class KeyguardMessageAreaControllerTest extends SysuiTestCase {
private KeyguardUpdateMonitor mKeyguardUpdateMonitor; private KeyguardUpdateMonitor mKeyguardUpdateMonitor;
@Mock @Mock
private KeyguardMessageArea mKeyguardMessageArea; private KeyguardMessageArea mKeyguardMessageArea;
private KeyguardMessageAreaController mMessageAreaController; private KeyguardMessageAreaController mMessageAreaController;
@Before @Before
public void setUp() throws Exception { public void setUp() throws Exception {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
mMessageAreaController = new KeyguardMessageAreaController.Factory( mMessageAreaController = new KeyguardMessageAreaController.Factory(
mKeyguardUpdateMonitor, mConfigurationController).create(mKeyguardMessageArea); mKeyguardUpdateMonitor, mConfigurationController).create(
mKeyguardMessageArea);
} }
@Test @Test
@@ -88,6 +92,19 @@ public class KeyguardMessageAreaControllerTest extends SysuiTestCase {
verify(mKeyguardMessageArea).setMessage("", /* animate= */ true); verify(mKeyguardMessageArea).setMessage("", /* animate= */ true);
} }
@Test
public void testSetMessage_AnnounceForAccessibility() {
ArgumentCaptor<Runnable> argumentCaptor = ArgumentCaptor.forClass(Runnable.class);
when(mKeyguardMessageArea.getText()).thenReturn("abc");
mMessageAreaController.setMessage("abc");
verify(mKeyguardMessageArea).setMessage("abc", /* animate= */ true);
verify(mKeyguardMessageArea).removeCallbacks(any(Runnable.class));
verify(mKeyguardMessageArea).postDelayed(argumentCaptor.capture(), anyLong());
argumentCaptor.getValue().run();
verify(mKeyguardMessageArea).announceForAccessibility("abc");
}
@Test @Test
public void testSetBouncerVisible() { public void testSetBouncerVisible() {
mMessageAreaController.setIsVisible(true); mMessageAreaController.setIsVisible(true);

View File

@@ -66,6 +66,7 @@ import com.android.systemui.biometrics.SideFpsUiRequestSource;
import com.android.systemui.classifier.FalsingA11yDelegate; import com.android.systemui.classifier.FalsingA11yDelegate;
import com.android.systemui.classifier.FalsingCollector; import com.android.systemui.classifier.FalsingCollector;
import com.android.systemui.flags.FeatureFlags; import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.flags.Flags;
import com.android.systemui.log.SessionTracker; import com.android.systemui.log.SessionTracker;
import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.plugins.FalsingManager; import com.android.systemui.plugins.FalsingManager;
@@ -617,12 +618,25 @@ public class KeyguardSecurityContainerControllerTest extends SysuiTestCase {
@Test @Test
public void testReinflateViewFlipper() { public void testReinflateViewFlipper() {
mKeyguardSecurityContainerController.reinflateViewFlipper(); mKeyguardSecurityContainerController.reinflateViewFlipper(() -> {});
verify(mKeyguardSecurityViewFlipperController).clearViews(); verify(mKeyguardSecurityViewFlipperController).clearViews();
verify(mKeyguardSecurityViewFlipperController).getSecurityView(any(SecurityMode.class), verify(mKeyguardSecurityViewFlipperController).getSecurityView(any(SecurityMode.class),
any(KeyguardSecurityCallback.class)); any(KeyguardSecurityCallback.class));
} }
@Test
public void testReinflateViewFlipper_asyncBouncerFlagOn() {
when(mFeatureFlags.isEnabled(Flags.ASYNC_INFLATE_BOUNCER)).thenReturn(true);
KeyguardSecurityViewFlipperController.OnViewInflatedListener onViewInflatedListener =
() -> {
};
mKeyguardSecurityContainerController.reinflateViewFlipper(onViewInflatedListener);
verify(mKeyguardSecurityViewFlipperController).clearViews();
verify(mKeyguardSecurityViewFlipperController).asynchronouslyInflateView(
any(SecurityMode.class),
any(KeyguardSecurityCallback.class), eq(onViewInflatedListener));
}
@Test @Test
public void testSideFpsControllerShow() { public void testSideFpsControllerShow() {
mKeyguardSecurityContainerController.updateSideFpsVisibility(/* isVisible= */ true); mKeyguardSecurityContainerController.updateSideFpsVisibility(/* isVisible= */ true);

View File

@@ -31,10 +31,12 @@ import android.view.LayoutInflater;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.WindowInsetsController; import android.view.WindowInsetsController;
import androidx.asynclayoutinflater.view.AsyncLayoutInflater;
import androidx.test.filters.SmallTest; import androidx.test.filters.SmallTest;
import com.android.keyguard.KeyguardSecurityModel.SecurityMode; import com.android.keyguard.KeyguardSecurityModel.SecurityMode;
import com.android.systemui.SysuiTestCase; import com.android.systemui.SysuiTestCase;
import com.android.systemui.flags.FeatureFlags;
import org.junit.Before; import org.junit.Before;
import org.junit.Rule; import org.junit.Rule;
@@ -57,6 +59,8 @@ public class KeyguardSecurityViewFlipperControllerTest extends SysuiTestCase {
@Mock @Mock
private LayoutInflater mLayoutInflater; private LayoutInflater mLayoutInflater;
@Mock @Mock
private AsyncLayoutInflater mAsyncLayoutInflater;
@Mock
private KeyguardInputViewController.Factory mKeyguardSecurityViewControllerFactory; private KeyguardInputViewController.Factory mKeyguardSecurityViewControllerFactory;
@Mock @Mock
private EmergencyButtonController.Factory mEmergencyButtonControllerFactory; private EmergencyButtonController.Factory mEmergencyButtonControllerFactory;
@@ -70,6 +74,8 @@ public class KeyguardSecurityViewFlipperControllerTest extends SysuiTestCase {
private WindowInsetsController mWindowInsetsController; private WindowInsetsController mWindowInsetsController;
@Mock @Mock
private KeyguardSecurityCallback mKeyguardSecurityCallback; private KeyguardSecurityCallback mKeyguardSecurityCallback;
@Mock
private FeatureFlags mFeatureFlags;
private KeyguardSecurityViewFlipperController mKeyguardSecurityViewFlipperController; private KeyguardSecurityViewFlipperController mKeyguardSecurityViewFlipperController;
@@ -82,10 +88,11 @@ public class KeyguardSecurityViewFlipperControllerTest extends SysuiTestCase {
when(mView.getWindowInsetsController()).thenReturn(mWindowInsetsController); when(mView.getWindowInsetsController()).thenReturn(mWindowInsetsController);
when(mEmergencyButtonControllerFactory.create(any(EmergencyButton.class))) when(mEmergencyButtonControllerFactory.create(any(EmergencyButton.class)))
.thenReturn(mEmergencyButtonController); .thenReturn(mEmergencyButtonController);
when(mView.getContext()).thenReturn(getContext());
mKeyguardSecurityViewFlipperController = new KeyguardSecurityViewFlipperController(mView, mKeyguardSecurityViewFlipperController = new KeyguardSecurityViewFlipperController(mView,
mLayoutInflater, mKeyguardSecurityViewControllerFactory, mLayoutInflater, mAsyncLayoutInflater, mKeyguardSecurityViewControllerFactory,
mEmergencyButtonControllerFactory); mEmergencyButtonControllerFactory, mFeatureFlags);
} }
@Test @Test
@@ -107,6 +114,14 @@ 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));
}
@Test @Test
public void onDensityOrFontScaleChanged() { public void onDensityOrFontScaleChanged() {
mKeyguardSecurityViewFlipperController.clearViews(); mKeyguardSecurityViewFlipperController.clearViews();