package com.android.launcher3.logging; import android.view.View; import android.view.ViewParent; import androidx.annotation.Nullable; import com.android.launcher3.model.data.ItemInfo; import com.android.launcher3.userevent.nano.LauncherLogProto.Target; import java.util.ArrayList; public class StatsLogUtils { private final static int MAXIMUM_VIEW_HIERARCHY_LEVEL = 5; /** * Implemented by containers to provide a container source for a given child. */ public interface LogContainerProvider { /** * Populates parent container targets for an item */ void fillInLogContainerData(ItemInfo childInfo, Target child, ArrayList parents); } /** * Recursively finds the parent of the given child which implements IconLogInfoProvider */ public static LogContainerProvider getLaunchProviderRecursive(@Nullable View v) { ViewParent parent; if (v != null) { parent = v.getParent(); } else { return null; } // Optimization to only check up to 5 parents. int count = MAXIMUM_VIEW_HIERARCHY_LEVEL; while (parent != null && count-- > 0) { if (parent instanceof LogContainerProvider) { return (LogContainerProvider) parent; } else { parent = parent.getParent(); } } return null; } }