/** originally used the nullwire code, tweaked out for carcast. */
package com.jadn.cc.trace;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.util.Log;
public class ExceptionHandler {
private static boolean busySendingTraces;
private static String[] stackTraceFileList = null;
public static void clearStackTraceCache() {
stackTraceFileList = null;
}
public static void setTraceData(Context context){
PackageManager pm = context.getPackageManager();
try {
PackageInfo pi;
// Version
pi = pm.getPackageInfo(context.getPackageName(), 0);
TraceData.APP_VERSION = pi.versionName;
// Package name
TraceData.APP_PACKAGE = pi.packageName;
// Files dir for storing the stack traces
TraceData.FILES_PATH = context.getFilesDir().getAbsolutePath();
// Device model
TraceData.PHONE_MODEL = android.os.Build.MODEL;
// Android version
TraceData.ANDROID_VERSION = android.os.Build.VERSION.RELEASE;
} catch (NameNotFoundException e) {
e.printStackTrace();
}
}
public static boolean register(Context context) {
setTraceData(context);
boolean stackTracesFound = false;
// We'll return true if any stack traces were found
if (searchForStackTraces().length > 0) {
stackTracesFound = true;
}
// we register from our application and also from our service.
// lets not send stacktraces twice.
if (!busySendingTraces) {
busySendingTraces = true;
new Thread() {
@Override
public void run() {
// First of all transmit any stack traces that may be lying
// around
submitStackTraces();
UncaughtExceptionHandler currentHandler = Thread.getDefaultUncaughtExceptionHandler();
if (currentHandler != null) {
Log.d(ExceptionHandler.class.getName(), "current handler class=" + currentHandler.getClass().getName());
}
// don't register again if already registered
if (!(currentHandler instanceof DefaultExceptionHandler)) {
// Register default exceptions handler
Thread.setDefaultUncaughtExceptionHandler(new DefaultExceptionHandler(currentHandler));
}
busySendingTraces = false;
}
}.start();
}
return stackTracesFound;
}
private static String[] searchForStackTraces() {
if (stackTraceFileList != null) {
return stackTraceFileList;
}
File dir = new File(TraceData.FILES_PATH + "/");
// Try to create the files folder if it doesn't exist
dir.mkdir();
// Filter for ".stacktrace" files
FilenameFilter filter = new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.endsWith(".stacktrace");
}
};
return (stackTraceFileList = dir.list(filter));
}
public static void submitStackTraces() {
try {
String[] list = searchForStackTraces();
if (list != null && list.length > 0) {
for (int i = 0; i < list.length; i++) {
String filePath = TraceData.FILES_PATH + "/" + list[i];
// Extract the version from the filename:
// "packagename-version-...."
String version = list[i].split("-")[0];
// Read contents of stacktrace
StringBuilder contents = new StringBuilder();
BufferedReader input = new BufferedReader(new FileReader(filePath));
String traceTime = input.readLine();
String line = null;
while ((line = input.readLine()) != null) {
contents.append(line);
contents.append('\n');
}
input.close();
String stacktrace;
stacktrace = contents.toString();
Log.d(ExceptionHandler.class.getName(), "Transmitting stack trace: " + stacktrace);
// Transmit stack trace with POST request
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(TraceData.URL);
List<NameValuePair> nvps = new ArrayList<NameValuePair>();
nvps.add(new BasicNameValuePair("traceTime", traceTime));
nvps.add(new BasicNameValuePair("now", Long.toString(System.currentTimeMillis())));
nvps.add(new BasicNameValuePair("package_name", TraceData.APP_PACKAGE));
nvps.add(new BasicNameValuePair("package_version", version));
nvps.add(new BasicNameValuePair("phone_model", TraceData.PHONE_MODEL));
nvps.add(new BasicNameValuePair("android_version", TraceData.ANDROID_VERSION));
nvps.add(new BasicNameValuePair("stacktrace", stacktrace));
httpPost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));
// We don't care about the response, so we just hope it went
// well and on with it
httpClient.execute(httpPost);
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
String[] list = searchForStackTraces();
for (int i = 0; i < list.length; i++) {
File file = new File(TraceData.FILES_PATH + "/" + list[i]);
file.delete();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}