package com.smartisanos.sidebar.util;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import android.content.Context;
import android.database.ContentObserver;
import android.database.Cursor;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.provider.MediaStore;
import android.text.TextUtils;
public class RecentPhotoManager extends DataManager implements IClear{
private static final LOG log = LOG.getInstance(RecentPhotoManager.class);
private static final String[] DO_NOT_SUPPORT_TYPE = new String[] {
"dng"
};
public static boolean isSupportedType(String path) {
if (path == null) {
return false;
}
String imgPath = path.toLowerCase();
for (String type : DO_NOT_SUPPORT_TYPE) {
if (imgPath.endsWith(type)) {
return false;
}
}
return true;
}
private volatile static RecentPhotoManager sInstance;
public synchronized static RecentPhotoManager getInstance(Context context){
if(sInstance == null){
synchronized(RecentPhotoManager.class){
if(sInstance == null){
sInstance = new RecentPhotoManager(context);
}
}
}
return sInstance;
}
private static final String[] thumbCols = new String[] {
MediaStore.Images.ImageColumns.DATA,
MediaStore.Images.ImageColumns.MIME_TYPE,
MediaStore.Images.ImageColumns.DATE_TAKEN,
MediaStore.Images.ImageColumns._ID,
};
private static final String DATABASE_NAME = "UselessPhoto";
private Context mContext;
private List<ImageInfo> mList = new ArrayList<ImageInfo>();
private ClearDatabaseHelper mDatabaseHelper;
private Handler mHandler;
private ImageObserver mImageObserver;
private boolean mRegistered;
private RecentPhotoManager(Context context) {
mContext = context;
HandlerThread thread = new HandlerThread(RecentPhotoManager.class.getName());
thread.start();
mHandler = new PhotoManagerHandler(thread.getLooper());
mDatabaseHelper = new ClearDatabaseHelper(mContext, DATABASE_NAME, mCallback);
mImageObserver = new ImageObserver(mHandler);
}
public void startObserver() {
synchronized (mImageObserver) {
if (!mRegistered) {
mRegistered = true;
mContext.getContentResolver().registerContentObserver(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, true, mImageObserver);
sendMessageIfNotExist(MSG_UPDATE_IMAGE_LIST);
}
}
}
public void stopObserver() {
synchronized (mImageObserver) {
if (mRegistered) {
mRegistered = false;
mContext.getContentResolver().unregisterContentObserver(mImageObserver);
mHandler.removeMessages(MSG_UPDATE_IMAGE_LIST);
}
}
}
private ClearDatabaseHelper.Callback mCallback = new ClearDatabaseHelper.Callback(){
@Override
public void onInitComplete() {
sendMessageIfNotExist(MSG_UPDATE_IMAGE_LIST);
}
};
public List<ImageInfo> getImageList(){
List<ImageInfo> list =new ArrayList<ImageInfo>();
synchronized(RecentPhotoManager.class){
list.addAll(mList);
}
return list;
}
private void updateImageList() {
ThreadVerify.verify(false);
if (!mDatabaseHelper.isDataSetOk()) {
return;
}
List<ImageInfo> imageList = new ArrayList<ImageInfo>();
Set<Integer> useless = mDatabaseHelper.getSet();
Cursor cursor = null;
try {
cursor = mContext.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, thumbCols, null, null, null);
if (cursor.moveToFirst()) {
do {
ImageInfo info = new ImageInfo();
info.filePath = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.ImageColumns.DATA));
info.mimeType = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.ImageColumns.MIME_TYPE));
info.time = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Images.ImageColumns.DATE_TAKEN));
info.id = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Images.ImageColumns._ID));
if (!TextUtils.isEmpty(info.filePath)&& !TextUtils.isEmpty(info.mimeType)) {
if (!useless.contains(info.id) && isSupportedType(info.filePath)) {
imageList.add(info);
}
}
} while (cursor.moveToNext());
}
Collections.reverse(imageList);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (cursor != null) {
cursor.close();
}
}
synchronized (RecentPhotoManager.class) {
mList = imageList;
}
notifyListener();
}
private class ImageObserver extends ContentObserver{
public ImageObserver(Handler handler) {
super(handler);
}
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
sendMessageIfNotExist(MSG_UPDATE_IMAGE_LIST);
}
}
@Override
public void clear() {
List<Integer> clearList = new ArrayList<Integer>();
synchronized (RecentPhotoManager.class) {
for(ImageInfo fi : mList){
clearList.add(fi.id);
}
mList.clear();
}
notifyListener();
mDatabaseHelper.addUselessId(clearList);
}
private void sendMessageIfNotExist(int msgId) {
if (!mHandler.hasMessages(msgId)) {
mHandler.obtainMessage(msgId).sendToTarget();
}
}
private static final int MSG_UPDATE_IMAGE_LIST = 0;
private class PhotoManagerHandler extends Handler {
public PhotoManagerHandler(Looper looper) {
super(looper, null, false);
}
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_UPDATE_IMAGE_LIST:
updateImageList();
break;
}
}
}
}