package com.progscrape.ui;
import android.app.Fragment;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
import com.octo.android.robospice.persistence.exception.SpiceException;
import com.octo.android.robospice.request.listener.RequestListener;
import com.progscrape.R;
import com.progscrape.app.data.Story;
import com.progscrape.data.Data;
import com.progscrape.event.ActivityEvent;
import com.progscrape.modules.Injector;
import com.squareup.otto.Bus;
import com.squareup.otto.Subscribe;
import java.util.List;
import javax.inject.Inject;
import butterknife.ButterKnife;
import butterknife.InjectView;
import butterknife.OnClick;
public class StoriesFragment extends Fragment implements SwipeRefreshLayout.OnRefreshListener {
private String tag;
private int seq = 0;
@InjectView(R.id.stories)
StoriesView stories;
@InjectView(R.id.story_recycler)
protected RecyclerView storyRecycler;
@InjectView(R.id.swipe_refresh)
protected SwipeRefreshLayout refresh;
@Inject
protected Data data;
@Inject
protected Bus bus;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.stories, container, false);
}
@OnClick(R.id.toolbar)
protected void onClickToolbar() {
bus.post(ActivityEvent.SCROLL_TO_TOP);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
ButterKnife.inject(this, getView());
setTag(getArguments().getString("tag"));
refresh.setOnRefreshListener(this);
}
@Override
public void onCreate(Bundle savedInstanceState) {
Injector.obtain(getActivity(), ActivityComponent.class).inject(this);
super.onCreate(savedInstanceState);
bus.register(this);
}
@Override
public void onDestroy() {
super.onDestroy();
bus.unregister(this);
}
@Override
public void onStop() {
super.onStop();
refresh.setRefreshing(false);
Log.i("stories", "StoriesFragment stopped");
}
@Override
public void onPause() {
super.onPause();
refresh.setRefreshing(false);
Log.i("stories", "StoriesFragment paused");
}
@Subscribe
public void onActivityEvent(ActivityEvent what) {
switch (what) {
case SCROLL_TO_TOP:
stories.scrollToTop();
break;
}
}
public static StoriesFragment create(String tag) {
StoriesFragment fragment = new StoriesFragment();
Bundle bundle = new Bundle();
bundle.putString("tag", tag);
fragment.setArguments(bundle);
return fragment;
}
private TrendingStoryAdapter getTrendingStoryAdapter() {
return (TrendingStoryAdapter)storyRecycler.getAdapter();
}
public void setTag(String tag) {
stories.setTag(tag);
this.tag = tag;
update();
}
@Override
public void onRefresh() {
update();
}
private void update() {
refresh.setRefreshing(true);
final int curr = ++seq;
data.getStoryData(tag, new RequestListener<List<Story>>() {
@Override
public void onRequestFailure(SpiceException spiceException) {
if (curr != seq) {
Log.i("stories", "Out of date request");
return;
}
refresh.setRefreshing(false);
Log.e("stories", "Failed to retrieve stories", spiceException);
Toast toast = Toast.makeText(getActivity(), "Failed to refresh stories, please try again.", Toast.LENGTH_SHORT);
toast.show();
getTrendingStoryAdapter().setErrorState();
}
@Override
public void onRequestSuccess(List<Story> res) {
if (curr != seq) {
Log.i("stories", "Out of date request");
return;
}
Log.i("stories", "Completed request");
refresh.setRefreshing(false);
getTrendingStoryAdapter().setStories(res);
}
}, true);
}
}