package com.ypx.imagepicker.data; import android.content.Context; import android.net.Uri; import android.provider.MediaStore; import androidx.loader.content.CursorLoader; import com.ypx.imagepicker.bean.ImageSet; import com.ypx.imagepicker.bean.MimeType; import java.util.ArrayList; import java.util.Set; import static com.ypx.imagepicker.data.MediaStoreConstants.DATA; import static com.ypx.imagepicker.data.MediaStoreConstants.DATE_MODIFIED; import static com.ypx.imagepicker.data.MediaStoreConstants.DISPLAY_NAME; import static com.ypx.imagepicker.data.MediaStoreConstants.DURATION; import static com.ypx.imagepicker.data.MediaStoreConstants.HEIGHT; import static com.ypx.imagepicker.data.MediaStoreConstants.MEDIA_TYPE; import static com.ypx.imagepicker.data.MediaStoreConstants.MEDIA_TYPE_IMAGE; import static com.ypx.imagepicker.data.MediaStoreConstants.MEDIA_TYPE_VIDEO; import static com.ypx.imagepicker.data.MediaStoreConstants.MIME_TYPE; import static com.ypx.imagepicker.data.MediaStoreConstants.SIZE; import static com.ypx.imagepicker.data.MediaStoreConstants.WIDTH; import static com.ypx.imagepicker.data.MediaStoreConstants._ID; public class MediaItemsLoader extends CursorLoader { private static final Uri QUERY_URI = MediaStore.Files.getContentUri("external"); private static final String[] PROJECTION = { _ID, DATA, DISPLAY_NAME, WIDTH, HEIGHT, MIME_TYPE, SIZE, DURATION, DATE_MODIFIED}; private static final String ORDER_BY = MediaStore.Files.FileColumns.DATE_MODIFIED + " DESC"; private MediaItemsLoader(Context context, String selection, String[] selectionArgs) { super(context, QUERY_URI, PROJECTION, selection, selectionArgs, ORDER_BY); } static CursorLoader newInstance(Context context, ImageSet album, Set mimeTypeSet) { String[] selectionsArgs; String albumSelections = ""; String mimeSelections = ""; int index = 0; ArrayList arrayList = MimeType.getMimeTypeList(mimeTypeSet); if (album.isAllMedia() || album.isAllVideo()) { selectionsArgs = new String[arrayList.size()]; } else { selectionsArgs = new String[arrayList.size() + 1]; selectionsArgs[0] = album.id; index = 1; albumSelections = " bucket_id=? AND "; } for (String mimeType : arrayList) { selectionsArgs[index] = mimeType; mimeSelections = String.format("%s =? OR %s", MediaStore.Files.FileColumns.MIME_TYPE, mimeSelections); index++; } if (mimeSelections.endsWith(" OR ")) { mimeSelections = mimeSelections.substring(0, mimeSelections.length() - 4); } String selections = albumSelections + "(" + MEDIA_TYPE + "=" + MEDIA_TYPE_IMAGE + " OR " + MEDIA_TYPE + "=" + MEDIA_TYPE_VIDEO + ")" + " AND " + SIZE + ">0" + " AND (" + mimeSelections + ")"; return new MediaItemsLoader(context, selections, selectionsArgs); } @Override public void onContentChanged() { } }