From eb3b83ec48a5646fa853f9695d01fb5d47df1813 Mon Sep 17 00:00:00 2001
From: Andy2 <andy2@trand>
Date: Thu, 3 Mar 2011 19:00:50 -0800
Subject: [PATCH] fix rare crash by tracking whether showDialog has been called
 and testing that before dismissing it.

---
 .../src/org/eehouse/android/xw4/BoardActivity.java | 14 ++++++++++++--
 1 file changed, 12 insertions(+), 2 deletions(-)

diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/BoardActivity.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/BoardActivity.java
index f9a4408aa..33b1622ca 100644
--- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/BoardActivity.java
+++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/BoardActivity.java
@@ -1215,8 +1215,15 @@ public class BoardActivity extends XWActivity
         };
     }
 
+    /* m_blockingDlgPosted: very rarely m_forResultWait will get
+     * interrupted before the runnable gets run.  In that case there's
+     * no dialog to dismiss.  So track it.
+     */
+    private boolean m_blockingDlgPosted;
+
     private int waitBlockingDialog( final int dlgID, int cancelResult )
     {
+        m_blockingDlgPosted = false;
         setBlockingThread();
         int orient = m_currentOrient == Configuration.ORIENTATION_LANDSCAPE
             ? ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
@@ -1226,15 +1233,18 @@ public class BoardActivity extends XWActivity
         m_handler.post( new Runnable() {
                 public void run() {
                     showDialog( dlgID );
+                    m_blockingDlgPosted = true;
                 }
             } );
 
         try {
             m_forResultWait.acquire();
         } catch ( java.lang.InterruptedException ie ) {
-            m_resultCode = cancelResult;
-            dismissDialog( dlgID );
             Utils.logf( "waitBlockingDialog: got " + ie.toString() );
+            m_resultCode = cancelResult;
+            if ( m_blockingDlgPosted ) {
+                dismissDialog( dlgID );
+            }
         }
         clearBlockingThread();
         return m_resultCode;