package com.mozu.mozuandroidinstoreassistant.app.customer; import android.app.Fragment; import android.app.LoaderManager; import android.app.SearchManager; import android.content.Context; import android.content.Loader; import android.database.MatrixCursor; import android.os.Bundle; import android.support.v4.widget.SwipeRefreshLayout; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.AbsListView; import android.widget.AdapterView; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.SearchView; import android.widget.TextView; import com.mozu.api.contracts.customer.CustomerAccount; import com.mozu.mozuandroidinstoreassistant.app.MainActivity; import com.mozu.mozuandroidinstoreassistant.app.R; import com.mozu.mozuandroidinstoreassistant.app.adapters.SearchSuggestionsCursorAdapter; import com.mozu.mozuandroidinstoreassistant.app.customer.adapters.CustomersAdapter; import com.mozu.mozuandroidinstoreassistant.app.customer.loaders.CustomersLoader; import com.mozu.mozuandroidinstoreassistant.app.models.RecentSearch; import com.mozu.mozuandroidinstoreassistant.app.models.UserPreferences; import com.mozu.mozuandroidinstoreassistant.app.models.authentication.UserAuthenticationStateMachine; import com.mozu.mozuandroidinstoreassistant.app.models.authentication.UserAuthenticationStateMachineProducer; import java.util.ArrayList; import java.util.List; import butterknife.ButterKnife; import butterknife.InjectView; import butterknife.OnClick; public class CustomersFragment extends Fragment implements LoaderManager.LoaderCallbacks<List<CustomerAccount>>, AbsListView.OnScrollListener, SearchView.OnQueryTextListener, SearchView.OnCloseListener, SearchManager.OnCancelListener, SearchManager.OnDismissListener, SearchView.OnSuggestionListener, MenuItem.OnActionExpandListener, AdapterView.OnItemClickListener, SwipeRefreshLayout.OnRefreshListener { private static final int MAX_NUMBER_OF_ORDER_SEARCHES = 200; private static final String CURRENT_SORT_COLUMN_EXTRA = "currensortcolumnextra"; private static final int LOADER_CUSTOMERS = 522; @InjectView(R.id.customer_list_container) SwipeRefreshLayout mCustomerRefreshLayout; @InjectView(R.id.customer_list) ListView mCustomersList; @InjectView(R.id.customer_list_progress) LinearLayout mProgress; @InjectView(R.id.customer_number_header) TextView mCustomerNumberHeader; @InjectView(R.id.customer_last_name_header) TextView mCustomerLastNameHeader; @InjectView(R.id.customer_first_name_header) TextView mcCustomerFirstNameHeader; @InjectView(R.id.customer_email_header) TextView mCustomerEmailHeader; @InjectView(R.id.customer_lifetime_value_header) TextView mCustomerLifetimeValueHeader; @InjectView(R.id.customer_number_header_sort_image) ImageView mCustomerNumberHeaderSortImage; @InjectView(R.id.customer_last_name_header_sort_image) ImageView mCustomerLastNameHeaderSortImage; @InjectView(R.id.customer_first_name_sort_image) ImageView mCustomerFirstNameHeaderSortImage; @InjectView(R.id.customer_status_header_email_image) ImageView mCustomerEmailHeaderSortImage; @InjectView(R.id.customer_lifetime_value_header_sort_image) ImageView mCustomerLifetimeValueHeaderSortImage; @InjectView(R.id.customers_header) LinearLayout mCustomerHeaderLayout; @InjectView(R.id.customer_search_query) TextView mCustomerSearchQuery; @InjectView(android.R.id.empty) TextView mEmptyMsg; private Integer mTenantId; private Integer mSiteId; private CustomersLoader mCustomersLoader; private CustomersAdapter mAdapter; private SearchView mSearchView; private MenuItem mSearchMenuItem; private CustomerListener mListener; private String mCurrentSearch; private int mResourceOfCurrentSelectedColumn = -1; private String mDefaultSearchQuery; private boolean mLaunchedFromSearch; public CustomersFragment() { setRetainInstance(true); setHasOptionsMenu(true); } public void setLauncedFromSearch() { mLaunchedFromSearch = true; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_customer, container, false); ButterKnife.inject(this, view); mCustomerRefreshLayout.setEnabled(false); mCustomerRefreshLayout.setOnRefreshListener(this); mCustomerRefreshLayout.setColorScheme(R.color.first_color_swipe_refresh, R.color.second_color_swipe_refresh, R.color.third_color_swipe_refresh, R.color.fourth_color_swipe_refresh); mCustomerRefreshLayout.setRefreshing(true); getLoaderManager().initLoader(LOADER_CUSTOMERS, null, this).forceLoad(); mCustomersList.setOnItemClickListener(this); if (savedInstanceState != null) { mResourceOfCurrentSelectedColumn = savedInstanceState.getInt(CURRENT_SORT_COLUMN_EXTRA, -1); } if (mResourceOfCurrentSelectedColumn != -1) { initializeSortColumn(); } if (mLaunchedFromSearch) { mCustomerRefreshLayout.setEnabled(false); setHasOptionsMenu(false); mCustomerHeaderLayout.setVisibility(View.VISIBLE); if (!TextUtils.isEmpty(mDefaultSearchQuery)) { mCustomerSearchQuery.setText(mDefaultSearchQuery); } } return view; } @Override public void onSaveInstanceState(Bundle outState) { outState.putInt(CURRENT_SORT_COLUMN_EXTRA, mResourceOfCurrentSelectedColumn); super.onSaveInstanceState(outState); } @Override public void onHiddenChanged(boolean hidden) { super.onHiddenChanged(hidden); if (!hidden) { ((MainActivity) getActivity()).setCustomersSelected(); } } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.customers, menu); // Get the SearchView and set the searchable configuration SearchManager searchManager = (SearchManager) getActivity().getSystemService(Context.SEARCH_SERVICE); mSearchMenuItem = menu.findItem(R.id.action_search); mSearchView = (SearchView) mSearchMenuItem.getActionView(); mSearchView.setOnQueryTextListener(this); mSearchView.setSearchableInfo(searchManager.getSearchableInfo(getActivity().getComponentName())); mSearchView.setOnCloseListener(this); mSearchView.setQueryHint(getString(R.string.customer_search_hint_text)); mSearchView.setMaxWidth(1500); if (!TextUtils.isEmpty(mCurrentSearch)) { mSearchView.post(new Runnable() { @Override public void run() { mSearchView.setQuery(mCurrentSearch, false); } }); } mSearchMenuItem.setOnActionExpandListener(this); searchManager.setOnCancelListener(this); searchManager.setOnDismissListener(this); } @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == R.id.action_search) { initSuggestions(); } else if (item.getItemId() == R.id.refresh_customers) { onRefresh(); } return super.onOptionsItemSelected(item); } private void initSuggestions() { UserPreferences prefs = UserAuthenticationStateMachineProducer.getInstance(getActivity()).getCurrentUsersPreferences(); List<RecentSearch> recentCustomerSearches = prefs.getRecentCustomerSearches(); // Load data from list to cursor String[] columns = new String[]{"_id", "text"}; Object[] temp = new Object[]{0, "default"}; MatrixCursor cursor = new MatrixCursor(columns); for (int i = 0; i < recentCustomerSearches.size(); i++) { temp[0] = i; temp[1] = recentCustomerSearches.get(i); cursor.addRow(temp); } mSearchView.setSuggestionsAdapter(new SearchSuggestionsCursorAdapter(getActivity(), cursor, recentCustomerSearches)); mSearchView.setOnSuggestionListener(this); } private void saveSearchToList(String query) { UserAuthenticationStateMachine userState = UserAuthenticationStateMachineProducer.getInstance(getActivity()); //save search to list UserPreferences prefs = userState.getCurrentUsersPreferences(); List<RecentSearch> recentCustomerSearches = prefs.getRecentCustomerSearches(); if (recentCustomerSearches == null) { recentCustomerSearches = new ArrayList<RecentSearch>(); } //if search already exists then dont add it again for (int i = 0; i < recentCustomerSearches.size(); i++) { if (recentCustomerSearches.get(i).getSearchTerm().equalsIgnoreCase(query)) { recentCustomerSearches.remove(i); break; } } RecentSearch search = new RecentSearch(); search.setSearchTerm(query); recentCustomerSearches.add(0, search); if (recentCustomerSearches.size() > MAX_NUMBER_OF_ORDER_SEARCHES) { recentCustomerSearches.remove(recentCustomerSearches.size() - 1); } prefs.setRecentCustomerSearchs(recentCustomerSearches); userState.updateUserPreferences(); } public void setTenantId(Integer tenantId) { mTenantId = tenantId; } public void setSiteId(Integer siteId) { mSiteId = siteId; } @Override public Loader<List<CustomerAccount>> onCreateLoader(int id, Bundle args) { CustomersLoader loader = new CustomersLoader(getActivity(), mTenantId, mSiteId); if (!TextUtils.isEmpty(mDefaultSearchQuery)) { loader.setFilter(mDefaultSearchQuery); } return loader; } @Override public void onLoadFinished(Loader<List<CustomerAccount>> loader, List<CustomerAccount> data) { mCustomerRefreshLayout.setRefreshing(false); if (data.size() <= 0) { mEmptyMsg.setVisibility(View.VISIBLE); } else { mEmptyMsg.setVisibility(View.GONE); } if (loader.getId() == LOADER_CUSTOMERS) { if (mAdapter == null) { mAdapter = new CustomersAdapter(getActivity()); } mAdapter.clear(); mAdapter.addAll(data); if (mCustomersList.getAdapter() == null) { mCustomersList.setAdapter(mAdapter); } mCustomersList.setOnScrollListener(this); mProgress.setVisibility(View.GONE); mCustomersList.setVisibility(View.VISIBLE); mAdapter.notifyDataSetChanged(); } } @Override public void onLoaderReset(Loader<List<CustomerAccount>> loader) { } @Override public void onScrollStateChanged(AbsListView view, int scrollState) { } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { //if the user has scrolled half way through the list and we can load more, then load more if (firstVisibleItem + visibleItemCount > totalItemCount / 2 && getcCustomersLoader() != null && mCustomersLoader.hasMoreResults() && !mCustomersLoader.isLoading()) { getcCustomersLoader().forceLoad(); } } private CustomersLoader getcCustomersLoader() { if (mCustomersLoader == null) { Loader<List<CustomerAccount>> loader = getLoaderManager().getLoader(LOADER_CUSTOMERS); mCustomersLoader = (CustomersLoader) loader; } return mCustomersLoader; } public void setDefaultSearchQuery(String searchQuery) { mDefaultSearchQuery = searchQuery; } @Override public boolean onQueryTextSubmit(String query) { mSearchView.clearFocus(); mCurrentSearch = query; saveSearchToList(query); initSuggestions(); getcCustomersLoader().reset(); getcCustomersLoader().setFilter(query); getcCustomersLoader().startLoading(); getcCustomersLoader().forceLoad(); mCustomerRefreshLayout.setRefreshing(true); return false; } @Override public boolean onQueryTextChange(String newText) { return false; } @Override public boolean onClose() { clearSearchReload(); mCurrentSearch = null; return true; } @Override public void onCancel() { clearSearchReload(); } @Override public void onDismiss() { clearSearchReload(); } private void clearSearchReload() { getcCustomersLoader().removeFilter(); getcCustomersLoader().reset(); getcCustomersLoader().startLoading(); getcCustomersLoader().forceLoad(); mCustomerRefreshLayout.setRefreshing(true); } @Override public boolean onMenuItemActionExpand(MenuItem item) { return true; } @Override public boolean onMenuItemActionCollapse(MenuItem item) { clearSearchReload(); mCurrentSearch = null; return true; } @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { if (mSearchView != null) { mSearchView.setQuery("", false); } mListener.customerSelected((CustomerAccount) mCustomersList.getAdapter().getItem(position)); } public void setListener(CustomerListener listener) { mListener = listener; } @OnClick({R.id.customer_number_header, R.id.customer_last_name_header, R.id.customer_first_name_header, R.id.customer_email_header, R.id.customer_lifetime_value_header}) public void determineSortActionForView(View v) { setTextViewNormalStyle(mCustomerNumberHeader); setTextViewNormalStyle(mCustomerLastNameHeader); setTextViewNormalStyle(mCustomerEmailHeader); setTextViewNormalStyle(mcCustomerFirstNameHeader); setTextViewNormalStyle(mCustomerLifetimeValueHeader); mCustomerNumberHeaderSortImage.setVisibility(View.INVISIBLE); mCustomerLastNameHeaderSortImage.setVisibility(View.INVISIBLE); mCustomerFirstNameHeaderSortImage.setVisibility(View.INVISIBLE); mCustomerEmailHeaderSortImage.setVisibility(View.INVISIBLE); mCustomerLifetimeValueHeaderSortImage.setVisibility(View.INVISIBLE); if (v.getId() == mCustomerNumberHeader.getId()) { getcCustomersLoader().customerByNumber(); setTextViewBoldStyle(mCustomerNumberHeader); mResourceOfCurrentSelectedColumn = mCustomerNumberHeader.getId(); if (getcCustomersLoader().isSortAsc()) { mCustomerNumberHeaderSortImage.setImageResource(R.drawable.icon_sort_up); } else { mCustomerNumberHeaderSortImage.setImageResource(R.drawable.icon_sort_down); } mCustomerNumberHeaderSortImage.setVisibility(View.VISIBLE); } else if (v.getId() == mCustomerLastNameHeader.getId()) { return; // getcCustomersLoader().customerByLastName(); // setTextViewBoldStyle(mCustomerLastNameHeader); // mResourceOfCurrentSelectedColumn = mCustomerLastNameHeader.getId(); // mCustomerLastNameHeaderSortImage.setVisibility(View.VISIBLE); // if(getcCustomersLoader().isSortAsc()){ // mCustomerLastNameHeaderSortImage.setImageResource(R.drawable.icon_sort_up); // }else{ // mCustomerLastNameHeaderSortImage.setImageResource(R.drawable.icon_sort_down); // } } else if (v.getId() == mCustomerEmailHeader.getId()) { return; // getcCustomersLoader().customerByEmail(); // setTextViewBoldStyle(mCustomerEmailHeader); // mResourceOfCurrentSelectedColumn = mCustomerEmailHeader.getId(); // mCustomerEmailHeaderSortImage.setVisibility(View.VISIBLE); // if(getcCustomersLoader().isSortAsc()){ // mCustomerEmailHeaderSortImage.setImageResource(R.drawable.icon_sort_up); // }else{ // mCustomerEmailHeaderSortImage.setImageResource(R.drawable.icon_sort_down); // } } else if (v.getId() == mcCustomerFirstNameHeader.getId()) { return; // getcCustomersLoader().customerByFirstName(); // setTextViewBoldStyle(mcCustomerFirstNameHeader); // mResourceOfCurrentSelectedColumn = mcCustomerFirstNameHeader.getId(); // mCustomerFirstNameHeaderSortImage.setVisibility(View.VISIBLE); // if(getcCustomersLoader().isSortAsc()){ // mCustomerFirstNameHeaderSortImage.setImageResource(R.drawable.icon_sort_up); // }else{ // mCustomerFirstNameHeaderSortImage.setImageResource(R.drawable.icon_sort_down); // } } else if (v.getId() == mCustomerLifetimeValueHeader.getId()) { getcCustomersLoader().customerByTotal(); setTextViewBoldStyle(mCustomerLifetimeValueHeader); mResourceOfCurrentSelectedColumn = mCustomerLifetimeValueHeader.getId(); mCustomerLifetimeValueHeaderSortImage.setVisibility(View.VISIBLE); if (getcCustomersLoader().isSortAsc()) { mCustomerLifetimeValueHeaderSortImage.setImageResource(R.drawable.icon_sort_up); } else { mCustomerLifetimeValueHeaderSortImage.setImageResource(R.drawable.icon_sort_down); } } else { // if the view wasn't a sort column we don't need to do anyting else return; } clearSearchReload(); } private void initializeSortColumn() { setTextViewNormalStyle(mCustomerNumberHeader); setTextViewNormalStyle(mCustomerLastNameHeader); setTextViewNormalStyle(mCustomerEmailHeader); setTextViewNormalStyle(mcCustomerFirstNameHeader); setTextViewNormalStyle(mCustomerLifetimeValueHeader); mCustomerNumberHeaderSortImage.setVisibility(View.INVISIBLE); mCustomerLastNameHeaderSortImage.setVisibility(View.INVISIBLE); mCustomerFirstNameHeaderSortImage.setVisibility(View.INVISIBLE); mCustomerEmailHeaderSortImage.setVisibility(View.INVISIBLE); mCustomerLifetimeValueHeaderSortImage.setVisibility(View.INVISIBLE); if (mResourceOfCurrentSelectedColumn == mCustomerNumberHeader.getId()) { setTextViewBoldStyle(mCustomerNumberHeader); mCustomerNumberHeaderSortImage.setVisibility(View.VISIBLE); } else if (mResourceOfCurrentSelectedColumn == mCustomerLastNameHeader.getId()) { setTextViewBoldStyle(mCustomerLastNameHeader); mCustomerLastNameHeaderSortImage.setVisibility(View.VISIBLE); } else if (mResourceOfCurrentSelectedColumn == mCustomerEmailHeader.getId()) { setTextViewBoldStyle(mCustomerEmailHeader); mCustomerEmailHeaderSortImage.setVisibility(View.VISIBLE); } else if (mResourceOfCurrentSelectedColumn == mcCustomerFirstNameHeader.getId()) { setTextViewBoldStyle(mcCustomerFirstNameHeader); mCustomerFirstNameHeaderSortImage.setVisibility(View.VISIBLE); } else if (mResourceOfCurrentSelectedColumn == mCustomerLifetimeValueHeader.getId()) { setTextViewBoldStyle(mCustomerLifetimeValueHeader); mCustomerLifetimeValueHeaderSortImage.setVisibility(View.VISIBLE); } } private void setTextViewBoldStyle(TextView textView) { textView.setTextAppearance(getActivity(), R.style.boldText); textView.setBackgroundResource(android.R.color.transparent); } private void setTextViewNormalStyle(TextView textView) { textView.setTextAppearance(getActivity(), R.style.normalText); textView.setBackgroundResource(android.R.color.transparent); } @Override public boolean onSuggestionSelect(int position) { return true; } @Override public boolean onSuggestionClick(int position) { UserAuthenticationStateMachine userState = UserAuthenticationStateMachineProducer.getInstance(getActivity()); UserPreferences prefs = userState.getCurrentUsersPreferences(); List<RecentSearch> recentProductSearches = prefs.getRecentCustomerSearches(); if (recentProductSearches.size() > 0) { String searchTerm = recentProductSearches.get(position).getSearchTerm(); mSearchView.setQuery(searchTerm, false); onQueryTextSubmit(searchTerm); } else { initSuggestions(); } return true; } @Override public void onRefresh() { mSearchMenuItem.collapseActionView(); mCustomerRefreshLayout.setRefreshing(true); clearSearchReload(); } }