From f24c5b6ac76d04512b6847a96189c8fa0552a04b Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 31 Aug 2016 20:21:03 +0200 Subject: [PATCH 1/2] custom ACRA sender to put stacktrace title in email Subject: This should hopefully make it easier to sort through the emails. --- .../java/org/fdroid/fdroid/FDroidApp.java | 11 +-- .../fdroid/fdroid/acra/CrashReportSender.java | 67 +++++++++++++++++++ .../fdroid/acra/CrashReportSenderFactory.java | 16 +++++ 3 files changed, 89 insertions(+), 5 deletions(-) create mode 100644 app/src/main/java/org/fdroid/fdroid/acra/CrashReportSender.java create mode 100644 app/src/main/java/org/fdroid/fdroid/acra/CrashReportSenderFactory.java diff --git a/app/src/main/java/org/fdroid/fdroid/FDroidApp.java b/app/src/main/java/org/fdroid/fdroid/FDroidApp.java index 873a5c08d..36ca94057 100644 --- a/app/src/main/java/org/fdroid/fdroid/FDroidApp.java +++ b/app/src/main/java/org/fdroid/fdroid/FDroidApp.java @@ -70,9 +70,10 @@ import info.guardianproject.netcipher.proxy.OrbotHelper; import sun.net.www.protocol.bluetooth.Handler; @ReportsCrashes(mailTo = "reports@f-droid.org", - mode = ReportingInteractionMode.DIALOG, - reportDialogClass = CrashReportActivity.class - ) + mode = ReportingInteractionMode.DIALOG, + reportDialogClass = CrashReportActivity.class, + reportSenderFactoryClasses = org.fdroid.fdroid.acra.CrashReportSenderFactory.class +) public class FDroidApp extends Application { private static final String TAG = "FDroidApp"; @@ -276,12 +277,12 @@ public class FDroidApp extends Application { @Override public String generate(String imageUri) { return imageUri.substring( - imageUri.lastIndexOf('/') + 1); + imageUri.lastIndexOf('/') + 1); } }, // 30 days in secs: 30*24*60*60 = 2592000 2592000) - ) + ) .threadPoolSize(4) .threadPriority(Thread.NORM_PRIORITY - 2) // Default is NORM_PRIORITY - 1 .build(); diff --git a/app/src/main/java/org/fdroid/fdroid/acra/CrashReportSender.java b/app/src/main/java/org/fdroid/fdroid/acra/CrashReportSender.java new file mode 100644 index 000000000..6fd3dce63 --- /dev/null +++ b/app/src/main/java/org/fdroid/fdroid/acra/CrashReportSender.java @@ -0,0 +1,67 @@ + +package org.fdroid.fdroid.acra; + +import android.content.Context; +import android.content.Intent; +import android.net.Uri; +import android.support.annotation.NonNull; + +import org.acra.ACRAConstants; +import org.acra.ReportField; +import org.acra.collections.ImmutableSet; +import org.acra.collector.CrashReportData; +import org.acra.config.ACRAConfiguration; +import org.acra.sender.ReportSender; +import org.acra.sender.ReportSenderException; + +import java.util.Iterator; + +public class CrashReportSender implements ReportSender { + + private final ACRAConfiguration config; + + public CrashReportSender(ACRAConfiguration config) { + this.config = config; + } + + public void send(@NonNull Context context, @NonNull CrashReportData errorContent) + throws ReportSenderException { + Intent emailIntent = new Intent("android.intent.action.SENDTO"); + emailIntent.setData(Uri.fromParts("mailto", this.config.mailTo(), (String) null)); + emailIntent.addFlags(268435456); + String[] subjectBody = this.buildSubjectBody(context, errorContent); + emailIntent.putExtra("android.intent.extra.SUBJECT", subjectBody[0]); + emailIntent.putExtra("android.intent.extra.TEXT", subjectBody[1]); + context.startActivity(emailIntent); + } + + private String[] buildSubjectBody(Context context, CrashReportData errorContent) { + ImmutableSet fields = this.config.getReportFields(); + if (fields.isEmpty()) { + fields = new ImmutableSet(ACRAConstants.DEFAULT_MAIL_REPORT_FIELDS); + } + + String subject = context.getPackageName() + " Crash Report"; + StringBuilder builder = new StringBuilder(); + Iterator var4 = fields.iterator(); + + while (var4.hasNext()) { + ReportField field = (ReportField) var4.next(); + builder.append(field.toString()).append('='); + builder.append(errorContent.get(field)); + builder.append('\n'); + if ("STACK_TRACE".equals(field.toString())) { + String stackTrace = errorContent.get(field); + if (stackTrace != null) { + subject = context.getPackageName() + ": " + + stackTrace.substring(0, stackTrace.indexOf('\n')); + if (subject.length() > 72) { + subject = subject.substring(0, 72); + } + } + } + } + + return new String[]{subject, builder.toString()}; + } +} diff --git a/app/src/main/java/org/fdroid/fdroid/acra/CrashReportSenderFactory.java b/app/src/main/java/org/fdroid/fdroid/acra/CrashReportSenderFactory.java new file mode 100644 index 000000000..463417b11 --- /dev/null +++ b/app/src/main/java/org/fdroid/fdroid/acra/CrashReportSenderFactory.java @@ -0,0 +1,16 @@ +package org.fdroid.fdroid.acra; + +import android.content.Context; +import android.support.annotation.NonNull; + +import org.acra.config.ACRAConfiguration; +import org.acra.sender.ReportSender; +import org.acra.sender.ReportSenderFactory; + +public class CrashReportSenderFactory implements ReportSenderFactory { + @NonNull + @Override + public ReportSender create(@NonNull Context context, @NonNull ACRAConfiguration acraConfiguration) { + return new CrashReportSender(acraConfiguration); + } +} From 9848db7680092bc80351cc3af82b00bdef0594b9 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 31 Aug 2016 20:23:15 +0200 Subject: [PATCH 2/2] move CrashReportActivity into new .acra package This isolates all the ACRA stuff in its own package. --- app/src/main/AndroidManifest.xml | 2 +- app/src/main/java/org/fdroid/fdroid/FDroidApp.java | 2 +- .../org/fdroid/fdroid/{ => acra}/CrashReportActivity.java | 6 ++++-- 3 files changed, 6 insertions(+), 4 deletions(-) rename app/src/main/java/org/fdroid/fdroid/{ => acra}/CrashReportActivity.java (88%) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 84e2e3c7b..eae2723ad 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -395,7 +395,7 @@ android:value=".FDroid" />