diff --git a/app/build.gradle b/app/build.gradle index 3d4746a2a96ae1a72063eeb1bbd95788e181fae9..4fa410c417cdb634304ad51a6b164d4508dfb897 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -48,5 +48,5 @@ dependencies { implementation 'com.google.firebase:firebase-crashlytics:18.2.9' implementation 'com.google.firebase:firebase-analytics:20.1.2' implementation 'com.google.code.gson:gson:2.8.9' +} -} \ No newline at end of file diff --git a/app/src/main/java/be/lepl1509group13/workoutwarrior/AccountActivity.java b/app/src/main/java/be/lepl1509group13/workoutwarrior/AccountActivity.java index b7a65519a317aa23a9997b1fd90af3dbca849220..6239cbc32b9c52effaf1e726b791c7622949a5c2 100644 --- a/app/src/main/java/be/lepl1509group13/workoutwarrior/AccountActivity.java +++ b/app/src/main/java/be/lepl1509group13/workoutwarrior/AccountActivity.java @@ -124,11 +124,13 @@ public class AccountActivity extends AppCompatActivity implements FriendsAdapter } public void onItemClick(String friend_pseudo) { - //todo when a friend is clicked to be deleted + //When a friend is clicked to be deleted db = firebaseDb.getReference("Friends"); db.child(userPseudo).child(friend_pseudo).removeValue() .addOnSuccessListener(aVoid -> Toast.makeText(AccountActivity.this, friend_pseudo + " supprimé de vos amis !", Toast.LENGTH_SHORT).show()) .addOnFailureListener(e -> Toast.makeText(AccountActivity.this, "Une erreur est survenue !", Toast.LENGTH_SHORT).show()); + db.child(friend_pseudo).child(userPseudo).removeValue() + .addOnFailureListener(e -> Toast.makeText(AccountActivity.this, "Une erreur est survenue !", Toast.LENGTH_SHORT).show()); } private void getFriends(String pseudo) { diff --git a/app/src/main/java/be/lepl1509group13/workoutwarrior/AddFriendActivity.java b/app/src/main/java/be/lepl1509group13/workoutwarrior/AddFriendActivity.java index afeb6be4465ae8bbe35f903c20516256f88e1065..6010167ae9168bbf1278cc08b299526d9284435f 100644 --- a/app/src/main/java/be/lepl1509group13/workoutwarrior/AddFriendActivity.java +++ b/app/src/main/java/be/lepl1509group13/workoutwarrior/AddFriendActivity.java @@ -134,13 +134,19 @@ public class AddFriendActivity extends AppCompatActivity { } private void addFriendship(String userPseudo, String newFriendPseudo) { + //adding friendship to the actual user db = firebaseDb.getReference("Friends").child(userPseudo); + Map<String, Object> updateFriendship = new HashMap<>(); + updateFriendship.put(newFriendPseudo, ""); - Map<String, Object> updates = new HashMap<>(); - updates.put(newFriendPseudo, ""); + //adding friendship to the other user + DatabaseReference db2 = firebaseDb.getReference("Friends").child(newFriendPseudo); + Map<String, Object> updateFriendshipToNewFriend = new HashMap<>(); + updateFriendshipToNewFriend.put(userPseudo, ""); try { - db.updateChildren(updates); + db.updateChildren(updateFriendship); + db2.updateChildren(updateFriendshipToNewFriend); Toast.makeText(AddFriendActivity.this, "Ami ajouté !", Toast.LENGTH_SHORT).show(); resetFirebaseQuery(); finish(); diff --git a/app/src/main/java/be/lepl1509group13/workoutwarrior/ListExercicesAdapter.java b/app/src/main/java/be/lepl1509group13/workoutwarrior/ListExercicesAdapter.java index 78804c5b4d3d23d1d7e5cad6689e1d85dba47b54..ef09429ebea10ab6efbf4d1e57e01cb0a9c32460 100644 --- a/app/src/main/java/be/lepl1509group13/workoutwarrior/ListExercicesAdapter.java +++ b/app/src/main/java/be/lepl1509group13/workoutwarrior/ListExercicesAdapter.java @@ -1,24 +1,51 @@ package be.lepl1509group13.workoutwarrior; +import be.lepl1509group13.workoutwarrior.ProgramCreationActivity; +import android.app.Dialog; import android.content.Context; import android.graphics.drawable.Drawable; +import android.text.InputType; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; +import android.widget.Button; +import android.widget.CheckBox; +import android.widget.CompoundButton; +import android.widget.EditText; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; +import androidx.constraintlayout.widget.ConstraintLayout; + import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; import java.util.Iterator; import java.util.Map; +import be.lepl1509group13.workoutwarrior.ProgramCreationActivity; + public class ListExercicesAdapter extends ArrayAdapter<String> { private final Context context; private ArrayList<String> values; + public Exercise actual_exo ; + public String img_actual_exo; + HashMap<Exercise, ArrayList<String>> program = new HashMap<>(); + + String name_exo; + String description_exo; + Long timer_exo; + Long break_exo; + ArrayList<String> days_exo = new ArrayList<String>(); + CheckBox cb_lundi, cb_mardi, cb_mercredi, cb_jeudi, cb_vendredi, cb_samedi, cb_dimanche; + private ArrayList<CheckBox> cb_list = new ArrayList<>(); + private ArrayList<String> current_days_checked = new ArrayList<>(); + Integer nbre_day = 0; + public ListExercicesAdapter(Context context, ArrayList<String> values) { super(context, R.layout.exercises_list_row, values); this.context = context; @@ -40,102 +67,198 @@ public class ListExercicesAdapter extends ArrayAdapter<String> { ProgramCreationActivity activity = (ProgramCreationActivity) context; - System.out.println("values : " + values); String exercise = values.get(position); - String training_days = ""; + final String[] training_days = {""}; Drawable delete_cross = context.getResources().getDrawable(R.drawable.cross_mark); Drawable pen = context.getResources().getDrawable(R.drawable.edit); // Get training days for this exercise for (Map.Entry<Exercise, ArrayList<String>> set : activity.program.entrySet()) { - System.out.println(set.getKey().name); if (set.getKey().name == exercise) { - training_days = ""; + training_days[0] = ""; for (String day : set.getValue()) { - training_days += getShortDayName(day) + ", "; + training_days[0] += getShortDayName(day) + " "; } } } - training_days = training_days.substring(0, training_days.length() - 2); - - System.out.println("training days : " + training_days); + training_days[0] = training_days[0].substring(0, training_days[0].length() - 2); // Display texts and images in Views delete_button.setImageDrawable(delete_cross); edit_button.setImageDrawable(pen); exercise_name.setText(exercise); - training_daysView.setText(training_days); - - + training_daysView.setText(training_days[0]); // Ecouteur de clics pour chaque élément de la ListView edit_button.setOnClickListener(view -> { - /* - System.out.println("details : " + activity.program); - AlertDialog.Builder builder = new AlertDialog.Builder(view.getContext()); - View dialogView = inflater.inflate(R.layout.edit_workout, null); - builder.setView(dialogView); - AlertDialog dialog = builder.create(); - dialog.show(); - - - TextView exerciseName = dialogView.findViewById(R.id.exercise_name); - exerciseName.setText(exercise); - - // Rechercher l'exercice dans la HashMap - ArrayList<Exercise> exercises = activity.exoDetailsForEachDay.get(activity.current_day_displayed); - String imageUrl; - String description; - for (Exercise exo : exercises) { - if (Objects.equals(exo.name, exercise)) { - - // Afficher les détails de l'exo - imageUrl = exo.image_url; - ImageView imageView = dialogView.findViewById(R.id.exercise_image); - int resourceId = context.getResources().getIdentifier(imageUrl, "drawable", context.getPackageName()); - imageView.setImageResource(resourceId); - - TextView descriptionTextView = dialogView.findViewById(R.id.description_edit); - descriptionTextView.setText(exo.description); - - - TextView break_time_TextView = dialogView.findViewById(R.id.pause_edit); - break_time_TextView.setText(String.valueOf(exo.breakVal/1000)); + current_days_checked = new ArrayList<String>(); + nbre_day = 0; + days_exo = new ArrayList<>(); + for (Map.Entry<Exercise, ArrayList<String>> set : activity.program.entrySet()) { + if (set.getKey().name == exercise) { + for (String day : set.getValue()) { + if(!days_exo.contains(day)){ + days_exo.add(day); + } + } + name_exo = set.getKey().name; + description_exo = set.getKey().description; + timer_exo = Long.valueOf(set.getKey().timer); + break_exo = Long.valueOf(set.getKey().breakVal); + img_actual_exo = set.getKey().image_url; + } + } + Dialog dialog = new Dialog(this.context); + dialog.setContentView(R.layout.modify_exercice_popup); + + ImageView closeButton = dialog.findViewById(R.id.close_btn); + closeButton.setOnClickListener(w -> dialog.dismiss()); + cb_lundi = dialog.findViewById(R.id.checkbox_monday); + cb_mardi = dialog.findViewById(R.id.checkbox_tuesday); + cb_mercredi = dialog.findViewById(R.id.checkbox_wednesday); + cb_jeudi = dialog.findViewById(R.id.checkbox_thursday); + cb_vendredi = dialog.findViewById(R.id.checkbox_friday); + cb_samedi = dialog.findViewById(R.id.checkbox_saturday); + cb_dimanche = dialog.findViewById(R.id.checkbox_sunday); + + cb_list.add(cb_lundi); + cb_list.add(cb_mardi); + cb_list.add(cb_mercredi); + cb_list.add(cb_jeudi); + cb_list.add(cb_vendredi); + cb_list.add(cb_samedi); + cb_list.add(cb_dimanche); + + for(int i = 0; i < days_exo.size(); i++){ + if(days_exo.get(i).equals("lundi")){ + cb_lundi.setChecked(true); + current_days_checked.add(days_exo.get(i)); + nbre_day += 1; + } + if(days_exo.get(i).equals("mardi")){ + cb_mardi.setChecked(true); + current_days_checked.add(days_exo.get(i)); + nbre_day += 1; + } + if(days_exo.get(i).equals("mercredi")){ + cb_mercredi.setChecked(true); + current_days_checked.add(days_exo.get(i)); + nbre_day += 1; + } + if(days_exo.get(i).equals("jeudi")){ + cb_jeudi.setChecked(true); + current_days_checked.add(days_exo.get(i)); + nbre_day += 1; + } + if(days_exo.get(i).equals("vendredi")){ + cb_vendredi.setChecked(true); + current_days_checked.add(days_exo.get(i)); + nbre_day += 1; + } + if(days_exo.get(i).equals("samedi")){ + cb_samedi.setChecked(true); + current_days_checked.add(days_exo.get(i)); + nbre_day += 1; + } + if(days_exo.get(i).equals("dimanche")){ + cb_dimanche.setChecked(true); + current_days_checked.add(days_exo.get(i)); + nbre_day += 1; } } - // Enregistrer les modifications de l'exercice - Button save_btn = dialogView.findViewById(R.id.save_modif_button); - save_btn.setOnClickListener(v -> { - EditText description_edit = dialogView.findViewById(R.id.description_edit); - EditText break_time_edit = dialogView.findViewById(R.id.pause_edit); - - String new_description = description_edit.getText().toString(); - int new_break_time = Integer.parseInt(break_time_edit.getText().toString()); + for (CheckBox cb : cb_list) cb.setOnCheckedChangeListener(myCheckBoxListener); + ConstraintLayout form_layout = dialog.findViewById(R.id.constraintLayout2); - // Rechercher l'exercice dans la HashMap et modifier ces paramètres + EditText description_text = dialog.findViewById(R.id.exercise_description); + EditText timer_edit = dialog.findViewById(R.id.exercise_timer); + EditText break_edit = dialog.findViewById(R.id.exercice_break); + TextView timer_text = dialog.findViewById(R.id.timer_text); + if(description_exo != null){ + description_text.setText(description_exo); + } + if(timer_exo == 0){ + timer_edit.setVisibility(View.INVISIBLE); + timer_edit.setEnabled(false); + timer_text.setText(""); + }else{ + timer_edit.setText(timer_exo.toString()); + } + if(break_exo != null){ + break_edit.setText(break_exo.toString()); + } - for (Exercise exo : exercises) { - if (Objects.equals(exo.name, exercise)) { - exo.description = new_description; - exo.breakVal = new_break_time * 1000; + dialog.show(); + Button save_btn = dialog.findViewById(R.id.btn_save_modif); + save_btn.setOnClickListener(w -> { + if(nbre_day > 0){ + String description_str = description_text.getText().toString(); + String string_break = break_edit.getText().toString(); + Integer break_time = Integer.parseInt(string_break); + String string_timer = timer_edit.getText().toString(); + if(string_timer.equals("")){ + actual_exo = new Exercise(name_exo, description_str, break_time, "@drawable/developpe_couche_barre", 0); + }else{ + Integer timer_int = Integer.parseInt(string_timer); + actual_exo = new Exercise(name_exo, description_str, break_time, "@drawable/developpe_couche_barre", timer_int); + } + Iterator<Map.Entry<Exercise, ArrayList<String>>> iterator = activity.program.entrySet().iterator(); + while (iterator.hasNext()) { + Map.Entry<Exercise, ArrayList<String>> entry = iterator.next(); + Exercise key = entry.getKey(); + if (key.name.equals(exercise)) { + key.description = description_str; + key.breakVal = break_time; + key.timer = Math.toIntExact(timer_exo); + } + for (Map.Entry<Exercise, ArrayList<String>> set : activity.program.entrySet()) { + if (set.getKey().name == exercise) { + set.setValue(current_days_checked); + } + } } + for (Map.Entry<Exercise, ArrayList<String>> set : activity.program.entrySet()) { + if (set.getKey().name == exercise) { + training_days[0] = ""; + for (String day : set.getValue()) { + training_days[0] += getShortDayName(day) + " "; + } + } + } + training_daysView.setText(training_days[0]); + dialog.dismiss(); } - activity.exoDetailsForEachDay.put(activity.current_day_displayed, exercises); - System.out.println("details : " + activity.exoDetailsForEachDay); - Toast.makeText(context, "Modifications sauvegardées", Toast.LENGTH_SHORT).show(); - dialog.dismiss(); - + else{ + Toast.makeText(this.context, "Veuillez sélectionner au moins un jour !", + Toast.LENGTH_SHORT).show(); + } + }); + form_layout.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (description_text.hasFocus()) { + description_text.clearFocus(); + } + } }); - ImageView closeButton = dialogView.findViewById(R.id.close_btn); - closeButton.setOnClickListener(v -> { - // Fermer la pop-up - dialog.dismiss(); + description_text.setOnFocusChangeListener(new View.OnFocusChangeListener() { + @Override + public void onFocusChange(View v, boolean hasFocus) { + if (!hasFocus) { + description_text.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES); + } else { + description_text.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_MULTI_LINE | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES); + } + } }); - */ + TextView name_exercice = dialog.findViewById(R.id.exercice_to_modify_name); + name_exercice.setText(name_exo); + int resId = context.getResources().getIdentifier(img_actual_exo, "drawable", context.getPackageName()); + ImageView image = dialog.findViewById(R.id.exercice_to_modify_image); + image.setImageResource(resId); }); // Ajouter un OnClickListener à l'image @@ -152,8 +275,6 @@ public class ListExercicesAdapter extends ArrayAdapter<String> { } } - - ArrayList<String> updatedExercicesList = new ArrayList<>(); for (Map.Entry<Exercise, ArrayList<String>> set : activity.program.entrySet()) { updatedExercicesList.add(set.getKey().name); @@ -171,11 +292,6 @@ public class ListExercicesAdapter extends ArrayAdapter<String> { this.values.clear(); this.values.addAll(exercices); notifyDataSetChanged(); - System.out.println("values : " + values); - } - - private void save_workout_details() { - } String getShortDayName(String day) { @@ -189,7 +305,71 @@ public class ListExercicesAdapter extends ArrayAdapter<String> { else throw new IllegalArgumentException(); } - + public CompoundButton.OnCheckedChangeListener myCheckBoxListener = + new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + if (buttonView == cb_lundi) { + if(current_days_checked.contains("lundi")){ + current_days_checked.remove("lundi"); + nbre_day -= 1; + }else{ + current_days_checked.add("lundi"); + nbre_day += 1; + } + } else if (buttonView == cb_mardi) { + if(current_days_checked.contains("mardi")){ + current_days_checked.remove("mardi"); + nbre_day -= 1; + }else{ + current_days_checked.add("mardi"); + nbre_day += 1; + } + } else if (buttonView == cb_mercredi) { + if(current_days_checked.contains("mercredi")){ + current_days_checked.remove("mercredi"); + nbre_day -= 1; + }else{ + current_days_checked.add("mercredi"); + nbre_day += 1; + } + } else if (buttonView == cb_jeudi) { + if(current_days_checked.contains("jeudi")){ + current_days_checked.remove("jeudi"); + nbre_day -= 1; + }else{ + current_days_checked.add("jeudi"); + nbre_day += 1; + } + } else if (buttonView == cb_vendredi) { + if(current_days_checked.contains("vendredi")){ + current_days_checked.remove("vendredi"); + nbre_day -= 1; + }else{ + current_days_checked.add("vendredi"); + nbre_day += 1; + } + } else if (buttonView == cb_samedi) { + if(current_days_checked.contains("samedi")){ + current_days_checked.remove("samedi"); + nbre_day -= 1; + }else{ + current_days_checked.add("samedi"); + nbre_day += 1; + } + } else if (buttonView == cb_dimanche) { + if(current_days_checked.contains("dimanche")){ + current_days_checked.remove("dimanche"); + nbre_day -= 1; + }else{ + current_days_checked.add("dimanche"); + nbre_day += 1; + } + //for (CheckBox cb : cb_list) if (!Objects.equals(cb, cb_dimanche)) cb.setChecked(false); + } + System.out.println(current_days_checked); + } + }; } diff --git a/app/src/main/java/be/lepl1509group13/workoutwarrior/MainActivity.java b/app/src/main/java/be/lepl1509group13/workoutwarrior/MainActivity.java index b36f6bdb4d896417cf37344ff4ce22acfd3f7a43..3dc86ff586d586f69dcb1418e4daae0141a7d1a6 100644 --- a/app/src/main/java/be/lepl1509group13/workoutwarrior/MainActivity.java +++ b/app/src/main/java/be/lepl1509group13/workoutwarrior/MainActivity.java @@ -1,33 +1,44 @@ package be.lepl1509group13.workoutwarrior; +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.os.Bundle; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.Button; +import android.widget.ImageButton; +import android.widget.TextView; +import android.widget.Toast; + import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; import androidx.annotation.NonNull; +import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; import androidx.core.view.GravityCompat; import androidx.drawerlayout.widget.DrawerLayout; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; -import android.annotation.SuppressLint; -import android.content.Intent; -import android.os.Bundle; -import android.view.View; -import android.widget.ImageButton; -import android.widget.TextView; -import android.widget.Toast; - import com.google.android.material.navigation.NavigationView; +import com.google.firebase.auth.FirebaseAuth; +import com.google.firebase.auth.FirebaseUser; import com.google.firebase.database.DataSnapshot; import com.google.firebase.database.DatabaseError; import com.google.firebase.database.DatabaseReference; import com.google.firebase.database.FirebaseDatabase; import com.google.firebase.database.ValueEventListener; +import com.google.gson.Gson; import java.io.File; import java.io.FileInputStream; +import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; @@ -41,6 +52,7 @@ public class MainActivity extends AppCompatActivity implements MainAdapter.OnIte private final FirebaseDatabase firebaseDb = FirebaseDatabase.getInstance(); private DatabaseReference db; + private FirebaseAuth mAuth; private Integer numberOfProgramsToDisplay = 0, totalNumberOfCustomPrograms = 0; private boolean needsRefresh = false; @@ -51,6 +63,9 @@ public class MainActivity extends AppCompatActivity implements MainAdapter.OnIte setContentView(R.layout.activity_main); getSupportActionBar().hide(); + mAuth = FirebaseAuth.getInstance(); + FirebaseUser currentUser = mAuth.getCurrentUser(); + db = firebaseDb.getReference("Programs"); getProgramData(); @@ -74,6 +89,9 @@ public class MainActivity extends AppCompatActivity implements MainAdapter.OnIte drawerLayout.closeDrawer(GravityCompat.START); return false; }); + + //check if any programs were shared by friends + getUserPseudo(currentUser); } @Override @@ -242,4 +260,176 @@ public class MainActivity extends AppCompatActivity implements MainAdapter.OnIte }); } + private void getSharedPrograms(String currentUser) { + db = firebaseDb.getReference("Shared_program"); + db.addValueEventListener(new ValueEventListener() { + @SuppressLint("SetTextI18n") + @Override + public void onDataChange(DataSnapshot dataSnapshot) { + DataSnapshot firstChild = dataSnapshot.child(currentUser); + for (DataSnapshot childData: firstChild.getChildren()) { + + for(DataSnapshot realData : firstChild.child(childData.getKey()).getChildren()){ + + //aled + String dataFromDB = realData.getValue(String.class); + + Gson gson = new Gson(); + HashMap<String, ArrayList<Exercise>> programByDay = gson.fromJson(dataFromDB, HashMap.class); + + androidx.appcompat.app.AlertDialog.Builder builder = new androidx.appcompat.app.AlertDialog.Builder(MainActivity.this); + LayoutInflater inflater = getLayoutInflater(); + View dialogView = inflater.inflate(R.layout.shared_workout_popup, null); + TextView title = dialogView.findViewById(R.id.share_popup_title); + title.setText(childData.getKey() + " a partagé avec vous son programme personnel."); + TextView description = dialogView.findViewById(R.id.share_popup_description); + description.setText("Voulez-vous l'accepter ?"); + builder.setView(dialogView); + + builder.setPositiveButton("J'accepte", (dialog, which) -> + addNewCustomWorkout(childData.getKey(), programByDay)); + builder.setNegativeButton("Je refuse", (dialog, which) -> + Log.d("MainActivity", "Cancel workout share with: " + childData.getKey())); + + AlertDialog dialog = builder.create(); + dialog.setOnShowListener(new DialogInterface.OnShowListener() { + @Override + public void onShow(DialogInterface dialog) { + Button positiveButton = ((AlertDialog) dialog).getButton(DialogInterface.BUTTON_POSITIVE); + positiveButton.setTextColor(getResources().getColor(R.color.green)); + Button negativeButton = ((AlertDialog) dialog).getButton(DialogInterface.BUTTON_NEGATIVE); + negativeButton.setTextColor(getResources().getColor(R.color.black)); + } + }); + dialog.show(); + + } + } + } + + @Override + public void onCancelled(DatabaseError databaseError) { + Toast.makeText(MainActivity.this, "Une erreur est survenue !", Toast.LENGTH_SHORT).show(); + } + }); + } + + private void getUserPseudo(FirebaseUser currentUser) { + if(currentUser != null){ + db = firebaseDb.getReference("Account_pseudo"); + db.addValueEventListener(new ValueEventListener() { + @Override + public void onDataChange(@NonNull DataSnapshot dataSnapshot) { + for (DataSnapshot childSnapshot: dataSnapshot.getChildren()) { + String userKey = childSnapshot.getKey(); + String pseudo = childSnapshot.getValue(String.class); + if(Objects.equals(userKey, currentUser.getUid())){ + db = firebaseDb.getReference("Friends"); + getSharedPrograms(pseudo); + return; + } + } + } + + @Override + public void onCancelled(@NonNull DatabaseError error) { + Toast.makeText(MainActivity.this, "Une erreur est survenue !", Toast.LENGTH_SHORT).show(); + } + }); + } + } + + private void addNewCustomWorkout(String username, HashMap<String, ArrayList<Exercise>> programByDay) { + /* + Log.d("NOP", "user: " + username); + Log.d("NOP", "data: " + programByDay); + + Log.d("TAG", "addNewCustomWorkout: " + programByDay.get("lundi")); + + + String lundiString = null, lundiSubstring, mardiString = null, mardiSubstring, mercrediString = null, mercrediSubstring, jeudiString = null, jeudiSubstring, + vendrediString = null, vendrediSubstring, samediString = null, samediSubstring, dimancheString = null, dimancheSubstring; + + ArrayList<Exercise> lundi = programByDay.get("lundi"); + if(!lundi.isEmpty()){ + lundiSubstring = lundi.toString().substring(lundi.toString().indexOf("name=") + 5, lundi.toString().indexOf(", timer")); + lundiString = lundiSubstring.trim().replaceAll("^\"|\"$", ""); + } + + ArrayList<Exercise> mardi = programByDay.get("mardi"); + if(!mardi.isEmpty()){ + mardiSubstring = mardi.toString().substring(mardi.toString().indexOf("name=") + 5, mardi.toString().indexOf(", timer")); + mardiString = mardiSubstring.trim().replaceAll("^\"|\"$", ""); + } + + ArrayList<Exercise> mercredi = programByDay.get("mercredi"); + if(!mercredi.isEmpty()){ + mercrediSubstring = mercredi.toString().substring(mercredi.toString().indexOf("name=") + 5, mercredi.toString().indexOf(", timer")); + mercrediString = mercrediSubstring.trim().replaceAll("^\"|\"$", ""); + } + + ArrayList<Exercise> jeudi = programByDay.get("jeudi"); + if(!jeudi.isEmpty()){ + jeudiSubstring = jeudi.toString().substring(jeudi.toString().indexOf("name=") + 5, jeudi.toString().indexOf(", timer")); + jeudiString = jeudiSubstring.trim().replaceAll("^\"|\"$", ""); + } + + ArrayList<Exercise> vendredi = programByDay.get("vendredi"); + if(!vendredi.isEmpty()){ + vendrediSubstring = vendredi.toString().substring(vendredi.toString().indexOf("name=") + 5, vendredi.toString().indexOf(", timer")); + vendrediString = vendrediSubstring.trim().replaceAll("^\"|\"$", ""); + } + + ArrayList<Exercise> samedi = programByDay.get("samedi"); + if(!samedi.isEmpty()){ + samediSubstring = samedi.toString().substring(samedi.toString().indexOf("name=") + 5, samedi.toString().indexOf(", timer")); + samediString = samediSubstring.trim().replaceAll("^\"|\"$", ""); + } + + ArrayList<Exercise> dimanche = programByDay.get("dimanche"); + if(dimanche.isEmpty()){ + dimancheSubstring = dimanche.toString().substring(dimanche.toString().indexOf("name=") + 5, dimanche.toString().indexOf(", timer")); + dimancheString = dimancheSubstring.trim().replaceAll("^\"|\"$", ""); + } + + + //String inputString = "[{breakVal=60.0, description=Répétitions : 4x10, image_url=@drawable/developpe_couche_barre, name=Développé couché, timer=0.0, workingDays=[]}]"; + + System.out.println(lundiString); // Output: Développé couché + System.out.println(mardiString); // Output: Développé couché + System.out.println(mercrediString); // Output: Développé couché + System.out.println(jeudiString); // Output: Développé couché + System.out.println(vendrediString); // Output: Développé couché + System.out.println(samediString); // Output: Développé couché + System.out.println(dimancheString); // Output: Développé couché + + ArrayList<Exercise> newLundi = new ArrayList<>(); + newLundi.add(new Exercise(lundiString, "fff", 10, "ah oue", 10)); + + programByDay.clear(); + programByDay.put("lundi", newLundi); + + + try { + String programpath = username + ".ser"; + + HashMap<String, ArrayList<Exercise>> entry = programByDay; + ExerciseEntry exerciseEntry = new ExerciseEntry(entry); + FileOutputStream fileOutputStream = openFileOutput(programpath, Context.MODE_PRIVATE); + ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream); + objectOutputStream.writeObject(exerciseEntry); + objectOutputStream.close(); + fileOutputStream.close(); + + //todo + //Tell the mainActivity to refresh, to add the new program + //setResult(1); + Toast.makeText(MainActivity.this, "Programme enregistré !", + Toast.LENGTH_SHORT).show(); + } catch (Exception e) { + e.printStackTrace(); + } + + */ + } } \ No newline at end of file diff --git a/app/src/main/java/be/lepl1509group13/workoutwarrior/ProgramCreationActivity.java b/app/src/main/java/be/lepl1509group13/workoutwarrior/ProgramCreationActivity.java index 7c2fc9746671ac58beac174cf7e580cfc7db30ab..3ba18fec415a1645667c25f00c5f89375fadca87 100644 --- a/app/src/main/java/be/lepl1509group13/workoutwarrior/ProgramCreationActivity.java +++ b/app/src/main/java/be/lepl1509group13/workoutwarrior/ProgramCreationActivity.java @@ -7,6 +7,7 @@ import android.graphics.Color; import android.graphics.Typeface; import android.os.Bundle; import android.provider.ContactsContract; +import android.text.InputType; import android.widget.AdapterView; import android.content.Context; import android.os.Bundle; @@ -30,6 +31,7 @@ import android.widget.AutoCompleteTextView; import androidx.annotation.NonNull; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; +import androidx.constraintlayout.widget.ConstraintLayout; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -55,6 +57,7 @@ import java.io.Serializable; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Objects; @@ -66,9 +69,11 @@ public class ProgramCreationActivity extends AppCompatActivity { // Déclaration variables AutoCompleteTextView input_exo; // Champ de texte pour rechercher les exercices + Integer nbre_day = 0; // Liste d'exos dynamique à remplir depuis la DB public Exercise actual_exo ; public String img_actual_exo; + private static ArrayList<String> EXOS = new ArrayList<>(); // Liste des exercices de la base de données CheckBox cb_lundi, cb_mardi, cb_mercredi, cb_jeudi, cb_vendredi, cb_samedi, cb_dimanche; private ArrayList<CheckBox> cb_list = new ArrayList<>(); @@ -83,7 +88,8 @@ public class ProgramCreationActivity extends AppCompatActivity { ListExercicesAdapter exercisesListAdapter; - + String descriptionText; + Long break_time; @Override protected void onCreate(Bundle savedInstanceState) { @@ -92,9 +98,6 @@ public class ProgramCreationActivity extends AppCompatActivity { getSupportActionBar().hide(); //init_days_TextView(); - - - db = firebaseDb.getReference("Workouts"); get_DB_Exercices(); @@ -130,12 +133,11 @@ public class ProgramCreationActivity extends AppCompatActivity { // Ajoute l'exo dans la HashMap (en mémoire) et dans la ListView (sur la page) quand l'utilisateur appuie sur le bouton "ajouter" addExerciceListener(); - // Sauvegarde du programme saveProgramListener(); } - private void helpButtonListener(){ + public void helpButtonListener(){ help_creation_program = findViewById(R.id.help_program_creation); help_creation_program.setOnClickListener(v -> { AlertDialog.Builder builder = new AlertDialog.Builder(ProgramCreationActivity.this); @@ -151,47 +153,65 @@ public class ProgramCreationActivity extends AppCompatActivity { }); } - private void saveProgramListener(){ + public void saveProgramListener(){ Button save_btn = findViewById((R.id.save_button)); save_btn.setOnClickListener(v -> { - convertToProgramByDay(); - - try { - // recup le nom de programme comme nom de fichier -> nomdeprogramme.ser - EditText programNameEditText = findViewById(R.id.program_name); - String programName = programNameEditText.getText().toString(); - String programpath = programName + ".ser"; - - // place le HashMap du programme dans nomdeprogramme.ser - HashMap<String, ArrayList<Exercise>> entry = programByDay; - ExerciseEntry exerciseEntry = new ExerciseEntry(entry); - FileOutputStream fileOutputStream = openFileOutput(programpath, Context.MODE_PRIVATE); - ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream); - objectOutputStream.writeObject(exerciseEntry); - objectOutputStream.close(); - fileOutputStream.close(); - - //Tell the mainActivity to refresh, to add the new program - setResult(1); - Toast.makeText(ProgramCreationActivity.this, "Programme enregistré !", + + EditText program_name = findViewById(R.id.program_name); + String program_name_str = program_name.getText().toString(); + if(program_name_str.equals("")){ + Toast.makeText(ProgramCreationActivity.this, "Veuillez entrer un nom à votre programme !", Toast.LENGTH_SHORT).show(); - } catch (Exception e) { - e.printStackTrace(); + } + else{ + convertToProgramByDay(); + boolean all_empty = true; + for (ArrayList<Exercise> valeurs : programByDay.values()) { + if (!valeurs.isEmpty()) { + all_empty = false; + break; + } + } + if(all_empty){ + Toast.makeText(ProgramCreationActivity.this, "Veuillez entrer au moins un exercice à votre programme !", + Toast.LENGTH_SHORT).show(); + }else{ + try { + // recup le nom de programme comme nom de fichier -> nomdeprogramme.ser + EditText programNameEditText = findViewById(R.id.program_name); + String programName = programNameEditText.getText().toString(); + String programpath = programName + ".ser"; + + // place le HashMap du programme dans nomdeprogramme.ser + HashMap<String, ArrayList<Exercise>> entry = programByDay; + ExerciseEntry exerciseEntry = new ExerciseEntry(entry); + FileOutputStream fileOutputStream = openFileOutput(programpath, Context.MODE_PRIVATE); + ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream); + objectOutputStream.writeObject(exerciseEntry); + objectOutputStream.close(); + fileOutputStream.close(); + + //Tell the mainActivity to refresh, to add the new program + setResult(1); + Toast.makeText(ProgramCreationActivity.this, "Programme enregistré !", + Toast.LENGTH_SHORT).show(); + } catch (Exception e) { + e.printStackTrace(); + } + } } }); } - - - - private void addExerciceListener() { + public void addExerciceListener() { /** * Ajoute un exercice au jour courant dans la HashMap programByDay et dans la ListView exos_current_day */ Button add_exo_button = findViewById(R.id.add_exo_button); add_exo_button.setOnClickListener(v -> { current_days_checked.clear(); + nbre_day = 0; // Récupérer la valeur du champ de texte AutoCompleteTextView String exercise_searched = input_exo.getText().toString(); @@ -230,7 +250,7 @@ public class ProgramCreationActivity extends AppCompatActivity { for (DataSnapshot snapshot : dataSnapshot.getChildren()) { Long timer = (snapshot.child("timer").getValue(Long.class))/1000; img_actual_exo = snapshot.child("image_url").getValue(String.class); - Long break_time = (snapshot.child("break").getValue(Long.class))/1000; + break_time = (snapshot.child("break").getValue(Long.class))/1000; String description = snapshot.child("description").getValue(String.class); EditText description_text = dialog.findViewById(R.id.exercise_description); @@ -238,6 +258,27 @@ public class ProgramCreationActivity extends AppCompatActivity { TextView timer_text = dialog.findViewById(R.id.timer_text); TextView break_text = dialog.findViewById(R.id.exercice_break); + ConstraintLayout form_layout = dialog.findViewById(R.id.constraintLayout2); + form_layout.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (description_text.hasFocus()) { + description_text.clearFocus(); + } + } + }); + + description_text.setOnFocusChangeListener(new View.OnFocusChangeListener() { + @Override + public void onFocusChange(View v, boolean hasFocus) { + if (!hasFocus) { + description_text.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES); + } else { + description_text.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_MULTI_LINE | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES); + } + } + }); + if(description != null){ description_text.setText(description); } @@ -260,93 +301,110 @@ public class ProgramCreationActivity extends AppCompatActivity { @Override public void onCancelled(@NonNull DatabaseError databaseError) { System.out.println(databaseError); - } - }); - - + } + }); - ImageView closeButton = dialog.findViewById(R.id.close_btn); - closeButton.setOnClickListener(w -> dialog.dismiss()); + ImageView closeButton = dialog.findViewById(R.id.close_btn); + closeButton.setOnClickListener(w -> dialog.dismiss()); - TextView name_exercice = dialog.findViewById(R.id.exercice_to_modify_name); - name_exercice.setText(exercise_searched); + TextView name_exercice = dialog.findViewById(R.id.exercice_to_modify_name); + name_exercice.setText(exercise_searched); - Button save_btn = dialog.findViewById(R.id.btn_save_modif); - save_btn.setOnClickListener(w -> { - EditText description_text = dialog.findViewById(R.id.exercise_description); - String description_str = description_text.getText().toString(); + Button save_btn = dialog.findViewById(R.id.btn_save_modif); + save_btn.setOnClickListener(w -> { + if(nbre_day > 0){ + EditText description_text = dialog.findViewById(R.id.exercise_description); + String description_str = description_text.getText().toString(); - EditText break_text = dialog.findViewById(R.id.exercice_break); - String string_break = break_text.getText().toString(); - Integer break_time = Integer.parseInt(string_break); + EditText break_text = dialog.findViewById(R.id.exercice_break); + String string_break = break_text.getText().toString(); + Integer break_time = Integer.parseInt(string_break); - EditText timer_edit = dialog.findViewById(R.id.exercise_timer); - String string_timer = timer_edit.getText().toString(); - if(string_timer.equals("")){ - actual_exo = new Exercise(exercise_searched, description_str, break_time, "@drawable/developpe_couche_barre", 0); - }else{ - Integer timer_int = Integer.parseInt(string_timer); - actual_exo = new Exercise(exercise_searched, description_str, break_time, "@drawable/developpe_couche_barre", timer_int); + EditText timer_edit = dialog.findViewById(R.id.exercise_timer); + String string_timer = timer_edit.getText().toString(); + String img = "@drawable/"+img_actual_exo; + if(string_timer.equals("")){ + actual_exo = new Exercise(exercise_searched, description_str, break_time, img, 0); + }else{ + Integer timer_int = Integer.parseInt(string_timer); + actual_exo = new Exercise(exercise_searched, description_str, break_time, img, timer_int); + } + addToProgram(actual_exo, new ArrayList<>(current_days_checked)); + dialog.dismiss(); + // Effacer le champ de texte AutoCompleteTextView + input_exo.setText(""); + } + else{ + Toast.makeText(ProgramCreationActivity.this, "Veuillez sélectionner au moins un jour !", + Toast.LENGTH_SHORT).show(); } - addToProgram(actual_exo, new ArrayList<>(current_days_checked)); - dialog.dismiss(); }); - - // Effacer le champ de texte AutoCompleteTextView - input_exo.setText(""); } }); } - private CompoundButton.OnCheckedChangeListener myCheckBoxListener = + public CompoundButton.OnCheckedChangeListener myCheckBoxListener = new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (buttonView == cb_lundi) { if(current_days_checked.contains("lundi")){ current_days_checked.remove("lundi"); + nbre_day -= 1; }else{ current_days_checked.add("lundi"); + nbre_day += 1; } } else if (buttonView == cb_mardi) { if(current_days_checked.contains("mardi")){ current_days_checked.remove("mardi"); + nbre_day -= 1; }else{ current_days_checked.add("mardi"); + nbre_day += 1; } } else if (buttonView == cb_mercredi) { if(current_days_checked.contains("mercredi")){ current_days_checked.remove("mercredi"); + nbre_day -= 1; }else{ current_days_checked.add("mercredi"); + nbre_day += 1; } } else if (buttonView == cb_jeudi) { if(current_days_checked.contains("jeudi")){ current_days_checked.remove("jeudi"); + nbre_day -= 1; }else{ current_days_checked.add("jeudi"); + nbre_day += 1; } } else if (buttonView == cb_vendredi) { if(current_days_checked.contains("vendredi")){ current_days_checked.remove("vendredi"); + nbre_day -= 1; }else{ current_days_checked.add("vendredi"); + nbre_day += 1; } } else if (buttonView == cb_samedi) { if(current_days_checked.contains("samedi")){ current_days_checked.remove("samedi"); + nbre_day -= 1; }else{ current_days_checked.add("samedi"); + nbre_day += 1; } } else if (buttonView == cb_dimanche) { if(current_days_checked.contains("dimanche")){ current_days_checked.remove("dimanche"); + nbre_day -= 1; }else{ current_days_checked.add("dimanche"); + nbre_day += 1; } //for (CheckBox cb : cb_list) if (!Objects.equals(cb, cb_dimanche)) cb.setChecked(false); } - System.out.println(current_days_checked); } }; @@ -375,10 +433,12 @@ public class ProgramCreationActivity extends AppCompatActivity { }); } - private void addToProgram(Exercise exercise, ArrayList<String> trainingDays) { + public void addToProgram(Exercise exercise, ArrayList<String> trainingDays) { /** * Add the new exercise to the program */ + System.out.println(exercise.description); + System.out.println(exercise.timer); if (exoInProgram(exercise)) { Toast.makeText(this, "Exercice déjà dans le programme !", Toast.LENGTH_SHORT).show(); @@ -416,8 +476,6 @@ public class ProgramCreationActivity extends AppCompatActivity { } } - System.out.println("program : " + program); - System.out.println("programByDay : " + programByDay); } } diff --git a/app/src/main/java/be/lepl1509group13/workoutwarrior/ProgramDetailActivity.java b/app/src/main/java/be/lepl1509group13/workoutwarrior/ProgramDetailActivity.java index 4adec70a351d128ed689d185a29cd2f70925ea57..f21fca412aa62be7e77a1950d014d1244dd9eb32 100644 --- a/app/src/main/java/be/lepl1509group13/workoutwarrior/ProgramDetailActivity.java +++ b/app/src/main/java/be/lepl1509group13/workoutwarrior/ProgramDetailActivity.java @@ -1,5 +1,6 @@ package be.lepl1509group13.workoutwarrior; +import android.app.Dialog; import android.content.Intent; import android.os.Bundle; import android.view.LayoutInflater; @@ -7,6 +8,8 @@ import android.view.View; import android.widget.Button; import android.widget.ImageButton; import android.widget.ImageView; +import android.widget.ListView; +import android.widget.SimpleAdapter; import android.widget.TextView; import android.widget.Toast; @@ -30,7 +33,6 @@ import java.io.IOException; import java.io.ObjectInputStream; import java.text.SimpleDateFormat; import java.util.ArrayList; -import java.util.Arrays; import java.util.Calendar; import java.util.Date; import java.util.HashMap; @@ -45,12 +47,14 @@ public class ProgramDetailActivity extends AppCompatActivity implements ProgramA private FirebaseAuth mAuth; private HashMap<String, ArrayList<Exercise>> programHash; - - ImageButton return_btn; - TextView start_workout, delete_workout, show_workout, share_workout; + private Button start_workout, delete_workout, show_workout, share_workout; private boolean isLocalProgram = false; private String[][] exercisesData = null; + private ArrayList<ArrayList<String>> allExercices = new ArrayList<ArrayList<String>>(); + Map<String, ArrayList<Exercise>> all_ex_all_days = new HashMap<>(); + String program_name = ""; + ArrayList<String> all_days_exos = new ArrayList<String>(); @Override protected void onCreate(Bundle savedInstanceState) { @@ -60,6 +64,7 @@ public class ProgramDetailActivity extends AppCompatActivity implements ProgramA //get the id of the workout && launch the workout Intent this_intent = this.getIntent(); + program_name = this_intent.getStringExtra("name"); int id = this_intent.getIntExtra("id", 0); //finish activity of there is no id if (id == 0){ this.finish(); } @@ -70,15 +75,15 @@ public class ProgramDetailActivity extends AppCompatActivity implements ProgramA show_workout = findViewById(R.id.show_workout); show_workout.setOnClickListener(view -> showWorkout()); + share_workout = findViewById(R.id.share_workout); + share_workout.setOnClickListener(view -> shareWorkout()); + db = firebaseDb.getReference("Programs"); getProgramData(id, this_intent.getStringExtra("name")); return_btn = findViewById(R.id.return_btn2); return_btn.setOnClickListener(view -> finish()); - share_workout = findViewById(R.id.share_workout); - share_workout.setOnClickListener(view -> {shareWorkout();}); - start_workout = findViewById(R.id.start_workout); start_workout.setOnClickListener(view -> { Intent intent = new Intent(ProgramDetailActivity.this, WorkoutActivity.class); @@ -162,7 +167,6 @@ public class ProgramDetailActivity extends AppCompatActivity implements ProgramA } }); - AlertDialog dialog = builder.create(); dialog.show(); ImageView closeShareButton = dialogView.findViewById(R.id.close_share_btn); @@ -170,10 +174,65 @@ public class ProgramDetailActivity extends AppCompatActivity implements ProgramA } } + private void showWorkout() { + Dialog dialog = new Dialog(ProgramDetailActivity.this); + dialog.setContentView(R.layout.detail_program_popup); - private void showWorkout() { - //todo + TextView program_name_popup = dialog.findViewById(R.id.program_name); + program_name_popup.setText(program_name); + + ImageView closeButton = dialog.findViewById(R.id.close_btn); + closeButton.setOnClickListener(w -> dialog.dismiss()); + + ListView listView = dialog.findViewById(R.id.list_exo_program); + // Création tableau avec nom d'exo + String[] exo_name = new String[exercisesData.length]; + for (int i = 0; i < exercisesData.length; i++) { + exo_name[i] = exercisesData[i][0]; + } + + String[] days_exos = new String[exercisesData.length]; + for (int i = 0; i < exercisesData.length; i++) { + String globalString = ""; + for (String key : all_ex_all_days.keySet()) { + ArrayList<Exercise> values = all_ex_all_days.get(key); + for (Exercise ex : values) { + if (ex.name.equals(exercisesData[i][0])) { + globalString += key + ", "; + break; + } + } + } + globalString = globalString.replaceAll(", $", " "); + days_exos[i] = globalString; + } + + // Création tableau avec description d'exo + String[] exo_description = new String[exercisesData.length]; + for (int i = 0; i < exercisesData.length; i++) { + exo_description[i] = exercisesData[i][1]; + } + + ArrayList<HashMap<String, String>> list = new ArrayList<>(); + for (int i = 0; i < exo_name.length; i++) { + HashMap<String, String> map = new HashMap<>(); + map.put("title", exo_name[i]); + map.put("subtitle", exo_description[i]); + map.put("days", days_exos[i]); + list.add(map); + } + + SimpleAdapter adapter = new SimpleAdapter( + ProgramDetailActivity.this, + list, + R.layout.exo_in_program_item, + new String[]{"title", "subtitle", "days"}, + new int[]{R.id.title_textview, R.id.subtitle_textview, R.id.day_item}); + + listView.setAdapter(adapter); + + dialog.show(); } private void deleteWorkout() { @@ -228,7 +287,6 @@ public class ProgramDetailActivity extends AppCompatActivity implements ProgramA public void onItemClick(String[] exercise) {display_popup_content(exercise);} - private void getProgramData(int id, String name){ if(id == -1){ //It's a custom program @@ -243,9 +301,12 @@ public class ProgramDetailActivity extends AppCompatActivity implements ProgramA for (String filename : fileNames){ if (filename.equals(name + ".ser")){ + ArrayList<String> exo = new ArrayList<String>(); + //update the title of the program TextView title = findViewById(R.id.title); title.setText(name); + exo.add(name); FileInputStream fileInputStream = openFileInput(filename); ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream); @@ -255,9 +316,23 @@ public class ProgramDetailActivity extends AppCompatActivity implements ProgramA HashMap<String, ArrayList<Exercise>> entry = exerciseEntry.getEntry(); programHash = entry; + for (Map.Entry<String, ArrayList<Exercise>> entrySet : entry.entrySet()) { + String key = entrySet.getKey(); // Récupération de la clé + ArrayList<Exercise> value = entrySet.getValue(); // Récupération de la valeur correspondante + all_ex_all_days.put(key, value); + } + for (Map.Entry<String, ArrayList<Exercise>> set : entry.entrySet()) { + + for (Exercise values : set.getValue()){ + String customName = values.name; + exo.add(customName); + String description = values.description; + exo.add(description); + } String dayOfTheWeek = new SimpleDateFormat("EEEE", Locale.FRENCH).format(date.getTime()); String day = set.getKey(); + if(Objects.equals(dayOfTheWeek, day)){ //Get the data from the day of the week only int totalExercises = 0; @@ -285,6 +360,16 @@ public class ProgramDetailActivity extends AppCompatActivity implements ProgramA recyclerView.setAdapter(adapter); } } + boolean axo_in_program = false; + for (ArrayList<String> element : allExercices) { + if (element.equals(exo)) { + axo_in_program = true; + break; + } + } + if(!axo_in_program) { + allExercices.add(exo); + } objectInputStream.close(); fileInputStream.close(); } @@ -296,6 +381,7 @@ public class ProgramDetailActivity extends AppCompatActivity implements ProgramA isLocalProgram = false; delete_workout.setVisibility(View.INVISIBLE); show_workout.setVisibility(View.INVISIBLE); + share_workout.setVisibility(View.INVISIBLE); db.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { diff --git a/app/src/main/java/be/lepl1509group13/workoutwarrior/SharingAdapter.java b/app/src/main/java/be/lepl1509group13/workoutwarrior/SharingAdapter.java index f13aa4ec4ad2c4ac5cd0d6163164da3bb3758729..8cf4be12e69a7eb9c6146caece4c422b215c4f77 100644 --- a/app/src/main/java/be/lepl1509group13/workoutwarrior/SharingAdapter.java +++ b/app/src/main/java/be/lepl1509group13/workoutwarrior/SharingAdapter.java @@ -65,7 +65,6 @@ public class SharingAdapter extends RecyclerView.Adapter<SharingAdapter.MyViewHo writeOnDatabase(sender,friend_data[0],programHash); } }); - } public void writeOnDatabase(String from, String to, HashMap<String, ArrayList<Exercise>> sharedProgram){ @@ -98,9 +97,6 @@ public class SharingAdapter extends RecyclerView.Adapter<SharingAdapter.MyViewHo System.out.println("HashMap<String, ArrayList<Exercise>>: " + testProgram); System.out.println(testProgram); - - - } @Override @@ -128,5 +124,3 @@ public class SharingAdapter extends RecyclerView.Adapter<SharingAdapter.MyViewHo } } } - - diff --git a/app/src/main/java/be/lepl1509group13/workoutwarrior/WorkoutActivity.java b/app/src/main/java/be/lepl1509group13/workoutwarrior/WorkoutActivity.java index 58141cfc1e2a8c8acb55d3b84b863ae901c9a552..942ac23f74600dd815a72ab402b3f2ea5cf68572 100644 --- a/app/src/main/java/be/lepl1509group13/workoutwarrior/WorkoutActivity.java +++ b/app/src/main/java/be/lepl1509group13/workoutwarrior/WorkoutActivity.java @@ -3,11 +3,9 @@ package be.lepl1509group13.workoutwarrior; import androidx.appcompat.app.AppCompatActivity; import android.annotation.SuppressLint; -import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.os.CountDownTimer; -import android.os.Vibrator; import android.util.Log; import android.view.View; import android.widget.Button; @@ -22,6 +20,7 @@ import com.google.firebase.database.DatabaseReference; import com.google.firebase.database.FirebaseDatabase; import com.google.firebase.database.ValueEventListener; +import java.util.Arrays; import java.util.Objects; public class WorkoutActivity extends AppCompatActivity { @@ -32,20 +31,15 @@ public class WorkoutActivity extends AppCompatActivity { private DatabaseReference db; private Integer numberOfWorkouts; private int[] workout_id = new int[25]; - - private int timer; - - Button set_break_btn; - TextView set_break_timer_text; - private CountDownTimer set_countDownTimer; - long set_break_timer; // temps de pause entre les séries - private boolean set_break_timer_counting = false; // vrai si le timer de pause est en train de décompter + private Button btn_exercise_timer; + private Button btn_next_during_break; + private TextView countdown_text; + private TextView text_little_timer; private boolean workout_timer_counting = false; // vrai si le timer de l'exo est en train de décompter - private boolean workout_timer_started = false; // vrai si le timer de l'exo a déjà été démarré (qu'il soit sur pause ou non) private long timeLeftInMillis; // temps restant sur le timer du workout - Button next_btn; - + private Button next_btn; + private int exerciseIndexToDisplay = 0; @Override @@ -57,6 +51,11 @@ public class WorkoutActivity extends AppCompatActivity { next_btn = findViewById(R.id.next_btn); next_btn.setOnClickListener(v -> onNextClick()); + btn_exercise_timer = findViewById(R.id.btn_exercise_timer); + btn_next_during_break = findViewById(R.id.btn_next_during_break); + countdown_text = findViewById(R.id.workout_timer); + text_little_timer = findViewById(R.id.text_little_timer); + //get the id of the workout && launch the workout Intent intent = this.getIntent(); int id = intent.getIntExtra("id", 0); @@ -64,6 +63,10 @@ public class WorkoutActivity extends AppCompatActivity { if (id == 0){ String[][] exercisesData = (String[][]) intent.getSerializableExtra("exercisesData"); //todo pour Killian + System.out.println("custom : " + Arrays.deepToString(exercisesData)); + + next_btn.setOnClickListener(v -> onNextClickCustomProgram(exercisesData)); + displayCustomExercise(exercisesData); }else{ //it's a program from the database db = firebaseDb.getReference("Programs"); @@ -73,27 +76,145 @@ public class WorkoutActivity extends AppCompatActivity { ImageButton return_btn = findViewById(R.id.return_btn); return_btn.setOnClickListener(view -> { if (countdown != null) countdown.cancel(); - if (set_countDownTimer != null) set_countDownTimer.cancel(); finish(); }); - // Timer de pause entre les séries - set_break_btn = findViewById(R.id.set_break_btn); - set_break_timer_text = findViewById(R.id.set_break_timer); - - //Check if the user click on "start timer" - Button launch_timer = findViewById(R.id.launch_timer); - launch_timer.setOnClickListener(view -> { - countdown = workout_timer(timer); - countdown.start(); - launch_timer.setVisibility(View.INVISIBLE); - workout_timer_started = true; - workout_timer_counting = true; + //Check if the user click on the timer button + btn_exercise_timer.setOnClickListener(view -> { + Log.d("TAG", "onCreate: time left " + timeLeftInMillis); + if(btn_exercise_timer.getText() == "Pause"){ + Log.d("TAG", "onCreate: COUNTDOWN CANCEL"); + countdown.cancel(); + btn_exercise_timer.setText("Reprendre"); + }else if(btn_exercise_timer.getText() == "Reprendre") { + Log.d("TAG", "onCreate: COUNTDOWN RESTART"); + countdown = workout_timer((int) timeLeftInMillis); + countdown.start(); + btn_exercise_timer.setText("Pause"); + }else{ + Log.d("TAG", "onCreate: COUNTDOWN START"); + countdown = workout_timer(timer); + countdown.start(); + btn_exercise_timer.setText("Pause"); + countdown_text.setVisibility(View.VISIBLE); + workout_timer_counting = true; + } }); timeLeftInMillis = timer; } + // Lauch custom program + void onNextClickCustomProgram(String[][] exercises) { + /** + * For custom programs: when the button "Suivant" is pressed + */ + exerciseIndexToDisplay++; + + countdown_text.setVisibility(View.INVISIBLE); + + if (countdown != null) countdown.cancel(); + + if (exerciseIndexToDisplay >= exercises.length) { + finish(); + } else { + TextView name = findViewById(R.id.workout_todo); + TextView description = findViewById(R.id.workout_detail); + ImageView image = findViewById(R.id.workout_image); + + btn_exercise_timer.setVisibility(View.INVISIBLE); + + name.setText(exercises[exerciseIndexToDisplay][0]); + name.setVisibility(View.INVISIBLE); + + description.setText(exercises[exerciseIndexToDisplay][1]); + description.setVisibility(View.INVISIBLE); + + int resourceId = getResources().getIdentifier(exercises[exerciseIndexToDisplay][2], "drawable", getPackageName()); + image.setImageResource(resourceId); + image.setVisibility(View.INVISIBLE); + TextView timer_break = findViewById(R.id.timer_break); + CountDownTimer countDownBreak = new CountDownTimer(3000, 1000) { + @Override + public void onTick(long l) { + timer_break.setText(""); + name.setText(""); + description.setText(""); + image.setVisibility(View.INVISIBLE); + timer_break.setText("" + l / 1000); + next_btn.setVisibility(View.INVISIBLE); + btn_next_during_break.setVisibility(View.VISIBLE); + text_little_timer.setText("Il est temps de prendre une pause..."); + } + + @Override + public void onFinish() { + text_little_timer.setText(""); + timer_break.setText(""); + next_btn.setVisibility(View.VISIBLE); + btn_next_during_break.setVisibility(View.INVISIBLE); + displayCustomExercise(exercises); + } + }; + countDownBreak.start(); + //button to pass the break between 2 exercises + btn_next_during_break.setOnClickListener(view -> { + countDownBreak.cancel(); + countDownBreak.onFinish(); + }); + } + } + + void displayCustomExercise(String[][] exercises) { + /** + * For custom programs : display the exercise + */ + if (exerciseIndexToDisplay >= exercises.length) finish(); + next_btn.setOnClickListener(v1 -> onNextClickCustomProgram(exercises)); + TextView name = findViewById(R.id.workout_todo); + name.setText(exercises[exerciseIndexToDisplay][0]); + name.setVisibility(View.VISIBLE); + + TextView description = findViewById(R.id.workout_detail); + description.setText(exercises[exerciseIndexToDisplay][1]); + description.setVisibility(View.VISIBLE); + + ImageView image = findViewById(R.id.workout_image); + int resourceId = getResources().getIdentifier(exercises[exerciseIndexToDisplay][2], "drawable", getPackageName()); + image.setImageResource(resourceId); + image.setVisibility(View.VISIBLE); + + timer = Integer.parseInt(exercises[exerciseIndexToDisplay][3]) * 1000; + System.out.println("timer = " + timer); + + if(timer != 0){ + //Show the button to start the timer + btn_exercise_timer.setVisibility(View.VISIBLE); + }else{ + btn_exercise_timer.setVisibility(View.INVISIBLE); + if (countdown != null) { + countdown.cancel(); + } + } + + /* + if (timer > 0) { + //Check if the user click on "start timer" + btn_exercise_timer.setVisibility(View.VISIBLE); + btn_exercise_timer.setOnClickListener(view -> { + countdown_text.setVisibility(View.VISIBLE); + countdown = workout_timer(timer); + countdown.start(); + btn_exercise_timer.setVisibility(View.INVISIBLE); + workout_timer_counting = true; + }); + timeLeftInMillis = timer; + } + + */ + } + // Timer entre les séries + /* CountDownTimer workout_break_timer() { CountDownTimer timer = new CountDownTimer(set_break_timer, 1000) { public void onTick(long millisUntilFinished) { @@ -118,7 +239,7 @@ public class WorkoutActivity extends AppCompatActivity { }; return timer; } - + */ private void getProgramData(int id){ db.addValueEventListener(new ValueEventListener() { @@ -177,46 +298,16 @@ public class WorkoutActivity extends AppCompatActivity { int resourceId = getResources().getIdentifier(workout.child("image_url").getValue(String.class), "drawable", getPackageName()); image.setImageResource(resourceId); - set_break_timer = workout.child("break").getValue(Integer.class); - set_break_timer_text.setText(String.valueOf(set_break_timer/1000) + " secondes"); - - set_countDownTimer = workout_break_timer(); - set_break_btn.setOnClickListener(view -> { - if (set_break_timer_counting) { - set_countDownTimer.cancel(); - set_break_timer_text.setText(String.valueOf(set_break_timer/1000) + " secondes"); - set_break_timer_counting = false; - - // Si le timer avait déjà été actionné, on reprend le décompte - if (workout_timer_started) { - countdown = workout_timer((int) timeLeftInMillis); - countdown.start(); - workout_timer_counting = true; - } - } - else { - set_countDownTimer.start(); - set_break_timer_counting = true; - if (workout_timer_counting && countdown != null) { - countdown.cancel(); - workout_timer_counting = false; - } - } - }); - - Button launch_timer = findViewById(R.id.launch_timer); timer = workout.child("timer").getValue(Integer.class); if(timer != 0){ //Show the button to start the timer - launch_timer.setVisibility(View.VISIBLE); + btn_exercise_timer.setVisibility(View.VISIBLE); }else{ - launch_timer.setVisibility(View.INVISIBLE); + btn_exercise_timer.setVisibility(View.INVISIBLE); if (countdown != null) { countdown.cancel(); - countdown.onFinish(); } } - } @Override @@ -228,28 +319,17 @@ public class WorkoutActivity extends AppCompatActivity { @SuppressLint("SetTextI18n") private void onNextClick() { - try { + if(countdown != null){ countdown.cancel(); - TextView countdown_text = findViewById(R.id.workout_timer); - countdown_text.setText(""); - } catch (Exception e){ - Log.d("Exception", "onNextClick: " + e); - } - - - if (set_countDownTimer != null) { - set_countDownTimer.cancel(); - //set_countDownTimer.onFinish(); - workout_timer_started = false; + countdown_text.setVisibility(View.INVISIBLE); } TextView name = findViewById(R.id.workout_todo); TextView description = findViewById(R.id.workout_detail); ImageView image = findViewById(R.id.workout_image); - - Button launch_timer = findViewById(R.id.launch_timer); - launch_timer.setVisibility(View.INVISIBLE); + btn_exercise_timer.setVisibility(View.INVISIBLE); + btn_exercise_timer.setText("Démarrer le timer"); if(step == 0){ finish(); @@ -258,48 +338,44 @@ public class WorkoutActivity extends AppCompatActivity { else if(!Objects.equals(numberOfWorkouts, step)){ TextView timer_break = findViewById(R.id.timer_break); - CountDownTimer countDownBreak = new CountDownTimer(10000, 1000) { + CountDownTimer countDownBreak = new CountDownTimer(3000, 1000) { @Override public void onTick(long l) { timer_break.setText(""); name.setText(""); description.setText(""); image.setVisibility(View.INVISIBLE); + next_btn.setVisibility(View.INVISIBLE); + btn_next_during_break.setVisibility(View.VISIBLE); timer_break.setText("" + l/1000); - //btn_next.setVisibility(View.INVISIBLE); - set_break_timer_text.setText("Il est temps de prendre une pause..."); - set_break_btn.setVisibility(View.INVISIBLE); + text_little_timer.setText("Il est temps de prendre une pause..."); } @Override public void onFinish() { + text_little_timer.setText(""); timer_break.setText(""); image.setVisibility(View.VISIBLE); next_btn.setVisibility(View.VISIBLE); - set_break_btn.setVisibility(View.VISIBLE); + btn_next_during_break.setVisibility(View.INVISIBLE); db = firebaseDb.getReference("Workouts"); getWorkoutData(Integer.toString(workout_id[step - 1])); step ++; } }; countDownBreak.start(); - next_btn.setText("Passer"); - next_btn.setOnClickListener(v -> { + //button to pass the break between 2 exercises + btn_next_during_break.setOnClickListener(view -> { countDownBreak.cancel(); countDownBreak.onFinish(); - next_btn.setText("Suivant"); - next_btn.setOnClickListener(v1 -> onNextClick()); }); } else if (numberOfWorkouts.equals(step)) { name.setText("Entrainement terminé!"); description.setText(""); next_btn.setText("Retour à l'accueil"); image.setImageResource(0); - set_break_timer_text.setText(""); - set_break_btn.setVisibility(View.INVISIBLE); step = 0; } - System.out.println("countdown = " + countdown); } CountDownTimer workout_timer(Integer millis){ diff --git a/app/src/main/res/layout/activity_detail_program.xml b/app/src/main/res/layout/activity_detail_program.xml index 6efaf81323a11c1026f78e0f143de161085b4434..219ed1cabbba6740c6b15bd5444c27b7fcedb3ad 100644 --- a/app/src/main/res/layout/activity_detail_program.xml +++ b/app/src/main/res/layout/activity_detail_program.xml @@ -36,12 +36,12 @@ app:layout_constraintTop_toTopOf="parent" /> <Button - android:id="@+id/delete_workout" + android:id="@+id/share_workout" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@color/orange" android:backgroundTint="@color/orange" - android:text="@string/delete_workout" + android:text="@string/share_workout" android:textColor="@color/black" app:iconTint="@color/orange" android:layout_marginEnd="15dp" @@ -127,18 +127,34 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" /> - <Button - android:id="@+id/show_workout" - android:layout_width="wrap_content" + <LinearLayout + android:layout_width="match_parent" android:layout_height="wrap_content" - android:background="@color/orange" - android:backgroundTint="@color/orange" - android:text="@string/show_workout" - android:textColor="@color/black" - app:iconTint="@color/orange" app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/start_workout" /> + app:layout_constraintTop_toBottomOf="@+id/start_workout" + android:gravity="center"> + + <Button + android:id="@+id/show_workout" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:background="@color/orange" + android:backgroundTint="@color/orange" + android:text="@string/show_workout" + android:textColor="@color/black" + app:iconTint="@color/orange" + android:layout_marginRight="35dp"/> + + <Button + android:id="@+id/delete_workout" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:background="@color/orange" + android:backgroundTint="@color/orange" + android:text="@string/delete_workout" + android:textColor="@color/black" + app:iconTint="@color/orange" /> + + </LinearLayout> </androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_workout.xml b/app/src/main/res/layout/activity_workout.xml index afe126e9d0f6aa2d1edb08241b7a1268a8d1e0a5..2c5f0c306f9342d6c636644237199b98c17c5bc6 100644 --- a/app/src/main/res/layout/activity_workout.xml +++ b/app/src/main/res/layout/activity_workout.xml @@ -109,7 +109,7 @@ app:layout_constraintStart_toStartOf="parent" /> <Button - android:id="@+id/launch_timer" + android:id="@+id/btn_exercise_timer" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="35dp" @@ -119,27 +119,16 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" /> - <Button - android:id="@+id/set_break_btn" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="Pause" - android:layout_marginTop="20dp" - app:layout_constraintTop_toBottomOf="@id/workout_detail" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintEnd_toEndOf="parent"/> - <TextView - android:id="@+id/set_break_timer" + android:id="@+id/text_little_timer" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@android:color/black" - app:layout_constraintBottom_toTopOf="@+id/set_break_btn" - app:layout_constraintEnd_toEndOf="@id/set_break_btn" - app:layout_constraintStart_toStartOf="@id/set_break_btn" - app:layout_constraintTop_toBottomOf="@+id/workout_detail" /> - - + app:layout_constraintBottom_toTopOf="@+id/btn_exercise_timer" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/workout_detail" + tools:text="textview" /> <Button android:id="@+id/next_btn" @@ -152,4 +141,16 @@ app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" /> + <Button + android:id="@+id/btn_next_during_break" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginRight="25dp" + android:layout_marginBottom="25dp" + android:backgroundTint="@color/orange" + android:text="Passer" + android:visibility="invisible" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" /> + </androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/detail_program_popup.xml b/app/src/main/res/layout/detail_program_popup.xml new file mode 100644 index 0000000000000000000000000000000000000000..570c1e3e420e8f887bd03bd7ef17e157bdf24649 --- /dev/null +++ b/app/src/main/res/layout/detail_program_popup.xml @@ -0,0 +1,76 @@ +<?xml version="1.0" encoding="utf-8"?> +<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent"> + + <LinearLayout + android:id="@+id/linearLayout" + android:layout_width="match_parent" + android:layout_marginTop="40dp" + android:layout_height="wrap_content" + android:gravity="center_horizontal" + android:orientation="vertical" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent"> + + <TextView + android:id="@+id/program_name" + android:layout_width="200dp" + android:layout_height="wrap_content" + android:layout_marginTop="30dp" + android:fontFamily="@font/poppins_semibold" + android:gravity="center" + android:textColor="@color/orange" + android:textSize="28sp" + android:textStyle="bold" + app:layout_constraintBottom_toTopOf="@+id/constraintLayout2" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + + </LinearLayout> + + + <androidx.constraintlayout.widget.ConstraintLayout + android:id="@+id/constraintLayout2" + android:layout_width="387dp" + android:layout_height="524dp" + android:layout_marginBottom="50dp" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toBottomOf="@+id/linearLayout"> + + <RelativeLayout + android:layout_width="290dp" + android:layout_height="wrap_content" + android:layout_marginTop="30dp" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent"> + + <ListView + android:id="@+id/list_exo_program" + android:layout_width="match_parent" + android:layout_height="wrap_content"> + + </ListView> + + </RelativeLayout> + + + </androidx.constraintlayout.widget.ConstraintLayout> + + <ImageView + android:id="@+id/close_btn" + android:layout_width="35dp" + android:layout_height="35dp" + android:layout_marginTop="10dp" + android:layout_marginEnd="10dp" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:srcCompat="@drawable/close_btn" /> + +</androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/exo_in_program_item.xml b/app/src/main/res/layout/exo_in_program_item.xml new file mode 100644 index 0000000000000000000000000000000000000000..22673a0dcf6c9fb04d42a6866b9dfa3145d32541 --- /dev/null +++ b/app/src/main/res/layout/exo_in_program_item.xml @@ -0,0 +1,38 @@ +<?xml version="1.0" encoding="utf-8"?> +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:padding="16dp"> + + <TextView + android:id="@+id/title_textview" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:textSize="18sp" /> + + <TextView + android:id="@+id/subtitle_textview" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_below="@id/title_textview" + android:layout_marginTop="8dp" + android:textSize="16sp" /> + + <TextView + android:id="@+id/info_textview" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_below="@id/subtitle_textview" + android:layout_marginTop="8dp" + android:text="Vous devez effectuer cet exercice au(x) jour(s) suivant(s) :" + android:textSize="14sp" /> + + <TextView + android:id="@+id/day_item" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_below="@id/info_textview" + android:layout_marginTop="8dp" + android:textSize="14sp"/> + +</RelativeLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/modify_exercice_popup.xml b/app/src/main/res/layout/modify_exercice_popup.xml index fdb200a10dc5081bb8035d0c989560873f5c742c..9722d04f05a01a842c0f1de26c2d25ff4081f840 100644 --- a/app/src/main/res/layout/modify_exercice_popup.xml +++ b/app/src/main/res/layout/modify_exercice_popup.xml @@ -179,7 +179,8 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Pause" - android:text=""/> + android:text="" + android:maxLines="5"/> <TextView android:id="@+id/timer_text" diff --git a/app/src/main/res/layout/share_friends_popup.xml b/app/src/main/res/layout/share_friends_popup.xml index b301a8695c2db2d8d00d21efd3da8111d0ea0b20..4fd11ccb9d802c639140ea152502de12f963ed36 100644 --- a/app/src/main/res/layout/share_friends_popup.xml +++ b/app/src/main/res/layout/share_friends_popup.xml @@ -47,6 +47,4 @@ app:layout_constraintTop_toTopOf="parent" app:srcCompat="@drawable/close_btn" /> - - -</androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file +</androidx.constraintlayout.widget.ConstraintLayout> diff --git a/app/src/main/res/layout/shared_workout_popup.xml b/app/src/main/res/layout/shared_workout_popup.xml new file mode 100644 index 0000000000000000000000000000000000000000..b1c72d5588f69cd141075b2332461ebc7b8607ac --- /dev/null +++ b/app/src/main/res/layout/shared_workout_popup.xml @@ -0,0 +1,43 @@ +<?xml version="1.0" encoding="utf-8"?> +<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:background="@color/white"> + + <androidx.constraintlayout.widget.ConstraintLayout + android:id="@+id/share_popup" + android:layout_width="match_parent" + android:layout_height="wrap_content" + app:layout_constraintTop_toTopOf="parent" + android:layout_marginTop="20dp" + android:layout_marginBottom="60dp" + android:padding="15dp"> + + <TextView + android:id="@+id/share_popup_title" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:fontFamily="@font/poppins_semibold" + android:textSize="20sp" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + tools:text="test" /> + + <TextView + android:id="@+id/share_popup_description" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:fontFamily="@font/poppins" + android:layout_marginTop="20dp" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/share_popup_title" + tools:text="test" + android:textSize="20sp" /> + + </androidx.constraintlayout.widget.ConstraintLayout> + +</androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/sharing_item.xml b/app/src/main/res/layout/sharing_item.xml index 6146ac58798ad4fba40a388d2224a44c762390fe..640a3e417c8954debeb87b5fb4b86b1f1eae6b63 100644 --- a/app/src/main/res/layout/sharing_item.xml +++ b/app/src/main/res/layout/sharing_item.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> - <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" +<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="wrap_content"> @@ -39,4 +39,4 @@ </androidx.constraintlayout.widget.ConstraintLayout> -</androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file +</androidx.constraintlayout.widget.ConstraintLayout> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 221214c9055e10b3bdcd4bdb828cd5d162662f64..6db1d888e55ca867ab4c59520563bc88bd256673 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -8,9 +8,8 @@ <string name="entrainement_foot">Entrainement Foot</string> <string name="entrainement_badminton">Entrainement Badminton</string> <string name="launch_workout">Démarrer</string> - <string name="share_workout">Partager</string> - <string name="delete_workout">Supprimer le programme</string> - <string name="show_workout">Afficher / Modifier le programme</string> + <string name="delete_workout">Supprimer</string> + <string name="show_workout">Afficher</string> <string name="title_activity_account">AccountActivity</string> <string name="prompt_email">Email</string> <string name="prompt_password">Password</string> @@ -25,4 +24,5 @@ <string name="add_friend_activity_title">Entrez le pseudo de l\'ami à ajouter</string> <string name="add_friend_activity_btn_text">Ajouter</string> <string name="login_title">Veuillez d\'abord vous connecter</string> + <string name="share_workout">Partager ce programme</string> </resources> diff --git a/build.gradle b/build.gradle index a6903d309f6d358b7f8acb6281e46f6113c82fcf..f348014cd588c5456d7077a5088b12308738efac 100644 --- a/build.gradle +++ b/build.gradle @@ -7,6 +7,7 @@ buildscript { dependencies { classpath "com.android.tools.build:gradle:7.0.0" classpath 'com.google.gms:google-services:4.3.10' + classpath 'com.google.gms:google-services:4.3.15' classpath 'com.google.firebase:firebase-crashlytics-gradle:2.8.1' // NOTE: Do not place your application dependencies here; they belong