This is an automated email from the ASF dual-hosted git repository. rajanmaurya154 pushed a commit to branch development in repository https://gitbox.apache.org/repos/asf/fineract-cn-mobile.git
The following commit(s) were added to refs/heads/development by this push: new df7c062 feat: search customer df7c062 is described below commit df7c062623562a85699d365c8bf5fb1f7b6c0a97 Author: Mohak <mohakpuri1...@gmail.com> AuthorDate: Fri Jun 22 12:56:07 2018 +0530 feat: search customer --- .../customers/customerlist/CustomersContract.java | 4 + .../customers/customerlist/CustomersFragment.java | 96 +++++++++++++++++++- .../customers/customerlist/CustomersPresenter.java | 27 ++++++ app/src/main/res/layout/fragment_customer_list.xml | 93 +++++++++++++++---- app/src/main/res/menu/menu_customer.xml | 12 +++ app/src/main/res/values/strings.xml | 5 ++ app/src/main/resources/customerPage.json | 100 ++++++++++++++++++++- 7 files changed, 314 insertions(+), 23 deletions(-) diff --git a/app/src/main/java/org/apache/fineract/ui/online/customers/customerlist/CustomersContract.java b/app/src/main/java/org/apache/fineract/ui/online/customers/customerlist/CustomersContract.java index f4464d9..740b44d 100644 --- a/app/src/main/java/org/apache/fineract/ui/online/customers/customerlist/CustomersContract.java +++ b/app/src/main/java/org/apache/fineract/ui/online/customers/customerlist/CustomersContract.java @@ -28,6 +28,8 @@ public interface CustomersContract { void hideProgressbar(); void showMessage(String message); + + void searchCustomerList(Customer searchedCustomer); } interface Presenter { @@ -37,5 +39,7 @@ public interface CustomersContract { void fetchCustomers(Integer pageIndex, Integer size); void showCustomers(List<Customer> customers); + + void searchCustomerOnline(String query); } } diff --git a/app/src/main/java/org/apache/fineract/ui/online/customers/customerlist/CustomersFragment.java b/app/src/main/java/org/apache/fineract/ui/online/customers/customerlist/CustomersFragment.java index 9aa2e19..36e0edf 100644 --- a/app/src/main/java/org/apache/fineract/ui/online/customers/customerlist/CustomersFragment.java +++ b/app/src/main/java/org/apache/fineract/ui/online/customers/customerlist/CustomersFragment.java @@ -2,15 +2,26 @@ package org.apache.fineract.ui.online.customers.customerlist; import static android.app.Activity.RESULT_OK; +import android.app.SearchManager; +import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.support.annotation.Nullable; +import android.support.design.widget.CoordinatorLayout; +import android.support.transition.TransitionManager; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; +import android.support.v7.widget.SearchView; +import android.text.TextUtils; import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.LinearLayout; +import android.widget.RadioButton; +import android.widget.RadioGroup; import com.github.therajanmaurya.sweeterror.SweetUIErrorHandler; @@ -28,6 +39,7 @@ import org.apache.fineract.ui.online.customers.customerdetails.CustomerDetailsAc import org.apache.fineract.utils.ConstantKeys; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import javax.inject.Inject; @@ -38,7 +50,7 @@ import butterknife.OnClick; /** * @author Rajan Maurya - * On 20/06/17. + * On 20/06/17. */ public class CustomersFragment extends FineractBaseFragment implements CustomersContract.View, SwipeRefreshLayout.OnRefreshListener, OnItemClickListener { @@ -65,6 +77,21 @@ public class CustomersFragment extends FineractBaseFragment implements Customers @Inject PreferencesHelper preferencesHelper; + @BindView(R.id.rb_offline) + RadioButton rbOffline; + + @BindView(R.id.rb_online) + RadioButton rbOnline; + + @BindView(R.id.rg_search) + RadioGroup rgSearch; + + @BindView(R.id.coordinator) + CoordinatorLayout coordinator; + + @BindView(R.id.ll_search) + LinearLayout llSearch; + private List<Customer> customers; private Integer detailsCustomerPosition; private boolean isNewCustomer = false; @@ -81,6 +108,7 @@ public class CustomersFragment extends FineractBaseFragment implements Customers public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); customers = new ArrayList<>(); + setHasOptionsMenu(true); } @Override @@ -193,6 +221,11 @@ public class CustomersFragment extends FineractBaseFragment implements Customers } @Override + public void searchCustomerList(Customer customer) { + customerAdapter.setCustomers(Collections.singletonList(customer)); + } + + @Override public void showNoInternetConnection() { showRecyclerView(false); showFineractNoInternetUI(); @@ -215,6 +248,67 @@ public class CustomersFragment extends FineractBaseFragment implements Customers } @Override + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + super.onCreateOptionsMenu(menu, inflater); + inflater.inflate(R.menu.menu_customer, menu); + setUpSearchInterface(menu); + } + + private void setUpSearchInterface(Menu menu) { + + SearchManager manager = (SearchManager) getActivity(). + getSystemService(Context.SEARCH_SERVICE); + SearchView searchView = (SearchView) menu.findItem( + R.id.menu_customer_search).getActionView(); + searchView.setSearchableInfo(manager.getSearchableInfo(getActivity().getComponentName())); + + searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { + @Override + public boolean onQueryTextSubmit(String query) { + findCustomer(query); + return false; + } + + @Override + public boolean onQueryTextChange(String newText) { + if(TextUtils.isEmpty(newText)){ + customerAdapter.setCustomers(customers); + } + + return false; + } + }); + + searchView.setOnSearchClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + TransitionManager.beginDelayedTransition(coordinator); + llSearch.setVisibility(View.VISIBLE); + } + }); + + searchView.setOnCloseListener(new SearchView.OnCloseListener() { + @Override + public boolean onClose() { + rgSearch.clearCheck(); + TransitionManager.beginDelayedTransition(coordinator); + llSearch.setVisibility(View.GONE); + return false; + } + }); + } + + private void findCustomer(String query) { + + if (rgSearch.getCheckedRadioButtonId() == -1) { + Toaster.show(swipeRefreshLayout,getString(R.string.error_finding_customer_options), Toaster.SHORT); + }else if (rbOnline.isChecked()) { + customerPresenter.searchCustomerOnline(query); + } + } + + + @Override public void onItemClick(View childView, int position) { detailsCustomerPosition = position; Intent customerDetailsIntent = new Intent(getActivity(), CustomerDetailsActivity.class); diff --git a/app/src/main/java/org/apache/fineract/ui/online/customers/customerlist/CustomersPresenter.java b/app/src/main/java/org/apache/fineract/ui/online/customers/customerlist/CustomersPresenter.java index 3fa1415..c49c7a3 100644 --- a/app/src/main/java/org/apache/fineract/ui/online/customers/customerlist/CustomersPresenter.java +++ b/app/src/main/java/org/apache/fineract/ui/online/customers/customerlist/CustomersPresenter.java @@ -111,4 +111,31 @@ public class CustomersPresenter extends BasePresenter<CustomersContract.View> getMvpView().showCustomers(customers); } } + + @Override + public void searchCustomerOnline(String query) { + checkViewAttached(); + getMvpView().showProgressbar(); + compositeDisposable.add( + dataManagerCustomer.fetchCustomer(query) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribeWith(new DisposableObserver<Customer>(){ + @Override + public void onNext(Customer value) { + getMvpView().hideProgressbar(); + getMvpView().searchCustomerList(value); + } + + @Override + public void onError(Throwable e) { + showExceptionError(e,context.getString(R.string.error_finding_customer)); + } + + @Override + public void onComplete() { + + } + })); + } } diff --git a/app/src/main/res/layout/fragment_customer_list.xml b/app/src/main/res/layout/fragment_customer_list.xml index c91f325..01afc76 100644 --- a/app/src/main/res/layout/fragment_customer_list.xml +++ b/app/src/main/res/layout/fragment_customer_list.xml @@ -1,23 +1,80 @@ <?xml version="1.0" encoding="utf-8"?> -<android.support.design.widget.CoordinatorLayout - xmlns:android="http://schemas.android.com/apk/res/android" +<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" - android:layout_height="match_parent" - android:layout_width="match_parent"> - - <android.support.v4.widget.SwipeRefreshLayout - android:id="@+id/swipe_container" - android:layout_height="match_parent" - android:layout_width="match_parent"> - - <android.support.v7.widget.RecyclerView - android:id="@+id/rv_customers" - android:layout_centerHorizontal="true" - android:layout_height="0dp" - android:layout_marginBottom="@dimen/layout_padding_30dp" - android:layout_weight="1" - android:layout_width="wrap_content"/> - </android.support.v4.widget.SwipeRefreshLayout> + android:id="@+id/coordinator" + android:layout_width="match_parent" + android:layout_height="match_parent"> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical"> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:id="@+id/ll_search" + android:visibility="gone" + android:orientation="vertical"> + + <RadioGroup + android:id="@+id/rg_search" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="horizontal" + android:padding="@dimen/layout_padding_16dp"> + + <RadioButton + android:id="@+id/rb_online" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_weight="1" + android:text="@string/online" + android:layout_marginStart="@dimen/layout_padding_10dp" + android:layout_marginLeft="@dimen/layout_padding_10dp" /> + + <View + android:layout_width="1dp" + android:layout_height="match_parent" + android:layout_gravity="center" + android:background="#E7DFDF"/> + + <RadioButton + android:id="@+id/rb_offline" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_weight="1" + android:text="@string/offline" + android:layout_marginStart="@dimen/layout_padding_10dp" + android:layout_marginLeft="@dimen/layout_padding_10dp" /> + + + </RadioGroup> + + <View + android:background="#cbcbcb" + android:layout_height="1dp" + android:layout_width="match_parent" + android:layout_marginBottom="@dimen/layout_padding_10dp"/> + + </LinearLayout> + + + <android.support.v4.widget.SwipeRefreshLayout + android:id="@+id/swipe_container" + android:layout_width="match_parent" + android:layout_height="match_parent"> + + <android.support.v7.widget.RecyclerView + android:id="@+id/rv_customers" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_marginBottom="@dimen/layout_padding_30dp" /> + + + </android.support.v4.widget.SwipeRefreshLayout> + + </LinearLayout> <include layout="@layout/layout_sweet_exception_handler" diff --git a/app/src/main/res/menu/menu_customer.xml b/app/src/main/res/menu/menu_customer.xml new file mode 100644 index 0000000..031010d --- /dev/null +++ b/app/src/main/res/menu/menu_customer.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<menu xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:android="http://schemas.android.com/apk/res/android"> + + <item + android:id="@+id/menu_customer_search" + android:icon="@drawable/ic_search_black_24dp" + android:title="@string/search_customer" + app:showAsAction="always" + app:actionViewClass="android.support.v7.widget.SearchView"/> + +</menu> \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c969f51..92ef199 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -179,6 +179,9 @@ <string name="loan_last_modified_by">%1$s %2$s</string> <string name="loan_created_by">%1$s %2$s</string> <string name="search_beneficiary">Search beneficiary</string> + <string name="search_customer">Search customer</string> + <string name="online">Online</string> + <string name="offline">Offline</string> <string name="select_product">Select product</string> <string name="no_beneficiary">No beneficiaries</string> <string name="activities_created_by_on">%1$s, %2$s</string> @@ -246,6 +249,8 @@ <!--Error Message--> <string name="error_loading_customers">Error loading customers</string> + <string name="error_finding_customer">Error finding customer</string> + <string name="error_finding_customer_options">Select at least one option</string> <string name="error_loading_customer_loans">Error loading customer loans</string> <string name="error_loading_customer_loan_details">Error loading loan details</string> <string name="error_loading_deposit_details">Error loading deposit details</string> diff --git a/app/src/main/resources/customerPage.json b/app/src/main/resources/customerPage.json index 59f3aa3..eda4821 100644 --- a/app/src/main/resources/customerPage.json +++ b/app/src/main/resources/customerPage.json @@ -3,9 +3,101 @@ { "identifier": "identifier", "type": "type", - "givenName": "givenName", - "middleName": "middleName", - "surname": "surname", + "givenName": "givenName1", + "middleName": "middleName1", + "surname": "surname1", + "dateOfBirth": { + "year": 1985, + "month": 11, + "day": 27 + }, + "member": false, + "accountBeneficiary": "accountBeneficiary", + "referenceCustomer": "referenceCustomer", + "assignedOffice": "assignedOffice", + "assignedEmployee": "assignedEmployee", + "address": { + "street": "street", + "city": "city", + "region": "region", + "postalCode": "postalCode", + "countryCode": "countryCode", + "country": "country" + }, + "contactDetails": [ + { + "type": "EMAIL", + "group": "BUSINESS", + "value": "value", + "preferenceLevel": 1, + "validated": false + }, + { + "type": "EMAIL", + "group": "BUSINESS", + "value": "value", + "preferenceLevel": 1, + "validated": false + } + ], + "currentState": "ACTIVE", + "createdBy": "createdBy", + "createdOn": "createdOn", + "lastModifiedBy": "lastModifiedBy", + "lastModifiedOn": "lastModifiedOn" + }, + { + "identifier": "identifier2", + "type": "type", + "givenName": "givenName2", + "middleName": "middleName2", + "surname": "surname2", + "dateOfBirth": { + "year": 1985, + "month": 11, + "day": 27 + }, + "member": false, + "accountBeneficiary": "accountBeneficiary", + "referenceCustomer": "referenceCustomer", + "assignedOffice": "assignedOffice", + "assignedEmployee": "assignedEmployee", + "address": { + "street": "street", + "city": "city", + "region": "region", + "postalCode": "postalCode", + "countryCode": "countryCode", + "country": "country" + }, + "contactDetails": [ + { + "type": "EMAIL", + "group": "BUSINESS", + "value": "value", + "preferenceLevel": 1, + "validated": false + }, + { + "type": "EMAIL", + "group": "BUSINESS", + "value": "value", + "preferenceLevel": 1, + "validated": false + } + ], + "currentState": "ACTIVE", + "createdBy": "createdBy", + "createdOn": "createdOn", + "lastModifiedBy": "lastModifiedBy", + "lastModifiedOn": "lastModifiedOn" + }, + { + "identifier": "identifier3", + "type": "type", + "givenName": "givenName3", + "middleName": "middleName3", + "surname": "surname3", "dateOfBirth": { "year": 1985, "month": 11, @@ -48,5 +140,5 @@ } ], "totalPages": 1, - "totalElements": 1 + "totalElements": 3 } \ No newline at end of file