diff --git a/Android/app/build.gradle b/Android/app/build.gradle index 8968c27..fa8ec02 100644 --- a/Android/app/build.gradle +++ b/Android/app/build.gradle @@ -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' 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 3d68480..e114a92 100644 --- a/Android/app/src/main/java/com/example/mathseduc/MultiActivity.kt +++ b/Android/app/src/main/java/com/example/mathseduc/MultiActivity.kt @@ -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,17 +33,22 @@ class MultiActivity : AppCompatActivity() { listView.adapter = adapter listView.setOnItemClickListener { _, _, position, _ -> - val formDataBuilder = MultipartBody.Builder().setType(MultipartBody.FORM) - formDataBuilder.addFormDataPart("idplayer", MainActivity.idPlayerConnected.toString()) - formDataBuilder.addFormDataPart("idlobby", serverList[position].id.toString()) - formDataBuilder.addFormDataPart("playertime", "0") - ControllerUtiliser.createUtiliserByIdLobby(formDataBuilder) - - val intent = Intent(this, ServerDetailsActivity::class.java) - intent.putExtra("serverName", serverList[position].name) - intent.putExtra("lobbyId", serverList[position].id) - startActivity(intent) + 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()) + formDataBuilder.addFormDataPart("playertime", "0") + + ControllerUtiliser.createUtiliserByIdLobby(formDataBuilder) + + val intent = Intent(this, ServerDetailsActivity::class.java) + 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(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) 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 a42b135..fe4dfb3 100644 --- a/Android/app/src/main/java/com/example/mathseduc/ServerDetailsActivity.kt +++ b/Android/app/src/main/java/com/example/mathseduc/ServerDetailsActivity.kt @@ -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 = 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,38 +40,51 @@ 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 -> - ControllerPlayer.getPlayerInfoById(playerId.toString()) + + 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(R.id.listViewPlayers) - val playerAdapter = PlayerAdapter(this, playerList) - listViewPlayers.adapter = playerAdapter } + + val listViewPlayers = findViewById(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) - 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) - if (idNextPlayerCreator == -1){ + if (idNextPlayerCreator == -1) { ControllerLobby.deleteLobby(lobbyId) } else { val formDataBuilder = MultipartBody.Builder().setType(MultipartBody.FORM) formDataBuilder.addFormDataPart("idplayercreator", idNextPlayerCreator.toString()) - ControllerLobby.updateLobbyIdCreatorLobby(lobbyId,formDataBuilder) + ControllerLobby.updateLobbyIdCreatorLobby(lobbyId, formDataBuilder) } } + finish() } class PlayerAdapter(context: Context, players: List) : diff --git a/Android/app/src/main/java/com/example/mathseduc/controllers/ControllerChapter.kt b/Android/app/src/main/java/com/example/mathseduc/controllers/ControllerChapter.kt index 00e2d99..38e8bb5 100644 --- a/Android/app/src/main/java/com/example/mathseduc/controllers/ControllerChapter.kt +++ b/Android/app/src/main/java/com/example/mathseduc/controllers/ControllerChapter.kt @@ -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>() {}.type + + // Parse API response and return the list of chapters + val chapter: ArrayList = gson.fromJson(response.body!!.string(), typeTokenProduct) + return chapter[0].name + } + + return null + } } } \ No newline at end of file diff --git a/Android/app/src/main/java/com/example/mathseduc/controllers/ControllerLobby.kt b/Android/app/src/main/java/com/example/mathseduc/controllers/ControllerLobby.kt index 06093ea..da8d5a2 100644 --- a/Android/app/src/main/java/com/example/mathseduc/controllers/ControllerLobby.kt +++ b/Android/app/src/main/java/com/example/mathseduc/controllers/ControllerLobby.kt @@ -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>() {}.type + + val utiliser: ArrayList = gson.fromJson(response.body!!.string(), typeTokenProduct) + return utiliser.size + } + return -1 + } } } \ No newline at end of file diff --git a/Android/app/src/main/java/com/example/mathseduc/models/Player.kt b/Android/app/src/main/java/com/example/mathseduc/models/Player.kt index e4d2eff..b094e32 100644 --- a/Android/app/src/main/java/com/example/mathseduc/models/Player.kt +++ b/Android/app/src/main/java/com/example/mathseduc/models/Player.kt @@ -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 -) \ No newline at end of file +) : 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 { + override fun createFromParcel(parcel: Parcel): Player { + return Player(parcel) + } + + override fun newArray(size: Int): Array { + return arrayOfNulls(size) + } + } +} \ No newline at end of file diff --git a/Android/app/src/main/res/layout/list_view_lobby.xml b/Android/app/src/main/res/layout/list_view_lobby.xml index b1338ee..c795019 100644 --- a/Android/app/src/main/res/layout/list_view_lobby.xml +++ b/Android/app/src/main/res/layout/list_view_lobby.xml @@ -18,34 +18,34 @@ android:layout_weight="0.4" android:gravity="left|center_vertical" android:text="Name" - android:textSize="16dp" /> + android:textSize="18dp" /> + android:textSize="14dp" + android:text="Difficulty"/> + android:textSize="14dp" + android:text="idChapter"/> + android:textSize="14dp" + android:text="NbPlayers"/>