App Version zum Crashlog hinzugefügt
[DHBWCampusApp.git] / app / src / main / java / de / dhbwloe / campusapp / CampusAppCrashHandler.java
index 7f66e1c28e8ddf7b9a5707ad8d0ac4f5b1626b43..9ac7e4cbaad2c6a4b326c8714fbe98659f18bd51 100644 (file)
 package de.dhbwloe.campusapp;
 
 import android.app.Activity;
-import android.os.Bundle;
-import android.view.Window;
+import android.content.Intent;
+import android.util.Log;
+
+import com.loopj.android.http.AsyncHttpClient;
+import com.loopj.android.http.AsyncHttpResponseHandler;
+import com.loopj.android.http.RequestParams;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.io.Writer;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import cz.msebera.android.httpclient.Header;
 
 /**
  * Created by pk910 on 11.03.2016.
  */
-public class CampusAppCrashHandler extends Activity {
+public class CampusAppCrashHandler {
+    private static String CRASHLOG_UPLOAD = "http://dev.pk910.de/DHBWCampusCourses";
+    private String localPath;
+
+    private static boolean crashLogWindowOpened = false;
+    private static final Object crashWindowLock = new Object();
+
+    public void handleUncaughtException(Thread thread, Throwable e) {
+        // automatically send crash log to my server for debuggging.
+        // disable this for productive use! (CampusAppContext.DEBUG)
+
+        synchronized (crashWindowLock) {
+            if(crashLogWindowOpened)
+                return;
+            crashLogWindowOpened = true;
+        }
+
+        final Writer result = new StringWriter();
+        final PrintWriter printWriter = new PrintWriter(result);
+        e.printStackTrace(printWriter);
+        String stacktrace = result.toString();
+        printWriter.close();
+
+        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd-HHmmss");
+        String crashdate = dateFormat.format(new Date());
+        String filename = crashdate + ".stacktrace";
+
+        CampusAppContext context;
+        Activity mainActivity = null;
+        try {
+            /*Wir greifen nun auf einen Code zurück, aus welchem die unbehandelte Exception stammt.
+            * Dies ist womöglich keine gute Idee, daher müssen wir sämmtliche Exceptions abfangen und verwerfen (Exception inception :D)
+            * und hoffen, dass die App noch so weit "funktioniert" ;)
+            */
+            context = CampusAppContext.getInstance();
+
+            if(context != null) {
+                mainActivity = context.getMainActivity();
+            }
+            if(mainActivity != null) {
+                localPath = mainActivity.getApplicationContext().getFilesDir().getAbsolutePath();
+            }
+        } catch (Exception ex) {}
+
+        if(localPath != null)
+            writeToFile(stacktrace, filename);
+
+        // start crash screen
+        try {
+            Intent intent = new Intent();
+            intent.setAction("de.dhbw.campusapp.CRASH_LOG");
+            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // required when starting from Application
+            intent.putExtra("crashdate", crashdate);
+            mainActivity.startActivity(intent);
+        } catch (Exception ex) {
+        }
+    }
 
-    @Override
-    public void onCreate(Bundle savedInstanceState)
-    {
-        super.onCreate(savedInstanceState);
-        requestWindowFeature(Window.FEATURE_NO_TITLE); // make a dialog without a titlebar
-        setContentView(R.layout.crash_log);
+    private void writeToFile(String stacktrace, String filename) {
+        try {
+            BufferedWriter bos = new BufferedWriter(new FileWriter(
+                    localPath + "/" + filename));
+            bos.write(stacktrace);
+            bos.flush();
+            bos.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+
+    public interface PostProcessingCallback {
+        public void onPostProcessFinished(String response);
+    }
 
-        Bundle extras = this.getIntent().getExtras();
-        String crashdate = (extras != null ? extras.getString("crashdate") : null);
+    public String getCrashStacktrace(Activity crashLogScreen, String crashdate) {
+        localPath = crashLogScreen.getApplicationContext().getFilesDir().getAbsolutePath();
+        String fileName = localPath + "/" + crashdate + ".stacktrace";
+        StringBuilder stackTrace = new StringBuilder();
+
+        try {
+            BufferedReader br = new BufferedReader(new FileReader(fileName));
+            String line;
+
+            while ((line = br.readLine()) != null) {
+                stackTrace.append(line);
+                stackTrace.append('\n');
+            }
+            br.close();
+        }
+        catch (IOException e) {
+            //You'll need to add proper error handling here
+        }
+        return stackTrace.toString();
+    }
 
-        CampusAppExceptionHandler exceptionHandler = new CampusAppExceptionHandler();
-        exceptionHandler.postprocessException(this, crashdate);
+    public void postprocessException(String crashdate, String stacktrace, PostProcessingCallback callback) {
+        sendToServer(CRASHLOG_UPLOAD, stacktrace, crashdate, callback);
     }
+
+    private void sendToServer(String url, String stacktrace, String crashdate, final PostProcessingCallback callback) {
+        AsyncHttpClient client = new AsyncHttpClient();
+        RequestParams params = new RequestParams();
+        params.add("stacktrace", stacktrace);
+        params.add("crashdate", crashdate);
+        params.add("version", CampusAppContext.APPVERSION);
+
+        client.post(url, params, new AsyncHttpResponseHandler() {
+
+            @Override
+            public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
+                callback.onPostProcessFinished((responseBody != null ? new String(responseBody) : null));
+            }
+
+            @Override
+            public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
+                callback.onPostProcessFinished("Failed: "+(responseBody != null ? new String(responseBody) : null));
+            }
+        });
+    }
+
 }