package com.github.captain_miao.agera.tutorial.recycleview;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.widget.LinearLayoutManager;
import android.widget.Toast;
import com.github.captain_miao.agera.tutorial.R;
import com.github.captain_miao.agera.tutorial.base.BaseActivity;
import com.github.captain_miao.agera.tutorial.helper.PicassoOnScrollListener;
import com.github.captain_miao.agera.tutorial.model.ApiResult;
import com.github.captain_miao.agera.tutorial.model.GirlInfo;
import com.github.captain_miao.agera.tutorial.supplier.GirlsSupplier;
import com.github.captain_miao.recyclerviewutils.WrapperRecyclerView;
import com.github.captain_miao.recyclerviewutils.common.DefaultLoadMoreFooterView;
import com.github.captain_miao.recyclerviewutils.listener.RefreshRecyclerViewListener;
import com.google.android.agera.Function;
import com.google.android.agera.MutableRepository;
import com.google.android.agera.Receiver;
import com.google.android.agera.Repositories;
import com.google.android.agera.Repository;
import com.google.android.agera.RepositoryConfig;
import com.google.android.agera.Result;
import com.google.android.agera.Updatable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import static com.google.android.agera.Result.absentIfNull;
public class ComplexRecycleViewActivity extends BaseActivity implements RefreshRecyclerViewListener, Updatable, Receiver<ApiResult<GirlInfo>> {
private static final String TAG = "RecycleViewActivity";
private WrapperRecyclerView mRefreshRecyclerView;
private ComplexRvAdapter mAdapter;
@Override
public void init(Bundle savedInstanceState) {
setContentView(R.layout.activity_recycle_view);
mRefreshRecyclerView = (WrapperRecyclerView) findViewById(R.id.refresh_recycler_view);
mAdapter = new ComplexRvAdapter();
mRefreshRecyclerView.setAdapter(mAdapter);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
mRefreshRecyclerView.setLayoutManager(linearLayoutManager);
mRefreshRecyclerView.setRecyclerViewListener(this);
mAdapter.setLoadMoreFooterView(new DefaultLoadMoreFooterView(this));
mRefreshRecyclerView.setPadding(0, 0, 0, 20);
mRefreshRecyclerView.getRecyclerView().addOnScrollListener(new PicassoOnScrollListener(this));
setUpRepository();
mAdapter.setRepository(Repositories.mutableRepository(new ApiResult<GirlInfo>()));
//mRefreshRecyclerView.getPtrFrameLayout().autoRefresh();
}
@Override
public void onRefresh() {
mPagination = 1;
mMutableRepository.accept(mPagination);
}
@Override
public void onLoadMore(int pagination, int pageSize) {
mRefreshRecyclerView.showLoadMoreView();
mPagination = pagination;
mMutableRepository.accept(mPagination);
}
//for agera
private ExecutorService networkExecutor;
private MutableRepository<Integer> mMutableRepository;
private Repository<Result<ApiResult<GirlInfo>>> mLoadDataRepository;
@Override
protected void onResume() {
super.onResume();
mLoadDataRepository.addUpdatable(this);
}
@Override
protected void onPause() {
super.onPause();
mLoadDataRepository.removeUpdatable(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
networkExecutor.shutdown();
}
private int mPagination = 1;
private void setUpRepository() {
networkExecutor = Executors.newSingleThreadExecutor();
mMutableRepository = Repositories.mutableRepository(mPagination);
mLoadDataRepository = Repositories.repositoryWithInitialValue(Result.<ApiResult<GirlInfo>>absent())
.observe(mMutableRepository)
.onUpdatesPerLoop()
.goTo(networkExecutor)
.attemptGetFrom(new GirlsSupplier(mMutableRepository)).orSkip()
.thenTransform(new Function<ApiResult<GirlInfo>, Result<ApiResult<GirlInfo>>>() {
@NonNull
@Override
public Result<ApiResult<GirlInfo>> apply(@NonNull ApiResult<GirlInfo> input) {
return absentIfNull(input);
}
})
.onDeactivation(RepositoryConfig.SEND_INTERRUPT)
.compile();
}
@Override
public void update() {
Result<ApiResult<GirlInfo>> result = mLoadDataRepository.get();
result.ifSucceededSendTo(this)
.ifFailedSendTo(new Receiver<Throwable>() {
@Override
public void accept(@NonNull Throwable value) {
Toast.makeText(ComplexRecycleViewActivity.this, "load data fail", Toast.LENGTH_LONG).show();
if (mPagination == 1) {
mRefreshRecyclerView.refreshComplete();
} else {
mRefreshRecyclerView.hideFooterView();
}
mRefreshRecyclerView.loadMoreComplete();
}
});
}
@Override
public void accept(@NonNull ApiResult<GirlInfo> result) {
if (mPagination == 1) {
mAdapter.clear();
mAdapter.addAll(result.results);
mRefreshRecyclerView.refreshComplete();
} else {
if (result.results != null && result.results.size() > 0) {
mAdapter.getRepository().accept(result);
//mAdapter.addAll(result.results, false);
//int size = result.results.size();
//mAdapter.notifyItemRangeInserted(mAdapter.getItemCount() - size, size);
mRefreshRecyclerView.hideFooterView();
} else {
Toast.makeText(this, "It's no more data.", Toast.LENGTH_LONG).show();
if(mAdapter.getItemCount() > 0) {
mRefreshRecyclerView.showNoMoreDataView();
} else {
mRefreshRecyclerView.hideFooterView();
}
}
mRefreshRecyclerView.loadMoreComplete();
}
}
}