package party.danyang.nationalgeographic.ui.home;
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.databinding.DataBindingUtil;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.design.widget.Snackbar;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.ActivityOptionsCompat;
import android.support.v4.app.Fragment;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import java.util.List;
import party.danyang.nationalgeographic.R;
import party.danyang.nationalgeographic.adapter.AlbumListAdapter;
import party.danyang.nationalgeographic.adapter.base.BaseAdapter;
import party.danyang.nationalgeographic.databinding.LayoutRecyclerBinding;
import party.danyang.nationalgeographic.model.albumlist.Album;
import party.danyang.nationalgeographic.model.albumlist.AlbumList;
import party.danyang.nationalgeographic.net.NGApi;
import party.danyang.nationalgeographic.ui.DetailActivity;
import party.danyang.nationalgeographic.ui.LayoutSpanCountUtils;
import party.danyang.nationalgeographic.utils.NetUtils;
import party.danyang.nationalgeographic.utils.SettingsModel;
import party.danyang.nationalgeographic.utils.Utils;
import party.danyang.nationalgeographic.utils.singleton.PicassoHelper;
import rx.Observable;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Action1;
import rx.schedulers.Schedulers;
import rx.subscriptions.CompositeSubscription;
public class RecyclerViewTWFragment extends Fragment {
private HomeActivity activity;
public AlbumListAdapter adapter;
public LayoutRecyclerBinding binding;
public StaggeredGridLayoutManager layoutManager;
private CompositeSubscription mSubscription;
private int page = 1;
private boolean hasLoad = false;
private static RecyclerViewTWFragment singleton;
@Override
public void onAttach(Context context) {
super.onAttach(context);
this.activity = (HomeActivity) context;
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mSubscription = new CompositeSubscription();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
binding = DataBindingUtil.inflate(inflater, R.layout.layout_recycler, container, false);
setupRecyclerContent();
initLoad();
return binding.getRoot();
}
@Override
public void onDestroy() {
super.onDestroy();
if (mSubscription != null) {
mSubscription.unsubscribe();
}
}
public static RecyclerViewTWFragment getInstance() {
if (singleton == null) {
singleton = new RecyclerViewTWFragment();
}
return singleton;
}
private void initLoad() {
if (NetUtils.isWiFi(activity)) {
sendToLoad(1);
} else {
getAlbumFromRealm();
}
}
private void sendToLoad(int page) {
if (!NetUtils.isConnected(activity)) {
Utils.makeSnackBar(binding.getRoot(), R.string.offline, true);
Utils.setRefresher(binding.refresher, false);
return;
}
//if wifionly and not in wifi
if (SettingsModel.getWifiOnly(activity) && !NetUtils.isWiFi(activity)) {
Utils.makeSnackBar(binding.getRoot(), R.string.load_not_in_wifi_while_in_wifi_only, true);
Utils.setRefresher(binding.refresher, false);
return;
}
this.page = page;
getAlbumList();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
layoutManager = new StaggeredGridLayoutManager(
LayoutSpanCountUtils.getSpanCount(activity, newConfig.orientation)
, StaggeredGridLayoutManager.VERTICAL);
binding.recycler.setLayoutManager(layoutManager);
super.onConfigurationChanged(newConfig);
}
private void setupRecyclerContent() {
adapter = new AlbumListAdapter(null);
adapter.setOnItemClickListener(new BaseAdapter.OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
startDetailActivity(view, position);
}
});
layoutManager = new StaggeredGridLayoutManager(
LayoutSpanCountUtils.getSpanCount(activity, getResources().getConfiguration().orientation)
, StaggeredGridLayoutManager.VERTICAL);
binding.recycler.setAdapter(adapter);
binding.recycler.setLayoutManager(layoutManager);
//滑动是暂停加载
binding.recycler.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
int[] positions = new int[layoutManager.getSpanCount()];
layoutManager.findLastCompletelyVisibleItemPositions(positions);
int maxPosition = positions[0];
for (int position : positions) {
maxPosition = Math.max(position, maxPosition);
}
if (maxPosition == layoutManager.getItemCount() - 1) {
loadMore();
}
}
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if (newState == RecyclerView.SCROLL_STATE_IDLE) {
PicassoHelper.getInstance(getActivity()).resumeTag(AlbumListAdapter.TAG_HOME);
} else {
PicassoHelper.getInstance(getActivity()).pauseTag(AlbumListAdapter.TAG_HOME);
}
}
});
binding.refresher.setColorSchemeResources(R.color.md_grey_600, R.color.md_grey_800);
binding.refresher.setProgressViewOffset(true, 0, 100);
binding.refresher.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
sendToLoad(1);
}
});
}
private void getAlbumList() {
hasLoad = true;
Utils.setRefresher(binding.refresher, true);
mSubscription.add(NGApi.loadAlbumList(page)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.unsubscribeOn(Schedulers.io())
.subscribe(new Subscriber<AlbumList>() {
@Override
public void onCompleted() {
hasLoad = false;
Utils.setRefresher(binding.refresher, false);
unsubscribe();
}
@Override
public void onError(Throwable e) {
hasLoad = false;
Utils.setRefresher(binding.refresher, false);
String text;
if (e == null || TextUtils.isEmpty(e.getMessage())) {
text = getString(R.string.error);
} else if (e.getMessage().trim().equals(getString(R.string.notfound404))) {
text = getString(R.string.notfound404) + getString(R.string.maybe_no_more);
} else {
text = e.getMessage();
}
Snackbar.make(binding.getRoot(), text, Snackbar.LENGTH_LONG)
.setAction(R.string.retry, new View.OnClickListener() {
@Override
public void onClick(View view) {
sendToLoad(page);
}
}).show();
unsubscribe();
}
@Override
public void onNext(AlbumList albumList) {
if (albumList == null || albumList.getAlbum() == null || albumList.getAlbum().size() == 0) {
onError(new Exception(getString(R.string.exception_content_null)));
}
if (page == 1) {
adapter.setNewData(albumList.getAlbum());
} else {
adapter.addAll(albumList.getAlbum());
}
Album.updateRealm(activity.realm, albumList.getAlbum());
}
}));
}
private void getAlbumFromRealm() {
mSubscription.add(Observable.create(new Observable.OnSubscribe<List<Album>>() {
@Override
public void call(Subscriber<? super List<Album>> subscriber) {
List<Album> list = Album.all(activity.realm);
subscriber.onNext(list);
subscriber.onCompleted();
}
}).subscribeOn(AndroidSchedulers.mainThread())
.unsubscribeOn(AndroidSchedulers.mainThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<List<Album>>() {
@Override
public void call(List<Album> alba) {
if (alba != null && alba.size() > 0) {
adapter.setNewData(alba);
} else {
sendToLoad(1);
}
}
}));
}
private void loadMore() {
if (hasLoad) {
return;
}
page++;
sendToLoad(page);
}
@Override
public void onHiddenChanged(boolean hidden) {
super.onHiddenChanged(hidden);
if (hidden && mSubscription != null) {
mSubscription.clear();
hasLoad = false;
Utils.setRefresher(binding.refresher, false);
} else if (!hidden && adapter.size() == 0) {
initLoad();
}
}
public void startDetailActivity(View v, int i) {
Intent intent = new Intent(activity, DetailActivity.class);
intent.putExtra(DetailActivity.INTENT_ALBUM_ID, adapter.get(i).getId());
intent.putExtra(DetailActivity.INTENT_ALBUM_TITLE, adapter.get(i).getTitle());
ImageView imageView = (ImageView) v.findViewById(R.id.iv);
Bitmap bitmap = null;
BitmapDrawable bd = (BitmapDrawable) imageView.getDrawable();
if (bd != null) {
bitmap = bd.getBitmap();
}
ActivityOptionsCompat options = ActivityOptionsCompat
.makeThumbnailScaleUpAnimation(v, bitmap, 0, 0);
ActivityCompat.startActivity(activity, intent, options.toBundle());
}
}