Merge "Always show lock icon if device is locked" into sc-dev

This commit is contained in:
Beverly Tai
2021-07-02 14:17:54 +00:00
committed by Android (Google) Code Review
7 changed files with 86 additions and 82 deletions

View File

@@ -659,13 +659,6 @@
<!--sensorRadius --> <!--sensorRadius -->
</integer-array> </integer-array>
<!-- The properties of the lock icon in pixels. -->
<integer-array name="config_lock_icon_props">
<!-- X -->
<!-- Y -->
<!-- radius -->
</integer-array>
<!-- Overrides the behavior of the face unlock keyguard bypass setting: <!-- Overrides the behavior of the face unlock keyguard bypass setting:
0 - Don't override the setting (default) 0 - Don't override the setting (default)
1 - Override the setting to always bypass keyguard 1 - Override the setting to always bypass keyguard

View File

@@ -16,7 +16,6 @@
package com.android.keyguard; package com.android.keyguard;
import android.annotation.NonNull;
import android.content.Context; import android.content.Context;
import android.graphics.PointF; import android.graphics.PointF;
import android.graphics.RectF; import android.graphics.RectF;
@@ -24,10 +23,17 @@ import android.util.AttributeSet;
import android.widget.FrameLayout; import android.widget.FrameLayout;
import android.widget.ImageView; import android.widget.ImageView;
import androidx.annotation.NonNull;
import com.android.systemui.Dumpable;
import java.io.FileDescriptor;
import java.io.PrintWriter;
/** /**
* A view positioned under the notification shade. * A view positioned under the notification shade.
*/ */
public class LockIconView extends ImageView { public class LockIconView extends ImageView implements Dumpable {
@NonNull private final RectF mSensorRect; @NonNull private final RectF mSensorRect;
@NonNull private PointF mLockIconCenter = new PointF(0f, 0f); @NonNull private PointF mLockIconCenter = new PointF(0f, 0f);
private int mRadius; private int mRadius;
@@ -63,4 +69,11 @@ public class LockIconView extends ImageView {
float getLocationTop() { float getLocationTop() {
return mLockIconCenter.y - mRadius; return mLockIconCenter.y - mRadius;
} }
@Override
public void dump(@NonNull FileDescriptor fd, @NonNull PrintWriter pw, @NonNull String[] args) {
pw.println("Center in px (x, y)= (" + mLockIconCenter.x + ", " + mLockIconCenter.y + ")");
pw.println("Radius in pixels: " + mRadius);
}
} }

View File

@@ -18,17 +18,17 @@ package com.android.keyguard;
import static android.hardware.biometrics.BiometricSourceType.FINGERPRINT; import static android.hardware.biometrics.BiometricSourceType.FINGERPRINT;
import static com.android.systemui.classifier.Classifier.DISABLED_UDFPS_AFFORDANCE; import static com.android.systemui.classifier.Classifier.LOCK_ICON;
import android.content.Context; import android.content.Context;
import android.content.res.Configuration;
import android.graphics.PointF; import android.graphics.PointF;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.graphics.drawable.InsetDrawable; import android.graphics.drawable.InsetDrawable;
import android.hardware.biometrics.BiometricSourceType; import android.hardware.biometrics.BiometricSourceType;
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal; import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
import android.util.Log; import android.util.DisplayMetrics;
import android.view.View; import android.view.View;
import android.view.ViewGroup;
import android.view.accessibility.AccessibilityManager; import android.view.accessibility.AccessibilityManager;
import android.view.accessibility.AccessibilityNodeInfo; import android.view.accessibility.AccessibilityNodeInfo;
@@ -73,15 +73,10 @@ public class LockIconViewController extends ViewController<LockIconView> impleme
@NonNull private final AccessibilityManager mAccessibilityManager; @NonNull private final AccessibilityManager mAccessibilityManager;
@NonNull private final ConfigurationController mConfigurationController; @NonNull private final ConfigurationController mConfigurationController;
@NonNull private final DelayableExecutor mExecutor; @NonNull private final DelayableExecutor mExecutor;
private boolean mHasUdfpsOrFaceAuthFeatures;
private boolean mUdfpsEnrolled; private boolean mUdfpsEnrolled;
private boolean mFaceAuthEnrolled;
@NonNull private final Drawable mButton;
@NonNull private final Drawable mUnlockIcon; @NonNull private final Drawable mUnlockIcon;
@NonNull private final Drawable mLockIcon; @NonNull private final Drawable mLockIcon;
@NonNull private final CharSequence mDisabledLabel;
@NonNull private final CharSequence mUnlockedLabel; @NonNull private final CharSequence mUnlockedLabel;
@NonNull private final CharSequence mLockedLabel; @NonNull private final CharSequence mLockedLabel;
@@ -95,7 +90,12 @@ public class LockIconViewController extends ViewController<LockIconView> impleme
private boolean mUserUnlockedWithBiometric; private boolean mUserUnlockedWithBiometric;
private Runnable mCancelDelayedUpdateVisibilityRunnable; private Runnable mCancelDelayedUpdateVisibilityRunnable;
private boolean mShowButton; private boolean mHasUdfps;
private float mHeightPixels;
private float mWidthPixels;
private float mDensity;
private int mIndicationBottomPadding;
private boolean mShowUnlockIcon; private boolean mShowUnlockIcon;
private boolean mShowLockIcon; private boolean mShowLockIcon;
@@ -125,8 +125,6 @@ public class LockIconViewController extends ViewController<LockIconView> impleme
mExecutor = executor; mExecutor = executor;
final Context context = view.getContext(); final Context context = view.getContext();
mButton = context.getResources().getDrawable(
com.android.systemui.R.drawable.circle_white, context.getTheme());
mUnlockIcon = new InsetDrawable(context.getResources().getDrawable( mUnlockIcon = new InsetDrawable(context.getResources().getDrawable(
com.android.internal.R.drawable.ic_lock_open, context.getTheme()), com.android.internal.R.drawable.ic_lock_open, context.getTheme()),
context.getResources().getDimensionPixelSize( context.getResources().getDimensionPixelSize(
@@ -135,8 +133,6 @@ public class LockIconViewController extends ViewController<LockIconView> impleme
com.android.internal.R.drawable.ic_lock, context.getTheme()), com.android.internal.R.drawable.ic_lock, context.getTheme()),
context.getResources().getDimensionPixelSize( context.getResources().getDimensionPixelSize(
com.android.systemui.R.dimen.udfps_unlock_icon_inset)); com.android.systemui.R.dimen.udfps_unlock_icon_inset));
mDisabledLabel = context.getResources().getString(
R.string.accessibility_udfps_disabled_button);
mUnlockedLabel = context.getResources().getString(R.string.accessibility_unlock_button); mUnlockedLabel = context.getResources().getString(R.string.accessibility_unlock_button);
mLockedLabel = context.getResources().getString(R.string.accessibility_lock_icon); mLockedLabel = context.getResources().getString(R.string.accessibility_lock_icon);
dumpManager.registerDumpable("LockIconViewController", this); dumpManager.registerDumpable("LockIconViewController", this);
@@ -149,37 +145,11 @@ public class LockIconViewController extends ViewController<LockIconView> impleme
@Override @Override
protected void onViewAttached() { protected void onViewAttached() {
// we check this here instead of onInit since the FingeprintManager + FaceManager may not // we check this here instead of onInit since the FingerprintManager + FaceManager may not
// have started up yet onInit // have started up yet onInit
final boolean hasFaceAuth = mAuthController.getFaceAuthSensorLocation() != null; mHasUdfps = mAuthController.getUdfpsSensorLocation() != null;
final boolean hasUdfps = mAuthController.getUdfpsSensorLocation() != null;
mHasUdfpsOrFaceAuthFeatures = hasFaceAuth || hasUdfps;
if (!mHasUdfpsOrFaceAuthFeatures) {
// Posting since removing a view in the middle of onAttach can lead to a crash in the
// iteration loop when the view isn't last
mView.setVisibility(View.GONE);
mView.post(() -> {
mView.setVisibility(View.VISIBLE);
((ViewGroup) mView.getParent()).removeView(mView);
});
return;
}
if (hasUdfps) {
FingerprintSensorPropertiesInternal props = mAuthController.getUdfpsProps().get(0);
mView.setLocation(new PointF(props.sensorLocationX, props.sensorLocationY),
props.sensorRadius);
} else {
int[] props = mView.getContext().getResources().getIntArray(
com.android.systemui.R.array.config_lock_icon_props);
if (props == null || props.length < 3) {
Log.e("LockIconViewController", "lock icon position should be "
+ "setup in config under config_lock_icon_props");
props = new int[]{0, 0, 0};
}
mView.setLocation(new PointF(props[0], props[1]), props[2]);
}
updateConfiguration();
updateKeyguardShowing(); updateKeyguardShowing();
mUserUnlockedWithBiometric = false; mUserUnlockedWithBiometric = false;
mIsBouncerShowing = mKeyguardViewController.isBouncerShowing(); mIsBouncerShowing = mKeyguardViewController.isBouncerShowing();
@@ -220,7 +190,7 @@ public class LockIconViewController extends ViewController<LockIconView> impleme
} }
private boolean onAffordanceClick() { private boolean onAffordanceClick() {
if (mFalsingManager.isFalseTouch(DISABLED_UDFPS_AFFORDANCE)) { if (mFalsingManager.isFalseTouch(LOCK_ICON)) {
return false; return false;
} }
@@ -245,32 +215,25 @@ public class LockIconViewController extends ViewController<LockIconView> impleme
mCancelDelayedUpdateVisibilityRunnable = null; mCancelDelayedUpdateVisibilityRunnable = null;
} }
if (!mIsKeyguardShowing || (!mUdfpsEnrolled && !mFaceAuthEnrolled)) { if (!mIsKeyguardShowing) {
mView.setVisibility(View.INVISIBLE); mView.setVisibility(View.INVISIBLE);
return; return;
} }
// these three states are mutually exclusive: mShowLockIcon = !mCanDismissLockScreen && !mUserUnlockedWithBiometric && isLockScreen()
mShowButton = mUdfpsEnrolled && !mCanDismissLockScreen && !mRunningFPS && (!mUdfpsEnrolled || !mRunningFPS);
&& !mUserUnlockedWithBiometric && isLockScreen(); mShowUnlockIcon = mCanDismissLockScreen && isLockScreen();
mShowUnlockIcon = mFaceAuthEnrolled & mCanDismissLockScreen && isLockScreen();
mShowLockIcon = !mUdfpsEnrolled && !mCanDismissLockScreen && isLockScreen()
&& mFaceAuthEnrolled;
updateClickListener(); updateClickListener();
final CharSequence prevContentDescription = mView.getContentDescription(); final CharSequence prevContentDescription = mView.getContentDescription();
if (mShowButton) { if (mShowLockIcon) {
mView.setImageDrawable(mButton); mView.setImageDrawable(mLockIcon);
mView.setVisibility(View.VISIBLE); mView.setVisibility(View.VISIBLE);
mView.setContentDescription(mDisabledLabel); mView.setContentDescription(mLockedLabel);
} else if (mShowUnlockIcon) { } else if (mShowUnlockIcon) {
mView.setImageDrawable(mUnlockIcon); mView.setImageDrawable(mUnlockIcon);
mView.setVisibility(View.VISIBLE); mView.setVisibility(View.VISIBLE);
mView.setContentDescription(mUnlockedLabel); mView.setContentDescription(mUnlockedLabel);
} else if (mShowLockIcon) {
mView.setImageDrawable(mLockIcon);
mView.setVisibility(View.VISIBLE);
mView.setContentDescription(mLockedLabel);
} else { } else {
mView.setVisibility(View.INVISIBLE); mView.setVisibility(View.INVISIBLE);
mView.setContentDescription(null); mView.setContentDescription(null);
@@ -293,7 +256,7 @@ public class LockIconViewController extends ViewController<LockIconView> impleme
getResources().getString(R.string.accessibility_enter_hint)); getResources().getString(R.string.accessibility_enter_hint));
public void onInitializeAccessibilityNodeInfo(View v, AccessibilityNodeInfo info) { public void onInitializeAccessibilityNodeInfo(View v, AccessibilityNodeInfo info) {
super.onInitializeAccessibilityNodeInfo(v, info); super.onInitializeAccessibilityNodeInfo(v, info);
if (mShowButton || mShowLockIcon) { if (mShowLockIcon) {
info.addAction(mAccessibilityAuthenticateHint); info.addAction(mAccessibilityAuthenticateHint);
} else if (mShowUnlockIcon) { } else if (mShowUnlockIcon) {
info.addAction(mAccessibilityEnterHint); info.addAction(mAccessibilityEnterHint);
@@ -310,13 +273,19 @@ public class LockIconViewController extends ViewController<LockIconView> impleme
private void updateClickListener() { private void updateClickListener() {
if (mView != null) { if (mView != null) {
mView.setOnClickListener(v -> onAffordanceClick()); if (mUdfpsEnrolled || mShowUnlockIcon) {
if (mAccessibilityManager.isTouchExplorationEnabled()) { mView.setOnClickListener(v -> onAffordanceClick());
mView.setOnLongClickListener(null); if (mAccessibilityManager.isTouchExplorationEnabled()) {
mView.setLongClickable(false); mView.setOnLongClickListener(null);
mView.setLongClickable(false);
} else {
mView.setOnLongClickListener(v -> onAffordanceClick());
}
} else { } else {
mView.setOnLongClickListener(v -> onAffordanceClick()); mView.setOnClickListener(null);
mView.setOnLongClickListener(null);
} }
} }
} }
@@ -332,13 +301,35 @@ public class LockIconViewController extends ViewController<LockIconView> impleme
mLockIcon.setTint(color); mLockIcon.setTint(color);
} }
private void updateConfiguration() {
final DisplayMetrics metrics = mView.getContext().getResources().getDisplayMetrics();
mWidthPixels = metrics.widthPixels;
mHeightPixels = metrics.heightPixels;
mDensity = metrics.density;
mIndicationBottomPadding = mView.getContext().getResources().getDimensionPixelSize(
R.dimen.keyguard_indication_bottom_padding);
updateLockIconLocation();
}
private void updateLockIconLocation() {
if (mHasUdfps) {
FingerprintSensorPropertiesInternal props = mAuthController.getUdfpsProps().get(0);
mView.setLocation(new PointF(props.sensorLocationX, props.sensorLocationY),
props.sensorRadius);
} else {
final float distAboveKgBottomArea = 12 * mDensity;
final float radius = 36 * mDensity;
mView.setLocation(
new PointF(mWidthPixels / 2,
mHeightPixels - mIndicationBottomPadding - distAboveKgBottomArea - radius),
(int) radius);
}
}
@Override @Override
public void dump(@NonNull FileDescriptor fd, @NonNull PrintWriter pw, @NonNull String[] args) { public void dump(@NonNull FileDescriptor fd, @NonNull PrintWriter pw, @NonNull String[] args) {
pw.println("mHasUdfpsOrFaceAuthFeatures: " + mHasUdfpsOrFaceAuthFeatures);
pw.println("mUdfpsEnrolled: " + mUdfpsEnrolled); pw.println("mUdfpsEnrolled: " + mUdfpsEnrolled);
pw.println("mFaceAuthEnrolled: " + mFaceAuthEnrolled);
pw.println("mIsKeyguardShowing: " + mIsKeyguardShowing); pw.println("mIsKeyguardShowing: " + mIsKeyguardShowing);
pw.println(" mShowBouncerButton: " + mShowButton);
pw.println(" mShowUnlockIcon: " + mShowUnlockIcon); pw.println(" mShowUnlockIcon: " + mShowUnlockIcon);
pw.println(" mShowLockIcon: " + mShowLockIcon); pw.println(" mShowLockIcon: " + mShowLockIcon);
pw.println(" mIsDozing: " + mIsDozing); pw.println(" mIsDozing: " + mIsDozing);
@@ -348,6 +339,10 @@ public class LockIconViewController extends ViewController<LockIconView> impleme
pw.println(" mCanDismissLockScreen: " + mCanDismissLockScreen); pw.println(" mCanDismissLockScreen: " + mCanDismissLockScreen);
pw.println(" mStatusBarState: " + StatusBarState.toShortString(mStatusBarState)); pw.println(" mStatusBarState: " + StatusBarState.toShortString(mStatusBarState));
pw.println(" mQsExpanded: " + mQsExpanded); pw.println(" mQsExpanded: " + mQsExpanded);
if (mView != null) {
mView.dump(fd, pw, args);
}
} }
private StatusBarStateController.StateListener mStatusBarStateListener = private StatusBarStateController.StateListener mStatusBarStateListener =
@@ -420,7 +415,6 @@ public class LockIconViewController extends ViewController<LockIconView> impleme
public void onKeyguardShowingChanged() { public void onKeyguardShowingChanged() {
updateKeyguardShowing(); updateKeyguardShowing();
mUdfpsEnrolled = mKeyguardUpdateMonitor.isUdfpsEnrolled(); mUdfpsEnrolled = mKeyguardUpdateMonitor.isUdfpsEnrolled();
mFaceAuthEnrolled = mKeyguardUpdateMonitor.isFaceEnrolled();
updateVisibility(); updateVisibility();
} }
@@ -447,6 +441,11 @@ public class LockIconViewController extends ViewController<LockIconView> impleme
public void onOverlayChanged() { public void onOverlayChanged() {
updateColors(); updateColors();
} }
@Override
public void onConfigChanged(Configuration newConfig) {
updateConfiguration();
}
}; };
private final AccessibilityManager.TouchExplorationStateChangeListener private final AccessibilityManager.TouchExplorationStateChangeListener

View File

@@ -41,7 +41,7 @@ public abstract class Classifier {
public static final int SHADE_DRAG = 11; public static final int SHADE_DRAG = 11;
public static final int QS_COLLAPSE = 12; public static final int QS_COLLAPSE = 12;
public static final int UDFPS_AUTHENTICATION = 13; public static final int UDFPS_AUTHENTICATION = 13;
public static final int DISABLED_UDFPS_AFFORDANCE = 14; public static final int LOCK_ICON = 14;
public static final int QS_SWIPE = 15; public static final int QS_SWIPE = 15;
public static final int BACK_GESTURE = 16; public static final int BACK_GESTURE = 16;
@@ -61,7 +61,7 @@ public abstract class Classifier {
QS_COLLAPSE, QS_COLLAPSE,
BRIGHTNESS_SLIDER, BRIGHTNESS_SLIDER,
UDFPS_AUTHENTICATION, UDFPS_AUTHENTICATION,
DISABLED_UDFPS_AFFORDANCE, LOCK_ICON,
QS_SWIPE, QS_SWIPE,
BACK_GESTURE BACK_GESTURE
}) })

View File

@@ -155,7 +155,7 @@ class DistanceClassifier extends FalsingClassifier {
|| interactionType == SHADE_DRAG || interactionType == SHADE_DRAG
|| interactionType == QS_COLLAPSE || interactionType == QS_COLLAPSE
|| interactionType == Classifier.UDFPS_AUTHENTICATION || interactionType == Classifier.UDFPS_AUTHENTICATION
|| interactionType == Classifier.DISABLED_UDFPS_AFFORDANCE || interactionType == Classifier.LOCK_ICON
|| interactionType == Classifier.QS_SWIPE) { || interactionType == Classifier.QS_SWIPE) {
return Result.passed(0); return Result.passed(0);
} }

View File

@@ -46,7 +46,7 @@ public class TypeClassifier extends FalsingClassifier {
@Classifier.InteractionType int interactionType, @Classifier.InteractionType int interactionType,
double historyBelief, double historyConfidence) { double historyBelief, double historyConfidence) {
if (interactionType == Classifier.UDFPS_AUTHENTICATION if (interactionType == Classifier.UDFPS_AUTHENTICATION
|| interactionType == Classifier.DISABLED_UDFPS_AFFORDANCE) { || interactionType == Classifier.LOCK_ICON) {
return Result.passed(0); return Result.passed(0);
} }

View File

@@ -1334,8 +1334,7 @@ public class NotificationPanelViewController extends PanelViewController {
: mNotificationShelfController.getIntrinsicHeight() + notificationPadding; : mNotificationShelfController.getIntrinsicHeight() + notificationPadding;
float lockIconPadding = 0; float lockIconPadding = 0;
if (mLockIconViewController.getTop() != 0 if (mLockIconViewController.getTop() != 0) {
&& (mUpdateMonitor.isUdfpsEnrolled() || mUpdateMonitor.isFaceEnrolled())) {
lockIconPadding = mStatusBar.getDisplayHeight() - mLockIconViewController.getTop(); lockIconPadding = mStatusBar.getDisplayHeight() - mLockIconViewController.getTop();
} }