package org.wikipedia.crash.hockeyapp; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.support.annotation.NonNull; import net.hockeyapp.android.CrashManager; import net.hockeyapp.android.ExceptionHandler; import org.wikipedia.WikipediaApp; import org.wikipedia.crash.BaseCrashReporter; import org.wikipedia.crash.CrashReportActivity; import org.wikipedia.settings.Prefs; import org.wikipedia.util.log.L; import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TASK; import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK; public class HockeyAppCrashReporter extends BaseCrashReporter { @NonNull private final String appId; @NonNull private final CrashListener crashListener; public HockeyAppCrashReporter(@NonNull String appId, @NonNull AutoUploadConsentAccessor consentAccessor) { this.appId = appId; crashListener = new CrashListener(consentAccessor); } @Override public void registerCrashHandler(@NonNull Context context) { L.v("Registering for HockeyApp crash handling."); HockeyAppExceptionHandler handler = new HockeyAppExceptionHandler(crashListener, true); handler.install(); CrashManager.initialize(context, appId, crashListener); } @Override public void checkCrashes(@NonNull Activity activity) { L.v("Checking for HockeyApp crashes."); CrashManager.register(activity, appId, crashListener); } @Override public void log(@NonNull Throwable throwable) { ExceptionHandler.saveException(throwable, Thread.currentThread(), crashListener); } private class CrashListener extends HockeyAppCrashListener { @NonNull private final AutoUploadConsentAccessor consentAccessor; CrashListener(@NonNull AutoUploadConsentAccessor consentAccessor) { this.consentAccessor = consentAccessor; } @Override public String getDescription() { super.getDescription(); return getPropsJson(); } @Override public boolean shouldAutoUploadCrashes() { super.shouldAutoUploadCrashes(); return consentAccessor.isAutoUploadPermitted(); } @Override public void onCrashesSent() { super.onCrashesSent(); L.v("Crash report(s) sent."); } @Override public boolean ignoreDefaultHandler() { super.ignoreDefaultHandler(); return true; } @Override public void onCrashesNotSent() { super.onCrashesNotSent(); L.d("Crash report(s) not sent."); } @Override public void onCrash() { if (!Prefs.crashedBeforeActivityCreated()) { Prefs.crashedBeforeActivityCreated(true); launchCrashReportActivity(); } else { L.i("Crashed before showing UI. Skipping reboot."); } terminateApp(); } private void launchCrashReportActivity() { Context context = WikipediaApp.getInstance(); int flags = FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK; Intent intent = new Intent(context, CrashReportActivity.class).addFlags(flags); context.startActivity(intent); } private void terminateApp() { Runtime.getRuntime().exit(0); } } }