package in.vesely.eclub.yodaqa;
import android.os.Looper;
import java.io.Serializable;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
//This code is modified version of the com.github.anrwatchdog.ANRError to support serialization which is needed for ACRA
public class ANRError extends Error implements Serializable {
private static class $ implements Serializable {
private static final long serialVersionUID = 1L;
private final String _name;
private final StackTraceElement[] _stackTrace;
private class _Thread extends Throwable implements Serializable {
private static final long serialVersionUID = 1L;
private _Thread(_Thread other) {
super(_name, other);
}
@Override
public Throwable fillInStackTrace() {
setStackTrace(_stackTrace);
return this;
}
}
private $(String name, StackTraceElement[] stackTrace) {
_name = name;
_stackTrace = stackTrace;
}
}
private static final long serialVersionUID = 1L;
private ANRError($._Thread st, Map<Thread, StackTraceElement[]> stackTraces) {
super("Application Not Responding", st);
}
@Override
public Throwable fillInStackTrace() {
setStackTrace(new StackTraceElement[]{});
return this;
}
static ANRError New(String prefix, boolean logThreadsWithoutStackTrace) {
final Thread mainThread = Looper.getMainLooper().getThread();
final Map<Thread, StackTraceElement[]> stackTraces = new TreeMap<Thread, StackTraceElement[]>(new Comparator<Thread>() {
@Override
public int compare(Thread lhs, Thread rhs) {
if (lhs == rhs)
return 0;
if (lhs == mainThread)
return 1;
if (rhs == mainThread)
return -1;
return rhs.getName().compareTo(lhs.getName());
}
});
for (Map.Entry<Thread, StackTraceElement[]> entry : Thread.getAllStackTraces().entrySet())
if (entry.getKey() == mainThread || (entry.getKey().getName().startsWith(prefix) && (logThreadsWithoutStackTrace || entry.getValue().length > 0)))
stackTraces.put(entry.getKey(), entry.getValue());
$._Thread tst = null;
for (Map.Entry<Thread, StackTraceElement[]> entry : stackTraces.entrySet())
tst = new $(entry.getKey().getName(), entry.getValue()).new _Thread(tst);
return new ANRError(tst, stackTraces);
}
static ANRError NewMainOnly() {
final Thread mainThread = Looper.getMainLooper().getThread();
final StackTraceElement[] mainStackTrace = mainThread.getStackTrace();
final HashMap<Thread, StackTraceElement[]> stackTraces = new HashMap<Thread, StackTraceElement[]>(1);
stackTraces.put(mainThread, mainStackTrace);
return new ANRError(new $(mainThread.getName(), mainStackTrace).new _Thread(null), stackTraces);
}
}