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 55b540ed..577d58b1 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 @@ -2,8 +2,6 @@ package com.example.petstoremobile.fragments.listfragments; import android.graphics.Color; import android.os.Bundle; -import android.text.Editable; -import android.text.TextWatcher; import android.util.Log; import android.view.LayoutInflater; import android.view.View; @@ -22,7 +20,6 @@ import com.example.petstoremobile.adapters.AdoptionAdapter; import com.example.petstoremobile.databinding.FragmentAdoptionBinding; import com.example.petstoremobile.dtos.AdoptionDTO; import com.example.petstoremobile.dtos.StoreDTO; -import com.example.petstoremobile.fragments.ListFragment; import com.example.petstoremobile.utils.BulkDeleteHandler; import com.example.petstoremobile.utils.Resource; import com.example.petstoremobile.utils.SpinnerUtils; @@ -87,15 +84,7 @@ public class AdoptionFragment extends Fragment implements AdoptionAdapter.OnAdop binding.fabAddAdoption.setOnClickListener(v -> openDetail(-1)); - binding.btnHamburgerAdoption.setOnClickListener(v -> { - Fragment parent = getParentFragment(); - if (parent != null) { - Fragment grandParent = parent.getParentFragment(); - if (grandParent instanceof ListFragment) { - ((ListFragment) grandParent).openDrawer(); - } - } - }); + UIUtils.setupHamburgerMenu(binding.btnHamburgerAdoption, this); binding.btnToggleCalendarModeAdoption.setOnClickListener(v -> toggleCalendarMode()); @@ -219,13 +208,7 @@ public class AdoptionFragment extends Fragment implements AdoptionAdapter.OnAdop * Sets up the search bar for filtering */ private void setupSearch() { - binding.etSearchAdoption.addTextChangedListener(new TextWatcher() { - @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) {} - @Override public void onTextChanged(CharSequence s, int start, int before, int count) { - loadAdoptions(); - } - @Override public void afterTextChanged(Editable s) {} - }); + UIUtils.attachSearch(binding.etSearchAdoption, this::loadAdoptions); } /** diff --git a/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/AppointmentFragment.java b/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/AppointmentFragment.java index 3907f5de..3d4d6cd6 100644 --- a/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/AppointmentFragment.java +++ b/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/AppointmentFragment.java @@ -10,8 +10,6 @@ import androidx.lifecycle.ViewModelProvider; import androidx.navigation.fragment.NavHostFragment; import androidx.recyclerview.widget.LinearLayoutManager; -import android.text.Editable; -import android.text.TextWatcher; import android.util.Log; import android.view.LayoutInflater; import android.view.View; @@ -23,7 +21,6 @@ import com.example.petstoremobile.adapters.AppointmentAdapter; import com.example.petstoremobile.databinding.FragmentAppointmentBinding; import com.example.petstoremobile.dtos.AppointmentDTO; import com.example.petstoremobile.dtos.StoreDTO; -import com.example.petstoremobile.fragments.ListFragment; import com.example.petstoremobile.utils.BulkDeleteHandler; import com.example.petstoremobile.utils.Resource; import com.example.petstoremobile.utils.SpinnerUtils; @@ -95,15 +92,7 @@ public class AppointmentFragment extends Fragment implements AppointmentAdapter. binding.fabAddAppointment.setOnClickListener(v -> openAppointmentDetails(-1)); - binding.btnHamburger.setOnClickListener(v -> { - Fragment parent = getParentFragment(); - if (parent != null) { - Fragment grandParent = parent.getParentFragment(); - if (grandParent instanceof ListFragment) { - ((ListFragment) grandParent).openDrawer(); - } - } - }); + UIUtils.setupHamburgerMenu(binding.btnHamburger, this); binding.btnToggleCalendarMode.setOnClickListener(v -> toggleCalendarMode()); @@ -244,13 +233,7 @@ public class AppointmentFragment extends Fragment implements AppointmentAdapter. * Configures the search bar for filtering. */ private void setupSearch() { - binding.etSearchAppointment.addTextChangedListener(new TextWatcher() { - @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) {} - @Override public void onTextChanged(CharSequence s, int start, int before, int count) { - loadAppointmentData(); - } - @Override public void afterTextChanged(Editable s) {} - }); + UIUtils.attachSearch(binding.etSearchAppointment, this::loadAppointmentData); } /** diff --git a/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/InventoryFragment.java b/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/InventoryFragment.java index 6db1cbb4..259a0a9e 100644 --- a/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/InventoryFragment.java +++ b/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/InventoryFragment.java @@ -1,8 +1,6 @@ package com.example.petstoremobile.fragments.listfragments; import android.os.Bundle; -import android.text.Editable; -import android.text.TextWatcher; import android.util.Log; import android.view.LayoutInflater; import android.view.View; @@ -22,7 +20,6 @@ import com.example.petstoremobile.adapters.InventoryAdapter; import com.example.petstoremobile.databinding.FragmentInventoryBinding; import com.example.petstoremobile.dtos.InventoryDTO; import com.example.petstoremobile.dtos.StoreDTO; -import com.example.petstoremobile.fragments.ListFragment; import com.example.petstoremobile.utils.BulkDeleteHandler; import com.example.petstoremobile.utils.UIUtils; import com.example.petstoremobile.viewmodels.InventoryViewModel; @@ -80,15 +77,7 @@ public class InventoryFragment extends Fragment implements InventoryAdapter.OnIn binding.fabAddInventory.setOnClickListener(v -> openDetail(null)); - binding.btnHamburger.setOnClickListener(v -> { - Fragment parent = getParentFragment(); - if (parent != null) { - Fragment grandParent = parent.getParentFragment(); - if (grandParent instanceof ListFragment) { - ((ListFragment) grandParent).openDrawer(); - } - } - }); + UIUtils.setupHamburgerMenu(binding.btnHamburger, this); return binding.getRoot(); } @@ -123,13 +112,7 @@ public class InventoryFragment extends Fragment implements InventoryAdapter.OnIn * Sets up the search bar for filtering. */ private void setupSearch() { - binding.etSearchInventory.addTextChangedListener(new TextWatcher() { - @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) {} - @Override public void onTextChanged(CharSequence s, int start, int before, int count) { - loadInventory(true); - } - @Override public void afterTextChanged(Editable s) {} - }); + UIUtils.attachSearch(binding.etSearchInventory, () -> loadInventory(true)); } /** diff --git a/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/PetFragment.java b/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/PetFragment.java index 88031831..e7e36eae 100644 --- a/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/PetFragment.java +++ b/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/PetFragment.java @@ -9,8 +9,6 @@ import androidx.lifecycle.ViewModelProvider; import androidx.navigation.fragment.NavHostFragment; import androidx.recyclerview.widget.LinearLayoutManager; -import android.text.Editable; -import android.text.TextWatcher; import android.util.Log; import android.view.LayoutInflater; import android.view.View; @@ -23,7 +21,6 @@ import com.example.petstoremobile.api.auth.TokenManager; import com.example.petstoremobile.databinding.FragmentPetBinding; import com.example.petstoremobile.dtos.PetDTO; import com.example.petstoremobile.dtos.StoreDTO; -import com.example.petstoremobile.fragments.ListFragment; import com.example.petstoremobile.utils.BulkDeleteHandler; import com.example.petstoremobile.utils.Resource; import com.example.petstoremobile.utils.SpinnerUtils; @@ -81,15 +78,7 @@ public class PetFragment extends Fragment implements PetAdapter.OnPetClickListen binding.fabAddPet.setOnClickListener(v -> openPetDetails()); - binding.btnHamburger.setOnClickListener(v -> { - Fragment parent = getParentFragment(); - if (parent != null) { - Fragment grandParent = parent.getParentFragment(); - if (grandParent instanceof ListFragment) { - ((ListFragment) grandParent).openDrawer(); - } - } - }); + UIUtils.setupHamburgerMenu(binding.btnHamburger, this); return binding.getRoot(); } @@ -135,13 +124,7 @@ public class PetFragment extends Fragment implements PetAdapter.OnPetClickListen * Configures the search bar. */ private void setupSearch() { - binding.etSearchPet.addTextChangedListener(new TextWatcher() { - @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) {} - @Override public void onTextChanged(CharSequence s, int start, int before, int count) { - loadPetData(); - } - @Override public void afterTextChanged(Editable s) {} - }); + UIUtils.attachSearch(binding.etSearchPet, this::loadPetData); } /** diff --git a/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/ProductFragment.java b/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/ProductFragment.java index 099238f5..6ae3d349 100644 --- a/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/ProductFragment.java +++ b/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/ProductFragment.java @@ -9,8 +9,6 @@ import androidx.lifecycle.ViewModelProvider; import androidx.navigation.fragment.NavHostFragment; import androidx.recyclerview.widget.LinearLayoutManager; -import android.text.Editable; -import android.text.TextWatcher; import android.util.Log; import android.view.LayoutInflater; import android.view.View; @@ -22,7 +20,6 @@ import com.example.petstoremobile.adapters.ProductAdapter; import com.example.petstoremobile.databinding.FragmentProductBinding; import com.example.petstoremobile.dtos.CategoryDTO; import com.example.petstoremobile.dtos.ProductDTO; -import com.example.petstoremobile.fragments.ListFragment; import com.example.petstoremobile.utils.Resource; import com.example.petstoremobile.utils.SpinnerUtils; import com.example.petstoremobile.utils.UIUtils; @@ -72,15 +69,7 @@ public class ProductFragment extends Fragment implements ProductAdapter.OnProduc binding.fabAddProduct.setOnClickListener(v -> openProductDetails(-1)); - binding.btnHamburgerProduct.setOnClickListener(v -> { - Fragment parent = getParentFragment(); - if (parent != null) { - Fragment grandParent = parent.getParentFragment(); - if (grandParent instanceof ListFragment) { - ((ListFragment) grandParent).openDrawer(); - } - } - }); + UIUtils.setupHamburgerMenu(binding.btnHamburgerProduct, this); return binding.getRoot(); } @@ -113,13 +102,7 @@ public class ProductFragment extends Fragment implements ProductAdapter.OnProduc * Configures the search bar for triggering data load from backend. */ private void setupSearch() { - binding.etSearchProduct.addTextChangedListener(new TextWatcher() { - @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) {} - @Override public void onTextChanged(CharSequence s, int start, int before, int count) { - loadProductData(); - } - @Override public void afterTextChanged(Editable s) {} - }); + UIUtils.attachSearch(binding.etSearchProduct, this::loadProductData); } /** diff --git a/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/ProductSupplierFragment.java b/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/ProductSupplierFragment.java index befec0e7..e1db78b6 100644 --- a/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/ProductSupplierFragment.java +++ b/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/ProductSupplierFragment.java @@ -1,8 +1,6 @@ package com.example.petstoremobile.fragments.listfragments; import android.os.Bundle; -import android.text.Editable; -import android.text.TextWatcher; import android.util.Log; import android.view.LayoutInflater; import android.view.View; @@ -22,7 +20,6 @@ import com.example.petstoremobile.databinding.FragmentProductSupplierBinding; import com.example.petstoremobile.dtos.ProductDTO; import com.example.petstoremobile.dtos.ProductSupplierDTO; import com.example.petstoremobile.dtos.SupplierDTO; -import com.example.petstoremobile.fragments.ListFragment; import com.example.petstoremobile.utils.BulkDeleteHandler; import com.example.petstoremobile.utils.Resource; import com.example.petstoremobile.utils.SpinnerUtils; @@ -80,15 +77,7 @@ public class ProductSupplierFragment extends Fragment binding.fabAddPS.setOnClickListener(v -> openDetail(-1)); - binding.btnHamburgerPS.setOnClickListener(v -> { - Fragment parent = getParentFragment(); - if (parent != null) { - Fragment grandParent = parent.getParentFragment(); - if (grandParent instanceof ListFragment) { - ((ListFragment) grandParent).openDrawer(); - } - } - }); + UIUtils.setupHamburgerMenu(binding.btnHamburgerPS, this); return binding.getRoot(); } @@ -143,13 +132,7 @@ public class ProductSupplierFragment extends Fragment * Configures the search bar for filtering. */ private void setupSearch() { - binding.etSearchPS.addTextChangedListener(new TextWatcher() { - @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) {} - @Override public void onTextChanged(CharSequence s, int start, int before, int count) { - loadData(); - } - @Override public void afterTextChanged(Editable s) {} - }); + UIUtils.attachSearch(binding.etSearchPS, this::loadData); } /** diff --git a/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/PurchaseOrderFragment.java b/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/PurchaseOrderFragment.java index e5b90002..b27c9c1f 100644 --- a/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/PurchaseOrderFragment.java +++ b/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/PurchaseOrderFragment.java @@ -1,8 +1,6 @@ package com.example.petstoremobile.fragments.listfragments; import android.os.Bundle; -import android.text.Editable; -import android.text.TextWatcher; import android.util.Log; import android.view.LayoutInflater; import android.view.View; @@ -21,7 +19,6 @@ import com.example.petstoremobile.adapters.PurchaseOrderAdapter; import com.example.petstoremobile.databinding.FragmentPurchaseOrderBinding; import com.example.petstoremobile.dtos.PurchaseOrderDTO; import com.example.petstoremobile.dtos.StoreDTO; -import com.example.petstoremobile.fragments.ListFragment; import com.example.petstoremobile.utils.Resource; import com.example.petstoremobile.utils.SpinnerUtils; import com.example.petstoremobile.utils.UIUtils; @@ -68,15 +65,7 @@ public class PurchaseOrderFragment extends Fragment setupSwipeRefresh(); setupFilterToggle(); - binding.btnHamburgerPO.setOnClickListener(v -> { - Fragment parent = getParentFragment(); - if (parent != null) { - Fragment grandParent = parent.getParentFragment(); - if (grandParent instanceof ListFragment) { - ((ListFragment) grandParent).openDrawer(); - } - } - }); + UIUtils.setupHamburgerMenu(binding.btnHamburgerPO, this); return binding.getRoot(); } @@ -108,13 +97,7 @@ public class PurchaseOrderFragment extends Fragment * Configures the search bar for filtering. */ private void setupSearch() { - binding.etSearchPO.addTextChangedListener(new TextWatcher() { - @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) {} - @Override public void onTextChanged(CharSequence s, int start, int before, int count) { - loadData(); - } - @Override public void afterTextChanged(Editable s) {} - }); + UIUtils.attachSearch(binding.etSearchPO, this::loadData); } /** 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 3bb27748..850717e4 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 @@ -8,8 +8,6 @@ import androidx.lifecycle.ViewModelProvider; import androidx.navigation.fragment.NavHostFragment; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; -import android.text.Editable; -import android.text.TextWatcher; import android.util.Log; import android.view.LayoutInflater; import android.view.View; @@ -21,7 +19,6 @@ import com.example.petstoremobile.adapters.SaleAdapter; import com.example.petstoremobile.databinding.FragmentSaleBinding; import com.example.petstoremobile.dtos.SaleDTO; import com.example.petstoremobile.dtos.StoreDTO; -import com.example.petstoremobile.fragments.ListFragment; import com.example.petstoremobile.utils.Resource; import com.example.petstoremobile.utils.SpinnerUtils; import com.example.petstoremobile.utils.UIUtils; @@ -72,15 +69,7 @@ public class SaleFragment extends Fragment implements SaleAdapter.OnSaleClickLis setupFilterToggle(); loadSales(true); - binding.btnHamburger.setOnClickListener(v -> { - Fragment parent = getParentFragment(); - if (parent != null) { - Fragment grandParent = parent.getParentFragment(); - if (grandParent instanceof ListFragment) { - ((ListFragment) grandParent).openDrawer(); - } - } - }); + UIUtils.setupHamburgerMenu(binding.btnHamburger, this); binding.fabAddSale.setOnClickListener(v -> NavHostFragment.findNavController(this).navigate(R.id.nav_sale_detail)); @@ -149,14 +138,7 @@ public class SaleFragment extends Fragment implements SaleAdapter.OnSaleClickLis } private void setupSearch() { - binding.etSearchSale.addTextChangedListener(new TextWatcher() { - @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) { - loadSales(true); - } - }); + UIUtils.attachSearch(binding.etSearchSale, () -> loadSales(true)); } private void setupSwipeRefresh() { diff --git a/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/ServiceFragment.java b/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/ServiceFragment.java index c6d32f84..77136d4e 100644 --- a/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/ServiceFragment.java +++ b/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/ServiceFragment.java @@ -1,8 +1,6 @@ package com.example.petstoremobile.fragments.listfragments; import android.os.Bundle; -import android.text.Editable; -import android.text.TextWatcher; import android.util.Log; import android.view.LayoutInflater; import android.view.View; @@ -21,9 +19,7 @@ import com.example.petstoremobile.R; import com.example.petstoremobile.adapters.ServiceAdapter; import com.example.petstoremobile.databinding.FragmentServiceBinding; import com.example.petstoremobile.dtos.ServiceDTO; -import com.example.petstoremobile.fragments.ListFragment; import com.example.petstoremobile.utils.BulkDeleteHandler; -import com.example.petstoremobile.utils.Resource; import com.example.petstoremobile.utils.UIUtils; import com.example.petstoremobile.viewmodels.ServiceViewModel; @@ -78,15 +74,7 @@ public class ServiceFragment extends Fragment implements ServiceAdapter.OnServic binding.fabAddService.setOnClickListener(v -> openDetail(null)); - binding.btnHamburger.setOnClickListener(v -> { - Fragment parent = getParentFragment(); - if (parent != null) { - Fragment grandParent = parent.getParentFragment(); - if (grandParent instanceof ListFragment) { - ((ListFragment) grandParent).openDrawer(); - } - } - }); + UIUtils.setupHamburgerMenu(binding.btnHamburger, this); return binding.getRoot(); } @@ -121,13 +109,7 @@ public class ServiceFragment extends Fragment implements ServiceAdapter.OnServic * Sets up the search bar for filtering. */ private void setupSearch() { - binding.etSearchService.addTextChangedListener(new TextWatcher() { - @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) {} - @Override public void onTextChanged(CharSequence s, int start, int before, int count) { - loadServices(true); - } - @Override public void afterTextChanged(Editable s) {} - }); + UIUtils.attachSearch(binding.etSearchService, () -> loadServices(true)); } /** 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 06747de3..4c17edf4 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 @@ -1,7 +1,6 @@ package com.example.petstoremobile.fragments.listfragments; import android.os.Bundle; -import android.text.*; import android.util.Log; import android.view.*; import android.widget.*; @@ -17,7 +16,6 @@ import com.example.petstoremobile.adapters.EmployeeAdapter; 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.utils.UIUtils; import com.google.android.material.floatingactionbutton.FloatingActionButton; import java.util.*; @@ -48,7 +46,7 @@ public class StaffFragment extends Fragment implements EmployeeAdapter.OnEmploye fab.setOnClickListener(v -> openDetail(-1)); ImageButton hamburger = view.findViewById(R.id.btnHamburgerStaff); - hamburger.setOnClickListener(v -> openDrawer()); + UIUtils.setupHamburgerMenu(hamburger, this); ImageButton btnToggleFilter = view.findViewById(R.id.btnToggleFilterStaff); UIUtils.setupFilterToggle(btnToggleFilter, layoutFilter, etSearch); @@ -56,16 +54,6 @@ public class StaffFragment extends Fragment implements EmployeeAdapter.OnEmploye 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); @@ -75,13 +63,7 @@ public class StaffFragment extends Fragment implements EmployeeAdapter.OnEmploye private void setupSearch(View view) { etSearch = view.findViewById(R.id.etSearchStaff); - etSearch.addTextChangedListener(new TextWatcher() { - public void beforeTextChanged(CharSequence s, int a, int b, int c) {} - public void afterTextChanged(Editable s) {} - public void onTextChanged(CharSequence s, int a, int b, int c) { - filter(s.toString()); - } - }); + UIUtils.attachSearch(etSearch, () -> filter(etSearch.getText().toString())); } private void setupSwipeRefresh(View view) { diff --git a/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/SupplierFragment.java b/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/SupplierFragment.java index ce255f17..eca755bb 100644 --- a/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/SupplierFragment.java +++ b/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/SupplierFragment.java @@ -9,8 +9,6 @@ import androidx.lifecycle.ViewModelProvider; import androidx.navigation.fragment.NavHostFragment; import androidx.recyclerview.widget.LinearLayoutManager; -import android.text.Editable; -import android.text.TextWatcher; import android.util.Log; import android.view.LayoutInflater; import android.view.View; @@ -21,7 +19,6 @@ import com.example.petstoremobile.R; import com.example.petstoremobile.adapters.SupplierAdapter; import com.example.petstoremobile.databinding.FragmentSupplierBinding; import com.example.petstoremobile.dtos.SupplierDTO; -import com.example.petstoremobile.fragments.ListFragment; import com.example.petstoremobile.utils.BulkDeleteHandler; import com.example.petstoremobile.utils.Resource; import com.example.petstoremobile.utils.UIUtils; @@ -68,16 +65,7 @@ public class SupplierFragment extends Fragment implements SupplierAdapter.OnSupp //Add button to opens the add dialog binding.fabAddSupplier.setOnClickListener(v -> openSupplierDetails(-1)); - //Make the hamburger button open the drawer from listFragment - binding.btnHamburger.setOnClickListener(v -> { - Fragment parent = getParentFragment(); - if (parent != null) { - Fragment grandParent = parent.getParentFragment(); - if (grandParent instanceof ListFragment) { - ((ListFragment) grandParent).openDrawer(); - } - } - }); + UIUtils.setupHamburgerMenu(binding.btnHamburger, this); return binding.getRoot(); } @@ -112,13 +100,7 @@ public class SupplierFragment extends Fragment implements SupplierAdapter.OnSupp * Configures the search bar for filtering. */ private void setupSearch() { - binding.etSearchSupplier.addTextChangedListener(new TextWatcher() { - @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) {} - @Override public void onTextChanged(CharSequence s, int start, int before, int count) { - loadSupplierData(); - } - @Override public void afterTextChanged(Editable s) {} - }); + UIUtils.attachSearch(binding.etSearchSupplier, this::loadSupplierData); } /** diff --git a/android/app/src/main/java/com/example/petstoremobile/utils/UIUtils.java b/android/app/src/main/java/com/example/petstoremobile/utils/UIUtils.java index b1ab7ad2..399cabc4 100644 --- a/android/app/src/main/java/com/example/petstoremobile/utils/UIUtils.java +++ b/android/app/src/main/java/com/example/petstoremobile/utils/UIUtils.java @@ -1,20 +1,23 @@ package com.example.petstoremobile.utils; import android.telephony.PhoneNumberFormattingTextWatcher; +import android.text.Editable; import android.text.InputFilter; +import android.text.TextWatcher; import android.view.View; import android.widget.EditText; import android.widget.ImageButton; import android.widget.Spinner; -import com.example.petstoremobile.R; +import androidx.fragment.app.Fragment; +import com.example.petstoremobile.fragments.ListFragment; /** * Utility class for shared UI component logic and formatting. */ public class UIUtils { /** - * Formats an EditText for to phone format + * Formats an EditText to phone format. */ public static void formatPhoneInput(EditText editText) { editText.addTextChangedListener(new PhoneNumberFormattingTextWatcher("CA")); @@ -42,4 +45,32 @@ public class UIUtils { } }); } + + /** + * Simplifies setting up the hamburger menu to open the navigation drawer. + */ + public static void setupHamburgerMenu(ImageButton btnHamburger, Fragment fragment) { + btnHamburger.setOnClickListener(v -> { + Fragment parent = fragment.getParentFragment(); + if (parent != null) { + Fragment grandParent = parent.getParentFragment(); + if (grandParent instanceof ListFragment) { + ((ListFragment) grandParent).openDrawer(); + } + } + }); + } + + /** + * Attaches a simplified TextWatcher to an EditText for search functionality. + */ + public static void attachSearch(EditText etSearch, Runnable onQueryChanged) { + etSearch.addTextChangedListener(new TextWatcher() { + @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) {} + @Override public void onTextChanged(CharSequence s, int start, int before, int count) { + onQueryChanged.run(); + } + @Override public void afterTextChanged(Editable s) {} + }); + } }