package br.com.dgimenes.nasapic.control.fragment;
import android.content.Context;
import android.graphics.Point;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.design.widget.Snackbar;
import android.support.v4.app.Fragment;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.Display;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.ProgressBar;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
import br.com.dgimenes.nasapic.R;
import br.com.dgimenes.nasapic.control.ErrorMessage;
import br.com.dgimenes.nasapic.control.adapter.SpacePicListAdapter;
import br.com.dgimenes.nasapic.model.SpacePic;
import br.com.dgimenes.nasapic.service.EventsLogger;
import br.com.dgimenes.nasapic.service.interactor.OnFinishListener;
import br.com.dgimenes.nasapic.service.interactor.SpacePicInteractor;
import butterknife.Bind;
import butterknife.ButterKnife;
public class RecentPicturesFragment extends Fragment implements SpacePicListAdapter.ErrorListener {
private static final String LOG_TAG = RecentPicturesFragment.class.getName();
@Bind(R.id.recent_pics_recycler_view)
RecyclerView recyclerView;
@Bind(R.id.list_loading_indicator)
ProgressBar listLoadingIndicator;
protected RecyclerView.Adapter recyclerViewAdapter;
protected RecyclerView.LayoutManager recyclerViewLayoutManager;
protected List<SpacePic> spacePics;
protected int nextPageToLoad;
protected Boolean loadingFeed = false;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
ViewGroup rootView = (ViewGroup) inflater.inflate(
R.layout.fragment_recent_tab, container, false);
ButterKnife.bind(this, rootView);
setupUI();
return rootView;
}
protected void setupUI() {
recyclerView.setHasFixedSize(true);
recyclerViewLayoutManager = new LinearLayoutManager(getActivity());
recyclerView.setLayoutManager(recyclerViewLayoutManager);
spacePics = new ArrayList<>();
recyclerViewAdapter = new SpacePicListAdapter(getActivity(),
spacePics, this, getDisplayWidth());
recyclerView.setAdapter(recyclerViewAdapter);
nextPageToLoad = 1;
loadFeed();
}
protected void loadFeed() {
synchronized (loadingFeed) {
if (!loadingFeed) {
loadingFeed = true;
}
}
SpacePicInteractor spacePicInteractor = new SpacePicInteractor(getActivity());
spacePicInteractor.getFeed(nextPageToLoad, new OnFinishListener<List<SpacePic>>() {
@Override
public void onSuccess(List<SpacePic> loadedPics) {
spacePics.addAll(loadedPics);
recyclerViewAdapter.notifyDataSetChanged();
if (recyclerView.getVisibility() == View.GONE) {
recyclerView.setVisibility(View.VISIBLE);
}
listLoadingIndicator.setVisibility(View.GONE);
nextPageToLoad++;
EventsLogger.logEvent("Recent pictures loaded");
releaseLoadingFeed();
}
@Override
public void onError(Throwable throwable) {
ErrorMessage error = ErrorMessage.LOADING_RECENT_PICS;
EventsLogger.logError(error, throwable);
error(getResources().getString(error.userMessageRes));
releaseLoadingFeed();
}
private void releaseLoadingFeed() {
synchronized (loadingFeed) {
loadingFeed = false;
setupInfiniteScroll();
}
}
});
}
protected void setupInfiniteScroll() {
recyclerView.clearOnScrollListeners();
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
boolean canScrollDown = recyclerView.canScrollVertically(1);
synchronized (this) {
if (!canScrollDown && !loadingFeed) {
String loadingMessage =
getResources().getString(R.string.loading_more_apods);
Snackbar.make(recyclerView, loadingMessage, Snackbar.LENGTH_LONG).show();
listLoadingIndicator.setVisibility(View.VISIBLE);
listLoadingIndicator.bringToFront();
loadFeed();
}
}
}
});
}
@Override
public void error(String errorMessage) {
Toast.makeText(getActivity(), errorMessage, Toast.LENGTH_LONG).show();
Log.d(LOG_TAG, errorMessage);
}
protected int getDisplayWidth() {
Display display = ((WindowManager) getActivity().getSystemService(Context.WINDOW_SERVICE))
.getDefaultDisplay();
Point size = new Point();
display.getSize(size);
return size.x;
}
}