package com.android.launcher3.logging; import android.os.Bundle; import android.util.Log; import com.android.launcher3.ShortcutInfo; import com.android.launcher3.Stats; import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.userevent.nano.LauncherLogProto; import java.util.Locale; public abstract class UserEventLogger { private String TAG = "UserEventLogger"; private boolean DEBUG = false; private long mElapsedContainerMillis; private long mElapsedSessionMillis; private long mActionDurationMillis; public final void logAppLaunch(String provider, ShortcutInfo shortcut, Bundle bundle) { if (FeatureFlags.LAUNCHER3_LEGACY_LOGGING) return; LauncherLogProto.LauncherEvent event = new LauncherLogProto.LauncherEvent(); event.action = new LauncherLogProto.Action(); event.action.type = LauncherLogProto.Action.TOUCH; event.action.touch = LauncherLogProto.Action.TAP; event.srcTarget = new LauncherLogProto.Target(); event.srcTarget.type = LauncherLogProto.Target.ITEM; event.srcTarget.itemType = LauncherLogProto.APP_ICON; // TODO: package hash name should be different per device. event.srcTarget.packageNameHash = provider.hashCode(); event.srcTarget.parent = new LauncherLogProto.Target(); String subContainer = bundle.getString(Stats.SOURCE_EXTRA_SUB_CONTAINER); if (shortcut != null) { event.srcTarget.parent.containerType = LoggerUtils.getContainerType(shortcut); event.srcTarget.pageIndex = (int) shortcut.screenId; event.srcTarget.gridX = shortcut.cellX; event.srcTarget.gridX = shortcut.cellY; } if (subContainer != null) { event.srcTarget.parent.type = LauncherLogProto.Target.CONTAINER; if (subContainer.equals(Stats.SUB_CONTAINER_FOLDER)) { event.srcTarget.parent.containerType = LauncherLogProto.FOLDER; } else if (subContainer.equals(Stats.SUB_CONTAINER_ALL_APPS_A_Z)) { event.srcTarget.parent.containerType = LauncherLogProto.ALLAPPS; } else if (subContainer.equals(Stats.CONTAINER_HOTSEAT)) { event.srcTarget.parent.containerType = LauncherLogProto.HOTSEAT; } else if (subContainer.equals(Stats.SUB_CONTAINER_ALL_APPS_PREDICTION)) { event.srcTarget.parent.containerType = LauncherLogProto.PREDICTION; } if (DEBUG) { Log.d(TAG, String.format("parent bundle: %s %s %s %s", bundle.getString(Stats.SOURCE_EXTRA_CONTAINER), bundle.getString(Stats.SOURCE_EXTRA_CONTAINER_PAGE), bundle.getString(Stats.SOURCE_EXTRA_SUB_CONTAINER), bundle.getString(Stats.SOURCE_EXTRA_SUB_CONTAINER_PAGE))); } } event.elapsedContainerMillis = System.currentTimeMillis() - mElapsedContainerMillis; event.elapsedSessionMillis = System.currentTimeMillis() - mElapsedSessionMillis; processEvent(event); } /** * Currently logs following containers: workspace, allapps, widget tray. */ public final void resetElapsedContainerMillis() { mElapsedContainerMillis = System.currentTimeMillis(); if(DEBUG) { Log.d(TAG, "resetElapsedContainerMillis " + mElapsedContainerMillis); } } public final void resetElapsedSessionMillis() { mElapsedSessionMillis = System.currentTimeMillis(); mElapsedContainerMillis = System.currentTimeMillis(); if(DEBUG) { Log.d(TAG, "resetElapsedSessionMillis " + mElapsedSessionMillis); } } public final void resetActionDurationMillis() { mActionDurationMillis = System.currentTimeMillis(); if(DEBUG) { Log.d(TAG, "resetElapsedContainerMillis " + mElapsedContainerMillis); } } public abstract void processEvent(LauncherLogProto.LauncherEvent ev); }