package com.frogermcs.androiddevmetrics.internal.metrics;
import com.frogermcs.androiddevmetrics.internal.MetricDescription;
import com.frogermcs.androiddevmetrics.internal.metrics.model.InitMetric;
import com.frogermcs.androiddevmetrics.internal.ui.interceptor.UIInterceptor;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Set;
/**
* Created by Miroslaw Stanek on 24.01.2016.
*/
public class InitManager {
private static class Holder {
static final InitManager INSTANCE = new InitManager();
}
public static InitManager getInstance() {
return Holder.INSTANCE;
}
public final Set<OnMetricsDataListener> dataListeners = new HashSet<>();
public final LinkedHashMap<String, InitMetric> initializedMetrics = new LinkedHashMap<>();
public final LinkedHashMap<String, Integer> initCounter = new LinkedHashMap<>();
public void addInitMetric(Class<?> initializedClass, Object[] args, long initTimeMillis) {
InitMetric initMetric = new InitMetric();
initMetric.initTimeMillis = initTimeMillis;
initMetric.cls = initializedClass;
initMetric.threadName = Thread.currentThread().getName();
initMetric.traceElements = Thread.currentThread().getStackTrace();
String simpleName = initializedClass.getName();
if (!initializedMetrics.containsKey(simpleName)) {
putInitMetric(simpleName, initMetric);
int argsLength = args.length;
for (int i = 0; i < argsLength; i++) {
if (args[i] == null) continue;
String argClassSimpleName = args[i].getClass().getName();
InitMetric argMethics = initializedMetrics.get(argClassSimpleName);
if (argMethics != null) {
initMetric.args.add(argMethics);
initializedMetrics.remove(argClassSimpleName);
}
}
initMetric.instanceNo = 0;
initCounter.put(simpleName, 0);
} else {
int counterVal = initCounter.get(simpleName) + 1;
initCounter.put(simpleName, counterVal);
initMetric.instanceNo = counterVal;
putInitMetric(simpleName + "#" + counterVal, initMetric);
}
}
private void putInitMetric(String key, InitMetric initMetric) {
initializedMetrics.put(key, initMetric);
for (OnMetricsDataListener dataListener : dataListeners) {
dataListener.onInitNewMetricRecorded(initMetric);
}
}
public List<MetricDescription> getListOfMetricDescriptions(UIInterceptor interceptor) {
List<MetricDescription> metricDescriptions = new ArrayList<>();
List<InitMetric> displayList = interceptor.intercept(new ArrayList<>(InitManager.getInstance().initializedMetrics.values()));
for (InitMetric initMetric : displayList) {
metricDescriptions.add(MetricDescription.InitFromMetric(initMetric));
}
return metricDescriptions;
}
public void addMetricsDataListener(OnMetricsDataListener onDataListener) {
dataListeners.add(onDataListener);
}
public void removeMetricsDataListener(OnMetricsDataListener onDataListener) {
dataListeners.remove(onDataListener);
}
}