Charger/Sauvegarder les cuissons

Besoin de refactor le code

Co-Authored-By: Alexandre3417 <81689383+Alexandre3417@users.noreply.github.com>
Co-Authored-By: NonoL3Robot <75622909+NonoL3Robot@users.noreply.github.com>
This commit is contained in:
LucasV-IUT
2022-03-16 19:58:29 +01:00
parent dc21653533
commit cd01ed7320
5 changed files with 501 additions and 481 deletions
@@ -24,13 +24,6 @@ import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
import com.google.android.material.navigation.NavigationView;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
public class AfficherFragment extends Fragment {
@@ -38,7 +31,7 @@ public class AfficherFragment extends Fragment {
/**
* TODO
*/
public ListView listeCuissons;
public ListView listView;
/**
* TODO
@@ -46,14 +39,7 @@ public class AfficherFragment extends Fragment {
public static ArrayAdapter<String> adapterCuissons;
/**
* Liste des cuissons enregistrées dans l'application
*/
public static ArrayList<String> cuissonAffichees;
public AfficherFragment() {
}
public AfficherFragment() {}
public static AfficherFragment newInstance() {
return new AfficherFragment();
@@ -70,25 +56,35 @@ public class AfficherFragment extends Fragment {
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.afficher_fragment, container,
false);
cuissonAffichees = new ArrayList<>();
listeCuissons = view.findViewById(R.id.listeCuisson);
listView = view.findViewById(R.id.listeCuisson);
adapterCuissons = new ArrayAdapter<>(getActivity(),
R.layout.ligne_liste, R.id.item_cuisson, cuissonAffichees);
listeCuissons.setAdapter(adapterCuissons);
registerForContextMenu(listeCuissons);
R.layout.ligne_liste, R.id.item_cuisson, new ArrayList<>());
listView.setAdapter(adapterCuissons);
registerForContextMenu(listView);
return view;
}
/**
* Ajouter une cuisson
*
* @param cuisson La cuisson à ajouter
*/
public void addCuisson(Cuisson cuisson) {
@Override
public void onResume() {
super.onResume();
afficherCuisson();
}
public void afficherCuisson() {
adapterCuissons.clear();
/* Ajoute l'objet cuisson */
ArrayList<Cuisson> listeCuisson = ((MainActivity)getActivity()).getListeCuisson();
/* On affiche toutes les cuissons de la liste dans la view */
for (Cuisson cuisson : listeCuisson) {
adapterCuissons.add(cuisson.toString());
}
/* Met à jour la liste */
adapterCuissons.notifyDataSetChanged();
listeCuissons.requestLayout();
listView.requestLayout();
}
/**
@@ -112,30 +108,30 @@ public class AfficherFragment extends Fragment {
AdapterView.AdapterContextMenuInfo information
= (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
int index = information.position;
switch (item.getItemId()) {
case R.id.thermosContext:
afficherThermos(cuissonAffichees.get(information.position));
afficherThermos(index);
break;
case R.id.modifierContext:
// modifierCuisson();
((MainActivity) getActivity()).editerCuisson(index);
break;
case R.id.supprContext:
cuissonAffichees.remove(information.position);
adapterCuissons.notifyDataSetChanged();
listeCuissons.requestLayout();
break;
case R.id.cancelContext:
supprimerCuisson(index);
break;
}
return super.onContextItemSelected(item);
}
public void afficherThermos(String cuisson) {
public void afficherThermos(int index) {
/* Recupère l'objet cuisson */
Cuisson cuisson = ((MainActivity) getActivity()).getListeCuisson().get(index);
String content = getString(R.string.alert_content_thermos,
Cuisson.extrairePlat(cuisson),
Cuisson.extraireTemperature(cuisson),
Cuisson.thermostat(Cuisson.extraireTemperature(cuisson)));
cuisson.getPlat(),
cuisson.getDegree(),
cuisson.getThermostat());
new AlertDialog.Builder(getContext()).setTitle(R.string.alert_title_thermos)
.setMessage(content)
.setNeutralButton(
@@ -144,13 +140,12 @@ public class AfficherFragment extends Fragment {
.show();
}
public void modifierCuisson() {
// ((MainActivity)getActivity()).changeFragment(1);
Fragment fragment = new AjouterFragment();
FragmentManager fragmentManager = fragment.getChildFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.ajouter_fragment, fragment, fragment.toString());
fragmentTransaction.addToBackStack(fragment.toString());
fragmentTransaction.commit();
/**
* Supprime l'objet correspondant cuisson
* @param index
*/
public void supprimerCuisson(int index) {
((MainActivity) getActivity()).getListeCuisson().remove(index);
afficherCuisson();
}
}
@@ -20,9 +20,6 @@ import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import com.example.outilcuisson.OutilCuisson;
import com.example.outilcuisson.Cuisson;
public class AjouterFragment extends Fragment {
EditText inputPlat;
@@ -31,24 +28,15 @@ public class AjouterFragment extends Fragment {
Button btnEffacer;
Button btnValider;
public AjouterFragment() {
}
public AjouterFragment() {}
public static AjouterFragment newInstance() {
return new AjouterFragment();
}
public interface EcouteurAjout {
void recevoirCuisson(Cuisson cuisson);
}
private EcouteurAjout activiteQuiMEcoute;
@Override
public void onAttach(@NonNull Context context) {
super.onAttach(context);
activiteQuiMEcoute = (EcouteurAjout) context;
}
@Override
@@ -60,8 +48,8 @@ public class AjouterFragment extends Fragment {
public View onCreateView(LayoutInflater inflater,
ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.ajouter_fragment, container,
false);
View view = inflater.inflate(R.layout.ajouter_fragment, container,false);
/* Liste des éléments intéractifs */
inputPlat = view.findViewById(R.id.input_plat);
@@ -70,16 +58,43 @@ public class AjouterFragment extends Fragment {
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 */
/* Initialise le TimePicker en format 24h et met les champs par défaut */
inputDuree.setIs24HourView(true);
inputDuree.setHour(0);
inputDuree.setMinute(40);
champsDefaut();
/*
* Action de création de la nouvelle cuisson
*/
btnValider.setOnClickListener(view1 -> {
/* Actions des buttons */
btnValider.setOnClickListener(this::actionBtnValider);
btnEffacer.setOnClickListener(this::actionBtnEffacer);
return view;
}
@Override
public void onResume() {
super.onResume();
/* Si on est en mode edition, on préremplis le champs */
if ( ((MainActivity)getActivity()).modeEdition) {
Cuisson cuisson = ((MainActivity)getActivity()).cuissonAEditer;
System.out.println(cuisson);
/* On remplis les champs */
inputPlat.setText(cuisson.getPlat());
inputDuree.setHour(cuisson.getHeure());
inputDuree.setMinute(cuisson.getMinute());
inputTemperature.setText(Integer.toString(cuisson.getDegree()));
}
}
@Override
public void onPause() {
super.onPause();
((MainActivity)getActivity()).modeEdition = false;
champsDefaut();
}
private void actionBtnValider(View view) {
/* Récupère toutes les valeurs des champs */
String txtPlat = inputPlat.getText().toString();
String txtTemperature = inputTemperature.getText().toString();
@@ -87,54 +102,62 @@ public class AjouterFragment extends Fragment {
int mDuree = inputDuree.getMinute();
/* Convertis la température en entier */
int temperature = txtTemperature.isEmpty() ? -1 : Integer.parseInt(
txtTemperature);
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 */
if (((MainActivity)getActivity()).modeEdition) {
Cuisson cuisson = ((MainActivity)getActivity()).cuissonAEditer;
try {
Cuisson cuisson = new Cuisson(txtPlat, hDuree, mDuree,
temperature);
activiteQuiMEcoute.recevoirCuisson(cuisson);
viderChamps();
String content = getString(R.string.toast_ajout_ok,
cuisson.getPlat());
Toast.makeText(getContext(), content, Toast.LENGTH_SHORT)
.show();
} catch (Exception e) {
new AlertDialog.Builder(getContext()).setTitle(
R.string.alert_title_error)
.setMessage(
R.string.alert_content_error)
.setNeutralButton(
R.string.alert_neutral_button,
null)
cuisson.editCuisson(txtPlat, hDuree, mDuree, temperature);
((MainActivity)getActivity()).changeFragment(0);
} catch (IllegalArgumentException e) {
/* Crée un boite de dialogue qui informe que les valeurs sont incorrectes */
new AlertDialog
.Builder(getContext())
.setTitle(R.string.alert_title_error)
.setMessage(R.string.alert_content_error)
.setNeutralButton(R.string.alert_neutral_button,null)
.show();
e.printStackTrace();
}
});
} else {
/* On essaye de créer une nouvelle cuisson */
try {
Cuisson cuisson = new Cuisson(txtPlat, hDuree, mDuree, temperature);
/*
* Efface le contenu des champs de textes et met le TimePicker à 0h40
*/
btnEffacer.setOnClickListener(view2 -> {
viderChamps();
});
/* On ajoute la cuisson a la liste des cuisson */
((MainActivity) getActivity()).addCuisson(cuisson);
return view;
champsDefaut();
/* Message d'ajout */
String content = getString(R.string.toast_ajout_ok,
cuisson.getPlat());
Toast.makeText(getContext(), content, Toast.LENGTH_SHORT).show();
} catch (IllegalArgumentException e) {
/* Crée un boite de dialogue qui informe que les valeurs sont incorrectes */
new AlertDialog
.Builder(getContext())
.setTitle(R.string.alert_title_error)
.setMessage(R.string.alert_content_error)
.setNeutralButton(R.string.alert_neutral_button,null)
.show();
e.printStackTrace();
}
}
}
private void viderChamps() {
/**
* Efface le contenu des champs de textes et met le TimePicker à 0h40
* @param view non utilisé
*/
private void actionBtnEffacer(View view) {
((MainActivity)getActivity()).modeEdition = false;
champsDefaut();
}
private void champsDefaut() {
inputPlat.setText("");
inputDuree.setHour(0);
inputDuree.setMinute(40);
@@ -24,18 +24,25 @@ public class Cuisson implements Serializable {
/**
* Nombre maximum de caractères pour le nom du plat
*/
private static final int LG_MAX_PLAT = 18;
private static final int LG_MAX_PLAT = 20;
/**
* Le nom du plat
*/
private String plat;
/**
* La durée en heure de la cuisson du plat
*/
private int heure;
private int minute;
private int degree;
public Cuisson(String plat, int heure, int minute, int degree) throws
Exception {
if (!platValide(plat) || !heureCuissonValide(heure)
|| !minuteCuissonValide(minute) || !temperatureValide(degree)) {
throw new Exception(CHAINE_DEFAUT);
public Cuisson(String plat, int heure, int minute, int degree) {
if (!platValide(plat)
|| !horaireValide(heure, minute)
|| !temperatureValide(degree)) {
throw new IllegalArgumentException(CHAINE_DEFAUT);
}
this.plat = plat;
this.heure = heure;
@@ -56,6 +63,12 @@ public class Cuisson implements Serializable {
&& !nomPlat.contains("|");
}
public static boolean horaireValide(int heure, int minute) {
return !(heure == 0 && minute == 0)
&& heureCuissonValide(heure)
&& minuteCuissonValide(minute);
}
/**
* Détermine si le nombre d'heures d'une durée de cuisson est valide
* (comprise entre 0 et 9)
@@ -63,7 +76,7 @@ public class Cuisson implements Serializable {
* @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) {
private static boolean heureCuissonValide(int heureCuisson) {
return 0 <= heureCuisson && heureCuisson <= HEURE_MAX;
}
@@ -75,7 +88,7 @@ public class Cuisson implements Serializable {
* @return un booléen égal à vrai ssi le nombre de minutes de la durée
* est valide
*/
public static boolean minuteCuissonValide(int minuteCuisson) {
private static boolean minuteCuissonValide(int minuteCuisson) {
return 0 <= minuteCuisson && minuteCuisson <= 59;
}
@@ -90,6 +103,9 @@ public class Cuisson implements Serializable {
return 0 < temperature && temperature <= TEMPERATURE_MAX;
}
/**
* @return
*/
public String getPlat() {
return plat;
}
@@ -106,11 +122,20 @@ public class Cuisson implements Serializable {
return degree;
}
public void editCuisson(String plat, int heure, int minute, int degree) {
if (!platValide(plat) || !horaireValide(heure, minute) || !temperatureValide(degree))
throw new IllegalArgumentException();
this.plat = plat;
this.heure = heure;
this.minute = minute;
this.degree = degree;
}
@Override
public String toString() {
StringBuilder aRenvoyer = new StringBuilder();
// on insère le nom du plat
aRenvoyer.append(plat);
aRenvoyer.append(chaineEspace(LG_MAX_PLAT - plat.length()));
@@ -161,8 +186,7 @@ public class Cuisson implements Serializable {
*/
public static int extraireTemperature(String source) {
int temperature; // température extraite
String
chaineTemperature; // température extraite en tant que chaîne
String chaineTemperature; // température extraite en tant que chaîne
try {
@@ -184,20 +208,17 @@ public class Cuisson implements Serializable {
* Renvoie le thermostat correspondant à la temperature argument
* (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
*/
public static int thermostat(int temperature) {
int aRenvoyer; // valeur du thermostat à renvoyer
if (temperature <= 0 || temperature > TEMPERATURE_MAX) {
aRenvoyer = -1;
} else {
aRenvoyer = temperature / 30;
if (temperature % 30 > 15) {
aRenvoyer++;
public int getThermostat() {
int thermostat = -1;
if (temperatureValide(degree)) {
thermostat = degree / 30;
if (degree % 30 > 15) thermostat++;
}
}
return aRenvoyer;
return thermostat;
}
/**
@@ -209,9 +230,7 @@ public class Cuisson implements Serializable {
*/
private static String chaineEspace(int nbEspace) {
StringBuilder aRenvoyer = new StringBuilder();
for (int i = 1; i <= nbEspace; i++) {
aRenvoyer.append(" ");
}
for (int i = 1; i <= nbEspace; i++) aRenvoyer.append(" ");
return aRenvoyer.toString();
}
}
@@ -1,60 +1,43 @@
package com.example.outilcuisson;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.FragmentManager;
import androidx.viewpager2.widget.ViewPager2;
import com.google.android.material.tabs.TabLayout;
import com.google.android.material.tabs.TabLayoutMediator;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStreamWriter;
import java.nio.charset.StandardCharsets;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
public class MainActivity extends AppCompatActivity implements AjouterFragment.EcouteurAjout {
public class MainActivity extends AppCompatActivity {
/**
* Le nom du fichier de sauvegarde
*/
private static final String NOM_FICHIER = "cuisson.txt";
/**
* Tag utilisé dans les messages de log. Les messages de log sont
* affichés en cas
* de problème lors de l'accès au fichier
*/
private static final String TAG = "Cuisson";
private ArrayList<Cuisson> listeCuisson;
private ViewPager2 gestionnairePagination;
public boolean modeEdition = false;
public Cuisson cuissonAEditer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -73,68 +56,83 @@ public class MainActivity extends AppCompatActivity implements AjouterFragment.E
new TabLayoutMediator(gestionnaireOnglet, gestionnairePagination,
(tab, position) -> tab.setText(
titreOnglet[position])).attach();
/* Crée la liste des cuissons */
listeCuisson = new ArrayList<>();
}
@Override
protected void onStart() {
super.onStart();
readFromFile();
System.out.println("onResume : " + AfficherFragment.cuissonAffichees);
protected void onResume() {
super.onResume();
chargerFichier();
}
@Override
protected void onDestroy() {
System.out.println(
"Avant write : " + AfficherFragment.cuissonAffichees);
writeToFile();
System.out.println(
"Après write : " + AfficherFragment.cuissonAffichees);
super.onDestroy();
protected void onPause() {
sauvegarderFichier();
super.onPause();
}
private void writeToFile() {
/**
* Ajoute une cuisson a la liste des cuissons
*
* @param cuisson Objet cuisson a ajouter dans la liste
*/
public void addCuisson(Cuisson cuisson) {
if (estDansCuisson(cuisson)) throw new IllegalArgumentException("Il existe deja un plat avec ce nom");
listeCuisson.add(cuisson);
/* Test affichage du contennu de la liste des cuisson */
System.out.println(Arrays.asList(listeCuisson));
}
public ArrayList<Cuisson> getListeCuisson() {
return listeCuisson;
}
private boolean estDansCuisson(Cuisson aTester) {
for (Cuisson cuisson : listeCuisson) {
if (cuisson.getPlat().equals(aTester.getPlat())) return true;
}
return false;
}
public void editerCuisson(int index) {
changeFragment(1);
modeEdition = true;
cuissonAEditer = listeCuisson.get(index);
}
private void chargerFichier() {
try {
File path = getFilesDir();
File file = new File(path, NOM_FICHIER);
if (!path.exists()) {
path.mkdirs();
}
FileOutputStream fos = new FileOutputStream(file);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(AfficherFragment.cuissonAffichees);
oos.close();
fos.close();
System.out.println("Ecriture réalisée");
} catch (IOException e) {
Log.e(TAG, "File write failed: " + e.toString());
}
}
private void readFromFile() {
try {
File path = getFilesDir();
File file = new File(path, NOM_FICHIER);
FileInputStream fis = new FileInputStream(file);
FileInputStream fis = openFileInput(NOM_FICHIER);
ObjectInputStream ois = new ObjectInputStream(fis);
AfficherFragment.cuissonAffichees
= (ArrayList<String>) ois.readObject();
listeCuisson = (ArrayList<Cuisson>) ois.readObject();
ois.close();
fis.close();
System.out.println("Lecture réalisée");
} catch (FileNotFoundException e) {
Log.e(TAG, "File not found: " + e.toString());
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
private void sauvegarderFichier() {
try {
FileOutputStream fos = openFileOutput(NOM_FICHIER, MODE_PRIVATE);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(listeCuisson);
oos.close();
fos.close();
} catch (IOException e) {
Log.e(TAG, "Can not read file: " + e.toString());
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
@@ -163,39 +161,24 @@ public class MainActivity extends AppCompatActivity implements AjouterFragment.E
}
public void afficherAide() {
new AlertDialog.Builder(this).setTitle(R.string.alert_title_aide)
new AlertDialog.Builder(this)
.setTitle(R.string.alert_title_aide)
.setMessage(R.string.alert_content_help)
.setNeutralButton(
R.string.alert_neutral_button, null)
.setNeutralButton(R.string.alert_neutral_button, null)
.show();
}
public void reinitData() {
new AlertDialog.Builder(this).setTitle(R.string.alert_title_reinit)
new AlertDialog.Builder(this)
.setTitle(R.string.alert_title_reinit)
.setMessage(R.string.alert_content_reinit)
.setNeutralButton(
R.string.alert_neutral_button, null)
.setPositiveButton(R.string.btn_valider,
(dialogInterface, i) -> {
AfficherFragment.adapterCuissons
.clear();
AfficherFragment.adapterCuissons
.notifyDataSetChanged();
})
.setNeutralButton(R.string.alert_neutral_button, null)
.setPositiveButton(R.string.btn_valider, (dialogInterface, i) -> {
AfficherFragment.adapterCuissons.clear();
AfficherFragment.adapterCuissons.notifyDataSetChanged();})
.show();
}
@Override
public void recevoirCuisson(Cuisson cuisson) {
AfficherFragment fragmentAModifier
= (AfficherFragment) getSupportFragmentManager().findFragmentByTag(
"f0");
if (fragmentAModifier != null) {
fragmentAModifier.addCuisson(cuisson);
}
}
public void changeFragment(int pos) {
gestionnairePagination.setCurrentItem(pos);
}
@@ -1,242 +1,242 @@
/* **************************************************************************** *
* IUT de Rodez - Département Informatique *
* Semestre 4 - Applications mobiles *
* *
* SUJET CONTROLE MARS 2019 *
* ANNEXES *
* *
* **************************************************************************** */
/*
* 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
*/
/* A priori de fichier ne doit pas être modifié. Vous restez libre de le modifier si
besoin
*/
package com.example.outilcuisson;
/**
* 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
*/
public class OutilCuisson {
/**
* 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";
/**
* Température maximale pour la cuisson
*/
public static final int TEMPERATURE_MAX = 300;
/**
* 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
*/
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 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
* 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
* @return une chaîne contenant le descriptif de la cuisson si les paramètres
* 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)) {
// on insère le nom du plat
aRenvoyer.append(nomPlat);
aRenvoyer.append(chaineEspace(LG_MAX_PLAT - nomPlat.length()));
aRenvoyer.append(" | ");
// on insère la durée
aRenvoyer.append(String.valueOf(heureCuisson));
aRenvoyer.append(" h ");
if (minuteCuisson < 10) {
aRenvoyer.append("0");
}
aRenvoyer.append(String.valueOf(minuteCuisson));
aRenvoyer.append(" | ");
// 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
*/
public static String extrairePlat(String source) {
if (source.length() < LG_MAX_PLAT) {
return CHAINE_DEFAUT;
} else {
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
* 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
*/
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) {
/*
* 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
*/
public static int thermostat(int temperature) {
int aRenvoyer; // valeur du thermostat à renvoyer
if (temperature <= 0 || temperature > TEMPERATURE_MAX) {
aRenvoyer = -1;
} else {
aRenvoyer = temperature / 30;
if (temperature % 30 > 15) {
aRenvoyer++;
}
}
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
*/
private static String chaineEspace(int nbEspace) {
StringBuilder aRenvoyer = new StringBuilder();
for (int i = 1; i <= nbEspace; i++) {
aRenvoyer.append(" ");
}
return aRenvoyer.toString();
}
}
///* **************************************************************************** *
// * IUT de Rodez - Département Informatique *
// * Semestre 4 - Applications mobiles *
// * *
// * SUJET CONTROLE MARS 2019 *
// * ANNEXES *
// * *
// * **************************************************************************** */
//
//
///*
// * 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
// */
//
///* A priori de fichier ne doit pas être modifié. Vous restez libre de le modifier si
// besoin
// */
//package com.example.outilcuisson;
//
//
///**
// * 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
// */
//public class OutilCuisson {
//
// /**
// * 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";
//
// /**
// * Température maximale pour la cuisson
// */
// public static final int TEMPERATURE_MAX = 300;
//
//
// /**
// * 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
// */
// 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 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
// * 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
// * @return une chaîne contenant le descriptif de la cuisson si les paramètres
// * 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)) {
//
// // on insère le nom du plat
// aRenvoyer.append(nomPlat);
// aRenvoyer.append(chaineEspace(LG_MAX_PLAT - nomPlat.length()));
// aRenvoyer.append(" | ");
//
// // on insère la durée
// aRenvoyer.append(String.valueOf(heureCuisson));
// aRenvoyer.append(" h ");
// if (minuteCuisson < 10) {
// aRenvoyer.append("0");
// }
// aRenvoyer.append(String.valueOf(minuteCuisson));
// aRenvoyer.append(" | ");
//
// // 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
// */
// public static String extrairePlat(String source) {
// if (source.length() < LG_MAX_PLAT) {
// return CHAINE_DEFAUT;
// } else {
// 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
// * 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
// */
// 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) {
//
// /*
// * 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
// */
// public static int thermostat(int temperature) {
// int aRenvoyer; // valeur du thermostat à renvoyer
// if (temperature <= 0 || temperature > TEMPERATURE_MAX) {
// aRenvoyer = -1;
// } else {
// aRenvoyer = temperature / 30;
// if (temperature % 30 > 15) {
// aRenvoyer++;
// }
// }
// 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
// */
// private static String chaineEspace(int nbEspace) {
// StringBuilder aRenvoyer = new StringBuilder();
// for (int i = 1; i <= nbEspace; i++) {
// aRenvoyer.append(" ");
// }
// return aRenvoyer.toString();
// }
//
//}