Skip to content

Commit

Permalink
Merge pull request #197 from chesterbr/retoques-cliente-internet
Browse files Browse the repository at this point in the history
Melhorias visuais em salas multiplayer
  • Loading branch information
chesterbr authored Aug 5, 2023
2 parents 299af5b + eb08cd9 commit 30f9310
Show file tree
Hide file tree
Showing 6 changed files with 57 additions and 82 deletions.
36 changes: 29 additions & 7 deletions app/src/main/java/me/chester/minitruco/android/SalaActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ public abstract class SalaActivity extends AppCompatActivity {
private View layoutJogadoresEBotoesGerente;
protected View layoutBotoesGerente;
protected View layoutBotoesSala;
protected View layoutRegras;
protected TextView textViewStatus;
protected TextView textViewJogador1;
protected TextView textViewJogador2;
Expand All @@ -61,6 +62,7 @@ protected void inicializaLayoutSala() {
layoutJogadoresEBotoesGerente = findViewById(R.id.layoutJogadoresEBotoesGerente);
layoutBotoesGerente = findViewById(R.id.layoutBotoesGerente);
layoutBotoesSala = findViewById(R.id.layoutBotoesSala);
layoutRegras = findViewById(R.id.layoutRegras);
btnNovaSala = findViewById(R.id.btnNovaSala);
btnEntrarSala = findViewById(R.id.btnEntrarSala);
textViewStatus = findViewById(R.id.textViewStatus);
Expand All @@ -73,7 +75,6 @@ protected void inicializaLayoutSala() {
layoutJogadoresEBotoesGerente.setVisibility(View.GONE);
layoutBotoesGerente.setVisibility(View.INVISIBLE);
layoutBotoesSala.setVisibility(View.GONE);
textViewStatus.setVisibility(View.GONE);
textViewInfoSala.setVisibility(View.GONE);
setMensagem(null);
}
Expand Down Expand Up @@ -117,18 +118,20 @@ protected void exibeMesaForaDoJogo(String notificacaoI) {
}

// Ajusta os nomes para que o jogador local fique sempre na
// parte inferior da tela (textViewJogador1)
// parte inferior da tela (textViewJogador1), sucedido por
// "(você)"; sucede a pessoa que é gerente com "(gerente)"
int p = (posJogador - 1) % 4;
textViewJogador1.setText(nomes[p]);
textViewJogador1.setText(nomes[p] + (p == 0 ? " (você/gerente)" : "(você)"));
p = (p + 1) % 4;
textViewJogador2.setText(nomes[p]);
textViewJogador2.setText(nomes[p] + (p == 0 ? " (gerente)" : ""));
p = (p + 1) % 4;
textViewJogador3.setText(nomes[p]);
textViewJogador3.setText(nomes[p] + (p == 0 ? " (gerente)" : ""));
p = (p + 1) % 4;
textViewJogador4.setText(nomes[p]);
textViewJogador4.setText(nomes[p] + (p == 0 ? " (gerente)" : ""));

// Atualiza outros itens do display
layoutJogadoresEBotoesGerente.setVisibility(View.VISIBLE);
layoutRegras.setVisibility(View.VISIBLE);
findViewById(R.id.layoutBotoesGerente).setVisibility(
isGerente ? View.VISIBLE : View.INVISIBLE);
if (isGerente) {
Expand Down Expand Up @@ -158,7 +161,7 @@ protected void exibeMesaForaDoJogo(String notificacaoI) {

protected void mostraAlertBox(String titulo, String texto) {
runOnUiThread(() -> {
if (this == null || this.isFinishing()) {
if (isFinishing()) {
return;
}
new AlertDialog.Builder(this).setTitle(titulo)
Expand All @@ -168,6 +171,25 @@ protected void mostraAlertBox(String titulo, String texto) {
});
}

protected void msgErroFatal(String texto) {
msgErroFatal("Aviso", texto);
}

protected void msgErroFatal(String titulo, String texto) {
runOnUiThread(() -> {
encerraTrucoActivity();
if (isFinishing()) {
return;
}
new AlertDialog.Builder(this)
.setTitle(titulo)
.setMessage(texto)
.setNeutralButton("Fechar", (dialog, which) -> finish())
.setOnCancelListener(v -> finish())
.show();
});
}

/**
* Cria uma nova partida.
* <p>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package me.chester.minitruco.android.multiplayer.bluetooth;

import android.Manifest;
import android.app.AlertDialog;
import android.bluetooth.BluetoothAdapter;
import android.content.pm.PackageManager;
import android.os.Build;
Expand Down Expand Up @@ -72,7 +71,6 @@ public abstract class BluetoothActivity extends SalaActivity implements
.fromString("3B175368-ABB4-11DB-A508-C2B155D89593");

protected BluetoothAdapter btAdapter;
protected final String[] apelidos = new String[4];

@Override
protected void onCreate(Bundle savedInstanceState) {
Expand Down Expand Up @@ -137,23 +135,6 @@ private String[] permissoesBluetoothFaltantes() {
*/
abstract void iniciaAtividadeBluetooth();

protected void msgErroFatal(String mensagem) {
runOnUiThread(() -> {
encerraTrucoActivity();
BluetoothActivity context = BluetoothActivity.this;
if (context == null || context.isFinishing()) {
return;
}
new AlertDialog.Builder(context)
.setTitle("Erro")
.setMessage(mensagem)
.setOnCancelListener(dialog -> finish())
.setNeutralButton("Ok",
(dialog, which) -> finish())
.show();
});
}

protected abstract int getNumClientes();

}
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ public void run() {
partida.abandona(0);
}
LOGGER.log(Level.INFO, "desconectado");
msgErroFatal("Você foi desconectado");
msgErroFatal("Conexão perdida.");
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@
import java.util.logging.Level;
import java.util.logging.Logger;

import me.chester.minitruco.R;
import me.chester.minitruco.android.JogadorHumano;
import me.chester.minitruco.core.Jogador;
import me.chester.minitruco.core.JogadorBot;
Expand Down Expand Up @@ -128,12 +127,11 @@ protected void onResume() {
// Dá um tempinho para os clientes se prepararem antes de permitir
// o início de uma nova partida
btnIniciar.setEnabled(false);
new Handler().postDelayed(() -> atualizaDisplay(), 4000);
new Handler().postDelayed(() -> atualizaClientes(), 4000);
}

public void run() {
LOGGER.log(Level.INFO, "iniciou atividade server");
atualizaDisplay();
try {
serverSocket = btAdapter.listenUsingRfcommWithServiceRecord(
NOME_BT, UUID_BT);
Expand Down Expand Up @@ -224,34 +222,6 @@ public void run() {
}
}

public void atualizaDisplay() {
// Esse array é usado pelo display para mostrar os nomes dos jogadores
// TODO: rever isso; de repente a gente deveria atualizar direto ou passar
// ele, ainda mais agora que isso só é usado no servidorbluetooth
apelidos[0] = Jogador.sanitizaNome(btAdapter.getName());
for(int i = 1; i <= 3; i++) {
if (jogadores[i - 1] != null) {
apelidos[i] = jogadores[i - 1].getNome();
} else {
apelidos[i] = APELIDO_BOT;
}
}
runOnUiThread(() -> {
textViewJogador1.setText(apelidos[0]);
textViewJogador2.setText(apelidos[1]);
textViewJogador3.setText(apelidos[2]);
textViewJogador4.setText(apelidos[3]);
if (modo != null) {
textViewStatus.setText("Modo: " + Partida.textoModo(modo));
}
btnIniciar.setEnabled(getNumClientes() > 0);
btnInverter.setEnabled(getNumClientes() > 0);
btnTrocar.setEnabled(getNumClientes() > 0);
findViewById(R.id.layoutJogadoresEBotoesGerente).setVisibility(View.VISIBLE);
layoutBotoesGerente.setVisibility(View.VISIBLE);
});
}

@Override
public int getNumClientes() {
int numClientes = 0;
Expand All @@ -264,16 +234,31 @@ public int getNumClientes() {
}

void atualizaClientes() {
// Vamos pegar os nomes do array vinculado ao display, então
// precisamos atualizar ele antes
atualizaDisplay();

// Recolhe os apelidos atuais
String[] apelidos = new String[4];
apelidos[0] = Jogador.sanitizaNome(btAdapter.getName());
for(int i = 1; i <= 3; i++) {
if (jogadores[i - 1] != null) {
apelidos[i] = jogadores[i - 1].getNome();
} else {
apelidos[i] = APELIDO_BOT;
}
}

// Usa eles para montar a string de notificação
String comando = montaNotificacaoI(apelidos, modo, "BLT");
// Envia a notificação para cada jogador (com sua posição)

// "Envia" a notfificação para nós mesmos (para atualizar a tela)
exibeMesaForaDoJogo(comando.replace(POSICAO_PLACEHOLDER, "1"));

// Envia a notificação para cada cliente (com sua posição), para que
// eles também se atualizem
for (int i = 0; i <= 2; i++) {
enviaLinha(i, comando.replace(POSICAO_PLACEHOLDER,
Integer.toString(i + 2)));
}

}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ protected void onCreate(Bundle savedInstanceState) {
enviaLinha("R T");
});

iniciaProcessamentoDeNotificacoes();
conectaEIniciaProcessamentoDeNotificacoes();
}

private void solicitaInicioDeJogoConfirmandoSeTiverBots() {
Expand All @@ -73,7 +73,8 @@ private void solicitaInicioDeJogoConfirmandoSeTiverBots() {
}
}

private void iniciaProcessamentoDeNotificacoes() {
private void conectaEIniciaProcessamentoDeNotificacoes() {
setMensagem("Conectando...");
new Thread(() -> {
try {
if (conecta()) {
Expand Down Expand Up @@ -117,7 +118,7 @@ private boolean conecta() {
enviaLinha("N " + preferences.getString(
"nome_multiplayer", null));
} catch (IOException e) {
msgErroFatal("Não foi possivel conectar.", e);
msgErroFatal("Falha na conexão", "Não foi possível conectar nos servidores do miniTruco. Tente novamente mais tarde.\n\nDetalhes: " + e.getLocalizedMessage());
return false;
}
return true;
Expand All @@ -132,7 +133,7 @@ private void processaNotificacoes() {
}
if (line == null) {
desconecta();
msgErroFatal("Você foi desconectado.", null);
msgErroFatal("Conexão perdida.");
return;
}
if (!line.startsWith("K ")) {
Expand Down Expand Up @@ -243,22 +244,6 @@ public Partida criaNovaPartida(JogadorHumano jogadorHumano) {
return partida;
}

private void msgErroFatal(String msg, Throwable e) {
runOnUiThread(() -> {
encerraTrucoActivity();
if (isFinishing()) {
return;
}
new AlertDialog.Builder(this)
.setIcon(android.R.drawable.ic_delete)
.setTitle("Erro")
.setMessage(e == null ? msg : msg + "\n\nDetalhes: " + e.getLocalizedMessage())
.setNeutralButton("Fechar", (dialog, which) -> finish())
.setOnCancelListener(v -> finish())
.show();
});
}

public void enviaLinha(String comando) {
// Roda numa nova thread sempre, porque pode ser chamado por handlers da main thread
// Não é a coisa mais otimizada do planeta, mas o custo é mínimo
Expand Down
2 changes: 2 additions & 0 deletions app/src/main/res/layout/sala.xml
Original file line number Diff line number Diff line change
Expand Up @@ -199,6 +199,8 @@
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="right"
android:paddingHorizontal="4dp"
android:text="Modo: algum modo aí!"
android:textColor="#000000"
android:textStyle="italic" />
</LinearLayout>
Expand Down

0 comments on commit 30f9310

Please sign in to comment.