diff --git a/app/build.gradle b/app/build.gradle index 177b301..865d94f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -47,6 +47,7 @@ apply plugin: 'kotlin-kapt' dependencies { + implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.3.0") implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.9' implementation 'androidx.fragment:fragment-ktx:1.3.0' implementation 'androidx.core:core-ktx:1.7.0' diff --git a/app/src/main/java/iut/android/pierrepierre/model/Activity/MenuActivity.kt b/app/src/main/java/iut/android/pierrepierre/model/Activity/MenuActivity.kt index a4eb21a..901a173 100644 --- a/app/src/main/java/iut/android/pierrepierre/model/Activity/MenuActivity.kt +++ b/app/src/main/java/iut/android/pierrepierre/model/Activity/MenuActivity.kt @@ -1,5 +1,6 @@ package iut.android.pierrepierre.model.Activity - +import kotlinx.serialization.encodeToString +import kotlinx.serialization.json.Json import android.content.Context import android.os.Bundle import androidx.appcompat.app.AppCompatActivity @@ -7,11 +8,13 @@ import iut.android.pierrepierre.R import android.content.Intent import android.view.View import android.widget.Button +import androidx.lifecycle.ViewModelProvider import androidx.room.Room import iut.android.pierrepierre.model.Class.User import iut.android.pierrepierre.model.DB.DAO.UserDAO import iut.android.pierrepierre.model.DB.Entity.UserEntity import iut.android.pierrepierre.model.DB.RoomDB +import iut.android.pierrepierre.model.Viewmodel.UserViewModel import java.util.* class MenuActivity : AppCompatActivity() { @@ -23,6 +26,10 @@ class MenuActivity : AppCompatActivity() { super.onCreate(savedInstanceState) setContentView(R.layout.activity_menu) + + val viewModel = ViewModelProvider(this).get(UserViewModel::class.java) + + //BDD // Initialisation BDD db = Room.databaseBuilder(applicationContext, RoomDB::class.java, "MyDataBase").build() @@ -34,17 +41,20 @@ class MenuActivity : AppCompatActivity() { // Charger le score de l'utilisateur s'il existe val userE = userDao.getUserById(uniqueID) if (userE != null) { - val userScore = userE.score + //val userScore = userE.score user = userE.toUser() + viewModel.setUser(user) } } fun onClickJouer(view: View) { val intent = Intent(this, MoleGridActivity::class.java) + intent.putExtra("user_id", user.id) startActivity(intent) } + fun onClickScores(view: View) { //TODO Ajouter l'action correspondant à Scores //FIXME tmp @@ -72,11 +82,11 @@ class MenuActivity : AppCompatActivity() { /// Convertisseur // UserEntity en User fun UserEntity.toUser(): User { - return User(score = this.score, nbMiss = this.nbMiss) + return User( id=this.id ,score = this.score, nbMiss = this.nbMiss) } // User en UserEntity fun User.toUserEntity(): UserEntity { - return UserEntity(score = this.score, nbMiss = this.nbMiss) + return UserEntity( id=this.id, score = this.score, nbMiss = this.nbMiss) } } \ No newline at end of file diff --git a/app/src/main/java/iut/android/pierrepierre/model/Activity/MoleGridActivity.kt b/app/src/main/java/iut/android/pierrepierre/model/Activity/MoleGridActivity.kt index 26e7f54..a320e51 100644 --- a/app/src/main/java/iut/android/pierrepierre/model/Activity/MoleGridActivity.kt +++ b/app/src/main/java/iut/android/pierrepierre/model/Activity/MoleGridActivity.kt @@ -1,26 +1,25 @@ package iut.android.pierrepierre.model.Activity import android.content.Context -import android.content.DialogInterface import android.hardware.Sensor import android.hardware.SensorEvent import android.hardware.SensorEventListener import android.hardware.SensorManager import android.os.Bundle import android.os.CountDownTimer -import android.util.Log import android.widget.ProgressBar import android.widget.TextView -import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity -import androidx.fragment.app.commit +import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.RecyclerView -import iut.android.pierrepierre.model.Class.Mole -import iut.android.pierrepierre.model.Adapter.MyGridAdapter import iut.android.pierrepierre.R +import iut.android.pierrepierre.model.Adapter.MyGridAdapter +import iut.android.pierrepierre.model.Class.Mole import iut.android.pierrepierre.model.Class.User +import iut.android.pierrepierre.model.DB.Entity.UserEntity +import iut.android.pierrepierre.model.Viewmodel.UserViewModel import iut.android.pierrepierre.model.fragments.MenuFragment import kotlinx.coroutines.* import kotlin.random.Random @@ -35,8 +34,12 @@ class MoleGridActivity : AppCompatActivity() { private lateinit var progressBar: ProgressBar + //VM + private lateinit var viewModel: UserViewModel + + //User - private var user : User = User() + private lateinit var user : User private lateinit var scoreDisplay : TextView //sensor @@ -57,6 +60,22 @@ class MoleGridActivity : AppCompatActivity() { progressBar = findViewById(R.id.progressBar) scoreDisplay = findViewById(R.id.score_display) DisplaycountDownTimer = findViewById(R.id.CountDown) + + val userId = intent.getStringExtra("user_id") + val viewModelProvider = ViewModelProvider(this@MoleGridActivity) + viewModel = viewModelProvider[UserViewModel::class.java] + val userE = viewModel.getUserById(userId!!) //FIXME dangereux + + if(userE != null){ + this.user = userE.toUser() + } + else{ + System.out.println("User is null") + throw Exception("User is null") + } + + //user = (intent.getSerializableExtra("KEY_NAME") as User?)!! + } @@ -112,7 +131,7 @@ class MoleGridActivity : AppCompatActivity() { override fun onFinish() { //FIXME Mettre fin a la partie, rendre tout les objets immuables (le fragment cache juste..) //mettre la fin de parti ici => appel de l'interface de fin - val menuFragment = MenuFragment(user.score) + val menuFragment = MenuFragment(user) val fragmentManager = supportFragmentManager val fragmentTransaction = fragmentManager.beginTransaction() fragmentTransaction.replace(android.R.id.content, menuFragment) @@ -187,4 +206,8 @@ class MoleGridActivity : AppCompatActivity() { } } } + + fun UserEntity.toUser(): User { + return User( id=this.id ,score = this.score, nbMiss = this.nbMiss) + } } diff --git a/app/src/main/java/iut/android/pierrepierre/model/Class/User.kt b/app/src/main/java/iut/android/pierrepierre/model/Class/User.kt index 83a5a32..602121b 100644 --- a/app/src/main/java/iut/android/pierrepierre/model/Class/User.kt +++ b/app/src/main/java/iut/android/pierrepierre/model/Class/User.kt @@ -1,4 +1,12 @@ package iut.android.pierrepierre.model.Class -class User (var score: Int = 0, var nbMiss : Int = 0){ +import iut.android.pierrepierre.model.DB.Entity.UserEntity +import java.io.Serializable + + +class User (var id : String, var score: Int = 0, var nbMiss : Int = 0) : Serializable { + // User en UserEntity + fun User.toUserEntity(): UserEntity { + return UserEntity( id=this.id, score = this.score, nbMiss = this.nbMiss) + } } \ No newline at end of file diff --git a/app/src/main/java/iut/android/pierrepierre/model/DB/DAO/UserDAO.kt b/app/src/main/java/iut/android/pierrepierre/model/DB/DAO/UserDAO.kt index 9a31881..57420b5 100644 --- a/app/src/main/java/iut/android/pierrepierre/model/DB/DAO/UserDAO.kt +++ b/app/src/main/java/iut/android/pierrepierre/model/DB/DAO/UserDAO.kt @@ -1,19 +1,18 @@ package iut.android.pierrepierre.model.DB.DAO -import androidx.room.Dao -import androidx.room.Delete -import androidx.room.Insert -import androidx.room.Query +import androidx.room.* import iut.android.pierrepierre.model.DB.Entity.UserEntity @Dao interface UserDAO { @Insert - fun insererUser(u : UserEntity) + fun insertUser(user: UserEntity): Long @Delete - fun DeleteUser(u : UserEntity) + fun updateUser(user: UserEntity) + @Query("UPDATE user SET score = :newScore WHERE id = :userId") + fun updateUserScore(userId: String, newScore: Int) @Query("SELECT * FROM user WHERE user.id = :id") fun getUserById(id: String): UserEntity? diff --git a/app/src/main/java/iut/android/pierrepierre/model/DB/RoomDB.kt b/app/src/main/java/iut/android/pierrepierre/model/DB/RoomDB.kt index c2ffdf1..38d292e 100644 --- a/app/src/main/java/iut/android/pierrepierre/model/DB/RoomDB.kt +++ b/app/src/main/java/iut/android/pierrepierre/model/DB/RoomDB.kt @@ -15,8 +15,8 @@ abstract class RoomDB : RoomDatabase() { companion object { private var INSTANCE: RoomDB? = null - fun getDatabase(context: Context) { - INSTANCE ?: synchronized(this) { + fun getInstance(context: Context): RoomDB { + return INSTANCE ?: synchronized(this) { val instance = Room.databaseBuilder( context.applicationContext, RoomDB::class.java, diff --git a/app/src/main/java/iut/android/pierrepierre/model/Viewmodel/UserViewModel.kt b/app/src/main/java/iut/android/pierrepierre/model/Viewmodel/UserViewModel.kt new file mode 100644 index 0000000..8c01ac7 --- /dev/null +++ b/app/src/main/java/iut/android/pierrepierre/model/Viewmodel/UserViewModel.kt @@ -0,0 +1,33 @@ +package iut.android.pierrepierre.model.Viewmodel + +import androidx.lifecycle.ViewModel +import iut.android.pierrepierre.model.Class.User +import iut.android.pierrepierre.model.DB.DAO.UserDAO +import iut.android.pierrepierre.model.DB.Entity.UserEntity + +class UserViewModel(private val userDao: UserDAO) : ViewModel() { + + private var user = User("0") + + fun getUser(): User { + return user + } + + fun setUser(user : User) { + this.user = user + } + + fun updateUserScore(score: Int) { + user.score = score + } + + fun getUserById(id: String): UserEntity? { + return userDao.getUserById(id) + } + + // UserEntity en User + fun UserEntity.toUser(): User { + return User( id=this.id ,score = this.score, nbMiss = this.nbMiss) + } + +} diff --git a/app/src/main/java/iut/android/pierrepierre/model/fragments/MenuFragment.kt b/app/src/main/java/iut/android/pierrepierre/model/fragments/MenuFragment.kt index a166a90..f04e553 100644 --- a/app/src/main/java/iut/android/pierrepierre/model/fragments/MenuFragment.kt +++ b/app/src/main/java/iut/android/pierrepierre/model/fragments/MenuFragment.kt @@ -10,17 +10,25 @@ import android.widget.TextView import androidx.fragment.app.Fragment import iut.android.pierrepierre.R import iut.android.pierrepierre.model.Activity.MenuActivity +import iut.android.pierrepierre.model.Class.User +import iut.android.pierrepierre.model.DB.DAO.UserDAO +import iut.android.pierrepierre.model.DB.RoomDB -class MenuFragment(val UserScore : Int) : Fragment() { +class MenuFragment(var user : User) : Fragment() { - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? - ): View? { + private lateinit var userDao: UserDAO + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { // Inflate the layout for this fragment val view = inflater.inflate(R.layout.game_over, container, false) val score = view.findViewById(R.id.userScore) - score.text= "Votre score : $UserScore" + + + val database = RoomDB.getInstance(requireContext()) + userDao = database.userDao() + userDao.updateUserScore(user.id, user.score) + + score.text= "Votre score : "+ user.score val closeButton = view.findViewById