package com.wangdaye.mysplash.me.view.activity; import android.os.Bundle; import android.support.design.widget.CoordinatorLayout; import android.support.design.widget.TabLayout; import android.support.v4.view.ViewPager; import android.support.v7.widget.Toolbar; import android.view.View; import com.wangdaye.mysplash.R; import com.wangdaye.mysplash.common.data.entity.unsplash.User; import com.wangdaye.mysplash.common.i.model.PagerManageModel; import com.wangdaye.mysplash.common.i.model.UserModel; import com.wangdaye.mysplash.common.i.presenter.PagerManagePresenter; import com.wangdaye.mysplash.common.i.presenter.SwipeBackManagePresenter; import com.wangdaye.mysplash.common.i.presenter.ToolbarPresenter; import com.wangdaye.mysplash.common.i.presenter.UserPresenter; import com.wangdaye.mysplash.common.i.view.PagerManageView; import com.wangdaye.mysplash.common.i.view.PagerView; import com.wangdaye.mysplash.common.i.view.SwipeBackManageView; import com.wangdaye.mysplash.common.i.view.UserView; import com.wangdaye.mysplash.common._basic.MysplashActivity; import com.wangdaye.mysplash.common.ui.adapter.MyPagerAdapter; import com.wangdaye.mysplash.common.ui.widget.SwipeBackCoordinatorLayout; import com.wangdaye.mysplash.common.ui.widget.coordinatorView.StatusBarView; import com.wangdaye.mysplash.common.ui.widget.nestedScrollView.NestedScrollAppBarLayout; import com.wangdaye.mysplash.common.utils.AnimUtils; import com.wangdaye.mysplash.common.utils.BackToTopUtils; import com.wangdaye.mysplash.common.utils.manager.AuthManager; import com.wangdaye.mysplash.common.utils.manager.ThemeManager; import com.wangdaye.mysplash.me.model.activity.PagerManageObject; import com.wangdaye.mysplash.me.model.activity.UserObject; import com.wangdaye.mysplash.me.model.widget.MyFollowObject; import com.wangdaye.mysplash.me.presenter.activity.PagerManageImplementor; import com.wangdaye.mysplash.me.presenter.activity.SwipeBackManageImplementor; import com.wangdaye.mysplash.me.presenter.activity.ToolbarImplementor; import com.wangdaye.mysplash.me.presenter.activity.UserImplementor; import com.wangdaye.mysplash.me.view.widget.MyFollowUserView; import java.util.ArrayList; import java.util.Collections; import java.util.List; import butterknife.BindView; import butterknife.ButterKnife; /** * My follow activity. * * This activity is used to show followers for application user. * * */ public class MyFollowActivity extends MysplashActivity implements UserView, PagerManageView, SwipeBackManageView, View.OnClickListener, ViewPager.OnPageChangeListener, SwipeBackCoordinatorLayout.OnSwipeListener { @BindView(R.id.activity_my_follow_container) CoordinatorLayout container; @BindView(R.id.activity_my_follow_statusBar) StatusBarView statusBar; @BindView(R.id.activity_my_follow_appBar) NestedScrollAppBarLayout appBar; @BindView(R.id.activity_my_follow_viewPager) ViewPager viewPager; private PagerView[] pagers = new PagerView[2]; private UserModel userModel; private UserPresenter userPresenter; private ToolbarPresenter toolbarPresenter; private PagerManageModel pagerManageModel; private PagerManagePresenter pagerManagePresenter; private SwipeBackManagePresenter swipeBackManagePresenter; public static final String KEY_MY_FOLLOW_ACTIVITY_PAGE_POSITION = "my_follow_activity_page_position"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my_follow); initModel(savedInstanceState); initPresenter(); } @Override protected void onStart() { super.onStart(); if (!isStarted()) { setStarted(); ButterKnife.bind(this); initView(); userPresenter.requestUser(); } } @Override protected void onDestroy() { super.onDestroy(); if (userPresenter.getUser() != null) { User user = userPresenter.getUser(); user.followers_count += ((MyFollowUserView) pagers[0]).getDeltaValue(); user.following_count += ((MyFollowUserView) pagers[1]).getDeltaValue(); if (AuthManager.getInstance().getUser() == null) { AuthManager.getInstance().updateUser(user); } else { User oldUser = AuthManager.getInstance().getUser(); oldUser.followers_count = user.followers_count; oldUser.following_count = user.following_count; AuthManager.getInstance().updateUser(oldUser); } } for (PagerView p : pagers) { p.cancelRequest(); } } @Override protected void setTheme() { if (ThemeManager.getInstance(this).isLightTheme()) { setTheme(R.style.MysplashTheme_light_Translucent_Common); } else { setTheme(R.style.MysplashTheme_dark_Translucent_Common); } } @Override public void onSaveInstanceState(Bundle outState) { outState.putInt(KEY_MY_FOLLOW_ACTIVITY_PAGE_POSITION, pagerManagePresenter.getPagerPosition()); } @Override public void handleBackPressed() { if (pagerManagePresenter.needPagerBackToTop() && BackToTopUtils.isSetBackToTop(false)) { backToTop(); } else { finishActivity(SwipeBackCoordinatorLayout.DOWN_DIR); } } @Override protected void backToTop() { BackToTopUtils.showTopBar(appBar, viewPager); pagerManagePresenter.pagerScrollToTop(); } @Override public void finishActivity(int dir) { SwipeBackCoordinatorLayout.hideBackgroundShadow(container); finish(); switch (dir) { case SwipeBackCoordinatorLayout.UP_DIR: overridePendingTransition(0, R.anim.activity_slide_out_top); break; case SwipeBackCoordinatorLayout.DOWN_DIR: overridePendingTransition(0, R.anim.activity_slide_out_bottom); break; } } @Override public CoordinatorLayout getSnackbarContainer() { return container; } // init. private void initModel(Bundle savedInstanceState) { int page = 0; if (savedInstanceState != null) { page = savedInstanceState.getInt(KEY_MY_FOLLOW_ACTIVITY_PAGE_POSITION, page); } else { page = getIntent().getIntExtra(KEY_MY_FOLLOW_ACTIVITY_PAGE_POSITION, page); } this.userModel = new UserObject(); this.pagerManageModel = new PagerManageObject(page); } private void initPresenter() { this.userPresenter = new UserImplementor(userModel, this); this.toolbarPresenter = new ToolbarImplementor(); this.pagerManagePresenter = new PagerManageImplementor(pagerManageModel, this); this.swipeBackManagePresenter = new SwipeBackManageImplementor(this); } private void initView() { SwipeBackCoordinatorLayout swipeBackView = ButterKnife.findById( this, R.id.activity_my_follow_swipeBackView); swipeBackView.setOnSwipeListener(this); Toolbar toolbar = ButterKnife.findById(this, R.id.activity_my_follow_toolbar); toolbar.setTitle(getString(R.string.my_follow)); ThemeManager.setNavigationIcon( toolbar, R.drawable.ic_toolbar_back_light, R.drawable.ic_toolbar_back_dark); toolbar.setNavigationOnClickListener(this); initPages(); AnimUtils.animInitShow( (View) pagers[pagerManagePresenter.getPagerPosition()], 400); for (PagerView p : pagers) { p.refreshPager(); } } private void initPages() { List<View> pageList = new ArrayList<>(); pageList.add(new MyFollowUserView(this, MyFollowObject.FOLLOW_TYPE_FOLLOWERS)); pageList.add(new MyFollowUserView(this, MyFollowObject.FOLLOW_TYPE_FOLLOWING)); for (int i = 0; i < pageList.size(); i ++) { pagers[i] = (PagerView) pageList.get(i); } String[] myFollowTabs = getResources().getStringArray(R.array.my_follow_tabs); List<String> tabList = new ArrayList<>(); Collections.addAll(tabList, myFollowTabs); MyPagerAdapter adapter = new MyPagerAdapter(pageList, tabList); viewPager.setAdapter(adapter); viewPager.addOnPageChangeListener(this); viewPager.setCurrentItem(pagerManagePresenter.getPagerPosition(), false); TabLayout tabLayout = ButterKnife.findById(this, R.id.activity_my_follow_tabLayout); tabLayout.setTabGravity(TabLayout.GRAVITY_FILL); tabLayout.setupWithViewPager(viewPager); } // interface. // on click listener. @Override public void onClick(View view) { switch (view.getId()) { case -1: toolbarPresenter.touchNavigatorIcon(this); break; } } // on page change listener. @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { // do nothing. } @Override public void onPageSelected(int position) { pagerManagePresenter.setPagerPosition(position); if (AuthManager.getInstance().getState() != AuthManager.LOADING_ME_STATE) { pagerManagePresenter.checkToRefresh(position); } } @Override public void onPageScrollStateChanged(int state) { // do nothing. } // on swipe listener.(swipe back listener) @Override public boolean canSwipeBack(int dir) { return swipeBackManagePresenter.checkCanSwipeBack(dir); } @Override public void onSwipeProcess(float percent) { statusBar.setAlpha(1 - percent); container.setBackgroundColor(SwipeBackCoordinatorLayout.getBackgroundColor(percent)); } @Override public void onSwipeFinish(int dir) { swipeBackManagePresenter.swipeBackFinish(this, dir); } // view. // user view. @Override public void drawUserInfo(User user) { String[] myFollowTabs = getResources().getStringArray(R.array.my_follow_tabs); MyPagerAdapter adapter = (MyPagerAdapter) viewPager.getAdapter(); adapter.titleList.set(0, user.followers_count + " " + myFollowTabs[0]); adapter.titleList.set(1, user.following_count + " " + myFollowTabs[1]); adapter.notifyDataSetChanged(); } @Override public void initRefreshStart() { // do nothing. } @Override public void followRequestSuccess(boolean follow) { // do nothing. } @Override public void followRequestFailed(boolean follow) { // do nothing. } // pager manage view. @Override public PagerView getPagerView(int position) { return pagers[position]; } @Override public boolean canPagerSwipeBack(int position, int dir) { return pagers[position].canSwipeBack(dir); } @Override public int getPagerItemCount(int position) { return pagers[position].getItemCount(); } // swipe back manage view. @Override public boolean checkCanSwipeBack(int dir) { if (dir == SwipeBackCoordinatorLayout.UP_DIR) { return pagerManagePresenter.canPagerSwipeBack(dir) && appBar.getY() <= -appBar.getMeasuredHeight() + getResources().getDimensionPixelSize(R.dimen.tab_layout_height); } else { return pagerManagePresenter.canPagerSwipeBack(dir) && appBar.getY() >= 0; } } }