package com.yydcdut.noteplugin.model;
import android.content.Context;
import android.database.Cursor;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.annotation.NonNull;
import com.yydcdut.noteplugin.bean.FilePhoto;
import com.yydcdut.noteplugin.bean.MediaFolder;
import com.yydcdut.noteplugin.bean.MediaPhoto;
import com.yydcdut.noteplugin.bean.TreeFile;
import java.io.File;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Created by yuyidong on 16/3/19.
*/
public class PhotoModel {
private Map<String, MediaFolder> mMediaCache;
private PhotoModel() {
}
private static class Holder {
public static final PhotoModel INSTANCE = new PhotoModel();
}
public static PhotoModel getInstance() {
return Holder.INSTANCE;
}
@NonNull
public Map<String, MediaFolder> findByMedia(@NonNull Context context) {
WeakReference<Context> contextWeakReference = new WeakReference<>(context);
if (mMediaCache == null) {
mMediaCache = new HashMap<>();
MediaFolder mediaFolder4All = new MediaFolder(MediaFolder.ALL, new ArrayList<MediaPhoto>());
mMediaCache.put(MediaFolder.ALL, mediaFolder4All);
final String[] projectionPhotos = {
MediaStore.Images.Media._ID,
MediaStore.Images.Media.BUCKET_ID,
MediaStore.Images.Media.BUCKET_DISPLAY_NAME,
MediaStore.Images.Media.DATA,
MediaStore.Images.Media.DATE_TAKEN,
MediaStore.Images.Media.ORIENTATION,
MediaStore.Images.Thumbnails.DATA
};
Cursor cursor = MediaStore.Images.Media.query(contextWeakReference.get().getContentResolver(), MediaStore.Images.Media.EXTERNAL_CONTENT_URI
, projectionPhotos, "", null, MediaStore.Images.Media.DATE_TAKEN + " DESC");
if (cursor == null) {
return mMediaCache;
}
while (cursor.moveToNext()) {
String path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
String thumb = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Thumbnails.DATA));
File file = new File(path);
if (file.exists() && file.length() > 0) {
MediaPhoto mediaPhoto = new MediaPhoto(path, thumb);
String folderName = file.getParentFile().getName();
MediaFolder mediaFolder = mMediaCache.get(folderName);
if (mediaFolder == null) {
List<MediaPhoto> mediaPhotoList = new ArrayList<>();
mediaPhotoList.add(mediaPhoto);
mediaFolder = new MediaFolder(folderName, mediaPhotoList);
mMediaCache.put(folderName, mediaFolder);
} else {
mediaFolder.getMediaPhotoList().add(mediaPhoto);
}
mediaFolder4All.getMediaPhotoList().add(mediaPhoto);
}
}
}
contextWeakReference.clear();
return mMediaCache;
}
public TreeFile findByPath() {
if (!hasSDCard()) {
return null;
}
TreeFile rootTreeFile = new FilePhoto(0, Environment.getExternalStorageDirectory().getAbsolutePath(), null);
String sdPath = Environment.getExternalStorageDirectory().getAbsolutePath();
ergodicFiles(rootTreeFile, new File(sdPath));
return rootTreeFile;
}
private boolean hasSDCard() {
String state = Environment.getExternalStorageState();
if (!Environment.MEDIA_MOUNTED.equals(state)) {
return false;
} else {
return true;
}
}
private void ergodicFiles(TreeFile root, File rootFile) {
if (rootFile.isDirectory()) {
for (File file : rootFile.listFiles()) {
if (file.isDirectory()) {
TreeFile child = new FilePhoto(root.getLevel() + 1, file.getName(), root);
root.addChild(child);
ergodicFiles(child, file);
} else {
TreeFile child = new FilePhoto(root.getLevel() + 1, file.getName(), root);
root.addChild(child);
if (isPhoto(file)) {
root.addCoverPhoto(file.getName());
}
}
}
} else {
}
}
private boolean isPhoto(File file) {
String name = file.getName();
if (name.endsWith(".jpg") || name.endsWith(".png") || name.endsWith(".jpeg") || name.endsWith(".gif")) {
return true;
} else {
return false;
}
}
public static Comparator<TreeFile> getComparator() {
return new Comparator<TreeFile>() {
@Override
public int compare(TreeFile lhs, TreeFile rhs) {
int maxLength = lhs.getFileName().length() > rhs.getFileName().length() ? rhs.getFileName().length() : lhs.getFileName().length();
for (int index = 0; index < maxLength; index++) {
char left = lhs.getFileName().charAt(index);
char right = rhs.getFileName().charAt(index);
int comparator = left - right;
if (comparator > 0) {
return 1;
} else if (comparator < 0) {
return -1;
}
}
return lhs.getFileName().length() > rhs.getFileName().length() ? 1 : -1;
}
};
}
}