Jeu de test, optimisation correction de bug

This commit is contained in:
feldenr
2026-01-17 01:35:37 +01:00
parent c803469643
commit 69411ede10
10 changed files with 310 additions and 23 deletions
@@ -22,6 +22,7 @@ import com.example.boidelov3.R;
import com.example.boidelov3.data.PlayerStats;
import com.example.boidelov3.data.QuestionCategory;
import com.example.boidelov3.data.QuestionRepository;
import com.example.boidelov3.game.GameEngine;
import com.example.boidelov3.Question;
import com.example.boidelov3.Questions;
import com.example.boidelov3.utils.ErrorHandler;
@@ -65,8 +66,8 @@ public class BoideloClassicGameActivity extends AppCompatActivity {
private Map<String, PlayerStats> playerStatsMap;
// Services
// private SoundManager soundManager; // TODO: Fix SoundManager constructor
// private GameEngine gameEngine; // TODO: Fix GameEngine
private com.example.boidelov3.utils.SoundManager soundManager;
private GameEngine gameEngine;
private QuestionRepository questionRepository;
// Random
@@ -165,8 +166,8 @@ public class BoideloClassicGameActivity extends AppCompatActivity {
* Initialise les services
*/
private void initServices() {
// soundManager = new SoundManager(this); // TODO: Fix SoundManager
// gameEngine = new GameEngine(); // TODO: Fix GameEngine
soundManager = com.example.boidelov3.utils.SoundManager.getInstance(this);
gameEngine = new GameEngine();
questionRepository = new QuestionRepository(this);
}
@@ -179,7 +180,16 @@ public class BoideloClassicGameActivity extends AppCompatActivity {
Questions q = result.getData();
questions = q != null && q.getQuestions() != null ? q.getQuestions() : new ArrayList<>();
} else {
android.util.Log.e("BoideloClassicGame", "Erreur lors du chargement des questions: " + result.getError());
questions = new ArrayList<>();
// Afficher une erreur à l'utilisateur
new androidx.appcompat.app.AlertDialog.Builder(this)
.setTitle("Erreur de chargement")
.setMessage("Impossible de charger les questions. Veuillez réinstaller l'application.")
.setPositiveButton("Fermer", (dialog, which) -> finish())
.setCancelable(false)
.show();
}
questionsAvecManches = new ArrayList<>();
}
@@ -260,6 +270,9 @@ public class BoideloClassicGameActivity extends AppCompatActivity {
*/
private void handleGameEnd() {
isFinishingGame = true;
// Sauvegarder les stats avant de terminer
saveGameStats();
// Prépare les stats pour l'activité de fin
Intent intent = new Intent(this, EndGameActivity.class);
@@ -329,6 +342,8 @@ public class BoideloClassicGameActivity extends AppCompatActivity {
*/
private void displayNewQuestion() {
if (questions == null || questions.isEmpty()) {
android.util.Log.e("BoideloClassicGame", "Aucune question disponible - fin du jeu");
handleGameEnd();
return;
}
@@ -372,7 +387,15 @@ public class BoideloClassicGameActivity extends AppCompatActivity {
* Affiche la notification de fin de manche
*/
private void showMancheEndNotification() {
// TODO: Implémenter la notification de fin de manche
if (soundManager != null) {
soundManager.playManche();
}
// Vibration pour feedback haptique
BoideloAnimationUtils.triggerErrorHaptic(this);
// Afficher un message toast pour informer les joueurs
android.widget.Toast.makeText(this, "⏱️ Manche terminée!", android.widget.Toast.LENGTH_SHORT).show();
}
/**
@@ -958,7 +981,18 @@ public class BoideloClassicGameActivity extends AppCompatActivity {
* Sauvegarde les stats du jeu
*/
private void saveGameStats() {
// TODO: Implémenter la sauvegarde des stats
if (questionRepository != null && playerStatsMap != null) {
// Calculer le total des questions posées
int totalQuestionsPlayed = totalQuestionsAsked;
int playersCount = toutlesjoueurs != null ? toutlesjoueurs.size() : 0;
// Sauvegarder dans SharedPreferences via le repository
questionRepository.saveGameStats(totalQuestionsPlayed, playersCount);
android.util.Log.d("BoideloClassicGame",
"Stats sauvegardées: " + totalQuestionsPlayed + " questions, " +
playersCount + " joueurs");
}
}
/**
@@ -101,6 +101,8 @@ public class GameSelectionActivity extends AppCompatActivity implements GameAdap
public void onItemClick(GameInfo gameInfo) {
if (!gameInfo.isAvailable()) {
// Afficher un message "Coming soon"
android.widget.Toast.makeText(this, gameInfo.getName() + " - Bientôt disponible!",
android.widget.Toast.LENGTH_SHORT).show();
return;
}
@@ -115,7 +117,9 @@ public class GameSelectionActivity extends AppCompatActivity implements GameAdap
startActivity(new Intent(this, com.example.boidelov3.games.papelito.PapelitoSetupActivity.class));
break;
case RULES:
// TODO: Implémenter RulesListActivity
// À implémenter: RulesListActivity
android.widget.Toast.makeText(this, "Règles de jeux - Bientôt disponible!",
android.widget.Toast.LENGTH_SHORT).show();
break;
}
}
@@ -6,7 +6,6 @@ import android.util.Log;
import java.security.MessageDigest;
import java.security.SecureRandom;
import java.util.Base64;
/**
* Classe utilitaire pour la gestion sécurisée des clés API et configuration sensible.
@@ -188,12 +187,25 @@ public class SecureConfig {
* @return Le hash de la clé
*/
public String hashApiKey(String apiKey) {
if (apiKey == null) {
Log.w(TAG, "Tentative de hasher une clé API null");
return null;
}
if (apiKey.trim().isEmpty()) {
Log.w(TAG, "Tentative de hasher une clé API vide");
return null;
}
try {
MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] hash = digest.digest(apiKey.getBytes("UTF-8"));
return Base64.getEncoder().encodeToString(hash);
} catch (Exception e) {
Log.e(TAG, "Erreur lors du hash de la clé", e);
return android.util.Base64.encodeToString(hash, android.util.Base64.NO_WRAP);
} catch (java.security.NoSuchAlgorithmException e) {
Log.e(TAG, "SHA-256 non disponible sur cet appareil - hash impossible", e);
return null;
} catch (java.io.UnsupportedEncodingException e) {
Log.e(TAG, "UTF-8 encoding non supporté - impossible", e);
return null;
}
}
@@ -207,7 +219,7 @@ public class SecureConfig {
public String generateSecureToken(int length) {
byte[] token = new byte[length];
secureRandom.nextBytes(token);
return Base64.getEncoder().encodeToString(token);
return android.util.Base64.encodeToString(token, android.util.Base64.NO_WRAP);
}
/**