package tellh.com.gitclub.presentation.view.fragment.search;
import android.os.Bundle;
import android.support.design.widget.TabLayout;
import android.support.v4.content.ContextCompat;
import android.support.v4.view.MenuItemCompat;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.SearchView;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.ImageView;
import com.getbase.floatingactionbutton.FloatingActionButton;
import com.getbase.floatingactionbutton.FloatingActionsMenu;
import com.tellh.nolistadapter.adapter.FooterLoadMoreAdapterWrapper.UpdateType;
import java.lang.reflect.Field;
import java.util.List;
import javax.inject.Inject;
import rx.functions.Action1;
import tellh.com.gitclub.R;
import tellh.com.gitclub.common.AndroidApplication;
import tellh.com.gitclub.common.base.LazyFragment;
import tellh.com.gitclub.common.utils.Utils;
import tellh.com.gitclub.di.component.DaggerSearchComponent;
import tellh.com.gitclub.model.entity.RepositoryInfo;
import tellh.com.gitclub.model.entity.UserEntity;
import tellh.com.gitclub.presentation.contract.SearchContract;
import tellh.com.gitclub.presentation.contract.bus.RxBus;
import tellh.com.gitclub.presentation.contract.bus.event.OnBackPressEvent;
import tellh.com.gitclub.presentation.contract.bus.event.OnClickOutsideToHideEvent;
import tellh.com.gitclub.presentation.view.adapter.CommonViewPagerAdapter;
import tellh.com.gitclub.presentation.view.fragment.ListFragment;
import tellh.com.gitclub.presentation.widget.OnPageChangeListenerAdapter;
import static com.tellh.nolistadapter.adapter.FooterLoadMoreAdapterWrapper.REFRESH;
import static tellh.com.gitclub.presentation.contract.SearchContract.ListType;
import static tellh.com.gitclub.presentation.contract.SearchContract.OnListFragmentInteractListener;
import static tellh.com.gitclub.presentation.contract.SearchContract.Presenter;
import static tellh.com.gitclub.presentation.contract.SearchContract.REPO;
import static tellh.com.gitclub.presentation.contract.SearchContract.USER;
public class SearchFragment extends LazyFragment
implements SearchContract.View, OnListFragmentInteractListener {
@Inject
Presenter presenter;
private SearchUserFragment userListListener;
private SearchRepoFragment reposListListener;
private FloatingActionsMenu fabMenu;
private FloatingActionButton fabSort;
private FloatingActionButton fabLang;
public static SearchFragment newInstance() {
return new SearchFragment();
}
@Override
public void initView() {
initDagger();
//find view
ViewPager pager = (ViewPager) mRootView.findViewById(R.id.pager_search);
Toolbar toolbar = (Toolbar) mRootView.findViewById(R.id.toolbar);
TabLayout tabLayout = (TabLayout) mRootView.findViewById(R.id.tab_layout);
fabLang = (FloatingActionButton) mRootView.findViewById(R.id.fab_language);
fabSort = (FloatingActionButton) mRootView.findViewById(R.id.fab_sort);
fabMenu = (FloatingActionsMenu) mRootView.findViewById(R.id.fab);
//init viewpager
CommonViewPagerAdapter viewPagerAdapter = new CommonViewPagerAdapter(getFragmentManager());
reposListListener = SearchRepoFragment.newInstance();
userListListener = SearchUserFragment.newInstance();
reposListListener.setListFragmentInteractListener(this);
userListListener.setListFragmentInteractListener(this);
viewPagerAdapter.addFragment(Utils.getString(R.string.title_search_repo), reposListListener);
viewPagerAdapter.addFragment(Utils.getString(R.string.title_search_user), userListListener);
pager.setAdapter(viewPagerAdapter);
pager.setOffscreenPageLimit(2);
pager.addOnPageChangeListener(new OnPageChangeListenerAdapter() {
@Override
public void onPageSelected(int position) {
if (position == 0)
presenter.setCurrentSearchEntity(presenter.getRepoSearchEntity());
else
presenter.setCurrentSearchEntity(presenter.getUserSearchEntity());
}
});
//init toolbar
setHasOptionsMenu(true);
((AppCompatActivity) getActivity()).setSupportActionBar(toolbar);
//init tab layout
tabLayout.setupWithViewPager(pager);
//init fab
initFab();
}
private void initFab() {
fabLang.setOnClickListener(new android.view.View.OnClickListener() {
@Override
public void onClick(android.view.View view) {
presenter.getDialogLang().show();
fabMenu.collapse();
}
});
fabSort.setOnClickListener(new android.view.View.OnClickListener() {
@Override
public void onClick(android.view.View view) {
SearchContract.SearchEntity searchEntity = presenter.getCurrentSearchEntity();
if (searchEntity.type == REPO)
presenter.getDialogSortRepo().show();
else presenter.getDialogSortUser().show();
fabMenu.collapse();
}
});
addSubscription(RxBus.getDefault().toObservable(OnBackPressEvent.class).subscribe(new Action1<OnBackPressEvent>() {
@Override
public void call(OnBackPressEvent event) {
if (fabMenu == null || !fabMenu.isExpanded())
return;
fabMenu.collapse();
event.hasConsume = true;
}
}));
addSubscription(RxBus.getDefault().toObservable(OnClickOutsideToHideEvent.class).subscribe(new Action1<OnClickOutsideToHideEvent>() {
@Override
public void call(OnClickOutsideToHideEvent event) {
if (fabMenu == null || !fabMenu.isExpanded())
return;
fabMenu.collapse();
event.consume = true;
}
}));
}
@Override
public void initData(Bundle savedInstanceState) {
presenter.setCurrentSearchEntity(presenter.getRepoSearchEntity());
//to get the most popular repository and user.
presenter.initialSearch();
}
@Override
public int getLayoutId() {
return R.layout.frag_search;
}
private void initDagger() {
DaggerSearchComponent.builder()
.appComponent(AndroidApplication.getInstance().getAppComponent())
.build().inject(this);
presenter.attachView(this);
}
@Override
public void onDestroy() {
super.onDestroy();
if (presenter != null)
presenter.detachView();
userListListener = null;
reposListListener = null;
}
@Override
public void onGetRepos(int total_count, List<RepositoryInfo> items, @UpdateType int updateType) {
reposListListener.onGetRepos(total_count, items, updateType);
if (updateType == REFRESH)
reposListListener.hideLoading();
}
@Override
public void onGetUsers(int total_count, List<UserEntity> items, @UpdateType int updateType) {
userListListener.onGetUser(total_count, items, updateType);
if (updateType == REFRESH)
userListListener.hideLoading();
}
@Override
public void showListRefreshLoading(@ListType int listType) {
if (listType == REPO) {
reposListListener.showLoading();
} else
userListListener.showLoading();
}
@Override
public void showOnError(String msg, @ListType int type, @UpdateType int updateType) {
showOnError(msg);
//hide loading
switch (type) {
case USER:
userListListener.hideLoading();
showErrorView(msg, userListListener, updateType);
break;
case REPO:
reposListListener.hideLoading();
showErrorView(msg, reposListListener, updateType);
break;
}
}
private void showErrorView(String msg, final ListFragment listFragment, @UpdateType int updateType) {
if (updateType == REFRESH && !msg.equals(Utils.getString(R.string.reqest_flying))) {
listFragment.showErrorView();
}
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
menu.clear();
inflater.inflate(R.menu.menu_search, menu);
initSearchView(menu);
}
private void initSearchView(Menu menu) {
MenuItem searchItem = menu.findItem(R.id.action_search);
final SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
searchView.setQueryHint(Utils.getString(R.string.title_search));
searchView.setSubmitButtonEnabled(true);
//Sorry, I have to use a little reflect :)
try {
Field field = searchView.getClass().getDeclaredField("mGoButton");
field.setAccessible(true);
ImageView iv = (ImageView) field.get(searchView);
iv.setImageDrawable(ContextCompat.getDrawable(getContext(), R.drawable.ic_send_white));
} catch (Exception e) {
e.printStackTrace();
}
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
presenter.getCurrentSearchEntity().keyWord = query;
presenter.searchCurrent(true, 1);
searchView.clearFocus();
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
return false;
}
});
}
@Override
public void onFetchPage(@ListType int type, int page) {
switch (type) {
case USER:
presenter.searchUser(page);
break;
case REPO:
presenter.searchRepo(page);
break;
}
}
@Override
public Presenter getPresenter() {
return presenter;
}
@Override //disable the default loading dialog from super class.
public void showOnLoading() {
}
}