Import updated Android SetupCompat Library 444719060 am: 0d3126a738

Original change: https://googleplex-android-review.googlesource.com/c/platform/external/setupcompat/+/17983328

Change-Id: I9ceb6f958b508110e6b9f7ef14b6e3976e1e1d09
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
diff --git a/Android.bp b/Android.bp
index 01e654d..d3a42a7 100644
--- a/Android.bp
+++ b/Android.bp
@@ -80,6 +80,7 @@
     ],
     static_libs: [
         "androidx.annotation_annotation",
+        "error_prone_annotations",
     ],
     min_sdk_version: "14",
     sdk_version: "current",
diff --git a/main/java/com/google/android/setupcompat/PartnerCustomizationLayout.java b/main/java/com/google/android/setupcompat/PartnerCustomizationLayout.java
index 4a88f5b..37cc358 100644
--- a/main/java/com/google/android/setupcompat/PartnerCustomizationLayout.java
+++ b/main/java/com/google/android/setupcompat/PartnerCustomizationLayout.java
@@ -48,6 +48,7 @@
 import com.google.android.setupcompat.util.BuildCompatUtils;
 import com.google.android.setupcompat.util.Logger;
 import com.google.android.setupcompat.util.WizardManagerHelper;
+import com.google.errorprone.annotations.CanIgnoreReturnValue;
 
 /** A templatization layout with consistent style used in Setup Wizard or app itself. */
 public class PartnerCustomizationLayout extends TemplateLayout {
@@ -75,14 +76,17 @@
 
   private Activity activity;
 
+  @CanIgnoreReturnValue
   public PartnerCustomizationLayout(Context context) {
     this(context, 0, 0);
   }
 
+  @CanIgnoreReturnValue
   public PartnerCustomizationLayout(Context context, int template) {
     this(context, template, 0);
   }
 
+  @CanIgnoreReturnValue
   public PartnerCustomizationLayout(Context context, int template, int containerId) {
     super(context, template, containerId);
     init(null, R.attr.sucLayoutTheme);
@@ -92,11 +96,13 @@
   final ViewTreeObserver.OnWindowFocusChangeListener windowFocusChangeListener =
       this::onFocusChanged;
 
+  @CanIgnoreReturnValue
   public PartnerCustomizationLayout(Context context, AttributeSet attrs) {
     super(context, attrs);
     init(attrs, R.attr.sucLayoutTheme);
   }
 
+  @CanIgnoreReturnValue
   @TargetApi(VERSION_CODES.HONEYCOMB)
   public PartnerCustomizationLayout(Context context, AttributeSet attrs, int defStyleAttr) {
     super(context, attrs, defStyleAttr);
diff --git a/main/java/com/google/android/setupcompat/template/FooterBarMixin.java b/main/java/com/google/android/setupcompat/template/FooterBarMixin.java
index 9af0077..4d78955 100644
--- a/main/java/com/google/android/setupcompat/template/FooterBarMixin.java
+++ b/main/java/com/google/android/setupcompat/template/FooterBarMixin.java
@@ -17,6 +17,7 @@
 package com.google.android.setupcompat.template;
 
 import static com.google.android.setupcompat.internal.Preconditions.ensureOnMainThread;
+import static java.lang.Math.max;
 
 import android.annotation.SuppressLint;
 import android.annotation.TargetApi;
@@ -32,7 +33,6 @@
 import android.view.Gravity;
 import android.view.LayoutInflater;
 import android.view.View;
-import android.view.ViewGroup;
 import android.view.ViewStub;
 import android.widget.Button;
 import android.widget.LinearLayout;
@@ -240,10 +240,8 @@
     if (!isSecondaryButtonInPrimaryStyle) {
       return false;
     }
-    // TODO: Support neutral button style in glif layout for phone and tablet
     PartnerConfigHelper.get(context);
-    return context.getResources().getConfiguration().smallestScreenWidthDp >= 600
-        && PartnerConfigHelper.isNeutralButtonStyleEnabled(context);
+    return PartnerConfigHelper.isNeutralButtonStyleEnabled(context);
   }
 
   private View addSpace() {
@@ -531,54 +529,29 @@
       }
       buttonContainer.addView(tempSecondaryButton);
     }
-    if (!isFooterButtonAlignedEnd()
-        && (!isEvenlyWeightedButtons || (isEvenlyWeightedButtons && isLandscape))) {
+    if (!isFooterButtonAlignedEnd()) {
       addSpace();
     }
     if (tempPrimaryButton != null) {
       buttonContainer.addView(tempPrimaryButton);
     }
 
-    setEvenlyWeightedButtons(tempPrimaryButton, tempSecondaryButton, isEvenlyWeightedButtons);
+    if (isEvenlyWeightedButtons) {
+      setEvenlyWeightedButtons(tempPrimaryButton, tempSecondaryButton);
+    }
   }
 
-  private void setEvenlyWeightedButtons(
-      Button primaryButton, Button secondaryButton, boolean isEvenlyWeighted) {
-    if (primaryButton != null && secondaryButton != null && isEvenlyWeighted) {
-      LinearLayout.LayoutParams primaryLayoutParams =
-          (LinearLayout.LayoutParams) primaryButton.getLayoutParams();
-      if (null != primaryLayoutParams) {
-        primaryLayoutParams.width = 0;
-        primaryLayoutParams.weight = 1.0f;
-        primaryButton.setLayoutParams(primaryLayoutParams);
-      }
+  private void setEvenlyWeightedButtons(Button primaryButton, Button secondaryButton) {
+    if (primaryButton != null && secondaryButton != null) {
+      primaryButton.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
+      int primaryButtonMeasuredWidth = primaryButton.getMeasuredWidth();
+      secondaryButton.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
 
-      LinearLayout.LayoutParams secondaryLayoutParams =
-          (LinearLayout.LayoutParams) secondaryButton.getLayoutParams();
-      if (null != secondaryLayoutParams) {
-        secondaryLayoutParams.width = 0;
-        secondaryLayoutParams.weight = 1.0f;
-        secondaryButton.setLayoutParams(secondaryLayoutParams);
-      }
-    } else {
-      if (primaryButton != null) {
-        LinearLayout.LayoutParams primaryLayoutParams =
-            (LinearLayout.LayoutParams) primaryButton.getLayoutParams();
-        if (null != primaryLayoutParams) {
-          primaryLayoutParams.width = ViewGroup.LayoutParams.WRAP_CONTENT;
-          primaryLayoutParams.weight = 0;
-          primaryButton.setLayoutParams(primaryLayoutParams);
-        }
-      }
-      if (secondaryButton != null) {
-        LinearLayout.LayoutParams secondaryLayoutParams =
-            (LinearLayout.LayoutParams) secondaryButton.getLayoutParams();
-        if (null != secondaryLayoutParams) {
-          secondaryLayoutParams.width = ViewGroup.LayoutParams.WRAP_CONTENT;
-          secondaryLayoutParams.weight = 0;
-          secondaryButton.setLayoutParams(secondaryLayoutParams);
-        }
-      }
+      int secondaryButtonMeasuredWidth = secondaryButton.getMeasuredWidth();
+      int maxButtonMeasureWidth = max(primaryButtonMeasuredWidth, secondaryButtonMeasuredWidth);
+
+      primaryButton.getLayoutParams().width = maxButtonMeasureWidth;
+      secondaryButton.getLayoutParams().width = maxButtonMeasureWidth;
     }
   }
 
diff --git a/main/res/values/styles.xml b/main/res/values/styles.xml
index 6474426..6625e83 100644
--- a/main/res/values/styles.xml
+++ b/main/res/values/styles.xml
@@ -45,13 +45,13 @@
         <item name="android:theme">@style/SucPartnerCustomizationButton.Primary</item>
 
         <!-- Values used in styles -->
-        <item name="android:fontFamily">?attr/sucFooterBarButtonFontFamily</item>
+        <item name="android:fontFamily" tools:targetApi="jelly_bean">?attr/sucFooterBarButtonFontFamily</item>
         <item name="android:paddingLeft">?attr/sucFooterButtonPaddingStart</item>
         <item name="android:paddingStart" tools:ignore="NewApi">?attr/sucFooterButtonPaddingStart</item>
         <item name="android:paddingRight">?attr/sucFooterButtonPaddingEnd</item>
         <item name="android:paddingEnd" tools:ignore="NewApi">?attr/sucFooterButtonPaddingEnd</item>
         <item name="android:textAllCaps">?attr/sucFooterBarButtonAllCaps</item>
-        <item name="android:stateListAnimator">@null</item>
+        <item name="android:stateListAnimator" tools:ignore="NewApi">@null</item>
 
         <!-- Values used in themes -->
         <item name="android:buttonCornerRadius" tools:ignore="NewApi">?attr/sucFooterBarButtonCornerRadius</item>
@@ -65,7 +65,7 @@
         <item name="android:theme">@style/SucPartnerCustomizationButton.Secondary</item>
 
         <!-- Values used in styles -->
-        <item name="android:fontFamily">?attr/sucFooterBarButtonFontFamily</item>
+        <item name="android:fontFamily" tools:targetApi="jelly_bean">?attr/sucFooterBarButtonFontFamily</item>
         <item name="android:minWidth">0dp</item>
         <item name="android:paddingLeft">?attr/sucFooterButtonPaddingStart</item>
         <item name="android:paddingStart" tools:ignore="NewApi">?attr/sucFooterButtonPaddingStart</item>
diff --git a/partnerconfig/java/com/google/android/setupcompat/partnerconfig/PartnerConfigKey.java b/partnerconfig/java/com/google/android/setupcompat/partnerconfig/PartnerConfigKey.java
index 3fe7991..9554ff3 100644
--- a/partnerconfig/java/com/google/android/setupcompat/partnerconfig/PartnerConfigKey.java
+++ b/partnerconfig/java/com/google/android/setupcompat/partnerconfig/PartnerConfigKey.java
@@ -404,10 +404,10 @@
   // The divider of list items are showing.
   String KEY_ITEMS_DIVIDER_SHOWN = "setup_design_items_divider_shown";
 
-  // The intrinsic width of the card view for foldabe/tablet.
+  // The intrinsic width of the card view for foldable/tablet.
   String KEY_CARD_VIEW_INTRINSIC_WIDTH = "setup_design_card_view_intrinsic_width";
 
-  // The intrinsic height of the card view for foldabe/tablet.
+  // The intrinsic height of the card view for foldable/tablet.
   String KEY_CARD_VIEW_INTRINSIC_HEIGHT = "setup_design_card_view_intrinsic_height";
 
   // The animation of loading screen used in those activities which is non of below type.
diff --git a/setup_extension/info_modules.proto b/setup_extension/info_modules.proto
new file mode 100644
index 0000000..5027c4c
--- /dev/null
+++ b/setup_extension/info_modules.proto
@@ -0,0 +1,96 @@
+// Copyright (C) 2022 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// Author: yuchaoyu@google.com (Yu Chao)
+
+syntax = "proto2";
+
+package portal_tips_proto;
+
+option java_package = "com.google.android.setupcompat";
+option java_outer_classname = "InfoModules";
+
+// A list of informational modules to be displayed under the deferred setup
+// items.
+// Next index: 5
+message InfoModuleList {
+  // Contains the title of the entire info module section. This is displayed
+  // before the subtitle and the list of info modules.
+  optional string section_title = 1;
+
+  // Contains the subtitle of the entire info module section. This is displayed
+  // before the list of info modules.
+  optional string section_subtitle = 2;
+
+  // A module represents a single informational item to be displayed in the list
+  // under the deferred setup page.
+  //
+  // Each module contains a unique id, three sections of text labels (title,
+  // description, footer), the Intent URI to launch when being clicked, the raw
+  // icon, and a boolean to determine whether or not the icon should be colored.
+  // Next index: 8
+  message InfoModule {
+
+    // The id to uniquely identify an InfoModule.
+    optional string id = 1;
+
+    // Contains the title of the module. This is displayed as the first section
+    // of the text content.
+    optional string title = 2;
+
+    // Contains the main paragraphs of the module. This is displayed as the
+    // second section of the text content.
+    optional string description = 3;
+
+    // Contains the footer text of the module. This is displayed as the third
+    // and final section of the text content.
+    optional string footer = 4;
+
+    // Contains the Intent string to be launched when the module is clicked.
+    //
+    // This string could be generated from an `Intent` object through the
+    // `toUri()` method.
+    optional string intent_uri = 5;
+
+    // Contains the icon of the module in raw bytes of bitmap format.
+    optional bytes raw_icon = 6;
+
+    // Determines whether the icon should be colored according to the theme.
+    // Generally speaking, this should be set to true for monoline icons (such
+    // as Material Icons) because their colors change according to the theme.
+    // For icons which their colors should be preserved (such as package icons),
+    // this should be set to false.
+    optional bool should_apply_theme_color_on_icon = 7;
+  }
+
+  // Contains a list of informational modules to be displayed.
+  repeated InfoModule info_module_list = 3;
+
+  // A trailing link is a button item appearing below the info module list.
+  // Next index: 3
+  message TrailingLink {
+    // Contains the text that should be displayed on the link button.
+    optional string text = 1;
+
+    // Contains the Intent string to be launched when the link button is
+    // clicked.
+    //
+    // This string could be generated from an `Intent` object through the
+    // `toUri()` method.
+    optional string intent_uri = 2;
+  }
+
+  // Contains a trailing link to be displayed below the info modules.
+  optional TrailingLink trailing_link = 4;
+}