package kr.kdev.dg1s.biowiki.util;
import android.content.Context;
import android.util.Log;
import com.android.volley.VolleyError;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.NoSuchElementException;
import kr.kdev.dg1s.biowiki.BioWiki;
/**
* Created by nbradbury on 6/21/13.
* simple wrapper for Android log calls, enables recording & displaying log
*/
public class AppLog {
public static final String TAG = BioWiki.TAG;
private static final int MAX_ENTRIES = 99;
private static boolean mEnableRecording = false;
private static LogEntryList mLogEntries = new LogEntryList();
private AppLog() {
throw new AssertionError();
}
/*
* defaults to false, pass true to capture log so it can be displayed by AppLogViewerActivity
*/
public static void enableRecording(boolean enable) {
mEnableRecording = enable;
}
public static void v(T tag, String message) {
Log.v(TAG + "-" + tag.toString(), message);
addEntry(tag, LogLevel.v, message);
}
public static void d(T tag, String message) {
Log.d(TAG + "-" + tag.toString(), message);
addEntry(tag, LogLevel.d, message);
}
public static void i(T tag, String message) {
Log.i(TAG + "-" + tag.toString(), message);
addEntry(tag, LogLevel.i, message);
}
public static void w(T tag, String message) {
Log.w(TAG + "-" + tag.toString(), message);
addEntry(tag, LogLevel.w, message);
}
public static void e(T tag, String message) {
Log.e(TAG + "-" + tag.toString(), message);
addEntry(tag, LogLevel.e, message);
}
public static void e(T tag, String message, Throwable tr) {
Log.e(TAG + "-" + tag.toString(), message, tr);
addEntry(tag, LogLevel.e, message + " - exception: " + tr.getMessage());
}
public static void e(T tag, Throwable tr) {
Log.e(TAG + "-" + tag.toString(), tr.getMessage(), tr);
addEntry(tag, LogLevel.e, tr.getMessage());
}
// --------------------------------------------------------------------------------------------------------
public static void e(T tag, VolleyError volleyError) {
if (volleyError == null)
return;
String logText;
if (volleyError.networkResponse == null) {
logText = volleyError.getMessage();
} else {
logText = volleyError.getMessage() + ", status "
+ volleyError.networkResponse.statusCode
+ " - " + volleyError.networkResponse.toString();
}
Log.e(TAG + "-" + tag.toString(), logText, volleyError);
addEntry(tag, LogLevel.w, logText);
}
private static void addEntry(T tag, LogLevel level, String text) {
// skip if recording is disabled (default)
if (!mEnableRecording)
return;
LogEntry entry = new LogEntry();
entry.logLevel = level;
entry.logText = text;
entry.logTag = tag;
mLogEntries.addEntry(entry);
}
/*
* returns entire log as html for display (see AppLogViewerActivity)
*/
public static String toHtml(Context context) {
StringBuilder sb = new StringBuilder();
// add version & device info
sb.append("BioWiki Android version: " + BioWiki.getVersionName(context)).append("<br />")
.append("Android device name: " + DeviceUtils.getInstance().getDeviceName(context)).append("<br />");
Iterator<LogEntry> it = mLogEntries.iterator();
int lineNum = 1;
while (it.hasNext()) {
sb.append("<font color='silver'>")
.append(String.format("%02d", lineNum))
.append("</font> ")
.append(it.next().toHtml())
.append("<br />");
lineNum++;
}
return sb.toString();
}
/*
* returns entire log as plain text
*/
public static String toPlainText(Context context) {
StringBuilder sb = new StringBuilder();
// add version & device info
sb.append("BioWiki Android version: " + BioWiki.getVersionName(context)).append("\n")
.append("Android device name: " + DeviceUtils.getInstance().getDeviceName(context)).append("\n\n");
Iterator<LogEntry> it = mLogEntries.iterator();
int lineNum = 1;
while (it.hasNext()) {
sb.append(String.format("%02d - ", lineNum))
.append(it.next().logText)
.append("\n");
lineNum++;
}
return sb.toString();
}
// T for Tag
public enum T {
READER, EDITOR, MEDIA, NUX, API, STATS, UTILS, NOTIFS, DB, POSTS, COMMENTS, THEMES, TESTS
}
private enum LogLevel {
v, d, i, w, e;
private String toHtmlColor() {
switch (this) {
case v:
return "grey";
case i:
return "black";
case w:
return "purple";
case e:
return "red";
case d:
default:
return "teal";
}
}
}
private static class LogEntry {
LogLevel logLevel;
String logText;
T logTag;
private String toHtml() {
StringBuilder sb = new StringBuilder()
.append("<font color='")
.append(logLevel.toHtmlColor())
.append("'>")
.append("[")
.append(logTag.name())
.append("] ")
.append(logLevel.name())
.append(": ")
.append(logText)
.append("</font>");
return sb.toString();
}
}
private static class LogEntryList extends ArrayList<LogEntry> {
private synchronized boolean addEntry(LogEntry entry) {
if (size() >= MAX_ENTRIES)
removeFirstEntry();
return add(entry);
}
private void removeFirstEntry() {
Iterator<LogEntry> it = iterator();
if (!it.hasNext())
return;
try {
remove(it.next());
} catch (NoSuchElementException e) {
// ignore
}
}
}
}