diff --git a/app/src/main/java/legion/muyue/best2048/MultiplayerActivity.java b/app/src/main/java/legion/muyue/best2048/MultiplayerActivity.java
index 2cb563e..4d9f8a8 100644
--- a/app/src/main/java/legion/muyue/best2048/MultiplayerActivity.java
+++ b/app/src/main/java/legion/muyue/best2048/MultiplayerActivity.java
@@ -7,12 +7,15 @@ import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.annotation.SuppressLint;
import android.app.AlertDialog;
+import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.util.TypedValue;
import android.view.Gravity;
+import android.view.LayoutInflater;
import android.view.View;
+import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
@@ -577,40 +580,13 @@ public class MultiplayerActivity extends AppCompatActivity {
}
// Met à jour l'UI sur le thread principal
runOnUiThread(() -> {
- showGameOverMessage(finalState); // Affiche le message de fin
+ showEndGameDialog(finalState);
disableSwipe(); // Désactive les swipes
closeWebSocket(); // Ferme la connexion
});
}
}
- /**
- * Affiche le message approprié dans le TextView de statut en fonction du résultat de la partie.
- * Gère les cas de victoire, défaite, match nul, et victoire par forfait (heuristique).
- *
- * @param finalState L'état final du jeu {@link GameStateResponse}.
- */
- private void showGameOverMessage(GameStateResponse finalState) {
- String endMessage;
- boolean wonByForfeit = false;
- // Heuristique pour détecter une victoire par forfait (si on gagne sans atteindre l'objectif)
- // Cela nécessite que le serveur attribue correctement le gagnant en cas de déconnexion adverse.
- if (myPlayerId != null && myPlayerId.equals(finalState.getWinnerId()) && finalState.getMyScore(myPlayerId) < finalState.getTargetScore()) {
- wonByForfeit = true;
- }
-
- // Choisit le message en fonction du résultat
- if ("DRAW".equals(finalState.getWinnerId())) { endMessage = getString(R.string.game_over_draw); }
- else if (wonByForfeit) { endMessage = "Opponent disconnected - You Win!"; }
- else if (myPlayerId != null && myPlayerId.equals(finalState.getWinnerId())) { endMessage = getString(R.string.game_over_won); }
- else if (opponentPlayerId != null && opponentPlayerId.equals(finalState.getWinnerId())) { endMessage = getString(R.string.game_over_lost); }
- else { endMessage = getString(R.string.game_over_generic); } // Cas générique
-
- // Affiche le message et efface l'indicateur de tour
- statusTextMulti.setText(endMessage);
- turnIndicatorMulti.setText("");
- }
-
/**
* Synchronise la vue du plateau de jeu ({@link #boardGridLayoutMulti}) avec l'état
* du plateau fourni.
@@ -968,6 +944,69 @@ public class MultiplayerActivity extends AppCompatActivity {
statusTextMulti.setText(myTurn ? "" : getString(R.string.multiplayer_status_waiting_opponent));
}
+ /**
+ * Affiche une boîte de dialogue indiquant la fin de la partie multijoueur (Victoire, Défaite, Égalité)
+ * en utilisant un layout personnalisé pour correspondre au style des dialogues solo.
+ * Propose un bouton pour revenir à l'écran principal (MainActivity).
+ *
+ * @param finalState L'état final du jeu reçu du serveur.
+ */
+ private void showEndGameDialog(GameStateResponse finalState) {
+ if (isFinishing() || finalState == null || myPlayerId == null) {
+ return;
+ }
+
+ // Détermine le résultat
+ boolean isWin = myPlayerId.equals(finalState.getWinnerId());
+ boolean isDraw = "DRAW".equals(finalState.getWinnerId());
+
+ String titleText;
+ String messageText;
+
+ if (isWin) {
+ titleText = getString(R.string.game_over_won);
+ messageText = getString(R.string.multiplayer_win_message);
+ } else if (isDraw) {
+ titleText = getString(R.string.game_over_draw);
+ messageText = getString(R.string.multiplayer_draw_message);
+ } else {
+ titleText = getString(R.string.game_over_lost);
+ messageText = getString(R.string.multiplayer_loss_message);
+ }
+
+ // Création du Builder et inflation du layout personnalisé
+ AlertDialog.Builder builder = new AlertDialog.Builder(this);
+ LayoutInflater inflater = getLayoutInflater();
+ View dialogView = inflater.inflate(R.layout.dialog_multiplayer_game_over, null); // Utilise le nouveau layout
+ builder.setView(dialogView);
+ builder.setCancelable(false);
+
+ // Récupération des vues DANS le layout personnalisé
+ TextView titleTextView = dialogView.findViewById(R.id.dialogTitleMultiGameOver);
+ TextView messageTextView = dialogView.findViewById(R.id.dialogMessageMultiGameOver);
+ Button mainMenuButton = dialogView.findViewById(R.id.dialogButtonMainMenu);
+
+ // Définition du contenu des vues
+ titleTextView.setText(titleText);
+ messageTextView.setText(messageText);
+
+ // Création de la boîte de dialogue AVANT de définir l'OnClickListener du bouton
+ final AlertDialog dialog = builder.create();
+
+ // Configuration du bouton DANS le layout personnalisé
+ mainMenuButton.setOnClickListener(v -> {
+ // Action lorsque l'utilisateur clique sur le bouton "Menu principal"
+ dialog.dismiss();
+ closeWebSocket();
+ Intent intent = new Intent(MultiplayerActivity.this, MainActivity.class);
+ intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
+ startActivity(intent);
+ finish();
+ });
+
+ dialog.show(); // Affiche la boîte de dialogue
+ }
+
/**
* Énumération privée représentant les quatre directions de mouvement possibles.
*/
diff --git a/app/src/main/res/layout/activity_multiplayer.xml b/app/src/main/res/layout/activity_multiplayer.xml
index 5a06c72..b011d07 100644
--- a/app/src/main/res/layout/activity_multiplayer.xml
+++ b/app/src/main/res/layout/activity_multiplayer.xml
@@ -12,17 +12,20 @@
android:id="@+id/multiplayerInfoPanel"
android:layout_width="0dp"
android:layout_height="wrap_content"
+ android:layout_marginTop="36dp"
android:orientation="horizontal"
android:padding="@dimen/padding_general"
- app:layout_constraintTop_toTopOf="parent"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
- app:layout_constraintEnd_toEndOf="parent">
+ app:layout_constraintTop_toTopOf="parent">
+ tools:text="À votre tour" />
diff --git a/app/src/main/res/layout/dialog_multiplayer_game_over.xml b/app/src/main/res/layout/dialog_multiplayer_game_over.xml
new file mode 100644
index 0000000..c27ca39
--- /dev/null
+++ b/app/src/main/res/layout/dialog_multiplayer_game_over.xml
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 39370a9..f95ccbc 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -122,4 +122,9 @@
You Won!
You Lost.
Game Over!
+
+ Main menu
+ Congratulations! You won the game.
+ Too bad! Your opponent was better this time.
+ It\'s a draw! A hard-fought game.
\ No newline at end of file