diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml new file mode 100644 index 0000000..60b42b5 --- /dev/null +++ b/.idea/deploymentTargetDropDown.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/fr/iut/ouaff/modele/metier/Chien.kt b/app/src/main/java/fr/iut/ouaff/modele/metier/Chien.kt index d917abb..4e3ea51 100644 --- a/app/src/main/java/fr/iut/ouaff/modele/metier/Chien.kt +++ b/app/src/main/java/fr/iut/ouaff/modele/metier/Chien.kt @@ -1,28 +1,28 @@ package fr.iut.ouaff.modele.metier -class Chien { +class Chien : java.io.Serializable{ var nom:String public get() = field - private set + set var race:String public get() = field - private set + set var genre:Genre public get() = field - private set + set var poids:Int public get() = field - private set(value) { + set(value) { if(value > 0) field = value } var agressivite:Int public get() = field - private set(value){ + set(value){ if(value >= 0 && value <= 3){ field = value } diff --git a/app/src/main/java/fr/iut/ouaff/modele/metier/Genre.kt b/app/src/main/java/fr/iut/ouaff/modele/metier/Genre.kt index 0f9397c..3ae59cc 100644 --- a/app/src/main/java/fr/iut/ouaff/modele/metier/Genre.kt +++ b/app/src/main/java/fr/iut/ouaff/modele/metier/Genre.kt @@ -1,6 +1,6 @@ package fr.iut.ouaff.modele.metier -enum class Genre { +enum class Genre : java.io.Serializable { Male, Femele, Inconnu diff --git a/app/src/main/java/fr/iut/ouaff/utils/DogSelectedCallback.kt b/app/src/main/java/fr/iut/ouaff/utils/DogSelectedCallback.kt new file mode 100644 index 0000000..acd256b --- /dev/null +++ b/app/src/main/java/fr/iut/ouaff/utils/DogSelectedCallback.kt @@ -0,0 +1,8 @@ +package fr.iut.ouaff.utils + +import fr.iut.ouaff.modele.metier.Chien + +public interface DogSelectedCallback { + + fun dogSelectedCallback(selectedDog: Chien, position: Int) +} \ No newline at end of file diff --git a/app/src/main/java/fr/iut/ouaff/vues/DetailActivity.kt b/app/src/main/java/fr/iut/ouaff/vues/DetailActivity.kt index cafb76e..94ced75 100644 --- a/app/src/main/java/fr/iut/ouaff/vues/DetailActivity.kt +++ b/app/src/main/java/fr/iut/ouaff/vues/DetailActivity.kt @@ -5,22 +5,28 @@ import android.content.Intent import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import fr.iut.ouaff.R +import fr.iut.ouaff.modele.metier.Chien import fr.iut.ouaff.modele.metier.Genre import fr.iut.ouaff.vues.fragment.FragmentDetail - class DetailActivity : AppCompatActivity(), FragmentDetail.ListenerDetail { private lateinit var fragmentDetail:FragmentDetail + private lateinit var chienSelected: Chien + + private var position: Int = 0 + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_detail) + chienSelected = intent?.getSerializableExtra(CHIEN) as Chien + position = intent?.getIntExtra(POSITION,0)!! if(supportFragmentManager.findFragmentById(R.id.id_fragmentDetail) == null){ - fragmentDetail = FragmentDetail(this, null) + fragmentDetail = FragmentDetail(this, chienSelected, position) supportFragmentManager.beginTransaction() .add(R.id.id_fragmentDetail, fragmentDetail) .commit() @@ -29,11 +35,19 @@ class DetailActivity : AppCompatActivity(), FragmentDetail.ListenerDetail { companion object{ - private const val NOMCHIEN:String = "nomChien" - private const val RACECHIEN:String = "raceChien" - private const val GENRECHIEN:String = "genreChien" - private const val MESURECHIEN:String = "mesureChien" - private const val AGRESSIVITECHIEN:String = "agressiviteChien" + const val CHIEN = "chien" + const val POSITION = "position" + const val NOMCHIEN:String = "nomChien" + const val RACECHIEN:String = "raceChien" + const val GENRECHIEN:String = "genreChien" + const val MESURECHIEN:String = "mesureChien" + const val AGRESSIVITECHIEN:String = "agressiviteChien" + const val AJOUTCHIEN: String = "ajoutChien" + + public fun createIntent(context: Context, chien:Chien, position:Int): Intent = Intent(context, DetailActivity::class.java).apply { + putExtra(CHIEN, chien) + putExtra(POSITION, position) + } public fun createIntentAjoutChien(context:Context): Intent = Intent(context, DetailActivity::class.java) @@ -52,6 +66,28 @@ class DetailActivity : AppCompatActivity(), FragmentDetail.ListenerDetail { agressivite: Int ) { val data = Intent().apply { + putExtra(AJOUTCHIEN, true) + putExtra(NOMCHIEN, nom) + putExtra(RACECHIEN, race) + putExtra(GENRECHIEN, genre) + putExtra(MESURECHIEN, poids) + putExtra(AGRESSIVITECHIEN, agressivite) + } + + setResult(RESULT_OK, data) + finish() + } + + override fun saveDog(pos:Int, + nom: String?, + race: String?, + genre: Genre, + poids: Int, + agressivite: Int + ) { + val data = Intent().apply { + putExtra(AJOUTCHIEN, false) + putExtra(POSITION, pos) putExtra(NOMCHIEN, nom) putExtra(RACECHIEN, race) putExtra(GENRECHIEN, genre) diff --git a/app/src/main/java/fr/iut/ouaff/vues/MainActivity.kt b/app/src/main/java/fr/iut/ouaff/vues/MainActivity.kt index 62b3c04..d6d9b1f 100644 --- a/app/src/main/java/fr/iut/ouaff/vues/MainActivity.kt +++ b/app/src/main/java/fr/iut/ouaff/vues/MainActivity.kt @@ -1,31 +1,42 @@ package fr.iut.ouaff.vues -import android.content.Intent import androidx.appcompat.app.AppCompatActivity import android.os.Bundle -import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.contract.ActivityResultContracts -import androidx.fragment.app.Fragment import fr.iut.ouaff.R import fr.iut.ouaff.data.chargeur.Stub import fr.iut.ouaff.modele.metier.Chien import fr.iut.ouaff.modele.metier.Genre -import fr.iut.ouaff.vues.fragment.FragmentDetail +import fr.iut.ouaff.utils.DogSelectedCallback import fr.iut.ouaff.vues.fragment.FragmentMaster -class MainActivity : AppCompatActivity() { +class MainActivity : AppCompatActivity(), DogSelectedCallback { private var listeChiens: MutableList = Stub().charger("") private lateinit var fragment:FragmentMaster private var activityLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()){ result -> if(result.resultCode == RESULT_OK){ - result.data?.let { ajouterChien( - DetailActivity.getNomChien(it), - DetailActivity.getRaceChien(it), - DetailActivity.getGenreChien(it) as Genre, - DetailActivity.getMesureChien(it), - DetailActivity.getAgressiviteChien(it)) + result.data?.let { + if(it.getBooleanExtra(DetailActivity.AJOUTCHIEN, false)){ + ajouterChien( + DetailActivity.getNomChien(it), + DetailActivity.getRaceChien(it), + DetailActivity.getGenreChien(it) as Genre, + DetailActivity.getMesureChien(it), + DetailActivity.getAgressiviteChien(it)) + } + else{ + modifierChien( + it.getIntExtra(DetailActivity.POSITION,-1), + it.getStringExtra(DetailActivity.NOMCHIEN), + it.getStringExtra(DetailActivity.RACECHIEN), + it.getSerializableExtra(DetailActivity.GENRECHIEN) as Genre, + it.getIntExtra(DetailActivity.MESURECHIEN,0), + it.getIntExtra(DetailActivity.AGRESSIVITECHIEN,0) + ) + } } + fragment.listDogsChanged() } } @@ -34,7 +45,7 @@ class MainActivity : AppCompatActivity() { setContentView(R.layout.activity_main) if(supportFragmentManager.findFragmentById(R.id.id_fragment) == null){ - fragment = FragmentMaster(listeChiens) + fragment = FragmentMaster(listeChiens, this) supportFragmentManager.beginTransaction() .add(R.id.id_fragment, fragment) .commit() @@ -48,6 +59,20 @@ class MainActivity : AppCompatActivity() { private fun ajouterChien(nom: String?, race: String?, genre: Genre, poids: Int, agressivite: Int) { if(nom != null && race != null) listeChiens.add(Chien(nom, race, genre, poids, agressivite)) - fragment.newDogAdded() + } + + override fun dogSelectedCallback(selectedDog: Chien, position: Int) { + activityLauncher.launch(DetailActivity.createIntent(this, selectedDog, position)) + } + + private fun modifierChien(pos:Int, nom: String?, race: String?, genre: Genre, poids: Int, agressivite: Int){ + if(pos >= 0){ + val chien = listeChiens.get(pos) + chien.nom = nom!! + chien.race = race!! + chien.genre = genre + chien.poids = poids + chien.agressivite = agressivite + } } } \ No newline at end of file diff --git a/app/src/main/java/fr/iut/ouaff/vues/adapter/AdapterChien.kt b/app/src/main/java/fr/iut/ouaff/vues/adapter/AdapterChien.kt index e02855e..3143b74 100644 --- a/app/src/main/java/fr/iut/ouaff/vues/adapter/AdapterChien.kt +++ b/app/src/main/java/fr/iut/ouaff/vues/adapter/AdapterChien.kt @@ -8,11 +8,12 @@ import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView.ViewHolder import fr.iut.ouaff.R import fr.iut.ouaff.modele.metier.Chien +import fr.iut.ouaff.utils.DogSelectedCallback /** * Gère l'affichage de la liste de mes chiens -> équivalent de la ListView en javafx */ -class AdapterChien(private var listeChiens:MutableList): RecyclerView.Adapter() { +class AdapterChien(private var listeChiens:MutableList, private var listener: DogSelectedCallback): RecyclerView.Adapter() { private lateinit var ressources: Resources; @@ -22,7 +23,7 @@ class AdapterChien(private var listeChiens:MutableList): RecyclerView.Ada override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { ressources = parent.resources // pour pouvoir accéder au R. plus tard val view = LayoutInflater.from(parent.context).inflate(R.layout.cellule_chien, parent, false) // je charge la vue xml qui contiendra mon chien - return ViewHolderChien(view) // je passe cette vue à ma ViewHolderChien + return ViewHolderChien(view, listener) // je passe cette vue à ma ViewHolderChien } /** @@ -33,19 +34,7 @@ class AdapterChien(private var listeChiens:MutableList): RecyclerView.Ada override fun onBindViewHolder(holder: ViewHolder, position: Int) { val chienAAfficher = listeChiens.get(position) // on récupère le chien à afficher if(holder is ViewHolderChien){ // si ma ViewHolder est bien une instance de ViewHolderChien - /// Je set le text de mes propriétés pour afficher ce que je veux afficher - holder.textNomChien.text = chienAAfficher.nom // afficher le nom - holder.textRaceChien.text = chienAAfficher.race - - /// setter la couleur à afficher suivant son aggressivité - // when équivalent du switch case en Java ou en C# - holder.cardViewChien.setCardBackgroundColor(ContextCompat.getColor(holder.itemView.context, - when(chienAAfficher.agressivite){ - 1 -> R.color.colorNormal - 2 -> R.color.colorBad - 3 -> R.color.colorAggressive - else -> R.color.colorNice - })) + holder.bindWithDog(chienAAfficher, position) // holder.cardViewChien.setOnClickListener() { } } diff --git a/app/src/main/java/fr/iut/ouaff/vues/adapter/ViewHolderChien.kt b/app/src/main/java/fr/iut/ouaff/vues/adapter/ViewHolderChien.kt index 3f5fdfc..502ea38 100644 --- a/app/src/main/java/fr/iut/ouaff/vues/adapter/ViewHolderChien.kt +++ b/app/src/main/java/fr/iut/ouaff/vues/adapter/ViewHolderChien.kt @@ -3,13 +3,20 @@ package fr.iut.ouaff.vues.adapter import android.view.View import android.widget.TextView import androidx.cardview.widget.CardView +import androidx.core.content.ContextCompat import androidx.recyclerview.widget.RecyclerView.ViewHolder import fr.iut.ouaff.R +import fr.iut.ouaff.modele.metier.Chien +import fr.iut.ouaff.utils.DogSelectedCallback /** * Affichera un de mes chiens -> équivalent des cellules en javafx */ -class ViewHolderChien(itemView: View) : ViewHolder(itemView) { +class ViewHolderChien(itemView: View, listener: DogSelectedCallback) : ViewHolder(itemView) { + + lateinit var chien: Chien + + var posChien: Int = 0 var textNomChien: TextView get() = field @@ -28,5 +35,27 @@ class ViewHolderChien(itemView: View) : ViewHolder(itemView) { textNomChien = itemView.findViewById(R.id.nomChien) textRaceChien = itemView.findViewById(R.id.raceChien) cardViewChien = itemView.findViewById(R.id.cardViewChien) + + cardViewChien.setOnClickListener(){ chien?.let { listener.dogSelectedCallback(it, posChien)}} + } + + public fun bindWithDog(chien:Chien, pos:Int){ + this.chien = chien + this.posChien = pos + textNomChien.text = chien.nom // afficher le nom + textRaceChien.text = chien.race + + /// setter la couleur à afficher suivant son aggressivité + // when équivalent du switch case en Java ou en C# + cardViewChien.setCardBackgroundColor( + ContextCompat.getColor(itemView.context, + when(chien.agressivite){ + 1 -> R.color.colorNormal + 2 -> R.color.colorBad + 3 -> R.color.colorAggressive + else -> R.color.colorNice + } + ) + ) } } \ No newline at end of file diff --git a/app/src/main/java/fr/iut/ouaff/vues/fragment/FragmentDetail.kt b/app/src/main/java/fr/iut/ouaff/vues/fragment/FragmentDetail.kt index 0d26710..b59d362 100644 --- a/app/src/main/java/fr/iut/ouaff/vues/fragment/FragmentDetail.kt +++ b/app/src/main/java/fr/iut/ouaff/vues/fragment/FragmentDetail.kt @@ -10,15 +10,14 @@ import android.widget.EditText import android.widget.ImageButton import android.widget.RatingBar import android.widget.Spinner -import android.widget.Toolbar import androidx.fragment.app.Fragment import fr.iut.ouaff.R import fr.iut.ouaff.modele.metier.Chien import fr.iut.ouaff.modele.metier.Genre -class FragmentDetail(private var listener:ListenerDetail, private var chien: Chien?) : Fragment() { +class FragmentDetail(private var listener:ListenerDetail, private var chien: Chien?, private var position:Int) : Fragment() { - private lateinit var boutonAjouterChien:ImageButton + private lateinit var boutonQuitter:ImageButton private lateinit var textFieldNomChien:EditText private lateinit var textFieldRaceChien:EditText @@ -30,6 +29,7 @@ class FragmentDetail(private var listener:ListenerDetail, private var chien: Chi interface ListenerDetail{ fun ajouterChien(nom: String?, race: String?, genre: Genre, poids: Int, agressivite: Int) + fun saveDog(pos:Int, nom: String?, race: String?, genre: Genre, poids: Int, agressivite: Int) } override fun onCreateView( @@ -46,14 +46,13 @@ class FragmentDetail(private var listener:ListenerDetail, private var chien: Chi spinnerGenre = findViewById(R.id.spinnerGenre) textFieldMesureChien = findViewById(R.id.textFieldMesureChien) ratingBarAgressivite = findViewById(R.id.ratingBarAgressivite) - boutonAjouterChien = findViewById(R.id.bouttonAjouter) + boutonQuitter = findViewById(R.id.bouttonAjouter) } spinnerGenre.adapter = ArrayAdapter(view.context, R.layout.cellule_spinner, arrayGenre) - + boutonQuitter.visibility = Button.VISIBLE if(chien == null){ - boutonAjouterChien.visibility = Button.VISIBLE - boutonAjouterChien.setOnClickListener() { listener.ajouterChien( + boutonQuitter.setOnClickListener() { listener.ajouterChien( textFieldNomChien.text.toString(), textFieldRaceChien.text.toString(), spinnerGenre.selectedItem as Genre, @@ -63,6 +62,15 @@ class FragmentDetail(private var listener:ListenerDetail, private var chien: Chi } else{ setDataDog() + boutonQuitter.setOnClickListener() { + listener.saveDog( + position, + textFieldNomChien.text.toString(), + textFieldRaceChien.text.toString(), + spinnerGenre.selectedItem as Genre, + textFieldMesureChien.text.toString().toInt(), + ratingBarAgressivite.rating.toInt()) + } } return view } @@ -71,7 +79,7 @@ class FragmentDetail(private var listener:ListenerDetail, private var chien: Chi textFieldNomChien.setText(chien?.nom) textFieldRaceChien.setText(chien?.race) spinnerGenre.setSelection(arrayGenre.indexOf(chien?.genre)) - textFieldMesureChien.setText(chien?.poids!!) + textFieldMesureChien.setText(chien?.poids.toString()) ratingBarAgressivite.rating = chien?.agressivite!!.toFloat() } } \ No newline at end of file diff --git a/app/src/main/java/fr/iut/ouaff/vues/fragment/FragmentMaster.kt b/app/src/main/java/fr/iut/ouaff/vues/fragment/FragmentMaster.kt index ee45cb9..65503cb 100644 --- a/app/src/main/java/fr/iut/ouaff/vues/fragment/FragmentMaster.kt +++ b/app/src/main/java/fr/iut/ouaff/vues/fragment/FragmentMaster.kt @@ -14,9 +14,10 @@ import androidx.recyclerview.widget.RecyclerView.SimpleOnItemTouchListener import com.google.android.material.floatingactionbutton.FloatingActionButton import fr.iut.ouaff.R import fr.iut.ouaff.modele.metier.Chien +import fr.iut.ouaff.utils.DogSelectedCallback import fr.iut.ouaff.vues.adapter.AdapterChien -class FragmentMaster(private var listeChiens: MutableList) : Fragment() { +class FragmentMaster(private var listeChiens: MutableList, private var listener:DogSelectedCallback) : Fragment() { private lateinit var boutonAjouterChien: FloatingActionButton @@ -30,7 +31,7 @@ class FragmentMaster(private var listeChiens: MutableList) : Fragment() { val view = inflater.inflate(R.layout.fragment_master, container, false); val recyclerView = view.findViewById(R.id.recyclerViewChien); recyclerView.layoutManager = GridLayoutManager(context, 2, GridLayoutManager.VERTICAL, false) - adapter = AdapterChien(listeChiens) + adapter = AdapterChien(listeChiens, listener) recyclerView.adapter = adapter boutonAjouterChien = view.findViewById(R.id.floatingActionButton) return view @@ -38,7 +39,7 @@ class FragmentMaster(private var listeChiens: MutableList) : Fragment() { public fun getBoutonAjouterChien() = boutonAjouterChien - public fun newDogAdded(){ + public fun listDogsChanged(){ adapter.notifyDataSetChanged() }