From a790be4079ae687939fbffa1f6f0376afcd97b5e Mon Sep 17 00:00:00 2001 From: Sam Bosley Date: Mon, 20 Feb 2012 12:25:36 -0800 Subject: [PATCH] Catch bad token exceptions in the broadcast receivers that show dialogs --- .../astrid/activity/AstridActivity.java | 31 ++++++++++++++++--- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/astrid/src/com/todoroo/astrid/activity/AstridActivity.java b/astrid/src/com/todoroo/astrid/activity/AstridActivity.java index 0689a2545..a9af31f68 100644 --- a/astrid/src/com/todoroo/astrid/activity/AstridActivity.java +++ b/astrid/src/com/todoroo/astrid/activity/AstridActivity.java @@ -11,6 +11,7 @@ import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.view.View; +import android.view.WindowManager.BadTokenException; import com.timsu.astrid.R; import com.todoroo.andlib.service.ContextManager; @@ -324,13 +325,24 @@ public class AstridActivity extends FragmentActivity private class ReminderReceiver extends BroadcastReceiver { @Override - public void onReceive(Context context, Intent intent) { + public void onReceive(Context context, final Intent intent) { // Process in app notification Intent customIntent = intent.getExtras().getParcelable(Notifications.EXTRAS_CUSTOM_INTENT); long taskId = customIntent.getLongExtra(NotificationFragment.TOKEN_ID, 0); if (taskId > 0) { String text = intent.getStringExtra(Notifications.EXTRAS_TEXT); - new ReminderDialog(AstridActivity.this, taskId, text).show(); + try { + new ReminderDialog(AstridActivity.this, taskId, text).show(); + } catch (BadTokenException e) { // Activity not running when tried to show dialog--rebroadcast + new Thread() { + @Override + public void run() { + AndroidUtilities.sleepDeep(500L); + sendBroadcast(intent); + } + }.start(); + return; + } } // Remove broadcast @@ -341,7 +353,7 @@ public class AstridActivity extends FragmentActivity private class RepeatConfirmationReceiver extends BroadcastReceiver { @Override - public void onReceive(Context context, Intent intent) { + public void onReceive(Context context, final Intent intent) { long taskId = intent.getLongExtra( AstridApiConstants.EXTRAS_TASK_ID, 0); if (taskId > 0) { @@ -352,8 +364,17 @@ public class AstridActivity extends FragmentActivity Task task = PluginServices.getTaskService().fetchById(taskId, DateChangedAlerts.REPEAT_RESCHEDULED_PROPERTIES); - DateChangedAlerts.showRepeatTaskRescheduledDialog( - AstridActivity.this, task, oldDueDate, newDueDate); + try { + DateChangedAlerts.showRepeatTaskRescheduledDialog( + AstridActivity.this, task, oldDueDate, newDueDate); + } catch (BadTokenException e) { // Activity not running when tried to show dialog--rebroadcast + new Thread() { + @Override + public void run() { + sendBroadcast(intent); + } + }.start(); + } } } }