From 315450ff409cf55e637097a84708186d273ffe42 Mon Sep 17 00:00:00 2001 From: danishjamal104 Date: Sat, 26 Dec 2020 00:58:07 +0530 Subject: [PATCH] search functionality added in individual collection sheet --- .../searchdialog/SearchDialog.java | 97 +++++++++++++++++ .../NewIndividualCollectionSheetFragment.kt | 48 ++++++++- .../mifosxdroid/views/CustomSpinner.java | 102 ++++++++++++++++++ .../main/res/drawable/round_outline_bg.xml | 8 ++ .../layout/fragment_new_collection_sheet.xml | 4 +- .../res/layout/search_list_dialog_layout.xml | 28 +++++ 6 files changed, 283 insertions(+), 4 deletions(-) create mode 100644 mifosng-android/src/main/java/com/mifos/mifosxdroid/dialogfragments/searchdialog/SearchDialog.java create mode 100644 mifosng-android/src/main/java/com/mifos/mifosxdroid/views/CustomSpinner.java create mode 100644 mifosng-android/src/main/res/drawable/round_outline_bg.xml create mode 100644 mifosng-android/src/main/res/layout/search_list_dialog_layout.xml diff --git a/mifosng-android/src/main/java/com/mifos/mifosxdroid/dialogfragments/searchdialog/SearchDialog.java b/mifosng-android/src/main/java/com/mifos/mifosxdroid/dialogfragments/searchdialog/SearchDialog.java new file mode 100644 index 00000000000..e556c97917f --- /dev/null +++ b/mifosng-android/src/main/java/com/mifos/mifosxdroid/dialogfragments/searchdialog/SearchDialog.java @@ -0,0 +1,97 @@ +package com.mifos.mifosxdroid.dialogfragments.searchdialog; + +import android.app.Dialog; +import android.content.Context; +import android.text.Editable; +import android.text.TextWatcher; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.EditText; +import android.widget.ListView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import com.mifos.mifosxdroid.R; + +import java.util.ArrayList; +import java.util.List; + +public class SearchDialog extends Dialog { + + private List mainList; + private List filterList; + private AdapterView.OnItemClickListener clickListener; + + private EditText editText; + private ListView listView; + private ArrayAdapter adapter; + + public SearchDialog(@NonNull Context context, List items, + AdapterView.OnItemClickListener clickListener) { + super(context); + this.clickListener = clickListener; + this.mainList = items; + setUp(); + } + + private void setUp() { + filterList = new ArrayList<>(); + filterList.addAll(mainList); + setContentView(0); + + adapter = new ArrayAdapter<>(getContext(), android.R.layout.simple_list_item_1, + android.R.id.text1, filterList); + listView = this.findViewById(R.id.lv_items); + editText = this.findViewById(R.id.et_drop_down_search); + editText.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { } + @Override + public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { } + @Override + public void afterTextChanged(Editable editable) { + filterList.clear(); + String text = editable.toString().toLowerCase(); + for (String s: mainList) { + if (s.toLowerCase().contains(text)) { + filterList.add(s); + } + } + adapter.notifyDataSetChanged(); + } + }); + listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView adapterView, View view, int i, long l) { + for (int pos = 0; pos < mainList.size(); pos++) { + if (mainList.get(pos).equals(filterList.get(i))) { + clickListener.onItemClick(adapterView, view, pos, l); + } + } + dismiss(); + } + }); + listView.setAdapter(adapter); + } + + @Override + public void setContentView(int layoutResID) { + layoutResID = R.layout.search_list_dialog_layout; + super.setContentView(layoutResID); + } + + @Override + @Deprecated + public void setContentView(@NonNull View view) { + super.setContentView(view); + } + + @Override + @Deprecated + public void addContentView(@NonNull View view, @Nullable ViewGroup.LayoutParams params) { + super.addContentView(view, params); + } +} diff --git a/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/collectionsheetindividual/NewIndividualCollectionSheetFragment.kt b/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/collectionsheetindividual/NewIndividualCollectionSheetFragment.kt index bdc4561201a..5de25f34c78 100644 --- a/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/collectionsheetindividual/NewIndividualCollectionSheetFragment.kt +++ b/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/collectionsheetindividual/NewIndividualCollectionSheetFragment.kt @@ -16,9 +16,12 @@ import com.mifos.mifosxdroid.core.MifosBaseActivity import com.mifos.mifosxdroid.core.MifosBaseFragment import com.mifos.mifosxdroid.core.util.Toaster import com.mifos.mifosxdroid.dialogfragments.collectionsheetdialog.CollectionSheetDialogFragment +import com.mifos.mifosxdroid.dialogfragments.searchdialog.SearchDialog import com.mifos.mifosxdroid.online.collectionsheetindividualdetails.IndividualCollectionSheetDetailsFragment import com.mifos.mifosxdroid.uihelpers.MFDatePicker import com.mifos.mifosxdroid.uihelpers.MFDatePicker.OnDatePickListener +import com.mifos.mifosxdroid.views.CustomSpinner +import com.mifos.mifosxdroid.views.CustomSpinner.OnSpinnerEventsListener import com.mifos.objects.collectionsheet.IndividualCollectionSheet import com.mifos.objects.organisation.Office import com.mifos.objects.organisation.Staff @@ -39,11 +42,11 @@ class NewIndividualCollectionSheetFragment : MifosBaseFragment(), IndividualColl @JvmField @BindView(R.id.sp_office_list) - var spOffices: Spinner? = null + var spOffices: CustomSpinner? = null @JvmField @BindView(R.id.sp_staff_list) - var spStaff: Spinner? = null + var spStaff: CustomSpinner? = null @JvmField @BindView(R.id.tv_repayment_date) @@ -72,6 +75,10 @@ class NewIndividualCollectionSheetFragment : MifosBaseFragment(), IndividualColl private var success = true private var actualDisbursementDate: String? = null private var transactionDate: String? = null + + private var officeSearchDialog: SearchDialog? = null + private var staffSearchDialog: SearchDialog? = null + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) (activity as MifosBaseActivity?)!!.activityComponent.inject(this) @@ -107,6 +114,43 @@ class NewIndividualCollectionSheetFragment : MifosBaseFragment(), IndividualColl tvRepaymentDate!!.setOnClickListener(this) btnFetchSheet!!.setOnClickListener(this) presenter!!.fetchOffices() + + spOffices!!.setSpinnerEventsListener(object : OnSpinnerEventsListener { + override fun onSpinnerOpened(spinner: Spinner, isItemListLarge: Boolean) { + if (isItemListLarge) { + enableOfficeSearch() + } + } + + override fun onSpinnerClosed(spinner: Spinner) {} + }) + + spStaff!!.setSpinnerEventsListener(object : OnSpinnerEventsListener { + override fun onSpinnerOpened(spinner: Spinner, isItemListLarge: Boolean) { + if (isItemListLarge) { + enableStaffSearch() + } + } + + override fun onSpinnerClosed(spinner: Spinner) {} + }) + + } + + fun enableOfficeSearch() { + if (officeSearchDialog == null) { + val listener = AdapterView.OnItemClickListener { adapterView, view, i, l -> spOffices!!.setSelection(i) } + officeSearchDialog = SearchDialog(requireContext(), officeNameList, listener) + } + officeSearchDialog!!.show() + } + + fun enableStaffSearch() { + if (staffSearchDialog == null) { + val listener = AdapterView.OnItemClickListener { adapterView, view, i, l -> spStaff!!.setSelection(i) } + staffSearchDialog = SearchDialog(requireContext(), staffNameList, listener) + } + staffSearchDialog!!.show() } fun setRepaymentDate() { diff --git a/mifosng-android/src/main/java/com/mifos/mifosxdroid/views/CustomSpinner.java b/mifosng-android/src/main/java/com/mifos/mifosxdroid/views/CustomSpinner.java new file mode 100644 index 00000000000..c100cb85fbc --- /dev/null +++ b/mifosng-android/src/main/java/com/mifos/mifosxdroid/views/CustomSpinner.java @@ -0,0 +1,102 @@ +package com.mifos.mifosxdroid.views; + +import android.content.Context; +import android.content.res.Resources; +import android.util.AttributeSet; +import android.widget.Spinner; + +public class CustomSpinner extends androidx.appcompat.widget.AppCompatSpinner { + + public interface OnSpinnerEventsListener { + + /** + * Callback triggered when the spinner was opened. + */ + void onSpinnerOpened(Spinner spinner, boolean isItemListLarge); + + /** + * Callback triggered when the spinner was closed. + */ + void onSpinnerClosed(Spinner spinner); + + } + + private OnSpinnerEventsListener mListener; + private boolean mOpenInitiated = false; + + @Override + public boolean performClick() { + // register that the Spinner was opened so we have a status + // indicator for when the container holding this Spinner may lose focus + mOpenInitiated = true; + if (mListener != null) { + if (super.getAdapter().getCount() >= 10) { + mListener.onSpinnerOpened(this, true); + return true; + } else { + mListener.onSpinnerOpened(this, false); + } + } + return super.performClick(); + } + + @Override + public void onWindowFocusChanged (boolean hasFocus) { + if (hasBeenOpened() && hasFocus) { + performClosedEvent(); + } + } + + /** + * Register the listener which will listen for events. + */ + public void setSpinnerEventsListener( + OnSpinnerEventsListener onSpinnerEventsListener) { + mListener = onSpinnerEventsListener; + } + + /** + * Propagate the closed Spinner event to the listener from outside if needed. + */ + public void performClosedEvent() { + mOpenInitiated = false; + if (mListener != null) { + mListener.onSpinnerClosed(this); + } + } + + + /** + * A boolean flag indicating that the Spinner triggered an open event. + * + * @return true for opened Spinner + */ + public boolean hasBeenOpened() { + return mOpenInitiated; + } + + public CustomSpinner(Context context) { + super(context); + } + + public CustomSpinner(Context context, int mode) { + super(context, mode); + } + + public CustomSpinner(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public CustomSpinner(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + public CustomSpinner(Context context, AttributeSet attrs, int defStyleAttr, int mode) { + super(context, attrs, defStyleAttr, mode); + } + + public CustomSpinner(Context context, AttributeSet attrs, + int defStyleAttr, int mode, Resources.Theme popupTheme) { + super(context, attrs, defStyleAttr, mode, popupTheme); + } +} diff --git a/mifosng-android/src/main/res/drawable/round_outline_bg.xml b/mifosng-android/src/main/res/drawable/round_outline_bg.xml new file mode 100644 index 00000000000..65a32a0a901 --- /dev/null +++ b/mifosng-android/src/main/res/drawable/round_outline_bg.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/mifosng-android/src/main/res/layout/fragment_new_collection_sheet.xml b/mifosng-android/src/main/res/layout/fragment_new_collection_sheet.xml index 3269b7b114a..6a1558b5eda 100644 --- a/mifosng-android/src/main/res/layout/fragment_new_collection_sheet.xml +++ b/mifosng-android/src/main/res/layout/fragment_new_collection_sheet.xml @@ -21,7 +21,7 @@ android:layout_marginTop="5dp" android:layout_marginBottom="10dp"/> - - + + + + + + + + \ No newline at end of file