Ajout Cuisson, action Annuler, Valider

Ajout de la classe Cuisson (Sérialisable)

// Classe AjouterFragment
- Definition des valeurs par défaut du time picker
- Ajout des actions Annuler et Valider (avec des tests qui creer un nouvel objet qui est stocké dans la liste de AfficherFragment)

// Classe Afficher Fragment
Ajout d'une arraylist qui contiens les cuissons
Ajout de deux fonctions pour charger et sauvegarder les cuissons dans un fichier (ne fonctionne pas encore, a faire)
This commit is contained in:
LucasV-IUT
2022-02-21 21:22:20 +01:00
parent ecec0b5a88
commit 1325df8817
5 changed files with 292 additions and 143 deletions
@@ -13,9 +13,67 @@ import android.view.ViewGroup;
import androidx.fragment.app.Fragment;
import java.util.ArrayList;
public class AfficherFragment extends Fragment {
public AfficherFragment() {}
/**
* Liste des cuissons enregistré dans l'application
*/
public static ArrayList<Cuisson> listeCuisson = new ArrayList<>();
/**
* Ajouter une cuisson
*
* @param cuisson La cuisson à ajouter
*/
public static void addCuisson(Cuisson cuisson) {
listeCuisson.add(cuisson);
updateSaveFile();
}
/**
* Met a jour le fichier dataCuisson.txt qui sauvegarde la liste des cuissons
*/
private static void updateSaveFile() {
// TODO Il faut creer un fichier cuisson.txt si il n'existe pas
// try {
// FileOutputStream fos = new FileOutputStream("dataCuisson.txt", false);
// ObjectOutputStream oos = new ObjectOutputStream(fos);
// oos.writeObject(listeCuisson);
// oos.close();
// fos.close();
// } catch (IOException ioe) {
// ioe.printStackTrace();
// }
}
/**
* Charge la liste des cuissons contenue dans le fichier dataCuisson.txt
*/
private static void loadSaveFile() {
// TODO à décommenter lorsque updateSaveFile() sera terminé
// try {
// FileInputStream fis = new FileInputStream("dataCuisson.txt");
// ObjectInputStream ois = new ObjectInputStream(fis);
//
// listeCuisson = (ArrayList) ois.readObject();
//
// ois.close();
// fis.close();
// } catch (FileNotFoundException ignored) {
// } catch (IOException ioe) {
// ioe.printStackTrace();
// } catch (ClassNotFoundException c) {
// System.out.println("Class not found");
// c.printStackTrace();
// }
}
public AfficherFragment() {
}
public static AfficherFragment newInstance() {
return new AfficherFragment();
@@ -29,6 +87,7 @@ public class AfficherFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
loadSaveFile();
return inflater.inflate(R.layout.afficher_fragment, container, false);
}
@@ -10,16 +10,21 @@ import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TimePicker;
import androidx.fragment.app.Fragment;
import com.exercice.onglet.outilcuisson2021.OutilCuisson;
public class AjouterFragment extends Fragment {
EditText inputPlat;
TimePicker inputDuree;
EditText inputTemperature;
Button btnEffacer;
Button btnValider;
public AjouterFragment() {
}
@@ -38,16 +43,57 @@ public class AjouterFragment extends Fragment {
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.ajouter_fragment, container, false);
/* Liste des éléments intéractifs */
inputPlat = view.findViewById(R.id.input_plat);
inputDuree = view.findViewById(R.id.input_duree);
inputTemperature = view.findViewById(R.id.input_temperature);
btnEffacer = view.findViewById(R.id.btn_effacer);
btnValider = view.findViewById(R.id.btn_valider);
/* Initialise le TimePicker en format 24h avec par défaut la valeur 0h40 */
inputDuree.setIs24HourView(true);
inputDuree.setHour(0);
inputDuree.setMinute(40);
/*
* Action de création de la nouvelle cuisson
*/
btnValider.setOnClickListener(view1 -> {
/* Récupère toutes les valeurs des champs */
String txtPlat = inputPlat.getText().toString();
String txtTemperature = inputTemperature.getText().toString();
int hDuree = inputDuree.getHour();
int mDuree = inputDuree.getMinute();
/* Convertis la température en entier */
int temperature = txtTemperature.isEmpty() ? -1 : Integer.parseInt(txtTemperature);
/* Cas ou les valeurs ne sont pas valides */
if (!OutilCuisson.platValide(txtPlat)
|| !OutilCuisson.heureCuissonValide(hDuree)
|| !OutilCuisson.minuteCuissonValide(mDuree)
|| !OutilCuisson.temperatureValide(temperature)) {
System.out.println("Erreur");
}
/* Cas ou les valeurs sont valides : on ajoute une nouvelle cuisson dans la liste a afficher */
AfficherFragment.addCuisson(new Cuisson(txtPlat, hDuree, mDuree, temperature));
});
/*
* Efface le contenu des champs de textes et met le TimePicker à 0h40
*/
btnEffacer.setOnClickListener(view2 -> {
inputPlat.setText("");
inputDuree.setHour(0);
inputDuree.setMinute(40);
inputTemperature.setText("");
});
return view;
}
public void actionBtnEffacer(View view) {
}
public void actionBtnAjouter(View view) {
}
}
@@ -0,0 +1,34 @@
package com.example.outilcuisson;
import java.io.Serializable;
public class Cuisson implements Serializable {
private String plat;
private int heure;
private int minute;
private int degree;
public Cuisson(String plat, int heure, int minute, int degree) {
this.plat = plat;
this.heure = heure;
this.minute = minute;
this.degree = degree;
}
public String getPlat() {
return plat;
}
public int getHeure() {
return heure;
}
public int getMinute() {
return minute;
}
public int getDegree() {
return degree;
}
}
@@ -9,7 +9,7 @@
/*
* Classe avec des méthodes outils pour gérer une chaîne de caractères contenant
* Classe avec des méthodes outils pour gérer une chaîne de caractères contenant
* les caractéristiques d'une cuisson au four
* OutilCuisson.java 12/21
*/
@@ -24,19 +24,18 @@ package com.exercice.onglet.outilcuisson2021;
* Cette classe est une classe utilitaire qui contient des méthodes outils pour gérer
* une chaîne de caractères contenant le descriptif d'une cuisson au four.
* Les caractéristiques d'une cuisson sont :
* - le nom du plat (une chaîne non vide)
* - les heures de la durée de la cuisson (un entier entre 0 et 9)
* - les minutes de la durée de la cuisson (un entier entre O et 50)
* - une température (un entier strictement positif et inférieur à TEMPERATURE_MAX)
*
*
* @author INFO2 Semestre 4
* - le nom du plat (une chaîne non vide)
* - les heures de la durée de la cuisson (un entier entre 0 et 9)
* - les minutes de la durée de la cuisson (un entier entre O et 50)
* - une température (un entier strictement positif et inférieur à TEMPERATURE_MAX)
*
* @author INFO2 Semestre 4
*/
public class OutilCuisson {
/** Valeur de la chaîne qui représente une cuisson si l'une des caractéristiques
* de la cuisson est invalide
/**
* Valeur de la chaîne qui représente une cuisson si l'une des caractéristiques
* de la cuisson est invalide
*/
private static final String CHAINE_DEFAUT = "Information incohérente";
@@ -46,83 +45,90 @@ public class OutilCuisson {
public static final int TEMPERATURE_MAX = 300;
/** Valeur maximale pour le nombre d'heures d'une cuisson */
/**
* Valeur maximale pour le nombre d'heures d'une cuisson
*/
public static final int HEURE_MAX = 9;
/**
* Nombre maximum de caractères pour le nom du plat
*/
private static final int LG_MAX_PLAT = 18;
/**
* Détermine si un nom de plat est valide (non vide, au plus 20 caractères et ne
* contient pas le caractère '|')
* @param nomPlat chaîne à testesr
* @return un booléen égal à vrai ssi la chaîne à tester est valide
*
* @param nomPlat chaîne à testesr
* @return un booléen égal à vrai ssi la chaîne à tester est valide
*/
public static boolean platValide(String nomPlat) {
return nomPlat.length() > 0 && nomPlat.length() <= LG_MAX_PLAT
&& ! nomPlat.contains("|");
}
/**
* Détermine si le nombre d'heures d'une durée de cuisson est valide
* (comprise entre 0 et 9)
* @param heureCuisson heure à tester
* @return un booléen égal à vrai ssi l'heure de la durée est valide
*/
public static boolean heureCuissonValide(int heureCuisson) {
return heureCuisson >= 0 && heureCuisson <= HEURE_MAX;
}
/**
* Détermine si le nombre de minutes d'une durée de cuisson est valide
* (comprise entre 0 et 59)
* @param minuteCuisson minute à tester
* @return un booléen égal à vrai ssi le nombre de minutes de la durée est valide
*/
public static boolean minuteCuissonValide(int minuteCuisson) {
return minuteCuisson >= 0 && minuteCuisson <= 59;
}
/**
* Détermine si une température de cuisson est valide
* (strictement positive et inférieure ou égale à TEMPERATURE_MAX)
* @param temperature temperature à tester
* @return un booléen égal à vrai ssi la température est valide
*/
public static boolean temperatureValide(int temperature) {
return temperature > 0 && temperature <= TEMPERATURE_MAX;
&& !nomPlat.contains("|");
}
/**
* Détermine si le nombre d'heures d'une durée de cuisson est valide
* (comprise entre 0 et 9)
*
* @param heureCuisson heure à tester
* @return un booléen égal à vrai ssi l'heure de la durée est valide
*/
public static boolean heureCuissonValide(int heureCuisson) {
return 0 <= heureCuisson && heureCuisson <= HEURE_MAX;
}
/**
* Détermine si le nombre de minutes d'une durée de cuisson est valide
* (comprise entre 0 et 59)
*
* @param minuteCuisson minute à tester
* @return un booléen égal à vrai ssi le nombre de minutes de la durée est valide
*/
public static boolean minuteCuissonValide(int minuteCuisson) {
return 0 <= minuteCuisson && minuteCuisson <= 59;
}
/**
* Détermine si une température de cuisson est valide
* (strictement positive et inférieure ou égale à TEMPERATURE_MAX)
*
* @param temperature temperature à tester
* @return un booléen égal à vrai ssi la température est valide
*/
public static boolean temperatureValide(int temperature) {
return 0 < temperature && temperature <= TEMPERATURE_MAX;
}
/**
* Concatène les arguments dans une chaîne de caractères. Celle-ci aura le format
* suivant :
* nom du plat | temps de cuisson en heures et minutes | température
* suivant :
* nom du plat | temps de cuisson en heures et minutes | température
* Si l'un des arguments est invalide, c'est la constante CHAINE_DEFAUT qui
* est renvoyée
* @param nomPlat nom du plat. Doit être non vide, avec au plus
* LG_MAX_PLAT caractères, ne doit pas contenir |
* @param heureCuisson nombre d'heures de la durée de la cuisson
* doit être compris entre 0 et 9
* @param minuteCuisson nombre de minutes de la durée de la cuisson
* doit être compris entre 0 et 59
* @param temperature température de la cuisson. Doit être comprise entre
* 1 et TEMPERATURE_MAX
*
* @param nomPlat nom du plat. Doit être non vide, avec au plus
* LG_MAX_PLAT caractères, ne doit pas contenir |
* @param heureCuisson nombre d'heures de la durée de la cuisson
* doit être compris entre 0 et 9
* @param minuteCuisson nombre de minutes de la durée de la cuisson
* doit être compris entre 0 et 59
* @param temperature température de la cuisson. Doit être comprise entre
* 1 et TEMPERATURE_MAX
* @return une chaîne contenant le descriptif de la cuisson si les paramètres
* sont valides. Sinon la chaîne CHAINE_DEFAUT
* sont valides. Sinon la chaîne CHAINE_DEFAUT
*/
public static String transformeEnChaine(String nomPlat, int heureCuisson,
int minuteCuisson, int temperature) {
StringBuilder aRenvoyer = new StringBuilder();
if (platValide(nomPlat) && heureCuissonValide(heureCuisson)
&& minuteCuissonValide(minuteCuisson) && temperatureValide(temperature)) {
if (platValide(nomPlat) && heureCuissonValide(heureCuisson)
&& minuteCuissonValide(minuteCuisson) && temperatureValide(temperature)) {
// on insère le nom du plat
aRenvoyer.append(nomPlat);
@@ -141,21 +147,22 @@ public class OutilCuisson {
// on insère la température
aRenvoyer.append(String.format("%3d", temperature));
} else {
// l'un des arguments est invalide
aRenvoyer.append(CHAINE_DEFAUT);
}
}
return aRenvoyer.toString();
}
/**
* Extrait d'une chaîne le nom du plat. On suppose que la chaîne est correctement
* formatée dans le format de la description d'une cuisson gérée par cette classe
* (les 20 premiers caractères de la chaîne sont extraits)
* @param source chaîne source de l'extraction
* @return une chaîne contenant le nom du plat ou CHAINE_DEFAUT si la chaîne
* argument est trop courte
*
* @param source chaîne source de l'extraction
* @return une chaîne contenant le nom du plat ou CHAINE_DEFAUT si la chaîne
* argument est trop courte
*/
public static String extrairePlat(String source) {
if (source.length() < LG_MAX_PLAT) {
@@ -164,42 +171,44 @@ public class OutilCuisson {
return source.substring(0, LG_MAX_PLAT);
}
}
/**
* Extrait d'une chaîne la température de cuisson. On suppose que la chaîne
* est correctement formatée dans le format de la description d'une cuisson
* Extrait d'une chaîne la température de cuisson. On suppose que la chaîne
* est correctement formatée dans le format de la description d'une cuisson
* gérée par cette classe (la température est présente sur les 3 derniers
* caractères de la chaîne)
* @param source chaîne source de l'extraction
* @return un entier égal à la température extraite ou bien -1 si un
* problème inattendu a été rencontré avec le format de la chaîne
*
* @param source chaîne source de l'extraction
* @return un entier égal à la température extraite ou bien -1 si un
* problème inattendu a été rencontré avec le format de la chaîne
*/
public static int extraireTemperature(String source) {
int temperature; // température extraite
String chaineTemperature; // température extraite en tant que chaîne
try {
chaineTemperature = source.substring(source.length() - 3, source.length());
temperature = Integer.parseInt(chaineTemperature);
} catch(NumberFormatException | IndexOutOfBoundsException erreur) {
} catch (NumberFormatException | IndexOutOfBoundsException erreur) {
/*
* erreur lors de l'extraction des 3 derniers caractère
* erreur lors de l'extraction des 3 derniers caractère
* ou lors de la transformation en entier
*/
temperature = -1;
}
}
return temperature;
}
/**
* Renvoie le thermostat correspondant à la temperature arguemnt
* (celle-ci doit être inférieure à TEMPERATURE_MAX)
* @param temperature température à convertir
* @return l'entier égal au thermostat ou -1 si la température est invalide
*
* @param temperature température à convertir
* @return l'entier égal au thermostat ou -1 si la température est invalide
*/
public static int thermostat(int temperature) {
int aRenvoyer; // valeur du thermostat à renvoyer
@@ -213,13 +222,14 @@ public class OutilCuisson {
}
return aRenvoyer;
}
/**
* Renvoie une chaîne constituée d'espaces. Le nombre d'espaces est indiqué
* par le paramètre.
* @param nbEspace nombre d'espaces à placer dans la chaîne
* @return une chaîne constituée du caractère espace
*
* @param nbEspace nombre d'espaces à placer dans la chaîne
* @return une chaîne constituée du caractère espace
*/
private static String chaineEspace(int nbEspace) {
StringBuilder aRenvoyer = new StringBuilder();
+43 -43
View File
@@ -1,76 +1,76 @@
<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:stretchColumns="1">
android:layout_width="match_parent"
android:layout_height="match_parent"
android:stretchColumns="1">
<!-- Titre -->
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:text="@string/ajouter_titre"/>
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:text="@string/ajouter_titre" />
<TableRow> <!-- Plat -->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/label_plat" />
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/label_plat" />
<EditText
android:id="@+id/input_plat"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="text"
android:maxLines="1"
android:maxLength="20"
android:layout_span="2"/>
android:id="@+id/input_plat"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_span="2"
android:inputType="text"
android:maxLength="20"
android:maxLines="1" />
</TableRow>
<!-- Durée de cuisson -->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/label_duree" />
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/label_duree" />
<TimePicker
android:id="@+id/input_duree"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:timePickerMode="spinner" />
android:id="@+id/input_duree"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:timePickerMode="spinner" />
<TableRow> <!-- Température -->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/label_temperature" />
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/label_temperature" />
<EditText
android:id="@+id/input_temperature"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_column="3"
android:inputType="number" />
android:id="@+id/input_temperature"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_column="3"
android:inputType="number"/>
</TableRow>
<TableRow> <!-- Buttons -->
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/btn_effacer"
android:layout_column="2"
android:onClick="actionBtnEffacer"
style="?android:attr/buttonBarButtonStyle" />
android:id="@+id/btn_effacer"
style="?android:attr/buttonBarButtonStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_column="2"
android:text="@string/btn_effacer"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/btn_valider"
android:onClick="actionBtnAjouter" />
android:id="@+id/btn_valider"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/btn_valider" />
</TableRow>