diff --git a/app/src/main/java/com/example/outilcuisson/AfficherFragment.java b/app/src/main/java/com/example/outilcuisson/AfficherFragment.java index b45faf3..782a12f 100644 --- a/app/src/main/java/com/example/outilcuisson/AfficherFragment.java +++ b/app/src/main/java/com/example/outilcuisson/AfficherFragment.java @@ -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 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); } diff --git a/app/src/main/java/com/example/outilcuisson/AjouterFragment.java b/app/src/main/java/com/example/outilcuisson/AjouterFragment.java index ff602c2..743b398 100644 --- a/app/src/main/java/com/example/outilcuisson/AjouterFragment.java +++ b/app/src/main/java/com/example/outilcuisson/AjouterFragment.java @@ -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) { - } - } diff --git a/app/src/main/java/com/example/outilcuisson/Cuisson.java b/app/src/main/java/com/example/outilcuisson/Cuisson.java new file mode 100644 index 0000000..ef99ba1 --- /dev/null +++ b/app/src/main/java/com/example/outilcuisson/Cuisson.java @@ -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; + } +} diff --git a/app/src/main/java/com/example/outilcuisson/OutilCuisson.java b/app/src/main/java/com/example/outilcuisson/OutilCuisson.java index cd74f52..9fc5f41 100644 --- a/app/src/main/java/com/example/outilcuisson/OutilCuisson.java +++ b/app/src/main/java/com/example/outilcuisson/OutilCuisson.java @@ -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(); diff --git a/app/src/main/res/layout/ajouter_fragment.xml b/app/src/main/res/layout/ajouter_fragment.xml index 90b301a..89dbf31 100644 --- a/app/src/main/res/layout/ajouter_fragment.xml +++ b/app/src/main/res/layout/ajouter_fragment.xml @@ -1,76 +1,76 @@ + android:layout_width="match_parent" + android:layout_height="match_parent" + android:stretchColumns="1"> + 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="wrap_content" + android:layout_height="wrap_content" + android:text="@string/label_plat" /> + 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" /> + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@string/label_duree" /> + android:id="@+id/input_duree" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:timePickerMode="spinner" /> + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@string/label_temperature" /> + android:id="@+id/input_temperature" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_column="3" + android:inputType="number"/>