feat: ajout lancement du jeu quand le maitre du jeu lance la partie

androidCompose
Jeremy DUCOURTHIAL 1 year ago
parent f416910ed8
commit 0d0ab241de

@ -3,6 +3,8 @@ package com.example.mathseduc
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.util.Log import android.util.Log
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
@ -17,6 +19,10 @@ import okhttp3.MultipartBody
class MultiActivity : AppCompatActivity() { 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?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(R.layout.activity_multi) setContentView(R.layout.activity_multi)
@ -29,12 +35,11 @@ class MultiActivity : AppCompatActivity() {
val listView = findViewById<ListView>(R.id.listView) val listView = findViewById<ListView>(R.id.listView)
val adapter = LobbyAdapter(this, serverList) lobbyAdapter = LobbyAdapter(this, serverList)
listView.adapter = adapter listView.adapter = lobbyAdapter
listView.setOnItemClickListener { _, _, position, _ -> 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) val formDataBuilder = MultipartBody.Builder().setType(MultipartBody.FORM)
formDataBuilder.addFormDataPart("idplayer", MainActivity.idPlayerConnected.toString()) formDataBuilder.addFormDataPart("idplayer", MainActivity.idPlayerConnected.toString())
formDataBuilder.addFormDataPart("idlobby", serverList[position].id.toString()) formDataBuilder.addFormDataPart("idlobby", serverList[position].id.toString())
@ -47,9 +52,13 @@ class MultiActivity : AppCompatActivity() {
intent.putExtra("lobbyId", serverList[position].id) intent.putExtra("lobbyId", serverList[position].id)
startActivity(intent) startActivity(intent)
} else { } 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 { } else {
Log.e("MultiActivity", "Error fetching server list") Log.e("MultiActivity", "Error fetching server list")
} }
@ -60,12 +69,33 @@ class MultiActivity : AppCompatActivity() {
} }
} }
class LobbyAdapter(context: Context, lobbies: ArrayList<Lobby>): ArrayAdapter<Lobby>(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<Lobby>) :
ArrayAdapter<Lobby>(context, 0, lobbies), View.OnClickListener {
private val mContext: Context private val mContext: Context
private val mLobbies: ArrayList<Lobby> private val mLobbies: ArrayList<Lobby>
private var selectedItem = -1; private var selectedItem = -1
// Get Access to Context and Data Array // Get Access to Context and Data Array
init { init {
@ -86,8 +116,6 @@ class MultiActivity : AppCompatActivity() {
} }
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
//return super.getView(position, convertView, parent)
var currentLobbyView = convertView var currentLobbyView = convertView
if (currentLobbyView == null) { if (currentLobbyView == null) {
currentLobbyView = currentLobbyView =
@ -104,30 +132,15 @@ class MultiActivity : AppCompatActivity() {
idchapter.text = ControllerChapter.getChapterNameById(mLobbies[position].idchapter) idchapter.text = ControllerChapter.getChapterNameById(mLobbies[position].idchapter)
difficulty.text = mLobbies[position].difficulty.toString() 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 return currentLobbyView
} }
public fun setSelectedItem(position: Int) { fun setSelectedItem(position: Int) {
selectedItem = position selectedItem = position
notifyDataSetChanged(); notifyDataSetChanged()
} }
public fun getSelectedItem(): Lobby? { fun getSelectedItem(): Lobby? {
if (selectedItem != -1) if (selectedItem != -1)
return mLobbies[selectedItem] return mLobbies[selectedItem]
else else

@ -3,10 +3,13 @@ package com.example.mathseduc
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.ArrayAdapter import android.widget.ArrayAdapter
import android.widget.Button
import android.widget.ListView import android.widget.ListView
import android.widget.TextView import android.widget.TextView
import androidx.activity.OnBackPressedCallback 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.ControllerPlayer
import com.example.mathseduc.controllers.ControllerUtiliser import com.example.mathseduc.controllers.ControllerUtiliser
import com.example.mathseduc.models.Player import com.example.mathseduc.models.Player
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import okhttp3.MultipartBody import okhttp3.MultipartBody
class ServerDetailsActivity : AppCompatActivity() { class ServerDetailsActivity : AppCompatActivity() {
private var playerList: List<Player> = emptyList() private var playerList: List<Player> = emptyList()
private lateinit var playerAdapter: PlayerAdapter
private val handler = Handler(Looper.getMainLooper())
private val refreshInterval: Long = 2000
private val onBackPressedCallback: OnBackPressedCallback = object : OnBackPressedCallback(true) { private val onBackPressedCallback: OnBackPressedCallback = object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() { override fun handleOnBackPressed() {
MyBackPressed() MyBackPressed()
} }
} }
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
onBackPressedDispatcher.addCallback(this, onBackPressedCallback) onBackPressedDispatcher.addCallback(this, onBackPressedCallback)
setContentView(R.layout.activity_server_details) setContentView(R.layout.activity_server_details)
val serverName = intent.getStringExtra("serverName") val serverName = intent.getStringExtra("serverName")
// Now you can use the data as needed, for example, display it in a TextView
val serverNameTextView = findViewById<TextView>(R.id.titleServerDetails) val serverNameTextView = findViewById<TextView>(R.id.titleServerDetails)
serverNameTextView.text = serverName serverNameTextView.text = serverName
val lobbyId = intent.getIntExtra("lobbyId", -1) val lobbyId = intent.getIntExtra("lobbyId", -1)
if (savedInstanceState != null) { if (savedInstanceState != null) {
playerList = savedInstanceState?.getParcelableArrayList("playerList") ?: emptyList() //TODO deprecated c'est pas normal !!! playerList = savedInstanceState?.getParcelableArrayList("playerList") ?: emptyList()
} else { } else {
// Si l'état d'instance est nul, récupérez la liste des joueurs normalement
val playerId = ControllerPlayer.getPlayersIdFromLobbyId(lobbyId) val playerId = ControllerPlayer.getPlayersIdFromLobbyId(lobbyId)
if (playerId != null) { if (playerId != null) {
playerList = playerId.mapNotNull { playerId -> playerList = playerId.mapNotNull { playerId ->
@ -54,36 +57,86 @@ class ServerDetailsActivity : AppCompatActivity() {
} }
val listViewPlayers = findViewById<ListView>(R.id.listViewPlayers) val listViewPlayers = findViewById<ListView>(R.id.listViewPlayers)
val playerAdapter = PlayerAdapter(this, playerList) playerAdapter = PlayerAdapter(this, playerList)
listViewPlayers.adapter = playerAdapter listViewPlayers.adapter = playerAdapter
handler.postDelayed(refreshRunnable, refreshInterval)
val btnLaunchQuiz = findViewById<Button>(R.id.btnLaunchQuiz)
if (ControllerLobby.PlayerCreatorIdPresentInLobby(MainActivity.idPlayerConnected, lobbyId)) {
btnLaunchQuiz.visibility = View.VISIBLE
btnLaunchQuiz.setOnClickListener {
val formDataBuilder = MultipartBody.Builder().setType(MultipartBody.FORM)
formDataBuilder.addFormDataPart("launched", "1")
ControllerLobby.updateLobbyLauched(lobbyId,formDataBuilder)
val intent = Intent(this, QuizMultiActivity::class.java)
intent.putExtra("lobbyId", lobbyId)
startActivity(intent)
}
} else {
btnLaunchQuiz.visibility = View.GONE
}
} }
override fun onSaveInstanceState(outState: Bundle) { override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState) super.onSaveInstanceState(outState)
// Save the player list to the instance state
outState.putParcelableArrayList("playerList", ArrayList(playerList)) outState.putParcelableArrayList("playerList", ArrayList(playerList))
} }
private fun MyBackPressed() { private val refreshRunnable: Runnable = object : Runnable {
override fun run() {
val lobbyId = intent.getIntExtra("lobbyId", -1)
val playerId = ControllerPlayer.getPlayersIdFromLobbyId(lobbyId)
if (playerId != null) {
playerList = playerId.mapNotNull { playerId ->
ControllerPlayer.getPlayerInfoById(playerId.toString())
}
playerAdapter.clear()
playerAdapter.addAll(playerList)
playerAdapter.notifyDataSetChanged()
}
val btnLaunchQuiz = findViewById<Button>(R.id.btnLaunchQuiz)
if (ControllerLobby.PlayerCreatorIdPresentInLobby(MainActivity.idPlayerConnected, lobbyId)) {
btnLaunchQuiz.visibility = View.VISIBLE
} else {
btnLaunchQuiz.visibility = View.GONE
}
if(ControllerLobby.lobbyIsLaunched(lobbyId)){
val intent = Intent(this@ServerDetailsActivity, QuizMultiActivity::class.java)
intent.putExtra("lobbyId", lobbyId)
startActivity(intent)
return
}
handler.postDelayed(this, refreshInterval)
}
}
private fun MyBackPressed() {
val lobbyId = intent.getIntExtra("lobbyId", -1) val lobbyId = intent.getIntExtra("lobbyId", -1)
ControllerUtiliser.DeleteUtiliserForLobby(MainActivity.idPlayerConnected, lobbyId) ControllerUtiliser.DeleteUtiliserForLobby(MainActivity.idPlayerConnected, lobbyId)
if (ControllerLobby.PlayerCreatorIdPresentInLobby(MainActivity.idPlayerConnected, lobbyId)) { if (ControllerLobby.PlayerCreatorIdPresentInLobby(MainActivity.idPlayerConnected, lobbyId)) {
val idNextPlayerCreator = ControllerUtiliser.getIdNextPlayerInLobby(lobbyId) val idNextPlayerCreator = ControllerUtiliser.getIdNextPlayerInLobby(lobbyId)
if (idNextPlayerCreator == -1) { if (idNextPlayerCreator == -1) {
ControllerLobby.deleteLobby(lobbyId) ControllerLobby.deleteLobby(lobbyId)
} else { } else {
val formDataBuilder = MultipartBody.Builder().setType(MultipartBody.FORM) val formDataBuilder = MultipartBody.Builder().setType(MultipartBody.FORM)
formDataBuilder.addFormDataPart("idplayercreator", idNextPlayerCreator.toString()) formDataBuilder.addFormDataPart("idplayercreator", idNextPlayerCreator.toString())
ControllerLobby.updateLobbyIdCreatorLobby(lobbyId, formDataBuilder) ControllerLobby.updateLobbyIdCreatorLobby(lobbyId, formDataBuilder)
} }
} }
handler.removeCallbacks(refreshRunnable)
finish() finish()
} }
@ -100,8 +153,6 @@ class ServerDetailsActivity : AppCompatActivity() {
val playerNameTextView = currentPlayerView!!.findViewById<TextView>(R.id.playerName) val playerNameTextView = currentPlayerView!!.findViewById<TextView>(R.id.playerName)
playerNameTextView.text = getItem(position)?.nickname ?: "Unknown" playerNameTextView.text = getItem(position)?.nickname ?: "Unknown"
// You can customize the view further if needed
return currentPlayerView return currentPlayerView
} }
} }

@ -138,7 +138,35 @@ class ControllerLobby {
// API Access - Mise à jour du lobby // API Access - Mise à jour du lobby
val updateRequest = Request.Builder() val updateRequest = Request.Builder()
.url("https://trusting-panini.87-106-126-109.plesk.page/api/update/lobbies/idcreatorlobby/$lobbyId/qUOGkWdoPCgbmuqxIC8xiaX0rV1Pw1LoPafkaoHOgszEyD9P2vcOu493xCDZpAqO") .url("https://trusting-panini.87-106-126-109.plesk.page/api/update/lobbies/idplayercreator/$lobbyId/qUOGkWdoPCgbmuqxIC8xiaX0rV1Pw1LoPafkaoHOgszEyD9P2vcOu493xCDZpAqO")
// Ajoutez d'autres paramètres ou données pour la mise à jour si nécessaire
.post(lobbyData.build()) //TODO attention api pb
.build()
// API Response
val updateResponse: Response = client.newCall(updateRequest).execute()
// Vérifier si la mise à jour a réussi
if (!updateResponse.isSuccessful) {
Log.e("updateLobby", "Error updating lobby")
}
} catch (e: Exception) {
// Log en cas d'erreur
Log.e("updateLobby", "Error updating lobby", e)
}
}
fun updateLobbyLauched(lobbyId: Int,lobbyData: MultipartBody.Builder) {
try {
val policy = StrictMode.ThreadPolicy.Builder().permitAll().build()
StrictMode.setThreadPolicy(policy)
// Client HTTP API
val client = OkHttpClient()
// API Access - Mise à jour du lobby
val updateRequest = Request.Builder()
.url("https://trusting-panini.87-106-126-109.plesk.page/api/update/lobbies/launched/$lobbyId/qUOGkWdoPCgbmuqxIC8xiaX0rV1Pw1LoPafkaoHOgszEyD9P2vcOu493xCDZpAqO")
// Ajoutez d'autres paramètres ou données pour la mise à jour si nécessaire // Ajoutez d'autres paramètres ou données pour la mise à jour si nécessaire
.post(lobbyData.build()) //TODO attention api pb .post(lobbyData.build()) //TODO attention api pb
.build() .build()
@ -182,5 +210,32 @@ class ControllerLobby {
} }
return -1 return -1
} }
fun lobbyIsLaunched(lobbyId: Int): Boolean {
val policy = StrictMode.ThreadPolicy.Builder().permitAll().build()
StrictMode.setThreadPolicy(policy)
// Client HTTP API
val client = OkHttpClient()
// API Access
val request = Request.Builder()
.url("https://trusting-panini.87-106-126-109.plesk.page/api/lobbies/$lobbyId/qUOGkWdoPCgbmuqxIC8xiaX0rV1Pw1LoPafkaoHOgszEyD9P2vcOu493xCDZpAqO")
.build()
// API Response
client.newCall(request).execute().use { response ->
if (!response.isSuccessful) throw IOException("Unexpected code $response")
// Gson deserialization
val gson = Gson()
val typeTokenProduct = object : TypeToken<ArrayList<Lobby>>() {}.type
val lobby: ArrayList<Lobby> = gson.fromJson(response.body!!.string(), typeTokenProduct)
return lobby[0].launched == 1
}
return false
}
} }
} }

@ -7,5 +7,6 @@ data class Lobby(
val nbplayers: Int, val nbplayers: Int,
val idplayercreator: Int, val idplayercreator: Int,
val idchapter: Int, val idchapter: Int,
val difficulty: Int val difficulty: Int,
val launched: Int
) )

@ -27,5 +27,10 @@
android:layout_height="0dp" android:layout_height="0dp"
android:layout_weight="75" android:layout_weight="75"
android:background="@color/white" /> android:background="@color/white" />
<Button
android:id="@+id/btnLaunchQuiz"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout> </LinearLayout>

Loading…
Cancel
Save