From 8f60ca5af3e7e21842944cb831e829a141899a88 Mon Sep 17 00:00:00 2001 From: Andy2 Date: Fri, 19 Aug 2011 18:52:55 -0700 Subject: [PATCH] Need to show dict-gone-missing dialog when umount from GameConfig too, so: change loadMakeGame() to return gamePtr rather than take one in, and to return 0 when any dict no available. Move dict-gone-missing dialog into DlgDelegate. Remove DlgDelegate always adding onDismiss listener that removes the dialog, and instead add one to the dict-gone-missing dialog that, like the onClick handler, calls finish() on the activity. --- .../eehouse/android/xw4/BoardActivity.java | 18 +-- .../org/eehouse/android/xw4/DlgDelegate.java | 35 +++- .../org/eehouse/android/xw4/GameConfig.java | 153 +++++++++--------- .../org/eehouse/android/xw4/GameUtils.java | 50 +++--- .../android/xw4/RelayGameActivity.java | 3 +- .../org/eehouse/android/xw4/XWActivity.java | 15 +- .../eehouse/android/xw4/XWListActivity.java | 1 + 7 files changed, 153 insertions(+), 122 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 94bfe9947..436809680 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/BoardActivity.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/BoardActivity.java @@ -69,7 +69,6 @@ public class BoardActivity extends XWActivity private static final int QUERY_ENDGAME = DLG_OKONLY + 7; private static final int DLG_DELETED = DLG_OKONLY + 8; private static final int DLG_INVITE = DLG_OKONLY + 9; - private static final int DLG_NODICT = DLG_OKONLY + 10; private static final int CHAT_REQUEST = 1; private static final int SCREEN_ON_TIME = 10 * 60 * 1000; // 10 mins @@ -288,21 +287,6 @@ public class BoardActivity extends XWActivity .create(); } break; - case DLG_NODICT: - dialog = new AlertDialog.Builder( this ) - .setTitle( R.string.no_dict_title ) - .setMessage( R.string.no_dict_finish ) - .setPositiveButton( R.string.button_close_game, null ) - .create(); - OnDismissListener dlstnr; - dlstnr = new OnDismissListener() { - public void onDismiss( DialogInterface di ) { - // removeDialog( DLG_NODICT ); - finish(); - } - }; - dialog.setOnDismissListener( dlstnr ); - break; default: // just drop it; super.onCreateDialog likely failed break; @@ -1065,7 +1049,7 @@ public class BoardActivity extends XWActivity GameUtils.DictPairs pairs = GameUtils.openDicts( this, dictNames ); if ( pairs.anyMissing( dictNames ) ) { - showDialog( DLG_NODICT ); + showDictGoneFinish(); } else { String langName = m_gi.langName(); diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/DlgDelegate.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/DlgDelegate.java index 67e3a3193..8f91ed2d1 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/DlgDelegate.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/DlgDelegate.java @@ -40,7 +40,8 @@ public class DlgDelegate { public static final int DIALOG_NOTAGAIN = 3; public static final int CONFIRM_THEN = 4; public static final int TEXT_OR_HTML_THEN = 5; - public static final int DIALOG_LAST = TEXT_OR_HTML_THEN; + public static final int DLG_DICTGONE = 6; + public static final int DIALOG_LAST = DLG_DICTGONE; private int m_msgID; private String m_msg; @@ -78,6 +79,9 @@ public class DlgDelegate { case TEXT_OR_HTML_THEN: dialog = createHtmlThenDialog(); break; + case DLG_DICTGONE: + dialog = createDictGoneDialog(); + break; } return dialog; } @@ -141,6 +145,11 @@ public class DlgDelegate { m_activity.showDialog( DIALOG_OKONLY ); } + public void showDictGoneFinish() + { + m_activity.showDialog( DLG_DICTGONE ); + } + public void showAboutDialog() { m_activity.showDialog( DIALOG_ABOUT ); @@ -283,4 +292,28 @@ public class DlgDelegate { .create(); } + private Dialog createDictGoneDialog() + { + Utils.logf( "DlgDelegate.createDictGoneDialog() called" ); + Dialog dialog; + dialog = new AlertDialog.Builder( m_activity ) + .setTitle( R.string.no_dict_title ) + .setMessage( R.string.no_dict_finish ) + .setPositiveButton( R.string.button_close_game, + new DialogInterface.OnClickListener() { + public void onClick( DialogInterface dlg, int item ) { + m_activity.finish(); + } + } ) + .create(); + + dialog.setOnDismissListener( new DialogInterface.OnDismissListener() { + public void onDismiss( DialogInterface di ) { + m_activity.finish(); + } + } ); + + return dialog; + } + } diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/GameConfig.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/GameConfig.java index 0f5e18f6e..b007ee2ae 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/GameConfig.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/GameConfig.java @@ -396,88 +396,91 @@ public class GameConfig extends XWActivity { super.onResume(); - int gamePtr = XwJNI.initJNI(); m_giOrig = new CurGameInfo( this ); // Lock in case we're going to config. We *could* re-get the // lock once the user decides to make changes. PENDING. m_gameLock = new GameUtils.GameLock( m_rowid, true ).lock(); - GameUtils.loadMakeGame( this, gamePtr, m_giOrig, m_gameLock ); - m_gameStarted = XwJNI.model_getNMoves( gamePtr ) > 0 - || XwJNI.comms_isConnected( gamePtr ); - - if ( m_gameStarted ) { - if ( null == m_gameLockedCheck ) { - m_gameLockedCheck = - (CheckBox)findViewById( R.id.game_locked_check ); - m_gameLockedCheck.setVisibility( View.VISIBLE ); - m_gameLockedCheck.setChecked( true ); - m_gameLockedCheck.setOnClickListener( this ); - } - handleLockedChange(); - } - - m_gi = new CurGameInfo( this, m_giOrig ); - - m_carOrig = new CommsAddrRec( this ); - if ( XwJNI.game_hasComms( gamePtr ) ) { - XwJNI.comms_getAddr( gamePtr, m_carOrig ); + int gamePtr = GameUtils.loadMakeGame( this, m_giOrig, m_gameLock ); + if ( 0 == gamePtr ) { + showDictGoneFinish(); } else { - String relayName = CommonPrefs.getDefaultRelayHost( this ); - int relayPort = CommonPrefs.getDefaultRelayPort( this ); - XwJNI.comms_getInitialAddr( m_carOrig, relayName, relayPort ); - } - XwJNI.game_dispose( gamePtr ); + m_gameStarted = XwJNI.model_getNMoves( gamePtr ) > 0 + || XwJNI.comms_isConnected( gamePtr ); - m_car = new CommsAddrRec( m_carOrig ); - - m_notNetworkedGame = DeviceRole.SERVER_STANDALONE == m_gi.serverRole; - setTitle(); - - if ( !m_notNetworkedGame ) { - m_joinPublicCheck = - (CheckBox)findViewById(R.id.join_public_room_check); - m_joinPublicCheck.setOnClickListener( this ); - m_joinPublicCheck.setChecked( m_car.ip_relay_seeksPublicRoom ); - Utils.setChecked( this, R.id.advertise_new_room_check, - m_car.ip_relay_advertiseRoom ); - m_publicRoomsSet = - (LinearLayout)findViewById(R.id.public_rooms_set ); - m_privateRoomsSet = - (LinearLayout)findViewById(R.id.private_rooms_set ); - - Utils.setText( this, R.id.room_edit, m_car.ip_relay_invite ); - - m_roomChoose = (Spinner)findViewById( R.id.room_spinner ); - - m_refreshRoomsButton = - (ImageButton)findViewById( R.id.refresh_button ); - m_refreshRoomsButton.setOnClickListener( this ); - - adjustConnectStuff(); - } - - loadPlayers(); - configLangSpinner(); - - m_phoniesSpinner.setSelection( m_gi.phoniesAction.ordinal() ); - - setSmartnessSpinner(); - - Utils.setChecked( this, R.id.hints_allowed, !m_gi.hintsNotAllowed ); - Utils.setInt( this, R.id.timer_minutes_edit, - m_gi.gameSeconds/60/m_gi.nPlayers ); - - CheckBox check = (CheckBox)findViewById( R.id.use_timer ); - CompoundButton.OnCheckedChangeListener lstnr = - new CompoundButton.OnCheckedChangeListener() { - public void onCheckedChanged( CompoundButton buttonView, - boolean checked ) { - View view = findViewById( R.id.timer_set ); - view.setVisibility( checked ? View.VISIBLE : View.GONE ); + if ( m_gameStarted ) { + if ( null == m_gameLockedCheck ) { + m_gameLockedCheck = + (CheckBox)findViewById( R.id.game_locked_check ); + m_gameLockedCheck.setVisibility( View.VISIBLE ); + m_gameLockedCheck.setChecked( true ); + m_gameLockedCheck.setOnClickListener( this ); } - }; - check.setOnCheckedChangeListener( lstnr ); - Utils.setChecked( this, R.id.use_timer, m_gi.timerEnabled ); + handleLockedChange(); + } + + m_gi = new CurGameInfo( this, m_giOrig ); + + m_carOrig = new CommsAddrRec( this ); + if ( XwJNI.game_hasComms( gamePtr ) ) { + XwJNI.comms_getAddr( gamePtr, m_carOrig ); + } else { + String relayName = CommonPrefs.getDefaultRelayHost( this ); + int relayPort = CommonPrefs.getDefaultRelayPort( this ); + XwJNI.comms_getInitialAddr( m_carOrig, relayName, relayPort ); + } + XwJNI.game_dispose( gamePtr ); + + m_car = new CommsAddrRec( m_carOrig ); + + m_notNetworkedGame = DeviceRole.SERVER_STANDALONE == m_gi.serverRole; + setTitle(); + + if ( !m_notNetworkedGame ) { + m_joinPublicCheck = + (CheckBox)findViewById(R.id.join_public_room_check); + m_joinPublicCheck.setOnClickListener( this ); + m_joinPublicCheck.setChecked( m_car.ip_relay_seeksPublicRoom ); + Utils.setChecked( this, R.id.advertise_new_room_check, + m_car.ip_relay_advertiseRoom ); + m_publicRoomsSet = + (LinearLayout)findViewById(R.id.public_rooms_set ); + m_privateRoomsSet = + (LinearLayout)findViewById(R.id.private_rooms_set ); + + Utils.setText( this, R.id.room_edit, m_car.ip_relay_invite ); + + m_roomChoose = (Spinner)findViewById( R.id.room_spinner ); + + m_refreshRoomsButton = + (ImageButton)findViewById( R.id.refresh_button ); + m_refreshRoomsButton.setOnClickListener( this ); + + adjustConnectStuff(); + } + + loadPlayers(); + configLangSpinner(); + + m_phoniesSpinner.setSelection( m_gi.phoniesAction.ordinal() ); + + setSmartnessSpinner(); + + Utils.setChecked( this, R.id.hints_allowed, !m_gi.hintsNotAllowed ); + Utils.setInt( this, R.id.timer_minutes_edit, + m_gi.gameSeconds/60/m_gi.nPlayers ); + + CheckBox check = (CheckBox)findViewById( R.id.use_timer ); + CompoundButton.OnCheckedChangeListener lstnr = + new CompoundButton.OnCheckedChangeListener() { + public void onCheckedChanged( CompoundButton buttonView, + boolean checked ) { + View view = findViewById( R.id.timer_set ); + view.setVisibility( checked ? View.VISIBLE : View.GONE ); + } + }; + check.setOnCheckedChangeListener( lstnr ); + Utils.setChecked( this, R.id.use_timer, m_gi.timerEnabled ); + } } // onResume @Override 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 3381468af..60e392920 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/GameUtils.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/GameUtils.java @@ -198,13 +198,12 @@ public class GameUtils { public static GameLock resetGame( Context context, GameLock lockSrc, GameLock lockDest ) { - int gamePtr = XwJNI.initJNI(); CurGameInfo gi = new CurGameInfo( context ); CommsAddrRec addr = null; // loadMakeGame, if makinga new game, will add comms as long // as DeviceRole.SERVER_STANDALONE != gi.serverRole - loadMakeGame( context, gamePtr, gi, lockSrc ); + int gamePtr = loadMakeGame( context, gi, lockSrc ); String[] dictNames = gi.dictNames(); DictPairs pairs = openDicts( context, dictNames ); @@ -282,9 +281,8 @@ public class GameUtils { public static GameSummary summarize( Context context, GameLock lock ) { - int gamePtr = XwJNI.initJNI(); CurGameInfo gi = new CurGameInfo( context ); - loadMakeGame( context, gamePtr, gi, lock ); + int gamePtr = loadMakeGame( context, gi, lock ); return summarizeAndClose( context, lock, gamePtr, gi ); } @@ -321,33 +319,40 @@ public class GameUtils { return result; } - public static void loadMakeGame( Context context, int gamePtr, - CurGameInfo gi, GameLock lock ) + public static int loadMakeGame( Context context, CurGameInfo gi, + GameLock lock ) { - loadMakeGame( context, gamePtr, gi, null, lock ); + return loadMakeGame( context, gi, null, lock ); } - public static void loadMakeGame( Context context, int gamePtr, - CurGameInfo gi, UtilCtxt util, - GameLock lock ) + public static int loadMakeGame( Context context, CurGameInfo gi, + UtilCtxt util, GameLock lock ) { + int gamePtr = 0; + byte[] stream = savedGame( context, lock ); XwJNI.gi_from_stream( gi, stream ); String[] dictNames = gi.dictNames(); DictPairs pairs = openDicts( context, dictNames ); - String langName = gi.langName(); + if ( pairs.anyMissing( dictNames ) ) { + Utils.logf( "loadMakeGame() failing: dict unavailable" ); + } else { + gamePtr = XwJNI.initJNI(); - boolean madeGame = XwJNI.game_makeFromStream( gamePtr, stream, - JNIUtilsImpl.get(), gi, - dictNames, pairs.m_bytes, - pairs.m_paths, langName, - util, - CommonPrefs.get(context)); - if ( !madeGame ) { - XwJNI.game_makeNewGame( gamePtr, gi, JNIUtilsImpl.get(), - CommonPrefs.get(context), dictNames, - pairs.m_bytes, pairs.m_paths, langName ); + String langName = gi.langName(); + boolean madeGame = XwJNI.game_makeFromStream( gamePtr, stream, + JNIUtilsImpl.get(), gi, + dictNames, pairs.m_bytes, + pairs.m_paths, langName, + util, + CommonPrefs.get(context)); + if ( !madeGame ) { + XwJNI.game_makeNewGame( gamePtr, gi, JNIUtilsImpl.get(), + CommonPrefs.get(context), dictNames, + pairs.m_bytes, pairs.m_paths, langName ); + } } + return gamePtr; } public static long saveGame( Context context, int gamePtr, @@ -872,12 +877,11 @@ public class GameUtils { boolean draw = false; long rowid = DBUtils.getRowIDFor( context, relayID ); if ( -1 != rowid ) { - int gamePtr = XwJNI.initJNI(); CurGameInfo gi = new CurGameInfo( context ); FeedUtilsImpl feedImpl = new FeedUtilsImpl( context, rowid ); GameLock lock = new GameLock( rowid, true ); if ( lock.tryLock() ) { - loadMakeGame( context, gamePtr, gi, feedImpl, lock ); + int gamePtr = loadMakeGame( context, gi, feedImpl, lock ); for ( byte[] msg : msgs ) { draw = XwJNI.game_receiveMessage( gamePtr, msg ) || draw; diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/RelayGameActivity.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/RelayGameActivity.java index 1f0ee8d09..4f23b8ede 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/RelayGameActivity.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/RelayGameActivity.java @@ -67,10 +67,9 @@ public class RelayGameActivity extends XWActivity { super.onStart(); - int gamePtr = XwJNI.initJNI(); m_gi = new CurGameInfo( this ); m_gameLock = new GameUtils.GameLock( m_rowid, true ).lock(); - GameUtils.loadMakeGame( this, gamePtr, m_gi, m_gameLock ); + int gamePtr = GameUtils.loadMakeGame( this, m_gi, m_gameLock ); m_car = new CommsAddrRec( this ); if ( XwJNI.game_hasComms( gamePtr ) ) { XwJNI.comms_getAddr( gamePtr, m_car ); diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/XWActivity.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/XWActivity.java index 7bb01a339..d094a9adf 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/XWActivity.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/XWActivity.java @@ -36,6 +36,7 @@ public class XWActivity extends Activity { private DlgDelegate m_delegate; + @Override protected void onCreate( Bundle savedInstanceState ) { Utils.logf( "%s.onCreate(this=%H)", getClass().getName(), this ); @@ -84,10 +85,10 @@ public class XWActivity extends Activity { @Override protected Dialog onCreateDialog( int id ) { - Utils.logf( "%s.onCreateDialog() called", getClass().getName() ); - Dialog dialog = m_delegate.onCreateDialog( id ); - if ( null != dialog ) { - setRemoveOnDismiss( dialog, id ); + Dialog dialog = super.onCreateDialog( id ); + if ( null == dialog ) { + Utils.logf( "%s.onCreateDialog() called", getClass().getName() ); + dialog = m_delegate.onCreateDialog( id ); } return dialog; } @@ -100,6 +101,7 @@ public class XWActivity extends Activity { @Override protected void onPrepareDialog( int id, Dialog dialog ) { + super.onPrepareDialog( id, dialog ); // docs say should call through m_delegate.onPrepareDialog( id, dialog ); } @@ -121,6 +123,11 @@ public class XWActivity extends Activity { m_delegate.showOKOnlyDialog( msgID ); } + protected void showDictGoneFinish() + { + m_delegate.showDictGoneFinish(); + } + protected void showConfirmThen( int msgID, DialogInterface.OnClickListener action ) { diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/XWListActivity.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/XWListActivity.java index 77fe99799..bb1206eff 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/XWListActivity.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/XWListActivity.java @@ -106,6 +106,7 @@ public class XWListActivity extends ListActivity { @Override protected void onPrepareDialog( int id, Dialog dialog ) { + super.onPrepareDialog( id, dialog ); m_delegate.onPrepareDialog( id, dialog ); }