From 42c9e965005d9bbd925fd929f8e01c055f6563f0 Mon Sep 17 00:00:00 2001 From: Alex <78383757+Lextical@users.noreply.github.com> Date: Sun, 12 Apr 2026 17:49:24 -0600 Subject: [PATCH] Modified project to use our utils on areas we arnt to manage code --- .../activities/MainActivity.java | 7 +-- .../adapters/ActivityLogAdapter.java | 8 ++-- .../adapters/CouponAdapter.java | 3 +- .../AdoptionDetailFragment.java | 23 +++------ .../AppointmentDetailFragment.java | 24 +++------- .../detailfragments/CouponDetailFragment.java | 12 ++--- .../detailfragments/PetDetailFragment.java | 48 +++++-------------- .../detailfragments/RefundFragment.java | 3 +- .../petstoremobile/utils/DateTimeUtils.java | 9 ++++ 9 files changed, 49 insertions(+), 88 deletions(-) diff --git a/android/app/src/main/java/com/example/petstoremobile/activities/MainActivity.java b/android/app/src/main/java/com/example/petstoremobile/activities/MainActivity.java index 25969757..11925052 100644 --- a/android/app/src/main/java/com/example/petstoremobile/activities/MainActivity.java +++ b/android/app/src/main/java/com/example/petstoremobile/activities/MainActivity.java @@ -16,6 +16,7 @@ import com.example.petstoremobile.api.auth.TokenManager; import com.example.petstoremobile.databinding.ActivityMainBinding; import com.example.petstoremobile.viewmodels.AuthViewModel; import com.example.petstoremobile.utils.Resource; +import com.example.petstoremobile.utils.UIUtils; import javax.inject.Inject; import javax.inject.Named; @@ -105,14 +106,14 @@ public class MainActivity extends AppCompatActivity { switch (resource.status) { case LOADING: - binding.btnLogin.setEnabled(false); + UIUtils.setViewsEnabled(false, binding.btnLogin); binding.tvLoginStatus.setText("Logging in..."); break; case SUCCESS: if (resource.data != null) { String role = resource.data.getRole(); if ("CUSTOMER".equalsIgnoreCase(role)) { - binding.btnLogin.setEnabled(true); + UIUtils.setViewsEnabled(true, binding.btnLogin); binding.tvLoginStatus.setText("Customers are not allowed to log in"); Toast.makeText(this, "Access denied: Customers are not allowed to log in.", Toast.LENGTH_LONG).show(); } else { @@ -122,7 +123,7 @@ public class MainActivity extends AppCompatActivity { } break; case ERROR: - binding.btnLogin.setEnabled(true); + UIUtils.setViewsEnabled(true, binding.btnLogin); binding.tvLoginStatus.setText(resource.message); Toast.makeText(this, resource.message, Toast.LENGTH_LONG).show(); break; diff --git a/android/app/src/main/java/com/example/petstoremobile/adapters/ActivityLogAdapter.java b/android/app/src/main/java/com/example/petstoremobile/adapters/ActivityLogAdapter.java index 5a6b4d1c..2c61551b 100644 --- a/android/app/src/main/java/com/example/petstoremobile/adapters/ActivityLogAdapter.java +++ b/android/app/src/main/java/com/example/petstoremobile/adapters/ActivityLogAdapter.java @@ -10,6 +10,7 @@ import androidx.recyclerview.widget.RecyclerView; import com.example.petstoremobile.R; import com.example.petstoremobile.dtos.ActivityLogDTO; +import com.example.petstoremobile.utils.DateTimeUtils; import java.util.List; @@ -35,10 +36,9 @@ public class ActivityLogAdapter extends RecyclerView.Adapter= 16) { - timestamp = timestamp.substring(0, 10) + " " + timestamp.substring(11, 16); - } - holder.tvTimestamp.setText(timestamp); + String date = DateTimeUtils.extractDate(timestamp); + String time = (timestamp != null && timestamp.length() >= 16) ? timestamp.substring(11, 16) : null; + holder.tvTimestamp.setText(date != null && time != null ? date + " " + time : date); } @Override diff --git a/android/app/src/main/java/com/example/petstoremobile/adapters/CouponAdapter.java b/android/app/src/main/java/com/example/petstoremobile/adapters/CouponAdapter.java index a1414f56..ff9bbe65 100644 --- a/android/app/src/main/java/com/example/petstoremobile/adapters/CouponAdapter.java +++ b/android/app/src/main/java/com/example/petstoremobile/adapters/CouponAdapter.java @@ -12,6 +12,7 @@ import androidx.recyclerview.widget.RecyclerView; import com.example.petstoremobile.R; import com.example.petstoremobile.dtos.CouponDTO; +import com.example.petstoremobile.utils.DateTimeUtils; import java.math.BigDecimal; import java.util.HashSet; @@ -57,7 +58,7 @@ public class CouponAdapter extends RecyclerView.Adapter parent, View view, int position, long id) { - if (isUpdatingUI) return; - viewModel.onCustomerSelected(position); - } - @Override - public void onNothingSelected(AdapterView parent) {} + SpinnerUtils.setOnIndexSelectedListener(binding.spinnerAdoptionCustomer, p -> { + if (isUpdatingUI) return; + viewModel.onCustomerSelected(p); }); - - binding.spinnerAdoptionStore.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { - @Override - public void onItemSelected(AdapterView parent, View view, int position, long id) { - if (isUpdatingUI) return; - viewModel.onStoreSelected(position); - } - @Override - public void onNothingSelected(AdapterView parent) {} + SpinnerUtils.setOnIndexSelectedListener(binding.spinnerAdoptionStore, p -> { + if (isUpdatingUI) return; + viewModel.onStoreSelected(p); }); SpinnerUtils.setOnIndexSelectedListener(binding.spinnerAdoptionPet, p -> viewModel.onPetSelected(p)); diff --git a/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/detailfragments/AppointmentDetailFragment.java b/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/detailfragments/AppointmentDetailFragment.java index cbeb2125..baec0c28 100644 --- a/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/detailfragments/AppointmentDetailFragment.java +++ b/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/detailfragments/AppointmentDetailFragment.java @@ -4,7 +4,6 @@ import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.AdapterView; import android.widget.Toast; import androidx.annotation.NonNull; @@ -91,24 +90,13 @@ public class AppointmentDetailFragment extends Fragment { UIUtils.setViewsEnabled(false, binding.spinnerPet, binding.spinnerStaff); - binding.spinnerCustomer.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { - @Override - public void onItemSelected(AdapterView parent, View view, int position, long id) { - if (isUpdatingUI) return; - viewModel.onCustomerSelected(position); - } - @Override - public void onNothingSelected(AdapterView parent) {} + SpinnerUtils.setOnIndexSelectedListener(binding.spinnerCustomer, p -> { + if (isUpdatingUI) return; + viewModel.onCustomerSelected(p); }); - - binding.spinnerStore.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { - @Override - public void onItemSelected(AdapterView parent, View view, int position, long id) { - if (isUpdatingUI) return; - viewModel.onStoreSelected(position); - } - @Override - public void onNothingSelected(AdapterView parent) {} + SpinnerUtils.setOnIndexSelectedListener(binding.spinnerStore, p -> { + if (isUpdatingUI) return; + viewModel.onStoreSelected(p); }); SpinnerUtils.setOnIndexSelectedListener(binding.spinnerService, p -> viewModel.onServiceSelected(p)); diff --git a/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/detailfragments/CouponDetailFragment.java b/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/detailfragments/CouponDetailFragment.java index ff172bdc..0d243a69 100644 --- a/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/detailfragments/CouponDetailFragment.java +++ b/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/detailfragments/CouponDetailFragment.java @@ -1,11 +1,9 @@ package com.example.petstoremobile.fragments.listfragments.detailfragments; -import android.app.DatePickerDialog; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.ArrayAdapter; import androidx.annotation.NonNull; import androidx.appcompat.app.AlertDialog; @@ -19,6 +17,7 @@ import com.example.petstoremobile.dtos.CouponDTO; import com.example.petstoremobile.utils.DateTimeUtils; import com.example.petstoremobile.utils.InputValidator; import com.example.petstoremobile.utils.Resource; +import com.example.petstoremobile.utils.SpinnerUtils; import com.example.petstoremobile.utils.UIUtils; import com.example.petstoremobile.viewmodels.CouponDetailViewModel; @@ -76,10 +75,7 @@ public class CouponDetailFragment extends Fragment { } private void setupDiscountTypeSpinner() { - String[] types = {"FIXED", "PERCENT"}; - ArrayAdapter adapter = new ArrayAdapter<>(requireContext(), android.R.layout.simple_spinner_item, types); - adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); - binding.spinnerDiscountTypeDetail.setAdapter(adapter); + SpinnerUtils.setupStringSpinner(requireContext(), binding.spinnerDiscountTypeDetail, new String[]{"FIXED", "PERCENT"}); } private void setupDatePicker(android.widget.EditText editText, android.widget.EditText dependOn, Runnable onDateSet) { @@ -109,8 +105,8 @@ public class CouponDetailFragment extends Fragment { binding.etUsageLimitDetail.setText(coupon.getUsageLimit() != null ? String.valueOf(coupon.getUsageLimit()) : ""); binding.cbActiveDetail.setChecked(Boolean.TRUE.equals(coupon.getActive())); - if (coupon.getStartsAt() != null) binding.etStartsAtDetail.setText(coupon.getStartsAt().substring(0, 10)); - if (coupon.getEndsAt() != null) binding.etEndsAtDetail.setText(coupon.getEndsAt().substring(0, 10)); + if (coupon.getStartsAt() != null) binding.etStartsAtDetail.setText(DateTimeUtils.extractDate(coupon.getStartsAt())); + if (coupon.getEndsAt() != null) binding.etEndsAtDetail.setText(DateTimeUtils.extractDate(coupon.getEndsAt())); } }); } diff --git a/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/detailfragments/PetDetailFragment.java b/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/detailfragments/PetDetailFragment.java index 8b28cd1d..2d5f1575 100644 --- a/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/detailfragments/PetDetailFragment.java +++ b/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/detailfragments/PetDetailFragment.java @@ -12,7 +12,6 @@ import androidx.navigation.fragment.NavHostFragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.AdapterView; import android.widget.Spinner; import android.widget.TextView; import android.widget.Toast; @@ -280,43 +279,20 @@ public class PetDetailFragment extends Fragment { viewModel.onSpeciesSelected(p); }); - binding.spinnerCustomer.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { - @Override - public void onItemSelected(AdapterView parent, View view, int position, long id) { - if (isUpdatingUI) return; - viewModel.onCustomerSelected(position); - } - - @Override - public void onNothingSelected(AdapterView parent) { - } + SpinnerUtils.setOnIndexSelectedListener(binding.spinnerCustomer, p -> { + if (isUpdatingUI) return; + viewModel.onCustomerSelected(p); }); - - binding.spinnerStore.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { - @Override - public void onItemSelected(AdapterView parent, View view, int position, long id) { - if (isUpdatingUI) return; - viewModel.onStoreSelected(position); - } - - @Override - public void onNothingSelected(AdapterView parent) { - } + SpinnerUtils.setOnIndexSelectedListener(binding.spinnerStore, p -> { + if (isUpdatingUI) return; + viewModel.onStoreSelected(p); }); - - binding.spinnerPetStatus.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { - @Override - public void onItemSelected(AdapterView parent, View view, int position, long id) { - if (isUpdatingUI) return; - String status = parent.getItemAtPosition(position).toString(); - clearSpinnerError(binding.spinnerCustomer); - clearSpinnerError(binding.spinnerStore); - viewModel.onStatusSelected(status); - } - - @Override - public void onNothingSelected(AdapterView parent) { - } + SpinnerUtils.setOnIndexSelectedListener(binding.spinnerPetStatus, p -> { + if (isUpdatingUI) return; + String status = binding.spinnerPetStatus.getItemAtPosition(p).toString(); + clearSpinnerError(binding.spinnerCustomer); + clearSpinnerError(binding.spinnerStore); + viewModel.onStatusSelected(status); }); } 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 7d4841f3..f4e58fb5 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 @@ -14,6 +14,7 @@ import com.example.petstoremobile.dtos.SaleDTO; import com.example.petstoremobile.viewmodels.RefundViewModel; import com.example.petstoremobile.utils.DialogUtils; import com.example.petstoremobile.utils.Resource; +import com.example.petstoremobile.utils.DateTimeUtils; import com.example.petstoremobile.utils.SpinnerUtils; import dagger.hilt.android.AndroidEntryPoint; import java.math.BigDecimal; @@ -123,7 +124,7 @@ public class RefundFragment extends Fragment { binding.tvSaleInfo.setVisibility(View.VISIBLE); binding.tvSaleInfo.setText("Sale #" + currentSale.getSaleId() + " | " + (currentSale.getSaleDate() != null - ? currentSale.getSaleDate().substring(0, 10) : "") + ? DateTimeUtils.extractDate(currentSale.getSaleDate()) : "") + " | Employee: " + (currentSale.getEmployeeName() != null ? currentSale.getEmployeeName() : "") + " | Total: $" + currentSale.getTotalAmount() diff --git a/android/app/src/main/java/com/example/petstoremobile/utils/DateTimeUtils.java b/android/app/src/main/java/com/example/petstoremobile/utils/DateTimeUtils.java index 45867cd8..2f522b81 100644 --- a/android/app/src/main/java/com/example/petstoremobile/utils/DateTimeUtils.java +++ b/android/app/src/main/java/com/example/petstoremobile/utils/DateTimeUtils.java @@ -129,6 +129,15 @@ public class DateTimeUtils { return String.format(Locale.getDefault(), "%02d:%02d", hour, minute); } + /** + * Extracts the date portion (YYYY-MM-DD) from timestamp string. + * Returns null if the input is null or too short. + */ + public static String extractDate(String timestamp) { + if (timestamp == null || timestamp.length() < 10) return null; + return timestamp.substring(0, 10); + } + /** * Formats an ID for display (e.g., "ID: 123"). */