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");
}
}