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) {