package com.ypx.imagepicker.builder;
import android.app.Activity;
import android.os.Bundle;
import com.ypx.imagepicker.R;
import com.ypx.imagepicker.bean.selectconfig.CropSelectConfig;
import com.ypx.imagepicker.bean.MimeType;
import com.ypx.imagepicker.bean.PickerError;
import com.ypx.imagepicker.helper.PickerErrorExecutor;
import com.ypx.imagepicker.bean.ImageCropMode;
import com.ypx.imagepicker.activity.crop.MultiImageCropActivity;
import com.ypx.imagepicker.activity.crop.MultiImageCropFragment;
import com.ypx.imagepicker.bean.ImageItem;
import com.ypx.imagepicker.data.OnImagePickCompleteListener;
import com.ypx.imagepicker.presenter.IPickerPresenter;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
/**
* Description: 小红书剪裁选择器构造类
*
* Author: peixing.yang
* Date: 2019/2/28
*/
public class CropPickerBuilder {
private CropSelectConfig selectConfig;
private IPickerPresenter presenter;
public CropPickerBuilder(IPickerPresenter presenter) {
this.presenter = presenter;
this.selectConfig = new CropSelectConfig();
}
/**
* @param columnCount 设置列数
*/
public CropPickerBuilder setColumnCount(int columnCount) {
selectConfig.setColumnCount(columnCount);
return this;
}
/**
* @param duration 设置视频可选择的最大时长
*/
public CropPickerBuilder setMaxVideoDuration(long duration) {
this.selectConfig.setMaxVideoDuration(duration);
return this;
}
/**
* @param duration 设置视频可选择的最小时长
*/
public CropPickerBuilder setMinVideoDuration(long duration) {
this.selectConfig.setMinVideoDuration(duration);
return this;
}
/**
* @param maxCount 选中数量限制
*/
public CropPickerBuilder setMaxCount(int maxCount) {
selectConfig.setMaxCount(maxCount);
return this;
}
/**
* @param isSinglePick 是否单选视频,如果设置为true,则点击item会走presenter的clickVideo方法,
* 设置为false,则触发视频多选和预览模式
*/
public CropPickerBuilder setVideoSinglePick(boolean isSinglePick) {
selectConfig.setVideoSinglePick(isSinglePick);
return this;
}
/**
* @param isShowCamera 是否显示拍照item
*/
public CropPickerBuilder showCamera(boolean isShowCamera) {
selectConfig.setShowCamera(isShowCamera);
return this;
}
/**
* 设置需要加载的文件类型
*
* @param mimeTypes 需要加载的文件类型集合
*/
public CropPickerBuilder mimeTypes(Set mimeTypes) {
if (mimeTypes == null || mimeTypes.size() == 0) {
return this;
}
selectConfig.setMimeTypes(mimeTypes);
return this;
}
/**
* 设置文件加载类型
*
* @param mimeTypes 文件类型数组
*/
public CropPickerBuilder mimeTypes(MimeType... mimeTypes) {
if (mimeTypes == null || mimeTypes.length == 0) {
return this;
}
Set mimeTypeSet = new HashSet<>(Arrays.asList(mimeTypes));
return mimeTypes(mimeTypeSet);
}
/**
* 设置需要过滤掉的文件类型
*
* @param mimeTypes 需要过滤的文件类型数组
*/
public CropPickerBuilder filterMimeTypes(MimeType... mimeTypes) {
if (mimeTypes == null || mimeTypes.length == 0) {
return this;
}
Set mimeTypeSet = new HashSet<>(Arrays.asList(mimeTypes));
return filterMimeTypes(mimeTypeSet);
}
/**
* 设置需要过滤掉的文件类型
*
* @param mimeTypes 文件类型集合
*/
public CropPickerBuilder filterMimeTypes(Set mimeTypes) {
selectConfig.getMimeTypes().removeAll(mimeTypes);
return this;
}
/**
* @param isAutoComplete 设置单选模式下是否点击item就自动回调
*/
public CropPickerBuilder setSinglePickWithAutoComplete(boolean isAutoComplete) {
selectConfig.setSinglePickAutoComplete(isAutoComplete);
return this;
}
//--------------- 以下是小红书剪裁特有属性 -------------------------------------
/**
* 在没有指定setFirstImageItem时,使用这个方法传入当前的第一张图片的宽高信息,
* 会生成一个新的FirstImageItem,其剪裁模式根据图片宽高决定,如果已经指定了FirstImageItem,则该方法无效
*
* @param width 第一张图片的宽
* @param height 第一张图片的高
*/
public CropPickerBuilder setFirstImageItemSize(int width, int height) {
if (width == 0 || height == 0 || selectConfig.hasFirstImageItem()) {
return this;
}
ImageItem firstImageItem = new ImageItem();
firstImageItem.setVideo(false);
firstImageItem.width = width;
firstImageItem.height = height;
if (Math.abs(width - height) < 5) {
firstImageItem.setCropMode(ImageCropMode.CropViewScale_FULL);
} else {
firstImageItem.setCropMode(ImageCropMode.CropViewScale_FIT);
}
return setFirstImageItem(firstImageItem);
}
/**
* 强制指定留白模式,即一打开只有留白模式
*
* @param isAssignGap 指定留白
*/
public CropPickerBuilder assignGapState(boolean isAssignGap) {
selectConfig.setAssignGapState(isAssignGap);
if (isAssignGap) {
setFirstImageItemSize(1, 1);
}
return this;
}
/**
* @param firstImageItem 设置之前选择的第一个item,用于指定默认剪裁模式,如果当前item是图片,
* 则强制所有图片剪裁模式为当前图片比例,如果当前item是视频,
* 则强制只能选择视频
*/
public CropPickerBuilder setFirstImageItem(ImageItem firstImageItem) {
if (firstImageItem != null) {
if (firstImageItem.isVideo() || selectConfig.hasFirstImageItem()) {
return this;
}
if ((firstImageItem.width > 0 && firstImageItem.height > 0)) {
selectConfig.setFirstImageItem(firstImageItem);
}
}
return this;
}
//--------------- 以上是小红书剪裁特有属性 -------------------------------------
/**
* @param selectConfig 选择配置项
*/
public CropPickerBuilder withSelectConfig(CropSelectConfig selectConfig) {
this.selectConfig = selectConfig;
return this;
}
/**
* 页面直接调用剪裁器
*
* @param activity 调用者
* @param listener 图片视频选择回调
*/
public void pick(Activity activity, final OnImagePickCompleteListener listener) {
checkVideoAndImage();
if (selectConfig.getMimeTypes() == null || selectConfig.getMimeTypes().size() == 0) {
PickerErrorExecutor.executeError(listener, PickerError.MIMETYPES_EMPTY.getCode());
presenter.tip(activity, activity.getString(R.string.picker_str_tip_mimeTypes_empty));
return;
}
MultiImageCropActivity.intent(activity, presenter, selectConfig, listener);
}
/**
* fragment构建
*
* @param imageListener 图片视频选择回调
*/
public MultiImageCropFragment pickWithFragment(OnImagePickCompleteListener imageListener) {
checkVideoAndImage();
MultiImageCropFragment mFragment = new MultiImageCropFragment();
Bundle bundle = new Bundle();
bundle.putSerializable(MultiImageCropActivity.INTENT_KEY_DATA_PRESENTER, presenter);
bundle.putSerializable(MultiImageCropActivity.INTENT_KEY_SELECT_CONFIG, selectConfig);
mFragment.setArguments(bundle);
mFragment.setOnImagePickCompleteListener(imageListener);
return mFragment;
}
/**
* 检测文件加载类型中是否全是图片或视频
*/
private void checkVideoAndImage() {
selectConfig.setSinglePickImageOrVideoType(true);
if (selectConfig == null) {
return;
}
selectConfig.setShowVideo(false);
selectConfig.setShowImage(false);
for (MimeType mimeType : selectConfig.getMimeTypes()) {
if (MimeType.ofVideo().contains(mimeType)) {
selectConfig.setShowVideo(true);
}
if (MimeType.ofImage().contains(mimeType)) {
selectConfig.setShowImage(true);
}
}
}
}