diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/BoardDelegate.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/BoardDelegate.java index f03b36849..159848f76 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/BoardDelegate.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/BoardDelegate.java @@ -666,8 +666,8 @@ public class BoardDelegate extends DelegateBase m_jniThreadRef.release(); m_jniThreadRef = null; // Assert.assertNull( m_jniThreadRef ); // firing - GamesListDelegate.boardDestroyed( m_rowid ); } + GamesListDelegate.boardDestroyed( m_rowid ); super.onDestroy(); } @@ -1464,7 +1464,7 @@ public class BoardDelegate extends DelegateBase finish(); - GameUtils.launchGame( m_activity, m_rowid, m_haveInvited ); + GameUtils.launchGame( getDelegator(), m_rowid, m_haveInvited ); } private void setGotGameDict( String getDict ) @@ -1474,7 +1474,7 @@ public class BoardDelegate extends DelegateBase String msg = getString( R.string.reload_new_dict_fmt, getDict ); showToast( msg ); finish(); - GameUtils.launchGame( m_activity, m_rowid, false ); + GameUtils.launchGame( getDelegator(), m_rowid, false ); } private XwJNI.XP_Key keyCodeToXPKey( int keyCode ) diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/BoardView.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/BoardView.java index 062fdba0f..3f692ed41 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/BoardView.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/BoardView.java @@ -158,6 +158,7 @@ public class BoardView extends View implements BoardHandler, SyncedDraw { DbgUtils.logf( "onMeasure: discarding m_dims" ); if ( ++m_dimsTossCount < 4 ) { m_dims = null; + m_layoutWidth = m_layoutHeight = 0; } } } @@ -202,7 +203,7 @@ public class BoardView extends View implements BoardHandler, SyncedDraw { ConnStatusHandler.draw( m_context, canvas, getResources(), m_connTypes, m_isSolo ); } else { - DbgUtils.logf( "board not laid out yet" ); + DbgUtils.logf( "BoardView.onDraw(): board not laid out yet" ); } } } @@ -213,12 +214,15 @@ public class BoardView extends View implements BoardHandler, SyncedDraw { final int height = getHeight(); boolean layoutDone = width == m_layoutWidth && height == m_layoutHeight; if ( layoutDone ) { - // nothing to do + DbgUtils.logf( "layoutBoardOnce(): layoutDone true" ); } else if ( null == m_gi ) { // nothing to do either + DbgUtils.logf( "layoutBoardOnce(): no m_gi" ); } else if ( null == m_jniThread ) { // nothing to do either + DbgUtils.logf( "layoutBoardOnce(): no m_jniThread" ); } else if ( null == m_dims ) { + DbgUtils.logf( "layoutBoardOnce(): null m_dims" ); // m_canvas = null; // need to synchronize?? Paint paint = new Paint(); @@ -234,6 +238,7 @@ public class BoardView extends View implements BoardHandler, SyncedDraw { fontWidth, m_defaultFontHt ); // We'll be back.... } else { + DbgUtils.logf( "layoutBoardOnce(): DOING IT" ); // If board size has changed we need a new bitmap int bmHeight = 1 + m_dims.height; int bmWidth = 1 + m_dims.width; diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/DBUtils.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/DBUtils.java index ec9e01211..83b399402 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/DBUtils.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/DBUtils.java @@ -118,10 +118,14 @@ public class DBUtils { long maxMillis ) { GameSummary result = null; - GameLock lock = new GameLock( rowid, false ).lock( maxMillis ); - if ( null != lock ) { - result = getSummary( context, lock ); - lock.unlock(); + try { + GameLock lock = new GameLock( rowid, false ).lock( maxMillis ); + if ( null != lock ) { + result = getSummary( context, lock ); + lock.unlock(); + } + } catch ( GameLock.GameLockedException gle ) { + DbgUtils.loge( gle ); } return result; } diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/GameConfigDelegate.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/GameConfigDelegate.java index 0b2b8e865..2397f4a64 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/GameConfigDelegate.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/GameConfigDelegate.java @@ -1166,7 +1166,7 @@ public class GameConfigDelegate extends DelegateBase && 0 == m_car.ip_relay_invite.length() ) { showOKOnlyDialog( R.string.no_empty_rooms ); } else { - GameUtils.launchGameAndFinish( m_activity, m_rowid ); + GameUtils.launchGameAndFinish( getDelegator(), m_rowid ); } } diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/GameLock.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/GameLock.java index 48e60b616..96dcd7a46 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/GameLock.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/GameLock.java @@ -29,13 +29,21 @@ import junit.framework.Assert; // write lock is. Write-locks are exclusive. public class GameLock { private static final boolean DEBUG_LOCKS = false; + private static final boolean THROW_ON_LOCKED = true; private static final int SLEEP_TIME = 100; private static final long ASSERT_TIME = 2000; + private static final long THROW_TIME = 750; private long m_rowid; private boolean m_isForWrite; private int m_lockCount; private StackTraceElement[] m_lockTrace; + static { + Assert.assertTrue( THROW_TIME <= ASSERT_TIME ); + } + + public static class GameLockedException extends RuntimeException {} + private static HashMap s_locks = new HashMap(); @@ -145,6 +153,8 @@ public class GameLock { if ( 0 < maxMillis && sleptTime >= maxMillis ) { break; + } else if ( THROW_ON_LOCKED && sleptTime >= THROW_TIME ) { + throw new GameLockedException(); } else if ( sleptTime >= ASSERT_TIME ) { if ( DEBUG_LOCKS ) { DbgUtils.logf( "lock %H overlocked", this ); diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/GameUtils.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/GameUtils.java index 0dc951f76..eec3455ad 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/GameUtils.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/GameUtils.java @@ -843,12 +843,13 @@ public class GameUtils { return bundle; } - public static void launchGame( Activity activity, long rowid, + public static void launchGame( Delegator delegator, long rowid, boolean invited ) { + Activity activity = delegator.getActivity(); Bundle extras = makeLaunchExtras( rowid, invited ); if ( activity instanceof FragActivity ) { - FragActivity.addFragment( new BoardFrag(), extras ); + FragActivity.addFragment( new BoardFrag(), extras, delegator ); } else { Intent intent = new Intent( activity, BoardActivity.class ); intent.putExtras( extras ); @@ -856,15 +857,15 @@ public class GameUtils { } } - public static void launchGame( Activity activity, long rowid ) + public static void launchGame( Delegator delegator, long rowid ) { - launchGame( activity, rowid, false ); + launchGame( delegator, rowid, false ); } - public static void launchGameAndFinish( Activity activity, long rowid ) + public static void launchGameAndFinish( Delegator delegator, long rowid ) { - launchGame( activity, rowid ); - activity.finish(); + launchGame( delegator, rowid ); + delegator.getActivity().finish(); } private static class FeedUtilsImpl extends UtilCtxtImpl { diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/GamesListDelegate.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/GamesListDelegate.java index 54a0461fe..b061c6706 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/GamesListDelegate.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/GamesListDelegate.java @@ -580,7 +580,7 @@ public class GamesListDelegate extends ListDelegateBase private String m_nameField; private NetLaunchInfo m_netLaunchInfo; private GameNamer m_namer; - private Set m_launchedGames; + private Set m_launchedGames; // prevent problems with double-taps private boolean m_menuPrepared; private boolean m_moveAfterNewGroup; private Set m_selGames; @@ -988,7 +988,9 @@ public class GamesListDelegate extends ListDelegateBase protected void onDestroy() { DBUtils.clearDBChangeListener( this ); - s_self = null; + if ( s_self == this ) { + s_self = null; + } } protected void onSaveInstanceState( Bundle outState ) @@ -1044,16 +1046,7 @@ public class GamesListDelegate extends ListDelegateBase if ( hasFocus ) { updateField(); - if ( 0 != m_launchedGames.size() ) { - long rowid = m_launchedGames.iterator().next(); - m_launchedGames.remove( rowid ); - - if ( m_adapter.inExpandedGroup( rowid ) ) { - setSelGame( rowid ); - } else { - clearSelections(); - } - } + m_launchedGames.clear(); } } @@ -1303,7 +1296,7 @@ public class GamesListDelegate extends ListDelegateBase if ( !cancelled ) { long rowID = data.getLongExtra( GameUtils.INTENT_KEY_ROWID, DBUtils.ROWID_NOTFOUND ); - GameUtils.launchGame( m_activity, rowID ); + GameUtils.launchGame( getDelegator(), rowID ); } break; } @@ -2292,7 +2285,7 @@ public class GamesListDelegate extends ListDelegateBase long[] rowIDs = { rowID }; doConfirmReset( rowIDs ); } else if ( checkWarnNoDict( rowID ) ) { - GameUtils.launchGame( m_activity, rowID ); + GameUtils.launchGame( getDelegator(), rowID ); } } return madeGame; @@ -2306,7 +2299,10 @@ public class GamesListDelegate extends ListDelegateBase // m_delegator.launchGame( rowid, invited ); if ( ! m_launchedGames.contains( rowid ) ) { m_launchedGames.add( rowid ); - GameUtils.launchGame( m_activity, rowid, invited ); + if ( m_adapter.inExpandedGroup( rowid ) ) { + setSelGame( rowid ); + } + GameUtils.launchGame( getDelegator(), rowid, invited ); } } @@ -2342,8 +2338,13 @@ public class GamesListDelegate extends ListDelegateBase && summary.roomName.length() == 0 ) { Assert.fail(); } else { - if ( checkWarnNoDict( rowid ) ) { - launchGame( rowid ); + try { + if ( checkWarnNoDict( rowid ) ) { + launchGame( rowid ); + } + } catch ( GameLock.GameLockedException gle ) { + DbgUtils.loge( gle ); + finish(); } } } @@ -2486,7 +2487,7 @@ public class GamesListDelegate extends ListDelegateBase .CONFIG_GAME, rowID ); } else { // launch it - GameUtils.launchGame( m_activity, rowID ); + GameUtils.launchGame( getDelegator(), rowID ); } } }