Merge changes from topic "b150393918-lock-icon-controller" into rvc-dev am: a40c4b47ef am: ab1cb86280
Change-Id: I36a360563dfc8d52c50647ac889f526f2c1523e8
This commit is contained in:
@@ -88,6 +88,7 @@ import com.android.systemui.shared.plugins.PluginManager;
|
||||
import com.android.systemui.stackdivider.Divider;
|
||||
import com.android.systemui.statusbar.CommandQueue;
|
||||
import com.android.systemui.statusbar.FlingAnimationUtils;
|
||||
import com.android.systemui.statusbar.KeyguardIndicationController;
|
||||
import com.android.systemui.statusbar.NavigationBarController;
|
||||
import com.android.systemui.statusbar.NotificationLockscreenUserManager;
|
||||
import com.android.systemui.statusbar.NotificationMediaManager;
|
||||
@@ -326,6 +327,7 @@ public class CarStatusBar extends StatusBar implements CarBatteryController.Batt
|
||||
ExtensionController extensionController,
|
||||
UserInfoControllerImpl userInfoControllerImpl,
|
||||
PhoneStatusBarPolicy phoneStatusBarPolicy,
|
||||
KeyguardIndicationController keyguardIndicationController,
|
||||
DismissCallbackRegistry dismissCallbackRegistry,
|
||||
StatusBarTouchableRegionManager statusBarTouchableRegionManager,
|
||||
/* Car Settings injected components. */
|
||||
@@ -410,6 +412,7 @@ public class CarStatusBar extends StatusBar implements CarBatteryController.Batt
|
||||
extensionController,
|
||||
userInfoControllerImpl,
|
||||
phoneStatusBarPolicy,
|
||||
keyguardIndicationController,
|
||||
dismissCallbackRegistry,
|
||||
statusBarTouchableRegionManager);
|
||||
mUserSwitcherController = userSwitcherController;
|
||||
|
||||
@@ -48,6 +48,7 @@ import com.android.systemui.shared.plugins.PluginManager;
|
||||
import com.android.systemui.stackdivider.Divider;
|
||||
import com.android.systemui.statusbar.CommandQueue;
|
||||
import com.android.systemui.statusbar.FlingAnimationUtils;
|
||||
import com.android.systemui.statusbar.KeyguardIndicationController;
|
||||
import com.android.systemui.statusbar.NavigationBarController;
|
||||
import com.android.systemui.statusbar.NotificationLockscreenUserManager;
|
||||
import com.android.systemui.statusbar.NotificationMediaManager;
|
||||
@@ -199,6 +200,7 @@ public class CarStatusBarModule {
|
||||
ExtensionController extensionController,
|
||||
UserInfoControllerImpl userInfoControllerImpl,
|
||||
PhoneStatusBarPolicy phoneStatusBarPolicy,
|
||||
KeyguardIndicationController keyguardIndicationController,
|
||||
DismissCallbackRegistry dismissCallbackRegistry,
|
||||
StatusBarTouchableRegionManager statusBarTouchableRegionManager,
|
||||
CarServiceProvider carServiceProvider,
|
||||
@@ -281,6 +283,7 @@ public class CarStatusBarModule {
|
||||
extensionController,
|
||||
userInfoControllerImpl,
|
||||
phoneStatusBarPolicy,
|
||||
keyguardIndicationController,
|
||||
dismissCallbackRegistry,
|
||||
statusBarTouchableRegionManager,
|
||||
carServiceProvider,
|
||||
|
||||
@@ -34,14 +34,12 @@ import com.android.systemui.keyguard.DismissCallbackRegistry;
|
||||
import com.android.systemui.plugins.FalsingManager;
|
||||
import com.android.systemui.plugins.statusbar.StatusBarStateController;
|
||||
import com.android.systemui.screenshot.ScreenshotNotificationSmartActionsProvider;
|
||||
import com.android.systemui.statusbar.KeyguardIndicationController;
|
||||
import com.android.systemui.statusbar.NotificationListener;
|
||||
import com.android.systemui.statusbar.NotificationMediaManager;
|
||||
import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator;
|
||||
import com.android.systemui.statusbar.phone.DozeParameters;
|
||||
import com.android.systemui.statusbar.phone.KeyguardBouncer;
|
||||
import com.android.systemui.statusbar.phone.KeyguardBypassController;
|
||||
import com.android.systemui.statusbar.phone.LockIcon;
|
||||
import com.android.systemui.statusbar.phone.NotificationIconAreaController;
|
||||
import com.android.systemui.statusbar.phone.StatusBar;
|
||||
import com.android.systemui.statusbar.policy.KeyguardStateController;
|
||||
@@ -158,11 +156,6 @@ public class SystemUIFactory {
|
||||
Dependency.get(DozeParameters.class));
|
||||
}
|
||||
|
||||
public KeyguardIndicationController createKeyguardIndicationController(Context context,
|
||||
ViewGroup indicationArea, LockIcon lockIcon) {
|
||||
return new KeyguardIndicationController(context, indicationArea, lockIcon);
|
||||
}
|
||||
|
||||
@Module
|
||||
public static class ContextHolder {
|
||||
private Context mContext;
|
||||
|
||||
@@ -36,6 +36,7 @@ import android.content.res.Resources;
|
||||
import android.hardware.SensorPrivacyManager;
|
||||
import android.media.AudioManager;
|
||||
import android.net.ConnectivityManager;
|
||||
import android.os.BatteryStats;
|
||||
import android.os.Handler;
|
||||
import android.os.PowerManager;
|
||||
import android.os.ServiceManager;
|
||||
@@ -51,6 +52,7 @@ import android.view.WindowManager;
|
||||
import android.view.WindowManagerGlobal;
|
||||
import android.view.accessibility.AccessibilityManager;
|
||||
|
||||
import com.android.internal.app.IBatteryStats;
|
||||
import com.android.internal.statusbar.IStatusBarService;
|
||||
import com.android.internal.util.LatencyTracker;
|
||||
import com.android.settingslib.bluetooth.LocalBluetoothManager;
|
||||
@@ -123,6 +125,13 @@ public class SystemServicesModule {
|
||||
return ActivityManager.getService();
|
||||
}
|
||||
|
||||
@Provides
|
||||
@Singleton
|
||||
static IBatteryStats provideIBatteryStats() {
|
||||
return IBatteryStats.Stub.asInterface(
|
||||
ServiceManager.getService(BatteryStats.SERVICE_NAME));
|
||||
}
|
||||
|
||||
@Provides
|
||||
@Singleton
|
||||
static IDreamManager provideIDreamManager() {
|
||||
|
||||
@@ -25,12 +25,9 @@ import android.hardware.biometrics.BiometricSourceType;
|
||||
import android.hardware.face.FaceManager;
|
||||
import android.hardware.fingerprint.FingerprintManager;
|
||||
import android.os.BatteryManager;
|
||||
import android.os.BatteryStats;
|
||||
import android.os.Handler;
|
||||
import android.os.Message;
|
||||
import android.os.RemoteException;
|
||||
import android.os.ServiceManager;
|
||||
import android.os.UserManager;
|
||||
import android.text.TextUtils;
|
||||
import android.text.format.Formatter;
|
||||
import android.util.Log;
|
||||
@@ -39,27 +36,20 @@ import android.view.ViewGroup;
|
||||
|
||||
import com.android.internal.annotations.VisibleForTesting;
|
||||
import com.android.internal.app.IBatteryStats;
|
||||
import com.android.internal.logging.nano.MetricsProto;
|
||||
import com.android.internal.widget.LockPatternUtils;
|
||||
import com.android.internal.widget.ViewClippingUtil;
|
||||
import com.android.keyguard.KeyguardUpdateMonitor;
|
||||
import com.android.keyguard.KeyguardUpdateMonitorCallback;
|
||||
import com.android.settingslib.Utils;
|
||||
import com.android.settingslib.fuelgauge.BatteryStatus;
|
||||
import com.android.systemui.Dependency;
|
||||
import com.android.systemui.Interpolators;
|
||||
import com.android.systemui.R;
|
||||
import com.android.systemui.dock.DockManager;
|
||||
import com.android.systemui.plugins.statusbar.StatusBarStateController;
|
||||
import com.android.systemui.plugins.statusbar.StatusBarStateController.StateListener;
|
||||
import com.android.systemui.statusbar.phone.KeyguardIndicationTextView;
|
||||
import com.android.systemui.statusbar.phone.LockIcon;
|
||||
import com.android.systemui.statusbar.phone.LockscreenGestureLogger;
|
||||
import com.android.systemui.statusbar.phone.ShadeController;
|
||||
import com.android.systemui.statusbar.phone.LockscreenLockIconController;
|
||||
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
|
||||
import com.android.systemui.statusbar.policy.AccessibilityController;
|
||||
import com.android.systemui.statusbar.policy.KeyguardStateController;
|
||||
import com.android.systemui.statusbar.policy.UserInfoController;
|
||||
import com.android.systemui.util.wakelock.SettableWakeLock;
|
||||
import com.android.systemui.util.wakelock.WakeLock;
|
||||
|
||||
@@ -68,9 +58,13 @@ import java.io.PrintWriter;
|
||||
import java.text.NumberFormat;
|
||||
import java.util.IllegalFormatConversionException;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Singleton;
|
||||
|
||||
/**
|
||||
* Controls the indications and error messages shown on the Keyguard
|
||||
*/
|
||||
@Singleton
|
||||
public class KeyguardIndicationController implements StateListener,
|
||||
KeyguardStateController.Callback {
|
||||
|
||||
@@ -84,22 +78,17 @@ public class KeyguardIndicationController implements StateListener,
|
||||
private static final float BOUNCE_ANIMATION_FINAL_Y = 0f;
|
||||
|
||||
private final Context mContext;
|
||||
private final ShadeController mShadeController;
|
||||
private final AccessibilityController mAccessibilityController;
|
||||
private final KeyguardStateController mKeyguardStateController;
|
||||
private final StatusBarStateController mStatusBarStateController;
|
||||
private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
|
||||
private ViewGroup mIndicationArea;
|
||||
private KeyguardIndicationTextView mTextView;
|
||||
private final UserManager mUserManager;
|
||||
private final IBatteryStats mBatteryInfo;
|
||||
private final SettableWakeLock mWakeLock;
|
||||
private final LockPatternUtils mLockPatternUtils;
|
||||
private final DockManager mDockManager;
|
||||
|
||||
private final LockIcon mLockIcon;
|
||||
private LockscreenLockIconController mLockIconController;
|
||||
private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
|
||||
private LockscreenGestureLogger mLockscreenGestureLogger = new LockscreenGestureLogger();
|
||||
|
||||
private String mRestingIndication;
|
||||
private String mAlignmentIndication;
|
||||
@@ -132,55 +121,25 @@ public class KeyguardIndicationController implements StateListener,
|
||||
/**
|
||||
* Creates a new KeyguardIndicationController and registers callbacks.
|
||||
*/
|
||||
public KeyguardIndicationController(Context context, ViewGroup indicationArea,
|
||||
LockIcon lockIcon) {
|
||||
this(context, indicationArea, lockIcon, new LockPatternUtils(context),
|
||||
WakeLock.createPartial(context, "Doze:KeyguardIndication"),
|
||||
Dependency.get(ShadeController.class),
|
||||
Dependency.get(AccessibilityController.class),
|
||||
Dependency.get(KeyguardStateController.class),
|
||||
Dependency.get(StatusBarStateController.class),
|
||||
Dependency.get(KeyguardUpdateMonitor.class),
|
||||
Dependency.get(DockManager.class),
|
||||
IBatteryStats.Stub.asInterface(
|
||||
ServiceManager.getService(BatteryStats.SERVICE_NAME)));
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new KeyguardIndicationController for testing.
|
||||
*/
|
||||
@VisibleForTesting
|
||||
KeyguardIndicationController(Context context, ViewGroup indicationArea, LockIcon lockIcon,
|
||||
LockPatternUtils lockPatternUtils, WakeLock wakeLock, ShadeController shadeController,
|
||||
AccessibilityController accessibilityController,
|
||||
@Inject
|
||||
KeyguardIndicationController(Context context,
|
||||
WakeLock.Builder wakeLockBuilder,
|
||||
KeyguardStateController keyguardStateController,
|
||||
StatusBarStateController statusBarStateController,
|
||||
KeyguardUpdateMonitor keyguardUpdateMonitor,
|
||||
DockManager dockManager,
|
||||
IBatteryStats iBatteryStats) {
|
||||
mContext = context;
|
||||
mLockIcon = lockIcon;
|
||||
mShadeController = shadeController;
|
||||
mAccessibilityController = accessibilityController;
|
||||
mKeyguardStateController = keyguardStateController;
|
||||
mStatusBarStateController = statusBarStateController;
|
||||
mKeyguardUpdateMonitor = keyguardUpdateMonitor;
|
||||
mDockManager = dockManager;
|
||||
mDockManager.addAlignmentStateListener(
|
||||
alignState -> mHandler.post(() -> handleAlignStateChanged(alignState)));
|
||||
// lock icon is not used on all form factors.
|
||||
if (mLockIcon != null) {
|
||||
mLockIcon.setOnLongClickListener(this::handleLockLongClick);
|
||||
mLockIcon.setOnClickListener(this::handleLockClick);
|
||||
}
|
||||
mWakeLock = new SettableWakeLock(wakeLock, TAG);
|
||||
mLockPatternUtils = lockPatternUtils;
|
||||
|
||||
mUserManager = context.getSystemService(UserManager.class);
|
||||
mWakeLock = new SettableWakeLock(
|
||||
wakeLockBuilder.setTag("Doze:KeyguardIndication").build(), TAG);
|
||||
mBatteryInfo = iBatteryStats;
|
||||
|
||||
setIndicationArea(indicationArea);
|
||||
|
||||
mKeyguardUpdateMonitor.registerCallback(getKeyguardCallback());
|
||||
mKeyguardUpdateMonitor.registerCallback(mTickReceiver);
|
||||
mStatusBarStateController.addCallback(this);
|
||||
@@ -195,21 +154,8 @@ public class KeyguardIndicationController implements StateListener,
|
||||
updateIndication(false /* animate */);
|
||||
}
|
||||
|
||||
private boolean handleLockLongClick(View view) {
|
||||
mLockscreenGestureLogger.write(MetricsProto.MetricsEvent.ACTION_LS_LOCK,
|
||||
0 /* lengthDp - N/A */, 0 /* velocityDp - N/A */);
|
||||
showTransientIndication(R.string.keyguard_indication_trust_disabled);
|
||||
mKeyguardUpdateMonitor.onLockIconPressed();
|
||||
mLockPatternUtils.requireCredentialEntry(KeyguardUpdateMonitor.getCurrentUser());
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private void handleLockClick(View view) {
|
||||
if (!mAccessibilityController.isAccessibilityEnabled()) {
|
||||
return;
|
||||
}
|
||||
mShadeController.animateCollapsePanels(CommandQueue.FLAG_EXCLUDE_NONE, true /* force */);
|
||||
public void setLockIconController(LockscreenLockIconController lockIconController) {
|
||||
mLockIconController = lockIconController;
|
||||
}
|
||||
|
||||
private void handleAlignStateChanged(int alignState) {
|
||||
@@ -268,12 +214,6 @@ public class KeyguardIndicationController implements StateListener,
|
||||
updateIndication(false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the active controller managing changes and callbacks to user information.
|
||||
*/
|
||||
public void setUserInfoController(UserInfoController userInfoController) {
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the indication text indicating that trust has been granted.
|
||||
*
|
||||
@@ -545,7 +485,9 @@ public class KeyguardIndicationController implements StateListener,
|
||||
if (msg.what == MSG_HIDE_TRANSIENT) {
|
||||
hideTransientIndication();
|
||||
} else if (msg.what == MSG_CLEAR_BIOMETRIC_MSG) {
|
||||
mLockIcon.setTransientBiometricsError(false);
|
||||
if (mLockIconController != null) {
|
||||
mLockIconController.setTransientBiometricsError(false);
|
||||
}
|
||||
} else if (msg.what == MSG_SWIPE_UP_TO_UNLOCK) {
|
||||
showSwipeUpToUnlock();
|
||||
}
|
||||
@@ -694,7 +636,9 @@ public class KeyguardIndicationController implements StateListener,
|
||||
}
|
||||
|
||||
private void animatePadlockError() {
|
||||
mLockIcon.setTransientBiometricsError(true);
|
||||
if (mLockIconController != null) {
|
||||
mLockIconController.setTransientBiometricsError(true);
|
||||
}
|
||||
mHandler.removeMessages(MSG_CLEAR_BIOMETRIC_MSG);
|
||||
mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_CLEAR_BIOMETRIC_MSG),
|
||||
TRANSIENT_BIOMETRIC_ERROR_TIMEOUT);
|
||||
|
||||
@@ -23,6 +23,7 @@ import android.view.ViewGroup;
|
||||
import com.android.systemui.R;
|
||||
import com.android.systemui.statusbar.notification.row.dagger.NotificationRowComponent;
|
||||
import com.android.systemui.statusbar.phone.LockIcon;
|
||||
import com.android.systemui.statusbar.phone.LockscreenLockIconController;
|
||||
import com.android.systemui.statusbar.phone.NotificationPanelView;
|
||||
import com.android.systemui.statusbar.phone.NotificationShadeWindowView;
|
||||
import com.android.systemui.statusbar.phone.StatusBarWindowView;
|
||||
@@ -41,6 +42,7 @@ public class SuperStatusBarViewFactory {
|
||||
private final Context mContext;
|
||||
private final InjectionInflationController mInjectionInflationController;
|
||||
private final NotificationRowComponent.Builder mNotificationRowComponentBuilder;
|
||||
private final LockscreenLockIconController mLockIconController;
|
||||
|
||||
private NotificationShadeWindowView mNotificationShadeWindowView;
|
||||
private StatusBarWindowView mStatusBarWindowView;
|
||||
@@ -49,10 +51,12 @@ public class SuperStatusBarViewFactory {
|
||||
@Inject
|
||||
public SuperStatusBarViewFactory(Context context,
|
||||
InjectionInflationController injectionInflationController,
|
||||
NotificationRowComponent.Builder notificationRowComponentBuilder) {
|
||||
NotificationRowComponent.Builder notificationRowComponentBuilder,
|
||||
LockscreenLockIconController lockIconController) {
|
||||
mContext = context;
|
||||
mInjectionInflationController = injectionInflationController;
|
||||
mNotificationRowComponentBuilder = notificationRowComponentBuilder;
|
||||
mLockIconController = lockIconController;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -73,12 +77,12 @@ public class SuperStatusBarViewFactory {
|
||||
throw new IllegalStateException(
|
||||
"R.layout.super_notification_shade could not be properly inflated");
|
||||
}
|
||||
return mNotificationShadeWindowView;
|
||||
}
|
||||
LockIcon lockIcon = mNotificationShadeWindowView.findViewById(R.id.lock_icon);
|
||||
if (lockIcon != null) {
|
||||
mLockIconController.attach(lockIcon);
|
||||
}
|
||||
|
||||
/** Gets the {@link LockIcon} inside of {@link R.layout#super_status_bar}. */
|
||||
public LockIcon getLockIcon() {
|
||||
return getNotificationShadeWindowView().findViewById(R.id.lock_icon);
|
||||
return mNotificationShadeWindowView;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -22,7 +22,6 @@ import android.annotation.IntDef;
|
||||
import android.content.Context;
|
||||
import android.content.res.ColorStateList;
|
||||
import android.content.res.Configuration;
|
||||
import android.content.res.TypedArray;
|
||||
import android.graphics.Color;
|
||||
import android.graphics.drawable.Animatable2;
|
||||
import android.graphics.drawable.AnimatedVectorDrawable;
|
||||
@@ -32,7 +31,6 @@ import android.os.Trace;
|
||||
import android.provider.Settings;
|
||||
import android.text.TextUtils;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.ViewTreeObserver;
|
||||
import android.view.accessibility.AccessibilityNodeInfo;
|
||||
|
||||
@@ -45,16 +43,13 @@ import com.android.systemui.Dependency;
|
||||
import com.android.systemui.Interpolators;
|
||||
import com.android.systemui.R;
|
||||
import com.android.systemui.dock.DockManager;
|
||||
import com.android.systemui.plugins.statusbar.StatusBarStateController;
|
||||
import com.android.systemui.statusbar.KeyguardAffordanceView;
|
||||
import com.android.systemui.statusbar.StatusBarState;
|
||||
import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator;
|
||||
import com.android.systemui.statusbar.phone.ScrimController.ScrimVisibility;
|
||||
import com.android.systemui.statusbar.policy.AccessibilityController;
|
||||
import com.android.systemui.statusbar.policy.ConfigurationController;
|
||||
import com.android.systemui.statusbar.policy.KeyguardStateController;
|
||||
import com.android.systemui.statusbar.policy.OnHeadsUpChangedListener;
|
||||
import com.android.systemui.statusbar.policy.UserInfoController.OnUserInfoChangedListener;
|
||||
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
@@ -65,8 +60,7 @@ import javax.inject.Named;
|
||||
/**
|
||||
* Manages the different states and animations of the unlock icon.
|
||||
*/
|
||||
public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChangedListener,
|
||||
StatusBarStateController.StateListener, ConfigurationController.ConfigurationListener,
|
||||
public class LockIcon extends KeyguardAffordanceView implements
|
||||
KeyguardStateController.Callback, NotificationWakeUpCoordinator.WakeUpListener,
|
||||
ViewTreeObserver.OnPreDrawListener, OnHeadsUpChangedListener {
|
||||
|
||||
@@ -74,8 +68,6 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange
|
||||
private static final int STATE_LOCK_OPEN = 1;
|
||||
private static final int STATE_SCANNING_FACE = 2;
|
||||
private static final int STATE_BIOMETRICS_ERROR = 3;
|
||||
private final ConfigurationController mConfigurationController;
|
||||
private final StatusBarStateController mStatusBarStateController;
|
||||
private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
|
||||
private final AccessibilityController mAccessibilityController;
|
||||
private final DockManager mDockManager;
|
||||
@@ -103,6 +95,7 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange
|
||||
private boolean mKeyguardJustShown;
|
||||
private boolean mUpdatePending;
|
||||
private boolean mBouncerPreHideAnimation;
|
||||
private int mStatusBarState = StatusBarState.SHADE;
|
||||
|
||||
private final KeyguardStateController.Callback mKeyguardMonitorCallback =
|
||||
new KeyguardStateController.Callback() {
|
||||
@@ -177,8 +170,6 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange
|
||||
|
||||
@Inject
|
||||
public LockIcon(@Named(VIEW_CONTEXT) Context context, AttributeSet attrs,
|
||||
StatusBarStateController statusBarStateController,
|
||||
ConfigurationController configurationController,
|
||||
AccessibilityController accessibilityController,
|
||||
KeyguardBypassController bypassController,
|
||||
NotificationWakeUpCoordinator wakeUpCoordinator,
|
||||
@@ -189,8 +180,6 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange
|
||||
mContext = context;
|
||||
mKeyguardUpdateMonitor = Dependency.get(KeyguardUpdateMonitor.class);
|
||||
mAccessibilityController = accessibilityController;
|
||||
mConfigurationController = configurationController;
|
||||
mStatusBarStateController = statusBarStateController;
|
||||
mBypassController = bypassController;
|
||||
mWakeUpCoordinator = wakeUpCoordinator;
|
||||
mKeyguardStateController = keyguardStateController;
|
||||
@@ -201,8 +190,6 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange
|
||||
@Override
|
||||
protected void onAttachedToWindow() {
|
||||
super.onAttachedToWindow();
|
||||
mStatusBarStateController.addCallback(this);
|
||||
mConfigurationController.addCallback(this);
|
||||
mKeyguardStateController.addCallback(mKeyguardMonitorCallback);
|
||||
mKeyguardUpdateMonitor.registerCallback(mUpdateMonitorCallback);
|
||||
mWakeUpCoordinator.addListener(this);
|
||||
@@ -210,15 +197,12 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange
|
||||
if (mDockManager != null) {
|
||||
mDockManager.addListener(mDockEventListener);
|
||||
}
|
||||
onThemeChanged();
|
||||
update();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDetachedFromWindow() {
|
||||
super.onDetachedFromWindow();
|
||||
mStatusBarStateController.removeCallback(this);
|
||||
mConfigurationController.removeCallback(this);
|
||||
mKeyguardUpdateMonitor.removeCallback(mUpdateMonitorCallback);
|
||||
mKeyguardStateController.removeCallback(mKeyguardMonitorCallback);
|
||||
mWakeUpCoordinator.removeListener(this);
|
||||
@@ -227,20 +211,6 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onThemeChanged() {
|
||||
TypedArray typedArray = mContext.getTheme().obtainStyledAttributes(
|
||||
null, new int[]{ R.attr.wallpaperTextColor }, 0, 0);
|
||||
mIconColor = typedArray.getColor(0, Color.WHITE);
|
||||
typedArray.recycle();
|
||||
updateDarkTint();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onUserInfoChanged(String name, Drawable picture, String userAccount) {
|
||||
update();
|
||||
}
|
||||
|
||||
/**
|
||||
* If we're currently presenting an authentication error message.
|
||||
*/
|
||||
@@ -342,7 +312,7 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange
|
||||
|| mShowingLaunchAffordance;
|
||||
if (mBypassController.getBypassEnabled() && !mBouncerShowingScrimmed) {
|
||||
if ((mHeadsUpManager.isHeadsUpGoingAway() || mHeadsUpManager.hasPinnedHeadsUp()
|
||||
|| mStatusBarStateController.getState() == StatusBarState.KEYGUARD)
|
||||
|| mStatusBarState == StatusBarState.KEYGUARD)
|
||||
&& !mWakeUpCoordinator.getNotificationsFullyHidden()) {
|
||||
invisible = true;
|
||||
}
|
||||
@@ -479,6 +449,11 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange
|
||||
update();
|
||||
}
|
||||
|
||||
void setIconColor(int iconColor) {
|
||||
mIconColor = iconColor;
|
||||
updateDarkTint();
|
||||
}
|
||||
|
||||
@Retention(RetentionPolicy.SOURCE)
|
||||
@IntDef({ERROR, UNLOCK, LOCK, SCANNING})
|
||||
@interface LockAnimIndex {}
|
||||
@@ -538,12 +513,6 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDozeAmountChanged(float linear, float eased) {
|
||||
mDozeAmount = eased;
|
||||
updateDarkTint();
|
||||
}
|
||||
|
||||
/**
|
||||
* When keyguard is in pulsing (AOD2) state.
|
||||
* @param pulsing {@code true} when pulsing.
|
||||
@@ -553,38 +522,11 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange
|
||||
update();
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the dozing state of the keyguard.
|
||||
*/
|
||||
@Override
|
||||
public void onDozingChanged(boolean dozing) {
|
||||
mDozing = dozing;
|
||||
update();
|
||||
}
|
||||
|
||||
private void updateDarkTint() {
|
||||
int color = ColorUtils.blendARGB(mIconColor, Color.WHITE, mDozeAmount);
|
||||
setImageTintList(ColorStateList.valueOf(color));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDensityOrFontScaleChanged() {
|
||||
ViewGroup.LayoutParams lp = getLayoutParams();
|
||||
if (lp == null) {
|
||||
return;
|
||||
}
|
||||
lp.width = getResources().getDimensionPixelSize(R.dimen.keyguard_lock_width);
|
||||
lp.height = getResources().getDimensionPixelSize(R.dimen.keyguard_lock_height);
|
||||
setLayoutParams(lp);
|
||||
update(true /* force */);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onLocaleListChanged() {
|
||||
setContentDescription(getContext().getText(R.string.accessibility_unlock_button));
|
||||
update(true /* force */);
|
||||
}
|
||||
|
||||
/**
|
||||
* We need to hide the lock whenever there's a fingerprint unlock, otherwise you'll see the
|
||||
* icon on top of the black front scrim.
|
||||
@@ -620,4 +562,20 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange
|
||||
update();
|
||||
}
|
||||
}
|
||||
|
||||
void setDozing(boolean dozing) {
|
||||
mDozing = dozing;
|
||||
update();
|
||||
}
|
||||
|
||||
void setDozeAmount(float dozeAmount) {
|
||||
mDozeAmount = dozeAmount;
|
||||
updateDarkTint();
|
||||
}
|
||||
|
||||
/** Set the StatusBarState. */
|
||||
public void setStatusBarState(int statusBarState) {
|
||||
mStatusBarState = statusBarState;
|
||||
updateIconVisibility();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,7 +16,21 @@
|
||||
|
||||
package com.android.systemui.statusbar.phone;
|
||||
|
||||
import com.android.systemui.statusbar.SuperStatusBarViewFactory;
|
||||
import android.content.res.TypedArray;
|
||||
import android.graphics.Color;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
import com.android.internal.logging.nano.MetricsProto;
|
||||
import com.android.internal.widget.LockPatternUtils;
|
||||
import com.android.keyguard.KeyguardUpdateMonitor;
|
||||
import com.android.systemui.R;
|
||||
import com.android.systemui.plugins.statusbar.StatusBarStateController;
|
||||
import com.android.systemui.statusbar.CommandQueue;
|
||||
import com.android.systemui.statusbar.KeyguardIndicationController;
|
||||
import com.android.systemui.statusbar.policy.AccessibilityController;
|
||||
import com.android.systemui.statusbar.policy.ConfigurationController;
|
||||
import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Singleton;
|
||||
@@ -25,11 +39,121 @@ import javax.inject.Singleton;
|
||||
@Singleton
|
||||
public class LockscreenLockIconController {
|
||||
|
||||
private final LockIcon mLockIcon;
|
||||
private final LockscreenGestureLogger mLockscreenGestureLogger;
|
||||
private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
|
||||
private final LockPatternUtils mLockPatternUtils;
|
||||
private final ShadeController mShadeController;
|
||||
private final AccessibilityController mAccessibilityController;
|
||||
private final KeyguardIndicationController mKeyguardIndicationController;
|
||||
private final StatusBarStateController mStatusBarStateController;
|
||||
private final ConfigurationController mConfigurationController;
|
||||
private LockIcon mLockIcon;
|
||||
|
||||
private View.OnAttachStateChangeListener mOnAttachStateChangeListener =
|
||||
new View.OnAttachStateChangeListener() {
|
||||
@Override
|
||||
public void onViewAttachedToWindow(View v) {
|
||||
mStatusBarStateController.addCallback(mSBStateListener);
|
||||
mConfigurationController.addCallback(mConfigurationListener);
|
||||
|
||||
mConfigurationListener.onThemeChanged();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onViewDetachedFromWindow(View v) {
|
||||
mStatusBarStateController.removeCallback(mSBStateListener);
|
||||
mConfigurationController.removeCallback(mConfigurationListener);
|
||||
}
|
||||
};
|
||||
|
||||
private final StatusBarStateController.StateListener mSBStateListener =
|
||||
new StatusBarStateController.StateListener() {
|
||||
@Override
|
||||
public void onDozingChanged(boolean isDozing) {
|
||||
mLockIcon.setDozing(isDozing);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDozeAmountChanged(float linear, float eased) {
|
||||
mLockIcon.setDozeAmount(eased);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStateChanged(int newState) {
|
||||
mLockIcon.setStatusBarState(newState);
|
||||
}
|
||||
};
|
||||
|
||||
private final ConfigurationListener mConfigurationListener = new ConfigurationListener() {
|
||||
@Override
|
||||
public void onThemeChanged() {
|
||||
TypedArray typedArray = mLockIcon.getContext().getTheme().obtainStyledAttributes(
|
||||
null, new int[]{ R.attr.wallpaperTextColor }, 0, 0);
|
||||
int iconColor = typedArray.getColor(0, Color.WHITE);
|
||||
typedArray.recycle();
|
||||
mLockIcon.setIconColor(iconColor);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDensityOrFontScaleChanged() {
|
||||
ViewGroup.LayoutParams lp = mLockIcon.getLayoutParams();
|
||||
if (lp == null) {
|
||||
return;
|
||||
}
|
||||
lp.width = mLockIcon.getResources().getDimensionPixelSize(R.dimen.keyguard_lock_width);
|
||||
lp.height = mLockIcon.getResources().getDimensionPixelSize(
|
||||
R.dimen.keyguard_lock_height);
|
||||
mLockIcon.setLayoutParams(lp);
|
||||
mLockIcon.update(true /* force */);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onLocaleListChanged() {
|
||||
mLockIcon.setContentDescription(
|
||||
mLockIcon.getResources().getText(R.string.accessibility_unlock_button));
|
||||
mLockIcon.update(true /* force */);
|
||||
}
|
||||
};
|
||||
|
||||
@Inject
|
||||
public LockscreenLockIconController(SuperStatusBarViewFactory superStatusBarViewFactory) {
|
||||
mLockIcon = superStatusBarViewFactory.getLockIcon();
|
||||
public LockscreenLockIconController(LockscreenGestureLogger lockscreenGestureLogger,
|
||||
KeyguardUpdateMonitor keyguardUpdateMonitor,
|
||||
LockPatternUtils lockPatternUtils,
|
||||
ShadeController shadeController,
|
||||
AccessibilityController accessibilityController,
|
||||
KeyguardIndicationController keyguardIndicationController,
|
||||
StatusBarStateController statusBarStateController,
|
||||
ConfigurationController configurationController) {
|
||||
mLockscreenGestureLogger = lockscreenGestureLogger;
|
||||
mKeyguardUpdateMonitor = keyguardUpdateMonitor;
|
||||
mLockPatternUtils = lockPatternUtils;
|
||||
mShadeController = shadeController;
|
||||
mAccessibilityController = accessibilityController;
|
||||
mKeyguardIndicationController = keyguardIndicationController;
|
||||
mStatusBarStateController = statusBarStateController;
|
||||
mConfigurationController = configurationController;
|
||||
|
||||
mKeyguardIndicationController.setLockIconController(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Associate the controller with a {@link LockIcon}
|
||||
*/
|
||||
public void attach(LockIcon lockIcon) {
|
||||
mLockIcon = lockIcon;
|
||||
|
||||
mLockIcon.setOnClickListener(this::handleClick);
|
||||
mLockIcon.setOnLongClickListener(this::handleLongClick);
|
||||
|
||||
if (mLockIcon.isAttachedToWindow()) {
|
||||
mOnAttachStateChangeListener.onViewAttachedToWindow(mLockIcon);
|
||||
}
|
||||
mLockIcon.addOnAttachStateChangeListener(mOnAttachStateChangeListener);
|
||||
mLockIcon.setStatusBarState(mStatusBarStateController.getState());
|
||||
}
|
||||
|
||||
public LockIcon getView() {
|
||||
return mLockIcon;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -86,4 +210,32 @@ public class LockscreenLockIconController {
|
||||
mLockIcon.onBouncerPreHideAnimation();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* If we're currently presenting an authentication error message.
|
||||
*/
|
||||
public void setTransientBiometricsError(boolean transientBiometricsError) {
|
||||
if (mLockIcon != null) {
|
||||
mLockIcon.setTransientBiometricsError(transientBiometricsError);
|
||||
}
|
||||
}
|
||||
|
||||
private boolean handleLongClick(View view) {
|
||||
mLockscreenGestureLogger.write(MetricsProto.MetricsEvent.ACTION_LS_LOCK,
|
||||
0 /* lengthDp - N/A */, 0 /* velocityDp - N/A */);
|
||||
mKeyguardIndicationController.showTransientIndication(
|
||||
R.string.keyguard_indication_trust_disabled);
|
||||
mKeyguardUpdateMonitor.onLockIconPressed();
|
||||
mLockPatternUtils.requireCredentialEntry(KeyguardUpdateMonitor.getCurrentUser());
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
private void handleClick(View view) {
|
||||
if (!mAccessibilityController.isAccessibilityEnabled()) {
|
||||
return;
|
||||
}
|
||||
mShadeController.animateCollapsePanels(CommandQueue.FLAG_EXCLUDE_NONE, true /* force */);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -678,6 +678,7 @@ public class StatusBar extends SystemUI implements DemoMode,
|
||||
ExtensionController extensionController,
|
||||
UserInfoControllerImpl userInfoControllerImpl,
|
||||
PhoneStatusBarPolicy phoneStatusBarPolicy,
|
||||
KeyguardIndicationController keyguardIndicationController,
|
||||
DismissCallbackRegistry dismissCallbackRegistry,
|
||||
StatusBarTouchableRegionManager statusBarTouchableRegionManager) {
|
||||
super(context);
|
||||
@@ -691,6 +692,7 @@ public class StatusBar extends SystemUI implements DemoMode,
|
||||
mKeyguardBypassController = keyguardBypassController;
|
||||
mKeyguardStateController = keyguardStateController;
|
||||
mHeadsUpManager = headsUpManagerPhone;
|
||||
mKeyguardIndicationController = keyguardIndicationController;
|
||||
mStatusBarTouchableRegionManager = statusBarTouchableRegionManager;
|
||||
mDynamicPrivacyController = dynamicPrivacyController;
|
||||
mBypassHeadsUpNotifier = bypassHeadsUpNotifier;
|
||||
@@ -1049,10 +1051,8 @@ public class StatusBar extends SystemUI implements DemoMode,
|
||||
mLockscreenWallpaper = mLockscreenWallpaperLazy.get();
|
||||
}
|
||||
|
||||
mKeyguardIndicationController =
|
||||
SystemUIFactory.getInstance().createKeyguardIndicationController(mContext,
|
||||
mNotificationShadeWindowView.findViewById(R.id.keyguard_indication_area),
|
||||
mNotificationShadeWindowView.findViewById(R.id.lock_icon));
|
||||
mKeyguardIndicationController.setIndicationArea(
|
||||
mNotificationShadeWindowView.findViewById(R.id.keyguard_indication_area));
|
||||
mNotificationPanelViewController.setKeyguardIndicationController(
|
||||
mKeyguardIndicationController);
|
||||
|
||||
|
||||
@@ -46,6 +46,7 @@ import com.android.systemui.recents.ScreenPinningRequest;
|
||||
import com.android.systemui.shared.plugins.PluginManager;
|
||||
import com.android.systemui.stackdivider.Divider;
|
||||
import com.android.systemui.statusbar.CommandQueue;
|
||||
import com.android.systemui.statusbar.KeyguardIndicationController;
|
||||
import com.android.systemui.statusbar.NavigationBarController;
|
||||
import com.android.systemui.statusbar.NotificationLockscreenUserManager;
|
||||
import com.android.systemui.statusbar.NotificationMediaManager;
|
||||
@@ -195,6 +196,7 @@ public interface StatusBarPhoneModule {
|
||||
ExtensionController extensionController,
|
||||
UserInfoControllerImpl userInfoControllerImpl,
|
||||
PhoneStatusBarPolicy phoneStatusBarPolicy,
|
||||
KeyguardIndicationController keyguardIndicationController,
|
||||
DismissCallbackRegistry dismissCallbackRegistry,
|
||||
StatusBarTouchableRegionManager statusBarTouchableRegionManager) {
|
||||
return new StatusBar(
|
||||
@@ -272,6 +274,7 @@ public interface StatusBarPhoneModule {
|
||||
extensionController,
|
||||
userInfoControllerImpl,
|
||||
phoneStatusBarPolicy,
|
||||
keyguardIndicationController,
|
||||
dismissCallbackRegistry,
|
||||
statusBarTouchableRegionManager);
|
||||
}
|
||||
|
||||
@@ -24,6 +24,8 @@ import androidx.annotation.VisibleForTesting;
|
||||
|
||||
import java.util.HashMap;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
/** WakeLock wrapper for testability */
|
||||
public interface WakeLock {
|
||||
|
||||
@@ -121,4 +123,32 @@ public interface WakeLock {
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* An injectable Builder that wraps {@link #createPartial(Context, String, long)}.
|
||||
*/
|
||||
class Builder {
|
||||
private final Context mContext;
|
||||
private String mTag;
|
||||
private long mMaxTimeout = DEFAULT_MAX_TIMEOUT;
|
||||
|
||||
@Inject
|
||||
public Builder(Context context) {
|
||||
mContext = context;
|
||||
}
|
||||
|
||||
public Builder setTag(String tag) {
|
||||
this.mTag = tag;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder setMaxTimeout(long maxTimeout) {
|
||||
this.mMaxTimeout = maxTimeout;
|
||||
return this;
|
||||
}
|
||||
|
||||
public WakeLock build() {
|
||||
return WakeLock.createPartial(mContext, mTag, mMaxTimeout);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -77,6 +77,7 @@ import com.android.systemui.statusbar.notification.row.NotificationTestHelper;
|
||||
import com.android.systemui.statusbar.notification.row.dagger.NotificationRowComponent;
|
||||
import com.android.systemui.statusbar.phone.DozeParameters;
|
||||
import com.android.systemui.statusbar.phone.KeyguardBypassController;
|
||||
import com.android.systemui.statusbar.phone.LockscreenLockIconController;
|
||||
import com.android.systemui.statusbar.phone.NotificationGroupManager;
|
||||
import com.android.systemui.statusbar.phone.NotificationShadeWindowController;
|
||||
import com.android.systemui.statusbar.phone.ShadeController;
|
||||
@@ -170,6 +171,8 @@ public class BubbleControllerTest extends SysuiTestCase {
|
||||
private FeatureFlags mFeatureFlagsOldPipeline;
|
||||
@Mock
|
||||
private DumpManager mDumpManager;
|
||||
@Mock
|
||||
private LockscreenLockIconController mLockIconController;
|
||||
|
||||
private SuperStatusBarViewFactory mSuperStatusBarViewFactory;
|
||||
private BubbleData mBubbleData;
|
||||
@@ -198,7 +201,8 @@ public class BubbleControllerTest extends SysuiTestCase {
|
||||
public NotificationRowComponent build() {
|
||||
return mNotificationRowComponent;
|
||||
}
|
||||
});
|
||||
},
|
||||
mLockIconController);
|
||||
|
||||
// Bubbles get added to status bar window view
|
||||
mNotificationShadeWindowController = new NotificationShadeWindowController(mContext,
|
||||
|
||||
@@ -72,6 +72,7 @@ import com.android.systemui.statusbar.notification.row.NotificationTestHelper;
|
||||
import com.android.systemui.statusbar.notification.row.dagger.NotificationRowComponent;
|
||||
import com.android.systemui.statusbar.phone.DozeParameters;
|
||||
import com.android.systemui.statusbar.phone.KeyguardBypassController;
|
||||
import com.android.systemui.statusbar.phone.LockscreenLockIconController;
|
||||
import com.android.systemui.statusbar.phone.NotificationGroupManager;
|
||||
import com.android.systemui.statusbar.phone.NotificationShadeWindowController;
|
||||
import com.android.systemui.statusbar.phone.ShadeController;
|
||||
@@ -164,6 +165,8 @@ public class NewNotifPipelineBubbleControllerTest extends SysuiTestCase {
|
||||
private FeatureFlags mFeatureFlagsNewPipeline;
|
||||
@Mock
|
||||
private DumpManager mDumpManager;
|
||||
@Mock
|
||||
private LockscreenLockIconController mLockIconController;
|
||||
|
||||
private SuperStatusBarViewFactory mSuperStatusBarViewFactory;
|
||||
private BubbleData mBubbleData;
|
||||
@@ -192,7 +195,8 @@ public class NewNotifPipelineBubbleControllerTest extends SysuiTestCase {
|
||||
public NotificationRowComponent build() {
|
||||
return mNotificationRowComponent;
|
||||
}
|
||||
});
|
||||
},
|
||||
mLockIconController);
|
||||
|
||||
// Bubbles get added to status bar window view
|
||||
mNotificationShadeWindowController = new NotificationShadeWindowController(mContext,
|
||||
|
||||
@@ -44,7 +44,6 @@ import android.os.BatteryManager;
|
||||
import android.os.Looper;
|
||||
import android.os.RemoteException;
|
||||
import android.os.UserManager;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
import androidx.test.InstrumentationRegistry;
|
||||
@@ -52,7 +51,6 @@ import androidx.test.filters.SmallTest;
|
||||
import androidx.test.runner.AndroidJUnit4;
|
||||
|
||||
import com.android.internal.app.IBatteryStats;
|
||||
import com.android.internal.widget.LockPatternUtils;
|
||||
import com.android.keyguard.KeyguardUpdateMonitor;
|
||||
import com.android.settingslib.Utils;
|
||||
import com.android.settingslib.fuelgauge.BatteryStatus;
|
||||
@@ -61,10 +59,7 @@ import com.android.systemui.SysuiTestCase;
|
||||
import com.android.systemui.dock.DockManager;
|
||||
import com.android.systemui.plugins.statusbar.StatusBarStateController;
|
||||
import com.android.systemui.statusbar.phone.KeyguardIndicationTextView;
|
||||
import com.android.systemui.statusbar.phone.LockIcon;
|
||||
import com.android.systemui.statusbar.phone.ShadeController;
|
||||
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
|
||||
import com.android.systemui.statusbar.policy.AccessibilityController;
|
||||
import com.android.systemui.statusbar.policy.KeyguardStateController;
|
||||
import com.android.systemui.util.wakelock.WakeLockFake;
|
||||
|
||||
@@ -85,14 +80,6 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase {
|
||||
@Mock
|
||||
private ViewGroup mIndicationArea;
|
||||
@Mock
|
||||
private LockIcon mLockIcon;
|
||||
@Mock
|
||||
private LockPatternUtils mLockPatternUtils;
|
||||
@Mock
|
||||
private ShadeController mShadeController;
|
||||
@Mock
|
||||
private AccessibilityController mAccessibilityController;
|
||||
@Mock
|
||||
private KeyguardStateController mKeyguardStateController;
|
||||
@Mock
|
||||
private StatusBarStateController mStatusBarStateController;
|
||||
@@ -111,6 +98,7 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase {
|
||||
private KeyguardIndicationTextView mTextView;
|
||||
|
||||
private KeyguardIndicationController mController;
|
||||
private WakeLockFake.Builder mWakeLockBuilder;
|
||||
private WakeLockFake mWakeLock;
|
||||
private Instrumentation mInstrumentation;
|
||||
|
||||
@@ -131,16 +119,19 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase {
|
||||
when(mIndicationArea.findViewById(R.id.keyguard_indication_text)).thenReturn(mTextView);
|
||||
|
||||
mWakeLock = new WakeLockFake();
|
||||
mWakeLockBuilder = new WakeLockFake.Builder(mContext);
|
||||
mWakeLockBuilder.setWakeLock(mWakeLock);
|
||||
}
|
||||
|
||||
private void createController() {
|
||||
if (Looper.myLooper() == null) {
|
||||
Looper.prepare();
|
||||
}
|
||||
mController = new KeyguardIndicationController(mContext, mIndicationArea, mLockIcon,
|
||||
mLockPatternUtils, mWakeLock, mShadeController, mAccessibilityController,
|
||||
|
||||
mController = new KeyguardIndicationController(mContext, mWakeLockBuilder,
|
||||
mKeyguardStateController, mStatusBarStateController, mKeyguardUpdateMonitor,
|
||||
mDockManager, mIBatteryStats);
|
||||
mController.setIndicationArea(mIndicationArea);
|
||||
mController.setStatusBarKeyguardViewManager(mStatusBarKeyguardViewManager);
|
||||
clearInvocations(mIBatteryStats);
|
||||
}
|
||||
@@ -318,26 +309,6 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase {
|
||||
verify(mStatusBarKeyguardViewManager).showBouncerMessage(eq(message), any());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void lockIcon_click() {
|
||||
createController();
|
||||
|
||||
ArgumentCaptor<View.OnLongClickListener> longClickCaptor = ArgumentCaptor.forClass(
|
||||
View.OnLongClickListener.class);
|
||||
ArgumentCaptor<View.OnClickListener> clickCaptor = ArgumentCaptor.forClass(
|
||||
View.OnClickListener.class);
|
||||
verify(mLockIcon).setOnLongClickListener(longClickCaptor.capture());
|
||||
verify(mLockIcon).setOnClickListener(clickCaptor.capture());
|
||||
|
||||
when(mAccessibilityController.isAccessibilityEnabled()).thenReturn(true);
|
||||
clickCaptor.getValue().onClick(mLockIcon);
|
||||
verify(mShadeController).animateCollapsePanels(anyInt(), eq(true));
|
||||
|
||||
longClickCaptor.getValue().onLongClick(mLockIcon);
|
||||
verify(mLockPatternUtils).requireCredentialEntry(anyInt());
|
||||
verify(mKeyguardUpdateMonitor).onLockIconPressed();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void updateMonitor_listenerUpdatesIndication() {
|
||||
createController();
|
||||
|
||||
@@ -0,0 +1,98 @@
|
||||
/*
|
||||
* Copyright (C) 2020 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.android.systemui.statusbar.phone;
|
||||
|
||||
import static org.mockito.ArgumentMatchers.anyInt;
|
||||
import static org.mockito.ArgumentMatchers.eq;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
import android.view.View;
|
||||
|
||||
import androidx.test.filters.SmallTest;
|
||||
import androidx.test.runner.AndroidJUnit4;
|
||||
|
||||
import com.android.internal.widget.LockPatternUtils;
|
||||
import com.android.keyguard.KeyguardUpdateMonitor;
|
||||
import com.android.systemui.SysuiTestCase;
|
||||
import com.android.systemui.plugins.statusbar.StatusBarStateController;
|
||||
import com.android.systemui.statusbar.KeyguardIndicationController;
|
||||
import com.android.systemui.statusbar.policy.AccessibilityController;
|
||||
import com.android.systemui.statusbar.policy.ConfigurationController;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.ArgumentCaptor;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.MockitoAnnotations;
|
||||
|
||||
@SmallTest
|
||||
@RunWith(AndroidJUnit4.class)
|
||||
public class LockscreenIconControllerTest extends SysuiTestCase {
|
||||
private LockscreenLockIconController mLockIconController;
|
||||
@Mock
|
||||
private LockscreenGestureLogger mLockscreenGestureLogger;
|
||||
@Mock
|
||||
private KeyguardUpdateMonitor mKeyguardUpdateMonitor;
|
||||
@Mock
|
||||
private LockPatternUtils mLockPatternUtils;
|
||||
@Mock
|
||||
private ShadeController mShadeController;
|
||||
@Mock
|
||||
private AccessibilityController mAccessibilityController;
|
||||
@Mock
|
||||
private KeyguardIndicationController mKeyguardIndicationController;
|
||||
@Mock
|
||||
private LockIcon mLockIcon; // TODO: make this not a mock once inject is removed.
|
||||
@Mock
|
||||
private StatusBarStateController mStatusBarStateController;
|
||||
@Mock
|
||||
private ConfigurationController mConfigurationController;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
MockitoAnnotations.initMocks(this);
|
||||
|
||||
mLockIconController = new LockscreenLockIconController(
|
||||
mLockscreenGestureLogger, mKeyguardUpdateMonitor, mLockPatternUtils,
|
||||
mShadeController, mAccessibilityController, mKeyguardIndicationController,
|
||||
mStatusBarStateController, mConfigurationController);
|
||||
|
||||
mLockIconController.attach(mLockIcon);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void lockIcon_click() {
|
||||
ArgumentCaptor<View.OnLongClickListener> longClickCaptor = ArgumentCaptor.forClass(
|
||||
View.OnLongClickListener.class);
|
||||
ArgumentCaptor<View.OnClickListener> clickCaptor = ArgumentCaptor.forClass(
|
||||
View.OnClickListener.class);
|
||||
|
||||
// TODO: once we use a real LockIcon instead of a mock, remove all this.
|
||||
verify(mLockIcon).setOnLongClickListener(longClickCaptor.capture());
|
||||
verify(mLockIcon).setOnClickListener(clickCaptor.capture());
|
||||
|
||||
when(mAccessibilityController.isAccessibilityEnabled()).thenReturn(true);
|
||||
clickCaptor.getValue().onClick(new View(mContext));
|
||||
verify(mShadeController).animateCollapsePanels(anyInt(), eq(true));
|
||||
|
||||
longClickCaptor.getValue().onLongClick(new View(mContext));
|
||||
verify(mLockPatternUtils).requireCredentialEntry(anyInt());
|
||||
verify(mKeyguardUpdateMonitor).onLockIconPressed();
|
||||
}
|
||||
}
|
||||
@@ -402,6 +402,7 @@ public class StatusBarTest extends SysuiTestCase {
|
||||
mExtensionController,
|
||||
mUserInfoControllerImpl,
|
||||
mPhoneStatusBarPolicy,
|
||||
mKeyguardIndicationController,
|
||||
mDismissCallbackRegistry,
|
||||
mStatusBarTouchableRegionManager);
|
||||
|
||||
|
||||
@@ -16,6 +16,8 @@
|
||||
|
||||
package com.android.systemui.util.wakelock;
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
import com.android.internal.util.Preconditions;
|
||||
|
||||
public class WakeLockFake implements WakeLock {
|
||||
@@ -48,4 +50,24 @@ public class WakeLockFake implements WakeLock {
|
||||
public boolean isHeld() {
|
||||
return mAcquired > 0;
|
||||
}
|
||||
|
||||
public static class Builder extends WakeLock.Builder {
|
||||
private WakeLock mWakeLock;
|
||||
|
||||
public Builder(Context context) {
|
||||
super(context);
|
||||
}
|
||||
|
||||
public void setWakeLock(WakeLock wakeLock) {
|
||||
mWakeLock = wakeLock;
|
||||
}
|
||||
|
||||
public WakeLock build() {
|
||||
if (mWakeLock != null) {
|
||||
return mWakeLock;
|
||||
}
|
||||
|
||||
return super.build();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user