Merge changes from topic "b150393918-lock-icon-controller" into rvc-dev am: a40c4b47ef am: ab1cb86280 am: 45168584a8

Change-Id: Ie327eb75f8fc219df32940d1cafd75a2e66bb439
This commit is contained in:
Automerger Merge Worker
2020-03-04 16:36:39 +00:00
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.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;

View File

@@ -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,

View File

@@ -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;

View File

@@ -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() {

View File

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

View File

@@ -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;
}
/**

View File

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

View File

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

View File

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

View File

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

View File

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

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.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,

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.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,

View File

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

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,
mUserInfoControllerImpl,
mPhoneStatusBarPolicy,
mKeyguardIndicationController,
mDismissCallbackRegistry,
mStatusBarTouchableRegionManager);

View File

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