From 6379df0cdf363fa4f9dee68111f262f85622e490 Mon Sep 17 00:00:00 2001 From: Eric House Date: Sun, 7 Jun 2015 13:44:07 -0700 Subject: [PATCH 01/49] add to upgrade state info whether build is debug or release --- .../src/org/eehouse/android/xw4/UpdateCheckReceiver.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/UpdateCheckReceiver.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/UpdateCheckReceiver.java index a6d7ddd80..bd7557475 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/UpdateCheckReceiver.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/UpdateCheckReceiver.java @@ -75,6 +75,7 @@ public class UpdateCheckReceiver extends BroadcastReceiver { private static final String k_URL = "url"; private static final String k_PARAMS = "params"; private static final String k_DEVID = "did"; + private static final String k_DEBUG = "dbg"; private static final String k_XLATEINFO = "xlatinfo"; private static final String k_STRINGSHASH = "strings"; @@ -156,6 +157,7 @@ public class UpdateCheckReceiver extends BroadcastReceiver { } params.put( k_APP, appParams ); params.put( k_DEVID, XWPrefs.getDevID( context ) ); + params.put( k_DEBUG, BuildConfig.DEBUG ); } catch ( org.json.JSONException jse ) { DbgUtils.loge( jse ); } From 9cdd9f44194ee2125032bb7c5c266eef5872dba7 Mon Sep 17 00:00:00 2001 From: Eric House Date: Sun, 7 Jun 2015 13:44:24 -0700 Subject: [PATCH 02/49] add loggin --- .../android/XWords4/src/org/eehouse/android/xw4/BTService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/BTService.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/BTService.java index a86d31e00..e6d6f733e 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/BTService.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/BTService.java @@ -1112,7 +1112,7 @@ public class BTService extends XWService { DbgUtils.logf( "connect() to %s successful", name ); } catch ( IOException ioe ) { dos = null; - DbgUtils.logf( "connect() to %s failed", name ); + DbgUtils.logf( "BTService.connect() to %s failed", name ); // logIOE( ioe ); } return dos; From f4f9d11c3b0e838e3832b7176de785a6a6fe3d40 Mon Sep 17 00:00:00 2001 From: Eric House Date: Sun, 7 Jun 2015 14:27:16 -0700 Subject: [PATCH 03/49] remove logging --- .../android/XWords4/src/org/eehouse/android/xw4/BTService.java | 2 +- .../XWords4/src/org/eehouse/android/xw4/ConnStatusHandler.java | 2 +- .../XWords4/src/org/eehouse/android/xw4/DelegateBase.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/BTService.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/BTService.java index e6d6f733e..7c986a891 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/BTService.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/BTService.java @@ -1099,7 +1099,7 @@ public class BTService extends XWService { private DataOutputStream connect( BluetoothSocket socket, BTCmd cmd ) { String name = socket.getRemoteDevice().getName(); - DbgUtils.logf( "connecting to %s to send cmd %s", name, cmd.toString() ); + // DbgUtils.logf( "connecting to %s to send cmd %s", name, cmd.toString() ); // Docs say always call cancelDiscovery before trying to connect m_adapter.cancelDiscovery(); diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/ConnStatusHandler.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/ConnStatusHandler.java index e9baf00f8..0330cffc9 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/ConnStatusHandler.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/ConnStatusHandler.java @@ -489,7 +489,7 @@ public class ConnStatusHandler { private static void doSave( Context context ) { synchronized( s_lockObj ) { - DbgUtils.logf( "ConnStatusHandler:doSave() doing save" ); + // DbgUtils.logf( "ConnStatusHandler:doSave() doing save" ); ByteArrayOutputStream bas = new ByteArrayOutputStream(); try { diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/DelegateBase.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/DelegateBase.java index 06c4f9eaa..454448234 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/DelegateBase.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/DelegateBase.java @@ -525,7 +525,7 @@ public class DelegateBase implements DlgClickNotify, fmtId = R.string.app_not_found_fmt; break; default: - DbgUtils.logf( "DelegateBase.eventOccurred(event=%s) (DROPPED)", event.toString() ); + // DbgUtils.logf( "DelegateBase.eventOccurred(event=%s) (DROPPED)", event.toString() ); } if ( 0 != fmtId ) { From faba6c856f9bd9ee28e1105522a1f3e4e5943af7 Mon Sep 17 00:00:00 2001 From: Eric House Date: Mon, 8 Jun 2015 06:31:36 -0700 Subject: [PATCH 04/49] enable check-for-updated menu even on DEBUG builds (though the server doesn't respond with anything yet) --- .../XWords4/src/org/eehouse/android/xw4/GamesListDelegate.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 b08917acd..fa44989c3 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/GamesListDelegate.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/GamesListDelegate.java @@ -1300,7 +1300,7 @@ public class GamesListDelegate extends ListDelegateBase // check for updates only serves release builds, so don't offer in // DEBUG case - boolean enable = showDbg && !BuildConfig.DEBUG && nothingSelected + boolean enable = showDbg && nothingSelected && UpdateCheckReceiver.haveToCheck( m_activity ); Utils.setItemVisible( menu, R.id.games_menu_checkupdates, enable ); From 7eb6c17623cc06263fe383933fbbf42b7be08f7c Mon Sep 17 00:00:00 2001 From: Eric House Date: Mon, 8 Jun 2015 06:46:51 -0700 Subject: [PATCH 05/49] Restart service on socket exception. This gives the service a chance to reconnect when the network connection changes (e.g. user switches from wifi connection to cellular). The packet is still dropped, so a lower level will need to send it again. Eventually the relay needs to keep a queue of un-acked packets, or track stuff needing resending the way BTService does. --- .../src/org/eehouse/android/xw4/RelayService.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/RelayService.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/RelayService.java index f7bcd4b05..36ca20402 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/RelayService.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/RelayService.java @@ -523,6 +523,15 @@ public class RelayService extends XWService } resetExitTimer(); ConnStatusHandler.showSuccessOut(); + } catch ( java.net.SocketException se ) { + DbgUtils.loge( se ); + DbgUtils.logf( "Restarting threads to force" + + " new socket" ); + m_handler.post( new Runnable() { + public void run() { + stopUDPThreadsIf(); + } + } ); } catch ( java.io.IOException ioe ) { DbgUtils.loge( ioe ); } catch ( NullPointerException npe ) { From f296ab4dc35b546ac7f29cc20296a60af0cc85c4 Mon Sep 17 00:00:00 2001 From: Eric House Date: Mon, 8 Jun 2015 07:36:47 -0700 Subject: [PATCH 06/49] add additional warning about failure to connect when user's on WiFi, since paranoid WiFi settings are probably a leading cause of my not being able to connect. --- xwords4/android/XWords4/archive/R.java | 4 +++- xwords4/android/XWords4/res/values/strings.xml | 10 ++++++++-- .../android/XWords4/res_src/values-ba_CK/strings.xml | 7 +++++-- .../android/XWords4/res_src/values-ca_PS/strings.xml | 7 +++++-- .../src/org/eehouse/android/xw4/BoardDelegate.java | 11 +++++++++-- .../src/org/eehouse/android/xw4/NetStateCache.java | 7 +++++++ 6 files changed, 37 insertions(+), 9 deletions(-) diff --git a/xwords4/android/XWords4/archive/R.java b/xwords4/android/XWords4/archive/R.java index 2e2eaa174..44517b564 100644 --- a/xwords4/android/XWords4/archive/R.java +++ b/xwords4/android/XWords4/archive/R.java @@ -1927,7 +1927,7 @@ public final class R { substituted. */ public static final int no_name_found_fmt=0x7f0500b8; - public static final int no_relay_conn=0x7f0502fb; + public static final int no_relay_conn=0x7f0502fc; /** This is not currently shown Crosswords wordlists, which are just compressed lists of words plus tile information, determine @@ -2339,6 +2339,7 @@ public final class R { /** title for popup of public rooms found on server */ public static final int room_public_prompt=0x7f0500b6; + public static final int seeking_relay=0x7f0502fb; public static final int sel_games_fmt=0x7f050251; public static final int sel_groups_fmt=0x7f050252; public static final int sel_items_fmt=0x7f05026d; @@ -2702,6 +2703,7 @@ public final class R { /** */ public static final int warn_unlimited=0x7f050201; + public static final int wifi_warning=0x7f0502fd; /** */ public static final int word_search_hint=0x7f0501cc; diff --git a/xwords4/android/XWords4/res/values/strings.xml b/xwords4/android/XWords4/res/values/strings.xml index b63ea2143..ede5633e4 100644 --- a/xwords4/android/XWords4/res/values/strings.xml +++ b/xwords4/android/XWords4/res/values/strings.xml @@ -2463,9 +2463,15 @@ Checking for wordlists in %1$s… SD card write complete. + 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 again - later. + because the relay is not running.\n\nPlease try opening the game + again later after conditions have changed. + + \u0020For example, you may need to be on + a different WiFi network. + diff --git a/xwords4/android/XWords4/res_src/values-ba_CK/strings.xml b/xwords4/android/XWords4/res_src/values-ba_CK/strings.xml index 4ca5ee973..89858377c 100644 --- a/xwords4/android/XWords4/res_src/values-ba_CK/strings.xml +++ b/xwords4/android/XWords4/res_src/values-ba_CK/strings.xml @@ -2132,9 +2132,12 @@ Gnikcehc Gnikcehc rof stsildrow ni %1$s… DS drac etirw etelpmoc. + Gnitcennoc ot yaler… Siht emag si derugifnoc ot esu eht yaler rof noitacinummoc tub sah neeb elbanu ot ,tcennoc rehtie esuaceb fo smelborp htiw ruoy ecived\'s tenretni noitcennoc ro - esuaceb eht yaler si ton gninnur.\n\nEsaelp yrt gninepo eht emag niaga - retal. + esuaceb eht yaler si ton gninnur.\n\nEsaelp yrt gninepo eht emag + niaga retal retfa snoitidnoc evah degnahc. + \u0020Rof ,elpmaxe uoy yam deen ot eb no + a tnereffid IfIw krowten. diff --git a/xwords4/android/XWords4/res_src/values-ca_PS/strings.xml b/xwords4/android/XWords4/res_src/values-ca_PS/strings.xml index 077973e69..ae443db81 100644 --- a/xwords4/android/XWords4/res_src/values-ca_PS/strings.xml +++ b/xwords4/android/XWords4/res_src/values-ca_PS/strings.xml @@ -2132,9 +2132,12 @@ CHECKING CHECKING FOR WORDLISTS IN %1$s… SD CARD WRITE COMPLETE. + 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 AGAIN - LATER. + BECAUSE THE RELAY IS NOT RUNNING.\n\nPLEASE TRY OPENING THE GAME + AGAIN LATER AFTER CONDITIONS HAVE CHANGED. + \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 0803265ff..3589154d5 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/BoardDelegate.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/BoardDelegate.java @@ -479,17 +479,24 @@ public class BoardDelegate extends DelegateBase case DLG_NOINVITE: AlertDialog ad = (AlertDialog)dialog; String message; - int titleID = R.string.info_title;; + int titleID; boolean nukeButton = false; 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 ); + message = getQuantityString( R.plurals.invite_msg_fmt, + m_nMissing, m_nMissing ); String ps = null; if ( m_nMissing > 1 ) { diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/NetStateCache.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/NetStateCache.java index 2dd591745..181f4da2d 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/NetStateCache.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/NetStateCache.java @@ -46,6 +46,7 @@ public class NetStateCache { private static AtomicBoolean s_haveReceiver = new AtomicBoolean( false ); private static HashSet s_ifs; private static boolean s_netAvail = false; + private static boolean s_isWifi; private static PvtBroadcastReceiver s_receiver; private static final boolean s_onSim = Build.PRODUCT.contains("sdk"); @@ -71,6 +72,11 @@ public class NetStateCache { return s_netAvail || s_onSim; } + public static boolean onWifi() + { + return s_isWifi; + } + public static void reset( Context context ) { synchronized( s_haveReceiver ) { @@ -140,6 +146,7 @@ public class NetStateCache { switch ( state ) { case CONNECTED: netAvail = true; + s_isWifi = ConnectivityManager.TYPE_WIFI == ni.getType(); break; case DISCONNECTED: netAvail = false; From 9e92af7c1fce7e7d8464b2c254d72f145d14b43e Mon Sep 17 00:00:00 2001 From: Eric House Date: Tue, 9 Jun 2015 06:39:46 -0700 Subject: [PATCH 07/49] put dbg field in app object, not its parent --- .../src/org/eehouse/android/xw4/UpdateCheckReceiver.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/UpdateCheckReceiver.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/UpdateCheckReceiver.java index bd7557475..ec1bf5ca6 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/UpdateCheckReceiver.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/UpdateCheckReceiver.java @@ -155,9 +155,9 @@ public class UpdateCheckReceiver extends BroadcastReceiver { if ( devOK( context ) ) { appParams.put( k_DEVOK, true ); } + appParams.put( k_DEBUG, BuildConfig.DEBUG ); params.put( k_APP, appParams ); params.put( k_DEVID, XWPrefs.getDevID( context ) ); - params.put( k_DEBUG, BuildConfig.DEBUG ); } catch ( org.json.JSONException jse ) { DbgUtils.loge( jse ); } From 5e10febe0ecf4f6692313b5dfd953b90a3741f33 Mon Sep 17 00:00:00 2001 From: Eric House Date: Tue, 9 Jun 2015 06:39:57 -0700 Subject: [PATCH 08/49] actually serve debug build --- xwords4/android/scripts/info.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/xwords4/android/scripts/info.py b/xwords4/android/scripts/info.py index 0a59f6be5..310758fd9 100755 --- a/xwords4/android/scripts/info.py +++ b/xwords4/android/scripts/info.py @@ -220,7 +220,8 @@ def getApp( params, name ): if name: # If we're a dev device, always push the latest if k_DEBUG in params and params[k_DEBUG]: - pass # we don't upgrade DEBUG builds + url = k_urlbase + '/' + k_apkDir + 'XWords4-debug.apk' + result = {k_URL: url} elif k_DEVOK in params and params[k_DEVOK]: apks = getOrderedApks( k_filebase + k_apkDir ) if 0 < len(apks): From a20797aab109577a4a79776b7ef3620ecd2c5d57 Mon Sep 17 00:00:00 2001 From: Eric House Date: Tue, 9 Jun 2015 06:40:13 -0700 Subject: [PATCH 09/49] more translated French strings --- .../android/XWords4/res_src/values-fr/strings.xml | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/xwords4/android/XWords4/res_src/values-fr/strings.xml b/xwords4/android/XWords4/res_src/values-fr/strings.xml index a458569d6..fc0d13120 100644 --- a/xwords4/android/XWords4/res_src/values-fr/strings.xml +++ b/xwords4/android/XWords4/res_src/values-fr/strings.xml @@ -3444,10 +3444,16 @@ pour la langue Écriture sur la carte SD finie. + Connexion au relai… + Cette partie est configurée pour - communiquer en utilisant le relai mais n\'a pas pu se connecter, soit - à cause de problèmes avec la connexion Internet de votre périphérique, - soit parce que le relai est hors service.\n\n Veuillez réessayer - d\'ouvrir la partie ultérieurement. + communiquer en utilisant le relai mais n\'a pas pu se connecter, + soit à cause de problèmes avec la connexion Internet de votre + périphérique, soit parce que le relai ne tourne pas.\n\n Veuillez + réessayer d\'ouvrir la partie ultérieurement, après que les + conditions aient changé. + + \u0020Vous pourriez, par exemple, + avoir besoin d\'être sur un réseau Wi-Fi différent. From f353a70c899a8d7c7d85fabfa8ed504b796e8350 Mon Sep 17 00:00:00 2001 From: Eric House Date: Wed, 10 Jun 2015 07:29:28 -0700 Subject: [PATCH 10/49] catch up with recent changes --- xwords4/android/XWords4/assets/changes.html | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/xwords4/android/XWords4/assets/changes.html b/xwords4/android/XWords4/assets/changes.html index 012d7483c..dbcb8fc8b 100644 --- a/xwords4/android/XWords4/assets/changes.html +++ b/xwords4/android/XWords4/assets/changes.html @@ -41,6 +41,12 @@ at all times you can use to invite players. The dialog goes away when invited players connect. +
  • But when a game hasn't connected yet, warn, and + don't let it send an invitation
  • + +
  • On startup, if on a phone configured for other than English, + offer to download an appropriate wordlist
  • +
  • New games are placed in the selected group (if any, otherwise in default as before)
  • @@ -60,7 +66,8 @@ it too hard to support this, and non-GSM phones are only found in one country anyway.) -
  • Deal with deletion of dictionary that's been set as default
  • +
  • Deal with deletion of dictionary that's been set as + default
  • In popup menu from in-game wordlist button, show only wordlists in same language as game
  • @@ -68,13 +75,13 @@
  • When assigning new tiles, don't sort tiles to left of tray divider
  • -
  • Don't post empty notifications
  • -
  • Remove "Reconnect" button from network status info
  • Include info for all communication means being used in network status, and only show an icon in networked games
  • +
  • Show status message after writing to SD card
  • +
  • Fix a few crashes
  • From f0c3c11dc86bec59fe42ab09609e4fbab15afe68 Mon Sep 17 00:00:00 2001 From: Eric House Date: Wed, 10 Jun 2015 07:31:00 -0700 Subject: [PATCH 11/49] invalidate all tiles after committing a turn in order to force redraw of the Pts. display in case where fewer than seven tiles remain and the board isn't being switched. --- xwords4/common/board.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/xwords4/common/board.c b/xwords4/common/board.c index dafce9e89..97003fd88 100644 --- a/xwords4/common/board.c +++ b/xwords4/common/board.c @@ -1048,10 +1048,12 @@ board_commitTurn( BoardCtxt* board ) || util_userQuery( board->util, QUERY_COMMIT_TURN, stream ) ) { result = server_commitMove( board->server ) || result; - /* invalidate any selected tiles in case we'll be drawing - this tray again rather than some other -- as is the - case in a two-player game where one's a robot. */ - board_invalTrayTiles( board, pti->traySelBits ); + /* invalidate all tiles in case we'll be drawing this tray + again rather than some other -- as is the case in a + two-player game where one's a robot. We really only + need the selected tiles and the rightmost (in case it's + showing points-this-turn), but this is easier. */ + board_invalTrayTiles( board, ALLTILES ); pti->traySelBits = 0x00; } } From 90dbd52bfdc05887890738c11159a79239ceb395 Mon Sep 17 00:00:00 2001 From: Eric House Date: Wed, 10 Jun 2015 07:35:39 -0700 Subject: [PATCH 12/49] On client, when game ends locally set turn to -1 (nobody) so that display won't be confusing during the interval before the server receives the move and responds with a game-over message. --- xwords4/common/server.c | 1 + 1 file changed, 1 insertion(+) diff --git a/xwords4/common/server.c b/xwords4/common/server.c index c21c9b41b..2c8ec9ad5 100644 --- a/xwords4/common/server.c +++ b/xwords4/common/server.c @@ -1927,6 +1927,7 @@ nextTurn( ServerCtxt* server, XP_S16 nxtTurn ) } else { XP_LOGF( "%s: Doing nothing; waiting for server to end game", __func__ ); + setTurn( server, -1 ); /* I'm the client. Do ++nothing++. */ } } From b000564278038a4bd77a5e14d398ff91b6323fd9 Mon Sep 17 00:00:00 2001 From: Eric House Date: Thu, 11 Jun 2015 07:26:36 -0700 Subject: [PATCH 13/49] show connection status as green/connected if ANY of the connection types has succeeded more recently than it's failed. --- .../android/xw4/ConnStatusHandler.java | 46 +++++++++++-------- 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/ConnStatusHandler.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/ConnStatusHandler.java index 0330cffc9..2c9cdada2 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/ConnStatusHandler.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/ConnStatusHandler.java @@ -310,15 +310,7 @@ public class ConnStatusHandler { // Do the background coloring. Top quarter first rect.bottom = rect.top + quarterHeight; - record = newestSuccess( connTypes, false ); - s_fillPaint.setColor( isSolo || (enabled && record.successNewer) - ? GREEN : RED ); - canvas.drawRect( rect, s_fillPaint ); - if ( !isSolo ) { - int arrowID = s_showSuccesses[SUCCESS_OUT]? - R.drawable.out_arrow_active : R.drawable.out_arrow; - drawIn( canvas, res, arrowID, rect ); - } + drawQuarter( canvas, res, rect, connTypes, enabled, false ); // paint the middle two quarters black to give the icon a // clear background @@ -330,15 +322,7 @@ public class ConnStatusHandler { // bottom quarter rect.top = rect.bottom; rect.bottom = rect.top + quarterHeight; - record = newestSuccess( connTypes, true ); - s_fillPaint.setColor( isSolo || (enabled && record.successNewer) - ? GREEN : RED ); - canvas.drawRect( rect, s_fillPaint ); - if ( !isSolo ) { - int arrowID = s_showSuccesses[SUCCESS_IN]? - R.drawable.in_arrow_active : R.drawable.in_arrow; - drawIn( canvas, res, arrowID, rect ); - } + drawQuarter( canvas, res, rect, connTypes, enabled, true ); rect.top = saveTop; } @@ -361,6 +345,26 @@ public class ConnStatusHandler { } } + private static void drawQuarter( Canvas canvas, Resources res, Rect rect, + CommsConnTypeSet connTypes, + boolean enabled, boolean isIn ) + { + enabled = enabled && null != newestSuccess( connTypes, isIn ); + s_fillPaint.setColor( enabled ? GREEN : RED ); + canvas.drawRect( rect, s_fillPaint ); + + int arrowID; + boolean showSuccesses = s_showSuccesses[isIn? SUCCESS_IN : SUCCESS_OUT]; + if ( isIn ) { + arrowID = showSuccesses ? + R.drawable.in_arrow_active : R.drawable.in_arrow; + } else { + arrowID = showSuccesses ? + R.drawable.out_arrow_active : R.drawable.out_arrow; + } + drawIn( canvas, res, arrowID, rect ); + } + // This gets rid of lint warning, but I don't like it as it // effects the whole method. // @SuppressWarnings("unchecked") @@ -466,8 +470,10 @@ public class ConnStatusHandler { while ( iter.hasNext() ) { CommsConnType connType = iter.next(); SuccessRecord record = recordFor( connType, isIn ); - if ( null == result || result.lastSuccess < record.lastSuccess ) { - result = record; + if ( record.successNewer ) { + if ( null == result || result.lastSuccess < record.lastSuccess ) { + result = record; + } } } } From 2e8c7695f3a8953df25950e7da756daad8de1e7c Mon Sep 17 00:00:00 2001 From: Eric House Date: Thu, 11 Jun 2015 07:29:47 -0700 Subject: [PATCH 14/49] fix failure to connect using means (e.g. BT) that becomes available partway through a game. Problem was that once a channel was working with one means we wouldn't fall back to default addressing for the means for which we didn't have a return address yet. (NOTE: Not yet fully tested...) --- xwords4/common/comms.c | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/xwords4/common/comms.c b/xwords4/common/comms.c index 210678c7f..3151305ab 100644 --- a/xwords4/common/comms.c +++ b/xwords4/common/comms.c @@ -1392,23 +1392,20 @@ sendMsg( CommsCtxt* comms, MsgQueueElem* elem ) const CommsAddrRec* addrP; (void)channelToAddress( comms, channelNo, &addrP ); - if ( NULL == addrP ) { - XP_LOGF( TAGFMT() "no addr for channel so using comms'", TAGPRMS ); + if ( NULL == addrP || !addr_hasType( addrP, typ ) ) { + XP_LOGF( TAGFMT() "no addr for channel or addr type %s" + " so using comms'", ConnType2Str(typ), TAGPRMS ); comms_getAddr( comms, &addr ); } else { addr = *addrP; } + XP_ASSERT( addr_hasType( &addr, typ ) ); XP_ASSERT( !!comms->procs.send ); - if ( addr_hasType( &addr, typ ) ) { - XP_U32 gameid = gameID( comms ); - logAddr( comms, &addr, __func__ ); - nSent = (*comms->procs.send)( elem->msg, elem->len, &addr, typ, - gameid, comms->procs.closure ); - } else { - XP_LOGF( TAGFMT() "not sending b/c type %s missing from addr", - TAGPRMS, ConnType2Str(typ) ); - } + XP_U32 gameid = gameID( comms ); + logAddr( comms, &addr, __func__ ); + nSent = (*comms->procs.send)( elem->msg, elem->len, &addr, typ, + gameid, comms->procs.closure ); break; } } /* switch */ From 82e0de6c40b46c47dae17f55e0ba1fd97248e6dc Mon Sep 17 00:00:00 2001 From: Eric House Date: Fri, 12 Jun 2015 07:52:27 -0700 Subject: [PATCH 15/49] test for BT being on, not airplane mode, to fix showing as disabled in airplane mode when BT's been enabled manually. --- .../src/org/eehouse/android/xw4/ConnStatusHandler.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/ConnStatusHandler.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/ConnStatusHandler.java index 2c9cdada2..f030afd74 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/ConnStatusHandler.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/ConnStatusHandler.java @@ -535,7 +535,9 @@ public class ConnStatusHandler { break; case COMMS_CONN_BT: result = XWApp.BTSUPPORTED && BTService.BTEnabled() - && !getAirplaneModeOn( context ); + && BTService.BTEnabled(); + // No: we can be in airplane mode but with BT turned on manually. + //!getAirplaneModeOn( context ); break; case COMMS_CONN_RELAY: result = NetStateCache.netAvail( context ); From 7190706eaf65d5b5c4db579cd47b9ae8e43514f8 Mon Sep 17 00:00:00 2001 From: Eric House Date: Sat, 13 Jun 2015 07:35:02 -0700 Subject: [PATCH 16/49] when game doesn't have connection to relay but has another way to connect, give user the option of inviting "anyway", but warn that there will be no relay connection used in that game. And then remove the relay addressing from the invitation info. --- .../android/XWords4/res/values/strings.xml | 11 ++- .../eehouse/android/xw4/BoardDelegate.java | 98 +++++++++++-------- .../src/org/eehouse/android/xw4/DlgID.java | 1 - .../eehouse/android/xw4/NetLaunchInfo.java | 5 + .../eehouse/android/xw4/jni/GameSummary.java | 7 ++ 5 files changed, 75 insertions(+), 47 deletions(-) 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; } From 4251d0824802c288df2c5d1c862ee68f7732b2c4 Mon Sep 17 00:00:00 2001 From: Eric House Date: Sat, 13 Jun 2015 07:39:29 -0700 Subject: [PATCH 17/49] generated strings --- xwords4/android/XWords4/archive/R.java | 822 +++++++++--------- .../XWords4/res_src/values-ba_CK/strings.xml | 10 +- .../XWords4/res_src/values-ca_PS/strings.xml | 10 +- 3 files changed, 426 insertions(+), 416 deletions(-) diff --git a/xwords4/android/XWords4/archive/R.java b/xwords4/android/XWords4/archive/R.java index 44517b564..bb399806a 100644 --- a/xwords4/android/XWords4/archive/R.java +++ b/xwords4/android/XWords4/archive/R.java @@ -425,11 +425,11 @@ public final class R { public static final class string { /** copyright info */ - public static final int about_copyright=0x7f0501b8; + public static final int about_copyright=0x7f0501b9; /** Another paragraph giving credit for work done other than by Eric House and translators */ - public static final int about_credits=0x7f0501bb; + public static final int about_credits=0x7f0501bc; /** ########################################################### # :Dialogs: @@ -440,27 +440,27 @@ public final class R { String giving version info, which is substituted in. */ - public static final int about_vers_fmt=0x7f0501b7; + public static final int about_vers_fmt=0x7f0501b8; /** Another paragraph in the about dialog */ - public static final int about_web=0x7f0501b9; - public static final int add_done_fmt=0x7f050264; - public static final int add_to_study_fmt=0x7f05025e; + public static final int about_web=0x7f0501ba; + public static final int add_done_fmt=0x7f050265; + public static final int add_to_study_fmt=0x7f05025f; /** Debugging stuff. Localize if you think your langauge users will care. */ - public static final int advanced=0x7f0502c9; + public static final int advanced=0x7f0502ca; /** This button takes you to the normal Game Configure screen */ - public static final int advanced_config=0x7f050176; - public static final int advanced_summary=0x7f0502ca; + public static final int advanced_config=0x7f050177; + public static final int advanced_summary=0x7f0502cb; /** */ - public static final int alert_empty_dict_fmt=0x7f0501d4; + public static final int alert_empty_dict_fmt=0x7f0501d5; /** The name of the app. Not localized! */ public static final int app_name=0x7f050001; - public static final int app_not_found_fmt=0x7f0502a9; + public static final int app_not_found_fmt=0x7f0502aa; public static final int app_version=0x7f050000; /** the background color of the area outside the board, e.g. between entries in the scoreboard @@ -480,7 +480,7 @@ public final class R { public static final int blue=0x7f050141; /** board menu for small devices only */ - public static final int board_menu_dict=0x7f05020b; + public static final int board_menu_dict=0x7f05020c; /** ############################################################ # :Menus: @@ -496,7 +496,7 @@ public final class R { public static final int board_menu_file_about=0x7f05008d; /** */ - public static final int board_menu_file_email=0x7f0501d9; + public static final int board_menu_file_email=0x7f0501da; /** menu on Game submenu: brings up dialog listing all tiles in the language of the game along with how many of each there are and how many points each is worth. This display is the @@ -518,7 +518,7 @@ public final class R { asking. */ public static final int board_menu_game_left=0x7f0500f2; - public static final int board_menu_game_netstats=0x7f0502d4; + public static final int board_menu_game_netstats=0x7f0502d5; /** Meaningful only for networked games, this menu causes all messages that have not yet been acknowledged by a remote device in the game to be resent. Eventually I hope to be @@ -527,10 +527,10 @@ public final class R { */ public static final int board_menu_game_resend=0x7f0500f6; public static final int board_menu_game_resign=0x7f0500f5; - public static final int board_menu_invite=0x7f050257; + public static final int board_menu_invite=0x7f050258; /** */ - public static final int board_menu_pass=0x7f0501c7; + public static final int board_menu_pass=0x7f0501c8; /** This menu begins an exchange of tiles: puts the board into trade mode. */ @@ -544,7 +544,7 @@ public final class R { public static final int board_menu_tray_show=0x7f0500ee; /** */ - public static final int board_menu_undo_current=0x7f050205; + public static final int board_menu_undo_current=0x7f050206; /** Undos the last *committed* turn. Note that this is different from the undo button that undoes or redoes an in-progress not-yet-committed turn. This is disabled for networked @@ -591,31 +591,31 @@ public final class R { public static final int bonus_w3x_summary=0x7f0500db; /** */ - public static final int bt_bad_proto_fmt=0x7f0501e7; + public static final int bt_bad_proto_fmt=0x7f0501e8; /** */ - public static final int bt_fail_fmt=0x7f0501ec; + public static final int bt_fail_fmt=0x7f0501ed; /** Title of device picker during invitation to a game via Bluetooth */ - public static final int bt_invite_title=0x7f0501ee; - public static final int bt_no_devs=0x7f0502a8; + public static final int bt_invite_title=0x7f0501ef; + public static final int bt_no_devs=0x7f0502a9; /** Turn Bluetooth on In the Bluetooth invite device dialog */ - public static final int bt_pick_addall_button=0x7f0501dd; + public static final int bt_pick_addall_button=0x7f0501de; /** */ - public static final int bt_pick_clear_button=0x7f0501de; + public static final int bt_pick_clear_button=0x7f0501df; /** */ - public static final int bt_resend_fmt=0x7f0501eb; + public static final int bt_resend_fmt=0x7f0501ec; /** text of button for adding new player to game */ public static final int button_add_player=0x7f0500ae; /** The only button available when the above message is displayed */ - public static final int button_close_game=0x7f050187; - public static final int button_decline=0x7f050237; + public static final int button_close_game=0x7f050188; + public static final int button_decline=0x7f050238; /** */ public static final int button_default_both=0x7f0500a4; @@ -640,40 +640,40 @@ public final class R { the other option, for discarding changes that would otherwise reset a game. */ - public static final int button_discard=0x7f050194; - public static final int button_discard_changes=0x7f0502c3; + public static final int button_discard=0x7f050195; + public static final int button_discard_changes=0x7f0502c4; /** */ - public static final int button_done=0x7f0501c4; + public static final int button_done=0x7f0501c5; /** */ - public static final int button_done_fmt=0x7f0501c5; + public static final int button_done_fmt=0x7f0501c6; /** Text of button displayed when downloading is an option */ - public static final int button_download=0x7f05018a; - public static final int button_edit=0x7f0502c2; - public static final int button_enable_bt=0x7f050222; - public static final int button_enable_sms=0x7f050221; - public static final int button_go_settings=0x7f050259; + public static final int button_download=0x7f05018b; + public static final int button_edit=0x7f0502c3; + public static final int button_enable_bt=0x7f050223; + public static final int button_enable_sms=0x7f050222; + public static final int button_go_settings=0x7f05025a; /** */ - public static final int button_invite=0x7f0501ed; + public static final int button_invite=0x7f0501ee; /** text of button to juggle (randomly rearrange order of) players */ public static final int button_juggle_players=0x7f0500af; - public static final int button_later=0x7f050223; + public static final int button_later=0x7f050224; /** New strings that need to be documented and found a home above. */ - public static final int button_lookup=0x7f0501be; + public static final int button_lookup=0x7f0501bf; /** */ - public static final int button_lookup_fmt=0x7f0501c0; - public static final int button_lookup_study=0x7f0501bf; - public static final int button_lookup_study_fmt=0x7f0501c1; + public static final int button_lookup_fmt=0x7f0501c1; + public static final int button_lookup_study=0x7f0501c0; + public static final int button_lookup_study_fmt=0x7f0501c2; /** */ - public static final int button_move=0x7f0501c9; + public static final int button_move=0x7f0501ca; /** What is \u200C? English strings are used as keys, so they all need to be unique. This glyph is non-printing and of zero-width, so it should do the trick: @@ -718,18 +718,18 @@ public final class R { /** Games list screen menuitem text for creating a new group */ public static final int button_new_group=0x7f05007d; - public static final int button_newgroup=0x7f0501ca; - public static final int button_no=0x7f050192; + public static final int button_newgroup=0x7f0501cb; + public static final int button_no=0x7f050193; /** Text for button in new-user-info dialog with title just above. */ - public static final int button_notagain=0x7f0501a0; - public static final int button_reconnect=0x7f050249; + public static final int button_notagain=0x7f0501a1; + public static final int button_reconnect=0x7f05024a; /** Button shown in game over dialog triggering creation of new game with the same players and parameters as the one that just ended. */ - public static final int button_rematch=0x7f050248; + public static final int button_rematch=0x7f050249; /** When you select the list_item_reset contextual menu, you are asked to confirm. This is the text of the first button ("Cancel" is the second). @@ -739,7 +739,7 @@ public final class R { connect to the relay failed because the room named does not exist. (I believe this no longer occurs.) */ - public static final int button_retry=0x7f050195; + public static final int button_retry=0x7f050196; /** ############################################################ # :Menus: @@ -759,17 +759,17 @@ public final class R { public static final int button_revert_colors=0x7f05010e; /** Used in Game config dialog to confirm saving changes that reset a game */ - public static final int button_save=0x7f050193; + public static final int button_save=0x7f050194; /** */ - public static final int button_search=0x7f0501cb; + public static final int button_search=0x7f0501cc; /** */ - public static final int button_sms_add=0x7f0501f8; + public static final int button_sms_add=0x7f0501f9; /** Text of button allowing user to choose to open with a different (but same-language wordlist) */ - public static final int button_substdict=0x7f05018b; + public static final int button_substdict=0x7f05018c; public static final int button_trade_cancel=0x7f0500d6; /** ############################################################ @@ -793,20 +793,20 @@ public final class R { Text for buttons at the bottom of dialogs. These first are in many places. */ - public static final int button_yes=0x7f050191; - public static final int cannot_delete_default_group_fmt=0x7f050247; - public static final int change_group=0x7f05024c; + public static final int button_yes=0x7f050192; + public static final int cannot_delete_default_group_fmt=0x7f050248; + public static final int change_group=0x7f05024d; /** text of button in About Crosswords dialog summoning above dialog */ - public static final int changes_button=0x7f0501bd; + public static final int changes_button=0x7f0501be; /** text of dialog showing the set of changes made since the last release */ - public static final int changes_title=0x7f0501bc; + public static final int changes_title=0x7f0501bd; /** Prefix for local messages */ - public static final int chat_local_id=0x7f050171; + public static final int chat_local_id=0x7f050172; /** ############################################################ # :Menus: @@ -818,14 +818,14 @@ public final class R { other devices in the game: no "clear chat" message is transmitted. */ - public static final int chat_menu_clear=0x7f050174; + public static final int chat_menu_clear=0x7f050175; /** Prefix for remote messages */ - public static final int chat_other_id=0x7f050172; + public static final int chat_other_id=0x7f050173; /** Text on the button that causes the contents of the message-composition field to be sent. */ - public static final int chat_send=0x7f050173; + public static final int chat_send=0x7f050174; /** ############################################################ # :Screens: # Chat screen @@ -840,10 +840,10 @@ public final class R { title of the chat screen. The name of the current game is substituted for %1$s. */ - public static final int chat_title_fmt=0x7f050170; - public static final int checking_for_fmt=0x7f0502f9; - public static final int checking_title=0x7f0502f8; - public static final int checkupdates_none_found=0x7f050225; + public static final int chat_title_fmt=0x7f050171; + public static final int checking_for_fmt=0x7f0502fa; + public static final int checking_title=0x7f0502f9; + public static final int checkupdates_none_found=0x7f050226; /** color of the "crosshairs", lines drawn vertically and horizontally through the square the user is currently touching in order to guide the fat-fingered (most of us) in @@ -851,17 +851,17 @@ public final class R { on the board. */ public static final int clr_crosshairs=0x7f05013a; - public static final int config_no_connvia=0x7f0502c1; + public static final int config_no_connvia=0x7f0502c2; /** */ - public static final int confirm_clear=0x7f0501fd; + public static final int confirm_clear=0x7f0501fe; /** Additional text appended to text confirm_delete_dictf in the wordlist delete confiration dialog in the case where the wordlist to be deleted is the last in its language. The name of the language is substituted for %1$s. */ public static final int confirm_deleteonly_dicts_fmt=0x7f0500a0; - public static final int confirm_get_locdict_fmt=0x7f0502c8; + public static final int confirm_get_locdict_fmt=0x7f0502c9; /** Text of confirmation dialog for above */ public static final int confirm_revert_all=0x7f05010f; @@ -878,22 +878,22 @@ public final class R { public static final int confirm_save_title=0x7f0500c9; /** */ - public static final int confirm_sms_expl=0x7f05021a; + public static final int confirm_sms_expl=0x7f05021b; /** */ - public static final int confirm_sms_leave=0x7f05021c; + public static final int confirm_sms_leave=0x7f05021d; /** */ - public static final int confirm_sms_prompt=0x7f05021b; + public static final int confirm_sms_prompt=0x7f05021c; /** */ - public static final int confirm_sms_title=0x7f050219; + public static final int confirm_sms_title=0x7f05021a; /** */ - public static final int confirm_sms_unlimited=0x7f05021d; + public static final int confirm_sms_unlimited=0x7f05021e; /** */ - public static final int confirm_sms_willpay=0x7f05021e; + public static final int confirm_sms_willpay=0x7f05021f; /** text of dialog shown when the menu item board_menu_undo_last is chosen. */ @@ -919,7 +919,7 @@ public final class R { public static final int connect_label_fmt=0x7f0500b2; /** */ - public static final int connect_label_sms=0x7f0501fe; + public static final int connect_label_sms=0x7f0501ff; /** These are the possible values for the connect_frequency setting presented as a drop-down list. */ @@ -927,51 +927,51 @@ public final class R { public static final int connect_one_hour=0x7f050157; public static final int connect_six_hours=0x7f050158; public static final int connect_thirty_mins=0x7f050156; - public static final int connection_via_label=0x7f0502ba; + public static final int connection_via_label=0x7f0502bb; /** */ - public static final int connstat_lastother_succ_fmt=0x7f050211; + public static final int connstat_lastother_succ_fmt=0x7f050212; /** */ - public static final int connstat_lastother_unsucc_fmt=0x7f050212; + public static final int connstat_lastother_unsucc_fmt=0x7f050213; /** */ - public static final int connstat_lastreceipt_fmt=0x7f050213; + public static final int connstat_lastreceipt_fmt=0x7f050214; /** */ - public static final int connstat_lastsend_fmt=0x7f050210; + public static final int connstat_lastsend_fmt=0x7f050211; /** */ - public static final int connstat_net_fmt=0x7f05020d; + public static final int connstat_net_fmt=0x7f05020e; /** */ - public static final int connstat_noreceipt=0x7f050214; + public static final int connstat_noreceipt=0x7f050215; /** */ - public static final int connstat_relay=0x7f050215; + public static final int connstat_relay=0x7f050216; /** */ - public static final int connstat_sms=0x7f050216; + public static final int connstat_sms=0x7f050217; /** */ - public static final int connstat_succ=0x7f05020e; + public static final int connstat_succ=0x7f05020f; /** */ - public static final int connstat_unsucc=0x7f05020f; + public static final int connstat_unsucc=0x7f050210; /** title of dialog brought up in response to the board_menu_game_counts menu. The dialog lists all tiles in the language being used for the game together with how many of each there are are and how many points each is worth. */ - public static final int counts_values_title=0x7f05019a; - public static final int cur_menu_marker_fmt=0x7f050256; + public static final int counts_values_title=0x7f05019b; + public static final int cur_menu_marker_fmt=0x7f050257; /** */ - public static final int cur_tiles_fmt=0x7f0501cf; - public static final int data_gsm_only=0x7f050273; - public static final int db_store_done=0x7f0502fa; - public static final int debug_features=0x7f0502d0; - public static final int debug_features_summary=0x7f0502d1; + public static final int cur_tiles_fmt=0x7f0501d0; + public static final int data_gsm_only=0x7f050274; + public static final int db_store_done=0x7f0502fb; + public static final int debug_features=0x7f0502d1; + public static final int debug_features_summary=0x7f0502d2; /** dictionary used by default for human players when creating new game */ @@ -981,12 +981,12 @@ public final class R { public static final int default_host=0x7f050073; /** label within default wordlists in app preferences */ - public static final int default_language=0x7f0502aa; - public static final int default_loc=0x7f05023a; - public static final int default_loc_summary=0x7f05023b; + public static final int default_language=0x7f0502ab; + public static final int default_loc=0x7f05023b; + public static final int default_loc_summary=0x7f05023c; /** Welcome dialog text */ - public static final int default_name_message=0x7f0501b6; + public static final int default_name_message=0x7f0501b7; /** ########################################################### # :Dialogs: @@ -1001,7 +1001,7 @@ public final class R { Welcome dialog title */ - public static final int default_name_title=0x7f0501b5; + public static final int default_name_title=0x7f0501b6; /** default new-game setting for handline phonies (words not found in the word list) */ @@ -1011,26 +1011,26 @@ public final class R { */ public static final int default_robodict=0x7f05011d; public static final int default_update_url=0x7f050079; - public static final int delete_dicts=0x7f050295; + public static final int delete_dicts=0x7f050296; /** Playing via SMS is currently disabled. You can enable it in Settings->Network game settings. */ - public static final int dft_sms_name_fmt=0x7f0501f5; + public static final int dft_sms_name_fmt=0x7f0501f6; /** */ - public static final int dict_browse_nowords_fmt=0x7f0501d1; - public static final int dict_desc_fmt=0x7f05029c; - public static final int dict_host=0x7f0502cd; - public static final int dict_info_fmt=0x7f050299; + public static final int dict_browse_nowords_fmt=0x7f0501d2; + public static final int dict_desc_fmt=0x7f05029d; + public static final int dict_host=0x7f0502ce; + public static final int dict_info_fmt=0x7f05029a; /** label for dropdown by which wordlist is chosen that this player will use. The language the game will use (which constrains the choice of wordlists) is substituted in for "%1$s". */ public static final int dict_lang_label_fmt=0x7f0500d1; - public static final int dict_on_server=0x7f05029b; + public static final int dict_on_server=0x7f05029c; /** string name="invite_mime">text/plainDisplay snapshots of games */ - public static final int dropped_dupe=0x7f050255; + public static final int dropped_dupe=0x7f050256; /** Shown in the main screen when you launch Crosswords from an invitation (received in email or messaging app, say) and there's already a game running that matches that invitation. @@ -1081,43 +1081,43 @@ public final class R { the same room name over and over so they'll get this warning and it's harmless to ignore it. */ - public static final int dup_game_query_fmt=0x7f050196; + public static final int dup_game_query_fmt=0x7f050197; /** */ - public static final int email_author_chooser=0x7f0501db; + public static final int email_author_chooser=0x7f0501dc; /** Nor is my email address */ public static final int email_author_email=0x7f050072; /** */ - public static final int email_author_subject=0x7f0501da; + public static final int email_author_subject=0x7f0501db; /** */ - public static final int email_body_rev_fmt=0x7f0501dc; + public static final int email_body_rev_fmt=0x7f0501dd; /** color of empty squares on the board (that are not bonus squares) */ public static final int empty=0x7f05013c; /** Shows in SMS Invite dialog when no phone numbers have been saved previously */ - public static final int empty_sms_inviter=0x7f0501fb; - public static final int enable_dupes_summary=0x7f0502de; - public static final int enable_dupes_title=0x7f0502dc; - public static final int enable_nfc=0x7f050258; - public static final int enable_nfc_toself_summary=0x7f0502e1; - public static final int enable_nfc_toself_title=0x7f0502e0; - public static final int enable_pubroom_summary=0x7f0502b9; - public static final int enable_pubroom_title=0x7f0502b8; + public static final int empty_sms_inviter=0x7f0501fc; + public static final int enable_dupes_summary=0x7f0502df; + public static final int enable_dupes_title=0x7f0502dd; + public static final int enable_nfc=0x7f050259; + public static final int enable_nfc_toself_summary=0x7f0502e2; + public static final int enable_nfc_toself_title=0x7f0502e1; + public static final int enable_pubroom_summary=0x7f0502ba; + public static final int enable_pubroom_title=0x7f0502b9; /** */ - public static final int enable_sms=0x7f050217; + public static final int enable_sms=0x7f050218; /** */ - public static final int enable_sms_summary=0x7f050218; - public static final int enable_sms_toself_summary=0x7f0502e3; - public static final int enable_sms_toself_title=0x7f0502e2; + public static final int enable_sms_summary=0x7f050219; + public static final int enable_sms_toself_summary=0x7f0502e4; + public static final int enable_sms_toself_title=0x7f0502e3; public static final int entering_trade=0x7f0500d7; - public static final int err_dup_invite_fmt=0x7f0502b3; - public static final int expl_update_url=0x7f0502ed; + public static final int err_dup_invite_fmt=0x7f0502b4; + public static final int expl_update_url=0x7f0502ee; /** if this preference is checked, a dialog will be posted every time a robot makes a move or a move is received from a remote player. @@ -1132,13 +1132,13 @@ public final class R { running out the game timer if there is one.) */ - public static final int finalscores_title=0x7f05019c; + public static final int finalscores_title=0x7f05019d; /** Explanatory text appears in the dialog */ public static final int force_expl=0x7f0500cc; - public static final int force_radio_title=0x7f0502e4; - public static final int force_tablet_summary=0x7f0502a0; - public static final int force_tablet_title=0x7f05029f; + public static final int force_radio_title=0x7f0502e5; + public static final int force_tablet_summary=0x7f0502a1; + public static final int force_tablet_title=0x7f0502a0; /** ############################################################ # :Dialogs: @@ -1164,11 +1164,11 @@ public final class R { public static final int gameOver=0x7f050085; /** */ - public static final int game_btname_title=0x7f0501f0; + public static final int game_btname_title=0x7f0501f1; /** used to create default names of games (when user has not named them.) */ - public static final int game_fmt=0x7f05018e; + public static final int game_fmt=0x7f05018f; /** ############################################################ # :Menus: @@ -1181,33 +1181,33 @@ public final class R { public static final int game_item_menu_title_fmt=0x7f05008e; /** */ - public static final int game_list_tmp=0x7f05020c; + public static final int game_list_tmp=0x7f05020d; /** text of checkbox at top of dialog allowing to unlock in-play game to make changes */ public static final int game_locked=0x7f0500ab; - public static final int game_name_group_title=0x7f050246; + public static final int game_name_group_title=0x7f050247; /** */ - public static final int game_name_label=0x7f0501f2; + public static final int game_name_label=0x7f0501f3; /** */ - public static final int game_name_title=0x7f0501f1; + public static final int game_name_title=0x7f0501f2; /** */ public static final int game_rename_title=0x7f050097; /** Put nothing in the summary space, so it just reads "Game 2" */ public static final int game_summary_field_empty=0x7f050128; - public static final int game_summary_field_gameid=0x7f0502eb; + public static final int game_summary_field_gameid=0x7f0502ec; /** Put the language there, so it reads "Game 2 (English)" */ public static final int game_summary_field_language=0x7f050129; - public static final int game_summary_field_npackets=0x7f0502ec; + public static final int game_summary_field_npackets=0x7f0502ed; /** List names of opponents (summarized), e.g. "Game 2 (vs Kati)" */ public static final int game_summary_field_opponents=0x7f05012a; - public static final int game_summary_field_rowid=0x7f0502ea; + public static final int game_summary_field_rowid=0x7f0502eb; /** List the state of the game, "Game over" or "10 moves made" etc. */ @@ -1220,7 +1220,7 @@ public final class R { public static final int gamel_menu_checkmoves=0x7f05008a; /** */ - public static final int gamel_menu_checkupdates=0x7f050224; + public static final int gamel_menu_checkupdates=0x7f050225; /** ############################################################ # :Menus: @@ -1233,20 +1233,20 @@ public final class R { Brings up the Wordlists (formerly Dictionaries) screen */ public static final int gamel_menu_dicts=0x7f050088; - public static final int gamel_menu_loaddb=0x7f0502db; - public static final int gamel_menu_storedb=0x7f0502da; - public static final int gamel_menu_study=0x7f050261; + public static final int gamel_menu_loaddb=0x7f0502dc; + public static final int gamel_menu_storedb=0x7f0502db; + public static final int gamel_menu_study=0x7f050262; /** */ - public static final int get_sms_number=0x7f0501fc; - public static final int getinfo=0x7f050294; + public static final int get_sms_number=0x7f0501fd; + public static final int getinfo=0x7f050295; public static final int git_rev=0x7f05007b; - public static final int git_rev_title=0x7f0502d6; - public static final int got_langdict_summary=0x7f0502ef; - public static final int got_langdict_title=0x7f0502ee; + public static final int git_rev_title=0x7f0502d7; + public static final int got_langdict_summary=0x7f0502f0; + public static final int got_langdict_title=0x7f0502ef; public static final int green=0x7f050140; - public static final int group_cur_games=0x7f050243; - public static final int group_new_games=0x7f050244; + public static final int group_cur_games=0x7f050244; + public static final int group_new_games=0x7f050245; /** Used as the default name for remote players displayed within the Game configure screen */ @@ -1292,7 +1292,7 @@ public final class R { to the last turn is displayed, though details about what's in players' racks is left out if the game is not yet over. */ - public static final int history_title=0x7f05019b; + public static final int history_title=0x7f05019c; /** Partial text of alert posted when phonies_warn or phonies_disallow is the current setting and a "phony" is played. One of the two following strings will be appended @@ -1303,18 +1303,18 @@ public final class R { item with text board_menu_game_final and the game is not over */ - public static final int ids_endnow=0x7f05019d; + public static final int ids_endnow=0x7f05019e; /** Title of generic dialog used to display information */ - public static final int info_title=0x7f050197; + public static final int info_title=0x7f050198; /** */ - public static final int inform_dict_diffdict_fmt=0x7f05022f; + public static final int inform_dict_diffdict_fmt=0x7f050230; /** */ - public static final int inform_dict_diffversion_fmt=0x7f05022d; - public static final int inform_dict_download=0x7f050230; - public static final int inform_dict_title=0x7f05022e; + public static final int inform_dict_diffversion_fmt=0x7f05022e; + public static final int inform_dict_download=0x7f050231; + public static final int inform_dict_title=0x7f05022f; /** Will new games, on default, randomly rearrange the start order of players. */ @@ -1325,9 +1325,9 @@ public final class R { /** default number of minutes on timer for new games */ public static final int initial_player_minutes=0x7f050123; - public static final int invite_choice_bt=0x7f050167; - public static final int invite_choice_email=0x7f050166; - public static final int invite_choice_nfc=0x7f050168; + public static final int invite_choice_bt=0x7f050168; + public static final int invite_choice_email=0x7f050167; + public static final int invite_choice_nfc=0x7f050169; /** EXPLAIN ME Bluetooth is not available. This may mean that your device doesn\'t support it, or that it\'s been @@ -1336,9 +1336,9 @@ public final class R { between html and plaintext formatting but I also provide some explanation/guidance. */ - public static final int invite_choice_sms=0x7f050165; - public static final int invite_choice_title=0x7f050169; - public static final int invite_chooser_email=0x7f05016e; + public static final int invite_choice_sms=0x7f050166; + public static final int invite_choice_title=0x7f05016a; + public static final int invite_chooser_email=0x7f05016f; /** When I've created the invitation, in text or html, I ask Android to launch an app that can send it, typically an email or messaging app. Android then asks the user to choose which @@ -1346,11 +1346,11 @@ public final class R { to have launched. This string is passed to Android and used as the title of the dialog that presents that choice. */ - public static final int invite_chooser_fmt=0x7f05016d; - public static final int invite_chooser_sms=0x7f05016f; - public static final int invite_dict_missing_body_fmt=0x7f050235; - public static final int invite_dict_missing_body_noname_fmt=0x7f050236; - public static final int invite_dict_missing_title=0x7f050234; + public static final int invite_chooser_fmt=0x7f05016e; + public static final int invite_chooser_sms=0x7f050170; + public static final int invite_dict_missing_body_fmt=0x7f050236; + public static final int invite_dict_missing_body_noname_fmt=0x7f050237; + public static final int invite_dict_missing_title=0x7f050235; public static final int invite_host=0x7f050075; /** This is the body of the html version of the invitation. A URL is created with parameters describing the game and @@ -1358,13 +1358,13 @@ public final class R { encodings for the greater-than and less-than symbols which are not legal in xml strings.) */ - public static final int invite_htm_fmt=0x7f05016b; + public static final int invite_htm_fmt=0x7f05016c; /** Appended to message above if local device has NFC available */ public static final int invite_if_nfc=0x7f0500dd; public static final int invite_mime=0x7f050077; - public static final int invite_multi_summary=0x7f0502b7; - public static final int invite_multi_title=0x7f0502b6; + public static final int invite_multi_summary=0x7f0502b8; + public static final int invite_multi_title=0x7f0502b7; /** Most users create games with only two players, which is the default, but Crosswords supports up to four. When I'm using the above string to encourage the opener of a game missing @@ -1373,11 +1373,11 @@ public final class R { */ public static final int invite_multiple=0x7f0500de; public static final int invite_prefix=0x7f050076; - public static final int invite_progress_fmt=0x7f0501e0; + public static final int invite_progress_fmt=0x7f0501e1; /** */ - public static final int invite_progress_title=0x7f0501df; - public static final int invite_stays=0x7f0502be; + public static final int invite_progress_title=0x7f0501e0; + public static final int invite_stays=0x7f0502bf; /** Send invitation using SMS (texting) or via email? Send invitation using NFC (Android @@ -1393,12 +1393,12 @@ public final class R { This is the subject line of the email/text sent to invite someone to join a game. */ - public static final int invite_subject_fmt=0x7f05016a; + public static final int invite_subject_fmt=0x7f05016b; /** This is the body of the text version of the invitation. A URL is created with parameters describing the game and substituted for "%1$s". */ - public static final int invite_txt_fmt=0x7f05016c; + public static final int invite_txt_fmt=0x7f05016d; /** text of checkbox asking if user wants to search for open public rooms */ @@ -1540,30 +1540,30 @@ public final class R { different wordlists.) */ public static final int lang_label=0x7f0500b0; - public static final int lang_name_arabic=0x7f05027e; - public static final int lang_name_catalan=0x7f050285; - public static final int lang_name_czech=0x7f050288; - public static final int lang_name_danish=0x7f050282; - public static final int lang_name_dutch=0x7f050284; - public static final int lang_name_english=0x7f05027a; - public static final int lang_name_french=0x7f05027b; - public static final int lang_name_german=0x7f05027c; - public static final int lang_name_greek=0x7f050289; - public static final int lang_name_italian=0x7f050283; - public static final int lang_name_polish=0x7f050281; - public static final int lang_name_portuguese=0x7f050286; - public static final int lang_name_russian=0x7f050287; - public static final int lang_name_slovak=0x7f05028a; - public static final int lang_name_spanish=0x7f05027f; - public static final int lang_name_swedish=0x7f050280; - public static final int lang_name_turkish=0x7f05027d; - public static final int lang_unknown=0x7f05029d; + public static final int lang_name_arabic=0x7f05027f; + public static final int lang_name_catalan=0x7f050286; + public static final int lang_name_czech=0x7f050289; + public static final int lang_name_danish=0x7f050283; + public static final int lang_name_dutch=0x7f050285; + public static final int lang_name_english=0x7f05027b; + public static final int lang_name_french=0x7f05027c; + public static final int lang_name_german=0x7f05027d; + public static final int lang_name_greek=0x7f05028a; + public static final int lang_name_italian=0x7f050284; + public static final int lang_name_polish=0x7f050282; + public static final int lang_name_portuguese=0x7f050287; + public static final int lang_name_russian=0x7f050288; + public static final int lang_name_slovak=0x7f05028b; + public static final int lang_name_spanish=0x7f050280; + public static final int lang_name_swedish=0x7f050281; + public static final int lang_name_turkish=0x7f05027e; + public static final int lang_unknown=0x7f05029e; public static final int langdict_label=0x7f0500b1; - public static final int list_group_default=0x7f050240; - public static final int list_group_delete=0x7f05023e; - public static final int list_group_movedown=0x7f050242; - public static final int list_group_moveup=0x7f050241; - public static final int list_group_rename=0x7f05023f; + public static final int list_group_default=0x7f050241; + public static final int list_group_delete=0x7f05023f; + public static final int list_group_movedown=0x7f050243; + public static final int list_group_moveup=0x7f050242; + public static final int list_group_rename=0x7f050240; /** ############## menu items ############## pulls up dialog to configure the selected game */ @@ -1594,9 +1594,9 @@ public final class R { public static final int list_item_reset=0x7f050093; /** formatting for last move summary in notifications */ - public static final int lmi_pass_fmt=0x7f0502a5; - public static final int lmi_phony_fmt=0x7f0502a6; - public static final int lmi_tiles_fmt=0x7f0502a7; + public static final int lmi_pass_fmt=0x7f0502a6; + public static final int lmi_phony_fmt=0x7f0502a7; + public static final int lmi_tiles_fmt=0x7f0502a8; /** One of the strings used in the right column of the list of installed wordlists to describe those that are part of Crosswords and that cannot be uninstalled or moved. @@ -1614,77 +1614,77 @@ public final class R { /** */ public static final int loc_external=0x7f0500a7; - public static final int loc_filters_all=0x7f050276; - public static final int loc_filters_menu=0x7f050278; - public static final int loc_filters_modified=0x7f050279; - public static final int loc_filters_prompt=0x7f050274; - public static final int loc_filters_screen=0x7f050277; - public static final int loc_fmts_mismatch=0x7f05028f; + public static final int loc_filters_all=0x7f050277; + public static final int loc_filters_menu=0x7f050279; + public static final int loc_filters_modified=0x7f05027a; + public static final int loc_filters_prompt=0x7f050275; + public static final int loc_filters_screen=0x7f050278; + public static final int loc_fmts_mismatch=0x7f050290; /** see move_dictf above */ public static final int loc_internal=0x7f0500a6; - public static final int loc_item_check=0x7f05028c; + public static final int loc_item_check=0x7f05028d; /** for loc item edit menu */ - public static final int loc_item_clear=0x7f05028b; - public static final int loc_item_copy_bless=0x7f05028e; - public static final int loc_item_copy_eng=0x7f05028d; - public static final int loc_lang_blessed=0x7f05026f; - public static final int loc_lang_local=0x7f050270; - public static final int loc_menu_xlate=0x7f05026e; - public static final int loc_search_prompt=0x7f050275; + public static final int loc_item_clear=0x7f05028c; + public static final int loc_item_copy_bless=0x7f05028f; + public static final int loc_item_copy_eng=0x7f05028e; + public static final int loc_lang_blessed=0x7f050270; + public static final int loc_lang_local=0x7f050271; + public static final int loc_menu_xlate=0x7f05026f; + public static final int loc_search_prompt=0x7f050276; /** This is the "hint" printed in light text in the empty player name field */ - public static final int local_name_hint=0x7f050175; - public static final int logging_on=0x7f0502ce; - public static final int logging_on_summary=0x7f0502cf; - public static final int lookup_title=0x7f05026a; + public static final int local_name_hint=0x7f050176; + public static final int logging_on=0x7f0502cf; + public static final int logging_on_summary=0x7f0502d0; + public static final int lookup_title=0x7f05026b; /** */ - public static final int manual_owner_name=0x7f0501f9; + public static final int manual_owner_name=0x7f0501fa; /** */ - public static final int max_len=0x7f0501d6; + public static final int max_len=0x7f0501d7; /** */ - public static final int menu_chat=0x7f050209; + public static final int menu_chat=0x7f05020a; /** */ - public static final int menu_flip=0x7f050207; + public static final int menu_flip=0x7f050208; /** */ - public static final int menu_hint_next=0x7f050204; + public static final int menu_hint_next=0x7f050205; /** */ - public static final int menu_hint_prev=0x7f050203; + public static final int menu_hint_prev=0x7f050204; /** */ - public static final int menu_juggle=0x7f050206; + public static final int menu_juggle=0x7f050207; /** text of menu that brings up the Settings (preferences) dialog */ public static final int menu_prefs=0x7f050089; - public static final int menu_rateme=0x7f05025c; + public static final int menu_rateme=0x7f05025d; /** */ - public static final int menu_toggle_values=0x7f05020a; + public static final int menu_toggle_values=0x7f05020b; /** */ - public static final int menu_zoom=0x7f050208; + public static final int menu_zoom=0x7f050209; /** */ - public static final int min_len=0x7f0501d5; + public static final int min_len=0x7f0501d6; /** label for the field used to set the timer's inital value */ public static final int minutes_label=0x7f0500bd; /** body of notification shown when invitation requires a wordslist that's not installed */ - public static final int missing_dict_detail=0x7f050233; + public static final int missing_dict_detail=0x7f050234; /** Title of notification shown when invitation requires a wordslist that's not installed */ - public static final int missing_dict_title=0x7f050232; + public static final int missing_dict_title=0x7f050233; /** Used as a substitute for the names of remote players when they aren't available yet because the connection is not complete. Displayed in the lists of players found in each @@ -1710,7 +1710,7 @@ public final class R { Text of dialog. Player name is substituted */ - public static final int msg_ask_password_fmt=0x7f05018d; + public static final int msg_ask_password_fmt=0x7f05018e; /** When a game has been connected and the relay is notified that a device in the game has deleted its part of the game, this message is posted when you connect your end of it to the @@ -1739,16 +1739,16 @@ public final class R { /** Text of progress indicator shown while check is being conducted */ public static final int msgs_progress=0x7f05008b; - public static final int nag_body_fmt=0x7f0502a2; - public static final int nag_intervals=0x7f0502df; + public static final int nag_body_fmt=0x7f0502a3; + public static final int nag_intervals=0x7f0502e0; /** Nagging: title of notification reminder message */ - public static final int nag_title=0x7f0502a1; + public static final int nag_title=0x7f0502a2; /** above is inserted in this the last time I warn */ - public static final int nag_warn_last_fmt=0x7f0502a3; - public static final int name_copy_fmt=0x7f0501f3; - public static final int name_dict_fmt=0x7f0502d9; + public static final int nag_warn_last_fmt=0x7f0502a4; + public static final int name_copy_fmt=0x7f0501f4; + public static final int name_dict_fmt=0x7f0502da; public static final int nbs_port=0x7f05007a; /** text of checkbox. If this checkbox is checked, games created for network play will by default have the hint feature @@ -1760,51 +1760,51 @@ public final class R { elsewhere in this file) */ public static final int nethints_allowed_sum=0x7f05011f; - public static final int netstats_title=0x7f0502d5; - public static final int network_advanced_summary=0x7f0502b5; - public static final int network_advanced_title=0x7f0502b4; + public static final int netstats_title=0x7f0502d6; + public static final int network_advanced_summary=0x7f0502b6; + public static final int network_advanced_title=0x7f0502b5; public static final int network_behavior=0x7f050150; /** explanation of the above */ public static final int network_behavior_summary=0x7f050151; /** */ - public static final int new_app_avail=0x7f050229; + public static final int new_app_avail=0x7f05022a; /** */ - public static final int new_app_avail_fmt=0x7f050228; + public static final int new_app_avail_fmt=0x7f050229; /** */ - public static final int new_bt_body_fmt=0x7f0501e6; + public static final int new_bt_body_fmt=0x7f0501e7; /** */ - public static final int new_bt_title=0x7f0501e5; + public static final int new_bt_title=0x7f0501e6; /** */ - public static final int new_btmove_title=0x7f0501e9; + public static final int new_btmove_title=0x7f0501ea; /** */ - public static final int new_dict_avail=0x7f050226; + public static final int new_dict_avail=0x7f050227; /** */ - public static final int new_dict_avail_fmt=0x7f050227; - public static final int new_game=0x7f0502ac; - public static final int new_game_message=0x7f0502ae; - public static final int new_game_message_net=0x7f0502b0; - public static final int new_game_message_nodflt=0x7f0502af; - public static final int new_game_networked=0x7f0502ad; + public static final int new_dict_avail_fmt=0x7f050228; + public static final int new_game=0x7f0502ad; + public static final int new_game_message=0x7f0502af; + public static final int new_game_message_net=0x7f0502b1; + public static final int new_game_message_nodflt=0x7f0502b0; + public static final int new_game_networked=0x7f0502ae; /** */ - public static final int new_move_body=0x7f0501ea; + public static final int new_move_body=0x7f0501eb; /** */ - public static final int new_name_body_fmt=0x7f0501f7; + public static final int new_name_body_fmt=0x7f0501f8; /** hint (text shown when field is empty) for room name field */ public static final int new_room_hint=0x7f0500b4; /** */ - public static final int new_sms_title=0x7f0501f6; + public static final int new_sms_title=0x7f0501f7; /** ########################################################### # :Dialogs: @@ -1817,11 +1817,11 @@ public final class R { Title of New user info dialog */ - public static final int newbie_title=0x7f05019f; + public static final int newbie_title=0x7f0501a0; /** section separator (white-on-gray bar) for third section: bluetooth games */ - public static final int newgame_bt_header=0x7f050164; + public static final int newgame_bt_header=0x7f050165; /** Text of second of two buttons for new standalone games. Tap this and you'll get taken to the "Game configure" screen */ @@ -1832,6 +1832,7 @@ public final class R { launched to send your invitation. */ public static final int newgame_invite=0x7f050163; + public static final int newgame_invite_anyway=0x7f050164; /** Text of first of two buttons for new standalone games. Tap this and a new game will be created and opened. If the first player is a robot it will immediately take its turn. @@ -1868,10 +1869,10 @@ public final class R { public static final int newgame_networked_header=0x7f050161; /** */ - public static final int newgame_sms_header=0x7f0501f4; - public static final int newgroup_label=0x7f05023d; - public static final int nfc_just_tap=0x7f0502bf; - public static final int nfc_to_self=0x7f0502e9; + public static final int newgame_sms_header=0x7f0501f5; + public static final int newgroup_label=0x7f05023e; + public static final int nfc_just_tap=0x7f0502c0; + public static final int nfc_to_self=0x7f0502ea; /** Title of dialog for renaming game (triggered by selecting list_item_rename) If you try to copy a networked game you get this error @@ -1882,7 +1883,7 @@ public final class R { just an explanation and this button, after which the game closes. */ - public static final int no_dict_finish=0x7f050186; + public static final int no_dict_finish=0x7f050187; /** If the missing wordlist is discovered when trying to open the game, we have more options. If there's another wordlist in the same language, we can offer to substitute without needing @@ -1891,12 +1892,12 @@ public final class R { takes wordlist name and language substituted in for %1$ and %2$ */ - public static final int no_dict_fmt=0x7f050188; + public static final int no_dict_fmt=0x7f050189; /** This is an alternative message presented when there's also the option of downloading another wordlist. Game name, wordlist name and language are substituted in. */ - public static final int no_dict_subst_fmt=0x7f050189; + public static final int no_dict_subst_fmt=0x7f05018a; /** ############################################################ # :Dialogs: @@ -1908,16 +1909,16 @@ public final class R { title of alert */ - public static final int no_dict_title=0x7f050185; + public static final int no_dict_title=0x7f050186; /** If you click on the Play button without having entered a room name you get an alert with this error message. */ - public static final int no_empty_rooms=0x7f050177; + public static final int no_empty_rooms=0x7f050178; /** If you choose the above option and have no networked games you get this error message */ public static final int no_games_to_refresh=0x7f05008c; - public static final int no_market=0x7f05025d; + public static final int no_market=0x7f05025e; /** displayed when you long-tap a scoreboard entry and there's no most recent score to show */ @@ -1927,7 +1928,7 @@ public final class R { substituted. */ public static final int no_name_found_fmt=0x7f0500b8; - public static final int no_relay_conn=0x7f0502fc; + public static final int no_relay_conn=0x7f0502fd; /** This is not currently shown Crosswords wordlists, which are just compressed lists of words plus tile information, determine @@ -1940,52 +1941,52 @@ public final class R { figuring out how to play and when you tap an empty cell the arrow appears. This explains it. */ - public static final int not_again_arrow=0x7f0501b2; - public static final int not_again_backclears=0x7f050250; + public static final int not_again_arrow=0x7f0501b3; + public static final int not_again_backclears=0x7f050251; /** */ - public static final int not_again_browse=0x7f0501d2; + public static final int not_again_browse=0x7f0501d3; /** */ - public static final int not_again_browseall=0x7f0501d3; + public static final int not_again_browseall=0x7f0501d4; /** Shown when you tap the chat button on the toolbar of the main Board screen */ - public static final int not_again_chat=0x7f0501ab; + public static final int not_again_chat=0x7f0501ac; /** This is shown in the Board screen when you successfully connecting a game to the relay and are the last device in the game to do so, i.e. the game is now complete and you should expect play to begin. */ - public static final int not_again_conndall=0x7f0501b1; + public static final int not_again_conndall=0x7f0501b2; /** This is shown in the Board screen when you successfully connect a game to the relay and are the first device in the game to do so. */ - public static final int not_again_conndfirst=0x7f0501af; + public static final int not_again_conndfirst=0x7f0501b0; /** This is shown in the Board screen when you successfully connecting a game to the relay and are not the first device in the game but not the last either. So it will only occur for games with more than two devices, which are rare. */ - public static final int not_again_conndmid=0x7f0501b0; - public static final int not_again_dicts=0x7f05029e; + public static final int not_again_conndmid=0x7f0501b1; + public static final int not_again_dicts=0x7f05029f; /** This is shown when you choose the board_menu_done menu item. It's to let you know that there's a shortcut that does almost the same thing. */ - public static final int not_again_done=0x7f0501ad; - public static final int not_again_enablepublic=0x7f0502c5; + public static final int not_again_done=0x7f0501ae; + public static final int not_again_enablepublic=0x7f0502c6; /** Shown when you tap the flip button on the toolbar of the main Board screen */ - public static final int not_again_flip=0x7f0501a8; - public static final int not_again_fmt_expl=0x7f050290; - public static final int not_again_hidenewgamebuttons=0x7f0502bc; + public static final int not_again_flip=0x7f0501a9; + public static final int not_again_fmt_expl=0x7f050291; + public static final int not_again_hidenewgamebuttons=0x7f0502bd; /** Shown when you tap the next hint button on the toolbar of the main Board screen */ - public static final int not_again_hintnext=0x7f0501a6; + public static final int not_again_hintnext=0x7f0501a7; /** Currently not used The new game you have created has two players. Player 1 is a robot; Player 2 is you. Tap the game @@ -1994,54 +1995,54 @@ public final class R { Shown when you tap the Previous Hint button on the toolbar of the main Board screen */ - public static final int not_again_hintprev=0x7f0501a5; + public static final int not_again_hintprev=0x7f0501a6; /** Shown when you tap the juggle button on the toolbar of the main Board screen */ - public static final int not_again_juggle=0x7f0501a7; + public static final int not_again_juggle=0x7f0501a8; /** */ - public static final int not_again_lookup=0x7f0501c8; + public static final int not_again_lookup=0x7f0501c9; /** Shown when you first pick the list_item_new_from menuitem */ - public static final int not_again_newfrom=0x7f0501b4; - public static final int not_again_newselect=0x7f05024f; - public static final int not_again_studycopy=0x7f050269; + public static final int not_again_newfrom=0x7f0501b5; + public static final int not_again_newselect=0x7f050250; + public static final int not_again_studycopy=0x7f05026a; /** The following strings (all whose names start with "not_again") appear in the New user info dialog. shown when user chooses the gamel_menu_checkmoves menu */ - public static final int not_again_sync=0x7f0501a1; + public static final int not_again_sync=0x7f0501a2; /** Shown when the user chooses the "board_menu_trade" menu */ - public static final int not_again_trading=0x7f0501a2; - public static final int not_again_trading_buttons=0x7f0501a3; - public static final int not_again_trading_menu=0x7f0501a4; + public static final int not_again_trading=0x7f0501a3; + public static final int not_again_trading_buttons=0x7f0501a4; + public static final int not_again_trading_menu=0x7f0501a5; /** Shown when the board screen is visible and it's just become another players turn. The idea is to give a hint about how to find out about recent moves. */ - public static final int not_again_turnchanged=0x7f0501b3; + public static final int not_again_turnchanged=0x7f0501b4; /** Shown when you tap the undo/redo button on the toolbar of the main Board screen */ - public static final int not_again_undo=0x7f0501aa; + public static final int not_again_undo=0x7f0501ab; /** Shown in the Game configure screen when the game_locked checkbox is checked and you uncheck it. */ - public static final int not_again_unlock=0x7f0501ae; + public static final int not_again_unlock=0x7f0501af; /** Shown when you tap the values button on the toolbar of the main Board screen. This is intended to allow players to remind themselves how much played tiles are worth while planning a move. */ - public static final int not_again_values=0x7f0501ac; + public static final int not_again_values=0x7f0501ad; /** Shown when you tap the zoom (+/-) button on the toolbar of the main Board screen */ - public static final int not_again_zoom=0x7f0501a9; - public static final int note_none=0x7f05029a; + public static final int not_again_zoom=0x7f0501aa; + public static final int note_none=0x7f05029b; /** This text is displayed as the "summary" for both of the notify choices above, as extra information. (There could be different strings if it makes more sense in your language.) @@ -2057,12 +2058,12 @@ public final class R { device, and the body that appears when you pull the notifications down. */ - public static final int notify_title_fmt=0x7f050190; + public static final int notify_title_fmt=0x7f050191; /** When one or more new moves is found, should I vibrate the device */ public static final int notify_vibrate=0x7f05015b; - public static final int nplayers_prompt=0x7f0502b2; + public static final int nplayers_prompt=0x7f0502b3; /** text of label identifying the field where human players can enter an option password. The label and field disappear when the robot player checkbox is checked because it makes no @@ -2077,7 +2078,7 @@ public final class R { can tap a nearby person\'s device to invite him/her to play – if he/she is also using NFC. */ - public static final int pct_suffix=0x7f05025b; + public static final int pct_suffix=0x7f05025c; /** If this preference is checked, tapping on the scoreboard entry for any player reveals that player's tiles and any pending move (after asking for his password if one is set.) @@ -2093,7 +2094,7 @@ public final class R { public static final int peek_other_summary=0x7f05014d; /** */ - public static final int phone_label=0x7f0501ff; + public static final int phone_label=0x7f050200; /** Don't warn, but simply force to skip turn (give 0 points) when user attempts to play word not in the wordlist. */ @@ -2114,10 +2115,10 @@ public final class R { public static final int phonies_warn=0x7f0500c4; /** */ - public static final int pick_faceup=0x7f0501d0; + public static final int pick_faceup=0x7f0501d1; /** */ - public static final int pick_url_title_fmt=0x7f0501c6; + public static final int pick_url_title_fmt=0x7f0501c7; /** Text of button at bottom. Press it and you exit this configure screen and open the game into the Board screen */ @@ -2137,7 +2138,7 @@ public final class R { /** used to create default player names. Number between 1 and 4 is substituted */ - public static final int player_fmt=0x7f05018f; + public static final int player_fmt=0x7f050190; /** text of lable identifying the field in which player's name is set/displayed */ @@ -2151,17 +2152,17 @@ public final class R { non-networked games */ public static final int players_label_standalone=0x7f0500ac; - public static final int pref_group_l10n_summary=0x7f0502f5; - public static final int pref_group_l10n_title=0x7f0502f4; - public static final int pref_group_relay_summary=0x7f0502f3; - public static final int pref_group_relay_title=0x7f0502f2; - public static final int pref_group_sms_summary=0x7f0502f1; - public static final int pref_group_sms_title=0x7f0502f0; + public static final int pref_group_l10n_summary=0x7f0502f6; + public static final int pref_group_l10n_title=0x7f0502f5; + public static final int pref_group_relay_summary=0x7f0502f4; + public static final int pref_group_relay_title=0x7f0502f3; + public static final int pref_group_sms_summary=0x7f0502f2; + public static final int pref_group_sms_title=0x7f0502f1; /** Label for the first "human player" name preference */ public static final int pref_human_name=0x7f050118; - public static final int pref_item_update_summary=0x7f0502f7; - public static final int pref_item_update_title=0x7f0502f6; + public static final int pref_item_update_summary=0x7f0502f8; + public static final int pref_item_update_title=0x7f0502f7; /** Label for the first player color preference */ public static final int pref_player1_name=0x7f050114; @@ -2238,15 +2239,15 @@ public final class R { public static final int prefs_names_summary=0x7f050113; /** Used when prev player's name can't be looked up */ - public static final int prev_player=0x7f0502a4; - public static final int progress_title=0x7f050298; + public static final int prev_player=0x7f0502a5; + public static final int progress_title=0x7f050299; /** */ - public static final int prompt_max_len=0x7f0501d8; + public static final int prompt_max_len=0x7f0501d9; /** */ - public static final int prompt_min_len=0x7f0501d7; - public static final int proxy_port=0x7f0502d8; + public static final int prompt_min_len=0x7f0501d8; + public static final int proxy_port=0x7f0502d9; /** Short for "points", this is shown at the right end of the tray in place of the first tile placed along with the points the current move would earn if committed. @@ -2261,11 +2262,11 @@ public final class R { /** Title for generic dialog asking a question, usually in the middle of a game, like "do you want to commit this move?" */ - public static final int query_title=0x7f05019e; - public static final int radio_name_cdma=0x7f0502e8; - public static final int radio_name_gsm=0x7f0502e7; - public static final int radio_name_real=0x7f0502e5; - public static final int radio_name_tablet=0x7f0502e6; + public static final int query_title=0x7f05019f; + public static final int radio_name_cdma=0x7f0502e9; + public static final int radio_name_gsm=0x7f0502e8; + public static final int radio_name_real=0x7f0502e6; + public static final int radio_name_tablet=0x7f0502e7; /** ############################################################ # :Dialogs: @@ -2279,30 +2280,30 @@ public final class R { the color preferences dialog */ public static final int red=0x7f05013f; - public static final int redir_host=0x7f0502cc; + public static final int redir_host=0x7f0502cd; /** Title of dialog used to alert players to relay-related problems with the current game. */ public static final int relay_alert=0x7f0500e1; - public static final int relay_alert_title=0x7f05024e; - public static final int relay_host=0x7f0502cb; - public static final int relay_port=0x7f0502d7; + public static final int relay_alert_title=0x7f05024f; + public static final int relay_host=0x7f0502cc; + public static final int relay_port=0x7f0502d8; /** Shown in toast when relaunching after switching dicts */ - public static final int reload_new_dict_fmt=0x7f050231; - public static final int rematch_msg=0x7f0502c4; - public static final int remote_digesting=0x7f050292; - public static final int remote_empty=0x7f050291; + public static final int reload_new_dict_fmt=0x7f050232; + public static final int rematch_msg=0x7f0502c5; + public static final int remote_digesting=0x7f050293; + public static final int remote_empty=0x7f050292; /** checkbox determining of this player is on this device or remote. If remote, then the rest of the fields disappear (since they will be set by the remote device.) */ public static final int remote_label=0x7f0500cf; - public static final int remote_no_net=0x7f050293; + public static final int remote_no_net=0x7f050294; /** */ - public static final int remote_undone=0x7f050202; - public static final int rename_group_label=0x7f050245; + public static final int remote_undone=0x7f050203; + public static final int rename_group_label=0x7f050246; /** text within rename dialog (triggered by selecting list_item_rename) */ @@ -2339,10 +2340,10 @@ public final class R { /** title for popup of public rooms found on server */ public static final int room_public_prompt=0x7f0500b6; - public static final int seeking_relay=0x7f0502fb; - public static final int sel_games_fmt=0x7f050251; - public static final int sel_groups_fmt=0x7f050252; - public static final int sel_items_fmt=0x7f05026d; + public static final int seeking_relay=0x7f0502fc; + public static final int sel_games_fmt=0x7f050252; + public static final int sel_groups_fmt=0x7f050253; + public static final int sel_items_fmt=0x7f05026e; /** ############################################################ # :Dialogs: @@ -2354,7 +2355,7 @@ public final class R { possible answers are the three button text strings below. */ public static final int set_default_message_fmt=0x7f0500a1; - public static final int set_pref=0x7f0502bb; + public static final int set_pref=0x7f0502bc; /** text of separator marking out other-setting area of the dialog */ public static final int settings_label=0x7f0500b9; @@ -2366,8 +2367,8 @@ public final class R { /** clarification of above */ public static final int show_arrow_summary=0x7f050131; - public static final int show_remote=0x7f050296; - public static final int show_wordlist_browser=0x7f05024d; + public static final int show_remote=0x7f050297; + public static final int show_wordlist_browser=0x7f05024e; /** If this preference is checked, the user will not be asked to confirm after selecting the "Turn done" menu (or tapping the points display at the right end of the tray) @@ -2376,17 +2377,18 @@ public final class R { /** explanation of the above */ public static final int skip_confirm_turn_summary=0x7f050147; - public static final int slmenu_clear_sel=0x7f050263; - public static final int slmenu_copy_sel=0x7f050262; - public static final int slmenu_deselect_all=0x7f05026c; - public static final int slmenu_select_all=0x7f05026b; - public static final int sms_bad_proto_fmt=0x7f0501e8; + public static final int skip_relay_warning=0x7f0502fe; + public static final int slmenu_clear_sel=0x7f050264; + public static final int slmenu_copy_sel=0x7f050263; + public static final int slmenu_deselect_all=0x7f05026d; + public static final int slmenu_select_all=0x7f05026c; + public static final int sms_bad_proto_fmt=0x7f0501e9; /** Title of phone number picker during invitation to a game via SMS */ - public static final int sms_invite_title=0x7f0501ef; - public static final int sms_ready_text=0x7f05025a; - public static final int square_tiles=0x7f05024a; - public static final int square_tiles_summary=0x7f05024b; + public static final int sms_invite_title=0x7f0501f0; + public static final int sms_ready_text=0x7f05025b; + public static final int square_tiles=0x7f05024b; + public static final int square_tiles_summary=0x7f05024c; /** Used in formatting moves and history */ public static final int str_bonus_all=0x7f050108; @@ -2395,13 +2397,13 @@ public final class R { be disabling the buttons in this case, but if I don't and you try to get a hint you'll get this message instead. */ - public static final int str_cant_hint_while_disabled=0x7f050181; + public static final int str_cant_hint_while_disabled=0x7f050182; /** Displayed if you try to use the undo menuitem or button and there are no tiles on the board (no move has yet been made.) [If I'm being clever and disabling those features in this case there may be no way to see this.] */ - public static final int str_cant_undo_tileassign=0x7f050180; + public static final int str_cant_undo_tileassign=0x7f050181; /** Beginning of the message presented to a user when asking him to confirm committing the current turn */ @@ -2418,11 +2420,11 @@ public final class R { because there is empty space between some of the tiles placed, i.e. they do not form a single word. */ - public static final int str_no_empties_in_turn=0x7f050179; + public static final int str_no_empties_in_turn=0x7f05017a; /** Same as above, but used when you try to show tiles belonging to a player on another device (a remote player.) */ - public static final int str_no_peek_remote_tiles=0x7f05017e; + public static final int str_no_peek_remote_tiles=0x7f05017f; /** Displayed when you try to reveal a robot player's tiles, either by tapping on its "hidden" rack (marked by "?" characters) or by tapping on its scoreboard entry. (The @@ -2430,7 +2432,7 @@ public final class R { controlled by the peek_other preference and is disabled by default.) */ - public static final int str_no_peek_robot_tiles=0x7f05017d; + public static final int str_no_peek_robot_tiles=0x7f05017e; /** Used, with remote player's name substituted for %1$s, to indicate that the player is remote. */ @@ -2438,7 +2440,7 @@ public final class R { /** Displyed when you try to commit a move and it's not your turn. */ - public static final int str_not_your_turn=0x7f05017c; + public static final int str_not_your_turn=0x7f05017d; /** Used in formatting game history and move summaries */ public static final int str_pass=0x7f0500ff; @@ -2447,7 +2449,7 @@ public final class R { */ public static final int str_phony_rejected=0x7f050104; - public static final int str_placer_fmt=0x7f05022c; + public static final int str_placer_fmt=0x7f05022d; /** Shown when using the the Game configure screen to configure a networked game and you try to make all players local. */ @@ -2459,11 +2461,11 @@ public final class R { many players are expected and only connects devices where the numbers match. */ - public static final int str_reg_unexpected_user=0x7f050182; + public static final int str_reg_unexpected_user=0x7f050183; /** Used in formatting remote player move summaries */ public static final int str_remote_moved_fmt=0x7f0500fd; - public static final int str_resigned_fmt=0x7f05022b; + public static final int str_resigned_fmt=0x7f05022c; /** ############################################################ # Board info/error dialog messages @@ -2479,13 +2481,13 @@ public final class R { play in a different language. As with the above, this should be impossible when connecting via the relay. */ - public static final int str_server_dict_wins=0x7f050183; + public static final int str_server_dict_wins=0x7f050184; /** Displayed when you try to commit a turn that is illegal because tiles played do not touch other tiles already on the board (or the middle/star square in the case of the initial move.) */ - public static final int str_tiles_must_contact=0x7f05017b; + public static final int str_tiles_must_contact=0x7f05017c; /** error messages @@ -2493,20 +2495,20 @@ public final class R { because the tiles placed are not all in the same row or column. */ - public static final int str_tiles_not_in_line=0x7f050178; + public static final int str_tiles_not_in_line=0x7f050179; /** Displayed when you try to begin a trade but there are not seven or more tiles in the pool. The rules don't allow trading in this case. */ - public static final int str_too_few_tiles_left_to_trade=0x7f05017f; + public static final int str_too_few_tiles_left_to_trade=0x7f050180; /** Displayed when you try to commit the first move of the game and are playing a single tile. The first move must include two or more tiles. */ - public static final int str_two_tiles_first_move=0x7f05017a; + public static final int str_two_tiles_first_move=0x7f05017b; /** Used in formatting final scores display */ - public static final int str_winner_fmt=0x7f05022a; + public static final int str_winner_fmt=0x7f05022b; /** Used in formatting game history (not move summaries since information about the current rack is hidden then) */ @@ -2543,21 +2545,21 @@ public final class R { /** Used in formatting exchange move summaries */ public static final int strss_traded_for_fmt=0x7f050103; - public static final int study_langpick=0x7f050266; - public static final int study_no_lang_fmt=0x7f050267; - public static final int study_no_lists=0x7f050268; - public static final int studylist_title_fmt=0x7f050265; + public static final int study_langpick=0x7f050267; + public static final int study_no_lang_fmt=0x7f050268; + public static final int study_no_lists=0x7f050269; + public static final int studylist_title_fmt=0x7f050266; /** If substituting an existing same-language wordlist by choosing button_substdict user gets to choose from a list of wordlists. This is the title of that list. */ - public static final int subst_dict_title=0x7f05018c; + public static final int subst_dict_title=0x7f05018d; /** */ - public static final int summary_conn=0x7f0501e4; + public static final int summary_conn=0x7f0501e5; /** */ - public static final int summary_conn_sms_fmt=0x7f050200; + public static final int summary_conn_sms_fmt=0x7f050201; /** Preference to control what's listed next to game name in the first line of a game summary in the main games-list screen, e.g., if the option is "Game Language", "English" in the @@ -2569,7 +2571,7 @@ public final class R { public static final int summary_field=0x7f050127; /** */ - public static final int summary_gameover=0x7f0501e3; + public static final int summary_gameover=0x7f0501e4; /** The display of each networked game includes one of three states it can be in in the process of connecting to the relay. These next three strings are used to create those @@ -2592,42 +2594,42 @@ public final class R { cannot happen. */ public static final int summary_relay_wait_fmt=0x7f050082; - public static final int summary_send_data_sms=0x7f0502d3; + public static final int summary_send_data_sms=0x7f0502d4; /** explanation of the above */ public static final int summary_sort_tiles=0x7f050149; - public static final int summary_studyon=0x7f050260; - public static final int summary_thumbsize=0x7f050253; + public static final int summary_studyon=0x7f050261; + public static final int summary_thumbsize=0x7f050254; /** */ - public static final int summary_wait_guest=0x7f0501e2; + public static final int summary_wait_guest=0x7f0501e3; /** */ - public static final int summary_wait_host=0x7f0501e1; + public static final int summary_wait_host=0x7f0501e2; /** Used to indicate that a preference is not enabled, i.e. not part of the game and that the user should ignore it. */ public static final int tell_unused=0x7f050119; - public static final int thumb_off=0x7f050254; + public static final int thumb_off=0x7f050255; /** color of the tiles' background */ public static final int tile_back=0x7f05013b; /** */ - public static final int tilepick_all=0x7f0501ce; + public static final int tilepick_all=0x7f0501cf; /** */ - public static final int tilepick_undo=0x7f0501cd; + public static final int tilepick_undo=0x7f0501ce; /** title of dialog brought up in response to the board_menu_game_left menu. The dialog lists all tiles remaining in the pool, i.e. not on the board or in the rack of the player whose turn it is. */ - public static final int tiles_left_title=0x7f050199; + public static final int tiles_left_title=0x7f05019a; /** Title of preference in which you select which addressing modes network games will use to communicate */ - public static final int title_addrs_pref=0x7f0502ab; + public static final int title_addrs_pref=0x7f0502ac; /** ############################################################ # :Screens: @@ -2656,8 +2658,8 @@ public final class R { public static final int title_langs_list=0x7f0500aa; /** */ - public static final int title_lookup=0x7f0501c2; - public static final int title_lookup_study=0x7f0501c3; + public static final int title_lookup=0x7f0501c3; + public static final int title_lookup_study=0x7f0501c4; /** ############################################################ # :Screens: @@ -2671,19 +2673,19 @@ public final class R { window title */ public static final int title_prefs=0x7f05010b; - public static final int title_send_data_sms=0x7f0502d2; + public static final int title_send_data_sms=0x7f0502d3; /** If this preference is checked, tiles in the rack will be re-ordered alphabetically whenever tiles are added, i.e. after ever move. */ public static final int title_sort_tiles=0x7f050148; - public static final int title_studyon=0x7f05025f; + public static final int title_studyon=0x7f050260; /** title of dialog allowing user to pick tiles "face up". (This feature is not yet supported on Android.) */ - public static final int title_tile_picker=0x7f050198; - public static final int update_dicts_fmt=0x7f050297; - public static final int use_defaults=0x7f0502b1; + public static final int title_tile_picker=0x7f050199; + public static final int update_dicts_fmt=0x7f050298; + public static final int use_defaults=0x7f0502b2; /** text of checkbox controlling whether there's a game timer */ public static final int use_timer=0x7f0500bc; @@ -2691,30 +2693,30 @@ public final class R { line in a game summary. The \u0020 is a space in xml. */ public static final int vs_join=0x7f050107; - public static final int waiting_title=0x7f0502bd; - public static final int warn_bt_disabled=0x7f050220; - public static final int warn_no_comms=0x7f0502c0; + public static final int waiting_title=0x7f0502be; + public static final int warn_bt_disabled=0x7f050221; + public static final int warn_no_comms=0x7f0502c1; /** */ - public static final int warn_nomobile_fmt=0x7f0501fa; + public static final int warn_nomobile_fmt=0x7f0501fb; /** */ - public static final int warn_sms_disabled=0x7f05021f; + public static final int warn_sms_disabled=0x7f050220; /** */ - public static final int warn_unlimited=0x7f050201; - public static final int wifi_warning=0x7f0502fd; + public static final int warn_unlimited=0x7f050202; + public static final int wifi_warning=0x7f0502ff; /** */ - public static final int word_search_hint=0x7f0501cc; - public static final int xlations_enabled_summary=0x7f050272; - public static final int xlations_enabled_title=0x7f050271; - public static final int xlations_locale=0x7f0502dd; + public static final int word_search_hint=0x7f0501cd; + public static final int xlations_enabled_summary=0x7f050273; + public static final int xlations_enabled_title=0x7f050272; + public static final int xlations_locale=0x7f0502de; /** Empty in English, this should contain the name of the translator/creator of the strings.xml file for this language */ - public static final int xlator=0x7f0501ba; + public static final int xlator=0x7f0501bb; public static final int xwords_nfc_mime=0x7f050074; } public static final class style { diff --git a/xwords4/android/XWords4/res_src/values-ba_CK/strings.xml b/xwords4/android/XWords4/res_src/values-ba_CK/strings.xml index 89858377c..9f4e4f275 100644 --- a/xwords4/android/XWords4/res_src/values-ba_CK/strings.xml +++ b/xwords4/android/XWords4/res_src/values-ba_CK/strings.xml @@ -1008,6 +1008,7 @@ it immediately because an email or messaging app will be launched to send your invitation. --> Etivni won + Etivni yawyna Wen Htooteulb emag @@ -2134,10 +2135,13 @@ DS drac etirw etelpmoc. Gnitcennoc ot yaler… Siht emag si derugifnoc ot esu eht - yaler rof noitacinummoc tub sah neeb elbanu ot ,tcennoc rehtie - esuaceb fo smelborp htiw ruoy ecived\'s tenretni noitcennoc ro - esuaceb eht yaler si ton gninnur.\n\nEsaelp yrt gninepo eht emag + yaler )revres( rof noitacinummoc tub sah neeb elbanu ot ,tcennoc + rehtie esuaceb fo smelborp htiw ruoy ecived\'s tenretni noitcennoc + ro esuaceb eht yaler si ton gninnur.\n\nEsaelp yrt gninepo eht emag niaga retal retfa snoitidnoc evah degnahc. + eSuaceb( siht emag sah rehto syaw + fo ,gnitacinummoc uoy nac etivni neve tuohtiw a yaler ,noitcennoc + tub yeht uoy\'ll evah ot yalp eht emag tuohtiw ti.) \u0020Rof ,elpmaxe uoy yam deen ot eb no a tnereffid IfIw krowten. diff --git a/xwords4/android/XWords4/res_src/values-ca_PS/strings.xml b/xwords4/android/XWords4/res_src/values-ca_PS/strings.xml index ae443db81..fd39ebcc2 100644 --- a/xwords4/android/XWords4/res_src/values-ca_PS/strings.xml +++ b/xwords4/android/XWords4/res_src/values-ca_PS/strings.xml @@ -1008,6 +1008,7 @@ it immediately because an email or messaging app will be launched to send your invitation. --> INVITE NOW + INVITE ANYWAY NEW BLUETOOTH GAME @@ -2134,10 +2135,13 @@ SD CARD WRITE COMPLETE. 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. From 9a46d0713ad7bcf26af36d89f82de5bec65f6898 Mon Sep 17 00:00:00 2001 From: Eric House Date: Sun, 14 Jun 2015 07:39:10 -0700 Subject: [PATCH 18/49] don't post notifications for "moves" about which there's nothing to be said. I think these are admin messages, e.g. "The move you reported is legal", that are not of interest to users. --- .../org/eehouse/android/xw4/GameUtils.java | 22 +++++++++---------- 1 file changed, 10 insertions(+), 12 deletions(-) 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 9a5b6bf44..952c17833 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/GameUtils.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/GameUtils.java @@ -1,7 +1,7 @@ /* -*- compile-command: "find-and-ant.sh debug install"; -*- */ /* - * Copyright 2009-2010 by Eric House (xwords@eehouse.org). All - * rights reserved. + * Copyright 2009-2015 by Eric House (xwords@eehouse.org). All rights + * reserved. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as @@ -1043,18 +1043,16 @@ public class GameUtils { public static void postMoveNotification( Context context, long rowid, LastMoveInfo lmi ) { - if ( null == lmi ) { - DbgUtils.logf( "postMoveNotification: posting nothing for lack" - + " of lmi" ); - } else { + if ( null != lmi ) { Intent intent = GamesListDelegate.makeRowidIntent( context, rowid ); - String msg = ""; - if ( null != lmi ) { - msg = lmi.format( context ); - } - String title = LocUtils.getString( context, R.string.notify_title_fmt, - getName( context, rowid ) ); + String msg = lmi.format( context ); + String title = + LocUtils.getString( context, R.string.notify_title_fmt, + getName( context, rowid ) ); Utils.postNotification( context, intent, title, msg, (int)rowid ); + } else { + DbgUtils.logf( "postMoveNotification(): posting nothing for lack" + + " of lmi" ); } } From 6a36c1252d896cc56adcf1ba383588491be1756e Mon Sep 17 00:00:00 2001 From: Eric House Date: Sun, 14 Jun 2015 19:39:51 -0700 Subject: [PATCH 19/49] fix assert that wasn't asserting anything --- xwords4/android/XWords4/jni/xwjni.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/xwords4/android/XWords4/jni/xwjni.c b/xwords4/android/XWords4/jni/xwjni.c index 8be134072..29ae3ea43 100644 --- a/xwords4/android/XWords4/jni/xwjni.c +++ b/xwords4/android/XWords4/jni/xwjni.c @@ -126,19 +126,14 @@ map_init( MPFORMAL EnvThreadInfo* ti, JNIEnv* env ) static void map_remove( EnvThreadInfo* ti, JNIEnv* env ) { -#ifdef DEBUG - pthread_t self = pthread_self(); -#endif XP_Bool found = false; pthread_mutex_lock( &ti->mtxThreads ); for ( int ii = 0; !found && ii < ti->nEntries; ++ii ) { found = env == ti->entries[ii].env; if ( found ) { - /* XP_LOGF( "%s: clearing out %dth entry (thread %x)", __func__, ii, */ - /* (int)self ); */ + XP_ASSERT( pthread_self() == ti->entries[ii].owner ); ti->entries[ii].env = NULL; - XP_ASSERT( ti->entries[ii].owner = self ); ti->entries[ii].owner = 0; } } From 4b6ea57e70e26cf050175de0d27fe6e357c2053a Mon Sep 17 00:00:00 2001 From: Eric House Date: Sun, 14 Jun 2015 22:34:58 -0700 Subject: [PATCH 20/49] revert earlier change not running update check timer on DEBUG builds since they're now upgradable too. --- .../android/xw4/UpdateCheckReceiver.java | 31 ++++++++----------- 1 file changed, 13 insertions(+), 18 deletions(-) diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/UpdateCheckReceiver.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/UpdateCheckReceiver.java index ec1bf5ca6..6d2106d54 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/UpdateCheckReceiver.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/UpdateCheckReceiver.java @@ -93,27 +93,22 @@ public class UpdateCheckReceiver extends BroadcastReceiver { public static void restartTimer( Context context ) { - if ( BuildConfig.DEBUG ) { - DbgUtils.logf( "UpdateCheckReceiver.restartTimer(): dropping because" - + " debug builds can't be updated" ); - } else { - AlarmManager am = - (AlarmManager)context.getSystemService( Context.ALARM_SERVICE ); + AlarmManager am = + (AlarmManager)context.getSystemService( Context.ALARM_SERVICE ); - Intent intent = new Intent( context, UpdateCheckReceiver.class ); - PendingIntent pi = PendingIntent.getBroadcast( context, 0, intent, 0 ); - am.cancel( pi ); + Intent intent = new Intent( context, UpdateCheckReceiver.class ); + PendingIntent pi = PendingIntent.getBroadcast( context, 0, intent, 0 ); + am.cancel( pi ); - long interval_millis = INTERVAL_ONEDAY; - if ( !devOK( context ) ) { - interval_millis *= INTERVAL_NDAYS; - } - interval_millis = (interval_millis / 2) - + Math.abs(Utils.nextRandomInt() % interval_millis); - am.setInexactRepeating( AlarmManager.ELAPSED_REALTIME_WAKEUP, - SystemClock.elapsedRealtime() + interval_millis, - interval_millis, pi ); + long interval_millis = INTERVAL_ONEDAY; + if ( !devOK( context ) ) { + interval_millis *= INTERVAL_NDAYS; } + interval_millis = (interval_millis / 2) + + Math.abs(Utils.nextRandomInt() % interval_millis); + am.setInexactRepeating( AlarmManager.ELAPSED_REALTIME_WAKEUP, + SystemClock.elapsedRealtime() + interval_millis, + interval_millis, pi ); } // Is app upgradeable OR have we installed any dicts? From d4bfaca127593d7513bd02a2ffe3b49fe2a84db1 Mon Sep 17 00:00:00 2001 From: Eric House Date: Sun, 14 Jun 2015 22:39:47 -0700 Subject: [PATCH 21/49] cleanup: mostly removing logging and wrapping rematch code in an if(false) so it goes away. --- xwords4/android/XWords4/jni/utilwrapper.c | 4 - .../eehouse/android/xw4/BoardDelegate.java | 59 +++++++------ .../eehouse/android/xw4/CommsTransport.java | 2 - .../src/org/eehouse/android/xw4/DBHelper.java | 1 - .../src/org/eehouse/android/xw4/DBUtils.java | 29 +++---- .../org/eehouse/android/xw4/DlgDelegate.java | 3 +- .../eehouse/android/xw4/DwnldDelegate.java | 1 - .../android/xw4/GameConfigActivity.java | 6 +- .../org/eehouse/android/xw4/GameUtils.java | 4 +- .../android/xw4/GamesListActivity.java | 6 +- .../android/xw4/GamesListDelegate.java | 84 ++++++++----------- .../eehouse/android/xw4/NetLaunchInfo.java | 19 +++-- .../eehouse/android/xw4/NetStateCache.java | 7 +- .../eehouse/android/xw4/RelayReceiver.java | 2 - .../org/eehouse/android/xw4/RelayService.java | 6 +- .../org/eehouse/android/xw4/SMSReceiver.java | 10 +-- .../android/xw4/XWConnAddrPreference.java | 1 - .../eehouse/android/xw4/jni/GameSummary.java | 21 +++-- .../eehouse/android/xw4/jni/UtilCtxtImpl.java | 2 - 19 files changed, 119 insertions(+), 148 deletions(-) diff --git a/xwords4/android/XWords4/jni/utilwrapper.c b/xwords4/android/XWords4/jni/utilwrapper.c index bbe03769b..ed100cf5e 100644 --- a/xwords4/android/XWords4/jni/utilwrapper.c +++ b/xwords4/android/XWords4/jni/utilwrapper.c @@ -431,12 +431,9 @@ and_util_getUserString( XW_UtilCtxt* uc, XP_U16 stringCode ) return result; } -/* FIXME: This will always return the same string, ignoring quantity all but - the first time (because of util->userStrings) */ static const XP_UCHAR* and_util_getUserQuantityString( XW_UtilCtxt* uc, XP_U16 stringCode, XP_U16 quantity ) { - LOG_FUNC(); XP_UCHAR* result = ""; UTIL_CBK_HEADER("getUserQuantityString", "(II)Ljava/lang/String;" ); int index = stringCode - 1; /* see LocalizedStrIncludes.h */ @@ -478,7 +475,6 @@ and_util_getUserQuantityString( XW_UtilCtxt* uc, XP_U16 stringCode, XP_U16 quant result = ptrs[indx]; UTIL_CBK_TAIL(); - LOG_RETURNF( "%s", result ); return result; } 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 e3bb34bf0..433ddff02 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/BoardDelegate.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/BoardDelegate.java @@ -1385,8 +1385,6 @@ public class BoardDelegate extends DelegateBase private void handleConndMessage( String room, int devOrder, // <- hostID boolean allHere, int nMissing ) { - DbgUtils.logf( "BoardDelegate.handleConndMessage(): nMissing = %d", nMissing ); - dismissInviteAlert( nMissing, true ); int naMsg = 0; @@ -1732,8 +1730,8 @@ public class BoardDelegate extends DelegateBase { m_connTypes = connTypes; Assert.assertTrue( isServer || 0 == nMissing ); - DbgUtils.logf( "BoardDelegate.informMissing(isServer=%b, nDevs=%d, nMissing=%d)", - isServer, nDevs, nMissing ); + // DbgUtils.logf( "BoardDelegate.informMissing(isServer=%b, nDevs=%d, nMissing=%d)", + // isServer, nDevs, nMissing ); m_nGuestDevs = nDevs; // If we might have put up an alert earlier, take it down @@ -1891,7 +1889,6 @@ public class BoardDelegate extends DelegateBase m_gi = new CurGameInfo( m_activity ); m_gi.setName( gameName ); XwJNI.gi_from_stream( m_gi, stream ); - DbgUtils.logf( "BoardDelegate:after loadGame: gi.nPlayers: %d", m_gi.nPlayers ); String langName = m_gi.langName(); m_summary = DBUtils.getSummary( m_activity, m_gameLock ); @@ -2443,39 +2440,41 @@ public class BoardDelegate extends DelegateBase private void doRematch() { - String phone = null; - String btAddr = null; - String relayID = null; - if ( m_gi.serverRole != DeviceRole.SERVER_STANDALONE ) { - CommsAddrRec[] addrs = XwJNI.comms_getAddrs( m_jniGamePtr ); - for ( CommsAddrRec addr : addrs ) { - if ( addr.contains( CommsConnType.COMMS_CONN_BT ) ) { - Assert.assertNull( btAddr ); - btAddr = addr.bt_btAddr; - } - if ( addr.contains( CommsConnType.COMMS_CONN_SMS ) ) { - Assert.assertNull( phone ); - phone = addr.sms_phone; - } - if ( addr.contains( CommsConnType.COMMS_CONN_RELAY ) ) { - Assert.assertNull( relayID ); - relayID = m_summary.relayID; + if ( XWApp.REMATCH_SUPPORTED ) { + String phone = null; + String btAddr = null; + String relayID = null; + if ( m_gi.serverRole != DeviceRole.SERVER_STANDALONE ) { + CommsAddrRec[] addrs = XwJNI.comms_getAddrs( m_jniGamePtr ); + for ( CommsAddrRec addr : addrs ) { + if ( addr.contains( CommsConnType.COMMS_CONN_BT ) ) { + Assert.assertNull( btAddr ); + btAddr = addr.bt_btAddr; + } + if ( addr.contains( CommsConnType.COMMS_CONN_SMS ) ) { + Assert.assertNull( phone ); + phone = addr.sms_phone; + } + if ( addr.contains( CommsConnType.COMMS_CONN_RELAY ) ) { + Assert.assertNull( relayID ); + relayID = m_summary.relayID; + } } } - } - Intent intent = GamesListDelegate - .makeRematchIntent( m_activity, m_rowid, m_connTypes, btAddr, - phone, relayID ); - if ( null != intent ) { - startActivity( intent ); - finish(); + Intent intent = GamesListDelegate + .makeRematchIntent( m_activity, m_rowid, m_connTypes, btAddr, + phone, relayID ); + if ( null != intent ) { + startActivity( intent ); + finish(); + } } } private void tryRematchInvites() { - if ( !m_rematchInvitesSent ) { + if ( XWApp.REMATCH_SUPPORTED && !m_rematchInvitesSent ) { m_rematchInvitesSent = true; Assert.assertNotNull( m_summary ); diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/CommsTransport.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/CommsTransport.java index 2ea8daf37..596be5745 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/CommsTransport.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/CommsTransport.java @@ -453,8 +453,6 @@ public class CommsTransport implements TransportProcs, Assert.fail(); break; } - DbgUtils.logf( "sendForAddr(addr=%s)=>%d", conType.toString(), - nSent ); return nSent; } diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/DBHelper.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/DBHelper.java index 7f3b657ef..e9b02e756 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/DBHelper.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/DBHelper.java @@ -60,7 +60,6 @@ public class DBHelper extends SQLiteOpenHelper { public static final String GAMEID = "GAMEID"; public static final String REMOTEDEVS = "REMOTEDEVS"; public static final String EXTRAS = "EXTRAS"; - public static final String JSON_EXTRAS = "JSON_EXTRAS"; public static final String DICTLANG = "DICTLANG"; public static final String DICTLIST = "DICTLIST"; public static final String HASMSGS = "HASMSGS"; 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 d0c85587f..05d710ef5 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/DBUtils.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/DBUtils.java @@ -373,19 +373,21 @@ public class DBUtils { public static void addRematchInfo( Context context, long rowid, String btAddr, String phone, String relayID ) { - GameLock lock = new GameLock( rowid, true ).lock(); - GameSummary summary = getSummary( context, lock ); - if ( null != btAddr ) { - summary.putStringExtra( GameSummary.EXTRA_REMATCH_BTADDR, btAddr ); + if ( XWApp.REMATCH_SUPPORTED ) { + GameLock lock = new GameLock( rowid, true ).lock(); + GameSummary summary = getSummary( context, lock ); + if ( null != btAddr ) { + summary.putStringExtra( GameSummary.EXTRA_REMATCH_BTADDR, btAddr ); + } + if ( null != phone ) { + summary.putStringExtra( GameSummary.EXTRA_REMATCH_PHONE, phone ); + } + if ( null != relayID ) { + summary.putStringExtra( GameSummary.EXTRA_REMATCH_RELAY, relayID ); + } + saveSummary( context, lock, summary ); + lock.unlock(); } - if ( null != phone ) { - summary.putStringExtra( GameSummary.EXTRA_REMATCH_PHONE, phone ); - } - if ( null != relayID ) { - summary.putStringExtra( GameSummary.EXTRA_REMATCH_RELAY, relayID ); - } - saveSummary( context, lock, summary ); - lock.unlock(); } public static int countGamesUsingLang( Context context, int lang ) @@ -718,7 +720,7 @@ public class DBUtils { cursor.close(); db.close(); } - DbgUtils.logf( "getMostRecentCreate(%d) => %H", gameID, result ); + return result; } @@ -763,7 +765,6 @@ public class DBUtils { long[][] rowIDss = new long[1][]; String[] relayIDs = getRelayIDs( context, rowIDss ); boolean result = null != relayIDs && 0 < relayIDs.length; - DbgUtils.logf( "haveRelayGames() => %b", result ); return result; } 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 698341e4c..2524c0603 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/DlgDelegate.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/DlgDelegate.java @@ -194,8 +194,7 @@ public class DlgDelegate { protected void showDialog( DlgID dlgID ) { if ( !m_activity.isFinishing() ) { - int id = dlgID.ordinal(); - m_activity.showDialog( id ); + m_activity.showDialog( dlgID.ordinal() ); } } diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/DwnldDelegate.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/DwnldDelegate.java index f2a8ab6f2..872faff6e 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/DwnldDelegate.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/DwnldDelegate.java @@ -67,7 +67,6 @@ public class DwnldDelegate extends ListDelegateBase { public interface OnGotLcDictListener { void gotDictInfo( boolean success, String lc, String name ); - } public DwnldDelegate( ListDelegator delegator, Bundle savedInstanceState ) diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/GameConfigActivity.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/GameConfigActivity.java index 394153f9a..1a722438c 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/GameConfigActivity.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/GameConfigActivity.java @@ -24,12 +24,10 @@ import android.os.Bundle; public class GameConfigActivity extends XWActivity { - private GameConfigDelegate m_dlgt; - @Override public void onCreate( Bundle savedInstanceState ) { - m_dlgt = new GameConfigDelegate( this, savedInstanceState ); - super.onCreate( savedInstanceState, m_dlgt ); + super.onCreate( savedInstanceState, + new GameConfigDelegate( this, savedInstanceState ) ); } // onCreate } 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 952c17833..32bcef305 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/GameUtils.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/GameUtils.java @@ -601,9 +601,9 @@ public class GameUtils { public static void launchEmailInviteActivity( Activity activity, NetLaunchInfo nli ) { - DbgUtils.logf( "launchEmailInviteActivity: nli=%s", nli.makeLaunchJSON() ); + // DbgUtils.logf( "launchEmailInviteActivity: nli=%s", nli.makeLaunchJSON() ); Uri gameUri = nli.makeLaunchUri( activity ); - DbgUtils.logf( "launchEmailInviteActivity: uri=%s", gameUri ); + // DbgUtils.logf( "launchEmailInviteActivity: uri=%s", gameUri ); String msgString = null == gameUri ? null : gameUri.toString(); if ( null != msgString ) { diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/GamesListActivity.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/GamesListActivity.java index c1b747414..06c3eb169 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/GamesListActivity.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/GamesListActivity.java @@ -48,9 +48,9 @@ public class GamesListActivity extends XWListActivity { // Trying to debug situation where two of this activity are running at // once. finish()ing when Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT is // passed is not the fix, but perhaps there's another - int flags = getIntent().getFlags(); - DbgUtils.logf( "GamesListActivity.onCreate(this=%H): flags=0x%x", - this, flags ); + // int flags = getIntent().getFlags(); + // DbgUtils.logf( "GamesListActivity.onCreate(this=%H): flags=0x%x", + // this, flags ); } // onCreate // called when we're brought to the front (probably as a result of 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 fa44989c3..3d28f99f0 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/GamesListDelegate.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/GamesListDelegate.java @@ -1847,28 +1847,30 @@ public class GamesListDelegate extends ListDelegateBase // used to connect. private void startRematch( Intent intent ) { - long rowid = intent.getLongExtra( REMATCH_ROWID_EXTRA, -1 ); - if ( XWApp.REMATCH_SUPPORTED && -1 != rowid ) { - String btAddr = intent.getStringExtra( REMATCH_BTADDR_EXTRA ); - String phone = intent.getStringExtra( REMATCH_PHONE_EXTRA ); - String relayID = intent.getStringExtra( REMATCH_RELAYID_EXTRA ); - long newid; - if ( null == btAddr && null == phone && null == relayID ) { - // this will juggle if the preference is set - newid = GameUtils.dupeGame( m_activity, rowid ); - } else { - int bits = intent.getIntExtra( REMATCH_ADDRS_EXTRA, -1 ); - CommsConnTypeSet addrs = new CommsConnTypeSet( bits ); + if ( XWApp.REMATCH_SUPPORTED ) { + long rowid = intent.getLongExtra( REMATCH_ROWID_EXTRA, -1 ); + if ( -1 != rowid ) { + String btAddr = intent.getStringExtra( REMATCH_BTADDR_EXTRA ); + String phone = intent.getStringExtra( REMATCH_PHONE_EXTRA ); + String relayID = intent.getStringExtra( REMATCH_RELAYID_EXTRA ); + long newid; + if ( null == btAddr && null == phone && null == relayID ) { + // this will juggle if the preference is set + newid = GameUtils.dupeGame( m_activity, rowid ); + } else { + int bits = intent.getIntExtra( REMATCH_ADDRS_EXTRA, -1 ); + CommsConnTypeSet addrs = new CommsConnTypeSet( bits ); - long groupID = DBUtils.getGroupForGame( m_activity, rowid ); - String gameName = "rematch"; // FIX ME :-) - newid = GameUtils.makeNewMultiGame( m_activity, groupID, addrs, - gameName ); + long groupID = DBUtils.getGroupForGame( m_activity, rowid ); + String gameName = "rematch"; // FIX ME :-) + newid = GameUtils.makeNewMultiGame( m_activity, groupID, + addrs, gameName ); - DBUtils.addRematchInfo( m_activity, newid, btAddr, phone, - relayID ); + DBUtils.addRematchInfo( m_activity, newid, btAddr, phone, + relayID ); + } + launchGame( newid ); } - launchGame( newid ); } } @@ -2104,12 +2106,6 @@ public class GamesListDelegate extends ListDelegateBase launchGame( rowid, true ); } - // private void makeNewBTGame( NetLaunchInfo nli ) - // { - // long rowid = GameUtils.makeNewBTGame( m_activity, nli ); - // launchGame( rowid, true ); - // } - private void tryStartsFromIntent( Intent intent ) { startFirstHasDict( intent ); @@ -2128,17 +2124,6 @@ public class GamesListDelegate extends ListDelegateBase if ( summary.conTypes.contains( CommsAddrRec.CommsConnType.COMMS_CONN_RELAY ) && summary.roomName.length() == 0 ) { Assert.fail(); - // If it's unconfigured and of the type RelayGameActivity - // can handle send it there, otherwise use the full-on - // config. - // Class clazz; - - // if ( RelayGameDelegate.isSimpleGame( summary ) ) { - // clazz = RelayGameActivity.class; - // } else { - // clazz = GameConfigActivity.class; - // } - // GameUtils.doConfig( m_activity, rowid, clazz ); } else { if ( checkWarnNoDict( rowid ) ) { launchGame( rowid ); @@ -2273,18 +2258,21 @@ public class GamesListDelegate extends ListDelegateBase String btAddr, String phone, String relayID ) { - DbgUtils.logf( "makeRematchIntent(btAddr=%s; phone=%s)", btAddr, phone ); - Intent intent = makeSelfIntent( context ); - intent.putExtra( REMATCH_ROWID_EXTRA, rowid ); - intent.putExtra( REMATCH_ADDRS_EXTRA, addrTypes.toInt() ); - if ( null != btAddr ) { - intent.putExtra( REMATCH_BTADDR_EXTRA, btAddr ); - } - if ( null != phone ) { - intent.putExtra( REMATCH_PHONE_EXTRA, phone ); - } - if ( null != relayID ) { - intent.putExtra( REMATCH_RELAYID_EXTRA, relayID ); + Intent intent = null; + if ( XWApp.REMATCH_SUPPORTED ) { + DbgUtils.logf( "makeRematchIntent(btAddr=%s; phone=%s)", btAddr, phone ); + intent = makeSelfIntent( context ); + intent.putExtra( REMATCH_ROWID_EXTRA, rowid ); + intent.putExtra( REMATCH_ADDRS_EXTRA, addrTypes.toInt() ); + if ( null != btAddr ) { + intent.putExtra( REMATCH_BTADDR_EXTRA, btAddr ); + } + if ( null != phone ) { + intent.putExtra( REMATCH_PHONE_EXTRA, phone ); + } + if ( null != relayID ) { + intent.putExtra( REMATCH_RELAYID_EXTRA, relayID ); + } } return intent; } 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 c1e74d866..26b7bb712 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/NetLaunchInfo.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/NetLaunchInfo.java @@ -235,7 +235,7 @@ public class NetLaunchInfo { this( gi ); for ( CommsConnType typ : summary.conTypes.getTypes() ) { - DbgUtils.logf( "NetLaunchInfo(): got type %s", typ.toString() ); + // DbgUtils.logf( "NetLaunchInfo(): got type %s", typ.toString() ); switch( typ ) { case COMMS_CONN_BT: addBTInfo(); @@ -268,7 +268,7 @@ public class NetLaunchInfo { String result = m_inviteID; if ( null == result ) { result = GameUtils.formatGameID( m_gameID ); - DbgUtils.logf( "inviteID(): m_inviteID null so substituting %s", result ); + // DbgUtils.logf( "inviteID(): m_inviteID null so substituting %s", result ); } return result; } @@ -279,7 +279,7 @@ public class NetLaunchInfo { if ( 0 == result ) { Assert.assertNotNull( m_inviteID ); result = Integer.parseInt( m_inviteID, 16 ); - DbgUtils.logf( "gameID(): m_gameID -1 so substituting %d", result ); + // DbgUtils.logf( "gameID(): m_gameID -1 so substituting %d", result ); m_gameID = result; } Assert.assertTrue( 0 != result ); @@ -465,10 +465,11 @@ public class NetLaunchInfo { } Uri result = ub.build(); - // Now test - DbgUtils.logf( "testing %s...", result.toString() ); - NetLaunchInfo instance = new NetLaunchInfo( context, result ); - Assert.assertTrue( instance.isValid() ); + if ( BuildConfig.DEBUG ) { // Test... + DbgUtils.logf( "testing %s...", result.toString() ); + NetLaunchInfo instance = new NetLaunchInfo( context, result ); + Assert.assertTrue( instance.isValid() ); + } return result; } @@ -505,7 +506,7 @@ public class NetLaunchInfo { public boolean isValid() { - DbgUtils.logf( "NetLaunchInfo(%s).isValid() => %b", toString(), m_valid ); + // DbgUtils.logf( "NetLaunchInfo(%s).isValid() => %b", toString(), m_valid ); return m_valid; } @@ -531,7 +532,7 @@ public class NetLaunchInfo { private void calcValid() { boolean valid = hasCommon() && null != m_addrs; - DbgUtils.logf( "calcValid(%s)", toString() ); + // DbgUtils.logf( "calcValid(%s)", toString() ); if ( valid ) { for ( Iterator iter = m_addrs.iterator(); valid && iter.hasNext(); ) { diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/NetStateCache.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/NetStateCache.java index 181f4da2d..6dd49af74 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/NetStateCache.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/NetStateCache.java @@ -101,8 +101,8 @@ public class NetStateCache { NetworkInfo ni = connMgr.getActiveNetworkInfo(); s_netAvail = ni != null && ni.isAvailable() && ni.isConnected(); - DbgUtils.logf( "NetStateCache.initIfNot(): set s_netAvail = %b", - s_netAvail ); + // DbgUtils.logf( "NetStateCache.initIfNot(): set s_netAvail = %b", + // s_netAvail ); s_receiver = new PvtBroadcastReceiver(); IntentFilter filter = new IntentFilter(); @@ -132,7 +132,6 @@ public class NetStateCache { @Override public void onReceive( final Context context, Intent intent ) { - DbgUtils.logf( "NetStateCache.onReceive()" ); DbgUtils.assertOnUIThread(); if ( intent.getAction(). @@ -159,8 +158,6 @@ public class NetStateCache { if ( s_netAvail != netAvail ) { s_netAvail = netAvail; // keep current in case we're asked - DbgUtils.logf( "NetStateCache.onReceive(): set s_netAvail" - + " = %b", s_netAvail ); // We want to wait for WAIT_STABLE_MILLIS of inactivity // before informing listeners. So each time there's a diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/RelayReceiver.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/RelayReceiver.java index 608ea875c..7bb8bd05f 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/RelayReceiver.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/RelayReceiver.java @@ -43,7 +43,6 @@ public class RelayReceiver extends BroadcastReceiver { public static void setTimer( Context context, long interval_millis ) { - DbgUtils.logf( "RelayReceiver.restartTimer(%d)", interval_millis ); AlarmManager am = (AlarmManager)context.getSystemService( Context.ALARM_SERVICE ); @@ -56,7 +55,6 @@ public class RelayReceiver extends BroadcastReceiver { long fire_millis = SystemClock.elapsedRealtime() + interval_millis; am.set( AlarmManager.ELAPSED_REALTIME_WAKEUP, fire_millis, pi ); } else { - DbgUtils.logf( "RelayReceiver.restartTimer(): cancelling" ); // will happen if user's set getProxyIntervalSeconds to return 0 am.cancel( pi ); } diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/RelayService.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/RelayService.java index 36ca20402..459050853 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/RelayService.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/RelayService.java @@ -588,7 +588,7 @@ public class RelayService extends XWService if ( !skipAck ) { sendAckIf( header ); } - DbgUtils.logf( "RelayService.gotPacket: cmd=%s", header.m_cmd.toString() ); + // DbgUtils.logf( "RelayService.gotPacket: cmd=%s", header.m_cmd.toString() ); switch ( header.m_cmd ) { case XWPDEV_UNAVAIL: int unavail = dis.readInt(); @@ -614,8 +614,8 @@ public class RelayService extends XWService case XWPDEV_REGRSP: str = getVLIString( dis ); short maxIntervalSeconds = dis.readShort(); - DbgUtils.logf( "got relayid %s, maxInterval %d", str, - maxIntervalSeconds ); + // DbgUtils.logf( "got relayid %s, maxInterval %d", str, + // maxIntervalSeconds ); setMaxIntervalSeconds( maxIntervalSeconds ); XWPrefs.setRelayDevID( this, str ); s_registered = true; diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/SMSReceiver.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/SMSReceiver.java index f7adc6303..21c009f48 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/SMSReceiver.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/SMSReceiver.java @@ -43,13 +43,11 @@ public class SMSReceiver extends BroadcastReceiver { for ( int ii = 0; ii < pdus.length; ++ii ) { SmsMessage sms = SmsMessage.createFromPdu((byte[])pdus[ii]); - if ( null == sms ) { - continue; + if ( null != sms ) { + String phone = sms.getOriginatingAddress(); + byte[] body = sms.getUserData(); + SMSService.handleFrom( context, body, phone ); } - - String phone = sms.getOriginatingAddress(); - byte[] body = sms.getUserData(); - SMSService.handleFrom( context, body, phone ); } } } diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/XWConnAddrPreference.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/XWConnAddrPreference.java index 94740fe95..f4fd77d26 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/XWConnAddrPreference.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/XWConnAddrPreference.java @@ -87,7 +87,6 @@ public class XWConnAddrPreference extends DialogPreference { public void onClick( DialogInterface dialog, int which ) { if ( AlertDialog.BUTTON_POSITIVE == which ) { - DbgUtils.logf( "ok pressed" ); CommsConnTypeSet curSet = m_view.getTypes(); XWPrefs.setAddrTypes( m_context, curSet ); setSummary( curSet.toString( m_context ) ); 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 d82e8dec0..11117d820 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 @@ -30,6 +30,7 @@ import org.json.JSONObject; import org.eehouse.android.xw4.DbgUtils; import org.eehouse.android.xw4.R; import org.eehouse.android.xw4.Utils; +import org.eehouse.android.xw4.XWApp; import org.eehouse.android.xw4.jni.CommsAddrRec.CommsConnType; import org.eehouse.android.xw4.jni.CommsAddrRec.CommsConnTypeSet; import org.eehouse.android.xw4.jni.CurGameInfo.DeviceRole; @@ -429,17 +430,19 @@ public class GameSummary { public boolean hasRematchInfo() { boolean found = false; - String[] keys = { EXTRA_REMATCH_BTADDR, - EXTRA_REMATCH_PHONE, - EXTRA_REMATCH_RELAY, - }; - for ( String key : keys ) { - found = null != getStringExtra( key ); - if ( found ) { - break; + if ( XWApp.REMATCH_SUPPORTED ) { + String[] keys = { EXTRA_REMATCH_BTADDR, + EXTRA_REMATCH_PHONE, + EXTRA_REMATCH_RELAY, + }; + for ( String key : keys ) { + found = null != getStringExtra( key ); + if ( found ) { + break; + } } + DbgUtils.logf( "hasRematchInfo() => %b", found ); } - DbgUtils.logf( "hasRematchInfo() => %b", found ); return found; } diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/jni/UtilCtxtImpl.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/jni/UtilCtxtImpl.java index 2959f8886..0152fcce2 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/jni/UtilCtxtImpl.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/jni/UtilCtxtImpl.java @@ -234,7 +234,6 @@ public class UtilCtxtImpl implements UtilCtxt { if ( 0 != pluralsId ) { result = LocUtils.getQuantityString( m_context, pluralsId, quantity ); } - DbgUtils.logf( "UtilCtxtImpl.getUserQuantityString() => %s", result ); return result; } @@ -303,7 +302,6 @@ public class UtilCtxtImpl implements UtilCtxt { { Assert.assertTrue( XWApp.SMSSUPPORTED ); boolean same = PhoneNumberUtils.compare( m_context, num1, num2 ); - DbgUtils.logf( "phoneNumbersSame => %b", same ); return same; } From 568e3fdfe8d5e40c3b39f3a090bd6b861b4cd231 Mon Sep 17 00:00:00 2001 From: Eric House Date: Mon, 15 Jun 2015 07:49:59 -0700 Subject: [PATCH 22/49] wrap email in changes log in a mailto url --- xwords4/android/XWords4/assets/changes.html | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/xwords4/android/XWords4/assets/changes.html b/xwords4/android/XWords4/assets/changes.html index dbcb8fc8b..050cd73d2 100644 --- a/xwords4/android/XWords4/assets/changes.html +++ b/xwords4/android/XWords4/assets/changes.html @@ -96,10 +96,11 @@
  • Look into supporting play via peer-to-peer wifi
  • -

    Please let me know (email eehouse@eehouse.org) what's broken - and what features you'd most like to see. And if you do get - a crash, please let your device report it to Google so I can see - it!

    +

    Please let me know + (email xwords@eehouse.org) + what's broken and what features you'd most like to + see. And if you do get a crash, please let your device report it + to Google so I can see it!

    Thanks!
    --Eric

    From 13f4e66f84b6678f19bef436ceda00ed287d872e Mon Sep 17 00:00:00 2001 From: Eric House Date: Tue, 16 Jun 2015 06:45:23 -0700 Subject: [PATCH 23/49] More French strings, and fix typo in English --- xwords4/android/XWords4/archive/R.java | 4 ++-- xwords4/android/XWords4/res/values/strings.xml | 8 ++++---- .../XWords4/res_src/values-ba_CK/strings.xml | 6 +++--- .../XWords4/res_src/values-ca_PS/strings.xml | 6 +++--- .../android/XWords4/res_src/values-fr/strings.xml | 14 ++++++++++---- 5 files changed, 22 insertions(+), 16 deletions(-) diff --git a/xwords4/android/XWords4/archive/R.java b/xwords4/android/XWords4/archive/R.java index bb399806a..19f6c21bf 100644 --- a/xwords4/android/XWords4/archive/R.java +++ b/xwords4/android/XWords4/archive/R.java @@ -2377,7 +2377,7 @@ public final class R { /** explanation of the above */ public static final int skip_confirm_turn_summary=0x7f050147; - public static final int skip_relay_warning=0x7f0502fe; + public static final int skip_relay_warning=0x7f0502ff; public static final int slmenu_clear_sel=0x7f050264; public static final int slmenu_copy_sel=0x7f050263; public static final int slmenu_deselect_all=0x7f05026d; @@ -2705,7 +2705,7 @@ public final class R { /** */ public static final int warn_unlimited=0x7f050202; - public static final int wifi_warning=0x7f0502ff; + public static final int wifi_warning=0x7f0502fe; /** */ public static final int word_search_hint=0x7f0501cd; diff --git a/xwords4/android/XWords4/res/values/strings.xml b/xwords4/android/XWords4/res/values/strings.xml index fdfce9d5e..db8a59248 100644 --- a/xwords4/android/XWords4/res/values/strings.xml +++ b/xwords4/android/XWords4/res/values/strings.xml @@ -2472,11 +2472,11 @@ 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. + (Because this game has other ways + of communicating, you can invite even without a relay connection, + but then you\'ll have to play the game without it.) + diff --git a/xwords4/android/XWords4/res_src/values-ba_CK/strings.xml b/xwords4/android/XWords4/res_src/values-ba_CK/strings.xml index 9f4e4f275..24aa6259c 100644 --- a/xwords4/android/XWords4/res_src/values-ba_CK/strings.xml +++ b/xwords4/android/XWords4/res_src/values-ba_CK/strings.xml @@ -2139,9 +2139,9 @@ rehtie esuaceb fo smelborp htiw ruoy ecived\'s tenretni noitcennoc ro esuaceb eht yaler si ton gninnur.\n\nEsaelp yrt gninepo eht emag niaga retal retfa snoitidnoc evah degnahc.
    - eSuaceb( siht emag sah rehto syaw - fo ,gnitacinummoc uoy nac etivni neve tuohtiw a yaler ,noitcennoc - tub yeht uoy\'ll evah ot yalp eht emag tuohtiw ti.) \u0020Rof ,elpmaxe uoy yam deen ot eb no a tnereffid IfIw krowten. + eSuaceb( siht emag sah rehto syaw + fo ,gnitacinummoc uoy nac etivni neve tuohtiw a yaler ,noitcennoc + tub neht uoy\'ll evah ot yalp eht emag tuohtiw ti.) diff --git a/xwords4/android/XWords4/res_src/values-ca_PS/strings.xml b/xwords4/android/XWords4/res_src/values-ca_PS/strings.xml index fd39ebcc2..7996ca1cb 100644 --- a/xwords4/android/XWords4/res_src/values-ca_PS/strings.xml +++ b/xwords4/android/XWords4/res_src/values-ca_PS/strings.xml @@ -2139,9 +2139,9 @@ 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. + (BECAUSE THIS GAME HAS OTHER WAYS + OF COMMUNICATING, YOU CAN INVITE EVEN WITHOUT A RELAY CONNECTION, + BUT THEN YOU\'LL HAVE TO PLAY THE GAME WITHOUT IT.) diff --git a/xwords4/android/XWords4/res_src/values-fr/strings.xml b/xwords4/android/XWords4/res_src/values-fr/strings.xml index fc0d13120..3fc5756ef 100644 --- a/xwords4/android/XWords4/res_src/values-fr/strings.xml +++ b/xwords4/android/XWords4/res_src/values-fr/strings.xml @@ -1405,6 +1405,7 @@ réseau. (Vous pourrez envoyer des invitations plus tard.) launched to send your invitation. --> Inviter maintenant + Inviter malgré tout @@ -3447,13 +3448,18 @@ pour la langue Connexion au relai… Cette partie est configurée pour - communiquer en utilisant le relai mais n\'a pas pu se connecter, - soit à cause de problèmes avec la connexion Internet de votre - périphérique, soit parce que le relai ne tourne pas.\n\n Veuillez - réessayer d\'ouvrir la partie ultérieurement, après que les + communiquer en utilisant le relai (serveur) mais n\'a pas pu se + connecter, soit à cause de problèmes avec la connexion Internet de + votre périphérique, soit parce que le relai ne tourne pas.\n\n + Veuillez réessayer d\'ouvrir la partie ultérieurement, après que les conditions aient changé. \u0020Vous pourriez, par exemple, avoir besoin d\'être sur un réseau Wi-Fi différent. + (Étant donné que cette partie a + d\'autres moyens de communiquer, vous pouvez inviter même sans une + connexion à un relai, mais ensuite vous devrez jouer sans elle.) + + From 9d25b0cb65bfbe34c6461aaacb46f8d48b44d36d Mon Sep 17 00:00:00 2001 From: Eric House Date: Tue, 16 Jun 2015 07:27:01 -0700 Subject: [PATCH 24/49] test for language, not full locale, in deciding to show English-only release note --- .../XWords4/src/org/eehouse/android/xw4/GamesListDelegate.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 3d28f99f0..417a3b98a 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/GamesListDelegate.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/GamesListDelegate.java @@ -895,7 +895,7 @@ public class GamesListDelegate extends ListDelegateBase boolean isUpgrade = Utils.firstBootThisVersion( m_activity ); if ( isUpgrade && !s_firstShown ) { - if ( LocUtils.getCurLocale( m_activity ).equals( "en" ) ) { + if ( LocUtils.getCurLangCode( m_activity ).equals( "en" ) ) { FirstRunDialog.show( m_activity ); } s_firstShown = true; From f93f0cd926217a0c3c07584f343cb3d8f8ae1347 Mon Sep 17 00:00:00 2001 From: Eric House Date: Thu, 18 Jun 2015 08:14:33 -0700 Subject: [PATCH 25/49] Yet another attempt to deal with bad connectivity: when can't connect to relay but other address modes are present, offer to remove the relay from the game, and if that choice is taken confirm with an explanation of the limits of what remains. --- xwords4/android/XWords4/archive/R.java | 7 +++- .../android/XWords4/res/values/strings.xml | 23 ++++++---- .../XWords4/res_src/values-ba_CK/strings.xml | 22 ++++++---- .../XWords4/res_src/values-ca_PS/strings.xml | 22 ++++++---- .../XWords4/res_src/values-fr/strings.xml | 5 --- .../eehouse/android/xw4/BoardDelegate.java | 42 +++++++++++++++++-- .../org/eehouse/android/xw4/DlgDelegate.java | 1 + .../eehouse/android/xw4/jni/CommsAddrRec.java | 5 +++ 8 files changed, 93 insertions(+), 34 deletions(-) diff --git a/xwords4/android/XWords4/archive/R.java b/xwords4/android/XWords4/archive/R.java index 19f6c21bf..de6ad0ff3 100644 --- a/xwords4/android/XWords4/archive/R.java +++ b/xwords4/android/XWords4/archive/R.java @@ -861,6 +861,9 @@ public final class R { of the language is substituted for %1$s. */ public static final int confirm_deleteonly_dicts_fmt=0x7f0500a0; + public static final int confirm_drop_relay=0x7f050300; + public static final int confirm_drop_relay_bt=0x7f050301; + public static final int confirm_drop_relay_sms=0x7f050302; public static final int confirm_get_locdict_fmt=0x7f0502c9; /** Text of confirmation dialog for above */ @@ -1070,6 +1073,7 @@ public final class R { public static final int download_failed=0x7f05023a; public static final int download_path_title=0x7f05023d; public static final int downloading_dict_fmt=0x7f050185; + public static final int drop_relay_warning_fmt=0x7f0502ff; /** Display snapshots of games */ public static final int dropped_dupe=0x7f050256; @@ -1826,13 +1830,13 @@ public final class R { this and you'll get taken to the "Game configure" screen */ public static final int newgame_configure_first=0x7f050160; + public static final int newgame_drop_relay=0x7f050164; /** Text of first of two buttons for new networked games. Tap this and a game will be created, but you probably won't see it immediately because an email or messaging app will be launched to send your invitation. */ public static final int newgame_invite=0x7f050163; - public static final int newgame_invite_anyway=0x7f050164; /** Text of first of two buttons for new standalone games. Tap this and a new game will be created and opened. If the first player is a robot it will immediately take its turn. @@ -2377,7 +2381,6 @@ public final class R { /** explanation of the above */ public static final int skip_confirm_turn_summary=0x7f050147; - public static final int skip_relay_warning=0x7f0502ff; public static final int slmenu_clear_sel=0x7f050264; public static final int slmenu_copy_sel=0x7f050263; public static final int slmenu_deselect_all=0x7f05026d; diff --git a/xwords4/android/XWords4/res/values/strings.xml b/xwords4/android/XWords4/res/values/strings.xml index db8a59248..41e9f15b7 100644 --- a/xwords4/android/XWords4/res/values/strings.xml +++ b/xwords4/android/XWords4/res/values/strings.xml @@ -1170,7 +1170,7 @@ it immediately because an email or messaging app will be launched to send your invitation. --> Invite now - Invite anyway + Drop Relay @@ -2467,16 +2467,23 @@ Connecting to relay… This game is configured to use the - 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. + relay (internet) for communication but has been unable to + connect.\n\nPlease try opening the game again later after + conditions have changed. \u0020For example, you may need to be on a different WiFi network. - (Because this game has other ways - of communicating, you can invite even without a relay connection, - but then you\'ll have to play the game without it.) + (This game can also connect + via %1$s, so if you\'d like to play the game without a relay + connection you can.) + + + Are you sure you want to drop this + game\'s ability to communicate via the relay? + Bluetooth only works for nearby + devices. + Not all carriers support play + via SMS. diff --git a/xwords4/android/XWords4/res_src/values-ba_CK/strings.xml b/xwords4/android/XWords4/res_src/values-ba_CK/strings.xml index 24aa6259c..efad02670 100644 --- a/xwords4/android/XWords4/res_src/values-ba_CK/strings.xml +++ b/xwords4/android/XWords4/res_src/values-ba_CK/strings.xml @@ -1008,7 +1008,7 @@ it immediately because an email or messaging app will be launched to send your invitation. --> Etivni won - Etivni yawyna + Pord Yaler Wen Htooteulb emag @@ -2135,13 +2135,19 @@ DS drac etirw etelpmoc. Gnitcennoc ot yaler… Siht emag si derugifnoc ot esu eht - yaler )revres( rof noitacinummoc tub sah neeb elbanu ot ,tcennoc - rehtie esuaceb fo smelborp htiw ruoy ecived\'s tenretni noitcennoc - ro esuaceb eht yaler si ton gninnur.\n\nEsaelp yrt gninepo eht emag - niaga retal retfa snoitidnoc evah degnahc. + yaler )tenretni( rof noitacinummoc tub sah neeb elbanu ot + tcennoc.\n\nEsaelp yrt gninepo eht emag niaga retal retfa + snoitidnoc evah degnahc. \u0020Rof ,elpmaxe uoy yam deen ot eb no a tnereffid IfIw krowten. - eSuaceb( siht emag sah rehto syaw - fo ,gnitacinummoc uoy nac etivni neve tuohtiw a yaler ,noitcennoc - tub neht uoy\'ll evah ot yalp eht emag tuohtiw ti.) + sIht( emag nac osla tcennoc + aiv %1$s, os fi uoy\'d ekil ot yalp eht emag tuohtiw a yaler + noitcennoc uoy nac.) + + Era uoy erus uoy tnaw ot pord siht + emag\'s ytiliba ot etacinummoc aiv eht ?yaler + Htooteulb ylno skrow rof ybraen + secived. + Ton lla sreirrac troppus yalp + aiv SMS. diff --git a/xwords4/android/XWords4/res_src/values-ca_PS/strings.xml b/xwords4/android/XWords4/res_src/values-ca_PS/strings.xml index 7996ca1cb..6498f2bfe 100644 --- a/xwords4/android/XWords4/res_src/values-ca_PS/strings.xml +++ b/xwords4/android/XWords4/res_src/values-ca_PS/strings.xml @@ -1008,7 +1008,7 @@ it immediately because an email or messaging app will be launched to send your invitation. --> INVITE NOW - INVITE ANYWAY + DROP RELAY NEW BLUETOOTH GAME @@ -2135,13 +2135,19 @@ SD CARD WRITE COMPLETE. CONNECTING TO RELAY… THIS GAME IS CONFIGURED TO USE THE - 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. + RELAY (INTERNET) FOR COMMUNICATION BUT HAS BEEN UNABLE TO + CONNECT.\n\nPLEASE TRY OPENING THE GAME AGAIN LATER AFTER + CONDITIONS HAVE CHANGED. \u0020FOR EXAMPLE, YOU MAY NEED TO BE ON A DIFFERENT WIFI NETWORK. - (BECAUSE THIS GAME HAS OTHER WAYS - OF COMMUNICATING, YOU CAN INVITE EVEN WITHOUT A RELAY CONNECTION, - BUT THEN YOU\'LL HAVE TO PLAY THE GAME WITHOUT IT.) + (THIS GAME CAN ALSO CONNECT + VIA %1$s, SO IF YOU\'D LIKE TO PLAY THE GAME WITHOUT A RELAY + CONNECTION YOU CAN.) + + ARE YOU SURE YOU WANT TO DROP THIS + GAME\'S ABILITY TO COMMUNICATE VIA THE RELAY? + BLUETOOTH ONLY WORKS FOR NEARBY + DEVICES. + NOT ALL CARRIERS SUPPORT PLAY + VIA SMS. diff --git a/xwords4/android/XWords4/res_src/values-fr/strings.xml b/xwords4/android/XWords4/res_src/values-fr/strings.xml index 3fc5756ef..799a82274 100644 --- a/xwords4/android/XWords4/res_src/values-fr/strings.xml +++ b/xwords4/android/XWords4/res_src/values-fr/strings.xml @@ -1405,7 +1405,6 @@ réseau. (Vous pourrez envoyer des invitations plus tard.) launched to send your invitation. --> Inviter maintenant - Inviter malgré tout @@ -3457,9 +3456,5 @@ pour la langue \u0020Vous pourriez, par exemple, avoir besoin d\'être sur un réseau Wi-Fi différent. - (Étant donné que cette partie a - d\'autres moyens de communiquer, vous pouvez inviter même sans une - connexion à un relai, mais ensuite vous devrez jouer sans elle.) - 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 433ddff02..248725c5c 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/BoardDelegate.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/BoardDelegate.java @@ -436,7 +436,12 @@ public class BoardDelegate extends DelegateBase lstnr = new OnClickListener() { public void onClick( DialogInterface dialog, int item ) { - showInviteChoicesThen( Action.LAUNCH_INVITE_ACTION ); + if ( m_relayConnected || + ! m_connTypes.contains(CommsConnType.COMMS_CONN_RELAY) ) { + showInviteChoicesThen( Action.LAUNCH_INVITE_ACTION ); + } else { + askDropRelay(); + } } }; OnClickListener lstnr2 = new OnClickListener() { @@ -495,8 +500,13 @@ public class BoardDelegate extends DelegateBase message += getString( R.string.wifi_warning ); } if ( !relayOnly ) { - message += "\n\n" + getString( R.string.skip_relay_warning ); - buttonTxt = R.string.newgame_invite_anyway; + CommsConnTypeSet without = (CommsConnTypeSet) + m_connTypes.clone(); + without.remove( CommsConnType.COMMS_CONN_RELAY ); + message += "\n\n" + + getString( R.string.drop_relay_warning_fmt, + without.toString( m_activity ) ); + buttonTxt = R.string.newgame_drop_relay; } } else { titleID = R.string.waiting_title; @@ -1003,6 +1013,9 @@ public class BoardDelegate extends DelegateBase case NFC_TO_SELF: GamesListDelegate.sendNFCToSelf( m_activity, makeNFCMessage() ); break; + case DROP_RELAY_ACTION: + dropRelayAndRestart(); + break; default: handled = false; } @@ -1296,6 +1309,29 @@ public class BoardDelegate extends DelegateBase return m_handler; } + private void askDropRelay() + { + String msg = getString( R.string.confirm_drop_relay ); + if ( m_connTypes.contains(CommsConnType.COMMS_CONN_BT) ) { + msg += " " + getString( R.string.confirm_drop_relay_bt ); + } + if ( m_connTypes.contains(CommsConnType.COMMS_CONN_SMS) ) { + msg += " " + getString( R.string.confirm_drop_relay_sms ); + } + showConfirmThen( msg, Action.DROP_RELAY_ACTION ); + } + + private void dropRelayAndRestart() { + CommsAddrRec addr = new CommsAddrRec(); + XwJNI.comms_getAddr( m_jniGamePtr, addr ); + addr.remove( CommsConnType.COMMS_CONN_RELAY ); + XwJNI.comms_setAddr( m_jniGamePtr, addr ); + + finish(); + + GameUtils.launchGame( m_activity, m_rowid, m_haveInvited ); + } + private void setGotGameDict( String getDict ) { m_jniThread.setSaveDict( getDict ); 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 2524c0603..f805c0aac 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/DlgDelegate.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/DlgDelegate.java @@ -83,6 +83,7 @@ public class DlgDelegate { SMS_CONFIG_ACTION, BUTTON_BROWSEALL_ACTION, NFC_TO_SELF, + DROP_RELAY_ACTION, // Dict Browser FINISH_ACTION, diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/jni/CommsAddrRec.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/jni/CommsAddrRec.java index 5ba7104d8..bf86dc73f 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/jni/CommsAddrRec.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/jni/CommsAddrRec.java @@ -270,6 +270,11 @@ public class CommsAddrRec { } } + public void remove( CommsConnType typ ) + { + conTypes.remove( typ ); + } + public boolean changesMatter( final CommsAddrRec other ) { boolean matter = ! conTypes.equals( other.conTypes ); From d89c0d28478081385ab9d626ad20a541b89ce996 Mon Sep 17 00:00:00 2001 From: Eric House Date: Thu, 18 Jun 2015 08:48:03 -0700 Subject: [PATCH 26/49] on receipt of invitation, remove address modes the device doesn't support. --- .../org/eehouse/android/xw4/NetLaunchInfo.java | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) 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 26b7bb712..85af2537f 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/NetLaunchInfo.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/NetLaunchInfo.java @@ -185,6 +185,8 @@ public class NetLaunchInfo { } } + removeUnsupported( supported ); + dict = data.getQueryParameter( WORDLIST_KEY ); String langStr = data.getQueryParameter( LANG_KEY ); lang = Integer.decode( langStr ); @@ -369,6 +371,7 @@ public class NetLaunchInfo { private void init( Context context, String data ) { + CommsConnTypeSet supported = CommsConnTypeSet.getSupported( context ); try { JSONObject json = new JSONObject( data ); @@ -386,7 +389,6 @@ public class NetLaunchInfo { m_gameID = json.optInt( MultiService.GAMEID, 0 ); // Try each type - CommsConnTypeSet supported = CommsConnTypeSet.getSupported( context ); for ( CommsConnType typ : supported.getTypes() ) { if ( hasAddrs && !m_addrs.contains( typ ) ) { continue; @@ -422,6 +424,8 @@ public class NetLaunchInfo { DbgUtils.loge( jse ); } + removeUnsupported( supported ); + calcValid(); } @@ -529,6 +533,16 @@ public class NetLaunchInfo { && 0 != gameID(); } + private void removeUnsupported( CommsConnTypeSet supported ) + { + for ( Iterator iter = m_addrs.iterator(); + iter.hasNext(); ) { + if ( !supported.contains( iter.next() ) ) { + iter.remove(); + } + } + } + private void calcValid() { boolean valid = hasCommon() && null != m_addrs; From d27fdbd7484c367a6e31a34d06cb532e04832c16 Mon Sep 17 00:00:00 2001 From: Eric House Date: Fri, 19 Jun 2015 07:45:47 -0700 Subject: [PATCH 27/49] It's now possible for a game to have no address modes, so don't assert otherwise. --- .../android/XWords4/src/org/eehouse/android/xw4/DBUtils.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) 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 05d710ef5..3921beb53 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/DBUtils.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/DBUtils.java @@ -572,8 +572,9 @@ public class DBUtils { long rowid = cursor.getLong( indx1 ); CommsConnTypeSet typs = new CommsConnTypeSet( cursor.getInt(indx2) ); // Better have an address if has pending sends - Assert.assertTrue( 0 < typs.size() ); - result.put( rowid, typs ); + if ( 0 < typs.size() ) { + result.put( rowid, typs ); + } } cursor.close(); db.close(); From 8354f4554812e34b74abecc453886f805b10588e Mon Sep 17 00:00:00 2001 From: Eric House Date: Fri, 19 Jun 2015 07:51:51 -0700 Subject: [PATCH 28/49] deal with case where invitation includes only conntypes not supported on device, e.g. sms-only sent to a tablet. Strip the unsupported types when creating the game, and then on game open suggest to user he delete (with explanation) --- xwords4/android/XWords4/archive/R.java | 491 +++++++++--------- .../android/XWords4/res/values/strings.xml | 4 + .../XWords4/res_src/values-ba_CK/strings.xml | 4 + .../XWords4/res_src/values-ca_PS/strings.xml | 4 + .../eehouse/android/xw4/BoardDelegate.java | 38 +- 5 files changed, 286 insertions(+), 255 deletions(-) diff --git a/xwords4/android/XWords4/archive/R.java b/xwords4/android/XWords4/archive/R.java index de6ad0ff3..27a58709c 100644 --- a/xwords4/android/XWords4/archive/R.java +++ b/xwords4/android/XWords4/archive/R.java @@ -444,23 +444,23 @@ public final class R { /** Another paragraph in the about dialog */ public static final int about_web=0x7f0501ba; - public static final int add_done_fmt=0x7f050265; - public static final int add_to_study_fmt=0x7f05025f; + public static final int add_done_fmt=0x7f050266; + public static final int add_to_study_fmt=0x7f050260; /** Debugging stuff. Localize if you think your langauge users will care. */ - public static final int advanced=0x7f0502ca; + public static final int advanced=0x7f0502cb; /** This button takes you to the normal Game Configure screen */ public static final int advanced_config=0x7f050177; - public static final int advanced_summary=0x7f0502cb; + public static final int advanced_summary=0x7f0502cc; /** */ public static final int alert_empty_dict_fmt=0x7f0501d5; /** The name of the app. Not localized! */ public static final int app_name=0x7f050001; - public static final int app_not_found_fmt=0x7f0502aa; + public static final int app_not_found_fmt=0x7f0502ab; public static final int app_version=0x7f050000; /** the background color of the area outside the board, e.g. between entries in the scoreboard @@ -518,7 +518,7 @@ public final class R { asking. */ public static final int board_menu_game_left=0x7f0500f2; - public static final int board_menu_game_netstats=0x7f0502d5; + public static final int board_menu_game_netstats=0x7f0502d6; /** Meaningful only for networked games, this menu causes all messages that have not yet been acknowledged by a remote device in the game to be resent. Eventually I hope to be @@ -527,7 +527,7 @@ public final class R { */ public static final int board_menu_game_resend=0x7f0500f6; public static final int board_menu_game_resign=0x7f0500f5; - public static final int board_menu_invite=0x7f050258; + public static final int board_menu_invite=0x7f050259; /** */ public static final int board_menu_pass=0x7f0501c8; @@ -598,7 +598,7 @@ public final class R { /** Title of device picker during invitation to a game via Bluetooth */ public static final int bt_invite_title=0x7f0501ef; - public static final int bt_no_devs=0x7f0502a9; + public static final int bt_no_devs=0x7f0502aa; /** Turn Bluetooth on In the Bluetooth invite device dialog */ @@ -615,7 +615,7 @@ public final class R { /** The only button available when the above message is displayed */ public static final int button_close_game=0x7f050188; - public static final int button_decline=0x7f050238; + public static final int button_decline=0x7f050239; /** */ public static final int button_default_both=0x7f0500a4; @@ -641,7 +641,7 @@ public final class R { reset a game. */ public static final int button_discard=0x7f050195; - public static final int button_discard_changes=0x7f0502c4; + public static final int button_discard_changes=0x7f0502c5; /** */ public static final int button_done=0x7f0501c5; @@ -651,17 +651,17 @@ public final class R { /** Text of button displayed when downloading is an option */ public static final int button_download=0x7f05018b; - public static final int button_edit=0x7f0502c3; - public static final int button_enable_bt=0x7f050223; - public static final int button_enable_sms=0x7f050222; - public static final int button_go_settings=0x7f05025a; + public static final int button_edit=0x7f0502c4; + public static final int button_enable_bt=0x7f050224; + public static final int button_enable_sms=0x7f050223; + public static final int button_go_settings=0x7f05025b; /** */ public static final int button_invite=0x7f0501ee; /** text of button to juggle (randomly rearrange order of) players */ public static final int button_juggle_players=0x7f0500af; - public static final int button_later=0x7f050224; + public static final int button_later=0x7f050225; /** New strings that need to be documented and found a home above. */ @@ -724,12 +724,12 @@ public final class R { above. */ public static final int button_notagain=0x7f0501a1; - public static final int button_reconnect=0x7f05024a; + public static final int button_reconnect=0x7f05024b; /** Button shown in game over dialog triggering creation of new game with the same players and parameters as the one that just ended. */ - public static final int button_rematch=0x7f050249; + public static final int button_rematch=0x7f05024a; /** When you select the list_item_reset contextual menu, you are asked to confirm. This is the text of the first button ("Cancel" is the second). @@ -794,8 +794,8 @@ public final class R { in many places. */ public static final int button_yes=0x7f050192; - public static final int cannot_delete_default_group_fmt=0x7f050248; - public static final int change_group=0x7f05024d; + public static final int cannot_delete_default_group_fmt=0x7f050249; + public static final int change_group=0x7f05024e; /** text of button in About Crosswords dialog summoning above dialog */ @@ -841,9 +841,9 @@ public final class R { substituted for %1$s. */ public static final int chat_title_fmt=0x7f050171; - public static final int checking_for_fmt=0x7f0502fa; - public static final int checking_title=0x7f0502f9; - public static final int checkupdates_none_found=0x7f050226; + public static final int checking_for_fmt=0x7f0502fb; + public static final int checking_title=0x7f0502fa; + public static final int checkupdates_none_found=0x7f050227; /** color of the "crosshairs", lines drawn vertically and horizontally through the square the user is currently touching in order to guide the fat-fingered (most of us) in @@ -851,7 +851,7 @@ public final class R { on the board. */ public static final int clr_crosshairs=0x7f05013a; - public static final int config_no_connvia=0x7f0502c2; + public static final int config_no_connvia=0x7f0502c3; /** */ public static final int confirm_clear=0x7f0501fe; @@ -861,10 +861,10 @@ public final class R { of the language is substituted for %1$s. */ public static final int confirm_deleteonly_dicts_fmt=0x7f0500a0; - public static final int confirm_drop_relay=0x7f050300; - public static final int confirm_drop_relay_bt=0x7f050301; - public static final int confirm_drop_relay_sms=0x7f050302; - public static final int confirm_get_locdict_fmt=0x7f0502c9; + public static final int confirm_drop_relay=0x7f050301; + public static final int confirm_drop_relay_bt=0x7f050302; + public static final int confirm_drop_relay_sms=0x7f050303; + public static final int confirm_get_locdict_fmt=0x7f0502ca; /** Text of confirmation dialog for above */ public static final int confirm_revert_all=0x7f05010f; @@ -881,22 +881,22 @@ public final class R { public static final int confirm_save_title=0x7f0500c9; /** */ - public static final int confirm_sms_expl=0x7f05021b; + public static final int confirm_sms_expl=0x7f05021c; /** */ - public static final int confirm_sms_leave=0x7f05021d; + public static final int confirm_sms_leave=0x7f05021e; /** */ - public static final int confirm_sms_prompt=0x7f05021c; + public static final int confirm_sms_prompt=0x7f05021d; /** */ - public static final int confirm_sms_title=0x7f05021a; + public static final int confirm_sms_title=0x7f05021b; /** */ - public static final int confirm_sms_unlimited=0x7f05021e; + public static final int confirm_sms_unlimited=0x7f05021f; /** */ - public static final int confirm_sms_willpay=0x7f05021f; + public static final int confirm_sms_willpay=0x7f050220; /** text of dialog shown when the menu item board_menu_undo_last is chosen. */ @@ -930,51 +930,52 @@ public final class R { public static final int connect_one_hour=0x7f050157; public static final int connect_six_hours=0x7f050158; public static final int connect_thirty_mins=0x7f050156; - public static final int connection_via_label=0x7f0502bb; + public static final int connection_via_label=0x7f0502bc; /** */ - public static final int connstat_lastother_succ_fmt=0x7f050212; + public static final int connstat_lastother_succ_fmt=0x7f050213; /** */ - public static final int connstat_lastother_unsucc_fmt=0x7f050213; + public static final int connstat_lastother_unsucc_fmt=0x7f050214; /** */ - public static final int connstat_lastreceipt_fmt=0x7f050214; + public static final int connstat_lastreceipt_fmt=0x7f050215; /** */ - public static final int connstat_lastsend_fmt=0x7f050211; + public static final int connstat_lastsend_fmt=0x7f050212; /** */ - public static final int connstat_net_fmt=0x7f05020e; + public static final int connstat_net_fmt=0x7f05020f; + public static final int connstat_net_noaddr=0x7f05020e; /** */ - public static final int connstat_noreceipt=0x7f050215; + public static final int connstat_noreceipt=0x7f050216; /** */ - public static final int connstat_relay=0x7f050216; + public static final int connstat_relay=0x7f050217; /** */ - public static final int connstat_sms=0x7f050217; + public static final int connstat_sms=0x7f050218; /** */ - public static final int connstat_succ=0x7f05020f; + public static final int connstat_succ=0x7f050210; /** */ - public static final int connstat_unsucc=0x7f050210; + public static final int connstat_unsucc=0x7f050211; /** title of dialog brought up in response to the board_menu_game_counts menu. The dialog lists all tiles in the language being used for the game together with how many of each there are are and how many points each is worth. */ public static final int counts_values_title=0x7f05019b; - public static final int cur_menu_marker_fmt=0x7f050257; + public static final int cur_menu_marker_fmt=0x7f050258; /** */ public static final int cur_tiles_fmt=0x7f0501d0; - public static final int data_gsm_only=0x7f050274; - public static final int db_store_done=0x7f0502fb; - public static final int debug_features=0x7f0502d1; - public static final int debug_features_summary=0x7f0502d2; + public static final int data_gsm_only=0x7f050275; + public static final int db_store_done=0x7f0502fc; + public static final int debug_features=0x7f0502d2; + public static final int debug_features_summary=0x7f0502d3; /** dictionary used by default for human players when creating new game */ @@ -984,9 +985,9 @@ public final class R { public static final int default_host=0x7f050073; /** label within default wordlists in app preferences */ - public static final int default_language=0x7f0502ab; - public static final int default_loc=0x7f05023b; - public static final int default_loc_summary=0x7f05023c; + public static final int default_language=0x7f0502ac; + public static final int default_loc=0x7f05023c; + public static final int default_loc_summary=0x7f05023d; /** Welcome dialog text */ public static final int default_name_message=0x7f0501b7; @@ -1014,7 +1015,7 @@ public final class R { */ public static final int default_robodict=0x7f05011d; public static final int default_update_url=0x7f050079; - public static final int delete_dicts=0x7f050296; + public static final int delete_dicts=0x7f050297; /** Playing via SMS is currently disabled. You can enable it in Settings->Network game settings. @@ -1024,16 +1025,16 @@ public final class R { /** */ public static final int dict_browse_nowords_fmt=0x7f0501d2; - public static final int dict_desc_fmt=0x7f05029d; - public static final int dict_host=0x7f0502ce; - public static final int dict_info_fmt=0x7f05029a; + public static final int dict_desc_fmt=0x7f05029e; + public static final int dict_host=0x7f0502cf; + public static final int dict_info_fmt=0x7f05029b; /** label for dropdown by which wordlist is chosen that this player will use. The language the game will use (which constrains the choice of wordlists) is substituted in for "%1$s". */ public static final int dict_lang_label_fmt=0x7f0500d1; - public static final int dict_on_server=0x7f05029c; + public static final int dict_on_server=0x7f05029d; /** string name="invite_mime">text/plainDisplay snapshots of games */ - public static final int dropped_dupe=0x7f050256; + public static final int dropped_dupe=0x7f050257; /** Shown in the main screen when you launch Crosswords from an invitation (received in email or messaging app, say) and there's already a game running that matches that invitation. @@ -1104,24 +1105,24 @@ public final class R { /** Shows in SMS Invite dialog when no phone numbers have been saved previously */ public static final int empty_sms_inviter=0x7f0501fc; - public static final int enable_dupes_summary=0x7f0502df; - public static final int enable_dupes_title=0x7f0502dd; - public static final int enable_nfc=0x7f050259; - public static final int enable_nfc_toself_summary=0x7f0502e2; - public static final int enable_nfc_toself_title=0x7f0502e1; - public static final int enable_pubroom_summary=0x7f0502ba; - public static final int enable_pubroom_title=0x7f0502b9; + public static final int enable_dupes_summary=0x7f0502e0; + public static final int enable_dupes_title=0x7f0502de; + public static final int enable_nfc=0x7f05025a; + public static final int enable_nfc_toself_summary=0x7f0502e3; + public static final int enable_nfc_toself_title=0x7f0502e2; + public static final int enable_pubroom_summary=0x7f0502bb; + public static final int enable_pubroom_title=0x7f0502ba; /** */ - public static final int enable_sms=0x7f050218; + public static final int enable_sms=0x7f050219; /** */ - public static final int enable_sms_summary=0x7f050219; - public static final int enable_sms_toself_summary=0x7f0502e4; - public static final int enable_sms_toself_title=0x7f0502e3; + public static final int enable_sms_summary=0x7f05021a; + public static final int enable_sms_toself_summary=0x7f0502e5; + public static final int enable_sms_toself_title=0x7f0502e4; public static final int entering_trade=0x7f0500d7; - public static final int err_dup_invite_fmt=0x7f0502b4; - public static final int expl_update_url=0x7f0502ee; + public static final int err_dup_invite_fmt=0x7f0502b5; + public static final int expl_update_url=0x7f0502ef; /** if this preference is checked, a dialog will be posted every time a robot makes a move or a move is received from a remote player. @@ -1140,9 +1141,9 @@ public final class R { /** Explanatory text appears in the dialog */ public static final int force_expl=0x7f0500cc; - public static final int force_radio_title=0x7f0502e5; - public static final int force_tablet_summary=0x7f0502a1; - public static final int force_tablet_title=0x7f0502a0; + public static final int force_radio_title=0x7f0502e6; + public static final int force_tablet_summary=0x7f0502a2; + public static final int force_tablet_title=0x7f0502a1; /** ############################################################ # :Dialogs: @@ -1190,7 +1191,7 @@ public final class R { game to make changes */ public static final int game_locked=0x7f0500ab; - public static final int game_name_group_title=0x7f050247; + public static final int game_name_group_title=0x7f050248; /** */ public static final int game_name_label=0x7f0501f3; @@ -1203,15 +1204,15 @@ public final class R { /** Put nothing in the summary space, so it just reads "Game 2" */ public static final int game_summary_field_empty=0x7f050128; - public static final int game_summary_field_gameid=0x7f0502ec; + public static final int game_summary_field_gameid=0x7f0502ed; /** Put the language there, so it reads "Game 2 (English)" */ public static final int game_summary_field_language=0x7f050129; - public static final int game_summary_field_npackets=0x7f0502ed; + public static final int game_summary_field_npackets=0x7f0502ee; /** List names of opponents (summarized), e.g. "Game 2 (vs Kati)" */ public static final int game_summary_field_opponents=0x7f05012a; - public static final int game_summary_field_rowid=0x7f0502eb; + public static final int game_summary_field_rowid=0x7f0502ec; /** List the state of the game, "Game over" or "10 moves made" etc. */ @@ -1224,7 +1225,7 @@ public final class R { public static final int gamel_menu_checkmoves=0x7f05008a; /** */ - public static final int gamel_menu_checkupdates=0x7f050225; + public static final int gamel_menu_checkupdates=0x7f050226; /** ############################################################ # :Menus: @@ -1237,20 +1238,20 @@ public final class R { Brings up the Wordlists (formerly Dictionaries) screen */ public static final int gamel_menu_dicts=0x7f050088; - public static final int gamel_menu_loaddb=0x7f0502dc; - public static final int gamel_menu_storedb=0x7f0502db; - public static final int gamel_menu_study=0x7f050262; + public static final int gamel_menu_loaddb=0x7f0502dd; + public static final int gamel_menu_storedb=0x7f0502dc; + public static final int gamel_menu_study=0x7f050263; /** */ public static final int get_sms_number=0x7f0501fd; - public static final int getinfo=0x7f050295; + public static final int getinfo=0x7f050296; public static final int git_rev=0x7f05007b; - public static final int git_rev_title=0x7f0502d7; - public static final int got_langdict_summary=0x7f0502f0; - public static final int got_langdict_title=0x7f0502ef; + public static final int git_rev_title=0x7f0502d8; + public static final int got_langdict_summary=0x7f0502f1; + public static final int got_langdict_title=0x7f0502f0; public static final int green=0x7f050140; - public static final int group_cur_games=0x7f050244; - public static final int group_new_games=0x7f050245; + public static final int group_cur_games=0x7f050245; + public static final int group_new_games=0x7f050246; /** Used as the default name for remote players displayed within the Game configure screen */ @@ -1313,12 +1314,12 @@ public final class R { public static final int info_title=0x7f050198; /** */ - public static final int inform_dict_diffdict_fmt=0x7f050230; + public static final int inform_dict_diffdict_fmt=0x7f050231; /** */ - public static final int inform_dict_diffversion_fmt=0x7f05022e; - public static final int inform_dict_download=0x7f050231; - public static final int inform_dict_title=0x7f05022f; + public static final int inform_dict_diffversion_fmt=0x7f05022f; + public static final int inform_dict_download=0x7f050232; + public static final int inform_dict_title=0x7f050230; /** Will new games, on default, randomly rearrange the start order of players. */ @@ -1352,9 +1353,9 @@ public final class R { */ public static final int invite_chooser_fmt=0x7f05016e; public static final int invite_chooser_sms=0x7f050170; - public static final int invite_dict_missing_body_fmt=0x7f050236; - public static final int invite_dict_missing_body_noname_fmt=0x7f050237; - public static final int invite_dict_missing_title=0x7f050235; + public static final int invite_dict_missing_body_fmt=0x7f050237; + public static final int invite_dict_missing_body_noname_fmt=0x7f050238; + public static final int invite_dict_missing_title=0x7f050236; public static final int invite_host=0x7f050075; /** This is the body of the html version of the invitation. A URL is created with parameters describing the game and @@ -1367,8 +1368,8 @@ public final class R { */ public static final int invite_if_nfc=0x7f0500dd; public static final int invite_mime=0x7f050077; - public static final int invite_multi_summary=0x7f0502b8; - public static final int invite_multi_title=0x7f0502b7; + public static final int invite_multi_summary=0x7f0502b9; + public static final int invite_multi_title=0x7f0502b8; /** Most users create games with only two players, which is the default, but Crosswords supports up to four. When I'm using the above string to encourage the opener of a game missing @@ -1381,7 +1382,7 @@ public final class R { /** */ public static final int invite_progress_title=0x7f0501e0; - public static final int invite_stays=0x7f0502bf; + public static final int invite_stays=0x7f0502c0; /** Send invitation using SMS (texting) or via email? Send invitation using NFC (Android @@ -1544,30 +1545,30 @@ public final class R { different wordlists.) */ public static final int lang_label=0x7f0500b0; - public static final int lang_name_arabic=0x7f05027f; - public static final int lang_name_catalan=0x7f050286; - public static final int lang_name_czech=0x7f050289; - public static final int lang_name_danish=0x7f050283; - public static final int lang_name_dutch=0x7f050285; - public static final int lang_name_english=0x7f05027b; - public static final int lang_name_french=0x7f05027c; - public static final int lang_name_german=0x7f05027d; - public static final int lang_name_greek=0x7f05028a; - public static final int lang_name_italian=0x7f050284; - public static final int lang_name_polish=0x7f050282; - public static final int lang_name_portuguese=0x7f050287; - public static final int lang_name_russian=0x7f050288; - public static final int lang_name_slovak=0x7f05028b; - public static final int lang_name_spanish=0x7f050280; - public static final int lang_name_swedish=0x7f050281; - public static final int lang_name_turkish=0x7f05027e; - public static final int lang_unknown=0x7f05029e; + public static final int lang_name_arabic=0x7f050280; + public static final int lang_name_catalan=0x7f050287; + public static final int lang_name_czech=0x7f05028a; + public static final int lang_name_danish=0x7f050284; + public static final int lang_name_dutch=0x7f050286; + public static final int lang_name_english=0x7f05027c; + public static final int lang_name_french=0x7f05027d; + public static final int lang_name_german=0x7f05027e; + public static final int lang_name_greek=0x7f05028b; + public static final int lang_name_italian=0x7f050285; + public static final int lang_name_polish=0x7f050283; + public static final int lang_name_portuguese=0x7f050288; + public static final int lang_name_russian=0x7f050289; + public static final int lang_name_slovak=0x7f05028c; + public static final int lang_name_spanish=0x7f050281; + public static final int lang_name_swedish=0x7f050282; + public static final int lang_name_turkish=0x7f05027f; + public static final int lang_unknown=0x7f05029f; public static final int langdict_label=0x7f0500b1; - public static final int list_group_default=0x7f050241; - public static final int list_group_delete=0x7f05023f; - public static final int list_group_movedown=0x7f050243; - public static final int list_group_moveup=0x7f050242; - public static final int list_group_rename=0x7f050240; + public static final int list_group_default=0x7f050242; + public static final int list_group_delete=0x7f050240; + public static final int list_group_movedown=0x7f050244; + public static final int list_group_moveup=0x7f050243; + public static final int list_group_rename=0x7f050241; /** ############## menu items ############## pulls up dialog to configure the selected game */ @@ -1598,9 +1599,9 @@ public final class R { public static final int list_item_reset=0x7f050093; /** formatting for last move summary in notifications */ - public static final int lmi_pass_fmt=0x7f0502a6; - public static final int lmi_phony_fmt=0x7f0502a7; - public static final int lmi_tiles_fmt=0x7f0502a8; + public static final int lmi_pass_fmt=0x7f0502a7; + public static final int lmi_phony_fmt=0x7f0502a8; + public static final int lmi_tiles_fmt=0x7f0502a9; /** One of the strings used in the right column of the list of installed wordlists to describe those that are part of Crosswords and that cannot be uninstalled or moved. @@ -1618,32 +1619,32 @@ public final class R { /** */ public static final int loc_external=0x7f0500a7; - public static final int loc_filters_all=0x7f050277; - public static final int loc_filters_menu=0x7f050279; - public static final int loc_filters_modified=0x7f05027a; - public static final int loc_filters_prompt=0x7f050275; - public static final int loc_filters_screen=0x7f050278; - public static final int loc_fmts_mismatch=0x7f050290; + public static final int loc_filters_all=0x7f050278; + public static final int loc_filters_menu=0x7f05027a; + public static final int loc_filters_modified=0x7f05027b; + public static final int loc_filters_prompt=0x7f050276; + public static final int loc_filters_screen=0x7f050279; + public static final int loc_fmts_mismatch=0x7f050291; /** see move_dictf above */ public static final int loc_internal=0x7f0500a6; - public static final int loc_item_check=0x7f05028d; + public static final int loc_item_check=0x7f05028e; /** for loc item edit menu */ - public static final int loc_item_clear=0x7f05028c; - public static final int loc_item_copy_bless=0x7f05028f; - public static final int loc_item_copy_eng=0x7f05028e; - public static final int loc_lang_blessed=0x7f050270; - public static final int loc_lang_local=0x7f050271; - public static final int loc_menu_xlate=0x7f05026f; - public static final int loc_search_prompt=0x7f050276; + public static final int loc_item_clear=0x7f05028d; + public static final int loc_item_copy_bless=0x7f050290; + public static final int loc_item_copy_eng=0x7f05028f; + public static final int loc_lang_blessed=0x7f050271; + public static final int loc_lang_local=0x7f050272; + public static final int loc_menu_xlate=0x7f050270; + public static final int loc_search_prompt=0x7f050277; /** This is the "hint" printed in light text in the empty player name field */ public static final int local_name_hint=0x7f050176; - public static final int logging_on=0x7f0502cf; - public static final int logging_on_summary=0x7f0502d0; - public static final int lookup_title=0x7f05026b; + public static final int logging_on=0x7f0502d0; + public static final int logging_on_summary=0x7f0502d1; + public static final int lookup_title=0x7f05026c; /** */ public static final int manual_owner_name=0x7f0501fa; @@ -1668,7 +1669,7 @@ public final class R { /** text of menu that brings up the Settings (preferences) dialog */ public static final int menu_prefs=0x7f050089; - public static final int menu_rateme=0x7f05025d; + public static final int menu_rateme=0x7f05025e; /** */ public static final int menu_toggle_values=0x7f05020b; @@ -1684,11 +1685,11 @@ public final class R { /** body of notification shown when invitation requires a wordslist that's not installed */ - public static final int missing_dict_detail=0x7f050234; + public static final int missing_dict_detail=0x7f050235; /** Title of notification shown when invitation requires a wordslist that's not installed */ - public static final int missing_dict_title=0x7f050233; + public static final int missing_dict_title=0x7f050234; /** Used as a substitute for the names of remote players when they aren't available yet because the connection is not complete. Displayed in the lists of players found in each @@ -1743,16 +1744,16 @@ public final class R { /** Text of progress indicator shown while check is being conducted */ public static final int msgs_progress=0x7f05008b; - public static final int nag_body_fmt=0x7f0502a3; - public static final int nag_intervals=0x7f0502e0; + public static final int nag_body_fmt=0x7f0502a4; + public static final int nag_intervals=0x7f0502e1; /** Nagging: title of notification reminder message */ - public static final int nag_title=0x7f0502a2; + public static final int nag_title=0x7f0502a3; /** above is inserted in this the last time I warn */ - public static final int nag_warn_last_fmt=0x7f0502a4; + public static final int nag_warn_last_fmt=0x7f0502a5; public static final int name_copy_fmt=0x7f0501f4; - public static final int name_dict_fmt=0x7f0502da; + public static final int name_dict_fmt=0x7f0502db; public static final int nbs_port=0x7f05007a; /** text of checkbox. If this checkbox is checked, games created for network play will by default have the hint feature @@ -1764,19 +1765,19 @@ public final class R { elsewhere in this file) */ public static final int nethints_allowed_sum=0x7f05011f; - public static final int netstats_title=0x7f0502d6; - public static final int network_advanced_summary=0x7f0502b6; - public static final int network_advanced_title=0x7f0502b5; + public static final int netstats_title=0x7f0502d7; + public static final int network_advanced_summary=0x7f0502b7; + public static final int network_advanced_title=0x7f0502b6; public static final int network_behavior=0x7f050150; /** explanation of the above */ public static final int network_behavior_summary=0x7f050151; /** */ - public static final int new_app_avail=0x7f05022a; + public static final int new_app_avail=0x7f05022b; /** */ - public static final int new_app_avail_fmt=0x7f050229; + public static final int new_app_avail_fmt=0x7f05022a; /** */ public static final int new_bt_body_fmt=0x7f0501e7; @@ -1788,15 +1789,15 @@ public final class R { public static final int new_btmove_title=0x7f0501ea; /** */ - public static final int new_dict_avail=0x7f050227; + public static final int new_dict_avail=0x7f050228; /** */ - public static final int new_dict_avail_fmt=0x7f050228; - public static final int new_game=0x7f0502ad; - public static final int new_game_message=0x7f0502af; - public static final int new_game_message_net=0x7f0502b1; - public static final int new_game_message_nodflt=0x7f0502b0; - public static final int new_game_networked=0x7f0502ae; + public static final int new_dict_avail_fmt=0x7f050229; + public static final int new_game=0x7f0502ae; + public static final int new_game_message=0x7f0502b0; + public static final int new_game_message_net=0x7f0502b2; + public static final int new_game_message_nodflt=0x7f0502b1; + public static final int new_game_networked=0x7f0502af; /** */ public static final int new_move_body=0x7f0501eb; @@ -1874,9 +1875,9 @@ public final class R { /** */ public static final int newgame_sms_header=0x7f0501f5; - public static final int newgroup_label=0x7f05023e; - public static final int nfc_just_tap=0x7f0502c0; - public static final int nfc_to_self=0x7f0502ea; + public static final int newgroup_label=0x7f05023f; + public static final int nfc_just_tap=0x7f0502c1; + public static final int nfc_to_self=0x7f0502eb; /** Title of dialog for renaming game (triggered by selecting list_item_rename) If you try to copy a networked game you get this error @@ -1922,7 +1923,7 @@ public final class R { you get this error message */ public static final int no_games_to_refresh=0x7f05008c; - public static final int no_market=0x7f05025e; + public static final int no_market=0x7f05025f; /** displayed when you long-tap a scoreboard entry and there's no most recent score to show */ @@ -1932,7 +1933,7 @@ public final class R { substituted. */ public static final int no_name_found_fmt=0x7f0500b8; - public static final int no_relay_conn=0x7f0502fd; + public static final int no_relay_conn=0x7f0502fe; /** This is not currently shown Crosswords wordlists, which are just compressed lists of words plus tile information, determine @@ -1946,7 +1947,7 @@ public final class R { arrow appears. This explains it. */ public static final int not_again_arrow=0x7f0501b3; - public static final int not_again_backclears=0x7f050251; + public static final int not_again_backclears=0x7f050252; /** */ public static final int not_again_browse=0x7f0501d3; @@ -1974,19 +1975,19 @@ public final class R { for games with more than two devices, which are rare. */ public static final int not_again_conndmid=0x7f0501b1; - public static final int not_again_dicts=0x7f05029f; + public static final int not_again_dicts=0x7f0502a0; /** This is shown when you choose the board_menu_done menu item. It's to let you know that there's a shortcut that does almost the same thing. */ public static final int not_again_done=0x7f0501ae; - public static final int not_again_enablepublic=0x7f0502c6; + public static final int not_again_enablepublic=0x7f0502c7; /** Shown when you tap the flip button on the toolbar of the main Board screen */ public static final int not_again_flip=0x7f0501a9; - public static final int not_again_fmt_expl=0x7f050291; - public static final int not_again_hidenewgamebuttons=0x7f0502bd; + public static final int not_again_fmt_expl=0x7f050292; + public static final int not_again_hidenewgamebuttons=0x7f0502be; /** Shown when you tap the next hint button on the toolbar of the main Board screen */ @@ -2010,8 +2011,8 @@ public final class R { /** Shown when you first pick the list_item_new_from menuitem */ public static final int not_again_newfrom=0x7f0501b5; - public static final int not_again_newselect=0x7f050250; - public static final int not_again_studycopy=0x7f05026a; + public static final int not_again_newselect=0x7f050251; + public static final int not_again_studycopy=0x7f05026b; /** The following strings (all whose names start with "not_again") appear in the New user info dialog. @@ -2046,7 +2047,7 @@ public final class R { the main Board screen */ public static final int not_again_zoom=0x7f0501aa; - public static final int note_none=0x7f05029b; + public static final int note_none=0x7f05029c; /** This text is displayed as the "summary" for both of the notify choices above, as extra information. (There could be different strings if it makes more sense in your language.) @@ -2067,7 +2068,7 @@ public final class R { device */ public static final int notify_vibrate=0x7f05015b; - public static final int nplayers_prompt=0x7f0502b3; + public static final int nplayers_prompt=0x7f0502b4; /** text of label identifying the field where human players can enter an option password. The label and field disappear when the robot player checkbox is checked because it makes no @@ -2082,7 +2083,7 @@ public final class R { can tap a nearby person\'s device to invite him/her to play – if he/she is also using NFC. */ - public static final int pct_suffix=0x7f05025c; + public static final int pct_suffix=0x7f05025d; /** If this preference is checked, tapping on the scoreboard entry for any player reveals that player's tiles and any pending move (after asking for his password if one is set.) @@ -2156,17 +2157,17 @@ public final class R { non-networked games */ public static final int players_label_standalone=0x7f0500ac; - public static final int pref_group_l10n_summary=0x7f0502f6; - public static final int pref_group_l10n_title=0x7f0502f5; - public static final int pref_group_relay_summary=0x7f0502f4; - public static final int pref_group_relay_title=0x7f0502f3; - public static final int pref_group_sms_summary=0x7f0502f2; - public static final int pref_group_sms_title=0x7f0502f1; + public static final int pref_group_l10n_summary=0x7f0502f7; + public static final int pref_group_l10n_title=0x7f0502f6; + public static final int pref_group_relay_summary=0x7f0502f5; + public static final int pref_group_relay_title=0x7f0502f4; + public static final int pref_group_sms_summary=0x7f0502f3; + public static final int pref_group_sms_title=0x7f0502f2; /** Label for the first "human player" name preference */ public static final int pref_human_name=0x7f050118; - public static final int pref_item_update_summary=0x7f0502f8; - public static final int pref_item_update_title=0x7f0502f7; + public static final int pref_item_update_summary=0x7f0502f9; + public static final int pref_item_update_title=0x7f0502f8; /** Label for the first player color preference */ public static final int pref_player1_name=0x7f050114; @@ -2243,15 +2244,15 @@ public final class R { public static final int prefs_names_summary=0x7f050113; /** Used when prev player's name can't be looked up */ - public static final int prev_player=0x7f0502a5; - public static final int progress_title=0x7f050299; + public static final int prev_player=0x7f0502a6; + public static final int progress_title=0x7f05029a; /** */ public static final int prompt_max_len=0x7f0501d9; /** */ public static final int prompt_min_len=0x7f0501d8; - public static final int proxy_port=0x7f0502d9; + public static final int proxy_port=0x7f0502da; /** Short for "points", this is shown at the right end of the tray in place of the first tile placed along with the points the current move would earn if committed. @@ -2267,10 +2268,10 @@ public final class R { middle of a game, like "do you want to commit this move?" */ public static final int query_title=0x7f05019f; - public static final int radio_name_cdma=0x7f0502e9; - public static final int radio_name_gsm=0x7f0502e8; - public static final int radio_name_real=0x7f0502e6; - public static final int radio_name_tablet=0x7f0502e7; + public static final int radio_name_cdma=0x7f0502ea; + public static final int radio_name_gsm=0x7f0502e9; + public static final int radio_name_real=0x7f0502e7; + public static final int radio_name_tablet=0x7f0502e8; /** ############################################################ # :Dialogs: @@ -2284,30 +2285,30 @@ public final class R { the color preferences dialog */ public static final int red=0x7f05013f; - public static final int redir_host=0x7f0502cd; + public static final int redir_host=0x7f0502ce; /** Title of dialog used to alert players to relay-related problems with the current game. */ public static final int relay_alert=0x7f0500e1; - public static final int relay_alert_title=0x7f05024f; - public static final int relay_host=0x7f0502cc; - public static final int relay_port=0x7f0502d8; + public static final int relay_alert_title=0x7f050250; + public static final int relay_host=0x7f0502cd; + public static final int relay_port=0x7f0502d9; /** Shown in toast when relaunching after switching dicts */ - public static final int reload_new_dict_fmt=0x7f050232; - public static final int rematch_msg=0x7f0502c5; - public static final int remote_digesting=0x7f050293; - public static final int remote_empty=0x7f050292; + public static final int reload_new_dict_fmt=0x7f050233; + public static final int rematch_msg=0x7f0502c6; + public static final int remote_digesting=0x7f050294; + public static final int remote_empty=0x7f050293; /** checkbox determining of this player is on this device or remote. If remote, then the rest of the fields disappear (since they will be set by the remote device.) */ public static final int remote_label=0x7f0500cf; - public static final int remote_no_net=0x7f050294; + public static final int remote_no_net=0x7f050295; /** */ public static final int remote_undone=0x7f050203; - public static final int rename_group_label=0x7f050246; + public static final int rename_group_label=0x7f050247; /** text within rename dialog (triggered by selecting list_item_rename) */ @@ -2344,10 +2345,10 @@ public final class R { /** title for popup of public rooms found on server */ public static final int room_public_prompt=0x7f0500b6; - public static final int seeking_relay=0x7f0502fc; - public static final int sel_games_fmt=0x7f050252; - public static final int sel_groups_fmt=0x7f050253; - public static final int sel_items_fmt=0x7f05026e; + public static final int seeking_relay=0x7f0502fd; + public static final int sel_games_fmt=0x7f050253; + public static final int sel_groups_fmt=0x7f050254; + public static final int sel_items_fmt=0x7f05026f; /** ############################################################ # :Dialogs: @@ -2359,7 +2360,7 @@ public final class R { possible answers are the three button text strings below. */ public static final int set_default_message_fmt=0x7f0500a1; - public static final int set_pref=0x7f0502bc; + public static final int set_pref=0x7f0502bd; /** text of separator marking out other-setting area of the dialog */ public static final int settings_label=0x7f0500b9; @@ -2371,8 +2372,8 @@ public final class R { /** clarification of above */ public static final int show_arrow_summary=0x7f050131; - public static final int show_remote=0x7f050297; - public static final int show_wordlist_browser=0x7f05024e; + public static final int show_remote=0x7f050298; + public static final int show_wordlist_browser=0x7f05024f; /** If this preference is checked, the user will not be asked to confirm after selecting the "Turn done" menu (or tapping the points display at the right end of the tray) @@ -2381,17 +2382,17 @@ public final class R { /** explanation of the above */ public static final int skip_confirm_turn_summary=0x7f050147; - public static final int slmenu_clear_sel=0x7f050264; - public static final int slmenu_copy_sel=0x7f050263; - public static final int slmenu_deselect_all=0x7f05026d; - public static final int slmenu_select_all=0x7f05026c; + public static final int slmenu_clear_sel=0x7f050265; + public static final int slmenu_copy_sel=0x7f050264; + public static final int slmenu_deselect_all=0x7f05026e; + public static final int slmenu_select_all=0x7f05026d; public static final int sms_bad_proto_fmt=0x7f0501e9; /** Title of phone number picker during invitation to a game via SMS */ public static final int sms_invite_title=0x7f0501f0; - public static final int sms_ready_text=0x7f05025b; - public static final int square_tiles=0x7f05024b; - public static final int square_tiles_summary=0x7f05024c; + public static final int sms_ready_text=0x7f05025c; + public static final int square_tiles=0x7f05024c; + public static final int square_tiles_summary=0x7f05024d; /** Used in formatting moves and history */ public static final int str_bonus_all=0x7f050108; @@ -2452,7 +2453,7 @@ public final class R { */ public static final int str_phony_rejected=0x7f050104; - public static final int str_placer_fmt=0x7f05022d; + public static final int str_placer_fmt=0x7f05022e; /** Shown when using the the Game configure screen to configure a networked game and you try to make all players local. */ @@ -2468,7 +2469,7 @@ public final class R { /** Used in formatting remote player move summaries */ public static final int str_remote_moved_fmt=0x7f0500fd; - public static final int str_resigned_fmt=0x7f05022c; + public static final int str_resigned_fmt=0x7f05022d; /** ############################################################ # Board info/error dialog messages @@ -2511,7 +2512,7 @@ public final class R { public static final int str_two_tiles_first_move=0x7f05017b; /** Used in formatting final scores display */ - public static final int str_winner_fmt=0x7f05022b; + public static final int str_winner_fmt=0x7f05022c; /** Used in formatting game history (not move summaries since information about the current rack is hidden then) */ @@ -2548,10 +2549,10 @@ public final class R { /** Used in formatting exchange move summaries */ public static final int strss_traded_for_fmt=0x7f050103; - public static final int study_langpick=0x7f050267; - public static final int study_no_lang_fmt=0x7f050268; - public static final int study_no_lists=0x7f050269; - public static final int studylist_title_fmt=0x7f050266; + public static final int study_langpick=0x7f050268; + public static final int study_no_lang_fmt=0x7f050269; + public static final int study_no_lists=0x7f05026a; + public static final int studylist_title_fmt=0x7f050267; /** If substituting an existing same-language wordlist by choosing button_substdict user gets to choose from a list of wordlists. This is the title of that list. @@ -2597,12 +2598,12 @@ public final class R { cannot happen. */ public static final int summary_relay_wait_fmt=0x7f050082; - public static final int summary_send_data_sms=0x7f0502d4; + public static final int summary_send_data_sms=0x7f0502d5; /** explanation of the above */ public static final int summary_sort_tiles=0x7f050149; - public static final int summary_studyon=0x7f050261; - public static final int summary_thumbsize=0x7f050254; + public static final int summary_studyon=0x7f050262; + public static final int summary_thumbsize=0x7f050255; /** */ public static final int summary_wait_guest=0x7f0501e3; @@ -2613,7 +2614,7 @@ public final class R { part of the game and that the user should ignore it. */ public static final int tell_unused=0x7f050119; - public static final int thumb_off=0x7f050255; + public static final int thumb_off=0x7f050256; /** color of the tiles' background */ public static final int tile_back=0x7f05013b; @@ -2632,7 +2633,7 @@ public final class R { /** Title of preference in which you select which addressing modes network games will use to communicate */ - public static final int title_addrs_pref=0x7f0502ac; + public static final int title_addrs_pref=0x7f0502ad; /** ############################################################ # :Screens: @@ -2676,19 +2677,19 @@ public final class R { window title */ public static final int title_prefs=0x7f05010b; - public static final int title_send_data_sms=0x7f0502d3; + public static final int title_send_data_sms=0x7f0502d4; /** If this preference is checked, tiles in the rack will be re-ordered alphabetically whenever tiles are added, i.e. after ever move. */ public static final int title_sort_tiles=0x7f050148; - public static final int title_studyon=0x7f050260; + public static final int title_studyon=0x7f050261; /** title of dialog allowing user to pick tiles "face up". (This feature is not yet supported on Android.) */ public static final int title_tile_picker=0x7f050199; - public static final int update_dicts_fmt=0x7f050298; - public static final int use_defaults=0x7f0502b2; + public static final int update_dicts_fmt=0x7f050299; + public static final int use_defaults=0x7f0502b3; /** text of checkbox controlling whether there's a game timer */ public static final int use_timer=0x7f0500bc; @@ -2696,25 +2697,25 @@ public final class R { line in a game summary. The \u0020 is a space in xml. */ public static final int vs_join=0x7f050107; - public static final int waiting_title=0x7f0502be; - public static final int warn_bt_disabled=0x7f050221; - public static final int warn_no_comms=0x7f0502c1; + public static final int waiting_title=0x7f0502bf; + public static final int warn_bt_disabled=0x7f050222; + public static final int warn_no_comms=0x7f0502c2; /** */ public static final int warn_nomobile_fmt=0x7f0501fb; /** */ - public static final int warn_sms_disabled=0x7f050220; + public static final int warn_sms_disabled=0x7f050221; /** */ public static final int warn_unlimited=0x7f050202; - public static final int wifi_warning=0x7f0502fe; + public static final int wifi_warning=0x7f0502ff; /** */ public static final int word_search_hint=0x7f0501cd; - public static final int xlations_enabled_summary=0x7f050273; - public static final int xlations_enabled_title=0x7f050272; - public static final int xlations_locale=0x7f0502de; + public static final int xlations_enabled_summary=0x7f050274; + public static final int xlations_enabled_title=0x7f050273; + public static final int xlations_locale=0x7f0502df; /** Empty in English, this should contain the name of the translator/creator of the strings.xml file for this language diff --git a/xwords4/android/XWords4/res/values/strings.xml b/xwords4/android/XWords4/res/values/strings.xml index 41e9f15b7..b044cc9de 100644 --- a/xwords4/android/XWords4/res/values/strings.xml +++ b/xwords4/android/XWords4/res/values/strings.xml @@ -1972,6 +1972,10 @@ Building game summary… + This networked game has no way + to connect and will never be playable.\n\n(It was probably created + from an invitation that didn\'t specify any way of connecting + that your device supports.) Network status for game connected via %1$s: diff --git a/xwords4/android/XWords4/res_src/values-ba_CK/strings.xml b/xwords4/android/XWords4/res_src/values-ba_CK/strings.xml index efad02670..e86f1c149 100644 --- a/xwords4/android/XWords4/res_src/values-ba_CK/strings.xml +++ b/xwords4/android/XWords4/res_src/values-ba_CK/strings.xml @@ -1708,6 +1708,10 @@ Esworb tsildrow Gnidliub emag yrammus… + Siht dekrowten emag sah on yaw + ot tcennoc dna lliw reven eb elbayalp.\n\ntI( saw ylbaborp detaerc + morf na noitativni taht ndid\'t yficeps yna yaw fo gnitcennoc + taht ruoy ecived stroppus.) Krowten sutats rof emag detcennoc aiv %1$s: diff --git a/xwords4/android/XWords4/res_src/values-ca_PS/strings.xml b/xwords4/android/XWords4/res_src/values-ca_PS/strings.xml index 6498f2bfe..4b8ccf9c1 100644 --- a/xwords4/android/XWords4/res_src/values-ca_PS/strings.xml +++ b/xwords4/android/XWords4/res_src/values-ca_PS/strings.xml @@ -1708,6 +1708,10 @@ BROWSE WORDLIST BUILDING GAME SUMMARY… + THIS NETWORKED GAME HAS NO WAY + TO CONNECT AND WILL NEVER BE PLAYABLE.\n\n(IT WAS PROBABLY CREATED + FROM AN INVITATION THAT DIDN\'T SPECIFY ANY WAY OF CONNECTING + THAT YOUR DEVICE SUPPORTS.) NETWORK STATUS FOR GAME CONNECTED VIA %1$s: 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 248725c5c..485d9446e 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/BoardDelegate.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/BoardDelegate.java @@ -291,10 +291,7 @@ public class BoardDelegate extends DelegateBase lstnr = new OnClickListener() { public void onClick( DialogInterface dlg, int whichButton ) { - - waitCloseGame( false ); - GameUtils.deleteGame( m_activity, m_rowid, false ); - finish(); + deleteAndClose(); } }; ab.setNegativeButton( R.string.button_delete, lstnr ); @@ -1016,6 +1013,9 @@ public class BoardDelegate extends DelegateBase case DROP_RELAY_ACTION: dropRelayAndRestart(); break; + case DELETE_AND_EXIT: + deleteAndClose(); + break; default: handled = false; } @@ -1293,15 +1293,17 @@ public class BoardDelegate extends DelegateBase public void onStatusClicked() { final String msg = ConnStatusHandler.getStatusText( m_activity, m_connTypes ); - if ( null != msg ) { - post( new Runnable() { - public void run() { + post( new Runnable() { + public void run() { + if ( null == msg ) { + askNoAddrsDelete(); + } else { m_dlgBytes = msg; m_dlgTitle = R.string.info_title; showDialog( DlgID.DLG_CONNSTAT ); } - } ); - } + } + } ); } public Handler getHandler() @@ -1309,6 +1311,20 @@ public class BoardDelegate extends DelegateBase return m_handler; } + private void deleteAndClose() + { + waitCloseGame( false ); + GameUtils.deleteGame( m_activity, m_rowid, false ); + finish(); + } + + private void askNoAddrsDelete() + { + showConfirmThen( R.string.connstat_net_noaddr, + R.string.list_item_delete, + Action.DELETE_AND_EXIT ); + } + private void askDropRelay() { String msg = getString( R.string.confirm_drop_relay ); @@ -1775,7 +1791,9 @@ public class BoardDelegate extends DelegateBase m_nMissing = nMissing; // will be 0 unless isServer is true - if ( 0 < nMissing && isServer && !m_haveInvited ) { + if ( null != connTypes && 0 == connTypes.size() ) { + askNoAddrsDelete(); + } else if ( 0 < nMissing && isServer && !m_haveInvited ) { post( new Runnable() { public void run() { showDialog( DlgID.DLG_INVITE ); From 54b18c898d3c010cb1b89f7aadba169039baf092 Mon Sep 17 00:00:00 2001 From: Eric House Date: Fri, 19 Jun 2015 20:52:40 -0700 Subject: [PATCH 29/49] more, and hopefully last, French strings --- xwords4/android/XWords4/archive/R.java | 6 ++-- .../android/XWords4/res/values/strings.xml | 7 ++-- .../XWords4/res_src/values-ba_CK/strings.xml | 4 +-- .../XWords4/res_src/values-ca_PS/strings.xml | 4 +-- .../XWords4/res_src/values-fr/strings.xml | 32 +++++++++++++++---- 5 files changed, 36 insertions(+), 17 deletions(-) diff --git a/xwords4/android/XWords4/archive/R.java b/xwords4/android/XWords4/archive/R.java index 27a58709c..65bf6ea5f 100644 --- a/xwords4/android/XWords4/archive/R.java +++ b/xwords4/android/XWords4/archive/R.java @@ -861,7 +861,7 @@ public final class R { of the language is substituted for %1$s. */ public static final int confirm_deleteonly_dicts_fmt=0x7f0500a0; - public static final int confirm_drop_relay=0x7f050301; + public static final int confirm_drop_relay=0x7f050300; public static final int confirm_drop_relay_bt=0x7f050302; public static final int confirm_drop_relay_sms=0x7f050303; public static final int confirm_get_locdict_fmt=0x7f0502ca; @@ -1074,7 +1074,7 @@ public final class R { public static final int download_failed=0x7f05023b; public static final int download_path_title=0x7f05023e; public static final int downloading_dict_fmt=0x7f050185; - public static final int drop_relay_warning_fmt=0x7f050300; + public static final int drop_relay_warning_fmt=0x7f0502ff; /** Display snapshots of games */ public static final int dropped_dupe=0x7f050257; @@ -2709,7 +2709,7 @@ public final class R { /** */ public static final int warn_unlimited=0x7f050202; - public static final int wifi_warning=0x7f0502ff; + public static final int wifi_warning=0x7f050301; /** */ public static final int word_search_hint=0x7f0501cd; diff --git a/xwords4/android/XWords4/res/values/strings.xml b/xwords4/android/XWords4/res/values/strings.xml index b044cc9de..67bcc1b51 100644 --- a/xwords4/android/XWords4/res/values/strings.xml +++ b/xwords4/android/XWords4/res/values/strings.xml @@ -2475,9 +2475,6 @@ connect.\n\nPlease try opening the game again later after conditions have changed. - \u0020For example, you may need to be on - a different WiFi network. - (This game can also connect via %1$s, so if you\'d like to play the game without a relay connection you can.) @@ -2485,6 +2482,10 @@ Are you sure you want to drop this game\'s ability to communicate via the relay? + + \u0020For example, you may need to be on + a different WiFi network. + Bluetooth only works for nearby devices. Not all carriers support play diff --git a/xwords4/android/XWords4/res_src/values-ba_CK/strings.xml b/xwords4/android/XWords4/res_src/values-ba_CK/strings.xml index e86f1c149..46c8dafa8 100644 --- a/xwords4/android/XWords4/res_src/values-ba_CK/strings.xml +++ b/xwords4/android/XWords4/res_src/values-ba_CK/strings.xml @@ -2142,14 +2142,14 @@ yaler )tenretni( rof noitacinummoc tub sah neeb elbanu ot tcennoc.\n\nEsaelp yrt gninepo eht emag niaga retal retfa snoitidnoc evah degnahc. - \u0020Rof ,elpmaxe uoy yam deen ot eb no - a tnereffid IfIw krowten. sIht( emag nac osla tcennoc aiv %1$s, os fi uoy\'d ekil ot yalp eht emag tuohtiw a yaler noitcennoc uoy nac.) Era uoy erus uoy tnaw ot pord siht emag\'s ytiliba ot etacinummoc aiv eht ?yaler + \u0020Rof ,elpmaxe uoy yam deen ot eb no + a tnereffid IfIw krowten. Htooteulb ylno skrow rof ybraen secived. Ton lla sreirrac troppus yalp diff --git a/xwords4/android/XWords4/res_src/values-ca_PS/strings.xml b/xwords4/android/XWords4/res_src/values-ca_PS/strings.xml index 4b8ccf9c1..b7c4adeb4 100644 --- a/xwords4/android/XWords4/res_src/values-ca_PS/strings.xml +++ b/xwords4/android/XWords4/res_src/values-ca_PS/strings.xml @@ -2142,14 +2142,14 @@ RELAY (INTERNET) FOR COMMUNICATION BUT HAS BEEN UNABLE TO CONNECT.\n\nPLEASE TRY OPENING THE GAME AGAIN LATER AFTER CONDITIONS HAVE CHANGED. - \u0020FOR EXAMPLE, YOU MAY NEED TO BE ON - A DIFFERENT WIFI NETWORK. (THIS GAME CAN ALSO CONNECT VIA %1$s, SO IF YOU\'D LIKE TO PLAY THE GAME WITHOUT A RELAY CONNECTION YOU CAN.) ARE YOU SURE YOU WANT TO DROP THIS GAME\'S ABILITY TO COMMUNICATE VIA THE RELAY? + \u0020FOR EXAMPLE, YOU MAY NEED TO BE ON + A DIFFERENT WIFI NETWORK. BLUETOOTH ONLY WORKS FOR NEARBY DEVICES. NOT ALL CARRIERS SUPPORT PLAY diff --git a/xwords4/android/XWords4/res_src/values-fr/strings.xml b/xwords4/android/XWords4/res_src/values-fr/strings.xml index 799a82274..a15859965 100644 --- a/xwords4/android/XWords4/res_src/values-fr/strings.xml +++ b/xwords4/android/XWords4/res_src/values-fr/strings.xml @@ -163,7 +163,8 @@ obtenir une copie avec les mêmes paramètres. Êtes-vous sûr de vouloir effacer la partie sélectionnée ? Cette action ne peut pas être annulée. Êtes-vous sûr de vouloir effacer les -%1$d parties sélectionnées ? Cette action ne peut pas être annulée. + %1$d parties sélectionnées ? Cette action ne peut pas être + annulée. Inviter maintenant - + Abandonner le relai + @@ -2481,6 +2483,12 @@ illimités ? Annulez si vous n\'êtes pas sûr. Création du résumé de la partie… + Cette partie en réseau n\'a + aucun moyen de se connecter et ne sera jamais jouable.\n\n(Elle a + probablement été créée depuis une invitation qui ne spécifiait + aucun moyen de connexion permis par votre périphérique.) + + @@ -3447,14 +3455,24 @@ pour la langue Connexion au relai… Cette partie est configurée pour - communiquer en utilisant le relai (serveur) mais n\'a pas pu se - connecter, soit à cause de problèmes avec la connexion Internet de - votre périphérique, soit parce que le relai ne tourne pas.\n\n - Veuillez réessayer d\'ouvrir la partie ultérieurement, après que les - conditions aient changé. + communiquer en utilisant le relai (Internet) mais n\'a pas pu se + connecter.\n\nVeuillez réessayer d\'ouvrir la partie ultérieurement, + après que les conditions aient changé. + + (Cette partie peut aussi se + connecter par %1$s, donc vous pouvez jouer sans un relai si vous le + souhaitez.) + + Êtes-vous sûr de vouloir + abandonner la possibilité de communiquer via le relai pour cette + partie ? \u0020Vous pourriez, par exemple, avoir besoin d\'être sur un réseau Wi-Fi différent. + Le Bluetooth ne marche que pour + les périphériques proches. + Jouer par SMS n\'est pas + possible avec tous les opérateurs. From b8193d635dd8d36f6144863e9752b8880561588f Mon Sep 17 00:00:00 2001 From: Eric House Date: Tue, 23 Jun 2015 08:11:18 -0700 Subject: [PATCH 30/49] SMS-enable alert: Add cancel button, and disable OK button until user selects an enabling option --- xwords4/android/XWords4/archive/R.java | 1 + .../android/XWords4/res/values/strings.xml | 2 ++ .../XWords4/res_src/values-ba_CK/strings.xml | 1 + .../XWords4/res_src/values-ca_PS/strings.xml | 1 + .../org/eehouse/android/xw4/DlgDelegate.java | 36 ++++++++++++++++++- 5 files changed, 40 insertions(+), 1 deletion(-) diff --git a/xwords4/android/XWords4/archive/R.java b/xwords4/android/XWords4/archive/R.java index 65bf6ea5f..45d77bde0 100644 --- a/xwords4/android/XWords4/archive/R.java +++ b/xwords4/android/XWords4/archive/R.java @@ -652,6 +652,7 @@ public final class R { */ public static final int button_download=0x7f05018b; public static final int button_edit=0x7f0502c4; + public static final int button_enable=0x7f050304; public static final int button_enable_bt=0x7f050224; public static final int button_enable_sms=0x7f050223; public static final int button_go_settings=0x7f05025b; diff --git a/xwords4/android/XWords4/res/values/strings.xml b/xwords4/android/XWords4/res/values/strings.xml index 67bcc1b51..319f95bad 100644 --- a/xwords4/android/XWords4/res/values/strings.xml +++ b/xwords4/android/XWords4/res/values/strings.xml @@ -2491,4 +2491,6 @@ Not all carriers support play via SMS. + Enable + diff --git a/xwords4/android/XWords4/res_src/values-ba_CK/strings.xml b/xwords4/android/XWords4/res_src/values-ba_CK/strings.xml index 46c8dafa8..8b840fbd3 100644 --- a/xwords4/android/XWords4/res_src/values-ba_CK/strings.xml +++ b/xwords4/android/XWords4/res_src/values-ba_CK/strings.xml @@ -2154,4 +2154,5 @@ secived. Ton lla sreirrac troppus yalp aiv SMS. + Elbane diff --git a/xwords4/android/XWords4/res_src/values-ca_PS/strings.xml b/xwords4/android/XWords4/res_src/values-ca_PS/strings.xml index b7c4adeb4..ae46b8263 100644 --- a/xwords4/android/XWords4/res_src/values-ca_PS/strings.xml +++ b/xwords4/android/XWords4/res_src/values-ca_PS/strings.xml @@ -2154,4 +2154,5 @@ DEVICES. NOT ALL CARRIERS SUPPORT PLAY VIA SMS. + ENABLE 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 f805c0aac..274c396bb 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/DlgDelegate.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/DlgDelegate.java @@ -31,10 +31,13 @@ import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.view.View; +import android.widget.AdapterView.OnItemSelectedListener; +import android.widget.AdapterView; import android.widget.Button; import android.widget.Spinner; import android.widget.TextView; import android.widget.Toast; + import java.text.DateFormat; import java.util.ArrayList; import java.util.Date; @@ -239,6 +242,9 @@ public class DlgDelegate { case INVITE_CHOICES_THEN: prepareInviteChoicesDialog( dialog ); break; + case DIALOG_ENABLESMS: + prepareEnableSMSDialog( dialog ); + break; } } @@ -691,6 +697,7 @@ public class DlgDelegate { Spinner reasons = (Spinner) layout.findViewById( R.id.confirm_sms_reasons ); boolean enabled = 0 < reasons.getSelectedItemPosition(); + Assert.assertTrue( enabled ); Object[] params = { new Boolean(enabled), }; m_clickCallback.dlgButtonClicked( state.m_action, AlertDialog.BUTTON_POSITIVE, @@ -701,12 +708,39 @@ public class DlgDelegate { Dialog dialog = LocUtils.makeAlertBuilder( m_activity ) .setTitle( R.string.confirm_sms_title ) .setView( layout ) - .setPositiveButton( android.R.string.ok, lstnr ) + .setPositiveButton( R.string.button_enable, lstnr ) + .setNegativeButton( android.R.string.cancel, null ) .create(); Utils.setRemoveOnDismiss( m_activity, dialog, dlgID ); return dialog; } + private void checkEnableButton( Dialog dialog, Spinner reasons ) + { + boolean enabled = 0 < reasons.getSelectedItemPosition(); + AlertDialog adlg = (AlertDialog)dialog; + Button button = adlg.getButton( AlertDialog.BUTTON_POSITIVE ); + button.setEnabled( enabled ); + } + + private void prepareEnableSMSDialog( final Dialog dialog ) + { + final Spinner reasons = (Spinner) + dialog.findViewById( R.id.confirm_sms_reasons ); + + OnItemSelectedListener onItemSel = new OnItemSelectedListener() { + public void onItemSelected( AdapterView parent, View view, + int position, long id ) + { + checkEnableButton( dialog, reasons ); + } + + public void onNothingSelected( AdapterView parent ) {} + }; + reasons.setOnItemSelectedListener( onItemSel ); + checkEnableButton( dialog, reasons ); + } + private OnClickListener mkCallbackClickListener( final DlgState state, final NotAgainView naView ) { From fd765c6cb07d2d193ad2b6aabd42d9cb834b674a Mon Sep 17 00:00:00 2001 From: Eric House Date: Wed, 24 Jun 2015 07:46:48 -0700 Subject: [PATCH 31/49] turn invite-by-sms on --- xwords4/android/XWords4/src/org/eehouse/android/xw4/XWApp.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/XWApp.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/XWApp.java index 63520137d..6310f284b 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/XWApp.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/XWApp.java @@ -42,7 +42,7 @@ public class XWApp extends Application { public static final boolean DEBUG_EXP_TIMERS = false; public static final boolean GCM_IGNORED = false; public static final boolean UDP_ENABLED = true; - public static final boolean SMS_INVITE_ENABLED = false; + public static final boolean SMS_INVITE_ENABLED = true; public static final boolean LOCUTILS_ENABLED = false; public static final String SMS_PUBLIC_HEADER = "-XW4"; From 4f53ccd5db6025c61e34cbb5acb15f36263e573b Mon Sep 17 00:00:00 2001 From: Eric House Date: Wed, 24 Jun 2015 07:48:25 -0700 Subject: [PATCH 32/49] cleanup; log dropped messages on DEBUG builds --- .../XWords4/src/org/eehouse/android/xw4/BoardDelegate.java | 7 ++----- .../XWords4/src/org/eehouse/android/xw4/DelegateBase.java | 5 ++++- 2 files changed, 6 insertions(+), 6 deletions(-) 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 485d9446e..3bff32314 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/BoardDelegate.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/BoardDelegate.java @@ -660,11 +660,8 @@ public class BoardDelegate extends DelegateBase // onResume -- meaning m_gi etc are still null. m_missingDevs = data.getStringArrayExtra( InviteDelegate.DEVS ); m_missingCounts = data.getIntArrayExtra( InviteDelegate.COUNTS ); - if ( BT_INVITE_RESULT == requestCode ) { - m_missingMeans = InviteMeans.BLUETOOTH; - } else { - m_missingMeans = InviteMeans.SMS; - } + m_missingMeans = (BT_INVITE_RESULT == requestCode) + ? InviteMeans.BLUETOOTH : InviteMeans.SMS; break; } } diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/DelegateBase.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/DelegateBase.java index 454448234..1f4cae16b 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/DelegateBase.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/DelegateBase.java @@ -525,7 +525,10 @@ public class DelegateBase implements DlgClickNotify, fmtId = R.string.app_not_found_fmt; break; default: - // DbgUtils.logf( "DelegateBase.eventOccurred(event=%s) (DROPPED)", event.toString() ); + if ( BuildConfig.DEBUG ) { + DbgUtils.logf( "DelegateBase.eventOccurred(event=%s) (DROPPED)", + event.toString() ); + } } if ( 0 != fmtId ) { From 63aae3d4e81d6cf0ffb32ff824267dd6ada6d171 Mon Sep 17 00:00:00 2001 From: Eric House Date: Thu, 25 Jun 2015 06:38:40 -0700 Subject: [PATCH 33/49] add newbie hints to checkboxes enabling communication types (bt, sms, etc.) --- xwords4/android/XWords4/archive/R.java | 1669 +++++++++-------- .../XWords4/res/layout/conn_types_display.xml | 8 + .../XWords4/res/values/common_rsrc.xml | 4 + .../android/XWords4/res/values/strings.xml | 4 + .../XWords4/res_src/values-ba_CK/strings.xml | 3 + .../XWords4/res_src/values-ca_PS/strings.xml | 3 + .../android/xw4/ConnViaViewLayout.java | 36 +- .../android/xw4/GameConfigDelegate.java | 9 +- .../eehouse/android/xw4/PrefsActivity.java | 16 +- .../android/xw4/XWConnAddrPreference.java | 4 +- 10 files changed, 919 insertions(+), 837 deletions(-) diff --git a/xwords4/android/XWords4/archive/R.java b/xwords4/android/XWords4/archive/R.java index 45d77bde0..af3506f91 100644 --- a/xwords4/android/XWords4/archive/R.java +++ b/xwords4/android/XWords4/archive/R.java @@ -84,205 +84,206 @@ public final class R { } public static final class id { public static final int about_xlator=0x7f0a0001; - public static final int add_player=0x7f0a002f; - public static final int advertise_new_room_check=0x7f0a0036; - public static final int blessed_label=0x7f0a0056; - public static final int board_menu_chat=0x7f0a009e; - public static final int board_menu_dict=0x7f0a009a; - public static final int board_menu_done=0x7f0a0084; - public static final int board_menu_file_about=0x7f0a0092; - public static final int board_menu_file_prefs=0x7f0a0091; - public static final int board_menu_flip=0x7f0a009c; - public static final int board_menu_game_counts=0x7f0a008a; - public static final int board_menu_game_history=0x7f0a008c; - public static final int board_menu_game_left=0x7f0a008b; - public static final int board_menu_game_netstats=0x7f0a0093; - public static final int board_menu_game_resend=0x7f0a008e; - public static final int board_menu_game_resign=0x7f0a008d; - public static final int board_menu_hint_next=0x7f0a0098; - public static final int board_menu_hint_prev=0x7f0a0097; - public static final int board_menu_invite=0x7f0a0094; - public static final int board_menu_juggle=0x7f0a009b; - public static final int board_menu_toggle=0x7f0a009f; - public static final int board_menu_trade=0x7f0a0085; - public static final int board_menu_trade_cancel=0x7f0a0086; - public static final int board_menu_trade_commit=0x7f0a0087; - public static final int board_menu_tray=0x7f0a0089; - public static final int board_menu_undo_current=0x7f0a0099; - public static final int board_menu_undo_last=0x7f0a0088; - public static final int board_menu_zoom=0x7f0a009d; + public static final int add_player=0x7f0a0030; + public static final int advertise_new_room_check=0x7f0a0037; + public static final int blessed_label=0x7f0a0057; + public static final int board_menu_chat=0x7f0a009f; + public static final int board_menu_dict=0x7f0a009b; + public static final int board_menu_done=0x7f0a0085; + public static final int board_menu_file_about=0x7f0a0093; + public static final int board_menu_file_prefs=0x7f0a0092; + public static final int board_menu_flip=0x7f0a009d; + public static final int board_menu_game_counts=0x7f0a008b; + public static final int board_menu_game_history=0x7f0a008d; + public static final int board_menu_game_left=0x7f0a008c; + public static final int board_menu_game_netstats=0x7f0a0094; + public static final int board_menu_game_resend=0x7f0a008f; + public static final int board_menu_game_resign=0x7f0a008e; + public static final int board_menu_hint_next=0x7f0a0099; + public static final int board_menu_hint_prev=0x7f0a0098; + public static final int board_menu_invite=0x7f0a0095; + public static final int board_menu_juggle=0x7f0a009c; + public static final int board_menu_toggle=0x7f0a00a0; + public static final int board_menu_trade=0x7f0a0086; + public static final int board_menu_trade_cancel=0x7f0a0087; + public static final int board_menu_trade_commit=0x7f0a0088; + public static final int board_menu_tray=0x7f0a008a; + public static final int board_menu_undo_current=0x7f0a009a; + public static final int board_menu_undo_last=0x7f0a0089; + public static final int board_menu_zoom=0x7f0a009e; public static final int board_root=0x7f0a0002; public static final int board_view=0x7f0a0003; - public static final int boardsize_spinner=0x7f0a0042; - public static final int button_add=0x7f0a0073; + public static final int boardsize_spinner=0x7f0a0043; + public static final int button_add=0x7f0a0074; public static final int button_clear=0x7f0a000b; - public static final int button_done=0x7f0a0061; + public static final int button_done=0x7f0a0062; public static final int button_invite=0x7f0a000c; - public static final int button_newgame_multi=0x7f0a0044; - public static final int button_newgame_solo=0x7f0a0043; + public static final int button_newgame_multi=0x7f0a0045; + public static final int button_newgame_solo=0x7f0a0044; public static final int button_rescan=0x7f0a000a; - public static final int button_study=0x7f0a0060; - public static final int change_connection=0x7f0a003a; - public static final int chat_button=0x7f0a007f; + public static final int button_study=0x7f0a0061; + public static final int change_connection=0x7f0a003b; + public static final int chat_button=0x7f0a0080; public static final int chat_edit=0x7f0a0010; public static final int chat_history=0x7f0a000f; - public static final int chat_menu_clear=0x7f0a00a0; - public static final int checkbox=0x7f0a0050; + public static final int chat_menu_clear=0x7f0a00a1; + public static final int checkbox=0x7f0a0051; public static final int color_display_sample=0x7f0a0012; public static final int color_edit_sample=0x7f0a0013; public static final int confirm_sms_reasons=0x7f0a001a; public static final int conn_types=0x7f0a001b; - public static final int connect_set_relay=0x7f0a0032; - public static final int conns_label=0x7f0a0031; - public static final int del=0x7f0a0053; - public static final int desc=0x7f0a001e; - public static final int details=0x7f0a0070; - public static final int dict_label=0x7f0a0068; - public static final int dict_spinner=0x7f0a002c; - public static final int dictlist_button=0x7f0a007e; - public static final int dicts_delete=0x7f0a00a3; - public static final int dicts_deselect_all=0x7f0a00a2; - public static final int dicts_download=0x7f0a00a1; - public static final int dicts_move=0x7f0a00a4; - public static final int dicts_select=0x7f0a00a5; - public static final int divider=0x7f0a0023; - public static final int download_button=0x7f0a0071; - public static final int dwnld_message=0x7f0a004e; - public static final int edit=0x7f0a0062; + public static final int connect_set_relay=0x7f0a0033; + public static final int conns_label=0x7f0a0032; + public static final int default_check=0x7f0a001c; + public static final int del=0x7f0a0054; + public static final int desc=0x7f0a001f; + public static final int details=0x7f0a0071; + public static final int dict_label=0x7f0a0069; + public static final int dict_spinner=0x7f0a002d; + public static final int dictlist_button=0x7f0a007f; + public static final int dicts_delete=0x7f0a00a4; + public static final int dicts_deselect_all=0x7f0a00a3; + public static final int dicts_download=0x7f0a00a2; + public static final int dicts_move=0x7f0a00a5; + public static final int dicts_select=0x7f0a00a6; + public static final int divider=0x7f0a0024; + public static final int download_button=0x7f0a0072; + public static final int dwnld_message=0x7f0a004f; + public static final int edit=0x7f0a0063; public static final int edit_blue=0x7f0a0019; public static final int edit_green=0x7f0a0017; public static final int edit_red=0x7f0a0015; - public static final int english_label=0x7f0a0054; - public static final int english_view=0x7f0a0055; + public static final int english_label=0x7f0a0055; + public static final int english_view=0x7f0a0056; public static final int exchange_buttons=0x7f0a0004; public static final int exchange_cancel=0x7f0a0006; public static final int exchange_commit=0x7f0a0005; - public static final int expander=0x7f0a0025; - public static final int filters=0x7f0a005b; - public static final int flip_button=0x7f0a0081; - public static final int game_locked_check=0x7f0a0027; - public static final int game_name=0x7f0a0045; - public static final int gamel_menu_checkmoves=0x7f0a0090; - public static final int games_game_config=0x7f0a00b1; - public static final int games_game_copy=0x7f0a00b6; - public static final int games_game_delete=0x7f0a00b0; - public static final int games_game_move=0x7f0a00b2; - public static final int games_game_new_from=0x7f0a00b4; - public static final int games_game_rename=0x7f0a00b5; - public static final int games_game_reset=0x7f0a00b3; - public static final int games_group_default=0x7f0a00ba; - public static final int games_group_delete=0x7f0a00b9; - public static final int games_group_movedown=0x7f0a00b8; - public static final int games_group_moveup=0x7f0a00b7; - public static final int games_group_rename=0x7f0a00bb; - public static final int games_menu_about=0x7f0a00ad; - public static final int games_menu_checkmoves=0x7f0a00af; - public static final int games_menu_checkupdates=0x7f0a00bc; - public static final int games_menu_dicts=0x7f0a00ab; - public static final int games_menu_email=0x7f0a00ac; - public static final int games_menu_loaddb=0x7f0a00be; - public static final int games_menu_newgame_net=0x7f0a00a7; - public static final int games_menu_newgame_solo=0x7f0a00a6; - public static final int games_menu_newgroup=0x7f0a00a8; - public static final int games_menu_prefs=0x7f0a00a9; - public static final int games_menu_rateme=0x7f0a00aa; - public static final int games_menu_resend=0x7f0a00ae; - public static final int games_menu_storedb=0x7f0a00bd; - public static final int games_menu_study=0x7f0a008f; - public static final int group_done=0x7f0a0083; - public static final int group_exchange=0x7f0a0095; - public static final int group_hint=0x7f0a0096; - public static final int hideable=0x7f0a004a; - public static final int hints_allowed=0x7f0a003b; + public static final int expander=0x7f0a0026; + public static final int filters=0x7f0a005c; + public static final int flip_button=0x7f0a0082; + public static final int game_locked_check=0x7f0a0028; + public static final int game_name=0x7f0a0046; + public static final int gamel_menu_checkmoves=0x7f0a0091; + public static final int games_game_config=0x7f0a00b2; + public static final int games_game_copy=0x7f0a00b7; + public static final int games_game_delete=0x7f0a00b1; + public static final int games_game_move=0x7f0a00b3; + public static final int games_game_new_from=0x7f0a00b5; + public static final int games_game_rename=0x7f0a00b6; + public static final int games_game_reset=0x7f0a00b4; + public static final int games_group_default=0x7f0a00bb; + public static final int games_group_delete=0x7f0a00ba; + public static final int games_group_movedown=0x7f0a00b9; + public static final int games_group_moveup=0x7f0a00b8; + public static final int games_group_rename=0x7f0a00bc; + public static final int games_menu_about=0x7f0a00ae; + public static final int games_menu_checkmoves=0x7f0a00b0; + public static final int games_menu_checkupdates=0x7f0a00bd; + public static final int games_menu_dicts=0x7f0a00ac; + public static final int games_menu_email=0x7f0a00ad; + public static final int games_menu_loaddb=0x7f0a00bf; + public static final int games_menu_newgame_net=0x7f0a00a8; + public static final int games_menu_newgame_solo=0x7f0a00a7; + public static final int games_menu_newgroup=0x7f0a00a9; + public static final int games_menu_prefs=0x7f0a00aa; + public static final int games_menu_rateme=0x7f0a00ab; + public static final int games_menu_resend=0x7f0a00af; + public static final int games_menu_storedb=0x7f0a00be; + public static final int games_menu_study=0x7f0a0090; + public static final int group_done=0x7f0a0084; + public static final int group_exchange=0x7f0a0096; + public static final int group_hint=0x7f0a0097; + public static final int hideable=0x7f0a004b; + public static final int hints_allowed=0x7f0a003c; public static final int invite_desc=0x7f0a0009; public static final int inviter_check=0x7f0a000d; - public static final int item_name=0x7f0a006c; - public static final int item_score=0x7f0a006d; - public static final int join_public_room_check=0x7f0a0033; - public static final int juggle_players=0x7f0a0030; - public static final int label=0x7f0a0024; - public static final int lang_separator=0x7f0a002a; - public static final int lang_spinner=0x7f0a002b; - public static final int loc_item_check=0x7f0a00c0; - public static final int loc_item_clear=0x7f0a00bf; - public static final int loc_item_copy_bless=0x7f0a00c2; - public static final int loc_item_copy_eng=0x7f0a00c1; - public static final int loc_search_button=0x7f0a005d; - public static final int loc_search_field=0x7f0a005c; - public static final int local_label=0x7f0a0058; - public static final int local_player_set=0x7f0a0066; - public static final int manual_add_button=0x7f0a0074; - public static final int modtime=0x7f0a004b; - public static final int msg=0x7f0a0063; - public static final int msg_marker=0x7f0a0048; - public static final int name=0x7f0a0075; - public static final int name_edit=0x7f0a001c; - public static final int name_label=0x7f0a0072; - public static final int nexthint_button=0x7f0a007b; - public static final int not_again_check=0x7f0a0064; + public static final int item_name=0x7f0a006d; + public static final int item_score=0x7f0a006e; + public static final int join_public_room_check=0x7f0a0034; + public static final int juggle_players=0x7f0a0031; + public static final int label=0x7f0a0025; + public static final int lang_separator=0x7f0a002b; + public static final int lang_spinner=0x7f0a002c; + public static final int loc_item_check=0x7f0a00c1; + public static final int loc_item_clear=0x7f0a00c0; + public static final int loc_item_copy_bless=0x7f0a00c3; + public static final int loc_item_copy_eng=0x7f0a00c2; + public static final int loc_search_button=0x7f0a005e; + public static final int loc_search_field=0x7f0a005d; + public static final int local_label=0x7f0a0059; + public static final int local_player_set=0x7f0a0067; + public static final int manual_add_button=0x7f0a0075; + public static final int modtime=0x7f0a004c; + public static final int msg=0x7f0a0064; + public static final int msg_marker=0x7f0a0049; + public static final int name=0x7f0a0076; + public static final int name_edit=0x7f0a001d; + public static final int name_label=0x7f0a0073; + public static final int nexthint_button=0x7f0a007c; + public static final int not_again_check=0x7f0a0065; public static final int nperdev_spinner=0x7f0a000e; - public static final int number=0x7f0a0076; - public static final int other_lang=0x7f0a005e; - public static final int password_edit=0x7f0a006b; - public static final int password_set=0x7f0a006a; - public static final int phonies_spinner=0x7f0a0040; - public static final int pick_faceup=0x7f0a0041; - public static final int pick_lang=0x7f0a0077; - public static final int pick_lang_spinner=0x7f0a0078; - public static final int play_button=0x7f0a0028; - public static final int player_list=0x7f0a002e; - public static final int player_name_edit=0x7f0a0067; - public static final int players=0x7f0a0026; - public static final int players_label=0x7f0a002d; - public static final int prevhint_button=0x7f0a007a; - public static final int private_rooms_set=0x7f0a0034; - public static final int progress_bar=0x7f0a004f; - public static final int public_rooms_set=0x7f0a0037; - public static final int refresh_button=0x7f0a0039; - public static final int remote_check=0x7f0a0065; - public static final int revert_all=0x7f0a006f; - public static final int revert_colors=0x7f0a006e; - public static final int robot_check=0x7f0a0069; - public static final int role=0x7f0a004d; - public static final int room_edit=0x7f0a0035; - public static final int room_spinner=0x7f0a0038; - public static final int screen=0x7f0a0029; - public static final int search_button=0x7f0a0020; + public static final int number=0x7f0a0077; + public static final int other_lang=0x7f0a005f; + public static final int password_edit=0x7f0a006c; + public static final int password_set=0x7f0a006b; + public static final int phonies_spinner=0x7f0a0041; + public static final int pick_faceup=0x7f0a0042; + public static final int pick_lang=0x7f0a0078; + public static final int pick_lang_spinner=0x7f0a0079; + public static final int play_button=0x7f0a0029; + public static final int player_list=0x7f0a002f; + public static final int player_name_edit=0x7f0a0068; + public static final int players=0x7f0a0027; + public static final int players_label=0x7f0a002e; + public static final int prevhint_button=0x7f0a007b; + public static final int private_rooms_set=0x7f0a0035; + public static final int progress_bar=0x7f0a0050; + public static final int public_rooms_set=0x7f0a0038; + public static final int refresh_button=0x7f0a003a; + public static final int remote_check=0x7f0a0066; + public static final int revert_all=0x7f0a0070; + public static final int revert_colors=0x7f0a006f; + public static final int robot_check=0x7f0a006a; + public static final int role=0x7f0a004e; + public static final int room_edit=0x7f0a0036; + public static final int room_spinner=0x7f0a0039; + public static final int screen=0x7f0a002a; + public static final int search_button=0x7f0a0021; public static final int seek_blue=0x7f0a0018; public static final int seek_green=0x7f0a0016; public static final int seek_red=0x7f0a0014; public static final int send_button=0x7f0a0011; - public static final int show_remote=0x7f0a001d; - public static final int shuffle_button=0x7f0a007c; - public static final int slmenu_clear_sel=0x7f0a00c7; - public static final int slmenu_copy_sel=0x7f0a00c6; - public static final int slmenu_deselect_all=0x7f0a00c5; - public static final int slmenu_lookup_sel=0x7f0a00c3; - public static final int slmenu_select_all=0x7f0a00c4; - public static final int smart_robot=0x7f0a003f; - public static final int state=0x7f0a004c; - public static final int summary=0x7f0a005f; + public static final int show_remote=0x7f0a001e; + public static final int shuffle_button=0x7f0a007d; + public static final int slmenu_clear_sel=0x7f0a00c8; + public static final int slmenu_copy_sel=0x7f0a00c7; + public static final int slmenu_deselect_all=0x7f0a00c6; + public static final int slmenu_lookup_sel=0x7f0a00c4; + public static final int slmenu_select_all=0x7f0a00c5; + public static final int smart_robot=0x7f0a0040; + public static final int state=0x7f0a004d; + public static final int summary=0x7f0a0060; public static final int tbar_parent_hor=0x7f0a0007; public static final int tbar_parent_vert=0x7f0a0008; - public static final int text_item=0x7f0a0051; - public static final int text_item2=0x7f0a0052; - public static final int thumbnail=0x7f0a0049; - public static final int timer_minutes_edit=0x7f0a003e; - public static final int timer_set=0x7f0a003d; - public static final int toolbar=0x7f0a0079; - public static final int undo_button=0x7f0a007d; - public static final int use_timer=0x7f0a003c; - public static final int values_button=0x7f0a0080; + public static final int text_item=0x7f0a0052; + public static final int text_item2=0x7f0a0053; + public static final int thumbnail=0x7f0a004a; + public static final int timer_minutes_edit=0x7f0a003f; + public static final int timer_set=0x7f0a003e; + public static final int toolbar=0x7f0a007a; + public static final int undo_button=0x7f0a007e; + public static final int use_timer=0x7f0a003d; + public static final int values_button=0x7f0a0081; public static final int version_string=0x7f0a0000; - public static final int view_loaded=0x7f0a0047; - public static final int view_unloaded=0x7f0a0046; - public static final int word_edit=0x7f0a001f; - public static final int wordlen_max=0x7f0a0022; - public static final int wordlen_min=0x7f0a0021; - public static final int xlated_view=0x7f0a005a; - public static final int xlated_view_blessed=0x7f0a0057; - public static final int xlated_view_local=0x7f0a0059; - public static final int zoom_button=0x7f0a0082; + public static final int view_loaded=0x7f0a0048; + public static final int view_unloaded=0x7f0a0047; + public static final int word_edit=0x7f0a0020; + public static final int wordlen_max=0x7f0a0023; + public static final int wordlen_min=0x7f0a0022; + public static final int xlated_view=0x7f0a005b; + public static final int xlated_view_blessed=0x7f0a0058; + public static final int xlated_view_local=0x7f0a005a; + public static final int zoom_button=0x7f0a0083; } public static final class layout { public static final int about_dlg=0x7f030000; @@ -425,11 +426,11 @@ public final class R { public static final class string { /** copyright info */ - public static final int about_copyright=0x7f0501b9; + public static final int about_copyright=0x7f0501bc; /** Another paragraph giving credit for work done other than by Eric House and translators */ - public static final int about_credits=0x7f0501bc; + public static final int about_credits=0x7f0501bf; /** ########################################################### # :Dialogs: @@ -440,47 +441,47 @@ public final class R { String giving version info, which is substituted in. */ - public static final int about_vers_fmt=0x7f0501b8; + public static final int about_vers_fmt=0x7f0501bb; /** Another paragraph in the about dialog */ - public static final int about_web=0x7f0501ba; - public static final int add_done_fmt=0x7f050266; - public static final int add_to_study_fmt=0x7f050260; + public static final int about_web=0x7f0501bd; + public static final int add_done_fmt=0x7f050269; + public static final int add_to_study_fmt=0x7f050263; /** Debugging stuff. Localize if you think your langauge users will care. */ - public static final int advanced=0x7f0502cb; + public static final int advanced=0x7f0502ce; /** This button takes you to the normal Game Configure screen */ - public static final int advanced_config=0x7f050177; - public static final int advanced_summary=0x7f0502cc; + public static final int advanced_config=0x7f05017a; + public static final int advanced_summary=0x7f0502cf; /** */ - public static final int alert_empty_dict_fmt=0x7f0501d5; + public static final int alert_empty_dict_fmt=0x7f0501d8; /** The name of the app. Not localized! */ public static final int app_name=0x7f050001; - public static final int app_not_found_fmt=0x7f0502ab; + public static final int app_not_found_fmt=0x7f0502ae; public static final int app_version=0x7f050000; /** the background color of the area outside the board, e.g. between entries in the scoreboard */ - public static final int background=0x7f05013d; + public static final int background=0x7f050140; /** Appended to the above in the phonies_warn case. User may ignore the warning */ - public static final int badwords_accept=0x7f0500e8; + public static final int badwords_accept=0x7f0500eb; /** Appended to the above in the phonies_disallow case. User has lost his turn. */ - public static final int badwords_lost=0x7f0500e9; + public static final int badwords_lost=0x7f0500ec; /** title of the dialog in which the above is posted. */ - public static final int badwords_title=0x7f0500ea; - public static final int blue=0x7f050141; + public static final int badwords_title=0x7f0500ed; + public static final int blue=0x7f050144; /** board menu for small devices only */ - public static final int board_menu_dict=0x7f05020c; + public static final int board_menu_dict=0x7f05020f; /** ############################################################ # :Menus: @@ -490,149 +491,149 @@ public final class R { This menu commits the current move as it's been laid out on the board */ - public static final int board_menu_done=0x7f0500eb; + public static final int board_menu_done=0x7f0500ee; /** Brings up "About Crosswords" dialog */ - public static final int board_menu_file_about=0x7f05008d; + public static final int board_menu_file_about=0x7f050090; /** */ - public static final int board_menu_file_email=0x7f0501da; + public static final int board_menu_file_email=0x7f0501dd; /** menu on Game submenu: brings up dialog listing all tiles in the language of the game along with how many of each there are and how many points each is worth. This display is the same throughout the game. */ - public static final int board_menu_game_counts=0x7f0500f1; + public static final int board_menu_game_counts=0x7f0500f4; /** Brings up explanation of the game's final score. If the game is not yet over, gives you a choice whether to end it now, and if you decline does nothing. */ - public static final int board_menu_game_final=0x7f0500f4; + public static final int board_menu_game_final=0x7f0500f7; /** Brings up listing of all moves played so far this game. */ - public static final int board_menu_game_history=0x7f0500f3; + public static final int board_menu_game_history=0x7f0500f6; /** menu on Game submenu: brings up dialog listing all tiles not yet played and not in the rack of the player whose rack is visible (whose turn it is, generally). This display will change as tiles are used and depending on what player is asking. */ - public static final int board_menu_game_left=0x7f0500f2; - public static final int board_menu_game_netstats=0x7f0502d6; + public static final int board_menu_game_left=0x7f0500f5; + public static final int board_menu_game_netstats=0x7f0502d9; /** Meaningful only for networked games, this menu causes all messages that have not yet been acknowledged by a remote device in the game to be resent. Eventually I hope to be able to remove this from non-debug versions of the game because users should not have to do do this EVER. */ - public static final int board_menu_game_resend=0x7f0500f6; - public static final int board_menu_game_resign=0x7f0500f5; - public static final int board_menu_invite=0x7f050259; + public static final int board_menu_game_resend=0x7f0500f9; + public static final int board_menu_game_resign=0x7f0500f8; + public static final int board_menu_invite=0x7f05025c; /** */ - public static final int board_menu_pass=0x7f0501c8; + public static final int board_menu_pass=0x7f0501cb; /** This menu begins an exchange of tiles: puts the board into trade mode. */ - public static final int board_menu_trade=0x7f0500ec; + public static final int board_menu_trade=0x7f0500ef; /** hide and shows the tray. On devices where there is enough room for the full board and tray to be shown then hiding the tray just "turns it over", i.e. shows tiles with '?' characters. */ - public static final int board_menu_tray_hide=0x7f0500ed; - public static final int board_menu_tray_show=0x7f0500ee; + public static final int board_menu_tray_hide=0x7f0500f0; + public static final int board_menu_tray_show=0x7f0500f1; /** */ - public static final int board_menu_undo_current=0x7f050206; + public static final int board_menu_undo_current=0x7f050209; /** Undos the last *committed* turn. Note that this is different from the undo button that undoes or redoes an in-progress not-yet-committed turn. This is disabled for networked games. */ - public static final int board_menu_undo_last=0x7f0500ef; + public static final int board_menu_undo_last=0x7f0500f2; /** preference for board size (15x15, 13x13 etc.) */ - public static final int board_size=0x7f050124; + public static final int board_size=0x7f050127; /** Title of submenu */ - public static final int board_submenu_game=0x7f0500f0; + public static final int board_submenu_game=0x7f0500f3; /** The remaining strings (down to the color edit dialog below) are showns as the names of editable colors and as the the title of the color editor that comes up when the name is tapped. (color for) double-letter bonus squares on the board */ - public static final int bonus_l2x=0x7f050136; + public static final int bonus_l2x=0x7f050139; /** Bonus value hint that's displayed in gray text in the colored bonus square. Double-letter */ - public static final int bonus_l2x_summary=0x7f0500d8; + public static final int bonus_l2x_summary=0x7f0500db; /** (color for) triple-letter bonus squares on the board */ - public static final int bonus_l3x=0x7f050137; + public static final int bonus_l3x=0x7f05013a; /** Bonus value hint that's displayed in gray text in the colored bonus square. Triple-letter */ - public static final int bonus_l3x_summary=0x7f0500da; + public static final int bonus_l3x_summary=0x7f0500dd; /** (color for) double-word squares on the board */ - public static final int bonus_w2x=0x7f050138; + public static final int bonus_w2x=0x7f05013b; /** Bonus value hint that's displayed in gray text in the colored bonus square. Double-word */ - public static final int bonus_w2x_summary=0x7f0500d9; + public static final int bonus_w2x_summary=0x7f0500dc; /** (color for) triple-word squares on the board */ - public static final int bonus_w3x=0x7f050139; + public static final int bonus_w3x=0x7f05013c; /** Bonus value hint that's displayed in gray text in the colored bonus square. Triple-word */ - public static final int bonus_w3x_summary=0x7f0500db; + public static final int bonus_w3x_summary=0x7f0500de; /** */ - public static final int bt_bad_proto_fmt=0x7f0501e8; + public static final int bt_bad_proto_fmt=0x7f0501eb; /** */ - public static final int bt_fail_fmt=0x7f0501ed; + public static final int bt_fail_fmt=0x7f0501f0; /** Title of device picker during invitation to a game via Bluetooth */ - public static final int bt_invite_title=0x7f0501ef; - public static final int bt_no_devs=0x7f0502aa; + public static final int bt_invite_title=0x7f0501f2; + public static final int bt_no_devs=0x7f0502ad; /** Turn Bluetooth on In the Bluetooth invite device dialog */ - public static final int bt_pick_addall_button=0x7f0501de; + public static final int bt_pick_addall_button=0x7f0501e1; /** */ - public static final int bt_pick_clear_button=0x7f0501df; + public static final int bt_pick_clear_button=0x7f0501e2; /** */ - public static final int bt_resend_fmt=0x7f0501ec; + public static final int bt_resend_fmt=0x7f0501ef; /** text of button for adding new player to game */ - public static final int button_add_player=0x7f0500ae; + public static final int button_add_player=0x7f0500b1; /** The only button available when the above message is displayed */ - public static final int button_close_game=0x7f050188; - public static final int button_decline=0x7f050239; + public static final int button_close_game=0x7f05018b; + public static final int button_decline=0x7f05023c; /** */ - public static final int button_default_both=0x7f0500a4; + public static final int button_default_both=0x7f0500a7; /** These three strings are the text for three buttons giving choices in respose to the dialog launched in response to the dicts_item_select menu (see dicts_item_select above.) */ - public static final int button_default_human=0x7f0500a2; + public static final int button_default_human=0x7f0500a5; /** */ - public static final int button_default_robot=0x7f0500a3; + public static final int button_default_robot=0x7f0500a6; /** When you select the gamel_menu_delete_all menuitem or list_item_delete contextual menu, you are asked to confirm. This is the text of the first button ("Cancel" is the second). */ - public static final int button_delete=0x7f050086; + public static final int button_delete=0x7f050089; /** Used for button in dialog put up with the relay says the remote partner of this game has deleted it. Ok, meaning "don't discard", is the other option. This same button is @@ -640,41 +641,41 @@ public final class R { the other option, for discarding changes that would otherwise reset a game. */ - public static final int button_discard=0x7f050195; - public static final int button_discard_changes=0x7f0502c5; + public static final int button_discard=0x7f050198; + public static final int button_discard_changes=0x7f0502c8; /** */ - public static final int button_done=0x7f0501c5; + public static final int button_done=0x7f0501c8; /** */ - public static final int button_done_fmt=0x7f0501c6; + public static final int button_done_fmt=0x7f0501c9; /** Text of button displayed when downloading is an option */ - public static final int button_download=0x7f05018b; - public static final int button_edit=0x7f0502c4; - public static final int button_enable=0x7f050304; - public static final int button_enable_bt=0x7f050224; - public static final int button_enable_sms=0x7f050223; - public static final int button_go_settings=0x7f05025b; + public static final int button_download=0x7f05018e; + public static final int button_edit=0x7f0502c7; + public static final int button_enable=0x7f050307; + public static final int button_enable_bt=0x7f050227; + public static final int button_enable_sms=0x7f050226; + public static final int button_go_settings=0x7f05025e; /** */ - public static final int button_invite=0x7f0501ee; + public static final int button_invite=0x7f0501f1; /** text of button to juggle (randomly rearrange order of) players */ - public static final int button_juggle_players=0x7f0500af; - public static final int button_later=0x7f050225; + public static final int button_juggle_players=0x7f0500b2; + public static final int button_later=0x7f050228; /** New strings that need to be documented and found a home above. */ - public static final int button_lookup=0x7f0501bf; + public static final int button_lookup=0x7f0501c2; /** */ - public static final int button_lookup_fmt=0x7f0501c1; - public static final int button_lookup_study=0x7f0501c0; - public static final int button_lookup_study_fmt=0x7f0501c2; + public static final int button_lookup_fmt=0x7f0501c4; + public static final int button_lookup_study=0x7f0501c3; + public static final int button_lookup_study_fmt=0x7f0501c5; /** */ - public static final int button_move=0x7f0501ca; + public static final int button_move=0x7f0501cd; /** What is \u200C? English strings are used as keys, so they all need to be unique. This glyph is non-printing and of zero-width, so it should do the trick: @@ -715,32 +716,32 @@ public final class R { Any changes you make to it will be lost. */ - public static final int button_new_game=0x7f05007c; + public static final int button_new_game=0x7f05007f; /** Games list screen menuitem text for creating a new group */ - public static final int button_new_group=0x7f05007d; - public static final int button_newgroup=0x7f0501cb; - public static final int button_no=0x7f050193; + public static final int button_new_group=0x7f050080; + public static final int button_newgroup=0x7f0501ce; + public static final int button_no=0x7f050196; /** Text for button in new-user-info dialog with title just above. */ - public static final int button_notagain=0x7f0501a1; - public static final int button_reconnect=0x7f05024b; + public static final int button_notagain=0x7f0501a4; + public static final int button_reconnect=0x7f05024e; /** Button shown in game over dialog triggering creation of new game with the same players and parameters as the one that just ended. */ - public static final int button_rematch=0x7f05024a; + public static final int button_rematch=0x7f05024d; /** When you select the list_item_reset contextual menu, you are asked to confirm. This is the text of the first button ("Cancel" is the second). */ - public static final int button_reset=0x7f050087; + public static final int button_reset=0x7f05008a; /** Used for a button when informing user that his attempt to connect to the relay failed because the room named does not exist. (I believe this no longer occurs.) */ - public static final int button_retry=0x7f050196; + public static final int button_retry=0x7f050199; /** ############################################################ # :Menus: @@ -753,25 +754,25 @@ public final class R { text of first menu item. Will revert all preferences to their default/original values */ - public static final int button_revert_all=0x7f05010c; + public static final int button_revert_all=0x7f05010f; /** Second menu item. Reverts only the colors to their default/original values */ - public static final int button_revert_colors=0x7f05010e; + public static final int button_revert_colors=0x7f050111; /** Used in Game config dialog to confirm saving changes that reset a game */ - public static final int button_save=0x7f050194; + public static final int button_save=0x7f050197; /** */ - public static final int button_search=0x7f0501cc; + public static final int button_search=0x7f0501cf; /** */ - public static final int button_sms_add=0x7f0501f9; + public static final int button_sms_add=0x7f0501fc; /** Text of button allowing user to choose to open with a different (but same-language wordlist) */ - public static final int button_substdict=0x7f05018c; - public static final int button_trade_cancel=0x7f0500d6; + public static final int button_substdict=0x7f05018f; + public static final int button_trade_cancel=0x7f0500d9; /** ############################################################ # :Screens: @@ -785,7 +786,7 @@ public final class R { Buttons shown at bottom when board is in exchange mode, i.e. after user has picked board_menu_trade menu item */ - public static final int button_trade_commit=0x7f0500d5; + public static final int button_trade_commit=0x7f0500d8; /** ############################################################ # Dialogs @@ -794,20 +795,20 @@ public final class R { Text for buttons at the bottom of dialogs. These first are in many places. */ - public static final int button_yes=0x7f050192; - public static final int cannot_delete_default_group_fmt=0x7f050249; - public static final int change_group=0x7f05024e; + public static final int button_yes=0x7f050195; + public static final int cannot_delete_default_group_fmt=0x7f05024c; + public static final int change_group=0x7f050251; /** text of button in About Crosswords dialog summoning above dialog */ - public static final int changes_button=0x7f0501be; + public static final int changes_button=0x7f0501c1; /** text of dialog showing the set of changes made since the last release */ - public static final int changes_title=0x7f0501bd; + public static final int changes_title=0x7f0501c0; /** Prefix for local messages */ - public static final int chat_local_id=0x7f050172; + public static final int chat_local_id=0x7f050175; /** ############################################################ # :Menus: @@ -819,14 +820,14 @@ public final class R { other devices in the game: no "clear chat" message is transmitted. */ - public static final int chat_menu_clear=0x7f050175; + public static final int chat_menu_clear=0x7f050178; /** Prefix for remote messages */ - public static final int chat_other_id=0x7f050173; + public static final int chat_other_id=0x7f050176; /** Text on the button that causes the contents of the message-composition field to be sent. */ - public static final int chat_send=0x7f050174; + public static final int chat_send=0x7f050177; /** ############################################################ # :Screens: # Chat screen @@ -841,70 +842,70 @@ public final class R { title of the chat screen. The name of the current game is substituted for %1$s. */ - public static final int chat_title_fmt=0x7f050171; - public static final int checking_for_fmt=0x7f0502fb; - public static final int checking_title=0x7f0502fa; - public static final int checkupdates_none_found=0x7f050227; + public static final int chat_title_fmt=0x7f050174; + public static final int checking_for_fmt=0x7f0502fe; + public static final int checking_title=0x7f0502fd; + public static final int checkupdates_none_found=0x7f05022a; /** color of the "crosshairs", lines drawn vertically and horizontally through the square the user is currently touching in order to guide the fat-fingered (most of us) in operations that require accurately selecting a single square on the board. */ - public static final int clr_crosshairs=0x7f05013a; - public static final int config_no_connvia=0x7f0502c3; + public static final int clr_crosshairs=0x7f05013d; + public static final int config_no_connvia=0x7f0502c6; /** */ - public static final int confirm_clear=0x7f0501fe; + public static final int confirm_clear=0x7f050201; /** Additional text appended to text confirm_delete_dictf in the wordlist delete confiration dialog in the case where the wordlist to be deleted is the last in its language. The name of the language is substituted for %1$s. */ - public static final int confirm_deleteonly_dicts_fmt=0x7f0500a0; - public static final int confirm_drop_relay=0x7f050300; - public static final int confirm_drop_relay_bt=0x7f050302; - public static final int confirm_drop_relay_sms=0x7f050303; - public static final int confirm_get_locdict_fmt=0x7f0502ca; + public static final int confirm_deleteonly_dicts_fmt=0x7f0500a3; + public static final int confirm_drop_relay=0x7f050303; + public static final int confirm_drop_relay_bt=0x7f050305; + public static final int confirm_drop_relay_sms=0x7f050306; + public static final int confirm_get_locdict_fmt=0x7f0502cd; /** Text of confirmation dialog for above */ - public static final int confirm_revert_all=0x7f05010f; + public static final int confirm_revert_all=0x7f050112; /** Text of confirmation dialog for above */ - public static final int confirm_revert_colors=0x7f05010d; + public static final int confirm_revert_colors=0x7f050110; /** title of confirmation dialog put up when user has unlocked an in-progress game and wants to save changes (has hit the play button). */ - public static final int confirm_save=0x7f0500c8; + public static final int confirm_save=0x7f0500cb; /** title of above confirmation dialog */ - public static final int confirm_save_title=0x7f0500c9; + public static final int confirm_save_title=0x7f0500cc; /** */ - public static final int confirm_sms_expl=0x7f05021c; + public static final int confirm_sms_expl=0x7f05021f; /** */ - public static final int confirm_sms_leave=0x7f05021e; + public static final int confirm_sms_leave=0x7f050221; /** */ - public static final int confirm_sms_prompt=0x7f05021d; + public static final int confirm_sms_prompt=0x7f050220; /** */ - public static final int confirm_sms_title=0x7f05021b; + public static final int confirm_sms_title=0x7f05021e; /** */ - public static final int confirm_sms_unlimited=0x7f05021f; + public static final int confirm_sms_unlimited=0x7f050222; /** */ - public static final int confirm_sms_willpay=0x7f050220; + public static final int confirm_sms_willpay=0x7f050223; /** text of dialog shown when the menu item board_menu_undo_last is chosen. */ - public static final int confirm_undo_last=0x7f05010a; - public static final int connect_daily=0x7f050159; - public static final int connect_fifteen_mins=0x7f050155; - public static final int connect_five_mins=0x7f050154; + public static final int confirm_undo_last=0x7f05010d; + public static final int connect_daily=0x7f05015c; + public static final int connect_fifteen_mins=0x7f050158; + public static final int connect_five_mins=0x7f050157; /** ############################################################ # :Screens: @@ -917,81 +918,81 @@ public final class R { new moves available and fetches them. This controls how frequently that check is done. */ - public static final int connect_frequency=0x7f050152; + public static final int connect_frequency=0x7f050155; /** text of separator marking out the connection area of the dialog */ - public static final int connect_label_fmt=0x7f0500b2; + public static final int connect_label_fmt=0x7f0500b5; /** */ - public static final int connect_label_sms=0x7f0501ff; + public static final int connect_label_sms=0x7f050202; /** These are the possible values for the connect_frequency setting presented as a drop-down list. */ - public static final int connect_never=0x7f050153; - public static final int connect_one_hour=0x7f050157; - public static final int connect_six_hours=0x7f050158; - public static final int connect_thirty_mins=0x7f050156; - public static final int connection_via_label=0x7f0502bc; + public static final int connect_never=0x7f050156; + public static final int connect_one_hour=0x7f05015a; + public static final int connect_six_hours=0x7f05015b; + public static final int connect_thirty_mins=0x7f050159; + public static final int connection_via_label=0x7f0502bf; /** */ - public static final int connstat_lastother_succ_fmt=0x7f050213; + public static final int connstat_lastother_succ_fmt=0x7f050216; /** */ - public static final int connstat_lastother_unsucc_fmt=0x7f050214; + public static final int connstat_lastother_unsucc_fmt=0x7f050217; /** */ - public static final int connstat_lastreceipt_fmt=0x7f050215; + public static final int connstat_lastreceipt_fmt=0x7f050218; /** */ - public static final int connstat_lastsend_fmt=0x7f050212; + public static final int connstat_lastsend_fmt=0x7f050215; /** */ - public static final int connstat_net_fmt=0x7f05020f; - public static final int connstat_net_noaddr=0x7f05020e; + public static final int connstat_net_fmt=0x7f050212; + public static final int connstat_net_noaddr=0x7f050211; /** */ - public static final int connstat_noreceipt=0x7f050216; + public static final int connstat_noreceipt=0x7f050219; /** */ - public static final int connstat_relay=0x7f050217; + public static final int connstat_relay=0x7f05021a; /** */ - public static final int connstat_sms=0x7f050218; + public static final int connstat_sms=0x7f05021b; /** */ - public static final int connstat_succ=0x7f050210; + public static final int connstat_succ=0x7f050213; /** */ - public static final int connstat_unsucc=0x7f050211; + public static final int connstat_unsucc=0x7f050214; /** title of dialog brought up in response to the board_menu_game_counts menu. The dialog lists all tiles in the language being used for the game together with how many of each there are are and how many points each is worth. */ - public static final int counts_values_title=0x7f05019b; - public static final int cur_menu_marker_fmt=0x7f050258; + public static final int counts_values_title=0x7f05019e; + public static final int cur_menu_marker_fmt=0x7f05025b; /** */ - public static final int cur_tiles_fmt=0x7f0501d0; - public static final int data_gsm_only=0x7f050275; - public static final int db_store_done=0x7f0502fc; - public static final int debug_features=0x7f0502d2; - public static final int debug_features_summary=0x7f0502d3; + public static final int cur_tiles_fmt=0x7f0501d3; + public static final int data_gsm_only=0x7f050278; + public static final int db_store_done=0x7f0502ff; + public static final int debug_features=0x7f0502d5; + public static final int debug_features_summary=0x7f0502d6; /** dictionary used by default for human players when creating new game */ - public static final int default_dict=0x7f05011c; + public static final int default_dict=0x7f05011f; /** other */ - public static final int default_host=0x7f050073; + public static final int default_host=0x7f050076; /** label within default wordlists in app preferences */ - public static final int default_language=0x7f0502ac; - public static final int default_loc=0x7f05023c; - public static final int default_loc_summary=0x7f05023d; + public static final int default_language=0x7f0502af; + public static final int default_loc=0x7f05023f; + public static final int default_loc_summary=0x7f050240; /** Welcome dialog text */ - public static final int default_name_message=0x7f0501b7; + public static final int default_name_message=0x7f0501ba; /** ########################################################### # :Dialogs: @@ -1006,39 +1007,39 @@ public final class R { Welcome dialog title */ - public static final int default_name_title=0x7f0501b6; + public static final int default_name_title=0x7f0501b9; /** default new-game setting for handline phonies (words not found in the word list) */ - public static final int default_phonies=0x7f050122; + public static final int default_phonies=0x7f050125; /** dictionary used by default for robot players when creating new game */ - public static final int default_robodict=0x7f05011d; - public static final int default_update_url=0x7f050079; - public static final int delete_dicts=0x7f050297; + public static final int default_robodict=0x7f050120; + public static final int default_update_url=0x7f05007c; + public static final int delete_dicts=0x7f05029a; /** Playing via SMS is currently disabled. You can enable it in Settings->Network game settings. */ - public static final int dft_sms_name_fmt=0x7f0501f6; + public static final int dft_sms_name_fmt=0x7f0501f9; /** */ - public static final int dict_browse_nowords_fmt=0x7f0501d2; - public static final int dict_desc_fmt=0x7f05029e; - public static final int dict_host=0x7f0502cf; - public static final int dict_info_fmt=0x7f05029b; + public static final int dict_browse_nowords_fmt=0x7f0501d5; + public static final int dict_desc_fmt=0x7f0502a1; + public static final int dict_host=0x7f0502d2; + public static final int dict_info_fmt=0x7f05029e; /** label for dropdown by which wordlist is chosen that this player will use. The language the game will use (which constrains the choice of wordlists) is substituted in for "%1$s". */ - public static final int dict_lang_label_fmt=0x7f0500d1; - public static final int dict_on_server=0x7f05029d; + public static final int dict_lang_label_fmt=0x7f0500d4; + public static final int dict_on_server=0x7f0502a0; /** string name="invite_mime">text/plainDisplay snapshots of games */ - public static final int dropped_dupe=0x7f050257; + public static final int dropped_dupe=0x7f05025a; /** Shown in the main screen when you launch Crosswords from an invitation (received in email or messaging app, say) and there's already a game running that matches that invitation. @@ -1087,64 +1088,64 @@ public final class R { the same room name over and over so they'll get this warning and it's harmless to ignore it. */ - public static final int dup_game_query_fmt=0x7f050197; + public static final int dup_game_query_fmt=0x7f05019a; /** */ - public static final int email_author_chooser=0x7f0501dc; + public static final int email_author_chooser=0x7f0501df; /** Nor is my email address */ - public static final int email_author_email=0x7f050072; + public static final int email_author_email=0x7f050075; /** */ - public static final int email_author_subject=0x7f0501db; + public static final int email_author_subject=0x7f0501de; /** */ - public static final int email_body_rev_fmt=0x7f0501dd; + public static final int email_body_rev_fmt=0x7f0501e0; /** color of empty squares on the board (that are not bonus squares) */ - public static final int empty=0x7f05013c; + public static final int empty=0x7f05013f; /** Shows in SMS Invite dialog when no phone numbers have been saved previously */ - public static final int empty_sms_inviter=0x7f0501fc; - public static final int enable_dupes_summary=0x7f0502e0; - public static final int enable_dupes_title=0x7f0502de; - public static final int enable_nfc=0x7f05025a; - public static final int enable_nfc_toself_summary=0x7f0502e3; - public static final int enable_nfc_toself_title=0x7f0502e2; - public static final int enable_pubroom_summary=0x7f0502bb; - public static final int enable_pubroom_title=0x7f0502ba; + public static final int empty_sms_inviter=0x7f0501ff; + public static final int enable_dupes_summary=0x7f0502e3; + public static final int enable_dupes_title=0x7f0502e1; + public static final int enable_nfc=0x7f05025d; + public static final int enable_nfc_toself_summary=0x7f0502e6; + public static final int enable_nfc_toself_title=0x7f0502e5; + public static final int enable_pubroom_summary=0x7f0502be; + public static final int enable_pubroom_title=0x7f0502bd; /** */ - public static final int enable_sms=0x7f050219; + public static final int enable_sms=0x7f05021c; /** */ - public static final int enable_sms_summary=0x7f05021a; - public static final int enable_sms_toself_summary=0x7f0502e5; - public static final int enable_sms_toself_title=0x7f0502e4; - public static final int entering_trade=0x7f0500d7; - public static final int err_dup_invite_fmt=0x7f0502b5; - public static final int expl_update_url=0x7f0502ef; + public static final int enable_sms_summary=0x7f05021d; + public static final int enable_sms_toself_summary=0x7f0502e8; + public static final int enable_sms_toself_title=0x7f0502e7; + public static final int entering_trade=0x7f0500da; + public static final int err_dup_invite_fmt=0x7f0502b8; + public static final int expl_update_url=0x7f0502f2; /** if this preference is checked, a dialog will be posted every time a robot makes a move or a move is received from a remote player. */ - public static final int explain_robot=0x7f050144; + public static final int explain_robot=0x7f050147; /** explanation of the above */ - public static final int explain_robot_summary=0x7f050145; + public static final int explain_robot_summary=0x7f050148; /** title of dialog brought up in response to the board_menu_game_final menu. The dialog displays the final score and an accounting of it (including subtractions for running out the game timer if there is one.) */ - public static final int finalscores_title=0x7f05019d; + public static final int finalscores_title=0x7f0501a0; /** Explanatory text appears in the dialog */ - public static final int force_expl=0x7f0500cc; - public static final int force_radio_title=0x7f0502e6; - public static final int force_tablet_summary=0x7f0502a2; - public static final int force_tablet_title=0x7f0502a1; + public static final int force_expl=0x7f0500cf; + public static final int force_radio_title=0x7f0502e9; + public static final int force_tablet_summary=0x7f0502a5; + public static final int force_tablet_title=0x7f0502a4; /** ############################################################ # :Dialogs: @@ -1159,22 +1160,22 @@ public final class R { title of this dialog */ - public static final int force_title=0x7f0500cb; + public static final int force_title=0x7f0500ce; /** Displayed as a "Toast" (mini window briefly displayed) if you didn't choose a remote player and I was forced to pick one. I always pick the first. */ - public static final int forced_consistent=0x7f0500cd; + public static final int forced_consistent=0x7f0500d0; /** Games that have ended are listed with this string */ - public static final int gameOver=0x7f050085; + public static final int gameOver=0x7f050088; /** */ - public static final int game_btname_title=0x7f0501f1; + public static final int game_btname_title=0x7f0501f4; /** used to create default names of games (when user has not named them.) */ - public static final int game_fmt=0x7f05018f; + public static final int game_fmt=0x7f050192; /** ############################################################ # :Menus: @@ -1184,49 +1185,49 @@ public final class R { title of contextual menu. Name of the selected game is substituted in. */ - public static final int game_item_menu_title_fmt=0x7f05008e; + public static final int game_item_menu_title_fmt=0x7f050091; /** */ - public static final int game_list_tmp=0x7f05020d; + public static final int game_list_tmp=0x7f050210; /** text of checkbox at top of dialog allowing to unlock in-play game to make changes */ - public static final int game_locked=0x7f0500ab; - public static final int game_name_group_title=0x7f050248; + public static final int game_locked=0x7f0500ae; + public static final int game_name_group_title=0x7f05024b; /** */ - public static final int game_name_label=0x7f0501f3; + public static final int game_name_label=0x7f0501f6; /** */ - public static final int game_name_title=0x7f0501f2; + public static final int game_name_title=0x7f0501f5; /** */ - public static final int game_rename_title=0x7f050097; + public static final int game_rename_title=0x7f05009a; /** Put nothing in the summary space, so it just reads "Game 2" */ - public static final int game_summary_field_empty=0x7f050128; - public static final int game_summary_field_gameid=0x7f0502ed; + public static final int game_summary_field_empty=0x7f05012b; + public static final int game_summary_field_gameid=0x7f0502f0; /** Put the language there, so it reads "Game 2 (English)" */ - public static final int game_summary_field_language=0x7f050129; - public static final int game_summary_field_npackets=0x7f0502ee; + public static final int game_summary_field_language=0x7f05012c; + public static final int game_summary_field_npackets=0x7f0502f1; /** List names of opponents (summarized), e.g. "Game 2 (vs Kati)" */ - public static final int game_summary_field_opponents=0x7f05012a; - public static final int game_summary_field_rowid=0x7f0502ec; + public static final int game_summary_field_opponents=0x7f05012d; + public static final int game_summary_field_rowid=0x7f0502ef; /** List the state of the game, "Game over" or "10 moves made" etc. */ - public static final int game_summary_field_state=0x7f05012b; + public static final int game_summary_field_state=0x7f05012e; /** Regardless of the setting of the connect_frequency preference, checks the relay immediately for any moves for networked games on this device and posts a notification if any is downloaded. */ - public static final int gamel_menu_checkmoves=0x7f05008a; + public static final int gamel_menu_checkmoves=0x7f05008d; /** */ - public static final int gamel_menu_checkupdates=0x7f050226; + public static final int gamel_menu_checkupdates=0x7f050229; /** ############################################################ # :Menus: @@ -1238,25 +1239,25 @@ public final class R { Brings up the Wordlists (formerly Dictionaries) screen */ - public static final int gamel_menu_dicts=0x7f050088; - public static final int gamel_menu_loaddb=0x7f0502dd; - public static final int gamel_menu_storedb=0x7f0502dc; - public static final int gamel_menu_study=0x7f050263; + public static final int gamel_menu_dicts=0x7f05008b; + public static final int gamel_menu_loaddb=0x7f0502e0; + public static final int gamel_menu_storedb=0x7f0502df; + public static final int gamel_menu_study=0x7f050266; /** */ - public static final int get_sms_number=0x7f0501fd; - public static final int getinfo=0x7f050296; - public static final int git_rev=0x7f05007b; - public static final int git_rev_title=0x7f0502d8; - public static final int got_langdict_summary=0x7f0502f1; - public static final int got_langdict_title=0x7f0502f0; - public static final int green=0x7f050140; - public static final int group_cur_games=0x7f050245; - public static final int group_new_games=0x7f050246; + public static final int get_sms_number=0x7f050200; + public static final int getinfo=0x7f050299; + public static final int git_rev=0x7f05007e; + public static final int git_rev_title=0x7f0502db; + public static final int got_langdict_summary=0x7f0502f4; + public static final int got_langdict_title=0x7f0502f3; + public static final int green=0x7f050143; + public static final int group_cur_games=0x7f050248; + public static final int group_new_games=0x7f050249; /** Used as the default name for remote players displayed within the Game configure screen */ - public static final int guest_name=0x7f0500c7; + public static final int guest_name=0x7f0500ca; /** If this preference is checked the "crosshairs" (vertical and horzontal lines through the cell your finger is on that help you tell where the app thinks you're actually tapping) will @@ -1265,75 +1266,75 @@ public final class R { large enough screens that they always know where they're tapping. */ - public static final int hide_crosshairs=0x7f05014e; + public static final int hide_crosshairs=0x7f050151; /** explanation of the above */ - public static final int hide_crosshairs_summary=0x7f05014f; + public static final int hide_crosshairs_summary=0x7f050152; /** clarification of above */ - public static final int hide_newgames_summary=0x7f05012f; + public static final int hide_newgames_summary=0x7f050132; /** Checkbox that when set prevents showing the newgame buttons on the main screen to save space */ - public static final int hide_newgames_title=0x7f05012e; + public static final int hide_newgames_title=0x7f050131; /** Checkbox that when set prevents showing a title bar in the game board window to save space */ - public static final int hide_title=0x7f05012c; + public static final int hide_title=0x7f05012f; /** clarification of above */ - public static final int hide_title_summary=0x7f05012d; + public static final int hide_title_summary=0x7f050130; /** text of checkbox. If this checkbox is checked, buttons will appear by which the user can get high- and low-scoring moves generated based on his tray. Can be used to cheat. */ - public static final int hints_allowed=0x7f0500ba; + public static final int hints_allowed=0x7f0500bd; /** clarification on hints_allowed, whether new games will default to having the hint feature enabled(string elsewhere in this file) */ - public static final int hints_allowed_sum=0x7f05011e; + public static final int hints_allowed_sum=0x7f050121; /** title of dialog brought up in response to the board_menu_game_history menu. A full history of the game up to the last turn is displayed, though details about what's in players' racks is left out if the game is not yet over. */ - public static final int history_title=0x7f05019c; + public static final int history_title=0x7f05019f; /** Partial text of alert posted when phonies_warn or phonies_disallow is the current setting and a "phony" is played. One of the two following strings will be appended */ - public static final int ids_badwords_fmt=0x7f0500e7; + public static final int ids_badwords_fmt=0x7f0500ea; /** text of confirmation dialog shown when user chooses the menu item with text board_menu_game_final and the game is not over */ - public static final int ids_endnow=0x7f05019e; + public static final int ids_endnow=0x7f0501a1; /** Title of generic dialog used to display information */ - public static final int info_title=0x7f050198; + public static final int info_title=0x7f05019b; /** */ - public static final int inform_dict_diffdict_fmt=0x7f050231; + public static final int inform_dict_diffdict_fmt=0x7f050234; /** */ - public static final int inform_dict_diffversion_fmt=0x7f05022f; - public static final int inform_dict_download=0x7f050232; - public static final int inform_dict_title=0x7f050230; + public static final int inform_dict_diffversion_fmt=0x7f050232; + public static final int inform_dict_download=0x7f050235; + public static final int inform_dict_title=0x7f050233; /** Will new games, on default, randomly rearrange the start order of players. */ - public static final int init_autojuggle=0x7f050120; + public static final int init_autojuggle=0x7f050123; /** clarification on above */ - public static final int init_autojuggle_sum=0x7f050121; + public static final int init_autojuggle_sum=0x7f050124; /** default number of minutes on timer for new games */ - public static final int initial_player_minutes=0x7f050123; - public static final int invite_choice_bt=0x7f050168; - public static final int invite_choice_email=0x7f050167; - public static final int invite_choice_nfc=0x7f050169; + public static final int initial_player_minutes=0x7f050126; + public static final int invite_choice_bt=0x7f05016b; + public static final int invite_choice_email=0x7f05016a; + public static final int invite_choice_nfc=0x7f05016c; /** EXPLAIN ME Bluetooth is not available. This may mean that your device doesn\'t support it, or that it\'s been @@ -1342,9 +1343,9 @@ public final class R { between html and plaintext formatting but I also provide some explanation/guidance. */ - public static final int invite_choice_sms=0x7f050166; - public static final int invite_choice_title=0x7f05016a; - public static final int invite_chooser_email=0x7f05016f; + public static final int invite_choice_sms=0x7f050169; + public static final int invite_choice_title=0x7f05016d; + public static final int invite_chooser_email=0x7f050172; /** When I've created the invitation, in text or html, I ask Android to launch an app that can send it, typically an email or messaging app. Android then asks the user to choose which @@ -1352,38 +1353,38 @@ public final class R { to have launched. This string is passed to Android and used as the title of the dialog that presents that choice. */ - public static final int invite_chooser_fmt=0x7f05016e; - public static final int invite_chooser_sms=0x7f050170; - public static final int invite_dict_missing_body_fmt=0x7f050237; - public static final int invite_dict_missing_body_noname_fmt=0x7f050238; - public static final int invite_dict_missing_title=0x7f050236; - public static final int invite_host=0x7f050075; + public static final int invite_chooser_fmt=0x7f050171; + public static final int invite_chooser_sms=0x7f050173; + public static final int invite_dict_missing_body_fmt=0x7f05023a; + public static final int invite_dict_missing_body_noname_fmt=0x7f05023b; + public static final int invite_dict_missing_title=0x7f050239; + public static final int invite_host=0x7f050078; /** This is the body of the html version of the invitation. A URL is created with parameters describing the game and substituted for "%1$s". (The funky \u003c and friends are encodings for the greater-than and less-than symbols which are not legal in xml strings.) */ - public static final int invite_htm_fmt=0x7f05016c; + public static final int invite_htm_fmt=0x7f05016f; /** Appended to message above if local device has NFC available */ - public static final int invite_if_nfc=0x7f0500dd; - public static final int invite_mime=0x7f050077; - public static final int invite_multi_summary=0x7f0502b9; - public static final int invite_multi_title=0x7f0502b8; + public static final int invite_if_nfc=0x7f0500e0; + public static final int invite_mime=0x7f05007a; + public static final int invite_multi_summary=0x7f0502bc; + public static final int invite_multi_title=0x7f0502bb; /** Most users create games with only two players, which is the default, but Crosswords supports up to four. When I'm using the above string to encourage the opener of a game missing players to invite, IF the number of missing players is greater than one this text is appended to the above. */ - public static final int invite_multiple=0x7f0500de; - public static final int invite_prefix=0x7f050076; - public static final int invite_progress_fmt=0x7f0501e1; + public static final int invite_multiple=0x7f0500e1; + public static final int invite_prefix=0x7f050079; + public static final int invite_progress_fmt=0x7f0501e4; /** */ - public static final int invite_progress_title=0x7f0501e0; - public static final int invite_stays=0x7f0502c0; + public static final int invite_progress_title=0x7f0501e3; + public static final int invite_stays=0x7f0502c3; /** Send invitation using SMS (texting) or via email? Send invitation using NFC (Android @@ -1399,25 +1400,25 @@ public final class R { This is the subject line of the email/text sent to invite someone to join a game. */ - public static final int invite_subject_fmt=0x7f05016b; + public static final int invite_subject_fmt=0x7f05016e; /** This is the body of the text version of the invitation. A URL is created with parameters describing the game and substituted for "%1$s". */ - public static final int invite_txt_fmt=0x7f05016d; + public static final int invite_txt_fmt=0x7f050170; /** text of checkbox asking if user wants to search for open public rooms */ - public static final int join_room=0x7f0500b3; + public static final int join_room=0x7f0500b6; /** Checkbox that when set keeps the device screen from dimming if the board screen is what's displayed. This is to allow users to think about a move without having to touch the screen all the time. */ - public static final int keep_screenon=0x7f050132; + public static final int keep_screenon=0x7f050135; /** clarification of above */ - public static final int keep_screenon_summary=0x7f050133; + public static final int keep_screenon_summary=0x7f050136; public static final int key_addrs_pref=0x7f05003e; public static final int key_background=0x7f05001a; public static final int key_board_size=0x7f050029; @@ -1428,7 +1429,7 @@ public final class R { /** the color of text, e.g. "2L", shown on a bonus square on the board */ - public static final int key_bonushint=0x7f05013e; + public static final int key_bonushint=0x7f050141; public static final int key_bt_addrs=0x7f050040; /** database keys whose entries aren't visible prefs */ @@ -1478,6 +1479,9 @@ public final class R { public static final int key_logging_on=0x7f050024; public static final int key_na_browse=0x7f050061; public static final int key_na_browseall=0x7f050062; + public static final int key_na_comms_bt=0x7f050072; + public static final int key_na_comms_relay=0x7f050074; + public static final int key_na_comms_sms=0x7f050073; public static final int key_na_dicts=0x7f050066; public static final int key_na_fmt_expl=0x7f050065; public static final int key_na_lookup=0x7f050060; @@ -1545,165 +1549,165 @@ public final class R { for networked games (where players aren't allowed to have different wordlists.) */ - public static final int lang_label=0x7f0500b0; - public static final int lang_name_arabic=0x7f050280; - public static final int lang_name_catalan=0x7f050287; - public static final int lang_name_czech=0x7f05028a; - public static final int lang_name_danish=0x7f050284; - public static final int lang_name_dutch=0x7f050286; - public static final int lang_name_english=0x7f05027c; - public static final int lang_name_french=0x7f05027d; - public static final int lang_name_german=0x7f05027e; - public static final int lang_name_greek=0x7f05028b; - public static final int lang_name_italian=0x7f050285; - public static final int lang_name_polish=0x7f050283; - public static final int lang_name_portuguese=0x7f050288; - public static final int lang_name_russian=0x7f050289; - public static final int lang_name_slovak=0x7f05028c; - public static final int lang_name_spanish=0x7f050281; - public static final int lang_name_swedish=0x7f050282; - public static final int lang_name_turkish=0x7f05027f; - public static final int lang_unknown=0x7f05029f; - public static final int langdict_label=0x7f0500b1; - public static final int list_group_default=0x7f050242; - public static final int list_group_delete=0x7f050240; - public static final int list_group_movedown=0x7f050244; - public static final int list_group_moveup=0x7f050243; - public static final int list_group_rename=0x7f050241; + public static final int lang_label=0x7f0500b3; + public static final int lang_name_arabic=0x7f050283; + public static final int lang_name_catalan=0x7f05028a; + public static final int lang_name_czech=0x7f05028d; + public static final int lang_name_danish=0x7f050287; + public static final int lang_name_dutch=0x7f050289; + public static final int lang_name_english=0x7f05027f; + public static final int lang_name_french=0x7f050280; + public static final int lang_name_german=0x7f050281; + public static final int lang_name_greek=0x7f05028e; + public static final int lang_name_italian=0x7f050288; + public static final int lang_name_polish=0x7f050286; + public static final int lang_name_portuguese=0x7f05028b; + public static final int lang_name_russian=0x7f05028c; + public static final int lang_name_slovak=0x7f05028f; + public static final int lang_name_spanish=0x7f050284; + public static final int lang_name_swedish=0x7f050285; + public static final int lang_name_turkish=0x7f050282; + public static final int lang_unknown=0x7f0502a2; + public static final int langdict_label=0x7f0500b4; + public static final int list_group_default=0x7f050245; + public static final int list_group_delete=0x7f050243; + public static final int list_group_movedown=0x7f050247; + public static final int list_group_moveup=0x7f050246; + public static final int list_group_rename=0x7f050244; /** ############## menu items ############## pulls up dialog to configure the selected game */ - public static final int list_item_config=0x7f05008f; + public static final int list_item_config=0x7f050092; /** makes a copy of the selected game. This is currently disabled for networked games since there would be problems if two identically configured games started trying to talk to a remote game that expected there was only one of them. */ - public static final int list_item_copy=0x7f050095; + public static final int list_item_copy=0x7f050098; /** pulls up dialog to delete the selected game */ - public static final int list_item_delete=0x7f050092; + public static final int list_item_delete=0x7f050095; /** pulls up dialog to change the group of the selected game */ - public static final int list_item_move=0x7f050091; + public static final int list_item_move=0x7f050094; /** creates a new game with all configuation copied from the selected game */ - public static final int list_item_new_from=0x7f050094; + public static final int list_item_new_from=0x7f050097; /** pulls up dialog to rename (change name of) the selected game */ - public static final int list_item_rename=0x7f050090; + public static final int list_item_rename=0x7f050093; /** pulls up dialog to reset the selected game, that is to remove all moves so that it's the same as a newly created game except for any configuration. */ - public static final int list_item_reset=0x7f050093; + public static final int list_item_reset=0x7f050096; /** formatting for last move summary in notifications */ - public static final int lmi_pass_fmt=0x7f0502a7; - public static final int lmi_phony_fmt=0x7f0502a8; - public static final int lmi_tiles_fmt=0x7f0502a9; + public static final int lmi_pass_fmt=0x7f0502aa; + public static final int lmi_phony_fmt=0x7f0502ab; + public static final int lmi_tiles_fmt=0x7f0502ac; /** One of the strings used in the right column of the list of installed wordlists to describe those that are part of Crosswords and that cannot be uninstalled or moved. loc_internal and loc_external are the other possible strings in this column. */ - public static final int loc_builtin=0x7f05009c; + public static final int loc_builtin=0x7f05009f; /** Used to describe wordlists that are in the Downloads directory. Currently I don't look there so this is unused, but I will eventually do so. This should be the same name as the built-in Android web browser uses for the directory where it saves files it downloads. */ - public static final int loc_downloads=0x7f05009d; + public static final int loc_downloads=0x7f0500a0; /** */ - public static final int loc_external=0x7f0500a7; - public static final int loc_filters_all=0x7f050278; - public static final int loc_filters_menu=0x7f05027a; - public static final int loc_filters_modified=0x7f05027b; - public static final int loc_filters_prompt=0x7f050276; - public static final int loc_filters_screen=0x7f050279; - public static final int loc_fmts_mismatch=0x7f050291; + public static final int loc_external=0x7f0500aa; + public static final int loc_filters_all=0x7f05027b; + public static final int loc_filters_menu=0x7f05027d; + public static final int loc_filters_modified=0x7f05027e; + public static final int loc_filters_prompt=0x7f050279; + public static final int loc_filters_screen=0x7f05027c; + public static final int loc_fmts_mismatch=0x7f050294; /** see move_dictf above */ - public static final int loc_internal=0x7f0500a6; - public static final int loc_item_check=0x7f05028e; + public static final int loc_internal=0x7f0500a9; + public static final int loc_item_check=0x7f050291; /** for loc item edit menu */ - public static final int loc_item_clear=0x7f05028d; - public static final int loc_item_copy_bless=0x7f050290; - public static final int loc_item_copy_eng=0x7f05028f; - public static final int loc_lang_blessed=0x7f050271; - public static final int loc_lang_local=0x7f050272; - public static final int loc_menu_xlate=0x7f050270; - public static final int loc_search_prompt=0x7f050277; + public static final int loc_item_clear=0x7f050290; + public static final int loc_item_copy_bless=0x7f050293; + public static final int loc_item_copy_eng=0x7f050292; + public static final int loc_lang_blessed=0x7f050274; + public static final int loc_lang_local=0x7f050275; + public static final int loc_menu_xlate=0x7f050273; + public static final int loc_search_prompt=0x7f05027a; /** This is the "hint" printed in light text in the empty player name field */ - public static final int local_name_hint=0x7f050176; - public static final int logging_on=0x7f0502d0; - public static final int logging_on_summary=0x7f0502d1; - public static final int lookup_title=0x7f05026c; + public static final int local_name_hint=0x7f050179; + public static final int logging_on=0x7f0502d3; + public static final int logging_on_summary=0x7f0502d4; + public static final int lookup_title=0x7f05026f; /** */ - public static final int manual_owner_name=0x7f0501fa; + public static final int manual_owner_name=0x7f0501fd; /** */ - public static final int max_len=0x7f0501d7; + public static final int max_len=0x7f0501da; /** */ - public static final int menu_chat=0x7f05020a; + public static final int menu_chat=0x7f05020d; /** */ - public static final int menu_flip=0x7f050208; + public static final int menu_flip=0x7f05020b; /** */ - public static final int menu_hint_next=0x7f050205; + public static final int menu_hint_next=0x7f050208; /** */ - public static final int menu_hint_prev=0x7f050204; + public static final int menu_hint_prev=0x7f050207; /** */ - public static final int menu_juggle=0x7f050207; + public static final int menu_juggle=0x7f05020a; /** text of menu that brings up the Settings (preferences) dialog */ - public static final int menu_prefs=0x7f050089; - public static final int menu_rateme=0x7f05025e; + public static final int menu_prefs=0x7f05008c; + public static final int menu_rateme=0x7f050261; /** */ - public static final int menu_toggle_values=0x7f05020b; + public static final int menu_toggle_values=0x7f05020e; /** */ - public static final int menu_zoom=0x7f050209; + public static final int menu_zoom=0x7f05020c; /** */ - public static final int min_len=0x7f0501d6; + public static final int min_len=0x7f0501d9; /** label for the field used to set the timer's inital value */ - public static final int minutes_label=0x7f0500bd; + public static final int minutes_label=0x7f0500c0; /** body of notification shown when invitation requires a wordslist that's not installed */ - public static final int missing_dict_detail=0x7f050235; + public static final int missing_dict_detail=0x7f050238; /** Title of notification shown when invitation requires a wordslist that's not installed */ - public static final int missing_dict_title=0x7f050234; + public static final int missing_dict_title=0x7f050237; /** Used as a substitute for the names of remote players when they aren't available yet because the connection is not complete. Displayed in the lists of players found in each game listing. */ - public static final int missing_player=0x7f050080; + public static final int missing_player=0x7f050083; /** When the dicts_item_move menu is chosen, this text is used in the confirmation dialog. The name of the selected wordlist is substituted for %1$s. The strings loc_internal and loc_internal are substitued for %2$s and %3$s (or vice-versa, depending on the current location of the wordlist.) */ - public static final int move_dict_fmt=0x7f0500a5; + public static final int move_dict_fmt=0x7f0500a8; /** ############################################################ # :Dialogs: @@ -1716,7 +1720,7 @@ public final class R { Text of dialog. Player name is substituted */ - public static final int msg_ask_password_fmt=0x7f05018e; + public static final int msg_ask_password_fmt=0x7f050191; /** When a game has been connected and the relay is notified that a device in the game has deleted its part of the game, this message is posted when you connect your end of it to the @@ -1724,93 +1728,93 @@ public final class R { game so you might as well delete it (unless you're saving it for its history etc.) */ - public static final int msg_dev_deleted=0x7f0500e6; + public static final int msg_dev_deleted=0x7f0500e9; /** (I believe this can no longer occur) */ - public static final int msg_dup_room=0x7f0500e4; + public static final int msg_dup_room=0x7f0500e7; /** (I believe this can no longer occur) */ - public static final int msg_lost_other=0x7f0500e5; + public static final int msg_lost_other=0x7f0500e8; /** (I believe this can no longer occur) */ - public static final int msg_no_room=0x7f0500e3; + public static final int msg_no_room=0x7f0500e6; /** Text of "toast" shown when a game is notified by the relay that all expected players have registered. At this point play can begin. */ - public static final int msg_relay_all_here_fmt=0x7f0500e0; + public static final int msg_relay_all_here_fmt=0x7f0500e3; /** (I believe this can no longer occur) */ - public static final int msg_too_many=0x7f0500e2; + public static final int msg_too_many=0x7f0500e5; /** Text of progress indicator shown while check is being conducted */ - public static final int msgs_progress=0x7f05008b; - public static final int nag_body_fmt=0x7f0502a4; - public static final int nag_intervals=0x7f0502e1; + public static final int msgs_progress=0x7f05008e; + public static final int nag_body_fmt=0x7f0502a7; + public static final int nag_intervals=0x7f0502e4; /** Nagging: title of notification reminder message */ - public static final int nag_title=0x7f0502a3; + public static final int nag_title=0x7f0502a6; /** above is inserted in this the last time I warn */ - public static final int nag_warn_last_fmt=0x7f0502a5; - public static final int name_copy_fmt=0x7f0501f4; - public static final int name_dict_fmt=0x7f0502db; - public static final int nbs_port=0x7f05007a; + public static final int nag_warn_last_fmt=0x7f0502a8; + public static final int name_copy_fmt=0x7f0501f7; + public static final int name_dict_fmt=0x7f0502de; + public static final int nbs_port=0x7f05007d; /** text of checkbox. If this checkbox is checked, games created for network play will by default have the hint feature enabled. */ - public static final int nethints_allowed=0x7f0500bb; + public static final int nethints_allowed=0x7f0500be; /** clarification on hints_allowed, whether new NETWORKED games will default to having the hint feature enabled(string elsewhere in this file) */ - public static final int nethints_allowed_sum=0x7f05011f; - public static final int netstats_title=0x7f0502d7; - public static final int network_advanced_summary=0x7f0502b7; - public static final int network_advanced_title=0x7f0502b6; - public static final int network_behavior=0x7f050150; + public static final int nethints_allowed_sum=0x7f050122; + public static final int netstats_title=0x7f0502da; + public static final int network_advanced_summary=0x7f0502ba; + public static final int network_advanced_title=0x7f0502b9; + public static final int network_behavior=0x7f050153; /** explanation of the above */ - public static final int network_behavior_summary=0x7f050151; + public static final int network_behavior_summary=0x7f050154; /** */ - public static final int new_app_avail=0x7f05022b; + public static final int new_app_avail=0x7f05022e; /** */ - public static final int new_app_avail_fmt=0x7f05022a; + public static final int new_app_avail_fmt=0x7f05022d; /** */ - public static final int new_bt_body_fmt=0x7f0501e7; + public static final int new_bt_body_fmt=0x7f0501ea; /** */ - public static final int new_bt_title=0x7f0501e6; + public static final int new_bt_title=0x7f0501e9; /** */ - public static final int new_btmove_title=0x7f0501ea; + public static final int new_btmove_title=0x7f0501ed; /** */ - public static final int new_dict_avail=0x7f050228; + public static final int new_dict_avail=0x7f05022b; /** */ - public static final int new_dict_avail_fmt=0x7f050229; - public static final int new_game=0x7f0502ae; - public static final int new_game_message=0x7f0502b0; - public static final int new_game_message_net=0x7f0502b2; - public static final int new_game_message_nodflt=0x7f0502b1; - public static final int new_game_networked=0x7f0502af; + public static final int new_dict_avail_fmt=0x7f05022c; + public static final int new_game=0x7f0502b1; + public static final int new_game_message=0x7f0502b3; + public static final int new_game_message_net=0x7f0502b5; + public static final int new_game_message_nodflt=0x7f0502b4; + public static final int new_game_networked=0x7f0502b2; /** */ - public static final int new_move_body=0x7f0501eb; + public static final int new_move_body=0x7f0501ee; /** */ - public static final int new_name_body_fmt=0x7f0501f8; + public static final int new_name_body_fmt=0x7f0501fb; /** hint (text shown when field is empty) for room name field */ - public static final int new_room_hint=0x7f0500b4; + public static final int new_room_hint=0x7f0500b7; /** */ - public static final int new_sms_title=0x7f0501f7; + public static final int new_sms_title=0x7f0501fa; /** ########################################################### # :Dialogs: @@ -1823,33 +1827,33 @@ public final class R { Title of New user info dialog */ - public static final int newbie_title=0x7f0501a0; + public static final int newbie_title=0x7f0501a3; /** section separator (white-on-gray bar) for third section: bluetooth games */ - public static final int newgame_bt_header=0x7f050165; + public static final int newgame_bt_header=0x7f050168; /** Text of second of two buttons for new standalone games. Tap this and you'll get taken to the "Game configure" screen */ - public static final int newgame_configure_first=0x7f050160; - public static final int newgame_drop_relay=0x7f050164; + public static final int newgame_configure_first=0x7f050163; + public static final int newgame_drop_relay=0x7f050167; /** Text of first of two buttons for new networked games. Tap this and a game will be created, but you probably won't see it immediately because an email or messaging app will be launched to send your invitation. */ - public static final int newgame_invite=0x7f050163; + public static final int newgame_invite=0x7f050166; /** Text of first of two buttons for new standalone games. Tap this and a new game will be created and opened. If the first player is a robot it will immediately take its turn. */ - public static final int newgame_local=0x7f05015f; + public static final int newgame_local=0x7f050162; /** This is one of two descriptions on this screen. It explains what standalone games are and describes the two buttons used to create them. The name of the language of the default wordlist is substituted in for %1$s. */ - public static final int newgame_local_desc_fmt=0x7f05015e; + public static final int newgame_local_desc_fmt=0x7f050161; /** ############################################################ # :Screens: # New game screen @@ -1863,33 +1867,33 @@ public final class R { section separator (white-on-gray bar) for first section: standalone games */ - public static final int newgame_local_header=0x7f05015d; + public static final int newgame_local_header=0x7f050160; /** This is the second of two descriptions on this screen. It explains what networked games are and describes the two buttons used to create them. */ - public static final int newgame_networked_desc=0x7f050162; + public static final int newgame_networked_desc=0x7f050165; /** section separator (white-on-gray bar) for second section: networked games */ - public static final int newgame_networked_header=0x7f050161; + public static final int newgame_networked_header=0x7f050164; /** */ - public static final int newgame_sms_header=0x7f0501f5; - public static final int newgroup_label=0x7f05023f; - public static final int nfc_just_tap=0x7f0502c1; - public static final int nfc_to_self=0x7f0502eb; + public static final int newgame_sms_header=0x7f0501f8; + public static final int newgroup_label=0x7f050242; + public static final int nfc_just_tap=0x7f0502c4; + public static final int nfc_to_self=0x7f0502ee; /** Title of dialog for renaming game (triggered by selecting list_item_rename) If you try to copy a networked game you get this error message. */ - public static final int no_copy_network=0x7f050096; + public static final int no_copy_network=0x7f050099; /** If the wordlist disappears mid-game there are no choices, just an explanation and this button, after which the game closes. */ - public static final int no_dict_finish=0x7f050187; + public static final int no_dict_finish=0x7f05018a; /** If the missing wordlist is discovered when trying to open the game, we have more options. If there's another wordlist in the same language, we can offer to substitute without needing @@ -1898,12 +1902,12 @@ public final class R { takes wordlist name and language substituted in for %1$ and %2$ */ - public static final int no_dict_fmt=0x7f050189; + public static final int no_dict_fmt=0x7f05018c; /** This is an alternative message presented when there's also the option of downloading another wordlist. Game name, wordlist name and language are substituted in. */ - public static final int no_dict_subst_fmt=0x7f05018a; + public static final int no_dict_subst_fmt=0x7f05018d; /** ############################################################ # :Dialogs: @@ -1915,26 +1919,26 @@ public final class R { title of alert */ - public static final int no_dict_title=0x7f050186; + public static final int no_dict_title=0x7f050189; /** If you click on the Play button without having entered a room name you get an alert with this error message. */ - public static final int no_empty_rooms=0x7f050178; + public static final int no_empty_rooms=0x7f05017b; /** If you choose the above option and have no networked games you get this error message */ - public static final int no_games_to_refresh=0x7f05008c; - public static final int no_market=0x7f05025f; + public static final int no_games_to_refresh=0x7f05008f; + public static final int no_market=0x7f050262; /** displayed when you long-tap a scoreboard entry and there's no most recent score to show */ - public static final int no_moves_made=0x7f0500dc; + public static final int no_moves_made=0x7f0500df; /** If the query returns no rooms, this message is displayed, with the number of players in the game and its language substituted. */ - public static final int no_name_found_fmt=0x7f0500b8; - public static final int no_relay_conn=0x7f0502fe; + public static final int no_name_found_fmt=0x7f0500bb; + public static final int no_relay_conn=0x7f050301; /** This is not currently shown Crosswords wordlists, which are just compressed lists of words plus tile information, determine @@ -1947,52 +1951,55 @@ public final class R { figuring out how to play and when you tap an empty cell the arrow appears. This explains it. */ - public static final int not_again_arrow=0x7f0501b3; - public static final int not_again_backclears=0x7f050252; + public static final int not_again_arrow=0x7f0501b6; + public static final int not_again_backclears=0x7f050255; /** */ - public static final int not_again_browse=0x7f0501d3; + public static final int not_again_browse=0x7f0501d6; /** */ - public static final int not_again_browseall=0x7f0501d4; + public static final int not_again_browseall=0x7f0501d7; /** Shown when you tap the chat button on the toolbar of the main Board screen */ - public static final int not_again_chat=0x7f0501ac; + public static final int not_again_chat=0x7f0501af; + public static final int not_again_comms_bt=0x7f05030a; + public static final int not_again_comms_relay=0x7f050308; + public static final int not_again_comms_sms=0x7f050309; /** This is shown in the Board screen when you successfully connecting a game to the relay and are the last device in the game to do so, i.e. the game is now complete and you should expect play to begin. */ - public static final int not_again_conndall=0x7f0501b2; + public static final int not_again_conndall=0x7f0501b5; /** This is shown in the Board screen when you successfully connect a game to the relay and are the first device in the game to do so. */ - public static final int not_again_conndfirst=0x7f0501b0; + public static final int not_again_conndfirst=0x7f0501b3; /** This is shown in the Board screen when you successfully connecting a game to the relay and are not the first device in the game but not the last either. So it will only occur for games with more than two devices, which are rare. */ - public static final int not_again_conndmid=0x7f0501b1; - public static final int not_again_dicts=0x7f0502a0; + public static final int not_again_conndmid=0x7f0501b4; + public static final int not_again_dicts=0x7f0502a3; /** This is shown when you choose the board_menu_done menu item. It's to let you know that there's a shortcut that does almost the same thing. */ - public static final int not_again_done=0x7f0501ae; - public static final int not_again_enablepublic=0x7f0502c7; + public static final int not_again_done=0x7f0501b1; + public static final int not_again_enablepublic=0x7f0502ca; /** Shown when you tap the flip button on the toolbar of the main Board screen */ - public static final int not_again_flip=0x7f0501a9; - public static final int not_again_fmt_expl=0x7f050292; - public static final int not_again_hidenewgamebuttons=0x7f0502be; + public static final int not_again_flip=0x7f0501ac; + public static final int not_again_fmt_expl=0x7f050295; + public static final int not_again_hidenewgamebuttons=0x7f0502c1; /** Shown when you tap the next hint button on the toolbar of the main Board screen */ - public static final int not_again_hintnext=0x7f0501a7; + public static final int not_again_hintnext=0x7f0501aa; /** Currently not used The new game you have created has two players. Player 1 is a robot; Player 2 is you. Tap the game @@ -2001,75 +2008,75 @@ public final class R { Shown when you tap the Previous Hint button on the toolbar of the main Board screen */ - public static final int not_again_hintprev=0x7f0501a6; + public static final int not_again_hintprev=0x7f0501a9; /** Shown when you tap the juggle button on the toolbar of the main Board screen */ - public static final int not_again_juggle=0x7f0501a8; + public static final int not_again_juggle=0x7f0501ab; /** */ - public static final int not_again_lookup=0x7f0501c9; + public static final int not_again_lookup=0x7f0501cc; /** Shown when you first pick the list_item_new_from menuitem */ - public static final int not_again_newfrom=0x7f0501b5; - public static final int not_again_newselect=0x7f050251; - public static final int not_again_studycopy=0x7f05026b; + public static final int not_again_newfrom=0x7f0501b8; + public static final int not_again_newselect=0x7f050254; + public static final int not_again_studycopy=0x7f05026e; /** The following strings (all whose names start with "not_again") appear in the New user info dialog. shown when user chooses the gamel_menu_checkmoves menu */ - public static final int not_again_sync=0x7f0501a2; + public static final int not_again_sync=0x7f0501a5; /** Shown when the user chooses the "board_menu_trade" menu */ - public static final int not_again_trading=0x7f0501a3; - public static final int not_again_trading_buttons=0x7f0501a4; - public static final int not_again_trading_menu=0x7f0501a5; + public static final int not_again_trading=0x7f0501a6; + public static final int not_again_trading_buttons=0x7f0501a7; + public static final int not_again_trading_menu=0x7f0501a8; /** Shown when the board screen is visible and it's just become another players turn. The idea is to give a hint about how to find out about recent moves. */ - public static final int not_again_turnchanged=0x7f0501b4; + public static final int not_again_turnchanged=0x7f0501b7; /** Shown when you tap the undo/redo button on the toolbar of the main Board screen */ - public static final int not_again_undo=0x7f0501ab; + public static final int not_again_undo=0x7f0501ae; /** Shown in the Game configure screen when the game_locked checkbox is checked and you uncheck it. */ - public static final int not_again_unlock=0x7f0501af; + public static final int not_again_unlock=0x7f0501b2; /** Shown when you tap the values button on the toolbar of the main Board screen. This is intended to allow players to remind themselves how much played tiles are worth while planning a move. */ - public static final int not_again_values=0x7f0501ad; + public static final int not_again_values=0x7f0501b0; /** Shown when you tap the zoom (+/-) button on the toolbar of the main Board screen */ - public static final int not_again_zoom=0x7f0501aa; - public static final int note_none=0x7f05029c; + public static final int not_again_zoom=0x7f0501ad; + public static final int note_none=0x7f05029f; /** This text is displayed as the "summary" for both of the notify choices above, as extra information. (There could be different strings if it makes more sense in your language.) */ - public static final int notify_other_summary=0x7f05015c; + public static final int notify_other_summary=0x7f05015f; /** When one or more new moves is found, should I play a notification sound */ - public static final int notify_sound=0x7f05015a; + public static final int notify_sound=0x7f05015d; /** When a move is fetched from the relay a Notification is posted. These are its title, which appears in the top bar of the device, and the body that appears when you pull the notifications down. */ - public static final int notify_title_fmt=0x7f050191; + public static final int notify_title_fmt=0x7f050194; /** When one or more new moves is found, should I vibrate the device */ - public static final int notify_vibrate=0x7f05015b; - public static final int nplayers_prompt=0x7f0502b4; + public static final int notify_vibrate=0x7f05015e; + public static final int nplayers_prompt=0x7f0502b7; /** text of label identifying the field where human players can enter an option password. The label and field disappear when the robot player checkbox is checked because it makes no @@ -2078,13 +2085,13 @@ public final class R { player on a device, so they are infrequently used in network games as well. */ - public static final int password_label=0x7f0500d4; + public static final int password_label=0x7f0500d7; /** You have NFC enabled. That means that any time a board that\'s missing a player is open, you can tap a nearby person\'s device to invite him/her to play – if he/she is also using NFC. */ - public static final int pct_suffix=0x7f05025d; + public static final int pct_suffix=0x7f050260; /** If this preference is checked, tapping on the scoreboard entry for any player reveals that player's tiles and any pending move (after asking for his password if one is set.) @@ -2094,41 +2101,41 @@ public final class R { though it's not his turn e.g. while the player whose turn it is is temporarily unable to play. */ - public static final int peek_other=0x7f05014c; + public static final int peek_other=0x7f05014f; /** explanation of the above */ - public static final int peek_other_summary=0x7f05014d; + public static final int peek_other_summary=0x7f050150; /** */ - public static final int phone_label=0x7f050200; + public static final int phone_label=0x7f050203; /** Don't warn, but simply force to skip turn (give 0 points) when user attempts to play word not in the wordlist. */ - public static final int phonies_disallow=0x7f0500c5; + public static final int phonies_disallow=0x7f0500c8; /** These are the three choices in the popup above whose text is phonies_spinner_prompt Don't care if words played are in the wordlist or not */ - public static final int phonies_ignore=0x7f0500c3; + public static final int phonies_ignore=0x7f0500c6; /** title of popup used to determine how words are handled that are not in the wordlist used for the game (or player if using different wordlists per player) */ - public static final int phonies_spinner_prompt=0x7f0500c2; + public static final int phonies_spinner_prompt=0x7f0500c5; /** warn player when word played is not in the wordlist, but allow him to play it. */ - public static final int phonies_warn=0x7f0500c4; + public static final int phonies_warn=0x7f0500c7; /** */ - public static final int pick_faceup=0x7f0501d1; + public static final int pick_faceup=0x7f0501d4; /** */ - public static final int pick_url_title_fmt=0x7f0501c7; + public static final int pick_url_title_fmt=0x7f0501ca; /** Text of button at bottom. Press it and you exit this configure screen and open the game into the Board screen */ - public static final int play=0x7f0500ca; + public static final int play=0x7f0500cd; /** ############################################################ # :Dialogs: @@ -2140,47 +2147,47 @@ public final class R { dialog title */ - public static final int player_edit_title=0x7f0500ce; + public static final int player_edit_title=0x7f0500d1; /** used to create default player names. Number between 1 and 4 is substituted */ - public static final int player_fmt=0x7f050190; + public static final int player_fmt=0x7f050193; /** text of lable identifying the field in which player's name is set/displayed */ - public static final int player_label=0x7f0500d0; + public static final int player_label=0x7f0500d3; /** text for separator above the list of players that's used for networked games. The numbers of local and non-local players are substituted for %1$d and %2$d. */ - public static final int players_label_host_fmt=0x7f0500ad; + public static final int players_label_host_fmt=0x7f0500b0; /** text for separator above the list of players that's used for non-networked games */ - public static final int players_label_standalone=0x7f0500ac; - public static final int pref_group_l10n_summary=0x7f0502f7; - public static final int pref_group_l10n_title=0x7f0502f6; - public static final int pref_group_relay_summary=0x7f0502f5; - public static final int pref_group_relay_title=0x7f0502f4; - public static final int pref_group_sms_summary=0x7f0502f3; - public static final int pref_group_sms_title=0x7f0502f2; + public static final int players_label_standalone=0x7f0500af; + public static final int pref_group_l10n_summary=0x7f0502fa; + public static final int pref_group_l10n_title=0x7f0502f9; + public static final int pref_group_relay_summary=0x7f0502f8; + public static final int pref_group_relay_title=0x7f0502f7; + public static final int pref_group_sms_summary=0x7f0502f6; + public static final int pref_group_sms_title=0x7f0502f5; /** Label for the first "human player" name preference */ - public static final int pref_human_name=0x7f050118; - public static final int pref_item_update_summary=0x7f0502f9; - public static final int pref_item_update_title=0x7f0502f8; + public static final int pref_human_name=0x7f05011b; + public static final int pref_item_update_summary=0x7f0502fc; + public static final int pref_item_update_title=0x7f0502fb; /** Label for the first player color preference */ - public static final int pref_player1_name=0x7f050114; + public static final int pref_player1_name=0x7f050117; /** Label for the second player color preference */ - public static final int pref_player2_name=0x7f050115; + public static final int pref_player2_name=0x7f050118; /** Label for the third player color preference */ - public static final int pref_player3_name=0x7f050116; + public static final int pref_player3_name=0x7f050119; /** Label for the fourth player color preference */ - public static final int pref_player4_name=0x7f050117; + public static final int pref_player4_name=0x7f05011a; /** ############################################################ # :Screens: @@ -2189,10 +2196,10 @@ public final class R { title of this sub-preference */ - public static final int prefs_appearance=0x7f050125; + public static final int prefs_appearance=0x7f050128; /** clarification of the above */ - public static final int prefs_appearance_summary=0x7f050126; + public static final int prefs_appearance_summary=0x7f050129; /** ############################################################ # :Screens: @@ -2201,10 +2208,10 @@ public final class R { title of this sub-preference */ - public static final int prefs_behavior=0x7f050142; + public static final int prefs_behavior=0x7f050145; /** clarification of the above */ - public static final int prefs_behavior_summary=0x7f050143; + public static final int prefs_behavior_summary=0x7f050146; /** ############################################################ # :Screens: @@ -2214,10 +2221,10 @@ public final class R { title of this sub-preference */ - public static final int prefs_colors=0x7f050134; + public static final int prefs_colors=0x7f050137; /** clarification of the above */ - public static final int prefs_colors_summary=0x7f050135; + public static final int prefs_colors_summary=0x7f050138; /** ############################################################ # :Screens: @@ -2226,53 +2233,53 @@ public final class R { title of this sub-preference */ - public static final int prefs_defaults=0x7f050110; + public static final int prefs_defaults=0x7f050113; /** clarification of the above */ - public static final int prefs_defaults_summary=0x7f050111; + public static final int prefs_defaults_summary=0x7f050114; /** sub-preference for dictionaries (soon to be called "word lists") */ - public static final int prefs_dicts=0x7f05011a; + public static final int prefs_dicts=0x7f05011d; /** clarification of above */ - public static final int prefs_dicts_summary=0x7f05011b; + public static final int prefs_dicts_summary=0x7f05011e; /** sub-preference title for editing default player names. There's only enabled now, though. */ - public static final int prefs_names=0x7f050112; + public static final int prefs_names=0x7f050115; /** clarification of the above */ - public static final int prefs_names_summary=0x7f050113; + public static final int prefs_names_summary=0x7f050116; /** Used when prev player's name can't be looked up */ - public static final int prev_player=0x7f0502a6; - public static final int progress_title=0x7f05029a; + public static final int prev_player=0x7f0502a9; + public static final int progress_title=0x7f05029d; /** */ - public static final int prompt_max_len=0x7f0501d9; + public static final int prompt_max_len=0x7f0501dc; /** */ - public static final int prompt_min_len=0x7f0501d8; - public static final int proxy_port=0x7f0502da; + public static final int prompt_min_len=0x7f0501db; + public static final int proxy_port=0x7f0502dd; /** Short for "points", this is shown at the right end of the tray in place of the first tile placed along with the points the current move would earn if committed. */ - public static final int pts=0x7f0500df; + public static final int pts=0x7f0500e2; /** If you check the join_room checkbox Crosswords queries the relay. This is the text of the progress indicator displayed what that's going on. (It's often visible for only a very short time.) */ - public static final int public_names_progress_fmt=0x7f0500b7; + public static final int public_names_progress_fmt=0x7f0500ba; /** Title for generic dialog asking a question, usually in the middle of a game, like "do you want to commit this move?" */ - public static final int query_title=0x7f05019f; - public static final int radio_name_cdma=0x7f0502ea; - public static final int radio_name_gsm=0x7f0502e9; - public static final int radio_name_real=0x7f0502e7; - public static final int radio_name_tablet=0x7f0502e8; + public static final int query_title=0x7f0501a2; + public static final int radio_name_cdma=0x7f0502ed; + public static final int radio_name_gsm=0x7f0502ec; + public static final int radio_name_real=0x7f0502ea; + public static final int radio_name_tablet=0x7f0502eb; /** ############################################################ # :Dialogs: @@ -2285,71 +2292,71 @@ public final class R { Names of the three colors by which colors can be edited in the color preferences dialog */ - public static final int red=0x7f05013f; - public static final int redir_host=0x7f0502ce; + public static final int red=0x7f050142; + public static final int redir_host=0x7f0502d1; /** Title of dialog used to alert players to relay-related problems with the current game. */ - public static final int relay_alert=0x7f0500e1; - public static final int relay_alert_title=0x7f050250; - public static final int relay_host=0x7f0502cd; - public static final int relay_port=0x7f0502d9; + public static final int relay_alert=0x7f0500e4; + public static final int relay_alert_title=0x7f050253; + public static final int relay_host=0x7f0502d0; + public static final int relay_port=0x7f0502dc; /** Shown in toast when relaunching after switching dicts */ - public static final int reload_new_dict_fmt=0x7f050233; - public static final int rematch_msg=0x7f0502c6; - public static final int remote_digesting=0x7f050294; - public static final int remote_empty=0x7f050293; + public static final int reload_new_dict_fmt=0x7f050236; + public static final int rematch_msg=0x7f0502c9; + public static final int remote_digesting=0x7f050297; + public static final int remote_empty=0x7f050296; /** checkbox determining of this player is on this device or remote. If remote, then the rest of the fields disappear (since they will be set by the remote device.) */ - public static final int remote_label=0x7f0500cf; - public static final int remote_no_net=0x7f050295; + public static final int remote_label=0x7f0500d2; + public static final int remote_no_net=0x7f050298; /** */ - public static final int remote_undone=0x7f050203; - public static final int rename_group_label=0x7f050247; + public static final int remote_undone=0x7f050206; + public static final int rename_group_label=0x7f05024a; /** text within rename dialog (triggered by selecting list_item_rename) */ - public static final int rename_label=0x7f050098; - public static final int rename_label_caveat=0x7f050099; + public static final int rename_label=0x7f05009b; + public static final int rename_label_caveat=0x7f05009c; /** if this preference is checked, the hardware volume keys will work to zoom the board in and out (and will not control volume) This only applies when the Board screen is frontmost. */ - public static final int ringer_zoom=0x7f05014a; + public static final int ringer_zoom=0x7f05014d; /** explanation of the above */ - public static final int ringer_zoom_summary=0x7f05014b; + public static final int ringer_zoom_summary=0x7f05014e; /** checkbox determining if player is robot/automated or human */ - public static final int robot_label=0x7f0500d3; + public static final int robot_label=0x7f0500d6; /** Used to format robot player names in the lists of players found in each game listing */ - public static final int robot_name_fmt=0x7f05007f; + public static final int robot_name_fmt=0x7f050082; /** Three possible choices presented in the popup above */ - public static final int robot_smart=0x7f0500bf; - public static final int robot_smarter=0x7f0500c0; - public static final int robot_smartest=0x7f0500c1; + public static final int robot_smart=0x7f0500c2; + public static final int robot_smarter=0x7f0500c3; + public static final int robot_smartest=0x7f0500c4; /** title of popup used to select how "smart" (how capable) the robot player will be. */ - public static final int robot_spinner_prompt=0x7f0500be; + public static final int robot_spinner_prompt=0x7f0500c1; /** text of checkbox */ - public static final int room_public=0x7f0500b5; + public static final int room_public=0x7f0500b8; /** title for popup of public rooms found on server */ - public static final int room_public_prompt=0x7f0500b6; - public static final int seeking_relay=0x7f0502fd; - public static final int sel_games_fmt=0x7f050253; - public static final int sel_groups_fmt=0x7f050254; - public static final int sel_items_fmt=0x7f05026f; + public static final int room_public_prompt=0x7f0500b9; + public static final int seeking_relay=0x7f050300; + public static final int sel_games_fmt=0x7f050256; + public static final int sel_groups_fmt=0x7f050257; + public static final int sel_items_fmt=0x7f050272; /** ############################################################ # :Dialogs: @@ -2360,59 +2367,59 @@ public final class R { up when the dicts_item_select menuitem is chosen. The possible answers are the three button text strings below. */ - public static final int set_default_message_fmt=0x7f0500a1; - public static final int set_pref=0x7f0502bd; + public static final int set_default_message_fmt=0x7f0500a4; + public static final int set_pref=0x7f0502c0; /** text of separator marking out other-setting area of the dialog */ - public static final int settings_label=0x7f0500b9; + public static final int settings_label=0x7f0500bc; /** Checkbox that when set makes taps on the board manipulate an arrow that then directs where tiles go when tapped in the tray. */ - public static final int show_arrow=0x7f050130; + public static final int show_arrow=0x7f050133; /** clarification of above */ - public static final int show_arrow_summary=0x7f050131; - public static final int show_remote=0x7f050298; - public static final int show_wordlist_browser=0x7f05024f; + public static final int show_arrow_summary=0x7f050134; + public static final int show_remote=0x7f05029b; + public static final int show_wordlist_browser=0x7f050252; /** If this preference is checked, the user will not be asked to confirm after selecting the "Turn done" menu (or tapping the points display at the right end of the tray) */ - public static final int skip_confirm_turn=0x7f050146; + public static final int skip_confirm_turn=0x7f050149; /** explanation of the above */ - public static final int skip_confirm_turn_summary=0x7f050147; - public static final int slmenu_clear_sel=0x7f050265; - public static final int slmenu_copy_sel=0x7f050264; - public static final int slmenu_deselect_all=0x7f05026e; - public static final int slmenu_select_all=0x7f05026d; - public static final int sms_bad_proto_fmt=0x7f0501e9; + public static final int skip_confirm_turn_summary=0x7f05014a; + public static final int slmenu_clear_sel=0x7f050268; + public static final int slmenu_copy_sel=0x7f050267; + public static final int slmenu_deselect_all=0x7f050271; + public static final int slmenu_select_all=0x7f050270; + public static final int sms_bad_proto_fmt=0x7f0501ec; /** Title of phone number picker during invitation to a game via SMS */ - public static final int sms_invite_title=0x7f0501f0; - public static final int sms_ready_text=0x7f05025c; - public static final int square_tiles=0x7f05024c; - public static final int square_tiles_summary=0x7f05024d; + public static final int sms_invite_title=0x7f0501f3; + public static final int sms_ready_text=0x7f05025f; + public static final int square_tiles=0x7f05024f; + public static final int square_tiles_summary=0x7f050250; /** Used in formatting moves and history */ - public static final int str_bonus_all=0x7f050108; + public static final int str_bonus_all=0x7f05010b; /** Using the hint feature is cheating by some players, and it can be disabled via the hints_allowed preference. I should be disabling the buttons in this case, but if I don't and you try to get a hint you'll get this message instead. */ - public static final int str_cant_hint_while_disabled=0x7f050182; + public static final int str_cant_hint_while_disabled=0x7f050185; /** Displayed if you try to use the undo menuitem or button and there are no tiles on the board (no move has yet been made.) [If I'm being clever and disabling those features in this case there may be no way to see this.] */ - public static final int str_cant_undo_tileassign=0x7f050181; + public static final int str_cant_undo_tileassign=0x7f050184; /** Beginning of the message presented to a user when asking him to confirm committing the current turn */ - public static final int str_commit_confirm=0x7f050105; + public static final int str_commit_confirm=0x7f050108; /** Used to format game name plus some other information as the one-line summary for each game in the main screen. The name of the game is substituted for %1$s. Something else @@ -2420,16 +2427,16 @@ public final class R { does not require translation unless the parentheses or ordering is wrong for your language. */ - public static final int str_game_name_fmt=0x7f05007e; + public static final int str_game_name_fmt=0x7f050081; /** Displayed when you try to commit a turn that is illegal because there is empty space between some of the tiles placed, i.e. they do not form a single word. */ - public static final int str_no_empties_in_turn=0x7f05017a; + public static final int str_no_empties_in_turn=0x7f05017d; /** Same as above, but used when you try to show tiles belonging to a player on another device (a remote player.) */ - public static final int str_no_peek_remote_tiles=0x7f05017f; + public static final int str_no_peek_remote_tiles=0x7f050182; /** Displayed when you try to reveal a robot player's tiles, either by tapping on its "hidden" rack (marked by "?" characters) or by tapping on its scoreboard entry. (The @@ -2437,28 +2444,28 @@ public final class R { controlled by the peek_other preference and is disabled by default.) */ - public static final int str_no_peek_robot_tiles=0x7f05017e; + public static final int str_no_peek_robot_tiles=0x7f050181; /** Used, with remote player's name substituted for %1$s, to indicate that the player is remote. */ - public static final int str_nonlocal_name_fmt=0x7f050106; + public static final int str_nonlocal_name_fmt=0x7f050109; /** Displyed when you try to commit a move and it's not your turn. */ - public static final int str_not_your_turn=0x7f05017d; + public static final int str_not_your_turn=0x7f050180; /** Used in formatting game history and move summaries */ - public static final int str_pass=0x7f0500ff; + public static final int str_pass=0x7f050102; /** Used to alert user to loss of turn when a move is made and phonies is set to lose turn when word used not in wordlist */ - public static final int str_phony_rejected=0x7f050104; - public static final int str_placer_fmt=0x7f05022e; + public static final int str_phony_rejected=0x7f050107; + public static final int str_placer_fmt=0x7f050231; /** Shown when using the the Game configure screen to configure a networked game and you try to make all players local. */ - public static final int str_reg_server_sans_remote=0x7f0500c6; + public static final int str_reg_server_sans_remote=0x7f0500c9; /** This error message is shown when a remote device tries to join a game and is providing more players than that game expects. I do not believe it is possible to see this message @@ -2466,11 +2473,11 @@ public final class R { many players are expected and only connects devices where the numbers match. */ - public static final int str_reg_unexpected_user=0x7f050183; + public static final int str_reg_unexpected_user=0x7f050186; /** Used in formatting remote player move summaries */ - public static final int str_remote_moved_fmt=0x7f0500fd; - public static final int str_resigned_fmt=0x7f05022d; + public static final int str_remote_moved_fmt=0x7f050100; + public static final int str_resigned_fmt=0x7f050230; /** ############################################################ # Board info/error dialog messages @@ -2481,18 +2488,18 @@ public final class R { Notifies user of a normal robot move */ - public static final int str_robot_moved_fmt=0x7f0500f7; + public static final int str_robot_moved_fmt=0x7f0500fa; /** Shown when a remote device tries to join a game and wants to play in a different language. As with the above, this should be impossible when connecting via the relay. */ - public static final int str_server_dict_wins=0x7f050184; + public static final int str_server_dict_wins=0x7f050187; /** Displayed when you try to commit a turn that is illegal because tiles played do not touch other tiles already on the board (or the middle/star square in the case of the initial move.) */ - public static final int str_tiles_must_contact=0x7f05017c; + public static final int str_tiles_must_contact=0x7f05017f; /** error messages @@ -2500,71 +2507,71 @@ public final class R { because the tiles placed are not all in the same row or column. */ - public static final int str_tiles_not_in_line=0x7f050179; + public static final int str_tiles_not_in_line=0x7f05017c; /** Displayed when you try to begin a trade but there are not seven or more tiles in the pool. The rules don't allow trading in this case. */ - public static final int str_too_few_tiles_left_to_trade=0x7f050180; + public static final int str_too_few_tiles_left_to_trade=0x7f050183; /** Displayed when you try to commit the first move of the game and are playing a single tile. The first move must include two or more tiles. */ - public static final int str_two_tiles_first_move=0x7f05017b; + public static final int str_two_tiles_first_move=0x7f05017e; /** Used in formatting final scores display */ - public static final int str_winner_fmt=0x7f05022c; + public static final int str_winner_fmt=0x7f05022f; /** Used in formatting game history (not move summaries since information about the current rack is hidden then) */ - public static final int strd_cumulative_score_fmt=0x7f0500fc; + public static final int strd_cumulative_score_fmt=0x7f0500ff; /** Used in formatting game history and move summaries */ - public static final int strd_remaining_tiles_add_fmt=0x7f0500f9; + public static final int strd_remaining_tiles_add_fmt=0x7f0500fc; /** I don't know how this is used. :-) */ - public static final int strd_time_penalty_sub_fmt=0x7f0500fe; + public static final int strd_time_penalty_sub_fmt=0x7f050101; /** Used in formatting moves and history. The total score for one turn is substituted for %1$d. */ - public static final int strd_turn_score_fmt=0x7f050109; + public static final int strd_turn_score_fmt=0x7f05010c; /** Used in formatting game history and move summaries */ - public static final int strd_unused_tiles_sub_fmt=0x7f0500fa; + public static final int strd_unused_tiles_sub_fmt=0x7f0500fd; /** Used in formatting game history and move summaries */ - public static final int strs_move_across_fmt=0x7f050100; + public static final int strs_move_across_fmt=0x7f050103; /** Used in formatting game history and move summaries */ - public static final int strs_move_down_fmt=0x7f050101; + public static final int strs_move_down_fmt=0x7f050104; /** Used in formatting game history and move summaries */ - public static final int strs_new_tiles_fmt=0x7f0500fb; + public static final int strs_new_tiles_fmt=0x7f0500fe; /** Used in formatting game history and move summaries */ - public static final int strs_tray_at_start_fmt=0x7f050102; + public static final int strs_tray_at_start_fmt=0x7f050105; /** title for window you get when you select menu with text board_menu_game_counts */ - public static final int strs_values_header_fmt=0x7f0500f8; + public static final int strs_values_header_fmt=0x7f0500fb; /** Used in formatting exchange move summaries */ - public static final int strss_traded_for_fmt=0x7f050103; - public static final int study_langpick=0x7f050268; - public static final int study_no_lang_fmt=0x7f050269; - public static final int study_no_lists=0x7f05026a; - public static final int studylist_title_fmt=0x7f050267; + public static final int strss_traded_for_fmt=0x7f050106; + public static final int study_langpick=0x7f05026b; + public static final int study_no_lang_fmt=0x7f05026c; + public static final int study_no_lists=0x7f05026d; + public static final int studylist_title_fmt=0x7f05026a; /** If substituting an existing same-language wordlist by choosing button_substdict user gets to choose from a list of wordlists. This is the title of that list. */ - public static final int subst_dict_title=0x7f05018d; + public static final int subst_dict_title=0x7f050190; /** */ - public static final int summary_conn=0x7f0501e5; + public static final int summary_conn=0x7f0501e8; /** */ - public static final int summary_conn_sms_fmt=0x7f050201; + public static final int summary_conn_sms_fmt=0x7f050204; /** Preference to control what's listed next to game name in the first line of a game summary in the main games-list screen, e.g., if the option is "Game Language", "English" in the @@ -2573,10 +2580,10 @@ public final class R { The following strings beginning with "game_summary_field_" are possible values */ - public static final int summary_field=0x7f050127; + public static final int summary_field=0x7f05012a; /** */ - public static final int summary_gameover=0x7f0501e4; + public static final int summary_gameover=0x7f0501e7; /** The display of each networked game includes one of three states it can be in in the process of connecting to the relay. These next three strings are used to create those @@ -2584,57 +2591,57 @@ public final class R { First state: is configured to use a room but has not yet contacted the relay and been assigned that room. */ - public static final int summary_relay_conf_fmt=0x7f050081; + public static final int summary_relay_conf_fmt=0x7f050084; /** Third state: enough devices have connected in the room to form a complete game. We'll be in this state as long as the game exists. */ - public static final int summary_relay_conn_fmt=0x7f050083; + public static final int summary_relay_conn_fmt=0x7f050086; /** Final state: game is over. */ - public static final int summary_relay_gameover_fmt=0x7f050084; + public static final int summary_relay_gameover_fmt=0x7f050087; /** Second state: has been assigned to a room on the relay (meaning the network is working) but there are not yet as many players as expected: the game is not complete and play cannot happen. */ - public static final int summary_relay_wait_fmt=0x7f050082; - public static final int summary_send_data_sms=0x7f0502d5; + public static final int summary_relay_wait_fmt=0x7f050085; + public static final int summary_send_data_sms=0x7f0502d8; /** explanation of the above */ - public static final int summary_sort_tiles=0x7f050149; - public static final int summary_studyon=0x7f050262; - public static final int summary_thumbsize=0x7f050255; + public static final int summary_sort_tiles=0x7f05014c; + public static final int summary_studyon=0x7f050265; + public static final int summary_thumbsize=0x7f050258; /** */ - public static final int summary_wait_guest=0x7f0501e3; + public static final int summary_wait_guest=0x7f0501e6; /** */ - public static final int summary_wait_host=0x7f0501e2; + public static final int summary_wait_host=0x7f0501e5; /** Used to indicate that a preference is not enabled, i.e. not part of the game and that the user should ignore it. */ - public static final int tell_unused=0x7f050119; - public static final int thumb_off=0x7f050256; + public static final int tell_unused=0x7f05011c; + public static final int thumb_off=0x7f050259; /** color of the tiles' background */ - public static final int tile_back=0x7f05013b; + public static final int tile_back=0x7f05013e; /** */ - public static final int tilepick_all=0x7f0501cf; + public static final int tilepick_all=0x7f0501d2; /** */ - public static final int tilepick_undo=0x7f0501ce; + public static final int tilepick_undo=0x7f0501d1; /** title of dialog brought up in response to the board_menu_game_left menu. The dialog lists all tiles remaining in the pool, i.e. not on the board or in the rack of the player whose turn it is. */ - public static final int tiles_left_title=0x7f05019a; + public static final int tiles_left_title=0x7f05019d; /** Title of preference in which you select which addressing modes network games will use to communicate */ - public static final int title_addrs_pref=0x7f0502ad; + public static final int title_addrs_pref=0x7f0502b0; /** ############################################################ # :Screens: @@ -2645,7 +2652,7 @@ public final class R { window title */ - public static final int title_dicts_list=0x7f05009a; + public static final int title_dicts_list=0x7f05009d; /** ############################################################ # :Screens: @@ -2654,17 +2661,17 @@ public final class R { window title (game name substituted for %1$s) */ - public static final int title_game_config_fmt=0x7f0500a8; + public static final int title_game_config_fmt=0x7f0500ab; /** alternate window title used when game is networked */ - public static final int title_gamenet_config_fmt=0x7f0500a9; + public static final int title_gamenet_config_fmt=0x7f0500ac; /** title for popup list of langugages from which user picks */ - public static final int title_langs_list=0x7f0500aa; + public static final int title_langs_list=0x7f0500ad; /** */ - public static final int title_lookup=0x7f0501c3; - public static final int title_lookup_study=0x7f0501c4; + public static final int title_lookup=0x7f0501c6; + public static final int title_lookup_study=0x7f0501c7; /** ############################################################ # :Screens: @@ -2677,52 +2684,52 @@ public final class R { window title */ - public static final int title_prefs=0x7f05010b; - public static final int title_send_data_sms=0x7f0502d4; + public static final int title_prefs=0x7f05010e; + public static final int title_send_data_sms=0x7f0502d7; /** If this preference is checked, tiles in the rack will be re-ordered alphabetically whenever tiles are added, i.e. after ever move. */ - public static final int title_sort_tiles=0x7f050148; - public static final int title_studyon=0x7f050261; + public static final int title_sort_tiles=0x7f05014b; + public static final int title_studyon=0x7f050264; /** title of dialog allowing user to pick tiles "face up". (This feature is not yet supported on Android.) */ - public static final int title_tile_picker=0x7f050199; - public static final int update_dicts_fmt=0x7f050299; - public static final int use_defaults=0x7f0502b3; + public static final int title_tile_picker=0x7f05019c; + public static final int update_dicts_fmt=0x7f05029c; + public static final int use_defaults=0x7f0502b6; /** text of checkbox controlling whether there's a game timer */ - public static final int use_timer=0x7f0500bc; + public static final int use_timer=0x7f0500bf; /** Used to separate names of players when listing them on one line in a game summary. The \u0020 is a space in xml. */ - public static final int vs_join=0x7f050107; - public static final int waiting_title=0x7f0502bf; - public static final int warn_bt_disabled=0x7f050222; - public static final int warn_no_comms=0x7f0502c2; + public static final int vs_join=0x7f05010a; + public static final int waiting_title=0x7f0502c2; + public static final int warn_bt_disabled=0x7f050225; + public static final int warn_no_comms=0x7f0502c5; /** */ - public static final int warn_nomobile_fmt=0x7f0501fb; + public static final int warn_nomobile_fmt=0x7f0501fe; /** */ - public static final int warn_sms_disabled=0x7f050221; + public static final int warn_sms_disabled=0x7f050224; /** */ - public static final int warn_unlimited=0x7f050202; - public static final int wifi_warning=0x7f050301; + public static final int warn_unlimited=0x7f050205; + public static final int wifi_warning=0x7f050304; /** */ - public static final int word_search_hint=0x7f0501cd; - public static final int xlations_enabled_summary=0x7f050274; - public static final int xlations_enabled_title=0x7f050273; - public static final int xlations_locale=0x7f0502df; + public static final int word_search_hint=0x7f0501d0; + public static final int xlations_enabled_summary=0x7f050277; + public static final int xlations_enabled_title=0x7f050276; + public static final int xlations_locale=0x7f0502e2; /** Empty in English, this should contain the name of the translator/creator of the strings.xml file for this language */ - public static final int xlator=0x7f0501bb; - public static final int xwords_nfc_mime=0x7f050074; + public static final int xlator=0x7f0501be; + public static final int xwords_nfc_mime=0x7f050077; } public static final class style { public static final int about_items=0x7f080005; diff --git a/xwords4/android/XWords4/res/layout/conn_types_display.xml b/xwords4/android/XWords4/res/layout/conn_types_display.xml index aa12a58fc..1fef11c9d 100644 --- a/xwords4/android/XWords4/res/layout/conn_types_display.xml +++ b/xwords4/android/XWords4/res/layout/conn_types_display.xml @@ -14,4 +14,12 @@ android:layout_height="wrap_content" /> + + diff --git a/xwords4/android/XWords4/res/values/common_rsrc.xml b/xwords4/android/XWords4/res/values/common_rsrc.xml index 7412ef9f8..47b6085b8 100644 --- a/xwords4/android/XWords4/res/values/common_rsrc.xml +++ b/xwords4/android/XWords4/res/values/common_rsrc.xml @@ -128,6 +128,10 @@ key_invite_multi key_notagain_enablepublic + key_na_comms_bt + key_na_comms_sms + key_na_comms_relay + xwords@eehouse.org diff --git a/xwords4/android/XWords4/res/values/strings.xml b/xwords4/android/XWords4/res/values/strings.xml index 319f95bad..69990e701 100644 --- a/xwords4/android/XWords4/res/values/strings.xml +++ b/xwords4/android/XWords4/res/values/strings.xml @@ -2493,4 +2493,8 @@ Enable + About relay connecting + About SMS connecting + About BT connecting + diff --git a/xwords4/android/XWords4/res_src/values-ba_CK/strings.xml b/xwords4/android/XWords4/res_src/values-ba_CK/strings.xml index 8b840fbd3..6a5d61d44 100644 --- a/xwords4/android/XWords4/res_src/values-ba_CK/strings.xml +++ b/xwords4/android/XWords4/res_src/values-ba_CK/strings.xml @@ -2155,4 +2155,7 @@ Ton lla sreirrac troppus yalp aiv SMS. Elbane + Tuoba yaler gnitcennoc + Tuoba SMS gnitcennoc + Tuoba TB gnitcennoc diff --git a/xwords4/android/XWords4/res_src/values-ca_PS/strings.xml b/xwords4/android/XWords4/res_src/values-ca_PS/strings.xml index ae46b8263..0ec8360b9 100644 --- a/xwords4/android/XWords4/res_src/values-ca_PS/strings.xml +++ b/xwords4/android/XWords4/res_src/values-ca_PS/strings.xml @@ -2155,4 +2155,7 @@ NOT ALL CARRIERS SUPPORT PLAY VIA SMS. ENABLE + ABOUT RELAY CONNECTING + ABOUT SMS CONNECTING + ABOUT BT CONNECTING diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/ConnViaViewLayout.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/ConnViaViewLayout.java index bac8eef0e..fd30ebce9 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/ConnViaViewLayout.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/ConnViaViewLayout.java @@ -33,8 +33,11 @@ import org.eehouse.android.xw4.jni.CommsAddrRec.CommsConnType; import org.eehouse.android.xw4.jni.CommsAddrRec.CommsConnTypeSet; import org.eehouse.android.xw4.loc.LocUtils; +import junit.framework.Assert; + public class ConnViaViewLayout extends LinearLayout { private CommsConnTypeSet m_curSet; + private DlgDelegate.HasDlgDelegate m_dlgDlgt; public interface CheckEnabledWarner { public void warnDisabled( CommsConnType typ ); @@ -52,7 +55,8 @@ public class ConnViaViewLayout extends LinearLayout { protected void configure( CommsConnTypeSet types, CheckEnabledWarner cew, - SetEmptyWarner sew ) + SetEmptyWarner sew, + DlgDelegate.HasDlgDelegate dlgDlgt ) { m_curSet = (CommsConnTypeSet)types.clone(); @@ -60,6 +64,7 @@ public class ConnViaViewLayout extends LinearLayout { m_disabledWarner = cew; m_emptyWarner = sew; + m_dlgDlgt = dlgDlgt; } protected CommsConnTypeSet getTypes() @@ -88,6 +93,7 @@ public class ConnViaViewLayout extends LinearLayout { public void onCheckedChanged( CompoundButton buttonView, boolean isChecked ) { if ( isChecked ) { + showNotAgainTypeTip( typf ); enabledElseWarn( typf ); m_curSet.add( typf ); } else { @@ -117,4 +123,32 @@ public class ConnViaViewLayout extends LinearLayout { m_disabledWarner.warnDisabled( typ ); } } + + private void showNotAgainTypeTip( CommsConnType typ ) + { + if ( null != m_dlgDlgt ) { + int keyID = 0; + int msgID = 0; + switch( typ ) { + case COMMS_CONN_RELAY: + msgID = R.string.not_again_comms_relay; + keyID = R.string.key_na_comms_relay; + break; + case COMMS_CONN_SMS: + msgID = R.string.not_again_comms_sms; + keyID = R.string.key_na_comms_sms; + break; + case COMMS_CONN_BT: + msgID = R.string.not_again_comms_bt; + keyID = R.string.key_na_comms_bt; + break; + default: + Assert.fail(); + break; + } + m_dlgDlgt.showNotAgainDlgThen( msgID, keyID, + DlgDelegate.Action.SKIP_CALLBACK ); + + } + } } 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 e647a2621..ee8d53190 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/GameConfigDelegate.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/GameConfigDelegate.java @@ -285,11 +285,18 @@ public class GameConfigDelegate extends DelegateBase LinearLayout layout = (LinearLayout)inflate( R.layout.conn_types_display ); final ConnViaViewLayout items = (ConnViaViewLayout) layout.findViewById( R.id.conn_types ); + final CheckBox cb = (CheckBox)layout + .findViewById(R.id.default_check); + cb.setVisibility( View.VISIBLE ); final DialogInterface.OnClickListener lstnr = new DialogInterface.OnClickListener() { public void onClick( DialogInterface dlg, int button ) { m_conTypes = items.getTypes(); + if ( cb.isChecked()) { + XWPrefs.setAddrTypes( m_activity, m_conTypes ); + } + m_car.populate( m_activity, m_conTypes ); setConnLabel(); @@ -349,7 +356,7 @@ public class GameConfigDelegate extends DelegateBase break; } } - }, null ); + }, null, this ); break; } } diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/PrefsActivity.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/PrefsActivity.java index 400572733..392cfdb79 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/PrefsActivity.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/PrefsActivity.java @@ -29,7 +29,8 @@ import android.preference.PreferenceActivity; import org.eehouse.android.xw4.loc.LocUtils; import org.eehouse.android.xw4.DlgDelegate.Action; -public class PrefsActivity extends PreferenceActivity implements Delegator { +public class PrefsActivity extends PreferenceActivity + implements Delegator, DlgDelegate.HasDlgDelegate { private PrefsDelegate m_dlgt; @@ -88,11 +89,22 @@ public class PrefsActivity extends PreferenceActivity implements Delegator { super.onDestroy(); } - protected void showOKOnlyDialog( int msgID ) + public void showOKOnlyDialog( int msgID ) { m_dlgt.showOKOnlyDialog( msgID ); } + public void showOKOnlyDialog( String msg ) + { + m_dlgt.showOKOnlyDialog( msg ); + } + + public void showNotAgainDlgThen( int msgID, int prefsKey, + DlgDelegate.Action action ) + { + m_dlgt.showNotAgainDlgThen( msgID, prefsKey, action ); + } + protected void showConfirmThen( int msg, int posButton, int negButton, Action action ) { diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/XWConnAddrPreference.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/XWConnAddrPreference.java index f4fd77d26..8b2e78bf7 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/XWConnAddrPreference.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/XWConnAddrPreference.java @@ -55,10 +55,10 @@ public class XWConnAddrPreference extends DialogPreference { { LocUtils.xlateView( m_context, view ); m_view = (ConnViaViewLayout)view.findViewById( R.id.conn_types ); + final PrefsActivity activity = (PrefsActivity)m_context; m_view.configure( XWPrefs.getAddrTypes( m_context ), new ConnViaViewLayout.CheckEnabledWarner() { public void warnDisabled( CommsConnType typ ) { - PrefsActivity activity = (PrefsActivity)m_context; switch( typ ) { case COMMS_CONN_SMS: activity.showConfirmThen( R.string.warn_sms_disabled, @@ -80,7 +80,7 @@ public class XWConnAddrPreference extends DialogPreference { PrefsActivity activity = (PrefsActivity)m_context; activity.showOKOnlyDialog( R.string.warn_no_comms ); } - } ); + }, activity ); } @Override From d096b8e8a2b80156795da7d653f7e3c174daac5c Mon Sep 17 00:00:00 2001 From: Eric House Date: Fri, 26 Jun 2015 06:10:47 -0700 Subject: [PATCH 34/49] cleanup -- no code change --- xwords4/relay/dbmgr.cpp | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/xwords4/relay/dbmgr.cpp b/xwords4/relay/dbmgr.cpp index fc6e258ad..6249b48fb 100644 --- a/xwords4/relay/dbmgr.cpp +++ b/xwords4/relay/dbmgr.cpp @@ -368,8 +368,6 @@ DBMgr::RegisterDevice( const DevID* host, int clientVersion, { DevIDRelay devID; assert( host->m_devIDType != ID_TYPE_NONE ); - int ii; - bool success; // if it's already present, just return devID = getDevID( host ); @@ -383,7 +381,7 @@ DBMgr::RegisterDevice( const DevID* host, int clientVersion, // coming from random, but test with increasing values initially to make // sure duplicates are detected. const char* devidStr = host->m_devIDString.c_str(); - for ( success = false, ii = 0; !success; ++ii ) { + for ( bool success = false, ii = 0; !success; ++ii ) { assert( 10 > ii ); // better to check that we're looping BECAUSE // of uniqueness problem. do { @@ -393,9 +391,9 @@ DBMgr::RegisterDevice( const DevID* host, int clientVersion, QueryBuilder qb; qb.appendQueryf( "INSERT INTO " DEVICES_TABLE " (id, devTypes[1]," " devids[1], clntVers, versdesc, model, osvers)" - " VALUES($$, $$, $$, $$, $$, $$, $$)" ); + " VALUES($$, $$, $$, $$, $$, $$, $$)" ) - qb.appendParam( devID ) + .appendParam( devID ) .appendParam( host->m_devIDType ) .appendParam( devidStr ) .appendParam( clientVersion ) From e60a16be1e387e257ea743c9999e5fbd9939e487 Mon Sep 17 00:00:00 2001 From: Eric House Date: Fri, 26 Jun 2015 06:13:11 -0700 Subject: [PATCH 35/49] add onPrepareDialog, without which we crash turning on SMS from prefs. Note: I've committed this before and somehow lost it, so there may be some git anomolies here. --- .../eehouse/android/xw4/PrefsActivity.java | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/PrefsActivity.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/PrefsActivity.java index 392cfdb79..0d05e129e 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/PrefsActivity.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/PrefsActivity.java @@ -34,12 +34,6 @@ public class PrefsActivity extends PreferenceActivity private PrefsDelegate m_dlgt; - @Override - protected Dialog onCreateDialog( int id ) - { - return m_dlgt.onCreateDialog( id ); - } - @Override protected void onCreate( Bundle savedInstanceState ) { @@ -89,6 +83,19 @@ public class PrefsActivity extends PreferenceActivity super.onDestroy(); } + @Override + protected Dialog onCreateDialog( int id ) + { + return m_dlgt.onCreateDialog( id ); + } + + @Override + public void onPrepareDialog( int id, Dialog dialog ) + { + super.onPrepareDialog( id, dialog ); + m_dlgt.prepareDialog( DlgID.values()[id], dialog ); + } + public void showOKOnlyDialog( int msgID ) { m_dlgt.showOKOnlyDialog( msgID ); From 8a575bc7899cdfb29ba6c8ebf1927710b8aee03a Mon Sep 17 00:00:00 2001 From: Eric House Date: Fri, 26 Jun 2015 06:18:42 -0700 Subject: [PATCH 36/49] fill in help text for communication means --- xwords4/android/XWords4/res/values/strings.xml | 18 +++++++++++++++--- .../XWords4/res_src/values-ba_CK/strings.xml | 16 +++++++++++++--- .../XWords4/res_src/values-ca_PS/strings.xml | 16 +++++++++++++--- 3 files changed, 41 insertions(+), 9 deletions(-) diff --git a/xwords4/android/XWords4/res/values/strings.xml b/xwords4/android/XWords4/res/values/strings.xml index 69990e701..31269e877 100644 --- a/xwords4/android/XWords4/res/values/strings.xml +++ b/xwords4/android/XWords4/res/values/strings.xml @@ -2493,8 +2493,20 @@ Enable - About relay connecting - About SMS connecting - About BT connecting + The \"relay\" is a server on + the internet that passes messages between devices that are running + Crosswords. It works any time you have a fully-functional internet + connection, but might have problems on restricted WiFi + networks. + + Play via SMS uses the same + technology as \"texting\". Though the messages are invisible to you, + your carrier considers them texts, so you want to avoid this feature + unless you have an unlimited texting plan (or budget.) Note that + Android only supports this feature on devices on a GSM carrier, + i.e. every carrier in the world except Verizon and Sprint. + + Use Bluetooth to play against a + nearby device that\'s \"paired\" with yours. diff --git a/xwords4/android/XWords4/res_src/values-ba_CK/strings.xml b/xwords4/android/XWords4/res_src/values-ba_CK/strings.xml index 6a5d61d44..19fcdd157 100644 --- a/xwords4/android/XWords4/res_src/values-ba_CK/strings.xml +++ b/xwords4/android/XWords4/res_src/values-ba_CK/strings.xml @@ -2155,7 +2155,17 @@ Ton lla sreirrac troppus yalp aiv SMS. Elbane - Tuoba yaler gnitcennoc - Tuoba SMS gnitcennoc - Tuoba TB gnitcennoc + Eht \"yaler\" si a revres no + eht tenretni taht sessap segassem neewteb secived taht era gninnur + Sdrowssorc. Ti skrow yna emit uoy evah a lanoitcnuf-ylluf tenretni + ,noitcennoc tub thgim evah smelborp no detcirtser IfIw + skrowten. + Yalp aiv SMS sesu eht emas + ygolonhcet sa \"gnitxet\". Hguoht eht segassem era elbisivni ot ,uoy + ruoy reirrac sredisnoc meht ,stxet os uoy tnaw ot diova siht erutaef + sselnu uoy evah na detimilnu gnitxet nalp ro( tegdub.) Eton taht + Diordna ylno stroppus siht erutaef no secived no a MSG ,reirrac + i.e. yreve reirrac ni eht dlrow tpecxe Nozirev dna Tnirps. + Esu Htooteulb ot yalp tsniaga a + ybraen ecived taht\'s \"deriap\" htiw sruoy. diff --git a/xwords4/android/XWords4/res_src/values-ca_PS/strings.xml b/xwords4/android/XWords4/res_src/values-ca_PS/strings.xml index 0ec8360b9..5cfa76ff4 100644 --- a/xwords4/android/XWords4/res_src/values-ca_PS/strings.xml +++ b/xwords4/android/XWords4/res_src/values-ca_PS/strings.xml @@ -2155,7 +2155,17 @@ NOT ALL CARRIERS SUPPORT PLAY VIA SMS. ENABLE - ABOUT RELAY CONNECTING - ABOUT SMS CONNECTING - ABOUT BT CONNECTING + THE \"RELAY\" IS A SERVER ON + THE INTERNET THAT PASSES MESSAGES BETWEEN DEVICES THAT ARE RUNNING + CROSSWORDS. IT WORKS ANY TIME YOU HAVE A FULLY-FUNCTIONAL INTERNET + CONNECTION, BUT MIGHT HAVE PROBLEMS ON RESTRICTED WIFI + NETWORKS. + PLAY VIA SMS USES THE SAME + TECHNOLOGY AS \"TEXTING\". THOUGH THE MESSAGES ARE INVISIBLE TO YOU, + YOUR CARRIER CONSIDERS THEM TEXTS, SO YOU WANT TO AVOID THIS FEATURE + UNLESS YOU HAVE AN UNLIMITED TEXTING PLAN (OR BUDGET.) NOTE THAT + ANDROID ONLY SUPPORTS THIS FEATURE ON DEVICES ON A GSM CARRIER, + I.E. EVERY CARRIER IN THE WORLD EXCEPT VERIZON AND SPRINT. + USE BLUETOOTH TO PLAY AGAINST A + NEARBY DEVICE THAT\'S \"PAIRED\" WITH YOURS. From d426db7a4958b878bc87baccff38daff9c5d96b3 Mon Sep 17 00:00:00 2001 From: Eric House Date: Fri, 26 Jun 2015 06:37:34 -0700 Subject: [PATCH 37/49] move httppost stuff into NetUtils --- .../eehouse/android/xw4/DictsDelegate.java | 8 +-- .../src/org/eehouse/android/xw4/NetUtils.java | 57 +++++++++++++++++++ .../android/xw4/UpdateCheckReceiver.java | 57 +------------------ 3 files changed, 64 insertions(+), 58 deletions(-) diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/DictsDelegate.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/DictsDelegate.java index 3f52c0e91..9fdc0e99d 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/DictsDelegate.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/DictsDelegate.java @@ -1135,11 +1135,11 @@ public class DictsDelegate extends ListDelegateBase // parse less data String name = null; String proc = String.format( "listDicts?lc=%s", m_lc ); - HttpPost post = UpdateCheckReceiver.makePost( m_context, proc ); + HttpPost post = NetUtils.makePost( m_context, proc ); if ( null != post ) { JSONObject theOne = null; String langName = null; - String json = UpdateCheckReceiver.runPost( post, new JSONObject() ); + String json = NetUtils.runPost( post, new JSONObject() ); try { JSONObject obj = new JSONObject( json ); JSONArray langs = obj.optJSONArray( "langs" ); @@ -1214,9 +1214,9 @@ public class DictsDelegate extends ListDelegateBase public Boolean doInBackground( Void... unused ) { boolean success = false; - HttpPost post = UpdateCheckReceiver.makePost( m_context, "listDicts" ); + HttpPost post = NetUtils.makePost( m_context, "listDicts" ); if ( null != post ) { - String json = UpdateCheckReceiver.runPost( post, new JSONObject() ); + String json = NetUtils.runPost( post, new JSONObject() ); if ( !isCancelled() ) { if ( null != json ) { post( new Runnable() { diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/NetUtils.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/NetUtils.java index beab8b46e..414175340 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/NetUtils.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/NetUtils.java @@ -21,14 +21,29 @@ package org.eehouse.android.xw4; import android.content.Context; + import java.io.DataInputStream; import java.io.DataOutputStream; import java.net.InetAddress; import java.net.Socket; +import java.util.ArrayList; +import java.util.List; import javax.net.SocketFactory; +import org.apache.http.HttpEntity; +import org.apache.http.HttpResponse; +import org.apache.http.NameValuePair; +import org.apache.http.client.HttpClient; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.impl.client.DefaultHttpClient; +import org.apache.http.message.BasicNameValuePair; +import org.apache.http.util.EntityUtils; +import org.json.JSONObject; + public class NetUtils { + public static final String k_PARAMS = "params"; public static final byte PROTOCOL_VERSION = 0; // from xwrelay.h public static byte PRX_PUB_ROOMS = 1; @@ -183,6 +198,48 @@ public class NetUtils { return msgs; } // queryRelay + protected static HttpPost makePost( Context context, String proc ) + { + String url = String.format( "%s/%s", + XWPrefs.getDefaultUpdateUrl( context ), + proc ); + HttpPost result; + try { + result = new HttpPost( url ); + } catch ( IllegalArgumentException iae ) { + DbgUtils.loge( iae ); + result = null; + } + return result; + } + + protected static String runPost( HttpPost post, JSONObject param ) + { + String result = null; + try { + String jsonStr = param.toString(); + List nvp = new ArrayList(); + nvp.add( new BasicNameValuePair( k_PARAMS, jsonStr ) ); + post.setEntity( new UrlEncodedFormEntity(nvp) ); + + // Execute HTTP Post Request + HttpClient httpclient = new DefaultHttpClient(); + HttpResponse response = httpclient.execute(post); + HttpEntity entity = response.getEntity(); + if ( null != entity ) { + result = EntityUtils.toString( entity ); + if ( 0 == result.length() ) { + result = null; + } + } + } catch( java.io.UnsupportedEncodingException uee ) { + DbgUtils.loge( uee ); + } catch( java.io.IOException ioe ) { + DbgUtils.loge( ioe ); + } + return result; + } + private static int sumStrings( final String[] strs ) { int len = 0; diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/UpdateCheckReceiver.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/UpdateCheckReceiver.java index 6d2106d54..9234b5954 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/UpdateCheckReceiver.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/UpdateCheckReceiver.java @@ -30,20 +30,12 @@ import android.content.pm.PackageManager; import android.net.Uri; import android.os.AsyncTask; import android.os.SystemClock; + import java.io.File; import java.util.ArrayList; import java.util.List; -import org.apache.http.HttpEntity; -import org.apache.http.HttpResponse; -import org.apache.http.NameValuePair; -import org.apache.http.client.ClientProtocolException; -import org.apache.http.client.HttpClient; -import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpPost; -import org.apache.http.impl.client.DefaultHttpClient; -import org.apache.http.message.BasicNameValuePair; -import org.apache.http.util.EntityUtils; import org.json.JSONArray; import org.json.JSONObject; @@ -73,7 +65,6 @@ public class UpdateCheckReceiver extends BroadcastReceiver { private static final String k_MD5SUM = "md5sum"; private static final String k_INDEX = "index"; private static final String k_URL = "url"; - private static final String k_PARAMS = "params"; private static final String k_DEVID = "did"; private static final String k_DEBUG = "dbg"; private static final String k_XLATEINFO = "xlatinfo"; @@ -221,48 +212,6 @@ public class UpdateCheckReceiver extends BroadcastReceiver { return result; } - protected static HttpPost makePost( Context context, String proc ) - { - String url = String.format( "%s/%s", - XWPrefs.getDefaultUpdateUrl( context ), - proc ); - HttpPost result; - try { - result = new HttpPost( url ); - } catch ( IllegalArgumentException iae ) { - DbgUtils.loge( iae ); - result = null; - } - return result; - } - - protected static String runPost( HttpPost post, JSONObject params ) - { - String result = null; - try { - String jsonStr = params.toString(); - List nvp = new ArrayList(); - nvp.add( new BasicNameValuePair( k_PARAMS, jsonStr ) ); - post.setEntity( new UrlEncodedFormEntity(nvp) ); - - // Execute HTTP Post Request - HttpClient httpclient = new DefaultHttpClient(); - HttpResponse response = httpclient.execute(post); - HttpEntity entity = response.getEntity(); - if ( null != entity ) { - result = EntityUtils.toString( entity ); - if ( 0 == result.length() ) { - result = null; - } - } - } catch( java.io.UnsupportedEncodingException uee ) { - DbgUtils.loge( uee ); - } catch( java.io.IOException ioe ) { - DbgUtils.loge( ioe ); - } - return result; - } - private static JSONObject makeDictParams( Context context, DictUtils.DictAndLoc dal, int index ) @@ -311,10 +260,10 @@ public class UpdateCheckReceiver extends BroadcastReceiver { @Override protected String doInBackground( Void... unused ) { - HttpPost post = makePost( m_context, "getUpdates" ); + HttpPost post = NetUtils.makePost( m_context, "getUpdates" ); String json = null; if ( null != post ) { - json = runPost( post, m_params ); + json = NetUtils.runPost( post, m_params ); } return json; } From d479486521c5804ec9d8cf07279c4a5c824405e7 Mon Sep 17 00:00:00 2001 From: Eric House Date: Fri, 26 Jun 2015 07:35:24 -0700 Subject: [PATCH 38/49] change defaults so a with-games-ui/udp game interface comes up by default. --- xwords4/linux/linuxmain.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/xwords4/linux/linuxmain.c b/xwords4/linux/linuxmain.c index 3606972b2..ad74d6575 100644 --- a/xwords4/linux/linuxmain.c +++ b/xwords4/linux/linuxmain.c @@ -631,6 +631,7 @@ typedef enum { ,CMD_SPLITPACKETS ,CMD_CHAT ,CMD_USEUDP + ,CMD_NOUDP ,CMD_DROPSENDRELAY ,CMD_DROPRCVRELAY ,CMD_DROPSENDSMS @@ -747,7 +748,8 @@ static CmdInfoRec CmdInfoRecs[] = { ,{ CMD_SPLITPACKETS, true, "split-packets", "send tcp packets in " "sections every random MOD seconds to test relay reassembly" } ,{ CMD_CHAT, true, "send-chat", "send a chat every seconds" } - ,{ CMD_USEUDP, false, "use-udp", "connect to relay new-style, via udp not tcp" } + ,{ CMD_USEUDP, false, "use-udp", "connect to relay new-style, via udp not tcp (on by default)" } + ,{ CMD_NOUDP, false, "no-use-udp", "connect to relay old-style, via tcp not udp" } ,{ CMD_DROPSENDRELAY, false, "drop-send-relay", "start new games with relay send disabled" } ,{ CMD_DROPRCVRELAY, false, "drop-receive-relay", "start new games with relay receive disabled" } @@ -2085,6 +2087,8 @@ main( int argc, char** argv ) mainParams.allowPeek = XP_TRUE; mainParams.showRobotScores = XP_FALSE; mainParams.useMmap = XP_TRUE; + mainParams.useUdp = true; + mainParams.dbName = "xwgames.sql"; char* envDictPath = getenv( "XW_DICTDIR" ); XP_LOGF( "%s: envDictPath=%s", __func__, envDictPath ); @@ -2189,6 +2193,7 @@ main( int argc, char** argv ) break; case CMD_GAMEFILE: mainParams.fileName = optarg; + mainParams.dbName = NULL; /* clear the default */ break; case CMD_DBFILE: mainParams.dbName = optarg; @@ -2206,6 +2211,7 @@ main( int argc, char** argv ) "disabling XWFEATURE_SEARCHLIMIT" ); # endif mainParams.dbFileName = optarg; + mainParams.dbName = NULL; break; case CMD_GAMEDB_ID: mainParams.dbFileID = atoi(optarg); @@ -2369,6 +2375,9 @@ main( int argc, char** argv ) case CMD_USEUDP: mainParams.useUdp = true; break; + case CMD_NOUDP: + mainParams.useUdp = false; + break; case CMD_DROPSENDRELAY: mainParams.commsDisableds[COMMS_CONN_RELAY][1] = XP_TRUE; From fe25060255f02c834b4546bef93a7f4f763196e9 Mon Sep 17 00:00:00 2001 From: Eric House Date: Wed, 1 Jul 2015 05:52:02 -0700 Subject: [PATCH 39/49] fix assertion failure, probably due to some freak accident of missaved timestamp. Whatever. --- .../XWords4/src/org/eehouse/android/xw4/ExpiringDelegate.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/ExpiringDelegate.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/ExpiringDelegate.java index 7a783344e..e5b4045b6 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/ExpiringDelegate.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/ExpiringDelegate.java @@ -201,6 +201,8 @@ public class ExpiringDelegate { m_pct = (int)((100 * passed) / INTERVAL_SECS); if ( m_pct > 100 ) { m_pct = 100; + } else if ( m_pct < 0 ) { + m_pct = 0; } else if ( null != m_handler ) { long onePct = INTERVAL_SECS / 100; long lastStart = m_startSecs + (onePct * m_pct); From 29d8a67c366bb09b761f4c24711337e618594450 Mon Sep 17 00:00:00 2001 From: Eric House Date: Wed, 8 Jul 2015 20:41:13 -0700 Subject: [PATCH 40/49] Makefile for new wordlist --- xwords4/dawg/English/Makefile.CSW15 | 35 +++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 xwords4/dawg/English/Makefile.CSW15 diff --git a/xwords4/dawg/English/Makefile.CSW15 b/xwords4/dawg/English/Makefile.CSW15 new file mode 100644 index 000000000..4c1d1d4c1 --- /dev/null +++ b/xwords4/dawg/English/Makefile.CSW15 @@ -0,0 +1,35 @@ +# -*- mode: makefile; compile-command: "make -f Makefile.CSW12"; -*- +# Copyright 2002 by Eric House (xwords@eehouse.org). All rights reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +XWLANG=CSW15 +LANGCODE=en_US +TARGET_TYPE=WINCE +DICTNOTE = "Submitted by a user, claims equivalence with Collins Scrabble Words 2015" + +include ../Makefile.langcommon + +SOURCEDICT ?= $(XWDICTPATH)/English/CSW15.txt.gz + +$(XWLANG)Main.dict.gz: $(SOURCEDICT) Makefile + zcat $< | tr -d '\r' | awk '{print $$1}' | tr [a-z] [A-Z] | \ + grep -e "^[A-Z]\{2,15\}$$" | gzip -c > $@ + +# Everything but creating of the Main.dict file is inherited from the +# "parent" Makefile.langcommon in the parent directory. + +clean: clean_common + rm -f $(XWLANG)Main.dict.gz *.bin $(XWLANG)*.pdb $(XWLANG)*.seb From dba86a657f8f4f0a87ee59b975478252ae657a75 Mon Sep 17 00:00:00 2001 From: Eric House Date: Wed, 1 Jul 2015 06:34:57 -0700 Subject: [PATCH 41/49] add and handle new INVITE message types. (This can safely be added to shipping relay.) --- xwords4/relay/xwrelay.cpp | 42 +++++++++++++++++++++++++++++++++++---- xwords4/relay/xwrelay.h | 5 +++++ 2 files changed, 43 insertions(+), 4 deletions(-) diff --git a/xwords4/relay/xwrelay.cpp b/xwords4/relay/xwrelay.cpp index 1f155a2c8..8ea8c03cd 100644 --- a/xwords4/relay/xwrelay.cpp +++ b/xwords4/relay/xwrelay.cpp @@ -374,10 +374,15 @@ getHeader( const uint8_t** bufpp, const uint8_t* end, uint8_t byt; if ( getNetByte( bufpp, end, &byt ) ) { header->proto = (XWPDevProto)byt; - if ( XWPDEV_PROTO_VERSION_1 == header->proto - && vli2un( bufpp, end, &header->packetID ) - && getNetByte( bufpp, end, &byt ) - && byt < XWPDEV_N_ELEMS ) { + if ( XWPDEV_PROTO_VERSION_1 != header->proto ) { + logf( XW_LOGERROR, "%s: bad proto %d", __func__, header->proto ); + } else if ( !vli2un( bufpp, end, &header->packetID ) ) { + logf( XW_LOGERROR, "%s: can't get packet id", __func__ ); + } else if ( !getNetByte( bufpp, end, &byt ) ) { + logf( XW_LOGERROR, "%s: can't get cmd", __func__ ); + } else if ( XWPDEV_N_ELEMS <= byt ) { + logf( XW_LOGERROR, "%s: cmd %d too high", __func__, byt ); + } else { header->cmd = (XWRelayReg)byt; success = true; } @@ -838,6 +843,22 @@ post_upgrade( DevIDRelay devid ) (void)post_or_store( devid, packet, packetID, NULL, NULL ); } +void +post_invite( DevIDRelay sender, DevIDRelay invitee, const uint8_t* ptr, size_t len ) +{ + vector packet; + uint32_t packetID; + sender = htonl( sender ); + assemble_packet( packet, &packetID, XWPDEV_GOTINVITE, + &sender, sizeof(sender), + ptr, len, + NULL ); + + bool sent = post_or_store( invitee, packet, packetID, NULL, NULL ); + logf( XW_LOGINFO, "%s(): post_or_store => %s", __func__, + sent ? "sent" : "stored"); +} + /* A CONNECT message from a device gives us the hostID and socket we'll * associate with one participant in a relayed session. We'll store this * information with the cookie where other participants can find it when they @@ -1652,6 +1673,7 @@ msgToStr( XWRelayReg msg ) CASE_STR(XWPDEV_UNAVAIL); CASE_STR(XWPDEV_REG); CASE_STR(XWPDEV_REGRSP); + CASE_STR(XWPDEV_INVITE); CASE_STR(XWPDEV_KEEPALIVE); CASE_STR(XWPDEV_HAVEMSGS); CASE_STR(XWPDEV_RQSTMSGS); @@ -1756,6 +1778,18 @@ handle_udp_packet( UdpThreadClosure* utc ) } break; } + + case XWPDEV_INVITE: + DevIDRelay sender; + DevIDRelay invitee; + if ( getNetLong( &ptr, end, &sender ) + && getNetLong( &ptr, end, &invitee) ) { + logf( XW_LOGVERBOSE0, "got invite from %d for %d", + sender, invitee ); + post_invite( sender, invitee, ptr, end - ptr ); + } + break; + case XWPDEV_KEEPALIVE: case XWPDEV_RQSTMSGS: { DevID devID( ID_TYPE_RELAY ); diff --git a/xwords4/relay/xwrelay.h b/xwords4/relay/xwrelay.h index 2eef03edf..a502957c0 100644 --- a/xwords4/relay/xwrelay.h +++ b/xwords4/relay/xwrelay.h @@ -108,6 +108,11 @@ enum { XWPDEV_NONE /* 0 is an illegal value */ to check for upgrades; may eventually replace device needing a timer. */ + ,XWPDEV_INVITE /* dev->relay; format: header, sender relay + id: 4, recipient relay id: 4; nli data: + variable length. */ + ,XWPDEV_GOTINVITE /* relay->dev */ + ,XWPDEV_N_ELEMS /* MUST BE LAST */ } From 8efde54ebc965f047a8958c894c1003b7fc369a1 Mon Sep 17 00:00:00 2001 From: Eric House Date: Fri, 10 Jul 2015 23:31:47 -0700 Subject: [PATCH 42/49] Merge branch 'android_branch', remote branch 'origin/android_branch' into android_branch From d605686fd63a8f88e8e1dc91a81c0801c3203f9f Mon Sep 17 00:00:00 2001 From: Relay User Date: Sat, 11 Jul 2015 07:00:51 -0700 Subject: [PATCH 43/49] add teaser to gcm message (matches android client change) --- xwords4/relay/scripts/gcm_msg.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/xwords4/relay/scripts/gcm_msg.py b/xwords4/relay/scripts/gcm_msg.py index 5cacc872c..1ced80f84 100755 --- a/xwords4/relay/scripts/gcm_msg.py +++ b/xwords4/relay/scripts/gcm_msg.py @@ -14,7 +14,8 @@ def usage(): def sendMsg( devid, msg ): values = { 'registration_ids': [ devid ], - 'data' : { 'title' : 'Msg from Darth2', + 'data' : { 'title' : 'Re: CrossWords', + 'teaser' : 'Please tap to read in the app', 'msg' : msg, } } From 8f863f036940213b4d881955ccfe34ab7fcf4bde Mon Sep 17 00:00:00 2001 From: Relay User Date: Sat, 11 Jul 2015 07:02:50 -0700 Subject: [PATCH 44/49] Make it possible to launch relay early in machine boot cycle before postgres is running (e.g. from a @reboot shortcut in a crontab) by having it wait, sleeping periodically, until a connection is available. Requires new flag be passed into main. --- xwords4/relay/xwrelay.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/xwords4/relay/xwrelay.cpp b/xwords4/relay/xwrelay.cpp index 8ea8c03cd..ce035bc85 100644 --- a/xwords4/relay/xwrelay.cpp +++ b/xwords4/relay/xwrelay.cpp @@ -1172,6 +1172,7 @@ usage( char* arg0 ) #ifdef DO_HTTP "\t-w (localhost port for web interface)\\\n" #endif + "\t-b (block until postgres connection available)\\\n" "\t-D (don't become daemon)\\\n" "\t-F (don't fork and wait to respawn child)\\\n" "\t-f (config file)\\\n" @@ -2022,6 +2023,7 @@ main( int argc, char** argv ) const char* maint_str = NULL; bool doDaemon = true; bool doFork = true; + bool doBlock = false; (void)uptime(); /* force capture of start time */ @@ -2033,7 +2035,7 @@ main( int argc, char** argv ) first. */ for ( ; ; ) { - int opt = getopt(argc, argv, "h?c:p:M:m:n:f:l:t:s:u:w:" + int opt = getopt(argc, argv, "bh?c:p:M:m:n:f:l:t:s:u:w:" "DF" ); if ( opt == -1 ) { @@ -2044,6 +2046,9 @@ main( int argc, char** argv ) case 'h': usage( argv[0] ); exit( 0 ); + case 'b': + doBlock = true; + break; case 'c': ctrlport = atoi( optarg ); break; @@ -2194,6 +2199,10 @@ main( int argc, char** argv ) } #endif + if ( doBlock ) { + DBMgr::Get()->WaitDBConn(); + } + if ( -1 != udpport ) { struct sockaddr_in saddr; g_udpsock = socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP ); From 9c7213e42bbe85ea9b66ff5bd11454f2f6dbced4 Mon Sep 17 00:00:00 2001 From: Relay User Date: Sat, 11 Jul 2015 07:03:22 -0700 Subject: [PATCH 45/49] Make it possible to launch relay early in machine boot cycle before postgres is running (e.g. from a @reboot shortcut in a crontab) by having it wait, sleeping periodically, until a connection is available. Requires new flag be passed into main. --- xwords4/relay/dbmgr.cpp | 36 +++++++++++++++++++++++++++++++++++- xwords4/relay/dbmgr.h | 2 ++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/xwords4/relay/dbmgr.cpp b/xwords4/relay/dbmgr.cpp index 6249b48fb..f6cf3fb94 100644 --- a/xwords4/relay/dbmgr.cpp +++ b/xwords4/relay/dbmgr.cpp @@ -44,6 +44,7 @@ static DBMgr* s_instance = NULL; #define MAX_NUM_PLAYERS 4 +#define MAX_WAIT_SECONDS (5*60) // five minutes static int here_less_seed( const char* seeds, int perDeviceSum, unsigned short seed ); @@ -747,6 +748,34 @@ DBMgr::KillGame( const char* const connName, int hid ) execSql( query ); } +void +DBMgr::WaitDBConn( void ) +{ + int nSeconds = 0; + int toSleep = 1; + for ( ; ; ) { + PGconn* conn = DBMgr::getThreadConn(); + if ( !!conn ) { + ConnStatusType status = PQstatus( conn ); + if ( CONNECTION_OK == status ) { + break; + } + } + + toSleep *= 2; + if ( toSleep > MAX_WAIT_SECONDS ) { + toSleep = MAX_WAIT_SECONDS; + } + + (void)sleep( toSleep ); + nSeconds += toSleep; + logf( XW_LOGERROR, "%s: waiting for postgres; %d seconds so far", __func__, + nSeconds ); + } + + logf( XW_LOGERROR, "%s() done", __func__ ); +} + void DBMgr::ClearCIDs( void ) { @@ -1330,7 +1359,12 @@ DBMgr::getThreadConn( void ) params.catf( "port = %d ", port ); conn = PQconnectdb( params.c_str() ); - pthread_setspecific( m_conn_key, conn ); + if ( CONNECTION_OK == PQstatus( conn ) ) { + pthread_setspecific( m_conn_key, conn ); + } else { + PQfinish( conn ); + conn = NULL; + } } return conn; } diff --git a/xwords4/relay/dbmgr.h b/xwords4/relay/dbmgr.h index e0fafcaad..2faef2b05 100644 --- a/xwords4/relay/dbmgr.h +++ b/xwords4/relay/dbmgr.h @@ -63,6 +63,8 @@ class DBMgr { ~DBMgr(); + void WaitDBConn( void ); + void ClearCIDs( void ); void AddNew( const char* cookie, const char* connName, CookieID cid, From ec393bc0c8fc903d957ecc004e8c3c8109e2da6e Mon Sep 17 00:00:00 2001 From: Eric House Date: Sat, 11 Jul 2015 07:53:22 -0700 Subject: [PATCH 46/49] don't crash if intent is null --- .../android/XWords4/src/org/eehouse/android/xw4/Utils.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/Utils.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/Utils.java index 8f9b6a8cd..525dbccb2 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/Utils.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/Utils.java @@ -204,9 +204,9 @@ public class Utils { Intents is to send a different second param each time, though the docs say that param's ignored. */ - PendingIntent pi = - PendingIntent.getActivity( context, Utils.nextRandomInt(), intent, - PendingIntent.FLAG_ONE_SHOT ); + PendingIntent pi = null == intent ? null + : PendingIntent.getActivity( context, Utils.nextRandomInt(), intent, + PendingIntent.FLAG_ONE_SHOT ); Notification notification = new Notification( R.drawable.icon48x48, title, From 67f4e4475c0534ebf7dfa4f650d99a1ea1f1e4ac Mon Sep 17 00:00:00 2001 From: Eric House Date: Sat, 11 Jul 2015 08:08:22 -0700 Subject: [PATCH 47/49] manual bring-over of relay changes for invite support --- xwords4/relay/dbmgr.cpp | 13 +++++++++++++ xwords4/relay/dbmgr.h | 2 ++ xwords4/relay/xwrelay.cpp | 19 +++++++++++++------ 3 files changed, 28 insertions(+), 6 deletions(-) diff --git a/xwords4/relay/dbmgr.cpp b/xwords4/relay/dbmgr.cpp index f6cf3fb94..5d3309b8c 100644 --- a/xwords4/relay/dbmgr.cpp +++ b/xwords4/relay/dbmgr.cpp @@ -902,6 +902,19 @@ DBMgr::readArray( const char* const connName, const char* column, int arr[] ) / PQclear( result ); } +// parse something created by comms.c's formatRelayID +DevIDRelay +DBMgr::getDevID( string& relayID ) +{ + size_t pos = relayID.find_first_of( '/' ); + string connName = relayID.substr( 0, pos ); + int hid = relayID[pos + 1] - '0'; + DevIDRelay result = getDevID( connName.c_str(), hid ); + // Not an error. Remove or downlog when confirm working + logf( XW_LOGERROR, "%s(%s) => %d", __func__, relayID.c_str(), result ); + return result; +} + DevIDRelay DBMgr::getDevID( const char* connName, int hid ) { diff --git a/xwords4/relay/dbmgr.h b/xwords4/relay/dbmgr.h index 2faef2b05..839f4f3c9 100644 --- a/xwords4/relay/dbmgr.h +++ b/xwords4/relay/dbmgr.h @@ -148,6 +148,8 @@ class DBMgr { void RemoveStoredMessage( const int msgID ); void RemoveStoredMessages( vector& ids ); + DevIDRelay getDevID( string& relayID ); + private: DBMgr(); bool execSql( const string& query ); diff --git a/xwords4/relay/xwrelay.cpp b/xwords4/relay/xwrelay.cpp index ce035bc85..8343b2292 100644 --- a/xwords4/relay/xwrelay.cpp +++ b/xwords4/relay/xwrelay.cpp @@ -1780,17 +1780,24 @@ handle_udp_packet( UdpThreadClosure* utc ) break; } - case XWPDEV_INVITE: + case XWPDEV_INVITE: { DevIDRelay sender; - DevIDRelay invitee; - if ( getNetLong( &ptr, end, &sender ) - && getNetLong( &ptr, end, &invitee) ) { + string relayID; + if ( getNetLong( &ptr, end, &sender ) + && getNetString( &ptr, end, relayID ) ) { + DevIDRelay invitee; + if ( 0 < relayID.size() ) { + invitee = DBMgr::Get()->getDevID( relayID ); + } else if ( !getNetLong( &ptr, end, &invitee ) ) { + break; // failure + } logf( XW_LOGVERBOSE0, "got invite from %d for %d", sender, invitee ); post_invite( sender, invitee, ptr, end - ptr ); } break; - + } + case XWPDEV_KEEPALIVE: case XWPDEV_RQSTMSGS: { DevID devID( ID_TYPE_RELAY ); @@ -2048,7 +2055,7 @@ main( int argc, char** argv ) exit( 0 ); case 'b': doBlock = true; - break; + break; case 'c': ctrlport = atoi( optarg ); break; From 5e63d03e7659c01f2373e32c9a4a8a0d56945886 Mon Sep 17 00:00:00 2001 From: Eric House Date: Sat, 11 Jul 2015 08:23:22 -0700 Subject: [PATCH 48/49] apparently I forgot to check this in --- xwords4/android/XWords4/archive/R.java | 77 +++++++++++++------------- 1 file changed, 37 insertions(+), 40 deletions(-) diff --git a/xwords4/android/XWords4/archive/R.java b/xwords4/android/XWords4/archive/R.java index af3506f91..b95808d60 100644 --- a/xwords4/android/XWords4/archive/R.java +++ b/xwords4/android/XWords4/archive/R.java @@ -41,46 +41,43 @@ public final class R { public static final int content_copy__gen=0x7f020002; public static final int content_discard__gen=0x7f020003; public static final int content_edit=0x7f020004; - public static final int content_new__gen=0x7f020005; - public static final int content_new_net__gen=0x7f020006; - public static final int content_new_solo__gen=0x7f020007; - public static final int dict__gen=0x7f020008; - public static final int dicticon=0x7f020009; - public static final int down__gen=0x7f02000a; - public static final int downarrow=0x7f02000b; - public static final int download__gen=0x7f02000c; - public static final int email__gen=0x7f02000d; - public static final int expander_ic_maximized=0x7f02000e; - public static final int expander_ic_minimized=0x7f02000f; - public static final int flip=0x7f020010; - public static final int icon48x48=0x7f020011; - public static final int in_arrow=0x7f020012; - public static final int in_arrow_active=0x7f020013; - public static final int multigame__gen=0x7f020014; - public static final int multigame_new__gen=0x7f020015; - public static final int new_group__gen=0x7f020016; - public static final int next_hint=0x7f020017; - public static final int origin=0x7f020018; - public static final int out_arrow=0x7f020019; - public static final int out_arrow_active=0x7f02001a; - public static final int prefs__gen=0x7f02001b; - public static final int prev_hint=0x7f02001c; - public static final int refresh=0x7f02001d; - public static final int relabel__gen=0x7f02001e; - public static final int reset__gen=0x7f02001f; - public static final int rightarrow=0x7f020020; - public static final int save__gen=0x7f020021; - public static final int search__gen=0x7f020022; - public static final int select_all__gen=0x7f020023; - public static final int send__gen=0x7f020024; - public static final int shuffle=0x7f020025; - public static final int sologame__gen=0x7f020026; - public static final int stat_notify_chat=0x7f020027; - public static final int stat_notify_sync=0x7f020028; - public static final int undo=0x7f020029; - public static final int up__gen=0x7f02002a; - public static final int values=0x7f02002b; - public static final int zoom=0x7f02002c; + public static final int content_new_net__gen=0x7f020005; + public static final int content_new_solo__gen=0x7f020006; + public static final int dict__gen=0x7f020007; + public static final int dicticon=0x7f020008; + public static final int down__gen=0x7f020009; + public static final int downarrow=0x7f02000a; + public static final int download__gen=0x7f02000b; + public static final int email__gen=0x7f02000c; + public static final int expander_ic_maximized=0x7f02000d; + public static final int expander_ic_minimized=0x7f02000e; + public static final int flip=0x7f02000f; + public static final int icon48x48=0x7f020010; + public static final int in_arrow=0x7f020011; + public static final int in_arrow_active=0x7f020012; + public static final int multigame__gen=0x7f020013; + public static final int new_group__gen=0x7f020014; + public static final int next_hint=0x7f020015; + public static final int origin=0x7f020016; + public static final int out_arrow=0x7f020017; + public static final int out_arrow_active=0x7f020018; + public static final int prefs__gen=0x7f020019; + public static final int prev_hint=0x7f02001a; + public static final int refresh=0x7f02001b; + public static final int relabel__gen=0x7f02001c; + public static final int reset__gen=0x7f02001d; + public static final int rightarrow=0x7f02001e; + public static final int save__gen=0x7f02001f; + public static final int search__gen=0x7f020020; + public static final int select_all__gen=0x7f020021; + public static final int shuffle=0x7f020022; + public static final int sologame__gen=0x7f020023; + public static final int stat_notify_chat=0x7f020024; + public static final int stat_notify_sync=0x7f020025; + public static final int undo=0x7f020026; + public static final int up__gen=0x7f020027; + public static final int values=0x7f020028; + public static final int zoom=0x7f020029; } public static final class id { public static final int about_xlator=0x7f0a0001; From 6851fd9746af25f8d113a14e59159dc83f3b8f9e Mon Sep 17 00:00:00 2001 From: Eric House Date: Sat, 11 Jul 2015 08:25:10 -0700 Subject: [PATCH 49/49] include teaser from server, and launch an alert in-game instead of having the notification display everything. I've committed this before; not sure where it went. --- .../src/org/eehouse/android/xw4/GCMIntentService.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/GCMIntentService.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/GCMIntentService.java index 08122d902..f6fb0138b 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/GCMIntentService.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/GCMIntentService.java @@ -101,8 +101,15 @@ public class GCMIntentService extends GCMBaseIntentService { if ( null != value ) { String title = intent.getStringExtra( "title" ); if ( null != title ) { + String teaser = intent.getStringExtra( "teaser" ); + if ( null == teaser ) { + teaser = value; + } + Intent alertIntent = GamesListDelegate + .makeAlertIntent( this, value ); int code = value.hashCode() ^ title.hashCode(); - Utils.postNotification( context, null, title, value, code ); + Utils.postNotification( context, alertIntent, title, + teaser, code ); } } }