don't lose track of what's open when device rotates

GamesListDelegate is the wrong place to track open games (boards). Let's
try doing it in BoardDelegate.
This commit is contained in:
Eric House 2021-09-04 15:19:40 -07:00
parent 4c94f19ec6
commit 550795d3a1
3 changed files with 32 additions and 13 deletions

View file

@ -47,6 +47,7 @@ import android.widget.TextView;
import java.io.Serializable; import java.io.Serializable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -491,6 +492,7 @@ public class BoardDelegate extends DelegateBase
m_rowid = args.getLong( GameUtils.INTENT_KEY_ROWID, -1 ); m_rowid = args.getLong( GameUtils.INTENT_KEY_ROWID, -1 );
Log.i( TAG, "opening rowid %d", m_rowid ); Log.i( TAG, "opening rowid %d", m_rowid );
m_overNotShown = true; m_overNotShown = true;
noteOpened( m_rowid );
} // init } // init
private void getLock() private void getLock()
@ -600,6 +602,7 @@ public class BoardDelegate extends DelegateBase
closeIfFinishing( true ); closeIfFinishing( true );
releaseThreadOnce(); releaseThreadOnce();
GamesListDelegate.boardDestroyed( m_rowid ); GamesListDelegate.boardDestroyed( m_rowid );
noteClosed( m_rowid );
super.onDestroy(); super.onDestroy();
} }
@ -3037,6 +3040,30 @@ public class BoardDelegate extends DelegateBase
} }
} }
// This might need to map rowid->openCount so opens can stack
static Set<Long> sOpenRows = new HashSet<>();
private static void noteOpened( long rowid )
{
Log.d( TAG, "noteOpened(%d)", rowid );
Assert.assertTrueNR( !sOpenRows.contains(rowid) );
sOpenRows.add( rowid );
}
private static void noteClosed( long rowid )
{
Log.d( TAG, "noteClosed(%d)", rowid );
Assert.assertTrueNR( sOpenRows.contains(rowid) );
sOpenRows.remove( rowid );
}
static boolean gameIsOpen( long rowid )
{
boolean result = sOpenRows.contains( rowid );
Log.d( TAG, "gameIsOpen(%d) => %b", rowid, result );
return result;
}
private static void setupRematchFor( Activity activity, GamePtr gamePtr, private static void setupRematchFor( Activity activity, GamePtr gamePtr,
GameSummary summary, CurGameInfo gi ) GameSummary summary, CurGameInfo gi )
{ {

View file

@ -167,6 +167,7 @@ public class GameListItem extends LinearLayout
} }
// View.OnClickListener interface // View.OnClickListener interface
@Override
public void onClick( View view ) public void onClick( View view )
{ {
int id = view.getId(); int id = view.getId();

View file

@ -611,7 +611,6 @@ public class GamesListDelegate extends ListDelegateBase
private int m_missingDictLang; private int m_missingDictLang;
private String m_nameField; private String m_nameField;
private NetLaunchInfo m_netLaunchInfo; private NetLaunchInfo m_netLaunchInfo;
private Set<Long> m_launchedGames; // prevent problems with double-taps
private boolean m_menuPrepared; private boolean m_menuPrepared;
private String m_origTitle; private String m_origTitle;
private Button[] m_newGameButtons; private Button[] m_newGameButtons;
@ -624,7 +623,6 @@ public class GamesListDelegate extends ListDelegateBase
{ {
super( delegator, sis, R.layout.game_list, R.menu.games_list_menu ); super( delegator, sis, R.layout.game_list, R.menu.games_list_menu );
m_activity = delegator.getActivity(); m_activity = delegator.getActivity();
m_launchedGames = new HashSet<>();
s_self = this; s_self = this;
} }
@ -1120,7 +1118,6 @@ public class GamesListDelegate extends ListDelegateBase
protected void handleNewIntent( Intent intent ) protected void handleNewIntent( Intent intent )
{ {
Log.d( TAG, "handleNewIntent(extras={%s})", DbgUtils.extrasToString( intent ) ); Log.d( TAG, "handleNewIntent(extras={%s})", DbgUtils.extrasToString( intent ) );
m_launchedGames.clear();
Assert.assertNotNull( intent ); Assert.assertNotNull( intent );
tryStartsFromIntent( intent ); tryStartsFromIntent( intent );
} }
@ -1259,8 +1256,6 @@ public class GamesListDelegate extends ListDelegateBase
{ {
if ( hasFocus ) { if ( hasFocus ) {
updateField(); updateField();
m_launchedGames.clear(); // This is probably wrong!!!
} }
} }
@ -1294,7 +1289,6 @@ public class GamesListDelegate extends ListDelegateBase
switch( change ) { switch( change ) {
case GAME_DELETED: case GAME_DELETED:
m_adapter.removeGame( rowid ); m_adapter.removeGame( rowid );
m_launchedGames.remove( rowid );
m_mySIS.selGames.remove( rowid ); m_mySIS.selGames.remove( rowid );
invalidateOptionsMenuIf(); invalidateOptionsMenuIf();
break; break;
@ -1328,7 +1322,7 @@ public class GamesListDelegate extends ListDelegateBase
private void openWithChecks( long rowid, GameSummary summary ) private void openWithChecks( long rowid, GameSummary summary )
{ {
if ( ! m_launchedGames.contains( rowid ) ) { if ( ! BoardDelegate.gameIsOpen( rowid ) ) {
if ( Quarantine.safeToOpen( rowid ) ) { if ( Quarantine.safeToOpen( rowid ) ) {
makeNotAgainBuilder( R.string.not_again_newselect, makeNotAgainBuilder( R.string.not_again_newselect,
R.string.key_notagain_newselect, R.string.key_notagain_newselect,
@ -1702,7 +1696,7 @@ public class GamesListDelegate extends ListDelegateBase
// currently open // currently open
enable = 0 < nGamesSelected; enable = 0 < nGamesSelected;
for ( long row : m_mySIS.selGames ) { for ( long row : m_mySIS.selGames ) {
enable = enable && !m_launchedGames.contains( row ); enable = enable && !BoardDelegate.gameIsOpen( row );
} }
Utils.setItemVisible( menu, R.id.games_game_delete, enable ); Utils.setItemVisible( menu, R.id.games_game_delete, enable );
Utils.setItemVisible( menu, R.id.games_game_reset, enable ); Utils.setItemVisible( menu, R.id.games_game_reset, enable );
@ -1922,7 +1916,7 @@ public class GamesListDelegate extends ListDelegateBase
enable = BuildConfig.DEBUG || XWPrefs.getDebugEnabled( m_activity ); enable = BuildConfig.DEBUG || XWPrefs.getDebugEnabled( m_activity );
Utils.setItemVisible( menu, R.id.games_game_markbad, enable ); Utils.setItemVisible( menu, R.id.games_game_markbad, enable );
enable = !m_launchedGames.contains( rowID ); enable = !BoardDelegate.gameIsOpen( rowID );
Utils.setItemVisible( menu, R.id.games_game_delete, enable ); Utils.setItemVisible( menu, R.id.games_game_delete, enable );
Utils.setItemVisible( menu, R.id.games_game_reset, enable ); Utils.setItemVisible( menu, R.id.games_game_reset, enable );
} else { } else {
@ -2847,8 +2841,7 @@ public class GamesListDelegate extends ListDelegateBase
{ {
if ( DBUtils.ROWID_NOTFOUND == rowid ) { if ( DBUtils.ROWID_NOTFOUND == rowid ) {
Log.d( TAG, "launchGame(): dropping bad rowid" ); Log.d( TAG, "launchGame(): dropping bad rowid" );
} else if ( ! m_launchedGames.contains( rowid ) ) { } else if ( ! BoardDelegate.gameIsOpen( rowid ) ) {
m_launchedGames.add( rowid );
if ( m_adapter.inExpandedGroup( rowid ) ) { if ( m_adapter.inExpandedGroup( rowid ) ) {
setSelGame( rowid ); setSelGame( rowid );
} }
@ -3057,8 +3050,6 @@ public class GamesListDelegate extends ListDelegateBase
public static void boardDestroyed( long rowid ) public static void boardDestroyed( long rowid )
{ {
if ( null != s_self ) { if ( null != s_self ) {
// remove likely a no-op: launching clears the set, but shouldn't
s_self.m_launchedGames.remove( rowid );
s_self.invalidateOptionsMenuIf(); s_self.invalidateOptionsMenuIf();
} }
} }