package com.dl7.mvp.module.photo.bigphoto; import android.Manifest; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.os.Build; import android.support.v4.app.Fragment; import android.support.v4.view.ViewPager; import android.support.v7.widget.Toolbar; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.ImageView; import android.widget.LinearLayout; import com.dl7.drag.DragSlopLayout; import com.dl7.mvp.R; import com.dl7.mvp.adapter.PhotoPagerAdapter; import com.dl7.mvp.injector.components.DaggerBigPhotoComponent; import com.dl7.mvp.injector.modules.BigPhotoModule; import com.dl7.mvp.local.table.BeautyPhotoInfo; import com.dl7.mvp.module.base.BaseActivity; import com.dl7.mvp.module.base.ILoadDataView; import com.dl7.mvp.module.base.ILocalPresenter; import com.dl7.mvp.utils.AnimateHelper; import com.dl7.mvp.utils.CommonConstant; import com.dl7.mvp.utils.DownloadUtils; import com.dl7.mvp.utils.NavUtils; import com.dl7.mvp.utils.SnackbarUtils; import com.dl7.mvp.utils.ToastUtils; import com.dl7.mvp.widget.PhotoViewPager; import com.jakewharton.rxbinding.view.RxView; import com.tbruyelle.rxpermissions.RxPermissions; import java.util.ArrayList; import java.util.List; import javax.inject.Inject; import butterknife.BindView; import butterknife.OnClick; import rx.functions.Action1; /** * 大图界面,这里和比较多地方关联,所以逻辑会多一点 */ public class BigPhotoActivity extends BaseActivity<ILocalPresenter> implements ILoadDataView<List<BeautyPhotoInfo>> { private static final String BIG_PHOTO_KEY = "BigPhotoKey"; private static final String PHOTO_INDEX_KEY = "PhotoIndexKey"; private static final String FROM_LOVE_ACTIVITY = "FromLoveActivity"; @BindView(R.id.vp_photo) PhotoViewPager mVpPhoto; @BindView(R.id.iv_favorite) ImageView mIvFavorite; @BindView(R.id.iv_download) ImageView mIvDownload; @BindView(R.id.iv_praise) ImageView mIvPraise; @BindView(R.id.iv_share) ImageView mIvShare; @BindView(R.id.toolbar) Toolbar mToolbar; @BindView(R.id.drag_layout) DragSlopLayout mDragLayout; @BindView(R.id.ll_layout) LinearLayout mLlLayout; @Inject PhotoPagerAdapter mAdapter; private List<BeautyPhotoInfo> mPhotoList; private int mIndex; // 初始索引 private boolean mIsFromLoveActivity; // 是否从 LoveActivity 启动进来 private boolean mIsHideToolbar = false; // 是否隐藏 Toolbar private boolean mIsInteract = false; // 是否和 ViewPager 联动 private int mCurPosition; // Adapter 当前位置 private boolean[] mIsDelLove; // 保存被删除的收藏项 private RxPermissions mRxPermissions; public static void launch(Context context, ArrayList<BeautyPhotoInfo> datas, int index) { Intent intent = new Intent(context, BigPhotoActivity.class); intent.putParcelableArrayListExtra(BIG_PHOTO_KEY, datas); intent.putExtra(PHOTO_INDEX_KEY, index); intent.putExtra(FROM_LOVE_ACTIVITY, false); context.startActivity(intent); ((Activity)context).overridePendingTransition(R.anim.expand_vertical_entry, R.anim.hold); } // 这个给 LoveActivity 使用,配合 setResult() 返回取消的收藏,这样做体验会好点,其实用 RxBus 会更容易做 public static void launchForResult(Fragment fragment, ArrayList<BeautyPhotoInfo> datas, int index) { Intent intent = new Intent(fragment.getContext(), BigPhotoActivity.class); intent.putParcelableArrayListExtra(BIG_PHOTO_KEY, datas); intent.putExtra(PHOTO_INDEX_KEY, index); intent.putExtra(FROM_LOVE_ACTIVITY, true); fragment.startActivityForResult(intent, CommonConstant.REQUEST_CODE); fragment.getActivity().overridePendingTransition(R.anim.expand_vertical_entry, R.anim.hold); } @Override protected int attachLayoutRes() { return R.layout.activity_big_photo; } @Override protected void initInjector() { mPhotoList = getIntent().getParcelableArrayListExtra(BIG_PHOTO_KEY); mIndex = getIntent().getIntExtra(PHOTO_INDEX_KEY, 0); mIsFromLoveActivity = getIntent().getBooleanExtra(FROM_LOVE_ACTIVITY, false); DaggerBigPhotoComponent.builder() .applicationComponent(getAppComponent()) .bigPhotoModule(new BigPhotoModule(this, mPhotoList)) .build() .inject(this); } @Override protected void initViews() { initToolBar(mToolbar, true, ""); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { // 空出底部导航的高度,因为 NavigationBar 是透明的 mLlLayout.setPadding(0, 0, 0, NavUtils.getNavigationBarHeight(this)); } // mAdapter = new PhotoPagerAdapter(this); mVpPhoto.setAdapter(mAdapter); // 设置是否 ViewPager 联动和动画 mDragLayout.interactWithViewPager(mIsInteract); mDragLayout.setAnimatorMode(DragSlopLayout.FLIP_Y); mAdapter.setTapListener(new PhotoPagerAdapter.OnTapListener() { @Override public void onPhotoClick() { mIsHideToolbar = !mIsHideToolbar; if (mIsHideToolbar) { mDragLayout.startOutAnim(); mToolbar.animate().translationY(-mToolbar.getBottom()).setDuration(300); } else { mDragLayout.startInAnim(); mToolbar.animate().translationY(0).setDuration(300); } } }); if (!mIsFromLoveActivity) { mAdapter.setLoadMoreListener(new PhotoPagerAdapter.OnLoadMoreListener() { @Override public void onLoadMore() { mPresenter.getMoreData(); } }); } else { // 收藏界面不需要加载更多 mIsDelLove = new boolean[mPhotoList.size()]; } mVpPhoto.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { @Override public void onPageSelected(int position) { mCurPosition = position; // 设置图标状态 mIvFavorite.setSelected(mAdapter.isLoved(position)); mIvDownload.setSelected(mAdapter.isDownload(position)); mIvPraise.setSelected(mAdapter.isPraise(position)); } }); mRxPermissions = new RxPermissions(this); RxView.clicks(mIvDownload) .compose(mRxPermissions.ensure(Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE)) .subscribe(new Action1<Boolean>() { @Override public void call(Boolean granted) { if (granted) { DownloadUtils.downloadOrDeletePhoto(BigPhotoActivity.this, mAdapter.getData(mCurPosition).getImgsrc(), mAdapter.getData(mCurPosition).getDocid(), new DownloadUtils.OnCompletedListener() { @Override public void onCompleted(String url) { mAdapter.getData(url).setDownload(true); mIvDownload.setSelected(true); mPresenter.insert(mAdapter.getData(url)); } @Override public void onDeleted(String url) { mAdapter.getData(url).setDownload(false); mIvDownload.setSelected(false); mPresenter.delete(mAdapter.getData(url)); } }); } else { SnackbarUtils.showSnackbar(BigPhotoActivity.this, "权限授权失败", false); } } }); } @Override protected void updateViews(boolean isRefresh) { mPresenter.getData(isRefresh); } @Override public void loadData(List<BeautyPhotoInfo> data) { mAdapter.updateData(data); mVpPhoto.setCurrentItem(mIndex); if (mIndex == 0) { // 为 0 不会回调 addOnPageChangeListener,所以这里要处理下 mIvFavorite.setSelected(mAdapter.isLoved(0)); mIvDownload.setSelected(mAdapter.isDownload(0)); mIvPraise.setSelected(mAdapter.isPraise(0)); } } @Override public void loadMoreData(List<BeautyPhotoInfo> data) { mAdapter.addData(data); mAdapter.startUpdate(mVpPhoto); } @Override public void loadNoData() { } @OnClick({R.id.iv_favorite, R.id.iv_praise, R.id.iv_share}) public void onClick(final View view) { final boolean isSelected = !view.isSelected(); switch (view.getId()) { case R.id.iv_favorite: mAdapter.getData(mCurPosition).setLove(isSelected); break; case R.id.iv_praise: mAdapter.getData(mCurPosition).setPraise(isSelected); break; case R.id.iv_share: ToastUtils.showToast("分享:功能没加(╯-╰)"); break; } // 除分享外都做动画和数据库处理 if (view.getId() != R.id.iv_share) { view.setSelected(isSelected); AnimateHelper.doHeartBeat(view, 500); if (isSelected) { mPresenter.insert(mAdapter.getData(mCurPosition)); } else { mPresenter.delete(mAdapter.getData(mCurPosition)); } } if (mIsFromLoveActivity && view.getId() == R.id.iv_favorite) { // 不选中即去除收藏 mIsDelLove[mCurPosition] = !isSelected; } } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_animate, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { item.setChecked(true); switch (item.getItemId()) { case R.id.slide_bottom: mDragLayout.setAnimatorMode(DragSlopLayout.SLIDE_BOTTOM); return true; case R.id.slide_left: mDragLayout.setAnimatorMode(DragSlopLayout.SLIDE_LEFT); return true; case R.id.slide_right: mDragLayout.setAnimatorMode(DragSlopLayout.SLIDE_RIGHT); return true; case R.id.slide_fade: mDragLayout.setAnimatorMode(DragSlopLayout.FADE); return true; case R.id.slide_flip_x: mDragLayout.setAnimatorMode(DragSlopLayout.FLIP_X); return true; case R.id.slide_flip_y: mDragLayout.setAnimatorMode(DragSlopLayout.FLIP_Y); return true; case R.id.slide_zoom: mDragLayout.setAnimatorMode(DragSlopLayout.ZOOM); return true; case R.id.slide_zoom_left: mDragLayout.setAnimatorMode(DragSlopLayout.ZOOM_LEFT); return true; case R.id.slide_zoom_right: mDragLayout.setAnimatorMode(DragSlopLayout.ZOOM_RIGHT); return true; case R.id.item_interact: mIsInteract = !mIsInteract; item.setChecked(mIsInteract); mDragLayout.interactWithViewPager(mIsInteract); return true; } return super.onOptionsItemSelected(item); } @Override public void finish() { if (mIsFromLoveActivity) { Intent intent = new Intent(); intent.putExtra(CommonConstant.RESULT_KEY, mIsDelLove); // 把数据传给 LoveActivity setResult(RESULT_OK, intent); } super.finish(); overridePendingTransition(R.anim.hold, R.anim.zoom_out_exit); } }