From b22466ee66839b1e4f237a552e2749e27ffa8a68 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Daniel=20Mart=C3=AD?= <mvdan@mvdan.cc>
Date: Sat, 26 Dec 2015 19:16:47 +0100
Subject: [PATCH] Add opt-in crash reporting via ACRA

Fixes #398.
---
 CHANGELOG.md                                 |  2 ++
 F-Droid/AndroidManifest.xml                  |  6 ++++++
 F-Droid/build.gradle                         |  4 ++++
 F-Droid/res/values/strings.xml               |  6 ++++++
 F-Droid/src/org/fdroid/fdroid/FDroidApp.java | 10 ++++++++++
 5 files changed, 28 insertions(+)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 3281842b0..f88235c3a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,7 @@
 ### 0.98 (upcoming release)
 
+* Add opt-in crash reporting via ACRA
+
 * Add support for HTTP basic authentication of repos
 
 * Fix repo updating on older devices with little memory
diff --git a/F-Droid/AndroidManifest.xml b/F-Droid/AndroidManifest.xml
index 7237aea99..76f6e7659 100644
--- a/F-Droid/AndroidManifest.xml
+++ b/F-Droid/AndroidManifest.xml
@@ -376,6 +376,12 @@
                 android:name="android.support.PARENT_ACTIVITY"
                 android:value=".FDroid" />
         </activity>
+        <activity android:name="org.acra.CrashReportDialog"
+            android:theme="@style/AlertDialogThemeDark"
+            android:process=":error_report"
+            android:launchMode="singleInstance"
+            android:excludeFromRecents="true"
+            android:finishOnTaskLaunch="true" />
         <activity
             android:label="@string/menu_swap"
             android:name=".views.swap.SwapWorkflowActivity"
diff --git a/F-Droid/build.gradle b/F-Droid/build.gradle
index 00924c76c..5a64b2160 100644
--- a/F-Droid/build.gradle
+++ b/F-Droid/build.gradle
@@ -20,6 +20,9 @@ dependencies {
     compile 'cc.mvdan.accesspoint:library:0.1.3'
     compile 'commons-net:commons-net:3.4'
     compile 'org.openhab.jmdns:jmdns:3.4.2'
+    compile('ch.acra:acra:4.7.0') {
+        exclude module: 'support-v4'
+    }
 
     androidTestCompile 'commons-io:commons-io:2.2'
 }
@@ -71,6 +74,7 @@ if (!hasProperty('sourceDeps')) {
             'com.madgag.spongycastle:pkix:6aba9b2210907a3d46dd3dcac782bb3424185290468d102d5207ebdc9796a905',
             'com.madgag.spongycastle:prov:029f26cd6b67c06ffa05702d426d472c141789001bcb15b7262ed86c868e5643',
             'com.madgag.spongycastle:core:9b6b7ac856b91bcda2ede694eccd26cefb0bf0b09b89f13cda05b5da5ff68c6b',
+            'ch.acra:acra:7ab8ee487aabce180b42af16d1db8fcb3f40970ba3dfa5d4d07e835cea4a4f67',
         ]
     }
 
diff --git a/F-Droid/res/values/strings.xml b/F-Droid/res/values/strings.xml
index 982929239..e27a65dbe 100644
--- a/F-Droid/res/values/strings.xml
+++ b/F-Droid/res/values/strings.xml
@@ -379,4 +379,10 @@
     <string name="theme_light">Light</string>
     <string name="theme_dark">Dark</string>
     <string name="theme_night">Night</string>
+
+    <string name="crash_dialog_title">F-Droid has crashed</string>
+    <string name="crash_dialog_text">An unexpected error occurred
+            forcing the application to stop. Would you like to e-mail the
+            details to help fix the issue?</string>
+    <string name="crash_dialog_comment_prompt">You can add extra information and comments here:</string>
 </resources>
diff --git a/F-Droid/src/org/fdroid/fdroid/FDroidApp.java b/F-Droid/src/org/fdroid/fdroid/FDroidApp.java
index 87ce5a83e..da1eade0a 100644
--- a/F-Droid/src/org/fdroid/fdroid/FDroidApp.java
+++ b/F-Droid/src/org/fdroid/fdroid/FDroidApp.java
@@ -43,6 +43,9 @@ import com.nostra13.universalimageloader.cache.disc.naming.FileNameGenerator;
 import com.nostra13.universalimageloader.core.ImageLoader;
 import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
 import com.nostra13.universalimageloader.utils.StorageUtils;
+import org.acra.ACRA;
+import org.acra.ReportingInteractionMode;
+import org.acra.annotation.ReportsCrashes;
 
 import org.apache.commons.net.util.SubnetUtils;
 import org.fdroid.fdroid.Preferences.ChangeListener;
@@ -62,6 +65,12 @@ import java.util.Locale;
 
 import sun.net.www.protocol.bluetooth.Handler;
 
+@ReportsCrashes(mailTo = "team@f-droid.org",
+                mode = ReportingInteractionMode.DIALOG,
+                resDialogTitle = R.string.crash_dialog_title,
+                resDialogText = R.string.crash_dialog_text,
+                resDialogCommentPrompt = R.string.crash_dialog_comment_prompt
+                )
 public class FDroidApp extends Application {
 
     private static final String TAG = "FDroidApp";
@@ -183,6 +192,7 @@ public class FDroidApp extends Application {
         }
         updateLanguage();
         super.onCreate();
+        ACRA.init(this);
 
         // Needs to be setup before anything else tries to access it.
         // Perhaps the constructor is a better place, but then again,