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).
This commit is contained in:
Fredrik Fornwall
2015-11-13 00:10:21 +01:00
parent 3b4e3b0e42
commit 89912be500
2 changed files with 40 additions and 26 deletions

View File

@@ -52,6 +52,7 @@ import android.view.View.OnClickListener;
import android.view.View.OnKeyListener; import android.view.View.OnKeyListener;
import android.view.View.OnLongClickListener; import android.view.View.OnLongClickListener;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.WindowManager;
import android.view.inputmethod.InputMethodManager; import android.view.inputmethod.InputMethodManager;
import android.widget.AdapterView; import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener; import android.widget.AdapterView.OnItemClickListener;
@@ -414,18 +415,22 @@ public final class TermuxActivity extends Activity implements ServiceConnection
TermuxInstaller.setupIfNeeded(TermuxActivity.this, new Runnable() { TermuxInstaller.setupIfNeeded(TermuxActivity.this, new Runnable() {
@Override @Override
public void run() { public void run() {
if (TermuxPreferences.isShowWelcomeDialog(TermuxActivity.this)) { try {
new AlertDialog.Builder(TermuxActivity.this).setTitle(R.string.welcome_dialog_title).setMessage(R.string.welcome_dialog_body) if (TermuxPreferences.isShowWelcomeDialog(TermuxActivity.this)) {
.setCancelable(false).setPositiveButton(android.R.string.ok, null) new AlertDialog.Builder(TermuxActivity.this).setTitle(R.string.welcome_dialog_title).setMessage(R.string.welcome_dialog_body)
.setNegativeButton(R.string.welcome_dialog_dont_show_again_button, new DialogInterface.OnClickListener() { .setCancelable(false).setPositiveButton(android.R.string.ok, null)
@Override .setNegativeButton(R.string.welcome_dialog_dont_show_again_button, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) { @Override
TermuxPreferences.disableWelcomeDialog(TermuxActivity.this); public void onClick(DialogInterface dialog, int which) {
dialog.dismiss(); TermuxPreferences.disableWelcomeDialog(TermuxActivity.this);
} dialog.dismiss();
}).show(); }
}).show();
}
addNewSession(false, null);
} catch (WindowManager.BadTokenException e) {
// Activity finished - ignore.
} }
addNewSession(false, null);
} }
}); });
} else { } else {

View File

@@ -21,6 +21,7 @@ import android.content.DialogInterface.OnDismissListener;
import android.system.Os; import android.system.Os;
import android.util.Log; import android.util.Log;
import android.util.Pair; import android.util.Pair;
import android.view.WindowManager;
import com.termux.R; import com.termux.R;
import com.termux.terminal.EmulatorDebug; import com.termux.terminal.EmulatorDebug;
@@ -138,27 +139,35 @@ final class TermuxInstaller {
activity.runOnUiThread(new Runnable() { activity.runOnUiThread(new Runnable() {
@Override @Override
public void run() { public void run() {
new AlertDialog.Builder(activity).setTitle(R.string.bootstrap_error_title).setMessage(R.string.bootstrap_error_body) try {
.setNegativeButton(R.string.bootstrap_error_abort, new OnClickListener() { new AlertDialog.Builder(activity).setTitle(R.string.bootstrap_error_title).setMessage(R.string.bootstrap_error_body)
@Override .setNegativeButton(R.string.bootstrap_error_abort, new OnClickListener() {
public void onClick(DialogInterface dialog, int which) { @Override
dialog.dismiss(); public void onClick(DialogInterface dialog, int which) {
activity.finish(); dialog.dismiss();
} activity.finish();
}).setPositiveButton(R.string.bootstrap_error_try_again, new OnClickListener() { }
@Override }).setPositiveButton(R.string.bootstrap_error_try_again, new OnClickListener() {
public void onClick(DialogInterface dialog, int which) { @Override
dialog.dismiss(); public void onClick(DialogInterface dialog, int which) {
TermuxInstaller.setupIfNeeded(activity, whenDone); dialog.dismiss();
} TermuxInstaller.setupIfNeeded(activity, whenDone);
}).show(); }
}).show();
} catch (WindowManager.BadTokenException e) {
// Activity already dismissed - ignore.
}
} }
}); });
} finally { } finally {
activity.runOnUiThread(new Runnable() { activity.runOnUiThread(new Runnable() {
@Override @Override
public void run() { public void run() {
progress.dismiss(); try {
progress.dismiss();
} catch (RuntimeException e) {
// Activity already dismissed - ignore.
}
} }
}); });
} }