package com.philosophicalhacker.philhackernews.ui.refresh;
import android.app.Activity;
import android.os.Bundle;
import android.support.annotation.CallSuper;
import android.support.annotation.Nullable;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.philosophicalhacker.philhackernews.R;
import com.philosophicalhacker.philhackernews.model.Item;
import com.philosophicalhacker.philhackernews.ui.RepositoryFragment;
import java.util.List;
import butterknife.Bind;
import butterknife.ButterKnife;
import rx.Subscription;
import rx.functions.Action1;
import rx.observables.ConnectableObservable;
/**
* Fragment that loads data from a repository and is hosted by a {@link RefreshableFragmentHostingActivity}
*
* Created by MattDupree on 7/21/15.
*/
public abstract class RefreshableListRepositoryFragment extends RepositoryFragment implements Refreshable {
@SuppressWarnings("WeakerAccess")
@Bind(R.id.recyclerView)
RecyclerView mRecyclerView;
private ConnectableObservable<List<Item>> mConnectableRepositoryObservable;
private RefreshStatusListener mRefreshStatusListener;
private OnRefreshableViewCreatedListener mOnRefreshableViewCreatedListener;
private Subscription mSubscription;
//----------------------------------------------------------------------------------
// Lifecycle Methods
//----------------------------------------------------------------------------------
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
mConnectableRepositoryObservable = makeConnectableRepositoryObservable();
}
@CallSuper
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.view_recycler, container, false);
ButterKnife.bind(this, view);
mOnRefreshableViewCreatedListener.onRefreshableViewCreated(mRecyclerView);
mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
mSubscription = mConnectableRepositoryObservable.subscribe(new Action1<List<Item>>() {
@Override
public void call(List<Item> items) {
int refreshStatus = getRefreshStatus(items);
mRefreshStatusListener.onRefreshingStatusChanged(refreshStatus);
mRecyclerView.setAdapter(getAdapter(items));
}
});
return view;
}
private @RefreshStatusListener.RefreshStatus int getRefreshStatus(List<Item> items) {
return items.size() > 0 ? RefreshStatusListener.NOT_REFRESHING : RefreshStatusListener.REFRESHING;
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mConnectableRepositoryObservable.connect();
mRefreshStatusListener.onRefreshingStatusChanged(RefreshStatusListener.REFRESHING);
}
@Override
public void onStop() {
super.onStop();
mSubscription.unsubscribe();
mRefreshStatusListener.onRefreshingStatusChanged(RefreshStatusListener.NOT_REFRESHING);
}
//----------------------------------------------------------------------------------
// Refreshable Interface Methods
//----------------------------------------------------------------------------------
@Override
public void setRefreshStatusListener(RefreshStatusListener refreshStatusListener) {
mRefreshStatusListener = refreshStatusListener;
}
@Override
public void setOnRefreshableViewCreatedListener(OnRefreshableViewCreatedListener onRefreshableViewCreatedListener) {
mOnRefreshableViewCreatedListener = onRefreshableViewCreatedListener;
}
//----------------------------------------------------------------------------------
// Protected Methods
//----------------------------------------------------------------------------------
protected abstract RecyclerView.Adapter getAdapter(List<Item> items);
protected abstract ConnectableObservable<List<Item>> makeConnectableRepositoryObservable();
}