Skip to content

Commit

Permalink
commit
Browse files Browse the repository at this point in the history
  • Loading branch information
罗孟伟 committed Dec 15, 2023
1 parent 7205bbf commit a558947
Show file tree
Hide file tree
Showing 8 changed files with 284 additions and 180 deletions.

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,15 @@ public PictureSelectionQueryModel isBmp(boolean isBmp) {
return this;
}

/**
* @param isHeic Whether to open .isHeic
* @return
*/
public PictureSelectionQueryModel isHeic(boolean isHeic) {
selectionConfig.isHeic = isHeic;
return this;
}


/**
* # file size The unit is KB
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,19 @@ public static boolean isHasBmp(String mimeType) {
|| mimeType.startsWith(PictureMimeType.ofWapBMP());
}

/**
* isHasHeic
*
* @param mimeType
* @return
*/
public static boolean isHasHeic(String mimeType) {
if (TextUtils.isEmpty(mimeType)) {
return false;
}
return mimeType.startsWith(PictureMimeType.ofHeic());
}

/**
* Determine if it is JPG.
*
Expand Down Expand Up @@ -259,6 +272,7 @@ public static String ofBMP() {
return MIME_TYPE_BMP;
}


public static String ofXmsBMP() {
return MIME_TYPE_XMS_BMP;
}
Expand All @@ -267,6 +281,10 @@ public static String ofWapBMP() {
return MIME_TYPE_WAP_BMP;
}

public static String ofHeic() {
return MIME_TYPE_HEIC;
}

public static String ofGIF() {
return MIME_TYPE_GIF;
}
Expand Down Expand Up @@ -309,6 +327,7 @@ public static String ofAVI() {
private final static String MIME_TYPE_WAP_BMP = "image/vnd.wap.wbmp";
private final static String MIME_TYPE_GIF = "image/gif";
private final static String MIME_TYPE_WEBP = "image/webp";
private final static String MIME_TYPE_HEIC = "image/heic";

private final static String MIME_TYPE_3GP = "video/3gp";
private final static String MIME_TYPE_MP4 = "video/mp4";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@ public final class SelectorConfig {
public boolean isGif;
public boolean isWebp;
public boolean isBmp;
public boolean isHeic;
public boolean isEnablePreviewImage;
public boolean isEnablePreviewVideo;
public boolean isEnablePreviewAudio;
Expand All @@ -94,7 +95,9 @@ public final class SelectorConfig {
public boolean isEmptyResultReturn;
public boolean isHidePreviewDownload;
public boolean isWithVideoImage;
public List<String> queryOnlyList;
public List<String> queryOnlyImageList;
public List<String> queryOnlyVideoList;
public List<String> queryOnlyAudioList;
public List<String> skipCropList;
public boolean isCheckOriginalImage;
public String outPutCameraImageFileName;
Expand Down Expand Up @@ -177,6 +180,7 @@ private void initDefaultValue() {
isGif = false;
isWebp = true;
isBmp = true;
isHeic = true;
isCheckOriginalImage = false;
isDirectReturnSingle = false;
isEnablePreviewImage = true;
Expand All @@ -192,7 +196,9 @@ private void initDefaultValue() {
outPutCameraImageFileName = "";
outPutCameraVideoFileName = "";
outPutAudioFileName = "";
queryOnlyList = new ArrayList<>();
queryOnlyImageList = new ArrayList<>();
queryOnlyVideoList = new ArrayList<>();
queryOnlyAudioList = new ArrayList<>();
outPutCameraDir = "";
outPutAudioDir = "";
sandboxDir = "";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,15 @@
import android.database.Cursor;
import android.net.Uri;
import android.provider.MediaStore;
import android.text.TextUtils;

import com.luck.picture.lib.config.PictureMimeType;
import com.luck.picture.lib.config.SelectorConfig;
import com.luck.picture.lib.config.SelectMimeType;
import com.luck.picture.lib.entity.LocalMedia;
import com.luck.picture.lib.entity.LocalMediaFolder;
import com.luck.picture.lib.interfaces.OnQueryAlbumListener;
import com.luck.picture.lib.interfaces.OnQueryAllAlbumListener;
import com.luck.picture.lib.interfaces.OnQueryDataResultListener;

import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;

Expand All @@ -30,6 +26,12 @@ public abstract class IBridgeMediaLoader {
protected static final Uri QUERY_URI = MediaStore.Files.getContentUri("external");
protected static final String ORDER_BY = MediaStore.MediaColumns.DATE_MODIFIED + " DESC";
protected static final String NOT_GIF = " AND (" + MediaStore.MediaColumns.MIME_TYPE + "!='image/gif')";
protected static final String NOT_WEBP = " AND (" + MediaStore.MediaColumns.MIME_TYPE + "!='image/webp')";
protected static final String NOT_BMP = " AND (" + MediaStore.MediaColumns.MIME_TYPE + "!='image/bmp')";
protected static final String NOT_XMS_BMP = " AND (" + MediaStore.MediaColumns.MIME_TYPE + "!='image/x-ms-bmp')";
protected static final String NOT_VND_WAP_BMP = " AND (" + MediaStore.MediaColumns.MIME_TYPE + "!='image/vnd.wap.wbmp')";
protected static final String NOT_HEIC = " AND (" + MediaStore.MediaColumns.MIME_TYPE + "!='image/heic')";

protected static final String GROUP_BY_BUCKET_Id = " GROUP BY (bucket_id";
protected static final String DISTINCT_BUCKET_Id = "DISTINCT bucket_id";
protected static final String COLUMN_COUNT = "count";
Expand Down Expand Up @@ -167,43 +169,56 @@ protected String getFileSizeCondition() {
Math.max(0, getConfig().filterMinFileSize), "=", maxS);
}

/**
* getQueryMimeCondition
*
* @return
*/
protected String getQueryMimeCondition() {
List<String> filters = getConfig().queryOnlyList;
HashSet<String> filterSet = new HashSet<>(filters);
Iterator<String> iterator = filterSet.iterator();
protected String getImageMimeTypeCondition(){
List<String> filters = getConfig().queryOnlyImageList;
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < filters.size(); i++) {
String mimeType = filters.get(i);
stringBuilder.append(i == 0 ? " AND " : " OR ")
.append(MediaStore.MediaColumns.MIME_TYPE).append("='").append(mimeType)
.append("'");
}
if (!getConfig().isGif && !getConfig().queryOnlyImageList.contains(PictureMimeType.ofGIF())) {
stringBuilder.append(NOT_GIF);
}
if (!getConfig().isWebp && !getConfig().queryOnlyImageList.contains(PictureMimeType.ofWEBP())) {
stringBuilder.append(NOT_WEBP);
}
if (!getConfig().isBmp && !getConfig().queryOnlyImageList.contains(PictureMimeType.ofBMP())
&& !getConfig().queryOnlyImageList.contains(PictureMimeType.ofXmsBMP())
&& !getConfig().queryOnlyImageList.contains(PictureMimeType.ofWapBMP())
) {
stringBuilder.append(NOT_BMP).append(NOT_XMS_BMP).append(NOT_VND_WAP_BMP);
}
if (!getConfig().isHeic && !getConfig().queryOnlyImageList.contains(PictureMimeType.ofHeic())) {
stringBuilder.append(NOT_HEIC);
}

return stringBuilder.toString();
}

protected String getVideoMimeTypeCondition(){
List<String> filters = getConfig().queryOnlyVideoList;
StringBuilder stringBuilder = new StringBuilder();
int index = -1;
while (iterator.hasNext()) {
String value = iterator.next();
if (TextUtils.isEmpty(value)) {
continue;
}
if (getConfig().chooseMode == SelectMimeType.ofVideo()) {
if (value.startsWith(PictureMimeType.MIME_TYPE_PREFIX_IMAGE) || value.startsWith(PictureMimeType.MIME_TYPE_PREFIX_AUDIO)) {
continue;
}
} else if (getConfig().chooseMode == SelectMimeType.ofImage()) {
if (value.startsWith(PictureMimeType.MIME_TYPE_PREFIX_AUDIO) || value.startsWith(PictureMimeType.MIME_TYPE_PREFIX_VIDEO)) {
continue;
}
} else if (getConfig().chooseMode == SelectMimeType.ofAudio()) {
if (value.startsWith(PictureMimeType.MIME_TYPE_PREFIX_VIDEO) || value.startsWith(PictureMimeType.MIME_TYPE_PREFIX_IMAGE)) {
continue;
}
}
index++;
stringBuilder.append(index == 0 ? " AND " : " OR ").append(MediaStore.MediaColumns.MIME_TYPE).append("='").append(value).append("'");
for (int i = 0; i < filters.size(); i++) {
String mimeType = filters.get(i);
stringBuilder.append(i == 0 ? " AND " : " OR ")
.append(MediaStore.MediaColumns.MIME_TYPE).append("='").append(mimeType)
.append("'");
}
if (getConfig().chooseMode != SelectMimeType.ofVideo()) {
if (!getConfig().isGif && !filterSet.contains(PictureMimeType.ofGIF())) {
stringBuilder.append(NOT_GIF);
}
return stringBuilder.toString();
}

protected String getAudioMimeTypeCondition() {
List<String> filters = getConfig().queryOnlyAudioList;
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < filters.size(); i++) {
String mimeType = filters.get(i);
stringBuilder.append(i == 0 ? " AND " : " OR ")
.append(MediaStore.MediaColumns.MIME_TYPE).append("='").append(mimeType)
.append("'");
}
return stringBuilder.toString();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -62,16 +62,16 @@ private static String getSelectionArgsForAudioMediaCondition(String durationCond
*
* @param timeCondition
* @param sizeCondition
* @param queryMimeCondition
* @return
* @param queryImageMimeType
* @param queryVideoMimeType
*/
private static String getSelectionArgsForAllMediaCondition(String timeCondition,
String sizeCondition,
String queryMimeCondition) {
String queryImageMimeType,
String queryVideoMimeType) {
return "(" +
MediaStore.Files.FileColumns.MEDIA_TYPE + "=?" +
queryMimeCondition + " OR " +
MediaStore.Files.FileColumns.MEDIA_TYPE + "=? AND " +
MediaStore.Files.FileColumns.MEDIA_TYPE + "=?" + queryImageMimeType + " OR " +
MediaStore.Files.FileColumns.MEDIA_TYPE + "=?" + queryVideoMimeType + " AND " +
timeCondition + ") AND " +
sizeCondition;
}
Expand Down Expand Up @@ -210,20 +210,19 @@ public String getAlbumFirstCover(long bucketId) {
protected String getSelection() {
String durationCondition = getDurationCondition();
String fileSizeCondition = getFileSizeCondition();
String queryMimeCondition = getQueryMimeCondition();
switch (getConfig().chooseMode) {
case SelectMimeType.TYPE_ALL:
// Get all, not including audio
return getSelectionArgsForAllMediaCondition(durationCondition, fileSizeCondition, queryMimeCondition);
return getSelectionArgsForAllMediaCondition(durationCondition, fileSizeCondition, getImageMimeTypeCondition(),getVideoMimeTypeCondition());
case SelectMimeType.TYPE_IMAGE:
// Gets the image
return getSelectionArgsForImageMediaCondition(fileSizeCondition, queryMimeCondition);
return getSelectionArgsForImageMediaCondition(fileSizeCondition, getImageMimeTypeCondition());
case SelectMimeType.TYPE_VIDEO:
// Access to video
return getSelectionArgsForVideoMediaCondition(durationCondition, queryMimeCondition);
return getSelectionArgsForVideoMediaCondition(durationCondition, getVideoMimeTypeCondition());
case SelectMimeType.TYPE_AUDIO:
// Access to the audio
return getSelectionArgsForAudioMediaCondition(durationCondition, queryMimeCondition);
return getSelectionArgsForAudioMediaCondition(durationCondition, getAudioMimeTypeCondition());
}
return null;
}
Expand Down Expand Up @@ -299,6 +298,11 @@ protected LocalMedia parseLocalMedia(Cursor data, boolean isUsePool) {
return null;
}
}
if (!getConfig().isHeic) {
if (PictureMimeType.isHasHeic(mimeType)) {
return null;
}
}

int width = data.getInt(widthColumn);
int height = data.getInt(heightColumn);
Expand Down
Loading

0 comments on commit a558947

Please sign in to comment.