[automerger skipped] Merge Android 13 QPR1 am: 391e92ba41 -s ours am: 1c80d188dd -s ours

am skip reason: Merged-In I91060901a090bb53ce52654436ebf3445e53118d with SHA-1 6ab057927f is already in history

Original change: https://android-review.googlesource.com/c/platform/external/setupdesign/+/2338244

Change-Id: I35b652b8ae7eba5299863e8522238c7832ca7d38
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
diff --git a/main/res/values-v31/styles.xml b/main/res/values-v31/styles.xml
index 1be5b13..5fab1c1 100644
--- a/main/res/values-v31/styles.xml
+++ b/main/res/values-v31/styles.xml
@@ -198,6 +198,8 @@
   </style>
 
   <style name="SudAppCompatButtonButtonBarAlertDialog" parent="Widget.AppCompat.ButtonBar.AlertDialog">
+    <item name="android:layout_marginStart">@dimen/sud_glif_alert_dialog_footer_bar_padding_start</item>
+    <item name="android:layout_marginLeft">@dimen/sud_glif_alert_dialog_footer_bar_padding_start</item>
     <item name="android:textAppearance">@style/SudTextAppearanceDeviceDefaultMedium</item>
     <item name="android:minWidth">@dimen/sud_alert_dialog_button_bar_width</item>
     <item name="android:minHeight">@dimen/sud_alert_dialog_button_bar_height</item>
diff --git a/main/res/values/dimens.xml b/main/res/values/dimens.xml
index 1562cc5..d3f0d02 100644
--- a/main/res/values/dimens.xml
+++ b/main/res/values/dimens.xml
@@ -56,6 +56,7 @@
     <dimen name="sud_horizontal_icon_height">32dp</dimen>
 
     <dimen name="sud_glif_alert_dialog_corner_radius">8dp</dimen>
+    <dimen name="sud_glif_alert_dialog_footer_bar_padding_start">8dp</dimen>
     <dimen name="sud_glif_v3_button_corner_radius">4dp</dimen>
     <dimen name="sud_glif_device_default_dialog_corner_radius">28dp</dimen>
     <dimen name="sud_glif_land_header_area_weight">1</dimen>
diff --git a/main/src/com/google/android/setupdesign/span/LinkSpan.java b/main/src/com/google/android/setupdesign/span/LinkSpan.java
index 7defbf9..3bb1617 100644
--- a/main/src/com/google/android/setupdesign/span/LinkSpan.java
+++ b/main/src/com/google/android/setupdesign/span/LinkSpan.java
@@ -140,13 +140,4 @@
   public String getLink() {
     return link;
   }
-
-  /**
-   * @deprecated Method's return type clashes with its superclass. Use {@link #getLink()} instead.
-   * This will be removed in the future.
-   */
-  @Deprecated
-  public String getId() {
-    return link;
-  }
 }
diff --git a/main/src/com/google/android/setupdesign/template/HeaderMixin.java b/main/src/com/google/android/setupdesign/template/HeaderMixin.java
index 814f873..2a6114d 100644
--- a/main/src/com/google/android/setupdesign/template/HeaderMixin.java
+++ b/main/src/com/google/android/setupdesign/template/HeaderMixin.java
@@ -27,6 +27,7 @@
 import android.view.ViewGroup;
 import android.view.ViewParent;
 import android.view.ViewTreeObserver;
+import android.view.ViewTreeObserver.OnPreDrawListener;
 import android.widget.LinearLayout;
 import android.widget.TextView;
 import androidx.annotation.AttrRes;
@@ -42,6 +43,7 @@
 import com.google.android.setupdesign.util.LayoutStyler;
 import com.google.android.setupdesign.util.PartnerStyleHelper;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import java.util.ArrayList;
 
 /**
  * A {@link com.google.android.setupcompat.template.Mixin} for setting and getting the header text.
@@ -54,7 +56,10 @@
   private float headerAutoSizeMinTextSizeInPx;
   private float headerAutoSizeLineExtraSpacingInPx;
   private int headerAutoSizeMaxLineOfMaxSize;
+  private float defaultTextSize = 0;
+  private int defaultLineHeight = 0;
   private static final int AUTO_SIZE_DEFAULT_MAX_LINES = 6;
+  ArrayList<OnPreDrawListener> titlePreDrawListeners = new ArrayList<>();
 
   /**
    * A {@link com.google.android.setupcompat.template.Mixin} for setting and getting the Header.
@@ -78,8 +83,11 @@
         a.getColorStateList(R.styleable.SucHeaderMixin_sucHeaderTextColor);
 
     a.recycle();
-
-    // Try to update the flag of the uto size config settings
+    if (getTextView() != null) {
+      defaultTextSize = getTextView().getTextSize();
+      defaultLineHeight = getTextView().getLineHeight();
+    }
+    // Try to update the flag of the auto size config settings
     tryUpdateAutoTextSizeFlagWithPartnerConfig();
 
     // Set the header text
@@ -109,7 +117,11 @@
     if (!autoTextSizeEnabled) {
       return;
     }
+    tryUpdateAutoTextConfigWithPartnerConfig();
+  }
 
+  private void tryUpdateAutoTextConfigWithPartnerConfig() {
+    Context context = templateLayout.getContext();
     if (PartnerConfigHelper.get(context)
         .isPartnerConfigAvailable(PartnerConfig.CONFIG_HEADER_AUTO_SIZE_MAX_TEXT_SIZE)) {
       headerAutoSizeMaxTextSizeInPx =
@@ -207,36 +219,66 @@
     }
     // preset as the max size
     titleView.setTextSize(TypedValue.COMPLEX_UNIT_PX, headerAutoSizeMaxTextSizeInPx);
+    defaultTextSize = titleView.getTextSize();
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
       titleView.setLineHeight(
           Math.round(headerAutoSizeLineExtraSpacingInPx + headerAutoSizeMaxTextSizeInPx));
+      defaultLineHeight = titleView.getLineHeight();
     }
     titleView.setMaxLines(AUTO_SIZE_DEFAULT_MAX_LINES);
-
     // reset text size if the line count for max text size > headerAutoSizeMaxLineOfMaxTextSize
-    titleView
-        .getViewTreeObserver()
-        .addOnPreDrawListener(
-            new ViewTreeObserver.OnPreDrawListener() {
-              @Override
-              public boolean onPreDraw() {
-                // Remove listener to avoid this called every frame
-                titleView.getViewTreeObserver().removeOnPreDrawListener(this);
-                int lineCount = titleView.getLineCount();
-                if (lineCount > headerAutoSizeMaxLineOfMaxSize) {
-                  // reset text size
-                  titleView.setTextSize(TypedValue.COMPLEX_UNIT_PX, headerAutoSizeMinTextSizeInPx);
-                  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
-                    titleView.setLineHeight(
-                        Math.round(
-                            headerAutoSizeLineExtraSpacingInPx + headerAutoSizeMinTextSizeInPx));
-                  }
-                  titleView.invalidate();
-                  return false; // false to skip this frame
-                }
-                return true;
+    OnPreDrawListener titlePreDrawListener =
+        new ViewTreeObserver.OnPreDrawListener() {
+          @Override
+          public boolean onPreDraw() {
+            // Remove listener to avoid this called every frame
+            titleView.getViewTreeObserver().removeOnPreDrawListener(this);
+            int lineCount = titleView.getLineCount();
+            if (lineCount > headerAutoSizeMaxLineOfMaxSize) {
+              // reset text size
+              titleView.setTextSize(TypedValue.COMPLEX_UNIT_PX, headerAutoSizeMinTextSizeInPx);
+              if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
+                titleView.setLineHeight(
+                    Math.round(headerAutoSizeLineExtraSpacingInPx + headerAutoSizeMinTextSizeInPx));
               }
-            });
+              titleView.invalidate();
+              return false; // false to skip this frame
+            }
+            return true;
+          }
+        };
+    titleView.getViewTreeObserver().addOnPreDrawListener(titlePreDrawListener);
+    titlePreDrawListeners.add(titlePreDrawListener);
+  }
+
+  private void resetTextSize(TextView titleView) {
+    if (titleView == null) {
+      return;
+    }
+    titleView.setTextSize(TypedValue.COMPLEX_UNIT_PX, defaultTextSize);
+    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
+      titleView.setLineHeight(defaultLineHeight);
+    }
+    for (OnPreDrawListener titlePreDrawListener : titlePreDrawListeners) {
+      titleView.getViewTreeObserver().removeOnPreDrawListener(titlePreDrawListener);
+    }
+    titlePreDrawListeners.clear();
+  }
+
+  /**
+   * Enable or disable the auto size for header string. Which will adjust the font size of header
+   * string to fit the limitation of headerAutoSizeMaxLineOfMaxSize.
+   */
+  public void setAutoTextSizeEnabled(boolean autoTextSizeEnabled) {
+    this.autoTextSizeEnabled = autoTextSizeEnabled;
+    if (autoTextSizeEnabled) {
+      tryUpdateAutoTextConfigWithPartnerConfig();
+      if (autoTextSizeEnabled) {
+        autoAdjustTextSize(getTextView());
+      }
+    } else {
+      resetTextSize(getTextView());
+    }
   }
 
   /** Returns the current header text. */
diff --git a/main/src/com/google/android/setupdesign/util/DeviceHelper.java b/main/src/com/google/android/setupdesign/util/DeviceHelper.java
index 5845cbb..37c5144 100644
--- a/main/src/com/google/android/setupdesign/util/DeviceHelper.java
+++ b/main/src/com/google/android/setupdesign/util/DeviceHelper.java
@@ -16,26 +16,34 @@
 
 package com.google.android.setupdesign.util;
 
+import android.annotation.SuppressLint;
 import android.content.ContentResolver;
 import android.content.Context;
+import android.content.res.Resources.NotFoundException;
 import android.net.Uri;
 import android.os.Bundle;
+import android.text.TextUtils;
 import android.util.Log;
 import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
+import com.google.android.setupcompat.util.Logger;
 import com.google.android.setupdesign.R;
 
 /** Helper class to get attributes of the device, like a friendly display name. */
 public final class DeviceHelper {
 
+  private static final Logger LOG = new Logger("DeviceHelper");
   private static final String TAG = DeviceHelper.class.getSimpleName();
 
   @VisibleForTesting
   public static final String SUW_AUTHORITY = "com.google.android.setupwizard.partner";
 
+  @VisibleForTesting public static final String DEVICE_NAME = "device_name";
+  private static final String STRING = "string";
   @VisibleForTesting public static final String GET_DEVICE_NAME_METHOD = "getDeviceName";
 
+  @VisibleForTesting public static Bundle deviceName = null;
+
   /**
    * Get the device name text from these resources, if they are unavailable or setupwizard apk is
    * older which does not contains {@link DeviceHelper#GET_DEVICE_NAME_METHOD} method, return the
@@ -45,30 +53,47 @@
    * com.google.android.setupwizard.util.PartnerResource#DEVICE_NAME}) > {@link
    * android.provider.Settings.Global#DEVICE_NAME} > system property ro.product.model)
    */
-  @Nullable
+  @NonNull
+  @SuppressLint("DiscouragedApi")
   public static CharSequence getDeviceName(@NonNull Context context) {
-    Bundle deviceName = null;
-
-    try {
-      deviceName =
-          context
-              .getContentResolver()
-              .call(
-                  new Uri.Builder()
-                      .scheme(ContentResolver.SCHEME_CONTENT)
-                      .authority(SUW_AUTHORITY)
-                      .build(),
-                  GET_DEVICE_NAME_METHOD,
-                  /* arg= */ null,
-                  /* extras= */ null);
-    } catch (IllegalArgumentException | SecurityException exception) {
-      Log.w(TAG, "device name unknown; return the device name as default value");
+    if (deviceName == null || deviceName.isEmpty()) {
+      try {
+        deviceName =
+            context
+                .getContentResolver()
+                .call(
+                    new Uri.Builder()
+                        .scheme(ContentResolver.SCHEME_CONTENT)
+                        .authority(SUW_AUTHORITY)
+                        .build(),
+                    GET_DEVICE_NAME_METHOD,
+                    /* arg= */ null,
+                    /* extras= */ null);
+      } catch (IllegalArgumentException | SecurityException exception) {
+        Log.w(TAG, "device name unknown; return the device name as default value");
+      }
     }
 
-    if (deviceName != null) {
+    if (deviceName != null && !deviceName.isEmpty()) {
       return deviceName.getCharSequence(GET_DEVICE_NAME_METHOD, null);
     }
 
+    Partner partner = Partner.get(context);
+    if (partner != null) {
+      try {
+        int resId =
+            partner.getResources().getIdentifier(DEVICE_NAME, STRING, partner.getPackageName());
+        String overlayDeviceName = partner.getResources().getString(resId);
+        if (!TextUtils.isEmpty(overlayDeviceName)) {
+          return overlayDeviceName;
+        } else {
+          LOG.w("The overlayDeviceName is null!");
+        }
+      } catch (NotFoundException ex) {
+        // fall through
+      }
+    }
+
     return context.getString(R.string.sud_default_device_name);
   }