package com.photoshare.fragments.stacktrace; import java.util.ArrayList; import java.util.List; public final class TraceFootprint { private int currentIndex = 0; /** * The currentSize will not outweigh the TRACE_MAX_SIZE defined in the * TraceConfig class. If so, after the client back to the previous fragments * or change the tabs, the oversized elements will automatically be * destroyed. {@link TraceConfig#getTraceMaxSize()} */ private int currentSize; private List<TraceElement> elements = new ArrayList<TraceElement>(); public void forward(TraceElement element) { currentIndex++; currentSize++; element.setForward(); elements.add(element); System.out.println("TraceElementSize Forward" + elements.size() + element.getOriginFragment()); } public TraceElement back() { if (currentIndex == 0) { throw new IllegalStateException("There is no backwards elements"); } currentIndex--; TraceElement element = elements.get(currentIndex); element.setBackward(); TraceElement copy = element.copy(); clearBackwards(); return copy; } /** * Clear footprints while the size outweigh the size defined in TraceConfig * at changing tab events. {@link TraceConfig#getTraceMaxSize()} */ public void clear() { if (currentSize > TraceConfig.getTraceMaxSize()) { currentIndex = TraceConfig.getTraceMaxSize(); currentSize = TraceConfig.getTraceMaxSize(); for (int i = 0; i < elements.size(); i++) { if (i > TraceConfig.getTraceMaxSize()) { TraceElement element = elements.get(i); element.destroy(); elements.remove(i); } } } } /** * Clear footprints at backwards events. * {@link TraceConfig#getTraceMaxSize()} */ private void clearBackwards() { currentSize--; System.out.println("TraceElementSizeRemove: " + elements.size()); TraceElement element = elements.get(elements.size() - 1); elements.remove(elements.size() - 1); element.destroy(); } /** * Destory footprints */ public void destory() { for (TraceElement element : elements) { element.destroy(); } currentIndex = 0; currentSize = 0; elements.clear(); } public boolean isDestoryed() { return elements.size() == 0; } }