diff --git a/app/src/main/java/be/lepl1509group13/workoutwarrior/AccountActivity.java b/app/src/main/java/be/lepl1509group13/workoutwarrior/AccountActivity.java index 8f34f87fbb9b33cea265f59025a7f2ac7b9805aa..dfabbafc4d4778ae07bb8b279f5d556481e93586 100644 --- a/app/src/main/java/be/lepl1509group13/workoutwarrior/AccountActivity.java +++ b/app/src/main/java/be/lepl1509group13/workoutwarrior/AccountActivity.java @@ -3,13 +3,13 @@ package be.lepl1509group13.workoutwarrior; import androidx.appcompat.app.AppCompatActivity; import android.annotation.SuppressLint; +import android.content.Intent; import android.os.Bundle; import android.text.Editable; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.ImageButton; -import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; @@ -20,10 +20,21 @@ import com.google.android.material.textfield.TextInputEditText; import com.google.firebase.auth.AuthResult; 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 java.util.HashMap; +import java.util.Map; +import java.util.Objects; public class AccountActivity extends AppCompatActivity { private FirebaseAuth mAuth; + private final FirebaseDatabase firebaseDb = FirebaseDatabase.getInstance(); + private DatabaseReference db; private Button logout; private TextView title; @@ -31,31 +42,98 @@ public class AccountActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setContentView(R.layout.activity_account); getSupportActionBar().hide(); mAuth = FirebaseAuth.getInstance(); + FirebaseUser currentUser = mAuth.getCurrentUser(); - title = findViewById(R.id.account_title); + if(currentUser != null){ + //get which button is clicked in the navigation + Intent intent = this.getIntent(); + String item = intent.getStringExtra("item"); + if(Objects.equals(item, "Mon compte")){ + //todo + } else if (Objects.equals(item, "Mes amis")) { + //todo + } + setContentView(R.layout.activity_account); + + db = firebaseDb.getReference("Account_pseudo"); + getPseudo(currentUser); + }else{ + setContentView(R.layout.activity_account_login); - TextInputEditText email_input = findViewById(R.id.email); - Editable email_string = email_input.getText(); - TextInputEditText password_input = findViewById(R.id.password); - Editable password_string = password_input.getText(); + TextInputEditText email_input = findViewById(R.id.email); + Editable email_string = email_input.getText(); + TextInputEditText password_input = findViewById(R.id.password); + Editable password_string = password_input.getText(); - ImageButton return_btn = findViewById(R.id.return_from_account); - return_btn.setOnClickListener(view -> finish()); + Button login = findViewById(R.id.login); + login.setOnClickListener(view -> login(email_string, password_string)); - Button login = findViewById(R.id.login); - login.setOnClickListener(view -> login(email_string, password_string)); + Button register = findViewById(R.id.register); + register.setOnClickListener(view -> register(email_string, password_string)); + } - Button register = findViewById(R.id.register); - register.setOnClickListener(view -> register(email_string, password_string)); + ImageButton return_btn = findViewById(R.id.return_from_account); + return_btn.setOnClickListener(view -> finish()); logout = findViewById(R.id.logout); logout.setOnClickListener(view -> logout()); } + private void getPseudo(FirebaseUser currentUser) { + String id_user = currentUser.getUid(); + + db.addValueEventListener(new ValueEventListener() { + @Override + public void onDataChange(DataSnapshot snapshot) { + title = findViewById(R.id.account_title); + + RelativeLayout field_pseudo_layout = findViewById(R.id.field_pseudo_layout); + TextInputEditText pseudo_input = findViewById(R.id.pseudo); + Button register = findViewById(R.id.register_pseudo); + + try { + DataSnapshot data = snapshot.child(id_user); + + String pseudo = data.getValue().toString(); + + title.setText("Vous êtes connecté !\n" + currentUser.getEmail() + " & " + id_user + " & " + pseudo); + field_pseudo_layout.setVisibility(View.INVISIBLE); + register.setVisibility(View.INVISIBLE); + } catch (Exception e){ + title.setText("Veuillez définir votre pseudo :"); + + Editable pseudo_string = pseudo_input.getText(); + + register.setOnClickListener(view -> savePseudo(id_user, pseudo_string)); + } + } + + @Override + public void onCancelled(DatabaseError error) { + Toast.makeText(AccountActivity.this, "Fail to get data.", Toast.LENGTH_SHORT).show(); + } + }); + } + + private void savePseudo(String id_user, Editable pseudo_string) { + // Write pseudo in the database + Map<String, Object> updates = new HashMap<>(); + updates.put(id_user, pseudo_string.toString()); + + db = firebaseDb.getReference("Account_pseudo"); + + try { + db.updateChildren(updates); + } catch (Exception e){ + Log.d("error", "savePseudo: " + e); + } + isLoged(); + } + + /** @Override public void onStart() { super.onStart(); @@ -69,19 +147,18 @@ public class AccountActivity extends AppCompatActivity { logout.setVisibility(View.INVISIBLE); } } + */ private void isLoged(){ - logout.setVisibility(View.VISIBLE); - RelativeLayout field = findViewById(R.id.field_layout); - field.setVisibility(View.INVISIBLE); - LinearLayout buttons = findViewById(R.id.button_layout); - buttons.setVisibility(View.INVISIBLE); - FirebaseUser user = mAuth.getCurrentUser(); - title.setText("Vous êtes connecté !\n" + user.getEmail()); - + //Refresh the layout when user is logged + finish(); + overridePendingTransition(0, 0); + startActivity(getIntent()); + overridePendingTransition(0, 0); } private void login(Editable email, Editable password) { + Log.d("listener", "login: click btn"); String email_string = (String)email.toString(); String password_string = (String)password.toString(); if(email_string.isEmpty() || password_string.isEmpty()){ diff --git a/app/src/main/java/be/lepl1509group13/workoutwarrior/ListExercicesAdapter.java b/app/src/main/java/be/lepl1509group13/workoutwarrior/ListExercicesAdapter.java index 649792cf9db4cd283f4230e1362536dbd8b55e0f..78804c5b4d3d23d1d7e5cad6689e1d85dba47b54 100644 --- a/app/src/main/java/be/lepl1509group13/workoutwarrior/ListExercicesAdapter.java +++ b/app/src/main/java/be/lepl1509group13/workoutwarrior/ListExercicesAdapter.java @@ -1,32 +1,18 @@ package be.lepl1509group13.workoutwarrior; -import static android.content.ContentValues.TAG; - import android.content.Context; -import android.content.Intent; import android.graphics.drawable.Drawable; -import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; -import android.widget.Button; -import android.widget.EditText; import android.widget.ImageView; -import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; -import androidx.appcompat.app.AlertDialog; - -import com.google.firebase.database.DataSnapshot; -import com.google.firebase.database.DatabaseError; -import com.google.firebase.database.Query; -import com.google.firebase.database.ValueEventListener; - import java.util.ArrayList; -import java.util.HashMap; -import java.util.Objects; +import java.util.Iterator; +import java.util.Map; public class ListExercicesAdapter extends ArrayAdapter<String> { @@ -34,7 +20,7 @@ public class ListExercicesAdapter extends ArrayAdapter<String> { private ArrayList<String> values; public ListExercicesAdapter(Context context, ArrayList<String> values) { - super(context, R.layout.exercice, values); + super(context, R.layout.exercises_list_row, values); this.context = context; this.values = values; } @@ -42,30 +28,50 @@ public class ListExercicesAdapter extends ArrayAdapter<String> { @Override public View getView(int position, View convertView, ViewGroup parent) { LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); - View rowView = inflater.inflate(R.layout.exercice, parent, false); + View rowView = inflater.inflate(R.layout.exercises_list_row, parent, false); ImageView delete_button = rowView.findViewById(R.id.delete_button); ImageView edit_button = rowView.findViewById(R.id.edit_button); - TextView exercice_name = rowView.findViewById(R.id.exercice_name); + TextView exercise_name = rowView.findViewById(R.id.exercise_name); + TextView training_daysView = rowView.findViewById(R.id.training_days); - // Récupérez l'image et le texte pour chaque élément de la liste en fonction de la position + // Récupérer l'image et le texte pour chaque élément de la liste en fonction de la position if (this.values.size() > 0) { + + ProgramCreationActivity activity = (ProgramCreationActivity) context; + System.out.println("values : " + values); String exercise = values.get(position); + String training_days = ""; Drawable delete_cross = context.getResources().getDrawable(R.drawable.cross_mark); Drawable pen = context.getResources().getDrawable(R.drawable.edit); - // Afficher l'image et le texte dans les vues correspondantes + + // 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 = ""; + for (String day : set.getValue()) { + training_days += getShortDayName(day) + ", "; + } + } + } + training_days = training_days.substring(0, training_days.length() - 2); + + System.out.println("training days : " + training_days); + + // Display texts and images in Views delete_button.setImageDrawable(delete_cross); edit_button.setImageDrawable(pen); - exercice_name.setText(exercise); - - ProgramCreationActivity activity = (ProgramCreationActivity) context; + exercise_name.setText(exercise); + training_daysView.setText(training_days); // Ecouteur de clics pour chaque élément de la ListView edit_button.setOnClickListener(view -> { - System.out.println("details : " + activity.exoDetailsForEachDay); + /* + 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); @@ -119,6 +125,8 @@ public class ListExercicesAdapter extends ArrayAdapter<String> { System.out.println("details : " + activity.exoDetailsForEachDay); Toast.makeText(context, "Modifications sauvegardées", Toast.LENGTH_SHORT).show(); dialog.dismiss(); + + }); ImageView closeButton = dialogView.findViewById(R.id.close_btn); @@ -126,6 +134,8 @@ public class ListExercicesAdapter extends ArrayAdapter<String> { // Fermer la pop-up dialog.dismiss(); }); + */ + }); // Ajouter un OnClickListener à l'image @@ -133,13 +143,23 @@ public class ListExercicesAdapter extends ArrayAdapter<String> { // Code à exécuter lors du clic Toast.makeText(context, exercise + " supprimé", Toast.LENGTH_SHORT).show(); - activity.exoDetailsForEachDay.get(activity.current_day_displayed).remove(position); + 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)) { + iterator.remove(); + } + } - ArrayList<String> exosDisplay = new ArrayList<>(); - for (Exercise exo : activity.exoDetailsForEachDay.get(activity.current_day_displayed)) { - exosDisplay.add(exo.name); + + + ArrayList<String> updatedExercicesList = new ArrayList<>(); + for (Map.Entry<Exercise, ArrayList<String>> set : activity.program.entrySet()) { + updatedExercicesList.add(set.getKey().name); } - updateValues(exosDisplay); + + updateValues(updatedExercicesList); notifyDataSetChanged(); }); } @@ -158,6 +178,17 @@ public class ListExercicesAdapter extends ArrayAdapter<String> { } + String getShortDayName(String day) { + if (day == "lundi") return "LU"; + if (day == "mardi") return "MA"; + if (day == "mercredi") return "ME"; + if (day == "jeudi") return "JE"; + if (day == "vendredi") return "VE"; + if (day == "samedi") return "SA"; + if (day == "dimanche") return "DI"; + else throw new IllegalArgumentException(); + } + } diff --git a/app/src/main/java/be/lepl1509group13/workoutwarrior/MainActivity.java b/app/src/main/java/be/lepl1509group13/workoutwarrior/MainActivity.java index 53ed607d4de7b5e9309db62c5a4073ae53d9acc9..f3642e4fefeb393a83eaafdd3a169931017f9e4b 100644 --- a/app/src/main/java/be/lepl1509group13/workoutwarrior/MainActivity.java +++ b/app/src/main/java/be/lepl1509group13/workoutwarrior/MainActivity.java @@ -4,16 +4,24 @@ import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; import androidx.annotation.NonNull; 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.util.Log; +import android.view.LayoutInflater; 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; @@ -40,6 +48,7 @@ public class MainActivity extends AppCompatActivity implements MainAdapter.OnIte private Integer numberOfProgramsToDisplay = 0, totalNumberOfCustomPrograms = 0; private boolean needsRefresh = false; + @SuppressLint({"SetTextI18n"}) @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -52,8 +61,36 @@ public class MainActivity extends AppCompatActivity implements MainAdapter.OnIte TextView open_program_creation_btn = findViewById(R.id.program_creation_button); open_program_creation_btn.setOnClickListener(this::open_program_creation); - ImageButton open_account = findViewById(R.id.account); - open_account.setOnClickListener(this::open_account); + ImageButton open_nav = findViewById(R.id.account); + DrawerLayout drawerLayout = findViewById(R.id.drawer_layout); + NavigationView navigationView = findViewById(R.id.navigation_view); + + //open the navigation + open_nav.setOnClickListener(view -> { + if (!drawerLayout.isDrawerOpen(GravityCompat.START)) { + FirebaseAuth mAuth = FirebaseAuth.getInstance(); + FirebaseUser currentUser = mAuth.getCurrentUser(); + + LayoutInflater inflater = getLayoutInflater(); + View menu_header = inflater.inflate(R.layout.menu_header, null); + TextView text_header_menu = menu_header.findViewById(R.id.menu_text); + + if(currentUser != null){ + //todo + text_header_menu.setText("Vous êtes connecté !"); + }else{ + text_header_menu.setText("Vous n'êtes pas connecté. Rendez-vous dans la section Mon compte pour vous connecter."); + } + drawerLayout.openDrawer(GravityCompat.START); + } + }); + + //check when a button is clicked in the navigation + navigationView.setNavigationItemSelectedListener(item -> { + open_account((String) item.getTitle()); + drawerLayout.closeDrawer(GravityCompat.START); + return false; + }); } @Override @@ -79,15 +116,14 @@ public class MainActivity extends AppCompatActivity implements MainAdapter.OnIte result -> { if (result.getResultCode() == 1) { //Update the page if a program is added or deleted - //Log.d("TAG", ": " + Activity.RESULT_OK ); - //Log.d("TAG", ": " + result.getResultCode() ); needsRefresh = true; } } ); - private void open_account(View v) { + private void open_account(String item) { Intent intent = new Intent(MainActivity.this, AccountActivity.class); + intent.putExtra("item", item); startActivity(intent); } diff --git a/app/src/main/java/be/lepl1509group13/workoutwarrior/ProgramAdapter.java b/app/src/main/java/be/lepl1509group13/workoutwarrior/ProgramAdapter.java index bf3fe715ba7628103183d346a68cefb7d8d39ea0..63fde2dd33e44eeff566074169d039c63804745d 100644 --- a/app/src/main/java/be/lepl1509group13/workoutwarrior/ProgramAdapter.java +++ b/app/src/main/java/be/lepl1509group13/workoutwarrior/ProgramAdapter.java @@ -9,6 +9,8 @@ import android.widget.Button; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; +import java.util.Arrays; + public class ProgramAdapter extends RecyclerView.Adapter<ProgramAdapter.MyViewHolder> { private final String[][] mData; diff --git a/app/src/main/java/be/lepl1509group13/workoutwarrior/ProgramCreationActivity.java b/app/src/main/java/be/lepl1509group13/workoutwarrior/ProgramCreationActivity.java index 75fc222acbc85f424dec97093902bc5ca6b37f25..cac6ea9931410f9bc3cde055fe8ecb8704737aef 100644 --- a/app/src/main/java/be/lepl1509group13/workoutwarrior/ProgramCreationActivity.java +++ b/app/src/main/java/be/lepl1509group13/workoutwarrior/ProgramCreationActivity.java @@ -1,9 +1,12 @@ package be.lepl1509group13.workoutwarrior; +import android.app.Dialog; import android.content.DialogInterface; import android.content.Intent; +import android.graphics.Color; import android.graphics.Typeface; import android.os.Bundle; +import android.provider.ContactsContract; import android.widget.AdapterView; import android.content.Context; import android.os.Bundle; @@ -17,6 +20,8 @@ import android.widget.EditText; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.ListView; +import android.widget.TableLayout; +import android.widget.TableRow; import android.widget.TextView; import android.widget.Toast; import android.view.View; @@ -25,6 +30,8 @@ import android.widget.AutoCompleteTextView; import androidx.annotation.NonNull; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import com.google.firebase.database.DataSnapshot; import com.google.firebase.database.DatabaseError; @@ -60,22 +67,22 @@ public class ProgramCreationActivity extends AppCompatActivity { // Déclaration variables AutoCompleteTextView input_exo; // Champ de texte pour rechercher les exercices // 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<>(); - public String current_day_displayed = "lundi"; + private ArrayList<String> current_days_checked = new ArrayList<>(); - public ListView exos_current_day; // ListView des exercices pour le jour courant + public ListView exercisesView; // ListView des exercices pour le jour courant private ImageButton help_creation_program; - HashMap<String, ArrayList<Exercise>> exoDetailsForEachDay = new HashMap<>(); + HashMap<String, ArrayList<Exercise>> programByDay = new HashMap<>(); + HashMap<Exercise, ArrayList<String>> program = new HashMap<>(); ListExercicesAdapter exercisesListAdapter; - public static int lastCheckedPosition = -1; - ArrayList<String> currentExoList = new ArrayList<>(); - ArrayList<TextView> days_TextView = new ArrayList<>(); @Override @@ -84,19 +91,20 @@ public class ProgramCreationActivity extends AppCompatActivity { setContentView(R.layout.program_creation); getSupportActionBar().hide(); - init_days_TextView(); - ((TextView) findViewById(R.id.textview_monday)).setTypeface(Typeface.DEFAULT, Typeface.BOLD); + //init_days_TextView(); + + db = firebaseDb.getReference("Workouts"); get_DB_Exercices(); - init_day_lists(); // initialisation des listes pour stocker les exercices choisis - init_checkboxes(); // initialisation des checkbox des jours + //init_day_lists(); // initialisation des listes pour stocker les exercices choisis + //init_checkboxes(); // initialisation des checkbox des jours input_exo = findViewById(R.id.input_new_exo); // champ de recherche des exercices - exos_current_day = findViewById(R.id.exos_current_day_ListView); // liste des exercices choisis pour le jour courant + exercisesView = findViewById(R.id.exercisesView); // liste des exercices choisis pour le jour courant exercisesListAdapter = new ListExercicesAdapter(this, new ArrayList<>()); - exos_current_day.setAdapter(exercisesListAdapter); + exercisesView.setAdapter(exercisesListAdapter); ImageButton return_btn = findViewById(R.id.return_btn2); return_btn.setOnClickListener(view -> finish()); @@ -116,11 +124,6 @@ public class ProgramCreationActivity extends AppCompatActivity { ArrayAdapter<String> exos_suggestion_adapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, EXOS); input_exo.setAdapter(exos_suggestion_adapter); - // Ajouter un listener à chaque checkBox - for (CheckBox cb : cb_list) cb.setOnCheckedChangeListener(myCheckBoxListener); - - - // Popup d'aide helpButtonListener(); @@ -130,48 +133,8 @@ public class ProgramCreationActivity extends AppCompatActivity { // Sauvegarde du programme saveProgramListener(); - //testLinstener(); - } - - /* - private void testLinstener(){ - Button testbtn = findViewById((R.id.save_test)); - testbtn.setOnClickListener(v -> { - System.out.println("EXO SAVED: \n"); - try { - // recup files saved (garde que ".ser") - File dir = getFilesDir(); - String[] fileNames = dir.list(); - assert fileNames != null; - for (String filename : fileNames){ - if (filename.endsWith(".ser")){ - - System.out.println("FILENAME: " + filename + "\n"); - FileInputStream fileInputStream = openFileInput(filename); - ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream); - ExerciseEntry exerciseEntry = (ExerciseEntry) objectInputStream.readObject(); - - // ici tu peux utiliser entry comme programme perso - HashMap<String, ArrayList<Exercise>> entry = exerciseEntry.getEntry(); - - - for (Map.Entry<String, ArrayList<Exercise>> set : entry.entrySet()) { - System.out.println(set.getKey() + " = " + set.getValue()); - } - - objectInputStream.close(); - fileInputStream.close(); - } - } - - } catch (IOException | ClassNotFoundException e) { - e.printStackTrace(); - } - }); } - */ - private void helpButtonListener(){ help_creation_program = findViewById(R.id.help_program_creation); help_creation_program.setOnClickListener(v -> { @@ -191,6 +154,7 @@ public class ProgramCreationActivity extends AppCompatActivity { private 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 @@ -199,7 +163,7 @@ public class ProgramCreationActivity extends AppCompatActivity { String programpath = programName + ".ser"; // place le HashMap du programme dans nomdeprogramme.ser - HashMap<String, ArrayList<Exercise>> entry = exoDetailsForEachDay; + HashMap<String, ArrayList<Exercise>> entry = programByDay; ExerciseEntry exerciseEntry = new ExerciseEntry(entry); FileOutputStream fileOutputStream = openFileOutput(programpath, Context.MODE_PRIVATE); ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream); @@ -220,115 +184,117 @@ public class ProgramCreationActivity extends AppCompatActivity { - private void init_checkboxes() { - /** - * Ajoute les checkboxes dans la liste - */ - cb_lundi = findViewById(R.id.checkbox_monday); - cb_mardi = findViewById(R.id.checkbox_tuesday); - cb_mercredi = findViewById(R.id.checkbox_wednesday); - cb_jeudi = findViewById(R.id.checkbox_thursday); - cb_vendredi = findViewById(R.id.checkbox_friday); - cb_samedi = findViewById(R.id.checkbox_saturday); - cb_dimanche = 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); - } - - private void init_day_lists() { - exoDetailsForEachDay.put("lundi", new ArrayList<>()); - exoDetailsForEachDay.put("mardi", new ArrayList<>()); - exoDetailsForEachDay.put("mercredi", new ArrayList<>()); - exoDetailsForEachDay.put("jeudi", new ArrayList<>()); - exoDetailsForEachDay.put("vendredi", new ArrayList<>()); - exoDetailsForEachDay.put("samedi", new ArrayList<>()); - exoDetailsForEachDay.put("dimanche", new ArrayList<>()); - - System.out.println(exoDetailsForEachDay); - } - - void init_days_TextView() { - /** - * Ajoute à days_TextView tous les TextView des jours - */ - days_TextView.add(findViewById(R.id.textview_monday)); - days_TextView.add(findViewById(R.id.textview_tuesday)); - days_TextView.add(findViewById(R.id.textview_wednesday)); - days_TextView.add(findViewById(R.id.textview_thursday)); - days_TextView.add(findViewById(R.id.textview_friday)); - days_TextView.add(findViewById(R.id.textview_saturday)); - days_TextView.add(findViewById(R.id.textview_sunday)); - } - - private void addExerciceListener() { /** - * Ajoute un exercice au jour courant dans la HashMap exoDetailsForEachDay et dans la ListView exos_current_day + * 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(); // Récupérer la valeur du champ de texte AutoCompleteTextView String exercise_searched = input_exo.getText().toString(); - // Récupérer la liste courante et ajouter l'exo aux jours correspondants dans la liste - for(int i = 0; i < current_days_checked.size(); i++){ - String current_day = current_days_checked.get(i); - ArrayList<Exercise> currentDayExercices = exoDetailsForEachDay.get(current_day); - assert currentDayExercices != null; + if(exercise_searched.equals("")){ + Toast.makeText(ProgramCreationActivity.this, "Veuillez entrer un exercice avant de vouloir l'ajouter !", + Toast.LENGTH_SHORT).show(); + }else{ + Dialog dialog = new Dialog(ProgramCreationActivity.this); + dialog.setContentView(R.layout.modify_exercice_popup); + dialog.show(); + // Ajouter un listener à chaque checkBox + 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 (CheckBox cb : cb_list) cb.setOnCheckedChangeListener(myCheckBoxListener); + + DatabaseReference workoutsDb = firebaseDb.getReference("Workouts"); + Query query = workoutsDb.orderByChild("name").equalTo(exercise_searched); + query.addValueEventListener(new ValueEventListener() { + @Override + public void onDataChange(DataSnapshot dataSnapshot) { + 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; + String description = snapshot.child("description").getValue(String.class); + + EditText description_text = dialog.findViewById(R.id.exercise_description); + EditText timer_edit = dialog.findViewById(R.id.exercise_timer); + TextView timer_text = dialog.findViewById(R.id.timer_text); + TextView break_text = dialog.findViewById(R.id.exercice_break); + + if(description != null){ + description_text.setText(description); + } + if(timer == 0){ + timer_edit.setVisibility(View.INVISIBLE); + timer_edit.setEnabled(false); + timer_text.setText(""); + }else{ + timer_edit.setText(timer.toString()); + } + if(break_time != null){ + break_text.setText(break_time.toString()); + } + int resId = getResources().getIdentifier(img_actual_exo, "drawable", getPackageName()); + ImageView image = dialog.findViewById(R.id.exercice_to_modify_image); + image.setImageResource(resId); + } + } - // Rechercher dans la HashMap si l'exo n'est pas déjà dedans - boolean exoAlreadyIn = false; - for (Exercise exo : currentDayExercices) { - if (Objects.equals(exo.name, exercise_searched)) exoAlreadyIn = true; - } + @Override + public void onCancelled(@NonNull DatabaseError databaseError) { + System.out.println(databaseError); + } + }); - if (!exoAlreadyIn) { - Query query = db.orderByChild("name").equalTo(exercise_searched); - query.addListenerForSingleValueEvent(new ValueEventListener() { - @Override - public void onDataChange(DataSnapshot dataSnapshot) { - for (DataSnapshot snapshot : dataSnapshot.getChildren()) { - String description = snapshot.child("description").getValue(String.class); - String imageUrl = snapshot.child("image_url").getValue(String.class); - int timer = snapshot.child("timer").getValue(Integer.class); - int breakVal = snapshot.child("break").getValue(Integer.class); - Exercise newExo = new Exercise(exercise_searched, description, breakVal, imageUrl, timer); - exoDetailsForEachDay.get(current_day).add(newExo); - System.out.println("exoDetailsForEachDay : " + exoDetailsForEachDay); - - // Si le jour affiché est le jour où l'exercice a été ajouté, mettre à jour la liste via l'adaptateur - if (Objects.equals(current_day, current_day_displayed)) { - currentExoList.clear(); - for (Exercise exo : exoDetailsForEachDay.get(current_day_displayed)) currentExoList.add(exo.name); - //currentExoList.add(newExo.name); - exercisesListAdapter.updateValues(currentExoList); - System.out.println("currentExoList : " + currentExoList); - } - // print dans la console juste pour vérifier que les listes sont correctes - for (Map.Entry<String, ArrayList<Exercise>> set : exoDetailsForEachDay.entrySet()) { - System.out.println(set.getKey() + " = " + set.getValue()); - } - } - } - - @Override - public void onCancelled(DatabaseError error) { - - } - }); - } - } - // Effacer le champ de texte AutoCompleteTextView - input_exo.setText(""); + + 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); + + 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(); + + 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); + } + addToProgram(actual_exo, new ArrayList<>(current_days_checked)); + dialog.dismiss(); + }); + + // Effacer le champ de texte AutoCompleteTextView + input_exo.setText(""); + } }); } @@ -336,50 +302,50 @@ public class ProgramCreationActivity extends AppCompatActivity { 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"); - }else{ - current_days_checked.add("lundi"); - } - } else if (buttonView == cb_mardi) { - if(current_days_checked.contains("mardi")){ - current_days_checked.remove("mardi"); - }else{ - current_days_checked.add("mardi"); - } - } else if (buttonView == cb_mercredi) { - if(current_days_checked.contains("mercredi")){ - current_days_checked.remove("mercredi"); - }else{ - current_days_checked.add("mercredi"); - } - } else if (buttonView == cb_jeudi) { - if(current_days_checked.contains("jeudi")){ - current_days_checked.remove("jeudi"); - }else{ - current_days_checked.add("jeudi"); - } - } else if (buttonView == cb_vendredi) { - if(current_days_checked.contains("vendredi")){ - current_days_checked.remove("vendredi"); - }else{ - current_days_checked.add("vendredi"); - } - } else if (buttonView == cb_samedi) { - if(current_days_checked.contains("samedi")){ - current_days_checked.remove("samedi"); - }else{ - current_days_checked.add("samedi"); - } - } else if (buttonView == cb_dimanche) { - if(current_days_checked.contains("dimanche")){ - current_days_checked.remove("dimanche"); - }else{ - current_days_checked.add("dimanche"); - } - //for (CheckBox cb : cb_list) if (!Objects.equals(cb, cb_dimanche)) cb.setChecked(false); + if (buttonView == cb_lundi) { + if(current_days_checked.contains("lundi")){ + current_days_checked.remove("lundi"); + }else{ + current_days_checked.add("lundi"); + } + } else if (buttonView == cb_mardi) { + if(current_days_checked.contains("mardi")){ + current_days_checked.remove("mardi"); + }else{ + current_days_checked.add("mardi"); + } + } else if (buttonView == cb_mercredi) { + if(current_days_checked.contains("mercredi")){ + current_days_checked.remove("mercredi"); + }else{ + current_days_checked.add("mercredi"); + } + } else if (buttonView == cb_jeudi) { + if(current_days_checked.contains("jeudi")){ + current_days_checked.remove("jeudi"); + }else{ + current_days_checked.add("jeudi"); + } + } else if (buttonView == cb_vendredi) { + if(current_days_checked.contains("vendredi")){ + current_days_checked.remove("vendredi"); + }else{ + current_days_checked.add("vendredi"); } + } else if (buttonView == cb_samedi) { + if(current_days_checked.contains("samedi")){ + current_days_checked.remove("samedi"); + }else{ + current_days_checked.add("samedi"); + } + } else if (buttonView == cb_dimanche) { + if(current_days_checked.contains("dimanche")){ + current_days_checked.remove("dimanche"); + }else{ + current_days_checked.add("dimanche"); + } + //for (CheckBox cb : cb_list) if (!Objects.equals(cb, cb_dimanche)) cb.setChecked(false); + } System.out.println(current_days_checked); } }; @@ -409,25 +375,49 @@ public class ProgramCreationActivity extends AppCompatActivity { }); } - public void onNewDayTextClick(View view){ - current_day_displayed = (String) view.getTag(); - TextView day = (TextView) view; - - for (TextView text : days_TextView) { - if (text.getTypeface().isBold()) text.setTypeface(Typeface.DEFAULT, Typeface.NORMAL); + private void addToProgram(Exercise exercise, ArrayList<String> trainingDays) { + /** + * Add the new exercise to the program + */ + if (exoInProgram(exercise)) { + Toast.makeText(this, "Exercice déjà dans le programme !", + Toast.LENGTH_SHORT).show(); + } else { + program.put(exercise, trainingDays); + exercisesListAdapter.add(exercise.name); } - day.setTypeface(Typeface.DEFAULT, Typeface.BOLD); + } - ArrayList<Exercise> exoList = exoDetailsForEachDay.get(current_day_displayed); + private boolean exoInProgram(Exercise exercise) { + /** + * Check if exercise is already in program + */ + for (Exercise ex : program.keySet()) { + if (ex.name == exercise.name) return true; + } + return false; + } - currentExoList.clear(); - for (Exercise exo : exoList) { - currentExoList.add(exo.name); + void convertToProgramByDay() { + /** + * Convert program (HashMap<Exercise, ArrayList<String>>) to programByDay (HashMap<String, ArrayList<Exercise>>) + */ + programByDay.put("lundi", new ArrayList<>()); + programByDay.put("mardi", new ArrayList<>()); + programByDay.put("mercredi", new ArrayList<>()); + programByDay.put("jeudi", new ArrayList<>()); + programByDay.put("vendredi", new ArrayList<>()); + programByDay.put("samedi", new ArrayList<>()); + programByDay.put("dimanche", new ArrayList<>()); + + for (Map.Entry<Exercise, ArrayList<String>> set : program.entrySet()) { + for (String day : set.getValue()) { + programByDay.get(day).add(set.getKey()); + } } - exercisesListAdapter.updateValues(currentExoList); - System.out.println("currentExoList : " + currentExoList); - System.out.println("day : " + current_day_displayed); - System.out.println("exos to display : " + exoList); + + System.out.println("program : " + program); + System.out.println("programByDay : " + programByDay); } } @@ -438,6 +428,7 @@ class Exercise implements Serializable { int breakVal; String image_url; int timer; + ArrayList<String> workingDays = new ArrayList<>(); public Exercise(String n, String desc, int b, String im, int t) { this.name = n; @@ -450,7 +441,7 @@ class Exercise implements Serializable { @NonNull @Override public String toString() { - return name + ", " + description + ", temps de pause : " + breakVal + ", image_url : " + image_url + ", timer : " + timer; + return name; } } diff --git a/app/src/main/java/be/lepl1509group13/workoutwarrior/ProgramDetailActivity.java b/app/src/main/java/be/lepl1509group13/workoutwarrior/ProgramDetailActivity.java index 65a0bae10d3f14a3eca9fdec14c6687134a981a9..01810455af67658aa2ea5f73786a4565cee2c802 100644 --- a/app/src/main/java/be/lepl1509group13/workoutwarrior/ProgramDetailActivity.java +++ b/app/src/main/java/be/lepl1509group13/workoutwarrior/ProgramDetailActivity.java @@ -4,12 +4,12 @@ import android.content.Intent; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; -import android.widget.Button; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; +import androidx.annotation.NonNull; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; import androidx.recyclerview.widget.LinearLayoutManager; @@ -39,7 +39,9 @@ public class ProgramDetailActivity extends AppCompatActivity implements ProgramA private final FirebaseDatabase firebaseDb = FirebaseDatabase.getInstance(); private DatabaseReference db; ImageButton return_btn; - TextView start_workout, delete_workout; + TextView start_workout, delete_workout, show_workout; + private boolean isLocalProgram = false; + private String[][] exercisesData = null; @Override protected void onCreate(Bundle savedInstanceState) { @@ -53,6 +55,12 @@ public class ProgramDetailActivity extends AppCompatActivity implements ProgramA //finish activity of there is no id if (id == 0){ this.finish(); } + delete_workout = findViewById(R.id.delete_workout); + delete_workout.setOnClickListener(view -> deleteWorkout()); + + show_workout = findViewById(R.id.show_workout); + show_workout.setOnClickListener(view -> showWorkout()); + db = firebaseDb.getReference("Programs"); getProgramData(id, this_intent.getStringExtra("name")); @@ -62,12 +70,23 @@ public class ProgramDetailActivity extends AppCompatActivity implements ProgramA start_workout = findViewById(R.id.start_workout); start_workout.setOnClickListener(view -> { Intent intent = new Intent(ProgramDetailActivity.this, WorkoutActivity.class); - intent.putExtra("id", id); + if(isLocalProgram){ + //si c'est un programme perso et qu'on clique sur démarrer + //on envoie un id qui est égal à 0, pour que Workout Activity comprenne que c'est un exercise perso + intent.putExtra("id", 0); + //on envoie la liste des exos sous forme de liste + intent.putExtra("exercisesData", exercisesData); + }else{ + //si c'est un programme de la base de donnée et qu'on clique sur démarrer + //on envoie l'id du programme dans l'activité WorkoutActivity + intent.putExtra("id", id); + } startActivity(intent); }); + } - delete_workout = findViewById(R.id.delete_workout); - delete_workout.setOnClickListener(view -> deleteWorkout()); + private void showWorkout() { + //todo } private void deleteWorkout() { @@ -125,11 +144,7 @@ public class ProgramDetailActivity extends AppCompatActivity implements ProgramA private void getProgramData(int id, String name){ if(id == -1){ //It's a custom program - - //TEMPORAIRE !!! - Button start = findViewById(R.id.start_workout); - start.setVisibility(View.INVISIBLE); - + isLocalProgram = true; try { // recup files saved (garde que ".ser") File dir = getFilesDir(); @@ -159,7 +174,8 @@ public class ProgramDetailActivity extends AppCompatActivity implements ProgramA int totalExercises = 0; for (Exercise values : set.getValue()){totalExercises ++;} - String[][] exercisesData = new String[totalExercises][]; + //String[][] exercisesData = new String[totalExercises][]; + exercisesData = new String[totalExercises][]; //for each exercises in the current day, get the details int exerciseId = 0; @@ -184,16 +200,16 @@ public class ProgramDetailActivity extends AppCompatActivity implements ProgramA fileInputStream.close(); } } - } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); } }else{ - Button delete = findViewById(R.id.delete_workout); - delete.setVisibility(View.INVISIBLE); + isLocalProgram = false; + delete_workout.setVisibility(View.INVISIBLE); + show_workout.setVisibility(View.INVISIBLE); db.addValueEventListener(new ValueEventListener() { @Override - public void onDataChange(DataSnapshot snapshot) { + public void onDataChange(@NonNull DataSnapshot snapshot) { DataSnapshot program = snapshot.child(Integer.toString(id)); //update the title of the program @@ -209,7 +225,7 @@ public class ProgramDetailActivity extends AppCompatActivity implements ProgramA } @Override - public void onCancelled(DatabaseError error) { + public void onCancelled(@NonNull DatabaseError error) { Toast.makeText(ProgramDetailActivity.this, "Fail to get data.", Toast.LENGTH_SHORT).show(); } }); @@ -219,7 +235,7 @@ public class ProgramDetailActivity extends AppCompatActivity implements ProgramA private void getExercisesData(String[] exercises_id){ db.addValueEventListener(new ValueEventListener() { @Override - public void onDataChange(DataSnapshot snapshot) { + public void onDataChange(@NonNull DataSnapshot snapshot) { String[][] exercisesData = new String[exercises_id.length][]; //For each exercises that is link with the program in the database, add the data @@ -242,7 +258,7 @@ public class ProgramDetailActivity extends AppCompatActivity implements ProgramA } @Override - public void onCancelled(DatabaseError error) { + public void onCancelled(@NonNull DatabaseError error) { Toast.makeText(ProgramDetailActivity.this, "Fail to get data.", Toast.LENGTH_SHORT).show(); } }); diff --git a/app/src/main/java/be/lepl1509group13/workoutwarrior/WorkoutActivity.java b/app/src/main/java/be/lepl1509group13/workoutwarrior/WorkoutActivity.java index 36892c9f60d0823b9a00d1ca527eef0ef3e9a8cd..58141cfc1e2a8c8acb55d3b84b863ae901c9a552 100644 --- a/app/src/main/java/be/lepl1509group13/workoutwarrior/WorkoutActivity.java +++ b/app/src/main/java/be/lepl1509group13/workoutwarrior/WorkoutActivity.java @@ -8,6 +8,7 @@ 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; import android.widget.ImageButton; @@ -21,9 +22,6 @@ import com.google.firebase.database.DatabaseReference; import com.google.firebase.database.FirebaseDatabase; import com.google.firebase.database.ValueEventListener; -import org.w3c.dom.Text; - -import java.util.Locale; import java.util.Objects; public class WorkoutActivity extends AppCompatActivity { @@ -34,7 +32,7 @@ public class WorkoutActivity extends AppCompatActivity { private DatabaseReference db; private Integer numberOfWorkouts; private int[] workout_id = new int[25]; - private boolean is_countdown = false; + private int timer; @@ -42,9 +40,11 @@ public class WorkoutActivity extends AppCompatActivity { 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 enclenché - private boolean workout_timer_counting = false; // vrai si le timer de l'exo est enclenché - private long timeLeftInMillis; + private boolean set_break_timer_counting = false; // vrai si le timer de pause est en train de décompter + 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; @@ -54,20 +54,25 @@ public class WorkoutActivity extends AppCompatActivity { setContentView(R.layout.activity_workout); getSupportActionBar().hide(); + next_btn = findViewById(R.id.next_btn); + next_btn.setOnClickListener(v -> onNextClick()); + //get the id of the workout && launch the workout Intent intent = this.getIntent(); int id = intent.getIntExtra("id", 0); - //finish activity of there is no id - if (id == 0){ this.finish(); } - - db = firebaseDb.getReference("Programs"); - getProgramData(id); - - Button next_btn = findViewById(R.id.next_btn); - next_btn.setOnClickListener(v -> onNextClick()); + //if the id is 0, then it's a custom program + if (id == 0){ + String[][] exercisesData = (String[][]) intent.getSerializableExtra("exercisesData"); + //todo pour Killian + }else{ + //it's a program from the database + db = firebaseDb.getReference("Programs"); + getProgramData(id); + } 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(); }); @@ -79,14 +84,17 @@ public class WorkoutActivity extends AppCompatActivity { //Check if the user click on "start timer" Button launch_timer = findViewById(R.id.launch_timer); launch_timer.setOnClickListener(view -> { - updateTimer(timer, true); + countdown = workout_timer(timer); + countdown.start(); launch_timer.setVisibility(View.INVISIBLE); + workout_timer_started = true; + workout_timer_counting = true; }); timeLeftInMillis = timer; } // Timer entre les séries - CountDownTimer set_timer() { + CountDownTimer workout_break_timer() { CountDownTimer timer = new CountDownTimer(set_break_timer, 1000) { public void onTick(long millisUntilFinished) { set_break_timer_text.setText("Temps restant: " + millisUntilFinished / 1000); @@ -101,8 +109,11 @@ public class WorkoutActivity extends AppCompatActivity { if (vibrator.hasVibrator()) { vibrator.vibrate(vibrationDuration); } - updateTimer((int) timeLeftInMillis, true); - workout_timer_counting = true; + if (workout_timer_started) { + countdown = workout_timer((int) timeLeftInMillis); + countdown.start(); + workout_timer_counting = true; + } } }; return timer; @@ -169,14 +180,19 @@ public class WorkoutActivity extends AppCompatActivity { set_break_timer = workout.child("break").getValue(Integer.class); set_break_timer_text.setText(String.valueOf(set_break_timer/1000) + " secondes"); - set_countDownTimer = set_timer(); + 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; - updateTimer((int) timeLeftInMillis, true); - workout_timer_counting = true; + + // 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(); @@ -195,8 +211,12 @@ public class WorkoutActivity extends AppCompatActivity { launch_timer.setVisibility(View.VISIBLE); }else{ launch_timer.setVisibility(View.INVISIBLE); - updateTimer(0, false); + if (countdown != null) { + countdown.cancel(); + countdown.onFinish(); + } } + } @Override @@ -208,28 +228,37 @@ public class WorkoutActivity extends AppCompatActivity { @SuppressLint("SetTextI18n") private void onNextClick() { - if (set_countDownTimer != null) set_countDownTimer.cancel(); + try { + 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; + } TextView name = findViewById(R.id.workout_todo); TextView description = findViewById(R.id.workout_detail); ImageView image = findViewById(R.id.workout_image); - Button btn_next = findViewById(R.id.next_btn); - //Reset countdown of the exercise and hide button - if(is_countdown){ - countdown.cancel(); - } - updateTimer(0, false); + Button launch_timer = findViewById(R.id.launch_timer); launch_timer.setVisibility(View.INVISIBLE); if(step == 0){ finish(); } - // If it's not the last exercice, break and next exercice + // If it's not the last exercice, take a break then next exercice else if(!Objects.equals(numberOfWorkouts, step)){ TextView timer_break = findViewById(R.id.timer_break); - CountDownTimer countDownBreak = new CountDownTimer(2000, 1000) { + + CountDownTimer countDownBreak = new CountDownTimer(10000, 1000) { @Override public void onTick(long l) { timer_break.setText(""); @@ -237,8 +266,8 @@ public class WorkoutActivity extends AppCompatActivity { description.setText(""); image.setVisibility(View.INVISIBLE); timer_break.setText("" + l/1000); - btn_next.setVisibility(View.INVISIBLE); - set_break_timer_text.setText(""); + //btn_next.setVisibility(View.INVISIBLE); + set_break_timer_text.setText("Il est temps de prendre une pause..."); set_break_btn.setVisibility(View.INVISIBLE); } @@ -246,45 +275,53 @@ public class WorkoutActivity extends AppCompatActivity { public void onFinish() { timer_break.setText(""); image.setVisibility(View.VISIBLE); - btn_next.setVisibility(View.VISIBLE); + next_btn.setVisibility(View.VISIBLE); set_break_btn.setVisibility(View.VISIBLE); db = firebaseDb.getReference("Workouts"); getWorkoutData(Integer.toString(workout_id[step - 1])); step ++; } - }.start(); + }; + countDownBreak.start(); + next_btn.setText("Passer"); + next_btn.setOnClickListener(v -> { + countDownBreak.cancel(); + countDownBreak.onFinish(); + next_btn.setText("Suivant"); + next_btn.setOnClickListener(v1 -> onNextClick()); + }); } else if (numberOfWorkouts.equals(step)) { - name.setText("Workout terminé!"); + name.setText("Entrainement terminé!"); description.setText(""); - btn_next.setText("Retour à l'accueil"); + 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); } - void updateTimer(Integer millis, Boolean isTime){ + CountDownTimer workout_timer(Integer millis){ workout_timer_counting = true; TextView timer = findViewById(R.id.workout_timer); - if(!isTime){ - timer.setText(""); - }else{ - countdown = new CountDownTimer(millis, 1000) { - public void onTick(long millisUntilFinished) { - is_countdown = true; - int seconds = (int) (millisUntilFinished / 1000); - int minutes = seconds / 60; - seconds = seconds % 60; - timer.setText(String.format("%d:%02d", minutes, seconds)); - timeLeftInMillis = millisUntilFinished; - } - public void onFinish() { - is_countdown = false; - timer.setText("Temps dépassé!"); + CountDownTimer countdownTimer = new CountDownTimer(millis, 1000) { + public void onTick(long millisUntilFinished) { + int seconds = (int) (millisUntilFinished / 1000); + int minutes = seconds / 60; + seconds = seconds % 60; + timer.setText(String.format("%d:%02d", minutes, seconds)); + timeLeftInMillis = millisUntilFinished; + } + public void onFinish() { + if (workout_timer_counting) { + timeLeftInMillis = 0; + timer.setText("Workout terminé!"); + workout_timer_counting = false; } - }.start(); - } + } + }; + return countdownTimer; } } diff --git a/app/src/main/res/drawable/check.png b/app/src/main/res/drawable/check.png new file mode 100644 index 0000000000000000000000000000000000000000..441557fe2ec43b86742df99c22085e71107c0468 Binary files /dev/null and b/app/src/main/res/drawable/check.png differ diff --git a/app/src/main/res/drawable/menu.png b/app/src/main/res/drawable/menu.png new file mode 100644 index 0000000000000000000000000000000000000000..c8f355e0e25f19438a9c7684e24dd29d809b43e1 Binary files /dev/null and b/app/src/main/res/drawable/menu.png differ diff --git a/app/src/main/res/layout/activity_account.xml b/app/src/main/res/layout/activity_account.xml index 8767900d6713c4f3ab20ab8e8c412c37462db7cb..18b81bf3827654df43a9c44492349caf1040827d 100644 --- a/app/src/main/res/layout/activity_account.xml +++ b/app/src/main/res/layout/activity_account.xml @@ -21,7 +21,7 @@ tools:text="Hello" /> <RelativeLayout - android:id="@+id/field_layout" + android:id="@+id/field_pseudo_layout" android:layout_width="match_parent" android:layout_height="wrap_content" app:layout_constraintBottom_toBottomOf="parent" @@ -31,31 +31,16 @@ android:padding="10dp"> <com.google.android.material.textfield.TextInputLayout - android:id="@+id/email_layout" + android:id="@+id/pseudo_layout" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true"> <com.google.android.material.textfield.TextInputEditText - android:id="@+id/email" + android:id="@+id/pseudo" android:layout_width="300dp" android:layout_height="wrap_content" - android:hint="Email" /> - - </com.google.android.material.textfield.TextInputLayout> - - <com.google.android.material.textfield.TextInputLayout - android:id="@+id/password_layout" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_centerHorizontal="true" - android:layout_marginTop="60dp"> - - <com.google.android.material.textfield.TextInputEditText - android:id="@+id/password" - android:layout_width="300dp" - android:layout_height="wrap_content" - android:hint="Password" /> + android:hint="Pseudo" /> </com.google.android.material.textfield.TextInputLayout> @@ -68,21 +53,14 @@ android:layout_alignParentEnd="true" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/field_layout" + app:layout_constraintTop_toBottomOf="@+id/field_pseudo_layout" android:gravity="center"> <Button - android:id="@+id/login" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="Se connecter" /> - - <Button - android:id="@+id/register" + android:id="@+id/register_pseudo" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="S'enregistrer" - android:layout_marginLeft="10dp"/> + android:text="Enregistrer" /> </LinearLayout> diff --git a/app/src/main/res/layout/activity_account_login.xml b/app/src/main/res/layout/activity_account_login.xml new file mode 100644 index 0000000000000000000000000000000000000000..8767900d6713c4f3ab20ab8e8c412c37462db7cb --- /dev/null +++ b/app/src/main/res/layout/activity_account_login.xml @@ -0,0 +1,131 @@ +<?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" + tools:context=".AccountActivity"> + + <TextView + android:id="@+id/account_title" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="80dp" + android:paddingHorizontal="20dp" + android:textAlignment="center" + android:textSize="20sp" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.0" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/relativeLayout" + tools:text="Hello" /> + + <RelativeLayout + android:id="@+id/field_layout" + android:layout_width="match_parent" + android:layout_height="wrap_content" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + android:padding="10dp"> + + <com.google.android.material.textfield.TextInputLayout + android:id="@+id/email_layout" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_centerHorizontal="true"> + + <com.google.android.material.textfield.TextInputEditText + android:id="@+id/email" + android:layout_width="300dp" + android:layout_height="wrap_content" + android:hint="Email" /> + + </com.google.android.material.textfield.TextInputLayout> + + <com.google.android.material.textfield.TextInputLayout + android:id="@+id/password_layout" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_centerHorizontal="true" + android:layout_marginTop="60dp"> + + <com.google.android.material.textfield.TextInputEditText + android:id="@+id/password" + android:layout_width="300dp" + android:layout_height="wrap_content" + android:hint="Password" /> + + </com.google.android.material.textfield.TextInputLayout> + + </RelativeLayout> + + <LinearLayout + android:id="@+id/button_layout" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_alignParentEnd="true" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/field_layout" + android:gravity="center"> + + <Button + android:id="@+id/login" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="Se connecter" /> + + <Button + android:id="@+id/register" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="S'enregistrer" + android:layout_marginLeft="10dp"/> + + </LinearLayout> + + <RelativeLayout + android:id="@+id/relativeLayout" + android:layout_width="match_parent" + android:layout_height="80dp" + android:background="@color/orange" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + + <ImageButton + android:id="@+id/return_from_account" + android:layout_width="66dp" + android:layout_height="61dp" + android:layout_marginStart="10dp" + android:layout_marginTop="10dp" + android:layout_marginEnd="10dp" + android:layout_marginBottom="10dp" + android:background="@color/orange" + android:paddingLeft="10dp" + android:paddingTop="1dp" + android:paddingRight="10dp" + android:paddingBottom="4dp" + android:scaleType="fitCenter" + android:src="@drawable/return_button" + android:textAlignment="center" + android:textSize="16sp" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + + + + <Button + android:id="@+id/logout" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="Deconnexion" + android:backgroundTint="@color/orange" + app:layout_constraintBottom_toBottomOf="@+id/relativeLayout" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toTopOf="parent" + android:layout_marginRight="10dp"/> + +</androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_detail_program.xml b/app/src/main/res/layout/activity_detail_program.xml index 71611fd9f2306e0bb4cef096b3bae4aef842e6e2..c51058b09796eaf173a83da195376927ed14b0d6 100644 --- a/app/src/main/res/layout/activity_detail_program.xml +++ b/app/src/main/res/layout/activity_detail_program.xml @@ -35,6 +35,20 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> + <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" + android:layout_marginEnd="15dp" + app:layout_constraintBottom_toBottomOf="@+id/navigation_menu" + app:layout_constraintEnd_toEndOf="@+id/navigation_menu" + app:layout_constraintTop_toTopOf="@+id/navigation_menu" /> + <ScrollView android:id="@+id/scrollView_program_view" android:layout_width="377dp" @@ -98,12 +112,12 @@ app:layout_constraintStart_toStartOf="parent" /> <Button - android:id="@+id/delete_workout" + 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/delete_workout" + android:text="@string/show_workout" android:textColor="@color/black" app:iconTint="@color/orange" app:layout_constraintBottom_toBottomOf="parent" @@ -111,5 +125,4 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/start_workout" /> - </androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 6e83f1921b6a96538cc4af0a7b40c3906be0d4ce..7c8bf82de008aa805854b5daa2c16a19628cb6d7 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,107 +1,123 @@ <?xml version="1.0" encoding="utf-8"?> -<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" +<androidx.drawerlayout.widget.DrawerLayout 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" - tools:context=".MainActivity"> + tools:context=".MainActivity" + tools:openDrawer="start" + android:id="@+id/drawer_layout"> <androidx.constraintlayout.widget.ConstraintLayout - android:id="@+id/top" - android:layout_width="376dp" - android:layout_height="90dp" - android:padding="16dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.542" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" - app:layout_constraintVertical_bias="0.04"> - - - <ImageView - android:id="@+id/imageView" - android:layout_width="56dp" - android:layout_height="56dp" - android:adjustViewBounds="false" - android:background="@drawable/homepage_activities_border" - android:clipToOutline="true" - android:fadingEdgeLength="10dp" - android:scaleType="centerCrop" - android:src="@drawable/logo" + android:layout_width="match_parent" + android:layout_height="match_parent"> + + <androidx.constraintlayout.widget.ConstraintLayout + android:id="@+id/top" + android:layout_width="376dp" + android:layout_height="90dp" + android:padding="16dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.0" + app:layout_constraintHorizontal_bias="0.542" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" - app:layout_constraintVertical_bias="0.0" /> + app:layout_constraintVertical_bias="0.04"> - <TextView - android:id="@+id/welcomebacktxt" - android:layout_width="wrap_content" - android:layout_height="65dp" - android:fontFamily="@font/poppins_semibold" - android:gravity="center" - android:text="@string/bienvenue_message" - android:textSize="29sp" - app:layout_constraintBottom_toBottomOf="parent" + + <ImageView + android:id="@+id/imageView" + android:layout_width="56dp" + android:layout_height="56dp" + android:adjustViewBounds="false" + android:background="@drawable/homepage_activities_border" + android:clipToOutline="true" + android:fadingEdgeLength="10dp" + android:scaleType="centerCrop" + android:src="@drawable/logo" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.0" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintVertical_bias="0.0" /> + + <TextView + android:id="@+id/welcomebacktxt" + android:layout_width="wrap_content" + android:layout_height="65dp" + android:fontFamily="@font/poppins_semibold" + android:gravity="center" + android:text="@string/bienvenue_message" + android:textSize="29sp" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.054" + app:layout_constraintStart_toEndOf="@+id/imageView" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintVertical_bias="0.0" + tools:text="Bienvenue" /> + + <ImageButton + android:id="@+id/account" + android:layout_width="32dp" + android:layout_height="32dp" + android:adjustViewBounds="false" + android:background="@drawable/homepage_activities_border" + android:clipToOutline="true" + android:scaleType="centerCrop" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toTopOf="parent" + android:src="@drawable/menu" + app:tint="@color/orange" /> + + </androidx.constraintlayout.widget.ConstraintLayout> + + <ScrollView + android:id="@+id/scrollView2" + android:layout_width="377dp" + android:layout_height="450dp" + android:fillViewport="true" app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.054" - app:layout_constraintStart_toEndOf="@+id/imageView" - app:layout_constraintTop_toTopOf="parent" - app:layout_constraintVertical_bias="0.0" - tools:text="Bienvenue" /> - - <ImageButton - android:id="@+id/account" - android:layout_width="32dp" - android:layout_height="32dp" - android:adjustViewBounds="false" - android:background="@drawable/homepage_activities_border" - android:clipToOutline="true" - android:scaleType="centerCrop" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/top" + android:layout_marginTop="20dp" > + + <androidx.recyclerview.widget.RecyclerView + android:id="@+id/homepage_recycler" + android:layout_width="match_parent" + android:layout_height="match_parent" + app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"/> + + </ScrollView> + + <RelativeLayout + android:layout_width="wrap_content" + android:layout_height="wrap_content" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintTop_toTopOf="parent" - android:src="@drawable/user" - app:tint="@color/orange" /> + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/scrollView2"> + + <Button + android:id="@+id/program_creation_button" + android:layout_width="318dp" + android:layout_height="37dp" + android:backgroundTint="@color/orange" + android:clipToOutline="true" + android:text="Créer un programme" /> + + </RelativeLayout> </androidx.constraintlayout.widget.ConstraintLayout> - <ScrollView - android:id="@+id/scrollView2" - android:layout_width="377dp" - android:layout_height="450dp" - android:fillViewport="true" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/top" - android:layout_marginTop="20dp" > - - <androidx.recyclerview.widget.RecyclerView - android:id="@+id/homepage_recycler" - android:layout_width="match_parent" - android:layout_height="match_parent" - app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"/> - - </ScrollView> - - <RelativeLayout + <com.google.android.material.navigation.NavigationView + android:id="@+id/navigation_view" android:layout_width="wrap_content" - android:layout_height="wrap_content" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/scrollView2"> - - <Button - android:id="@+id/program_creation_button" - android:layout_width="318dp" - android:layout_height="37dp" - android:backgroundTint="@color/orange" - android:clipToOutline="true" - android:text="Créer un programme" /> - - </RelativeLayout> - -</androidx.constraintlayout.widget.ConstraintLayout> + android:layout_height="match_parent" + android:layout_gravity="start" + app:menu="@menu/menu_main" + app:headerLayout="@layout/menu_header"/> + +</androidx.drawerlayout.widget.DrawerLayout> diff --git a/app/src/main/res/layout/activity_workout.xml b/app/src/main/res/layout/activity_workout.xml index 996a1c65006df8e0b47ef37aa5c6ae1de885de82..afe126e9d0f6aa2d1edb08241b7a1268a8d1e0a5 100644 --- a/app/src/main/res/layout/activity_workout.xml +++ b/app/src/main/res/layout/activity_workout.xml @@ -133,7 +133,7 @@ android:id="@+id/set_break_timer" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="Pause" + 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" diff --git a/app/src/main/res/layout/exercice.xml b/app/src/main/res/layout/exercises_list_row.xml similarity index 84% rename from app/src/main/res/layout/exercice.xml rename to app/src/main/res/layout/exercises_list_row.xml index f8ecb5100452bed45b5b6036b5dd3288cd11ad25..bb4172f98827769a7aa909fe948cadd4cdc7ea54 100644 --- a/app/src/main/res/layout/exercice.xml +++ b/app/src/main/res/layout/exercises_list_row.xml @@ -14,39 +14,50 @@ tools:ignore="MissingConstraints"> <TextView - android:id="@+id/exercice_name" + android:id="@+id/exercise_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toEndOf="@id/delete_button" android:text="Text"/> + + <LinearLayout android:id="@+id/buttons_layout" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentStart="true" android:orientation="horizontal"> + + <TextView + android:id="@+id/training_days" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_toEndOf="@id/delete_button" + android:paddingLeft="20dp" + android:text="Text"/> + <ImageView - android:id="@+id/delete_button" + android:id="@+id/edit_button" android:layout_marginLeft="30dp" android:layout_alignParentStart="true" android:clickable="true" android:src="@drawable/ic_launcher_background" - android:focusable="true" android:layout_width="20dp" - android:layout_height="20dp"/> + android:layout_height="20dp" + app:tint="@color/orange" /> <ImageView - android:id="@+id/edit_button" + android:id="@+id/delete_button" android:layout_marginLeft="30dp" android:layout_alignParentStart="true" android:clickable="true" android:src="@drawable/ic_launcher_background" + android:focusable="true" android:layout_width="20dp" - android:layout_height="20dp" - app:tint="@color/orange" /> + android:layout_height="20dp"/> </LinearLayout> </LinearLayout> diff --git a/app/src/main/res/layout/help_creation_program_popup.xml b/app/src/main/res/layout/help_creation_program_popup.xml index bd9e776b0e0f1c9dc3e35d9c43e5270514d594a5..6ef6772fab44c6d2b79a6663cf2ea55a3e5f986e 100644 --- a/app/src/main/res/layout/help_creation_program_popup.xml +++ b/app/src/main/res/layout/help_creation_program_popup.xml @@ -49,7 +49,7 @@ android:id="@+id/explication_text1" android:layout_width="350dp" android:layout_height="match_parent" - android:text="• Pour commencer, sélectionnez le(s) jour(s) au(x)quel(s) vous voulez ajouter un ou plusieurs exercices." + android:text="• Pour commencer, sélectionnez l'exercice que vous voulez ajouter à votre programme et cliquez sur 'ajouter un exercice'" android:textSize="16dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" /> @@ -59,7 +59,7 @@ android:layout_width="357dp" android:layout_height="65dp" android:layout_marginTop="15dp" - android:text="• Sélectionnez l'exercice que vous voulez ajouter pour ce(s) jour(s) dans la liste déroulante et cliquez sur le bouton ajouter exercice." + android:text="• Choisissez ensuite les jours auxquels vous voulez ajouter cet exercice." android:textSize="16dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -71,7 +71,7 @@ android:layout_width="350dp" android:layout_height="match_parent" android:layout_marginTop="15dp" - android:text="• Cliquez sur un jour pour voir le(s) exercice(s) enregistré(s) pour ce dernier." + android:text="• Personnalisez votre exercice en modifiant sa description, en ajustant son temps de pause ou sa durée totale." android:textSize="16dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -82,7 +82,7 @@ android:layout_width="350dp" android:layout_height="match_parent" android:layout_marginTop="15dp" - android:text="• Cliquez sur le bouton Enregistrer pour sauvegarder votre nouveau programme." + android:text="• Cliquez ensuite sur enregistrer pour sauver votre exercice personnalisé." android:textSize="16dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" diff --git a/app/src/main/res/layout/menu_header.xml b/app/src/main/res/layout/menu_header.xml new file mode 100644 index 0000000000000000000000000000000000000000..7e283f7810342a6a81b47142d11837f0be34d935 --- /dev/null +++ b/app/src/main/res/layout/menu_header.xml @@ -0,0 +1,49 @@ +<?xml version="1.0" encoding="utf-8"?> +<RelativeLayout 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="120dp" + android:background="@color/orange"> + + <androidx.constraintlayout.widget.ConstraintLayout + android:id="@+id/menu_layout" + android:layout_width="match_parent" + android:layout_height="match_parent"> + + <ImageView + android:id="@+id/menu_image" + android:layout_width="50dp" + android:layout_height="50dp" + android:src="@drawable/user" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + android:layout_marginLeft="30dp"/> + + <TextView + android:id="@+id/menu_title" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginLeft="10dp" + android:layout_toEndOf="@+id/menu_image" + android:text="Paramètres" + android:textSize="30sp" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintStart_toEndOf="@+id/menu_image" + app:layout_constraintTop_toTopOf="parent" /> + + <TextView + android:id="@+id/menu_text" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="Vous êtes connecté !" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/menu_title" /> + + </androidx.constraintlayout.widget.ConstraintLayout> + + + +</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 new file mode 100644 index 0000000000000000000000000000000000000000..fdb200a10dc5081bb8035d0c989560873f5c742c --- /dev/null +++ b/app/src/main/res/layout/modify_exercice_popup.xml @@ -0,0 +1,221 @@ +<?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"> + + <androidx.constraintlayout.widget.ConstraintLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + app:layout_constraintBottom_toTopOf="@+id/constraintLayout2" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintVertical_bias="0.260" + android:layout_marginTop="60dp" + android:layout_marginBottom="50dp"> + + <TextView + android:id="@+id/exercice_to_modify_name" + android:layout_width="200dp" + android:layout_height="wrap_content" + android:fontFamily="@font/poppins_semibold" + android:gravity="center" + android:textSize="20sp" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toEndOf="@+id/exercice_to_modify_image" + app:layout_constraintTop_toTopOf="parent" /> + + <ImageView + android:id="@+id/exercice_to_modify_image" + android:layout_width="110dp" + android:layout_height="110dp" + android:layout_marginLeft="25dp" + android:src="@drawable/developpe_couche_barre" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + + </androidx.constraintlayout.widget.ConstraintLayout> + + <androidx.constraintlayout.widget.ConstraintLayout + android:id="@+id/constraintLayout2" + android:layout_width="380dp" + android:layout_height="500dp" + android:layout_marginBottom="50dp" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.466" + app:layout_constraintStart_toStartOf="parent"> + + <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"> + + <LinearLayout + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:orientation="vertical" + android:layout_marginTop="35dp"> + + <TextView + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:fontFamily="@font/poppins" + android:text="Sélectionnez les jours pour lesquels l'exercice sera ajouté :" /> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical"> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="horizontal"> + + <CheckBox + android:id="@+id/checkbox_monday" + android:layout_width="100dp" + android:layout_height="wrap_content" + android:buttonTint="@color/orange" + android:fontFamily="@font/poppins" + android:text="Lundi"/> + + <CheckBox + android:id="@+id/checkbox_tuesday" + android:layout_width="100dp" + android:layout_height="wrap_content" + android:buttonTint="@color/orange" + android:fontFamily="@font/poppins" + android:text="Mardi"/> + + <CheckBox + android:id="@+id/checkbox_wednesday" + android:layout_width="100dp" + android:layout_height="wrap_content" + android:buttonTint="@color/orange" + android:fontFamily="@font/poppins" + android:text="Mercredi"/> + + </LinearLayout> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="horizontal"> + + <CheckBox + android:id="@+id/checkbox_thursday" + android:layout_width="100dp" + android:layout_height="wrap_content" + android:buttonTint="@color/orange" + android:fontFamily="@font/poppins" + android:text="Jeudi"/> + + <CheckBox + android:id="@+id/checkbox_friday" + android:layout_width="100dp" + android:layout_height="wrap_content" + android:buttonTint="@color/orange" + android:fontFamily="@font/poppins" + android:text="Vendredi"/> + + <CheckBox + android:id="@+id/checkbox_saturday" + android:layout_width="100dp" + android:layout_height="wrap_content" + android:buttonTint="@color/orange" + android:fontFamily="@font/poppins" + android:text="Samedi"/> + + </LinearLayout> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="horizontal"> + + <CheckBox + android:id="@+id/checkbox_sunday" + android:layout_width="110dp" + android:layout_height="wrap_content" + android:buttonTint="@color/orange" + android:fontFamily="@font/poppins" + android:text="Dimanche"/> + + </LinearLayout> + + </LinearLayout> + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical" + app:layout_constraintTop_toBottomOf="@+id/exercise_popup_image"> + + <TextView + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="Entrer la description de votre choix pour cet exercice"/> + + <EditText + android:id="@+id/exercise_description" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:hint="Description" + android:text=""/> + + <TextView + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="Gérez votre temps de pause en secondes"/> + + <EditText + android:id="@+id/exercice_break" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:hint="Pause" + android:text=""/> + + <TextView + android:id="@+id/timer_text" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="Entrez la durée totale de cet exercice"/> + + <EditText + android:id="@+id/exercise_timer" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:hint="Durée" + android:inputType="number" + android:text=""/> + + </LinearLayout> + <Button + android:id="@+id/btn_save_modif" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="Enregistrer" + android:backgroundTint="@color/orange"/> + </LinearLayout> + </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/program_creation.xml b/app/src/main/res/layout/program_creation.xml index 206282d1a295ccbecc701505e4c148a15a07019f..21d70e4d9af11241a5d6a70daa28c2ec1971ad8b 100644 --- a/app/src/main/res/layout/program_creation.xml +++ b/app/src/main/res/layout/program_creation.xml @@ -46,22 +46,6 @@ android:textAlignment="center" android:textSize="16sp" /> - <!-- - <Button - android:id="@+id/save_test" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginLeft="120dp" - android:layout_marginTop="12dp" - android:background="#FFFFFF" - android:backgroundTint="#FFFFFF" - android:clickable="true" - android:scaleType="fitCenter" - android:text="TEST" - android:textAlignment="center" - android:textSize="16sp" /> - --> - </RelativeLayout> <LinearLayout @@ -164,178 +148,10 @@ android:layout_height="wrap_content" android:layout_marginTop="14dp"> - <LinearLayout - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:orientation="vertical"> - - <TextView - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:fontFamily="@font/poppins" - android:text="Sélectionnez les jours pour lesquels l'exercice sera ajouté :" /> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="vertical"> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="horizontal"> - - <CheckBox - android:id="@+id/checkbox_monday" - android:layout_width="30dp" - android:layout_height="wrap_content" - android:buttonTint="@color/orange" - android:fontFamily="@font/poppins" /> - - <TextView - android:id="@+id/textview_monday" - android:layout_width="70dp" - android:layout_height="wrap_content" - android:clickable="true" - android:focusable="true" - android:fontFamily="@font/poppins" - android:onClick="onNewDayTextClick" - android:tag="lundi" - android:text="Lundi" - android:textSize="15dp" /> - - <CheckBox - android:id="@+id/checkbox_tuesday" - android:layout_width="30dp" - android:layout_height="wrap_content" - android:buttonTint="@color/orange" - android:fontFamily="@font/poppins" /> - - <TextView - android:id="@+id/textview_tuesday" - android:layout_width="70dp" - android:layout_height="wrap_content" - android:clickable="true" - android:focusable="true" - android:fontFamily="@font/poppins" - android:onClick="onNewDayTextClick" - android:tag="mardi" - android:text="Mardi" - android:textSize="15dp" /> - - <CheckBox - android:id="@+id/checkbox_wednesday" - android:layout_width="30dp" - android:layout_height="wrap_content" - android:buttonTint="@color/orange" - android:fontFamily="@font/poppins" /> - - <TextView - android:id="@+id/textview_wednesday" - android:layout_width="70dp" - android:layout_height="wrap_content" - android:clickable="true" - android:focusable="true" - android:fontFamily="@font/poppins" - android:onClick="onNewDayTextClick" - android:tag="mercredi" - android:text="Mercredi" - android:textSize="15dp" /> - - </LinearLayout> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="horizontal"> - - <CheckBox - android:id="@+id/checkbox_thursday" - android:layout_width="30dp" - android:layout_height="wrap_content" - android:buttonTint="@color/orange" - android:fontFamily="@font/poppins" /> - - <TextView - android:id="@+id/textview_thursday" - android:layout_width="70dp" - android:layout_height="wrap_content" - android:clickable="true" - android:focusable="true" - android:fontFamily="@font/poppins" - android:onClick="onNewDayTextClick" - android:tag="jeudi" - android:text="Jeudi" - android:textSize="15dp" /> - - <CheckBox - android:id="@+id/checkbox_friday" - android:layout_width="30dp" - android:layout_height="wrap_content" - android:buttonTint="@color/orange" - android:fontFamily="@font/poppins" /> - - <TextView - android:id="@+id/textview_friday" - android:layout_width="70dp" - android:layout_height="wrap_content" - android:clickable="true" - android:focusable="true" - android:fontFamily="@font/poppins" - android:onClick="onNewDayTextClick" - android:tag="vendredi" - android:text="Vendredi" - android:textSize="15dp" /> - - <CheckBox - android:id="@+id/checkbox_saturday" - android:layout_width="30dp" - android:layout_height="wrap_content" - android:buttonTint="@color/orange" - android:fontFamily="@font/poppins" /> - - <TextView - android:id="@+id/textview_saturday" - android:layout_width="70dp" - android:layout_height="wrap_content" - android:clickable="true" - android:focusable="true" - android:fontFamily="@font/poppins" - android:onClick="onNewDayTextClick" - android:tag="samedi" - android:text="Samedi" - android:textSize="15dp" /> - - </LinearLayout> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="horizontal"> - - <CheckBox - android:id="@+id/checkbox_sunday" - android:layout_width="30dp" - android:layout_height="wrap_content" - android:buttonTint="@color/orange" - android:fontFamily="@font/poppins" /> - - <TextView - android:id="@+id/textview_sunday" - android:layout_width="80dp" - android:layout_height="wrap_content" - android:clickable="true" - android:focusable="true" - android:fontFamily="@font/poppins" - android:onClick="onNewDayTextClick" - android:tag="dimanche" - android:text="Dimanche" - android:textSize="15dp" /> - - </LinearLayout> - - </LinearLayout> - </LinearLayout> + <androidx.recyclerview.widget.RecyclerView + android:id="@+id/exercise_recycler_view" + android:layout_width="match_parent" + android:layout_height="wrap_content" /> </RelativeLayout> </LinearLayout> @@ -351,7 +167,7 @@ android:layout_height="match_parent"> <ListView - android:id="@+id/exos_current_day_ListView" + android:id="@+id/exercisesView" android:layout_width="match_parent" android:layout_height="100dp" /> diff --git a/app/src/main/res/menu/menu_main.xml b/app/src/main/res/menu/menu_main.xml new file mode 100644 index 0000000000000000000000000000000000000000..427245be6e70a2aa3921361d85f2c70b6d91c46b --- /dev/null +++ b/app/src/main/res/menu/menu_main.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8"?> +<menu xmlns:android="http://schemas.android.com/apk/res/android"> + <group android:checkableBehavior="single"> + <item + android:id="@+id/menu_item_1" + android:title="Mon compte" /> + <item + android:id="@+id/menu_item_2" + android:title="Mes amis" /> + </group> +</menu> \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index daafd4599a7d636bfd77bcb343a7d04c1176315d..2624b16b5748a98d20d58629cc0d92c1930fc209 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -9,6 +9,7 @@ <string name="entrainement_badminton">Entrainement Badminton</string> <string name="launch_workout">Démarrer</string> <string name="delete_workout">Supprimer le programme</string> + <string name="show_workout">Afficher / Modifier le programme</string> <string name="title_activity_account">AccountActivity</string> <string name="prompt_email">Email</string> <string name="prompt_password">Password</string>