/*
* @copyright 2012 Philip Warner
* @license GNU General Public License
*
* This file is part of Book Catalogue.
*
* Book Catalogue is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Book Catalogue is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Book Catalogue. If not, see <http://www.gnu.org/licenses/>.
*/
package com.eleybourn.bookcatalogue.debug;
import java.util.Date;
import org.acra.ErrorReporter;
import com.eleybourn.bookcatalogue.utils.Utils;
public class Tracker {
public enum States {
Enter,
Exit,
Running
}
private static class Event {
public String activityClass;
public String action;
public States state;
public Date date;
public Event(Object a, String action, States state) {
activityClass = a.getClass().getSimpleName();
this.action = action;
this.state = state;
date = new Date();
}
public String getInfo() {
return Utils.toSqlDateTime(date) + ": " + activityClass + " " + action + " " + state;
}
}
private final static int K_MAX_EVENTS = 100;
private static Event[] mEventBuffer = new Event[K_MAX_EVENTS];
private static int mNextEventBufferPos = 0;
public static void enterOnActivityCreated(Object a) {
handleEvent(a,"OnActivityCreated (" + a.toString() + ")", States.Enter);
}
public static void exitOnActivityCreated(Object a) {
handleEvent(a,"OnActivityCreated (" + a.toString() + ")", States.Exit);
}
public static void enterOnActivityResult(Object a, int requestCode, int resultCode) {
handleEvent(a,"OnActivityResult[" + requestCode + "," + resultCode + "] (" + a.toString() + ")", States.Enter);
}
public static void exitOnActivityResult(Object a, int requestCode, int resultCode) {
handleEvent(a,"OnActivityResult[" + requestCode + "," + resultCode + "] (" + a.toString() + ")", States.Exit);
}
public static void enterOnCreate(Object a) {
handleEvent(a,"OnCreate (" + a.toString() + ")", States.Enter);
}
public static void exitOnCreate(Object a) {
handleEvent(a,"OnCreate (" + a.toString() + ")", States.Exit);
}
public static void enterOnCreateView(Object a) {
handleEvent(a,"OnCreateView (" + a.toString() + ")", States.Enter);
}
public static void exitOnCreateView(Object a) {
handleEvent(a,"OnCreateView (" + a.toString() + ")", States.Exit);
}
public static void enterOnDestroy(Object a) {
handleEvent(a,"OnDestroy", States.Enter);
}
public static void exitOnDestroy(Object a) {
handleEvent(a,"OnDestroy", States.Exit);
}
public static void enterOnPause(Object a) {
handleEvent(a,"OnPause (" + a.toString() + ")", States.Enter);
}
public static void exitOnPause(Object a) {
handleEvent(a,"OnPause (" + a.toString() + ")", States.Exit);
}
public static void enterOnResume(Object a) {
handleEvent(a,"OnResume (" + a.toString() + ")", States.Enter);
}
public static void exitOnResume(Object a) {
handleEvent(a,"OnResume (" + a.toString() + ")", States.Exit);
}
public static void enterOnSaveInstanceState(Object a) {
handleEvent(a,"OnSaveInstanceState", States.Enter);
}
public static void exitOnSaveInstanceState(Object a) {
handleEvent(a,"OnSaveInstanceState", States.Exit);
}
public static void enterOnRestoreInstanceState(Object a) {
handleEvent(a,"OnRestoreInstanceState", States.Enter);
}
public static void exitOnRestoreInstanceState(Object a) {
handleEvent(a,"OnRestoreInstanceState", States.Exit);
}
public static void handleEvent(Object o, String name, States type) {
Event e = new Event(o, name, type);
mEventBuffer[mNextEventBufferPos] = e;
ErrorReporter.getInstance().putCustomData("History-" + mNextEventBufferPos, e.getInfo());
mNextEventBufferPos = (mNextEventBufferPos + 1) % K_MAX_EVENTS;
}
public static String getEventsInfo() {
StringBuilder s = new StringBuilder("Recent Events:\n");
int pos = mNextEventBufferPos;
for(int i = 0; i < K_MAX_EVENTS; i++) {
int index = (pos + i) % K_MAX_EVENTS;
Event e = mEventBuffer[index];
if (e != null) {
s.append(e.getInfo());
s.append("\n");
}
}
return s.toString();
}
}