Import updated Android SetupCompat Library 731203656

Copied from google3/third_party/java_src/android_libs/setupcompat

Test: mm

Included changes:
  - 731203656 Support the footer button metrics with the info of the ho...

PiperOrigin-RevId: 731203656
Change-Id: Id7d965a620d7465b2997693b417d0ead24d34857
diff --git a/main/java/com/google/android/setupcompat/PartnerCustomizationLayout.java b/main/java/com/google/android/setupcompat/PartnerCustomizationLayout.java
index 42d5101..35efc23 100644
--- a/main/java/com/google/android/setupcompat/PartnerCustomizationLayout.java
+++ b/main/java/com/google/android/setupcompat/PartnerCustomizationLayout.java
@@ -23,6 +23,10 @@
 import android.os.Build.VERSION;
 import android.os.Build.VERSION_CODES;
 import android.os.PersistableBundle;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentActivity;
+import androidx.fragment.app.FragmentManager;
+import androidx.fragment.app.FragmentManager.FragmentLifecycleCallbacks;
 import android.util.AttributeSet;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -52,6 +56,7 @@
 import com.google.android.setupcompat.util.Logger;
 import com.google.android.setupcompat.util.WizardManagerHelper;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import org.jspecify.annotations.NonNull;
 
 /** A templatization layout with consistent style used in Setup Wizard or app itself. */
 public class PartnerCustomizationLayout extends TemplateLayout {
@@ -81,6 +86,8 @@
 
   private PersistableBundle layoutTypeBundle;
 
+  @VisibleForTesting FragmentLifecycleCallbacks fragmentLifecycleCallbacks;
+
   private int footerBarPaddingBottom;
 
   @CanIgnoreReturnValue
@@ -186,6 +193,13 @@
 
     activity = lookupActivityFromContext(getContext());
 
+    LOG.atDebug(
+        "Flag of isEnhancedSetupDesignMetricsEnabled="
+            + PartnerConfigHelper.isEnhancedSetupDesignMetricsEnabled(getContext()));
+    if (PartnerConfigHelper.isEnhancedSetupDesignMetricsEnabled(getContext())) {
+      tryRegisterFragmentCallbacks(activity);
+    }
+
     boolean isSetupFlow = WizardManagerHelper.isAnySetupWizard(activity.getIntent());
 
     TypedArray a =
@@ -223,6 +237,28 @@
             + useFullDynamicColorAttr);
   }
 
+  private void printFragmentInfoAtDebug(Fragment fragment, String tag) {
+    if (fragment == null) {
+      return;
+    }
+    int fragmentId = fragment.getId();
+    String fragmentName = tryGetResourceEntryName(fragmentId);
+    LOG.atDebug(
+        tag
+            + " fragment name="
+            + fragment.getClass().getSimpleName()
+            + ", tag="
+            + fragment.getTag()
+            + ", id="
+            + fragment.getId()
+            + ", name="
+            + fragmentName);
+  }
+
+  private String tryGetResourceEntryName(int fragmentId) {
+    return (fragmentId == 0) ? "" : getResources().getResourceEntryName(fragmentId);
+  }
+
   @Override
   protected ViewGroup findContainer(int containerId) {
     if (containerId == 0) {
@@ -281,6 +317,10 @@
           CustomEvent.create(MetricKey.get("SetupCompatMetrics", activity), persistableBundle));
     }
     getViewTreeObserver().removeOnWindowFocusChangeListener(windowFocusChangeListener);
+
+    if (PartnerConfigHelper.isEnhancedSetupDesignMetricsEnabled(getContext())) {
+      tryUnregisterFragmentCallbacks(activity);
+    }
   }
 
   private void logFooterButtonMetrics() {
@@ -319,6 +359,36 @@
     }
   }
 
+  private void tryRegisterFragmentCallbacks(Activity activity) {
+    if ((activity instanceof FragmentActivity fragmentActivity)) {
+      fragmentLifecycleCallbacks =
+          new FragmentLifecycleCallbacks() {
+            @Override
+            public void onFragmentAttached(
+                @NonNull FragmentManager fm, @NonNull Fragment f, @NonNull Context context) {
+              printFragmentInfoAtDebug(f, "onFragmentAttached");
+              getMixin(FooterBarMixin.class).setFragmentInfo(f);
+              super.onFragmentAttached(fm, f, context);
+            }
+          };
+
+      fragmentActivity
+          .getSupportFragmentManager()
+          .registerFragmentLifecycleCallbacks(fragmentLifecycleCallbacks, true);
+      LOG.atDebug(
+          "Register the onFragmentAttached lifecycle callbacks to "
+              + activity.getClass().getSimpleName());
+    }
+  }
+
+  private void tryUnregisterFragmentCallbacks(Activity activity) {
+    if ((activity instanceof FragmentActivity fragmentActivity)) {
+      fragmentActivity
+          .getSupportFragmentManager()
+          .unregisterFragmentLifecycleCallbacks(fragmentLifecycleCallbacks);
+    }
+  }
+
   /**
    * PartnerCustomizationLayout is a template layout for different type of GlifLayout. This method
    * allows each type of layout to report its "GlifLayoutType".
diff --git a/main/java/com/google/android/setupcompat/internal/LifecycleFragment.java b/main/java/com/google/android/setupcompat/internal/LifecycleFragment.java
index 5f0fde6..ce4345d 100644
--- a/main/java/com/google/android/setupcompat/internal/LifecycleFragment.java
+++ b/main/java/com/google/android/setupcompat/internal/LifecycleFragment.java
@@ -105,6 +105,8 @@
         }
       }
     }
+    LOG.atDebug(
+        "Skip attach " + activity.getClass().getSimpleName() + " because it's not in SUW flow.");
     return null;
   }
 
diff --git a/main/java/com/google/android/setupcompat/template/FooterBarMixin.java b/main/java/com/google/android/setupcompat/template/FooterBarMixin.java
index 100d674..0c58a24 100644
--- a/main/java/com/google/android/setupcompat/template/FooterBarMixin.java
+++ b/main/java/com/google/android/setupcompat/template/FooterBarMixin.java
@@ -29,6 +29,7 @@
 import android.graphics.drawable.GradientDrawable;
 import android.os.Build.VERSION_CODES;
 import android.os.PersistableBundle;
+import androidx.fragment.app.Fragment;
 import android.util.AttributeSet;
 import android.view.ContextThemeWrapper;
 import android.view.Gravity;
@@ -105,6 +106,10 @@
   private final int footerBarSecondaryButtonEnabledTextColor;
   private final int footerBarPrimaryButtonDisabledTextColor;
   private final int footerBarSecondaryButtonDisabledTextColor;
+  private static final String KEY_HOST_FRAGMENT_NAME = "HostFragmentName";
+  private static final String KEY_HOST_FRAGMENT_TAG = "HostFragmentTag";
+  private String hostFragmentName;
+  private String hostFragmentTag;
 
   @VisibleForTesting final int footerBarButtonMiddleSpacing;
 
@@ -281,6 +286,13 @@
     }
   }
 
+  public void setFragmentInfo(@Nullable Fragment fragment) {
+    if (fragment != null) {
+      hostFragmentName = fragment.getClass().getSimpleName();
+      hostFragmentTag = fragment.getTag();
+    }
+  }
+
   public void setLoggingObserver(LoggingObserver observer) {
     loggingObserver = observer;
 
@@ -1255,7 +1267,17 @@
    */
   @TargetApi(VERSION_CODES.Q)
   public PersistableBundle getLoggingMetrics() {
-    return metrics.getMetrics();
+    LOG.atDebug("FooterBarMixin fragment name=" + hostFragmentName + ", Tag=" + hostFragmentTag);
+    PersistableBundle persistableBundle = metrics.getMetrics();
+    if (PartnerConfigHelper.isEnhancedSetupDesignMetricsEnabled(context)) {
+      if (hostFragmentName != null) {
+        persistableBundle.putString(KEY_HOST_FRAGMENT_NAME, hostFragmentName);
+      }
+      if (hostFragmentTag != null) {
+        persistableBundle.putString(KEY_HOST_FRAGMENT_TAG, hostFragmentTag);
+      }
+    }
+    return persistableBundle;
   }
 
   private void updateTextColorForButton(Button button, boolean enable, int color) {