From e3ebea29c7cb264f7e95c9e70fcb777b6a5bfa32 Mon Sep 17 00:00:00 2001 From: Eric House Date: Thu, 7 Jan 2021 11:37:06 -0800 Subject: [PATCH 1/3] game config changes get rid of password; disable, not hide, stuff that's irrelevant for a non-local player --- xwords4/android/app/build.gradle | 1 + .../android/xw4/GameConfigDelegate.java | 21 ++++++++++++------- .../java/org/eehouse/android/xw4/Utils.java | 13 +++++++++++- 3 files changed, 26 insertions(+), 9 deletions(-) diff --git a/xwords4/android/app/build.gradle b/xwords4/android/app/build.gradle index 5e87df290..30d35d359 100644 --- a/xwords4/android/app/build.gradle +++ b/xwords4/android/app/build.gradle @@ -104,6 +104,7 @@ android { buildConfigField "boolean", "NON_RELEASE", "DEBUG || !IS_TAGGED_BUILD" buildConfigField "boolean", "HAVE_KNOWN_PLAYERS", "false" buildConfigField "boolean", "FOR_FDROID", "false" + buildConfigField "boolean", "HAVE_PASSWORD", "false" } xw4NoSMS { diff --git a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/GameConfigDelegate.java b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/GameConfigDelegate.java index 4cd8f6dcf..c695afce4 100644 --- a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/GameConfigDelegate.java +++ b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/GameConfigDelegate.java @@ -365,7 +365,11 @@ public class GameConfigDelegate extends DelegateBase // Hide remote option if in standalone mode... final LocalPlayer lp = m_gi.players[m_whichPlayer]; Utils.setText( playerView, R.id.player_name_edit, lp.name ); - Utils.setText( playerView, R.id.password_edit, lp.password ); + if ( BuildConfig.HAVE_PASSWORD ) { + Utils.setText( playerView, R.id.password_edit, lp.password ); + } else { + playerView.findViewById(R.id.password_set).setVisibility( View.GONE ); + } // Dicts spinner with label TextView dictLabel = (TextView)playerView @@ -396,8 +400,7 @@ public class GameConfigDelegate extends DelegateBase public void onCheckedChanged( CompoundButton buttonView, boolean checked ) { lp.isLocal = !checked; - localSet.setVisibility( checked ? - View.GONE : View.VISIBLE ); + Utils.setEnabled( localSet, !checked ); checkShowPassword( playerView, lp ); } }; @@ -405,7 +408,7 @@ public class GameConfigDelegate extends DelegateBase check.setVisibility( View.VISIBLE ); } else { check.setVisibility( View.GONE ); - localSet.setVisibility( View.VISIBLE ); + Utils.setEnabled( localSet, true ); } check = (CheckBox)playerView.findViewById( R.id.robot_check ); @@ -440,7 +443,7 @@ public class GameConfigDelegate extends DelegateBase { boolean isRobotChecked = lp.isRobot(); // Log.d( TAG, "checkShowPassword(isRobotChecked=%b)", isRobotChecked ); - boolean showPassword = !isRobotChecked; + boolean showPassword = !isRobotChecked && BuildConfig.HAVE_PASSWORD; if ( showPassword ) { String pwd = getText( playerView, R.id.password_edit ); @@ -458,8 +461,8 @@ public class GameConfigDelegate extends DelegateBase } } - View view = playerView.findViewById( R.id.password_set ); - view.setVisibility( showPassword ? View.VISIBLE : View.GONE ); + playerView.findViewById( R.id.password_set ) + .setVisibility( showPassword ? View.VISIBLE : View.GONE ); } private void getPlayerSettings( DialogInterface di ) @@ -467,7 +470,9 @@ public class GameConfigDelegate extends DelegateBase Dialog dialog = (Dialog)di; LocalPlayer lp = m_gi.players[m_whichPlayer]; lp.name = Utils.getText( dialog, R.id.player_name_edit ); - lp.password = Utils.getText( dialog, R.id.password_edit ); + if ( BuildConfig.HAVE_PASSWORD ) { + lp.password = Utils.getText( dialog, R.id.password_edit ); + } if ( localOnlyGame() ) { int position = m_playerDictSpinner.getSelectedItemPosition(); diff --git a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/Utils.java b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/Utils.java index c0c09324d..708c0a2c1 100644 --- a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/Utils.java +++ b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/Utils.java @@ -521,10 +521,21 @@ public class Utils { setText( parent, id, str ); } + public static void setEnabled( View view, boolean enabled ) + { + view.setEnabled( enabled ); + if ( view instanceof ViewGroup ) { + ViewGroup asGroup = (ViewGroup)view; + for ( int ii = 0; ii < asGroup.getChildCount(); ++ii ) { + setEnabled( asGroup.getChildAt( ii ), enabled ); + } + } + } + public static void setEnabled( View parent, int id, boolean enabled ) { View view = parent.findViewById( id ); - parent.setEnabled( enabled ); + setEnabled( view, enabled ); } public static boolean getChecked( Dialog dialog, int id ) From c20cd8c4235fdfcbb35532325529dcd90426f2ba Mon Sep 17 00:00:00 2001 From: Eric House Date: Thu, 7 Jan 2021 19:25:15 -0800 Subject: [PATCH 2/3] Squashed commit of the following: commit f141b148fdb06beff2c0429bf0aa6dc38b053a08 Author: Wellington Terumi Uemura Date: Wed Jan 6 08:33:22 2021 +0000 Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (892 of 892 strings) --- .../android/res_src/values-pt-rBR/strings.xml | 118 ++++++++++-------- 1 file changed, 67 insertions(+), 51 deletions(-) diff --git a/xwords4/android/res_src/values-pt-rBR/strings.xml b/xwords4/android/res_src/values-pt-rBR/strings.xml index a1d173047..23f25c2b2 100644 --- a/xwords4/android/res_src/values-pt-rBR/strings.xml +++ b/xwords4/android/res_src/values-pt-rBR/strings.xml @@ -64,7 +64,7 @@ 3P 3L 2P - Cancelar troca + Cancelar a troca Trocar Senha: Jogador robô @@ -72,9 +72,9 @@ Lista de palavras (%1$s) Nome: Jogador remoto - Editar jogador - Modificar primeiro jogador. - Jogador[s] remoto + Edite o jogador + Altere o primeiro jogador. + Jogador[es] remoto Jogar Confirmar salvamento Este partida está em progresso. Se você salvar essas mudanças podem ser restauradas. Você quer salvar essas mudanças\? @@ -88,27 +88,27 @@ Palavras Falsas O robô mais inteligente Robô mais inteligente - Quão inteligente o robô jogador pode ser\? + Quão inteligente o robô da partida pode ser\? Robô inteligente QI do Robô Minutos por turno Minutos por jogador - Permitir timer por jogada - Permitir timer do jogo + Permitir um temporizador por partida + Permitir um temporizador da partida Permitir dicas (em rede) Permitir dicas Outras configurações - Salas públicas não encontradas para %1$d-jogador na partida %2$s. Tente atualizar ou criar sua própria sala. + Não foram encontradas salas públicas para %1$d-jogador na partida %2$s. Tente atualizar ou criar a sua própria sala. Buscando salas públicas para %1$d-jogadores na partida %2$s. - Selecionar sala pública + Selecionar uma sala pública Criar uma nova sala pública Nome da sala - Entrar em sala pública + Entrar em uma sala pública Conexão (via %1$s) Idioma do jogo/lista de palavras Idioma do jogo - Misturar jogadores - Adicionar jogador + Misturar os jogadores + Adicionar um jogador %1$s configurações (na rede) Configurações para %1$s Baixados @@ -116,17 +116,17 @@ Apagar %1$s deixará você sem qualquer %2$s listas de palavras. Um ou mais jogos não abrirão (até você baixar uma lista de substituição.) Mude o nome desse jogo (somente nesse dispositivo) para: Mude o nome desse jogo para: - Partidas que já foram conectadas no servidor não podem ser copiadas. Use \"Novo jogo de\" para criar uma cópia para jogar com as mesmas configurações. + As partidas que já foram conectadas no servidor não podem ser copiadas. Use \"Novo jogo a partir de\" para criar uma cópia usando as mesmas configurações. Você tem certeza que quer apagar o jogo selecionado\? Esta ação não poder ser desfeita. Você tem certeza que quer apagar %1$d jogos selecionados\? Esta ação não poder ser desfeita. - Nenhum jogo encontrado que conecte pelo servidor. - Verificar servidor para jogadas etc… - Partida iniciada na sala “%1$s” + Nenhum jogo foi encontrado que se conecte através servidor. + Conferindo o servidor por movimentações etc… + A partida foi iniciada na sala “%1$s” - Uma jogada realizada - %1$d jogadas realizadas + Um movimento realizado + %1$d movimentos realizados Redefinir Configurações do APP… @@ -146,7 +146,7 @@ Você tem certeza que quer deletar as listas de palavras %1$s\? Tornar padrão - Mudar local de armazenamento + Alterar o local de armazenamento Incluir Lista de palavras do CrossWords @@ -160,23 +160,23 @@ Renomear jogo Conexões… Copiar - Novo jogo de + Novo jogo a partir de Restaurar - Apagar jogo - Mudar para grupo… + Excluir o jogo + Mover para grupo… Renomear… - Opções de jogo… + Opções da partida… Sobre o CrossWords… - Verificar jogadas - Listas de palavras… - Apagar - Fim de jogo sddsf + Confira por movimentações + Listas das palavras… + Excluir + Fim da partida sddsf Jogadores convidados para a sala “%1$s” Jogadores convidados - Fim de jogo na sala “%1$s” - Configurado para sala “%1$s” - Aguardando jogadores na sala “%1$s” - (não está aqui…) + Fim da partida na sala “%1$s” + Configurado para a sala “%1$s” + Aguardando os jogadores na sala “%1$s” + (ainda não está aqui…) %1$s (robô) palavra ilegal na jogada; turno perdido! Trocado %1$s para %2$s. @@ -404,8 +404,8 @@ Envios Bluetooth para %1$s falharam vezes demais. Reabra o jogo para tentar de novo. Envio Bluetooth para %1$s falhou; tente %3$d novamente em %2$d segundos. - Escaneando por CrossWords - Escaneando por CrossWords em %1$d dispositivos emparelhados + Fazendo a varredura por CrossWords + Fazendo a varredura por CrossWords nos %1$d dispositivos emparelhados " \n @@ -448,8 +448,8 @@ Adicionar opção para toda tela de menu Ativar tradução local - Instalou uma tradução nova - Instalou %1$d novas traduções + Foi instalada uma nova tradução + Foram instaladas %1$d novas traduções %1$s (seu) %1$s (oficial) @@ -478,10 +478,10 @@ %1$d palavras copiadas - Tem certeza que quer deletar a palavra selecionada\? + Tem certeza que quer excluir a palavra selecionada\? \n \n(Esta ação não pode ser desfeita.) - Tem certeza que quer deletar as %1$d palavras selecionadas\?) + Tem certeza que quer excluir as %1$d palavras selecionadas\?) \n \n(Esta ação não pode ser desfeita.) @@ -495,10 +495,10 @@ " \n -\n(Um jogo também será deletado.)" +\n(Uma partida também será excluída.)" " \n -\n(%1$d jogos também serão deletados.)" +\n(%1$d partidas também serão excluídas.)" Tem certeza que quer deletar o grupo %1$s\? @@ -569,8 +569,8 @@ Esperando host Esperando resposta - Esperando jogador - Esperando %1$d jogadores + Esperando o jogador + Esperando os %1$d jogadores Os dois botões no fim desta tela e os dois primeiros itens na sua Barra de Ação (ou menu) fazem a mesma coisa. \n @@ -599,7 +599,7 @@ %1$s perdeu uma rodada %1$s jogou %2$s por um ponto - %1$s jogou %2$s por %3$d pontos + %1$s jogaram %2$s por %3$d pontos Des-selecionar Selecionar @@ -837,10 +837,10 @@ " \n -\n(Você tem um jogo ativo usando Bluetooth.)" +\n(Você tem uma partida ativa usando o Bluetooth.)" " \n -\n(Você tem %1$d jogos ativos usando Bluetooth.)" +\n(Você tem %1$d partidas ativas usando o Bluetooth.)" Jogar via Bluetooth está atualmente desativado, e nenhuma jogada será trocada via Bluetooth até que for ativado. \n @@ -879,8 +879,8 @@ O número %1$s para %2$s não é um número “móvel”. Importar mesmo assim\? Apenas dispositivos que estão atualmente disponíveis são exibidos. Se um dispositivo próximo não estiver aparecendo por favor certifique-se que o WiFi está ativado, que o CrossWords esteja instalado e que jogar via WiFiDirect esteja ativo. - Por favor selecione o nome do dispositivo WiFiDirect que você quer convidar para o seu novo jogo, então toque em “%2$s”. - Por favor selecione os nomes dos %1$d dispositivos WiFiDirect que você quer convidar para o seu novo jogo, então toque em “%2$s”. + Selecione o nome do dispositivo WiFiDirect que você quer convidar para um novo jogo, então toque no “%2$s”. + Selecione os nomes dos %1$d dispositivos WiFiDirect que você quer convidar para um novo jogo, então toque no “%2$s”. Por favor cheque o dispositivo que você quer convidar para seu novo jogo, então toque em “%2$s”. @@ -907,8 +907,8 @@ Nova lista de palavras Tudo está atualizado. - Tem certeza que quer deletar o número de telefone checado\? - Tem certeza que quer deletar os %1$d números de telefone checados\? + Tem certeza que quer excluir o número de telefone verificado\? + Tem certeza que quer excluir os %1$d números de telefone verificados\? (Opcional) Nome do contato (opcional): @@ -1006,9 +1006,9 @@ " e " Configurar jogo Começar jogo - Começar com %1$s - Convite Desconhecido - Convite Conhecido + Inicie o jogo com %1$s + Convide um Novo Jogador + Convide um Jogador Conhecido OU comece um jogo após configurá-lo, p. ex. para mudar a língua ou número de jogadores OU comece um jogo com alguém com quem você já jogou antes, sem precisar de convites Comece um jogo com uma nova pessoa, enviando um convite via e-mail, SMS, ou até código QR @@ -1115,4 +1115,20 @@ Revanche Exibindo: %1$s, de tamanho %2$d-%3$d (%4$d palavras) Com revanches, todos os convites necessários são enviados automaticamente. Mas você sempre pode enviar novos se um convidado não estiver respondendo. + Iniciar uma partida solo utilizando os padrões atuais + Partida mais recente: %1$s + Internet/MQTT + %1$s (dup.) + Dup + gameid + rowid + CDMA + GSM + %1$s/%2$s + %1$s + " pct." + [#%1$d] %2$s: %3$d + Internet/retransmissor + %1$s: + [vazio] \ No newline at end of file From 8f30e4ef5a3fb44e8855d37adb6a540adb3d7ffa Mon Sep 17 00:00:00 2001 From: Eric House Date: Sat, 9 Jan 2021 20:36:52 -0800 Subject: [PATCH 3/3] don't let first player have unplayable rack --- xwords4/common/server.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/xwords4/common/server.c b/xwords4/common/server.c index 1b77a2d8a..db261f38e 100644 --- a/xwords4/common/server.c +++ b/xwords4/common/server.c @@ -168,7 +168,7 @@ static void setTurn( ServerCtxt* server, XWEnv xwe, XP_S16 turn ); static XWStreamCtxt* mkServerStream( ServerCtxt* server ); static void fetchTiles( ServerCtxt* server, XWEnv xwe, XP_U16 playerNum, XP_U16 nToFetch, const TrayTileSet* tradedTiles, - TrayTileSet* resultTiles ); + TrayTileSet* resultTiles, XP_Bool forceCanPlay ); static void finishMove( ServerCtxt* server, XWEnv xwe, TrayTileSet* newTiles, XP_U16 turn ); static XP_Bool dupe_checkTurns( ServerCtxt* server, XWEnv xwe ); @@ -1602,7 +1602,7 @@ server_tilesPicked( ServerCtxt* server, XWEnv xwe, XP_U16 player, TrayTileSet newTiles = *newTilesP; pool_removeTiles( server->pool, &newTiles ); - fetchTiles( server, xwe, player, MAX_TRAY_TILES, NULL, &newTiles ); + fetchTiles( server, xwe, player, MAX_TRAY_TILES, NULL, &newTiles, XP_FALSE ); XP_ASSERT( !inDuplicateMode(server) ); model_assignPlayerTiles( server->vol.model, player, &newTiles ); @@ -2438,7 +2438,8 @@ dupe_trayAllowsMoves( ServerCtxt* server, XWEnv xwe, XP_U16 turn, */ static void fetchTiles( ServerCtxt* server, XWEnv xwe, XP_U16 playerNum, XP_U16 nToFetch, - const TrayTileSet* tradedTiles, TrayTileSet* resultTiles ) + const TrayTileSet* tradedTiles, TrayTileSet* resultTiles, + XP_Bool forceCanPlay /* First player shouldn't have unplayable rack*/ ) { XP_ASSERT( server->vol.gi->serverRole != SERVER_ISCLIENT || !inDuplicateMode(server) ); XP_Bool ask; @@ -2515,7 +2516,7 @@ fetchTiles( ServerCtxt* server, XWEnv xwe, XP_U16 playerNum, XP_U16 nToFetch, for ( XP_U16 nBadTrays = 0; 0 < nLeft; ) { pool_requestTiles( pool, &resultTiles->tiles[nSoFar], &nLeft ); - if ( !inDuplicateMode( server ) ) { + if ( !inDuplicateMode( server ) && !forceCanPlay ) { break; } else if ( dupe_trayAllowsMoves( server, xwe, playerNum, &resultTiles->tiles[0], nSoFar + nLeft ) @@ -2583,7 +2584,7 @@ assignTilesToAll( ServerCtxt* server, XWEnv xwe ) } if ( 0 == ii || !gi->inDuplicateMode ) { newTiles.nTiles = 0; - fetchTiles( server, xwe, ii, numAssigned, NULL, &newTiles ); + fetchTiles( server, xwe, ii, numAssigned, NULL, &newTiles, ii == 0 ); } if ( gi->inDuplicateMode ) { @@ -3201,7 +3202,7 @@ dupe_makeAndReportTrade( ServerCtxt* server, XWEnv xwe ) pool_replaceTiles( pool, &oldTiles ); TrayTileSet newTiles = {0}; - fetchTiles( server, xwe, DUP_PLAYER, oldTiles.nTiles, NULL, &newTiles ); + fetchTiles( server, xwe, DUP_PLAYER, oldTiles.nTiles, NULL, &newTiles, XP_FALSE ); model_commitDupeTrade( model, &oldTiles, &newTiles ); @@ -3355,7 +3356,7 @@ dupe_commitAndReportMove( ServerCtxt* server, XWEnv xwe, XP_U16 winner, model_currentMoveToMoveInfo( model, winner, &moveInfo ); TrayTileSet newTiles = {0}; - fetchTiles( server, xwe, winner, nTiles, NULL, &newTiles ); + fetchTiles( server, xwe, winner, nTiles, NULL, &newTiles, XP_FALSE ); for ( XP_U16 player = 0; player < nPlayers; ++player ) { model_resetCurrentTurn( model, xwe, player ); @@ -3665,7 +3666,7 @@ finishMove( ServerCtxt* server, XWEnv xwe, TrayTileSet* newTiles, XP_U16 turn ) server->vol.pickTilesCalled[turn] = XP_FALSE; XP_U16 nTilesMoved = model_getCurrentMoveCount( model, turn ); - fetchTiles( server, xwe, turn, nTilesMoved, NULL, newTiles ); + fetchTiles( server, xwe, turn, nTilesMoved, NULL, newTiles, XP_FALSE ); XP_Bool isClient = gi->serverRole == SERVER_ISCLIENT; XP_Bool isLegalMove = XP_TRUE; @@ -3718,7 +3719,7 @@ server_commitTrade( ServerCtxt* server, XWEnv xwe, const TrayTileSet* oldTiles, } XP_U16 turn = server->nv.currentTurn; - fetchTiles( server, xwe, turn, oldTiles->nTiles, oldTiles, &newTiles ); + fetchTiles( server, xwe, turn, oldTiles->nTiles, oldTiles, &newTiles, XP_FALSE ); #ifndef XWFEATURE_STANDALONE_ONLY if ( server->vol.gi->serverRole == SERVER_ISCLIENT ) {