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 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; import java.util.ArrayList;
public class AfficherFragment extends Fragment { public class AfficherFragment extends Fragment {
@@ -38,7 +31,7 @@ public class AfficherFragment extends Fragment {
/** /**
* TODO * TODO
*/ */
public ListView listeCuissons; public ListView listView;
/** /**
* TODO * TODO
@@ -46,14 +39,7 @@ public class AfficherFragment extends Fragment {
public static ArrayAdapter<String> adapterCuissons; public static ArrayAdapter<String> adapterCuissons;
/** public AfficherFragment() {}
* Liste des cuissons enregistrées dans l'application
*/
public static ArrayList<String> cuissonAffichees;
public AfficherFragment() {
}
public static AfficherFragment newInstance() { public static AfficherFragment newInstance() {
return new AfficherFragment(); return new AfficherFragment();
@@ -70,25 +56,35 @@ public class AfficherFragment extends Fragment {
Bundle savedInstanceState) { Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.afficher_fragment, container, View view = inflater.inflate(R.layout.afficher_fragment, container,
false); false);
cuissonAffichees = new ArrayList<>(); listView = view.findViewById(R.id.listeCuisson);
listeCuissons = view.findViewById(R.id.listeCuisson);
adapterCuissons = new ArrayAdapter<>(getActivity(), adapterCuissons = new ArrayAdapter<>(getActivity(),
R.layout.ligne_liste, R.id.item_cuisson, cuissonAffichees); R.layout.ligne_liste, R.id.item_cuisson, new ArrayList<>());
listeCuissons.setAdapter(adapterCuissons); listView.setAdapter(adapterCuissons);
registerForContextMenu(listeCuissons); registerForContextMenu(listView);
return view; return view;
} }
/** @Override
* Ajouter une cuisson public void onResume() {
* super.onResume();
* @param cuisson La cuisson à ajouter afficherCuisson();
*/ }
public void addCuisson(Cuisson cuisson) {
adapterCuissons.add(cuisson.toString()); 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(); adapterCuissons.notifyDataSetChanged();
listeCuissons.requestLayout(); listView.requestLayout();
} }
/** /**
@@ -112,30 +108,30 @@ public class AfficherFragment extends Fragment {
AdapterView.AdapterContextMenuInfo information AdapterView.AdapterContextMenuInfo information
= (AdapterView.AdapterContextMenuInfo) item.getMenuInfo(); = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
int index = information.position;
switch (item.getItemId()) { switch (item.getItemId()) {
case R.id.thermosContext: case R.id.thermosContext:
afficherThermos(cuissonAffichees.get(information.position)); afficherThermos(index);
break; break;
case R.id.modifierContext: case R.id.modifierContext:
// modifierCuisson(); ((MainActivity) getActivity()).editerCuisson(index);
break; break;
case R.id.supprContext: case R.id.supprContext:
cuissonAffichees.remove(information.position); supprimerCuisson(index);
adapterCuissons.notifyDataSetChanged();
listeCuissons.requestLayout();
break;
case R.id.cancelContext:
break; break;
} }
return super.onContextItemSelected(item); 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, String content = getString(R.string.alert_content_thermos,
Cuisson.extrairePlat(cuisson), cuisson.getPlat(),
Cuisson.extraireTemperature(cuisson), cuisson.getDegree(),
Cuisson.thermostat(Cuisson.extraireTemperature(cuisson))); cuisson.getThermostat());
new AlertDialog.Builder(getContext()).setTitle(R.string.alert_title_thermos) new AlertDialog.Builder(getContext()).setTitle(R.string.alert_title_thermos)
.setMessage(content) .setMessage(content)
.setNeutralButton( .setNeutralButton(
@@ -144,13 +140,12 @@ public class AfficherFragment extends Fragment {
.show(); .show();
} }
public void modifierCuisson() { /**
// ((MainActivity)getActivity()).changeFragment(1); * Supprime l'objet correspondant cuisson
Fragment fragment = new AjouterFragment(); * @param index
FragmentManager fragmentManager = fragment.getChildFragmentManager(); */
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); public void supprimerCuisson(int index) {
fragmentTransaction.replace(R.id.ajouter_fragment, fragment, fragment.toString()); ((MainActivity) getActivity()).getListeCuisson().remove(index);
fragmentTransaction.addToBackStack(fragment.toString()); afficherCuisson();
fragmentTransaction.commit();
} }
} }
@@ -20,9 +20,6 @@ import android.widget.Toast;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import com.example.outilcuisson.OutilCuisson;
import com.example.outilcuisson.Cuisson;
public class AjouterFragment extends Fragment { public class AjouterFragment extends Fragment {
EditText inputPlat; EditText inputPlat;
@@ -31,24 +28,15 @@ public class AjouterFragment extends Fragment {
Button btnEffacer; Button btnEffacer;
Button btnValider; Button btnValider;
public AjouterFragment() { public AjouterFragment() {}
}
public static AjouterFragment newInstance() { public static AjouterFragment newInstance() {
return new AjouterFragment(); return new AjouterFragment();
} }
public interface EcouteurAjout {
void recevoirCuisson(Cuisson cuisson);
}
private EcouteurAjout activiteQuiMEcoute;
@Override @Override
public void onAttach(@NonNull Context context) { public void onAttach(@NonNull Context context) {
super.onAttach(context); super.onAttach(context);
activiteQuiMEcoute = (EcouteurAjout) context;
} }
@Override @Override
@@ -60,8 +48,8 @@ public class AjouterFragment extends Fragment {
public View onCreateView(LayoutInflater inflater, public View onCreateView(LayoutInflater inflater,
ViewGroup container, ViewGroup container,
Bundle savedInstanceState) { 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 */ /* Liste des éléments intéractifs */
inputPlat = view.findViewById(R.id.input_plat); inputPlat = view.findViewById(R.id.input_plat);
@@ -70,71 +58,106 @@ public class AjouterFragment extends Fragment {
btnEffacer = view.findViewById(R.id.btn_effacer); btnEffacer = view.findViewById(R.id.btn_effacer);
btnValider = view.findViewById(R.id.btn_valider); btnValider = view.findViewById(R.id.btn_valider);
/* Initialise le TimePicker en format 24h avec par défaut la valeur /* Initialise le TimePicker en format 24h et met les champs par défaut */
0h40 */
inputDuree.setIs24HourView(true); inputDuree.setIs24HourView(true);
inputDuree.setHour(0); champsDefaut();
inputDuree.setMinute(40);
/* /* Actions des buttons */
* Action de création de la nouvelle cuisson btnValider.setOnClickListener(this::actionBtnValider);
*/ btnEffacer.setOnClickListener(this::actionBtnEffacer);
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 */
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)
.show();
e.printStackTrace();
}
});
/*
* Efface le contenu des champs de textes et met le TimePicker à 0h40
*/
btnEffacer.setOnClickListener(view2 -> {
viderChamps();
});
return view; return view;
} }
private void viderChamps() { @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();
int hDuree = inputDuree.getHour();
int mDuree = inputDuree.getMinute();
/* Convertis la température en entier */
int temperature = txtTemperature.isEmpty() ? -1 : Integer.parseInt(txtTemperature);
if (((MainActivity)getActivity()).modeEdition) {
Cuisson cuisson = ((MainActivity)getActivity()).cuissonAEditer;
try {
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);
/* On ajoute la cuisson a la liste des cuisson */
((MainActivity) getActivity()).addCuisson(cuisson);
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();
}
}
}
/**
* 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(""); inputPlat.setText("");
inputDuree.setHour(0); inputDuree.setHour(0);
inputDuree.setMinute(40); inputDuree.setMinute(40);
@@ -24,18 +24,25 @@ public class Cuisson implements Serializable {
/** /**
* Nombre maximum de caractères pour le nom du plat * 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; private String plat;
/**
* La durée en heure de la cuisson du plat
*/
private int heure; private int heure;
private int minute; private int minute;
private int degree; private int degree;
public Cuisson(String plat, int heure, int minute, int degree) throws public Cuisson(String plat, int heure, int minute, int degree) {
Exception { if (!platValide(plat)
if (!platValide(plat) || !heureCuissonValide(heure) || !horaireValide(heure, minute)
|| !minuteCuissonValide(minute) || !temperatureValide(degree)) { || !temperatureValide(degree)) {
throw new Exception(CHAINE_DEFAUT); throw new IllegalArgumentException(CHAINE_DEFAUT);
} }
this.plat = plat; this.plat = plat;
this.heure = heure; this.heure = heure;
@@ -56,6 +63,12 @@ public class Cuisson implements Serializable {
&& !nomPlat.contains("|"); && !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 * Détermine si le nombre d'heures d'une durée de cuisson est valide
* (comprise entre 0 et 9) * (comprise entre 0 et 9)
@@ -63,7 +76,7 @@ public class Cuisson implements Serializable {
* @param heureCuisson heure à tester * @param heureCuisson heure à tester
* @return un booléen égal à vrai ssi l'heure de la durée est valide * @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; 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 * @return un booléen égal à vrai ssi le nombre de minutes de la durée
* est valide * est valide
*/ */
public static boolean minuteCuissonValide(int minuteCuisson) { private static boolean minuteCuissonValide(int minuteCuisson) {
return 0 <= minuteCuisson && minuteCuisson <= 59; return 0 <= minuteCuisson && minuteCuisson <= 59;
} }
@@ -90,6 +103,9 @@ public class Cuisson implements Serializable {
return 0 < temperature && temperature <= TEMPERATURE_MAX; return 0 < temperature && temperature <= TEMPERATURE_MAX;
} }
/**
* @return
*/
public String getPlat() { public String getPlat() {
return plat; return plat;
} }
@@ -106,11 +122,20 @@ public class Cuisson implements Serializable {
return degree; 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 @Override
public String toString() { public String toString() {
StringBuilder aRenvoyer = new StringBuilder(); StringBuilder aRenvoyer = new StringBuilder();
// on insère le nom du plat // on insère le nom du plat
aRenvoyer.append(plat); aRenvoyer.append(plat);
aRenvoyer.append(chaineEspace(LG_MAX_PLAT - plat.length())); aRenvoyer.append(chaineEspace(LG_MAX_PLAT - plat.length()));
@@ -161,8 +186,7 @@ public class Cuisson implements Serializable {
*/ */
public static int extraireTemperature(String source) { public static int extraireTemperature(String source) {
int temperature; // température extraite int temperature; // température extraite
String String chaineTemperature; // température extraite en tant que chaîne
chaineTemperature; // température extraite en tant que chaîne
try { try {
@@ -184,20 +208,17 @@ public class Cuisson implements Serializable {
* Renvoie le thermostat correspondant à la temperature argument * Renvoie le thermostat correspondant à la temperature argument
* (celle-ci doit être inférieure à TEMPERATURE_MAX) * (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 * @return l'entier égal au thermostat ou -1 si la température est invalide
*/ */
public static int thermostat(int temperature) { public int getThermostat() {
int aRenvoyer; // valeur du thermostat à renvoyer int thermostat = -1;
if (temperature <= 0 || temperature > TEMPERATURE_MAX) {
aRenvoyer = -1; if (temperatureValide(degree)) {
} else { thermostat = degree / 30;
aRenvoyer = temperature / 30; if (degree % 30 > 15) thermostat++;
if (temperature % 30 > 15) {
aRenvoyer++;
}
} }
return aRenvoyer;
return thermostat;
} }
/** /**
@@ -209,9 +230,7 @@ public class Cuisson implements Serializable {
*/ */
private static String chaineEspace(int nbEspace) { private static String chaineEspace(int nbEspace) {
StringBuilder aRenvoyer = new StringBuilder(); StringBuilder aRenvoyer = new StringBuilder();
for (int i = 1; i <= nbEspace; i++) { for (int i = 1; i <= nbEspace; i++) aRenvoyer.append(" ");
aRenvoyer.append(" ");
}
return aRenvoyer.toString(); return aRenvoyer.toString();
} }
} }
@@ -1,60 +1,43 @@
package com.example.outilcuisson; package com.example.outilcuisson;
import android.app.AlertDialog; import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle; import android.os.Bundle;
import android.util.Log;
import android.view.Menu; import android.view.Menu;
import android.view.MenuInflater; import android.view.MenuInflater;
import android.view.MenuItem; import android.view.MenuItem;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.FragmentManager;
import androidx.viewpager2.widget.ViewPager2; import androidx.viewpager2.widget.ViewPager2;
import com.google.android.material.tabs.TabLayout; import com.google.android.material.tabs.TabLayout;
import com.google.android.material.tabs.TabLayoutMediator; 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.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.FileReader; import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectInputStream; import java.io.ObjectInputStream;
import java.io.ObjectOutputStream; 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.ArrayList;
import java.util.Arrays; 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 * Le nom du fichier de sauvegarde
*/ */
private static final String NOM_FICHIER = "cuisson.txt"; private static final String NOM_FICHIER = "cuisson.txt";
/** private ArrayList<Cuisson> listeCuisson;
* 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 ViewPager2 gestionnairePagination; private ViewPager2 gestionnairePagination;
public boolean modeEdition = false;
public Cuisson cuissonAEditer;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
@@ -73,68 +56,83 @@ public class MainActivity extends AppCompatActivity implements AjouterFragment.E
new TabLayoutMediator(gestionnaireOnglet, gestionnairePagination, new TabLayoutMediator(gestionnaireOnglet, gestionnairePagination,
(tab, position) -> tab.setText( (tab, position) -> tab.setText(
titreOnglet[position])).attach(); titreOnglet[position])).attach();
/* Crée la liste des cuissons */
listeCuisson = new ArrayList<>();
} }
@Override @Override
protected void onStart() { protected void onResume() {
super.onStart(); super.onResume();
readFromFile(); chargerFichier();
System.out.println("onResume : " + AfficherFragment.cuissonAffichees);
} }
@Override @Override
protected void onDestroy() { protected void onPause() {
System.out.println( sauvegarderFichier();
"Avant write : " + AfficherFragment.cuissonAffichees); super.onPause();
writeToFile();
System.out.println(
"Après write : " + AfficherFragment.cuissonAffichees);
super.onDestroy();
} }
private void writeToFile() { /**
try { * Ajoute une cuisson a la liste des cuissons
File path = getFilesDir(); *
File file = new File(path, NOM_FICHIER); * @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");
if (!path.exists()) { listeCuisson.add(cuisson);
path.mkdirs();
}
FileOutputStream fos = new FileOutputStream(file); /* Test affichage du contennu de la liste des cuisson */
ObjectOutputStream oos = new ObjectOutputStream(fos); System.out.println(Arrays.asList(listeCuisson));
}
oos.writeObject(AfficherFragment.cuissonAffichees); public ArrayList<Cuisson> getListeCuisson() {
return listeCuisson;
}
oos.close(); private boolean estDansCuisson(Cuisson aTester) {
fos.close(); for (Cuisson cuisson : listeCuisson) {
System.out.println("Ecriture réalisée"); if (cuisson.getPlat().equals(aTester.getPlat())) return true;
} catch (IOException e) {
Log.e(TAG, "File write failed: " + e.toString());
} }
return false;
} }
private void readFromFile() { public void editerCuisson(int index) {
try { changeFragment(1);
File path = getFilesDir(); modeEdition = true;
File file = new File(path, NOM_FICHIER); cuissonAEditer = listeCuisson.get(index);
}
FileInputStream fis = new FileInputStream(file);
private void chargerFichier() {
try {
FileInputStream fis = openFileInput(NOM_FICHIER);
ObjectInputStream ois = new ObjectInputStream(fis); ObjectInputStream ois = new ObjectInputStream(fis);
AfficherFragment.cuissonAffichees listeCuisson = (ArrayList<Cuisson>) ois.readObject();
= (ArrayList<String>) ois.readObject();
ois.close(); ois.close();
fis.close(); fis.close();
System.out.println("Lecture réalisée");
} catch (FileNotFoundException e) { } catch (IOException | ClassNotFoundException e) {
Log.e(TAG, "File not found: " + e.toString()); 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) { } catch (IOException e) {
Log.e(TAG, "Can not read file: " + e.toString());
} catch (ClassNotFoundException e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
@@ -163,37 +161,22 @@ public class MainActivity extends AppCompatActivity implements AjouterFragment.E
} }
public void afficherAide() { public void afficherAide() {
new AlertDialog.Builder(this).setTitle(R.string.alert_title_aide) new AlertDialog.Builder(this)
.setMessage(R.string.alert_content_help) .setTitle(R.string.alert_title_aide)
.setNeutralButton( .setMessage(R.string.alert_content_help)
R.string.alert_neutral_button, null) .setNeutralButton(R.string.alert_neutral_button, null)
.show(); .show();
} }
public void reinitData() { public void reinitData() {
new AlertDialog.Builder(this).setTitle(R.string.alert_title_reinit) new AlertDialog.Builder(this)
.setMessage(R.string.alert_content_reinit) .setTitle(R.string.alert_title_reinit)
.setNeutralButton( .setMessage(R.string.alert_content_reinit)
R.string.alert_neutral_button, null) .setNeutralButton(R.string.alert_neutral_button, null)
.setPositiveButton(R.string.btn_valider, .setPositiveButton(R.string.btn_valider, (dialogInterface, i) -> {
(dialogInterface, i) -> { AfficherFragment.adapterCuissons.clear();
AfficherFragment.adapterCuissons AfficherFragment.adapterCuissons.notifyDataSetChanged();})
.clear(); .show();
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) { public void changeFragment(int pos) {
@@ -1,242 +1,242 @@
/* **************************************************************************** * ///* **************************************************************************** *
* IUT de Rodez - Département Informatique * // * IUT de Rodez - Département Informatique *
* Semestre 4 - Applications mobiles * // * Semestre 4 - Applications mobiles *
* * // * *
* SUJET CONTROLE MARS 2019 * // * SUJET CONTROLE MARS 2019 *
* ANNEXES * // * ANNEXES *
* * // * *
* **************************************************************************** */ // * **************************************************************************** */
//
//
/* ///*
* 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 // * les caractéristiques d'une cuisson au four
* OutilCuisson.java 12/21 // * OutilCuisson.java 12/21
*/ // */
//
/* A priori de fichier ne doit pas être modifié. Vous restez libre de le modifier si ///* A priori de fichier ne doit pas être modifié. Vous restez libre de le modifier si
besoin // besoin
*/ // */
package com.example.outilcuisson; //package com.example.outilcuisson;
//
//
/** ///**
* Cette classe est une classe utilitaire qui contient des méthodes outils pour gérer // * 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. // * une chaîne de caractères contenant le descriptif d'une cuisson au four.
* Les caractéristiques d'une cuisson sont : // * Les caractéristiques d'une cuisson sont :
* - le nom du plat (une chaîne non vide) // * - 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 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) // * - 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) // * - une température (un entier strictement positif et inférieur à TEMPERATURE_MAX)
* // *
* @author INFO2 Semestre 4 // * @author INFO2 Semestre 4
*/ // */
public class OutilCuisson { //public class OutilCuisson {
//
/** // /**
* Valeur de la chaîne qui représente une cuisson si l'une des caractéristiques // * Valeur de la chaîne qui représente une cuisson si l'une des caractéristiques
* de la cuisson est invalide // * de la cuisson est invalide
*/ // */
private static final String CHAINE_DEFAUT = "Information incohérente"; // private static final String CHAINE_DEFAUT = "Information incohérente";
//
/** // /**
* Température maximale pour la cuisson // * Température maximale pour la cuisson
*/ // */
public static final int TEMPERATURE_MAX = 300; // 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; // public static final int HEURE_MAX = 9;
//
/** // /**
* Nombre maximum de caractères pour le nom du plat // * 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 = 18;
//
//
/** // /**
* Détermine si un nom de plat est valide (non vide, au plus 20 caractères et ne // * Détermine si un nom de plat est valide (non vide, au plus 20 caractères et ne
* contient pas le caractère '|') // * contient pas le caractère '|')
* // *
* @param nomPlat chaîne à testesr // * @param nomPlat chaîne à testesr
* @return un booléen égal à vrai ssi la chaîne à tester est valide // * @return un booléen égal à vrai ssi la chaîne à tester est valide
*/ // */
public static boolean platValide(String nomPlat) { // public static boolean platValide(String nomPlat) {
return nomPlat.length() > 0 && nomPlat.length() <= LG_MAX_PLAT // return nomPlat.length() > 0 && nomPlat.length() <= LG_MAX_PLAT
&& !nomPlat.contains("|"); // && !nomPlat.contains("|");
} // }
//
//
/** // /**
* Détermine si le nombre d'heures d'une durée de cuisson est valide // * Détermine si le nombre d'heures d'une durée de cuisson est valide
* (comprise entre 0 et 9) // * (comprise entre 0 et 9)
* // *
* @param heureCuisson heure à tester // * @param heureCuisson heure à tester
* @return un booléen égal à vrai ssi l'heure de la durée est valide // * @return un booléen égal à vrai ssi l'heure de la durée est valide
*/ // */
public static boolean heureCuissonValide(int heureCuisson) { // public static boolean heureCuissonValide(int heureCuisson) {
return 0 <= heureCuisson && heureCuisson <= HEURE_MAX; // return 0 <= heureCuisson && heureCuisson <= HEURE_MAX;
} // }
//
//
/** // /**
* Détermine si le nombre de minutes d'une durée de cuisson est valide // * Détermine si le nombre de minutes d'une durée de cuisson est valide
* (comprise entre 0 et 59) // * (comprise entre 0 et 59)
* // *
* @param minuteCuisson minute à tester // * @param minuteCuisson minute à tester
* @return un booléen égal à vrai ssi le nombre de minutes de la durée est valide // * @return un booléen égal à vrai ssi le nombre de minutes de la durée est valide
*/ // */
public static boolean minuteCuissonValide(int minuteCuisson) { // public static boolean minuteCuissonValide(int minuteCuisson) {
return 0 <= minuteCuisson && minuteCuisson <= 59; // return 0 <= minuteCuisson && minuteCuisson <= 59;
} // }
//
//
/** // /**
* Détermine si une température de cuisson est valide // * Détermine si une température de cuisson est valide
* (strictement positive et inférieure ou égale à TEMPERATURE_MAX) // * (strictement positive et inférieure ou égale à TEMPERATURE_MAX)
* // *
* @param temperature temperature à tester // * @param temperature temperature à tester
* @return un booléen égal à vrai ssi la température est valide // * @return un booléen égal à vrai ssi la température est valide
*/ // */
public static boolean temperatureValide(int temperature) { // public static boolean temperatureValide(int temperature) {
return 0 < temperature && temperature <= TEMPERATURE_MAX; // return 0 < temperature && temperature <= TEMPERATURE_MAX;
} // }
//
//
/** // /**
* Concatène les arguments dans une chaîne de caractères. Celle-ci aura le format // * Concatène les arguments dans une chaîne de caractères. Celle-ci aura le format
* suivant : // * suivant :
* nom du plat | temps de cuisson en heures et minutes | température // * 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 // * Si l'un des arguments est invalide, c'est la constante CHAINE_DEFAUT qui
* est renvoyée // * est renvoyée
* // *
* @param nomPlat nom du plat. Doit être non vide, avec au plus // * @param nomPlat nom du plat. Doit être non vide, avec au plus
* LG_MAX_PLAT caractères, ne doit pas contenir | // * LG_MAX_PLAT caractères, ne doit pas contenir |
* @param heureCuisson nombre d'heures de la durée de la cuisson // * @param heureCuisson nombre d'heures de la durée de la cuisson
* doit être compris entre 0 et 9 // * doit être compris entre 0 et 9
* @param minuteCuisson nombre de minutes de la durée de la cuisson // * @param minuteCuisson nombre de minutes de la durée de la cuisson
* doit être compris entre 0 et 59 // * doit être compris entre 0 et 59
* @param temperature température de la cuisson. Doit être comprise entre // * @param temperature température de la cuisson. Doit être comprise entre
* 1 et TEMPERATURE_MAX // * 1 et TEMPERATURE_MAX
* @return une chaîne contenant le descriptif de la cuisson si les paramètres // * @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, // public static String transformeEnChaine(String nomPlat, int heureCuisson,
int minuteCuisson, int temperature) { // int minuteCuisson, int temperature) {
StringBuilder aRenvoyer = new StringBuilder(); // StringBuilder aRenvoyer = new StringBuilder();
//
if (platValide(nomPlat) && heureCuissonValide(heureCuisson) // if (platValide(nomPlat) && heureCuissonValide(heureCuisson)
&& minuteCuissonValide(minuteCuisson) && temperatureValide(temperature)) { // && minuteCuissonValide(minuteCuisson) && temperatureValide(temperature)) {
//
// on insère le nom du plat // // on insère le nom du plat
aRenvoyer.append(nomPlat); // aRenvoyer.append(nomPlat);
aRenvoyer.append(chaineEspace(LG_MAX_PLAT - nomPlat.length())); // aRenvoyer.append(chaineEspace(LG_MAX_PLAT - nomPlat.length()));
aRenvoyer.append(" | "); // aRenvoyer.append(" | ");
//
// on insère la durée // // on insère la durée
aRenvoyer.append(String.valueOf(heureCuisson)); // aRenvoyer.append(String.valueOf(heureCuisson));
aRenvoyer.append(" h "); // aRenvoyer.append(" h ");
if (minuteCuisson < 10) { // if (minuteCuisson < 10) {
aRenvoyer.append("0"); // aRenvoyer.append("0");
} // }
aRenvoyer.append(String.valueOf(minuteCuisson)); // aRenvoyer.append(String.valueOf(minuteCuisson));
aRenvoyer.append(" | "); // aRenvoyer.append(" | ");
//
// on insère la température // // on insère la température
aRenvoyer.append(String.format("%3d", temperature)); // aRenvoyer.append(String.format("%3d", temperature));
} else { // } else {
//
// l'un des arguments est invalide // // l'un des arguments est invalide
aRenvoyer.append(CHAINE_DEFAUT); // aRenvoyer.append(CHAINE_DEFAUT);
} // }
return aRenvoyer.toString(); // return aRenvoyer.toString();
} // }
//
//
/** // /**
* Extrait d'une chaîne le nom du plat. On suppose que la chaîne est correctement // * 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 // * 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) // * (les 20 premiers caractères de la chaîne sont extraits)
* // *
* @param source chaîne source de l'extraction // * @param source chaîne source de l'extraction
* @return une chaîne contenant le nom du plat ou CHAINE_DEFAUT si la chaîne // * @return une chaîne contenant le nom du plat ou CHAINE_DEFAUT si la chaîne
* argument est trop courte // * argument est trop courte
*/ // */
public static String extrairePlat(String source) { // public static String extrairePlat(String source) {
if (source.length() < LG_MAX_PLAT) { // if (source.length() < LG_MAX_PLAT) {
return CHAINE_DEFAUT; // return CHAINE_DEFAUT;
} else { // } else {
return source.substring(0, LG_MAX_PLAT); // return source.substring(0, LG_MAX_PLAT);
} // }
} // }
//
//
/** // /**
* Extrait d'une chaîne la température de cuisson. On suppose que la chaîne // * 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 // * 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 // * gérée par cette classe (la température est présente sur les 3 derniers
* caractères de la chaîne) // * caractères de la chaîne)
* // *
* @param source chaîne source de l'extraction // * @param source chaîne source de l'extraction
* @return un entier égal à la température extraite ou bien -1 si un // * @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 // * problème inattendu a été rencontré avec le format de la chaîne
*/ // */
public static int extraireTemperature(String source) { // public static int extraireTemperature(String source) {
int temperature; // température extraite // 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 { // try {
chaineTemperature = source.substring(source.length() - 3, source.length()); // chaineTemperature = source.substring(source.length() - 3, source.length());
temperature = Integer.parseInt(chaineTemperature); // 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 // * ou lors de la transformation en entier
*/ // */
temperature = -1; // temperature = -1;
} // }
return temperature; // return temperature;
} // }
//
//
/** // /**
* Renvoie le thermostat correspondant à la temperature arguemnt // * Renvoie le thermostat correspondant à la temperature arguemnt
* (celle-ci doit être inférieure à TEMPERATURE_MAX) // * (celle-ci doit être inférieure à TEMPERATURE_MAX)
* // *
* @param temperature température à convertir // * @param temperature température à convertir
* @return l'entier égal au thermostat ou -1 si la température est invalide // * @return l'entier égal au thermostat ou -1 si la température est invalide
*/ // */
public static int thermostat(int temperature) { // public static int thermostat(int temperature) {
int aRenvoyer; // valeur du thermostat à renvoyer // int aRenvoyer; // valeur du thermostat à renvoyer
if (temperature <= 0 || temperature > TEMPERATURE_MAX) { // if (temperature <= 0 || temperature > TEMPERATURE_MAX) {
aRenvoyer = -1; // aRenvoyer = -1;
} else { // } else {
aRenvoyer = temperature / 30; // aRenvoyer = temperature / 30;
if (temperature % 30 > 15) { // if (temperature % 30 > 15) {
aRenvoyer++; // aRenvoyer++;
} // }
} // }
return aRenvoyer; // return aRenvoyer;
} // }
//
//
/** // /**
* Renvoie une chaîne constituée d'espaces. Le nombre d'espaces est indiqué // * Renvoie une chaîne constituée d'espaces. Le nombre d'espaces est indiqué
* par le paramètre. // * par le paramètre.
* // *
* @param nbEspace nombre d'espaces à placer dans la chaîne // * @param nbEspace nombre d'espaces à placer dans la chaîne
* @return une chaîne constituée du caractère espace // * @return une chaîne constituée du caractère espace
*/ // */
private static String chaineEspace(int nbEspace) { // private static String chaineEspace(int nbEspace) {
StringBuilder aRenvoyer = new StringBuilder(); // StringBuilder aRenvoyer = new StringBuilder();
for (int i = 1; i <= nbEspace; i++) { // for (int i = 1; i <= nbEspace; i++) {
aRenvoyer.append(" "); // aRenvoyer.append(" ");
} // }
return aRenvoyer.toString(); // return aRenvoyer.toString();
} // }
//
} //}