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.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<ListView>(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<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 mLobbies: ArrayList<Lobby>
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

@ -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<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) {
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<TextView>(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<ListView>(R.id.listViewPlayers)
val playerAdapter = PlayerAdapter(this, playerList)
playerAdapter = PlayerAdapter(this, playerList)
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) {
super.onSaveInstanceState(outState)
// Save the player list to the instance state
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)
ControllerUtiliser.DeleteUtiliserForLobby(MainActivity.idPlayerConnected, lobbyId)
if (ControllerLobby.PlayerCreatorIdPresentInLobby(MainActivity.idPlayerConnected, lobbyId)) {
val idNextPlayerCreator = ControllerUtiliser.getIdNextPlayerInLobby(lobbyId)
if (idNextPlayerCreator == -1) {
ControllerLobby.deleteLobby(lobbyId)
} else {
val formDataBuilder = MultipartBody.Builder().setType(MultipartBody.FORM)
formDataBuilder.addFormDataPart("idplayercreator", idNextPlayerCreator.toString())
ControllerLobby.updateLobbyIdCreatorLobby(lobbyId, formDataBuilder)
}
}
handler.removeCallbacks(refreshRunnable)
finish()
}
@ -100,9 +153,7 @@ class ServerDetailsActivity : AppCompatActivity() {
val playerNameTextView = currentPlayerView!!.findViewById<TextView>(R.id.playerName)
playerNameTextView.text = getItem(position)?.nickname ?: "Unknown"
// You can customize the view further if needed
return currentPlayerView
}
}
}
}

@ -138,7 +138,35 @@ class ControllerLobby {
// API Access - Mise à jour du lobby
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
.post(lobbyData.build()) //TODO attention api pb
.build()
@ -182,5 +210,32 @@ class ControllerLobby {
}
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 idplayercreator: Int,
val idchapter: Int,
val difficulty: Int
val difficulty: Int,
val launched: Int
)

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

Loading…
Cancel
Save