package shts.jp.android.nogifeed.fragments;
import android.annotation.SuppressLint;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.widget.SwipeRefreshLayout;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.Toast;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Action0;
import rx.schedulers.Schedulers;
import rx.subscriptions.CompositeSubscription;
import shts.jp.android.nogifeed.R;
import shts.jp.android.nogifeed.activities.BlogActivity;
import shts.jp.android.nogifeed.adapters.AllFeedListAdapter;
import shts.jp.android.nogifeed.api.NogiFeedApiClient;
import shts.jp.android.nogifeed.models.Entries;
import shts.jp.android.nogifeed.models.Entry;
import shts.jp.android.nogifeed.providers.FavoriteContentObserver;
import shts.jp.android.nogifeed.views.HackySwipeRefreshLayout;
public class AllFeedListFragment extends Fragment {
private static final int PAGE_LIMIT = 30;
private int counter = 0;
private ListView listView;
private AllFeedListAdapter adapter;
private LinearLayout footerView;
private HackySwipeRefreshLayout swipeRefreshLayout;
private CompositeSubscription subscriptions = new CompositeSubscription();
private final AllFeedListAdapter.OnPageMaxScrolledListener scrolledListener
= new AllFeedListAdapter.OnPageMaxScrolledListener() {
@Override
public void onScrolledMaxPage() {
getNextFeed();
}
};
private final FavoriteContentObserver favoriteContentObserver
= new FavoriteContentObserver() {
@Override
public void onChangeState(@State int state) {
adapter.notifyDataSetChanged();
}
};
@SuppressLint("InflateParams")
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_all_feed_list, null);
listView = (ListView) view.findViewById(R.id.all_feed_list);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Entry entry = (Entry) parent.getItemAtPosition(position);
if (entry != null) {
getActivity().startActivity(
BlogActivity.getStartIntent(getActivity(), entry));
}
}
});
// SwipeRefreshLayoutの設定
swipeRefreshLayout = (HackySwipeRefreshLayout) view.findViewById(R.id.refresh);
swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
getAllFeeds();
}
});
swipeRefreshLayout.setColorSchemeResources(R.color.primary);
footerView = (LinearLayout) inflater.inflate(R.layout.list_item_more_load, null);
footerView.setVisibility(View.GONE);
listView.addFooterView(footerView);
return view;
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
getAllFeeds();
}
private void getAllFeeds() {
counter = 0;
swipeRefreshLayout.setRefreshing(true);
subscriptions.add(NogiFeedApiClient.getAllEntries((counter * PAGE_LIMIT), PAGE_LIMIT)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.doOnSubscribe(new Action0() {
@Override
public void call() {
swipeRefreshLayout.setRefreshing(true);
}
})
.subscribe(new Subscriber<Entries>() {
@Override
public void onCompleted() {
swipeRefreshLayout.setRefreshing(false);
}
@Override
public void onError(Throwable e) {
swipeRefreshLayout.setRefreshing(false);
}
@Override
public void onNext(Entries entries) {
if (entries != null) {
adapter = new AllFeedListAdapter(getActivity(), entries);
adapter.setPageMaxScrolledListener(scrolledListener);
listView.setAdapter(adapter);
} else {
Toast.makeText(getActivity(), R.string.feed_failure, Toast.LENGTH_SHORT).show();
}
}
}));
}
private void getNextFeed() {
swipeRefreshLayout.setRefreshing(false);
if (footerView != null) {
footerView.setVisibility(View.VISIBLE);
}
counter++;
subscriptions.add(NogiFeedApiClient.getAllEntries((counter * PAGE_LIMIT), PAGE_LIMIT)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Entries>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
footerView.setVisibility(View.GONE);
}
@Override
public void onNext(Entries entries) {
footerView.setVisibility(View.VISIBLE);
if (entries != null) {
adapter.add(entries);
} else {
Toast.makeText(getActivity(), R.string.feed_failure, Toast.LENGTH_SHORT).show();
}
}
}));
}
// 推しメン登録は個人ページより行われるので resume <-> pause だと拾えない
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
favoriteContentObserver.register(getContext());
}
@Override
public void onDestroyView() {
favoriteContentObserver.unregister(getContext());
subscriptions.unsubscribe();
super.onDestroyView();
}
}