package com.kenny.openimgur.fragments;
import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.widget.PopupMenu;
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 com.kenny.openimgur.R;
import com.kenny.openimgur.api.ApiClient;
import com.kenny.openimgur.api.ImgurService;
import com.kenny.openimgur.api.responses.TopicResponse;
import com.kenny.openimgur.classes.FragmentListener;
import com.kenny.openimgur.classes.ImgurFilters;
import com.kenny.openimgur.classes.ImgurTopic;
import com.kenny.openimgur.ui.adapters.GalleryAdapter;
import com.kenny.openimgur.util.LogUtil;
import com.kenny.openimgur.util.SqlHelper;
import com.kenny.openimgur.util.ViewUtils;
import com.kennyc.view.MultiStateView;
import java.util.List;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
/**
* Created by kcampagna on 2/19/15.
*/
public class TopicsFragment extends BaseGridFragment {
private static final String KEY_TOPIC_ID = "topics_id";
private static final String KEY_SORT = "topics_sort";
private static final String KEY_TOP_SORT = "topics_topSort";
private static final String KEY_TOPIC = "topics_topic";
ImgurTopic mTopic;
private ImgurFilters.GallerySort mSort = ImgurFilters.GallerySort.TIME;
private ImgurFilters.TimeSort mTimeSort = ImgurFilters.TimeSort.DAY;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_gallery, container, false);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.topics, menu);
super.onCreateOptionsMenu(menu, inflater);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.refresh:
if (mTopic != null) {
refresh();
}
return true;
case R.id.filter:
Activity activity = getActivity();
View anchor;
anchor = activity.findViewById(R.id.filter);
if (anchor == null) anchor = activity.findViewById(R.id.refresh);
PopupMenu m = new PopupMenu(getActivity(), anchor);
m.inflate(R.menu.filter_gallery_search);
m.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.newest:
onFilterChange(ImgurFilters.GallerySort.TIME, ImgurFilters.TimeSort.DAY);
return true;
case R.id.popularity:
onFilterChange(ImgurFilters.GallerySort.VIRAL, ImgurFilters.TimeSort.DAY);
return true;
case R.id.scoringDay:
onFilterChange(ImgurFilters.GallerySort.HIGHEST_SCORING, ImgurFilters.TimeSort.DAY);
return true;
case R.id.scoringWeek:
onFilterChange(ImgurFilters.GallerySort.HIGHEST_SCORING, ImgurFilters.TimeSort.WEEK);
return true;
case R.id.scoringMonth:
onFilterChange(ImgurFilters.GallerySort.HIGHEST_SCORING, ImgurFilters.TimeSort.MONTH);
return true;
case R.id.scoringYear:
onFilterChange(ImgurFilters.GallerySort.HIGHEST_SCORING, ImgurFilters.TimeSort.YEAR);
return true;
case R.id.scoringAll:
onFilterChange(ImgurFilters.GallerySort.HIGHEST_SCORING, ImgurFilters.TimeSort.ALL);
return true;
}
return false;
}
});
m.show();
return true;
case R.id.refreshTopics:
fetchTopics();
return true;
}
return super.onOptionsItemSelected(item);
}
void onFilterChange(ImgurFilters.GallerySort sort, ImgurFilters.TimeSort timeSort) {
if (sort == mSort && mTimeSort == timeSort) {
LogUtil.v(TAG, "Filters have not been updated");
return;
}
mSort = sort;
mTimeSort = timeSort;
mCurrentPage = 0;
mIsLoading = true;
mHasMore = true;
if (getAdapter() != null) getAdapter().clear();
mMultiStateView.setViewState(MultiStateView.VIEW_STATE_LOADING);
if (mListener != null && mTopic != null) {
mListener.onFragmentStateChange(FragmentListener.STATE_LOADING_STARTED);
}
fetchGallery();
saveFilterSettings();
}
private void saveFilterSettings() {
app.getPreferences().edit()
.putInt(KEY_TOPIC_ID, mTopic != null ? mTopic.getId() : -1)
.putString(KEY_TOP_SORT, mTimeSort.getSort())
.putString(KEY_SORT, mSort.getSort()).apply();
}
@Override
protected void fetchGallery() {
if (mTopic == null) return;
super.fetchGallery();
ImgurService apiService = ApiClient.getService();
if (mSort == ImgurFilters.GallerySort.HIGHEST_SCORING) {
apiService.getTopicForTopSorted(mTopic.getId(), mTimeSort.getSort(), mCurrentPage).enqueue(this);
} else {
apiService.getTopic(mTopic.getId(), mSort.getSort(), mCurrentPage).enqueue(this);
}
}
@Override
protected void onEmptyResults() {
mIsLoading = false;
if (getAdapter() == null || getAdapter().isEmpty()) {
/* No results came back from the api, topic must have been removed.
This needs to be confirmed that this can happen */
String message = getString(R.string.topics_empty_result, mTopic.getName());
SqlHelper.getInstance(getActivity()).deleteTopic(mTopic.getId());
ViewUtils.setErrorText(mMultiStateView, R.id.errorMessage, message);
mMultiStateView.setViewState(MultiStateView.VIEW_STATE_ERROR);
}
}
@Override
protected void onRestoreSavedInstance(Bundle savedInstanceState) {
super.onRestoreSavedInstance(savedInstanceState);
SqlHelper sql = SqlHelper.getInstance(getActivity());
if (savedInstanceState == null) {
SharedPreferences pref = app.getPreferences();
mSort = ImgurFilters.GallerySort.getSortFromString(pref.getString(KEY_SORT, null));
mTimeSort = ImgurFilters.TimeSort.getSortFromString(pref.getString(KEY_TOP_SORT, null));
mTopic = sql.getTopic(pref.getInt(KEY_TOPIC_ID, -1));
} else {
mSort = ImgurFilters.GallerySort.getSortFromString(savedInstanceState.getString(KEY_SORT, ImgurFilters.GallerySort.TIME.getSort()));
mTimeSort = ImgurFilters.TimeSort.getSortFromString(savedInstanceState.getString(KEY_TOP_SORT, null));
mTopic = savedInstanceState.getParcelable(KEY_TOPIC);
}
List<ImgurTopic> topics = sql.getTopics();
if (!topics.isEmpty()) {
if (mTopic == null) mTopic = topics.get(0);
if (mListener != null) mListener.onUpdateActionBarSpinner(topics, mTopic);
fetchGallery();
} else {
fetchTopics();
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putParcelable(KEY_TOPIC, mTopic);
outState.putString(KEY_SORT, mSort.getSort());
outState.putString(KEY_TOP_SORT, mTimeSort.getSort());
}
public void onTopicChanged(@NonNull ImgurTopic topic) {
if (mTopic.getId() != topic.getId()) {
mTopic = topic;
GalleryAdapter adapter = getAdapter();
if (adapter != null) adapter.clear();
mMultiStateView.setViewState(MultiStateView.VIEW_STATE_LOADING);
fetchGallery();
saveFilterSettings();
}
}
private void fetchTopics() {
mMultiStateView.setViewState(MultiStateView.VIEW_STATE_LOADING);
ApiClient.getService().getDefaultTopics().enqueue(new Callback<TopicResponse>() {
@Override
public void onResponse(Call<TopicResponse> call, Response<TopicResponse> response) {
if (!isAdded()) return;
if (response != null && response.body() != null && !response.body().data.isEmpty()) {
List<ImgurTopic> topics = response.body().data;
SqlHelper.getInstance(getActivity()).addTopics(topics);
// Auto fetch the first topic
if (mTopic == null) mTopic = topics.get(0);
if (mListener != null) mListener.onUpdateActionBarSpinner(topics, mTopic);
if (getAdapter() == null || getAdapter().isEmpty()) {
fetchGallery();
} else {
mMultiStateView.setViewState(MultiStateView.VIEW_STATE_CONTENT);
}
} else {
ViewUtils.setErrorText(mMultiStateView, R.id.errorMessage, R.string.error_generic);
mMultiStateView.setViewState(MultiStateView.VIEW_STATE_ERROR);
}
}
@Override
public void onFailure(Call<TopicResponse> call, Throwable t) {
if (!isAdded()) return;
LogUtil.e(TAG, "Unable to fetch topics", t);
ViewUtils.setErrorText(mMultiStateView, R.id.errorMessage, ApiClient.getErrorCode(t));
mMultiStateView.setViewState(MultiStateView.VIEW_STATE_ERROR);
}
});
}
}