package com.wangdaye.mysplash.collection.presenter.widget;
import android.content.Context;
import android.support.design.widget.Snackbar;
import com.wangdaye.mysplash.Mysplash;
import com.wangdaye.mysplash.R;
import com.wangdaye.mysplash.common.data.entity.unsplash.Collection;
import com.wangdaye.mysplash.common.data.entity.unsplash.Photo;
import com.wangdaye.mysplash.common.data.service.PhotoService;
import com.wangdaye.mysplash.common.i.model.PhotosModel;
import com.wangdaye.mysplash.common.i.presenter.PhotosPresenter;
import com.wangdaye.mysplash.common.i.view.PhotosView;
import com.wangdaye.mysplash.common._basic.MysplashActivity;
import com.wangdaye.mysplash.common.ui.adapter.PhotoAdapter;
import com.wangdaye.mysplash.common.utils.helper.NotificationHelper;
import com.wangdaye.mysplash.collection.model.widget.PhotosObject;
import java.util.List;
import retrofit2.Call;
import retrofit2.Response;
/**
* Photos implementor.
*
* A {@link PhotosPresenter} for
* {@link com.wangdaye.mysplash.collection.view.widget.CollectionPhotosView}.
*
* */
public class PhotosImplementor
implements PhotosPresenter {
private PhotosModel model;
private PhotosView view;
private OnRequestPhotosListener listener;
public PhotosImplementor(PhotosModel model, PhotosView view) {
this.model = model;
this.view = view;
}
// HTTP request.
@Override
public void requestPhotos(Context c, int page, boolean refresh) {
if (!model.isLoading() && !model.isRefreshing()) {
if (refresh) {
model.setRefreshing(true);
} else {
model.setLoading(true);
}
page = Math.max(1, refresh ? 1 : page + 1);
switch (model.getPhotosType()) {
case PhotosObject.PHOTOS_TYPE_NORMAL:
requestCollectionPhotos(c, (Collection) model.getRequestKey(), page, refresh);
break;
case PhotosObject.PHOTOS_TYPE_CURATED:
requestCuratedCollectionPhotos(c, (Collection) model.getRequestKey(), page, refresh);
break;
}
}
}
@Override
public void cancelRequest() {
if (listener != null) {
listener.cancel();
}
model.getService().cancel();
model.setRefreshing(false);
model.setLoading(false);
}
// load data interface.
@Override
public void refreshNew(Context c, boolean notify) {
if (notify) {
view.setRefreshing(true);
}
requestPhotos(c, model.getPhotosPage(), true);
}
@Override
public void loadMore(Context c, boolean notify) {
if (notify) {
view.setLoading(true);
}
requestPhotos(c, model.getPhotosPage(), false);
}
@Override
public void initRefresh(Context c) {
cancelRequest();
refreshNew(c, false);
view.initRefreshStart();
}
@Override
public boolean canLoadMore() {
return !model.isRefreshing() && !model.isLoading() && !model.isOver();
}
@Override
public boolean isRefreshing() {
return model.isRefreshing();
}
@Override
public boolean isLoading() {
return model.isLoading();
}
@Override
public Object getRequestKey() {
return model.getRequestKey();
}
@Override
public void setRequestKey(Object k) {
model.setRequestKey(k);
}
@Override
public int getPhotosType() {
return model.getPhotosType();
}
@Override
public String getPhotosOrder() {
return model.getPhotosOrder();
}
@Override
public void setOrder(String key) {
model.setPhotosOrder(key);
}
@Override
public String getOrder() {
return model.getPhotosOrder();
}
@Override
public void setPage(int page) {
model.setPhotosPage(page);
}
@Override
public void setPageList(List<Integer> pageList) {
model.setPageList(pageList);
}
@Override
public void setOver(boolean over) {
model.setOver(over);
view.setPermitLoading(!over);
}
@Override
public void setActivityForAdapter(MysplashActivity a) {
model.getAdapter().setActivity(a);
}
@Override
public PhotoAdapter getAdapter() {
return model.getAdapter();
}
// HTTP request.
private void requestCollectionPhotos(Context context,
Collection collection, int page, boolean refresh) {
listener = new OnRequestPhotosListener(context, page, refresh);
model.getService()
.requestCollectionPhotos(
collection.id,
page,
Mysplash.DEFAULT_PER_PAGE,
listener);
}
private void requestCuratedCollectionPhotos(Context context,
Collection collection, int page, boolean refresh) {
listener = new OnRequestPhotosListener(context, page, refresh);
model.getService()
.requestCuratedCollectionPhotos(
collection.id,
page,
Mysplash.DEFAULT_PER_PAGE,
listener);
}
// interface.
// on request photos listener.
private class OnRequestPhotosListener implements PhotoService.OnRequestPhotosListener {
// data
private Context c;
private int page;
private boolean refresh;
private boolean canceled;
OnRequestPhotosListener(Context c, int page, boolean refresh) {
this.c = c;
this.page = page;
this.refresh = refresh;
this.canceled = false;
}
public void cancel() {
canceled = true;
}
@Override
public void onRequestPhotosSuccess(Call<List<Photo>> call, Response<List<Photo>> response) {
if (canceled) {
return;
}
model.setRefreshing(false);
model.setLoading(false);
if (refresh) {
model.getAdapter().clearItem();
setOver(false);
view.setRefreshing(false);
} else {
view.setLoading(false);
}
if (response.isSuccessful()) {
model.setPhotosPage(page);
for (int i = 0; i < response.body().size(); i ++) {
model.getAdapter().insertItem(response.body().get(i));
}
if (response.body().size() < Mysplash.DEFAULT_PER_PAGE) {
setOver(true);
}
view.requestPhotosSuccess();
} else {
view.requestPhotosFailed(c.getString(R.string.feedback_load_nothing_tv));
}
}
@Override
public void onRequestPhotosFailed(Call<List<Photo>> call, Throwable t) {
if (canceled) {
return;
}
model.setRefreshing(false);
model.setLoading(false);
if (refresh) {
view.setRefreshing(false);
} else {
view.setLoading(false);
}
NotificationHelper.showSnackbar(
c.getString(R.string.feedback_load_failed_toast) + " (" + t.getMessage() + ")",
Snackbar.LENGTH_SHORT);
view.requestPhotosFailed(c.getString(R.string.feedback_load_failed_tv));
}
}
}