summaryrefslogtreecommitdiff
path: root/app/src
diff options
context:
space:
mode:
Diffstat (limited to 'app/src')
-rw-r--r--app/src/main/java/de/danoeh/antennapod/CrashReportWriter.java49
-rw-r--r--app/src/main/java/de/danoeh/antennapod/PodcastApp.java19
-rw-r--r--app/src/main/java/de/danoeh/antennapod/asynctask/OpmlExportWorker.java2
-rw-r--r--app/src/main/java/de/danoeh/antennapod/preferences/PreferenceController.java40
-rw-r--r--app/src/main/res/xml/preferences.xml4
5 files changed, 86 insertions, 28 deletions
diff --git a/app/src/main/java/de/danoeh/antennapod/CrashReportWriter.java b/app/src/main/java/de/danoeh/antennapod/CrashReportWriter.java
new file mode 100644
index 000000000..17942a93c
--- /dev/null
+++ b/app/src/main/java/de/danoeh/antennapod/CrashReportWriter.java
@@ -0,0 +1,49 @@
+package de.danoeh.antennapod;
+
+import android.os.Build;
+import android.util.Log;
+
+import org.apache.commons.io.IOUtils;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+
+import de.danoeh.antennapod.core.preferences.UserPreferences;
+
+public class CrashReportWriter implements Thread.UncaughtExceptionHandler {
+
+ private static final String TAG = "CrashReportWriter";
+
+ private final Thread.UncaughtExceptionHandler defaultHandler;
+
+ public CrashReportWriter() {
+ defaultHandler = Thread.getDefaultUncaughtExceptionHandler();
+ }
+
+ public static File getFile() {
+ return new File(UserPreferences.getDataFolder(null), "crash-report.log");
+ }
+
+ @Override
+ public void uncaughtException(Thread thread, Throwable ex) {
+ File path = getFile();
+ PrintWriter out = null;
+ try {
+ out = new PrintWriter(new FileWriter(path));
+ out.println("[ Environment ]");
+ out.println("Android version: " + Build.VERSION.RELEASE);
+ out.println("AntennaPod version: " + BuildConfig.VERSION_NAME);
+ out.println("Phone model: " + Build.MODEL);
+ out.println();
+ out.println("[ StackTrace ]");
+ ex.printStackTrace(out);
+ } catch (IOException e) {
+ Log.e(TAG, Log.getStackTraceString(e));
+ } finally {
+ IOUtils.closeQuietly(out);
+ }
+ defaultHandler.uncaughtException(thread, ex);
+ }
+}
diff --git a/app/src/main/java/de/danoeh/antennapod/PodcastApp.java b/app/src/main/java/de/danoeh/antennapod/PodcastApp.java
index 83bc9afb2..835f43f40 100644
--- a/app/src/main/java/de/danoeh/antennapod/PodcastApp.java
+++ b/app/src/main/java/de/danoeh/antennapod/PodcastApp.java
@@ -1,7 +1,6 @@
package de.danoeh.antennapod;
import android.app.Application;
-import android.content.res.Configuration;
import android.os.Build;
import android.os.StrictMode;
@@ -27,10 +26,6 @@ public class PodcastApp extends Application {
}
}
- private static final String TAG = "PodcastApp";
-
- private static float LOGICAL_DENSITY;
-
private static PodcastApp singleton;
public static PodcastApp getInstance() {
@@ -41,6 +36,8 @@ public class PodcastApp extends Application {
public void onCreate() {
super.onCreate();
+ Thread.setDefaultUncaughtExceptionHandler(new CrashReportWriter());
+
if(BuildConfig.DEBUG) {
StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder()
.detectLeakedSqlLiteObjects()
@@ -57,7 +54,6 @@ public class PodcastApp extends Application {
}
singleton = this;
- LOGICAL_DENSITY = getResources().getDisplayMetrics().density;
PodDBAdapter.init(this);
UpdateManager.init(this);
@@ -68,15 +64,6 @@ public class PodcastApp extends Application {
Iconify.with(new FontAwesomeModule());
SPAUtil.sendSPAppsQueryFeedsIntent(this);
- }
-
- public static float getLogicalDensity() {
- return LOGICAL_DENSITY;
- }
-
- public boolean isLargeScreen() {
- return (getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_LARGE
- || (getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_XLARGE;
+ }
- }
}
diff --git a/app/src/main/java/de/danoeh/antennapod/asynctask/OpmlExportWorker.java b/app/src/main/java/de/danoeh/antennapod/asynctask/OpmlExportWorker.java
index 3940eb8b6..5c24c2822 100644
--- a/app/src/main/java/de/danoeh/antennapod/asynctask/OpmlExportWorker.java
+++ b/app/src/main/java/de/danoeh/antennapod/asynctask/OpmlExportWorker.java
@@ -49,7 +49,7 @@ public class OpmlExportWorker extends AsyncTask<Void, Void, Void> {
OpmlWriter opmlWriter = new OpmlWriter();
if (output == null) {
output = new File(
- UserPreferences.getDataFolder(context, EXPORT_DIR),
+ UserPreferences.getDataFolder(EXPORT_DIR),
DEFAULT_OUTPUT_NAME);
if (output.exists()) {
Log.w(TAG, "Overwriting previously exported file.");
diff --git a/app/src/main/java/de/danoeh/antennapod/preferences/PreferenceController.java b/app/src/main/java/de/danoeh/antennapod/preferences/PreferenceController.java
index 73d7da0f2..94f5d822e 100644
--- a/app/src/main/java/de/danoeh/antennapod/preferences/PreferenceController.java
+++ b/app/src/main/java/de/danoeh/antennapod/preferences/PreferenceController.java
@@ -8,6 +8,7 @@ import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.Resources;
+import android.net.Uri;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiManager;
import android.os.Build;
@@ -34,6 +35,7 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
+import de.danoeh.antennapod.CrashReportWriter;
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.activity.AboutActivity;
import de.danoeh.antennapod.activity.DirectoryChooserActivity;
@@ -169,7 +171,7 @@ public class PreferenceController implements SharedPreferences.OnSharedPreferenc
new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
- if(Build.VERSION.SDK_INT >= 19) {
+ if (Build.VERSION.SDK_INT >= 19) {
showChooseDataFolderDialog();
} else {
Intent intent = new Intent(activity, DirectoryChooserActivity.class);
@@ -254,7 +256,7 @@ public class PreferenceController implements SharedPreferences.OnSharedPreferenc
setParallelDownloadsText(value);
return true;
}
- } catch(NumberFormatException e) {
+ } catch (NumberFormatException e) {
return false;
}
}
@@ -263,17 +265,19 @@ public class PreferenceController implements SharedPreferences.OnSharedPreferenc
}
);
// validate and set correct value: number of downloads between 1 and 50 (inclusive)
- final EditText ev = ((EditTextPreference)ui.findPreference(UserPreferences.PREF_PARALLEL_DOWNLOADS)).getEditText();
+ final EditText ev = ((EditTextPreference) ui.findPreference(UserPreferences.PREF_PARALLEL_DOWNLOADS)).getEditText();
ev.addTextChangedListener(new TextWatcher() {
@Override
- public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
+ public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+ }
@Override
- public void onTextChanged(CharSequence s, int start, int before, int count) {}
+ public void onTextChanged(CharSequence s, int start, int before, int count) {
+ }
@Override
public void afterTextChanged(Editable s) {
- if(s.length() > 0) {
+ if (s.length() > 0) {
try {
int value = Integer.valueOf(s.toString());
if (value <= 0) {
@@ -281,7 +285,7 @@ public class PreferenceController implements SharedPreferences.OnSharedPreferenc
} else if (value > 50) {
ev.setText("50");
}
- } catch(NumberFormatException e) {
+ } catch (NumberFormatException e) {
ev.setText("6");
}
ev.setSelection(ev.getText().length());
@@ -386,11 +390,23 @@ public class PreferenceController implements SharedPreferences.OnSharedPreferenc
}
}
);
+ ui.findPreference("prefSendCrashReport").setOnPreferenceClickListener(preference -> {
+ Intent emailIntent = new Intent(Intent.ACTION_SEND);
+ emailIntent.setType("text/plain");
+ String to[] = { "Martin.Fietz@gmail.com" };
+ emailIntent .putExtra(Intent.EXTRA_EMAIL, to);
+ // the attachment
+ emailIntent .putExtra(Intent.EXTRA_STREAM, Uri.fromFile(CrashReportWriter.getFile()));
+ // the mail subject
+ emailIntent .putExtra(Intent.EXTRA_SUBJECT, "AntennaPod Crash Report");
+ String intentTitle = ui.getActivity().getString(R.string.send_email);
+ ui.getActivity().startActivity(Intent.createChooser(emailIntent, intentTitle));
+ return true;
+ });
buildEpisodeCleanupPreference();
buildSmartMarkAsPlayedPreference();
buildAutodownloadSelectedNetworsPreference();
- setSelectedNetworksEnabled(UserPreferences
- .isEnableAutodownloadWifiFilter());
+ setSelectedNetworksEnabled(UserPreferences.isEnableAutodownloadWifiFilter());
}
public void onResume() {
@@ -527,6 +543,8 @@ public class PreferenceController implements SharedPreferences.OnSharedPreferenc
ui.findPreference(UserPreferences.PREF_ENABLE_AUTODL_ON_BATTERY)
.setEnabled(UserPreferences.isEnableAutodownload());
+ ui.findPreference("prefSendCrashReport").setEnabled(CrashReportWriter.getFile().exists());
+
if (Build.VERSION.SDK_INT >= 16) {
ui.findPreference(UserPreferences.PREF_SONIC).setEnabled(true);
} else {
@@ -558,7 +576,7 @@ public class PreferenceController implements SharedPreferences.OnSharedPreferenc
}
private void setDataFolderText() {
- File f = UserPreferences.getDataFolder(ui.getActivity(), null);
+ File f = UserPreferences.getDataFolder(null);
if (f != null) {
ui.findPreference(PreferenceController.PREF_CHOOSE_DATA_DIR)
.setSummary(f.getAbsolutePath());
@@ -677,7 +695,7 @@ public class PreferenceController implements SharedPreferences.OnSharedPreferenc
private void showChooseDataFolderDialog() {
Context context = ui.getActivity();
- String dataFolder = UserPreferences.getDataFolder(context, null).getAbsolutePath();
+ String dataFolder = UserPreferences.getDataFolder(null).getAbsolutePath();
int selectedIndex = -1;
File[] mediaDirs = ContextCompat.getExternalFilesDirs(context, null);
String[] folders = new String[mediaDirs.length];
diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml
index 38350155a..a6256b7b8 100644
--- a/app/src/main/res/xml/preferences.xml
+++ b/app/src/main/res/xml/preferences.xml
@@ -245,6 +245,10 @@
<Preference
android:key="prefAbout"
android:title="@string/about_pref"/>
+ <Preference
+ android:key="prefSendCrashReport"
+ android:title="@string/crash_report_title"
+ android:summary="@string/crash_report_sum"/>
</PreferenceCategory>
<PreferenceCategory android:title="@string/experimental_pref">