diff --git a/xwords4/android/XWords4/res/values/strings.xml b/xwords4/android/XWords4/res/values/strings.xml
index ede5633e4..fdfce9d5e 100644
--- a/xwords4/android/XWords4/res/values/strings.xml
+++ b/xwords4/android/XWords4/res/values/strings.xml
@@ -1170,6 +1170,7 @@
it immediately because an email or messaging app will be
launched to send your invitation. -->
Invite now
+ Invite anyway
@@ -2466,11 +2467,15 @@
Connecting to relay…
This game is configured to use the
- relay for communication but has been unable to connect, either
- because of problems with your device\'s internet connection or
- because the relay is not running.\n\nPlease try opening the game
+ relay (server) for communication but has been unable to connect,
+ either because of problems with your device\'s internet connection
+ or because the relay is not running.\n\nPlease try opening the game
again later after conditions have changed.
+ (Because this game has other ways
+ of communicating, you can invite even without a relay connection,
+ but they you\'ll have to play the game without it.)
+
\u0020For example, you may need to be on
a different WiFi network.
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 3589154d5..e3bb34bf0 100644
--- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/BoardDelegate.java
+++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/BoardDelegate.java
@@ -432,8 +432,6 @@ public class BoardDelegate extends DelegateBase
.setNegativeButton( R.string.button_no, null )
.create();
break;
- case DLG_NOINVITE:
- Assert.assertFalse( m_relayConnected );
case DLG_INVITE:
lstnr = new OnClickListener() {
public void onClick( DialogInterface dialog,
@@ -449,7 +447,7 @@ public class BoardDelegate extends DelegateBase
};
dialog = ab.setTitle( "foo" )
.setMessage( "" )
- .setPositiveButton( R.string.newgame_invite, lstnr )
+ .setPositiveButton( "", lstnr )
.setNegativeButton( R.string.button_close_game, lstnr2 )
.setOnCancelListener( new OnCancelListener() {
public void onCancel( DialogInterface dialog ) {
@@ -476,48 +474,60 @@ public class BoardDelegate extends DelegateBase
{
switch( dlgID ) {
case DLG_INVITE:
- case DLG_NOINVITE:
AlertDialog ad = (AlertDialog)dialog;
String message;
int titleID;
boolean nukeButton = false;
+ int buttonTxt = R.string.newgame_invite;
if ( m_summary.hasRematchInfo() ) {
titleID = R.string.info_title;;
message = getString( R.string.rematch_msg );
nukeButton = true;
- } else if ( DlgID.DLG_NOINVITE == dlgID ) {
- titleID = R.string.seeking_relay;
- message = getString( R.string.no_relay_conn );
- if ( NetStateCache.netAvail( m_activity )
- && NetStateCache.onWifi() ) {
- message += getString( R.string.wifi_warning );
- }
- nukeButton = true;
- } else {
- titleID = R.string.waiting_title;
- message = getQuantityString( R.plurals.invite_msg_fmt,
- m_nMissing, m_nMissing );
-
- String ps = null;
- if ( m_nMissing > 1 ) {
- ps = getString( R.string.invite_multiple );
- } else {
- boolean[] avail = NFCUtils.nfcAvail( m_activity );
- if ( avail[1] ) {
- ps = getString( R.string.invite_if_nfc );
+ } else {
+ if ( !m_relayConnected ) {
+ titleID = R.string.seeking_relay;
+ // If relay is only means, don't allow at all
+ boolean relayOnly = 1 >= m_connTypes.size();
+ nukeButton = relayOnly;
+ message = getString( R.string.no_relay_conn );
+ if ( NetStateCache.netAvail( m_activity )
+ && NetStateCache.onWifi() ) {
+ message += getString( R.string.wifi_warning );
}
- }
- if ( null != ps ) {
- message += "\n\n" + ps;
- }
+ if ( !relayOnly ) {
+ message += "\n\n" + getString( R.string.skip_relay_warning );
+ buttonTxt = R.string.newgame_invite_anyway;
+ }
+ } else {
+ titleID = R.string.waiting_title;
+ message = getQuantityString( R.plurals.invite_msg_fmt,
+ m_nMissing, m_nMissing );
- message += "\n\n" + getString( R.string.invite_stays );
- }
- if ( nukeButton ) {
- ad.getButton( AlertDialog.BUTTON_POSITIVE ).setVisibility( View.GONE );
+ String ps = null;
+ if ( m_nMissing > 1 ) {
+ ps = getString( R.string.invite_multiple );
+ } else {
+ boolean[] avail = NFCUtils.nfcAvail( m_activity );
+ if ( avail[1] ) {
+ ps = getString( R.string.invite_if_nfc );
+ }
+ }
+ if ( null != ps ) {
+ message += "\n\n" + ps;
+ }
+
+ message += "\n\n" + getString( R.string.invite_stays );
+ }
}
+
ad.setMessage( message );
ad.setTitle( titleID );
+
+ Button posButton = ad.getButton( AlertDialog.BUTTON_POSITIVE );
+ posButton.setVisibility( nukeButton ? View.GONE : View.VISIBLE );
+ if ( !nukeButton ) {
+ posButton.setText( buttonTxt );
+ }
break;
default:
super.prepareDialog( dlgID, dialog );
@@ -666,9 +676,7 @@ public class BoardDelegate extends DelegateBase
setBackgroundColor();
setKeepScreenOn();
} else if ( ! isFinishing() ) {
- if ( !m_relayConnected ) {
- showDialog( DlgID.DLG_NOINVITE );
- } else if ( 0 < m_nMissing ) {
+ if ( !m_relayConnected || 0 < m_nMissing ) {
showDialog( DlgID.DLG_INVITE );
}
}
@@ -1034,6 +1042,9 @@ public class BoardDelegate extends DelegateBase
case EMAIL:
NetLaunchInfo nli = new NetLaunchInfo( m_summary, m_gi, 1,
1 + m_nGuestDevs );
+ if ( !m_relayConnected ) {
+ nli.removeAddress( CommsConnType.COMMS_CONN_RELAY );
+ }
GameUtils.launchEmailInviteActivity( m_activity, nli );
break;
default:
@@ -1376,7 +1387,7 @@ public class BoardDelegate extends DelegateBase
{
DbgUtils.logf( "BoardDelegate.handleConndMessage(): nMissing = %d", nMissing );
- dismissInviteAlerts( nMissing, true );
+ dismissInviteAlert( nMissing, true );
int naMsg = 0;
int naKey = 0;
@@ -1726,16 +1737,14 @@ public class BoardDelegate extends DelegateBase
m_nGuestDevs = nDevs;
// If we might have put up an alert earlier, take it down
- dismissInviteAlerts( nMissing, m_relayConnected );
+ dismissInviteAlert( nMissing, m_relayConnected );
m_nMissing = nMissing; // will be 0 unless isServer is true
- final DlgID dlgID =
- m_relayConnected ? DlgID.DLG_INVITE : DlgID.DLG_NOINVITE;
if ( 0 < nMissing && isServer && !m_haveInvited ) {
post( new Runnable() {
public void run() {
- showDialog( dlgID );
+ showDialog( DlgID.DLG_INVITE );
}
} );
}
@@ -2036,15 +2045,14 @@ public class BoardDelegate extends DelegateBase
}
}
- private void dismissInviteAlerts( final int nMissing, final boolean connected )
+ private void dismissInviteAlert( final int nMissing, final boolean connected )
{
runOnUiThread( new Runnable() {
public void run() {
if ( !m_relayConnected && connected ) {
m_relayConnected = true;
- dismissDialog( DlgID.DLG_NOINVITE );
}
- if ( 0 == nMissing ) {
+ if ( 0 == nMissing || m_relayConnected ) {
dismissDialog( DlgID.DLG_INVITE );
}
}
@@ -2285,6 +2293,10 @@ public class BoardDelegate extends DelegateBase
int forceChannel = ii + m_nGuestDevs + 1;
NetLaunchInfo nli = new NetLaunchInfo( m_summary, m_gi,
nPlayers, forceChannel );
+ if ( !m_relayConnected ) {
+ nli.removeAddress( CommsConnType.COMMS_CONN_RELAY );
+ }
+
switch ( m_missingMeans ) {
case BLUETOOTH:
if ( ! m_progressShown ) {
diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/DlgID.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/DlgID.java
index 2775ae4b1..6de9d61a7 100644
--- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/DlgID.java
+++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/DlgID.java
@@ -35,7 +35,6 @@ public enum DlgID {
, DLG_DELETED
, DLG_DICTGONE
, DLG_INVITE
- , DLG_NOINVITE
, DLG_OKONLY
, ENABLE_NFC
, FORCE_REMOTE
diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/NetLaunchInfo.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/NetLaunchInfo.java
index 1928e371a..c1e74d866 100644
--- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/NetLaunchInfo.java
+++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/NetLaunchInfo.java
@@ -258,6 +258,11 @@ public class NetLaunchInfo {
return m_addrs.contains( typ );
}
+ public void removeAddress( CommsConnType typ )
+ {
+ m_addrs.remove( typ );
+ }
+
public String inviteID()
{
String result = m_inviteID;
diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/jni/GameSummary.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/jni/GameSummary.java
index 2eb5f457a..d82e8dec0 100644
--- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/jni/GameSummary.java
+++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/jni/GameSummary.java
@@ -246,6 +246,13 @@ public class GameSummary {
{
boolean result = conTypes.contains( CommsConnType.COMMS_CONN_RELAY )
&& (null == relayID || 0 == relayID.length());
+ if ( result ) {
+ // Don't report it as unconnected if a game's happening
+ // anyway, e.g. via BT.
+ result = 0 > turn && !gameOver;
+ }
+ // DbgUtils.logf( "relayConnectPending()=>%b (turn=%d)", result,
+ // turn );
return result;
}