Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Promo Multiplayer #227

Merged
merged 10 commits into from
Dec 5, 2023
3 changes: 3 additions & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,9 @@ android {
}
}
}
buildFeatures {
buildConfig true
}
}

dependencies {
Expand Down
1 change: 1 addition & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@
<application
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:networkSecurityConfig="@xml/network_security_config"
android:theme="@style/miniTrucoTheme">
<activity
android:name=".android.multiplayer.internet.ClienteInternetActivity"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package me.chester.minitruco.android;

/* SPDX-License-Identifier: BSD-3-Clause */
/* Copyright © 2005-2023 Carlos Duarte do Nascimento "Chester" <[email protected]> */

import android.content.Context;
import android.content.SharedPreferences;

import androidx.preference.PreferenceManager;

import me.chester.minitruco.R;

public class PreferenceUtils {
public static String getLetraDoModo(Context context) {
return getPreferences(context).getString("modo", "P");
}

public static String getServidor(Context context) {
return getPreferences(context).getBoolean("servidorLocal", false) ?
context.getString(R.string.opcoes_default_servidor_local) :
context.getString(R.string.opcoes_default_servidor);
}

private static SharedPreferences getPreferences(Context context) {
return PreferenceManager.getDefaultSharedPreferences(context);
}
}
25 changes: 20 additions & 5 deletions app/src/main/java/me/chester/minitruco/android/TituloActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import static android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET;
import static android.provider.Settings.Global.DEVICE_NAME;
import static me.chester.minitruco.android.PreferenceUtils.getLetraDoModo;

import android.app.AlertDialog;
import android.bluetooth.BluetoothAdapter;
Expand All @@ -24,6 +25,7 @@
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import androidx.core.util.Consumer;
import androidx.preference.PreferenceManager;
Expand All @@ -33,6 +35,7 @@
import me.chester.minitruco.android.multiplayer.bluetooth.ClienteBluetoothActivity;
import me.chester.minitruco.android.multiplayer.bluetooth.ServidorBluetoothActivity;
import me.chester.minitruco.android.multiplayer.internet.ClienteInternetActivity;
import me.chester.minitruco.android.multiplayer.internet.InternetUtils;
import me.chester.minitruco.core.Jogador;
import me.chester.minitruco.core.JogadorBot;
import me.chester.minitruco.core.Partida;
Expand Down Expand Up @@ -96,10 +99,7 @@ public void onCreate(Bundle savedInstanceState) {
mostraAlertBox(this.getString(R.string.titulo_sobre), stats_versao
+ this.getString(R.string.texto_sobre));
});
// TODO ver se tem um modo mais central de garantir este default (e outros)
// (provavelmente quando migrar esse PreferenceManager deprecado
// e começar a centralizar as preferencias nesta view)
selecionaModo(preferences.getString("modo", "P"));
selecionaModo(getLetraDoModo(this));
}

/**
Expand Down Expand Up @@ -150,6 +150,8 @@ private void mostraNotificacaoInicial() {
mostraAlertBox(this.getString(R.string.titulo_instrucoes), this.getString(R.string.texto_instrucoes));
} else if (!versaoQueMostrouNovidades.equals(versaoAtual)) {
mostraAlertBox("Novidades", this.getString(R.string.novidades));
} else {
promoveJogoInternet(false);
}

Editor e = preferences.edit();
Expand Down Expand Up @@ -339,13 +341,16 @@ public void modoButtonClickHandler(View view) {
.setMessage("Estes modos são jogados com a partida valendo 1 e o truco indo a 3, depois 6, 9 e 12.")
.setNegativeButton("Baralho Limpo", (dialog, which) -> {
selecionaModo("L");
promoveJogoInternet(true);
})
.setPositiveButton("Manilha Velha", (dialog, which) -> {
selecionaModo("V");
promoveJogoInternet(true);
})
.show();
} else {
selecionaModo((String) view.getTag());
promoveJogoInternet(true);
}
}

Expand All @@ -354,9 +359,19 @@ private void selecionaModo(String modo) {
preferences.edit().putString("modo", modo).apply();
}

private void promoveJogoInternet(boolean repete) {
new Thread(() -> {
if (InternetUtils.isPromoveJogoInternet(this, repete)) {
runOnUiThread(() -> {
Toast.makeText(this, "Jogue pela internet agora! Pessoas estão aguardando por você.", Toast.LENGTH_LONG).show();
});
}
}).start();
}

@Override
public Partida criaNovaPartida(JogadorHumano jogadorHumano) {
String modo = preferences.getString("modo", "P");
String modo = getLetraDoModo(this);
boolean humanoDecide = preferences.getBoolean("humanoDecide", true);
boolean jogoAutomatico = preferences.getBoolean("jogoAutomatico", false);
Partida novaPartida = new PartidaLocal(humanoDecide, jogoAutomatico, modo);
Expand Down
15 changes: 15 additions & 0 deletions app/src/main/java/me/chester/minitruco/android/TrucoActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,13 @@
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.preference.PreferenceManager;

import me.chester.minitruco.R;
import me.chester.minitruco.android.multiplayer.internet.InternetUtils;
import me.chester.minitruco.core.Partida;

/* SPDX-License-Identifier: BSD-3-Clause */
Expand Down Expand Up @@ -367,13 +369,26 @@ public void jogoFechado(int numEquipeVencedora) {
// servidor bluetooth (em ambos os casos, estará na posição 1).
if (jogadorHumano.getPosicao() == 1) {
btnNovaPartida.setVisibility(View.VISIBLE);
if (partida.semJogadoresRemotos()) {
promoveJogoInternet();
}
if (partida.isJogoAutomatico()) {
btnNovaPartida.performClick();
}
}
});
}

private void promoveJogoInternet() {
new Thread(() -> {
if (InternetUtils.isPromoveJogoInternet(this, false)) {
runOnUiThread(() -> {
Toast.makeText(this, "Tem pessoas de verdade aguardando para jogar! Use o botão Internet na tela inicial.", Toast.LENGTH_LONG).show();
});
}
}).start();
}

/**
* Determina se o placar de partidas deve ser salvo/recuperado
*
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package me.chester.minitruco.android.multiplayer.bluetooth;

import static me.chester.minitruco.android.PreferenceUtils.getLetraDoModo;
import static me.chester.minitruco.core.JogadorBot.APELIDO_BOT;
import static me.chester.minitruco.core.TrucoUtils.POSICAO_PLACEHOLDER;
import static me.chester.minitruco.core.TrucoUtils.montaNotificacaoI;
Expand Down Expand Up @@ -61,10 +62,7 @@ public void onReceive(Context context, Intent intent) {

@Override
void iniciaAtividadeBluetooth() {
SharedPreferences preferences = PreferenceManager
.getDefaultSharedPreferences(this);
// TODO titulo poderia passar como extra do intent
modo = preferences.getString("modo", "P");
modo = getLetraDoModo(this);
layoutBotoesGerente.setVisibility(View.VISIBLE);
btnIniciar.setOnClickListener(v -> {
status = STATUS_EM_JOGO;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@

import static android.text.InputType.TYPE_CLASS_NUMBER;

import static me.chester.minitruco.android.PreferenceUtils.getLetraDoModo;
import static me.chester.minitruco.android.PreferenceUtils.getServidor;

import android.app.AlertDialog;
import android.content.SharedPreferences;
import android.os.Bundle;
Expand All @@ -12,7 +15,6 @@
import android.widget.EditText;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.preference.PreferenceManager;

import java.io.BufferedReader;
Expand All @@ -27,7 +29,6 @@
import java.util.logging.Logger;

import me.chester.minitruco.BuildConfig;
import me.chester.minitruco.R;
import me.chester.minitruco.android.CriadorDePartida;
import me.chester.minitruco.android.JogadorHumano;
import me.chester.minitruco.android.SalaActivity;
Expand Down Expand Up @@ -187,9 +188,7 @@ public void onBackPressed() {
}

private boolean conecta() {
String servidor = preferences.getBoolean("servidorLocal", false) ?
this.getString(R.string.opcoes_default_servidor_local) :
this.getString(R.string.opcoes_default_servidor);
String servidor = getServidor(this);
try {
socket = new Socket();
socket.connect(new InetSocketAddress(servidor, 6912), 10_000);
Expand Down Expand Up @@ -233,7 +232,7 @@ private void processaNotificacoes() {
case 'N': // Nome foi aceito
// Já vamos entrar de cara numa sala pública (se a pessoa quiser
// fazer outra coisa, ela usa o botão apropriado)
enviaLinha("E PUB " + getModoDasPreferencias());
enviaLinha("E PUB " + getLetraDoModo(this));
break;
case 'I': // Entrou/voltou para uma sala (ou ela foi atualizada)
exibeMesaForaDoJogo(line);
Expand Down Expand Up @@ -287,11 +286,6 @@ private void erroFatalSalaInvalida() {
"te convidou e tente novamente.");
}

@NonNull
private String getModoDasPreferencias() {
return preferences.getString("modo", "P");
}

/**
* Se estivermos numa sala pública e a mesa estiver cheia, inicia contagem
* regressiva para auto-início do jogo.
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
package me.chester.minitruco.android.multiplayer.internet;

/* SPDX-License-Identifier: BSD-3-Clause */
/* Copyright © 2005-2023 Carlos Duarte do Nascimento "Chester" <[email protected]> */

import static me.chester.minitruco.android.PreferenceUtils.getLetraDoModo;
import static me.chester.minitruco.android.PreferenceUtils.getServidor;

import android.content.Context;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;

/**
* Métodos utilitários relacionados ao jogo online.
*/
public class InternetUtils {

static boolean mostrouConvite = false;

/**
* Diz se devemos mostrar um toast convidando a pessoa para jogar na
* internet, verificando se existe sala no servidor no modo de jogo
* selecionado que esteja esperando pessoas.
* <p>
* O objetivo é reduzir a espera no servidor, mas sem irritar quem
* não quer jogar online, então a resposta positiva só é retornada
* uma vez por execução do aplicativo, a não ser que repete seja true.
*
*
* @param context Context usado para ler preferências e mostrar toast
* @param repete Se true, esquece toasts anteriores (útil para quando
* a pessoa seleciona um modo de jogo diferente)
*/
public static boolean isPromoveJogoInternet(Context context, boolean repete) {
if (repete) {
mostrouConvite = false;
}
if (mostrouConvite) {
return false;
}

HttpURLConnection urlConnection = null;
try {
URL url = new URL("http://" + getServidor(context) + ":6912/status");
urlConnection = (HttpURLConnection) url.openConnection();
BufferedReader reader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
if (line.startsWith("AGUARDANDO ") && line.substring(11).contains(getLetraDoModo(context))) {
mostrouConvite = true;
return true;
}
}
} catch (IOException e) {
return false;
} finally {
if (urlConnection != null) {
urlConnection.disconnect();
}
}
return false;
}
}
2 changes: 1 addition & 1 deletion app/src/main/res/values/opcoes.xml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="opcoes_default_servidor">minitruco.chester.me</string>
<string name="opcoes_default_servidor_local">192.168.2.10</string>
<string name="opcoes_default_servidor_local">192.168.2.100</string>

<string-array name="fonte_nomes">
<item>Normal</item>
Expand Down
7 changes: 7 additions & 0 deletions app/src/main/res/xml/network_security_config.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="false">minitruco.chester.me</domain>
<domain includeSubdomains="false">192.168.2.100</domain>
</domain-config>
</network-security-config>
Loading
Loading