+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;
+ }
+ }
+}