package com.wangdaye.mysplash.user.view.activity; import android.content.Intent; import android.os.Build; import android.os.Bundle; import android.support.annotation.IntDef; 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.text.TextUtils; import android.view.MenuItem; import android.view.View; import android.widget.TextView; import com.wangdaye.mysplash.Mysplash; import com.wangdaye.mysplash.R; import com.wangdaye.mysplash.collection.view.activity.CollectionActivity; import com.wangdaye.mysplash.common._basic.ReadWriteActivity; import com.wangdaye.mysplash.common.data.entity.unsplash.Collection; import com.wangdaye.mysplash.common.data.entity.unsplash.Photo; import com.wangdaye.mysplash.common.data.entity.unsplash.User; import com.wangdaye.mysplash.common.i.model.DownloadModel; import com.wangdaye.mysplash.common.i.presenter.DownloadPresenter; import com.wangdaye.mysplash.common.ui.adapter.PhotoAdapter; import com.wangdaye.mysplash.common.ui.dialog.ProfileDialog; import com.wangdaye.mysplash.common.ui.dialog.SelectCollectionDialog; import com.wangdaye.mysplash.common.ui.widget.CircleImageView; import com.wangdaye.mysplash.common.ui.widget.nestedScrollView.NestedScrollAppBarLayout; import com.wangdaye.mysplash.common.ui.widget.SwipeBackCoordinatorLayout; import com.wangdaye.mysplash.common.utils.DisplayUtils; import com.wangdaye.mysplash.common.utils.helper.IntentHelper; import com.wangdaye.mysplash.common.utils.helper.ImageHelper; import com.wangdaye.mysplash.common.utils.manager.AuthManager; import com.wangdaye.mysplash.common.i.model.BrowsableModel; import com.wangdaye.mysplash.common.i.model.PagerManageModel; import com.wangdaye.mysplash.common.i.presenter.BrowsablePresenter; import com.wangdaye.mysplash.common.i.presenter.PagerManagePresenter; import com.wangdaye.mysplash.common.i.presenter.PopupManagePresenter; import com.wangdaye.mysplash.common.i.presenter.SwipeBackManagePresenter; import com.wangdaye.mysplash.common.i.presenter.ToolbarPresenter; import com.wangdaye.mysplash.common.i.view.BrowsableView; import com.wangdaye.mysplash.common.i.view.PagerManageView; import com.wangdaye.mysplash.common.i.view.PagerView; import com.wangdaye.mysplash.common.i.view.PopupManageView; import com.wangdaye.mysplash.common.i.view.SwipeBackManageView; import com.wangdaye.mysplash.common.ui.adapter.MyPagerAdapter; import com.wangdaye.mysplash.common.ui.dialog.RequestBrowsableDataDialog; import com.wangdaye.mysplash.common.utils.AnimUtils; import com.wangdaye.mysplash.common.utils.BackToTopUtils; import com.wangdaye.mysplash.common.ui.widget.coordinatorView.StatusBarView; import com.wangdaye.mysplash.common.utils.manager.ThemeManager; import com.wangdaye.mysplash.me.view.activity.MeActivity; import com.wangdaye.mysplash.photo.view.activity.PhotoActivity; import com.wangdaye.mysplash.user.model.activity.BorwsableObject; import com.wangdaye.mysplash.user.model.activity.DownloadObject; import com.wangdaye.mysplash.user.model.activity.PagerManageObject; import com.wangdaye.mysplash.user.model.widget.PhotosObject; import com.wangdaye.mysplash.user.presenter.activity.BrowsableImplementor; import com.wangdaye.mysplash.user.presenter.activity.DownloadImplementor; import com.wangdaye.mysplash.user.presenter.activity.PagerManageImplementor; import com.wangdaye.mysplash.user.presenter.activity.PopupManageImplementor; import com.wangdaye.mysplash.user.presenter.activity.SwipeBackManageImplementor; import com.wangdaye.mysplash.user.presenter.activity.ToolbarImplementor; import com.wangdaye.mysplash.user.view.widget.UserCollectionsView; import com.wangdaye.mysplash.user.view.widget.UserPhotosView; import com.wangdaye.mysplash.user.view.widget.UserProfileView; import java.util.ArrayList; import java.util.Collections; import java.util.List; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick; /** * User activity. * * This activity is used to show the information of a user. * * */ public class UserActivity extends ReadWriteActivity implements PagerManageView, PopupManageView, SwipeBackManageView, BrowsableView, View.OnClickListener, Toolbar.OnMenuItemClickListener, UserProfileView.OnRequestUserListener, PhotoAdapter.OnDownloadPhotoListener, ViewPager.OnPageChangeListener, SwipeBackCoordinatorLayout.OnSwipeListener, SelectCollectionDialog.OnCollectionsChangedListener { @BindView(R.id.activity_user_container) CoordinatorLayout container; @BindView(R.id.activity_user_statusBar) StatusBarView statusBar; @BindView(R.id.activity_user_appBar) NestedScrollAppBarLayout appBar; @BindView(R.id.activity_user_toolbar) Toolbar toolbar; @BindView(R.id.activity_user_profileView) UserProfileView userProfileView; @BindView(R.id.activity_user_viewPager) ViewPager viewPager; private MyPagerAdapter adapter; private PagerView[] pagers = new PagerView[3]; private RequestBrowsableDataDialog requestDialog; private ToolbarPresenter toolbarPresenter; private PagerManageModel pagerManageModel; private PagerManagePresenter pagerManagePresenter; private PopupManagePresenter popupManagePresenter; private SwipeBackManagePresenter swipeBackManagePresenter; private BrowsableModel browsableModel; private BrowsablePresenter browsablePresenter; private DownloadModel downloadModel; private DownloadPresenter downloadPresenter; public static final String KEY_USER_ACTIVITY_USER = "user_activity_user"; public static final String KEY_USER_ACTIVITY_PAGE_POSITION = "user_activity_page_position"; public static final int PAGE_PHOTO = 0; public static final int PAGE_LIKE = 1; public static final int PAGE_COLLECTION = 2; @IntDef({PAGE_PHOTO, PAGE_LIKE, PAGE_COLLECTION}) public @interface UserPageRule {} public static class SavedStateFragment extends BaseSavedStateFragment { private List<Photo> photoList; private List<Collection> collectionList; private List<Photo> likeList; public List<Photo> getPhotoList() { return photoList; } public void setPhotoList(List<Photo> photoList) { this.photoList = photoList; } public List<Collection> getCollectionList() { return collectionList; } public void setCollectionList(List<Collection> collectionList) { this.collectionList = collectionList; } public List<Photo> getLikeList() { return likeList; } public void setLikeList(List<Photo> likeList) { this.likeList = likeList; } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_user); initModel(savedInstanceState); initPresenter(); } @Override protected void onStart() { super.onStart(); if (!isStarted()) { setStarted(); ButterKnife.bind(this); initView(true); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (data == null) { return; } switch (requestCode) { case Mysplash.PHOTO_ACTIVITY: Photo photo = data.getParcelableExtra(PhotoActivity.KEY_PHOTO_ACTIVITY_PHOTO); if (photo != null) { ((UserPhotosView) pagers[0]).updatePhoto(photo, false); ((UserPhotosView) pagers[1]).updatePhoto(photo, false); } break; case Mysplash.COLLECTION_ACTIVITY: Collection collection = data.getParcelableExtra( CollectionActivity.KEY_COLLECTION_ACTIVITY_COLLECTION); if (collection != null) { ((UserCollectionsView) pagers[2]).updateCollection(collection, false); } break; } } @Override protected void onDestroy() { super.onDestroy(); browsablePresenter.cancelRequest(); if (userProfileView != null) { userProfileView.cancelRequest(); } for (PagerView p : pagers) { if (p != null) { p.cancelRequest(); } } } @Override protected void setTheme() { if (ThemeManager.getInstance(this).isLightTheme()) { setTheme(R.style.MysplashTheme_light_Translucent_User); } else { setTheme(R.style.MysplashTheme_dark_Translucent_User); } if (DisplayUtils.isLandscape(this)) { DisplayUtils.cancelTranslucentNavigation(this); } } @Override public void onSaveInstanceState(Bundle outState) { // write large data. SavedStateFragment f = new SavedStateFragment(); if (pagers[0] != null) { f.setPhotoList(((UserPhotosView) pagers[0]).getPhotos()); } if (pagers[1] != null) { f.setLikeList(((UserPhotosView) pagers[1]).getPhotos()); } if (pagers[2] != null) { f.setCollectionList(((UserCollectionsView) pagers[2]).getCollections()); } f.saveData(this); // write normal data. super.onSaveInstanceState(outState); outState.putInt(KEY_USER_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); if (!browsablePresenter.isBrowsable() && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { finishAfterTransition(); } else { 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_USER_ACTIVITY_PAGE_POSITION, page); } else { page = getIntent().getIntExtra(KEY_USER_ACTIVITY_PAGE_POSITION, page); } this.pagerManageModel = new PagerManageObject(page); this.browsableModel = new BorwsableObject(getIntent()); this.downloadModel = new DownloadObject(); } private void initPresenter() { this.toolbarPresenter = new ToolbarImplementor(); this.pagerManagePresenter = new PagerManageImplementor(pagerManageModel, this); this.popupManagePresenter = new PopupManageImplementor(this); this.swipeBackManagePresenter = new SwipeBackManageImplementor(this); this.browsablePresenter = new BrowsableImplementor(browsableModel, this); this.downloadPresenter = new DownloadImplementor(downloadModel); } private void initView(boolean init) { User u = getIntent().getParcelableExtra(KEY_USER_ACTIVITY_USER); if (init && browsablePresenter.isBrowsable() && u == null) { browsablePresenter.requestBrowsableData(); } else { SwipeBackCoordinatorLayout swipeBackView = (SwipeBackCoordinatorLayout) findViewById(R.id.activity_user_swipeBackView); swipeBackView.setOnSwipeListener(this); if (browsablePresenter.isBrowsable()) { ThemeManager.setNavigationIcon( toolbar, R.drawable.ic_toolbar_home_light, R.drawable.ic_toolbar_home_dark); } else { ThemeManager.setNavigationIcon( toolbar, R.drawable.ic_toolbar_back_light, R.drawable.ic_toolbar_back_dark); } ThemeManager.inflateMenu( toolbar, R.menu.activity_user_toolbar_light, R.menu.activity_user_toolbar_dark); toolbar.setOnMenuItemClickListener(this); toolbar.setNavigationOnClickListener(this); if (TextUtils.isEmpty(u.portfolio_url)) { toolbar.getMenu().getItem(0).setVisible(false); } else { toolbar.getMenu().getItem(0).setVisible(true); } CircleImageView avatar = ButterKnife.findById(this, R.id.activity_user_avatar); avatar.setOnClickListener(new OnClickAvatarListener(u)); ImageHelper.loadAvatar(this, avatar, u, null); TextView title = ButterKnife.findById(this, R.id.activity_user_title); title.setText(u.name); initPages(u); userProfileView.setOnRequestUserListener(this); userProfileView.setUser(u, adapter); if (u.complete) { userProfileView.drawUserInfo(u); } else { userProfileView.requestUserProfile(); } } } private void initPages(User u) { List<View> pageList = new ArrayList<>(); pageList.add(new UserPhotosView(this, u, PhotosObject.PHOTOS_TYPE_PHOTOS, R.id.activity_user_page_photo)); pageList.add(new UserPhotosView(this, u, PhotosObject.PHOTOS_TYPE_LIKES, R.id.activity_user_page_like)); pageList.add(new UserCollectionsView(this, u, R.id.activity_user_page_collection)); for (int i = 0; i < pageList.size(); i ++) { pagers[i] = (PagerView) pageList.get(i); } String[] userTabs = getResources().getStringArray(R.array.user_tabs); List<String> tabList = new ArrayList<>(); Collections.addAll(tabList, userTabs); this.adapter = new MyPagerAdapter(pageList, tabList); viewPager.setAdapter(adapter); viewPager.setCurrentItem(pagerManagePresenter.getPagerPosition()); viewPager.addOnPageChangeListener(this); TabLayout tabLayout = ButterKnife.findById(this, R.id.activity_user_tabLayout); tabLayout.setupWithViewPager(viewPager); tabLayout.setTabGravity(TabLayout.GRAVITY_FILL); BaseSavedStateFragment f = SavedStateFragment.getData(this); if (f != null && f instanceof SavedStateFragment) { ((UserPhotosView) pagers[0]).setPhotos(((SavedStateFragment) f).getPhotoList()); ((UserPhotosView) pagers[1]).setPhotos(((SavedStateFragment) f).getLikeList()); ((UserCollectionsView) pagers[2]).setCollections(((SavedStateFragment) f).getCollectionList()); if (getBundle() != null) { for (PagerView pager : pagers) { pager.onRestoreInstanceState(getBundle()); } } } else { AnimUtils.animInitShow( (View) pagers[pagerManagePresenter.getPagerPosition()], 400); for (PagerView pager : pagers) { pager.refreshPager(); } } } // control. public User getUser() { return userProfileView.getUser(); } public String getUserPortfolio() { return userProfileView.getUserPortfolio(); } public void showPopup() { int page = pagerManagePresenter.getPagerPosition(); popupManagePresenter.showPopup( this, toolbar, pagerManagePresenter.getPagerKey(page), page); } public boolean isBrowsable() { return browsablePresenter.isBrowsable(); } // permission. @Override protected void requestReadWritePermissionSucceed(int requestCode) { downloadPresenter.download(this); } // interface. // on click listener. @Override public void onClick(View view) { switch (view.getId()) { case -1: if (browsablePresenter.isBrowsable()) { browsablePresenter.visitPreviousPage(); } toolbarPresenter.touchNavigatorIcon(this); break; } } @OnClick(R.id.activity_user_title) void clickTitle() { if (AuthManager.getInstance().isAuthorized()) { User user = getIntent().getParcelableExtra(KEY_USER_ACTIVITY_USER); ProfileDialog dialog = new ProfileDialog(); dialog.setUsername(user.username); dialog.show(getFragmentManager(), null); } } private class OnClickAvatarListener implements View.OnClickListener { // data private User user; // life cycle. OnClickAvatarListener(User user) { this.user = user; } // interface. @Override public void onClick(View v) { IntentHelper.startPreviewActivity(UserActivity.this, user, false); } } // on menu item click listener. @Override public boolean onMenuItemClick(MenuItem item) { return toolbarPresenter.touchMenuItem(this, item.getItemId()); } // on request user listener. @Override public void onRequestUserSucceed(User u) { getIntent().putExtra(KEY_USER_ACTIVITY_USER, u); } // on download photo listener. (photo adapter) @Override public void onDownload(Photo photo) { downloadPresenter.setDownloadKey(photo); if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { downloadPresenter.download(this); } else { requestReadWritePermission(); } } // 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); 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); } // on collections changed listener. @Override public void onAddCollection(Collection c) { // do nothing. } @Override public void onUpdateCollection(Collection c, User u, Photo p) { for (PagerView pager : pagers) { if (pager instanceof UserPhotosView) { ((UserPhotosView) pager).updatePhoto(p, true); } } } // view. // 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(); } // popup manage view. @Override public void responsePopup(String value, int position) { pagers[position].setKey(value); pagers[position].refreshPager(); } // 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; } } // browsable view. @Override public void showRequestDialog() { requestDialog = new RequestBrowsableDataDialog(); requestDialog.show(getFragmentManager(), null); } @Override public void dismissRequestDialog() { requestDialog.dismiss(); requestDialog = null; } @Override public void drawBrowsableView(Object result) { User u = (User) result; getIntent().putExtra(KEY_USER_ACTIVITY_USER, u); if (AuthManager.getInstance().getUsername() != null && AuthManager.getInstance().getUsername().equals(u.username)) { AuthManager.getInstance().writeUserInfo(u); Intent intent = new Intent(this, MeActivity.class); intent.putExtra(MeActivity.EXTRA_BROWSABLE, true); startActivity(intent); finish(); } else { initModel(getBundle()); initPresenter(); initView(false); } } @Override public void visitPreviousPage() { IntentHelper.startMainActivity(this); } }