snapshot: fix crash on ICS; create game in selected group rather than

default (probably works local games only); etc.
This commit is contained in:
Eric House 2013-10-19 21:58:44 -07:00
parent 7712ee15e3
commit 93425fe1e7
8 changed files with 146 additions and 69 deletions

View file

@ -2129,8 +2129,12 @@
<string name="group_confirm_del">Are you sure you want to delete
this group?</string>
<string name="groups_confirm_del">Are you sure you want to delete
these groups?</string>
<string name="group_confirm_delf">\u0020(It contains %d game[s],
which will also be deleted.)</string>
<string name="groups_confirm_delf">\u0020(They contains %d game[s],
which will also be deleted.)</string>
<string name="rename_group_label">Change the name of this group to:</string>
<string name="game_name_group_title">Name group</string>

View file

@ -695,6 +695,14 @@ public class DBUtils {
public static GameLock saveNewGame( Context context, byte[] bytes )
{
long groupID = XWPrefs.getDefaultNewGameGroup( context );
return saveNewGame( context, bytes, groupID );
}
public static GameLock saveNewGame( Context context, byte[] bytes,
long groupID )
{
Assert.assertTrue( -1 != groupID ); // DON'T SHIP
GameLock lock = null;
initDB( context );
@ -707,8 +715,7 @@ public class DBUtils {
long timestamp = new Date().getTime();
values.put( DBHelper.CREATE_TIME, timestamp );
values.put( DBHelper.LASTPLAY_TIME, timestamp );
values.put( DBHelper.GROUPID,
XWPrefs.getDefaultNewGameGroup( context ) );
values.put( DBHelper.GROUPID, groupID );
values.put( DBHelper.VISID, maxVISID( db ) );
long rowid = db.insert( DBHelper.TABLE_NAME_SUM, null, values );

View file

@ -190,7 +190,12 @@ public class DlgDelegate {
public void showConfirmThen( String msg, int callbackID )
{
showConfirmThen( msg, R.string.button_ok, callbackID );
showConfirmThen( msg, R.string.button_ok, callbackID, null );
}
public void showConfirmThen( String msg, int callbackID, Object[] params )
{
showConfirmThen( msg, R.string.button_ok, callbackID, params );
}
public void showConfirmThen( String msg, int posButton, int callbackID )

View file

@ -156,7 +156,7 @@ public class GameListAdapter implements ExpandableListAdapter {
return ggi.m_name;
}
public void clearSelectedRows( Set<Long> rowids )
public void clearSelectedGames( long[] rowids )
{
deselectRows( rowids );
}
@ -187,11 +187,11 @@ public class GameListAdapter implements ExpandableListAdapter {
DBUtils.setGroupExpanded( m_context, groupid, false );
long[] rowids = DBUtils.getGroupGames( m_context, groupid );
HashSet<Long> asSet = new HashSet<Long>(rowids.length);
for ( long rowid : rowids ) {
asSet.add( rowid );
}
deselectRows( asSet );
// HashSet<Long> asSet = new HashSet<Long>(rowids.length);
// for ( long rowid : rowids ) {
// asSet.add( rowid );
// }
deselectRows( rowids );
}
public void onGroupExpanded( int groupPosition )
@ -282,7 +282,12 @@ public class GameListAdapter implements ExpandableListAdapter {
public int getChildrenCount( int groupPosition )
{
long[] rows = getRows( getPositions()[groupPosition] );
return getChildrenCount( getPositions()[groupPosition] );
}
public int getChildrenCount( long groupID )
{
long[] rows = getRows( groupID );
return rows.length;
}
@ -372,9 +377,9 @@ public class GameListAdapter implements ExpandableListAdapter {
return gameInfo().get( getPositions()[groupPosition] );
}
private void deselectRows( Set<Long> rowids )
private void deselectRows( long[] rowids )
{
GameListItem[] items = new GameListItem[rowids.size()];
GameListItem[] items = new GameListItem[rowids.length];
getGameItemsFor( rowids, items );
for ( GameListItem item : items ) {
if ( null != item ) {
@ -393,15 +398,20 @@ public class GameListAdapter implements ExpandableListAdapter {
}
}
private void getGameItemsFor( Set<Long> rowids, GameListItem[] items )
private void getGameItemsFor( long[] rowids, GameListItem[] items )
{
Set<Long> rowidsSet = new HashSet<Long>();
for ( long rowid : rowids ) {
rowidsSet.add( rowid );
}
int next = 0;
int count = m_list.getChildCount();
for ( int ii = 0; ii < count; ++ii ) {
View view = m_list.getChildAt( ii );
if ( view instanceof GameListItem ) {
GameListItem tryme = (GameListItem)view;
if ( rowids.contains( tryme.getRowID() ) ) {
if ( rowidsSet.contains( tryme.getRowID() ) ) {
items[next++] = tryme;
if ( next >= items.length ) {
break;
@ -413,8 +423,7 @@ public class GameListAdapter implements ExpandableListAdapter {
private GameListItem getGameItemFor( long rowid )
{
Set<Long> rowids = new HashSet<Long>(1);
rowids.add( rowid );
long[] rowids = { rowid };
GameListItem[] items = new GameListItem[1];
getGameItemsFor( rowids, items );
return items[0];

View file

@ -319,11 +319,17 @@ public class GameUtils {
}
public static long saveNew( Context context, CurGameInfo gi )
{
long groupID = XWPrefs.getDefaultNewGameGroup( context );
return saveNew( context, gi, groupID );
}
public static long saveNew( Context context, CurGameInfo gi, long groupID )
{
long rowid = DBUtils.ROWID_NOTFOUND;
byte[] bytes = XwJNI.gi_to_stream( gi );
if ( null != bytes ) {
GameLock lock = DBUtils.saveNewGame( context, bytes );
GameLock lock = DBUtils.saveNewGame( context, bytes, groupID );
rowid = lock.getRowid();
lock.unlock();
}

View file

@ -87,36 +87,34 @@ public class GamesList extends XWExpandableListActivity
RESET_GAME,
SYNC_MENU,
NEW_FROM,
DELETE_GROUP,
DELETE_GROUPS,
DELETE_GAMES,
OPEN_GAME
};
private static final int[] DEBUGITEMS = {
R.id.gamel_menu_loaddb
, R.id.gamel_menu_storedb
, R.id.gamel_menu_checkupdates
R.id.gamel_menu_loaddb,
R.id.gamel_menu_storedb,
R.id.gamel_menu_checkupdates,
};
private static final int[] NOSEL_ITEMS = {
R.id.gamel_menu_newgame
,R.id.gamel_menu_newgroup
,R.id.gamel_menu_prefs
,R.id.gamel_menu_dicts
,R.id.gamel_menu_about
,R.id.gamel_menu_email
,R.id.gamel_menu_checkmoves
R.id.gamel_menu_newgroup,
R.id.gamel_menu_prefs,
R.id.gamel_menu_dicts,
R.id.gamel_menu_about,
R.id.gamel_menu_email,
R.id.gamel_menu_checkmoves,
};
private static final int[] ONEGAME_ITEMS = {
R.id.listl_item_config
,R.id.list_item_rename
,R.id.list_item_new_from
,R.id.list_item_copy
R.id.listl_item_config,
R.id.list_item_rename,
R.id.list_item_new_from,
R.id.list_item_copy,
};
private static final int[] ONEGROUP_ITEMS = {
R.id.list_group_default
,R.id.list_group_rename
,R.id.list_group_moveup
,R.id.list_group_movedown
R.id.list_group_rename,
R.id.list_group_moveup,
R.id.list_group_movedown,
};
private static boolean s_firstShown = false;
@ -512,7 +510,7 @@ public class GamesList extends XWExpandableListActivity
int position = ((GameListGroup)toggled).getGroupPosition();
if ( selected ) {
m_selectedGroups.add( position );
clearSelectedRows();
clearSelectedGames();
} else {
m_selectedGroups.remove( position );
}
@ -572,8 +570,11 @@ public class GamesList extends XWExpandableListActivity
}
break;
case DELETE_GROUP:
GameUtils.deleteGroup( this, m_groupid );
case DELETE_GROUPS:
long[] groupIDs = (long[])params[0];
for ( long groupID : groupIDs ) {
GameUtils.deleteGroup( this, groupID );
}
onContentChanged();
break;
case DELETE_GAMES:
@ -602,7 +603,7 @@ public class GamesList extends XWExpandableListActivity
if ( 0 == m_selectedGames.size() ) {
super.onBackPressed();
} else {
clearSelectedRows();
clearSelections();
}
}
@ -641,7 +642,21 @@ public class GamesList extends XWExpandableListActivity
for ( int id : ONEGROUP_ITEMS ) {
Utils.setItemVisible( menu, id, 1 == nGroupsSelected );
}
// You can't delete the default group, nor make it the default
boolean defaultAvail = 1 == nGroupsSelected;
if ( defaultAvail ) {
int selPos = m_selectedGroups.iterator().next();
long selID = m_adapter.getGroupIDFor( selPos );
defaultAvail = selID != XWPrefs.getDefaultNewGameGroup( this );
}
Utils.setItemVisible( menu, R.id.list_group_default, defaultAvail );
Utils.setItemVisible( menu, R.id.list_group_delete, defaultAvail );
// New game available when nothing selected or one group
Utils.setItemVisible( menu, R.id.gamel_menu_newgame,
nothingSelected || 1 == nGroupsSelected );
// Multiples can be deleted
Utils.setItemVisible( menu, R.id.gamel_menu_delete,
0 < nGamesSelected );
@ -661,7 +676,7 @@ public class GamesList extends XWExpandableListActivity
int groupPos = getSelGroupPos();
long groupID = -1;
if ( 0 <= groupPos ) {
m_adapter.getGroupIDFor( groupPos );
groupID = m_adapter.getGroupIDFor( groupPos );
}
long[] selRowIDs = getSelRowIDs();
@ -671,7 +686,7 @@ public class GamesList extends XWExpandableListActivity
switch ( item.getItemId() ) {
case R.id.gamel_menu_newgame:
startNewGameActivity();
startNewGameActivity( groupID );
break;
case R.id.gamel_menu_newgroup:
@ -764,16 +779,23 @@ public class GamesList extends XWExpandableListActivity
// Group menus
case R.id.list_group_delete:
m_groupid = groupID;
if ( groupID == XWPrefs.getDefaultNewGameGroup( this ) ) {
showOKOnlyDialog( R.string.cannot_delete_default_group );
} else {
msg = getString( R.string.group_confirm_del );
int nGames = m_adapter.getChildrenCount( groupPos );
if ( 0 < nGames ) {
msg += getString( R.string.group_confirm_delf, nGames );
long[] groupIDs = getSelGroupIDs();
msg = getString( 1 == groupIDs.length ? R.string.group_confirm_del
: R.string.groups_confirm_del );
int nGames = 0;
for ( long tmp : groupIDs ) {
nGames += m_adapter.getChildrenCount( tmp );
}
showConfirmThen( msg, GamesActions.DELETE_GROUP.ordinal() );
if ( 0 < nGames ) {
int fmtID = 1 == groupIDs.length ? R.string.group_confirm_delf
: R.string.groups_confirm_delf;
msg += getString( fmtID, nGames );
}
showConfirmThen( msg, GamesActions.DELETE_GROUPS.ordinal(),
groupIDs );
}
break;
case R.id.list_group_default:
@ -944,9 +966,12 @@ public class GamesList extends XWExpandableListActivity
}
}
private void startNewGameActivity()
private void startNewGameActivity( long groupID )
{
startActivity( new Intent( this, NewGameActivity.class ) );
if ( 0 > groupID ) {
groupID = XWPrefs.getDefaultNewGameGroup( this );
}
NewGameActivity.startActivity( this, groupID );
}
private void startNewNetGame( NetLaunchInfo nli )
@ -1073,39 +1098,38 @@ public class GamesList extends XWExpandableListActivity
private void clearSelections()
{
boolean inval = false;
if ( 0 < m_selectedGames.size() ) {
m_adapter.clearSelectedRows( m_selectedGames );
m_selectedGames.clear();
if ( clearSelectedGames() ) {
inval = true;
}
if ( 0 < m_selectedGroups.size() ) {
m_adapter.clearSelectedGroups( m_selectedGroups );
m_selectedGroups.clear();
if ( clearSelectedGroups() ) {
inval = true;
}
if ( inval ) {
if ( !inval ) {
Utils.invalidateOptionsMenuIf( this );
}
}
private void clearSelectedRows()
private boolean clearSelectedGames()
{
// clear any selection
if ( 0 < m_selectedGames.size() ) {
m_adapter.clearSelectedRows( m_selectedGames );
boolean needsClear = 0 < m_selectedGames.size();
if ( needsClear ) {
long[] rowIDs = getSelRowIDs();
m_selectedGames.clear();
m_adapter.clearSelectedGames( rowIDs );
}
return needsClear;
}
private void clearSelectedGroups()
private boolean clearSelectedGroups()
{
// clear any selection
if ( 0 < m_selectedGroups.size() ) {
boolean needsClear = 0 < m_selectedGroups.size();
if ( needsClear ) {
m_adapter.clearSelectedGroups( m_selectedGroups );
m_selectedGroups.clear();
}
return needsClear;
}
private boolean launchGameIf()
@ -1123,7 +1147,7 @@ public class GamesList extends XWExpandableListActivity
if ( !m_gameLaunched ) {
m_gameLaunched = true;
GameUtils.launchGame( this, rowid, invited );
clearSelectedRows();
// clearSelectedGames();
}
}
@ -1192,6 +1216,17 @@ public class GamesList extends XWExpandableListActivity
return result;
}
private long[] getSelGroupIDs()
{
long[] result = new long[m_selectedGroups.size()];
int ii = 0;
for ( Iterator<Integer> iter = m_selectedGroups.iterator();
iter.hasNext(); ) {
result[ii++] = m_adapter.getGroupIDFor( iter.next() );
}
return result;
}
public static void onGameDictDownload( Context context, Intent intent )
{
intent.setClass( context, GamesList.class );

View file

@ -51,6 +51,7 @@ public class NewGameActivity extends XWActivity {
private static final String SAVE_REMOTEGAME = "REMOTEGAME";
private static final String SAVE_GAMEID = "GAMEID";
private static final String SAVE_NAMEFOR = "SAVE_NAMEFOR";
private static final String GROUPID_EXTRA = "groupid";
private static final int CONFIG_FOR_BT = 1;
private static final int CONFIG_FOR_SMS = 2;
private static final int INVITE_FOR_BT = 3;
@ -68,6 +69,7 @@ public class NewGameActivity extends XWActivity {
private long m_newRowID = -1;
private String m_gameName;
private int m_gameID;
private long m_groupID;
private String m_remoteDev;
@Override
@ -76,6 +78,8 @@ public class NewGameActivity extends XWActivity {
super.onCreate( savedInstanceState );
getBundledData( savedInstanceState );
m_groupID = getIntent().getLongExtra( GROUPID_EXTRA, -1 );
setContentView( R.layout.new_game );
TextView desc = (TextView)findViewById( R.id.newgame_local_desc );
@ -327,7 +331,7 @@ public class NewGameActivity extends XWActivity {
rowid = GameUtils.makeNewNetGame( this, room, inviteID, lang,
dict, nPlayers, 1 );
} else {
rowid = GameUtils.saveNew( this, new CurGameInfo( this ) );
rowid = GameUtils.saveNew( this, new CurGameInfo( this ), m_groupID );
}
if ( launch ) {
@ -468,4 +472,11 @@ public class NewGameActivity extends XWActivity {
}
}
}
public static void startActivity( Activity parent, long groupID )
{
Intent intent = new Intent( parent, NewGameActivity.class );
intent.putExtra( GROUPID_EXTRA, groupID );
parent.startActivity( intent );
}
}

View file

@ -117,9 +117,9 @@ public class XWExpandableListActivity extends ExpandableListActivity
m_delegate.showOKOnlyDialog( msg );
}
protected void showConfirmThen( String msg, int action )
protected void showConfirmThen( String msg, int action, Object... params )
{
m_delegate.showConfirmThen( msg, action );
m_delegate.showConfirmThen( msg, action, params );
}
protected void showConfirmThen( String msg, int posButton, int action,