package com.ypx.imagepicker.activity.multi;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AnimationUtils;
import android.widget.FrameLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.FragmentActivity;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.SimpleItemAnimator;
import com.ypx.imagepicker.ImagePicker;
import com.ypx.imagepicker.R;
import com.ypx.imagepicker.activity.PBaseLoaderFragment;
import com.ypx.imagepicker.activity.PickerActivityManager;
import com.ypx.imagepicker.activity.preview.MultiImagePreviewActivity;
import com.ypx.imagepicker.adapter.PickerFolderAdapter;
import com.ypx.imagepicker.bean.PickerItemDisableCode;
import com.ypx.imagepicker.data.IReloadExecutor;
import com.ypx.imagepicker.views.PickerUiConfig;
import com.ypx.imagepicker.helper.PickerErrorExecutor;
import com.ypx.imagepicker.adapter.PickerItemAdapter;
import com.ypx.imagepicker.bean.selectconfig.BaseSelectConfig;
import com.ypx.imagepicker.bean.ImageItem;
import com.ypx.imagepicker.bean.PickerError;
import com.ypx.imagepicker.bean.SelectMode;
import com.ypx.imagepicker.bean.ImageSet;
import com.ypx.imagepicker.bean.selectconfig.MultiSelectConfig;
import com.ypx.imagepicker.data.OnImagePickCompleteListener;
import com.ypx.imagepicker.presenter.IPickerPresenter;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.List;
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 MultiImagePickerFragment extends PBaseLoaderFragment implements View.OnClickListener,
PickerItemAdapter.OnActionResult, IReloadExecutor {
private List imageSets = new ArrayList<>();
private ArrayList imageItems = new ArrayList<>();
private RecyclerView mRecyclerView;
private View v_masker;
private TextView mTvTime;
private PickerFolderAdapter mImageSetAdapter;
private RecyclerView mFolderListRecyclerView;
private PickerItemAdapter mAdapter;
private ImageSet currentImageSet;
private FrameLayout titleBarContainer;
private FrameLayout bottomBarContainer;
private MultiSelectConfig selectConfig;
private IPickerPresenter presenter;
private PickerUiConfig uiConfig;
private FragmentActivity mContext;
private GridLayoutManager layoutManager;
private View view;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
view = inflater.inflate(R.layout.picker_activity_multipick, container, false);
return view;
}
/**
* 校验传递数据是否合法
*/
private boolean isIntentDataValid() {
Bundle bundle = getArguments();
if (bundle != null) {
selectConfig = (MultiSelectConfig) bundle.getSerializable(INTENT_KEY_SELECT_CONFIG);
presenter = (IPickerPresenter) bundle.getSerializable(INTENT_KEY_PRESENTER);
if (presenter == null) {
PickerErrorExecutor.executeError(onImagePickCompleteListener,
PickerError.PRESENTER_NOT_FOUND.getCode());
return false;
}
if (selectConfig == null) {
PickerErrorExecutor.executeError(onImagePickCompleteListener,
PickerError.SELECT_CONFIG_NOT_FOUND.getCode());
return false;
}
return true;
} else {
return false;
}
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mContext = getActivity();
if (isIntentDataValid()) {
ImagePicker.isOriginalImage = selectConfig.isDefaultOriginal();
uiConfig = presenter.getUiConfig(getWeakActivity());
setStatusBar();
findView();
if (selectConfig.getLastImageList() != null) {
selectList.addAll(selectConfig.getLastImageList());
}
loadMediaSets();
refreshCompleteState();
}
}
private OnImagePickCompleteListener onImagePickCompleteListener;
/**
* 设置图片选择器完成回调
*
* @param onImagePickCompleteListener 完成回调
*/
public void setOnImagePickCompleteListener(@NonNull OnImagePickCompleteListener onImagePickCompleteListener) {
this.onImagePickCompleteListener = onImagePickCompleteListener;
}
/**
* 初始化控件
*/
private void findView() {
v_masker = view.findViewById(R.id.v_masker);
mRecyclerView = view.findViewById(R.id.mRecyclerView);
mFolderListRecyclerView = view.findViewById(R.id.mSetRecyclerView);
mTvTime = view.findViewById(R.id.tv_time);
mTvTime.setVisibility(View.GONE);
titleBarContainer = view.findViewById(R.id.titleBarContainer);
bottomBarContainer = view.findViewById(R.id.bottomBarContainer);
initAdapters();
initUI();
setListener();
refreshCompleteState();
}
private RecyclerView.OnScrollListener onScrollListener = new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if (newState == RecyclerView.SCROLL_STATE_IDLE) {
if (mTvTime.getVisibility() == View.VISIBLE) {
mTvTime.setVisibility(View.GONE);
mTvTime.startAnimation(AnimationUtils.loadAnimation(mContext, R.anim.picker_fade_out));
}
} else {
if (mTvTime.getVisibility() == View.GONE) {
mTvTime.setVisibility(View.VISIBLE);
mTvTime.startAnimation(AnimationUtils.loadAnimation(mContext, R.anim.picker_fade_in));
}
}
}
@Override
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
if (imageItems != null)
try {
mTvTime.setText(imageItems.get(layoutManager.findFirstVisibleItemPosition()).getTimeFormat());
} catch (Exception ignored) {
}
}
};
/**
* 初始化UI界面
*/
private void initUI() {
mRecyclerView.setBackgroundColor(uiConfig.getPickerBackgroundColor());
titleBar = inflateControllerView(titleBarContainer, true, uiConfig);
bottomBar = inflateControllerView(bottomBarContainer, false, uiConfig);
setFolderListHeight(mFolderListRecyclerView, v_masker, false);
}
/**
* 初始化监听
*/
private void setListener() {
v_masker.setOnClickListener(this);
mRecyclerView.addOnScrollListener(onScrollListener);
mImageSetAdapter.setFolderSelectResult(new PickerFolderAdapter.FolderSelectResult() {
@Override
public void folderSelected(ImageSet set, int pos) {
selectImageFromSet(pos, true);
}
});
}
/**
* 初始化相关adapter
*/
private void initAdapters() {
mFolderListRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
mImageSetAdapter = new PickerFolderAdapter(presenter, uiConfig);
mFolderListRecyclerView.setAdapter(mImageSetAdapter);
mImageSetAdapter.refreshData(imageSets);
mAdapter = new PickerItemAdapter(selectList, new ArrayList(), selectConfig, presenter, uiConfig);
mAdapter.setHasStableIds(true);
mAdapter.setOnActionResult(this);
layoutManager = new GridLayoutManager(mContext, selectConfig.getColumnCount());
if (mRecyclerView.getItemAnimator() instanceof SimpleItemAnimator) {
((SimpleItemAnimator) mRecyclerView.getItemAnimator()).setSupportsChangeAnimations(false);
mRecyclerView.getItemAnimator().setChangeDuration(0);// 通过设置动画执行时间为0来解决闪烁问题
}
mRecyclerView.setLayoutManager(layoutManager);
mRecyclerView.setAdapter(mAdapter);
}
/**
* 选择图片文件夹
*
* @param position 位置
*/
private void selectImageFromSet(final int position, boolean isTransit) {
currentImageSet = imageSets.get(position);
if (isTransit) {
toggleFolderList();
}
for (ImageSet set1 : imageSets) {
set1.isSelected = false;
}
currentImageSet.isSelected = true;
mImageSetAdapter.notifyDataSetChanged();
if(currentImageSet.isAllMedia()){
if(selectConfig.isShowCameraInAllMedia()){
selectConfig.setShowCamera(true);
}
}else {
if(selectConfig.isShowCameraInAllMedia()){
selectConfig.setShowCamera(false);
}
}
loadMediaItemsFromSet(currentImageSet);
}
/**
* 显示或隐藏图片文件夹选项列表
*/
@Override
protected void toggleFolderList() {
if (mFolderListRecyclerView.getVisibility() == View.GONE) {
controllerViewOnTransitImageSet(true);
v_masker.setVisibility(View.VISIBLE);
mFolderListRecyclerView.setVisibility(View.VISIBLE);
mFolderListRecyclerView.setAnimation(AnimationUtils.loadAnimation(mContext,
uiConfig.isShowFromBottom() ? R.anim.picker_show2bottom : R.anim.picker_anim_in));
} else {
controllerViewOnTransitImageSet(false);
v_masker.setVisibility(View.GONE);
mFolderListRecyclerView.setVisibility(View.GONE);
mFolderListRecyclerView.setAnimation(AnimationUtils.loadAnimation(mContext,
uiConfig.isShowFromBottom() ? R.anim.picker_hide2bottom : R.anim.picker_anim_up));
}
}
@Override
public void onClick(@NonNull View v) {
if (onDoubleClick()) {
return;
}
if (v == v_masker) {
toggleFolderList();
}
}
@Override
protected void loadMediaSetsComplete(@Nullable List imageSetList) {
if (imageSetList == null || imageSetList.size() == 0 ||
(imageSetList.size() == 1 && imageSetList.get(0).count == 0)) {
tip(getString(R.string.picker_str_tip_media_empty));
return;
}
this.imageSets = imageSetList;
mImageSetAdapter.refreshData(imageSets);
selectImageFromSet(0, false);
}
@Override
protected void loadMediaItemsComplete(ImageSet set) {
this.imageItems = set.imageItems;
controllerViewOnImageSetSelected(set);
mAdapter.refreshData(imageItems);
}
@Override
protected void refreshAllVideoSet(ImageSet allVideoSet) {
if (allVideoSet != null && allVideoSet.imageItems != null
&& allVideoSet.imageItems.size() > 0
&& !imageSets.contains(allVideoSet)) {
imageSets.add(1, allVideoSet);
mImageSetAdapter.refreshData(imageSets);
}
}
@Override
public void onTakePhotoResult(@NonNull ImageItem imageItem) {
//剪裁模式下,直接跳转剪裁页面
if (selectConfig.getSelectMode() == SelectMode.MODE_CROP) {
intentCrop(imageItem);
return;
}
//单选模式下,直接回调出去
if (selectConfig.getSelectMode() == SelectMode.MODE_SINGLE) {
notifyOnSingleImagePickComplete(imageItem);
return;
}
//将拍照返回的imageItem手动添加到第一个item上并选中
addItemInImageSets(imageSets, imageItems, imageItem);
mAdapter.refreshData(imageItems);
mImageSetAdapter.refreshData(imageSets);
onCheckItem(imageItem, PickerItemDisableCode.NORMAL);
}
@Override
public boolean onBackPressed() {
if (mFolderListRecyclerView != null && mFolderListRecyclerView.getVisibility() == View.VISIBLE) {
toggleFolderList();
return true;
}
if (presenter != null && presenter.interceptPickerCancel(getWeakActivity(), selectList)) {
return true;
}
PickerErrorExecutor.executeError(onImagePickCompleteListener, PickerError.CANCEL.getCode());
return false;
}
@Override
public void onClickItem(@NonNull ImageItem item, int position, int disableItemCode) {
position = selectConfig.isShowCamera() ? position - 1 : position;
//拍照
if (position < 0 && selectConfig.isShowCamera()) {
if (!presenter.interceptCameraClick(getWeakActivity(), this)) {
checkTakePhotoOrVideo();
}
return;
}
//当前选中item是否不可以点击
if (interceptClickDisableItem(disableItemCode, false)) {
return;
}
mRecyclerView.setTag(item);
//剪裁模式下,直接跳转剪裁
if (selectConfig.getSelectMode() == SelectMode.MODE_CROP) {
if (item.isGif() || item.isVideo()) {
notifyOnSingleImagePickComplete(item);
} else {
intentCrop(item);
}
return;
}
//检测是否拦截了item点击
if (!mAdapter.isPreformClick() && presenter.interceptItemClick(getWeakActivity(), item, selectList, imageItems,
selectConfig, mAdapter, false, this)) {
return;
}
//如果当前是视频,且视频只能单选,且单选情况下自动回调,则执行回调
if (item.isVideo() && selectConfig.isVideoSinglePickAndAutoComplete()) {
notifyOnSingleImagePickComplete(item);
return;
}
//如果当前是单选模式,且单选模式下点击item直接回调,则直接回调
if (selectConfig.getMaxCount() <= 1 && selectConfig.isSinglePickAutoComplete()) {
notifyOnSingleImagePickComplete(item);
return;
}
//如果当前是视频,且不支持视频预览,则拦截掉点击
if (item.isVideo() && !selectConfig.isCanPreviewVideo()) {
tip(getActivity().getString(R.string.picker_str_tip_cant_preview_video));
return;
}
//如果开启了预览,则直接跳转预览
if (selectConfig.isPreview()) {
intentPreview(true, position);
}
}
@Override
public void onCheckItem(ImageItem imageItem, int disableItemCode) {
if (selectConfig.getSelectMode() == SelectMode.MODE_SINGLE
&& selectConfig.getMaxCount() == 1
&& selectList != null && selectList.size() > 0) {
if (selectList.contains(imageItem)) {
selectList.clear();
} else {
selectList.clear();
selectList.add(imageItem);
}
} else {
//当前选中item是否不可以点击
if (interceptClickDisableItem(disableItemCode, true)) {
return;
}
//检测是否拦截了item点击
if (!mAdapter.isPreformClick() && presenter.interceptItemClick(getWeakActivity(), imageItem, selectList, imageItems,
selectConfig, mAdapter, true, this)) {
return;
}
//如果当前选中列表包含此item,则移除,否则添加
if (selectList.contains(imageItem)) {
selectList.remove(imageItem);
} else {
selectList.add(imageItem);
}
}
mAdapter.notifyDataSetChanged();
refreshCompleteState();
}
/**
* 跳转剪裁页面
*
* @param imageItem 图片信息
*/
private void intentCrop(ImageItem imageItem) {
ImagePicker.crop(getActivity(), presenter, selectConfig, imageItem, new OnImagePickCompleteListener() {
@Override
public void onImagePickComplete(ArrayList items) {
selectList.clear();
selectList.addAll(items);
mAdapter.notifyDataSetChanged();
notifyPickerComplete();
}
});
}
/**
* 跳转预览
*
* @param position 默认选中的index
*/
@Override
protected void intentPreview(boolean isClickItem, int position) {
if (!isClickItem && (selectList == null || selectList.size() == 0)) {
return;
}
MultiImagePreviewActivity.intent(getActivity(), isClickItem ? currentImageSet : null,
selectList, selectConfig, presenter, position, new MultiImagePreviewActivity.PreviewResult() {
@Override
public void onResult(ArrayList mImageItems, boolean isCancel) {
if (isCancel) {
reloadPickerWithList(mImageItems);
} else {
selectList.clear();
selectList.addAll(mImageItems);
mAdapter.notifyDataSetChanged();
notifyPickerComplete();
}
}
});
}
/**
* 刷新选中图片列表,执行回调,退出页面
*/
@Override
protected void notifyPickerComplete() {
if (presenter == null||presenter.interceptPickerCompleteClick(getWeakActivity(), selectList, selectConfig)) {
return;
}
if (onImagePickCompleteListener != null) {
for (ImageItem imageItem : selectList) {
imageItem.isOriginalImage = ImagePicker.isOriginalImage;
}
onImagePickCompleteListener.onImagePickComplete(selectList);
}
}
@Override
protected BaseSelectConfig getSelectConfig() {
return selectConfig;
}
@Override
protected IPickerPresenter getPresenter() {
return presenter;
}
@Override
protected PickerUiConfig getUiConfig() {
return uiConfig;
}
@Override
public void onDestroy() {
uiConfig.setPickerUiProvider(null);
uiConfig = null;
presenter = null;
super.onDestroy();
}
@Override
public void reloadPickerWithList(List selectedList) {
selectList.clear();
selectList.addAll(selectedList);
mAdapter.refreshData(imageItems);
refreshCompleteState();
}
}