take
@@ -26,9 +26,10 @@
New with this release
- - Pull in translations (from Weblate)
- - Re-enable F-Droid builds by disabling the new networking
- code (using MQTT -- yeah, TMI :-)
+ - Add more capable filtering to the wordlist browser (Has
+ a FAQ entry
+ even.)
+ - Enable networking via MQTT for the F-droid release
(The full changelog
@@ -36,7 +37,6 @@
Coming soon
- - Add filtering to the wordlist browser
- Improve move-via-NFC
- Support duplicate-style play (popular in France)
- Improve play-by-data-sms workaround
diff --git a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/DictBrowseDelegate.java b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/DictBrowseDelegate.java
index 4c476edb3..3f6aeee8f 100644
--- a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/DictBrowseDelegate.java
+++ b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/DictBrowseDelegate.java
@@ -701,10 +701,14 @@ public class DictBrowseDelegate extends DelegateBase
public void run() {
stopProgress();
- m_browseState.onFilterAccepted( m_dict, null );
- initList( wrapper );
- setFindPats( m_browseState.m_pats );
-
+ if ( null != wrapper ) {
+ m_browseState.onFilterAccepted( m_dict, null );
+ initList( wrapper );
+ setFindPats( m_browseState.m_pats );
+ } else {
+ makeOkOnlyBuilder(R.string.alrt_bad_filter )
+ .show();
+ }
newFeatureAlert();
}
} );
diff --git a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/MQTTUtils.java b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/MQTTUtils.java
index 84b172cae..4d8ae4d20 100644
--- a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/MQTTUtils.java
+++ b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/MQTTUtils.java
@@ -554,7 +554,7 @@ public class MQTTUtils extends Thread implements IMqttActionListener, MqttCallba
notifyNotHere( context, from.mqtt_devID, gameID );
} else {
for ( long rowid : rowids ) {
- MQTTMsgSink sink = new MQTTMsgSink( context, rowid );
+ MultiMsgSink sink = new MultiMsgSink( context, rowid );
helper.receiveMessage( rowid, sink, data );
}
}
@@ -584,13 +584,6 @@ public class MQTTUtils extends Thread implements IMqttActionListener, MqttCallba
mReturnAddr = from;
}
- @Override
- protected MultiMsgSink getSink( long rowid )
- {
- Context context = getContext();
- return new MQTTMsgSink( context, rowid );
- }
-
@Override
void postNotification( String device, int gameID, long rowid )
{
@@ -600,18 +593,10 @@ public class MQTTUtils extends Thread implements IMqttActionListener, MqttCallba
// GameUtils.postInvitedNotification( mContext, gameID, body, rowid );
}
- private void receiveMessage( long rowid, MQTTMsgSink sink, byte[] msg )
+ private void receiveMessage( long rowid, MultiMsgSink sink, byte[] msg )
{
Log.d( TAG, "receiveMessage(rowid=%d, len=%d)", rowid, msg.length );
receiveMessage( rowid, sink, msg, mReturnAddr );
}
}
-
- private static class MQTTMsgSink extends MultiMsgSink {
- MQTTMsgSink( Context context, long rowid )
- {
- super( context, rowid );
- }
- }
-
}
diff --git a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/NFCUtils.java b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/NFCUtils.java
index 4c2983127..20fe2d14c 100644
--- a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/NFCUtils.java
+++ b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/NFCUtils.java
@@ -381,7 +381,7 @@ public class NFCUtils {
addReplyFor( new byte[]{REPLY_NOGAME}, gameID[0] );
} else {
for ( long rowid : rowids ) {
- NFCMsgSink sink = new NFCMsgSink( context, rowid );
+ MultiMsgSink sink = new MultiMsgSink( context, rowid );
helper.receiveMessage( rowid, sink, body );
}
}
@@ -1042,13 +1042,6 @@ public class NFCUtils {
super( context );
}
- @Override
- protected MultiMsgSink getSink( long rowid )
- {
- Context context = getContext();
- return new NFCMsgSink( context, rowid );
- }
-
@Override
void postNotification( String device, int gameID, long rowid )
{
@@ -1057,17 +1050,10 @@ public class NFCUtils {
GameUtils.postInvitedNotification( context, gameID, body, rowid );
}
- private void receiveMessage( long rowid, NFCMsgSink sink, byte[] msg )
+ private void receiveMessage( long rowid, MultiMsgSink sink, byte[] msg )
{
Log.d( TAG, "receiveMessage(rowid=%d, len=%d)", rowid, msg.length );
receiveMessage( rowid, sink, msg, mAddr );
}
}
-
- private static class NFCMsgSink extends MultiMsgSink {
- NFCMsgSink( Context context, long rowid )
- {
- super( context, rowid );
- }
- }
}
diff --git a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/PatTableRow.java b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/PatTableRow.java
index 149a269f4..17fead4b9 100644
--- a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/PatTableRow.java
+++ b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/PatTableRow.java
@@ -23,13 +23,14 @@ import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.CheckBox;
+import android.widget.EditText;
import android.widget.TableRow;
import org.eehouse.android.xw4.jni.XwJNI.PatDesc;
public class PatTableRow extends TableRow {
private static final String TAG = PatTableRow.class.getSimpleName();
- private EditWClear mEdit;
+ private EditText mEdit;
private CheckBox mCheck;
public PatTableRow( Context context, AttributeSet as )
@@ -67,22 +68,14 @@ public class PatTableRow extends TableRow {
boolean handled = mEdit.hasFocus();
if ( handled ) {
- mEdit.insertBlank( blank );
+ mEdit.getText().insert(mEdit.getSelectionStart(), blank );
}
return handled;
}
private void getFields()
{
- for ( int ii = 0;
- (null == mEdit || null == mCheck) && ii < getChildCount();
- ++ii ) {
- View view = getChildAt( ii );
- if ( view instanceof EditWClear ) {
- mEdit = (EditWClear)view;
- } else if ( view instanceof CheckBox ) {
- mCheck = (CheckBox)view;
- }
- }
+ mEdit = (EditText)Utils.getChildInstanceOf( this, EditText.class );
+ mCheck = (CheckBox)Utils.getChildInstanceOf( this, CheckBox.class );
}
}
diff --git a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/XWServiceHelper.java b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/XWServiceHelper.java
index 90d070d6c..169718497 100644
--- a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/XWServiceHelper.java
+++ b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/XWServiceHelper.java
@@ -50,7 +50,11 @@ abstract class XWServiceHelper {
Context getContext() { return mContext; }
- abstract MultiMsgSink getSink( long rowid );
+ MultiMsgSink getSink( long rowid )
+ {
+ return new MultiMsgSink( getContext(), rowid );
+ }
+
abstract void postNotification( String device, int gameID, long rowid );
protected ReceiveResult receiveMessage( int gameID,
diff --git a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/jni/XwJNI.java b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/jni/XwJNI.java
index a8a4c5660..4e1e546a5 100644
--- a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/jni/XwJNI.java
+++ b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/jni/XwJNI.java
@@ -619,9 +619,13 @@ public class XwJNI {
new Thread( new Runnable() {
@Override
public void run() {
+ IterWrapper wrapper = null;
long iterPtr = di_init( jniState, dictPtr, pats,
minLen, maxLen );
- callback.onIterReady( new IterWrapper(iterPtr) );
+ if ( 0 != iterPtr ) {
+ wrapper = new IterWrapper(iterPtr);
+ }
+ callback.onIterReady( wrapper );
}
} ).start();
}
diff --git a/xwords4/android/app/src/main/res/layout/dict_browser.xml b/xwords4/android/app/src/main/res/layout/dict_browser.xml
index b539b801f..f078587f0 100644
--- a/xwords4/android/app/src/main/res/layout/dict_browser.xml
+++ b/xwords4/android/app/src/main/res/layout/dict_browser.xml
@@ -53,10 +53,12 @@
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>
-
+
+
-
+
@@ -82,9 +83,8 @@
-
+
@@ -95,9 +95,8 @@
-
+
diff --git a/xwords4/android/app/src/main/res/values/strings.xml b/xwords4/android/app/src/main/res/values/strings.xml
index e2ff1e2ed..c923c060c 100644
--- a/xwords4/android/app/src/main/res/values/strings.xml
+++ b/xwords4/android/app/src/main/res/values/strings.xml
@@ -37,21 +37,21 @@
Configured for room
- \"%1$s\"
+ “%1$s”
Waiting for players in room
- \"%1$s\"
+ “%1$s”
- Game in play in room \"%1$s\"
+ Game in play in room “%1$s”
- Game over in room \"%1$s\"
+ Game over in room “%1$s”
Players invited
- Players invited to room \"%1$s\"
+ Players invited to room “%1$s”
Game over
Games that have already connected
- to the relay cannot be copied. Use \"New from\" for a
+ to the relay cannot be copied. Use “New from” for a
ready-to-play copy with all the same settings.
Rename game
@@ -337,7 +337,7 @@
- How to handle \"phonies\"
+ How to handle “phonies”
(words not in wordlist)
@@ -354,7 +354,7 @@
At least one player must
- be marked \"Remote\" for a game started as Host.
+ be marked “Remote” for a game started as Host.
(Off-device player)
@@ -468,11 +468,11 @@
The number of players missing is substituted for "%1$d". -->
- This game is waiting for one remote
- player. Would you like to invite someone to join -- assuming you
- haven\'t already?
+ player. Would you like to invite someone to join—assuming you
+ haven’t already?
- This game is waiting for %1$d remote
- players. Would you like to invite someone to join -- assuming
- you haven\'t already?
+ players. Would you like to invite someone to join—assuming
+ you haven’t already?
- You have already invited a remote player to
@@ -497,7 +497,7 @@
players to invite, IF the number of missing players is
greater than one this text is appended to the above. -->
\u0020(You are expecting multiple
- remote players. You don\'t have to invite them all at once, but
+ remote players. You don’t have to invite them all at once, but
this alert will not be dismissed until everybody has been invited
and all invitations have been accepted.)
Invite sent via Data SMS to phone
@@ -505,13 +505,13 @@
Invite sent via SMS to %1$s on %2$s
This new option launches your
- default SMS app with an invitation ready to send -- when it
- works. Each SMS app is different, and some won\'t
+ default SMS app with an invitation ready to send—when it
+ works. Each SMS app is different, and some won’t
cooperate.
Unable to launch SMS app
Invite sent via Bluetooth to
- paired device \"%1$s\" on %2$s
+ paired device “%1$s” on %2$s
Invite forwarded by the relay
to another device on %1$s
Invite sent via %1$s on
@@ -528,15 +528,15 @@
only once per game. -->
- Device %1$d connected to relay in
- room \"%2$s\". Waiting for one player.
+ room “%2$s”. Waiting for one player.
- Device %1$d connected to relay in
- room \"%2$s\". Waiting for %3$d players.
+ room “%2$s”. Waiting for %3$d players.
All players are here in room
- \"%1$s\".
+ “%1$s”.
Connection problem
@@ -557,7 +557,7 @@
relay. Once this happens there is no way to continue the
game so you might as well delete it (unless you're saving it
for its history etc.) -->
- The game named \"%1$s\" has been
+ The game named “%1$s” has been
deleted on another device. You will not be able to play any
further.
Tapping on scoreboard name shows
- that player\'s tiles
+ that player’s tiles
-
+
@@ -1038,8 +1038,8 @@
- Let\'s play CrossWords
- Let\'s play CrossWords (room %1$s)
+ Let’s play CrossWords
+ Let’s play CrossWords (room %1$s)
- You can\'t do that; it\'s not
+ You can’t do that; it’s not
your turn!
- No peeking at the robot\'s
+ No peeking at the robot’s
tiles!
No peeking at remote
- players\' tiles!
+ players’ tiles!
@@ -1160,7 +1160,7 @@
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.] -->
- Tile assignment can\'t be
+ Tile assignment can’t be
undone.
- Game \"%1$s\" requires a %2$s wordlist.
+ Game “%1$s” requires a %2$s wordlist.
Please download one before opening.
- Unable to open game \"%1$s\" because
+ Unable to open game “%1$s” because
wordlist %2$s not found. (It may have been deleted, or stored
on an external card that is no longer available.)\n\nYou can
download a replacement or substitute another %3$s
@@ -1233,7 +1233,7 @@
############################################################
-->
- Password for \"%1$s\":
+ Password for “%1$s”:
Game %1$d
@@ -1327,7 +1327,7 @@
###########################################################
-->
- Here\'s a tip
+ Here’s a tip
Do not show again
@@ -1388,7 +1388,7 @@
- Tapping the \"pts\" counter that
+ Tapping the “pts” counter that
appears at the right end of the rack is the easiest way to
commit a move.
-
+
@@ -1430,19 +1430,23 @@
Board screen. The idea is that you're tapping around
figuring out how to play and when you tap an empty cell the
arrow appears. This explains it. -->
- Moving tiles to the board:\nYou can
- drag tiles between the rack and the board, or you can tap an
- empty square to place the board arrow. Rack tiles you tap will
- replace the arrow (moving it one square in the direction it
- points.) Tap the arrow once to change its orientation; a second
- time, to hide it. A checkbox in the Appearance section of
- Settings will hide it permanently.
+ There are two ways to move tiles to
+ the board.
+ \n\n
+ • You can drag them between the rack and the board.
+ \n\n
+
+ • Or you can tap an empty square on the board to place the “board
+ arrow.” Then tiles in the rack replace the arrow when you tap
+ them. Tap the arrow to change its direction or to hide it.
+
+
The player whose turn it is
is drawn large in the scoreboard.\n\nHold your finger on a name in
- the scoreboard to get details about that player\'s most recent
+ the scoreboard to get details about that player’s most recent
move.
Create a new ready-to-play game
@@ -1465,7 +1469,7 @@
Please enter your name
here. It will be used when creating new games. (You can change it
- later in the \"New game default\" section of Settings.)
+ later in the “New game default” section of Settings.)
Toolbar icons by Sarah Chu. Navbar
- icons from the Noun Project: \"archive\" by Trendy; \"rematch\" by
- Becris; and \"swap\" by iconomania.
+ icons from the Noun Project: “archive” by Trendy; “rematch” by
+ Becris; and “swap” by iconomania.
Recent changes
@@ -1523,9 +1527,9 @@
This button lets you look up,
online, the words just played.
Archiving uses a special group
- called \"Archive\" to store finished games you want to keep. And,
+ called “Archive” to store finished games you want to keep. And,
since deleting an entire archive is easy, archiving is also a
- great way to mark games for deletion – if that\'s what you prefer
+ great way to mark games for deletion – if that’s what you prefer
to do.\n\n(Deleting the Archive group is safe because it will be
created anew when needed.)
@@ -1555,7 +1559,7 @@
but nothing can be done because there's not focussed text
field -->
This button inserts a blank at
- the active text field\'s cursor, but there is no cursor
+ the active text field’s cursor, but there is no cursor
now.
@@ -1588,7 +1592,7 @@
%1$s (%2$d words total)
This button opens the wordlist
- browser on the current player\'s wordlist.
+ browser on the current player’s wordlist.
This button opens the wordlist
browser on the wordlist of your choice.
@@ -1608,6 +1612,8 @@
The minimum length value cannot be
greater than the maximum value.
+
+ Unable to apply filter.
@@ -1617,11 +1623,10 @@
- This wordlist browser now has
- dramatically improved filtering abilities. As an example, you can
- show all words containing \"QU\" and ending in \"ING\".\n\nAccess
- filtering by tapping the Expander button at the upper-right corner
- of the window.\n\nRead more on the FAQ by tapping the button
+ You can now filter wordlists
+ based on what they start with, end with, and/or contain. Access
+ filtering by tapping the Expander Arrow at the upper-right corner
+ of the window.\n\nRead more in the FAQ by tapping the button
below.
Email author
@@ -1631,7 +1636,7 @@
Send comment via
(If relevant, please include the
- version: \"%1$s\"; and make/model of your phone or
+ version: “%1$s”; and make/model of your phone or
tablet.)
@@ -1660,11 +1665,11 @@
Tap to open the new game
The version of CrossWords on
- \"%1$s\" is incompatible with this one for play using
+ “%1$s” is incompatible with this one for play using
Bluetooth. One of you may need to upgrade before you can
continue.
The version of CrossWords on the
- phone with number \"%1$s\" is incompatible with this one for play
+ phone with number “%1$s” is incompatible with this one for play
using Data SMS. One of you may need to upgrade before you can
continue.
@@ -1710,15 +1715,15 @@
- Please check the phone number you want to
- invite to your new game, then tap \"%2$s\".
+ invite to your new game, then tap “%2$s”.
- Please check the %1$d phone numbers you
- want to invite to your new game, then tap \"%2$s\".
+ want to invite to your new game, then tap “%2$s”.
Your SMS messaging app will then be
launched with a message for you to send to the phone number
- you\'ve selected.
+ you’ve selected.
A data message will then be
@@ -1728,28 +1733,28 @@
- Please check the device you want to invite
- to your new game, then tap \"%2$s\".
+ to your new game, then tap “%2$s”.
- Please check the %1$d devices you want to invite
- to your new game, then tap \"%2$s\".
+ to your new game, then tap “%2$s”.
- Please select the name of the
WiFiDirect device you want to invite to your new game, then tap
- \"%2$s\".
+ “%2$s”.
- Please select the %1$d WiFiDirect device names you
- want to invite to your new game, then tap \"%2$s\".
+ want to invite to your new game, then tap “%2$s”.
Only devices that are
- currently available are shown. If a nearby device isn\'t showing
+ currently available are shown. If a nearby device isn’t showing
up please make sure that WiFi is turned on, that CrossWords is
installed, and that play via WiFi Direct is enabled.
The number %1$s for %2$s is not
- a \"mobile\" number. Import anyway?
+ a “mobile” number. Import anyway?
This phone list is empty. Use the
- \"Import contact\" button to add people you want to invite, the +
+ “Import contact” button to add people you want to invite, the +
button to enter numbers directly.
No paired devices detected yet.
@@ -1757,8 +1762,8 @@
reachable via WiFiDirect that have CrossWords installed.
This list of devices is
- empty. Use the \"Scan games\" button to scan your old games
- for opponents. Use the \"+\" button to enter device IDs directly.
+ empty. Use the “Scan games” button to scan your old games
+ for opponents. Use the “+” button to enter device IDs directly.
Manual entry
Device phone number:
@@ -1790,7 +1795,7 @@
Game in play with %1$s
Are you certain this number is on an
- account with unlimited texting? Tap \"Cancel\" if you are
+ account with unlimited texting? Tap “Cancel” if you are
not.
Remote device undid a turn.
@@ -1816,7 +1821,7 @@
Summary unavailable
This networked game has no way
to connect and cannot be played.\n\n(It was probably created from
- an invitation that didn\'t specify any way of connecting that your
+ an invitation that didn’t specify any way of connecting that your
device supports, or you may have recently removed its last way of
connecting.)
@@ -1854,7 +1859,7 @@
Warning: This feature is meant for
phones with unlimited texting plans. Once you enable it dozens of
Data SMS messages will be sent (invisibly) for each game
- played. If you don\'t have an unlimited plan your carrier may
+ played. If you don’t have an unlimited plan your carrier may
charge you for each and every message!\n\nShould play via Data SMS
be enabled?
@@ -1864,7 +1869,7 @@
Yes: I have unlimited texting
- Yes: I\'ll pay all carrier charges
+ Yes: I’ll pay all carrier charges
Play via Data SMS is currently
disabled. No moves will be sent via Data SMS.\n\nYou can enable
@@ -1978,7 +1983,7 @@
Archive\u200C
Move to Archive
Archive
- The group \"%1$s\" already exists.
+ The group “%1$s” already exists.
Reconnect
Square rack tiles
Even if they can be taller
@@ -1987,7 +1992,7 @@
Tapping a game opens it.\n\nYou
can instead tap the icons at the left to select or deselect games,
then act on selected games, e.g. to delete them, using the menu or
- \"Actionbar.\"
+ “Actionbar.”
The back button clears any
selection instead of exiting. Hit it again to exit the
app.
@@ -2110,14 +2115,14 @@
wordlists and view the ones you already have.\n\nWhat wordlists
you have installed determines:\n• What languages you can play
in\n• How smart the robot player is\n• What words are
- legal\n\nCheck the \"Show downloadable\" box at the top to see
- what\'s available.
+ legal\n\nCheck the “Show downloadable” box at the top to see
+ what’s available.
Use tablet (side-by-side) layout?
Use default for my device
Force tablet layout
Force phone layout
- Reminder: It\'s your turn
+ Reminder: It’s your turn
Close
Re-invite
- (This dialog will stay up until all
+ (You will see this dialog until all
remote players have connected. You can close the game if you
expect it to take a while. Remote players will still be able to
connect, and you will be notified when they do.)
@@ -2232,7 +2237,7 @@
Turn reminders
Disable network game reminders
Do not notify me no matter
- how long it\'s been my turn
+ how long it’s been my turn
Disable solo game reminders
Your device is set up for
%1$s. Would you like to download a wordlist so you can play
@@ -2271,7 +2276,7 @@
Short-circuit SMS to self
Skip radio when phone numbers same
Pretend to have radio
- Don\'t pretend
+ Don’t pretend
Tablet/no radio
GSM
CDMA
@@ -2283,7 +2288,7 @@
URL for relay web API
URL for new MQTT-based relay API
Fetch default wordlist for language
- Don\'t try a second time
+ Don’t try a second time
SMS Stuff
Prefs related to play-via-sms
Relay Stuff
@@ -2301,11 +2306,11 @@
connect.\n\nPlease try opening the game again later after
conditions have changed.
(This game can also connect
- via %1$s, so if you\'d like to play the game without a relay
+ 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?
+ 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
@@ -2313,27 +2318,27 @@
Not all carriers support play
via Data SMS.
Enable
- The \"relay\" is a server on
+ 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 Data SMS uses the
- technology on which \"texting\" is built. Though the messages are
+ technology on which “texting” is built. Though the messages are
invisible to you, your carrier bills them as 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.
+ nearby device that’s “paired” with yours.
Use WiFi Direct to play against a
nearby WiFi Direct-capable device with CrossWords installed.
Cannot find any moves
Rematch is limited to
- two-person games, at least for now, because it\'s harder with more
- devices and I think it\'s rare that people play with more than
- two. Let me know if I\'m wrong and I\'ll up the priority.
+ two-person games, at least for now, because it’s harder with more
+ devices and I think it’s rare that people play with more than
+ two. Let me know if I’m wrong and I’ll up the priority.
Show SMS sends, receives
Show FCM receives
@@ -2347,7 +2352,7 @@
Invitation URL
- The \"%1$s\" option copies an
+ The “%1$s” option copies an
invitation URL to the clipboard. Paste it into the app of your
choice and send it to your friend.
Are you sure you want to delete
@@ -2361,7 +2366,7 @@
Mark corrupt
You are using the default
- player name \"%1$s\". Would you like to personalize with your own
+ player name “%1$s”. Would you like to personalize with your own
name before you create this game?
This game has sent no invitations
This change will take effect after you
@@ -2382,25 +2387,25 @@
\n\n
You can read more using the button below.
CrossWords needs access to
- temporary storage to keep what you\'re about to download.
+ temporary storage to keep what you’re about to download.
CrossWords needs permission to send an invitation via Data SMS.
- CrossWords can store and read wordlists in your device\'s
+ CrossWords can store and read wordlists in your device’s
Downloads area but it needs permission to access them
there.\n\nYou can safely deny this permission if you will never
download wordlists except from inside CrossWords and have not
previously stored any there.
- Some phones can exchange SMS \"data\" messages. CrossWords would
+ Some phones can exchange SMS “data” messages. CrossWords would
like to offer you this option but needs to ask your device about
- itself first (to learn if it\'s a phone and if so what
- type.)\n\nIf your device can\'t send data SMS (e.g. because it
- isn\'t a phone) or you don\'t ever want to play via SMS
- (e.g. because you pay for each message), it\'s safe to permanently
+ itself first (to learn if it’s a phone and if so what
+ type.)\n\nIf your device can’t send data SMS (e.g. because it
+ isn’t a phone) or you don’t ever want to play via SMS
+ (e.g. because you pay for each message), it’s safe to permanently
deny permission.
@@ -2416,8 +2421,8 @@
Data SMS.
CrossWords wants access to your contacts in order to put a name to
- phone numbers that send you invitations via Data SMS. You\'ll
- still be able to receive invitations if you don\'t grant this
+ phone numbers that send you invitations via Data SMS. You’ll
+ still be able to receive invitations if you don’t grant this
permission, but only the phone number of the sender will be
displayed.
@@ -2440,14 +2445,14 @@
In-game events
Stalled messaging alerts
- If a scan doesn\'t find the device you expect:\n
+ If a scan doesn’t find the device you expect:\n
• First, just Rescan\n
• Make sure Bluetooth is enabled on the other device\n
• Launch CrossWords on the other device\n
• If all else fails, reboot this device\n
Show stalled network notification
- Notify when Android\'s
+ Notify when Android’s
slow to process outgoing invitations and moves
Message sending is stalled
%1$s (and others?) could not send outbound messages
@@ -2460,17 +2465,19 @@
Read more
This game is set up to communicate via data SMS, but apps from the Google Play Store are no longer allowed to do so (with rare exceptions). You can still open the game, but it may not be able to send or receive moves.
\n
-\nYou can remove the data SMS communication setting, or use the \"Read more\" button to check progress on the development of an alternative.
+\nYou can remove the data SMS communication setting, or use the “Read more” button to check progress on the development of an alternative.
Check for moves how?
Poll only: no FCM messages
FCM only: no polling
Default: mix polling and FCM
You can look up words BEFORE
- they\'re committed as moves -- by long-tapping, same as committed
- words.\n\nUse this feature to check the validity of words you\'re
- thinking of playing, or to look up an unfamiliar word provided as a
- hint.
+ they’re committed as moves—by long-tapping, same as committed
+ words.\n\nUse this feature to check the validity of words you’re
+ thinking of playing, or to look up an unfamiliar word provided as a
+ hint.
+
For transmitting CrossWords moves
+
Duplicate mode
@@ -2478,16 +2485,19 @@
Dup
%1$s (dup.)
+
Submit the current move?\n
- Play in \"duplicate-mode\"
+ Play in “duplicate-mode”
(Experimental!!!) Style of play
- where all players have the same tiles
+ where all players have the same tiles
+ mode. Will go away once it's no longer experimental. -->
+
Unhide duplicate-mode options
- (It\'s too experimental right now)
+ (It’s too experimental right now)
+
Same tiles assigned to all players
@@ -2542,13 +2552,13 @@
Forget message
- Why I\'m doing this
+ Why I’m doing this
Player %1$s has paused this game.
Player %1$s has un-paused this game.
Player %1$s has paused this game, with this explanation: %2$s
Player %1$s has un-paused
this game, with this explanation: %2$s
- The timer for game \"%1$s\" expired without
+ The timer for game “%1$s” expired without
any moves being made, so it has been paused for you.
Unpaused after %2$s by: %1$s.
Paused by: %1$s.
@@ -2583,12 +2593,12 @@
browser. Displayed below are the possible
spellings. Currently this can only happen with Hungarian
wordlists. -->
- Pick a tile \"spelling\"
+ Pick a tile “spelling”
- \"%1$s\" cannot be spelled with %2$s tiles.
+ “%1$s” cannot be spelled with %2$s tiles.
New Feature Alert
@@ -2597,6 +2607,6 @@
Internet/MQTT
MQTT Invitation
- I\'m experimenting with this
+ I’m experimenting with this
as a replacement for the relay.
diff --git a/xwords4/android/app/src/main/res/values/styles.xml b/xwords4/android/app/src/main/res/values/styles.xml
index a8eb22343..b86d8f6d4 100644
--- a/xwords4/android/app/src/main/res/values/styles.xml
+++ b/xwords4/android/app/src/main/res/values/styles.xml
@@ -120,10 +120,12 @@