From 5f8f4f9e3b3afbe3768de3e8ae14ce2a1dbeec39 Mon Sep 17 00:00:00 2001 From: TwistedUmbrella Date: Mon, 3 Feb 2014 14:55:08 -0500 Subject: [PATCH] Add a handler to grab uncaught exceptions to submit later --- .../com/reicast/emulator/MainActivity.java | 27 ++++++++++++++++--- .../src/com/reicast/emulator/UploadLogs.java | 20 +++++++++++--- 2 files changed, 41 insertions(+), 6 deletions(-) diff --git a/shell/android/src/com/reicast/emulator/MainActivity.java b/shell/android/src/com/reicast/emulator/MainActivity.java index 83c660ed7..3a197efd0 100644 --- a/shell/android/src/com/reicast/emulator/MainActivity.java +++ b/shell/android/src/com/reicast/emulator/MainActivity.java @@ -1,6 +1,7 @@ package com.reicast.emulator; import java.io.File; +import java.lang.Thread.UncaughtExceptionHandler; import android.annotation.SuppressLint; import android.app.AlertDialog; @@ -9,6 +10,7 @@ import android.content.Intent; import android.content.SharedPreferences; import android.content.res.Configuration; import android.net.Uri; +import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; import android.os.Environment; @@ -16,14 +18,12 @@ import android.preference.PreferenceManager; import android.support.v4.app.Fragment; import android.util.Log; import android.view.KeyEvent; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnTouchListener; import android.widget.TextView; +import android.widget.Toast; import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu; import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu.OnOpenListener; @@ -39,6 +39,8 @@ public class MainActivity extends SlidingFragmentActivity implements private TextView menuHeading; private SlidingMenu sm; + + private UncaughtExceptionHandler mUEHandler; @Override public void onCreate(Bundle savedInstanceState) { @@ -49,6 +51,25 @@ public class MainActivity extends SlidingFragmentActivity implements mPrefs = PreferenceManager.getDefaultSharedPreferences(this); home_directory = mPrefs.getString("home_directory", home_directory); JNIdc.config(home_directory); + + mUEHandler = new Thread.UncaughtExceptionHandler() { + public void uncaughtException(Thread t, Throwable error) { + if (error != null) { + Toast.makeText(MainActivity.this, + getString(R.string.platform), + Toast.LENGTH_SHORT).show(); + UploadLogs mUploadLogs = new UploadLogs(MainActivity.this); + mUploadLogs.setUnhandled(error.getMessage()); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { + mUploadLogs.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, + home_directory); + } else { + mUploadLogs.execute(home_directory); + } + } + } + }; + Thread.setDefaultUncaughtExceptionHandler(mUEHandler); // Check that the activity is using the layout version with // the fragment_container FrameLayout diff --git a/shell/android/src/com/reicast/emulator/UploadLogs.java b/shell/android/src/com/reicast/emulator/UploadLogs.java index 0a3a3e9a6..f88a42550 100644 --- a/shell/android/src/com/reicast/emulator/UploadLogs.java +++ b/shell/android/src/com/reicast/emulator/UploadLogs.java @@ -31,6 +31,8 @@ public class UploadLogs extends AsyncTask { public static final String JB = "JellyBean"; public static final String KK = "KitKat"; public static final String NF = "Not Found"; + + private String unHandledIOE; private Context mContext; @@ -100,6 +102,10 @@ public class UploadLogs extends AsyncTask { return "ERROR: " + ex.getMessage(); } } + + public void setUnhandled(String unHandledIOE) { + this.unHandledIOE = unHandledIOE; + } @Override protected String doInBackground(String... params) { @@ -107,15 +113,23 @@ public class UploadLogs extends AsyncTask { String logOuput = params[0] + "/" + currentTime + ".txt"; Process mLogcatProc = null; BufferedReader reader = null; + final StringBuilder log = new StringBuilder(); + String separator = System.getProperty("line.separator"); + log.append(discoverCPUData()); + if (unHandledIOE != null) { + log.append(separator); + log.append(separator); + log.append("Unhandled Exceptions"); + log.append(separator); + log.append(separator); + log.append(unHandledIOE); + } try { mLogcatProc = Runtime.getRuntime().exec( new String[] { "logcat", "-d", "AndroidRuntime:E *:S" }); reader = new BufferedReader(new InputStreamReader( mLogcatProc.getInputStream())); String line; - final StringBuilder log = new StringBuilder(); - String separator = System.getProperty("line.separator"); - log.append(discoverCPUData()); log.append(separator); log.append(separator); log.append("AndroidRuntime Output");