package com.malmstein.yahnac.stories;
import android.app.Activity;
import android.content.res.Resources;
import android.os.Bundle;
import android.support.v4.view.ViewCompat;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.malmstein.yahnac.HNewsFragment;
import com.malmstein.yahnac.R;
import com.malmstein.yahnac.data.Provider;
import com.malmstein.yahnac.injection.Inject;
import com.malmstein.yahnac.model.Story;
import com.malmstein.yahnac.model.TimeAgo;
import com.malmstein.yahnac.views.DelegatedSwipeRefreshLayout;
import com.malmstein.yahnac.views.ViewDelegate;
import com.malmstein.yahnac.views.recyclerview.decorators.FeedRecyclerItemDecoration;
import com.novoda.notils.caster.Views;
import rx.Observer;
import rx.Subscription;
import rx.android.schedulers.AndroidSchedulers;
public abstract class StoryFragment extends HNewsFragment implements SwipeRefreshLayout.OnRefreshListener, ViewDelegate {
protected StoriesAdapter storiesAdapter;
protected Subscription subscription;
private RecyclerView storiesList;
private RecyclerView.LayoutManager storiesLayoutManager;
private DelegatedSwipeRefreshLayout refreshLayout;
private StoryListener listener;
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
listener = (StoryListener) getActivity();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_stories_feed, container, false);
refreshLayout = Views.findById(rootView, R.id.feed_refresh);
storiesList = Views.findById(rootView, R.id.list_news);
setupRefreshLayout();
setupStoriesList();
maybeUpdateContent();
return rootView;
}
protected void setupRefreshLayout() {
refreshLayout.setColorSchemeResources(R.color.orange, R.color.dark_orange);
refreshLayout.setOnRefreshListener(this);
refreshLayout.setViewDelegate(this);
}
private void setupStoriesList() {
storiesList.setHasFixedSize(true);
storiesLayoutManager = createLayoutManager(getResources());
storiesList.addItemDecoration(createItemDecoration(getResources()));
storiesList.setLayoutManager(storiesLayoutManager);
storiesAdapter = new StoriesAdapter(null, listener, new TimeAgo(getActivity().getResources()));
storiesList.setAdapter(storiesAdapter);
}
private void maybeUpdateContent() {
if (isOnline()) {
Provider provider = Inject.provider();
if (provider.shouldUpdateContent(getType())) {
startRefreshing();
onRefresh();
}
}
}
private FeedRecyclerItemDecoration createItemDecoration(Resources resources) {
int verticalItemSpacingInPx = resources.getDimensionPixelSize(R.dimen.feed_divider_height);
int horizontalItemSpacingInPx = resources.getDimensionPixelSize(R.dimen.feed_padding_infra_spans);
return new FeedRecyclerItemDecoration(verticalItemSpacingInPx, horizontalItemSpacingInPx);
}
private RecyclerView.LayoutManager createLayoutManager(Resources resources) {
int spans = resources.getInteger(R.integer.feed_columns);
return new StaggeredGridLayoutManager(spans, RecyclerView.VERTICAL);
}
protected abstract Story.FILTER getType();
protected void startRefreshing() {
refreshLayout.postOnAnimation(new Runnable() {
@Override
public void run() {
refreshLayout.setRefreshing(true);
}
});
}
protected void stopRefreshing() {
refreshLayout.setRefreshing(false);
}
@Override
public boolean isReadyForPull() {
return ViewCompat.canScrollVertically(storiesList, -1);
}
@Override
public void onRefresh() {
subscribeToStories();
}
private void subscribeToStories() {
if (isOnline()) {
Provider provider = Inject.provider();
subscription = provider
.getStories(getType())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<Integer>() {
@Override
public void onCompleted() {
if (!subscription.isUnsubscribed()) {
subscription.unsubscribe();
}
}
@Override
public void onError(Throwable e) {
Inject.crashAnalytics().logSomethingWentWrong("DataRepository: getStoriesFrom " + getType().toString(), e);
}
@Override
public void onNext(Integer total) {
}
});
} else {
stopRefreshing();
}
}
public void scrollToTop() {
storiesList.smoothScrollToPosition(0);
}
}