package com.ypx.imagepicker.activity.preview;
import android.app.Activity;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentStatePagerAdapter;
import androidx.viewpager.widget.ViewPager;
import com.ypx.imagepicker.ImagePicker;
import com.ypx.imagepicker.R;
import com.ypx.imagepicker.activity.PickerActivityManager;
import com.ypx.imagepicker.bean.ImageItem;
import com.ypx.imagepicker.bean.ImageSet;
import com.ypx.imagepicker.bean.selectconfig.MultiSelectConfig;
import com.ypx.imagepicker.data.ProgressSceneEnum;
import com.ypx.imagepicker.views.PickerUiConfig;
import com.ypx.imagepicker.data.MediaItemsDataSource;
import com.ypx.imagepicker.helper.launcher.PLauncher;
import com.ypx.imagepicker.presenter.IPickerPresenter;
import com.ypx.imagepicker.utils.PViewSizeUtils;
import com.ypx.imagepicker.views.wx.WXPreviewControllerView;
import com.ypx.imagepicker.views.base.PreviewControllerView;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import static com.ypx.imagepicker.activity.multi.MultiImagePickerActivity.INTENT_KEY_CURRENT_INDEX;
import static com.ypx.imagepicker.activity.multi.MultiImagePickerActivity.INTENT_KEY_SELECT_CONFIG;
import static com.ypx.imagepicker.activity.multi.MultiImagePickerActivity.INTENT_KEY_PRESENTER;
/**
* Description: 预览页面,其中包含编辑预览和普通预览
*
* Author: peixing.yang
* Date: 2019/2/21
* 使用文档 :https://github.com/yangpeixing/YImagePicker/wiki/Documentation_3.x
*/
public class MultiImagePreviewActivity extends FragmentActivity implements MediaItemsDataSource.MediaItemProvider {
static ImageSet currentImageSet;
public static final String INTENT_KEY_SELECT_LIST = "selectList";
private ViewPager mViewPager;
private ArrayList mSelectList;
private ArrayList mImageList;
private int mCurrentItemPosition = 0;
private MultiSelectConfig selectConfig;
private IPickerPresenter presenter;
private PickerUiConfig uiConfig;
private WeakReference activityWeakReference;
private DialogInterface dialogInterface;
private PreviewControllerView controllerView;
/**
* 预览回调
*/
public interface PreviewResult {
void onResult(ArrayList imageItems, boolean isCancel);
}
/**
* 跳转预览
*
* @param activity 当前activity
* @param imageSet 当前预览的文件夹信息
* @param selectList 选中列表
* @param selectConfig 配置信息
* @param presenter presenter
* @param position 默认选中项
* @param result 预览回调
*/
public static void intent(Activity activity, ImageSet imageSet,
ArrayList selectList,
MultiSelectConfig selectConfig,
IPickerPresenter presenter,
int position,
final PreviewResult result) {
if (activity == null || selectList == null || selectConfig == null
|| presenter == null || result == null) {
return;
}
if (imageSet != null) {
currentImageSet = imageSet.copy();
}
Intent intent = new Intent(activity, MultiImagePreviewActivity.class);
intent.putExtra(INTENT_KEY_SELECT_LIST, selectList);
intent.putExtra(INTENT_KEY_SELECT_CONFIG, selectConfig);
intent.putExtra(INTENT_KEY_PRESENTER, presenter);
intent.putExtra(INTENT_KEY_CURRENT_INDEX, position);
PLauncher.init(activity).startActivityForResult(intent, new PLauncher.Callback() {
@Override
public void onActivityResult(int resultCode, Intent data) {
if (data != null && data.hasExtra(ImagePicker.INTENT_KEY_PICKER_RESULT)) {
ArrayList mList = (ArrayList) data.getSerializableExtra(ImagePicker.INTENT_KEY_PICKER_RESULT);
if (mList != null) {
result.onResult(mList, resultCode == RESULT_CANCELED);
}
}
}
});
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
activityWeakReference = new WeakReference(this);
if (isIntentDataFailed()) {
finish();
return;
}
PickerActivityManager.addActivity(this);
setContentView(R.layout.picker_activity_preview);
setUI();
loadMediaPreviewList();
}
/**
* @return 跳转数据是否合法
*/
private boolean isIntentDataFailed() {
if (getIntent() == null || !getIntent().hasExtra(INTENT_KEY_SELECT_CONFIG)
|| !getIntent().hasExtra(INTENT_KEY_PRESENTER)) {
return true;
}
selectConfig = (MultiSelectConfig) getIntent().getSerializableExtra(INTENT_KEY_SELECT_CONFIG);
presenter = (IPickerPresenter) getIntent().getSerializableExtra(INTENT_KEY_PRESENTER);
mCurrentItemPosition = getIntent().getIntExtra(INTENT_KEY_CURRENT_INDEX, 0);
ArrayList list = (ArrayList) getIntent().getSerializableExtra(INTENT_KEY_SELECT_LIST);
if (list == null || presenter == null) {
return true;
}
mSelectList = new ArrayList(list);
uiConfig = presenter.getUiConfig(activityWeakReference.get());
return false;
}
/**
* 执行返回回调
*
* @param isClickComplete 是否是选中
*/
private void notifyCallBack(boolean isClickComplete) {
Intent intent = new Intent();
intent.putExtra(ImagePicker.INTENT_KEY_PICKER_RESULT, mSelectList);
setResult(isClickComplete ? ImagePicker.REQ_PICKER_RESULT_CODE : RESULT_CANCELED, intent);
finish();
}
@Override
public void onBackPressed() {
notifyCallBack(false);
}
/**
* 加载媒体文件夹
*/
private void loadMediaPreviewList() {
if (currentImageSet == null) {
initViewPager(mSelectList);
} else if (currentImageSet.imageItems != null
&& currentImageSet.imageItems.size() > 0
&& currentImageSet.imageItems.size() >= currentImageSet.count) {
initViewPager(currentImageSet.imageItems);
} else {
//从媒体库重新扫描
dialogInterface = getPresenter().showProgressDialog(this, ProgressSceneEnum.loadMediaItem);
ImagePicker.provideMediaItemsFromSet(this, currentImageSet,
selectConfig.getMimeTypes(), this);
}
}
@Override
public void providerMediaItems(ArrayList imageItems, ImageSet allVideoSet) {
if (dialogInterface != null) {
dialogInterface.dismiss();
}
initViewPager(imageItems);
}
/**
* 过滤掉视频
*
* @param list 所有数据源
* @return 过滤后的数据源
*/
private ArrayList filterVideo(ArrayList list) {
if (selectConfig.isCanPreviewVideo()) {
mImageList = new ArrayList<>(list);
return mImageList;
}
mImageList = new ArrayList<>();
int videoCount = 0;
int nowPosition = 0;
int i = 0;
for (ImageItem imageItem : list) {
if (!imageItem.isVideo() && !imageItem.isGif()) {
mImageList.add(imageItem);
} else {
videoCount++;
}
if (i == mCurrentItemPosition) {
nowPosition = i - videoCount;
}
i++;
}
mCurrentItemPosition = nowPosition;
return mImageList;
}
/**
* 初始化标题栏
*/
private void setUI() {
mViewPager = findViewById(R.id.viewpager);
mViewPager.setBackgroundColor(uiConfig.getPreviewBackgroundColor());
controllerView = uiConfig.getPickerUiProvider().getPreviewControllerView(activityWeakReference.get());
if (controllerView == null) {
controllerView = new WXPreviewControllerView(this);
}
controllerView.setStatusBar();
controllerView.initData(selectConfig, presenter, uiConfig, mSelectList);
if (controllerView.getCompleteView() != null) {
controllerView.getCompleteView().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (PViewSizeUtils.onDoubleClick()) {
return;
}
notifyCallBack(true);
}
});
}
FrameLayout mPreviewPanel = findViewById(R.id.mPreviewPanel);
mPreviewPanel.addView(controllerView, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT));
}
/**
* 初始化viewpager
*/
private void initViewPager(ArrayList sourceList) {
mImageList = filterVideo(sourceList);
if (mImageList == null || mImageList.size() == 0) {
getPresenter().tip(this, getString(R.string.picker_str_preview_empty));
finish();
return;
}
if (mCurrentItemPosition < 0) {
mCurrentItemPosition = 0;
}
TouchImageAdapter mAdapter = new TouchImageAdapter(getSupportFragmentManager(), mImageList);
mViewPager.setAdapter(mAdapter);
mViewPager.setOffscreenPageLimit(1);
mViewPager.setCurrentItem(mCurrentItemPosition, false);
ImageItem item = mImageList.get(mCurrentItemPosition);
controllerView.onPageSelected(mCurrentItemPosition, item, mImageList.size());
mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
mCurrentItemPosition = position;
ImageItem item = mImageList.get(mCurrentItemPosition);
controllerView.onPageSelected(mCurrentItemPosition, item, mImageList.size());
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
}
/**
* 预览列表点击
*
* @param imageItem 当前图片
*/
public void onPreviewItemClick(ImageItem imageItem) {
mViewPager.setCurrentItem(mImageList.indexOf(imageItem), false);
}
public IPickerPresenter getPresenter() {
return presenter;
}
public PreviewControllerView getControllerView() {
return controllerView;
}
static class TouchImageAdapter extends FragmentStatePagerAdapter {
private ArrayList imageItems;
TouchImageAdapter(FragmentManager fm, ArrayList imageItems) {
super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
this.imageItems = imageItems;
if (this.imageItems == null) {
this.imageItems = new ArrayList<>();
}
}
@Override
public int getCount() {
return imageItems.size();
}
@NonNull
@Override
public Fragment getItem(int position) {
return SinglePreviewFragment.newInstance(imageItems.get(position));
}
}
@Override
public void finish() {
super.finish();
PickerActivityManager.removeActivity(this);
if (currentImageSet != null && currentImageSet.imageItems != null) {
currentImageSet.imageItems.clear();
currentImageSet = null;
}
}
public static class SinglePreviewFragment extends Fragment {
static final String KEY_URL = "key_url";
private ImageItem imageItem;
static SinglePreviewFragment newInstance(ImageItem imageItem) {
SinglePreviewFragment fragment = new SinglePreviewFragment();
Bundle bundle = new Bundle();
bundle.putSerializable(SinglePreviewFragment.KEY_URL, imageItem);
fragment.setArguments(bundle);
return fragment;
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle bundle = getArguments();
if (bundle == null) {
return;
}
imageItem = (ImageItem) bundle.getSerializable(KEY_URL);
}
PreviewControllerView getControllerView() {
return ((MultiImagePreviewActivity) getActivity()).getControllerView();
}
IPickerPresenter getPresenter() {
return ((MultiImagePreviewActivity) getActivity()).getPresenter();
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return getControllerView().getItemView(this, imageItem, getPresenter());
}
}
}