package com.wangdaye.mysplash.collection.view.activity; import android.annotation.SuppressLint; import android.content.Intent; import android.os.Build; import android.os.Bundle; import android.support.design.widget.CoordinatorLayout; import android.support.design.widget.Snackbar; import android.support.v7.widget.Toolbar; import android.text.TextUtils; import android.view.MenuItem; import android.view.View; import android.widget.RelativeLayout; import android.widget.TextView; import com.wangdaye.mysplash.Mysplash; import com.wangdaye.mysplash.R; import com.wangdaye.mysplash.common._basic.ReadWriteActivity; import com.wangdaye.mysplash.common.data.entity.unsplash.Photo; 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.DownloadRepeatDialog; 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.FileUtils; import com.wangdaye.mysplash.common.utils.helper.DatabaseHelper; import com.wangdaye.mysplash.common.utils.helper.NotificationHelper; import com.wangdaye.mysplash.common.utils.helper.ImageHelper; import com.wangdaye.mysplash.common.utils.helper.IntentHelper; import com.wangdaye.mysplash.common.utils.manager.AuthManager; import com.wangdaye.mysplash.common.i.model.BrowsableModel; import com.wangdaye.mysplash.common.i.model.EditResultModel; import com.wangdaye.mysplash.common.i.presenter.BrowsablePresenter; import com.wangdaye.mysplash.common.i.presenter.EditResultPresenter; import com.wangdaye.mysplash.common.i.presenter.SwipeBackManagePresenter; import com.wangdaye.mysplash.common.i.view.BrowsableView; import com.wangdaye.mysplash.common.i.view.EditResultView; import com.wangdaye.mysplash.common.i.view.SwipeBackManageView; import com.wangdaye.mysplash.common.ui.dialog.RequestBrowsableDataDialog; import com.wangdaye.mysplash.common.ui.dialog.UpdateCollectionDialog; import com.wangdaye.mysplash.common.utils.BackToTopUtils; import com.wangdaye.mysplash.common.utils.manager.ThemeManager; import com.wangdaye.mysplash.collection.model.activity.BorwsableObject; import com.wangdaye.mysplash.collection.model.activity.DownloadObject; import com.wangdaye.mysplash.collection.model.activity.EditResultObject; import com.wangdaye.mysplash.collection.presenter.activity.BrowsableImplementor; import com.wangdaye.mysplash.collection.presenter.activity.DownloadImplementor; import com.wangdaye.mysplash.collection.presenter.activity.EditResultImplementor; import com.wangdaye.mysplash.collection.presenter.activity.SwipeBackManageImplementor; import com.wangdaye.mysplash.collection.presenter.activity.ToolbarImplementor; import com.wangdaye.mysplash.collection.view.widget.CollectionPhotosView; import com.wangdaye.mysplash.common.data.entity.unsplash.Collection; import com.wangdaye.mysplash.common.i.presenter.ToolbarPresenter; import com.wangdaye.mysplash.common.ui.widget.coordinatorView.StatusBarView; import com.wangdaye.mysplash.me.view.activity.MeActivity; import com.wangdaye.mysplash.photo.view.activity.PhotoActivity; import com.wangdaye.mysplash.user.view.activity.UserActivity; import java.util.List; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick; /** * Collection activity. * * This activity is used to show a collection. * * */ public class CollectionActivity extends ReadWriteActivity implements SwipeBackManageView, EditResultView, BrowsableView, View.OnClickListener, Toolbar.OnMenuItemClickListener, PhotoAdapter.OnDownloadPhotoListener, NestedScrollAppBarLayout.OnNestedScrollingListener, SwipeBackCoordinatorLayout.OnSwipeListener, UpdateCollectionDialog.OnCollectionChangedListener, DownloadRepeatDialog.OnCheckOrDownloadListener { @BindView(R.id.activity_collection_statusBar) StatusBarView statusBar; @BindView(R.id.activity_collection_container) CoordinatorLayout container; @BindView(R.id.activity_collection_appBar) NestedScrollAppBarLayout appBar; @BindView(R.id.activity_collection_creatorBar) RelativeLayout creatorBar; @BindView(R.id.activity_collection_avatar) CircleImageView avatarImage; @BindView(R.id.activity_collection_photosView) CollectionPhotosView photosView; private RequestBrowsableDataDialog requestDialog; private ToolbarPresenter toolbarPresenter; private SwipeBackManagePresenter swipeBackManagePresenter; private EditResultModel editResultModel; private EditResultPresenter editResultPresenter; private BrowsableModel browsableModel; private BrowsablePresenter browsablePresenter; private DownloadModel downloadModel; private DownloadPresenter downloadPresenter; public static final String KEY_COLLECTION_ACTIVITY_COLLECTION = "collection_activity_collection"; public static final String KEY_COLLECTION_ACTIVITY_ID = "collection_activity_id"; public static class SavedStateFragment extends BaseSavedStateFragment { private List<Photo> photoList; public List<Photo> getPhotoList() { return photoList; } public void setPhotoList(List<Photo> photoList) { this.photoList = photoList; } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_collection); initModel(); 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 (requestCode == Mysplash.PHOTO_ACTIVITY && data != null) { Photo photo = data.getParcelableExtra(PhotoActivity.KEY_PHOTO_ACTIVITY_PHOTO); if (photo != null) { photosView.updatePhoto(photo); } } } @Override protected void onDestroy() { super.onDestroy(); browsablePresenter.cancelRequest(); if (photosView != null) { photosView.cancelRequest(); } } @Override protected void setTheme() { if (ThemeManager.getInstance(this).isLightTheme()) { setTheme(R.style.MysplashTheme_light_Translucent_Collection); } else { setTheme(R.style.MysplashTheme_dark_Translucent_Collection); } if (DisplayUtils.isLandscape(this)) { DisplayUtils.cancelTranslucentNavigation(this); } } @Override public void onSaveInstanceState(Bundle outState) { // save large data. SavedStateFragment f = new SavedStateFragment(); if (photosView != null) { f.setPhotoList(photosView.getPhotos()); } f.saveData(this); // save normal data. super.onSaveInstanceState(outState); } @Override public void handleBackPressed() { if (photosView.needPagerBackToTop() && BackToTopUtils.isSetBackToTop(false)) { backToTop(); } else { finishActivity(SwipeBackCoordinatorLayout.DOWN_DIR); } } @Override public void backToTop() { statusBar.animToInitAlpha(); DisplayUtils.setStatusBarStyle(this, false); BackToTopUtils.showTopBar(appBar, photosView); photosView.pagerBackToTop(); } @Override public void finishActivity(int dir) { Intent result = new Intent(); // told parent if this collection was deleted. result.putExtra( MeActivity.KEY_ME_ACTIVITY_DELETE_COLLECTION, editResultPresenter.getEditKey() == null); // told parent if this collection is created by the user. result.putExtra( MeActivity.KEY_ME_ACTIVITY_COLLECTION, getIntent().getParcelableExtra(KEY_COLLECTION_ACTIVITY_COLLECTION)); setResult(RESULT_OK, result); 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() { this.editResultModel = new EditResultObject( (Collection) getIntent().getParcelableExtra(KEY_COLLECTION_ACTIVITY_COLLECTION)); this.browsableModel = new BorwsableObject(getIntent()); this.downloadModel = new DownloadObject(); } private void initPresenter() { this.toolbarPresenter = new ToolbarImplementor(); this.swipeBackManagePresenter = new SwipeBackManageImplementor(this); this.editResultPresenter = new EditResultImplementor(editResultModel, this); this.browsablePresenter = new BrowsableImplementor(browsableModel, this); this.downloadPresenter = new DownloadImplementor(downloadModel); } @SuppressLint("SetTextI18n") private void initView(boolean init) { if (init && browsablePresenter.isBrowsable() && editResultPresenter.getEditKey() == null) { browsablePresenter.requestBrowsableData(); } else { Collection c = (Collection) editResultPresenter.getEditKey(); SwipeBackCoordinatorLayout swipeBackView = ButterKnife.findById( this, R.id.activity_collection_swipeBackView); swipeBackView.setOnSwipeListener(this); appBar.setOnNestedScrollingListener(this); TextView title = ButterKnife.findById(this, R.id.activity_collection_title); title.setText(c.title); StatusBarView titleStatusBar = ButterKnife.findById( this, R.id.activity_collection_titleStatusBar); TextView description = ButterKnife.findById(this, R.id.activity_collection_description); if (TextUtils.isEmpty(c.description)) { titleStatusBar.setVisibility(View.GONE); description.setVisibility(View.GONE); } else { DisplayUtils.setTypeface(this, description); description.setText(c.description); } Toolbar toolbar = ButterKnife.findById(this, R.id.activity_collection_toolbar); 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_collection_toolbar_light, R.menu.activity_collection_toolbar_dark); toolbar.setOnMenuItemClickListener(this); toolbar.setNavigationOnClickListener(this); if (AuthManager.getInstance().getUsername() != null && AuthManager.getInstance().getUsername().equals(c.user.username)) { toolbar.getMenu().getItem(0).setVisible(true); } else { toolbar.getMenu().getItem(0).setVisible(false); } if (c.curated) { toolbar.getMenu().getItem(2).setVisible(true); } else { toolbar.getMenu().getItem(2).setVisible(false); } ImageHelper.loadAvatar(this, avatarImage, c.user, null); TextView subtitle = ButterKnife.findById(this, R.id.activity_collection_subtitle); DisplayUtils.setTypeface(this, subtitle); subtitle.setText(getString(R.string.by) + " " + c.user.name); photosView.initMP(this, (Collection) editResultPresenter.getEditKey()); BaseSavedStateFragment f = SavedStateFragment.getData(this); if (f != null && f instanceof SavedStateFragment) { photosView.setPhotos(((SavedStateFragment) f).getPhotoList()); } else { photosView.initAnimShow(); photosView.initRefresh(); } } } // download. public void downloadCollection() { downloadPresenter.setDownloadKey(getCollection()); if (DatabaseHelper.getInstance(this) .readDownloadingEntityCount( String.valueOf(((Collection) downloadPresenter.getDownloadKey()).id)) > 0) { NotificationHelper.showSnackbar( getString(R.string.feedback_download_repeat), Snackbar.LENGTH_SHORT); } else if (FileUtils.isCollectionExists( this, String.valueOf(((Collection) downloadPresenter.getDownloadKey()).id))) { DownloadRepeatDialog dialog = new DownloadRepeatDialog(); dialog.setDownloadKey(downloadPresenter.getDownloadKey()); dialog.setOnCheckOrDownloadListener(this); dialog.show(getFragmentManager(), null); } else { requestPermissionAndDownload(); } } private void requestPermissionAndDownload() { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { downloadPresenter.download(this); } else { requestReadWritePermission(); } } // data. public Collection getCollection() { return (Collection) editResultPresenter.getEditKey(); } // 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_collection_touchBar) void checkAuthor() { IntentHelper.startUserActivity( this, avatarImage, ((Collection) editResultPresenter.getEditKey()).user, UserActivity.PAGE_PHOTO); } // 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); requestPermissionAndDownload(); } // on nested scrolling listener. @Override public void onStartNestedScroll() { // do nothing. } @Override public void onNestedScrolling() { if (appBar.getY() > -appBar.getMeasuredHeight()) { // the app bar layout can be seen. if (!statusBar.isInitState()) { statusBar.animToInitAlpha(); DisplayUtils.setStatusBarStyle(this, false); } } else { // the app bar layout has been hidden. if (statusBar.isInitState()) { statusBar.animToDarkerAlpha(); DisplayUtils.setStatusBarStyle(this, true); } } } @Override public void onStopNestedScroll() { // do nothing. } // on swipe listener. @Override public boolean canSwipeBack(int dir) { return swipeBackManagePresenter.checkCanSwipeBack(dir); } @Override public void onSwipeProcess(float percent) { container.setBackgroundColor(SwipeBackCoordinatorLayout.getBackgroundColor(percent)); } @Override public void onSwipeFinish(int dir) { swipeBackManagePresenter.swipeBackFinish(this, dir); } // on collection changed listener. @Override public void onEditCollection(Collection c) { AuthManager.getInstance().getCollectionsManager().updateCollection(c); editResultPresenter.updateSomething(c); } @Override public void onDeleteCollection(Collection c) { AuthManager.getInstance().getCollectionsManager().deleteCollection(c); editResultPresenter.deleteSomething(c); } // on check or download listener. (Collection) @Override public void onCheck(Object obj) { IntentHelper.startCheckCollectionActivity(this, String.valueOf(((Collection) obj).id)); } @Override public void onDownload(Object obj) { requestPermissionAndDownload(); } // view. // swipe back manage view. @Override public boolean checkCanSwipeBack(int dir) { if (dir == SwipeBackCoordinatorLayout.UP_DIR) { return photosView.canSwipeBack(dir) && appBar.getY() <= -appBar.getMeasuredHeight() + creatorBar.getMeasuredHeight(); } else { return photosView.canSwipeBack(dir) && appBar.getY() >= 0; } } // edit result view. @Override public void drawCreateResult(Object newKey) { // do nothing. } @Override public void drawUpdateResult(Object newKey) { Collection c = (Collection) newKey; TextView title = (TextView) findViewById(R.id.activity_collection_title); title.setText(c.title); TextView description = (TextView) findViewById(R.id.activity_collection_description); if (TextUtils.isEmpty(c.description)) { description.setVisibility(View.GONE); } else { DisplayUtils.setTypeface(this, description); description.setText(c.description); } } @Override public void drawDeleteResult(Object oldKey) { editResultPresenter.setEditKey(null); finishActivity(SwipeBackCoordinatorLayout.NULL_DIR); } // 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) { getIntent().putExtra(KEY_COLLECTION_ACTIVITY_COLLECTION, (Collection) result); initModel(); initPresenter(); initView(false); } @Override public void visitPreviousPage() { IntentHelper.startMainActivity(this); } }