From 0d0ab241de41a8417e3979faa137db61ab709bb7 Mon Sep 17 00:00:00 2001 From: "jeremy.ducourthial" Date: Sun, 3 Mar 2024 16:39:12 +0100 Subject: [PATCH] feat: ajout lancement du jeu quand le maitre du jeu lance la partie --- .../com/example/mathseduc/MultiActivity.kt | 67 +++++++++------- .../mathseduc/ServerDetailsActivity.kt | 79 +++++++++++++++---- .../mathseduc/controllers/ControllerLobby.kt | 57 ++++++++++++- .../com/example/mathseduc/models/Lobby.kt | 3 +- .../res/layout/activity_server_details.xml | 5 ++ 5 files changed, 168 insertions(+), 43 deletions(-) diff --git a/Android/app/src/main/java/com/example/mathseduc/MultiActivity.kt b/Android/app/src/main/java/com/example/mathseduc/MultiActivity.kt index e114a92..25e0025 100644 --- a/Android/app/src/main/java/com/example/mathseduc/MultiActivity.kt +++ b/Android/app/src/main/java/com/example/mathseduc/MultiActivity.kt @@ -3,6 +3,8 @@ package com.example.mathseduc import android.content.Context import android.content.Intent import android.os.Bundle +import android.os.Handler +import android.os.Looper import android.util.Log import android.view.LayoutInflater import android.view.View @@ -17,6 +19,10 @@ import okhttp3.MultipartBody class MultiActivity : AppCompatActivity() { + private lateinit var lobbyAdapter: LobbyAdapter + private val handler = Handler(Looper.getMainLooper()) + private val refreshInterval: Long = 3000 // Refresh every 3 seconds + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_multi) @@ -29,12 +35,11 @@ class MultiActivity : AppCompatActivity() { val listView = findViewById(R.id.listView) - val adapter = LobbyAdapter(this, serverList) - listView.adapter = adapter + lobbyAdapter = LobbyAdapter(this, serverList) + listView.adapter = lobbyAdapter listView.setOnItemClickListener { _, _, position, _ -> - - if (ControllerLobby.getNbPlayerInLobby(serverList[position].id) < serverList[position].nbplayers){ + if (ControllerLobby.getNbPlayerInLobby(serverList[position].id) < serverList[position].nbplayers) { val formDataBuilder = MultipartBody.Builder().setType(MultipartBody.FORM) formDataBuilder.addFormDataPart("idplayer", MainActivity.idPlayerConnected.toString()) formDataBuilder.addFormDataPart("idlobby", serverList[position].id.toString()) @@ -47,9 +52,13 @@ class MultiActivity : AppCompatActivity() { intent.putExtra("lobbyId", serverList[position].id) startActivity(intent) } else { - Toast.makeText(this, "Oh nan, le serveur est déja plein ! Réessayer plus tard.", Toast.LENGTH_SHORT).show() + Toast.makeText(this, "Oh nan, le serveur est déjà plein ! Réessayer plus tard.", Toast.LENGTH_SHORT).show() } } + + // Schedule periodic refresh using Handler and Runnable + handler.postDelayed(refreshRunnable, refreshInterval) + } else { Log.e("MultiActivity", "Error fetching server list") } @@ -60,12 +69,33 @@ class MultiActivity : AppCompatActivity() { } } - class LobbyAdapter(context: Context, lobbies: ArrayList): ArrayAdapter(context, 0, lobbies), View.OnClickListener { + override fun onDestroy() { + super.onDestroy() + // Remove callbacks to prevent memory leaks + handler.removeCallbacks(refreshRunnable) + } + + private val refreshRunnable: Runnable = object : Runnable { + override fun run() { + // Refresh the server list + val serverList = ControllerLobby.getLobbies() + if (serverList != null) { + lobbyAdapter.clear() + lobbyAdapter.addAll(serverList) + lobbyAdapter.notifyDataSetChanged() + } + // Schedule the next refresh + handler.postDelayed(this, refreshInterval) + } + } + + class LobbyAdapter(context: Context, lobbies: ArrayList) : + ArrayAdapter(context, 0, lobbies), View.OnClickListener { private val mContext: Context private val mLobbies: ArrayList - private var selectedItem = -1; + private var selectedItem = -1 // Get Access to Context and Data Array init { @@ -86,8 +116,6 @@ class MultiActivity : AppCompatActivity() { } override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { - //return super.getView(position, convertView, parent) - var currentLobbyView = convertView if (currentLobbyView == null) { currentLobbyView = @@ -104,30 +132,15 @@ class MultiActivity : AppCompatActivity() { idchapter.text = ControllerChapter.getChapterNameById(mLobbies[position].idchapter) difficulty.text = mLobbies[position].difficulty.toString() - - // Visual Feedback for Selection - /* - if (selectedItem == position) - currentLobbyView.setBackgroundColor(Color.rgb(255, 255, 128)) - else - currentLobbyView.setBackgroundColor(Color.rgb(255, 255, 192)) - - if (mProducts[position].prixht != null) - pxht.text = "%.2f".format(mLobbies[position].prixht.toFloat()) + "€ HT" - else - pxht.text = "Gratuit !" - */ - return currentLobbyView } - public fun setSelectedItem(position: Int) { + fun setSelectedItem(position: Int) { selectedItem = position - notifyDataSetChanged(); + notifyDataSetChanged() } - public fun getSelectedItem(): Lobby? { - + fun getSelectedItem(): Lobby? { if (selectedItem != -1) return mLobbies[selectedItem] else diff --git a/Android/app/src/main/java/com/example/mathseduc/ServerDetailsActivity.kt b/Android/app/src/main/java/com/example/mathseduc/ServerDetailsActivity.kt index fe4dfb3..71d2779 100644 --- a/Android/app/src/main/java/com/example/mathseduc/ServerDetailsActivity.kt +++ b/Android/app/src/main/java/com/example/mathseduc/ServerDetailsActivity.kt @@ -3,10 +3,13 @@ package com.example.mathseduc import android.content.Context import android.content.Intent import android.os.Bundle +import android.os.Handler +import android.os.Looper import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.ArrayAdapter +import android.widget.Button import android.widget.ListView import android.widget.TextView import androidx.activity.OnBackPressedCallback @@ -15,36 +18,36 @@ import com.example.mathseduc.controllers.ControllerLobby import com.example.mathseduc.controllers.ControllerPlayer import com.example.mathseduc.controllers.ControllerUtiliser import com.example.mathseduc.models.Player -import com.google.android.material.dialog.MaterialAlertDialogBuilder import okhttp3.MultipartBody class ServerDetailsActivity : AppCompatActivity() { private var playerList: List = emptyList() + private lateinit var playerAdapter: PlayerAdapter + private val handler = Handler(Looper.getMainLooper()) + private val refreshInterval: Long = 2000 private val onBackPressedCallback: OnBackPressedCallback = object : OnBackPressedCallback(true) { override fun handleOnBackPressed() { MyBackPressed() } } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) onBackPressedDispatcher.addCallback(this, onBackPressedCallback) - setContentView(R.layout.activity_server_details) val serverName = intent.getStringExtra("serverName") - // Now you can use the data as needed, for example, display it in a TextView val serverNameTextView = findViewById(R.id.titleServerDetails) serverNameTextView.text = serverName val lobbyId = intent.getIntExtra("lobbyId", -1) if (savedInstanceState != null) { - playerList = savedInstanceState?.getParcelableArrayList("playerList") ?: emptyList() //TODO deprecated c'est pas normal !!! + playerList = savedInstanceState?.getParcelableArrayList("playerList") ?: emptyList() } else { - // Si l'état d'instance est nul, récupérez la liste des joueurs normalement val playerId = ControllerPlayer.getPlayersIdFromLobbyId(lobbyId) if (playerId != null) { playerList = playerId.mapNotNull { playerId -> @@ -54,36 +57,86 @@ class ServerDetailsActivity : AppCompatActivity() { } val listViewPlayers = findViewById(R.id.listViewPlayers) - val playerAdapter = PlayerAdapter(this, playerList) + playerAdapter = PlayerAdapter(this, playerList) listViewPlayers.adapter = playerAdapter + + handler.postDelayed(refreshRunnable, refreshInterval) + + val btnLaunchQuiz = findViewById