package com.frogermcs.androiddevmetrics.internal;
import com.frogermcs.androiddevmetrics.internal.metrics.model.InitMetric;
import com.frogermcs.androiddevmetrics.AndroidDevMetrics;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
/**
* Created by Miroslaw Stanek on 25.01.2016.
*/
public class MetricDescription extends MetricDescriptionTreeItem {
public final List<MetricDescriptionTreeItem> descriptionTreeItems = new ArrayList<>();
public String className;
public String formattedInitTime;
public MetricDescription() {
}
public static MetricDescription InitFromMetric(InitMetric initMetric) {
MetricDescription metricDescription = new MetricDescription();
metricDescription.className = initMetric.getSimpleClassName();
metricDescription.formatInitTime(initMetric.getTotalInitTime(),
initMetric.getInitTimeWithoutArgs(),
initMetric.getThreadName());
metricDescription.initDescriptionsTree(initMetric.args, 0, "");
return metricDescription;
}
private void formatInitTime(long overallInitTime, long noArgsInitTime, String threadName) {
StringBuilder sb = new StringBuilder("Initialization: ");
sb.append(noArgsInitTime);
sb.append("ms, ");
sb.append("with args: ");
sb.append(overallInitTime);
sb.append("ms");
sb.append(" <font color='#00BFA5'>(" + threadName + ")</font>");
formattedInitTime = sb.toString();
warningLevel = getWarningLevel(noArgsInitTime);
}
private void initDescriptionsTree(Set<InitMetric> initMetrics, int depthLevel, String prev) {
if (depthLevel == 0 && initMetrics.size() == 0) {
descriptionTreeItems.add(new MetricDescriptionTreeItem("No args or args initialized before", 0));
}
int size = initMetrics.size();
int count = 0;
for (InitMetric initMetric : initMetrics) {
final long initTimeWithoutArgs = initMetric.getInitTimeWithoutArgs();
final long totalInitTime = initMetric.getTotalInitTime();
final int warningLevel = getWarningLevel(initTimeWithoutArgs);
String depthStr = prev + "│" + space(1);
String edgeChar = "├";
String secondRowChar = "│";
if (count == size - 1) {
edgeChar = "└";
secondRowChar = space(1);
depthStr = prev + space(2);
}
StringBuilder sb = new StringBuilder(prev);
sb.append(edgeChar + "─● <b>");
sb.append(initMetric.getSimpleClassName());
sb.append("</b><br/>");
sb.append(prev + secondRowChar + space(1));
sb.append(initTimeWithoutArgs);
sb.append("ms, with args: ");
sb.append(totalInitTime);
sb.append("ms");
sb.append(" <font color='#00BFA5'>(" + initMetric.threadName + ")</font>");
descriptionTreeItems.add(new MetricDescriptionTreeItem(sb.toString(), warningLevel));
if (initMetric.args.size() > 0) {
initDescriptionsTree(initMetric.args, depthLevel + 1, depthStr);
}
count++;
}
}
private int getWarningLevel(long initTimeWithoutArgs) {
if (initTimeWithoutArgs < AndroidDevMetrics.singleton().dagger2WarningLevel1()) {
return 0;
} else if (initTimeWithoutArgs < AndroidDevMetrics.singleton().dagger2WarningLevel2()) {
return 1;
} else if (initTimeWithoutArgs < AndroidDevMetrics.singleton().dagger2WarningLevel3()) {
return 2;
} else {
return 3;
}
}
private String space(int count) {
String spaceChar = "\u2000\u2006";
for (int i = 0; i < count - 1; i++) {
spaceChar += spaceChar;
}
return spaceChar;
}
}