From caf74c5a1e439c106ca412bfa1d95d732450b57b Mon Sep 17 00:00:00 2001 From: t22couch <thibaud.couchet@imt-atlantique.net> Date: Tue, 18 Mar 2025 14:46:54 +0100 Subject: [PATCH] End of TP5 --- .../DatePickerFragment.java | 77 ++++++++--- .../myfirstapplication/EditUserFragment.java | 129 ++++++++++++++++-- .../myfirstapplication/MainActivity.java | 52 ++++++- app/src/main/res/menu/menu_main.xml | 3 +- app/src/main/res/values/strings.xml | 2 - 5 files changed, 229 insertions(+), 34 deletions(-) diff --git a/app/src/main/java/fr/imt_atlantique/myfirstapplication/DatePickerFragment.java b/app/src/main/java/fr/imt_atlantique/myfirstapplication/DatePickerFragment.java index cecfa50..5f14dab 100644 --- a/app/src/main/java/fr/imt_atlantique/myfirstapplication/DatePickerFragment.java +++ b/app/src/main/java/fr/imt_atlantique/myfirstapplication/DatePickerFragment.java @@ -12,12 +12,25 @@ import android.view.ViewGroup; import android.widget.Button; import android.widget.DatePicker; +import java.util.ArrayList; import java.util.Date; public class DatePickerFragment extends Fragment { private static final String ARG_DATE = "date"; + private static final String ARG_FIRSTNAME = "firstName"; + private static final String ARG_LASTNAME = "lastName"; + private static final String ARG_BIRTHCITY = "birthCity"; + private static final String ARG_BIRTHDEPT = "birthDept"; + private static final String ARG_PHONES = "phoneNumbers"; + private static final String ARG_PREVIOUS_BIRTHDATE = "previousBirthDate"; private Date mDate; + private String firstName; + private String lastName; + private String birthCity; + private int birthDept; + private ArrayList<String> phoneNumbers; + private String previousBirthDate; private DatePicker datePicker; private Button validateDateButton; private Button cancelButton; @@ -27,16 +40,22 @@ public class DatePickerFragment extends Fragment { // Required empty public constructor } - public interface onUserPickingDateListener { - void onUserPickingDate(Date date); + public void onUserPickingDate(Date date, String firstName, String lastName, String birthCity, int birthDept, ArrayList<String> phoneNumbers, String previousBirthDate) { + mDate = date; + this.firstName = firstName; + this.lastName = lastName; + this.birthCity = birthCity; + this.birthDept = birthDept; + this.phoneNumbers = phoneNumbers; + this.previousBirthDate = previousBirthDate; } - public interface onDateSubmittedListener { - void onDateSubmitted(int day, int month, int year); - } + public interface onUserPickingDateListener { + void onUserPickingDate(Date date, String firstName, String lastName, String birthCity, int birthDept, ArrayList<String> phoneNumbers, String previousBirthDate); - public interface onDateCancelledListener { - void onDateCancelled(); + void onDateSubmittedListener(int day, int month, int year, String firstName, String lastName, String birthCity, int birthDept, ArrayList<String> phoneNumbers); + + void onDateCancelledListener(String firstName, String lastName, String birthCity, int birthDept, ArrayList<String> phoneNumbers, String previousBirthDate); } public static DatePickerFragment newInstance(Date date) { @@ -47,11 +66,31 @@ public class DatePickerFragment extends Fragment { return fragment; } + public static DatePickerFragment newInstance(Date date, String firstName, String lastName, String birthCity, int birthDept, ArrayList<String> phoneNumbers, String previousBirthDate) { + DatePickerFragment fragment = new DatePickerFragment(); + Bundle args = new Bundle(); + args.putLong(ARG_DATE, date.getTime()); + args.putString(ARG_FIRSTNAME, firstName); + args.putString(ARG_LASTNAME, lastName); + args.putString(ARG_BIRTHCITY, birthCity); + args.putInt(ARG_BIRTHDEPT, birthDept); + args.putStringArrayList(ARG_PHONES, phoneNumbers); + args.putString(ARG_PREVIOUS_BIRTHDATE, previousBirthDate); + fragment.setArguments(args); + return fragment; + } + @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getArguments() != null) { mDate = new Date(getArguments().getLong(ARG_DATE)); + firstName = getArguments().getString(ARG_FIRSTNAME); + lastName = getArguments().getString(ARG_LASTNAME); + birthCity = getArguments().getString(ARG_BIRTHCITY); + birthDept = getArguments().getInt(ARG_BIRTHDEPT); + phoneNumbers = getArguments().getStringArrayList(ARG_PHONES); + previousBirthDate = getArguments().getString(ARG_PREVIOUS_BIRTHDATE); } } @@ -71,23 +110,27 @@ public class DatePickerFragment extends Fragment { Bundle savedInstanceState) { // Inflate the layout for this fragment View view = inflater.inflate(R.layout.fragment_date_picker, container, false); - /* DatePicker datePicker = view.findViewById(R.id.datePicker); validateDateButton = view.findViewById(R.id.validateDateButton); - validateDateButton.setOnClickListener(() -> { - int day = datePicker.getDayOfMonth(); - int month = datePicker.getMonth() + 1; - int year = datePicker.getYear(); - - mListener.onDateSubmittedListener(day, month, year); + validateDateButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + int day = datePicker.getDayOfMonth(); + int month = datePicker.getMonth() + 1; + int year = datePicker.getYear(); + + mListener.onDateSubmittedListener(day, month, year, firstName, lastName, birthCity, birthDept, phoneNumbers); + } }); cancelButton = view.findViewById(R.id.cancel_button); - cancelButton.setOnClickListener(() -> { - mListener.onDateCancelledListener(); + cancelButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + mListener.onDateCancelledListener(firstName, lastName, birthCity, birthDept, phoneNumbers, previousBirthDate); + } }); -*/ return view; } diff --git a/app/src/main/java/fr/imt_atlantique/myfirstapplication/EditUserFragment.java b/app/src/main/java/fr/imt_atlantique/myfirstapplication/EditUserFragment.java index dfffe75..e93bccf 100644 --- a/app/src/main/java/fr/imt_atlantique/myfirstapplication/EditUserFragment.java +++ b/app/src/main/java/fr/imt_atlantique/myfirstapplication/EditUserFragment.java @@ -1,13 +1,16 @@ package fr.imt_atlantique.myfirstapplication; import android.content.Context; +import android.content.Intent; import android.content.SharedPreferences; +import android.net.Uri; import android.os.Bundle; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; import androidx.fragment.app.Fragment; + +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -18,6 +21,7 @@ import android.widget.Spinner; import android.widget.TextView; import com.google.android.material.snackbar.Snackbar; import java.util.ArrayList; +import java.util.Date; import java.util.HashSet; public class EditUserFragment extends Fragment { @@ -45,11 +49,32 @@ public class EditUserFragment extends Fragment { private OnUserInfoSubmittedListener callback; + public static EditUserFragment newInstance(int day, int month, int year, String firstName, String lastName, String birthCity, int birthDept, ArrayList<String> phoneNumbers) { + EditUserFragment fragment = new EditUserFragment(); + Bundle args = new Bundle(); + // Make the date right string format + String date = day + "/" + month + "/" + year; + args.putString(ARG_BIRTHDATE, date); + args.putString(ARG_FIRSTNAME, firstName); + args.putString(ARG_LASTNAME, lastName); + args.putString(ARG_BIRTHCITY, birthCity); + args.putInt(ARG_BIRTHDEPT, birthDept); + args.putStringArrayList(ARG_PHONES, phoneNumbers); + Log.i("Test", "Date: " + date); + fragment.setArguments(args); + return fragment; + } + + public void onDateSubmittedListener(int day, int month, int year, String firstName, String lastName, String birthCity, int birthDept, ArrayList<String> phoneNumbers) { + } + /** * Interface pour communiquer avec l'activité principale. */ public interface OnUserInfoSubmittedListener { void onUserInfoSubmitted(String firstName, String lastName, String birthCity, String birthDate, int birthDept, ArrayList<String> phoneNumbers); + + void onEditDateRequested(String birthDate, String firstName, String lastName, String birthCity, int birthDept, ArrayList<String> phoneNumbers, String previousBirthDate); } public EditUserFragment() { @@ -71,6 +96,17 @@ public class EditUserFragment extends Fragment { fragment.setArguments(args); return fragment; } + public static EditUserFragment newInstance(String firstName, String lastName, String birthCity, int birthDept, ArrayList<String> phoneNumbers) { + EditUserFragment fragment = new EditUserFragment(); + Bundle args = new Bundle(); + args.putString(ARG_FIRSTNAME, firstName); + args.putString(ARG_LASTNAME, lastName); + args.putString(ARG_BIRTHCITY, birthCity); + args.putInt(ARG_BIRTHDEPT, birthDept); + args.putStringArrayList(ARG_PHONES, phoneNumbers); + fragment.setArguments(args); + return fragment; + } @Override public void onAttach(@NonNull Context context) { @@ -85,7 +121,7 @@ public class EditUserFragment extends Fragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - restoreFromPreferences(); // Restaure les données dès la création du fragment + restoreFromPreferences(); } @Nullable @@ -111,33 +147,92 @@ public class EditUserFragment extends Fragment { toolbar.inflateMenu(R.menu.menu_main); + // Gérer les clics sur les éléments du menu + toolbar.setOnMenuItemClickListener(item -> { + if (item.getItemId() == R.id.shareAction) { + shareAction(); + return true; + } else if (item.getItemId() == R.id.wikipediaAction) { + openWikipedia(); + return true; + } else if (item.getItemId() == R.id.resetAction) { + resetAllFields(); + return true; + } + return false; + }); + if (savedInstanceState != null) { firstNameEditText.setText(savedInstanceState.getString(ARG_FIRSTNAME, "")); lastNameEditText.setText(savedInstanceState.getString(ARG_LASTNAME, "")); birthCityEditText.setText(savedInstanceState.getString(ARG_BIRTHCITY, "")); - birthDateTextView.setText(savedInstanceState.getString(ARG_BIRTHDATE, getString(R.string.pick_date_hint))); + birthDateButton.setText(savedInstanceState.getString(ARG_BIRTHDATE, getString(R.string.pick_date_hint))); birthDeptSpinner.setSelection(savedInstanceState.getInt(ARG_BIRTHDEPT, 0)); - // Restaurer la liste des numéros après rotation phoneNumbersList = savedInstanceState.getStringArrayList(ARG_PHONES); restorePhoneNumbers(); } else { firstNameEditText.setText(firstName); lastNameEditText.setText(lastName); birthCityEditText.setText(birthCity); - birthDateTextView.setText(birthDate); + birthDateButton.setText(birthDate); birthDeptSpinner.setSelection(birthDept); restorePhoneNumbers(); } + if (getArguments() != null) { + String birthDate = getArguments().getString(ARG_BIRTHDATE, getString(R.string.pick_date_hint)); + String firstName = getArguments().getString(ARG_FIRSTNAME, ""); + String lastName = getArguments().getString(ARG_LASTNAME, ""); + String birthCity = getArguments().getString(ARG_BIRTHCITY, ""); + ArrayList<String> phoneNumbersList = getArguments().getStringArrayList(ARG_PHONES); + birthDateButton.setText(birthDate); + firstNameEditText.setText(firstName); + lastNameEditText.setText(lastName); + birthCityEditText.setText(birthCity); + this.phoneNumbersList = phoneNumbersList; + restorePhoneNumbers(); + } + birthDateButton.setOnClickListener(v -> { - Snackbar.make(view, "Sélection de la date (à implémenter)", Snackbar.LENGTH_LONG).show(); + getPhoneNumbersList(); + callback.onEditDateRequested(birthDate, firstNameEditText.getText().toString(), lastNameEditText.getText().toString(), birthCityEditText.getText().toString(), birthDeptSpinner.getSelectedItemPosition(), phoneNumbersList, birthDateButton.getText().toString()); }); addPhoneButton.setOnClickListener(v -> addPhoneNumberToLayout("")); validateButton.setOnClickListener(v -> validateAction()); } + private void shareAction() { + Intent shareIntent = new Intent(Intent.ACTION_SEND); + shareIntent.setType("text/plain"); + shareIntent.putExtra(Intent.EXTRA_TEXT, birthCity); + startActivity(Intent.createChooser(shareIntent, getString(R.string.share))); + } + + private void openWikipedia() { + String url = "http://fr.wikipedia.org/?search=" + birthCity; + Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); + startActivity(browserIntent); + } + + private void resetAllFields() { + firstNameEditText.setText(""); + lastNameEditText.setText(""); + birthCityEditText.setText(""); + birthDateButton.setText(getString(R.string.pick_date_hint)); + birthDeptSpinner.setSelection(0); + while (phonesLayout.getChildCount() > 1) { + phonesLayout.removeViewAt(1); + } + + // Clear the saved preferences + SharedPreferences prefs = requireActivity().getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE); + SharedPreferences.Editor editor = prefs.edit(); + editor.clear(); + editor.apply(); + } + private void addPhoneNumberToLayout(String phoneNumber) { LayoutInflater inflater = LayoutInflater.from(getContext()); View phoneView = inflater.inflate(R.layout.phone_number_input, phonesLayout, false); @@ -151,9 +246,6 @@ public class EditUserFragment extends Fragment { phonesLayout.addView(phoneView); } - /** - * Supprime un champ numéro de téléphone. - */ private void removePhoneNumber(View phoneView) { phonesLayout.removeView(phoneView); } @@ -165,7 +257,7 @@ public class EditUserFragment extends Fragment { firstName = firstNameEditText.getText().toString().trim(); lastName = lastNameEditText.getText().toString().trim(); birthCity = birthCityEditText.getText().toString().trim(); - birthDate = birthDateTextView.getText().toString(); + birthDate = birthDateButton.getText().toString(); birthDept = birthDeptSpinner.getSelectedItemPosition(); phoneNumbersList.clear(); @@ -187,6 +279,21 @@ public class EditUserFragment extends Fragment { callback.onUserInfoSubmitted(firstName, lastName, birthCity, birthDate, birthDept, phoneNumbersList); } + private void getPhoneNumbersList() { + if (phoneNumbersList == null) { + phoneNumbersList = new ArrayList<>(); + } + phoneNumbersList.clear(); + for (int i = 1; i < phonesLayout.getChildCount(); i++) { + View phoneView = phonesLayout.getChildAt(i); + EditText phoneEditText = phoneView.findViewById(R.id.phoneNumberEditText); + String phoneNumber = phoneEditText.getText().toString(); + if (!phoneNumber.isEmpty()) { + phoneNumbersList.add(phoneNumber); + } + } + } + /** * Sauvegarde les données utilisateur dans SharedPreferences. */ @@ -234,7 +341,7 @@ public class EditUserFragment extends Fragment { outState.putString(ARG_FIRSTNAME, firstNameEditText.getText().toString()); outState.putString(ARG_LASTNAME, lastNameEditText.getText().toString()); outState.putString(ARG_BIRTHCITY, birthCityEditText.getText().toString()); - outState.putString(ARG_BIRTHDATE, birthDateTextView.getText().toString()); + outState.putString(ARG_BIRTHDATE, birthDateButton.getText().toString()); outState.putInt(ARG_BIRTHDEPT, birthDeptSpinner.getSelectedItemPosition()); // Récupérer les numéros affichés à l'écran diff --git a/app/src/main/java/fr/imt_atlantique/myfirstapplication/MainActivity.java b/app/src/main/java/fr/imt_atlantique/myfirstapplication/MainActivity.java index 45f8589..4d40888 100644 --- a/app/src/main/java/fr/imt_atlantique/myfirstapplication/MainActivity.java +++ b/app/src/main/java/fr/imt_atlantique/myfirstapplication/MainActivity.java @@ -2,6 +2,7 @@ package fr.imt_atlantique.myfirstapplication; import android.content.SharedPreferences; import android.os.Bundle; +import android.util.Log; import android.view.MenuItem; import androidx.annotation.NonNull; @@ -11,9 +12,10 @@ import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentTransaction; import java.util.ArrayList; +import java.util.Date; import java.util.HashSet; -public class MainActivity extends AppCompatActivity implements EditUserFragment.OnUserInfoSubmittedListener { +public class MainActivity extends AppCompatActivity implements EditUserFragment.OnUserInfoSubmittedListener, DatePickerFragment.onUserPickingDateListener { private static final String PREFS_NAME = "UserPrefs"; private static final String ARG_FIRSTNAME = "firstName"; @@ -79,6 +81,24 @@ public class MainActivity extends AppCompatActivity implements EditUserFragment. showDisplayFragment(firstName, lastName, birthCity, getResources().getStringArray(R.array.departments)[birthDept], birthDate, phoneNumbersList); } + /** + * Callback lorsque l'utilisateur veut modifier sa date dans `DisplayUserFragment`. + */ + @Override + public void onEditDateRequested(String birthDate, String firstName, String lastName, String birthCity, int birthDept, ArrayList<String> phoneNumbers, String previousBirthDate) { + // go to DatePickerFragment with the current date if no date is set yet or with the current date in Date format + Date date = new Date(); + if (!birthDate.equals(getString(R.string.pick_date_hint))) { + String[] dateParts = birthDate.split("/"); + date = new Date(Integer.parseInt(dateParts[2]) - 1900, Integer.parseInt(dateParts[1]) - 1, Integer.parseInt(dateParts[0])); + } + DatePickerFragment datePickerFragment = DatePickerFragment.newInstance(date, firstName, lastName, birthCity, birthDept, phoneNumbers, previousBirthDate); + getSupportFragmentManager().beginTransaction() + .replace(R.id.fragmentContainer, datePickerFragment) + .commit(); + } + + /** * Sauvegarde les informations utilisateur dans `SharedPreferences`. */ @@ -94,6 +114,34 @@ public class MainActivity extends AppCompatActivity implements EditUserFragment. editor.apply(); } - public void resetAction(MenuItem item) { + @Override + public void onUserPickingDate(Date date, String firstName, String lastName, String birthCity, int birthDept, ArrayList<String> phoneNumbers, String previousBirthDate) { + // Send the date actually picked by the user to the fragment DatePickerFragment + DatePickerFragment fragment = (DatePickerFragment) getSupportFragmentManager().findFragmentById(R.id.fragmentContainer); + assert fragment != null; + fragment.onUserPickingDate(date, firstName, lastName, birthCity, birthDept, phoneNumbers, previousBirthDate); + } + + @Override + public void onDateSubmittedListener(int day, int month, int year, String firstName, String lastName, String birthCity, int birthDept, ArrayList<String> phoneNumbers) { + // Send the date picked by the user to the fragment EditUserFragment showEditFragment(String newDate) + showEditFragment(day, month, year, firstName, lastName, birthCity, birthDept, phoneNumbers); + } + + private void showEditFragment(int day, int month, int year, String firstName, String lastName, String birthCity, int birthDept, ArrayList<String> phoneNumbers) { + EditUserFragment fragment = EditUserFragment.newInstance(day, month, year, firstName, lastName, birthCity, birthDept, phoneNumbers); + replaceFragment(fragment, false); + } + + @Override + public void onDateCancelledListener(String firstName, String lastName, String birthCity, int birthDept, ArrayList<String> phoneNumbers, String previousBirthDate) { + // cancel the date picking, go back to the previous fragment + showEditFragment(firstName, lastName, birthCity, birthDept, phoneNumbers, previousBirthDate); + } + + private void showEditFragment(String firstName, String lastName, String birthCity, int birthDept, ArrayList<String> phoneNumbers, String previousBirthDate) { + Log.i("Testsssss", "showEditFragment: " + previousBirthDate); + EditUserFragment fragment = EditUserFragment.newInstance(firstName, lastName, birthCity, previousBirthDate, birthDept, phoneNumbers); + replaceFragment(fragment, false); } } \ No newline at end of file diff --git a/app/src/main/res/menu/menu_main.xml b/app/src/main/res/menu/menu_main.xml index a2f8432..c6d99c7 100644 --- a/app/src/main/res/menu/menu_main.xml +++ b/app/src/main/res/menu/menu_main.xml @@ -1,7 +1,6 @@ <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/resetAction" - android:title="@string/reset_action" - android:onClick="resetAction"> + android:title="@string/reset_action"> </item> <item android:id="@+id/wikipediaAction" diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 50847bb..d9f53f8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -31,6 +31,4 @@ <string name="open_wikipedia">Open Wikipedia</string> <string name="share">Share</string> <string name="error_first_name_empty">The first name can not be empty.</string> - <!-- TODO: Remove or change this placeholder text --> - <string name="hello_blank_fragment">Hello blank fragment</string> </resources> \ No newline at end of file -- GitLab