crashlog handler
authorBartek Przybylski <bart.p.pl@gmail.com>
Tue, 12 Jun 2012 20:58:07 +0000 (22:58 +0200)
committerBartek Przybylski <bart.p.pl@gmail.com>
Tue, 12 Jun 2012 20:58:07 +0000 (22:58 +0200)
AndroidManifest.xml
src/eu/alefzero/owncloud/CrashHandler.java [new file with mode: 0644]
src/eu/alefzero/owncloud/CrashlogSendActivity.java [new file with mode: 0644]
src/eu/alefzero/owncloud/ui/activity/FileDisplayActivity.java

index bbd5fb2..5e2cdee 100644 (file)
@@ -32,6 +32,8 @@
     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />\r
     <uses-permission android:name="android.permission.BROADCAST_STICKY" />\r
     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />\r
     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />\r
     <uses-permission android:name="android.permission.BROADCAST_STICKY" />\r
     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />\r
+    <uses-permission android:name="android.permission.READ_PHONE_STATE" />\r
+    <uses-permission android:name="android.permission.READ_LOGS" />\r
 \r
     <uses-sdk\r
         android:minSdkVersion="8"\r
 \r
     <uses-sdk\r
         android:minSdkVersion="8"\r
diff --git a/src/eu/alefzero/owncloud/CrashHandler.java b/src/eu/alefzero/owncloud/CrashHandler.java
new file mode 100644 (file)
index 0000000..69298e8
--- /dev/null
@@ -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;
+        }
+    }
+}
diff --git a/src/eu/alefzero/owncloud/CrashlogSendActivity.java b/src/eu/alefzero/owncloud/CrashlogSendActivity.java
new file mode 100644 (file)
index 0000000..b921760
--- /dev/null
@@ -0,0 +1,7 @@
+package eu.alefzero.owncloud;
+
+import com.actionbarsherlock.app.SherlockActivity;
+
+public class CrashlogSendActivity extends SherlockActivity {
+
+}
index 5c02703..0f2daf0 100644 (file)
 \r
 package eu.alefzero.owncloud.ui.activity;\r
 \r
 \r
 package eu.alefzero.owncloud.ui.activity;\r
 \r
+import java.io.BufferedReader;\r
 import java.io.File;\r
 import java.io.File;\r
+import java.io.InputStreamReader;\r
+import java.lang.Thread.UncaughtExceptionHandler;\r
 import java.net.URLEncoder;\r
 import java.util.ArrayList;\r
 \r
 import java.net.URLEncoder;\r
 import java.util.ArrayList;\r
 \r
@@ -38,6 +41,7 @@ import android.database.Cursor;
 import android.net.Uri;\r
 import android.os.Bundle;\r
 import android.provider.MediaStore;\r
 import android.net.Uri;\r
 import android.os.Bundle;\r
 import android.provider.MediaStore;\r
+import android.telephony.TelephonyManager;\r
 import android.util.Log;\r
 import android.view.View;\r
 import android.view.ViewGroup;\r
 import android.util.Log;\r
 import android.view.View;\r
 import android.view.ViewGroup;\r
@@ -55,6 +59,7 @@ import com.actionbarsherlock.view.MenuItem;
 import com.actionbarsherlock.view.Window;\r
 \r
 import eu.alefzero.owncloud.AccountUtils;\r
 import com.actionbarsherlock.view.Window;\r
 \r
 import eu.alefzero.owncloud.AccountUtils;\r
+import eu.alefzero.owncloud.CrashHandler;\r
 import eu.alefzero.owncloud.R;\r
 import eu.alefzero.owncloud.authenticator.AccountAuthenticator;\r
 import eu.alefzero.owncloud.datamodel.DataStorageManager;\r
 import eu.alefzero.owncloud.R;\r
 import eu.alefzero.owncloud.authenticator.AccountAuthenticator;\r
 import eu.alefzero.owncloud.datamodel.DataStorageManager;\r
@@ -96,7 +101,9 @@ public class FileDisplayActivity extends SherlockFragmentActivity implements
 \r
         requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);\r
         setProgressBarIndeterminateVisibility(false);\r
 \r
         requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);\r
         setProgressBarIndeterminateVisibility(false);\r
-        \r
+\r
+        Thread.setDefaultUncaughtExceptionHandler(new CrashHandler(getApplicationContext()));\r
+\r
         if(savedInstanceState != null){\r
             mCurrentDir = (OCFile) savedInstanceState.getParcelable(KEY_CURRENT_DIR);\r
         }\r
         if(savedInstanceState != null){\r
             mCurrentDir = (OCFile) savedInstanceState.getParcelable(KEY_CURRENT_DIR);\r
         }\r
@@ -558,6 +565,5 @@ public class FileDisplayActivity extends SherlockFragmentActivity implements
             intent.putExtra("authorities", new String[] { AccountAuthenticator.AUTH_TOKEN_TYPE });\r
             startActivity(intent);\r
         }\r
             intent.putExtra("authorities", new String[] { AccountAuthenticator.AUTH_TOKEN_TYPE });\r
             startActivity(intent);\r
         }\r
-    }\r
-\r
+    }    \r
 }\r
 }\r