Merge changes from topic "b150393918-lock-icon-controller" into rvc-dev

* changes:
  Move SB.StateListener from LockIcon to Controller.
  Remove the OnUserInfoChangedListener implementation from LockIcon.
  Pass LockscreenIconController around instead of LockIcon.
This commit is contained in:
Dave Mankoff
2020-03-04 15:54:37 +00:00
committed by Android (Google) Code Review
17 changed files with 398 additions and 199 deletions

View File

@@ -88,6 +88,7 @@ import com.android.systemui.shared.plugins.PluginManager;
import com.android.systemui.stackdivider.Divider; import com.android.systemui.stackdivider.Divider;
import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.FlingAnimationUtils; import com.android.systemui.statusbar.FlingAnimationUtils;
import com.android.systemui.statusbar.KeyguardIndicationController;
import com.android.systemui.statusbar.NavigationBarController; import com.android.systemui.statusbar.NavigationBarController;
import com.android.systemui.statusbar.NotificationLockscreenUserManager; import com.android.systemui.statusbar.NotificationLockscreenUserManager;
import com.android.systemui.statusbar.NotificationMediaManager; import com.android.systemui.statusbar.NotificationMediaManager;
@@ -326,6 +327,7 @@ public class CarStatusBar extends StatusBar implements CarBatteryController.Batt
ExtensionController extensionController, ExtensionController extensionController,
UserInfoControllerImpl userInfoControllerImpl, UserInfoControllerImpl userInfoControllerImpl,
PhoneStatusBarPolicy phoneStatusBarPolicy, PhoneStatusBarPolicy phoneStatusBarPolicy,
KeyguardIndicationController keyguardIndicationController,
DismissCallbackRegistry dismissCallbackRegistry, DismissCallbackRegistry dismissCallbackRegistry,
StatusBarTouchableRegionManager statusBarTouchableRegionManager, StatusBarTouchableRegionManager statusBarTouchableRegionManager,
/* Car Settings injected components. */ /* Car Settings injected components. */
@@ -410,6 +412,7 @@ public class CarStatusBar extends StatusBar implements CarBatteryController.Batt
extensionController, extensionController,
userInfoControllerImpl, userInfoControllerImpl,
phoneStatusBarPolicy, phoneStatusBarPolicy,
keyguardIndicationController,
dismissCallbackRegistry, dismissCallbackRegistry,
statusBarTouchableRegionManager); statusBarTouchableRegionManager);
mUserSwitcherController = userSwitcherController; mUserSwitcherController = userSwitcherController;

View File

@@ -48,6 +48,7 @@ import com.android.systemui.shared.plugins.PluginManager;
import com.android.systemui.stackdivider.Divider; import com.android.systemui.stackdivider.Divider;
import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.FlingAnimationUtils; import com.android.systemui.statusbar.FlingAnimationUtils;
import com.android.systemui.statusbar.KeyguardIndicationController;
import com.android.systemui.statusbar.NavigationBarController; import com.android.systemui.statusbar.NavigationBarController;
import com.android.systemui.statusbar.NotificationLockscreenUserManager; import com.android.systemui.statusbar.NotificationLockscreenUserManager;
import com.android.systemui.statusbar.NotificationMediaManager; import com.android.systemui.statusbar.NotificationMediaManager;
@@ -199,6 +200,7 @@ public class CarStatusBarModule {
ExtensionController extensionController, ExtensionController extensionController,
UserInfoControllerImpl userInfoControllerImpl, UserInfoControllerImpl userInfoControllerImpl,
PhoneStatusBarPolicy phoneStatusBarPolicy, PhoneStatusBarPolicy phoneStatusBarPolicy,
KeyguardIndicationController keyguardIndicationController,
DismissCallbackRegistry dismissCallbackRegistry, DismissCallbackRegistry dismissCallbackRegistry,
StatusBarTouchableRegionManager statusBarTouchableRegionManager, StatusBarTouchableRegionManager statusBarTouchableRegionManager,
CarServiceProvider carServiceProvider, CarServiceProvider carServiceProvider,
@@ -281,6 +283,7 @@ public class CarStatusBarModule {
extensionController, extensionController,
userInfoControllerImpl, userInfoControllerImpl,
phoneStatusBarPolicy, phoneStatusBarPolicy,
keyguardIndicationController,
dismissCallbackRegistry, dismissCallbackRegistry,
statusBarTouchableRegionManager, statusBarTouchableRegionManager,
carServiceProvider, carServiceProvider,

View File

@@ -34,14 +34,12 @@ import com.android.systemui.keyguard.DismissCallbackRegistry;
import com.android.systemui.plugins.FalsingManager; import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.screenshot.ScreenshotNotificationSmartActionsProvider; import com.android.systemui.screenshot.ScreenshotNotificationSmartActionsProvider;
import com.android.systemui.statusbar.KeyguardIndicationController;
import com.android.systemui.statusbar.NotificationListener; import com.android.systemui.statusbar.NotificationListener;
import com.android.systemui.statusbar.NotificationMediaManager; import com.android.systemui.statusbar.NotificationMediaManager;
import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator; import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator;
import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.statusbar.phone.KeyguardBouncer; import com.android.systemui.statusbar.phone.KeyguardBouncer;
import com.android.systemui.statusbar.phone.KeyguardBypassController; 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.NotificationIconAreaController;
import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.statusbar.policy.KeyguardStateController;
@@ -158,11 +156,6 @@ public class SystemUIFactory {
Dependency.get(DozeParameters.class)); Dependency.get(DozeParameters.class));
} }
public KeyguardIndicationController createKeyguardIndicationController(Context context,
ViewGroup indicationArea, LockIcon lockIcon) {
return new KeyguardIndicationController(context, indicationArea, lockIcon);
}
@Module @Module
public static class ContextHolder { public static class ContextHolder {
private Context mContext; private Context mContext;

View File

@@ -36,6 +36,7 @@ import android.content.res.Resources;
import android.hardware.SensorPrivacyManager; import android.hardware.SensorPrivacyManager;
import android.media.AudioManager; import android.media.AudioManager;
import android.net.ConnectivityManager; import android.net.ConnectivityManager;
import android.os.BatteryStats;
import android.os.Handler; import android.os.Handler;
import android.os.PowerManager; import android.os.PowerManager;
import android.os.ServiceManager; import android.os.ServiceManager;
@@ -51,6 +52,7 @@ import android.view.WindowManager;
import android.view.WindowManagerGlobal; import android.view.WindowManagerGlobal;
import android.view.accessibility.AccessibilityManager; import android.view.accessibility.AccessibilityManager;
import com.android.internal.app.IBatteryStats;
import com.android.internal.statusbar.IStatusBarService; import com.android.internal.statusbar.IStatusBarService;
import com.android.internal.util.LatencyTracker; import com.android.internal.util.LatencyTracker;
import com.android.settingslib.bluetooth.LocalBluetoothManager; import com.android.settingslib.bluetooth.LocalBluetoothManager;
@@ -123,6 +125,13 @@ public class SystemServicesModule {
return ActivityManager.getService(); return ActivityManager.getService();
} }
@Provides
@Singleton
static IBatteryStats provideIBatteryStats() {
return IBatteryStats.Stub.asInterface(
ServiceManager.getService(BatteryStats.SERVICE_NAME));
}
@Provides @Provides
@Singleton @Singleton
static IDreamManager provideIDreamManager() { static IDreamManager provideIDreamManager() {

View File

@@ -25,12 +25,9 @@ import android.hardware.biometrics.BiometricSourceType;
import android.hardware.face.FaceManager; import android.hardware.face.FaceManager;
import android.hardware.fingerprint.FingerprintManager; import android.hardware.fingerprint.FingerprintManager;
import android.os.BatteryManager; import android.os.BatteryManager;
import android.os.BatteryStats;
import android.os.Handler; import android.os.Handler;
import android.os.Message; import android.os.Message;
import android.os.RemoteException; import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.UserManager;
import android.text.TextUtils; import android.text.TextUtils;
import android.text.format.Formatter; import android.text.format.Formatter;
import android.util.Log; import android.util.Log;
@@ -39,27 +36,20 @@ import android.view.ViewGroup;
import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.app.IBatteryStats; 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.internal.widget.ViewClippingUtil;
import com.android.keyguard.KeyguardUpdateMonitor; import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.keyguard.KeyguardUpdateMonitorCallback; import com.android.keyguard.KeyguardUpdateMonitorCallback;
import com.android.settingslib.Utils; import com.android.settingslib.Utils;
import com.android.settingslib.fuelgauge.BatteryStatus; import com.android.settingslib.fuelgauge.BatteryStatus;
import com.android.systemui.Dependency;
import com.android.systemui.Interpolators; import com.android.systemui.Interpolators;
import com.android.systemui.R; import com.android.systemui.R;
import com.android.systemui.dock.DockManager; import com.android.systemui.dock.DockManager;
import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.plugins.statusbar.StatusBarStateController.StateListener; import com.android.systemui.plugins.statusbar.StatusBarStateController.StateListener;
import com.android.systemui.statusbar.phone.KeyguardIndicationTextView; import com.android.systemui.statusbar.phone.KeyguardIndicationTextView;
import com.android.systemui.statusbar.phone.LockIcon; import com.android.systemui.statusbar.phone.LockscreenLockIconController;
import com.android.systemui.statusbar.phone.LockscreenGestureLogger;
import com.android.systemui.statusbar.phone.ShadeController;
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; 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.KeyguardStateController;
import com.android.systemui.statusbar.policy.UserInfoController;
import com.android.systemui.util.wakelock.SettableWakeLock; import com.android.systemui.util.wakelock.SettableWakeLock;
import com.android.systemui.util.wakelock.WakeLock; import com.android.systemui.util.wakelock.WakeLock;
@@ -68,9 +58,13 @@ import java.io.PrintWriter;
import java.text.NumberFormat; import java.text.NumberFormat;
import java.util.IllegalFormatConversionException; import java.util.IllegalFormatConversionException;
import javax.inject.Inject;
import javax.inject.Singleton;
/** /**
* Controls the indications and error messages shown on the Keyguard * Controls the indications and error messages shown on the Keyguard
*/ */
@Singleton
public class KeyguardIndicationController implements StateListener, public class KeyguardIndicationController implements StateListener,
KeyguardStateController.Callback { KeyguardStateController.Callback {
@@ -84,22 +78,17 @@ public class KeyguardIndicationController implements StateListener,
private static final float BOUNCE_ANIMATION_FINAL_Y = 0f; private static final float BOUNCE_ANIMATION_FINAL_Y = 0f;
private final Context mContext; private final Context mContext;
private final ShadeController mShadeController;
private final AccessibilityController mAccessibilityController;
private final KeyguardStateController mKeyguardStateController; private final KeyguardStateController mKeyguardStateController;
private final StatusBarStateController mStatusBarStateController; private final StatusBarStateController mStatusBarStateController;
private final KeyguardUpdateMonitor mKeyguardUpdateMonitor; private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
private ViewGroup mIndicationArea; private ViewGroup mIndicationArea;
private KeyguardIndicationTextView mTextView; private KeyguardIndicationTextView mTextView;
private final UserManager mUserManager;
private final IBatteryStats mBatteryInfo; private final IBatteryStats mBatteryInfo;
private final SettableWakeLock mWakeLock; private final SettableWakeLock mWakeLock;
private final LockPatternUtils mLockPatternUtils;
private final DockManager mDockManager; private final DockManager mDockManager;
private final LockIcon mLockIcon; private LockscreenLockIconController mLockIconController;
private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager; private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
private LockscreenGestureLogger mLockscreenGestureLogger = new LockscreenGestureLogger();
private String mRestingIndication; private String mRestingIndication;
private String mAlignmentIndication; private String mAlignmentIndication;
@@ -132,55 +121,25 @@ public class KeyguardIndicationController implements StateListener,
/** /**
* Creates a new KeyguardIndicationController and registers callbacks. * Creates a new KeyguardIndicationController and registers callbacks.
*/ */
public KeyguardIndicationController(Context context, ViewGroup indicationArea, @Inject
LockIcon lockIcon) { KeyguardIndicationController(Context context,
this(context, indicationArea, lockIcon, new LockPatternUtils(context), WakeLock.Builder wakeLockBuilder,
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,
KeyguardStateController keyguardStateController, KeyguardStateController keyguardStateController,
StatusBarStateController statusBarStateController, StatusBarStateController statusBarStateController,
KeyguardUpdateMonitor keyguardUpdateMonitor, KeyguardUpdateMonitor keyguardUpdateMonitor,
DockManager dockManager, DockManager dockManager,
IBatteryStats iBatteryStats) { IBatteryStats iBatteryStats) {
mContext = context; mContext = context;
mLockIcon = lockIcon;
mShadeController = shadeController;
mAccessibilityController = accessibilityController;
mKeyguardStateController = keyguardStateController; mKeyguardStateController = keyguardStateController;
mStatusBarStateController = statusBarStateController; mStatusBarStateController = statusBarStateController;
mKeyguardUpdateMonitor = keyguardUpdateMonitor; mKeyguardUpdateMonitor = keyguardUpdateMonitor;
mDockManager = dockManager; mDockManager = dockManager;
mDockManager.addAlignmentStateListener( mDockManager.addAlignmentStateListener(
alignState -> mHandler.post(() -> handleAlignStateChanged(alignState))); alignState -> mHandler.post(() -> handleAlignStateChanged(alignState)));
// lock icon is not used on all form factors. mWakeLock = new SettableWakeLock(
if (mLockIcon != null) { wakeLockBuilder.setTag("Doze:KeyguardIndication").build(), TAG);
mLockIcon.setOnLongClickListener(this::handleLockLongClick);
mLockIcon.setOnClickListener(this::handleLockClick);
}
mWakeLock = new SettableWakeLock(wakeLock, TAG);
mLockPatternUtils = lockPatternUtils;
mUserManager = context.getSystemService(UserManager.class);
mBatteryInfo = iBatteryStats; mBatteryInfo = iBatteryStats;
setIndicationArea(indicationArea);
mKeyguardUpdateMonitor.registerCallback(getKeyguardCallback()); mKeyguardUpdateMonitor.registerCallback(getKeyguardCallback());
mKeyguardUpdateMonitor.registerCallback(mTickReceiver); mKeyguardUpdateMonitor.registerCallback(mTickReceiver);
mStatusBarStateController.addCallback(this); mStatusBarStateController.addCallback(this);
@@ -195,21 +154,8 @@ public class KeyguardIndicationController implements StateListener,
updateIndication(false /* animate */); updateIndication(false /* animate */);
} }
private boolean handleLockLongClick(View view) { public void setLockIconController(LockscreenLockIconController lockIconController) {
mLockscreenGestureLogger.write(MetricsProto.MetricsEvent.ACTION_LS_LOCK, mLockIconController = lockIconController;
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 */);
} }
private void handleAlignStateChanged(int alignState) { private void handleAlignStateChanged(int alignState) {
@@ -268,12 +214,6 @@ public class KeyguardIndicationController implements StateListener,
updateIndication(false); 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. * 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) { if (msg.what == MSG_HIDE_TRANSIENT) {
hideTransientIndication(); hideTransientIndication();
} else if (msg.what == MSG_CLEAR_BIOMETRIC_MSG) { } 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) { } else if (msg.what == MSG_SWIPE_UP_TO_UNLOCK) {
showSwipeUpToUnlock(); showSwipeUpToUnlock();
} }
@@ -694,7 +636,9 @@ public class KeyguardIndicationController implements StateListener,
} }
private void animatePadlockError() { private void animatePadlockError() {
mLockIcon.setTransientBiometricsError(true); if (mLockIconController != null) {
mLockIconController.setTransientBiometricsError(true);
}
mHandler.removeMessages(MSG_CLEAR_BIOMETRIC_MSG); mHandler.removeMessages(MSG_CLEAR_BIOMETRIC_MSG);
mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_CLEAR_BIOMETRIC_MSG), mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_CLEAR_BIOMETRIC_MSG),
TRANSIENT_BIOMETRIC_ERROR_TIMEOUT); TRANSIENT_BIOMETRIC_ERROR_TIMEOUT);

View File

@@ -23,6 +23,7 @@ import android.view.ViewGroup;
import com.android.systemui.R; import com.android.systemui.R;
import com.android.systemui.statusbar.notification.row.dagger.NotificationRowComponent; import com.android.systemui.statusbar.notification.row.dagger.NotificationRowComponent;
import com.android.systemui.statusbar.phone.LockIcon; 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.NotificationPanelView;
import com.android.systemui.statusbar.phone.NotificationShadeWindowView; import com.android.systemui.statusbar.phone.NotificationShadeWindowView;
import com.android.systemui.statusbar.phone.StatusBarWindowView; import com.android.systemui.statusbar.phone.StatusBarWindowView;
@@ -41,6 +42,7 @@ public class SuperStatusBarViewFactory {
private final Context mContext; private final Context mContext;
private final InjectionInflationController mInjectionInflationController; private final InjectionInflationController mInjectionInflationController;
private final NotificationRowComponent.Builder mNotificationRowComponentBuilder; private final NotificationRowComponent.Builder mNotificationRowComponentBuilder;
private final LockscreenLockIconController mLockIconController;
private NotificationShadeWindowView mNotificationShadeWindowView; private NotificationShadeWindowView mNotificationShadeWindowView;
private StatusBarWindowView mStatusBarWindowView; private StatusBarWindowView mStatusBarWindowView;
@@ -49,10 +51,12 @@ public class SuperStatusBarViewFactory {
@Inject @Inject
public SuperStatusBarViewFactory(Context context, public SuperStatusBarViewFactory(Context context,
InjectionInflationController injectionInflationController, InjectionInflationController injectionInflationController,
NotificationRowComponent.Builder notificationRowComponentBuilder) { NotificationRowComponent.Builder notificationRowComponentBuilder,
LockscreenLockIconController lockIconController) {
mContext = context; mContext = context;
mInjectionInflationController = injectionInflationController; mInjectionInflationController = injectionInflationController;
mNotificationRowComponentBuilder = notificationRowComponentBuilder; mNotificationRowComponentBuilder = notificationRowComponentBuilder;
mLockIconController = lockIconController;
} }
/** /**
@@ -73,12 +77,12 @@ public class SuperStatusBarViewFactory {
throw new IllegalStateException( throw new IllegalStateException(
"R.layout.super_notification_shade could not be properly inflated"); "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}. */ return mNotificationShadeWindowView;
public LockIcon getLockIcon() {
return getNotificationShadeWindowView().findViewById(R.id.lock_icon);
} }
/** /**

View File

@@ -22,7 +22,6 @@ import android.annotation.IntDef;
import android.content.Context; import android.content.Context;
import android.content.res.ColorStateList; import android.content.res.ColorStateList;
import android.content.res.Configuration; import android.content.res.Configuration;
import android.content.res.TypedArray;
import android.graphics.Color; import android.graphics.Color;
import android.graphics.drawable.Animatable2; import android.graphics.drawable.Animatable2;
import android.graphics.drawable.AnimatedVectorDrawable; import android.graphics.drawable.AnimatedVectorDrawable;
@@ -32,7 +31,6 @@ import android.os.Trace;
import android.provider.Settings; import android.provider.Settings;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.view.ViewGroup;
import android.view.ViewTreeObserver; import android.view.ViewTreeObserver;
import android.view.accessibility.AccessibilityNodeInfo; import android.view.accessibility.AccessibilityNodeInfo;
@@ -45,16 +43,13 @@ import com.android.systemui.Dependency;
import com.android.systemui.Interpolators; import com.android.systemui.Interpolators;
import com.android.systemui.R; import com.android.systemui.R;
import com.android.systemui.dock.DockManager; import com.android.systemui.dock.DockManager;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.KeyguardAffordanceView; import com.android.systemui.statusbar.KeyguardAffordanceView;
import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator; import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator;
import com.android.systemui.statusbar.phone.ScrimController.ScrimVisibility; import com.android.systemui.statusbar.phone.ScrimController.ScrimVisibility;
import com.android.systemui.statusbar.policy.AccessibilityController; 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.KeyguardStateController;
import com.android.systemui.statusbar.policy.OnHeadsUpChangedListener; import com.android.systemui.statusbar.policy.OnHeadsUpChangedListener;
import com.android.systemui.statusbar.policy.UserInfoController.OnUserInfoChangedListener;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy; import java.lang.annotation.RetentionPolicy;
@@ -65,8 +60,7 @@ import javax.inject.Named;
/** /**
* Manages the different states and animations of the unlock icon. * Manages the different states and animations of the unlock icon.
*/ */
public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChangedListener, public class LockIcon extends KeyguardAffordanceView implements
StatusBarStateController.StateListener, ConfigurationController.ConfigurationListener,
KeyguardStateController.Callback, NotificationWakeUpCoordinator.WakeUpListener, KeyguardStateController.Callback, NotificationWakeUpCoordinator.WakeUpListener,
ViewTreeObserver.OnPreDrawListener, OnHeadsUpChangedListener { 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_LOCK_OPEN = 1;
private static final int STATE_SCANNING_FACE = 2; private static final int STATE_SCANNING_FACE = 2;
private static final int STATE_BIOMETRICS_ERROR = 3; private static final int STATE_BIOMETRICS_ERROR = 3;
private final ConfigurationController mConfigurationController;
private final StatusBarStateController mStatusBarStateController;
private final KeyguardUpdateMonitor mKeyguardUpdateMonitor; private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
private final AccessibilityController mAccessibilityController; private final AccessibilityController mAccessibilityController;
private final DockManager mDockManager; private final DockManager mDockManager;
@@ -103,6 +95,7 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange
private boolean mKeyguardJustShown; private boolean mKeyguardJustShown;
private boolean mUpdatePending; private boolean mUpdatePending;
private boolean mBouncerPreHideAnimation; private boolean mBouncerPreHideAnimation;
private int mStatusBarState = StatusBarState.SHADE;
private final KeyguardStateController.Callback mKeyguardMonitorCallback = private final KeyguardStateController.Callback mKeyguardMonitorCallback =
new KeyguardStateController.Callback() { new KeyguardStateController.Callback() {
@@ -177,8 +170,6 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange
@Inject @Inject
public LockIcon(@Named(VIEW_CONTEXT) Context context, AttributeSet attrs, public LockIcon(@Named(VIEW_CONTEXT) Context context, AttributeSet attrs,
StatusBarStateController statusBarStateController,
ConfigurationController configurationController,
AccessibilityController accessibilityController, AccessibilityController accessibilityController,
KeyguardBypassController bypassController, KeyguardBypassController bypassController,
NotificationWakeUpCoordinator wakeUpCoordinator, NotificationWakeUpCoordinator wakeUpCoordinator,
@@ -189,8 +180,6 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange
mContext = context; mContext = context;
mKeyguardUpdateMonitor = Dependency.get(KeyguardUpdateMonitor.class); mKeyguardUpdateMonitor = Dependency.get(KeyguardUpdateMonitor.class);
mAccessibilityController = accessibilityController; mAccessibilityController = accessibilityController;
mConfigurationController = configurationController;
mStatusBarStateController = statusBarStateController;
mBypassController = bypassController; mBypassController = bypassController;
mWakeUpCoordinator = wakeUpCoordinator; mWakeUpCoordinator = wakeUpCoordinator;
mKeyguardStateController = keyguardStateController; mKeyguardStateController = keyguardStateController;
@@ -201,8 +190,6 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange
@Override @Override
protected void onAttachedToWindow() { protected void onAttachedToWindow() {
super.onAttachedToWindow(); super.onAttachedToWindow();
mStatusBarStateController.addCallback(this);
mConfigurationController.addCallback(this);
mKeyguardStateController.addCallback(mKeyguardMonitorCallback); mKeyguardStateController.addCallback(mKeyguardMonitorCallback);
mKeyguardUpdateMonitor.registerCallback(mUpdateMonitorCallback); mKeyguardUpdateMonitor.registerCallback(mUpdateMonitorCallback);
mWakeUpCoordinator.addListener(this); mWakeUpCoordinator.addListener(this);
@@ -210,15 +197,12 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange
if (mDockManager != null) { if (mDockManager != null) {
mDockManager.addListener(mDockEventListener); mDockManager.addListener(mDockEventListener);
} }
onThemeChanged();
update(); update();
} }
@Override @Override
protected void onDetachedFromWindow() { protected void onDetachedFromWindow() {
super.onDetachedFromWindow(); super.onDetachedFromWindow();
mStatusBarStateController.removeCallback(this);
mConfigurationController.removeCallback(this);
mKeyguardUpdateMonitor.removeCallback(mUpdateMonitorCallback); mKeyguardUpdateMonitor.removeCallback(mUpdateMonitorCallback);
mKeyguardStateController.removeCallback(mKeyguardMonitorCallback); mKeyguardStateController.removeCallback(mKeyguardMonitorCallback);
mWakeUpCoordinator.removeListener(this); 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. * If we're currently presenting an authentication error message.
*/ */
@@ -342,7 +312,7 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange
|| mShowingLaunchAffordance; || mShowingLaunchAffordance;
if (mBypassController.getBypassEnabled() && !mBouncerShowingScrimmed) { if (mBypassController.getBypassEnabled() && !mBouncerShowingScrimmed) {
if ((mHeadsUpManager.isHeadsUpGoingAway() || mHeadsUpManager.hasPinnedHeadsUp() if ((mHeadsUpManager.isHeadsUpGoingAway() || mHeadsUpManager.hasPinnedHeadsUp()
|| mStatusBarStateController.getState() == StatusBarState.KEYGUARD) || mStatusBarState == StatusBarState.KEYGUARD)
&& !mWakeUpCoordinator.getNotificationsFullyHidden()) { && !mWakeUpCoordinator.getNotificationsFullyHidden()) {
invisible = true; invisible = true;
} }
@@ -479,6 +449,11 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange
update(); update();
} }
void setIconColor(int iconColor) {
mIconColor = iconColor;
updateDarkTint();
}
@Retention(RetentionPolicy.SOURCE) @Retention(RetentionPolicy.SOURCE)
@IntDef({ERROR, UNLOCK, LOCK, SCANNING}) @IntDef({ERROR, UNLOCK, LOCK, SCANNING})
@interface LockAnimIndex {} @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. * When keyguard is in pulsing (AOD2) state.
* @param pulsing {@code true} when pulsing. * @param pulsing {@code true} when pulsing.
@@ -553,38 +522,11 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange
update(); update();
} }
/**
* Sets the dozing state of the keyguard.
*/
@Override
public void onDozingChanged(boolean dozing) {
mDozing = dozing;
update();
}
private void updateDarkTint() { private void updateDarkTint() {
int color = ColorUtils.blendARGB(mIconColor, Color.WHITE, mDozeAmount); int color = ColorUtils.blendARGB(mIconColor, Color.WHITE, mDozeAmount);
setImageTintList(ColorStateList.valueOf(color)); 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 * 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. * icon on top of the black front scrim.
@@ -620,4 +562,20 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange
update(); 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();
}
} }

View File

@@ -16,7 +16,21 @@
package com.android.systemui.statusbar.phone; 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.Inject;
import javax.inject.Singleton; import javax.inject.Singleton;
@@ -25,11 +39,121 @@ import javax.inject.Singleton;
@Singleton @Singleton
public class LockscreenLockIconController { 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 @Inject
public LockscreenLockIconController(SuperStatusBarViewFactory superStatusBarViewFactory) { public LockscreenLockIconController(LockscreenGestureLogger lockscreenGestureLogger,
mLockIcon = superStatusBarViewFactory.getLockIcon(); 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(); 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 */);
}
} }

View File

@@ -678,6 +678,7 @@ public class StatusBar extends SystemUI implements DemoMode,
ExtensionController extensionController, ExtensionController extensionController,
UserInfoControllerImpl userInfoControllerImpl, UserInfoControllerImpl userInfoControllerImpl,
PhoneStatusBarPolicy phoneStatusBarPolicy, PhoneStatusBarPolicy phoneStatusBarPolicy,
KeyguardIndicationController keyguardIndicationController,
DismissCallbackRegistry dismissCallbackRegistry, DismissCallbackRegistry dismissCallbackRegistry,
StatusBarTouchableRegionManager statusBarTouchableRegionManager) { StatusBarTouchableRegionManager statusBarTouchableRegionManager) {
super(context); super(context);
@@ -691,6 +692,7 @@ public class StatusBar extends SystemUI implements DemoMode,
mKeyguardBypassController = keyguardBypassController; mKeyguardBypassController = keyguardBypassController;
mKeyguardStateController = keyguardStateController; mKeyguardStateController = keyguardStateController;
mHeadsUpManager = headsUpManagerPhone; mHeadsUpManager = headsUpManagerPhone;
mKeyguardIndicationController = keyguardIndicationController;
mStatusBarTouchableRegionManager = statusBarTouchableRegionManager; mStatusBarTouchableRegionManager = statusBarTouchableRegionManager;
mDynamicPrivacyController = dynamicPrivacyController; mDynamicPrivacyController = dynamicPrivacyController;
mBypassHeadsUpNotifier = bypassHeadsUpNotifier; mBypassHeadsUpNotifier = bypassHeadsUpNotifier;
@@ -1049,10 +1051,8 @@ public class StatusBar extends SystemUI implements DemoMode,
mLockscreenWallpaper = mLockscreenWallpaperLazy.get(); mLockscreenWallpaper = mLockscreenWallpaperLazy.get();
} }
mKeyguardIndicationController = mKeyguardIndicationController.setIndicationArea(
SystemUIFactory.getInstance().createKeyguardIndicationController(mContext, mNotificationShadeWindowView.findViewById(R.id.keyguard_indication_area));
mNotificationShadeWindowView.findViewById(R.id.keyguard_indication_area),
mNotificationShadeWindowView.findViewById(R.id.lock_icon));
mNotificationPanelViewController.setKeyguardIndicationController( mNotificationPanelViewController.setKeyguardIndicationController(
mKeyguardIndicationController); mKeyguardIndicationController);

View File

@@ -46,6 +46,7 @@ import com.android.systemui.recents.ScreenPinningRequest;
import com.android.systemui.shared.plugins.PluginManager; import com.android.systemui.shared.plugins.PluginManager;
import com.android.systemui.stackdivider.Divider; import com.android.systemui.stackdivider.Divider;
import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.KeyguardIndicationController;
import com.android.systemui.statusbar.NavigationBarController; import com.android.systemui.statusbar.NavigationBarController;
import com.android.systemui.statusbar.NotificationLockscreenUserManager; import com.android.systemui.statusbar.NotificationLockscreenUserManager;
import com.android.systemui.statusbar.NotificationMediaManager; import com.android.systemui.statusbar.NotificationMediaManager;
@@ -195,6 +196,7 @@ public interface StatusBarPhoneModule {
ExtensionController extensionController, ExtensionController extensionController,
UserInfoControllerImpl userInfoControllerImpl, UserInfoControllerImpl userInfoControllerImpl,
PhoneStatusBarPolicy phoneStatusBarPolicy, PhoneStatusBarPolicy phoneStatusBarPolicy,
KeyguardIndicationController keyguardIndicationController,
DismissCallbackRegistry dismissCallbackRegistry, DismissCallbackRegistry dismissCallbackRegistry,
StatusBarTouchableRegionManager statusBarTouchableRegionManager) { StatusBarTouchableRegionManager statusBarTouchableRegionManager) {
return new StatusBar( return new StatusBar(
@@ -272,6 +274,7 @@ public interface StatusBarPhoneModule {
extensionController, extensionController,
userInfoControllerImpl, userInfoControllerImpl,
phoneStatusBarPolicy, phoneStatusBarPolicy,
keyguardIndicationController,
dismissCallbackRegistry, dismissCallbackRegistry,
statusBarTouchableRegionManager); statusBarTouchableRegionManager);
} }

View File

@@ -24,6 +24,8 @@ import androidx.annotation.VisibleForTesting;
import java.util.HashMap; import java.util.HashMap;
import javax.inject.Inject;
/** WakeLock wrapper for testability */ /** WakeLock wrapper for testability */
public interface WakeLock { 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);
}
}
} }

View File

@@ -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.notification.row.dagger.NotificationRowComponent;
import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.statusbar.phone.KeyguardBypassController; 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.NotificationGroupManager;
import com.android.systemui.statusbar.phone.NotificationShadeWindowController; import com.android.systemui.statusbar.phone.NotificationShadeWindowController;
import com.android.systemui.statusbar.phone.ShadeController; import com.android.systemui.statusbar.phone.ShadeController;
@@ -170,6 +171,8 @@ public class BubbleControllerTest extends SysuiTestCase {
private FeatureFlags mFeatureFlagsOldPipeline; private FeatureFlags mFeatureFlagsOldPipeline;
@Mock @Mock
private DumpManager mDumpManager; private DumpManager mDumpManager;
@Mock
private LockscreenLockIconController mLockIconController;
private SuperStatusBarViewFactory mSuperStatusBarViewFactory; private SuperStatusBarViewFactory mSuperStatusBarViewFactory;
private BubbleData mBubbleData; private BubbleData mBubbleData;
@@ -198,7 +201,8 @@ public class BubbleControllerTest extends SysuiTestCase {
public NotificationRowComponent build() { public NotificationRowComponent build() {
return mNotificationRowComponent; return mNotificationRowComponent;
} }
}); },
mLockIconController);
// Bubbles get added to status bar window view // Bubbles get added to status bar window view
mNotificationShadeWindowController = new NotificationShadeWindowController(mContext, mNotificationShadeWindowController = new NotificationShadeWindowController(mContext,

View File

@@ -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.notification.row.dagger.NotificationRowComponent;
import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.statusbar.phone.KeyguardBypassController; 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.NotificationGroupManager;
import com.android.systemui.statusbar.phone.NotificationShadeWindowController; import com.android.systemui.statusbar.phone.NotificationShadeWindowController;
import com.android.systemui.statusbar.phone.ShadeController; import com.android.systemui.statusbar.phone.ShadeController;
@@ -164,6 +165,8 @@ public class NewNotifPipelineBubbleControllerTest extends SysuiTestCase {
private FeatureFlags mFeatureFlagsNewPipeline; private FeatureFlags mFeatureFlagsNewPipeline;
@Mock @Mock
private DumpManager mDumpManager; private DumpManager mDumpManager;
@Mock
private LockscreenLockIconController mLockIconController;
private SuperStatusBarViewFactory mSuperStatusBarViewFactory; private SuperStatusBarViewFactory mSuperStatusBarViewFactory;
private BubbleData mBubbleData; private BubbleData mBubbleData;
@@ -192,7 +195,8 @@ public class NewNotifPipelineBubbleControllerTest extends SysuiTestCase {
public NotificationRowComponent build() { public NotificationRowComponent build() {
return mNotificationRowComponent; return mNotificationRowComponent;
} }
}); },
mLockIconController);
// Bubbles get added to status bar window view // Bubbles get added to status bar window view
mNotificationShadeWindowController = new NotificationShadeWindowController(mContext, mNotificationShadeWindowController = new NotificationShadeWindowController(mContext,

View File

@@ -44,7 +44,6 @@ import android.os.BatteryManager;
import android.os.Looper; import android.os.Looper;
import android.os.RemoteException; import android.os.RemoteException;
import android.os.UserManager; import android.os.UserManager;
import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import androidx.test.InstrumentationRegistry; import androidx.test.InstrumentationRegistry;
@@ -52,7 +51,6 @@ import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4; import androidx.test.runner.AndroidJUnit4;
import com.android.internal.app.IBatteryStats; import com.android.internal.app.IBatteryStats;
import com.android.internal.widget.LockPatternUtils;
import com.android.keyguard.KeyguardUpdateMonitor; import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.settingslib.Utils; import com.android.settingslib.Utils;
import com.android.settingslib.fuelgauge.BatteryStatus; 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.dock.DockManager;
import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.phone.KeyguardIndicationTextView; 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.phone.StatusBarKeyguardViewManager;
import com.android.systemui.statusbar.policy.AccessibilityController;
import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.util.wakelock.WakeLockFake; import com.android.systemui.util.wakelock.WakeLockFake;
@@ -85,14 +80,6 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase {
@Mock @Mock
private ViewGroup mIndicationArea; private ViewGroup mIndicationArea;
@Mock @Mock
private LockIcon mLockIcon;
@Mock
private LockPatternUtils mLockPatternUtils;
@Mock
private ShadeController mShadeController;
@Mock
private AccessibilityController mAccessibilityController;
@Mock
private KeyguardStateController mKeyguardStateController; private KeyguardStateController mKeyguardStateController;
@Mock @Mock
private StatusBarStateController mStatusBarStateController; private StatusBarStateController mStatusBarStateController;
@@ -111,6 +98,7 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase {
private KeyguardIndicationTextView mTextView; private KeyguardIndicationTextView mTextView;
private KeyguardIndicationController mController; private KeyguardIndicationController mController;
private WakeLockFake.Builder mWakeLockBuilder;
private WakeLockFake mWakeLock; private WakeLockFake mWakeLock;
private Instrumentation mInstrumentation; private Instrumentation mInstrumentation;
@@ -131,16 +119,19 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase {
when(mIndicationArea.findViewById(R.id.keyguard_indication_text)).thenReturn(mTextView); when(mIndicationArea.findViewById(R.id.keyguard_indication_text)).thenReturn(mTextView);
mWakeLock = new WakeLockFake(); mWakeLock = new WakeLockFake();
mWakeLockBuilder = new WakeLockFake.Builder(mContext);
mWakeLockBuilder.setWakeLock(mWakeLock);
} }
private void createController() { private void createController() {
if (Looper.myLooper() == null) { if (Looper.myLooper() == null) {
Looper.prepare(); Looper.prepare();
} }
mController = new KeyguardIndicationController(mContext, mIndicationArea, mLockIcon,
mLockPatternUtils, mWakeLock, mShadeController, mAccessibilityController, mController = new KeyguardIndicationController(mContext, mWakeLockBuilder,
mKeyguardStateController, mStatusBarStateController, mKeyguardUpdateMonitor, mKeyguardStateController, mStatusBarStateController, mKeyguardUpdateMonitor,
mDockManager, mIBatteryStats); mDockManager, mIBatteryStats);
mController.setIndicationArea(mIndicationArea);
mController.setStatusBarKeyguardViewManager(mStatusBarKeyguardViewManager); mController.setStatusBarKeyguardViewManager(mStatusBarKeyguardViewManager);
clearInvocations(mIBatteryStats); clearInvocations(mIBatteryStats);
} }
@@ -318,26 +309,6 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase {
verify(mStatusBarKeyguardViewManager).showBouncerMessage(eq(message), any()); 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 @Test
public void updateMonitor_listenerUpdatesIndication() { public void updateMonitor_listenerUpdatesIndication() {
createController(); createController();

View File

@@ -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();
}
}

View File

@@ -402,6 +402,7 @@ public class StatusBarTest extends SysuiTestCase {
mExtensionController, mExtensionController,
mUserInfoControllerImpl, mUserInfoControllerImpl,
mPhoneStatusBarPolicy, mPhoneStatusBarPolicy,
mKeyguardIndicationController,
mDismissCallbackRegistry, mDismissCallbackRegistry,
mStatusBarTouchableRegionManager); mStatusBarTouchableRegionManager);

View File

@@ -16,6 +16,8 @@
package com.android.systemui.util.wakelock; package com.android.systemui.util.wakelock;
import android.content.Context;
import com.android.internal.util.Preconditions; import com.android.internal.util.Preconditions;
public class WakeLockFake implements WakeLock { public class WakeLockFake implements WakeLock {
@@ -48,4 +50,24 @@ public class WakeLockFake implements WakeLock {
public boolean isHeld() { public boolean isHeld() {
return mAcquired > 0; 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();
}
}
} }