From 1031307b3a1fb5849749f0626c7fc38c694ed652 Mon Sep 17 00:00:00 2001 From: OnlyPapy98 Date: Thu, 27 Nov 2025 11:54:52 +0100 Subject: [PATCH] break for printer! --- app/build.gradle.kts | 6 +- app/libs/TSPL_V1.21.jar | Bin 45272 -> 0 bytes .../java/com/example/quiz/BetValidation.java | 83 +++----- .../java/com/example/quiz/ListOFBets.java | 7 +- .../com/example/quiz/ListOfTypeOfBets.java | 39 +++- .../quiz/data/adapter/BetsAdapter.java | 31 +-- .../quiz/data/adapter/TypeOfBetAdapter.java | 12 +- .../com/example/quiz/data/model/Course.java | 71 +++++-- .../com/example/quiz/data/model/Pari.java | 195 +++--------------- .../com/example/quiz/data/model/Reunion.java | 8 +- .../example/quiz/data/model/TypeOfBet.java | 23 ++- .../quiz/data/model/dtos/PariCourseDto.java | 17 ++ .../example/quiz/data/remote/ApiClient.java | 2 +- .../example/quiz/data/remote/ApiService.java | 7 +- .../data/repository/CourseRepository.java | 6 +- .../quiz/data/repository/PariRepository.java | 25 ++- .../example/quiz/utils/HPRTPrinterUtil.java | 135 +++++++++++- .../quiz/viewModel/CourseViewModel.java | 4 +- .../quiz/viewModel/SharedViewModel.java | 4 +- app/src/main/res/drawable/circle_primary.xml | 3 +- app/src/main/res/drawable/ic_right_arrow.xml | 9 + .../main/res/drawable/item_gradient_bg.xml | 5 +- .../drawable/item_gradient_bg_selected.xml | 4 +- .../layout/fragment_list_of_type_of_bets.xml | 28 ++- app/src/main/res/layout/type_of_bet_item.xml | 37 ++-- 25 files changed, 420 insertions(+), 341 deletions(-) delete mode 100644 app/libs/TSPL_V1.21.jar create mode 100644 app/src/main/java/com/example/quiz/data/model/dtos/PariCourseDto.java create mode 100644 app/src/main/res/drawable/ic_right_arrow.xml diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 231a5d1..376eca5 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -11,7 +11,7 @@ android { defaultConfig { applicationId = "com.example.quiz" - minSdk = 29 + minSdk = 16 targetSdk = 34 versionCode = 1 versionName = "1.0" @@ -29,8 +29,8 @@ android { } } compileOptions { - sourceCompatibility = JavaVersion.VERSION_11 - targetCompatibility = JavaVersion.VERSION_11 + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 } buildFeatures { viewBinding = true diff --git a/app/libs/TSPL_V1.21.jar b/app/libs/TSPL_V1.21.jar deleted file mode 100644 index 4b8c15187a5c28cecec0f8c651ed510390c792ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45272 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 Xt43T5-$eR=@J=fLUYA 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 CWhpHH diff --git a/app/src/main/java/com/example/quiz/BetValidation.java b/app/src/main/java/com/example/quiz/BetValidation.java index 2dbe7a0..9306707 100644 --- a/app/src/main/java/com/example/quiz/BetValidation.java +++ b/app/src/main/java/com/example/quiz/BetValidation.java @@ -1,9 +1,12 @@ package com.example.quiz; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; import android.os.Bundle; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; import androidx.fragment.app.Fragment; import androidx.lifecycle.LifecycleOwner; import androidx.lifecycle.LiveData; @@ -25,16 +28,20 @@ import com.example.quiz.data.model.Course; import com.example.quiz.data.model.Pari; import com.example.quiz.data.model.Reunion; import com.example.quiz.data.model.TypeOfBet; +import com.example.quiz.data.model.dtos.PariCourseDto; import com.example.quiz.data.model.enums.PariStatut; import com.example.quiz.databinding.FragmentBetValidationBinding; import com.example.quiz.utils.HPRTPrinterUtil; import com.example.quiz.utils.Result; import com.example.quiz.viewModel.PariViewModel; import com.example.quiz.viewModel.SharedViewModel; +import com.google.android.material.appbar.MaterialToolbar; import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; import dagger.hilt.android.AndroidEntryPoint; @@ -55,7 +62,7 @@ public class BetValidation extends Fragment { private HPRTPrinterUtil printer; - private String typeOfBet; + private TypeOfBet typeOfBet; private Reunion reunion; @@ -101,7 +108,7 @@ public class BetValidation extends Fragment { int columns = 7; grid.setColumnCount(columns); if(shared.selectedCourse.getValue() != null){ - for (int i = 1; i <= shared.selectedCourse.getValue().getNombreChevauxInscrits(); i++) { + for (int i = 1; i <= shared.selectedCourse.getValue().getPartants(); i++) { createNumberItem(String.valueOf(i)); grid.addView(createNumberItem(String.valueOf(i))); } @@ -151,15 +158,14 @@ public class BetValidation extends Fragment { super.onViewCreated(view, savedInstanceState); shared = new ViewModelProvider(requireActivity()).get(SharedViewModel.class); pariViewModel = new ViewModelProvider(this).get(PariViewModel.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); - if(viewModel.partant.getValue() != null){ - this.totalHorses = viewModel.partant.getValue(); - }*/ + AppCompatActivity activity = (AppCompatActivity) getActivity(); + if(activity != null){ + MaterialToolbar toolbar = activity.findViewById(R.id.toolbar); + activity.setSupportActionBar(toolbar); + if(activity.getSupportActionBar() != null){ + activity.getSupportActionBar().setTitle("Pari "+shared.selectedCourse.getValue().getNom()); + } + } setupNumberGrid(binding.gridNumbers); binding.paymentType.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @@ -183,13 +189,13 @@ public class BetValidation extends Fragment { binding.order.setOnCheckedChangeListener((buttonView, isChecked) -> { order = isChecked; - calculateMise(selectedHorses.getValue().size(), shared.typeOfBet.getValue()); + calculateMise(selectedHorses.getValue().size(), shared.typeOfBet.getValue().getLabel()); }); selectedHorses.observe(getViewLifecycleOwner(), new Observer>() { @Override public void onChanged(List horses) { - calculateMise(horses.size(), shared.typeOfBet.getValue()); + calculateMise(horses.size(), shared.typeOfBet.getValue().getLabel()); binding.mise.setText(String.valueOf(mise+" CFA")); } }); @@ -207,53 +213,27 @@ public class BetValidation extends Fragment { 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; - } + int required = typeOfBet.getNumberOfHorse(); - if(required == 0){ - Toast.makeText(getContext(), "Erreur de type de pari", Toast.LENGTH_SHORT).show(); - return; - } if(selectedHorses.getValue().size() < required){ Toast.makeText(getContext(), "Veuillez sélectionner au moins"+required+" chevaux", Toast.LENGTH_SHORT).show(); return; } + Pari pari = new Pari( generate12Digits(), - shared.typeOfBet.getValue(), - "QUARTE_PLUS", + shared.typeOfBet.getValue().getName(), + "GAGNANT", mise, - "07/11/2025 05:08:00", - shared.selectedCourse.getValue().getId(), - "123456789", - "John Doe", - 1, - 5, - 6, - 4, - 11, - 5, - 10, - order?selectedHorses.getValue().stream().map(Integer::parseInt).collect(Collectors.toList()):List.of(), - selectedHorses.getValue().stream().map(Integer::parseInt).collect(Collectors.toList()), - order?selectedHorses.getValue().stream().map(Integer::parseInt).collect(Collectors.toList()):List.of(), + DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss").format(LocalDateTime.now()), + true, + true, + new PariCourseDto(shared.selectedCourse.getValue().getId()), + selectedHorses.getValue(), + order?selectedHorses.getValue():new ArrayList(), order, - shared.typeOfBet.getValue(), - PariStatut.PERDANT, - false, - false + "MULTI_4" ); pariViewModel.createPari(pari).observe(getViewLifecycleOwner(), new Observer>() { @Override @@ -288,6 +268,7 @@ public class BetValidation extends Fragment { printer = new HPRTPrinterUtil(getContext()); boolean ok = printer.autoConnectBluetoothByName(); if(ok){ + Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.pmu_logo); StringBuilder tspl = new StringBuilder(); tspl.append("PARIS HIPPIQUE (PMU MALI)\n"); @@ -307,7 +288,7 @@ public class BetValidation extends Fragment { tspl.append("----------------------------\n"); tspl.append("Bonne chance !\n\n\n"); - printer.printText(tspl); + printer.printText(bitmap, tspl); } selectedHorses.setValue(List.of()); binding.combination.setText(getString(R.string.combination,"")); diff --git a/app/src/main/java/com/example/quiz/ListOFBets.java b/app/src/main/java/com/example/quiz/ListOFBets.java index 10440f3..f3c30f8 100644 --- a/app/src/main/java/com/example/quiz/ListOFBets.java +++ b/app/src/main/java/com/example/quiz/ListOFBets.java @@ -80,11 +80,12 @@ public class ListOFBets extends Fragment { public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { binding = FragmentListOFBettingBinding.inflate(inflater, container, false); - adapter = new BetsAdapter(); + + shared = new ViewModelProvider(requireActivity()).get(SharedViewModel.class); + adapter = new BetsAdapter(shared); binding.recyclerView.setLayoutManager(new GridLayoutManager(getContext(), 2)); binding.recyclerView.setAdapter(adapter); viewModel = new ViewModelProvider(this).get(CourseViewModel.class); - shared = new ViewModelProvider(requireActivity()).get(SharedViewModel.class); @@ -107,7 +108,7 @@ public class ListOFBets extends Fragment { } public void observe(){ - viewModel.getCourses().observe(getViewLifecycleOwner(), new Observer>>() { + viewModel.getCourses(String.valueOf(shared.selectedReunion.getValue().getId())).observe(getViewLifecycleOwner(), new Observer>>() { @Override public void onChanged(Result> result) { switch (result.status){ diff --git a/app/src/main/java/com/example/quiz/ListOfTypeOfBets.java b/app/src/main/java/com/example/quiz/ListOfTypeOfBets.java index 3cd090f..c3cb4e2 100644 --- a/app/src/main/java/com/example/quiz/ListOfTypeOfBets.java +++ b/app/src/main/java/com/example/quiz/ListOfTypeOfBets.java @@ -19,6 +19,7 @@ import android.widget.Button; import android.widget.Toast; import com.example.quiz.data.adapter.TypeOfBetAdapter; +import com.example.quiz.data.model.TypeOfBet; import com.example.quiz.databinding.FragmentListOfTypeOfBetsBinding; import com.example.quiz.viewModel.SharedViewModel; import com.google.android.material.appbar.MaterialToolbar; @@ -85,7 +86,43 @@ public class ListOfTypeOfBets extends Fragment { adapter = new TypeOfBetAdapter(new ArrayList<>()); adapter.setOnItemClickListener(type -> shared.setTypeOfBet(type)); binding.typeOfBetRecyclerView.setAdapter(adapter); - List types = List.of("Couple Gagnant", "Couple Place", "Tierce", "Quinte"); + List types = List.of( + new TypeOfBet( + "Simple", + "SIMPLE", + 1 + ), + new TypeOfBet( + "Jumellé placé", + "JUMELLE_PLACE", + 2 + ), + new TypeOfBet( + "Jumellé gagnant", + "JUMELLE_GAGNANT", + 2 + ), + new TypeOfBet( + "Couple gagnant", + "COUPLE_GAGNANT", + 2 + ), + new TypeOfBet( + "Tierce", + "TRIPLET", + 3 + ), + new TypeOfBet( + "Quarte +", + "QUARTE_PLUS", + 4 + ), + new TypeOfBet( + "Quinte +", + "QUINTE_PLUS", + 5 + ) + ); // Observer les résultats /*viewModel.types.observe(getViewLifecycleOwner(), type -> { 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 8f5252c..626ae41 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 @@ -17,9 +17,14 @@ 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 onItemClickListener listener; + private SharedViewModel shared; + public BetsAdapter(SharedViewModel shared) { + this.shared = shared; + } public interface onItemClickListener { void onItemClick(Course bet); @@ -29,8 +34,6 @@ public class BetsAdapter extends RecyclerView.Adapter this.listener = listener; } - - public void setBets(List bets){ this.bets = bets; notifyDataSetChanged(); @@ -39,26 +42,27 @@ public class BetsAdapter extends RecyclerView.Adapter @NonNull @Override public BetViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_bet, parent, false); + View view = LayoutInflater.from(parent.getContext()) + .inflate(R.layout.item_bet, parent, false); return new BetViewHolder(view); } @Override public void onBindViewHolder(@NonNull BetViewHolder holder, int position) { 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); - } + holder.tvName.setText(bet.getNom()); + + if (shared != null && shared.selectedReunion.getValue() != null) { + holder.tvReunion.setText(shared.selectedReunion.getValue().getNom()); + } + + holder.itemView.setOnClickListener(v -> { + if (listener != null) listener.onItemClick(bet); }); } - - - @Override public int getItemCount(){ return bets.size(); @@ -66,13 +70,12 @@ public class BetsAdapter extends RecyclerView.Adapter static class BetViewHolder extends RecyclerView.ViewHolder{ 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/TypeOfBetAdapter.java b/app/src/main/java/com/example/quiz/data/adapter/TypeOfBetAdapter.java index e3cc766..2aa9d3f 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(String type); + void onItemClick(TypeOfBet 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 chevaux; - - public Course(int id, String numero, String nom, String lieu, LocalDateTime dateDepartCourse, String reunion, int nombreChevauxInscrits, List chevaux) { + public Course(int id, String stype, String numero, String nom, String lieu, String dateDepartCourse, int reunionId, String particularite, int partants, String statut, int nombreChevauxInscrits) { this.id = id; + this.stype = stype; this.numero = numero; this.nom = nom; this.lieu = lieu; this.dateDepartCourse = dateDepartCourse; - this.reunion = reunion; + this.reunionId = reunionId; + this.particularite = particularite; + this.partants = partants; + this.statut = statut; this.nombreChevauxInscrits = nombreChevauxInscrits; - this.chevaux = chevaux; } public int getId() { @@ -37,6 +42,14 @@ public class Course { this.id = id; } + public String getStype() { + return stype; + } + + public void setStype(String stype) { + this.stype = stype; + } + public String getNumero() { return numero; } @@ -61,20 +74,44 @@ public class Course { this.lieu = lieu; } - public LocalDateTime getDateDepartCourse() { + public String getDateDepartCourse() { return dateDepartCourse; } - public void setDateDepartCourse(LocalDateTime dateDepartCourse) { + public void setDateDepartCourse(String dateDepartCourse) { this.dateDepartCourse = dateDepartCourse; } - public String getReunion() { - return reunion; + public int getReunionId() { + return reunionId; } - public void setReunion(String reunion) { - this.reunion = reunion; + public void setReunionId(int reunionId) { + this.reunionId = reunionId; + } + + public String getParticularite() { + return particularite; + } + + public void setParticularite(String particularite) { + this.particularite = particularite; + } + + public int getPartants() { + return partants; + } + + public void setPartants(int partants) { + this.partants = partants; + } + + public String getStatut() { + return statut; + } + + public void setStatut(String statut) { + this.statut = statut; } public int getNombreChevauxInscrits() { @@ -84,12 +121,4 @@ public class Course { 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/Pari.java b/app/src/main/java/com/example/quiz/data/model/Pari.java index 8e08071..e191aa9 100644 --- a/app/src/main/java/com/example/quiz/data/model/Pari.java +++ b/app/src/main/java/com/example/quiz/data/model/Pari.java @@ -1,83 +1,36 @@ package com.example.quiz.data.model; - -import com.example.quiz.data.model.enums.CourseType; +import com.example.quiz.data.model.dtos.PariCourseDto; import com.example.quiz.data.model.enums.PariStatut; - -import java.time.LocalDateTime; import java.util.List; +import java.util.Map; public class Pari { private String numeroTicket; private String typePari; private String typeFormule; - private int mise; + private double mise; private String datePari; - private int courseId; - private String idParieur; - private String nomParieur; - private int cheval; - private int cheval1; - private int cheval2; - private int cheval3; - private int premier; - private int deuxieme; - private int troisieme; - private List chevauxOrdre; - private List chevauxSelectionnes; - private List ordrePredit; - private boolean validationOrdreExact; - private String typeMulti; - private PariStatut status; private boolean estPaye; private boolean estRembourse; + private PariCourseDto course; + private List chevauxSelectionnes; + private List ordrePredit; + private boolean validationOrdreExact; + private String typeMulti; - public Pari( - String numeroTicket, - String typePari, - String typeFormule, - int mise, - String datePari, - int courseId, - String idParieur, - String nomParieur, - int cheval, - int cheval1, - int cheval2, - int cheval3, - int premier, - int deuxieme, - int troisieme, - List chevauxOrdre, - List chevauxSelectionnes, - List ordrePredit, - boolean validationOrdreExact, - String typeMulti, - PariStatut status, - boolean estPaye, - boolean estRembourse) { + public Pari(String numeroTicket, String typePari, String typeFormule, double mise, String datePari, boolean estPaye, boolean estRembourse, PariCourseDto course, List chevauxSelectionnes, List ordrePredit, boolean validationOrdreExact, String typeMulti) { this.numeroTicket = numeroTicket; this.typePari = typePari; this.typeFormule = typeFormule; this.mise = mise; this.datePari = datePari; - this.courseId = courseId; - this.idParieur = idParieur; - this.nomParieur = nomParieur; - this.cheval = cheval; - this.cheval1 = cheval1; - this.cheval2 = cheval2; - this.cheval3 = cheval3; - this.premier = premier; - this.deuxieme = deuxieme; - this.troisieme = troisieme; - this.chevauxOrdre = chevauxOrdre; + this.estPaye = estPaye; + this.estRembourse = estRembourse; + this.course = course; this.chevauxSelectionnes = chevauxSelectionnes; this.ordrePredit = ordrePredit; this.validationOrdreExact = validationOrdreExact; this.typeMulti = typeMulti; - this.status = status; - this.estPaye = estPaye; - this.estRembourse = estRembourse; } public String getNumeroTicket() { @@ -104,11 +57,11 @@ public class Pari { this.typeFormule = typeFormule; } - public int getMise() { + public double getMise() { return mise; } - public void setMise(int mise) { + public void setMise(double mise) { this.mise = mise; } @@ -120,107 +73,43 @@ public class Pari { this.datePari = datePari; } - public int getCourseId() { - return courseId; + public boolean isEstPaye() { + return estPaye; } - public void setCourseId(int courseId) { - this.courseId = courseId; + public void setEstPaye(boolean estPaye) { + this.estPaye = estPaye; } - public String getIdParieur() { - return idParieur; + public boolean isEstRembourse() { + return estRembourse; } - public void setIdParieur(String idParieur) { - this.idParieur = idParieur; + public void setEstRembourse(boolean estRembourse) { + this.estRembourse = estRembourse; } - public String getNomParieur() { - return nomParieur; + public PariCourseDto getCourse() { + return course; } - public void setNomParieur(String nomParieur) { - this.nomParieur = nomParieur; + public void setCourse(PariCourseDto course) { + this.course = course; } - public int getCheval() { - return cheval; - } - - public void setCheval(int cheval) { - this.cheval = cheval; - } - - public int getCheval1() { - return cheval1; - } - - public void setCheval1(int cheval1) { - this.cheval1 = cheval1; - } - - public int getCheval2() { - return cheval2; - } - - public void setCheval2(int cheval2) { - this.cheval2 = cheval2; - } - - public int getCheval3() { - return cheval3; - } - - public void setCheval3(int cheval3) { - this.cheval3 = cheval3; - } - - public int getPremier() { - return premier; - } - - public void setPremier(int premier) { - this.premier = premier; - } - - public int getDeuxieme() { - return deuxieme; - } - - public void setDeuxieme(int deuxieme) { - this.deuxieme = deuxieme; - } - - public int getTroisieme() { - return troisieme; - } - - public void setTroisieme(int troisieme) { - this.troisieme = troisieme; - } - - public List getChevauxOrdre() { - return chevauxOrdre; - } - - public void setChevauxOrdre(List chevauxOrdre) { - this.chevauxOrdre = chevauxOrdre; - } - - public List getChevauxSelectionnes() { + public List getChevauxSelectionnes() { return chevauxSelectionnes; } - public void setChevauxSelectionnes(List chevauxSelectionnes) { + public void setChevauxSelectionnes(List chevauxSelectionnes) { this.chevauxSelectionnes = chevauxSelectionnes; } - public List getOrdrePredit() { + public List getOrdrePredit() { return ordrePredit; } - public void setOrdrePredit(List ordrePredit) { + public void setOrdrePredit(List ordrePredit) { this.ordrePredit = ordrePredit; } @@ -239,28 +128,4 @@ public class Pari { public void setTypeMulti(String typeMulti) { this.typeMulti = typeMulti; } - - public PariStatut getStatus() { - return status; - } - - public void setStatus(PariStatut status) { - this.status = status; - } - - public boolean isEstPaye() { - return estPaye; - } - - public void setEstPaye(boolean estPaye) { - this.estPaye = estPaye; - } - - public boolean isEstRembourse() { - return estRembourse; - } - - public void setEstRembourse(boolean estRembourse) { - this.estRembourse = estRembourse; - } } 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 b5eff14..16fd2c8 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 @@ -6,12 +6,12 @@ public class Reunion { private int id; private String code; private String nom; - private LocalDate date; + private String date; private int numero; private Hippodrome hippodrome; private int totalCourses; - public Reunion(int id, String code, String nom, LocalDate date, int numero, Hippodrome hippodrome, int totalCourses) { + public Reunion(int id, String code, String nom, String date, int numero, Hippodrome hippodrome, int totalCourses) { this.id = id; this.code = code; this.nom = nom; @@ -45,11 +45,11 @@ public class Reunion { this.nom = nom; } - public LocalDate getDate() { + public String getDate() { return date; } - public void setDate(LocalDate date) { + public void setDate(String date) { this.date = date; } diff --git a/app/src/main/java/com/example/quiz/data/model/TypeOfBet.java b/app/src/main/java/com/example/quiz/data/model/TypeOfBet.java index f11794e..ebc8311 100644 --- a/app/src/main/java/com/example/quiz/data/model/TypeOfBet.java +++ b/app/src/main/java/com/example/quiz/data/model/TypeOfBet.java @@ -1,22 +1,23 @@ package com.example.quiz.data.model; public class TypeOfBet { - private int id; - private String name; - private String numberOfHorse; - public TypeOfBet(int id, String name, String numberOfHorse) { - this.id = id; + private String label; + private String name; + private int numberOfHorse; + + public TypeOfBet(String label, String name, int numberOfHorse) { + this.label = label; this.name = name; this.numberOfHorse = numberOfHorse; } - public int getId() { - return id; + public String getLabel() { + return label; } - public void setId(int id) { - this.id = id; + public void setLabel(String label) { + this.label = label; } public String getName() { @@ -27,11 +28,11 @@ public class TypeOfBet { this.name = name; } - public String getNumberOfHorse() { + public int getNumberOfHorse() { return numberOfHorse; } - public void setNumberOfHorse(String numberOfHorse) { + public void setNumberOfHorse(int numberOfHorse) { this.numberOfHorse = numberOfHorse; } } diff --git a/app/src/main/java/com/example/quiz/data/model/dtos/PariCourseDto.java b/app/src/main/java/com/example/quiz/data/model/dtos/PariCourseDto.java new file mode 100644 index 0000000..8086a9e --- /dev/null +++ b/app/src/main/java/com/example/quiz/data/model/dtos/PariCourseDto.java @@ -0,0 +1,17 @@ +package com.example.quiz.data.model.dtos; + +public class PariCourseDto { + private int id; + + public PariCourseDto(int id) { + this.id = id; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } +} 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 index 2931aed..2f10f8f 100644 --- a/app/src/main/java/com/example/quiz/data/remote/ApiClient.java +++ b/app/src/main/java/com/example/quiz/data/remote/ApiClient.java @@ -20,7 +20,7 @@ import retrofit2.converter.gson.GsonConverterFactory; @Module @InstallIn(SingletonComponent.class) public class ApiClient { - private static final String BASE_URL = "https://api.pmu.ml/api/v1/"; + private static final String BASE_URL = "https://b440a25a7658.ngrok-free.app/api/v1/"; @Provides @Singleton 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 index 9355dc9..9c429a3 100644 --- a/app/src/main/java/com/example/quiz/data/remote/ApiService.java +++ b/app/src/main/java/com/example/quiz/data/remote/ApiService.java @@ -10,14 +10,15 @@ import retrofit2.Call; import retrofit2.http.Body; import retrofit2.http.GET; import retrofit2.http.POST; +import retrofit2.http.Path; public interface ApiService { @GET("reunions") Call> getReunions(); - @GET("course/avenir") - Call> getCourses(); + @GET("courses/reunion/{reunionId}") + Call> getCourses(@Path("reunionId") String reunionId); - @POST("/pari") + @POST("pari") Call createPari(@Body Pari pari); } 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 index 807411d..ce0c08c 100644 --- a/app/src/main/java/com/example/quiz/data/repository/CourseRepository.java +++ b/app/src/main/java/com/example/quiz/data/repository/CourseRepository.java @@ -1,5 +1,7 @@ package com.example.quiz.data.repository; +import android.util.Log; + import androidx.lifecycle.LiveData; import androidx.lifecycle.MutableLiveData; @@ -23,10 +25,10 @@ public class CourseRepository { this.apiService = apiService; } - public LiveData>> getCourses() { + public LiveData>> getCourses(String reunionId) { MutableLiveData>> liveCourses = new MutableLiveData>>(); liveCourses.setValue(Result.loading()); - apiService.getCourses().enqueue(new Callback>() { + apiService.getCourses(reunionId).enqueue(new Callback>() { @Override public void onResponse(Call> call, Response> response) { if(response.isSuccessful()){ diff --git a/app/src/main/java/com/example/quiz/data/repository/PariRepository.java b/app/src/main/java/com/example/quiz/data/repository/PariRepository.java index 8881203..41763eb 100644 --- a/app/src/main/java/com/example/quiz/data/repository/PariRepository.java +++ b/app/src/main/java/com/example/quiz/data/repository/PariRepository.java @@ -25,24 +25,37 @@ public class PariRepository { } public LiveData> createPari(Pari pari) { - MutableLiveData> pariResponse = new MutableLiveData>(); + MutableLiveData> pariResponse = new MutableLiveData<>(); pariResponse.setValue(Result.loading()); + apiService.createPari(pari).enqueue(new Callback() { @Override public void onResponse(Call call, Response response) { - if(response.isSuccessful()){ + + if (response.isSuccessful() && response.body() != null) { pariResponse.postValue(Result.success(response.body())); - }else { - pariResponse.postValue(Result.error(response.message())); + } else { + // On récupère l'erreur exacte envoyée par le backend + try { + String errorBody = response.errorBody() != null ? + response.errorBody().string() : "Erreur inconnue"; + + pariResponse.postValue(Result.error(errorBody)); + + } catch (Exception e) { + pariResponse.postValue(Result.error("Erreur serveur")); + } } } @Override - public void onFailure(Call call, Throwable throwable) { - pariResponse.postValue(Result.error(throwable.getMessage())); + public void onFailure(Call call, Throwable t) { + pariResponse.postValue(Result.error(t.getMessage())); } }); + return pariResponse; } + } diff --git a/app/src/main/java/com/example/quiz/utils/HPRTPrinterUtil.java b/app/src/main/java/com/example/quiz/utils/HPRTPrinterUtil.java index 2a18cf0..d890d2c 100644 --- a/app/src/main/java/com/example/quiz/utils/HPRTPrinterUtil.java +++ b/app/src/main/java/com/example/quiz/utils/HPRTPrinterUtil.java @@ -6,9 +6,15 @@ import android.bluetooth.BluetoothDevice; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; +import android.graphics.Color; +import android.os.Environment; import android.util.Log; import android.widget.Toast; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; import java.io.InputStream; import java.util.Set; @@ -87,18 +93,25 @@ public class HPRTPrinterUtil { } } - public void printText(StringBuilder text) { + public void printText(Bitmap logo, StringBuilder text) { try { if (!HPRTPrinterHelper.IsOpened()) { Toast.makeText(context, "Imprimante non connectée", Toast.LENGTH_SHORT).show(); return; } + + + Bitmap resized = resizeForPrinter(logo, 384); + + HPRTPrinterHelper.printImage("0", "0", resized, false); - // TSPL pur pour texte simple String tspl = ""+ text + "\r\n"; + + + // Envoi à l'imprimante - HPRTPrinterHelper.PrintData(tspl); + //HPRTPrinterHelper.PrintData(tspl); Log.d(TAG, "Texte imprimé sur ticket"); // on log seulement le succès @@ -110,6 +123,7 @@ public class HPRTPrinterUtil { + public void printTSPLTemplate(String tsplTemplate) { try { if (!HPRTPrinterHelper.IsOpened()) { @@ -125,6 +139,121 @@ public class HPRTPrinterUtil { } } + public static Bitmap toMonochrome(Bitmap src) { + int width = src.getWidth(); + int height = src.getHeight(); + + // Bitmap de sortie en ARGB_8888 + Bitmap bw = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); + + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x++) { + int pixel = src.getPixel(x, y); + + // Calcul de la luminance (grayscale) + int gray = (Color.red(pixel) + Color.green(pixel) + Color.blue(pixel)) / 3; + + // Seuil pour décider noir ou blanc + if (gray < 128) { + bw.setPixel(x, y, Color.BLACK); + } else { + bw.setPixel(x, y, Color.WHITE); + } + } + } + + return bw; + } + + + public static byte[] bitmapToEscPos(Bitmap bitmap) throws IOException { + bitmap = bitmap.copy(Bitmap.Config.ARGB_8888, false); + + int width = bitmap.getWidth(); + int height = bitmap.getHeight(); + + int bytesPerRow = (width + 7) / 8; + byte[] imageBytes = new byte[bytesPerRow * height]; + + int index = 0; + + for (int y = 0; y < height; y++) { + int bitIndex = 0; + byte currentByte = 0; + + for (int x = 0; x < width; x++) { + int color = bitmap.getPixel(x, y); + int gray = (Color.red(color) + Color.green(color) + Color.blue(color)) / 3; + + currentByte <<= 1; + if (gray < 128) currentByte |= 1; + + bitIndex++; + + if (bitIndex == 8) { + imageBytes[index++] = currentByte; + currentByte = 0; + bitIndex = 0; + } + } + + if (bitIndex > 0) { + currentByte <<= (8 - bitIndex); + imageBytes[index++] = currentByte; + } + } + + // Préfixe ESC/POS GS v 0 + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + baos.write(0x1D); + baos.write('v'); + baos.write('0'); + baos.write(0); // Normal mode + baos.write(bytesPerRow & 0xFF); + baos.write((bytesPerRow >> 8) & 0xFF); + baos.write(height & 0xFF); + baos.write((height >> 8) & 0xFF); + baos.write(imageBytes); + + return baos.toByteArray(); + } + + + public static Bitmap resizeForPrinter(Bitmap bmp, int maxWidth){ + if(bmp.getWidth() <= maxWidth) return bmp; + int newHeight = bmp.getHeight() * maxWidth / bmp.getWidth(); + return Bitmap.createScaledBitmap(bmp, maxWidth, newHeight, false); + } + + // 2. Convertir le bitmap monochrome en flux binaire TSPL + public static byte[] bitmapToTsplBinary(Bitmap bmp){ + int width = bmp.getWidth(); + int height = bmp.getHeight(); + int bytesPerRow = (width + 7) / 8; + byte[] data = new byte[bytesPerRow*height]; + int index = 0; + for(int y=0;y>> getCourses(){ + public LiveData>> getCourses(String reunionId){ if(courses == null){ - courses = courseRepository.getCourses(); + courses = courseRepository.getCourses(reunionId); } return courses; } 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 20a7809..f1e3cf5 100644 --- a/app/src/main/java/com/example/quiz/viewModel/SharedViewModel.java +++ b/app/src/main/java/com/example/quiz/viewModel/SharedViewModel.java @@ -16,7 +16,7 @@ public class SharedViewModel extends ViewModel { public MutableLiveData selectedReunion = new MutableLiveData(); public MutableLiveData selectedCourse = new MutableLiveData(); - public MutableLiveData typeOfBet = new MutableLiveData(); + public MutableLiveData typeOfBet = new MutableLiveData(); public void setSelectedReunion(Reunion reunion){ @@ -26,7 +26,7 @@ public class SharedViewModel extends ViewModel { public void setSelectedCourse(Course course){ selectedCourse.setValue(course); } - public void setTypeOfBet(String type){ + public void setTypeOfBet(TypeOfBet type){ typeOfBet.setValue(type); } } diff --git a/app/src/main/res/drawable/circle_primary.xml b/app/src/main/res/drawable/circle_primary.xml index 13ad651..8fb0b69 100644 --- a/app/src/main/res/drawable/circle_primary.xml +++ b/app/src/main/res/drawable/circle_primary.xml @@ -1,4 +1,3 @@ - - + diff --git a/app/src/main/res/drawable/ic_right_arrow.xml b/app/src/main/res/drawable/ic_right_arrow.xml new file mode 100644 index 0000000..d25191c --- /dev/null +++ b/app/src/main/res/drawable/ic_right_arrow.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/item_gradient_bg.xml b/app/src/main/res/drawable/item_gradient_bg.xml index ce31cc0..cc67f2d 100644 --- a/app/src/main/res/drawable/item_gradient_bg.xml +++ b/app/src/main/res/drawable/item_gradient_bg.xml @@ -1,8 +1,7 @@ - - + diff --git a/app/src/main/res/drawable/item_gradient_bg_selected.xml b/app/src/main/res/drawable/item_gradient_bg_selected.xml index 9176411..dd78ff9 100644 --- a/app/src/main/res/drawable/item_gradient_bg_selected.xml +++ b/app/src/main/res/drawable/item_gradient_bg_selected.xml @@ -4,8 +4,8 @@ diff --git a/app/src/main/res/layout/fragment_list_of_type_of_bets.xml b/app/src/main/res/layout/fragment_list_of_type_of_bets.xml index 2ab508a..e1eede4 100644 --- a/app/src/main/res/layout/fragment_list_of_type_of_bets.xml +++ b/app/src/main/res/layout/fragment_list_of_type_of_bets.xml @@ -1,19 +1,17 @@ - + android:background="@color/text_hint_color"> + + android:paddingTop="10dp"> - + - + - + android:layout_height="0dp" + android:layout_weight="1" + android:clipToPadding="false" + android:paddingVertical="10dp" + android:scrollbars="vertical" /> + diff --git a/app/src/main/res/layout/type_of_bet_item.xml b/app/src/main/res/layout/type_of_bet_item.xml index 5c615de..1fd7e60 100644 --- a/app/src/main/res/layout/type_of_bet_item.xml +++ b/app/src/main/res/layout/type_of_bet_item.xml @@ -1,31 +1,27 @@ - + android:layout_marginVertical="3dp" + android:layout_marginHorizontal="12dp" + card_view:cardCornerRadius="20dp" + card_view:cardElevation="8dp" + android:foreground="?attr/selectableItemBackground"> + android:clipToPadding="false"> - + + android:background="@drawable/circle_primary" /> + android:singleLine="true" /> - + + android:src="@drawable/ic_right_arrow" + card_view:tint="@android:color/white" /> - \ No newline at end of file +