package com.gzsll.hupu.ui.gallery; import android.content.Context; import android.database.Cursor; import android.provider.MediaStore; import android.support.annotation.NonNull; import com.gzsll.hupu.bean.Folder; import com.gzsll.hupu.bean.Image; import com.gzsll.hupu.injector.PerActivity; import java.io.File; import java.util.ArrayList; import java.util.List; import javax.inject.Inject; import rx.Observable; import rx.Subscriber; import rx.Subscription; import rx.android.schedulers.AndroidSchedulers; import rx.functions.Action1; import rx.functions.Func1; import rx.schedulers.Schedulers; /** * Created by sll on 2016/3/9. */ @PerActivity public class GalleryPresenter implements GalleryContract.Presenter { private final String[] IMAGE_PROJECTION = { MediaStore.Images.Media.DATA, MediaStore.Images.Media.DISPLAY_NAME, MediaStore.Images.Media.DATE_ADDED, MediaStore.Images.Media._ID }; private GalleryContract.View mGalleryView; private Subscription mSubscription; private List<Folder> folders = new ArrayList<>(); private boolean hasFolderGened = false; private Context mContext; @Inject public GalleryPresenter(Context context) { mContext = context; } @Override public void attachView(@NonNull GalleryContract.View view) { mGalleryView = view; } @Override public void detachView() { if (mSubscription != null && !mSubscription.isUnsubscribed()) { mSubscription.unsubscribe(); } mGalleryView = null; } @Override public void onImageAndFolderReceive() { mSubscription = Observable.create(new Observable.OnSubscribe<Cursor>() { @Override public void call(Subscriber<? super Cursor> subscriber) { Cursor cursor = MediaStore.Images.Media.query(mContext.getContentResolver(), MediaStore.Images.Media.EXTERNAL_CONTENT_URI, IMAGE_PROJECTION, null, null, IMAGE_PROJECTION[2] + " DESC"); subscriber.onNext(cursor); } }).subscribeOn(Schedulers.io()).map(new Func1<Cursor, List<Image>>() { @Override public List<Image> call(Cursor cursor) { List<Image> images = new ArrayList<Image>(); if (cursor != null && cursor.getCount() > 0) { cursor.moveToFirst(); do { String path = cursor.getString(cursor.getColumnIndexOrThrow(IMAGE_PROJECTION[0])); String name = cursor.getString(cursor.getColumnIndexOrThrow(IMAGE_PROJECTION[1])); long dateTime = cursor.getLong(cursor.getColumnIndexOrThrow(IMAGE_PROJECTION[2])); Image image = new Image(path, name, dateTime); images.add(image); if (!hasFolderGened) { // 获取文件夹名称 File imageFile = new File(path); File folderFile = imageFile.getParentFile(); Folder folder = new Folder(); folder.name = folderFile.getName(); folder.path = folderFile.getAbsolutePath(); folder.cover = image; if (!folders.contains(folder)) { List<Image> imageList = new ArrayList<Image>(); imageList.add(image); folder.images = imageList; folders.add(folder); } else { // 更新 Folder f = folders.get(folders.indexOf(folder)); f.images.add(image); } hasFolderGened = true; } } while (cursor.moveToNext()); } return images; } }).observeOn(AndroidSchedulers.mainThread()).subscribe(new Action1<List<Image>>() { @Override public void call(List<Image> images) { mGalleryView.renderImages(images); mGalleryView.renderFolders(folders); } }); } }