From 7ffd2156c1bd7ec79a711eb80954170e15ec4cb3 Mon Sep 17 00:00:00 2001 From: Sergey Eremin Date: Thu, 27 Apr 2017 12:40:21 +0300 Subject: [PATCH] Fixed crash reporter - it was hanging after dismissing the dialog --- app/src/main/AndroidManifest.xml | 1 + .../yeriomin/yalpstore/AboutActivity.java | 5 +- .../yalpstore/CrashLetterActivity.java | 58 ++++++++++++++++ .../YalpStoreUncaughtExceptionHandler.java | 66 +++---------------- 4 files changed, 71 insertions(+), 59 deletions(-) create mode 100644 app/src/main/java/com/github/yeriomin/yalpstore/CrashLetterActivity.java diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 9550adc21..ab14ca819 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -139,6 +139,7 @@ + diff --git a/app/src/main/java/com/github/yeriomin/yalpstore/AboutActivity.java b/app/src/main/java/com/github/yeriomin/yalpstore/AboutActivity.java index 98965ae44..ca31901f1 100644 --- a/app/src/main/java/com/github/yeriomin/yalpstore/AboutActivity.java +++ b/app/src/main/java/com/github/yeriomin/yalpstore/AboutActivity.java @@ -29,7 +29,10 @@ public class AboutActivity extends YalpStoreActivity { findViewById(R.id.developer_email).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - new YalpStoreUncaughtExceptionHandler(AboutActivity.this).send(null); + CrashLetterActivity.send( + AboutActivity.this, + new CrashLetterBuilder(AboutActivity.this).build(null) + ); } }); if (hasPermission()) { diff --git a/app/src/main/java/com/github/yeriomin/yalpstore/CrashLetterActivity.java b/app/src/main/java/com/github/yeriomin/yalpstore/CrashLetterActivity.java new file mode 100644 index 000000000..a81a0d901 --- /dev/null +++ b/app/src/main/java/com/github/yeriomin/yalpstore/CrashLetterActivity.java @@ -0,0 +1,58 @@ +package com.github.yeriomin.yalpstore; + +import android.app.Activity; +import android.app.AlertDialog; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.net.Uri; +import android.os.Bundle; +import android.text.ClipboardManager; + +public class CrashLetterActivity extends Activity { + + static public void send(Context activity, String letter) { + Intent emailIntent = new Intent(Intent.ACTION_SENDTO); + emailIntent.setData(Uri.fromParts("mailto", activity.getString(R.string.about_developer_email), null)); + emailIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + emailIntent.putExtra(Intent.EXTRA_SUBJECT, activity.getPackageName() + " Crash Report"); + emailIntent.putExtra(Intent.EXTRA_TEXT, letter); + if (emailIntent.resolveActivity(activity.getPackageManager()) != null) { + activity.startActivity(emailIntent); + } else { + ((ClipboardManager) activity.getSystemService(Context.CLIPBOARD_SERVICE)).setText(letter); + } + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + showCrashDialog(); + } + + private AlertDialog showCrashDialog() { + return new AlertDialog.Builder(this) + .setTitle(getString(R.string.dialog_title_application_crashed)) + .setMessage(getString(R.string.dialog_message_application_crashed)) + .setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + finish(); + } + }) + .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + send( + CrashLetterActivity.this, + getIntent().getExtras().getString(YalpStoreUncaughtExceptionHandler.INTENT_MESSAGE) + ); + dialog.dismiss(); + finish(); + } + }) + .show() + ; + } +} diff --git a/app/src/main/java/com/github/yeriomin/yalpstore/YalpStoreUncaughtExceptionHandler.java b/app/src/main/java/com/github/yeriomin/yalpstore/YalpStoreUncaughtExceptionHandler.java index 9233aecfd..cd2d281c0 100644 --- a/app/src/main/java/com/github/yeriomin/yalpstore/YalpStoreUncaughtExceptionHandler.java +++ b/app/src/main/java/com/github/yeriomin/yalpstore/YalpStoreUncaughtExceptionHandler.java @@ -1,17 +1,12 @@ package com.github.yeriomin.yalpstore; import android.app.Activity; -import android.app.AlertDialog; -import android.content.Context; -import android.content.DialogInterface; import android.content.Intent; -import android.net.Uri; -import android.os.Looper; -import android.text.ClipboardManager; -import android.util.Log; class YalpStoreUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler { + static public final String INTENT_MESSAGE = "INTENT_MESSAGE"; + private Activity activity; public YalpStoreUncaughtExceptionHandler(Activity activity) { @@ -21,56 +16,11 @@ class YalpStoreUncaughtExceptionHandler implements Thread.UncaughtExceptionHandl @Override public void uncaughtException(Thread t, final Throwable e) { e.printStackTrace(); - Thread thread = new Thread() { - @Override - public void run() { - Looper.prepare(); - showCrashDialog(e); - Looper.loop(); - } - }; - try { - thread.start(); - } catch (Throwable ee) { - Log.e(getClass().getName(), "Failed to process an uncaught exception: " + ee.getMessage()); - System.exit(1); - } - } - - public AlertDialog showCrashDialog(final Throwable e) { - return new AlertDialog.Builder(activity) - .setTitle(activity.getString(R.string.dialog_title_application_crashed)) - .setMessage(activity.getString(R.string.dialog_message_application_crashed)) - .setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - System.exit(1); - } - }) - .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - send(e); - dialog.dismiss(); - System.exit(1); - } - }) - .show() - ; - } - - public void send(Throwable e) { - String letter = new CrashLetterBuilder(activity).build(e); - Intent emailIntent = new Intent(Intent.ACTION_SENDTO); - emailIntent.setData(Uri.fromParts("mailto", activity.getString(R.string.about_developer_email), null)); - emailIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - emailIntent.putExtra(Intent.EXTRA_SUBJECT, activity.getPackageName() + " Crash Report"); - emailIntent.putExtra(Intent.EXTRA_TEXT, letter); - if (emailIntent.resolveActivity(activity.getPackageManager()) != null) { - activity.startActivity(emailIntent); - } else { - ((ClipboardManager) activity.getSystemService(Context.CLIPBOARD_SERVICE)).setText(letter); - } + Intent errorIntent = new Intent(activity.getApplicationContext(), CrashLetterActivity.class); + errorIntent.putExtra(INTENT_MESSAGE, new CrashLetterBuilder(activity).build(e)); + errorIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + activity.getApplicationContext().startActivity(errorIntent); + android.os.Process.killProcess(android.os.Process.myPid()); + System.exit(2); } }