in progress!

This commit is contained in:
OnlyPapy98
2025-12-05 18:08:01 +01:00
parent ed92a63015
commit dc93d1320f
31 changed files with 1350 additions and 137 deletions

View File

@@ -0,0 +1,65 @@
package com.example.quiz;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.example.quiz.databinding.FragmentAnnulationTicketBinding;
/**
* A simple {@link Fragment} subclass.
* Use the {@link AnnulationTicket#newInstance} factory method to
* create an instance of this fragment.
*/
public class AnnulationTicket extends Fragment {
FragmentAnnulationTicketBinding binding;
public AnnulationTicket() {
// Required empty public constructor
}
public static AnnulationTicket newInstance() {
AnnulationTicket fragment = new AnnulationTicket();
Bundle args = new Bundle();
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
binding = FragmentAnnulationTicketBinding.inflate(inflater, container, false);
return binding.getRoot();
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
binding.annuleTicketBtnBack.setOnClickListener(v->{
getActivity().onBackPressed();
});
}
@Override
public void onResume() {
super.onResume();
AppCompatActivity activity = (AppCompatActivity) getActivity();
if(activity != null){
activity.getSupportActionBar().setTitle("Annulation Ticket");
}
}
}

View File

@@ -1,15 +1,19 @@
package com.example.quiz;
import android.annotation.SuppressLint;
import android.bluetooth.BluetoothAdapter;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import androidx.activity.result.ActivityResultLauncher;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.fragment.app.Fragment;
@@ -54,6 +58,7 @@ import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
import dagger.hilt.android.AndroidEntryPoint;
@@ -70,6 +75,8 @@ public class BetValidation extends Fragment {
SharedViewModel shared;
private AlertDialog dialog;
private boolean order;
@@ -169,7 +176,7 @@ public class BetValidation extends Fragment {
textView.setWidth(80);
textView.setHeight(100);
textView.setGravity(Gravity.CENTER);
textView.setBackgroundResource(R.drawable.number_background);
textView.setBackgroundResource(Objects.equals(horse, "X") ?R.drawable.x_background: R.drawable.number_background);
textView.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
textView.setOnClickListener(v -> {
final List<String> horses = new ArrayList<>(selectedHorses.getValue());
@@ -292,11 +299,7 @@ public class BetValidation extends Fragment {
Toast.makeText(getContext(), "En cours", Toast.LENGTH_SHORT).show();
break;
case SUCCESS:
try {
printPari(pariResult.data);
} catch (WriterException e) {
throw new RuntimeException(e);
}
_showPariDialog(pariResult.data);
break;
}
}
@@ -358,6 +361,45 @@ public class BetValidation extends Fragment {
}
@SuppressLint({"MissingInflatedId", "SetTextI18n"})
void _showPariDialog(Pari pari){
LayoutInflater inflater = getLayoutInflater();
View view = inflater.inflate(R.layout.pari_confirmation, null);
TextView numero_course = (TextView) view.findViewById(R.id.alert_course_numero);
numero_course.setText("Numero Course: "+String.valueOf(shared.selectedCourse.getValue().getId()));
TextView alert_pari_type = (TextView) view.findViewById(R.id.alert_pari_type);
alert_pari_type.setText(shared.typeOfBet.getValue().getName());
TextView is_elargie = (TextView) view.findViewById(R.id.alert_is_elargie);
is_elargie.setText(selectedHorses.getValue().size() > shared.typeOfBet.getValue().getNumberOfHorse()?"CE":"SI");
TextView alert_combinaison = (TextView) view.findViewById(R.id.alert_combinaison);
alert_combinaison.setText(selectedHorses.getValue().stream()
.map(String::valueOf)
.collect(Collectors.joining("-")));
TextView aler_coeff = (TextView) view.findViewById(R.id.alert_coeff);
aler_coeff.setText("Coef:"+String.valueOf(coeff));
TextView alert_montant = (TextView) view.findViewById(R.id.alert_montant);
alert_montant.setText("Montant: "+String.valueOf(mise)+" CFA");
AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
builder.setView(view);
builder.setCancelable(false);
dialog = builder.create();
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
view.findViewById(R.id.alert_validate).setOnClickListener(v->{
try {
printPari(pari);
dialog.dismiss();
} catch (WriterException e) {
throw new RuntimeException(e);
}
});
view.findViewById(R.id.alert_cancel).setOnClickListener(v -> {
dialog.dismiss();
});
}
void _initializeToZero(){
mise = 0;
binding.mise.setText(String.valueOf(mise+" CFA"));

View File

@@ -0,0 +1,100 @@
package com.example.quiz;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.example.quiz.databinding.FragmentCaisseBinding;
import com.google.android.material.appbar.MaterialToolbar;
/**
* A simple {@link Fragment} subclass.
* Use the {@link Caisse#newInstance} factory method to
* create an instance of this fragment.
*/
public class Caisse extends Fragment {
FragmentCaisseBinding binding;
public Caisse() {
// Required empty public constructor
}
// TODO: Rename and change types and number of parameters
public static Caisse newInstance() {
Caisse fragment = new Caisse();
Bundle args = new Bundle();
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
binding = FragmentCaisseBinding.inflate(inflater, container, false);
return binding.getRoot();
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState){
super.onViewCreated(view, savedInstanceState);
binding.soldeBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Sold sold = Sold.newInstance();
getActivity().getSupportFragmentManager()
.beginTransaction()
.replace(R.id.nav_host_fragment_content_main, sold)
.addToBackStack(null)
.commit();
}
});
binding.winTicketBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
WinTicket winTicket = WinTicket.newInstance();
getActivity().getSupportFragmentManager()
.beginTransaction()
.replace(R.id.nav_host_fragment_content_main, winTicket)
.addToBackStack(null)
.commit();
}
});
binding.cancelTicketBtn.setOnClickListener(v -> {
AnnulationTicket annulationTicket = AnnulationTicket.newInstance();
getActivity().getSupportFragmentManager()
.beginTransaction()
.replace(R.id.nav_host_fragment_content_main, annulationTicket)
.addToBackStack(null)
.commit();
});
}
@Override
public void onResume() {
super.onResume();
AppCompatActivity activity = (AppCompatActivity) getActivity();
if (activity != null){
MaterialToolbar toolbar = activity.findViewById(R.id.toolbar);
activity.setSupportActionBar(toolbar);
if(toolbar != null){
if(activity.getSupportActionBar() != null){
activity.getSupportActionBar().setTitle("Caisse");
toolbar.setBackgroundColor(getResources().getColor(R.color.primary_green));
toolbar.setTitleTextColor(getResources().getColor(R.color.white));
toolbar.setVisibility(View.VISIBLE);
}
}
}
}
}

View File

@@ -23,9 +23,12 @@ import android.view.ViewGroup;
import android.widget.Toast;
import android.widget.Toolbar;
import com.anggastudio.printama.Pref;
import com.anggastudio.printama.Printama;
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.BluetoothUtils;
import com.example.quiz.utils.Result;
import com.example.quiz.viewModel.ReunionViewModel;
import com.example.quiz.viewModel.SharedViewModel;
@@ -67,7 +70,30 @@ public class ListOfReunions extends Fragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestPermission();
}
private void requestPermission(){
Pref.init(getContext());
if (BluetoothUtils.needsBluetoothPermissions()) {
if (!BluetoothUtils.hasBluetoothPermission(getContext())) {
// Demande la permission si non accordée
BluetoothUtils.requestBluetoothPermission(getActivity());
return; // arrête ici, la popup va apparaître
}
}
// 2⃣ Permission OK, on peut afficher la liste
try {
Printama printama = Printama.with(getContext());
if(!printama.isConnected()){
BluetoothUtils.showPrinterList(getContext(), getActivity());
}
} catch (SecurityException e) {
Toast.makeText(getContext(),
"Permission Bluetooth non accordée", Toast.LENGTH_SHORT).show();
}
}
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,

View File

@@ -1,25 +1,15 @@
package com.example.quiz;
import android.app.Activity;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
import android.provider.Settings;
import android.text.Editable;
import android.text.TextWatcher;
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.databinding.FragmentLoginBinding;
import com.example.quiz.utils.SharedPrefsHelper;
@@ -73,27 +63,25 @@ public class Login extends Fragment {
binding.loginButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(binding.userNameInput.getText().toString().isEmpty()){
binding.userNameInput.setError("Le nom d'utilisateur est obligatoire");
binding.userNameInput.requestFocus();
return;
}
if(binding.passwordInput.getText().toString().isEmpty()){
binding.passwordInput.setError("Le mot de passe est obligatoire");
binding.passwordInput.requestFocus();
return;
}
if(binding.passwordInput.getText().toString().length() < 6){
binding.passwordInput.setError("Le mot de passe doit contenir au moins 6 caractères ");
binding.passwordInput.requestFocus();
return;
}
prefsHelper = SharedPrefsHelper.getInstance(getContext());
prefsHelper.save("username", binding.userNameInput.getText().toString());
FragmentManager fragmentManager = getParentFragmentManager();
ListOfReunions reunions = ListOfReunions.newInstance(binding.userNameInput.getText().toString());
ListOfReunions reunions = ListOfReunions.newInstance("");
fragmentManager.beginTransaction()
.replace(R.id.nav_host_fragment_content_main, reunions)
.addToBackStack(null)
.commit();
}
});
binding.caisse.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Caisse caisse = Caisse.newInstance();
FragmentManager fragmentManager = getParentFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.nav_host_fragment_content_main, caisse)
.addToBackStack(null)
.commit();
}
});

View File

@@ -1,22 +1,29 @@
package com.example.quiz;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import com.anggastudio.printama.Pref;
import com.anggastudio.printama.Printama;
import com.example.quiz.utils.BluetoothUtils;
import com.example.quiz.data.model.dtos.auth.LoginPayload;
import com.example.quiz.data.model.dtos.auth.LoginResponse;
import com.example.quiz.utils.Result;
import com.example.quiz.utils.SessionManager;
import com.example.quiz.utils.SharedPrefsHelper;
import com.example.quiz.viewModel.LoginViewModel;
import com.google.android.material.snackbar.Snackbar;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Handler;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import androidx.fragment.app.FragmentManager;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;
import androidx.navigation.NavController;
import androidx.navigation.Navigation;
import androidx.navigation.ui.AppBarConfiguration;
@@ -29,7 +36,10 @@ import dagger.hilt.android.AndroidEntryPoint;
@AndroidEntryPoint
public class PageQuiz extends AppCompatActivity {
LoginViewModel viewModel;
private SessionManager sessionManager;
private AlertDialog dialog;
private Handler handler = new Handler();
private Runnable checkRunnable;
@@ -38,48 +48,15 @@ public class PageQuiz extends AppCompatActivity {
private SharedPrefsHelper prefsHelper;
private void requestPermission(){
Pref.init(getApplicationContext());
if (BluetoothUtils.needsBluetoothPermissions()) {
if (!BluetoothUtils.hasBluetoothPermission(getApplicationContext())) {
// Demande la permission si non accordée
BluetoothUtils.requestBluetoothPermission(this);
return; // arrête ici, la popup va apparaître
}
}
// 2⃣ Permission OK, on peut afficher la liste
try {
Printama printama = Printama.with(getApplicationContext());
if(!printama.isConnected()){
BluetoothUtils.showPrinterList(getApplicationContext(), this);
}
} catch (SecurityException e) {
Toast.makeText(getApplicationContext(),
"Permission Bluetooth non accordée", Toast.LENGTH_SHORT).show();
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestPermission();
binding = ActivityPageQuizBinding.inflate(getLayoutInflater());
_showPinDialog();
setContentView(binding.getRoot());
sessionManager = new SessionManager();
// Vérification périodique
checkRunnable = new Runnable() {
@Override
public void run() {
if (sessionManager.isExpired()) {
Toast.makeText(getApplicationContext(), "I'm herer", Toast.LENGTH_LONG).show();
} else {
handler.postDelayed(this, 60 * 1000);
}
}
};
handler.postDelayed(checkRunnable, 60 * 1000);
prefsHelper = SharedPrefsHelper.getInstance(getApplicationContext());
viewModel = new ViewModelProvider(this).get(LoginViewModel.class);
setSupportActionBar(binding.toolbar);
binding.toolbar.setBackgroundColor(Color.parseColor("#501C5A29"));
binding.fab.setOnClickListener(new View.OnClickListener() {
@@ -90,22 +67,97 @@ public class PageQuiz extends AppCompatActivity {
.setAction("Action", null).show();
}
});
prefsHelper = SharedPrefsHelper.getInstance(getApplicationContext());
FragmentManager fragmentManager = getSupportFragmentManager();
}
if(prefsHelper.get("username") != null){
ListOfReunions reunions = ListOfReunions.newInstance(prefsHelper.get("username"));
fragmentManager
.beginTransaction()
.replace(R.id.nav_host_fragment_content_main, reunions)
.commit();
}else{
Login login = Login.newInstance();
fragmentManager
.beginTransaction()
.replace(R.id.nav_host_fragment_content_main, login)
.commit();
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (dialog != null && dialog.isShowing()) {
return super.dispatchTouchEvent(ev);
}
if(sessionManager.isExpired()){
_showPinDialog();
return true;
}
sessionManager.updateLastExpiredDate();
return super.dispatchTouchEvent(ev);
}
void _showPinDialog(){
LayoutInflater inflater = getLayoutInflater();
View view = inflater.inflate(R.layout.pin_view, null);
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setView(view);
builder.setCancelable(false);
dialog = builder.create();
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
// Bouton OK
view.findViewById(R.id.pin_validate).setOnClickListener(v -> {
TextView pin = view.findViewById(R.id.pin);
if(pin.getText().toString().isEmpty()){
pin.setError("Entrez le pin!");
return;
}
if(pin.getText().toString().length() != 5){
pin.setError("Le pin doit contenir 5 chiffres!");
return;
}
LoginPayload loginPayload = new LoginPayload(
pin.getText().toString()
);
viewModel.login(loginPayload).observe(this, new Observer<Result<LoginResponse>>() {
@Override
public void onChanged(Result<LoginResponse> loginResponseResult) {
switch (loginResponseResult.status){
case LOADING:
Toast.makeText(getApplicationContext(), "Loading",Toast.LENGTH_SHORT).show();
break;
case ERROR:
pin.setError("Pin incorrect");
break;
case SUCCESS:
loginSuccess(loginResponseResult.data);
sessionManager.updateLastExpiredDate();
dialog.dismiss();
break;
}
}
});
});
dialog.show();
}
private void loginSuccess(LoginResponse loginResponse){
prefsHelper.save("firstName", loginResponse.getPrenom());
prefsHelper.save("lastName", loginResponse.getNom());
prefsHelper.save("profile", loginResponse.getProfile());
prefsHelper.save("limit", String.valueOf(loginResponse.getLimiteSuperieure()));
}
@Override
protected void onResume() {
super.onResume();
handler = new Handler();
checkRunnable = new Runnable() {
@Override
public void run() {
if (sessionManager.isExpired()) {
if(dialog != null && !dialog.isShowing()){
_showPinDialog();
}
} else {
handler.postDelayed(this, 10); // check every second
}
}
};
handler.postDelayed(checkRunnable, 10);
}
@Override

View File

@@ -0,0 +1,69 @@
package com.example.quiz;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.example.quiz.databinding.FragmentWinTicketBinding;
import com.google.android.material.appbar.MaterialToolbar;
/**
* A simple {@link Fragment} subclass.
* Use the {@link WinTicket#newInstance} factory method to
* create an instance of this fragment.
*/
public class WinTicket extends Fragment {
FragmentWinTicketBinding binding;
public WinTicket() {
// Required empty public constructor
}
public static WinTicket newInstance() {
WinTicket fragment = new WinTicket();
Bundle args = new Bundle();
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
binding = FragmentWinTicketBinding.inflate(inflater, container, false);
return binding.getRoot();
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
binding.winTicketBtnBack.setOnClickListener(v -> {
getActivity().onBackPressed();
});
}
@Override
public void onResume() {
super.onResume();
AppCompatActivity activity = (AppCompatActivity) getActivity();
if (activity != null) {
activity.getSupportActionBar();
MaterialToolbar toolbar = activity.findViewById(R.id.toolbar);
if(toolbar!= null){
toolbar.setTitle("Ticket Gagnant");
}
}
}
}

View File

@@ -0,0 +1,17 @@
package com.example.quiz.data.model.dtos.auth;
public class LoginPayload {
private String pin;
public LoginPayload(String pin) {
this.pin = pin;
}
public String getPin() {
return pin;
}
public void setPin(String pin) {
this.pin = pin;
}
}

View File

@@ -0,0 +1,237 @@
package com.example.quiz.data.model.dtos.auth;
public class LoginResponse {
private int id;
private String code;
private String profile;
private String principalCode;
private String caisseProfile;
private String statut;
private String zone;
private String kiosk;
private String fonction;
private String dateEmbauche;
private String derniereConnexion;
private String nom;
private String prenom;
private String autresNom;
private String dateNaissance;
private String lieuNaissance;
private String ville;
private String adresse;
private String cni;
private double limiteInferieure;
private double limiteSuperieure;
private double limiteParTransaction;
private String autreAdresse1;
public LoginResponse(int id, String code, String profile, String principalCode, String caisseProfile, String statut, String zone, String kiosk, String fonction, String dateEmbauche, String derniereConnexion, String nom, String prenom, String autresNom, String dateNaissance, String lieuNaissance, String ville, String adresse, String cni, double limiteInferieure, double limiteSuperieure, double limiteParTransaction, String autreAdresse1) {
this.id = id;
this.code = code;
this.profile = profile;
this.principalCode = principalCode;
this.caisseProfile = caisseProfile;
this.statut = statut;
this.zone = zone;
this.kiosk = kiosk;
this.fonction = fonction;
this.dateEmbauche = dateEmbauche;
this.derniereConnexion = derniereConnexion;
this.nom = nom;
this.prenom = prenom;
this.autresNom = autresNom;
this.dateNaissance = dateNaissance;
this.lieuNaissance = lieuNaissance;
this.ville = ville;
this.adresse = adresse;
this.cni = cni;
this.limiteInferieure = limiteInferieure;
this.limiteSuperieure = limiteSuperieure;
this.limiteParTransaction = limiteParTransaction;
this.autreAdresse1 = autreAdresse1;
}
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 getProfile() {
return profile;
}
public void setProfile(String profile) {
this.profile = profile;
}
public String getPrincipalCode() {
return principalCode;
}
public void setPrincipalCode(String principalCode) {
this.principalCode = principalCode;
}
public String getCaisseProfile() {
return caisseProfile;
}
public void setCaisseProfile(String caisseProfile) {
this.caisseProfile = caisseProfile;
}
public String getStatut() {
return statut;
}
public void setStatut(String statut) {
this.statut = statut;
}
public String getZone() {
return zone;
}
public void setZone(String zone) {
this.zone = zone;
}
public String getKiosk() {
return kiosk;
}
public void setKiosk(String kiosk) {
this.kiosk = kiosk;
}
public String getFonction() {
return fonction;
}
public void setFonction(String fonction) {
this.fonction = fonction;
}
public String getDateEmbauche() {
return dateEmbauche;
}
public void setDateEmbauche(String dateEmbauche) {
this.dateEmbauche = dateEmbauche;
}
public String getDerniereConnexion() {
return derniereConnexion;
}
public void setDerniereConnexion(String derniereConnexion) {
this.derniereConnexion = derniereConnexion;
}
public String getNom() {
return nom;
}
public void setNom(String nom) {
this.nom = nom;
}
public String getPrenom() {
return prenom;
}
public void setPrenom(String prenom) {
this.prenom = prenom;
}
public String getAutresNom() {
return autresNom;
}
public void setAutresNom(String autresNom) {
this.autresNom = autresNom;
}
public String getDateNaissance() {
return dateNaissance;
}
public void setDateNaissance(String dateNaissance) {
this.dateNaissance = dateNaissance;
}
public String getLieuNaissance() {
return lieuNaissance;
}
public void setLieuNaissance(String lieuNaissance) {
this.lieuNaissance = lieuNaissance;
}
public String getVille() {
return ville;
}
public void setVille(String ville) {
this.ville = ville;
}
public String getAdresse() {
return adresse;
}
public void setAdresse(String adresse) {
this.adresse = adresse;
}
public String getCni() {
return cni;
}
public void setCni(String cni) {
this.cni = cni;
}
public double getLimiteInferieure() {
return limiteInferieure;
}
public void setLimiteInferieure(double limiteInferieure) {
this.limiteInferieure = limiteInferieure;
}
public double getLimiteSuperieure() {
return limiteSuperieure;
}
public void setLimiteSuperieure(double limiteSuperieure) {
this.limiteSuperieure = limiteSuperieure;
}
public double getLimiteParTransaction() {
return limiteParTransaction;
}
public void setLimiteParTransaction(double limiteParTransaction) {
this.limiteParTransaction = limiteParTransaction;
}
public String getAutreAdresse1() {
return autreAdresse1;
}
public void setAutreAdresse1(String autreAdresse1) {
this.autreAdresse1 = autreAdresse1;
}
}

View File

@@ -20,7 +20,7 @@ import retrofit2.converter.gson.GsonConverterFactory;
@Module
@InstallIn(SingletonComponent.class)
public class ApiClient {
private static final String BASE_URL = "https://performances-leeds-operations-continued.trycloudflare.com/api/v1/";
private static final String BASE_URL = "https://970b6b1c025c.ngrok-free.app/api/v1/";
@Provides
@Singleton

View File

@@ -3,6 +3,8 @@ package com.example.quiz.data.remote;
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.dtos.auth.LoginPayload;
import com.example.quiz.data.model.dtos.auth.LoginResponse;
import java.util.List;
@@ -21,4 +23,7 @@ public interface ApiService {
@POST("pari")
Call<Pari> createPari(@Body Pari pari);
@POST("auth/agent/login")
Call<LoginResponse> login(@Body LoginPayload loginPayload);
}

View File

@@ -0,0 +1,44 @@
package com.example.quiz.data.repository;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import com.example.quiz.data.model.dtos.auth.LoginPayload;
import com.example.quiz.data.model.dtos.auth.LoginResponse;
import com.example.quiz.data.remote.ApiService;
import com.example.quiz.utils.Result;
import javax.inject.Inject;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
public class LoginRepository {
private ApiService apiService;
@Inject
public LoginRepository(ApiService apiService) {
this.apiService = apiService;
}
public LiveData<Result<LoginResponse>> login(LoginPayload loginPayload){
MutableLiveData<Result<LoginResponse>> liveLogin = new MutableLiveData<Result<LoginResponse>>();
liveLogin.setValue(Result.loading());
apiService.login(loginPayload).enqueue(new Callback<LoginResponse>() {
@Override
public void onResponse(Call<LoginResponse> call, Response<LoginResponse> response) {
if(response.isSuccessful()){
liveLogin.postValue(Result.success(response.body()));
}else{
liveLogin.postValue(Result.error(response.message()));
}
}
@Override
public void onFailure(Call<LoginResponse> call, Throwable throwable) {
liveLogin.postValue(Result.error(throwable.getMessage()));
}
});
return liveLogin;
}
}

View File

@@ -5,19 +5,20 @@ import java.time.LocalDateTime;
public class SessionManager {
// 10 minutes en millisecondes
private static final long sessionExpiredTime = 60 * 1000;
private static final long sessionExpiredTime = 10 * 60 * 1000;
private LocalDateTime lastExpiredDate;
public SessionManager() {
updateLastExpiredDate();
}
public SessionManager() {}
public void updateLastExpiredDate() {
lastExpiredDate = LocalDateTime.now();
}
public boolean isExpired() {
if (lastExpiredDate == null) {
return true;
}
// Vérifie si le temps écoulé depuis lastExpiredDate > sessionExpiredTime
Duration elapsed = Duration.between(lastExpiredDate, LocalDateTime.now());
return elapsed.toMillis() > sessionExpiredTime;

View File

@@ -0,0 +1,27 @@
package com.example.quiz.viewModel;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.ViewModel;
import com.example.quiz.data.model.dtos.auth.LoginPayload;
import com.example.quiz.data.model.dtos.auth.LoginResponse;
import com.example.quiz.data.repository.LoginRepository;
import com.example.quiz.utils.Result;
import javax.inject.Inject;
import dagger.hilt.android.lifecycle.HiltViewModel;
@HiltViewModel
public class LoginViewModel extends ViewModel {
LoginRepository loginRepository;
@Inject
public LoginViewModel(LoginRepository loginRepository) {
this.loginRepository = loginRepository;
}
public LiveData<Result<LoginResponse>> login(LoginPayload loginPayload){
return loginRepository.login(loginPayload);
}
}

View File

@@ -0,0 +1,3 @@
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<solid android:color="@android:color/transparent"/>
</shape>

View File

@@ -0,0 +1,21 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="105dp"
android:height="105dp"
android:viewportWidth="100"
android:viewportHeight="100">
<path
android:strokeWidth="1"
android:pathData="m38.03,65.13a28.13,28.13 0,1 1,23.97 0l6.25,16.67 -36.47,0z"
android:fillColor="#545454"
android:strokeColor="#222222"/>
<path
android:strokeWidth="1"
android:pathData="M50.02,39.6m-20.84,0a20.84,20.84 0,1 1,41.68 0a20.84,20.84 0,1 1,-41.68 0"
android:fillColor="#FFF"
android:strokeColor="#222222"/>
<path
android:strokeWidth="1"
android:pathData="M50.02,39.6m-16.67,0a16.67,16.67 0,1 1,33.34 0a16.67,16.67 0,1 1,-33.34 0"
android:fillColor="#03A9F4"
android:strokeColor="#222222"/>
</vector>

View File

@@ -1,7 +1,7 @@
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<solid android:color="@color/white" />
<stroke android:width="1dp" android:color="@color/text_light_grey" />
<corners android:radius="12dp" />
<corners android:radius="5dp" />
<padding
android:left="8dp"
android:top="2dp"

View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#FFFFFF"/> <!-- Fond blanc -->
<stroke
android:width="1dp"
android:color="#CCCCCC" /> <!-- Bordure grise -->
</shape>

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="40dp"
android:height="40dp"
android:viewportWidth="512"
android:viewportHeight="512">
<path
android:pathData="M400,16c-21.33,9.73 -58.24,17.34 -73.09,48.23 -22.36,1.95 -72.75,10.67 -122.22,40.25 -58.1,34.74 -116.02,97.42 -131.78,213.7l-0.48,3.54 -2.77,2.25c-30.87,25 -40.66,38.94 -44.42,61.15 -3.54,20.9 -0.72,51.46 -0.36,101.88L328.36,487c3.45,-16.89 10.44,-29.25 12.47,-41.57 2.34,-14.18 0.19,-29.94 -20.81,-58.55 -43.08,-58.68 -46.85,-129.46 -12.92,-171.28 -8.65,-2.77 -15.09,-6.89 -19.46,-12.55 -6.11,-7.92 -7.4,-17.01 -8.57,-25.88l17.85,-2.35c1.11,8.45 2.38,13.88 4.97,17.24 2.59,3.36 7.31,6.47 19.55,8.46l-0.02,0.13 0.17,-0.17 6,9.42c19.96,31.36 42.84,51.29 73.33,54.44l6.51,0.67 1.37,6.4c2.74,12.83 8.63,19.09 15.12,22.24 6.49,3.14 14.23,2.94 20.47,0.2 9.32,-4.09 14.52,-11.35 16.7,-22.71 2.12,-11.05 0.55,-25.83 -5.14,-42.11 -33.54,-38.25 -44.47,-87.28 -63.9,-128.77 -6.05,-9.95 -12.45,-18.52 -20.39,-24.86C376.81,55.13 386.46,34.85 400,16zM214.07,34.97C179.55,35.06 146.07,43.06 96,58.58c31.15,9.92 70.4,18.9 86.04,39.01 4.46,-3.02 8.94,-5.88 13.42,-8.56 40.51,-24.22 80.39,-35.29 108.23,-40.04 -35.85,-9.48 -63.05,-14.09 -89.62,-14.02zM157.16,96.71c-1.13,-0.01 -2.27,-0.01 -3.4,0 -30.35,0.37 -63.1,9.74 -96.65,31.28 27.19,3.67 54.67,3.72 72.58,15.4 15.9,-17.92 33.14,-32.63 50.68,-44.67 -7.55,-1.24 -15.29,-1.94 -23.21,-2.02zM368,128a13.21,13.22 0,0 1,13.21 13.22A13.21,13.22 0,0 1,368 154.43a13.21,13.22 0,0 1,-13.21 -13.22A13.21,13.22 0,0 1,368 128zM129.09,144.07c-36.4,1.5 -68.9,6.53 -104.76,24.77 33.24,7.09 50.91,13.51 65.03,33.83 11.52,-22.53 25.05,-41.93 39.73,-58.6zM74.52,201.46C53.53,201.65 36.61,213.14 16,224c27.85,0 46.07,3.86 58.71,12.06 4.33,-11.65 9.16,-22.61 14.41,-32.92 -5.12,-1.19 -9.96,-1.71 -14.6,-1.67zM73.89,238.28c-17.93,5.84 -35.45,7.15 -54.23,22.28 17.62,4.64 34.79,9.6 41.4,22.03 3.5,-15.77 7.81,-30.52 12.83,-44.32zM444.04,246.85c1.62,-0.04 3.22,0.04 4.78,0.19l-1.64,17.93c-3.93,-0.36 -5.51,0.42 -5.57,0.47 -0.06,0.05 -1.03,0.66 -0.63,5.89l-17.95,1.37c-0.64,-8.35 1.3,-16.21 6.95,-21 4.24,-3.59 9.21,-4.74 14.06,-4.84zM52.22,290.72c-10.35,0.13 -23.76,5.65 -34.66,12.33 12.17,6.83 12.36,23.47 8.94,37.67 7.3,-9.1 16.85,-18.32 29.16,-28.48 1.02,-7.04 2.19,-13.9 3.51,-20.58 -2.08,-0.67 -4.42,-0.97 -6.95,-0.94z"
android:fillColor="#ffffff"/>
</vector>

View File

@@ -1,5 +1,5 @@
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/primary_green"/> <!-- couleur verte -->
<corners android:radius="12dp"/> <!-- coins arrondis -->
<corners android:radius="16dp"/> <!-- coins arrondis -->
</shape>

View File

@@ -0,0 +1,11 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="40dp"
android:height="40dp"
android:viewportWidth="600"
android:viewportHeight="600">
<path
android:pathData="M440,0.01A39.99,40.01 90,0 0,399.99 40L399.99,60.01L40.01,60.01A39.99,40.01 90,0 0,-0 100A39.99,40.01 90,0 0,40.01 139.99L399.99,139.99L399.99,160.03A39.99,40.01 90,0 0,440 200.01A39.99,40.01 90,0 0,480.01 160.03L480.01,139.99L559.99,139.99A39.99,40.01 90,0 0,600 100A39.99,40.01 90,0 0,559.99 60.01L480.01,60.01L480.01,40A39.99,40.01 90,0 0,440 0.01zM150,200.01A39.99,40.01 90,0 0,109.99 240L109.99,260.01L40.02,260.01A39.99,40.01 90,0 0,0.01 300A39.99,40.01 90,0 0,40.02 339.99L109.99,339.99L109.99,360.03A39.99,40.01 90,0 0,150 400.01A39.99,40.01 90,0 0,190.01 360.03L190.01,339.99L560,339.99A39.99,40.01 90,0 0,600.01 300A39.99,40.01 90,0 0,560 260.01L190.01,260.01L190.01,240A39.99,40.01 90,0 0,150 200.01zM280,400.01A39.99,40.01 90,0 0,239.99 440L239.99,460.01L40.02,460.01A39.99,40.01 90,0 0,0.01 500A39.99,40.01 90,0 0,40.02 539.99L239.99,539.99L239.99,560.03A39.99,40.01 90,0 0,280 600.01A39.99,40.01 90,0 0,320.01 560.03L320.01,539.99L560,539.99A39.99,40.01 90,0 0,600.01 500A39.99,40.01 90,0 0,560 460.01L320.01,460.01L320.01,440A39.99,40.01 90,0 0,280 400.01z"
android:strokeWidth="1"
android:fillColor="#ffffff"
android:strokeLineCap="round"/>
</vector>

View File

@@ -0,0 +1,48 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="40dp"
android:height="40dp"
android:viewportWidth="462.73"
android:viewportHeight="462.73">
<path
android:pathData="M376.36,130h-34.65V15c0,-8.28 -6.72,-15 -15,-15h-190.7c-8.28,0 -15,6.72 -15,15v115h-34.65c-8.28,0 -15,6.72 -15,15v116.2c0,8.28 6.72,15 15,15h1.69v171.53c0,8.28 6.72,15 15,15h256.62c8.28,0 15,-6.72 15,-15V276.2h1.69c8.28,0 15,-6.72 15,-15V145C391.36,136.71 384.65,130 376.36,130zM311.72,130h-83.35V30h83.35V130zM208.37,30v100h-22V30H208.37zM151.02,30h15.35v100h-15.35V30zM101.36,160h260v86.2h-260V160zM344.68,432.73h-226.62V276.2h226.62V432.73z"
android:fillColor="#ffffff"/>
<path
android:pathData="M130.37,236.95h202c5.52,0 10,-4.48 10,-10v-47.69c0,-5.52 -4.48,-10 -10,-10h-202c-5.52,0 -10,4.48 -10,10v47.69C120.36,232.47 124.84,236.95 130.37,236.95zM224.82,216.95l27.69,-27.69h24.72l-27.69,27.69H224.82zM322.36,216.95h-44.55l27.69,-27.69h16.86V216.95zM140.37,189.25h83.86l-27.69,27.69h-56.17V189.25z"
android:fillColor="#ffffff"/>
<path
android:pathData="M146.37,314.46h30c5.52,0 10,-4.48 10,-10s-4.48,-10 -10,-10h-30c-5.52,0 -10,4.48 -10,10S140.84,314.46 146.37,314.46z"
android:fillColor="#ffffff"/>
<path
android:pathData="M146.37,347.8h30c5.52,0 10,-4.48 10,-10s-4.48,-10 -10,-10h-30c-5.52,0 -10,4.48 -10,10S140.84,347.8 146.37,347.8z"
android:fillColor="#ffffff"/>
<path
android:pathData="M146.37,381.13h30c5.52,0 10,-4.48 10,-10s-4.48,-10 -10,-10h-30c-5.52,0 -10,4.48 -10,10S140.84,381.13 146.37,381.13z"
android:fillColor="#ffffff"/>
<path
android:pathData="M176.37,394.46h-30c-5.52,0 -10,4.48 -10,10s4.48,10 10,10h30c5.52,0 10,-4.48 10,-10S181.89,394.46 176.37,394.46z"
android:fillColor="#ffffff"/>
<path
android:pathData="M216.37,314.46h30c5.52,0 10,-4.48 10,-10s-4.48,-10 -10,-10h-30c-5.52,0 -10,4.48 -10,10S210.84,314.46 216.37,314.46z"
android:fillColor="#ffffff"/>
<path
android:pathData="M216.37,347.8h30c5.52,0 10,-4.48 10,-10s-4.48,-10 -10,-10h-30c-5.52,0 -10,4.48 -10,10S210.84,347.8 216.37,347.8z"
android:fillColor="#ffffff"/>
<path
android:pathData="M216.37,381.13h30c5.52,0 10,-4.48 10,-10s-4.48,-10 -10,-10h-30c-5.52,0 -10,4.48 -10,10S210.84,381.13 216.37,381.13z"
android:fillColor="#ffffff"/>
<path
android:pathData="M216.37,414.46h30c5.52,0 10,-4.48 10,-10s-4.48,-10 -10,-10h-30c-5.52,0 -10,4.48 -10,10S210.84,414.46 216.37,414.46z"
android:fillColor="#ffffff"/>
<path
android:pathData="M286.37,314.46h30c5.52,0 10,-4.48 10,-10s-4.48,-10 -10,-10h-30c-5.52,0 -10,4.48 -10,10S280.84,314.46 286.37,314.46z"
android:fillColor="#ffffff"/>
<path
android:pathData="M286.37,347.8h30c5.52,0 10,-4.48 10,-10s-4.48,-10 -10,-10h-30c-5.52,0 -10,4.48 -10,10S280.84,347.8 286.37,347.8z"
android:fillColor="#ffffff"/>
<path
android:pathData="M286.37,381.13h30c5.52,0 10,-4.48 10,-10s-4.48,-10 -10,-10h-30c-5.52,0 -10,4.48 -10,10S280.84,381.13 286.37,381.13z"
android:fillColor="#ffffff"/>
<path
android:pathData="M286.37,414.46h30c5.52,0 10,-4.48 10,-10s-4.48,-10 -10,-10h-30c-5.52,0 -10,4.48 -10,10S280.84,414.46 286.37,414.46z"
android:fillColor="#ffffff"/>
</vector>

View File

@@ -0,0 +1,5 @@
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@android:color/holo_blue_dark" />
<stroke android:width="2dp" android:color="@android:color/holo_blue_dark" />
</shape>

View File

@@ -0,0 +1,65 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".AnnulationTicket">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingTop="50dp"
android:paddingHorizontal="24dp"
android:gravity="center_horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="18sp"
android:layout_marginBottom="20dp"
android:textFontWeight="200"
android:text="Reference Ticket"
android:textColor="@color/primary_green">
</TextView>
<EditText
android:layout_width="match_parent"
android:layout_height="40dp"
android:hint="Reference Ticket"
android:drawablePadding="5dp"
android:textSize="14sp"
android:drawableStart="@drawable/hashtag"
android:background="@drawable/edittext_outline_white"
android:inputType="number"
/>
<ImageButton
android:id="@+id/scan_ticket_btn"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_marginVertical="15dp"
android:src="@drawable/camera"
>
</ImageButton>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center_horizontal">
<Button
android:id="@+id/annule_ticket_btn_back"
android:layout_width="120dp"
android:layout_height="35dp"
android:background="@color/primary_green"
android:text="@string/cancel" />
<LinearLayout
android:layout_width="10sp"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/annule_ticket_btn"
android:layout_width="120dp"
android:layout_height="35dp"
android:background="@color/primary_green"
android:text="Verifier" />
</LinearLayout>
</LinearLayout>
</FrameLayout>

View File

@@ -0,0 +1,86 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="visible"
android:background="@color/login_background"
android:id="@+id/login_container"
tools:context=".Caisse">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="24dp">
<Button
android:id="@+id/solde_btn"
android:layout_width="match_parent"
android:layout_height="57dp"
android:textSize="21sp"
android:textAlignment="textStart"
android:layout_marginVertical="4sp"
android:background="@drawable/rounded_button_green"
android:fontFamily="sans-serif-medium"
android:backgroundTint="@color/primary_green"
android:drawableLeft="@drawable/tpe"
android:text="@string/sold_u"
android:textAllCaps="false"
android:textColor="#FFFFFF"/>
<Button
android:id="@+id/win_ticket_btn"
android:layout_width="match_parent"
android:layout_height="57dp"
android:textSize="21sp"
android:textAlignment="textStart"
android:layout_marginVertical="4sp"
android:background="@drawable/rounded_button_green"
android:fontFamily="sans-serif-medium"
android:backgroundTint="@color/primary_green"
android:drawableLeft="@drawable/tpe"
android:text="@string/win_ticket"
android:textAllCaps="false"
android:textColor="#FFFFFF"/>
<Button
android:id="@+id/cancel_ticket_btn"
android:layout_width="match_parent"
android:layout_height="57dp"
android:textSize="21sp"
android:textAlignment="textStart"
android:layout_marginVertical="4sp"
android:background="@drawable/rounded_button_green"
android:fontFamily="sans-serif-medium"
android:backgroundTint="@color/primary_green"
android:drawableLeft="@drawable/tpe"
android:text="ANNULER TICKET"
android:textAllCaps="false"
android:textColor="#FFFFFF"/>
<Button
android:id="@+id/report_btn"
android:layout_width="match_parent"
android:layout_height="57dp"
android:textSize="21sp"
android:textAlignment="textStart"
android:layout_marginVertical="4sp"
android:background="@drawable/rounded_button_green"
android:fontFamily="sans-serif-medium"
android:backgroundTint="@color/primary_green"
android:drawableLeft="@drawable/tpe"
android:text="RAPPORTS"
android:textAllCaps="false"
android:textColor="#FFFFFF"/>
<Button
android:id="@+id/last_bets_btn"
android:layout_width="match_parent"
android:layout_height="57dp"
android:textSize="21sp"
android:textAlignment="textStart"
android:layout_marginVertical="4sp"
android:background="@drawable/rounded_button_green"
android:fontFamily="sans-serif-medium"
android:backgroundTint="@color/primary_green"
android:drawableLeft="@drawable/tpe"
android:text="DERNIERS PARIS"
android:textAllCaps="false"
android:textColor="#FFFFFF"/>
</LinearLayout>
</FrameLayout>

View File

@@ -3,7 +3,6 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingTop="100dp"
android:visibility="visible"
android:background="@color/login_background"
android:id="@+id/login_container"
@@ -13,23 +12,22 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingHorizontal="24dp"
android:gravity="center_vertical"
android:gravity="start"
android:orientation="vertical"
android:visibility="visible">
<LinearLayout
android:layout_width="match_parent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:layout_marginTop="48dp"
android:layout_marginBottom="32dp"
android:layout_marginVertical="10dp"
android:padding="12dp"
android:layout_marginTop="10dp"
android:layout_marginBottom="30dp"
android:layout_gravity="center"
android:orientation="horizontal">
<ImageView
android:layout_width="200dp"
android:layout_height="200dp"
android:layout_marginBottom="24dp"
android:layout_width="300dp"
android:layout_height="100dp"
android:contentDescription="@string/logo"
android:scaleType="fitCenter"
android:src="@drawable/pmu_logo" />
@@ -39,47 +37,49 @@
android:layout_height="match_parent"
android:orientation="vertical"
android:visibility="visible"
android:paddingTop="12dp"
android:gravity="center_horizontal">
<EditText
android:id="@+id/userNameInput"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="12dp"
android:autofillHints="username"
android:drawableStart="@android:drawable/ic_menu_myplaces"
android:textColorHint="@color/text_hint_color"
android:textColor="@color/text_color"
android:background="@drawable/edittext_border"
android:inputType="text"
android:hint="@string/username_message" />
<EditText
android:id="@+id/passwordInput"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="12dp"
android:autofillHints="password"
android:textColorHint="@color/text_hint_color"
android:textColor="@color/text_color"
android:layout_marginVertical="19dp"
android:drawableStart="@android:drawable/ic_lock_idle_lock"
android:background="@drawable/edittext_border"
android:inputType="textPassword"
android:hint="@string/password_message" />
<Button
android:id="@+id/loginButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
android:layout_height="57dp"
android:textSize="21sp"
android:textAlignment="textStart"
android:layout_marginVertical="4sp"
android:background="@drawable/rounded_button_green"
android:fontFamily="sans-serif-medium"
android:backgroundTint="@color/primary_green"
android:padding="14dp"
android:text="@string/log_in"
android:drawableLeft="@drawable/horse_head_svgrepo_com"
android:text="@string/pmu"
android:textAllCaps="false"
android:textColor="#FFFFFF" />
android:textColor="#FFFFFF"/>
<Button
android:id="@+id/caisse"
android:layout_width="match_parent"
android:layout_height="57dp"
android:textSize="21sp"
android:textAlignment="textStart"
android:layout_marginVertical="4sp"
android:background="@drawable/rounded_button_green"
android:fontFamily="sans-serif-medium"
android:backgroundTint="@color/primary_green"
android:drawableLeft="@drawable/tpe"
android:text="@string/caisse"
android:textAllCaps="false"
android:textColor="#FFFFFF"/>
<Button
android:id="@+id/settings"
android:layout_width="match_parent"
android:layout_height="57dp"
android:textSize="23sp"
android:textAlignment="textStart"
android:layout_marginVertical="4sp"
android:background="@drawable/rounded_button_green"
android:fontFamily="sans-serif-medium"
android:backgroundTint="@color/primary_green"
android:drawableLeft="@drawable/settings_icon"
android:text="@string/settings"
android:textAllCaps="false"
android:textColor="#FFFFFF"/>
</LinearLayout>
</LinearLayout>

View File

@@ -0,0 +1,65 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".WinTicket">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingTop="50dp"
android:paddingHorizontal="24dp"
android:gravity="center_horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="18sp"
android:layout_marginBottom="20dp"
android:textFontWeight="200"
android:text="Reference Ticket"
android:textColor="@color/primary_green">
</TextView>
<EditText
android:layout_width="match_parent"
android:layout_height="40dp"
android:hint="Reference Ticket"
android:drawablePadding="5dp"
android:textSize="14sp"
android:drawableStart="@drawable/hashtag"
android:background="@drawable/edittext_outline_white"
android:inputType="number"
/>
<ImageButton
android:id="@+id/scan_ticket_btn"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_marginVertical="15dp"
android:src="@drawable/camera"
>
</ImageButton>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center_horizontal">
<Button
android:id="@+id/win_ticket_btn_back"
android:layout_width="120dp"
android:layout_height="35dp"
android:background="@color/primary_green"
android:text="@string/cancel" />
<LinearLayout
android:layout_width="10sp"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/win_ticket_verification_btn"
android:layout_width="120dp"
android:layout_height="35dp"
android:background="@color/primary_green"
android:text="Verifier" />
</LinearLayout>
</LinearLayout>
</FrameLayout>

View File

@@ -0,0 +1,136 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
card_view:cardCornerRadius="20dp"
card_view:cardElevation="8dp"
android:foreground="?attr/selectableItemBackground">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="15sp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/confirmation_pari"
android:layout_marginBottom="10dp"
android:textColor="@color/primary_green"
android:layout_gravity="center_horizontal"
android:textFontWeight="400"
android:textSize="20sp"
/>
<TextView
android:id="@+id/alert_course_numero"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="17sp"
android:textFontWeight="500"
android:text=""/>
<com.google.android.material.divider.MaterialDivider
android:layout_width="match_parent"
android:layout_height="2sp"
tools:ignore="SmallSp"
android:layout_marginVertical="10sp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center_vertical"
android:layout_marginHorizontal="28dp">
<!-- Premier TextView -->
<TextView
android:id="@+id/alert_pari_type"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text=""
android:textColor="@color/primary_green"
android:gravity="center"
android:textStyle="normal"
android:textSize="17sp"/>
<!-- Divider -->
<com.google.android.material.divider.MaterialDivider
android:layout_width="1dp"
android:layout_height="40dp"
android:layout_marginHorizontal="8dp"/>
<!-- Deuxième TextView -->
<TextView
android:id="@+id/alert_is_elargie"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text=""
android:gravity="center"
android:textSize="17sp"
android:textStyle="bold"/>
</LinearLayout>
<com.google.android.material.divider.MaterialDivider
android:layout_width="match_parent"
android:layout_height="2sp"
tools:ignore="SmallSp"
android:layout_marginVertical="10sp" />
<TextView
android:id="@+id/alert_combinaison"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
android:gravity="center"
android:textSize="17sp"
android:textStyle="bold"/>
<com.google.android.material.divider.MaterialDivider
android:layout_width="match_parent"
android:layout_height="2sp"
tools:ignore="SmallSp"
android:layout_marginVertical="10sp" />
<TextView
android:id="@+id/alert_coeff"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
android:gravity="center"
android:textSize="17sp"
android:textStyle="bold"/>
<com.google.android.material.divider.MaterialDivider
android:layout_width="match_parent"
android:layout_height="2sp"
tools:ignore="SmallSp"
android:layout_marginVertical="10sp" />
<TextView
android:id="@+id/alert_montant"
android:layout_marginBottom="30sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
android:textColor="@color/primary_green"
android:layout_gravity="start"
android:textFontWeight="400"
android:textSize="20sp"
/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="end">
<Button
android:id="@+id/alert_cancel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/button_transparent"
android:text="@string/no"
android:textColor="@color/primary_green" />
<Button
android:id="@+id/alert_validate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/button_transparent"
android:text="@string/yes"
android:textColor="@color/primary_green" />
</LinearLayout>
</LinearLayout>
</androidx.cardview.widget.CardView>

View File

@@ -0,0 +1,57 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
card_view:cardCornerRadius="20dp"
card_view:cardElevation="8dp"
android:foreground="?attr/selectableItemBackground">
<LinearLayout
android:layout_width="match_parent"
android:padding="12dp"
android:layout_height="wrap_content"
android:orientation="vertical"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center_horizontal"
android:layout_marginBottom="20dp"
>
<ImageView
android:layout_width="100sp"
android:layout_height="100sp"
android:src="@drawable/pmu_logo">
</ImageView>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="20sp"
android:orientation="vertical">
<EditText
android:id="@+id/pin"
android:layout_width="match_parent"
android:layout_height="45dp"
android:hint="@string/pin_message"
android:inputType="numberPassword"
android:textSize="18sp"
android:textFontWeight="600"
android:drawableStart="@android:drawable/ic_lock_idle_lock"
android:background="@drawable/edittext_border">
</EditText>
</LinearLayout>
<Button
android:id="@+id/pin_validate"
android:layout_width="wrap_content"
android:layout_height="38sp"
android:layout_gravity="center_horizontal"
android:background="@drawable/rounded_button_green"
android:layout_marginTop="20sp"
android:text="@string/validate"
>
</Button>
</LinearLayout>
</androidx.cardview.widget.CardView>

View File

@@ -2,6 +2,8 @@
<string name="app_name">PMU</string>
<string name="action_settings">Settings</string>
<string name="sold">Solde</string>
<string name="sold_u">SOLDE</string>
<string name="win_ticket">TICKET GAGNANT</string>
<string name="last_bets">Derniers paris</string>
<string name="others">Autres</string>
<string name="by_course">Solde par course</string>
@@ -71,4 +73,11 @@
<string name="hello_blank_fragment">Hello blank fragment</string>
<string name="coefficient">Coefficient</string>
<string name="tout_ordre">Tout ordre</string>
<string name="pin_message">Entrez le pin</string>
<string name="confirmation_pari">Confirmation Pari</string>
<string name="no">non</string>
<string name="yes">oui</string>
<string name="pmu">PMU</string>
<string name="caisse">CAISSE</string>
<string name="settings">PARAMERES\n</string>
</resources>