/* * Copyright (c) 2014-2015 Sean Liu. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.github.baoti.pioneer.ui.common.page; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.widget.SwipeRefreshLayout; import com.github.baoti.android.presenter.Presenter; import com.github.baoti.pioneer.app.task.PageTask; import com.github.baoti.pioneer.app.task.Tasks; import com.github.baoti.pioneer.biz.interactor.PageInteractor; import java.util.Collection; /** * Created by liuyedong on 2015/1/2. */ public class PagePresenter<V extends IPageView<E>, E> extends Presenter<V> implements PageTask.LifecycleListener<E>, SwipeRefreshLayout.OnRefreshListener { private final PageTask<E> pageTask = new PageTask<>(); private PageInteractor<E> initialResInteractor; private PageInteractor<E> refreshInteractor; public void setInitialResInteractor(PageInteractor<E> interactor) { initialResInteractor = interactor; } @Override protected void onTakeView(V view) { super.onTakeView(view); pageTask.setLifecycleListener(this); } @Override protected void onLoad(@Nullable Bundle savedInstanceState, boolean reusing) { super.onLoad(savedInstanceState, reusing); if (pageTask.hasLoadedResources()) { getView().showResources(pageTask.getLoadedResources(), 0, 0, pageTask.getLoadedResources().size()); } } @Override protected void onDropView(V view) { super.onDropView(view); pageTask.setLifecycleListener(null); } @Override protected void onClose() { super.onClose(); pageTask.cancel(true); } public void onSwipeRefreshPrepared() { if (pageTask.isLoadingFirstPage()) { if (hasView()) { getView().showRefreshing(); } } else if (!pageTask.hasLoadedResources()) { loadInitialResources(); } } public void loadInitialResources() { if (initialResInteractor != null) { refresh(initialResInteractor); } else { if (hasView()) { getView().disableSwipeRefreshing(); } } } public void clearRefreshInteractor() { refreshInteractor = null; getView().disableSwipeRefreshing(); } protected void refresh(PageInteractor<E> interactor) { pageTask.loadFirstPage(interactor); refreshInteractor = interactor; if (hasView()) { getView().enableSwipeRefreshing(); } } @Override public void onRefresh() { if (refreshInteractor != null) { refresh(refreshInteractor); } else { getView().hideRefreshing(); } } public boolean hasNextPage() { return pageTask.hasNextPage(); } public PageTask.LoadState loadNextPage() { return pageTask.loadNextPage(); } public boolean isLoadingNextPage() { return pageTask.isLoadingNextPage(); } public boolean isFailedToLoadNextPage() { return pageTask.isFailedToLoadNextPage(); } @Override public void onStarted(Tasks.SafeTask task) { if (!hasView()) { return; } PageTask pageTask = (PageTask) task; if (pageTask.isFirstPage()) { getView().showRefreshing(); } else { getView().updateLoadingMore(); } } @Override public void onStopped(Tasks.SafeTask task) { if (!hasView()) { return; } if (((PageTask) task).isFirstPage()) { getView().hideRefreshing(); } getView().updateLoadingMore(); } @Override public void onPageChanged(PageTask pageTask, int start, int before, int count) { if (!hasView()) { return; } //noinspection unchecked Collection<E> resources = pageTask.getLoadedResources(); getView().showResources(resources, start, before, count); } }