From 888591c970805c26645bf55de3c7226ba5e6b830 Mon Sep 17 00:00:00 2001 From: Harkamal Randhawa Date: Tue, 7 Apr 2026 21:15:31 -0600 Subject: [PATCH] finish android merge wiring --- .../petstoremobile/di/NetworkModule.java | 12 ++ .../listfragments/AdoptionFragment.java | 14 +-- .../listfragments/AnalyticsFragment.java | 18 ++- .../fragments/listfragments/SaleFragment.java | 116 +++++++++--------- .../listfragments/StaffFragment.java | 28 +++-- .../detailfragments/RefundFragment.java | 6 +- .../detailfragments/SaleDetailFragment.java | 13 +- .../detailfragments/StaffDetailFragment.java | 7 +- .../repositories/EmployeeRepository.java | 42 +++++++ .../repositories/SaleRepository.java | 34 +++++ .../viewmodels/EmployeeViewModel.java | 43 +++++++ .../viewmodels/SaleViewModel.java | 35 ++++++ .../res/layout/fragment_adoption_detail.xml | 15 --- .../main/res/navigation/list_nav_graph.xml | 32 ++++- 14 files changed, 296 insertions(+), 119 deletions(-) create mode 100644 android/app/src/main/java/com/example/petstoremobile/repositories/EmployeeRepository.java create mode 100644 android/app/src/main/java/com/example/petstoremobile/repositories/SaleRepository.java create mode 100644 android/app/src/main/java/com/example/petstoremobile/viewmodels/EmployeeViewModel.java create mode 100644 android/app/src/main/java/com/example/petstoremobile/viewmodels/SaleViewModel.java diff --git a/android/app/src/main/java/com/example/petstoremobile/di/NetworkModule.java b/android/app/src/main/java/com/example/petstoremobile/di/NetworkModule.java index b5f1ca64..21ea11b8 100644 --- a/android/app/src/main/java/com/example/petstoremobile/di/NetworkModule.java +++ b/android/app/src/main/java/com/example/petstoremobile/di/NetworkModule.java @@ -179,4 +179,16 @@ public class NetworkModule { public static UserApi provideUserApi(Retrofit retrofit) { return retrofit.create(UserApi.class); } + + @Provides + @Singleton + public static EmployeeApi provideEmployeeApi(Retrofit retrofit) { + return retrofit.create(EmployeeApi.class); + } + + @Provides + @Singleton + public static RefundApi provideRefundApi(Retrofit retrofit) { + return retrofit.create(RefundApi.class); + } } diff --git a/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/AdoptionFragment.java b/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/AdoptionFragment.java index 0c78284d..450b7dc8 100644 --- a/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/AdoptionFragment.java +++ b/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/AdoptionFragment.java @@ -6,6 +6,7 @@ import android.util.Log; import android.view.*; import android.widget.*; import androidx.fragment.app.Fragment; +import androidx.navigation.fragment.NavHostFragment; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; @@ -97,7 +98,7 @@ public class AdoptionFragment extends Fragment implements AdoptionAdapter.OnAdop private void loadAdoptions() { if (swipeRefresh != null) swipeRefresh.setRefreshing(true); - api.getAllAdoptions(0, 100).enqueue(new Callback>() { + api.getAllAdoptions(0, 100, null, null, null, null, null).enqueue(new Callback>() { public void onResponse(Call> c, Response> r) { if (swipeRefresh != null) swipeRefresh.setRefreshing(false); @@ -119,7 +120,6 @@ public class AdoptionFragment extends Fragment implements AdoptionAdapter.OnAdop } private void openDetail(int position) { - AdoptionDetailFragment detail = new AdoptionDetailFragment(); Bundle args = new Bundle(); if (position != -1) { @@ -131,12 +131,12 @@ public class AdoptionFragment extends Fragment implements AdoptionAdapter.OnAdop args.putString("adoptionStatus", a.getAdoptionStatus()); if (a.getEmployeeId() != null) args.putLong("employeeId", a.getEmployeeId());} - - detail.setArguments(args); - ListFragment lf = (ListFragment) getParentFragment(); - if (lf != null) lf.loadFragment(detail); + NavHostFragment.findNavController(this).navigate(R.id.nav_adoption_detail, args); } @Override public void onAdoptionClick(int position) { openDetail(position); } -} \ No newline at end of file + + @Override + public void onSelectionChanged(int count) {} +} diff --git a/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/AnalyticsFragment.java b/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/AnalyticsFragment.java index 9677b44a..c9eca2dd 100644 --- a/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/AnalyticsFragment.java +++ b/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/AnalyticsFragment.java @@ -32,15 +32,21 @@ public class AnalyticsFragment extends Fragment { loadAnalytics(); btnRefresh.setOnClickListener(v -> loadAnalytics()); - hamburger.setOnClickListener(v -> { - ListFragment lf = (ListFragment) getParentFragment(); - if (lf != null) - lf.openDrawer(); - }); + hamburger.setOnClickListener(v -> openDrawer()); return view; } + private void openDrawer() { + Fragment parent = getParentFragment(); + if (parent != null) { + Fragment grandParent = parent.getParentFragment(); + if (grandParent instanceof ListFragment) { + ((ListFragment) grandParent).openDrawer(); + } + } + } + private void initViews(View v) { tvTotalRevenue = v.findViewById(R.id.tvTotalRevenue); tvTotalTransactions = v.findViewById(R.id.tvTotalTransactions); @@ -325,4 +331,4 @@ public class AnalyticsFragment extends Fragment { tvTotalItems.setText("—"); Toast.makeText(getContext(), msg, Toast.LENGTH_SHORT).show(); } -} \ No newline at end of file +} diff --git a/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/SaleFragment.java b/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/SaleFragment.java index 99f249db..dc882fff 100644 --- a/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/SaleFragment.java +++ b/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/SaleFragment.java @@ -2,7 +2,9 @@ package com.example.petstoremobile.fragments.listfragments; import android.os.Bundle; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; +import androidx.lifecycle.ViewModelProvider; import androidx.navigation.fragment.NavHostFragment; import androidx.recyclerview.widget.LinearLayoutManager; import android.text.Editable; @@ -13,38 +15,43 @@ import android.view.ViewGroup; import com.example.petstoremobile.R; import com.example.petstoremobile.adapters.SaleAdapter; -import com.example.petstoremobile.api.SaleApi; import com.example.petstoremobile.databinding.FragmentSaleBinding; +import com.example.petstoremobile.dtos.SaleDTO; import com.example.petstoremobile.fragments.ListFragment; -import com.example.petstoremobile.models.Sale; +import com.example.petstoremobile.utils.Resource; +import com.example.petstoremobile.viewmodels.SaleViewModel; + import java.util.ArrayList; import java.util.List; -import javax.inject.Inject; - import dagger.hilt.android.AndroidEntryPoint; @AndroidEntryPoint public class SaleFragment extends Fragment implements SaleAdapter.OnSaleClickListener { private FragmentSaleBinding binding; - private List saleList = new ArrayList<>(); - private List filteredList = new ArrayList<>(); + private List saleList = new ArrayList<>(); + private List filteredList = new ArrayList<>(); private SaleAdapter adapter; - - @Inject SaleApi api; + private SaleViewModel saleViewModel; @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { binding = FragmentSaleBinding.inflate(inflater, container, false); + return binding.getRoot(); + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + saleViewModel = new ViewModelProvider(this).get(SaleViewModel.class); setupRecyclerView(); - loadSaleData(); setupSearch(); setupSwipeRefresh(); + loadSales(); - // Make the hamburger button open the drawer from listFragment binding.btnHamburger.setOnClickListener(v -> { Fragment parent = getParentFragment(); if (parent != null) { @@ -55,7 +62,11 @@ public class SaleFragment extends Fragment implements SaleAdapter.OnSaleClickLis } }); - return binding.getRoot(); + binding.fabAddSale.setOnClickListener(v -> + NavHostFragment.findNavController(this).navigate(R.id.nav_sale_detail)); + + binding.btnOpenRefund.setOnClickListener(v -> + NavHostFragment.findNavController(this).navigate(R.id.nav_refund)); } @Override @@ -64,19 +75,20 @@ public class SaleFragment extends Fragment implements SaleAdapter.OnSaleClickLis binding = null; } + private void setupRecyclerView() { + adapter = new SaleAdapter(filteredList, this); + binding.recyclerViewSales.setLayoutManager(new LinearLayoutManager(getContext())); + binding.recyclerViewSales.setAdapter(adapter); + } + private void setupSearch() { binding.etSearchSale.addTextChangedListener(new TextWatcher() { - @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { - } - + @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) {} + @Override public void afterTextChanged(Editable s) {} @Override public void onTextChanged(CharSequence s, int start, int before, int count) { filterSales(s.toString()); } - - @Override - public void afterTextChanged(Editable s) { - } }); } @@ -86,60 +98,46 @@ public class SaleFragment extends Fragment implements SaleAdapter.OnSaleClickLis filteredList.addAll(saleList); } else { String lower = query.toLowerCase(); - for (Sale s : saleList) { - if (s.getItemName().toLowerCase().contains(lower) - || s.getEmployeeName().toLowerCase().contains(lower) - || s.getSaleDate().toLowerCase().contains(lower) - || s.getPaymentMethod().toLowerCase().contains(lower) - || String.valueOf(s.getSaleId()).contains(lower)) { + for (SaleDTO s : saleList) { + if ((s.getEmployeeName() != null && s.getEmployeeName().toLowerCase().contains(lower)) + || (s.getSaleDate() != null && s.getSaleDate().toLowerCase().contains(lower)) + || (s.getPaymentMethod() != null && s.getPaymentMethod().toLowerCase().contains(lower)) + || (s.getSaleId() != null && String.valueOf(s.getSaleId()).contains(lower))) { filteredList.add(s); } } } - adapter.notifyDataSetChanged(); + if (adapter != null) adapter.notifyDataSetChanged(); } private void setupSwipeRefresh() { binding.swipeRefreshSale.setOnRefreshListener(() -> { - loadSaleData(); - binding.swipeRefreshSale.setRefreshing(false); + loadSales(); + }); + } + + private void loadSales() { + saleViewModel.getAllSales(0, 200).observe(getViewLifecycleOwner(), resource -> { + binding.swipeRefreshSale.setRefreshing(false); + if (resource.status == Resource.Status.SUCCESS && resource.data != null) { + saleList.clear(); + saleList.addAll(resource.data.getContent()); + filterSales(binding.etSearchSale.getText() != null + ? binding.etSearchSale.getText().toString() : ""); + } }); } - // When a sale row is clicked, open the refund screen for that sale @Override public void onSaleClick(int position) { - Sale sale = filteredList.get(position); + SaleDTO sale = filteredList.get(position); Bundle args = new Bundle(); - args.putInt("saleId", sale.getSaleId()); - args.putString("saleDate", sale.getSaleDate()); - args.putString("employeeName", sale.getEmployeeName()); - args.putDouble("total", sale.getTotal()); - args.putString("paymentMethod", sale.getPaymentMethod()); - - NavHostFragment.findNavController(this).navigate(R.id.nav_refund_detail, args); - } - - public void reloadSales() { - loadSaleData(); - } - - // TODO: Replace with actual API call - GET v1/sales - private void loadSaleData() { - saleList.clear(); - saleList.add(new Sale(1, "2026-03-01", "John Smith", "Premium Dog Food", 2, 45.99, 91.98, "Card", false)); - saleList.add(new Sale(2, "2026-03-02", "Jane Doe", "Cat Toy Bundle", 1, 19.99, 19.99, "Cash", false)); - saleList.add(new Sale(3, "2026-03-03", "John Smith", "Pet Shampoo", 3, 12.99, 38.97, "Card", false)); - saleList.add(new Sale(4, "2026-03-04", "Jane Doe", "Dog Bed - Large", 1, 89.99, 89.99, "Cash", true)); - filteredList.clear(); - filteredList.addAll(saleList); - if (adapter != null) - adapter.notifyDataSetChanged(); - } - - private void setupRecyclerView() { - adapter = new SaleAdapter(filteredList, this); - binding.recyclerViewSales.setLayoutManager(new LinearLayoutManager(getContext())); - binding.recyclerViewSales.setAdapter(adapter); + if (sale.getSaleId() != null) { + args.putLong("saleId", sale.getSaleId()); + } + if (sale.getIsRefund() != null) { + args.putBoolean("isRefund", sale.getIsRefund()); + } + NavHostFragment.findNavController(this).navigate(R.id.nav_sale_detail, args); } } diff --git a/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/StaffFragment.java b/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/StaffFragment.java index 9602580b..1c8fcf4e 100644 --- a/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/StaffFragment.java +++ b/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/StaffFragment.java @@ -5,7 +5,10 @@ import android.text.*; import android.util.Log; import android.view.*; import android.widget.*; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; +import androidx.navigation.fragment.NavHostFragment; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; @@ -15,7 +18,6 @@ import com.example.petstoremobile.api.RetrofitClient; import com.example.petstoremobile.dtos.EmployeeDTO; import com.example.petstoremobile.dtos.PageResponse; import com.example.petstoremobile.fragments.ListFragment; -import com.example.petstoremobile.fragments.listfragments.detailfragments.StaffDetailFragment; import com.google.android.material.floatingactionbutton.FloatingActionButton; import java.util.*; import retrofit2.*; @@ -29,7 +31,7 @@ public class StaffFragment extends Fragment implements EmployeeAdapter.OnEmploye private EditText etSearch; @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_staff, container, false); @@ -42,14 +44,21 @@ public class StaffFragment extends Fragment implements EmployeeAdapter.OnEmploye fab.setOnClickListener(v -> openDetail(-1)); ImageButton hamburger = view.findViewById(R.id.btnHamburgerStaff); - hamburger.setOnClickListener(v -> { - ListFragment lf = (ListFragment) getParentFragment(); - if (lf != null) lf.openDrawer(); - }); + hamburger.setOnClickListener(v -> openDrawer()); return view; } + private void openDrawer() { + Fragment parent = getParentFragment(); + if (parent != null) { + Fragment grandParent = parent.getParentFragment(); + if (grandParent instanceof ListFragment) { + ((ListFragment) grandParent).openDrawer(); + } + } + } + private void setupRecyclerView(View view) { RecyclerView rv = view.findViewById(R.id.recyclerViewStaff); adapter = new EmployeeAdapter(filteredList, this); @@ -115,7 +124,6 @@ public class StaffFragment extends Fragment implements EmployeeAdapter.OnEmploye } private void openDetail(int position) { - StaffDetailFragment detail = new StaffDetailFragment(); Bundle args = new Bundle(); if (position != -1) { EmployeeDTO e = filteredList.get(position); @@ -129,13 +137,11 @@ public class StaffFragment extends Fragment implements EmployeeAdapter.OnEmploye args.putBoolean("active", Boolean.TRUE.equals(e.getActive())); args.putBoolean("isEditing", true); } - detail.setArguments(args); - ListFragment lf = (ListFragment) getParentFragment(); - if (lf != null) lf.loadFragment(detail); + NavHostFragment.findNavController(this).navigate(R.id.nav_staff_detail, args); } @Override public void onEmployeeClick(int position) { openDetail(position); } -} \ No newline at end of file +} diff --git a/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/detailfragments/RefundFragment.java b/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/detailfragments/RefundFragment.java index 782947e2..a53b5402 100644 --- a/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/detailfragments/RefundFragment.java +++ b/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/detailfragments/RefundFragment.java @@ -1,18 +1,17 @@ package com.example.petstoremobile.fragments.listfragments.detailfragments; import android.app.AlertDialog; -import android.content.Context; import android.os.Bundle; import android.util.Log; import android.view.*; import android.widget.*; import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; +import androidx.navigation.fragment.NavHostFragment; import com.example.petstoremobile.R; import com.example.petstoremobile.api.RetrofitClient; import com.example.petstoremobile.dtos.SaleDTO; import com.example.petstoremobile.dtos.PageResponse; -import com.example.petstoremobile.fragments.ListFragment; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.*; @@ -506,7 +505,6 @@ public class RefundFragment extends Fragment { } private void navigateBack() { - ListFragment lf = (ListFragment) getParentFragment(); - if (lf != null) lf.getChildFragmentManager().popBackStack(); + NavHostFragment.findNavController(this).popBackStack(); } } diff --git a/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/detailfragments/SaleDetailFragment.java b/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/detailfragments/SaleDetailFragment.java index 9116aa20..d71b2686 100644 --- a/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/detailfragments/SaleDetailFragment.java +++ b/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/detailfragments/SaleDetailFragment.java @@ -7,10 +7,10 @@ import android.widget.*; import androidx.annotation.NonNull; import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.Fragment; +import androidx.navigation.fragment.NavHostFragment; import com.example.petstoremobile.R; import com.example.petstoremobile.api.*; import com.example.petstoremobile.dtos.*; -import com.example.petstoremobile.fragments.ListFragment; import java.math.BigDecimal; import java.util.*; import retrofit2.*; @@ -144,7 +144,7 @@ public class SaleDetailFragment extends Fragment { } private void loadProducts() { - RetrofitClient.getProductApi(requireContext()).getAllProducts(null, 0, 200) + RetrofitClient.getProductApi(requireContext()).getAllProducts(null, null, 0, 200, null) .enqueue(new Callback>() { public void onResponse(Call> c, Response> r) { @@ -329,12 +329,9 @@ public class SaleDetailFragment extends Fragment { } private void showRefundDialog() { - RefundFragment refundFragment = new RefundFragment(); Bundle args = new Bundle(); args.putLong("saleId", saleId); - refundFragment.setArguments(args); - ListFragment lf = (ListFragment) getParentFragment(); - if (lf != null) lf.loadFragment(refundFragment); + NavHostFragment.findNavController(this).navigate(R.id.nav_refund, args); } private void submitRefund() { @@ -366,8 +363,6 @@ public class SaleDetailFragment extends Fragment { } private void navigateBack() { - ListFragment lf = (ListFragment) getParentFragment(); - if (lf != null) - lf.getChildFragmentManager().popBackStack(); + NavHostFragment.findNavController(this).popBackStack(); } } diff --git a/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/detailfragments/StaffDetailFragment.java b/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/detailfragments/StaffDetailFragment.java index 2f02e684..2750db72 100644 --- a/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/detailfragments/StaffDetailFragment.java +++ b/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/detailfragments/StaffDetailFragment.java @@ -7,11 +7,11 @@ import android.widget.*; import androidx.annotation.NonNull; import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.Fragment; +import androidx.navigation.fragment.NavHostFragment; import com.example.petstoremobile.R; import com.example.petstoremobile.api.EmployeeApi; import com.example.petstoremobile.api.RetrofitClient; import com.example.petstoremobile.dtos.EmployeeDTO; -import com.example.petstoremobile.fragments.ListFragment; import retrofit2.*; public class StaffDetailFragment extends Fragment { @@ -194,7 +194,6 @@ public class StaffDetailFragment extends Fragment { } private void navigateBack() { - ListFragment lf = (ListFragment) getParentFragment(); - if (lf != null) lf.getChildFragmentManager().popBackStack(); + NavHostFragment.findNavController(this).popBackStack(); } -} \ No newline at end of file +} diff --git a/android/app/src/main/java/com/example/petstoremobile/repositories/EmployeeRepository.java b/android/app/src/main/java/com/example/petstoremobile/repositories/EmployeeRepository.java new file mode 100644 index 00000000..b6ddcc9c --- /dev/null +++ b/android/app/src/main/java/com/example/petstoremobile/repositories/EmployeeRepository.java @@ -0,0 +1,42 @@ +package com.example.petstoremobile.repositories; + +import androidx.lifecycle.LiveData; + +import com.example.petstoremobile.api.EmployeeApi; +import com.example.petstoremobile.dtos.EmployeeDTO; +import com.example.petstoremobile.dtos.PageResponse; +import com.example.petstoremobile.utils.Resource; + +import javax.inject.Inject; +import javax.inject.Singleton; + +@Singleton +public class EmployeeRepository extends BaseRepository { + private final EmployeeApi employeeApi; + + @Inject + public EmployeeRepository(EmployeeApi employeeApi) { + super("EmployeeRepository"); + this.employeeApi = employeeApi; + } + + public LiveData>> getAllEmployees(int page, int size) { + return executeCall(employeeApi.getAllEmployees(page, size)); + } + + public LiveData> getEmployeeById(Long id) { + return executeCall(employeeApi.getEmployeeById(id)); + } + + public LiveData> createEmployee(EmployeeDTO dto) { + return executeCall(employeeApi.createEmployee(dto)); + } + + public LiveData> updateEmployee(Long id, EmployeeDTO dto) { + return executeCall(employeeApi.updateEmployee(id, dto)); + } + + public LiveData> deleteEmployee(Long id) { + return executeCall(employeeApi.deleteEmployee(id)); + } +} diff --git a/android/app/src/main/java/com/example/petstoremobile/repositories/SaleRepository.java b/android/app/src/main/java/com/example/petstoremobile/repositories/SaleRepository.java new file mode 100644 index 00000000..4068c472 --- /dev/null +++ b/android/app/src/main/java/com/example/petstoremobile/repositories/SaleRepository.java @@ -0,0 +1,34 @@ +package com.example.petstoremobile.repositories; + +import androidx.lifecycle.LiveData; + +import com.example.petstoremobile.api.SaleApi; +import com.example.petstoremobile.dtos.PageResponse; +import com.example.petstoremobile.dtos.SaleDTO; +import com.example.petstoremobile.utils.Resource; + +import javax.inject.Inject; +import javax.inject.Singleton; + +@Singleton +public class SaleRepository extends BaseRepository { + private final SaleApi saleApi; + + @Inject + public SaleRepository(SaleApi saleApi) { + super("SaleRepository"); + this.saleApi = saleApi; + } + + public LiveData>> getAllSales(int page, int size) { + return executeCall(saleApi.getAllSales(page, size)); + } + + public LiveData> getSaleById(Long id) { + return executeCall(saleApi.getSaleById(id)); + } + + public LiveData> createSale(SaleDTO sale) { + return executeCall(saleApi.createSale(sale)); + } +} diff --git a/android/app/src/main/java/com/example/petstoremobile/viewmodels/EmployeeViewModel.java b/android/app/src/main/java/com/example/petstoremobile/viewmodels/EmployeeViewModel.java new file mode 100644 index 00000000..5454269e --- /dev/null +++ b/android/app/src/main/java/com/example/petstoremobile/viewmodels/EmployeeViewModel.java @@ -0,0 +1,43 @@ +package com.example.petstoremobile.viewmodels; + +import androidx.lifecycle.LiveData; +import androidx.lifecycle.ViewModel; + +import com.example.petstoremobile.dtos.EmployeeDTO; +import com.example.petstoremobile.dtos.PageResponse; +import com.example.petstoremobile.repositories.EmployeeRepository; +import com.example.petstoremobile.utils.Resource; + +import javax.inject.Inject; + +import dagger.hilt.android.lifecycle.HiltViewModel; + +@HiltViewModel +public class EmployeeViewModel extends ViewModel { + private final EmployeeRepository employeeRepository; + + @Inject + public EmployeeViewModel(EmployeeRepository employeeRepository) { + this.employeeRepository = employeeRepository; + } + + public LiveData>> getAllEmployees(int page, int size) { + return employeeRepository.getAllEmployees(page, size); + } + + public LiveData> getEmployeeById(Long id) { + return employeeRepository.getEmployeeById(id); + } + + public LiveData> createEmployee(EmployeeDTO dto) { + return employeeRepository.createEmployee(dto); + } + + public LiveData> updateEmployee(Long id, EmployeeDTO dto) { + return employeeRepository.updateEmployee(id, dto); + } + + public LiveData> deleteEmployee(Long id) { + return employeeRepository.deleteEmployee(id); + } +} diff --git a/android/app/src/main/java/com/example/petstoremobile/viewmodels/SaleViewModel.java b/android/app/src/main/java/com/example/petstoremobile/viewmodels/SaleViewModel.java new file mode 100644 index 00000000..aca186f6 --- /dev/null +++ b/android/app/src/main/java/com/example/petstoremobile/viewmodels/SaleViewModel.java @@ -0,0 +1,35 @@ +package com.example.petstoremobile.viewmodels; + +import androidx.lifecycle.LiveData; +import androidx.lifecycle.ViewModel; + +import com.example.petstoremobile.dtos.PageResponse; +import com.example.petstoremobile.dtos.SaleDTO; +import com.example.petstoremobile.repositories.SaleRepository; +import com.example.petstoremobile.utils.Resource; + +import javax.inject.Inject; + +import dagger.hilt.android.lifecycle.HiltViewModel; + +@HiltViewModel +public class SaleViewModel extends ViewModel { + private final SaleRepository saleRepository; + + @Inject + public SaleViewModel(SaleRepository saleRepository) { + this.saleRepository = saleRepository; + } + + public LiveData>> getAllSales(int page, int size) { + return saleRepository.getAllSales(page, size); + } + + public LiveData> getSaleById(Long id) { + return saleRepository.getSaleById(id); + } + + public LiveData> createSale(SaleDTO sale) { + return saleRepository.createSale(sale); + } +} diff --git a/android/app/src/main/res/layout/fragment_adoption_detail.xml b/android/app/src/main/res/layout/fragment_adoption_detail.xml index 0b95aaeb..45ac673f 100644 --- a/android/app/src/main/res/layout/fragment_adoption_detail.xml +++ b/android/app/src/main/res/layout/fragment_adoption_detail.xml @@ -80,21 +80,6 @@ android:layout_height="wrap_content" android:layout_marginBottom="16dp"/> - - - - - + android:id="@+id/nav_refund" + android:name="com.example.petstoremobile.fragments.listfragments.detailfragments.RefundFragment" + android:label="Refund" + tools:layout="@layout/fragment_refund" /> + + + + + + + +