From 8fa92ad00efe32b98a1b724f65374534f2a074ef Mon Sep 17 00:00:00 2001 From: Eric House Date: Tue, 22 Sep 2020 07:53:19 -0700 Subject: [PATCH] provide choice to invite known players Add second type of option to the current list of "InviteMeans", so you can configure a game then skip sending email if the player's address is known. --- .../eehouse/android/xw4/BoardDelegate.java | 68 ++++---- .../android/xw4/InviteChoicesAlert.java | 147 ++++++++++-------- .../app/src/main/res/layout/invite_view.xml | 55 +++++++ .../app/src/main/res/values/strings.xml | 9 +- 4 files changed, 186 insertions(+), 93 deletions(-) create mode 100644 xwords4/android/app/src/main/res/layout/invite_view.xml 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 4792eab61..c4623735f 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 @@ -531,7 +531,7 @@ public class BoardDelegate extends DelegateBase if ( state.summary.hasRematchInfo() ) { tryRematchInvites( true ); } else if ( state.summary.hasInviteInfo() ) { - tryOtherInvites( true ); + tryOtherInvites(); } else { callInviteChoices( sentInfo[0] ); } @@ -1240,6 +1240,11 @@ public class BoardDelegate extends DelegateBase showArchiveNA( false ); break; + case LAUNCH_INVITE_ACTION: + CommsAddrRec addr = (CommsAddrRec)params[0]; + tryOtherInvites( addr ); + break; + case ENABLE_NBS_DO: post( new Runnable() { @Override @@ -1773,7 +1778,7 @@ public class BoardDelegate extends DelegateBase if ( m_summary.hasRematchInfo() ) { skipDismiss = !tryRematchInvites( false ); } else if ( m_summary.hasInviteInfo() ) { - skipDismiss = !tryOtherInvites( false ); + skipDismiss = !tryOtherInvites(); } else if ( !m_haveInvited ) { m_haveInvited = true; showInviteAlertIf(); @@ -2775,7 +2780,7 @@ public class BoardDelegate extends DelegateBase if ( 0 < m_mySIS.nMissing && m_summary.hasRematchInfo() ) { tryRematchInvites( false ); } else if ( 0 < m_mySIS.nMissing && m_summary.hasInviteInfo() ) { - tryOtherInvites( false ); + tryOtherInvites(); } else if ( null != m_missingDevs ) { Assert.assertNotNull( m_missingMeans ); String gameName = GameUtils.getName( m_activity, m_rowid ); @@ -3196,43 +3201,48 @@ public class BoardDelegate extends DelegateBase return force; } - private boolean tryOtherInvites( boolean force ) + private boolean tryOtherInvites() { - boolean result = true; + boolean result = false; Assert.assertNotNull( m_summary ); - Assert.assertNotNull( m_gi ); String str64 = m_summary.getStringExtra( GameSummary.EXTRA_REMATCH_ADDR ); try { CommsAddrRec addr = (CommsAddrRec)Utils.string64ToSerializable( str64 ); - NetLaunchInfo nli = nliForMe(); - CommsConnTypeSet conTypes = addr.conTypes; - for ( CommsConnType typ : conTypes ) { - switch ( typ ) { - case COMMS_CONN_MQTT: - MQTTUtils.inviteRemote( m_activity, addr.mqtt_devID, nli ); - recordInviteSent( InviteMeans.MQTT, addr.mqtt_devID ); - break; - case COMMS_CONN_BT: - BTService.inviteRemote( m_activity, addr.bt_btAddr, nli ); - recordInviteSent( InviteMeans.BLUETOOTH, addr.bt_btAddr ); - break; + result = tryOtherInvites( addr ); + } catch ( Exception ex ) { + Log.ex( TAG, ex ); + Assert.failDbg(); + } + return result; + } + + private boolean tryOtherInvites( CommsAddrRec addr ) + { + boolean result = true; + NetLaunchInfo nli = nliForMe(); + CommsConnTypeSet conTypes = addr.conTypes; + for ( CommsConnType typ : conTypes ) { + switch ( typ ) { + case COMMS_CONN_MQTT: + MQTTUtils.inviteRemote( m_activity, addr.mqtt_devID, nli ); + recordInviteSent( InviteMeans.MQTT, addr.mqtt_devID ); + break; + case COMMS_CONN_BT: + BTService.inviteRemote( m_activity, addr.bt_btAddr, nli ); + recordInviteSent( InviteMeans.BLUETOOTH, addr.bt_btAddr ); + break; // case COMMS_CONN_RELAY: // RelayService.inviteRemote( m_activity, m_jniGamePtr, 0, value, nli ); // recordInviteSent( InviteMeans.RELAY ); // break; - case COMMS_CONN_SMS: - sendNBSInviteIf( addr.sms_phone, nli, true ); - recordInviteSent( InviteMeans.SMS_DATA, addr.sms_phone ); - break; + case COMMS_CONN_SMS: + sendNBSInviteIf( addr.sms_phone, nli, true ); + recordInviteSent( InviteMeans.SMS_DATA, addr.sms_phone ); + break; - default: - Log.d( TAG, "not inviting using addr type %s", typ ); - } + default: + Log.d( TAG, "not inviting using addr type %s", typ ); } - } catch ( Exception ex ) { - Log.ex( TAG, ex ); - Assert.failDbg(); - result = false; } return result; } 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 0a27e78aa..a6abfc6ba 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 @@ -1,7 +1,6 @@ /* -*- compile-command: "find-and-gradle.sh inXw4dDebug"; -*- */ /* - * Copyright 2017 - 2020 by Eric House (xwords@eehouse.org). All rights - * reserved. + * Copyright 2017 - 2020 by Eric House (xwords@eehouse.org). All rights reserved. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as @@ -25,6 +24,7 @@ import android.content.Context; import android.content.DialogInterface.OnClickListener; import android.content.DialogInterface; import android.widget.Button; +import android.widget.RadioGroup; import java.util.ArrayList; import java.util.List; @@ -33,8 +33,12 @@ import org.eehouse.android.xw4.DBUtils.SentInvitesInfo; import org.eehouse.android.xw4.DlgDelegate.Action; import org.eehouse.android.xw4.DlgDelegate.DlgClickNotify.InviteMeans; import org.eehouse.android.xw4.Perms23.Perm; +import org.eehouse.android.xw4.jni.CommsAddrRec; +import org.eehouse.android.xw4.jni.XwJNI; +import org.eehouse.android.xw4.loc.LocUtils; -public class InviteChoicesAlert extends DlgDelegateAlert { +public class InviteChoicesAlert extends DlgDelegateAlert + implements InviteView.ItemClicked { public static InviteChoicesAlert newInstance( DlgState state ) { @@ -49,7 +53,7 @@ public class InviteChoicesAlert extends DlgDelegateAlert { public void populateBuilder( final Context context, final DlgState state, AlertDialog.Builder builder ) { - final ArrayList means = new ArrayList<>(); + ArrayList means = new ArrayList<>(); InviteMeans lastMeans = null; Object[] params = state.getParams(); if ( null != params @@ -80,78 +84,53 @@ public class InviteChoicesAlert extends DlgDelegateAlert { } means.add( InviteMeans.CLIPBOARD ); - String[] items = new String[means.size()]; - final int[] sel = { -1 }; - for ( int ii = 0; ii < items.length; ++ii ) { - InviteMeans oneMeans = means.get(ii); - items[ii] = getString( oneMeans.getUserDescID() ); - if ( lastMeans == oneMeans ) { - sel[0] = ii; + int lastSelMeans = -1; + if ( null != lastMeans ) { + for ( int ii = 0; ii < means.size(); ++ii ) { + if ( lastMeans == means.get(ii) ) { + lastSelMeans = ii; + break; + } } } - OnClickListener selChanged = new OnClickListener() { - public void onClick( DialogInterface dlg, int pos ) { - XWActivity activity = (XWActivity)getActivity(); - sel[0] = pos; - switch ( means.get(pos) ) { - case SMS_USER: - activity - .makeNotAgainBuilder( R.string.sms_invite_flakey, - R.string.key_na_sms_invite_flakey ) - .show(); - break; - case CLIPBOARD: - String msg = - getString( R.string.not_again_clip_expl_fmt, - getString(R.string.slmenu_copy_sel) ); - activity - .makeNotAgainBuilder(msg, R.string.key_na_clip_expl) - .show(); - break; - case SMS_DATA: - if ( !Perms23.havePermissions( activity, Perm.SEND_SMS, Perm.RECEIVE_SMS ) - && Perm.SEND_SMS.isBanned(activity) ) { - activity - .makeOkOnlyBuilder( R.string.sms_banned_ok_only ) - .setActionPair( Action.PERMS_BANNED_INFO, - R.string.button_more_info ) - .show(); - } else if ( ! XWPrefs.getNBSEnabled( context ) ) { - activity - .makeConfirmThenBuilder( R.string.warn_sms_disabled, - Action.ENABLE_NBS_ASK ) - .setPosButton( R.string.button_enable_sms ) - .setNegButton( R.string.button_later ) - .show(); - } - break; - } - - Button button = ((AlertDialog)dlg) - .getButton( AlertDialog.BUTTON_POSITIVE ); - button.setEnabled( true ); - } - }; - + final InviteView inviteView = (InviteView)LocUtils + .inflate( context, R.layout.invite_view ); final OnClickListener okClicked = new OnClickListener() { @Override public void onClick( DialogInterface dlg, int pos ) { Assert.assertTrue( Action.SKIP_CALLBACK != state.m_action ); - int indx = sel[0]; - if ( 0 <= indx ) { + Object choice = inviteView.getChoice(); + if ( null != choice ) { XWActivity activity = (XWActivity)context; - activity.inviteChoiceMade( state.m_action, - means.get(indx), - state.getParams() ); + if ( choice instanceof InviteMeans ) { + InviteMeans means = (InviteMeans)choice; + activity.inviteChoiceMade( state.m_action, + means, state.getParams() ); + } else if ( choice instanceof String ) { + String player = (String)choice; + CommsAddrRec addr = XwJNI.kplr_getAddr( player ); + XWActivity xwact = (XWActivity)context; + Object[] params = { addr }; + xwact.onPosButton( state.m_action, params ); + } else { + Assert.failDbg(); + } } } }; - builder.setTitle( R.string.invite_choice_title ) - .setSingleChoiceItems( items, sel[0], selChanged ) + builder + .setTitle( R.string.invite_choice_title ) + .setView( inviteView ) .setPositiveButton( android.R.string.ok, okClicked ) - .setNegativeButton( android.R.string.cancel, null ); + .setNegativeButton( android.R.string.cancel, null ) + ; + + String[] players = XwJNI.kplr_getPlayers(); + inviteView.setChoices( means, lastSelMeans, players ) + .setCallbacks( this ); + if ( BuildConfig.DEBUG ) { OnClickListener ocl = new OnClickListener() { @Override @@ -167,4 +146,46 @@ public class InviteChoicesAlert extends DlgDelegateAlert { builder.setNeutralButton( R.string.ok_with_robots, ocl ); } } + + @Override + public void meansClicked( InviteMeans means ) + { + DlgDelegate.Builder builder = null; + XWActivity activity = (XWActivity)getActivity(); + switch ( means ) { + case SMS_USER: + builder =activity + .makeNotAgainBuilder( R.string.sms_invite_flakey, + R.string.key_na_sms_invite_flakey ); + break; + case CLIPBOARD: + String msg = + getString( R.string.not_again_clip_expl_fmt, + getString(R.string.slmenu_copy_sel) ); + builder = activity + .makeNotAgainBuilder(msg, R.string.key_na_clip_expl); + break; + case SMS_DATA: + if ( !Perms23.havePermissions( activity, Perm.SEND_SMS, Perm.RECEIVE_SMS ) + && Perm.SEND_SMS.isBanned(activity) ) { + builder = activity + .makeOkOnlyBuilder( R.string.sms_banned_ok_only ) + .setActionPair( Action.PERMS_BANNED_INFO, + R.string.button_more_info ) + ; + } else if ( ! XWPrefs.getNBSEnabled( getContext() ) ) { + builder = activity + .makeConfirmThenBuilder( R.string.warn_sms_disabled, + Action.ENABLE_NBS_ASK ) + .setPosButton( R.string.button_enable_sms ) + .setNegButton( R.string.button_later ) + ; + } + break; + } + + if ( null != builder ) { + builder.show(); + } + } } diff --git a/xwords4/android/app/src/main/res/layout/invite_view.xml b/xwords4/android/app/src/main/res/layout/invite_view.xml new file mode 100644 index 000000000..9ddda2c36 --- /dev/null +++ b/xwords4/android/app/src/main/res/layout/invite_view.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/xwords4/android/app/src/main/res/values/strings.xml b/xwords4/android/app/src/main/res/values/strings.xml index 5979a6cb8..0c579b826 100644 --- a/xwords4/android/app/src/main/res/values/strings.xml +++ b/xwords4/android/app/src/main/res/values/strings.xml @@ -1008,6 +1008,7 @@ Invite now More info Drop Relay + @@ -1022,7 +1023,13 @@ NFC (“Android beaming”) Internet/Relay Wifi Direct - Inviting players: How? + Inviting players + + Who? + + empty expl + + How? OK (robots)