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 + 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") 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/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 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 32bd6af0c..5bba257ea 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 @@ -118,6 +118,7 @@ public class BoardDelegate extends DelegateBase private int[] m_missingCounts; private InviteMeans m_missingMeans = null; private boolean m_progressShown = false; + private boolean m_isFirstLaunch; private boolean m_firingPrefs; private BoardUtilCtxt m_utils; private boolean m_gameOver = false; @@ -309,9 +310,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 ) { @@ -564,6 +564,7 @@ public class BoardDelegate extends DelegateBase protected void init( Bundle savedInstanceState ) { + m_isFirstLaunch = null == savedInstanceState; getBundledData( savedInstanceState ); m_pendingChats = new ArrayList(); @@ -1112,7 +1113,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; @@ -1183,7 +1185,7 @@ public class BoardDelegate extends DelegateBase @Override public void inviteChoiceMade( Action action, InviteMeans means, - Object[] params ) + Object... params ) { if ( action == Action.LAUNCH_INVITE_ACTION ) { SentInvitesInfo info = params[0] instanceof SentInvitesInfo @@ -1748,11 +1750,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 @@ -1760,10 +1768,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 @@ -2082,8 +2095,10 @@ public class BoardDelegate extends DelegateBase gi.dictLang ); break; case JNIThread.GAME_OVER: - showDialogFragment( DlgID.GAME_OVER, m_summary, msg.arg1, - (String)msg.obj ); + if ( m_isFirstLaunch ) { + showDialogFragment( DlgID.GAME_OVER, m_summary, msg.arg1, + (String)msg.obj ); + } break; case JNIThread.MSGS_SENT: int nSent = (Integer)msg.obj; @@ -2208,8 +2223,8 @@ public class BoardDelegate extends DelegateBase m_relayMissing = false; } if ( 0 == nMissing || !m_relayMissing ) { + Log.d( TAG, "dismissing invite alert %H", m_inviteAlert ); if ( null != m_inviteAlert ) { - Log.d( TAG, "dismissing invite alert" ); m_inviteAlert.dismiss(); } } @@ -2290,12 +2305,7 @@ public class BoardDelegate extends DelegateBase Assert.fail(); } - final int fTitle = dlgTitle; - runOnUiThread( new Runnable() { - public void run() { - showDialogFragment( dlgID, fTitle, txt ); - } - } ); + showDialogFragment( dlgID, dlgTitle, txt ); } private void showInviteAlertIf() @@ -2794,8 +2804,10 @@ public class BoardDelegate extends DelegateBase DBUtils.recordInviteSent( m_activity, m_rowid, means, dev ); if ( !invitesSent ) { - m_inviteAlert.dismiss(); - m_inviteAlert = null; + if ( null != m_inviteAlert ) { + m_inviteAlert.dismiss(); + m_inviteAlert = null; + } Log.d( TAG, "recordInviteSent(): redoing invite alert" ); showInviteAlertIf(); } @@ -2813,12 +2825,19 @@ 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; + // Am I a tablet AND is that because my size says so rather than + // my having overridden it if ( XWPrefs.getIsTablet( m_activity ) + && 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/DBAlert.java b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/DBAlert.java index 4da52eac2..94ad546a7 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,30 @@ 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 boolean belongsOnBackStack() + { + boolean result = getDlgID().belongsOnBackStack(); + return result; + } + + @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 +99,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 +107,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 +124,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..22fa58dbd 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,10 +436,14 @@ public class DelegateBase implements DlgClickNotify, return null; } - protected void showDialogFragment( DlgID dlgID, Object... params ) + protected void showDialogFragment( final DlgID dlgID, final Object... params ) { - DialogFragment fragment = DBAlert.newInstance( dlgID, params ); - show( fragment ); + runOnUiThread( new Runnable() { + @Override + public void run() { + show( DBAlert.newInstance( dlgID, params ) ); + } + } ); } protected void show( DlgState state ) @@ -468,8 +472,9 @@ public class DelegateBase implements DlgClickNotify, show( df ); } - protected void show( DialogFragment df ) + protected void show( XWDialogFragment df ) { + DbgUtils.assertOnUIThread(); if ( m_activity instanceof XWActivity ) { ((XWActivity)m_activity).show( df ); } else if ( m_activity instanceof PrefsActivity ) { @@ -669,8 +674,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 ); @@ -720,7 +724,7 @@ public class DelegateBase implements DlgClickNotify, return false; } - public void inviteChoiceMade( Action action, DlgClickNotify.InviteMeans means, Object[] params ) + public void inviteChoiceMade( Action action, DlgClickNotify.InviteMeans means, Object... params ) { // Assert.fail(); } diff --git a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/DlgDelegate.java b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/DlgDelegate.java index b070909ba..b1f2fb259 100644 --- a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/DlgDelegate.java +++ b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/DlgDelegate.java @@ -301,7 +301,7 @@ public class DlgDelegate { boolean onNegButton( Action action, Object... params ); boolean onDismissed( Action action, Object... params ); - void inviteChoiceMade( Action action, InviteMeans means, Object[] params ); + void inviteChoiceMade( Action action, InviteMeans means, Object... params ); } public interface HasDlgDelegate { OkOnlyBuilder makeOkOnlyBuilder( int msgID ); @@ -450,7 +450,7 @@ public class DlgDelegate { public void run() { DlgClickNotify.InviteMeans means = DlgClickNotify.InviteMeans.EMAIL; - m_clickCallback.inviteChoiceMade( action, means, null ); + m_clickCallback.inviteChoiceMade( action, means ); } }); } 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..f30ad2f1a 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; } @@ -72,12 +74,25 @@ 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 + protected String getFragTag() + { + return getState(null).m_id.toString(); + } + + @Override + public boolean belongsOnBackStack() + { + boolean result = getState(null).m_id.belongsOnBackStack(); + return result; } protected void checkNotAgainCheck( DlgState state, NotAgainView naView ) @@ -100,7 +115,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/DlgID.java b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/DlgID.java index f1b4d33ae..c6290118c 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 @@ -33,7 +32,7 @@ public enum DlgID { , DICT_OR_DECLINE , DLG_CONNSTAT , DLG_DELETED - , DLG_INVITE + , DLG_INVITE(true) , DLG_OKONLY , ENABLE_NFC , FORCE_REMOTE @@ -64,10 +63,15 @@ public enum DlgID { , ASK_PASSWORD , DLG_RETRY , DLG_SCORES - , PICK_TILE_REQUESTTRAY , DLG_USEDICT , DLG_GETDICT , GAMES_LIST_NEWGAME , CHANGE_CONN , GAMES_LIST_NAME_REMATCH + ; + + private boolean m_addToStack; + private DlgID(boolean addToStack) { m_addToStack = addToStack; } + private DlgID() { m_addToStack = false; } + boolean belongsOnBackStack() { return m_addToStack; } } 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 ); } 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 7c8ecaf9a..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 ); + m_dpEnabled = XWPrefs.getIsTablet( this ); m_dlgt = m_dpEnabled ? new DualpaneDelegate( this, savedInstanceState ) : new GamesListDelegate( this, savedInstanceState ); @@ -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*/(); } @@ -358,15 +359,28 @@ public class MainActivity extends XWActivity private void logPaneFragments() { if ( BuildConfig.DEBUG ) { - 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 ); + 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) ); } } @@ -452,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() { @@ -503,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/PrefsDelegate.java b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/PrefsDelegate.java index 5377bef34..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: @@ -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 ); } @@ -375,14 +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 ( 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 ); } diff --git a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/SMSInviteDelegate.java b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/SMSInviteDelegate.java index 3539800dc..27a0421a2 100644 --- a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/SMSInviteDelegate.java +++ b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/SMSInviteDelegate.java @@ -81,6 +81,7 @@ public class SMSInviteDelegate extends InviteDelegate { m_activity = delegator.getActivity(); } + @Override protected void init( Bundle savedInstanceState ) { String msg = getString( R.string.button_invite ); @@ -119,12 +120,17 @@ public class SMSInviteDelegate extends InviteDelegate { @Override protected void onActivityResult( RequestCode requestCode, int resultCode, - Intent data ) + final Intent data ) { if ( Activity.RESULT_CANCELED != resultCode && data != null ) { switch ( requestCode ) { case GET_CONTACT: - addPhoneNumbers( data ); + post ( new Runnable() { + @Override + public void run() { + addPhoneNumbers( data ); + } + } ); break; } } 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..42f494ec3 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; @@ -48,7 +51,8 @@ public class XWActivity extends FragmentActivity protected void onCreate( Bundle savedInstanceState, DelegateBase dlgt ) { if ( XWApp.LOG_LIFECYLE ) { - Log.i( TAG, "onCreate(this=%H)", this ); + Log.i( TAG, "%s.onCreate(this=%H,sis=%s)", getClass().getSimpleName(), + this, savedInstanceState ); } super.onCreate( savedInstanceState ); m_dlgt = dlgt; @@ -108,7 +112,7 @@ public class XWActivity extends FragmentActivity protected void onStart() { if ( XWApp.LOG_LIFECYLE ) { - Log.i( TAG, "%s.onStart(this=%H)", this ); + Log.i( TAG, "%s.onStart(this=%H)", getClass().getSimpleName(), this ); } super.onStart(); m_dlgt.onStart(); @@ -118,7 +122,7 @@ public class XWActivity extends FragmentActivity protected void onStop() { if ( XWApp.LOG_LIFECYLE ) { - Log.i( TAG, "%s.onStop(this=%H)", this ); + Log.i( TAG, "%s.onStop(this=%H)", getClass().getSimpleName(), this ); } m_dlgt.onStop(); super.onStop(); @@ -278,9 +282,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, "show(%s); tag: %s", df.getClass().getSimpleName(), tag ); + if ( df.belongsOnBackStack() ) { + FragmentTransaction trans = fm.beginTransaction(); + + Fragment prev = fm.findFragmentByTag( tag ); + if ( null != prev && prev instanceof DialogFragment ) { + ((DialogFragment)prev).dismiss(); + } + trans.addToBackStack( tag ); + df.show( trans, tag ); + } else { + df.show( fm, tag ); + } } protected Dialog makeDialog( DBAlert alert, Object[] params ) @@ -310,7 +328,7 @@ public class XWActivity extends FragmentActivity } @Override - public void inviteChoiceMade( Action action, InviteMeans means, Object[] params ) + public void inviteChoiceMade( Action action, InviteMeans means, Object... params ) { m_dlgt.inviteChoiceMade( action, means, 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..7e0ce8654 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; @@ -46,6 +46,8 @@ public class XWDialogFragment extends DialogFragment { void onCancelled( XWDialogFragment frag ); } + abstract String getFragTag(); + @Override public void onResume() { @@ -72,21 +74,26 @@ public 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 ); } + public boolean belongsOnBackStack() { return false; } + protected void setOnDismissListener( OnDismissListener lstnr ) { Assert.assertTrue( null == lstnr || null == m_onDismiss || !BuildConfig.DEBUG ); 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