BiometricEnrollIntroduction button update

No longer show the "No thanks" button until the user has
scrolled to the bottom of the introduction text.

This applies for both face and fingerprint enroll introduction screens.

Fixes: 189268868
Test: Manual
Change-Id: I0ccf6ae1d329df06f769f05288706ef22183bc21
diff --git a/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java b/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java
index 09d8e71..de85067 100644
--- a/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java
+++ b/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java
@@ -39,6 +39,8 @@
 import com.google.android.setupcompat.template.FooterButton;
 import com.google.android.setupcompat.util.WizardManagerHelper;
 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;
 
 /**
@@ -180,6 +182,35 @@
                 launchConfirmLock(getConfirmLockTitleResId());
             }
         }
+
+        FooterButton primaryButton = getPrimaryFooterButton();
+        FooterButton secondaryButton = getSecondaryFooterButton();
+        if (primaryButton == null) {
+            Log.d(TAG, "getPrimaryFooterButton() was null");
+            return;
+        }
+
+        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);
+        requireScrollMixin.setOnRequireScrollStateChangedListener(
+                new OnRequireScrollStateChangedListener() {
+                    @Override
+                    public void onRequireScrollStateChanged(boolean scrollNeeded) {
+                        if (!scrollNeeded && secondaryButton.getVisibility() == View.INVISIBLE) {
+                            secondaryButton.setVisibility(View.VISIBLE);
+                        }
+                    }
+                });
     }
 
     @Override
@@ -335,4 +366,18 @@
         }
         return mIconColorFilter;
     }
+
+    @Nullable
+    protected FooterButton getPrimaryFooterButton() {
+        return null;
+    }
+
+    @Nullable
+    protected FooterButton getSecondaryFooterButton() {
+        return null;
+    }
+
+    protected int getScrollCompletedText() {
+        return R.string.security_settings_face_enroll_introduction_more;
+    }
 }
diff --git a/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java b/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java
index d564547..b29e284 100644
--- a/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java
+++ b/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java
@@ -38,7 +38,6 @@
 import com.google.android.setupcompat.template.FooterButton;
 import com.google.android.setupcompat.util.WizardManagerHelper;
 import com.google.android.setupdesign.span.LinkSpan;
-import com.google.android.setupdesign.template.RequireScrollMixin;
 
 import java.util.List;
 
@@ -81,32 +80,6 @@
         mFaceFeatureProvider = FeatureFactory.getFactory(getApplicationContext())
                 .getFaceFeatureProvider();
 
-        mFooterBarMixin = getLayout().getMixin(FooterBarMixin.class);
-        mFooterBarMixin.setSecondaryButton(
-                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(),
-                true /* usePrimaryStyle */);
-
-        FooterButton.Builder nextButtonBuilder = new FooterButton.Builder(this)
-                .setText(R.string.security_settings_face_enroll_introduction_agree)
-                .setButtonType(FooterButton.ButtonType.OPT_IN)
-                .setTheme(R.style.SudGlifButton_Primary);
-        if (maxFacesEnrolled()) {
-            nextButtonBuilder.setListener(this::onNextButtonClick);
-            mFooterBarMixin.setPrimaryButton(nextButtonBuilder.build());
-        } else {
-            final FooterButton agreeButton = nextButtonBuilder.build();
-            mFooterBarMixin.setPrimaryButton(agreeButton);
-            final RequireScrollMixin requireScrollMixin = getLayout().getMixin(
-                    RequireScrollMixin.class);
-            requireScrollMixin.requireScrollWithButton(this, agreeButton,
-                    R.string.security_settings_face_enroll_introduction_more,
-                    this::onNextButtonClick);
-        }
 
         // This path is an entry point for SetNewPasswordController, e.g.
         // adb shell am start -a android.app.action.SET_NEW_PASSWORD
@@ -232,4 +205,40 @@
     public void onClick(LinkSpan span) {
         // TODO(b/110906762)
     }
+
+    @Override
+    protected FooterButton getPrimaryFooterButton() {
+        if (mFooterBarMixin == null) {
+            mFooterBarMixin = getLayout().getMixin(FooterBarMixin.class);
+        }
+
+        if (mFooterBarMixin.getPrimaryButton() == null) {
+            final FooterButton nextButtonBuilder = 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();
+    }
+
+    @Override
+    protected FooterButton getSecondaryFooterButton() {
+        if (mFooterBarMixin == null) {
+            mFooterBarMixin = getLayout().getMixin(FooterBarMixin.class);
+        }
+
+        if (mFooterBarMixin.getSecondaryButton() == null) {
+            final FooterButton noThanksButton = 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();
+    }
 }
diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java
index 18b1116..8a070ab 100644
--- a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java
+++ b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java
@@ -38,7 +38,6 @@
 import com.google.android.setupcompat.template.FooterBarMixin;
 import com.google.android.setupcompat.template.FooterButton;
 import com.google.android.setupdesign.span.LinkSpan;
-import com.google.android.setupdesign.template.RequireScrollMixin;
 
 import java.util.List;
 
@@ -69,29 +68,6 @@
         iconDelete.getDrawable().setColorFilter(getIconColorFilter());
         iconInfo.getDrawable().setColorFilter(getIconColorFilter());
         iconLink.getDrawable().setColorFilter(getIconColorFilter());
-
-        mFooterBarMixin = getLayout().getMixin(FooterBarMixin.class);
-        mFooterBarMixin.setSecondaryButton(
-                new FooterButton.Builder(this)
-                        .setText(getNegativeButtonTextId())
-                        .setListener(this::onSkipButtonClick)
-                        .setButtonType(FooterButton.ButtonType.NEXT)
-                        .setTheme(R.style.SudGlifButton_Primary)
-                        .build(),
-                true /* usePrimaryStyle */);
-
-        final FooterButton nextButton = 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(nextButton);
-        final RequireScrollMixin requireScrollMixin =
-                getLayout().getMixin(RequireScrollMixin.class);
-        requireScrollMixin.requireScrollWithButton(this, nextButton,
-                R.string.security_settings_face_enroll_introduction_more, this::onNextButtonClick);
     }
 
     int getNegativeButtonTextId() {
@@ -216,4 +192,45 @@
             }
         }
     }
+
+    @Override
+    protected FooterButton getPrimaryFooterButton() {
+        if (mFooterBarMixin == null) {
+            mFooterBarMixin = getLayout().getMixin(FooterBarMixin.class);
+        }
+
+        if (mFooterBarMixin.getPrimaryButton() == null) {
+            final FooterButton nextButtonBuilder = 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();
+    }
+
+    @Override
+    protected FooterButton getSecondaryFooterButton() {
+        if (mFooterBarMixin == null) {
+            mFooterBarMixin = getLayout().getMixin(FooterBarMixin.class);
+        }
+
+        if (mFooterBarMixin.getSecondaryButton() == null) {
+            final FooterButton noThanksButton = 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();
+    }
+
+    @Override
+    protected int getScrollCompletedText() {
+        return R.string.security_settings_face_enroll_introduction_more;
+    }
 }