00cca75c189d143147142af97c8e6c88b6fa9e19
[DHBWCampusApp.git] / app / src / main / java / de / dhbwloe / campusapp / CampusAppExceptionHandler.java
1 package de.dhbwloe.campusapp;
2
3 import android.app.Activity;
4 import android.content.Intent;
5 import android.util.Log;
6
7 import com.loopj.android.http.AsyncHttpClient;
8 import com.loopj.android.http.AsyncHttpResponseHandler;
9 import com.loopj.android.http.RequestParams;
10
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;
23
24 import cz.msebera.android.httpclient.Header;
25
26 /**
27  * Created by pk910 on 11.03.2016.
28  */
29 public class CampusAppExceptionHandler {
30     private static String CRASHLOG_UPLOAD = "http://dev.pk910.de/DHBWCampusCourses";
31     private String localPath;
32
33     private static boolean crashLogWindowOpened = false;
34     private static final Object crashWindowLock = new Object();
35
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)
39
40         synchronized (crashWindowLock) {
41             if(crashLogWindowOpened)
42                 return;
43             crashLogWindowOpened = true;
44         }
45
46         final Writer result = new StringWriter();
47         final PrintWriter printWriter = new PrintWriter(result);
48         e.printStackTrace(printWriter);
49         String stacktrace = result.toString();
50         printWriter.close();
51
52         SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd-HHmmss");
53         String crashdate = dateFormat.format(new Date());
54         String filename = crashdate + ".stacktrace";
55
56         CampusAppContext context;
57         Activity mainActivity = null;
58         try {
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" ;)
62             */
63             context = CampusAppContext.getInstance();
64
65             if(context != null) {
66                 mainActivity = context.getMainActivity();
67             }
68             if(mainActivity != null) {
69                 localPath = mainActivity.getApplicationContext().getFilesDir().getAbsolutePath();
70             }
71         } catch (Exception ex) {}
72
73         if(localPath != null)
74             writeToFile(stacktrace, filename);
75
76         // start crash screen
77         try {
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) {
84         }
85     }
86
87     private void writeToFile(String stacktrace, String filename) {
88         try {
89             BufferedWriter bos = new BufferedWriter(new FileWriter(
90                     localPath + "/" + filename));
91             bos.write(stacktrace);
92             bos.flush();
93             bos.close();
94         } catch (Exception e) {
95             e.printStackTrace();
96         }
97     }
98
99
100     public interface PostProcessingCallback {
101         public void onPostProcessFinished(String response);
102     }
103
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();
108
109         try {
110             BufferedReader br = new BufferedReader(new FileReader(fileName));
111             String line;
112
113             while ((line = br.readLine()) != null) {
114                 stackTrace.append(line);
115                 stackTrace.append('\n');
116             }
117             br.close();
118         }
119         catch (IOException e) {
120             //You'll need to add proper error handling here
121         }
122         return stackTrace.toString();
123     }
124
125     public void postprocessException(String crashdate, String stacktrace, PostProcessingCallback callback) {
126         sendToServer(CRASHLOG_UPLOAD, stacktrace, crashdate, callback);
127     }
128
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
135         client.post(url, params, new AsyncHttpResponseHandler() {
136
137             @Override
138             public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
139                 callback.onPostProcessFinished((responseBody != null ? new String(responseBody) : null));
140             }
141
142             @Override
143             public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
144                 callback.onPostProcessFinished("Failed: "+(responseBody != null ? new String(responseBody) : null));
145             }
146         });
147     }
148
149 }