Modification d'un chien fonctionnel

master
LouisPerret 3 years ago
parent 22b2ef62cf
commit b2eaa114e1

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="deploymentTargetDropDown">
<runningDeviceTargetSelectedWithDropDown>
<Target>
<type value="RUNNING_DEVICE_TARGET" />
<deviceKey>
<Key>
<type value="SERIAL_NUMBER" />
<value value="bef6b6e5" />
</Key>
</deviceKey>
</Target>
</runningDeviceTargetSelectedWithDropDown>
<timeTargetWasSelectedWithDropDown value="2022-12-30T13:52:32.533062600Z" />
</component>
</project>

@ -1,28 +1,28 @@
package fr.iut.ouaff.modele.metier package fr.iut.ouaff.modele.metier
class Chien { class Chien : java.io.Serializable{
var nom:String var nom:String
public get() = field public get() = field
private set set
var race:String var race:String
public get() = field public get() = field
private set set
var genre:Genre var genre:Genre
public get() = field public get() = field
private set set
var poids:Int var poids:Int
public get() = field public get() = field
private set(value) { set(value) {
if(value > 0) field = value if(value > 0) field = value
} }
var agressivite:Int var agressivite:Int
public get() = field public get() = field
private set(value){ set(value){
if(value >= 0 && value <= 3){ if(value >= 0 && value <= 3){
field = value field = value
} }

@ -1,6 +1,6 @@
package fr.iut.ouaff.modele.metier package fr.iut.ouaff.modele.metier
enum class Genre { enum class Genre : java.io.Serializable {
Male, Male,
Femele, Femele,
Inconnu Inconnu

@ -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)
}

@ -5,22 +5,28 @@ import android.content.Intent
import android.os.Bundle import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import fr.iut.ouaff.R import fr.iut.ouaff.R
import fr.iut.ouaff.modele.metier.Chien
import fr.iut.ouaff.modele.metier.Genre import fr.iut.ouaff.modele.metier.Genre
import fr.iut.ouaff.vues.fragment.FragmentDetail import fr.iut.ouaff.vues.fragment.FragmentDetail
class DetailActivity : AppCompatActivity(), FragmentDetail.ListenerDetail { class DetailActivity : AppCompatActivity(), FragmentDetail.ListenerDetail {
private lateinit var fragmentDetail:FragmentDetail private lateinit var fragmentDetail:FragmentDetail
private lateinit var chienSelected: Chien
private var position: Int = 0
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(R.layout.activity_detail) setContentView(R.layout.activity_detail)
chienSelected = intent?.getSerializableExtra(CHIEN) as Chien
position = intent?.getIntExtra(POSITION,0)!!
if(supportFragmentManager.findFragmentById(R.id.id_fragmentDetail) == null){ if(supportFragmentManager.findFragmentById(R.id.id_fragmentDetail) == null){
fragmentDetail = FragmentDetail(this, null) fragmentDetail = FragmentDetail(this, chienSelected, position)
supportFragmentManager.beginTransaction() supportFragmentManager.beginTransaction()
.add(R.id.id_fragmentDetail, fragmentDetail) .add(R.id.id_fragmentDetail, fragmentDetail)
.commit() .commit()
@ -29,11 +35,19 @@ class DetailActivity : AppCompatActivity(), FragmentDetail.ListenerDetail {
companion object{ companion object{
private const val NOMCHIEN:String = "nomChien" const val CHIEN = "chien"
private const val RACECHIEN:String = "raceChien" const val POSITION = "position"
private const val GENRECHIEN:String = "genreChien" const val NOMCHIEN:String = "nomChien"
private const val MESURECHIEN:String = "mesureChien" const val RACECHIEN:String = "raceChien"
private const val AGRESSIVITECHIEN:String = "agressiviteChien" 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) public fun createIntentAjoutChien(context:Context): Intent = Intent(context, DetailActivity::class.java)
@ -52,6 +66,28 @@ class DetailActivity : AppCompatActivity(), FragmentDetail.ListenerDetail {
agressivite: Int agressivite: Int
) { ) {
val data = Intent().apply { 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(NOMCHIEN, nom)
putExtra(RACECHIEN, race) putExtra(RACECHIEN, race)
putExtra(GENRECHIEN, genre) putExtra(GENRECHIEN, genre)

@ -1,31 +1,42 @@
package fr.iut.ouaff.vues package fr.iut.ouaff.vues
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle import android.os.Bundle
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.result.contract.ActivityResultContracts
import androidx.fragment.app.Fragment
import fr.iut.ouaff.R import fr.iut.ouaff.R
import fr.iut.ouaff.data.chargeur.Stub import fr.iut.ouaff.data.chargeur.Stub
import fr.iut.ouaff.modele.metier.Chien import fr.iut.ouaff.modele.metier.Chien
import fr.iut.ouaff.modele.metier.Genre 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 import fr.iut.ouaff.vues.fragment.FragmentMaster
class MainActivity : AppCompatActivity() { class MainActivity : AppCompatActivity(), DogSelectedCallback {
private var listeChiens: MutableList<Chien> = Stub().charger("") private var listeChiens: MutableList<Chien> = Stub().charger("")
private lateinit var fragment:FragmentMaster private lateinit var fragment:FragmentMaster
private var activityLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()){ result -> private var activityLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()){ result ->
if(result.resultCode == RESULT_OK){ if(result.resultCode == RESULT_OK){
result.data?.let { ajouterChien( result.data?.let {
if(it.getBooleanExtra(DetailActivity.AJOUTCHIEN, false)){
ajouterChien(
DetailActivity.getNomChien(it), DetailActivity.getNomChien(it),
DetailActivity.getRaceChien(it), DetailActivity.getRaceChien(it),
DetailActivity.getGenreChien(it) as Genre, DetailActivity.getGenreChien(it) as Genre,
DetailActivity.getMesureChien(it), DetailActivity.getMesureChien(it),
DetailActivity.getAgressiviteChien(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) setContentView(R.layout.activity_main)
if(supportFragmentManager.findFragmentById(R.id.id_fragment) == null){ if(supportFragmentManager.findFragmentById(R.id.id_fragment) == null){
fragment = FragmentMaster(listeChiens) fragment = FragmentMaster(listeChiens, this)
supportFragmentManager.beginTransaction() supportFragmentManager.beginTransaction()
.add(R.id.id_fragment, fragment) .add(R.id.id_fragment, fragment)
.commit() .commit()
@ -48,6 +59,20 @@ class MainActivity : AppCompatActivity() {
private fun ajouterChien(nom: String?, race: String?, genre: Genre, poids: Int, agressivite: Int) { 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)) 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
}
} }
} }

@ -8,11 +8,12 @@ import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.RecyclerView.ViewHolder import androidx.recyclerview.widget.RecyclerView.ViewHolder
import fr.iut.ouaff.R import fr.iut.ouaff.R
import fr.iut.ouaff.modele.metier.Chien 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 * Gère l'affichage de la liste de mes chiens -> équivalent de la ListView en javafx
*/ */
class AdapterChien(private var listeChiens:MutableList<Chien>): RecyclerView.Adapter<ViewHolder>() { class AdapterChien(private var listeChiens:MutableList<Chien>, private var listener: DogSelectedCallback): RecyclerView.Adapter<ViewHolder>() {
private lateinit var ressources: Resources; private lateinit var ressources: Resources;
@ -22,7 +23,7 @@ class AdapterChien(private var listeChiens:MutableList<Chien>): RecyclerView.Ada
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
ressources = parent.resources // pour pouvoir accéder au R. plus tard 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 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<Chien>): RecyclerView.Ada
override fun onBindViewHolder(holder: ViewHolder, position: Int) { override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val chienAAfficher = listeChiens.get(position) // on récupère le chien à afficher 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 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.bindWithDog(chienAAfficher, position)
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.cardViewChien.setOnClickListener() { } // holder.cardViewChien.setOnClickListener() { }
} }

@ -3,13 +3,20 @@ package fr.iut.ouaff.vues.adapter
import android.view.View import android.view.View
import android.widget.TextView import android.widget.TextView
import androidx.cardview.widget.CardView import androidx.cardview.widget.CardView
import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.RecyclerView.ViewHolder import androidx.recyclerview.widget.RecyclerView.ViewHolder
import fr.iut.ouaff.R 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 * 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 var textNomChien: TextView
get() = field get() = field
@ -28,5 +35,27 @@ class ViewHolderChien(itemView: View) : ViewHolder(itemView) {
textNomChien = itemView.findViewById(R.id.nomChien) textNomChien = itemView.findViewById(R.id.nomChien)
textRaceChien = itemView.findViewById(R.id.raceChien) textRaceChien = itemView.findViewById(R.id.raceChien)
cardViewChien = itemView.findViewById(R.id.cardViewChien) 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
}
)
)
} }
} }

@ -10,15 +10,14 @@ import android.widget.EditText
import android.widget.ImageButton import android.widget.ImageButton
import android.widget.RatingBar import android.widget.RatingBar
import android.widget.Spinner import android.widget.Spinner
import android.widget.Toolbar
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import fr.iut.ouaff.R import fr.iut.ouaff.R
import fr.iut.ouaff.modele.metier.Chien import fr.iut.ouaff.modele.metier.Chien
import fr.iut.ouaff.modele.metier.Genre 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 textFieldNomChien:EditText
private lateinit var textFieldRaceChien:EditText private lateinit var textFieldRaceChien:EditText
@ -30,6 +29,7 @@ class FragmentDetail(private var listener:ListenerDetail, private var chien: Chi
interface ListenerDetail{ interface ListenerDetail{
fun ajouterChien(nom: String?, race: String?, genre: Genre, poids: Int, agressivite: Int) 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( override fun onCreateView(
@ -46,14 +46,13 @@ class FragmentDetail(private var listener:ListenerDetail, private var chien: Chi
spinnerGenre = findViewById(R.id.spinnerGenre) spinnerGenre = findViewById(R.id.spinnerGenre)
textFieldMesureChien = findViewById(R.id.textFieldMesureChien) textFieldMesureChien = findViewById(R.id.textFieldMesureChien)
ratingBarAgressivite = findViewById(R.id.ratingBarAgressivite) 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) spinnerGenre.adapter = ArrayAdapter(view.context, R.layout.cellule_spinner, arrayGenre)
boutonQuitter.visibility = Button.VISIBLE
if(chien == null){ if(chien == null){
boutonAjouterChien.visibility = Button.VISIBLE boutonQuitter.setOnClickListener() { listener.ajouterChien(
boutonAjouterChien.setOnClickListener() { listener.ajouterChien(
textFieldNomChien.text.toString(), textFieldNomChien.text.toString(),
textFieldRaceChien.text.toString(), textFieldRaceChien.text.toString(),
spinnerGenre.selectedItem as Genre, spinnerGenre.selectedItem as Genre,
@ -63,6 +62,15 @@ class FragmentDetail(private var listener:ListenerDetail, private var chien: Chi
} }
else{ else{
setDataDog() 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 return view
} }
@ -71,7 +79,7 @@ class FragmentDetail(private var listener:ListenerDetail, private var chien: Chi
textFieldNomChien.setText(chien?.nom) textFieldNomChien.setText(chien?.nom)
textFieldRaceChien.setText(chien?.race) textFieldRaceChien.setText(chien?.race)
spinnerGenre.setSelection(arrayGenre.indexOf(chien?.genre)) spinnerGenre.setSelection(arrayGenre.indexOf(chien?.genre))
textFieldMesureChien.setText(chien?.poids!!) textFieldMesureChien.setText(chien?.poids.toString())
ratingBarAgressivite.rating = chien?.agressivite!!.toFloat() ratingBarAgressivite.rating = chien?.agressivite!!.toFloat()
} }
} }

@ -14,9 +14,10 @@ import androidx.recyclerview.widget.RecyclerView.SimpleOnItemTouchListener
import com.google.android.material.floatingactionbutton.FloatingActionButton import com.google.android.material.floatingactionbutton.FloatingActionButton
import fr.iut.ouaff.R import fr.iut.ouaff.R
import fr.iut.ouaff.modele.metier.Chien import fr.iut.ouaff.modele.metier.Chien
import fr.iut.ouaff.utils.DogSelectedCallback
import fr.iut.ouaff.vues.adapter.AdapterChien import fr.iut.ouaff.vues.adapter.AdapterChien
class FragmentMaster(private var listeChiens: MutableList<Chien>) : Fragment() { class FragmentMaster(private var listeChiens: MutableList<Chien>, private var listener:DogSelectedCallback) : Fragment() {
private lateinit var boutonAjouterChien: FloatingActionButton private lateinit var boutonAjouterChien: FloatingActionButton
@ -30,7 +31,7 @@ class FragmentMaster(private var listeChiens: MutableList<Chien>) : Fragment() {
val view = inflater.inflate(R.layout.fragment_master, container, false); val view = inflater.inflate(R.layout.fragment_master, container, false);
val recyclerView = view.findViewById<RecyclerView>(R.id.recyclerViewChien); val recyclerView = view.findViewById<RecyclerView>(R.id.recyclerViewChien);
recyclerView.layoutManager = GridLayoutManager(context, 2, GridLayoutManager.VERTICAL, false) recyclerView.layoutManager = GridLayoutManager(context, 2, GridLayoutManager.VERTICAL, false)
adapter = AdapterChien(listeChiens) adapter = AdapterChien(listeChiens, listener)
recyclerView.adapter = adapter recyclerView.adapter = adapter
boutonAjouterChien = view.findViewById(R.id.floatingActionButton) boutonAjouterChien = view.findViewById(R.id.floatingActionButton)
return view return view
@ -38,7 +39,7 @@ class FragmentMaster(private var listeChiens: MutableList<Chien>) : Fragment() {
public fun getBoutonAjouterChien() = boutonAjouterChien public fun getBoutonAjouterChien() = boutonAjouterChien
public fun newDogAdded(){ public fun listDogsChanged(){
adapter.notifyDataSetChanged() adapter.notifyDataSetChanged()
} }

Loading…
Cancel
Save