package com.ypx.imagepicker.data; import android.content.Context; import android.database.Cursor; import android.os.Bundle; import androidx.annotation.NonNull; import androidx.fragment.app.FragmentActivity; import androidx.loader.app.LoaderManager; import androidx.loader.content.Loader; import com.ypx.imagepicker.bean.selectconfig.BaseSelectConfig; import com.ypx.imagepicker.bean.ImageSet; import com.ypx.imagepicker.bean.MimeType; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.Set; import static com.ypx.imagepicker.data.MediaStoreConstants.COLUMN_BUCKET_DISPLAY_NAME; import static com.ypx.imagepicker.data.MediaStoreConstants.COLUMN_BUCKET_ID; import static com.ypx.imagepicker.data.MediaStoreConstants.COLUMN_COUNT; import static com.ypx.imagepicker.data.MediaStoreConstants.COLUMN_URI; /** * Description: 媒体文件夹数据 *

* Author: peixing.yang * Date: 2019/4/11 */ public class MediaSetsDataSource implements LoaderManager.LoaderCallbacks { private static final int LOADER_ID = 1; private WeakReference mContext; private LoaderManager mLoaderManager; private MediaSetProvider mediaSetProvider; private boolean isLoadVideo; private boolean isLoadImage; private Set mimeTypeSet = MimeType.ofAll(); public MediaSetsDataSource setMimeTypeSet(BaseSelectConfig config) { isLoadImage = config.isShowImage(); isLoadVideo = config.isShowVideo(); mimeTypeSet = config.getMimeTypes(); return this; } public MediaSetsDataSource setMimeTypeSet(Set mimeTypeSet) { this.mimeTypeSet = mimeTypeSet; for (MimeType mimeType : mimeTypeSet) { if (MimeType.ofVideo().contains(mimeType)) { isLoadVideo = true; } if (MimeType.ofImage().contains(mimeType)) { isLoadImage = true; } } return this; } public void loadMediaSets(MediaSetProvider mediaSetProvider) { this.mediaSetProvider = mediaSetProvider; mLoaderManager.initLoader(LOADER_ID, null, this); } public static MediaSetsDataSource create(FragmentActivity activity) { return new MediaSetsDataSource(activity); } private MediaSetsDataSource(FragmentActivity activity) { mContext = new WeakReference<>(activity); mLoaderManager = LoaderManager.getInstance(mContext.get()); } @NonNull @Override public Loader onCreateLoader(int id, Bundle args) { Context context = mContext.get(); return MediaSetsLoader.create(context, mimeTypeSet, isLoadVideo, isLoadImage); } @Override public void onLoadFinished(@NonNull Loader loader, Cursor cursor) { FragmentActivity context = mContext.get(); if (context == null) { return; } ArrayList imageSetList = new ArrayList<>(); if (!context.isDestroyed() && cursor.moveToFirst() && !cursor.isClosed()) { do { ImageSet imageSet = new ImageSet(); imageSet.id = getString(cursor, COLUMN_BUCKET_ID); imageSet.name = getString(cursor, COLUMN_BUCKET_DISPLAY_NAME); imageSet.coverPath = getString(cursor, COLUMN_URI); imageSet.count = getInt(cursor, COLUMN_COUNT); imageSetList.add(imageSet); } while (!context.isDestroyed() && cursor.moveToNext() && !cursor.isClosed()); } if (mediaSetProvider != null) { mediaSetProvider.providerMediaSets(imageSetList); } if (mLoaderManager != null) { mLoaderManager.destroyLoader(LOADER_ID); } } @Override public void onLoaderReset(@NonNull Loader loader) { } public interface MediaSetProvider { void providerMediaSets(ArrayList imageSets); } private int getInt(Cursor data, String text) { int index = hasColumn(data, text); if (index != -1) { return data.getInt(index); } else { return 0; } } private String getString(Cursor data, String text) { int index = hasColumn(data, text); if (index != -1) { return data.getString(index); } else { return ""; } } private int hasColumn(Cursor data, String id) { if (data.isClosed()) { return -1; } try { return data.getColumnIndexOrThrow(id); } catch (Exception e) { return -1; } } }