From 89912be500187526b1f093377ee0f18212354a10 Mon Sep 17 00:00:00 2001 From: Fredrik Fornwall Date: Fri, 13 Nov 2015 00:10:21 +0100 Subject: [PATCH] Fix crash on installation if activity destroyed If the activity had been destroyed waiting for the installation to finish the code would crash trying to display welcome dialogs (on success) or error dialogs (on error). --- .../java/com/termux/app/TermuxActivity.java | 27 +++++++------ .../java/com/termux/app/TermuxInstaller.java | 39 ++++++++++++------- 2 files changed, 40 insertions(+), 26 deletions(-) diff --git a/app/src/main/java/com/termux/app/TermuxActivity.java b/app/src/main/java/com/termux/app/TermuxActivity.java index e277c7f2..c2b3248d 100644 --- a/app/src/main/java/com/termux/app/TermuxActivity.java +++ b/app/src/main/java/com/termux/app/TermuxActivity.java @@ -52,6 +52,7 @@ import android.view.View.OnClickListener; import android.view.View.OnKeyListener; import android.view.View.OnLongClickListener; import android.view.ViewGroup; +import android.view.WindowManager; import android.view.inputmethod.InputMethodManager; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; @@ -414,18 +415,22 @@ public final class TermuxActivity extends Activity implements ServiceConnection TermuxInstaller.setupIfNeeded(TermuxActivity.this, new Runnable() { @Override public void run() { - if (TermuxPreferences.isShowWelcomeDialog(TermuxActivity.this)) { - new AlertDialog.Builder(TermuxActivity.this).setTitle(R.string.welcome_dialog_title).setMessage(R.string.welcome_dialog_body) - .setCancelable(false).setPositiveButton(android.R.string.ok, null) - .setNegativeButton(R.string.welcome_dialog_dont_show_again_button, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - TermuxPreferences.disableWelcomeDialog(TermuxActivity.this); - dialog.dismiss(); - } - }).show(); + try { + if (TermuxPreferences.isShowWelcomeDialog(TermuxActivity.this)) { + new AlertDialog.Builder(TermuxActivity.this).setTitle(R.string.welcome_dialog_title).setMessage(R.string.welcome_dialog_body) + .setCancelable(false).setPositiveButton(android.R.string.ok, null) + .setNegativeButton(R.string.welcome_dialog_dont_show_again_button, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + TermuxPreferences.disableWelcomeDialog(TermuxActivity.this); + dialog.dismiss(); + } + }).show(); + } + addNewSession(false, null); + } catch (WindowManager.BadTokenException e) { + // Activity finished - ignore. } - addNewSession(false, null); } }); } else { diff --git a/app/src/main/java/com/termux/app/TermuxInstaller.java b/app/src/main/java/com/termux/app/TermuxInstaller.java index ce277d2f..1e76b916 100644 --- a/app/src/main/java/com/termux/app/TermuxInstaller.java +++ b/app/src/main/java/com/termux/app/TermuxInstaller.java @@ -21,6 +21,7 @@ import android.content.DialogInterface.OnDismissListener; import android.system.Os; import android.util.Log; import android.util.Pair; +import android.view.WindowManager; import com.termux.R; import com.termux.terminal.EmulatorDebug; @@ -138,27 +139,35 @@ final class TermuxInstaller { activity.runOnUiThread(new Runnable() { @Override public void run() { - new AlertDialog.Builder(activity).setTitle(R.string.bootstrap_error_title).setMessage(R.string.bootstrap_error_body) - .setNegativeButton(R.string.bootstrap_error_abort, new OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - activity.finish(); - } - }).setPositiveButton(R.string.bootstrap_error_try_again, new OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - TermuxInstaller.setupIfNeeded(activity, whenDone); - } - }).show(); + try { + new AlertDialog.Builder(activity).setTitle(R.string.bootstrap_error_title).setMessage(R.string.bootstrap_error_body) + .setNegativeButton(R.string.bootstrap_error_abort, new OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + activity.finish(); + } + }).setPositiveButton(R.string.bootstrap_error_try_again, new OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + TermuxInstaller.setupIfNeeded(activity, whenDone); + } + }).show(); + } catch (WindowManager.BadTokenException e) { + // Activity already dismissed - ignore. + } } }); } finally { activity.runOnUiThread(new Runnable() { @Override public void run() { - progress.dismiss(); + try { + progress.dismiss(); + } catch (RuntimeException e) { + // Activity already dismissed - ignore. + } } }); }