diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml new file mode 100644 index 0000000..654a0ab --- /dev/null +++ b/.idea/kotlinc.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 7e40091..00b8d47 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -2,6 +2,7 @@ plugins { alias(libs.plugins.android.application) alias(libs.plugins.google.android.libraries.mapsplatform.secrets.gradle.plugin) id("com.google.dagger.hilt.android") + alias(libs.plugins.kotlin.android) } android { @@ -34,13 +35,18 @@ android { buildFeatures { viewBinding = true } + kotlinOptions { + jvmTarget = "11" + } } dependencies { implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar", "*.aar")))) - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.1") - implementation("com.squareup.retrofit2:converter-gson:2.11.0") - implementation("com.squareup.retrofit2:retrofit:2.11.0") + implementation(libs.retrofit) + implementation(libs.okhttp) + implementation(libs.logging.interceptor) + implementation(libs.kotlinx.coroutines.android) + implementation(libs.converter.gson) implementation(libs.hilt.android) annotationProcessor(libs.hilt.compiler) implementation(libs.rxjava) diff --git a/app/src/main/java/com/example/quiz/AppModule.java b/app/src/main/java/com/example/quiz/AppModule.java index a2dd9f7..e69de29 100644 --- a/app/src/main/java/com/example/quiz/AppModule.java +++ b/app/src/main/java/com/example/quiz/AppModule.java @@ -1,27 +0,0 @@ -package com.example.quiz; - -import com.example.quiz.data.BetsBank; -import com.example.quiz.data.repository.BetRepository; - -import javax.inject.Singleton; - -import dagger.Module; -import dagger.Provides; -import dagger.hilt.InstallIn; -import dagger.hilt.components.SingletonComponent; - -@Module -@InstallIn(SingletonComponent.class) -public class AppModule { - @Provides - @Singleton - public BetsBank provideApiService(){ - return BetsBank.getInstance(); - } - - @Provides - @Singleton - public BetRepository provideBetRepository() { - return new BetRepository(); - } -} diff --git a/app/src/main/java/com/example/quiz/BetValidation.java b/app/src/main/java/com/example/quiz/BetValidation.java index c60d3e2..6a803de 100644 --- a/app/src/main/java/com/example/quiz/BetValidation.java +++ b/app/src/main/java/com/example/quiz/BetValidation.java @@ -17,24 +17,14 @@ import android.widget.GridLayout; import android.widget.TextView; import android.widget.Toast; -import com.example.quiz.data.model.Horse; +import com.example.quiz.data.model.Course; import com.example.quiz.data.model.Reunion; -import com.example.quiz.data.model.TypeOfBet; import com.example.quiz.databinding.FragmentBetValidationBinding; - import com.example.quiz.utils.HPRTPrinterUtil; -import com.example.quiz.viewModel.BetViewModel; import com.example.quiz.viewModel.SharedViewModel; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; import java.util.stream.Collectors; - import dagger.hilt.android.AndroidEntryPoint; /** @@ -50,18 +40,18 @@ public class BetValidation extends Fragment { SharedViewModel shared; - BetViewModel viewModel; private HPRTPrinterUtil printer; - private TypeOfBet typeOfBet; + private String typeOfBet; private Reunion reunion; - private List selectedHorses = new ArrayList(); + private Course course; + + private List selectedHorses = new ArrayList(); - private List totalHorses; @@ -92,27 +82,28 @@ public class BetValidation extends Fragment { private void setupNumberGrid(GridLayout grid) { binding.gridNumbers.removeAllViews(); - int columns = 4; - + int columns = 7; grid.setColumnCount(columns); - - if(totalHorses != null){ - totalHorses.stream() - .map(this::createNumberItem) - .forEach(grid::addView); + if(shared.selectedCourse.getValue() != null){ + for (int i = 1; i <= shared.selectedCourse.getValue().getNombreChevauxInscrits(); i++) { + createNumberItem(String.valueOf(i)); + grid.addView(createNumberItem(String.valueOf(i))); + } } + createNumberItem("X"); + grid.addView(createNumberItem("X")); } - private TextView createNumberItem(Horse horse) { + private TextView createNumberItem(String horse) { TextView textView = new TextView(requireContext()); - textView.setText(String.valueOf(horse.getNumber())); + textView.setText(horse); textView.setTextColor(getResources().getColor(R.color.white)); GridLayout.LayoutParams params = new GridLayout.LayoutParams(); - params.setMargins(10, 10, 10, 10); + params.setMargins(1, 1, 1, 1); textView.setLayoutParams(params); - textView.setTextSize(21); - textView.setWidth(130); - textView.setHeight(130); + textView.setTextSize(10); + textView.setWidth(80); + textView.setHeight(100); textView.setGravity(Gravity.CENTER); textView.setBackgroundResource(R.drawable.number_background); textView.setTextAlignment(View.TEXT_ALIGNMENT_CENTER); @@ -128,7 +119,7 @@ public class BetValidation extends Fragment { v.setBackgroundResource(R.drawable.number_selected_background); } String combinationText = selectedHorses.stream() - .map(h -> String.valueOf(h.getNumber())) + .map(h -> h) .collect(Collectors.joining("-")); binding.combination.setText(getString(R.string.combination, combinationText)); }); @@ -140,21 +131,17 @@ public class BetValidation extends Fragment { public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); shared = new ViewModelProvider(requireActivity()).get(SharedViewModel.class); - viewModel = new ViewModelProvider(this).get(BetViewModel.class); + /*viewModel = new ViewModelProvider(this).get(BetViewModel.class); viewModel.getBetNameById(shared.betId.getValue() - 1); viewModel.betName.observe(getViewLifecycleOwner(), name ->{ binding.horseName.setText(name); }); viewModel.loadHorses(shared.betId.getValue() - 1); - viewModel.horses.observe(getViewLifecycleOwner(), h->{ - this.totalHorses = h; - setupNumberGrid(binding.gridNumbers); - }); - shared.typeOfBet.observe(getViewLifecycleOwner(), type ->{ - this.typeOfBet = type; - }); - viewModel.loadReunionById(shared.betId.getValue() - 1); - reunion = viewModel.reunion.getValue(); + if(viewModel.partant.getValue() != null){ + this.totalHorses = viewModel.partant.getValue(); + }*/ + + setupNumberGrid(binding.gridNumbers); binding.paymentType.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView parent, View view, int position, long id) { @@ -180,13 +167,34 @@ public class BetValidation extends Fragment { Toast.makeText(getContext(), "Veuillez entrer un numéro de téléphone", Toast.LENGTH_SHORT).show(); return; } - Integer required = Integer.parseInt(typeOfBet.getNumberOfHorse()); - if(required == null){ + + if(shared.typeOfBet == null || shared.selectedReunion.getValue() == null || shared.selectedCourse == null){ + return; + } + typeOfBet = shared.typeOfBet.getValue(); + reunion = shared.selectedReunion.getValue(); + course = shared.selectedCourse.getValue(); + + int required = 0; + if(typeOfBet.toLowerCase().contains("couple")){ + required = 2; + } + if(typeOfBet.toLowerCase().contains("tierce")){ + required = 3; + } + if(typeOfBet.toLowerCase().contains("quarte")){ + required = 4; + } + if(typeOfBet.toLowerCase().contains("quinte")){ + required = 5; + } + + if(required == 0){ Toast.makeText(getContext(), "Erreur de type de pari", Toast.LENGTH_SHORT).show(); return; } - if(selectedHorses.size() != required){ - Toast.makeText(getContext(), "Veuillez sélectionner "+required+" chevaux", Toast.LENGTH_SHORT).show(); + if(selectedHorses.size() < required){ + Toast.makeText(getContext(), "Veuillez sélectionner au moins"+required+" chevaux", Toast.LENGTH_SHORT).show(); return; } printer = new HPRTPrinterUtil(getContext()); @@ -195,16 +203,16 @@ public class BetValidation extends Fragment { StringBuilder tspl = new StringBuilder(); tspl.append("PARIS HIPPIQUE (PMU MALI)\n"); - tspl.append(typeOfBet.getName()+"\n"); + tspl.append(typeOfBet).append("\n"); tspl.append("Tel: 555-1234\n"); tspl.append("----------------------------\n"); - tspl.append(reunion.getName()+"/"+reunion.getAddress()); + tspl.append(reunion.getNom()).append("/").append(course.getLieu()); tspl.append("----------------------------\n"); String combinationText = selectedHorses.stream() - .map(h -> String.valueOf(h.getNumber())) + .map(String::valueOf) .collect(Collectors.joining("-")); - tspl.append("COMBINAISON : "+combinationText); + tspl.append("COMBINAISON : ").append(combinationText); tspl.append("\n----------------------------\n"); @@ -216,7 +224,9 @@ public class BetValidation extends Fragment { printer.printText(tspl); } - + selectedHorses = List.of(); + binding.combination.setText(getString(R.string.combination,"")); + setupNumberGrid(binding.gridNumbers); }); binding.backBtn.setOnClickListener(v->{ diff --git a/app/src/main/java/com/example/quiz/ListOFBets.java b/app/src/main/java/com/example/quiz/ListOFBets.java index b1ad722..4ab997a 100644 --- a/app/src/main/java/com/example/quiz/ListOFBets.java +++ b/app/src/main/java/com/example/quiz/ListOFBets.java @@ -6,31 +6,29 @@ import android.os.Bundle; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; -import androidx.appcompat.widget.Toolbar; -import androidx.core.app.ActivityCompat; -import androidx.core.app.ComponentActivity; import androidx.fragment.app.Fragment; + import androidx.fragment.app.FragmentManager; +import androidx.lifecycle.Observer; import androidx.lifecycle.ViewModelProvider; import androidx.recyclerview.widget.GridLayoutManager; -import androidx.recyclerview.widget.LinearLayoutManager; -import android.service.controls.Control; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.view.animation.Animation; -import android.view.animation.AnimationUtils; -import android.view.animation.LayoutAnimationController; import android.widget.Toast; import com.example.quiz.data.adapter.BetsAdapter; +import com.example.quiz.data.model.Course; import com.example.quiz.databinding.FragmentListOFBettingBinding; -import com.example.quiz.viewModel.BetViewModel; +import com.example.quiz.utils.Result; +import com.example.quiz.viewModel.CourseViewModel; import com.example.quiz.viewModel.SharedViewModel; +import com.google.android.material.appbar.MaterialToolbar; + +import java.util.List; import dagger.hilt.android.AndroidEntryPoint; -import dagger.hilt.android.internal.lifecycle.HiltViewModelFactory; /** * A simple {@link Fragment} subclass. @@ -40,25 +38,21 @@ import dagger.hilt.android.internal.lifecycle.HiltViewModelFactory; @AndroidEntryPoint public class ListOFBets extends Fragment { - private String username; - - private View view; FragmentListOFBettingBinding binding; - private BetViewModel viewModel; - private SharedViewModel shared; + private CourseViewModel viewModel; + private BetsAdapter adapter; private AppCompatActivity activity; - public static ListOFBets newInstance(String username) { + public static ListOFBets newInstance() { ListOFBets fragment = new ListOFBets(); Bundle args = new Bundle(); - args.putString("ARG_USERNAME", username); fragment.setArguments(args); return fragment; } @@ -66,8 +60,13 @@ public class ListOFBets extends Fragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - if(getArguments() != null){ - username = getArguments().getString("ARG_USERNAME"); + AppCompatActivity activity = (AppCompatActivity) getActivity(); + if(activity != null){ + MaterialToolbar toolbar = activity.findViewById(R.id.toolbar); + activity.setSupportActionBar(toolbar); + if(activity.getSupportActionBar() != null){ + activity.getSupportActionBar().setTitle("Liste des courses"); + } } } @@ -75,24 +74,15 @@ public class ListOFBets extends Fragment { public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { binding = FragmentListOFBettingBinding.inflate(inflater, container, false); - activity = (AppCompatActivity) getActivity(); - if(activity != null){ - if(activity.getSupportActionBar() != null){ - activity.getSupportActionBar().show(); - activity.getSupportActionBar().setTitle("Liste des paris"); - } - } adapter = new BetsAdapter(); binding.recyclerView.setLayoutManager(new GridLayoutManager(getContext(), 2)); binding.recyclerView.setAdapter(adapter); - LayoutAnimationController controller = AnimationUtils.loadLayoutAnimation(getContext(), R.anim.layout_fad_in); - binding.recyclerView.setLayoutAnimation(controller); - viewModel = new ViewModelProvider(this).get(BetViewModel.class); + viewModel = new ViewModelProvider(this).get(CourseViewModel.class); shared = new ViewModelProvider(requireActivity()).get(SharedViewModel.class); - viewModel.bets.observe(getViewLifecycleOwner(), bets -> { + /*viewModel.bets.observe(getViewLifecycleOwner(), bets -> { adapter.setBets(bets); adapter.setOnItemClickListener(position -> { shared.setBetId(position); @@ -103,25 +93,42 @@ public class ListOFBets extends Fragment { .addToBackStack(null) .commit(); }); - }); + });*/ - viewModel.loadBets(); + //viewModel.loadBets(); + observe(); return binding.getRoot(); } + public void observe(){ + viewModel.getCourses().observe(getViewLifecycleOwner(), new Observer>>() { + @Override + public void onChanged(Result> result) { + switch (result.status){ + case LOADING: + Toast.makeText(getContext(), "Loading", Toast.LENGTH_SHORT).show(); + break; + case SUCCESS: + adapter.setBets(result.data); + adapter.setOnItemClickListener(course ->{ + shared.setSelectedCourse(course); + FragmentManager fragmentManager = getParentFragmentManager(); + ListOfTypeOfBets typeOfBets = ListOfTypeOfBets.newInstance(); + fragmentManager.beginTransaction() + .replace(R.id.nav_host_fragment_content_main, typeOfBets) + .addToBackStack(null) + .commit(); + }); + case ERROR: + break; + } + } + }); + } + @SuppressLint("UseSupportActionBar") @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); - AppCompatActivity activity = (AppCompatActivity) getActivity(); - if(activity!=null){ - Toolbar toolbar = activity.findViewById(R.id.toolbar); - toolbar.setBackgroundColor(getResources().getColor(R.color.primary_green)); - toolbar.setTitleTextColor(getResources().getColor(R.color.text_light_grey)); - activity.setSupportActionBar(toolbar); - if(activity.getSupportActionBar() != null){ - activity.getSupportActionBar().setTitle(username); - } - } } } \ No newline at end of file diff --git a/app/src/main/java/com/example/quiz/ListOfReunions.java b/app/src/main/java/com/example/quiz/ListOfReunions.java new file mode 100644 index 0000000..7703c8b --- /dev/null +++ b/app/src/main/java/com/example/quiz/ListOfReunions.java @@ -0,0 +1,126 @@ +package com.example.quiz; + +import android.os.Bundle; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.lifecycle.Observer; +import androidx.lifecycle.ViewModelProvider; +import androidx.recyclerview.widget.LinearLayoutManager; + +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Toast; +import android.widget.Toolbar; + +import com.example.quiz.data.adapter.ReunionAdapter; +import com.example.quiz.data.model.Reunion; +import com.example.quiz.databinding.FragmentListOfReunionsBinding; +import com.example.quiz.utils.Result; +import com.example.quiz.viewModel.ReunionViewModel; +import com.example.quiz.viewModel.SharedViewModel; +import com.google.android.material.appbar.MaterialToolbar; + +import java.util.List; + +import dagger.hilt.android.AndroidEntryPoint; + +/** + * A simple {@link Fragment} subclass. + * Use the {@link ListOfReunions#newInstance} factory method to + * create an instance of this fragment. + */ +@AndroidEntryPoint +public class ListOfReunions extends Fragment { + + FragmentListOfReunionsBinding binding; + + SharedViewModel shared; + + ReunionAdapter adapter; + + ReunionViewModel reunionViewModel; + + + public ListOfReunions() { + // Required empty public constructor + } + + public static ListOfReunions newInstance(String username) { + ListOfReunions fragment = new ListOfReunions(); + Bundle args = new Bundle(); + args.putString("USER_NAME", username); + fragment.setArguments(args); + return fragment; + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + } + + @Override + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + binding = FragmentListOfReunionsBinding.inflate(inflater, container, false); + adapter = new ReunionAdapter(); + binding.reunionsList.setLayoutManager(new LinearLayoutManager(getContext())); + binding.reunionsList.setAdapter(adapter); + reunionViewModel = new ViewModelProvider(this).get(ReunionViewModel.class); + shared = new ViewModelProvider(requireActivity()).get(SharedViewModel.class); + observeReunions(); + return binding.getRoot(); + } + + public void observeReunions(){ + reunionViewModel.getReunions().observe(getViewLifecycleOwner(), new Observer>>() { + @Override + public void onChanged(Result> result) { + switch (result.status) { + case LOADING: + Toast.makeText(getContext(), "Loading", Toast.LENGTH_SHORT).show(); + break; + case SUCCESS: + adapter.setReunions(result.data); + adapter.setOnItemClickListener(reunion->{ + shared.setSelectedReunion(reunion); + FragmentManager fragmentManager = getParentFragmentManager(); + ListOFBets bets = ListOFBets.newInstance(); + fragmentManager.beginTransaction() + .replace(R.id.nav_host_fragment_content_main, bets) + .addToBackStack(null) + .commit(); + }); + break; + case ERROR: + Toast.makeText(getContext(), result.message, Toast.LENGTH_SHORT).show(); + } + } + }); + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + + AppCompatActivity activity = (AppCompatActivity) getActivity(); + if (activity != null) { + MaterialToolbar toolbar = activity.findViewById(R.id.toolbar); + activity.setSupportActionBar(toolbar); + + if (activity.getSupportActionBar() != null) { + activity.getSupportActionBar().show(); + activity.getSupportActionBar().setTitle("Liste des réunions"); + } + + toolbar.setBackgroundColor(getResources().getColor(R.color.primary_green, null)); + toolbar.setTitleTextColor(getResources().getColor(R.color.white, null)); + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/example/quiz/ListOfTypeOfBets.java b/app/src/main/java/com/example/quiz/ListOfTypeOfBets.java index e376703..3cd090f 100644 --- a/app/src/main/java/com/example/quiz/ListOfTypeOfBets.java +++ b/app/src/main/java/com/example/quiz/ListOfTypeOfBets.java @@ -4,6 +4,7 @@ import android.os.Bundle; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.lifecycle.ViewModel; @@ -14,21 +15,16 @@ import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.view.animation.AnimationUtils; -import android.view.animation.LayoutAnimationController; -import android.widget.Adapter; import android.widget.Button; -import android.widget.LinearLayout; -import android.widget.RadioButton; -import android.widget.RadioGroup; import android.widget.Toast; import com.example.quiz.data.adapter.TypeOfBetAdapter; import com.example.quiz.databinding.FragmentListOfTypeOfBetsBinding; -import com.example.quiz.viewModel.BetViewModel; import com.example.quiz.viewModel.SharedViewModel; +import com.google.android.material.appbar.MaterialToolbar; import java.util.ArrayList; +import java.util.List; import dagger.hilt.android.AndroidEntryPoint; @@ -45,8 +41,6 @@ public class ListOfTypeOfBets extends Fragment { private SharedViewModel shared; - private BetViewModel viewModel; - private TypeOfBetAdapter adapter; public ListOfTypeOfBets() { @@ -62,6 +56,14 @@ public class ListOfTypeOfBets extends Fragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + AppCompatActivity activity = (AppCompatActivity) getActivity(); + if(activity != null){ + MaterialToolbar toolbar = activity.findViewById(R.id.toolbar); + activity.setSupportActionBar(toolbar); + if(activity.getSupportActionBar() != null){ + activity.getSupportActionBar().setTitle("Liste des jeux"); + } + } } @Override @@ -73,33 +75,45 @@ public class ListOfTypeOfBets extends Fragment { @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { - LayoutAnimationController controller = AnimationUtils.loadLayoutAnimation( - getContext(), - R.anim.layout_fad_in - ); - binding.typeOfBetRecyclerView.setLayoutAnimation(controller); - binding.typeOfBetRecyclerView.scheduleLayoutAnimation(); + super.onViewCreated(view, savedInstanceState); binding.typeOfBetRecyclerView.setLayoutManager(new LinearLayoutManager(getContext())); // ViewModels - viewModel = new ViewModelProvider(this).get(BetViewModel.class); + //viewModel = new ViewModelProvider(this).get(BetViewModel.class); shared = new ViewModelProvider(requireActivity()).get(SharedViewModel.class); // ⚡ Initialiser l’adapter UNE SEULE FOIS adapter = new TypeOfBetAdapter(new ArrayList<>()); adapter.setOnItemClickListener(type -> shared.setTypeOfBet(type)); binding.typeOfBetRecyclerView.setAdapter(adapter); - - // Charger les données - viewModel.loadTypes(shared.betId.getValue()-1); + List types = List.of("Couple Gagnant", "Couple Place", "Tierce", "Quinte"); // Observer les résultats - viewModel.types.observe(getViewLifecycleOwner(), types -> { - if (types != null) { - adapter.setTypes(types); + /*viewModel.types.observe(getViewLifecycleOwner(), type -> { + List types = List.of(); + if(type == null){ + return; } + switch (type){ + case TIERCE: + types = List.of("Couple Gagnant", "Couple Place", "Tierce"); + case QUARTE: + types = List.of("Couple Gagnant", "Couple Place", "Tierce", "Quarte"); + case QUINTE: + types = List.of("Couple Gagnant", "Couple Place", "Tierce", "Quinte"); + break; + } + adapter.setTypes(types); + });*/ + adapter.setTypes(types); + adapter.setOnItemClickListener(type -> { + shared.setTypeOfBet(type); }); Button btnValidate = binding.btnValidate; btnValidate.setOnClickListener(v->{ + if(shared.typeOfBet == null){ + Toast.makeText(getContext(),"Aucun Type de jeu choisi", Toast.LENGTH_SHORT).show(); + return; + } FragmentManager fragmentManager = getParentFragmentManager(); BetValidation betValidation = BetValidation.newInstance(); fragmentManager.beginTransaction() @@ -107,6 +121,5 @@ public class ListOfTypeOfBets extends Fragment { .addToBackStack(null) .commit(); }); - } } \ No newline at end of file diff --git a/app/src/main/java/com/example/quiz/Login.java b/app/src/main/java/com/example/quiz/Login.java index 698bc24..836b055 100644 --- a/app/src/main/java/com/example/quiz/Login.java +++ b/app/src/main/java/com/example/quiz/Login.java @@ -89,9 +89,9 @@ public class Login extends Fragment { prefsHelper = SharedPrefsHelper.getInstance(getContext()); prefsHelper.save("username", binding.userNameInput.getText().toString()); FragmentManager fragmentManager = getParentFragmentManager(); - ListOFBets bets = ListOFBets.newInstance(binding.userNameInput.getText().toString()); + ListOfReunions reunions = ListOfReunions.newInstance(binding.userNameInput.getText().toString()); fragmentManager.beginTransaction() - .replace(R.id.nav_host_fragment_content_main, bets) + .replace(R.id.nav_host_fragment_content_main, reunions) .commit(); } }); diff --git a/app/src/main/java/com/example/quiz/PageQuiz.java b/app/src/main/java/com/example/quiz/PageQuiz.java index 6a8efa9..83c9fc2 100644 --- a/app/src/main/java/com/example/quiz/PageQuiz.java +++ b/app/src/main/java/com/example/quiz/PageQuiz.java @@ -48,10 +48,10 @@ public class PageQuiz extends AppCompatActivity { FragmentManager fragmentManager = getSupportFragmentManager(); if(prefsHelper.get("username") != null){ - ListOFBets bets = ListOFBets.newInstance(prefsHelper.get("username")); + ListOfReunions reunions = ListOfReunions.newInstance(prefsHelper.get("username")); fragmentManager .beginTransaction() - .replace(R.id.nav_host_fragment_content_main, bets) + .replace(R.id.nav_host_fragment_content_main, reunions) .commit(); }else{ Login login = Login.newInstance(); diff --git a/app/src/main/java/com/example/quiz/Questions.java b/app/src/main/java/com/example/quiz/Questions.java deleted file mode 100644 index 975c6e0..0000000 --- a/app/src/main/java/com/example/quiz/Questions.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.example.quiz; - -import android.os.Bundle; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.fragment.app.Fragment; -import androidx.lifecycle.Observer; -import androidx.lifecycle.ViewModelProvider; - -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -import com.example.quiz.data.model.Question; -import com.example.quiz.databinding.FragmentQuestionsBinding; -import com.example.quiz.injection.QuestionViewModelFactory; -import com.example.quiz.viewModel.QuestionViewModel; - -public class Questions extends Fragment { - - private FragmentQuestionsBinding binding; - - private QuestionViewModel viewModel; - - public Questions() { - // Required empty public constructor - } - - public static Questions newInstance(String username) { - Questions fragment = new Questions(); - Bundle args = new Bundle(); - args.putString("ARG_USERNAME", username); - fragment.setArguments(args); - return fragment; - } - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - viewModel = new ViewModelProvider(this, QuestionViewModelFactory.getInstance()).get(QuestionViewModel.class); - } - - @Override - public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { - binding = FragmentQuestionsBinding.inflate(inflater, container, false); - // Inflate the layout for this fragment - return binding.getRoot(); - } - - - @Override - public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - viewModel.startQuiz(); - viewModel.currentQuestion.observe(getViewLifecycleOwner(), new Observer() { - @Override - public void onChanged(Question question) { - binding.questionText.setText(question.getQuestion()); - binding.answer1.setText(question.getAnswers().get(0)); - binding.answer2.setText(question.getAnswers().get(1)); - binding.answer3.setText(question.getAnswers().get(2)); - binding.answer4.setText(question.getAnswers().get(3)); - } - }); - } - - @Override - public void onStart() { - super.onStart(); - binding.nextButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - viewModel.nextQuestion(); - } - }); - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/example/quiz/Second2Fragment.java b/app/src/main/java/com/example/quiz/Second2Fragment.java deleted file mode 100644 index eceb1f8..0000000 --- a/app/src/main/java/com/example/quiz/Second2Fragment.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.example.quiz; - -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -import androidx.annotation.NonNull; -import androidx.fragment.app.Fragment; -import androidx.navigation.fragment.NavHostFragment; - -import com.example.quiz.databinding.FragmentSecond2Binding; - -public class Second2Fragment extends Fragment { - - private FragmentSecond2Binding binding; - - @Override - public View onCreateView( - @NonNull LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState - ) { - - binding = FragmentSecond2Binding.inflate(inflater, container, false); - return binding.getRoot(); - - } - - public void onViewCreated(@NonNull View view, Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - - binding.buttonSecond.setOnClickListener(v -> - NavHostFragment.findNavController(Second2Fragment.this) - .navigate(R.id.action_Second2Fragment_to_First2Fragment) - ); - } - - @Override - public void onDestroyView() { - super.onDestroyView(); - binding = null; - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/example/quiz/SecondFragment.java b/app/src/main/java/com/example/quiz/SecondFragment.java deleted file mode 100644 index 918b95c..0000000 --- a/app/src/main/java/com/example/quiz/SecondFragment.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.example.quiz; - -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -import androidx.annotation.NonNull; -import androidx.fragment.app.Fragment; -import androidx.navigation.fragment.NavHostFragment; - -import com.example.quiz.databinding.FragmentSecondBinding; - -public class SecondFragment extends Fragment { - - private FragmentSecondBinding binding; - - @Override - public View onCreateView( - @NonNull LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState - ) { - - binding = FragmentSecondBinding.inflate(inflater, container, false); - return binding.getRoot(); - - } - - public void onViewCreated(@NonNull View view, Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - - binding.buttonSecond.setOnClickListener(v -> - NavHostFragment.findNavController(SecondFragment.this) - .navigate(R.id.action_SecondFragment_to_FirstFragment) - ); - } - - @Override - public void onDestroyView() { - super.onDestroyView(); - binding = null; - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/example/quiz/data/BetsBank.java b/app/src/main/java/com/example/quiz/data/BetsBank.java deleted file mode 100644 index b9c223d..0000000 --- a/app/src/main/java/com/example/quiz/data/BetsBank.java +++ /dev/null @@ -1,119 +0,0 @@ -package com.example.quiz.data; - -import com.example.quiz.data.model.Bet; -import com.example.quiz.data.model.Horse; -import com.example.quiz.data.model.Reunion; -import com.example.quiz.data.model.TypeOfBet; - -import java.time.LocalDate; -import java.util.Arrays; -import java.util.List; - -public class BetsBank { - public List getBet() { - return Arrays.asList( - new Bet( - 1, - "Course de chevaux", - new Reunion(1, - "Réunion ", - LocalDate.of(2025,10,1), - "Hippodrome Verssaille" - ), - Arrays.asList( - new TypeOfBet(1, "Couplet", "2"), - new TypeOfBet(2, "Tierce", "3"), - new TypeOfBet(3, "Place", "1") - ), - LocalDate.of(2025,10,1), - Arrays.asList( - new Horse(1), - new Horse(2), - new Horse(3), - new Horse(4) - ) - ), - - new Bet( - 2, - "Course de chevaux 2", - new Reunion(2, - "Réunion 2", - LocalDate.of(2025,10,1), - "Hippodrome Bordeaux" - ), - Arrays.asList( - new TypeOfBet(1, "Quarte", "4"), - new TypeOfBet(2, "Quinte", "5"), - new TypeOfBet(3, "Placé", "1") - ), - LocalDate.of(2025,10,1), - Arrays.asList( - new Horse(4), - new Horse(5), - new Horse(7), - new Horse(6), - new Horse(8), - new Horse(9), - new Horse(10), - new Horse(11) - ) - ), - new Bet( - 3, - "Course de chevaux 3", - new Reunion(2, - "Réunion 2", - LocalDate.of(2025,10,1), - "Hippodrome Bordeaux" - ), - Arrays.asList( - new TypeOfBet(1, "Quarte", "4"), - new TypeOfBet(2, "Quinte", "5"), - new TypeOfBet(3, "Placé", "1") - ), - LocalDate.of(2025,10,1), - Arrays.asList( - new Horse(10), - new Horse(90), - new Horse(45), - new Horse(9) - ) - ), - new Bet( - 4, - "Course de chevaux 4", - new Reunion(2, - "Réunion 2", - LocalDate.of(2025,10,1), - "Hippodrome Bordeaux" - ), - Arrays.asList( - new TypeOfBet(1, "Couple", "2"), - new TypeOfBet(2, "Tierce", "3"), - new TypeOfBet(3, "Quarte", "4") - ), - LocalDate.of(2025,10,1), - Arrays.asList( - new Horse(5), - new Horse(33), - new Horse(26), - new Horse(99), - new Horse(100), - new Horse(101), - new Horse(102), - new Horse(103), - new Horse(104), - new Horse(105) - ) - ) - ); - } - public static BetsBank instance; - public static BetsBank getInstance(){ - if(instance == null){ - instance = new BetsBank(); - } - return instance; - } -} diff --git a/app/src/main/java/com/example/quiz/data/QuestionsBank.java b/app/src/main/java/com/example/quiz/data/QuestionsBank.java deleted file mode 100644 index 3384f21..0000000 --- a/app/src/main/java/com/example/quiz/data/QuestionsBank.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.example.quiz.data; -import com.example.quiz.data.model.Question; - -import java.util.Arrays; -import java.util.List; - -public class QuestionsBank { - public List getQuestions() { - return Arrays.asList( - new Question( - "Who is the creator of Android?", - Arrays.asList( - "Andy Rubin", - "Steve Wozniak", - "Jake Wharton", - "Paul Smith" - ), - 0 - ), - new Question( - "When did the first man land on the moon?", - Arrays.asList( - "1958", - "1962", - "1967", - "1969" - ), - 3 - ), - new Question( - "What is the house number of The Simpsons?", - Arrays.asList( - "42", - "101", - "666", - "742" - ), - 3 - ), - new Question( - "Who painteddid the Mona Lisa paint?", - Arrays.asList( - "Michelangelo", - "Leonardo Da Vinci", - "Raphael", - "Caravaggio" - ), - 1 - ), - new Question( - "What is the country top-level domain of Belgium?", - Arrays.asList( - ".bg", - ".bm", - ".bl", - ".be" - ), - 3 - ) - ); - } - private static QuestionsBank instance; - public static QuestionsBank getInstance() { - if (instance == null) { - instance = new QuestionsBank(); - } - return instance; - } -} \ No newline at end of file diff --git a/app/src/main/java/com/example/quiz/data/adapter/BetsAdapter.java b/app/src/main/java/com/example/quiz/data/adapter/BetsAdapter.java index 13c5c0e..8f5252c 100644 --- a/app/src/main/java/com/example/quiz/data/adapter/BetsAdapter.java +++ b/app/src/main/java/com/example/quiz/data/adapter/BetsAdapter.java @@ -10,18 +10,19 @@ import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; import com.example.quiz.R; -import com.example.quiz.data.model.Bet; +import com.example.quiz.data.model.Course; +import com.example.quiz.viewModel.SharedViewModel; import java.util.ArrayList; import java.util.List; public class BetsAdapter extends RecyclerView.Adapter { - private List bets = new ArrayList<>(); + private List bets = new ArrayList<>(); private onItemClickListener listener; public interface onItemClickListener { - void onItemClick(int position); + void onItemClick(Course bet); } public void setOnItemClickListener(onItemClickListener listener){ @@ -30,7 +31,7 @@ public class BetsAdapter extends RecyclerView.Adapter - public void setBets(List bets){ + public void setBets(List bets){ this.bets = bets; notifyDataSetChanged(); } @@ -44,12 +45,13 @@ public class BetsAdapter extends RecyclerView.Adapter @Override public void onBindViewHolder(@NonNull BetViewHolder holder, int position) { - Bet bet = bets.get(position); - holder.tvDate.setText(String.valueOf(bet.getDate())); - holder.tvName.setText(String.valueOf(bet.getName())); + Course bet = bets.get(position); + holder.tvDate.setText(String.valueOf(bet.getDateDepartCourse())); + holder.tvName.setText(String.valueOf(bet.getLieu())); + holder.tvReunion.setText("Nom de la réunion"); holder.itemView.setOnClickListener(v->{ if(listener != null){ - listener.onItemClick(bet.getId()); + listener.onItemClick(bet); } }); } @@ -63,11 +65,12 @@ public class BetsAdapter extends RecyclerView.Adapter } static class BetViewHolder extends RecyclerView.ViewHolder{ - TextView tvName, tvDate; + TextView tvName, tvDate, tvReunion; public BetViewHolder(@NonNull View itemView) { super(itemView); tvName = itemView.findViewById(R.id.tvName); tvDate = itemView.findViewById(R.id.tvDate); + tvReunion = itemView.findViewById(R.id.tvReunion); } } diff --git a/app/src/main/java/com/example/quiz/data/adapter/ReunionAdapter.java b/app/src/main/java/com/example/quiz/data/adapter/ReunionAdapter.java new file mode 100644 index 0000000..113debc --- /dev/null +++ b/app/src/main/java/com/example/quiz/data/adapter/ReunionAdapter.java @@ -0,0 +1,72 @@ +package com.example.quiz.data.adapter; + +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.example.quiz.R; +import com.example.quiz.data.model.Reunion; + +import java.util.ArrayList; +import java.util.List; + +public class ReunionAdapter extends RecyclerView.Adapter { + + private List reunions = List.of(); + + private onItemClickListener listener; + + public interface onItemClickListener { + void onItemClick(Reunion reunion); + } + + public void setOnItemClickListener(onItemClickListener listener){ + this.listener = listener; + } + + public void setReunions(List reunions){ + this.reunions = reunions; + notifyDataSetChanged(); + } + + @NonNull + @Override + public ReunionViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType){ + View view = LayoutInflater.from(parent.getContext()) + .inflate(R.layout.item_reunion, parent, false); + return new ReunionViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ReunionViewHolder holder, int position){ + Reunion reunion = reunions.get(position); + + holder.reunionName.setText(String.valueOf(reunion.getNom())); + holder.reunionDate.setText(String.valueOf(reunion.getDate())); + + holder.itemView.setOnClickListener(v -> { + if(listener != null){ + listener.onItemClick(reunion); + } + }); + } + + @Override + public int getItemCount() { + return reunions.size(); + } + + static class ReunionViewHolder extends RecyclerView.ViewHolder { + TextView reunionName, reunionDate; + + public ReunionViewHolder(View itemView){ + super(itemView); + reunionName = itemView.findViewById(R.id.reunionName); + reunionDate = itemView.findViewById(R.id.reunionDate); + } + } +} diff --git a/app/src/main/java/com/example/quiz/data/adapter/TypeOfBetAdapter.java b/app/src/main/java/com/example/quiz/data/adapter/TypeOfBetAdapter.java index f9106f4..e3cc766 100644 --- a/app/src/main/java/com/example/quiz/data/adapter/TypeOfBetAdapter.java +++ b/app/src/main/java/com/example/quiz/data/adapter/TypeOfBetAdapter.java @@ -14,24 +14,24 @@ import com.example.quiz.data.model.TypeOfBet; import java.util.List; public class TypeOfBetAdapter extends RecyclerView.Adapter { - private List types; + private List types; private onItemClickListener listener; private int selectedPosition = -1; public interface onItemClickListener{ - void onItemClick(TypeOfBet type); + void onItemClick(String type); } public void setOnItemClickListener(TypeOfBetAdapter.onItemClickListener listener){ this.listener = listener; } - public TypeOfBetAdapter(List types){ + public TypeOfBetAdapter(List types){ this.types = types; } - public void setTypes(List types){ + public void setTypes(List types){ this.types = types; notifyDataSetChanged(); } @@ -46,8 +46,8 @@ public class TypeOfBetAdapter extends RecyclerView.Adapter types; - - private List horses; - - public Reunion getReunion() { - return reunion; - } - - public void setReunion(Reunion reunion) { - this.reunion = reunion; - } - - public List getTypes() { - return types; - } - - public void setTypes(List types) { - this.types = types; - } - - public List getHorses() { - return horses; - } - - public void setHorses(List horses) { - this.horses = horses; - } - - public int getId() { - return id; - } - - public void setId(int id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public LocalDate getDate() { - return date; - } - - public void setDate(LocalDate date) { - this.date = date; - } - - - public Bet(int id, String name, Reunion reunion, List types, LocalDate date, List horses) { - this.id = id; - this.name = name; - this.reunion = reunion; - this.types = types; - this.date = date; - this.horses = horses; - } -} diff --git a/app/src/main/java/com/example/quiz/data/model/Cheval.java b/app/src/main/java/com/example/quiz/data/model/Cheval.java new file mode 100644 index 0000000..d9f9ef6 --- /dev/null +++ b/app/src/main/java/com/example/quiz/data/model/Cheval.java @@ -0,0 +1,57 @@ +package com.example.quiz.data.model; + +public class Cheval { + private int number; + private String nom; + private String numero; + private boolean nonPartant; + private boolean nonEcurie; + + public Cheval(int number, String nom, String numero, boolean nonPartant, boolean nonEcurie) { + this.number = number; + this.nom = nom; + this.numero = numero; + this.nonPartant = nonPartant; + this.nonEcurie = nonEcurie; + } + + public int getNumber() { + return number; + } + + public void setNumber(int number) { + this.number = number; + } + + public String getNom() { + return nom; + } + + public void setNom(String nom) { + this.nom = nom; + } + + public String getNumero() { + return numero; + } + + public void setNumero(String numero) { + this.numero = numero; + } + + public boolean isNonPartant() { + return nonPartant; + } + + public void setNonPartant(boolean nonPartant) { + this.nonPartant = nonPartant; + } + + public boolean isNonEcurie() { + return nonEcurie; + } + + public void setNonEcurie(boolean nonEcurie) { + this.nonEcurie = nonEcurie; + } +} diff --git a/app/src/main/java/com/example/quiz/data/model/Course.java b/app/src/main/java/com/example/quiz/data/model/Course.java new file mode 100644 index 0000000..9292596 --- /dev/null +++ b/app/src/main/java/com/example/quiz/data/model/Course.java @@ -0,0 +1,95 @@ +package com.example.quiz.data.model; + +import com.example.quiz.data.model.enums.CourseType; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.List; + + +public class Course { + private int id; + private String numero; + private String nom; + private String lieu; + private LocalDateTime dateDepartCourse; + private String reunion; + private int nombreChevauxInscrits; + + private List chevaux; + + public Course(int id, String numero, String nom, String lieu, LocalDateTime dateDepartCourse, String reunion, int nombreChevauxInscrits, List chevaux) { + this.id = id; + this.numero = numero; + this.nom = nom; + this.lieu = lieu; + this.dateDepartCourse = dateDepartCourse; + this.reunion = reunion; + this.nombreChevauxInscrits = nombreChevauxInscrits; + this.chevaux = chevaux; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getNumero() { + return numero; + } + + public void setNumero(String numero) { + this.numero = numero; + } + + public String getNom() { + return nom; + } + + public void setNom(String nom) { + this.nom = nom; + } + + public String getLieu() { + return lieu; + } + + public void setLieu(String lieu) { + this.lieu = lieu; + } + + public LocalDateTime getDateDepartCourse() { + return dateDepartCourse; + } + + public void setDateDepartCourse(LocalDateTime dateDepartCourse) { + this.dateDepartCourse = dateDepartCourse; + } + + public String getReunion() { + return reunion; + } + + public void setReunion(String reunion) { + this.reunion = reunion; + } + + public int getNombreChevauxInscrits() { + return nombreChevauxInscrits; + } + + public void setNombreChevauxInscrits(int nombreChevauxInscrits) { + this.nombreChevauxInscrits = nombreChevauxInscrits; + } + + public List getChevaux() { + return chevaux; + } + + public void setChevaux(List chevaux) { + this.chevaux = chevaux; + } +} diff --git a/app/src/main/java/com/example/quiz/data/model/Hippodrome.java b/app/src/main/java/com/example/quiz/data/model/Hippodrome.java new file mode 100644 index 0000000..9839d01 --- /dev/null +++ b/app/src/main/java/com/example/quiz/data/model/Hippodrome.java @@ -0,0 +1,67 @@ +package com.example.quiz.data.model; + +public class Hippodrome { + private int id; + private String nom; + private String ville; + private String pays; + private int capacite; + private String description; + + public Hippodrome(int id, String nom, String ville, String pays, int capacite, String description) { + this.id = id; + this.nom = nom; + this.ville = ville; + this.pays = pays; + this.capacite = capacite; + this.description = description; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getNom() { + return nom; + } + + public void setNom(String nom) { + this.nom = nom; + } + + public String getVille() { + return ville; + } + + public void setVille(String ville) { + this.ville = ville; + } + + public String getPays() { + return pays; + } + + public void setPays(String pays) { + this.pays = pays; + } + + public int getCapacite() { + return capacite; + } + + public void setCapacite(int capacite) { + this.capacite = capacite; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } +} diff --git a/app/src/main/java/com/example/quiz/data/model/Horse.java b/app/src/main/java/com/example/quiz/data/model/Horse.java deleted file mode 100644 index 32c50a1..0000000 --- a/app/src/main/java/com/example/quiz/data/model/Horse.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.example.quiz.data.model; - -public class Horse { - private Integer number; - - public Horse(Integer number) { - this.number = number; - } - - - public Integer getNumber() { - return number; - } - - public void setNumber(Integer number) { - this.number = number; - } -} diff --git a/app/src/main/java/com/example/quiz/data/model/Reunion.java b/app/src/main/java/com/example/quiz/data/model/Reunion.java index 31494fe..b5eff14 100644 --- a/app/src/main/java/com/example/quiz/data/model/Reunion.java +++ b/app/src/main/java/com/example/quiz/data/model/Reunion.java @@ -4,22 +4,47 @@ import java.time.LocalDate; public class Reunion { private int id; - private String name; - + private String code; + private String nom; private LocalDate date; - private String address; + private int numero; + private Hippodrome hippodrome; + private int totalCourses; - public Reunion(int id, String name,LocalDate date, String address) { + public Reunion(int id, String code, String nom, LocalDate date, int numero, Hippodrome hippodrome, int totalCourses) { this.id = id; - this.name = name; + this.code = code; + this.nom = nom; this.date = date; - this.address = address; + this.numero = numero; + this.hippodrome = hippodrome; + this.totalCourses = totalCourses; + } + + public int getId() { + return id; } public void setId(int id) { this.id = id; } + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getNom() { + return nom; + } + + public void setNom(String nom) { + this.nom = nom; + } + public LocalDate getDate() { return date; } @@ -28,23 +53,27 @@ public class Reunion { this.date = date; } - public int getId() { - return id; + public int getNumero() { + return numero; } - public String getName() { - return name; + public void setNumero(int numero) { + this.numero = numero; } - public void setName(String name) { - this.name = name; + public Hippodrome getHippodrome() { + return hippodrome; } - public String getAddress() { - return address; + public void setHippodrome(Hippodrome hippodrome) { + this.hippodrome = hippodrome; } - public void setAddress(String address) { - this.address = address; + public int getTotalCourses() { + return totalCourses; + } + + public void setTotalCourses(int totalCourses) { + this.totalCourses = totalCourses; } } diff --git a/app/src/main/java/com/example/quiz/data/model/enums/CourseType.java b/app/src/main/java/com/example/quiz/data/model/enums/CourseType.java new file mode 100644 index 0000000..d14e4fb --- /dev/null +++ b/app/src/main/java/com/example/quiz/data/model/enums/CourseType.java @@ -0,0 +1,7 @@ +package com.example.quiz.data.model.enums; + +public enum CourseType { + TIERCE, + QUARTE, + QUINTE +} diff --git a/app/src/main/java/com/example/quiz/data/remote/ApiClient.java b/app/src/main/java/com/example/quiz/data/remote/ApiClient.java new file mode 100644 index 0000000..2931aed --- /dev/null +++ b/app/src/main/java/com/example/quiz/data/remote/ApiClient.java @@ -0,0 +1,63 @@ +package com.example.quiz.data.remote; + +import android.util.Log; + +import androidx.annotation.NonNull; + +import java.util.concurrent.TimeUnit; + +import javax.inject.Singleton; + +import dagger.Module; +import dagger.Provides; +import dagger.hilt.InstallIn; +import dagger.hilt.components.SingletonComponent; +import okhttp3.OkHttpClient; +import okhttp3.logging.HttpLoggingInterceptor; +import retrofit2.Retrofit; +import retrofit2.converter.gson.GsonConverterFactory; + +@Module +@InstallIn(SingletonComponent.class) +public class ApiClient { + private static final String BASE_URL = "https://api.pmu.ml/api/v1/"; + + @Provides + @Singleton + public HttpLoggingInterceptor provideLoggingInterceptor(){ + HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() { + @Override + public void log(@NonNull String s) { + Log.d("OkHttp", "log: "+s); + } + }); + loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY); + return loggingInterceptor; + } + + @Provides + @Singleton + public OkHttpClient provideOkHttpClient(HttpLoggingInterceptor loggingInterceptor){ + return new OkHttpClient.Builder() + .addInterceptor(loggingInterceptor) + .connectTimeout(240, TimeUnit.SECONDS) + .readTimeout(240, TimeUnit.SECONDS) + .build(); + } + + @Provides + @Singleton + public Retrofit provideRetrofit(OkHttpClient okHttpClient){ + return new Retrofit.Builder() + .baseUrl(BASE_URL) + .client(okHttpClient) + .addConverterFactory(GsonConverterFactory.create()) + .build(); + } + + @Provides + @Singleton + public ApiService provideApiService(Retrofit retrofit){ + return retrofit.create(ApiService.class); + } +} diff --git a/app/src/main/java/com/example/quiz/data/remote/ApiService.java b/app/src/main/java/com/example/quiz/data/remote/ApiService.java new file mode 100644 index 0000000..d2be237 --- /dev/null +++ b/app/src/main/java/com/example/quiz/data/remote/ApiService.java @@ -0,0 +1,17 @@ +package com.example.quiz.data.remote; + +import com.example.quiz.data.model.Course; +import com.example.quiz.data.model.Reunion; + +import java.util.List; + +import retrofit2.Call; +import retrofit2.http.GET; + +public interface ApiService { + @GET("reunions") + Call> getReunions(); + + @GET("course/avenir") + Call> getCourses(); +} diff --git a/app/src/main/java/com/example/quiz/data/repository/BetRepository.java b/app/src/main/java/com/example/quiz/data/repository/BetRepository.java deleted file mode 100644 index 7300cbb..0000000 --- a/app/src/main/java/com/example/quiz/data/repository/BetRepository.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.example.quiz.data.repository; - -import com.example.quiz.data.BetsBank; -import com.example.quiz.data.model.Bet; -import com.example.quiz.data.model.Horse; -import com.example.quiz.data.model.Reunion; -import com.example.quiz.data.model.TypeOfBet; - -import java.util.List; - -import javax.inject.Inject; -import javax.inject.Singleton; - -@Singleton -public class BetRepository { - private BetsBank betsBank; - - @Inject - public BetRepository(BetsBank betsBank){ - this.betsBank = betsBank; - } - - - public BetRepository(){ - this.betsBank = BetsBank.getInstance(); - } - - public List getAllBets(){ - return betsBank.getBet(); - } - - public Bet getBetById(int id){ - return betsBank.getBet().get(id); - } - - public List getHorsesById(int id){ - return getBetById(id).getHorses(); - } - - public BetRepository getInstance(){ - return new BetRepository(); - } - - public String getBetNameById(int id){ - return getBetById(id).getName(); - } - - public List getTypeOfBetByBetId(int id){ - return getBetById(id).getTypes(); - } - - public Reunion getReunionByHorseId(int id){ - return getBetById(id).getReunion(); - } -} diff --git a/app/src/main/java/com/example/quiz/data/repository/CourseRepository.java b/app/src/main/java/com/example/quiz/data/repository/CourseRepository.java new file mode 100644 index 0000000..807411d --- /dev/null +++ b/app/src/main/java/com/example/quiz/data/repository/CourseRepository.java @@ -0,0 +1,46 @@ +package com.example.quiz.data.repository; + +import androidx.lifecycle.LiveData; +import androidx.lifecycle.MutableLiveData; + +import com.example.quiz.data.model.Course; +import com.example.quiz.data.remote.ApiService; +import com.example.quiz.utils.Result; + +import java.util.List; + +import javax.inject.Inject; + +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; + +public class CourseRepository { + private ApiService apiService; + + @Inject + public CourseRepository(ApiService apiService) { + this.apiService = apiService; + } + + public LiveData>> getCourses() { + MutableLiveData>> liveCourses = new MutableLiveData>>(); + liveCourses.setValue(Result.loading()); + apiService.getCourses().enqueue(new Callback>() { + @Override + public void onResponse(Call> call, Response> response) { + if(response.isSuccessful()){ + liveCourses.postValue(Result.success(response.body())); + }else{ + liveCourses.postValue(Result.error(response.message())); + } + } + + @Override + public void onFailure(Call> call, Throwable throwable) { + liveCourses.postValue(Result.error(throwable.getMessage())); + } + }); + return liveCourses; + } +} diff --git a/app/src/main/java/com/example/quiz/data/repository/QuestionRepository.java b/app/src/main/java/com/example/quiz/data/repository/QuestionRepository.java deleted file mode 100644 index ff0e2e4..0000000 --- a/app/src/main/java/com/example/quiz/data/repository/QuestionRepository.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.example.quiz.data.repository; - -import com.example.quiz.data.QuestionsBank; -import com.example.quiz.data.model.Question; - -import java.util.List; -import java.util.Map; - -public class QuestionRepository { - private QuestionsBank questionsBank; - - public QuestionRepository(){ - this.questionsBank = QuestionsBank.getInstance(); - } - - public List getQuestions(){ - return questionsBank.getQuestions(); - } - - public Object updateQuestionById(int id, Question question){ - Question myQuestion = questionsBank.getQuestions().get(id); - if(question == null) return Map.of("error", "Cette question n'existe pas!"); - myQuestion.setQuestion(question.getQuestion()!=null?question.getQuestion():myQuestion.getQuestion()); - myQuestion.setAnswers(!question.getAnswers().isEmpty()?question.getAnswers():myQuestion.getAnswers()); - myQuestion.setIndexAnswer(question.getIndexAnswer() > 3?question.getIndexAnswer():myQuestion.getIndexAnswer()); - return Map.of("success", true); - } - public QuestionRepository getInstance(){ - return new QuestionRepository(); - } -} diff --git a/app/src/main/java/com/example/quiz/data/repository/ReunionRepository.java b/app/src/main/java/com/example/quiz/data/repository/ReunionRepository.java new file mode 100644 index 0000000..dd6d751 --- /dev/null +++ b/app/src/main/java/com/example/quiz/data/repository/ReunionRepository.java @@ -0,0 +1,49 @@ +package com.example.quiz.data.repository; + +import androidx.lifecycle.LiveData; +import androidx.lifecycle.MutableLiveData; + +import com.example.quiz.data.model.Reunion; +import com.example.quiz.data.remote.ApiClient; +import com.example.quiz.data.remote.ApiService; +import com.example.quiz.utils.Result; +import com.google.android.gms.common.api.Api; + +import java.util.List; + +import javax.inject.Inject; + +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; + +public class ReunionRepository { + private ApiService apiService; + + @Inject + public ReunionRepository(ApiService apiService) { + this.apiService = apiService; + } + + public LiveData>> getReunions(){ + MutableLiveData>> liveReunionsData = new MutableLiveData<>(); + liveReunionsData.setValue(Result.loading()); + apiService.getReunions().enqueue(new Callback>() { + @Override + public void onResponse(Call> call, Response> response) { + if(response.isSuccessful()){ + liveReunionsData.postValue(Result.success(response.body())); + }else{ + liveReunionsData.postValue(Result.error(response.message())); + } + } + + @Override + public void onFailure(Call> call, Throwable throwable) { + liveReunionsData.postValue(Result.error(throwable.getMessage())); + } + }); + return liveReunionsData; + } + +} diff --git a/app/src/main/java/com/example/quiz/data/repository/module/RepositoryModule.java b/app/src/main/java/com/example/quiz/data/repository/module/RepositoryModule.java new file mode 100644 index 0000000..345a1c4 --- /dev/null +++ b/app/src/main/java/com/example/quiz/data/repository/module/RepositoryModule.java @@ -0,0 +1,29 @@ +package com.example.quiz.data.repository.module; + + +import com.example.quiz.data.remote.ApiService; +import com.example.quiz.data.repository.CourseRepository; +import com.example.quiz.data.repository.ReunionRepository; + +import javax.inject.Singleton; + +import dagger.Module; +import dagger.Provides; +import dagger.hilt.InstallIn; +import dagger.hilt.components.SingletonComponent; + +@Module +@InstallIn(SingletonComponent.class) +public class RepositoryModule { + @Provides + @Singleton + public ReunionRepository provideReunionRepository(ApiService apiService){ + return new ReunionRepository(apiService); + } + + @Provides + @Singleton + public CourseRepository provideCourseRepository(ApiService apiService){ + return new CourseRepository(apiService); + } +} diff --git a/app/src/main/java/com/example/quiz/injection/QuestionViewModelFactory.java b/app/src/main/java/com/example/quiz/injection/QuestionViewModelFactory.java deleted file mode 100644 index bf32e14..0000000 --- a/app/src/main/java/com/example/quiz/injection/QuestionViewModelFactory.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.example.quiz.injection; - -import androidx.annotation.NonNull; -import androidx.lifecycle.ViewModel; -import androidx.lifecycle.ViewModelProvider; - -import com.example.quiz.data.repository.QuestionRepository; -import com.example.quiz.viewModel.QuestionViewModel; - -public class QuestionViewModelFactory implements ViewModelProvider.Factory { - private QuestionRepository questionRepository; - private static QuestionViewModelFactory factory; - - public static QuestionViewModelFactory getInstance(){ - if(factory == null){ - synchronized (QuestionViewModel.class){ - if(factory == null){ - factory = new QuestionViewModelFactory(); - } - } - } - return factory; - } - - private QuestionViewModelFactory(){ - this.questionRepository = new QuestionRepository(); - } - - @Override - @NonNull - public T create(@NonNull Class modelClass){ - if(modelClass.isAssignableFrom(QuestionViewModel.class)){ - return (T) new QuestionViewModel(questionRepository); - } - throw new IllegalArgumentException("Unknown ViewModel class"); - } - -} diff --git a/app/src/main/java/com/example/quiz/utils/Result.java b/app/src/main/java/com/example/quiz/utils/Result.java new file mode 100644 index 0000000..7db102c --- /dev/null +++ b/app/src/main/java/com/example/quiz/utils/Result.java @@ -0,0 +1,28 @@ +package com.example.quiz.utils; + +public class Result { + + public enum Status { SUCCESS, ERROR, LOADING } + + public final Status status; + public final T data; + public final String message; + + private Result(Status status, T data, String message) { + this.status = status; + this.data = data; + this.message = message; + } + + public static Result success(T data) { + return new Result<>(Status.SUCCESS, data, null); + } + + public static Result error(String msg) { + return new Result<>(Status.ERROR, null, msg); + } + + public static Result loading() { + return new Result<>(Status.LOADING, null, null); + } +} diff --git a/app/src/main/java/com/example/quiz/viewModel/BetViewModel.java b/app/src/main/java/com/example/quiz/viewModel/BetViewModel.java deleted file mode 100644 index 6369da9..0000000 --- a/app/src/main/java/com/example/quiz/viewModel/BetViewModel.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.example.quiz.viewModel; - -import androidx.lifecycle.MutableLiveData; -import androidx.lifecycle.ViewModel; - -import com.example.quiz.data.model.Bet; -import com.example.quiz.data.model.Horse; -import com.example.quiz.data.model.Reunion; -import com.example.quiz.data.model.TypeOfBet; -import com.example.quiz.data.repository.BetRepository; - -import java.util.List; - -import javax.inject.Inject; - -import dagger.hilt.android.lifecycle.HiltViewModel; - - -@HiltViewModel -public class BetViewModel extends ViewModel { - private BetRepository betRepository; - - public MutableLiveData> bets = new MutableLiveData>(); - - public MutableLiveData betName = new MutableLiveData(); - - public MutableLiveData> horses = new MutableLiveData<>(); - - public MutableLiveData> types = new MutableLiveData<>(); - - public MutableLiveData reunion = new MutableLiveData(); - - - - @Inject - public BetViewModel(BetRepository betRepository){ - this.betRepository = betRepository; - } - - public void loadBets(){ - bets.setValue(betRepository.getAllBets()); - } - - public void loadHorses(int id){ - horses.setValue(betRepository.getHorsesById(id)); - } - - public void getBetNameById(int id){ - betName.setValue(betRepository.getBetNameById(id)); - } - - public void loadTypes(int id){ - types.setValue(betRepository.getBetById(id).getTypes()); - } - - - public void loadReunionById(int id){ - reunion.setValue(betRepository.getReunionByHorseId(id)); - } - -} diff --git a/app/src/main/java/com/example/quiz/viewModel/CourseViewModel.java b/app/src/main/java/com/example/quiz/viewModel/CourseViewModel.java new file mode 100644 index 0000000..716758c --- /dev/null +++ b/app/src/main/java/com/example/quiz/viewModel/CourseViewModel.java @@ -0,0 +1,33 @@ +package com.example.quiz.viewModel; + +import androidx.lifecycle.LiveData; +import androidx.lifecycle.ViewModel; + +import com.example.quiz.data.model.Course; +import com.example.quiz.data.repository.CourseRepository; +import com.example.quiz.utils.Result; + +import java.util.List; + +import javax.inject.Inject; + +import dagger.hilt.android.lifecycle.HiltViewModel; + +@HiltViewModel +public class CourseViewModel extends ViewModel { + private final CourseRepository courseRepository; + + private LiveData>> courses; + + @Inject + public CourseViewModel(CourseRepository courseRepository){ + this.courseRepository = courseRepository; + } + + public LiveData>> getCourses(){ + if(courses == null){ + courses = courseRepository.getCourses(); + } + return courses; + } +} diff --git a/app/src/main/java/com/example/quiz/viewModel/QuestionViewModel.java b/app/src/main/java/com/example/quiz/viewModel/QuestionViewModel.java deleted file mode 100644 index f750228..0000000 --- a/app/src/main/java/com/example/quiz/viewModel/QuestionViewModel.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.example.quiz.viewModel; - -import androidx.lifecycle.MutableLiveData; -import androidx.lifecycle.ViewModel; - -import com.example.quiz.data.model.Question; -import com.example.quiz.data.repository.QuestionRepository; - -import java.util.Objects; - -public class QuestionViewModel extends ViewModel { - private QuestionRepository questionRepository; - - - public MutableLiveData currentQuestion = new MutableLiveData(); - public MutableLiveData score = new MutableLiveData(); - public MutableLiveData isLastQuestion = new MutableLiveData(false); - - public QuestionViewModel(QuestionRepository questionRepository){ - this.questionRepository = questionRepository; - } - - public void startQuiz(){ - currentQuestion.setValue(questionRepository.getQuestions().get(0)); - score.setValue(0); - } - - public Boolean isAnswerValid(int answerIndex){ - return answerIndex == Objects.requireNonNull(currentQuestion.getValue()).getIndexAnswer(); - } - - public void nextQuestion(){ - int currentQuestionIndex = questionRepository.getQuestions().indexOf(currentQuestion.getValue()); - if(currentQuestionIndex == questionRepository.getQuestions().size()-1){ - isLastQuestion.setValue(true); - }else{ - currentQuestion.setValue(questionRepository.getQuestions().get(currentQuestionIndex+1)); - } - } - -} diff --git a/app/src/main/java/com/example/quiz/viewModel/ReunionViewModel.java b/app/src/main/java/com/example/quiz/viewModel/ReunionViewModel.java new file mode 100644 index 0000000..835fdf8 --- /dev/null +++ b/app/src/main/java/com/example/quiz/viewModel/ReunionViewModel.java @@ -0,0 +1,33 @@ +package com.example.quiz.viewModel; + +import androidx.lifecycle.LiveData; +import androidx.lifecycle.ViewModel; + +import com.example.quiz.data.model.Reunion; +import com.example.quiz.data.repository.ReunionRepository; +import com.example.quiz.utils.Result; + +import java.util.List; + +import javax.inject.Inject; + +import dagger.hilt.android.lifecycle.HiltViewModel; + +@HiltViewModel +public class ReunionViewModel extends ViewModel { + private final ReunionRepository reunionRepository; + + private LiveData>> reunions; + + @Inject + public ReunionViewModel(ReunionRepository reunionRepository) { + this.reunionRepository = reunionRepository; + } + + public LiveData>> getReunions() { + if (reunions == null) { + reunions = reunionRepository.getReunions(); + } + return reunions; + } +} diff --git a/app/src/main/java/com/example/quiz/viewModel/SharedViewModel.java b/app/src/main/java/com/example/quiz/viewModel/SharedViewModel.java index 1e57ee6..20a7809 100644 --- a/app/src/main/java/com/example/quiz/viewModel/SharedViewModel.java +++ b/app/src/main/java/com/example/quiz/viewModel/SharedViewModel.java @@ -3,6 +3,8 @@ package com.example.quiz.viewModel; import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.ViewModel; +import com.example.quiz.data.model.Course; +import com.example.quiz.data.model.Reunion; import com.example.quiz.data.model.TypeOfBet; import javax.inject.Inject; @@ -12,13 +14,19 @@ import dagger.hilt.android.lifecycle.HiltViewModel; public class SharedViewModel extends ViewModel { - public MutableLiveData betId = new MutableLiveData(); - public MutableLiveData typeOfBet = new MutableLiveData(); + public MutableLiveData selectedReunion = new MutableLiveData(); + public MutableLiveData selectedCourse = new MutableLiveData(); + public MutableLiveData typeOfBet = new MutableLiveData(); - public void setBetId(int id){ - betId.setValue(id); + + public void setSelectedReunion(Reunion reunion){ + selectedReunion.setValue(reunion); } - public void setTypeOfBet(TypeOfBet type){ + + public void setSelectedCourse(Course course){ + selectedCourse.setValue(course); + } + public void setTypeOfBet(String type){ typeOfBet.setValue(type); } } diff --git a/app/src/main/res/drawable/course_item_border.xml b/app/src/main/res/drawable/course_item_border.xml index 7fdc8f6..950129a 100644 --- a/app/src/main/res/drawable/course_item_border.xml +++ b/app/src/main/res/drawable/course_item_border.xml @@ -1,7 +1,7 @@ - + diff --git a/app/src/main/res/drawable/horse_with_creative_hair_raising_feet_right_side_view_svgrepo_com.xml b/app/src/main/res/drawable/horse_with_creative_hair_raising_feet_right_side_view_svgrepo_com.xml new file mode 100644 index 0000000..4ca9500 --- /dev/null +++ b/app/src/main/res/drawable/horse_with_creative_hair_raising_feet_right_side_view_svgrepo_com.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/number_background.xml b/app/src/main/res/drawable/number_background.xml index d816546..3461306 100644 --- a/app/src/main/res/drawable/number_background.xml +++ b/app/src/main/res/drawable/number_background.xml @@ -1,5 +1,5 @@ + android:shape="rectangle"> diff --git a/app/src/main/res/drawable/number_selected_background.xml b/app/src/main/res/drawable/number_selected_background.xml index d772656..4630428 100644 --- a/app/src/main/res/drawable/number_selected_background.xml +++ b/app/src/main/res/drawable/number_selected_background.xml @@ -1,5 +1,5 @@ + android:shape="rectangle"> diff --git a/app/src/main/res/layout/fragment_list_o_f_betting.xml b/app/src/main/res/layout/fragment_list_o_f_betting.xml index 5e32adb..60261d6 100644 --- a/app/src/main/res/layout/fragment_list_o_f_betting.xml +++ b/app/src/main/res/layout/fragment_list_o_f_betting.xml @@ -9,37 +9,12 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" - android:padding="8dp" + android:padding="10dp" android:background="@color/white"> - - - -