feat: mise en place des sécurités pour que ServerDetailsActivity.kt ne casse plus lors d'un changement d'état
continuous-integration/drone/push Build is passing Details

androidCompose
Jeremy DUCOURTHIAL 1 year ago
parent 6a640e0df8
commit affd7b1d87

@ -34,7 +34,6 @@ android {
}
dependencies {
implementation 'androidx.core:core-ktx:1.7.0'
implementation 'androidx.appcompat:appcompat:1.6.1'
implementation 'com.google.android.material:material:1.11.0'

@ -7,11 +7,9 @@ import android.util.Log
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 android.widget.*
import androidx.appcompat.app.AppCompatActivity
import com.example.mathseduc.controllers.ControllerChapter
import com.example.mathseduc.controllers.ControllerLobby
import com.example.mathseduc.controllers.ControllerUtiliser
import com.example.mathseduc.models.Lobby
@ -35,6 +33,8 @@ class MultiActivity : AppCompatActivity() {
listView.adapter = adapter
listView.setOnItemClickListener { _, _, position, _ ->
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())
@ -46,6 +46,9 @@ class MultiActivity : AppCompatActivity() {
intent.putExtra("serverName", serverList[position].name)
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()
}
}
} else {
Log.e("MultiActivity", "Error fetching server list")
@ -97,10 +100,11 @@ class MultiActivity : AppCompatActivity() {
val difficulty = currentLobbyView!!.findViewById<TextView>(R.id.difficulty)
name.text = mLobbies[position].name
nbplayers.text = mLobbies[position].nbplayers.toString()
idchapter.text = mLobbies[position].idchapter.toString()
nbplayers.text = ControllerLobby.getNbPlayerInLobby(mLobbies[position].id).toString() + "/" + mLobbies[position].nbplayers.toString()
idchapter.text = ControllerChapter.getChapterNameById(mLobbies[position].idchapter)
difficulty.text = mLobbies[position].difficulty.toString()
// Visual Feedback for Selection
/*
if (selectedItem == position)

@ -1,6 +1,7 @@
package com.example.mathseduc
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
@ -8,16 +9,28 @@ import android.view.ViewGroup
import android.widget.ArrayAdapter
import android.widget.ListView
import android.widget.TextView
import androidx.activity.OnBackPressedCallback
import androidx.appcompat.app.AppCompatActivity
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 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")
@ -27,19 +40,31 @@ class ServerDetailsActivity : AppCompatActivity() {
serverNameTextView.text = serverName
val lobbyId = intent.getIntExtra("lobbyId", -1)
val playerIds = ControllerPlayer.getPlayersIdFromLobbyId(lobbyId)
if (playerIds != null) {
val playerList = playerIds.mapNotNull { playerId ->
if (savedInstanceState != null) {
playerList = savedInstanceState?.getParcelableArrayList("playerList") ?: emptyList() //TODO deprecated c'est pas normal !!!
} 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 ->
ControllerPlayer.getPlayerInfoById(playerId.toString())
}
}
}
val listViewPlayers = findViewById<ListView>(R.id.listViewPlayers)
val playerAdapter = PlayerAdapter(this, playerList)
listViewPlayers.adapter = playerAdapter
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
// Save the player list to the instance state
outState.putParcelableArrayList("playerList", ArrayList(playerList))
}
override fun onStop() {
super.onStop()
private fun MyBackPressed() {
val lobbyId = intent.getIntExtra("lobbyId", -1)
@ -59,6 +84,7 @@ class ServerDetailsActivity : AppCompatActivity() {
ControllerLobby.updateLobbyIdCreatorLobby(lobbyId, formDataBuilder)
}
}
finish()
}
class PlayerAdapter(context: Context, players: List<Player>) :

@ -39,5 +39,34 @@ class ControllerChapter {
return null
}
fun getChapterNameById(idchapter : Int): String? {
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/chapters/$idchapter/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<Chapter>>() {}.type
// Parse API response and return the list of chapters
val chapter: ArrayList<Chapter> = gson.fromJson(response.body!!.string(), typeTokenProduct)
return chapter[0].name
}
return null
}
}
}

@ -3,6 +3,7 @@ package com.example.mathseduc.controllers
import android.os.StrictMode
import android.util.Log
import com.example.mathseduc.models.Lobby
import com.example.mathseduc.models.Utiliser
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import okhttp3.MultipartBody
@ -154,5 +155,32 @@ class ControllerLobby {
Log.e("updateLobby", "Error updating lobby", e)
}
}
fun getNbPlayerInLobby(lobbyId: Int): Int {
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/utiliser/$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<Utiliser>>() {}.type
val utiliser: ArrayList<Utiliser> = gson.fromJson(response.body!!.string(), typeTokenProduct)
return utiliser.size
}
return -1
}
}
}

@ -1,7 +1,36 @@
package com.example.mathseduc.models
import android.os.Parcel
import android.os.Parcelable
data class Player(
val id: Int,
val nickname: String,
val password: String
) : Parcelable {
constructor(parcel: Parcel) : this(
parcel.readInt(),
parcel.readString() ?: "",
parcel.readString() ?: ""
)
override fun writeToParcel(parcel: Parcel, flags: Int) {
parcel.writeInt(id)
parcel.writeString(nickname)
parcel.writeString(password)
}
override fun describeContents(): Int {
return 0
}
companion object CREATOR : Parcelable.Creator<Player> {
override fun createFromParcel(parcel: Parcel): Player {
return Player(parcel)
}
override fun newArray(size: Int): Array<Player?> {
return arrayOfNulls(size)
}
}
}

@ -18,34 +18,34 @@
android:layout_weight="0.4"
android:gravity="left|center_vertical"
android:text="Name"
android:textSize="16dp" />
android:textSize="18dp" />
<TextView
android:id="@+id/nbplayers"
android:id="@+id/difficulty"
android:layout_width="0dp"
android:layout_weight="0.2"
android:layout_height="match_parent"
android:gravity="center"
android:textSize="10dp"
android:text="NbPlayers"/>
android:textSize="14dp"
android:text="Difficulty"/>
<TextView
android:id="@+id/difficulty"
android:id="@+id/idchapter"
android:layout_width="0dp"
android:layout_weight="0.2"
android:layout_height="match_parent"
android:gravity="center"
android:textSize="10dp"
android:text="Difficulty"/>
android:textSize="14dp"
android:text="idChapter"/>
<TextView
android:id="@+id/idchapter"
android:id="@+id/nbplayers"
android:layout_width="0dp"
android:layout_weight="0.2"
android:layout_height="match_parent"
android:gravity="center"
android:textSize="10dp"
android:text="idChapter"/>
android:textSize="14dp"
android:text="NbPlayers"/>
</LinearLayout>

Loading…
Cancel
Save