package com.wangdaye.mysplash.me.view.activity; import android.annotation.SuppressLint; import android.content.Intent; import android.os.Build; import android.os.Bundle; import android.support.annotation.Nullable; 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.Me; 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.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.PagerManageModel; 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.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.widget.coordinatorView.StatusBarView; 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.manager.ThemeManager; import com.wangdaye.mysplash.me.model.activity.DownloadObject; import com.wangdaye.mysplash.me.model.activity.PagerManageObject; import com.wangdaye.mysplash.me.model.widget.PhotosObject; import com.wangdaye.mysplash.me.presenter.activity.DownloadImplementor; import com.wangdaye.mysplash.me.presenter.activity.PagerManageImplementor; import com.wangdaye.mysplash.me.presenter.activity.PopupManageImplementor; import com.wangdaye.mysplash.me.presenter.activity.SwipeBackManageImplementor; import com.wangdaye.mysplash.me.presenter.activity.ToolbarImplementor; import com.wangdaye.mysplash.me.view.widget.MeCollectionsView; import com.wangdaye.mysplash.me.view.widget.MePhotosView; import com.wangdaye.mysplash.me.view.widget.MeProfileView; import com.wangdaye.mysplash.photo.view.activity.PhotoActivity; import java.util.ArrayList; import java.util.Collections; import java.util.List; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick; /** * Me activity. * * This activity is used to show information of the application user. * * */ public class MeActivity extends ReadWriteActivity implements PagerManageView, PopupManageView, SwipeBackManageView, View.OnClickListener, Toolbar.OnMenuItemClickListener, PhotoAdapter.OnDownloadPhotoListener, ViewPager.OnPageChangeListener, SwipeBackCoordinatorLayout.OnSwipeListener, SelectCollectionDialog.OnCollectionsChangedListener, AuthManager.OnAuthDataChangedListener { @BindView(R.id.activity_me_container) CoordinatorLayout container; @BindView(R.id.activity_me_statusBar) StatusBarView statusBar; @BindView(R.id.activity_me_appBar) NestedScrollAppBarLayout appBar; @BindView(R.id.activity_me_toolbar) Toolbar toolbar; @BindView(R.id.activity_me_avatar) CircleImageView avatar; @BindView(R.id.activity_me_title) TextView title; @BindView(R.id.activity_me_viewPager) ViewPager viewPager; private MyPagerAdapter adapter; private PagerView[] pagers = new PagerView[3]; private ToolbarPresenter toolbarPresenter; private PagerManageModel pagerManageModel; private PagerManagePresenter pagerManagePresenter; private PopupManagePresenter popupManagePresenter; private SwipeBackManagePresenter swipeBackManagePresenter; private DownloadModel downloadModel; private DownloadPresenter downloadPresenter; public static final String EXTRA_BROWSABLE = "browsable"; public static final String KEY_ME_ACTIVITY_DELETE_COLLECTION = "me_activity_delete_collection"; public static final String KEY_ME_ACTIVITY_COLLECTION = "me_activity_collection"; public static final String KEY_ME_ACTIVITY_PAGE_POSITION = "me_activity_page_position"; 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_me); initModel(savedInstanceState); initPresenter(); } @Override protected void onStart() { super.onStart(); if (!isStarted()) { setStarted(); ButterKnife.bind(this); initView(); } } @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) { ((MePhotosView) pagers[0]).updatePhoto(photo, false); ((MePhotosView) pagers[1]).updatePhoto(photo, false); } break; case Mysplash.COLLECTION_ACTIVITY: Collection collection = data.getParcelableExtra( CollectionActivity.KEY_COLLECTION_ACTIVITY_COLLECTION); if (collection != null) { if (data.getBooleanExtra(KEY_ME_ACTIVITY_DELETE_COLLECTION, false)) { // the collection was deleted. if (AuthManager.getInstance().getMe() != null) { AuthManager.getInstance().getMe().total_collections --; drawTabTitles(AuthManager.getInstance().getMe()); } ((MeCollectionsView) pagers[2]).removeCollection(collection); } else { ((MeCollectionsView) pagers[2]).updateCollection(collection, false); } } break; } } @Override protected void onDestroy() { super.onDestroy(); AuthManager.getInstance().removeOnWriteDataListener(this); AuthManager.getInstance().cancelRequest(); for (PagerView p : pagers) { p.cancelRequest(); } } @Override protected void setTheme() { if (ThemeManager.getInstance(this).isLightTheme()) { setTheme(R.style.MysplashTheme_light_Translucent_Me); } else { setTheme(R.style.MysplashTheme_dark_Translucent_Me); } 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(((MePhotosView) pagers[0]).getPhotos()); } if (pagers[1] != null) { f.setLikeList(((MePhotosView) pagers[1]).getPhotos()); } if (pagers[2] != null) { f.setCollectionList(((MeCollectionsView) pagers[2]).getCollections()); } f.saveData(this); // write normal data. super.onSaveInstanceState(outState); outState.putInt(KEY_ME_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) { setResult(RESULT_OK); SwipeBackCoordinatorLayout.hideBackgroundShadow(container); if (Mysplash.getInstance().getActivityCount() > 1 &&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_ME_ACTIVITY_PAGE_POSITION, page); } else { page = getIntent().getIntExtra(KEY_ME_ACTIVITY_PAGE_POSITION, page); } this.pagerManageModel = new PagerManageObject(page); this.downloadModel = new DownloadObject(); AuthManager.getInstance().addOnWriteDataListener(this); if (AuthManager.getInstance().getState() == AuthManager.FREEDOM_STATE) { AuthManager.getInstance().requestPersonalProfile(); } } private void initPresenter() { this.toolbarPresenter = new ToolbarImplementor(); this.pagerManagePresenter = new PagerManageImplementor(pagerManageModel, this); this.popupManagePresenter = new PopupManageImplementor(this); this.swipeBackManagePresenter = new SwipeBackManageImplementor(this); this.downloadPresenter = new DownloadImplementor(downloadModel); } private void initView() { SwipeBackCoordinatorLayout swipeBackView = ButterKnife.findById( this, R.id.activity_me_swipeBackView); swipeBackView.setOnSwipeListener(this); if (getIntent().getBooleanExtra(EXTRA_BROWSABLE, false)) { 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_me_toolbar_light, R.menu.activity_me_toolbar_dark); toolbar.setOnMenuItemClickListener(this); toolbar.setNavigationOnClickListener(this); avatar.setOnClickListener(new OnClickAvatarListener()); initPages(); drawProfile(); } private void initPages() { List<View> pageList = new ArrayList<>(); pageList.add(new MePhotosView(this, PhotosObject.PHOTOS_TYPE_PHOTOS, R.id.activity_me_page_photo)); pageList.add(new MePhotosView(this, PhotosObject.PHOTOS_TYPE_LIKES, R.id.activity_me_page_like)); pageList.add(new MeCollectionsView(this, R.id.activity_me_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(), false); viewPager.addOnPageChangeListener(this); TabLayout tabLayout = ButterKnife.findById(this, R.id.activity_me_tabLayout); tabLayout.setupWithViewPager(viewPager); tabLayout.setTabGravity(TabLayout.GRAVITY_FILL); BaseSavedStateFragment f = SavedStateFragment.getData(this); if (f != null && f instanceof SavedStateFragment) { ((MePhotosView) pagers[0]).setPhotos(((SavedStateFragment) f).getPhotoList()); ((MePhotosView) pagers[1]).setPhotos(((SavedStateFragment) f).getLikeList()); ((MeCollectionsView) 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(); } } } private void drawTabTitles(@Nullable Me me) { if (me != null) { List<String> titleList = new ArrayList<>(); titleList.add( DisplayUtils.abridgeNumber(me.total_photos) + " " + getResources().getStringArray(R.array.user_tabs)[0]); titleList.add( DisplayUtils.abridgeNumber(me.total_likes) + " " + getResources().getStringArray(R.array.user_tabs)[1]); titleList.add( DisplayUtils.abridgeNumber(me.total_collections) + " " + getResources().getStringArray(R.array.user_tabs)[2]); adapter.titleList = titleList; adapter.notifyDataSetChanged(); } } @SuppressLint("SetTextI18n") private void drawProfile() { MeProfileView meProfileView = (MeProfileView) findViewById(R.id.activity_me_profileView); if (AuthManager.getInstance().getMe() != null) { Me me = AuthManager.getInstance().getMe(); title.setText(me.first_name + " " + me.last_name); meProfileView.drawMeProfile(me); drawTabTitles(me); } else if (!TextUtils.isEmpty(AuthManager.getInstance().getUsername())) { title.setText(AuthManager.getInstance().getFirstName() + " " + AuthManager.getInstance().getLastName()); } else { title.setText("..."); } if (AuthManager.getInstance().getUser() != null) { ImageHelper.loadAvatar(this, avatar, AuthManager.getInstance().getUser(), null); } else if (!TextUtils.isEmpty(AuthManager.getInstance().getAvatarPath())) { ImageHelper.loadAvatar(this, avatar, AuthManager.getInstance().getAvatarPath(), null); } else { ImageHelper.loadAvatar(this, avatar, new User(), null); } } // control. public void showPopup(boolean filter) { if (filter) { int page = pagerManagePresenter.getPagerPosition(); popupManagePresenter.showPopup( this, toolbar, pagerManagePresenter.getPagerKey(page), page); } else { popupManagePresenter.showPopup( this, toolbar, null, -1); } } // 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 (getIntent().getBooleanExtra(EXTRA_BROWSABLE, false)) { IntentHelper.startMainActivity(this); } toolbarPresenter.touchNavigatorIcon(this); break; } } private class OnClickAvatarListener implements View.OnClickListener { // interface. @Override public void onClick(View v) { if (AuthManager.getInstance().getUser() != null) { IntentHelper.startPreviewActivity( MeActivity.this, AuthManager.getInstance().getUser(), false); } } } @OnClick(R.id.activity_me_title) void clickTitle() { if (AuthManager.getInstance().isAuthorized() && !TextUtils.isEmpty(AuthManager.getInstance().getUsername())) { ProfileDialog dialog = new ProfileDialog(); dialog.setUsername(AuthManager.getInstance().getUsername()); dialog.show(getFragmentManager(), null); } } // on menu item click listener. @Override public boolean onMenuItemClick(MenuItem item) { return toolbarPresenter.touchMenuItem(this, item.getItemId()); } // 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); 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); } // on collections changed listener. @Override public void onAddCollection(Collection c) { if (AuthManager.getInstance().getMe() != null) { AuthManager.getInstance().getMe().total_collections ++; drawTabTitles(AuthManager.getInstance().getMe()); } ((MeCollectionsView) pagers[2]).addCollection(c); } @Override public void onUpdateCollection(Collection c, User u, Photo p) { ((MePhotosView) pagers[0]).updatePhoto(p, true); ((MePhotosView) pagers[1]).updatePhoto(p, true); ((MeCollectionsView) pagers[2]).updateCollection(c, true); } // on author data changed listener. @Override public void onWriteAccessToken() { drawProfile(); } @Override public void onWriteUserInfo() { drawProfile(); pagerManagePresenter.checkToRefresh(pagerManagePresenter.getPagerPosition()); } @Override public void onWriteAvatarPath() { drawProfile(); } @Override public void onLogout() { // do nothing. } // 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); if (AuthManager.getInstance().getState() != AuthManager.LOADING_ME_STATE) { 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; } } }