package com.netease.nim.uikit.common.media.picker.fragment; import android.app.Activity; import android.database.Cursor; import android.os.AsyncTask; import android.os.Bundle; import android.provider.MediaStore; import android.provider.MediaStore.Images.Thumbnails; import android.text.TextUtils; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.TextView; import com.netease.nim.uikit.R; import com.netease.nim.uikit.common.fragment.TFragment; import com.netease.nim.uikit.common.media.dao.MediaDAO; import com.netease.nim.uikit.common.media.picker.adapter.PickerAlbumAdapter; import com.netease.nim.uikit.common.media.picker.model.AlbumInfo; import com.netease.nim.uikit.common.media.picker.model.PhotoInfo; import com.netease.nim.uikit.common.media.picker.util.ThumbnailsUtil; import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.List; public class PickerAlbumFragment extends TFragment implements OnItemClickListener { public interface OnAlbumItemClickListener { public void OnAlbumItemClick(AlbumInfo info); } private OnAlbumItemClickListener onAlbumItemClickListener; private LinearLayout loadingLay; private TextView loadingTips; private TextView loadingEmpty; private ListView albumListView; public static final String FILE_PREFIX = "file://"; private List<AlbumInfo> albumInfolist = new ArrayList<AlbumInfo>(); private PickerAlbumAdapter albumAdapter; public PickerAlbumFragment() { this.setContainerId(R.id.picker_album_fragment); } @Override public void onAttach(Activity activity) { super.onAttach(activity); if (onAlbumItemClickListener == null) { onAlbumItemClickListener = (OnAlbumItemClickListener) activity; } } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.nim_picker_image_folder_activity, container, false); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); findViews(); startImageScanTask(); } private void findViews() { loadingLay = findView(R.id.picker_image_folder_loading); loadingTips = findView(R.id.picker_image_folder_loading_tips); loadingEmpty = findView(R.id.picker_image_folder_loading_empty); albumListView = findView(R.id.picker_image_folder_listView); albumListView.setOnItemClickListener(this); } private void startImageScanTask() { new ImageScanAsyncTask().execute(); } private class ImageScanAsyncTask extends AsyncTask<Void, Void, Object> { @Override protected Object doInBackground(Void... params) { getAllMediaThumbnails(); getAllMediaPhotos(); return null; } @Override protected void onPostExecute(Object result) { super.onPostExecute(result); if (getActivity() != null && albumInfolist != null) { albumAdapter = new PickerAlbumAdapter(getActivity(), albumInfolist); albumListView.setAdapter(albumAdapter); if (albumInfolist.size() > 0) { loadingLay.setVisibility(View.GONE); } else { loadingLay.setVisibility(View.VISIBLE); loadingTips.setVisibility(View.GONE); loadingEmpty.setVisibility(View.VISIBLE); } } } } private void getAllMediaThumbnails() { ThumbnailsUtil.clear(); Cursor cursorThumb = null; try { cursorThumb = MediaDAO.getAllMediaThumbnails(getActivity()); if (cursorThumb != null && cursorThumb.moveToFirst()) { int imageID; String imagePath; do { imageID = cursorThumb.getInt(cursorThumb.getColumnIndex(Thumbnails.IMAGE_ID)); imagePath = cursorThumb.getString(cursorThumb.getColumnIndex(Thumbnails.DATA)); ThumbnailsUtil.put(imageID, FILE_PREFIX + imagePath); } while (cursorThumb.moveToNext()); } } catch (Exception e) { e.printStackTrace(); } finally { try { if (cursorThumb != null) { cursorThumb.close(); } } catch (Exception e) { } } } private void getAllMediaPhotos() { if (albumInfolist == null) { albumInfolist = new ArrayList<AlbumInfo>(); } else { albumInfolist.clear(); } Cursor cursorPhotos = null; try { cursorPhotos = MediaDAO.getAllMediaPhotos(getActivity()); HashMap<String, AlbumInfo> hash = new HashMap<String, AlbumInfo>(); AlbumInfo albumInfo = null; PhotoInfo photoInfo = null; if (cursorPhotos != null && cursorPhotos.moveToFirst()) { do { int index = 0; int _id = cursorPhotos.getInt(cursorPhotos.getColumnIndex(MediaStore.Images.Media._ID)); String path = cursorPhotos.getString(cursorPhotos.getColumnIndex(MediaStore.Images.Media.DATA)); String album = cursorPhotos.getString(cursorPhotos.getColumnIndex(MediaStore.Images.Media.BUCKET_DISPLAY_NAME)); long size = cursorPhotos.getLong(cursorPhotos.getColumnIndex(MediaStore.Images.Media.SIZE)); if (!isValidImageFile(path)) { Log.d("PICKER", "it is not a vaild path:" + path); continue; } List<PhotoInfo> photoList = new ArrayList<PhotoInfo>(); photoInfo = new PhotoInfo(); if (hash.containsKey(album)) { albumInfo = hash.remove(album); if (albumInfolist.contains(albumInfo)) index = albumInfolist.indexOf(albumInfo); photoInfo.setImageId(_id); photoInfo.setFilePath(FILE_PREFIX + path); photoInfo.setAbsolutePath(path); photoInfo.setSize(size); albumInfo.getList().add(photoInfo); albumInfolist.set(index, albumInfo); hash.put(album, albumInfo); } else { albumInfo = new AlbumInfo(); photoList.clear(); photoInfo.setImageId(_id); photoInfo.setFilePath(FILE_PREFIX + path); photoInfo.setAbsolutePath(path); photoInfo.setSize(size); photoList.add(photoInfo); albumInfo.setImageId(_id); albumInfo.setFilePath(FILE_PREFIX + path); albumInfo.setAbsolutePath(path); albumInfo.setAlbumName(album); albumInfo.setList(photoList); albumInfolist.add(albumInfo); hash.put(album, albumInfo); } } while (cursorPhotos.moveToNext()); } } catch (Exception e) { e.printStackTrace(); } finally { try { if (cursorPhotos != null) { cursorPhotos.close(); } } catch (Exception e) { } } } private boolean isValidImageFile(String filePath) { if (TextUtils.isEmpty(filePath)) { return false; } File imageFile = new File(filePath); if (imageFile.exists()) { return true; } return false; } @Override public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) { onAlbumItemClickListener.OnAlbumItemClick(albumInfolist.get(position)); } }