X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/blobdiff_plain/6a4fb7715986fcd56699ed7c1d1a94c67525e566..efc9808d9ab46612d7bcc0d76b3c151bfb92861a:/src/eu/alefzero/owncloud/CrashHandler.java diff --git a/src/eu/alefzero/owncloud/CrashHandler.java b/src/eu/alefzero/owncloud/CrashHandler.java new file mode 100644 index 00000000..69298e82 --- /dev/null +++ b/src/eu/alefzero/owncloud/CrashHandler.java @@ -0,0 +1,109 @@ +package eu.alefzero.owncloud; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileWriter; +import java.io.InputStreamReader; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.io.Writer; +import java.lang.Thread.UncaughtExceptionHandler; +import java.util.LinkedList; +import java.util.List; + +import eu.alefzero.owncloud.authenticator.AccountAuthenticator; + +import android.accounts.Account; +import android.accounts.AccountManager; +import android.content.Context; +import android.net.ConnectivityManager; +import android.os.Environment; +import android.util.Log; + +public class CrashHandler implements UncaughtExceptionHandler { + + private Context mContext; + private static final String TAG = "CrashHandler"; + private static final String crash_filename_template = "crash"; + private static List TAGS; + private UncaughtExceptionHandler defaultUEH; + + static { + TAGS = new LinkedList(); + TAGS.add("AccountAuthenticator"); + TAGS.add("AccountAuthenticator"); + TAGS.add("ConnectionCheckerRunnable"); + TAGS.add("EasySSLSocketFactory"); + TAGS.add("FileDataStorageManager"); + TAGS.add("PhotoTakenBroadcastReceiver"); + TAGS.add("InstantUploadService"); + TAGS.add("FileDownloader"); + TAGS.add("FileUploader"); + TAGS.add("LocationUpdateService"); + TAGS.add("FileSyncAdapter"); + TAGS.add("AuthActivity"); + TAGS.add("OwnCloudPreferences"); + TAGS.add("FileDetailFragment"); + TAGS.add("FileListFragment"); + TAGS.add("ownCloudUploader"); + TAGS.add("WebdavClient"); + } + + public CrashHandler(Context context) { + mContext = context; + defaultUEH = Thread.getDefaultUncaughtExceptionHandler(); + } + + @Override + public void uncaughtException(Thread thread, Throwable ex) { + final Writer writer = new StringWriter(); + final PrintWriter printwriter = new PrintWriter(writer); + ex.printStackTrace(printwriter); + final String startrace = writer.toString(); + printwriter.close(); + File ocdir = new File(Environment.getExternalStorageDirectory().getAbsoluteFile(), "owncloud"); + ocdir.mkdirs(); + + String crash_filename = crash_filename_template + System.currentTimeMillis() + ".txt"; + File crashfile = new File(ocdir, crash_filename); + try { + ConnectivityManager cm = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE); + String header = String.format("Model: %s, SDK: %d, Current net: %s\n\n", + android.os.Build.MODEL, + android.os.Build.VERSION.SDK_INT, + cm.getActiveNetworkInfo() != null ? cm.getActiveNetworkInfo().getTypeName() : "NONE"); + Account account = AccountUtils.getCurrentOwnCloudAccount(mContext); + AccountManager am = AccountManager.get(mContext); + String header2 = String.format("Account: %s, OCUrl: %s, OCVersion: %s\n\n", + account.name, + am.getUserData(account, AccountAuthenticator.KEY_OC_BASE_URL), + am.getUserData(account, AccountAuthenticator.KEY_OC_VERSION)); + + crashfile.createNewFile(); + FileWriter fw = new FileWriter(crashfile); + fw.write(header); + fw.write(header2); + fw.write(startrace); + fw.write("\n\n"); + + String logcat = "logcat -d *:S "; + + for (String s : TAGS) + logcat += s + ":V "; + + Process process = Runtime.getRuntime().exec(logcat); + BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream())); + String logline; + while ((logline = br.readLine()) != null) + fw.write(logline+"\n"); + + br.close(); + fw.close(); + + } catch (Exception e1) { + Log.e(TAG, "Crash handler failed to run logcat, WTF!"); + defaultUEH.uncaughtException(thread, ex); + return; + } + } +}