feat : ajout page en compose ServerDetailsActivity

androidCompose
Jeremy DUCOURTHIAL 1 year ago
parent cf581393f9
commit 9924eebb8a

@ -27,8 +27,8 @@
<activity android:name=".MultiActivity" /> <activity android:name=".MultiActivity" />
<activity android:name=".ConnexionPlayerActivity" /> <activity android:name=".ConnexionPlayerActivity" />
<!--
<activity android:name=".ServerDetailsActivity" /> <activity android:name=".ServerDetailsActivity" />
<!--
<activity android:name=".CreateLobbyActivity" /> <activity android:name=".CreateLobbyActivity" />
<activity android:name=".QuizMultiActivity" /> <activity android:name=".QuizMultiActivity" />
--> -->

@ -1,5 +1,6 @@
package com.example.mathseduc package com.example.mathseduc
import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.widget.Toast import android.widget.Toast
import androidx.activity.ComponentActivity import androidx.activity.ComponentActivity
@ -10,6 +11,7 @@ import androidx.compose.foundation.layout.*
import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material3.* import androidx.compose.material3.*
import androidx.compose.runtime.* import androidx.compose.runtime.*
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
@ -36,9 +38,9 @@ class ConnexionPlayerActivity : ComponentActivity() {
@Composable @Composable
fun ConnexionPlayerContent() { fun ConnexionPlayerContent() {
var nickname by remember { mutableStateOf("") } var nickname by rememberSaveable { mutableStateOf("") }
var password by remember { mutableStateOf("") } var password by rememberSaveable { mutableStateOf("") }
var showDialog by remember { mutableStateOf(false) } var showDialog by rememberSaveable { mutableStateOf(false) }
val context = LocalContext.current val context = LocalContext.current
@ -87,6 +89,9 @@ fun ConnexionPlayerContent() {
onClick = { onClick = {
val isAuthenticated = ControllerPlayer.authenticateUser(nickname, password) val isAuthenticated = ControllerPlayer.authenticateUser(nickname, password)
if (isAuthenticated != -1) { if (isAuthenticated != -1) {
val intent = Intent(context, MainActivity::class.java)
context.startActivity(intent)
MainActivity.idPlayerConnected = isAuthenticated MainActivity.idPlayerConnected = isAuthenticated
Toast.makeText(context, "Connexion réussie, bienvenue $nickname !", Toast.LENGTH_SHORT).show() Toast.makeText(context, "Connexion réussie, bienvenue $nickname !", Toast.LENGTH_SHORT).show()
} else { } else {

@ -0,0 +1,221 @@
package com.example.mathseduc
import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.widget.Toast
import androidx.activity.ComponentActivity
import androidx.activity.OnBackPressedCallback
import androidx.activity.compose.setContent
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
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.example.mathseduc.ui.theme.Colors
import okhttp3.MultipartBody
class ServerDetailsActivity : ComponentActivity() {
private var playerList: List<Player> = emptyList()
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)
setContent {
ServerDetailPage()
}
/*
onBackPressedDispatcher.addCallback(this, onBackPressedCallback)
//setContentView(R.layout.activity_server_details)
val serverName = intent.getStringExtra("serverName")
val serverNameTextView = findViewById<TextView>(R.id.titleServerDetails)
serverNameTextView.text = serverName
val lobbyId = intent.getIntExtra("lobbyId", -1)
if (savedInstanceState != null) {
playerList = savedInstanceState?.getParcelableArrayList("playerList") ?: emptyList()
} else {
val playerId = ControllerPlayer.getPlayersIdFromLobbyId(lobbyId)
if (playerId != null) {
playerList = playerId.mapNotNull { playerId ->
ControllerPlayer.getPlayerInfoById(playerId.toString())
}
}
}
val listViewPlayers = findViewById<ListView>(R.id.listViewPlayers)
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
}
*/
}
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()
}
@Composable
fun ServerDetailPage() {
val context = LocalContext.current
val lobbyName = intent.getStringExtra("serverName")
val lobbyId = intent.getIntExtra("lobbyId",-1)
var isCreator = false
var playerListInfos: List<Player> by rememberSaveable { mutableStateOf(emptyList()) }
var playerList by rememberSaveable { mutableStateOf(ControllerPlayer.getPlayersIdFromLobbyId(lobbyId.toString()) ?: emptyList()) }
var refreshState by rememberSaveable { mutableStateOf(true) }
DisposableEffect(refreshState) {
val handler = Handler(Looper.getMainLooper())
val refreshRunnable = object : Runnable {
override fun run() {
playerList = ControllerPlayer.getPlayersIdFromLobbyId(lobbyId.toString())!!
handler.postDelayed(this, 2000)
if (playerList != null) {
playerListInfos = playerList.mapNotNull { playerId ->
ControllerPlayer.getPlayerInfoById(playerId.toString())
}
}
isCreator = ControllerLobby.playerCreatorIdPresentInLobby(MainActivity.idPlayerConnected, lobbyId!!.toInt())
if(ControllerLobby.lobbyIsLaunched(lobbyId!!.toInt())){
//val intent = Intent(this@ServerDetailsActivity, QuizMultiActivity::class.java)
//intent.putExtra("lobbyId", lobbyId)
//startActivity(intent)
Toast.makeText(context, "TOTOGOGO", Toast.LENGTH_SHORT).show()
return
}
}
}
handler.postDelayed(refreshRunnable, 2000)
onDispose {
handler.removeCallbacks(refreshRunnable)
}
}
val modifier = Modifier
.fillMaxSize()
.padding(16.dp)
Column(
modifier = modifier,
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
) {
Text(
text = lobbyName!!,
color = Color.White,
fontWeight = FontWeight.Bold
)
LazyColumn(
modifier = Modifier
.fillMaxSize()
.weight(0.75f)
) {
items(playerListInfos) { player ->
Text(
text = player.nickname,
fontSize = 18.sp,
color = Colors.White,
modifier = Modifier.weight(1f)
)
}
}
Button(
onClick = {
Toast.makeText(context, "TOTOGOGOCREATOR", Toast.LENGTH_SHORT).show()
},
shape = RoundedCornerShape(15),
colors = ButtonDefaults.buttonColors(Colors.Green),
modifier = Modifier
.fillMaxWidth()
.height(48.dp)
) {
Text(
text = "LAUNCH",
color = Color.White,
fontWeight = FontWeight.Bold
)
}
}
}
}

@ -13,7 +13,7 @@ import java.io.IOException
class ControllerPlayer { class ControllerPlayer {
companion object { companion object {
fun getPlayersIdFromLobbyId(lobbyId: Int): List<Int>? { fun getPlayersIdFromLobbyId(lobbyId: String?): List<Int>? {
val policy = StrictMode.ThreadPolicy.Builder().permitAll().build() val policy = StrictMode.ThreadPolicy.Builder().permitAll().build()
StrictMode.setThreadPolicy(policy) StrictMode.setThreadPolicy(policy)

@ -1,5 +1,8 @@
package com.example.mathseduc.models package com.example.mathseduc.models
import android.os.Parcel
import android.os.Parcelable
data class Lobby( data class Lobby(
val id: Int, val id: Int,
val name: String, val name: String,
@ -9,4 +12,40 @@ data class Lobby(
val idchapter: Int, val idchapter: Int,
val difficulty: Int, val difficulty: Int,
val launched: Int val launched: Int
) : Parcelable {
constructor(parcel: Parcel) : this(
parcel.readInt(),
parcel.readString() ?: "",
parcel.readString() ?: "",
parcel.readInt(),
parcel.readInt(),
parcel.readInt(),
parcel.readInt(),
parcel.readInt()
) )
override fun writeToParcel(parcel: Parcel, flags: Int) {
parcel.writeInt(id)
parcel.writeString(name)
parcel.writeString(password)
parcel.writeInt(nbplayers)
parcel.writeInt(idplayercreator)
parcel.writeInt(idchapter)
parcel.writeInt(difficulty)
parcel.writeInt(launched)
}
override fun describeContents(): Int {
return 0
}
companion object CREATOR : Parcelable.Creator<Lobby> {
override fun createFromParcel(parcel: Parcel): Lobby {
return Lobby(parcel)
}
override fun newArray(size: Int): Array<Lobby?> {
return arrayOfNulls(size)
}
}
}

@ -7,30 +7,4 @@ data class Player(
val id: Int, val id: Int,
val nickname: String, val nickname: String,
val password: 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)
}
}
}

@ -2,6 +2,8 @@ package com.example.mathseduc.ui
import android.content.Intent import android.content.Intent
import android.os.Handler import android.os.Handler
import android.os.Looper import android.os.Looper
import android.util.Log
import android.widget.Toast
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.clickable import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
@ -24,7 +26,7 @@ import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
@ -32,21 +34,23 @@ import androidx.compose.ui.draw.clip
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import com.example.mathseduc.CreateLobbyActivity
import com.example.mathseduc.MainActivity import com.example.mathseduc.MainActivity
import com.example.mathseduc.ServerDetailsActivity
import com.example.mathseduc.controllers.ControllerChapter import com.example.mathseduc.controllers.ControllerChapter
import com.example.mathseduc.controllers.ControllerLobby import com.example.mathseduc.controllers.ControllerLobby
import com.example.mathseduc.controllers.ControllerUtiliser
import com.example.mathseduc.models.Lobby import com.example.mathseduc.models.Lobby
import com.example.mathseduc.ui.theme.Colors import com.example.mathseduc.ui.theme.Colors
import okhttp3.MultipartBody
@Composable @Composable
fun MultiPage() { fun MultiPage() {
val context = LocalContext.current val context = LocalContext.current
var selectedItem by remember { mutableStateOf<Lobby?>(null) } var selectedItem by rememberSaveable { mutableStateOf<Lobby?>(null) }
var lobbyList by remember { mutableStateOf(ControllerLobby.getLobbies() ?: emptyList()) } var lobbyList by rememberSaveable { mutableStateOf(ControllerLobby.getLobbies() ?: emptyList()) }
var refreshState by remember { mutableStateOf(true) } var refreshState by rememberSaveable { mutableStateOf(true) }
DisposableEffect(refreshState) { DisposableEffect(refreshState) {
val handler = Handler(Looper.getMainLooper()) val handler = Handler(Looper.getMainLooper())
@ -58,7 +62,7 @@ fun MultiPage() {
} }
} }
handler.postDelayed(refreshRunnable, 3000) handler.post(refreshRunnable)
onDispose { onDispose {
handler.removeCallbacks(refreshRunnable) handler.removeCallbacks(refreshRunnable)
@ -127,6 +131,22 @@ fun MultiPage() {
items(lobbyList ?: emptyList()) { lobby -> items(lobbyList ?: emptyList()) { lobby ->
LobbyItem(lobby, selectedItem == lobby) { LobbyItem(lobby, selectedItem == lobby) {
selectedItem = it selectedItem = it
if (ControllerLobby.getNbPlayerInLobby(selectedItem!!.id) < selectedItem!!.nbplayers){
val formDataBuilder = MultipartBody.Builder().setType(MultipartBody.FORM)
formDataBuilder.addFormDataPart("idplayer", MainActivity.idPlayerConnected.toString())
formDataBuilder.addFormDataPart("idlobby", selectedItem!!.id.toString())
formDataBuilder.addFormDataPart("playertime", "0")
ControllerUtiliser.createUtiliserByIdLobby(formDataBuilder)
val intent = Intent(context, ServerDetailsActivity::class.java)
intent.putExtra("serverName", selectedItem!!.name)
intent.putExtra("lobbyId", selectedItem!!.id)
context.startActivity(intent)
} else {
Toast.makeText(context, "Oh nan, le serveur est déjà plein ! Réessayer plus tard.", Toast.LENGTH_SHORT).show()
}
} }
} }
} }

Loading…
Cancel
Save