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

Commit b448eacb authored by Shawn Lin's avatar Shawn Lin
Browse files

Fixed check enrolled fingerprint UI issue

Highlight the checked fingerprint item with the same flash animation as
the setting search animation.

Bug: 411173631
Test: manual: go fingerprint settings and use check enrolled fingerprint
              buton
Flag: EXEMPT bug fix
Change-Id: I31dc0fbe4940d4d33235e395498d61f59ad97e72
parent 70f27448
Loading
Loading
Loading
Loading
+97 −2
Original line number Diff line number Diff line
@@ -31,6 +31,8 @@ import static com.android.settings.biometrics.BiometricEnrollBase.EXTRA_KEY_CHAL
import static com.android.settings.core.BasePreferenceController.AVAILABLE;
import static com.android.settings.core.BasePreferenceController.CONDITIONALLY_UNAVAILABLE;

import android.animation.ArgbEvaluator;
import android.animation.ValueAnimator;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.Dialog;
@@ -66,6 +68,7 @@ import android.widget.ImeAwareEditText;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.DrawableRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
@@ -1479,9 +1482,21 @@ public class FingerprintSettings extends SubSettings {
            mVibrator.vibrate(SUCCESS_VIBRATION_EFFECT);
            String prefName = genKey(fpId);
            FingerprintPreference fpref = (FingerprintPreference) findPreference(prefName);
            if (fpref == null) {
                return;
            }
            if (isUdfps()) {
                clearAllFingerprintPreferenceHighlight();
                fpref.startHighlight();
            } else {
                highlightForSfps(fpref);
            }
        }

        private void highlightForSfps(FingerprintPreference preference) {
            final Drawable highlight = getHighlightDrawable();
            if (highlight != null && fpref != null) {
                final View view = fpref.getView();
            if (highlight != null && preference != null) {
                final View view = preference.getView();
                if (view == null) {
                    // FingerprintPreference is not bound to UI yet, so view is null.
                    return;
@@ -1501,6 +1516,17 @@ public class FingerprintSettings extends SubSettings {
            }
        }

        private void clearAllFingerprintPreferenceHighlight() {
            if (mFingerprintsEnrolledCategory != null) {
                for (int i = 0; i < mFingerprintsEnrolledCategory.getPreferenceCount(); i++) {
                    Preference preference = mFingerprintsEnrolledCategory.getPreference(i);
                    if (preference instanceof FingerprintPreference) {
                        ((FingerprintPreference) preference).clearHighlight();
                    }
                }
            }
        }

        private void launchChooseOrConfirmLock() {
            final Intent intent = new Intent();
            final ChooseLockSettingsHelper.Builder builder =
@@ -1980,12 +2006,20 @@ public class FingerprintSettings extends SubSettings {

    public static class FingerprintPreference extends TwoTargetPreference {

        private static final long HIGHLIGHT_DURATION = 200L;
        private static final long RESET_HIGHLIGHT_DURATION = 15000L;

        private final OnDeleteClickListener mOnDeleteClickListener;

        private Fingerprint mFingerprint;
        private View mView;
        private View mDeleteView;

        @Nullable
        private ValueAnimator mHighlightAnimator;

        private final Runnable mClearHighlightRunnable = this::clearHighlight;

        public interface OnDeleteClickListener {
            void onDeleteClick(FingerprintPreference p);
        }
@@ -2007,6 +2041,67 @@ public class FingerprintSettings extends SubSettings {
            return mFingerprint;
        }


        /** Start the highlight animation */
        public void startHighlight() {
            if (mView == null) {
                return;
            }
            clearHighlight();
            final int backgroundFrom = getBackgroundRes(false /* isHighlighted */);
            final int backgroundTo = getBackgroundRes(true /* isHighlighted */);
            mHighlightAnimator = ValueAnimator.ofObject(
                    new ArgbEvaluator(), backgroundFrom, backgroundTo);
            mHighlightAnimator.setDuration(HIGHLIGHT_DURATION);
            mHighlightAnimator.addUpdateListener(
                    animator -> mView.setBackgroundResource((int) animator.getAnimatedValue()));
            mHighlightAnimator.setRepeatMode(ValueAnimator.REVERSE);
            mHighlightAnimator.setRepeatCount(4);
            mHighlightAnimator.start();
            mView.postDelayed(mClearHighlightRunnable, RESET_HIGHLIGHT_DURATION);
        }

        /** Clear the highlight effect */
        public void clearHighlight() {
            if (mHighlightAnimator != null && mHighlightAnimator.isRunning()) {
                mHighlightAnimator.cancel();
                mHighlightAnimator = null;
            }
            mView.removeCallbacks(mClearHighlightRunnable);
            mView.setBackgroundResource(getBackgroundRes(false /* isHighlighted */));
        }

        private boolean isTopItemInParent() {
            final PreferenceGroup parent = getParent();
            if (parent != null && parent.getPreferenceCount() > 0) {
                return this == parent.getPreference(0);
            }
            return false;
        }

        private @DrawableRes int getBackgroundRes(boolean isHighlighted) {
            final boolean isTop = isTopItemInParent();
            if (SettingsThemeHelper.isExpressiveTheme(getContext())) {
                if (isTop) {
                    return isHighlighted
                            ? com.android.settingslib.widget.theme.R.drawable
                            .settingslib_round_background_top_highlighted
                            : com.android.settingslib.widget.theme.R.drawable
                                    .settingslib_round_background_top;
                } else {
                    return isHighlighted
                            ? com.android.settingslib.widget.theme.R.drawable
                            .settingslib_round_background_center_highlighted
                            :  com.android.settingslib.widget.theme.R.drawable
                                    .settingslib_round_background_center;
                }
            } else {
                return isHighlighted
                        ? R.drawable.preference_background_highlighted
                        : R.drawable.preference_background;
            }
        }

        @Override
        protected int getSecondTargetResId() {
            return R.layout.preference_widget_delete;