package com.kaichunlin.transition.util; import android.support.annotation.NonNull; import android.support.v4.util.ArrayMap; import android.util.Log; import java.util.ArrayList; import java.util.Calendar; import java.util.List; /** * Used to help trace the state of transition for debugging purpose. */ public class TransitionStateLogger { public final String mId; private Calendar mStartTime; private Calendar mEndTime; private ArrayMap<String, List<TransitionState>> tranStateMap = new ArrayMap<>(); public TransitionStateLogger(@NonNull String id) { mId = id; } public void start() { mStartTime = Calendar.getInstance(); } public void end() { mEndTime = Calendar.getInstance(); } public void append(@NonNull String id, @NonNull Object appendingClass, @NonNull String message) { append(new TransitionState(id, appendingClass, message)); } public void append(@NonNull TransitionState transitionState) { List<TransitionState> list = tranStateMap.get(transitionState.subId); if (list == null) { list = new ArrayList<>(); tranStateMap.put(transitionState.subId, list); } list.add(transitionState); } public void clear() { tranStateMap.clear(); } @Override public String toString() { StringBuilder sb = new StringBuilder(128); sb.append("---------- "); sb.append(mId); sb.append(" Start: "); sb.append(mStartTime); sb.append(" ----------"); int size = tranStateMap.size(); for (int i = 0; i < size; i++) { sb.append("\n"); sb.append(tranStateMap.valueAt(i)); } sb.append("\n--------------------------"); sb.append(mEndTime); sb.append("\n--------------------------"); return sb.toString(); } public void print() { Log.e(getClass().getSimpleName(), "------------- " + mId + " -------------"); boolean first; long baseTime = 0; final int size = tranStateMap.size(); List<TransitionState> stateList; for (int i = 0; i < size; i++) { first = true; stateList = tranStateMap.valueAt(i); final int size2 = stateList.size(); for (int j = 0; j < size2; j++) { if (first) { baseTime = stateList.get(j).time; } Log.e(getClass().getSimpleName(), stateList.get(j).toString(baseTime)); } } Log.i(getClass().getSimpleName(), "-----------------------------"); } /** * The state of the transition for a given moment */ public static class TransitionState { private String subId; private Object mClass; private String message; private long time; private TransitionState(String subId, Object appendingClass, String message) { this.subId = subId; mClass = appendingClass; this.message = message; time = System.currentTimeMillis(); } public String toString(long baseTime) { StringBuilder sb = new StringBuilder(80); sb.append("\t<"); if (subId.contains("@")) { sb.append(subId.substring(subId.indexOf("@"))); } else { sb.append(subId); } sb.append(">, t= "); sb.append(time - baseTime); sb.append(", "); sb.append(mClass.getClass().getSimpleName()); // sb.append(" ["); // sb.append(mClass.hashCode()); // sb.append("]"); sb.append(":\t"); sb.append(message); return sb.toString(); } } }