package com.kenny.openimgur.fragments; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v7.widget.PopupMenu; import android.support.v7.widget.SearchView; import android.text.TextUtils; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import com.kenny.openimgur.R; import com.kenny.openimgur.ui.adapters.SearchAdapter; import com.kenny.openimgur.api.ApiClient; import com.kenny.openimgur.api.ImgurService; import com.kenny.openimgur.api.responses.GalleryResponse; import com.kenny.openimgur.classes.FragmentListener; import com.kenny.openimgur.classes.ImgurFilters; import com.kenny.openimgur.util.DBContracts; import com.kenny.openimgur.util.LogUtil; import com.kenny.openimgur.util.SqlHelper; import com.kenny.openimgur.util.ViewUtils; import com.kennyc.view.MultiStateView; /** * Created by kcampagna on 3/21/15. */ public class GallerySearchFragment extends GalleryFragment { private static final String KEY_QUERY = "query"; private String mQuery; @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String text) { boolean setQuery = setQuery(text); if (setQuery) refresh(); return setQuery; } @Override public boolean onQueryTextChange(String s) { return false; } }); } @Override protected void fetchGallery() { if (TextUtils.isEmpty(mQuery)) return; ImgurService apiService = ApiClient.getService(); mIsLoading = true; if (mSort == ImgurFilters.GallerySort.HIGHEST_SCORING) { apiService.searchGalleryForTopSorted(mTimeSort.getSort(), mCurrentPage, mQuery).enqueue(this); } else { apiService.searchGallery(mSort.getSort(), mCurrentPage, mQuery).enqueue(this); } } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putString(KEY_QUERY, mQuery); } @Override protected void onRestoreSavedInstance(Bundle savedInstanceState) { super.onRestoreSavedInstance(savedInstanceState); if (savedInstanceState != null) mQuery = savedInstanceState.getString(KEY_QUERY, null); } public boolean setQuery(String query) { if (!TextUtils.isEmpty(query) && !query.equalsIgnoreCase(mQuery)) { LogUtil.v(TAG, "setQuery :" + query); mQuery = query; if (mListener != null) mListener.onUpdateActionBarTitle(mQuery); if (mSearchMenuItem != null) mSearchMenuItem.collapseActionView(); return true; } return false; } @Override protected void onFilterChange(@NonNull ImgurFilters.GallerySection section, @NonNull ImgurFilters.GallerySort sort, @NonNull ImgurFilters.TimeSort timeSort, boolean showViral) { // Don't care about section or showViral if (mSort == sort && timeSort == mTimeSort) { // Null values represent that the filter was canceled return; } if (getAdapter() != null) { getAdapter().clear(); } mSort = sort; mTimeSort = timeSort; mCurrentPage = 0; mIsLoading = true; mHasMore = true; mMultiStateView.setViewState(MultiStateView.VIEW_STATE_LOADING); if (mListener != null) mListener.onFragmentStateChange(FragmentListener.STATE_LOADING_STARTED); fetchGallery(); } @Override protected void onApiResult(@NonNull GalleryResponse galleryResponse) { super.onApiResult(galleryResponse); if (mSearchView != null && mCurrentPage == 0 && !galleryResponse.data.isEmpty()) { SqlHelper sql = SqlHelper.getInstance(getActivity()); sql.addPreviousGallerySearch(mQuery); if (mSearchAdapter == null) { mSearchAdapter = new SearchAdapter(getActivity(), sql.getPreviousGallerySearches(mQuery), DBContracts.GallerySearchContract.COLUMN_NAME); mSearchView.setSuggestionsAdapter(mSearchAdapter); } else { mSearchAdapter.changeCursor(sql.getPreviousGallerySearches(mQuery)); } mSearchAdapter.notifyDataSetChanged(); } } @Override protected void onEmptyResults() { mHasMore = false; if (getAdapter() == null || getAdapter().isEmpty()) { ViewUtils.setErrorText(mMultiStateView, R.id.errorMessage, getString(R.string.reddit_empty, mQuery)); mMultiStateView.setViewState(MultiStateView.VIEW_STATE_ERROR); } } @Override protected int getFilterMenu() { return R.menu.filter_gallery_search; } @Override protected PopupMenu.OnMenuItemClickListener getMenuItemClickListener() { return new PopupMenu.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { switch (item.getItemId()) { case R.id.newest: onFilterChange(ImgurFilters.GallerySection.USER, ImgurFilters.GallerySort.TIME, ImgurFilters.TimeSort.DAY, false); return true; case R.id.popularity: onFilterChange(ImgurFilters.GallerySection.USER, ImgurFilters.GallerySort.VIRAL, ImgurFilters.TimeSort.DAY, false); return true; case R.id.scoringDay: onFilterChange(ImgurFilters.GallerySection.USER, ImgurFilters.GallerySort.HIGHEST_SCORING, ImgurFilters.TimeSort.DAY, false); return true; case R.id.scoringWeek: onFilterChange(ImgurFilters.GallerySection.USER, ImgurFilters.GallerySort.HIGHEST_SCORING, ImgurFilters.TimeSort.WEEK, false); return true; case R.id.scoringMonth: onFilterChange(ImgurFilters.GallerySection.USER, ImgurFilters.GallerySort.HIGHEST_SCORING, ImgurFilters.TimeSort.MONTH, false); return true; case R.id.scoringYear: onFilterChange(ImgurFilters.GallerySection.USER, ImgurFilters.GallerySort.HIGHEST_SCORING, ImgurFilters.TimeSort.YEAR, false); return true; case R.id.scoringAll: onFilterChange(ImgurFilters.GallerySection.USER, ImgurFilters.GallerySort.HIGHEST_SCORING, ImgurFilters.TimeSort.ALL, false); return true; } return false; } }; } }