69298e82af84de9dc6199d09fe64b78e4a0eb0fd
[pub/Android/ownCloud.git] / src / eu / alefzero / owncloud / CrashHandler.java
1 package eu.alefzero.owncloud;
2
3 import java.io.BufferedReader;
4 import java.io.File;
5 import java.io.FileWriter;
6 import java.io.InputStreamReader;
7 import java.io.PrintWriter;
8 import java.io.StringWriter;
9 import java.io.Writer;
10 import java.lang.Thread.UncaughtExceptionHandler;
11 import java.util.LinkedList;
12 import java.util.List;
13
14 import eu.alefzero.owncloud.authenticator.AccountAuthenticator;
15
16 import android.accounts.Account;
17 import android.accounts.AccountManager;
18 import android.content.Context;
19 import android.net.ConnectivityManager;
20 import android.os.Environment;
21 import android.util.Log;
22
23 public class CrashHandler implements UncaughtExceptionHandler {
24
25 private Context mContext;
26 private static final String TAG = "CrashHandler";
27 private static final String crash_filename_template = "crash";
28 private static List<String> TAGS;
29 private UncaughtExceptionHandler defaultUEH;
30
31 static {
32 TAGS = new LinkedList<String>();
33 TAGS.add("AccountAuthenticator");
34 TAGS.add("AccountAuthenticator");
35 TAGS.add("ConnectionCheckerRunnable");
36 TAGS.add("EasySSLSocketFactory");
37 TAGS.add("FileDataStorageManager");
38 TAGS.add("PhotoTakenBroadcastReceiver");
39 TAGS.add("InstantUploadService");
40 TAGS.add("FileDownloader");
41 TAGS.add("FileUploader");
42 TAGS.add("LocationUpdateService");
43 TAGS.add("FileSyncAdapter");
44 TAGS.add("AuthActivity");
45 TAGS.add("OwnCloudPreferences");
46 TAGS.add("FileDetailFragment");
47 TAGS.add("FileListFragment");
48 TAGS.add("ownCloudUploader");
49 TAGS.add("WebdavClient");
50 }
51
52 public CrashHandler(Context context) {
53 mContext = context;
54 defaultUEH = Thread.getDefaultUncaughtExceptionHandler();
55 }
56
57 @Override
58 public void uncaughtException(Thread thread, Throwable ex) {
59 final Writer writer = new StringWriter();
60 final PrintWriter printwriter = new PrintWriter(writer);
61 ex.printStackTrace(printwriter);
62 final String startrace = writer.toString();
63 printwriter.close();
64 File ocdir = new File(Environment.getExternalStorageDirectory().getAbsoluteFile(), "owncloud");
65 ocdir.mkdirs();
66
67 String crash_filename = crash_filename_template + System.currentTimeMillis() + ".txt";
68 File crashfile = new File(ocdir, crash_filename);
69 try {
70 ConnectivityManager cm = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
71 String header = String.format("Model: %s, SDK: %d, Current net: %s\n\n",
72 android.os.Build.MODEL,
73 android.os.Build.VERSION.SDK_INT,
74 cm.getActiveNetworkInfo() != null ? cm.getActiveNetworkInfo().getTypeName() : "NONE");
75 Account account = AccountUtils.getCurrentOwnCloudAccount(mContext);
76 AccountManager am = AccountManager.get(mContext);
77 String header2 = String.format("Account: %s, OCUrl: %s, OCVersion: %s\n\n",
78 account.name,
79 am.getUserData(account, AccountAuthenticator.KEY_OC_BASE_URL),
80 am.getUserData(account, AccountAuthenticator.KEY_OC_VERSION));
81
82 crashfile.createNewFile();
83 FileWriter fw = new FileWriter(crashfile);
84 fw.write(header);
85 fw.write(header2);
86 fw.write(startrace);
87 fw.write("\n\n");
88
89 String logcat = "logcat -d *:S ";
90
91 for (String s : TAGS)
92 logcat += s + ":V ";
93
94 Process process = Runtime.getRuntime().exec(logcat);
95 BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));
96 String logline;
97 while ((logline = br.readLine()) != null)
98 fw.write(logline+"\n");
99
100 br.close();
101 fw.close();
102
103 } catch (Exception e1) {
104 Log.e(TAG, "Crash handler failed to run logcat, WTF!");
105 defaultUEH.uncaughtException(thread, ex);
106 return;
107 }
108 }
109 }