|
@@ -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<String> TAGS;
|
|
|
+ private UncaughtExceptionHandler defaultUEH;
|
|
|
+
|
|
|
+ static {
|
|
|
+ TAGS = new LinkedList<String>();
|
|
|
+ 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;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|