From e301d59536488973b4b34001802649a813137a5a Mon Sep 17 00:00:00 2001 From: Curtis Belmonte Date: Thu, 10 Jun 2021 16:34:01 -0700 Subject: [PATCH] Fix face/fingerprint consent primary footer button logic Currently, the primary footer button on the face and fingerprint enroll consent pages reads "I agree" even before the user has scrolled to the bottom of the screen. This commit fixes the issue so that "More" is displayed until the user scrolls to the bottom. The remaining logic is left intact. Test: Manual: 1. Start face or fingerprint enrollment 2. Confirm primary button shows "More" and secondary button is hidden 3. Press the "More" button or scroll to the bottom of the screen 4. Ensure primary button shows "I agree" and secondary shows "No thanks" Fixes: 189268868 Change-Id: I02fa47d1de83bd5b5d82c733495ae579cbd2d6c6 --- .../BiometricEnrollIntroduction.java | 66 +++++++++---------- .../face/FaceEnrollIntroduction.java | 43 +++++++----- .../FingerprintEnrollIntroduction.java | 40 ++++++----- 3 files changed, 78 insertions(+), 71 deletions(-) diff --git a/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java b/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java index de850672bd2..580c753bd32 100644 --- a/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java +++ b/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java @@ -29,6 +29,7 @@ import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.annotation.StringRes; import com.android.internal.widget.LockPatternUtils; import com.android.settings.R; @@ -36,11 +37,12 @@ import com.android.settings.SetupWizardUtils; import com.android.settings.password.ChooseLockGeneric; import com.android.settings.password.ChooseLockSettingsHelper; +import com.google.android.setupcompat.template.FooterBarMixin; import com.google.android.setupcompat.template.FooterButton; import com.google.android.setupcompat.util.WizardManagerHelper; +import com.google.android.setupdesign.GlifLayout; import com.google.android.setupdesign.span.LinkSpan; import com.google.android.setupdesign.template.RequireScrollMixin; -import com.google.android.setupdesign.template.RequireScrollMixin.OnRequireScrollStateChangedListener; import com.google.android.setupdesign.util.DynamicColorPalette; /** @@ -183,32 +185,26 @@ public abstract class BiometricEnrollIntroduction extends BiometricEnrollBase } } - FooterButton primaryButton = getPrimaryFooterButton(); - FooterButton secondaryButton = getSecondaryFooterButton(); - if (primaryButton == null) { - Log.d(TAG, "getPrimaryFooterButton() was null"); - return; - } + final GlifLayout layout = getLayout(); + mFooterBarMixin = layout.getMixin(FooterBarMixin.class); + mFooterBarMixin.setPrimaryButton(getPrimaryFooterButton()); + mFooterBarMixin.setSecondaryButton(getSecondaryFooterButton(), true /* usePrimaryStyle */); + mFooterBarMixin.getSecondaryButton().setVisibility(View.INVISIBLE); - if (secondaryButton == null) { - Log.d(TAG, "getSecondaryFooterButton() was null"); - return; - } - - // Setup scroll mixin - final RequireScrollMixin requireScrollMixin = getLayout().getMixin( - RequireScrollMixin.class); - requireScrollMixin.requireScrollWithButton(this, primaryButton, getScrollCompletedText(), - this::onNextButtonClick); - - secondaryButton.setVisibility(View.INVISIBLE); + final RequireScrollMixin requireScrollMixin = layout.getMixin(RequireScrollMixin.class); + requireScrollMixin.requireScrollWithButton(this, getPrimaryFooterButton(), + getMoreButtonTextRes(), this::onNextButtonClick); requireScrollMixin.setOnRequireScrollStateChangedListener( - new OnRequireScrollStateChangedListener() { - @Override - public void onRequireScrollStateChanged(boolean scrollNeeded) { - if (!scrollNeeded && secondaryButton.getVisibility() == View.INVISIBLE) { - secondaryButton.setVisibility(View.VISIBLE); - } + scrollNeeded -> { + // Update text of primary button from "More" to "Agree". + final int primaryButtonTextRes = scrollNeeded + ? getMoreButtonTextRes() + : getAgreeButtonTextRes(); + getPrimaryFooterButton().setText(this, primaryButtonTextRes); + + // Show secondary button once scroll is completed. + if (!scrollNeeded) { + getSecondaryFooterButton().setVisibility(View.VISIBLE); } }); } @@ -367,17 +363,15 @@ public abstract class BiometricEnrollIntroduction extends BiometricEnrollBase return mIconColorFilter; } - @Nullable - protected FooterButton getPrimaryFooterButton() { - return null; - } + @NonNull + protected abstract FooterButton getPrimaryFooterButton(); - @Nullable - protected FooterButton getSecondaryFooterButton() { - return null; - } + @NonNull + protected abstract FooterButton getSecondaryFooterButton(); - protected int getScrollCompletedText() { - return R.string.security_settings_face_enroll_introduction_more; - } + @StringRes + protected abstract int getAgreeButtonTextRes(); + + @StringRes + protected abstract int getMoreButtonTextRes(); } diff --git a/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java b/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java index b29e2840e23..8e733b4da89 100644 --- a/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java +++ b/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java @@ -26,6 +26,10 @@ import android.view.View; import android.widget.ImageView; import android.widget.TextView; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.StringRes; + import com.android.settings.R; import com.android.settings.Utils; import com.android.settings.biometrics.BiometricEnrollIntroduction; @@ -34,7 +38,6 @@ import com.android.settings.overlay.FeatureFactory; import com.android.settings.password.ChooseLockSettingsHelper; import com.android.settingslib.RestrictedLockUtilsInternal; -import com.google.android.setupcompat.template.FooterBarMixin; import com.google.android.setupcompat.template.FooterButton; import com.google.android.setupcompat.util.WizardManagerHelper; import com.google.android.setupdesign.span.LinkSpan; @@ -50,6 +53,8 @@ public class FaceEnrollIntroduction extends BiometricEnrollIntroduction { private FaceManager mFaceManager; private FaceFeatureProvider mFaceFeatureProvider; + @Nullable private FooterButton mPrimaryFooterButton; + @Nullable private FooterButton mSecondaryFooterButton; @Override protected void onCancelButtonClick(View view) { @@ -207,38 +212,42 @@ public class FaceEnrollIntroduction extends BiometricEnrollIntroduction { } @Override + @NonNull protected FooterButton getPrimaryFooterButton() { - if (mFooterBarMixin == null) { - mFooterBarMixin = getLayout().getMixin(FooterBarMixin.class); - } - - if (mFooterBarMixin.getPrimaryButton() == null) { - final FooterButton nextButtonBuilder = new FooterButton.Builder(this) + if (mPrimaryFooterButton == null) { + mPrimaryFooterButton = new FooterButton.Builder(this) .setText(R.string.security_settings_face_enroll_introduction_agree) .setButtonType(FooterButton.ButtonType.OPT_IN) .setListener(this::onNextButtonClick) .setTheme(R.style.SudGlifButton_Primary) .build(); - mFooterBarMixin.setPrimaryButton(nextButtonBuilder); } - return mFooterBarMixin.getPrimaryButton(); + return mPrimaryFooterButton; } @Override + @NonNull protected FooterButton getSecondaryFooterButton() { - if (mFooterBarMixin == null) { - mFooterBarMixin = getLayout().getMixin(FooterBarMixin.class); - } - - if (mFooterBarMixin.getSecondaryButton() == null) { - final FooterButton noThanksButton = new FooterButton.Builder(this) + if (mSecondaryFooterButton == null) { + mSecondaryFooterButton = new FooterButton.Builder(this) .setText(R.string.security_settings_face_enroll_introduction_no_thanks) .setListener(this::onSkipButtonClick) .setButtonType(FooterButton.ButtonType.NEXT) .setTheme(R.style.SudGlifButton_Primary) .build(); - mFooterBarMixin.setSecondaryButton(noThanksButton, true /* usePrimaryStyle */); } - return mFooterBarMixin.getSecondaryButton(); + return mSecondaryFooterButton; + } + + @Override + @StringRes + protected int getAgreeButtonTextRes() { + return R.string.security_settings_fingerprint_enroll_introduction_agree; + } + + @Override + @StringRes + protected int getMoreButtonTextRes() { + return R.string.security_settings_face_enroll_introduction_more; } } diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java index 8a070ab46b8..5142e21dc49 100644 --- a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java +++ b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java @@ -27,6 +27,10 @@ import android.util.Log; import android.widget.ImageView; import android.widget.TextView; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.StringRes; + import com.android.settings.R; import com.android.settings.Utils; import com.android.settings.biometrics.BiometricEnrollIntroduction; @@ -35,7 +39,6 @@ import com.android.settings.password.ChooseLockSettingsHelper; import com.android.settingslib.HelpUtils; import com.android.settingslib.RestrictedLockUtilsInternal; -import com.google.android.setupcompat.template.FooterBarMixin; import com.google.android.setupcompat.template.FooterButton; import com.google.android.setupdesign.span.LinkSpan; @@ -46,6 +49,8 @@ public class FingerprintEnrollIntroduction extends BiometricEnrollIntroduction { private static final String TAG = "FingerprintIntro"; private FingerprintManager mFingerprintManager; + @Nullable private FooterButton mPrimaryFooterButton; + @Nullable private FooterButton mSecondaryFooterButton; @Override protected void onCreate(Bundle savedInstanceState) { @@ -194,43 +199,42 @@ public class FingerprintEnrollIntroduction extends BiometricEnrollIntroduction { } @Override + @NonNull protected FooterButton getPrimaryFooterButton() { - if (mFooterBarMixin == null) { - mFooterBarMixin = getLayout().getMixin(FooterBarMixin.class); - } - - if (mFooterBarMixin.getPrimaryButton() == null) { - final FooterButton nextButtonBuilder = new FooterButton.Builder(this) + if (mPrimaryFooterButton == null) { + mPrimaryFooterButton = new FooterButton.Builder(this) .setText(R.string.security_settings_fingerprint_enroll_introduction_agree) .setListener(this::onNextButtonClick) .setButtonType(FooterButton.ButtonType.OPT_IN) .setTheme(R.style.SudGlifButton_Primary) .build(); - mFooterBarMixin.setPrimaryButton(nextButtonBuilder); } - return mFooterBarMixin.getPrimaryButton(); + return mPrimaryFooterButton; } @Override + @NonNull protected FooterButton getSecondaryFooterButton() { - if (mFooterBarMixin == null) { - mFooterBarMixin = getLayout().getMixin(FooterBarMixin.class); - } - - if (mFooterBarMixin.getSecondaryButton() == null) { - final FooterButton noThanksButton = new FooterButton.Builder(this) + if (mSecondaryFooterButton == null) { + mSecondaryFooterButton = new FooterButton.Builder(this) .setText(getNegativeButtonTextId()) .setListener(this::onSkipButtonClick) .setButtonType(FooterButton.ButtonType.NEXT) .setTheme(R.style.SudGlifButton_Primary) .build(); - mFooterBarMixin.setSecondaryButton(noThanksButton, true /* usePrimaryStyle */); } - return mFooterBarMixin.getSecondaryButton(); + return mSecondaryFooterButton; } @Override - protected int getScrollCompletedText() { + @StringRes + protected int getAgreeButtonTextRes() { + return R.string.security_settings_fingerprint_enroll_introduction_agree; + } + + @Override + @StringRes + protected int getMoreButtonTextRes() { return R.string.security_settings_face_enroll_introduction_more; } }