blob: 3a18387c2482677389bb9895e085e5dd05e1d59d [file] [log] [blame]
/*
* Copyright 2018 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.server.display.utils;
import java.lang.StringBuilder;
import java.lang.System;
import android.util.Slog;
/**
* A utility to log multiple points and curves in a structured way so they can be easily consumed
* by external tooling
*
* To start a plot, call {@link Plog.start} with the plot's title; to add a point to it, call
* {@link Plog.logPoint} with the point name (that will appear in the legend) and coordinates; and
* to log a curve, call {@link Plog.logCurve} with its name and points.
*/
public abstract class Plog {
// A unique identifier used to group points and curves that belong on the same plot.
private long mId;
/**
* Returns a Plog instance that emits messages to the system log.
*
* @param tag The tag of the emitted messages in the system log.
* @return A plog instance that emits messages to the system log.
*/
public static Plog createSystemPlog(String tag) {
return new SystemPlog(tag);
}
/**
* Start a new plot.
*
* @param title The plot title.
* @return The Plog instance (for chaining).
*/
public Plog start(String title) {
mId = System.currentTimeMillis();
write(formatTitle(title));
return this;
}
/**
* Adds a point to the current plot.
*
* @param name The point name (that will appear in the legend).
* @param x The point x coordinate.
* @param y The point y coordinate.
* @return The Plog instance (for chaining).
*/
public Plog logPoint(String name, float x, float y) {
write(formatPoint(name, x, y));
return this;
}
/**
* Adds a curve to the current plot.
*
* @param name The curve name (that will appear in the legend).
* @param xs The curve x coordinates.
* @param ys The curve y coordinates.
* @return The Plog instance (for chaining).
*/
public Plog logCurve(String name, float[] xs, float[] ys) {
write(formatCurve(name, xs, ys));
return this;
}
private String formatTitle(String title) {
return "title: " + title;
}
private String formatPoint(String name, float x, float y) {
return "point: " + name + ": (" + x + "," + y + ")";
}
private String formatCurve(String name, float[] xs, float[] ys) {
StringBuilder sb = new StringBuilder();
sb.append("curve: " + name + ": [");
int n = xs.length <= ys.length ? xs.length : ys.length;
for (int i = 0; i < n; i++) {
sb.append("(" + xs[i] + "," + ys[i] + "),");
}
sb.append("]");
return sb.toString();
}
private void write(String message) {
emit("[PLOG " + mId + "] " + message);
}
/**
* Emits a message (depending on the concrete Plog implementation).
*
* @param message The message.
*/
protected abstract void emit(String message);
/**
* A Plog that emits messages to the system log.
*/
public static class SystemPlog extends Plog {
// The tag of the emitted messages in the system log.
private final String mTag;
/**
* Returns a Plog instance that emits messages to the system log.
*
* @param tag The tag of the emitted messages in the system log.
* @return A Plog instance that emits messages to the system log.
*/
public SystemPlog(String tag) {
mTag = tag;
}
/**
* Emits a message to the system log.
*
* @param message The message.
*/
protected void emit(String message) {
Slog.d(mTag, message);
}
}
}