package com.wangdaye.mysplash.me.view.widget; import android.annotation.SuppressLint; import android.os.Bundle; import android.support.v4.view.ViewCompat; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.widget.ImageView; import android.widget.RelativeLayout; import android.widget.TextView; import com.github.rahatarmanahmed.cpv.CircularProgressView; import com.wangdaye.mysplash.Mysplash; import com.wangdaye.mysplash.R; import com.wangdaye.mysplash.common.data.entity.item.MyFollowUser; import com.wangdaye.mysplash.common.i.model.LoadModel; import com.wangdaye.mysplash.common.i.model.MyFollowModel; import com.wangdaye.mysplash.common.i.model.ScrollModel; import com.wangdaye.mysplash.common.i.presenter.LoadPresenter; import com.wangdaye.mysplash.common.i.presenter.MyFollowPresenter; import com.wangdaye.mysplash.common.i.presenter.PagerPresenter; import com.wangdaye.mysplash.common.i.presenter.ScrollPresenter; import com.wangdaye.mysplash.common.i.presenter.SwipeBackPresenter; import com.wangdaye.mysplash.common.i.view.LoadView; import com.wangdaye.mysplash.common.i.view.MyFollowView; import com.wangdaye.mysplash.common.i.view.PagerView; import com.wangdaye.mysplash.common.i.view.ScrollView; import com.wangdaye.mysplash.common.i.view.SwipeBackView; import com.wangdaye.mysplash.common._basic.MysplashActivity; import com.wangdaye.mysplash.common.ui.adapter.MyFollowAdapter; import com.wangdaye.mysplash.common.ui.widget.SwipeBackCoordinatorLayout; import com.wangdaye.mysplash.common.ui.widget.nestedScrollView.NestedScrollFrameLayout; import com.wangdaye.mysplash.common.ui.widget.swipeRefreshView.BothWaySwipeRefreshLayout; import com.wangdaye.mysplash.common.utils.AnimUtils; import com.wangdaye.mysplash.common.utils.BackToTopUtils; import com.wangdaye.mysplash.common.utils.DisplayUtils; import com.wangdaye.mysplash.common.utils.helper.ImageHelper; import com.wangdaye.mysplash.common.utils.manager.ThemeManager; import com.wangdaye.mysplash.me.model.widget.LoadObject; import com.wangdaye.mysplash.me.model.widget.MyFollowObject; import com.wangdaye.mysplash.me.model.widget.ScrollObject; import com.wangdaye.mysplash.me.presenter.widget.LoadImplementor; import com.wangdaye.mysplash.me.presenter.widget.MyFollowImplementor; import com.wangdaye.mysplash.me.presenter.widget.PagerImplementor; import com.wangdaye.mysplash.me.presenter.widget.ScrollImplementor; import com.wangdaye.mysplash.me.presenter.widget.SwipeBackImplementor; import java.util.ArrayList; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick; /** * My follow user view. * * This view is used to show followers fo application user. * * */ @SuppressLint("ViewConstructor") public class MyFollowUserView extends NestedScrollFrameLayout implements MyFollowView, PagerView, LoadView, ScrollView, SwipeBackView, BothWaySwipeRefreshLayout.OnRefreshAndLoadListener, MyFollowAdapter.OnFollowStateChangedListener { @BindView(R.id.container_loading_view_large_progressView) CircularProgressView progressView; @BindView(R.id.container_loading_view_large_feedbackContainer) RelativeLayout feedbackContainer; @BindView(R.id.container_loading_view_large_feedbackTxt) TextView feedbackText; @BindView(R.id.container_photo_list_swipeRefreshLayout) BothWaySwipeRefreshLayout refreshLayout; @BindView(R.id.container_photo_list_recyclerView) RecyclerView recyclerView; private MyFollowModel myFollowModel; private MyFollowPresenter myFollowPresenter; private PagerPresenter pagerPresenter; private LoadModel loadModel; private LoadPresenter loadPresenter; private ScrollModel scrollModel; private ScrollPresenter scrollPresenter; private SwipeBackPresenter swipeBackPresenter; public MyFollowUserView(MysplashActivity a, int photosType) { super(a); this.initialize(a, photosType); } // init. @SuppressLint("InflateParams") private void initialize(MysplashActivity a, int followType) { View loadingView = LayoutInflater.from(getContext()) .inflate(R.layout.container_loading_view_large, this, false); addView(loadingView); View contentView = LayoutInflater.from(getContext()) .inflate(R.layout.container_photo_list, null); addView(contentView); ButterKnife.bind(this, this); initModel(a, followType); initPresenter(); initView(); } // init. private void initModel(MysplashActivity a, int followType) { this.myFollowModel = new MyFollowObject( new MyFollowAdapter(a, new ArrayList<MyFollowUser>(Mysplash.DEFAULT_PER_PAGE), this), followType); this.loadModel = new LoadObject(LoadObject.LOADING_STATE); this.scrollModel = new ScrollObject(); } private void initPresenter() { this.myFollowPresenter = new MyFollowImplementor(myFollowModel, this); this.pagerPresenter = new PagerImplementor(this); this.loadPresenter = new LoadImplementor(loadModel, this); this.scrollPresenter = new ScrollImplementor(scrollModel, this); this.swipeBackPresenter = new SwipeBackImplementor(this); } private void initView() { this.initContentView(); this.initLoadingView(); } private void initContentView() { refreshLayout.setColorSchemeColors(ThemeManager.getContentColor(getContext())); refreshLayout.setProgressBackgroundColorSchemeColor(ThemeManager.getRootColor(getContext())); refreshLayout.setOnRefreshAndLoadListener(this); refreshLayout.setPermitRefresh(false); refreshLayout.setVisibility(GONE); recyclerView.setAdapter(myFollowPresenter.getAdapter()); recyclerView.setLayoutManager( new GridLayoutManager( getContext(), DisplayUtils.getGirdColumnCount(getContext()))); recyclerView.addOnScrollListener(onScrollListener); } private void initLoadingView() { progressView.setVisibility(VISIBLE); feedbackContainer.setVisibility(GONE); ImageView feedbackImg = ButterKnife.findById( this, R.id.container_loading_view_large_feedbackImg); ImageHelper.loadIcon(getContext(), feedbackImg, R.drawable.feedback_no_photos); } // control. @Override public boolean isParentOffset() { return true; } public int getDeltaValue() { return myFollowPresenter.getDeltaValue(); } // interface. // on click listener. @OnClick(R.id.container_loading_view_large_feedbackBtn) void retryRefresh() { myFollowPresenter.initRefresh(getContext()); } // on refresh an load listener. @Override public void onRefresh() { myFollowPresenter.refreshNew(getContext(), false); } @Override public void onLoad() { myFollowPresenter.loadMore(getContext(), false); } // on follow state changed listener. @Override public void onFollowStateChanged(String username, int position, boolean switchTo, boolean succeed) { if (succeed) { myFollowPresenter.setDeltaValue(switchTo ? 1 : -1); } LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager(); int firstPosition = layoutManager.findFirstVisibleItemPosition(); int lastPosition = layoutManager.findLastVisibleItemPosition(); if (firstPosition <= position && position <= lastPosition) { MyFollowAdapter.ViewHolder holder = (MyFollowAdapter.ViewHolder) recyclerView.findViewHolderForAdapterPosition(position); holder.setSwitchResult(succeed); } } // on scroll listener. private RecyclerView.OnScrollListener onScrollListener = new RecyclerView.OnScrollListener() { @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); scrollPresenter.autoLoad(dy); } }; // view. // photos view. @Override public void setRefreshing(boolean refreshing) { refreshLayout.setRefreshing(refreshing); } @Override public void setLoading(boolean loading) { refreshLayout.setLoading(loading); } @Override public void setPermitRefreshing(boolean permit) { refreshLayout.setPermitRefresh(permit); } @Override public void setPermitLoading(boolean permit) { refreshLayout.setPermitLoad(permit); } @Override public void initRefreshStart() { loadPresenter.setLoadingState(); } @Override public void requestMyFollowSuccess() { loadPresenter.setNormalState(); } @Override public void requestMyFollowFailed(String feedback) { feedbackText.setText(feedback); loadPresenter.setFailedState(); } // pager view. @Override public void onSaveInstanceState(Bundle bundle) { } @Override public void onRestoreInstanceState(Bundle bundle) { } @Override public void checkToRefresh() { // interface if (pagerPresenter.checkNeedRefresh()) { pagerPresenter.refreshPager(); } } @Override public boolean checkNeedRefresh() { return loadPresenter.getLoadState() == LoadObject.FAILED_STATE || (loadPresenter.getLoadState() == LoadObject.LOADING_STATE && !myFollowPresenter.isRefreshing() && !myFollowPresenter.isLoading()); } @Override public boolean checkNeedBackToTop() { return scrollPresenter.needBackToTop(); } @Override public void refreshPager() { myFollowPresenter.initRefresh(getContext()); } @Override public void scrollToPageTop() { // interface. scrollPresenter.scrollToTop(); } @Override public void cancelRequest() { myFollowPresenter.cancelRequest(); } @Override public void setKey(String key) { // do nothing. } @Override public String getKey() { return null; } @Override public boolean canSwipeBack(int dir) { return swipeBackPresenter.checkCanSwipeBack(dir); } @Override public int getItemCount() { if (loadPresenter.getLoadState() != LoadObject.NORMAL_STATE) { return 0; } else { return myFollowPresenter.getAdapter().getItemCount(); } } // load view. @Override public void animShow(View v) { AnimUtils.animShow(v); } @Override public void animHide(final View v) { AnimUtils.animHide(v); } @Override public void setLoadingState() { animShow(progressView); animHide(feedbackContainer); } @Override public void setFailedState() { animShow(feedbackContainer); animHide(progressView); } @Override public void setNormalState() { animShow(refreshLayout); animHide(progressView); } @Override public void resetLoadingState() { animShow(progressView); animHide(refreshLayout); } // scroll view. @Override public void scrollToTop() { BackToTopUtils.scrollToTop(recyclerView); } @Override public void autoLoad(int dy) { int lastVisibleItem = ((GridLayoutManager) recyclerView.getLayoutManager()) .findLastVisibleItemPosition(); int totalItemCount = recyclerView.getAdapter().getItemCount(); if (myFollowPresenter.canLoadMore() && lastVisibleItem >= totalItemCount - 10 && totalItemCount > 0 && dy > 0) { myFollowPresenter.loadMore(getContext(), false); } if (!ViewCompat.canScrollVertically(recyclerView, -1)) { scrollPresenter.setToTop(true); } else { scrollPresenter.setToTop(false); } if (!ViewCompat.canScrollVertically(recyclerView, 1) && myFollowPresenter.isLoading()) { refreshLayout.setLoading(true); } } @Override public boolean needBackToTop() { return !scrollPresenter.isToTop() && loadPresenter.getLoadState() == LoadObject.NORMAL_STATE; } // swipe back view. @Override public boolean checkCanSwipeBack(int dir) { switch (loadPresenter.getLoadState()) { case LoadObject.NORMAL_STATE: return SwipeBackCoordinatorLayout.canSwipeBack(recyclerView, dir) || myFollowPresenter.getAdapter().getItemCount() <= 0; default: return true; } } }