1 package de.dhbwloe.campusapp;
3 import android.app.Activity;
4 import android.content.Intent;
5 import android.util.Log;
7 import com.loopj.android.http.AsyncHttpClient;
8 import com.loopj.android.http.AsyncHttpResponseHandler;
9 import com.loopj.android.http.RequestParams;
11 import java.io.BufferedReader;
12 import java.io.BufferedWriter;
13 import java.io.FileReader;
14 import java.io.FileWriter;
15 import java.io.IOException;
16 import java.io.PrintWriter;
17 import java.io.StringWriter;
18 import java.io.Writer;
19 import java.text.SimpleDateFormat;
20 import java.util.ArrayList;
21 import java.util.Date;
22 import java.util.List;
24 import cz.msebera.android.httpclient.Header;
27 * Created by pk910 on 11.03.2016.
29 public class CampusAppCrashHandler {
30 private static String CRASHLOG_UPLOAD = "http://dev.pk910.de/DHBWCampusCourses";
31 private String localPath;
33 private static boolean crashLogWindowOpened = false;
34 private static final Object crashWindowLock = new Object();
36 public void handleUncaughtException(Thread thread, Throwable e) {
37 // automatically send crash log to my server for debuggging.
38 // disable this for productive use! (CampusAppContext.DEBUG)
40 synchronized (crashWindowLock) {
41 if(crashLogWindowOpened)
43 crashLogWindowOpened = true;
46 final Writer result = new StringWriter();
47 final PrintWriter printWriter = new PrintWriter(result);
48 e.printStackTrace(printWriter);
49 String stacktrace = result.toString();
52 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd-HHmmss");
53 String crashdate = dateFormat.format(new Date());
54 String filename = crashdate + ".stacktrace";
56 CampusAppContext context;
57 Activity mainActivity = null;
59 /*Wir greifen nun auf einen Code zurück, aus welchem die unbehandelte Exception stammt.
60 * Dies ist womöglich keine gute Idee, daher müssen wir sämmtliche Exceptions abfangen und verwerfen (Exception inception :D)
61 * und hoffen, dass die App noch so weit "funktioniert" ;)
63 context = CampusAppContext.getInstance();
66 mainActivity = context.getMainActivity();
68 if(mainActivity != null) {
69 localPath = mainActivity.getApplicationContext().getFilesDir().getAbsolutePath();
71 } catch (Exception ex) {}
74 writeToFile(stacktrace, filename);
78 Intent intent = new Intent();
79 intent.setAction("de.dhbw.campusapp.CRASH_LOG");
80 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // required when starting from Application
81 intent.putExtra("crashdate", crashdate);
82 mainActivity.startActivity(intent);
83 } catch (Exception ex) {
87 private void writeToFile(String stacktrace, String filename) {
89 BufferedWriter bos = new BufferedWriter(new FileWriter(
90 localPath + "/" + filename));
91 bos.write(stacktrace);
94 } catch (Exception e) {
100 public interface PostProcessingCallback {
101 public void onPostProcessFinished(String response);
104 public String getCrashStacktrace(Activity crashLogScreen, String crashdate) {
105 localPath = crashLogScreen.getApplicationContext().getFilesDir().getAbsolutePath();
106 String fileName = localPath + "/" + crashdate + ".stacktrace";
107 StringBuilder stackTrace = new StringBuilder();
110 BufferedReader br = new BufferedReader(new FileReader(fileName));
113 while ((line = br.readLine()) != null) {
114 stackTrace.append(line);
115 stackTrace.append('\n');
119 catch (IOException e) {
120 //You'll need to add proper error handling here
122 return stackTrace.toString();
125 public void postprocessException(String crashdate, String stacktrace, PostProcessingCallback callback) {
126 sendToServer(CRASHLOG_UPLOAD, stacktrace, crashdate, callback);
129 private void sendToServer(String url, String stacktrace, String crashdate, final PostProcessingCallback callback) {
130 AsyncHttpClient client = new AsyncHttpClient();
131 RequestParams params = new RequestParams();
132 params.add("stacktrace", stacktrace);
133 params.add("crashdate", crashdate);
134 params.add("version", CampusAppContext.APPVERSION);
136 client.post(url, params, new AsyncHttpResponseHandler() {
139 public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
140 callback.onPostProcessFinished((responseBody != null ? new String(responseBody) : null));
144 public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
145 callback.onPostProcessFinished("Failed: "+(responseBody != null ? new String(responseBody) : null));