content: package com.android.launcher3.logging;
  
  import static com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType.DEFAULT_CONTAINERTYPE;
  
  import android.view.View;
  import android.view.ViewParent;
  
  import com.android.launcher3.ItemInfo;
  import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType;
  import com.android.launcher3.userevent.nano.LauncherLogProto.Target;
  
  import androidx.annotation.Nullable;
  
  
  public class StatsLogUtils {
  
      // Defined in android.stats.launcher.nano
      // As they cannot be linked in this file, defining again.
      public final static int LAUNCHER_STATE_BACKGROUND = 0;
      public final static int LAUNCHER_STATE_HOME = 1;
      public final static int LAUNCHER_STATE_OVERVIEW = 2;
      public final static int LAUNCHER_STATE_ALLAPPS = 3;
  
      private final static int MAXIMUM_VIEW_HIERARCHY_LEVEL = 5;
  
      public interface LogStateProvider {
          int getCurrentState();
      }
  
      /**
       * Implemented by containers to provide a container source for a given child.
       *
       * Currently,
       */
      public interface LogContainerProvider {
  
          /**
           * Copies data from the source to the destination proto.
           *
           * @param v            source of the data
           * @param info         source of the data
           * @param target       dest of the data
           * @param targetParent dest of the data
           */
          void fillInLogContainerData(View v, ItemInfo info, Target target, Target targetParent);
      }
  
      /**
       * 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;
      }
  
      public static int getContainerTypeFromState(int state) {
          int containerType = DEFAULT_CONTAINERTYPE;
          switch (state) {
              case StatsLogUtils.LAUNCHER_STATE_ALLAPPS:
                  containerType = ContainerType.ALLAPPS;
                  break;
              case StatsLogUtils.LAUNCHER_STATE_HOME:
                  containerType = ContainerType.WORKSPACE;
                  break;
              case StatsLogUtils.LAUNCHER_STATE_OVERVIEW:
                  containerType = ContainerType.OVERVIEW;
                  break;
          }
          return containerType;
      }
  }
  