diff options
| author | 2021-06-29 14:24:50 -0400 | |
|---|---|---|
| committer | 2021-07-01 19:25:45 +0000 | |
| commit | 4bebd71f8364da6b7e12b889f1ebbd36a8476436 (patch) | |
| tree | be4e78d7234a41e74fcd94c59601ae3584cfd840 | |
| parent | e68668899b47b1ba00a75fc3e2737cb934b646ff (diff) | |
Always show lock icon if device is locked
- Previously lock icon would only show on devices with udfps or face auth
enabled.
- Icon is only clickable if udfps is enrolled OR device is unlocked
Bug: 192355838
Fixes: 187083137
Test: manual
Change-Id: I2bf160ba2e09d215a95dce05a55bdbf1ed587e63
7 files changed, 86 insertions, 82 deletions
diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml index 2a1bee5344ec..e22bca7c1283 100644 --- a/packages/SystemUI/res/values/config.xml +++ b/packages/SystemUI/res/values/config.xml @@ -659,13 +659,6 @@ <!--sensorRadius --> </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: 0 - Don't override the setting (default) 1 - Override the setting to always bypass keyguard diff --git a/packages/SystemUI/src/com/android/keyguard/LockIconView.java b/packages/SystemUI/src/com/android/keyguard/LockIconView.java index 423bd5626da9..c425ddf7eeb1 100644 --- a/packages/SystemUI/src/com/android/keyguard/LockIconView.java +++ b/packages/SystemUI/src/com/android/keyguard/LockIconView.java @@ -16,7 +16,6 @@ package com.android.keyguard; -import android.annotation.NonNull; import android.content.Context; import android.graphics.PointF; import android.graphics.RectF; @@ -24,10 +23,17 @@ import android.util.AttributeSet; import android.widget.FrameLayout; 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. */ -public class LockIconView extends ImageView { +public class LockIconView extends ImageView implements Dumpable { @NonNull private final RectF mSensorRect; @NonNull private PointF mLockIconCenter = new PointF(0f, 0f); private int mRadius; @@ -63,4 +69,11 @@ public class LockIconView extends ImageView { float getLocationTop() { 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); + } } diff --git a/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java b/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java index ccc487925fe4..4b944339541d 100644 --- a/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java +++ b/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java @@ -18,17 +18,17 @@ package com.android.keyguard; 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.res.Configuration; import android.graphics.PointF; import android.graphics.drawable.Drawable; import android.graphics.drawable.InsetDrawable; import android.hardware.biometrics.BiometricSourceType; import android.hardware.fingerprint.FingerprintSensorPropertiesInternal; -import android.util.Log; +import android.util.DisplayMetrics; import android.view.View; -import android.view.ViewGroup; import android.view.accessibility.AccessibilityManager; import android.view.accessibility.AccessibilityNodeInfo; @@ -73,15 +73,10 @@ public class LockIconViewController extends ViewController<LockIconView> impleme @NonNull private final AccessibilityManager mAccessibilityManager; @NonNull private final ConfigurationController mConfigurationController; @NonNull private final DelayableExecutor mExecutor; - - private boolean mHasUdfpsOrFaceAuthFeatures; private boolean mUdfpsEnrolled; - private boolean mFaceAuthEnrolled; - @NonNull private final Drawable mButton; @NonNull private final Drawable mUnlockIcon; @NonNull private final Drawable mLockIcon; - @NonNull private final CharSequence mDisabledLabel; @NonNull private final CharSequence mUnlockedLabel; @NonNull private final CharSequence mLockedLabel; @@ -95,7 +90,12 @@ public class LockIconViewController extends ViewController<LockIconView> impleme private boolean mUserUnlockedWithBiometric; 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 mShowLockIcon; @@ -125,8 +125,6 @@ public class LockIconViewController extends ViewController<LockIconView> impleme mExecutor = executor; final Context context = view.getContext(); - mButton = context.getResources().getDrawable( - com.android.systemui.R.drawable.circle_white, context.getTheme()); mUnlockIcon = new InsetDrawable(context.getResources().getDrawable( com.android.internal.R.drawable.ic_lock_open, context.getTheme()), context.getResources().getDimensionPixelSize( @@ -135,8 +133,6 @@ public class LockIconViewController extends ViewController<LockIconView> impleme com.android.internal.R.drawable.ic_lock, context.getTheme()), context.getResources().getDimensionPixelSize( 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); mLockedLabel = context.getResources().getString(R.string.accessibility_lock_icon); dumpManager.registerDumpable("LockIconViewController", this); @@ -149,37 +145,11 @@ public class LockIconViewController extends ViewController<LockIconView> impleme @Override 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 - final boolean hasFaceAuth = mAuthController.getFaceAuthSensorLocation() != 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]); - } + mHasUdfps = mAuthController.getUdfpsSensorLocation() != null; + updateConfiguration(); updateKeyguardShowing(); mUserUnlockedWithBiometric = false; mIsBouncerShowing = mKeyguardViewController.isBouncerShowing(); @@ -220,7 +190,7 @@ public class LockIconViewController extends ViewController<LockIconView> impleme } private boolean onAffordanceClick() { - if (mFalsingManager.isFalseTouch(DISABLED_UDFPS_AFFORDANCE)) { + if (mFalsingManager.isFalseTouch(LOCK_ICON)) { return false; } @@ -245,32 +215,25 @@ public class LockIconViewController extends ViewController<LockIconView> impleme mCancelDelayedUpdateVisibilityRunnable = null; } - if (!mIsKeyguardShowing || (!mUdfpsEnrolled && !mFaceAuthEnrolled)) { + if (!mIsKeyguardShowing) { mView.setVisibility(View.INVISIBLE); return; } - // these three states are mutually exclusive: - mShowButton = mUdfpsEnrolled && !mCanDismissLockScreen && !mRunningFPS - && !mUserUnlockedWithBiometric && isLockScreen(); - mShowUnlockIcon = mFaceAuthEnrolled & mCanDismissLockScreen && isLockScreen(); - mShowLockIcon = !mUdfpsEnrolled && !mCanDismissLockScreen && isLockScreen() - && mFaceAuthEnrolled; + mShowLockIcon = !mCanDismissLockScreen && !mUserUnlockedWithBiometric && isLockScreen() + && (!mUdfpsEnrolled || !mRunningFPS); + mShowUnlockIcon = mCanDismissLockScreen && isLockScreen(); updateClickListener(); final CharSequence prevContentDescription = mView.getContentDescription(); - if (mShowButton) { - mView.setImageDrawable(mButton); + if (mShowLockIcon) { + mView.setImageDrawable(mLockIcon); mView.setVisibility(View.VISIBLE); - mView.setContentDescription(mDisabledLabel); + mView.setContentDescription(mLockedLabel); } else if (mShowUnlockIcon) { mView.setImageDrawable(mUnlockIcon); mView.setVisibility(View.VISIBLE); mView.setContentDescription(mUnlockedLabel); - } else if (mShowLockIcon) { - mView.setImageDrawable(mLockIcon); - mView.setVisibility(View.VISIBLE); - mView.setContentDescription(mLockedLabel); } else { mView.setVisibility(View.INVISIBLE); mView.setContentDescription(null); @@ -293,7 +256,7 @@ public class LockIconViewController extends ViewController<LockIconView> impleme getResources().getString(R.string.accessibility_enter_hint)); public void onInitializeAccessibilityNodeInfo(View v, AccessibilityNodeInfo info) { super.onInitializeAccessibilityNodeInfo(v, info); - if (mShowButton || mShowLockIcon) { + if (mShowLockIcon) { info.addAction(mAccessibilityAuthenticateHint); } else if (mShowUnlockIcon) { info.addAction(mAccessibilityEnterHint); @@ -310,13 +273,19 @@ public class LockIconViewController extends ViewController<LockIconView> impleme private void updateClickListener() { if (mView != null) { - mView.setOnClickListener(v -> onAffordanceClick()); - if (mAccessibilityManager.isTouchExplorationEnabled()) { - mView.setOnLongClickListener(null); - mView.setLongClickable(false); + if (mUdfpsEnrolled || mShowUnlockIcon) { + mView.setOnClickListener(v -> onAffordanceClick()); + if (mAccessibilityManager.isTouchExplorationEnabled()) { + mView.setOnLongClickListener(null); + mView.setLongClickable(false); + } else { + mView.setOnLongClickListener(v -> onAffordanceClick()); + } } 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); } + 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 public void dump(@NonNull FileDescriptor fd, @NonNull PrintWriter pw, @NonNull String[] args) { - pw.println("mHasUdfpsOrFaceAuthFeatures: " + mHasUdfpsOrFaceAuthFeatures); pw.println("mUdfpsEnrolled: " + mUdfpsEnrolled); - pw.println("mFaceAuthEnrolled: " + mFaceAuthEnrolled); pw.println("mIsKeyguardShowing: " + mIsKeyguardShowing); - pw.println(" mShowBouncerButton: " + mShowButton); pw.println(" mShowUnlockIcon: " + mShowUnlockIcon); pw.println(" mShowLockIcon: " + mShowLockIcon); pw.println(" mIsDozing: " + mIsDozing); @@ -348,6 +339,10 @@ public class LockIconViewController extends ViewController<LockIconView> impleme pw.println(" mCanDismissLockScreen: " + mCanDismissLockScreen); pw.println(" mStatusBarState: " + StatusBarState.toShortString(mStatusBarState)); pw.println(" mQsExpanded: " + mQsExpanded); + + if (mView != null) { + mView.dump(fd, pw, args); + } } private StatusBarStateController.StateListener mStatusBarStateListener = @@ -420,7 +415,6 @@ public class LockIconViewController extends ViewController<LockIconView> impleme public void onKeyguardShowingChanged() { updateKeyguardShowing(); mUdfpsEnrolled = mKeyguardUpdateMonitor.isUdfpsEnrolled(); - mFaceAuthEnrolled = mKeyguardUpdateMonitor.isFaceEnrolled(); updateVisibility(); } @@ -447,6 +441,11 @@ public class LockIconViewController extends ViewController<LockIconView> impleme public void onOverlayChanged() { updateColors(); } + + @Override + public void onConfigChanged(Configuration newConfig) { + updateConfiguration(); + } }; private final AccessibilityManager.TouchExplorationStateChangeListener diff --git a/packages/SystemUI/src/com/android/systemui/classifier/Classifier.java b/packages/SystemUI/src/com/android/systemui/classifier/Classifier.java index ffdcff2ef2b0..f18413be0134 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/Classifier.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/Classifier.java @@ -41,7 +41,7 @@ public abstract class Classifier { public static final int SHADE_DRAG = 11; public static final int QS_COLLAPSE = 12; 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 BACK_GESTURE = 16; @@ -61,7 +61,7 @@ public abstract class Classifier { QS_COLLAPSE, BRIGHTNESS_SLIDER, UDFPS_AUTHENTICATION, - DISABLED_UDFPS_AFFORDANCE, + LOCK_ICON, QS_SWIPE, BACK_GESTURE }) diff --git a/packages/SystemUI/src/com/android/systemui/classifier/DistanceClassifier.java b/packages/SystemUI/src/com/android/systemui/classifier/DistanceClassifier.java index 229801074246..d0fe1c37d4fa 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/DistanceClassifier.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/DistanceClassifier.java @@ -155,7 +155,7 @@ class DistanceClassifier extends FalsingClassifier { || interactionType == SHADE_DRAG || interactionType == QS_COLLAPSE || interactionType == Classifier.UDFPS_AUTHENTICATION - || interactionType == Classifier.DISABLED_UDFPS_AFFORDANCE + || interactionType == Classifier.LOCK_ICON || interactionType == Classifier.QS_SWIPE) { return Result.passed(0); } diff --git a/packages/SystemUI/src/com/android/systemui/classifier/TypeClassifier.java b/packages/SystemUI/src/com/android/systemui/classifier/TypeClassifier.java index c2ad7e6387d6..f040712706cd 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/TypeClassifier.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/TypeClassifier.java @@ -46,7 +46,7 @@ public class TypeClassifier extends FalsingClassifier { @Classifier.InteractionType int interactionType, double historyBelief, double historyConfidence) { if (interactionType == Classifier.UDFPS_AUTHENTICATION - || interactionType == Classifier.DISABLED_UDFPS_AFFORDANCE) { + || interactionType == Classifier.LOCK_ICON) { return Result.passed(0); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java index 1a2b9898398b..05e8f9f76402 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java @@ -1329,8 +1329,7 @@ public class NotificationPanelViewController extends PanelViewController { : mNotificationShelfController.getIntrinsicHeight() + notificationPadding; float lockIconPadding = 0; - if (mLockIconViewController.getTop() != 0 - && (mUpdateMonitor.isUdfpsEnrolled() || mUpdateMonitor.isFaceEnrolled())) { + if (mLockIconViewController.getTop() != 0) { lockIconPadding = mStatusBar.getDisplayHeight() - mLockIconViewController.getTop(); } |