package com.mozu.mozuandroidinstoreassistant.app.category;
import android.app.Activity;
import android.app.Fragment;
import android.app.SearchManager;
import android.content.Context;
import android.database.MatrixCursor;
import android.os.Bundle;
import android.support.v4.widget.SwipeRefreshLayout;
import android.util.Log;
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.AdapterView;
import android.widget.GridView;
import android.widget.ListView;
import android.widget.SearchView;
import android.widget.TextView;
import android.widget.Toast;
import com.mozu.api.contracts.productruntime.Category;
import com.mozu.mozuandroidinstoreassistant.app.BuildConfig;
import com.mozu.mozuandroidinstoreassistant.app.MainActivity;
import com.mozu.mozuandroidinstoreassistant.app.R;
import com.mozu.mozuandroidinstoreassistant.app.adapters.SearchSuggestionsCursorAdapter;
import com.mozu.mozuandroidinstoreassistant.app.category.adapters.CategoryAdapter;
import com.mozu.mozuandroidinstoreassistant.app.category.loaders.CategoryFetcher;
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 com.mozu.mozuandroidinstoreassistant.app.tasks.CategoryImageUpdateListener;
import com.mozu.mozuandroidinstoreassistant.app.tasks.CategoryImageUpdateTask;
import java.util.ArrayList;
import java.util.List;
import butterknife.ButterKnife;
import butterknife.InjectView;
import rx.Observable;
import rx.android.observables.AndroidObservable;
import rx.functions.Func1;
import rx.schedulers.Schedulers;
public class CategoryFragment extends Fragment implements AdapterView.OnItemClickListener, SearchView.OnQueryTextListener, SearchView.OnSuggestionListener, SwipeRefreshLayout.OnRefreshListener {
public static final int MAX_NUMBER_OF_SEARCHES = 5;
private static final int CATEGORY_IMAGELOADER_MENU_ID = 100;
private static final String CURRENT_CATEGORY = "currentCategory" ;
@InjectView(R.id.category_grid) GridView mGridOfCategories;
@InjectView(R.id.category_list) ListView mListOfCategories;
private UserAuthenticationStateMachine mUserState;
private CategoryAdapter mCategoryAdapter;
private Category mCategory;
private CategoryFragmentListener mListener = sCategoryListener;
private boolean mIsGridVisible = true;
private MenuItem mToggleGridItem;
private SearchView mSearchView;
private MenuItem mSearchMenuItem;
private rx.Observable<List<Category>> mCategoryObservable;
@InjectView(R.id.empty_list) TextView mEmptyListMessageView;
@InjectView(R.id.category_container) SwipeRefreshLayout mCategoryPullToRefresh;
public static CategoryFragment getInstance(Category category){
CategoryFragment fragment = new CategoryFragment();
Bundle bundle = new Bundle();
bundle.putSerializable(CURRENT_CATEGORY, category);
fragment.setArguments(bundle);
return fragment;
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
mListener = (CategoryFragmentListener) activity;
}
@Override
public void onDetach() {
mListener = sCategoryListener;
super.onDetach();
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putSerializable(CURRENT_CATEGORY,mCategory);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle b = getArguments();
mCategory = (Category) b.getSerializable(CURRENT_CATEGORY);
mUserState = UserAuthenticationStateMachineProducer.getInstance(getActivity());
CategoryFetcher categoryFetcher = new CategoryFetcher();
mCategoryObservable = AndroidObservable.bindFragment(this, categoryFetcher.getCategoryInformation(mUserState.getTenantId(),mUserState.getSiteId()));
setRetainInstance(true);
setHasOptionsMenu(true);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if (savedInstanceState != null) {
mCategory = (Category) savedInstanceState.getSerializable(CURRENT_CATEGORY);
}
if (mCategory == null || mCategory.getChildrenCategories().size() < 1) {
reloadData();
} else {
updateListGridsToCategory(mCategory.getChildrenCategories());
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View fragmentView = inflater.inflate(R.layout.fragment_category_product_grid, container, false);
ButterKnife.inject(this, fragmentView);
mGridOfCategories.setOnItemClickListener(this);
mListOfCategories.setOnItemClickListener(this);
mListOfCategories.setDivider(null);
mEmptyListMessageView.setVisibility(View.GONE);
mCategoryPullToRefresh.setOnRefreshListener(this);
mCategoryPullToRefresh.setEnabled(false);
mCategoryPullToRefresh.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);
return fragmentView;
}
public void reloadData(){
mCategoryPullToRefresh.setRefreshing(true);
mCategoryObservable.subscribeOn(Schedulers.io())
.flatMap(new Func1<List<Category>, Observable<Category>>() {
@Override
public Observable<Category> call(List<Category> categories) {
return Observable.from(categories);
}
}).filter(new Func1<Category, Boolean>() {
@Override
public Boolean call(Category category) {
if (mCategory == null) {
return true;
}
return mCategory.getCategoryId().equals(category.getCategoryId());
}
})
.subscribe(new CategorySubscriber());
}
@Override
public void onHiddenChanged(boolean hidden) {
super.onHiddenChanged(hidden);
if (!hidden) {
((MainActivity)getActivity()).setProductSelected();
}
}
@Override
public void onRefresh() {
reloadData();
}
private class CategorySubscriber implements rx.Observer<Category> {
List<Category> categoryList = new ArrayList<Category>();
@Override
public void onCompleted() {
if (mCategoryPullToRefresh.isRefreshing()) {
mCategoryPullToRefresh.setRefreshing(false);
}
updateListGridsToCategory(categoryList);
}
@Override
public void onError(Throwable e) {
mCategoryPullToRefresh.setRefreshing(false);
mGridOfCategories.setVisibility(View.GONE);
mListOfCategories.setVisibility(View.GONE);
mEmptyListMessageView.setVisibility(View.VISIBLE);
}
@Override
public void onNext(Category category) {
categoryList.add(category);
}
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
UserPreferences prefs = mUserState.getCurrentUsersPreferences();
inflater.inflate(R.menu.product, menu);
mToggleGridItem = menu.findItem(R.id.toggle_view);
mIsGridVisible = prefs.getShowAsGrids();
if (mIsGridVisible) {
mToggleGridItem.setIcon(R.drawable.actionbar_icon_list_button);
mToggleGridItem.setTitle(getString(R.string.view_as_list_menu_item_text));
} else {
mToggleGridItem.setIcon(R.drawable.actionbar_icon_grid_button);
mToggleGridItem.setTitle(getString(R.string.view_as_grid_menu_item_text));
}
if (BuildConfig.DEBUG) {
// menu.add(0, CATEGORY_IMAGELOADER_MENU_ID, Menu.NONE, "Load Category Images");
}
// 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.setBackgroundResource(R.drawable.mozu_edit_text_holo_light);
mSearchView.setQueryHint(getString(R.string.product_search_hint));
mSearchView.setMaxWidth(1500);
mSearchView.setSearchableInfo(searchManager.getSearchableInfo(getActivity().getComponentName()));
mSearchView.setOnQueryTextListener(this);
}
private void showSuggestions() {
UserPreferences prefs = mUserState.getCurrentUsersPreferences();
List<RecentSearch> recentProductSearches = prefs.getRecentProductSearches();
// Load data from list to cursor
String[] columns = new String[] { "_id", "text" };
Object[] temp = new Object[] { 0, "default" };
MatrixCursor cursor = new MatrixCursor(columns);
if (recentProductSearches == null || recentProductSearches.size() < 1) {
return;
}
for(int i = 0; i < recentProductSearches.size(); i++) {
temp[0] = i;
temp[1] = recentProductSearches.get(i);
cursor.addRow(temp);
}
mSearchView.setSuggestionsAdapter(new SearchSuggestionsCursorAdapter(getActivity(), cursor, recentProductSearches));
mSearchView.setOnSuggestionListener(this);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
UserPreferences prefs = mUserState.getCurrentUsersPreferences();
if (item.getItemId() == R.id.toggle_view) {
if (mCategoryAdapter == null) {
return false;
}
if (!mIsGridVisible) {
mIsGridVisible = true;
mListOfCategories.setVisibility(View.GONE);
mGridOfCategories.setVisibility(View.VISIBLE);
mCategoryAdapter.setIsGrid(true);
mCategoryAdapter.notifyDataSetChanged();
prefs.setShowAsGrids(true);
mUserState.updateUserPreferences();
mToggleGridItem.setIcon(R.drawable.actionbar_icon_list_button);
mToggleGridItem.setTitle(getString(R.string.view_as_list_menu_item_text));
return true;
} else {
mIsGridVisible = false;
mListOfCategories.setVisibility(View.VISIBLE);
mGridOfCategories.setVisibility(View.GONE);
mCategoryAdapter.setIsGrid(false);
mCategoryAdapter.notifyDataSetChanged();
prefs.setShowAsGrids(false);
mUserState.updateUserPreferences();
mToggleGridItem.setIcon(R.drawable.actionbar_icon_grid_button);
mToggleGridItem.setTitle(getString(R.string.view_as_grid_menu_item_text));
return true;
}
} else if (item.getItemId() == R.id.action_search) {
showSuggestions();
} else if(item.getItemId() == CATEGORY_IMAGELOADER_MENU_ID){
List<Category> categories = new ArrayList<Category>();
if (mCategoryAdapter != null) {
for (int i = 0; i < mCategoryAdapter.getCount(); i++) {
categories.add(mCategoryAdapter.getItem(i));
}
}
loadCategoryImages(categories);
}else if(item.getItemId() == R.id.refresh_product){
reloadData();
}
return super.onOptionsItemSelected(item);
}
private void loadCategoryImages(List<Category> mCategories){
for(Category category:mCategories) {
if (category.getContent().getCategoryImages() == null || category.getContent().getCategoryImages().size() <= 0) {
CategoryImageUpdateTask task = new CategoryImageUpdateTask(mCategoryImageUpdateListener,mUserState.getTenantId(), mUserState.getSiteId(),5);
task.execute();
}
}
}
private CategoryImageUpdateListener mCategoryImageUpdateListener = new CategoryImageUpdateListener() {
@Override
public void onImageUpdateSucces(String categoryName, String categoryId) {
Toast.makeText(getActivity(),"Done updating image for "+categoryName,Toast.LENGTH_SHORT).show();
}
@Override
public void onImageUpdateFailure(String message) {
Toast.makeText(getActivity(),"Failed to update image for ",Toast.LENGTH_SHORT).show();
}
};
private void updateListGridsToCategory(List<Category> categoryList) {
UserPreferences prefs = mUserState.getCurrentUsersPreferences();
if (categoryList == null || categoryList.size() < 1) {
mGridOfCategories.setVisibility(View.GONE);
mListOfCategories.setVisibility(View.GONE);
mEmptyListMessageView.setVisibility(View.VISIBLE);
return;
} else {
mEmptyListMessageView.setVisibility(View.GONE);
}
if (mCategoryAdapter == null) {
mCategoryAdapter = new CategoryAdapter(getActivity(), mUserState.getTenantId(), mUserState.getSiteId(), mUserState.getSiteDomain());
mCategoryAdapter.addAll(categoryList);
}
mGridOfCategories.setAdapter(mCategoryAdapter);
mListOfCategories.setAdapter(mCategoryAdapter);
if (prefs.getShowAsGrids()) {
mGridOfCategories.setVisibility(View.VISIBLE);
mListOfCategories.setVisibility(View.GONE);
mCategoryAdapter.setIsGrid(true);
mCategoryAdapter.notifyDataSetChanged();
} else {
mGridOfCategories.setVisibility(View.GONE);
mListOfCategories.setVisibility(View.VISIBLE);
mCategoryAdapter.setIsGrid(false);
mCategoryAdapter.notifyDataSetChanged();
}
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//traverse categories adapter, if leaf then, tell activity this is a leaf and to show and retrieve products
Category categoryAtPosition = mCategoryAdapter.getItem(position);
mListener.onCategoryChosen(categoryAtPosition);
}
private static CategoryFragmentListener sCategoryListener = new CategoryFragmentListener() {
@Override
public void onCategoryChosen(Category category) {
Log.e("TAG", "not implemented");
}
@Override
public void onSearchPerformedFromCategory(int currentCategory, String query) {
Log.e("TAG", "not implemented");
}
};
@Override
public boolean onQueryTextSubmit(String query) {
mSearchMenuItem.collapseActionView();
int categoryId = -1;
if (mCategory != null) {
categoryId = mCategory.getCategoryId();
}
mListener.onSearchPerformedFromCategory(categoryId, query);
//save search to list
UserPreferences prefs = mUserState.getCurrentUsersPreferences();
List<RecentSearch> recentProductSearches = prefs.getRecentProductSearches();
if (recentProductSearches == null) {
recentProductSearches = new ArrayList<RecentSearch>();
}
//if search already exists then dont add it again
for (int i = 0; i < recentProductSearches.size(); i++) {
if (recentProductSearches.get(i).getSearchTerm().equalsIgnoreCase(query)) {
recentProductSearches.remove(i);
break;
}
}
RecentSearch search = new RecentSearch();
search.setSearchTerm(query);
recentProductSearches.add(0, search);
if (recentProductSearches.size() > MAX_NUMBER_OF_SEARCHES) {
recentProductSearches.remove(recentProductSearches.size() - 1);
}
prefs.setRecentProductSearchs(recentProductSearches);
mUserState.updateUserPreferences();
return true;
}
@Override
public boolean onQueryTextChange(String newText) {
return false;
}
@Override
public boolean onSuggestionSelect(int position) {
return false;
}
@Override
public boolean onSuggestionClick(int position) {
UserPreferences prefs = mUserState.getCurrentUsersPreferences();
List<RecentSearch> recentProductSearches = prefs.getRecentProductSearches();
onQueryTextSubmit(recentProductSearches.get(position).getSearchTerm());
return true;
}
}