AndroidManifest rather than created programatically: only with this
can I get EJECT events to work. Replacement class has static
register/unregister methods which DictsActivity uses.
'commit exchange' button when there's nothing to commit, and get rid
of error message used when committing nothing since it's now
impossible (on Android).
summaries DB list of dicts in the game and a method that queries that.
Pick delete-confirmation message based on the language of dict,
whether there are others in the same language, and whether games are
using that language or that dict.
correctly with having the same dict stored in more than one place.
Added DictAndLoc with members name and loc to support this, and used
in a bunch of places in place of mere strings, including
DictsActivity. Also removed code warning when you're deleting a dict
that's not the last in its lang, which incorrectly warned that the
dict was in use when in fact I can't tell that. The warning "might be
in use" sounds dumb so it's gone for now.
local/pending changes. Fixes bug where you change language, then
choose "download more..." from a player's dict choice spinner and find
on returning to GameConfig that the language has reverted.
it; add boolean, now always passed as false, to code printing names
for game config list of players to include the dictionary. It's
useful for debugging, and I think it'd make a good optional setting,
but nobody else thinks so. Once it's checked in the change can go if
I'm not using it.
dicts passed when opening a game was based on defaults, not read in
from the game data. Oops. So now it's a two-step process: open the
data, read in the game info, generate list of dicts from that, and
open full game with list of dicts. (TODO: optimize by caching game
data across multiple reads.)
version of the list user saw when choosing the index. Fix is to use
same list. Cancel after selecting dict didn't work as the selection
listener had already copied the selected dict name over. Now the
listener leaves that for the Ok button's onclick listener.
stuff. In java, respond to util_playerScoreHeld() and
util_bonusSquareHeld() by putting up toasts with existing strings.
For util_setInTrade(), fix exchange mode. Add two buttons at bottom
that replace toolbar (and corresponding buttons on menu). Redraw
scoreboard and board with high transparency to make it clear they're
disabled. Still to do: deal with case where ability to switch which
player's tray is visible is enabled.
scheme as the rest of DlgDelegate. I'm still using a single ivar for
all dialogs, meaning they can't stack, but except for duplicate
showNotAgainDlgThen calls (where the message can be ignored) it
doesn't seem to be happening. Asserts are still in place to tell me
if I'm wrong.
crashes internally, and googling finds lots of reports/questions and
no answers. It appears NBS is broken on Android, at least for CDMA.
Might want to revisit on a newer OS version that the 2.1 I'm running
now.
listeners. They wind up getting called with mixed DlgDelegate.this
values, including one belonging to an Activity that's long-since
stopped and so the wrong ids are getting passed back.
button! Also assert the heck out of callbackIds to see if Android is
guaranteeing that no two dialogs can be up at once. I'm counting on
that, and need to know if it's not true.
button rather than just boolean. Add onDismissListener so can tell if
whole thing was backed-out of (since that's a different choice from
the two buttons "text" and "html" used in one case.) Fix compile
error that slipped by earlier: frequent clean builds required with
java.
from AndroidManifest.xml). Problem was that managed dialogs are
recreated between onStart() and onResume() yet onResume() was where
ivars (specifically m_gi) were set. Can't just set them in onStart()
because then I'd want to save state them in onStop() which isn't
guaranteed to be called. So create a function loadGame() and call it
from both, using a flag to prevent its running twice (which flag is
cleared in onPause())
dialogs depend only on bundleable ivars -- ints and strings, not Views
-- and bundle them. Don't use onPrepareDialog, only onCreateDialog,
and so call removeDialog() every time one's dismissed. Do some
refactoring to support this.
doing anything with it yet because any scheme to survive
OS-restoration has to deal with the Runnables I'm saving that can't be
bundled. Work in progress....
generalized for multiple events and map them to multiple notification
callbacks), and use it from DictsActivity to redraw the list when the
SD card comes back online. While the default android behavior works
for the unmount case (relaunches DictsActivity which correctly draws
only those dicts still available) it needs this change to redraw after
the available set grows.
so: change loadMakeGame() to return gamePtr rather than take one in,
and to return 0 when any dict no available. Move dict-gone-missing
dialog into DlgDelegate. Remove DlgDelegate always adding onDismiss
listener that removes the dialog, and instead add one to the
dict-gone-missing dialog that, like the onClick handler, calls
finish() on the activity.
figure out how to get that so I ignore it and am killed then
relaunched if I have a dict file open on the SD. On relauch, don't
crash. Instead, check if any dicts used by the game is unreachable
and put up an alert with only one choice: Close game. Thought about
using the missing-dicts stuff from GamesList, but this is a special
case that should be seen only when user umounts while a BoardActivity
instance is frontmost.
comms_resendAll() from feedMessages. The combination means that all
networked games get a chance to resend dropped packets periodically
which should help prevent stalls.
(return false) so add new iface comms can call once to get flags to
tell it whether to use that proc. One implementation of
TransportProcs returns one flag; the other, the other.
arrays into the jni, pass the full file paths in in addition to the
byte arrays. This isn't possible with the built-in dicts, but does
work for the downloaded ones (which are usually larger). This checkin
does the mmap and uses memcmp to verify that the bytes are the same as
passed in. Next step is to not pass the bytes when the path will do
and to actually use the mmap'd ptr.
dialog is up. I'm making two fixes, either of which is enough: saving
the rowid across teardown of the activity; and changing the manifest
to not tear down the activity. The reason for the latter is that the
teardown is unnecessary and wasteful. The former's just safer coding.
allow any control over whether the initial state is expanded.)
Getting click to work is a bit of a hack, requiring a callback from
the adapter back to the activity, but it works well on emulator. Need
to test on device then try to shrink the ImageButton.
with calls using formatting -- for consistency and effeciency in the
case where logging is disabled. There should be no discernable
change, though if I got and percent-format specifiers wrong I'll get
runtime exceptions.
Bad. So test if we can post (if the handler's still available) and
drop the request, freeing the thread, if not. (Access to m_handler
should probably be synchronized now that it's getting cleared, but
that's another bug.)
rare crash where class is reloaded (e.g. after long period of non-use)
after being taken down with a dialog in mid-load. The OS tries to put
the dialog back up but the dialog title string ID, passed to
setTitle() in onCreateDialog(), is 0.
singleTop is necessary, as with singleTask we get the whole actvity
stack nuked on every launch. Open a game into BoardActivity then
background Crosswords; when you re-launch from the launcher or hold
the home key you're back to GamesList. But with singleTop incoming
invite schemes would launch a second instance because though there was
one running it wasn't in the same task as the browser firing the url
to redir.php. The solution there is to move the scheme intent from
GamesList to DispatchNotify, which is already handling notifications.
There the addition of a second launch flag means that an existing
instance will always see the launch through its onNewIntent -- under
tests I've come up with so far, anyway.
postpone running up against, a memory leak that appears to be in the
java side of things. Googling suggests lots of folks are having
problems with createBitmap (though I can put the createBitmap() call
in a 50-iteration loop and not crash -- may not be the problem after
all.) Without this change I crash the 14th time opening a game. With
it I go 30 and run out of patience. Now that the board is locked in
vertical mode there's little point in recreating the bitmap anyway.
If not, give a chance to set it and a welcome message. Whatever
happens, wind up with some sort of default name so the query isn't
repeated unless user clears all defaults.
if it's not installed (because SMS apps confuses with the way it
presents multiple URLs.) Will try to do the same thing with the
redirect .php script whose output will stick around if the redirect
fails. Also, use URI.Builder instead of a format string to build the
redirect URL. It's cleaner. Still need to have a space in the format
string to keep sentence-finishing period from becoming part of the
room name. Not sure how to fix that without moving to html messages
which I assume don't work in SMS.
google's crash report site, when I try to launch something to handle
http and nothing can. Maybe people are installing Crosswords on
devices that don't have browsers.
and whose names have not yet been received from host/server -- as part
of summary. They can be drawn differently to give a clear visual
indication which games are not in play and for which the user might
want to issue an invitation.
someone. Factor out code from create-and-invite path to support this.
Move invite-related strings into resources. Still untested with
networked device (to send email.)
to local, non-robot players, which at the moment means only the first
will get used. Not sure what the right strategy is now so maybe all
but the first goes away.
between dict and language. I really want to lock the two defaults --
force to change both if one is a different language -- but am not sure
it that's easy enough to do quickly (for next beta.)
object that's defined in a layout file (class cast to the subclass
fails, as you'd expect.) Will use this to cache a dict's location.
Eventually there needs to be a DB for dict details.
(eventually) explanatory text. Currently more-or-less works,
including sending an email with a link that when clicked launches
Crosswords. (Still need to respond to that link on receipt, but I'm
at least pulling out the necessary fields.)
downloading dicts. Still to do: check if external is available before
offering; and either remove ability to download from within config
dialog or offer that choice there. Or just use a preference to
determine where storage happens. Also, on emulator game hangs during
download when using external storage.
not available and wait to be called again. Fixes occasional assertion
failure when lock held for even five seconds. Screen jerks around a
bit but otherwise seems to work well.
resusing to draw when don't have font info. Until other bugs got
fixed this must meant lots of all-white boards, and it's not strictly
necessary, but is an improvement.
smallest and human largest. Sorting works. Still need to fix when
new dicts get assigned after lang change -- too often all players wind
up inheriting the default.
that's been crashing when called from performRestoreInstanceState.
The hope is that this will prevent the crash by forcing the dialog to
always be recreated. But it may be that I just need to test for
m_missingDictNames being null....
to jni, and don't bother to assign a per-player dict when it'd be the
same as the game dict. Allows many games to have just the one, and
also fixes problems opening games saved with older versions. Duh.
DictLangCache where they can be updated when a dict is added via the
"download more..." item (inclusion of which is a hack.) Now as soon
as you return to the spinner after downloading you'll have the new
dict or lang to choose.
player: remove dictName from CurGameInfo and GameSummary classes and
from DB; deal with missing dicts (the warning, fetching and replacing)
when opening games and deleting dicts. Etc. Trivial testing passes.
Robots default to BasEnglish dict and humans to CollegeEng. Add new
per-game default for robot dict. Still need to deal with language
changes and non-English case in general.
value as previous timer, e.g. when you're tapping on players who
haven't had a turn yet. Note that without the test to prevent drawing
the same timer hints are broken -- device is too busy to make progress.
show them and another group depending on whether trading at the time.
To make that work, replace the individual calls made to dis/enable
toolbar buttons with a single jin call that takes a struct full of
booleans and make that struct available in BoardActivity where menus
are hidden/shown. Remove the individual calls from the jin interface.
capture stack trace at lock time that'll be printed out along with the
current thread's trace when I can't get a lock in one second. I'll
comment that out shortly but want it for debugging -- though it's
untested: can't repro any failure to lock now.
a write lock that will be held for a long time. One place it'll fail
is when game list item's been invalidated and wants to update. Deal
with null summary coming back there.
Add an Application subclass that fetches the value from a preference,
a checkbox setting in advanced prefs, and modify the static when
that's changed at runtime.
implementing same in GamesList up into DlgDelegate where it can be
called from both. Also, make syncing fire off the service just as the
timer does so that results generate Notifications. Makes it better
for testing if nothing else.
deleted. To do that: added interface to TransportProcs that a caller
can implement and to which it delegates the UI (error code reports).
BoardActivity implements that interface. To avoid a race condition
where the JNIThread would save the game after I'd deleted it I kill
the thread and wait for it to die before deleting the game and calling
finish().
from networked games since as currently implemented it can quickly get
them permanently out-of-sync (and cause the jni code to assert.) Need
to debug this....
Previously did so only when in background, but that leaves a problem:
if device A sends messages to B and B ACKs them so that they're
deleted but exits without saving (for any reason) the game is
permanently horked. It's safer to save immediately.
arrived in the background. When notification that game's over arrives,
add it to the flags, then on game open show the game over dialog (in
addition to raising chat activity and possibly showing recent move.)
dismissed so that they now all go through onCreateDialog() every time.
This allows to shrink or eliminate onPrepareDialog(). The hope is
that it will fix the occasional crash where restoreManagedDialogs
invokes onPrepareDialog() and some ivar I need isn't set because the
class was just reloaded.
GamesList implements that interface and invalidates the list item
corresponding so it'll get redrawn with updated info. Should allow to
replace m_invalPath but doesn't...
work of pinging relay on timer. That work, which can cause receiver
to exceed its timeout if there are e.g. problems resolving hostnames,
must be done in a thread and Receivers aren't supposed to have
threads. Seems to work as well as it did before and also fixes
force-restart bugs when the network is slow/unavailable.
history, and store it in the game record in the DB (new column). This
will allow to not drop chat messages that arrive in the background,
though that's not implemented yet.
workaround to fix a bug where the UI isn't updating often enough and
sometimes delete or other position-based long-tap menu actions on the
list act on the wrong game. This gives an order that won't change.
Revisit later if a more dynamic order is desired.
game they were passed to. This prevents duplicate messages from
generating notifications over and over -- and dupes are common when
messages stay on relay until the receiving game ACKs them.
correspondent's having occasional crashes with a single dictionary.
It appears that if it were truncated during the download that it would
appear ok until a word search spread into a missing area. This fix is
untested, and should probably be replaced by a checksum that computed
and checked after the download, but I think it's an improvement.
dependency on an open game having a visual representation. This
should allow e.g. receiving and caching chat messages that come in
while game is not in foreground.
GET_MSGS. When the messages come in, open up saved games and play
them into them, saving them after if there were any changes. Tested
by playing a two-device game all the way through fetching messages
after every move.
bytes to read from downloaded dictionary file -- because available()
will not always return the full size. I suspect this is why a German
user is crashing when using the very large 2_15 German dict.
for setting "scheme". Implement that as changing potentially several
colors but only empty cell color for now. Remove prefs for whether
cell letters follow user colors (they always will) and the new one for
frame color -- it'll always be dark grey.
color; add pref for whether highlight is black-on-white or the
reverse; and remake the board arrow in white if the background is a
dark color. It's now possible to configure various colors so that
black empty cells looks good. Next need a single control to do it.
board, explaining what the arrow's for and how to move and disable it.
Implementation required passing XWActivity into BoardView so the
newbie hint method could be called on it.
version by adding them. Can't have them default to 'now' because
that's not supported for ADDs. Can't remove columns either, so at
some point I'll need to migrate to get rid of accumulated cruft.
Timestamps are not set nor read yet.
unchanged and I'm trying to mimic the old per-game setting using the
new per-robot setting internally. Still need to change the UI to
allow move than just a boolean choice.
down. When network's down, return -1 from send proc so that comms
timing can retry. This works on both cellphone on carrier network
(with airplane mode as the test for loss/gain of network) and on
emulator (with death/restart of relay as the test since I don't know
how to kill the iface itself). A quick test on phone using wifi this
morning suggested it didn't work, that into/out of airplane mode did
not result in notifications getting set. Need to test that, and back
this out if can't be fixed since I can't break wifi.
that information to connect and not. There seems to be no way to get
notified when a socket's underlying transport goes down (might not
even want to) so this will be the best way to have the arrows go red
when the device goes into airplane mode.
threads. Greatly simplifies things, but only tested for the simplest
case, and I know it won't correctly reconnect when relay goes down.
But folks recommend against nio, and I'd like to see if I'll get
notifications in the form of blocking socket calls returning or
raising exceptions when the network goes down, something that isn't
happenening with nio.
into the java world by making it a util_ctxt function. Do same on
linux to test. We'll see how it is -- and can back this commit out if
there's no improvement.
to use when there are other dicts available in the same langauge as
the missing one that offers to substitute, and another dialog
presenting a list of same-language dicts. Then substitute the one
tapped.
thread on failure to connect, allowing comms' timer to control when we
retry. This fixes problem where would try multiple times/second to
connect when relay was down. Now we try every 15 seconds (per comms,
which can as well back-off), and shortly after the relay comes back up
connect successfully.
summaries db table, using the existing SNAPSHOT column rather than
adding a new one and upping the version. Includes utility fired at
game-start to convert existing games that seems to work. Also
improved a few queries and updates to -- I think -- use the API
better.
summaries db table, using the existing SNAPSHOT column rather than
adding a new one and upping the version. Includes utility fired at
game-start to convert existing games that seems to work. Also
improved a few queries and updates to -- I think -- use the API
better.
notice when cellular data becomes available and notify relay of dead
games then. Must be a way to notice a network interface cellular or
not without permission since I already have permission to use it.
that's the only place that is or should be calling it. And since we
can usually figure out the exact url for the dictionary go ahead and
try to download that.
in which case tell user how many games are using it when asking for
confirmation. To do that, add dict into summary DB, and to do that
add CurGameInfo into GameSummary's constructor. Also, when there's no
summary for a game, make one on the spot and add it to the db. This
will crash if the game's dict has been deleted. Need to deal with
that, probably by deleting unsummarazible games, becuase now if
somebody installs this on top of a device where a game's dict is
missing and it has no summary I'll never boot.
if it's not there. Ideally I could open the config dialog so user
could change the dict but that isn't working. Maybe just offer to
open it after swapping in the default dict?
robot with blank in tray keeps flashing the in-progress indicator by
flagging CMD_TIMER_FIRED as a non-ui event so busy() won't return when
it's what's on the queue. Problem with that is that the timer stops
advancing during a hint which is clearly not what's happened.
before passing to getString. Not sure of the circumstances but the
crash is coming from restoreManagedDialogs() -- might be related to
screen orientation changes.
tap "play game" and wind up connecting and creating an empty-room-name
game; or can dismiss the dialog and be confused because there's no way
back to it. Solution: define empty-room-name as an illegal case.
Check for it when "play game" is tapped in either config dialog and
raise an alert. And when user wants to open a game from the GamesList
activity go to the minimal config dialog if it's a relay game without
a room name.