Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3576db89 authored by Beverly Tai's avatar Beverly Tai Committed by Automerger Merge Worker
Browse files

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

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/15164970

Change-Id: Ia535dc8923dbb790919dd056482324c82f5701b3
parents d9ae3e71 c5aa20b9
Loading
Loading
Loading
Loading
+0 −7
Original line number Original line Diff line number Diff line
@@ -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
+15 −2
Original line number Original line Diff line number Diff line
@@ -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);
    }
}
}
+66 −67
Original line number Original line Diff line number Diff line
@@ -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,6 +273,7 @@ public class LockIconViewController extends ViewController<LockIconView> impleme


    private void updateClickListener() {
    private void updateClickListener() {
        if (mView != null) {
        if (mView != null) {
            if (mUdfpsEnrolled || mShowUnlockIcon) {
                mView.setOnClickListener(v -> onAffordanceClick());
                mView.setOnClickListener(v -> onAffordanceClick());
                if (mAccessibilityManager.isTouchExplorationEnabled()) {
                if (mAccessibilityManager.isTouchExplorationEnabled()) {
                    mView.setOnLongClickListener(null);
                    mView.setOnLongClickListener(null);
@@ -317,6 +281,11 @@ public class LockIconViewController extends ViewController<LockIconView> impleme
                } else {
                } else {
                    mView.setOnLongClickListener(v -> onAffordanceClick());
                    mView.setOnLongClickListener(v -> onAffordanceClick());
                }
                }
            } else {
                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
+2 −2
Original line number Original line Diff line number Diff line
@@ -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
    })
    })
+1 −1
Original line number Original line Diff line number Diff line
@@ -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);
        }
        }
Loading