package io.codetail.fragments.mover;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.view.View;
import com.squareup.otto.Subscribe;
import javax.inject.Inject;
import butterknife.ButterKnife;
import codetail.graphics.drawables.MenuDrawable;
import codetail.widget.SearchView;
import codetail.widget.Toolbar;
import hugo.weaving.DebugLog;
import io.codetail.WatchMeApplication;
import io.codetail.adapters.WatchMeAdapterNew;
import io.codetail.client.State;
import io.codetail.client.mover.FetchSearchPage;
import io.codetail.client.mover.Mover;
import io.codetail.utils.ScrollManager;
import io.codetail.watchme.R;
import io.codetail.work.JobManager;
import static android.view.View.NO_ID;
public class SearchFragment extends MoverRecycleFragment implements SearchView.QueryCallback{
public final static String SEARCH_QUERY = "search_query";
public final static String SEARCH_CURRENT_PAGE = "search_current_page";
private final static String SEARCH_PAGES_COUNT = "search_pages_count ";
private final static int UNKNOWN_STATE = -2;
private int mCurrentPageNumber = UNKNOWN_STATE;
private int mSearchPagesCount = UNKNOWN_STATE;
private WatchMeAdapterNew mWatchMeAdapter;
private String mQuery;
@Inject
JobManager mJobManager;
private long mPendingJobId = NO_ID;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if(savedInstanceState != null){
mQuery = savedInstanceState.getString(SEARCH_QUERY);
mSearchPagesCount = savedInstanceState.getInt(SEARCH_PAGES_COUNT, UNKNOWN_STATE);
mCurrentPageNumber = savedInstanceState.getInt(SEARCH_CURRENT_PAGE, UNKNOWN_STATE);
}
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mWatchMeAdapter = getWatchMeAdapter();
WatchMeApplication application = WatchMeApplication.getApplication();
application.inject(this);
application.inject(getScrollManager());
application.inject(mWatchMeAdapter);
setupToolbar(true, savedInstanceState);
setupParent();
if(getArguments() != null){
Bundle args = getArguments();
mQuery = args.getString(SEARCH_QUERY);
mCurrentPageNumber = args.getInt(SEARCH_CURRENT_PAGE);
SearchView search = getWatchMeActivity().getToolbar().getSearchView();
search.setQuery(mQuery);
mPendingJobId = mJobManager.addJob(new FetchSearchPage(mQuery, mCurrentPageNumber));
}
}
void setupParent(){
DrawerLayout drawer = ButterKnife.findById(getActivity(), R.id.drawer_container);
drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
drawer.closeDrawer(GravityCompat.START);
}
void setupToolbar(boolean init){
setupToolbar(init, null);
}
void setupToolbar(boolean init, Bundle state){
Toolbar toolbar = getWatchMeActivity().getToolbar();
toolbar.setTitleVisible(!init);
MenuDrawable drawable = (MenuDrawable) toolbar.getNavigationIcon();
drawable.setRotation(init ? 1 : 0, true);
SearchView search = toolbar.getSearchView();
search.setCallback(init ? this : null);
if(init){
search.expand();
search.setQueryHintText(getString(R.string.toolbar_search_hint));
if(state != null){
search.setQuery(state.getString(SEARCH_QUERY));
}
}else{
search.collapse();
}
}
@Subscribe @SuppressWarnings("unused")
public void onSearchResult(State.OnSearchResponseEvent event){
Mover.SearchPage response = (Mover.SearchPage) event.page;
mPendingJobId = NO_ID;
if(!response.hasResult()){
return;
}
mCurrentPageNumber = response.getPageNumber();
mSearchPagesCount = response.getPagesCount();
showContent();
mWatchMeAdapter.add(getString(R.string.section_paginated_page, mCurrentPageNumber), response.getVideos(),
response.getVideos().size());
}
public void setSearchQuery(String query){
if(mPendingJobId != NO_ID){
mJobManager.cancelJobInBackground(mPendingJobId, false);
}
mQuery = query;
mPendingJobId = mJobManager.addJob(new FetchSearchPage(mQuery, 1));
mWatchMeAdapter.clear();
if(!isProgressVisible()){
showProgress();
}
}
boolean isPageLoading(){
return mPendingJobId != NO_ID;
}
boolean canLoadMorePages(){
return mSearchPagesCount > 1 || mSearchPagesCount == UNKNOWN_STATE;
}
@Subscribe @SuppressWarnings("unused")
public void onStartLoadingPage(State.OnStartLoadingPage event){}
@Subscribe @SuppressWarnings("unused")
public void onLoadMoreItemsEvent(ScrollManager.LoadMoreItems items){
if(isPageLoading() || !canLoadMorePages()){
return;
}
mPendingJobId = mJobManager.addJob(new FetchSearchPage(mQuery, mCurrentPageNumber + 1));
}
@Override @DebugLog @Subscribe @SuppressWarnings("unused")
public void onSuggestionAvailable(Mover.Suggestion suggestion) {
super.onSuggestionAvailable(suggestion);
}
@Override
public void onSaveInstanceState(Bundle outState) {
outState.putInt(SEARCH_CURRENT_PAGE, mCurrentPageNumber);
outState.putInt(SEARCH_PAGES_COUNT, mSearchPagesCount);
outState.putString(SEARCH_QUERY, mQuery);
super.onSaveInstanceState(outState);
}
@Override
public void onDetach() {
super.onDetach();
DrawerLayout drawer = ButterKnife.findById(getActivity(), R.id.drawer_container);
drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
setupToolbar(false);
}
@Override
public void onDestroy() {
super.onDestroy();
if(mPendingJobId != NO_ID) {
mJobManager.cancelJobInBackground(mPendingJobId, false);
}
}
@Override
public JobManager getJobManager() {
return mJobManager;
}
@Override
public void onSearchQuery(CharSequence query) {
setSearchQuery(query.toString());
}
}