Add alternative type of button for DualControlLayout.

Now the following types of primary button are supported:
* a primary button with unchanged appearance,
* additional primary button with appearance of the secondary button but still with primary function,
* a secondary button with unchanged appearance.

Fixes the problem where the primary button was not defined.

Bug: b/318349052
Change-Id: I29e435223d01241ef06da4d0a62a6abc993533fb
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5299737
Commit-Queue: Tomek Jurkiewicz <tju@google.com>
Reviewed-by: Boris Sazonov <bsazonov@chromium.org>
Auto-Submit: Tomek Jurkiewicz <tju@google.com>
Cr-Commit-Position: refs/heads/main@{#1261044}
diff --git a/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/SigninView.java b/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/SigninView.java
index f8b6f777..524f1e9 100644
--- a/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/SigninView.java
+++ b/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/SigninView.java
@@ -18,6 +18,8 @@
 import androidx.appcompat.content.res.AppCompatResources;
 
 import org.chromium.components.browser_ui.widget.DualControlLayout;
+import org.chromium.components.signin.SigninFeatureMap;
+import org.chromium.components.signin.SigninFeatures;
 import org.chromium.ui.UiUtils;
 import org.chromium.ui.drawable.AnimationLooper;
 
@@ -61,6 +63,8 @@
 
         ImageView headerImage = findViewById(R.id.signin_header_image);
         mAnimationLooper = new AnimationLooper(headerImage.getDrawable());
+
+        createButtons();
     }
 
     SigninScrollView getScrollView() {
@@ -127,15 +131,22 @@
         mAnimationLooper.stop();
     }
 
-    void createButtons(boolean equallyWeighted) {
-        mRefuseButton = DualControlLayout.createButtonForLayout(getContext(), false, "", null);
+    void createButtons() {
+        mRefuseButton =
+                DualControlLayout.createButtonForLayout(
+                        getContext(), DualControlLayout.ButtonType.SECONDARY, "", null);
         mRefuseButton.setLayoutParams(
                 new ViewGroup.LayoutParams(
                         ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
 
+        @DualControlLayout.ButtonType
+        int acceptButtonType =
+                SigninFeatureMap.isEnabled(
+                                SigninFeatures.MINOR_MODE_RESTRICTIONS_FOR_HISTORY_SYNC_OPT_IN)
+                        ? DualControlLayout.ButtonType.PRIMARY_TEXT
+                        : DualControlLayout.ButtonType.PRIMARY_FILLED;
         mAcceptButton =
-                DualControlLayout.createButtonForLayout(
-                        getContext(), /* isPrimary= */ equallyWeighted, "", null);
+                DualControlLayout.createButtonForLayout(getContext(), acceptButtonType, "", null);
         mAcceptButton.setLayoutParams(
                 new ViewGroup.LayoutParams(
                         ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
diff --git a/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/SyncConsentFragmentBase.java b/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/SyncConsentFragmentBase.java
index 8b403ed..12ab6775 100644
--- a/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/SyncConsentFragmentBase.java
+++ b/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/SyncConsentFragmentBase.java
@@ -49,8 +49,6 @@
 import org.chromium.components.signin.AccountManagerFacadeProvider;
 import org.chromium.components.signin.AccountUtils;
 import org.chromium.components.signin.AccountsChangeObserver;
-import org.chromium.components.signin.SigninFeatureMap;
-import org.chromium.components.signin.SigninFeatures;
 import org.chromium.components.signin.base.CoreAccountInfo;
 import org.chromium.components.signin.identitymanager.AccountInfoServiceProvider;
 import org.chromium.components.signin.identitymanager.ConsentLevel;
@@ -385,10 +383,6 @@
 
     private void createSigninView(LayoutInflater inflater, ViewGroup container) {
         mSigninView = (SigninView) inflater.inflate(R.layout.signin_view, container, false);
-
-        mSigninView.createButtons(
-                /* equallyWeighted */ !SigninFeatureMap.isEnabled(
-                        SigninFeatures.MINOR_MODE_RESTRICTIONS_FOR_HISTORY_SYNC_OPT_IN));
         mSigninView.getAccountPickerView().setOnClickListener(view -> onAccountPickerClicked());
         mSigninView.getRefuseButton().setOnClickListener(this::onRefuseButtonClicked);
         mSigninView.getButtonBar().setVisibility(View.GONE);
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/DualControlLayout.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/DualControlLayout.java
index f45a112e..98f5f65c 100644
--- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/DualControlLayout.java
+++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/DualControlLayout.java
@@ -13,7 +13,9 @@
 import android.view.ViewGroup;
 import android.widget.Button;
 
+import androidx.annotation.IdRes;
 import androidx.annotation.IntDef;
+import androidx.annotation.StyleRes;
 
 import org.chromium.ui.widget.ButtonCompat;
 
@@ -56,29 +58,75 @@
         int APART = 2;
     }
 
+    @IntDef({ButtonType.PRIMARY_FILLED, ButtonType.PRIMARY_TEXT, ButtonType.SECONDARY})
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface ButtonType {
+        int PRIMARY_FILLED = 0;
+        int PRIMARY_TEXT = 1;
+        int SECONDARY = 2;
+    }
+
     /**
      * Creates a standardized Button that can be used for DualControlLayouts showing buttons.
      *
      * @param isPrimary Whether or not the button is meant to act as a "Confirm" button.
-     * @param text      Text to display on the button.
-     * @param listener  Listener to alert when the button has been clicked.
+     * @param text Text to display on the button.
+     * @param listener Listener to alert when the button has been clicked.
+     * @return Button that can be used in the view.
+     * @deprecated Use the Button createButtonForLayout( Context context, @ButtonType int
+     *     buttonType, String text, OnClickListener listener) version instead.
+     */
+    @Deprecated
+    public static Button createButtonForLayout(
+            Context context, boolean isPrimary, String text, OnClickListener listener) {
+        // TODO(b/325429764): migrate clients and remove this deprecated method.
+        if (isPrimary) {
+            return createButtonForLayout(context, ButtonType.PRIMARY_FILLED, text, listener);
+        } else {
+            return createButtonForLayout(context, ButtonType.SECONDARY, text, listener);
+        }
+    }
+
+    /**
+     * Creates a standardized Button that can be used for DualControlLayouts showing buttons.
+     *
+     * @param buttonType Determines button's function and appearance.
+     * @param text Text to display on the button.
+     * @param listener Listener to alert when the button has been clicked.
      * @return Button that can be used in the view.
      */
     public static Button createButtonForLayout(
-            Context context, boolean isPrimary, String text, OnClickListener listener) {
-        if (isPrimary) {
-            ButtonCompat primaryButton =
-                    new ButtonCompat(context, R.style.FilledButtonThemeOverlay_Flat);
-            primaryButton.setId(R.id.button_primary);
-            primaryButton.setOnClickListener(listener);
-            primaryButton.setText(text);
-            return primaryButton;
-        } else {
-            Button secondaryButton = new ButtonCompat(context, R.style.TextButtonThemeOverlay);
-            secondaryButton.setId(R.id.button_secondary);
-            secondaryButton.setOnClickListener(listener);
-            secondaryButton.setText(text);
-            return secondaryButton;
+            Context context, @ButtonType int buttonType, String text, OnClickListener listener) {
+        ButtonCompat button = new ButtonCompat(context, getButtonTheme(buttonType));
+        button.setId(getButtonId(buttonType));
+        button.setOnClickListener(listener);
+        button.setText(text);
+        return button;
+    }
+
+    private static @StyleRes int getButtonTheme(@ButtonType int buttonType) {
+        switch (buttonType) {
+            case ButtonType.PRIMARY_FILLED:
+                return R.style.FilledButtonThemeOverlay_Flat;
+            case ButtonType.PRIMARY_TEXT:
+                return R.style.TextButtonThemeOverlay;
+            case ButtonType.SECONDARY:
+                return R.style.TextButtonThemeOverlay;
+            default:
+                throw new IllegalArgumentException("Unknown button type");
+        }
+    }
+
+    private static @IdRes int getButtonId(@ButtonType int buttonType) {
+        switch (buttonType) {
+            case ButtonType.PRIMARY_FILLED:
+                return R.id.button_primary;
+            case ButtonType.PRIMARY_TEXT:
+                return R.id.button_primary;
+            case ButtonType.SECONDARY:
+                return R.id.button_secondary;
+            default:
+                throw new IllegalArgumentException("Unknown button type");
         }
     }