diff --git a/quickstep/src/com/android/quickstep/logging/StatsLogCompatManager.java b/quickstep/src/com/android/quickstep/logging/StatsLogCompatManager.java index 04fc3ba181..1b6f39eb68 100644 --- a/quickstep/src/com/android/quickstep/logging/StatsLogCompatManager.java +++ b/quickstep/src/com/android/quickstep/logging/StatsLogCompatManager.java @@ -110,6 +110,11 @@ public class StatsLogCompatManager extends StatsLogManager { return new StatsCompatLogger(mContext, mActivityContext); } + @Override + protected StatsLatencyLogger createLatencyLogger() { + return new StatsCompatLatencyLogger(mContext, mActivityContext); + } + /** * Synchronously writes an itemInfo to stats log */ @@ -422,6 +427,61 @@ public class StatsLogCompatManager extends StatsLogManager { } } + /** + * Helps to construct and log statsd compatible latency events. + */ + private static class StatsCompatLatencyLogger implements StatsLatencyLogger { + private final Context mContext; + private final Optional mActivityContext; + private InstanceId mInstanceId = DEFAULT_INSTANCE_ID; + private LatencyType mType = LatencyType.UNKNOWN; + private long mLatencyInMillis; + + StatsCompatLatencyLogger(Context context, ActivityContext activityContext) { + mContext = context; + mActivityContext = Optional.ofNullable(activityContext); + } + + @Override + public StatsLatencyLogger withInstanceId(InstanceId instanceId) { + this.mInstanceId = instanceId; + return this; + } + + @Override + public StatsLatencyLogger withType(LatencyType type) { + this.mType = type; + return this; + } + + @Override + public StatsLatencyLogger withLatency(long latencyInMillis) { + this.mLatencyInMillis = latencyInMillis; + return this; + } + + @Override + public void log(EventEnum event) { + if (IS_VERBOSE) { + String name = (event instanceof Enum) ? ((Enum) event).name() : + event.getId() + ""; + + Log.d(TAG, mInstanceId == DEFAULT_INSTANCE_ID + ? String.format("\n%s = %dms\n", name, mLatencyInMillis) + : String.format("\n%s = %dms (InstanceId:%s)\n", name, + mLatencyInMillis, mInstanceId)); + } + + SysUiStatsLog.write(SysUiStatsLog.LAUNCHER_LATENCY, + event.getId(), // event_id + mInstanceId.getId(), // instance_id + 0, // package_id + mLatencyInMillis, // latency_in_millis + mType.getId() //type + ); + } + } + private static int getCardinality(LauncherAtom.ItemInfo info) { switch (info.getContainerInfo().getContainerCase()) { case PREDICTED_HOTSEAT_CONTAINER: diff --git a/src/com/android/launcher3/logging/StatsLogManager.java b/src/com/android/launcher3/logging/StatsLogManager.java index 0d2bc37f42..9604766783 100644 --- a/src/com/android/launcher3/logging/StatsLogManager.java +++ b/src/com/android/launcher3/logging/StatsLogManager.java @@ -562,7 +562,7 @@ public class StatsLogManager implements ResourceBasedOverride { } /** - * Helps to construct and write the log message. + * Helps to construct and log launcher event. */ public interface StatsLogger { @@ -661,6 +661,58 @@ public class StatsLogManager implements ResourceBasedOverride { } } + /** + * Helps to construct and log latency event. + */ + public interface StatsLatencyLogger { + + enum LatencyType { + UNKNOWN(0), + COLD(1), + HOT(2); + + private final int mId; + + LatencyType(int id) { + this.mId = id; + } + + public int getId() { + return mId; + } + + } + + /** + * Sets {@link InstanceId} of log message. + */ + default StatsLatencyLogger withInstanceId(InstanceId instanceId) { + return this; + } + + + /** + * Sets latency of the event. + */ + default StatsLatencyLogger withLatency(long latencyInMillis) { + return this; + } + + /** + * Sets {@link LatencyType} of log message. + */ + default StatsLatencyLogger withType(LatencyType type) { + return this; + } + + + /** + * Builds the final message and logs it as {@link EventEnum}. + */ + default void log(EventEnum event) { + } + } + /** * Returns new logger object. */ @@ -672,11 +724,27 @@ public class StatsLogManager implements ResourceBasedOverride { return logger; } + /** + * Returns new latency logger object. + */ + public StatsLatencyLogger latencyLogger() { + StatsLatencyLogger logger = createLatencyLogger(); + if (mInstanceId != null) { + logger.withInstanceId(mInstanceId); + } + return logger; + } + protected StatsLogger createLogger() { return new StatsLogger() { }; } + protected StatsLatencyLogger createLatencyLogger() { + return new StatsLatencyLogger() { + }; + } + /** * Sets InstanceId to every new {@link StatsLogger} object returned by {@link #logger()} when * not-null.