diff --git a/app/src/main/java/acr/browser/lightning/app/BrowserApp.java b/app/src/main/java/acr/browser/lightning/app/BrowserApp.java index cf74c2e..e0a4ac1 100644 --- a/app/src/main/java/acr/browser/lightning/app/BrowserApp.java +++ b/app/src/main/java/acr/browser/lightning/app/BrowserApp.java @@ -19,6 +19,7 @@ import javax.inject.Inject; import acr.browser.lightning.BuildConfig; import acr.browser.lightning.preference.PreferenceManager; +import acr.browser.lightning.utils.FileUtils; import acr.browser.lightning.utils.MemoryLeakUtils; public class BrowserApp extends Application { @@ -46,6 +47,24 @@ public class BrowserApp extends Application { .build()); } + final Thread.UncaughtExceptionHandler defaultHandler = Thread.getDefaultUncaughtExceptionHandler(); + + Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { + @Override + public void uncaughtException(Thread thread, Throwable ex) { + + if (BuildConfig.DEBUG) { + FileUtils.writeCrashToStorage(ex); + } + + if (defaultHandler != null) { + defaultHandler.uncaughtException(thread, ex); + } else { + System.exit(2); + } + } + }); + mAppComponent = DaggerAppComponent.builder().appModule(new AppModule(this)).build(); mAppComponent.inject(this); diff --git a/app/src/main/java/acr/browser/lightning/utils/FileUtils.java b/app/src/main/java/acr/browser/lightning/utils/FileUtils.java index 290eb57..e5642ee 100644 --- a/app/src/main/java/acr/browser/lightning/utils/FileUtils.java +++ b/app/src/main/java/acr/browser/lightning/utils/FileUtils.java @@ -2,6 +2,7 @@ package acr.browser.lightning.utils; import android.app.Application; import android.os.Bundle; +import android.os.Environment; import android.os.Parcel; import android.support.annotation.NonNull; import android.support.annotation.Nullable; @@ -12,6 +13,7 @@ import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; +import java.io.PrintStream; import acr.browser.lightning.app.BrowserApp; import acr.browser.lightning.constant.Constants; @@ -109,4 +111,27 @@ public class FileUtils { return null; } + /** + * Writes a stacktrace to the downloads folder with + * the following filename: [EXCEPTION]_[TIME OF CRASH IN MILLIS].txt + * + * @param throwable the Throwable to log to external storage + */ + public static void writeCrashToStorage(@NonNull Throwable throwable) { + String fileName = throwable.getClass().getSimpleName() + '_' + System.currentTimeMillis() + ".txt"; + File outputFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), fileName); + + FileOutputStream outputStream = null; + try { + //noinspection IOResourceOpenedButNotSafelyClosed + outputStream = new FileOutputStream(outputFile); + throwable.printStackTrace(new PrintStream(outputStream)); + outputStream.flush(); + } catch (IOException e) { + Log.e(Constants.TAG, "Unable to write bundle to storage"); + } finally { + Utils.close(outputStream); + } + } + }