From 32c264cc1662caf5a754db38e2fde89cfd7029c2 Mon Sep 17 00:00:00 2001 From: Eric House Date: Sat, 8 Apr 2017 14:09:34 -0700 Subject: [PATCH 01/18] cleanup: got confused by two separated hide tests --- .../main/java/org/eehouse/android/xw4/PrefsDelegate.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/PrefsDelegate.java b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/PrefsDelegate.java index 5377bef34..d79b0dedc 100644 --- a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/PrefsDelegate.java +++ b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/PrefsDelegate.java @@ -367,7 +367,7 @@ public class PrefsDelegate extends DelegateBase private void hideStuff() { - if ( !Utils.isGSMPhone( m_activity ) ) { + if ( !Utils.isGSMPhone( m_activity ) || Perms23.haveNativePerms() ) { hideOne( R.string.key_enable_sms, R.string.key_network_behavior ); } @@ -379,10 +379,6 @@ public class PrefsDelegate extends DelegateBase hideOne( R.string.key_disable_dualpane, R.string.prefs_appearance ); } - if ( Perms23.haveNativePerms() ) { - hideOne( R.string.key_enable_sms, R.string.key_network_behavior ); - } - if ( ! BuildConfig.WIDIR_ENABLED ) { hideOne( R.string.key_enable_p2p, R.string.key_network_behavior ); } From f33488f02006b3a1c32f4698a1aa6dfb7acbe985 Mon Sep 17 00:00:00 2001 From: Eric House Date: Sat, 8 Apr 2017 14:29:07 -0700 Subject: [PATCH 02/18] fix release builds Gradle'd changed the name of one of the signing-related tasks. --- xwords4/android/app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xwords4/android/app/build.gradle b/xwords4/android/app/build.gradle index c1a5e65d8..80e2a5f56 100644 --- a/xwords4/android/app/build.gradle +++ b/xwords4/android/app/build.gradle @@ -238,7 +238,7 @@ task cleanNDK(type: Exec) { } gradle.taskGraph.whenReady { taskGraph -> - if ( taskGraph.hasTask(':app:validateReleaseSigning') ) { + if ( taskGraph.hasTask(':app:validateSigningXw4Release') ) { def pass if (System.getenv("ANDROID_RELEASE_PASSWORD")) { pass = System.getenv("ANDROID_RELEASE_PASSWORD") From 6c5ab3ff1a888e97e5021978f3de9f12d77800f3 Mon Sep 17 00:00:00 2001 From: Eric House Date: Sat, 8 Apr 2017 14:36:30 -0700 Subject: [PATCH 03/18] tweak changelog order --- xwords4/android/app/src/main/assets/changes.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/xwords4/android/app/src/main/assets/changes.html b/xwords4/android/app/src/main/assets/changes.html index 15ce269b7..eb5c2a542 100644 --- a/xwords4/android/app/src/main/assets/changes.html +++ b/xwords4/android/app/src/main/assets/changes.html @@ -28,10 +28,10 @@

New with this release

  • Enable side-by-side display for tablets
  • +
  • In service of above, rewrite pretty much everything + dialog-related. :-) (Please report bugs!)
  • Capitalize the W in CrossWords: this is not a crossword puzzle game
  • -
  • In service of above, rewrite pretty much everything - dialog-related. :-)
  • Fix game timers
  • Make blank-tile-picker dialog prettier
  • Remove pick-face-up option for networked games. (It didn't From c77478073044524fec09ec9b79a96bc05e9a5a78 Mon Sep 17 00:00:00 2001 From: Eric House Date: Mon, 10 Apr 2017 06:54:38 -0700 Subject: [PATCH 04/18] don't display info about disabling when disabled --- .../src/main/java/org/eehouse/android/xw4/BoardDelegate.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/BoardDelegate.java b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/BoardDelegate.java index 32bd6af0c..a02beae0b 100644 --- a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/BoardDelegate.java +++ b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/BoardDelegate.java @@ -2813,12 +2813,16 @@ public class BoardDelegate extends DelegateBase // If I'm upgrading and running this for the first time show an // explanation about the new dualpane feature + // + // TODO remove a few weeks after shipping a version that includes it private static boolean s_dpShown = false; private void checkAddDualpaneExpl() { if ( !s_dpShown ) { s_dpShown = true; if ( XWPrefs.getIsTablet( m_activity ) + && !XWPrefs.getPrefsBoolean( m_activity, R.string + .key_disable_dualpane, false ) && !Utils.onFirstVersion(m_activity ) ) { makeNotAgainBuilder( R.string.invite_dualpane, R.string.key_notagain_dualpane ) From cbac691be32f7e503c4474bd6f109318e2274eaf Mon Sep 17 00:00:00 2001 From: Eric House Date: Mon, 10 Apr 2017 20:32:11 -0700 Subject: [PATCH 05/18] fix crash on old (2.3) devices Was already using the safe test for wifidirect everywhere else... --- .../main/java/org/eehouse/android/xw4/InviteChoicesAlert.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/InviteChoicesAlert.java b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/InviteChoicesAlert.java index c74eb420d..2302c2b10 100644 --- a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/InviteChoicesAlert.java +++ b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/InviteChoicesAlert.java @@ -82,7 +82,7 @@ public class InviteChoicesAlert extends DlgDelegateAlert { items.add( getString( R.string.invite_choice_relay ) ); means.add( InviteMeans.RELAY ); } - if ( WiDirService.enabled() ) { + if ( WiDirWrapper.enabled() ) { items.add( getString( R.string.invite_choice_p2p ) ); means.add( InviteMeans.WIFIDIRECT ); } From fdd1e5c14884db1e96eb4ea770762992920a447f Mon Sep 17 00:00:00 2001 From: Eric House Date: Mon, 10 Apr 2017 20:33:25 -0700 Subject: [PATCH 06/18] fix NPE in new logging code --- .../app/src/main/java/org/eehouse/android/xw4/MainActivity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/MainActivity.java b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/MainActivity.java index 7c8ecaf9a..76e2d0f85 100644 --- a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/MainActivity.java +++ b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/MainActivity.java @@ -357,7 +357,7 @@ public class MainActivity extends XWActivity private void logPaneFragments() { - if ( BuildConfig.DEBUG ) { + if ( BuildConfig.DEBUG && null != m_root ) { List pairs = new ArrayList<>(); int childCount = m_root.getChildCount(); for ( int ii = 0; ii < childCount; ++ii ) { From 5bbfd443338fd07a31e94f9e7f1803356f884281 Mon Sep 17 00:00:00 2001 From: Eric House Date: Wed, 12 Apr 2017 07:37:53 -0700 Subject: [PATCH 07/18] try to dismiss duplicate alerts Each alert gets a unique name. Add to backstack, and before doing so look for another with the same name and dismiss it. This works most of the time, especially to prevent them from piling up with orientation changes. But in a robot-vs-robot game, and occasionally in a game with three robots and one not, SCORE alerts stack up. It's the removal that's failing, not the test for a duplicate, so perhaps I need to somehow wait for it to succeed before adding the new alert. --- .../org/eehouse/android/xw4/AboutAlert.java | 4 +++ .../eehouse/android/xw4/BoardDelegate.java | 5 ++- .../java/org/eehouse/android/xw4/DBAlert.java | 24 +++++++++++--- .../org/eehouse/android/xw4/DelegateBase.java | 5 ++- .../eehouse/android/xw4/DlgDelegateAlert.java | 20 ++++++++---- .../java/org/eehouse/android/xw4/DlgID.java | 2 -- .../org/eehouse/android/xw4/LookupAlert.java | 4 +++ .../org/eehouse/android/xw4/MainActivity.java | 31 +++++++++++++------ .../eehouse/android/xw4/TilePickAlert.java | 5 ++- .../org/eehouse/android/xw4/XWActivity.java | 21 +++++++++++-- .../eehouse/android/xw4/XWDialogFragment.java | 4 ++- 11 files changed, 93 insertions(+), 32 deletions(-) diff --git a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/AboutAlert.java b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/AboutAlert.java index 279466427..c19ad0198 100644 --- a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/AboutAlert.java +++ b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/AboutAlert.java @@ -37,6 +37,7 @@ import junit.framework.Assert; import org.eehouse.android.xw4.loc.LocUtils; public class AboutAlert extends XWDialogFragment { + private static final String TAG = AboutAlert.class.getSimpleName(); public static AboutAlert newInstance() { @@ -82,4 +83,7 @@ public class AboutAlert extends XWDialogFragment { .setPositiveButton( android.R.string.ok, null ) .create(); } + + @Override + protected String getFragTag() { return TAG; } } diff --git a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/BoardDelegate.java b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/BoardDelegate.java index a02beae0b..97dd89415 100644 --- a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/BoardDelegate.java +++ b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/BoardDelegate.java @@ -309,9 +309,8 @@ public class BoardDelegate extends DelegateBase int title = (Integer)params[0]; String msg = (String)params[1]; ab.setMessage( msg ); - if ( 0 != title ) { - ab.setTitle( title ); - } + Assert.assertTrue( 0 != title ); + ab.setTitle( title ); ab.setPositiveButton( android.R.string.ok, null ); if ( DlgID.DLG_SCORES == dlgID ) { if ( null != m_mySIS.words && m_mySIS.words.length > 0 ) { diff --git a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/DBAlert.java b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/DBAlert.java index 4da52eac2..dadc9f79d 100644 --- a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/DBAlert.java +++ b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/DBAlert.java @@ -26,6 +26,9 @@ import android.os.Bundle; import android.os.Bundle; import android.os.Handler; import android.support.v4.app.DialogFragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; import org.eehouse.android.xw4.loc.LocUtils; @@ -62,12 +65,23 @@ public class DBAlert extends XWDialogFragment { public DBAlert() {} - public DlgID getDlgID() { return mDlgID; } + public DlgID getDlgID() { + if ( null == mDlgID ) { + mDlgID = DlgID.values()[getArguments().getInt(DLG_ID_KEY, -1)]; + } + return mDlgID; + } + + @Override + public String getFragTag() + { + return getDlgID().toString(); + } @Override public void onSaveInstanceState( Bundle bundle ) { - bundle.putInt( DLG_ID_KEY, mDlgID.ordinal() ); + bundle.putInt( DLG_ID_KEY, getDlgID().ordinal() ); bundle.putSerializable( PARMS_KEY, mParams ); super.onSaveInstanceState( bundle ); } @@ -78,7 +92,6 @@ public class DBAlert extends XWDialogFragment { if ( null == sis ) { sis = getArguments(); } - mDlgID = DlgID.values()[sis.getInt(DLG_ID_KEY, -1)]; mParams = (Object[])sis.getSerializable(PARMS_KEY); XWActivity activity = (XWActivity)getActivity(); @@ -87,7 +100,8 @@ public class DBAlert extends XWDialogFragment { if ( null == dialog ) { dialog = LocUtils.makeAlertBuilder( getActivity() ) .setTitle( "Stub Alert" ) - .setMessage( String.format( "Unable to create for %s", mDlgID.toString() ) ) + .setMessage( String.format( "Unable to create for %s", + getDlgID().toString() ) ) .setPositiveButton( "Bummer", null ) // .setNegativeButton( "Try now", new OnClickListener() { // @Override @@ -103,7 +117,7 @@ public class DBAlert extends XWDialogFragment { public void run() { MainActivity activity = (MainActivity)getActivity(); if ( null != activity ) { - DBAlert newMe = newInstance( mDlgID, mParams ); + DBAlert newMe = newInstance( getDlgID(), mParams ); activity.show( newMe ); dismiss(); // kill myself... } else { diff --git a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/DelegateBase.java b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/DelegateBase.java index a2d18ab8a..cf141743a 100644 --- a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/DelegateBase.java +++ b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/DelegateBase.java @@ -438,8 +438,7 @@ public class DelegateBase implements DlgClickNotify, protected void showDialogFragment( DlgID dlgID, Object... params ) { - DialogFragment fragment = DBAlert.newInstance( dlgID, params ); - show( fragment ); + show( DBAlert.newInstance( dlgID, params ) ); } protected void show( DlgState state ) @@ -468,7 +467,7 @@ public class DelegateBase implements DlgClickNotify, show( df ); } - protected void show( DialogFragment df ) + protected void show( XWDialogFragment df ) { if ( m_activity instanceof XWActivity ) { ((XWActivity)m_activity).show( df ); diff --git a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/DlgDelegateAlert.java b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/DlgDelegateAlert.java index 4414ca569..0c7401047 100644 --- a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/DlgDelegateAlert.java +++ b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/DlgDelegateAlert.java @@ -47,12 +47,14 @@ abstract class DlgDelegateAlert extends XWDialogFragment { protected final DlgState getState( Bundle sis ) { - if ( null != sis ) { - m_state = (DlgState)sis.getParcelable( STATE_KEY ); - } else { - Bundle args = getArguments(); - Assert.assertNotNull( args ); - m_state = DlgState.fromBundle( args ); + if ( m_state == null ) { + if ( null != sis ) { + m_state = (DlgState)sis.getParcelable( STATE_KEY ); + } else { + Bundle args = getArguments(); + Assert.assertNotNull( args ); + m_state = DlgState.fromBundle( args ); + } } return m_state; } @@ -80,6 +82,12 @@ abstract class DlgDelegateAlert extends XWDialogFragment { super.onDismiss( dif ); } + @Override + protected String getFragTag() + { + return getState(null).m_id.toString(); + } + protected void checkNotAgainCheck( DlgState state, NotAgainView naView ) { if ( null != naView && naView.getChecked() ) { diff --git a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/DlgID.java b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/DlgID.java index f1b4d33ae..6c758a3d3 100644 --- a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/DlgID.java +++ b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/DlgID.java @@ -22,7 +22,6 @@ package org.eehouse.android.xw4; public enum DlgID { NONE - , LOOKUP , CHANGE_GROUP , CONFIRM_CHANGE , CONFIRM_CHANGE_PLAY @@ -64,7 +63,6 @@ public enum DlgID { , ASK_PASSWORD , DLG_RETRY , DLG_SCORES - , PICK_TILE_REQUESTTRAY , DLG_USEDICT , DLG_GETDICT , GAMES_LIST_NEWGAME diff --git a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/LookupAlert.java b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/LookupAlert.java index abc0a5efc..45df88f55 100644 --- a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/LookupAlert.java +++ b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/LookupAlert.java @@ -31,6 +31,7 @@ import junit.framework.Assert; import org.eehouse.android.xw4.loc.LocUtils; public class LookupAlert extends XWDialogFragment { + private static final String TAG = LookupAlert.class.getSimpleName(); private LookupAlertView m_view; public static LookupAlert newInstance( String[] words, int lang, boolean noStudy ) @@ -73,4 +74,7 @@ public class LookupAlert extends XWDialogFragment { result.setOnKeyListener( m_view ); return result; } + + @Override + protected String getFragTag() { return TAG; } } diff --git a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/MainActivity.java b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/MainActivity.java index 76e2d0f85..9953b76ec 100644 --- a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/MainActivity.java +++ b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/MainActivity.java @@ -357,16 +357,29 @@ public class MainActivity extends XWActivity private void logPaneFragments() { - if ( BuildConfig.DEBUG && null != m_root ) { - List pairs = new ArrayList<>(); - int childCount = m_root.getChildCount(); - for ( int ii = 0; ii < childCount; ++ii ) { - View child = m_root.getChildAt( ii ); - String name = findFragment( child ).getClass().getSimpleName(); - String pair = String.format("%d:%s", ii, name ); - pairs.add( pair ); + if ( BuildConfig.DEBUG ) { + List panePairs = new ArrayList<>(); + if ( null != m_root ) { + int childCount = m_root.getChildCount(); + for ( int ii = 0; ii < childCount; ++ii ) { + View child = m_root.getChildAt( ii ); + String name = findFragment( child ).getClass().getSimpleName(); + String pair = String.format("%d:%s", ii, name ); + panePairs.add( pair ); + } } - Log.d( TAG, "logPaneFragments(): %s", TextUtils.join(", ", pairs) ); + + FragmentManager fm = getSupportFragmentManager(); + List fragPairs = new ArrayList<>(); + int fragCount = fm.getBackStackEntryCount(); + for ( int ii = 0; ii < fragCount; ++ii ) { + FragmentManager.BackStackEntry entry = fm.getBackStackEntryAt( ii ); + String name = entry.getName(); + String pair = String.format("%d:%s", ii, name ); + fragPairs.add( pair ); + } + Log.d( TAG, "panes: [%s]; frags: [%s]", TextUtils.join(",", panePairs), + TextUtils.join(",", fragPairs) ); } } diff --git a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/TilePickAlert.java b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/TilePickAlert.java index 272e96845..94fbad4d6 100644 --- a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/TilePickAlert.java +++ b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/TilePickAlert.java @@ -1,4 +1,4 @@ -/* -*- compile-command: "cd ../../../../../../../../ && ./gradlew installXw4Debug"; -*- */ +/* -*- compile-command: "find-and-gradle.sh insXw4Deb"; -*- */ /* * Copyright 2017 by Eric House (xwords@eehouse.org). All rights reserved. * @@ -39,6 +39,7 @@ import org.eehouse.android.xw4.loc.LocUtils; public class TilePickAlert extends XWDialogFragment implements TilePickView.TilePickListener { + private static final String TAG = TilePickAlert.class.getSimpleName(); private static final String TPS = "TPS"; private static final String ACTION = "ACTION"; private TilePickView m_view; @@ -127,6 +128,8 @@ public class TilePickAlert extends XWDialogFragment return m_dialog; } + protected String getFragTag() { return TAG; } + // TilePickView.TilePickListener interface @Override public void onTilesChanged( int nToPick, int[] newTiles ) diff --git a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/XWActivity.java b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/XWActivity.java index d3d9188cc..e388416ff 100644 --- a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/XWActivity.java +++ b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/XWActivity.java @@ -26,7 +26,10 @@ import android.content.Intent; import android.content.res.Configuration; import android.os.Bundle; import android.support.v4.app.DialogFragment; +import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; +import android.support.v4.app.FragmentManager; +import android.support.v4.app.FragmentTransaction; import android.view.ContextMenu.ContextMenuInfo; import android.view.ContextMenu; import android.view.Menu; @@ -278,9 +281,23 @@ public class XWActivity extends FragmentActivity Assert.fail(); } - protected void show( DialogFragment df ) + protected void show( XWDialogFragment df ) { - df.show( getSupportFragmentManager(), "dialog" ); + FragmentManager fm = getSupportFragmentManager(); + String tag = df.getFragTag(); + Log.d( TAG, "%s.show(%s) called; tag: %s", getClass().getSimpleName(), + df.getClass().getSimpleName(), tag ); + FragmentTransaction trans = fm.beginTransaction(); + Fragment prev = fm.findFragmentByTag( tag ); + if ( null != prev && prev instanceof DialogFragment ) { + Log.d( TAG, "removing %s (tag %s)", + prev.getClass().getSimpleName(), tag ); + ((DialogFragment)prev).dismiss(); + } + trans.addToBackStack( tag ); + + // Create and show the dialog. show() commits the transaction + df.show( trans, tag ); } protected Dialog makeDialog( DBAlert alert, Object[] params ) diff --git a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/XWDialogFragment.java b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/XWDialogFragment.java index 50e410fcb..ab5be9fe2 100644 --- a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/XWDialogFragment.java +++ b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/XWDialogFragment.java @@ -32,7 +32,7 @@ import java.util.Map; import junit.framework.Assert; -public class XWDialogFragment extends DialogFragment { +abstract class XWDialogFragment extends DialogFragment { private static final String TAG = XWDialogFragment.class.getSimpleName(); private OnDismissListener m_onDismiss; @@ -87,6 +87,8 @@ public class XWDialogFragment extends DialogFragment { super.onDismiss( dif ); } + abstract String getFragTag(); + protected void setOnDismissListener( OnDismissListener lstnr ) { Assert.assertTrue( null == lstnr || null == m_onDismiss || !BuildConfig.DEBUG ); From 3bff16193ae9b8dba3c40a4d46654196bdb3ad5a Mon Sep 17 00:00:00 2001 From: Eric House Date: Thu, 13 Apr 2017 08:05:56 -0700 Subject: [PATCH 08/18] ignore more stuff --- xwords4/android/.gitignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/xwords4/android/.gitignore b/xwords4/android/.gitignore index 0b45f97ae..717c4d20d 100644 --- a/xwords4/android/.gitignore +++ b/xwords4/android/.gitignore @@ -2,3 +2,7 @@ /modules XWords4-gcm/ /.gradle +**.iml +local.properties +.idea + From 269fceddf25ccfd131a819e17d4f5237f5744f02 Mon Sep 17 00:00:00 2001 From: Eric House Date: Thu, 13 Apr 2017 08:18:07 -0700 Subject: [PATCH 09/18] cleanup around posting alerts; skip back-stack Had to disable use of the back-stack for DialogFragments, though that means I can't prevent duplicates from stacking up (esp. in the pathological robot-vs-robot case, but also just when I rotate the device while a "rematch" alert is up.) The problem seems to be in dismiss actions being handled too late. One easy-to-duplicate case is the tile-picker. When it's enabled and you commit a turn I post first the confirmation and then, in response to a "yes", the picker. But the picker gets added to the stack moments before the confirmation is removed, and it's the nature of stack removal that everything above what's being removed gets pulled too. So you never see the picker. Simply post()ing a runnable to put the picker up later fixes this one case, but a similar trick doesn't work elsewhere, so I'm punting until I have time to root-cause the problem. --- .../eehouse/android/xw4/BoardDelegate.java | 21 ++++++++++--- .../org/eehouse/android/xw4/DelegateBase.java | 7 +++-- .../eehouse/android/xw4/DlgDelegateAlert.java | 4 +-- .../org/eehouse/android/xw4/MainActivity.java | 5 ++- .../org/eehouse/android/xw4/XWActivity.java | 31 ++++++++++++------- .../eehouse/android/xw4/XWDialogFragment.java | 7 +++-- 6 files changed, 50 insertions(+), 25 deletions(-) diff --git a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/BoardDelegate.java b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/BoardDelegate.java index 97dd89415..46a685ebc 100644 --- a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/BoardDelegate.java +++ b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/BoardDelegate.java @@ -1747,11 +1747,17 @@ public class BoardDelegate extends DelegateBase // This is supposed to be called from the jni thread @Override - public void notifyPickTileBlank( int playerNum, int col, int row, String[] texts ) + public void notifyPickTileBlank( int playerNum, int col, int row, + String[] texts ) { - TilePickAlert.TilePickState tps = + final TilePickAlert.TilePickState tps = new TilePickAlert.TilePickState( playerNum, texts, col, row ); - show( TilePickAlert.newInstance( Action.BLANK_PICKED, tps ) ); + runOnUiThread( new Runnable() { + @Override + public void run() { + show( TilePickAlert.newInstance( Action.BLANK_PICKED, tps ) ); + } + } ); } @Override @@ -1759,10 +1765,15 @@ public class BoardDelegate extends DelegateBase int playerNum, int nToPick, String[] texts, int[] counts ) { - TilePickAlert.TilePickState tps + final TilePickAlert.TilePickState tps = new TilePickAlert.TilePickState( isInitial, playerNum, nToPick, texts, counts ); - show( TilePickAlert.newInstance( Action.TRAY_PICKED, tps ) ); + runOnUiThread( new Runnable() { + @Override + public void run() { + show( TilePickAlert.newInstance( Action.TRAY_PICKED, tps ) ); + } + } ); } @Override diff --git a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/DelegateBase.java b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/DelegateBase.java index cf141743a..bfc2420dd 100644 --- a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/DelegateBase.java +++ b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/DelegateBase.java @@ -436,8 +436,9 @@ public class DelegateBase implements DlgClickNotify, return null; } - protected void showDialogFragment( DlgID dlgID, Object... params ) + protected void showDialogFragment( DlgID dlgID, final Object... params ) { + DbgUtils.assertOnUIThread(); show( DBAlert.newInstance( dlgID, params ) ); } @@ -469,6 +470,7 @@ public class DelegateBase implements DlgClickNotify, protected void show( XWDialogFragment df ) { + DbgUtils.assertOnUIThread(); if ( m_activity instanceof XWActivity ) { ((XWActivity)m_activity).show( df ); } else if ( m_activity instanceof PrefsActivity ) { @@ -668,8 +670,7 @@ public class DelegateBase implements DlgClickNotify, public boolean onPosButton( Action action, Object[] params ) { boolean handled = true; - Log.d( TAG, "%s.posButtonClicked(%s)", getClass().getSimpleName(), - action.toString() ); + Log.d( TAG, "%s.onPosButton(%s)", getClass().getSimpleName(), action ); switch( action ) { case ENABLE_SMS_ASK: showSMSEnableDialog( Action.ENABLE_SMS_DO ); diff --git a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/DlgDelegateAlert.java b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/DlgDelegateAlert.java index 0c7401047..e5bb31839 100644 --- a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/DlgDelegateAlert.java +++ b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/DlgDelegateAlert.java @@ -74,12 +74,12 @@ abstract class DlgDelegateAlert extends XWDialogFragment { @Override public void onDismiss( DialogInterface dif ) { + super.onDismiss( dif ); Activity activity = getActivity(); if ( activity instanceof DlgClickNotify ) { ((DlgClickNotify)activity) .onDismissed( m_state.m_action, m_state.m_params ); } - super.onDismiss( dif ); } @Override @@ -108,7 +108,7 @@ abstract class DlgDelegateAlert extends XWDialogFragment { @Override public void onClick( DialogInterface dlg, int button ) { checkNotAgainCheck( m_state, naView ); - XWActivity xwact = (XWActivity)getActivity(); + DlgClickNotify xwact = (DlgClickNotify)getActivity(); xwact.onPosButton( pair.action, m_state.m_params ); } }; diff --git a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/MainActivity.java b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/MainActivity.java index 9953b76ec..91ff5a72a 100644 --- a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/MainActivity.java +++ b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/MainActivity.java @@ -130,6 +130,7 @@ public class MainActivity extends XWActivity if ( m_safeToCommit ) { handled = dispatchNewIntentImpl( intent ); } else { + DbgUtils.assertOnUIThread(); m_runWhenSafe.add( new Runnable() { @Override public void run() { @@ -300,7 +301,7 @@ public class MainActivity extends XWActivity protected void finishFragment() { // Assert.assertTrue( fragment instanceof XWFragment ); - // DbgUtils.logf( "MainActivity.finishFragment(%s)", fragment.toString() ); + // Log.d( TAG, "finishFragment()" ); getSupportFragmentManager().popBackStack/*Immediate*/(); } @@ -465,6 +466,7 @@ public class MainActivity extends XWActivity if ( m_safeToCommit ) { safeAddFragment( fragment, parentName ); } else { + DbgUtils.assertOnUIThread(); m_runWhenSafe.add( new Runnable() { @Override public void run() { @@ -516,6 +518,7 @@ public class MainActivity extends XWActivity private void setSafeToRun() { + DbgUtils.assertOnUIThread(); m_safeToCommit = true; for ( Runnable proc : m_runWhenSafe ) { proc.run(); diff --git a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/XWActivity.java b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/XWActivity.java index e388416ff..5d9ee2c49 100644 --- a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/XWActivity.java +++ b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/XWActivity.java @@ -285,19 +285,26 @@ public class XWActivity extends FragmentActivity { FragmentManager fm = getSupportFragmentManager(); String tag = df.getFragTag(); - Log.d( TAG, "%s.show(%s) called; tag: %s", getClass().getSimpleName(), - df.getClass().getSimpleName(), tag ); - FragmentTransaction trans = fm.beginTransaction(); - Fragment prev = fm.findFragmentByTag( tag ); - if ( null != prev && prev instanceof DialogFragment ) { - Log.d( TAG, "removing %s (tag %s)", - prev.getClass().getSimpleName(), tag ); - ((DialogFragment)prev).dismiss(); - } - trans.addToBackStack( tag ); + if ( true ) { + df.show( fm, tag ); + } else { + Log.d( TAG, "%s.show(%s) called; tag: %s", getClass().getSimpleName(), + df.getClass().getSimpleName(), tag ); + FragmentTransaction trans = fm.beginTransaction(); - // Create and show the dialog. show() commits the transaction - df.show( trans, tag ); + Fragment prev = fm.findFragmentByTag( tag ); + if ( null != prev && prev instanceof DialogFragment ) { + Log.d( TAG, "show(): removing %s (tag %s)", + prev.getClass().getSimpleName(), tag ); + ((DialogFragment)prev).dismiss(); + } else { + Log.d( TAG, "show(): NOT removing or didn't find for tag %s)", tag ); + } + trans.addToBackStack( tag ); + + // Create and show the dialog. show() commits the transaction + df.show( trans, tag ); + } } protected Dialog makeDialog( DBAlert alert, Object[] params ) diff --git a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/XWDialogFragment.java b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/XWDialogFragment.java index ab5be9fe2..b694487a4 100644 --- a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/XWDialogFragment.java +++ b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/XWDialogFragment.java @@ -72,19 +72,22 @@ abstract class XWDialogFragment extends DialogFragment { @Override public void onCancel( DialogInterface dialog ) { + super.onCancel( dialog ); + // Log.d( TAG, "%s.onCancel() called", getClass().getSimpleName() ); if ( null != m_onCancel ) { m_onCancel.onCancelled( this ); } - super.onCancel( dialog ); } @Override public void onDismiss( DialogInterface dif ) { + // Log.d( TAG, "%s.onDismiss() called", getClass().getSimpleName() ); + super.onDismiss( dif ); + if ( null != m_onDismiss ) { m_onDismiss.onDismissed( this ); } - super.onDismiss( dif ); } abstract String getFragTag(); From f88b438a8190a41a707a207b7b0f8b52ad9ad1f4 Mon Sep 17 00:00:00 2001 From: Eric House Date: Tue, 18 Apr 2017 06:47:53 -0700 Subject: [PATCH 10/18] get rid of configChanges altogether Recent recommendations are not to attempt to handle it myself, so don't and we'll see how it goes. And unify notions of tablet and enabling dual-pane: a device that isn't dual-pane should not be using the new single-activity stuff at all. --- xwords4/android/app/src/main/AndroidManifest.xml | 14 -------------- .../java/org/eehouse/android/xw4/MainActivity.java | 2 +- 2 files changed, 1 insertion(+), 15 deletions(-) diff --git a/xwords4/android/app/src/main/AndroidManifest.xml b/xwords4/android/app/src/main/AndroidManifest.xml index a6a98bcb5..5f605cca3 100644 --- a/xwords4/android/app/src/main/AndroidManifest.xml +++ b/xwords4/android/app/src/main/AndroidManifest.xml @@ -78,30 +78,24 @@ @@ -112,17 +106,14 @@ @@ -170,7 +161,6 @@ @@ -186,16 +176,12 @@ diff --git a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/MainActivity.java b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/MainActivity.java index 91ff5a72a..3627ab10f 100644 --- a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/MainActivity.java +++ b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/MainActivity.java @@ -65,7 +65,7 @@ public class MainActivity extends XWActivity @Override protected void onCreate( Bundle savedInstanceState ) { - m_dpEnabled = XWPrefs.dualpaneEnabled( this ); + m_dpEnabled = XWPrefs.dualpaneEnabled( this ) && XWPrefs.getIsTablet( this ); m_dlgt = m_dpEnabled ? new DualpaneDelegate( this, savedInstanceState ) : new GamesListDelegate( this, savedInstanceState ); From 2453de0128ef35e7cb442da8cae3fb01ae1e55a7 Mon Sep 17 00:00:00 2001 From: Eric House Date: Tue, 18 Apr 2017 07:26:45 -0700 Subject: [PATCH 11/18] consolidate dual-pane settings Get rid of explicit enable-dualpane boolean pref, instead relying on the three way default/force-phone/force-tablet pref. Offer to change that rather than the former in BoardDelegate when run on upgrade. Move the prefs setting from Debug to Appearance since it's "real" now. --- .../eehouse/android/xw4/BoardDelegate.java | 10 ++++++--- .../org/eehouse/android/xw4/MainActivity.java | 2 +- .../eehouse/android/xw4/PrefsDelegate.java | 8 ++----- .../java/org/eehouse/android/xw4/XWPrefs.java | 7 +----- .../app/src/main/res/values/common_rsrc.xml | 3 +-- .../app/src/main/res/values/strings.xml | 14 +++++------- .../android/app/src/main/res/xml/xwprefs.xml | 22 ++++++++----------- 7 files changed, 27 insertions(+), 39 deletions(-) diff --git a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/BoardDelegate.java b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/BoardDelegate.java index 46a685ebc..2e7d5b5a4 100644 --- a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/BoardDelegate.java +++ b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/BoardDelegate.java @@ -1111,7 +1111,8 @@ public class BoardDelegate extends DelegateBase break; case DISABLE_DUALPANE: - XWPrefs.setPrefsBoolean( m_activity, R.string.key_disable_dualpane, true ); + XWPrefs.setPrefsString( m_activity, R.string.key_force_tablet, + getString(R.string.force_tablet_phone) ); makeOkOnlyBuilder( R.string.after_restart ).show(); break; @@ -2830,9 +2831,12 @@ public class BoardDelegate extends DelegateBase { if ( !s_dpShown ) { s_dpShown = true; + // Am I a tablet AND is that because my size says so rather than + // my having overridden it if ( XWPrefs.getIsTablet( m_activity ) - && !XWPrefs.getPrefsBoolean( m_activity, R.string - .key_disable_dualpane, false ) + && getString(R.string.force_tablet_default) + .equals(XWPrefs.getPrefsString(m_activity, + R.string.key_force_tablet)) && !Utils.onFirstVersion(m_activity ) ) { makeNotAgainBuilder( R.string.invite_dualpane, R.string.key_notagain_dualpane ) diff --git a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/MainActivity.java b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/MainActivity.java index 3627ab10f..069f419a6 100644 --- a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/MainActivity.java +++ b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/MainActivity.java @@ -65,7 +65,7 @@ public class MainActivity extends XWActivity @Override protected void onCreate( Bundle savedInstanceState ) { - m_dpEnabled = XWPrefs.dualpaneEnabled( this ) && XWPrefs.getIsTablet( this ); + m_dpEnabled = XWPrefs.getIsTablet( this ); m_dlgt = m_dpEnabled ? new DualpaneDelegate( this, savedInstanceState ) : new GamesListDelegate( this, savedInstanceState ); diff --git a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/PrefsDelegate.java b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/PrefsDelegate.java index d79b0dedc..a4f16cad9 100644 --- a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/PrefsDelegate.java +++ b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/PrefsDelegate.java @@ -62,7 +62,7 @@ public class PrefsDelegate extends DelegateBase R.string.key_disable_nag, R.string.key_disable_nag_solo, R.string.key_disable_relay, - R.string.key_disable_dualpane, + R.string.key_force_tablet, }; private static Map s_keysHash = null; @@ -235,7 +235,7 @@ public class PrefsDelegate extends DelegateBase case R.string.key_disable_relay: RelayService.enabledChanged( m_activity ); break; - case R.string.key_disable_dualpane: + case R.string.key_force_tablet: makeOkOnlyBuilder( R.string.after_restart ).show(); break; default: @@ -375,10 +375,6 @@ public class PrefsDelegate extends DelegateBase hideOne( R.string.key_hide_title, R.string.prefs_appearance ); } - if ( !XWPrefs.getIsTablet( m_activity ) ) { - hideOne( R.string.key_disable_dualpane, R.string.prefs_appearance ); - } - if ( ! BuildConfig.WIDIR_ENABLED ) { hideOne( R.string.key_enable_p2p, R.string.key_network_behavior ); } diff --git a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/XWPrefs.java b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/XWPrefs.java index 05568e165..7a18106a3 100644 --- a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/XWPrefs.java +++ b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/XWPrefs.java @@ -473,7 +473,7 @@ public class XWPrefs { { boolean result = isTablet( context ); String setting = getPrefsString( context, R.string.key_force_tablet ); - if ( setting.equals( context.getString(R.string.force_tablet_os) ) ) { + if ( setting.equals( context.getString(R.string.force_tablet_default) ) ) { // Leave it alone } else if ( setting.equals( context.getString(R.string.force_tablet_tablet) ) ) { result = true; @@ -485,11 +485,6 @@ public class XWPrefs { return result; } - public static boolean dualpaneEnabled( Context context ) - { - return ! getPrefsBoolean( context, R.string.key_disable_dualpane, false ); - } - public static CommsConnTypeSet getAddrTypes( Context context ) { CommsConnTypeSet result; diff --git a/xwords4/android/app/src/main/res/values/common_rsrc.xml b/xwords4/android/app/src/main/res/values/common_rsrc.xml index 6a48b656f..0bb613fad 100644 --- a/xwords4/android/app/src/main/res/values/common_rsrc.xml +++ b/xwords4/android/app/src/main/res/values/common_rsrc.xml @@ -69,7 +69,6 @@ key_summary_field key_default_loc key_force_tablet2 - key_disable_dualpane2 key_force_radio key_addrs_pref @@ -316,7 +315,7 @@ - @string/force_tablet_os + @string/force_tablet_default @string/force_tablet_phone @string/force_tablet_tablet diff --git a/xwords4/android/app/src/main/res/values/strings.xml b/xwords4/android/app/src/main/res/values/strings.xml index 0e0ff7f20..5ef80e112 100644 --- a/xwords4/android/app/src/main/res/values/strings.xml +++ b/xwords4/android/app/src/main/res/values/strings.xml @@ -2316,12 +2316,10 @@ what\'s available. Use tablet (side-by-side) layout? - OS decides + Use default for my device Force tablet layout Force phone layout - Side-by-side views on tablets - Reminder: It\'s your turn