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