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
This commit is contained in:
@@ -29,6 +29,7 @@ import android.widget.TextView;
|
|||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
|
import androidx.annotation.StringRes;
|
||||||
|
|
||||||
import com.android.internal.widget.LockPatternUtils;
|
import com.android.internal.widget.LockPatternUtils;
|
||||||
import com.android.settings.R;
|
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.ChooseLockGeneric;
|
||||||
import com.android.settings.password.ChooseLockSettingsHelper;
|
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.template.FooterButton;
|
||||||
import com.google.android.setupcompat.util.WizardManagerHelper;
|
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.span.LinkSpan;
|
||||||
import com.google.android.setupdesign.template.RequireScrollMixin;
|
import com.google.android.setupdesign.template.RequireScrollMixin;
|
||||||
import com.google.android.setupdesign.template.RequireScrollMixin.OnRequireScrollStateChangedListener;
|
|
||||||
import com.google.android.setupdesign.util.DynamicColorPalette;
|
import com.google.android.setupdesign.util.DynamicColorPalette;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -183,32 +185,26 @@ public abstract class BiometricEnrollIntroduction extends BiometricEnrollBase
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
FooterButton primaryButton = getPrimaryFooterButton();
|
final GlifLayout layout = getLayout();
|
||||||
FooterButton secondaryButton = getSecondaryFooterButton();
|
mFooterBarMixin = layout.getMixin(FooterBarMixin.class);
|
||||||
if (primaryButton == null) {
|
mFooterBarMixin.setPrimaryButton(getPrimaryFooterButton());
|
||||||
Log.d(TAG, "getPrimaryFooterButton() was null");
|
mFooterBarMixin.setSecondaryButton(getSecondaryFooterButton(), true /* usePrimaryStyle */);
|
||||||
return;
|
mFooterBarMixin.getSecondaryButton().setVisibility(View.INVISIBLE);
|
||||||
}
|
|
||||||
|
|
||||||
if (secondaryButton == null) {
|
final RequireScrollMixin requireScrollMixin = layout.getMixin(RequireScrollMixin.class);
|
||||||
Log.d(TAG, "getSecondaryFooterButton() was null");
|
requireScrollMixin.requireScrollWithButton(this, getPrimaryFooterButton(),
|
||||||
return;
|
getMoreButtonTextRes(), this::onNextButtonClick);
|
||||||
}
|
|
||||||
|
|
||||||
// Setup scroll mixin
|
|
||||||
final RequireScrollMixin requireScrollMixin = getLayout().getMixin(
|
|
||||||
RequireScrollMixin.class);
|
|
||||||
requireScrollMixin.requireScrollWithButton(this, primaryButton, getScrollCompletedText(),
|
|
||||||
this::onNextButtonClick);
|
|
||||||
|
|
||||||
secondaryButton.setVisibility(View.INVISIBLE);
|
|
||||||
requireScrollMixin.setOnRequireScrollStateChangedListener(
|
requireScrollMixin.setOnRequireScrollStateChangedListener(
|
||||||
new OnRequireScrollStateChangedListener() {
|
scrollNeeded -> {
|
||||||
@Override
|
// Update text of primary button from "More" to "Agree".
|
||||||
public void onRequireScrollStateChanged(boolean scrollNeeded) {
|
final int primaryButtonTextRes = scrollNeeded
|
||||||
if (!scrollNeeded && secondaryButton.getVisibility() == View.INVISIBLE) {
|
? getMoreButtonTextRes()
|
||||||
secondaryButton.setVisibility(View.VISIBLE);
|
: 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;
|
return mIconColorFilter;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@NonNull
|
||||||
protected FooterButton getPrimaryFooterButton() {
|
protected abstract FooterButton getPrimaryFooterButton();
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
@NonNull
|
||||||
protected FooterButton getSecondaryFooterButton() {
|
protected abstract FooterButton getSecondaryFooterButton();
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected int getScrollCompletedText() {
|
@StringRes
|
||||||
return R.string.security_settings_face_enroll_introduction_more;
|
protected abstract int getAgreeButtonTextRes();
|
||||||
}
|
|
||||||
|
@StringRes
|
||||||
|
protected abstract int getMoreButtonTextRes();
|
||||||
}
|
}
|
||||||
|
@@ -26,6 +26,10 @@ import android.view.View;
|
|||||||
import android.widget.ImageView;
|
import android.widget.ImageView;
|
||||||
import android.widget.TextView;
|
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.R;
|
||||||
import com.android.settings.Utils;
|
import com.android.settings.Utils;
|
||||||
import com.android.settings.biometrics.BiometricEnrollIntroduction;
|
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.settings.password.ChooseLockSettingsHelper;
|
||||||
import com.android.settingslib.RestrictedLockUtilsInternal;
|
import com.android.settingslib.RestrictedLockUtilsInternal;
|
||||||
|
|
||||||
import com.google.android.setupcompat.template.FooterBarMixin;
|
|
||||||
import com.google.android.setupcompat.template.FooterButton;
|
import com.google.android.setupcompat.template.FooterButton;
|
||||||
import com.google.android.setupcompat.util.WizardManagerHelper;
|
import com.google.android.setupcompat.util.WizardManagerHelper;
|
||||||
import com.google.android.setupdesign.span.LinkSpan;
|
import com.google.android.setupdesign.span.LinkSpan;
|
||||||
@@ -50,6 +53,8 @@ public class FaceEnrollIntroduction extends BiometricEnrollIntroduction {
|
|||||||
|
|
||||||
private FaceManager mFaceManager;
|
private FaceManager mFaceManager;
|
||||||
private FaceFeatureProvider mFaceFeatureProvider;
|
private FaceFeatureProvider mFaceFeatureProvider;
|
||||||
|
@Nullable private FooterButton mPrimaryFooterButton;
|
||||||
|
@Nullable private FooterButton mSecondaryFooterButton;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCancelButtonClick(View view) {
|
protected void onCancelButtonClick(View view) {
|
||||||
@@ -207,38 +212,42 @@ public class FaceEnrollIntroduction extends BiometricEnrollIntroduction {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@NonNull
|
||||||
protected FooterButton getPrimaryFooterButton() {
|
protected FooterButton getPrimaryFooterButton() {
|
||||||
if (mFooterBarMixin == null) {
|
if (mPrimaryFooterButton == null) {
|
||||||
mFooterBarMixin = getLayout().getMixin(FooterBarMixin.class);
|
mPrimaryFooterButton = new FooterButton.Builder(this)
|
||||||
}
|
|
||||||
|
|
||||||
if (mFooterBarMixin.getPrimaryButton() == null) {
|
|
||||||
final FooterButton nextButtonBuilder = new FooterButton.Builder(this)
|
|
||||||
.setText(R.string.security_settings_face_enroll_introduction_agree)
|
.setText(R.string.security_settings_face_enroll_introduction_agree)
|
||||||
.setButtonType(FooterButton.ButtonType.OPT_IN)
|
.setButtonType(FooterButton.ButtonType.OPT_IN)
|
||||||
.setListener(this::onNextButtonClick)
|
.setListener(this::onNextButtonClick)
|
||||||
.setTheme(R.style.SudGlifButton_Primary)
|
.setTheme(R.style.SudGlifButton_Primary)
|
||||||
.build();
|
.build();
|
||||||
mFooterBarMixin.setPrimaryButton(nextButtonBuilder);
|
|
||||||
}
|
}
|
||||||
return mFooterBarMixin.getPrimaryButton();
|
return mPrimaryFooterButton;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@NonNull
|
||||||
protected FooterButton getSecondaryFooterButton() {
|
protected FooterButton getSecondaryFooterButton() {
|
||||||
if (mFooterBarMixin == null) {
|
if (mSecondaryFooterButton == null) {
|
||||||
mFooterBarMixin = getLayout().getMixin(FooterBarMixin.class);
|
mSecondaryFooterButton = new FooterButton.Builder(this)
|
||||||
}
|
|
||||||
|
|
||||||
if (mFooterBarMixin.getSecondaryButton() == null) {
|
|
||||||
final FooterButton noThanksButton = new FooterButton.Builder(this)
|
|
||||||
.setText(R.string.security_settings_face_enroll_introduction_no_thanks)
|
.setText(R.string.security_settings_face_enroll_introduction_no_thanks)
|
||||||
.setListener(this::onSkipButtonClick)
|
.setListener(this::onSkipButtonClick)
|
||||||
.setButtonType(FooterButton.ButtonType.NEXT)
|
.setButtonType(FooterButton.ButtonType.NEXT)
|
||||||
.setTheme(R.style.SudGlifButton_Primary)
|
.setTheme(R.style.SudGlifButton_Primary)
|
||||||
.build();
|
.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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -27,6 +27,10 @@ import android.util.Log;
|
|||||||
import android.widget.ImageView;
|
import android.widget.ImageView;
|
||||||
import android.widget.TextView;
|
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.R;
|
||||||
import com.android.settings.Utils;
|
import com.android.settings.Utils;
|
||||||
import com.android.settings.biometrics.BiometricEnrollIntroduction;
|
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.HelpUtils;
|
||||||
import com.android.settingslib.RestrictedLockUtilsInternal;
|
import com.android.settingslib.RestrictedLockUtilsInternal;
|
||||||
|
|
||||||
import com.google.android.setupcompat.template.FooterBarMixin;
|
|
||||||
import com.google.android.setupcompat.template.FooterButton;
|
import com.google.android.setupcompat.template.FooterButton;
|
||||||
import com.google.android.setupdesign.span.LinkSpan;
|
import com.google.android.setupdesign.span.LinkSpan;
|
||||||
|
|
||||||
@@ -46,6 +49,8 @@ public class FingerprintEnrollIntroduction extends BiometricEnrollIntroduction {
|
|||||||
private static final String TAG = "FingerprintIntro";
|
private static final String TAG = "FingerprintIntro";
|
||||||
|
|
||||||
private FingerprintManager mFingerprintManager;
|
private FingerprintManager mFingerprintManager;
|
||||||
|
@Nullable private FooterButton mPrimaryFooterButton;
|
||||||
|
@Nullable private FooterButton mSecondaryFooterButton;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
@@ -194,43 +199,42 @@ public class FingerprintEnrollIntroduction extends BiometricEnrollIntroduction {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@NonNull
|
||||||
protected FooterButton getPrimaryFooterButton() {
|
protected FooterButton getPrimaryFooterButton() {
|
||||||
if (mFooterBarMixin == null) {
|
if (mPrimaryFooterButton == null) {
|
||||||
mFooterBarMixin = getLayout().getMixin(FooterBarMixin.class);
|
mPrimaryFooterButton = new FooterButton.Builder(this)
|
||||||
}
|
|
||||||
|
|
||||||
if (mFooterBarMixin.getPrimaryButton() == null) {
|
|
||||||
final FooterButton nextButtonBuilder = new FooterButton.Builder(this)
|
|
||||||
.setText(R.string.security_settings_fingerprint_enroll_introduction_agree)
|
.setText(R.string.security_settings_fingerprint_enroll_introduction_agree)
|
||||||
.setListener(this::onNextButtonClick)
|
.setListener(this::onNextButtonClick)
|
||||||
.setButtonType(FooterButton.ButtonType.OPT_IN)
|
.setButtonType(FooterButton.ButtonType.OPT_IN)
|
||||||
.setTheme(R.style.SudGlifButton_Primary)
|
.setTheme(R.style.SudGlifButton_Primary)
|
||||||
.build();
|
.build();
|
||||||
mFooterBarMixin.setPrimaryButton(nextButtonBuilder);
|
|
||||||
}
|
}
|
||||||
return mFooterBarMixin.getPrimaryButton();
|
return mPrimaryFooterButton;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@NonNull
|
||||||
protected FooterButton getSecondaryFooterButton() {
|
protected FooterButton getSecondaryFooterButton() {
|
||||||
if (mFooterBarMixin == null) {
|
if (mSecondaryFooterButton == null) {
|
||||||
mFooterBarMixin = getLayout().getMixin(FooterBarMixin.class);
|
mSecondaryFooterButton = new FooterButton.Builder(this)
|
||||||
}
|
|
||||||
|
|
||||||
if (mFooterBarMixin.getSecondaryButton() == null) {
|
|
||||||
final FooterButton noThanksButton = new FooterButton.Builder(this)
|
|
||||||
.setText(getNegativeButtonTextId())
|
.setText(getNegativeButtonTextId())
|
||||||
.setListener(this::onSkipButtonClick)
|
.setListener(this::onSkipButtonClick)
|
||||||
.setButtonType(FooterButton.ButtonType.NEXT)
|
.setButtonType(FooterButton.ButtonType.NEXT)
|
||||||
.setTheme(R.style.SudGlifButton_Primary)
|
.setTheme(R.style.SudGlifButton_Primary)
|
||||||
.build();
|
.build();
|
||||||
mFooterBarMixin.setSecondaryButton(noThanksButton, true /* usePrimaryStyle */);
|
|
||||||
}
|
}
|
||||||
return mFooterBarMixin.getSecondaryButton();
|
return mSecondaryFooterButton;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@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;
|
return R.string.security_settings_face_enroll_introduction_more;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user