package info.guardianproject.pixelknot.adapters; import android.content.Context; import android.database.Cursor; import android.net.Uri; import android.os.AsyncTask; import android.provider.MediaStore; import android.support.v7.widget.RecyclerView; import android.text.TextUtils; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.squareup.picasso.Picasso; import java.io.File; import java.util.ArrayList; import java.util.Locale; import info.guardianproject.pixelknot.R; public class AlbumAdapter extends RecyclerView.Adapter<AlbumViewHolder> { private static final boolean LOGGING = false; private static final String LOGTAG = "AlbumAdapter"; public interface AlbumAdapterListener { void onAlbumSelected(String id, String albumName); void onPickExternalSelected(); } private final Context mContext; private final ArrayList<AlbumInfo> mAlbums; private final boolean mShowPickExternal; private AlbumAdapterListener mListener; public AlbumAdapter(Context context, boolean showPickExternal) { super(); mContext = context; mAlbums = new ArrayList<>(); mShowPickExternal = showPickExternal; getAlbums(); } public void setListener(AlbumAdapterListener listener) { mListener = listener; } private void getThumbnailAndCountForAlbum(AlbumInfo album) { album.thumbnail = null; album.count = 0; try { final String orderBy = MediaStore.Images.Media.DATE_TAKEN; String searchParams = MediaStore.Images.Media.BUCKET_ID + " = \"" + album.id + "\""; Cursor photoCursor = mContext.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null, searchParams, null, orderBy + " DESC"); if (photoCursor.getCount() > 0) { album.count = photoCursor.getCount(); photoCursor.moveToNext(); int colIndexUri = photoCursor.getColumnIndex(MediaStore.MediaColumns.DATA); album.thumbnail = photoCursor.getString(colIndexUri); } photoCursor.close(); } catch (Exception e) { e.printStackTrace(); if (LOGGING) Log.e(LOGTAG, "Failed to get album info: " + e.toString()); } } private void getAlbums() { mAlbums.clear(); try { String[] PROJECTION_BUCKET = {MediaStore.Images.ImageColumns.BUCKET_ID, MediaStore.Images.ImageColumns.BUCKET_DISPLAY_NAME, MediaStore.Images.ImageColumns.DATE_TAKEN, MediaStore.Images.ImageColumns.DATA}; String BUCKET_GROUP_BY = "1) GROUP BY 1,(2"; String BUCKET_ORDER_BY = "MAX(datetaken) DESC"; Uri images = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; Cursor cur = mContext.getContentResolver().query(images, PROJECTION_BUCKET, BUCKET_GROUP_BY, null, BUCKET_ORDER_BY); if (cur.moveToFirst()) { String bucket; String bucketId; int bucketColumn = cur.getColumnIndex(MediaStore.Images.Media.BUCKET_DISPLAY_NAME); int bucketIdColumn = cur.getColumnIndex(MediaStore.Images.Media.BUCKET_ID); do { // Get the field values bucket = cur.getString(bucketColumn); bucketId = cur.getString(bucketIdColumn); if (!TextUtils.isEmpty(bucketId)) { AlbumInfo album = new AlbumInfo(); album.id = bucketId; album.albumName = bucket; mAlbums.add(album); } } while (cur.moveToNext()); } cur.close(); } catch (Exception e) { if (LOGGING) Log.e(LOGTAG, "Failed to get albums: " + e.toString()); } } @Override public int getItemViewType(int position) { if (mShowPickExternal) { if (position == 0) return 1; } return 0; } @Override public AlbumViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(mContext).inflate(viewType == 0 ? R.layout.album_item : R.layout.album_external_item, parent, false); return new AlbumViewHolder(view); } @Override public void onBindViewHolder(AlbumViewHolder holder, int position) { if (mShowPickExternal) { if (position == 0) { holder.mRootView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (mListener != null) { mListener.onPickExternalSelected(); } } }); return; } else { position--; //Offset by this item } } holder.mRootView.setOnClickListener(new ItemClickListener(position)); AlbumInfo album = mAlbums.get(position); holder.mAlbumName.setText(album.albumName); holder.mAlbumCount.setText(String.format(Locale.getDefault(), "(%d)", album.count)); try { holder.mAlbumThumbnail.setBackgroundResource(0); try { Picasso.with(mContext) .load(new File(album.thumbnail)) .fit() .centerCrop() .into(holder.mAlbumThumbnail); } catch (Exception ignored) {} } catch (Exception e) { holder.mAlbumThumbnail.setBackgroundResource(R.drawable.camera_frame); holder.mAlbumThumbnail.setImageDrawable(null); } if (album.thumbnail == null && album.count == 0) { // Fetch info AsyncTask<AlbumInfo,Void,AlbumInfo> task = new AsyncTask<AlbumInfo, Void, AlbumInfo>() { @Override protected AlbumInfo doInBackground(AlbumInfo... albumInfos) { getThumbnailAndCountForAlbum(albumInfos[0]); return albumInfos[0]; } @Override protected void onPostExecute(AlbumInfo albumInfo) { super.onPostExecute(albumInfo); AlbumAdapter.this.notifyItemChanged((mShowPickExternal ? 1 : 0) + mAlbums.indexOf(albumInfo)); } }.execute(album); } } @Override public int getItemCount() { return (mShowPickExternal ? 1 : 0) + mAlbums.size(); } private class AlbumInfo { public AlbumInfo() { } public String id; public String albumName; public String thumbnail; public int count; } private class ItemClickListener implements View.OnClickListener { private final int mPosition; public ItemClickListener(int position) { mPosition = position; } @Override public void onClick(View view) { AlbumInfo album = mAlbums.get(mPosition); if (mListener != null) { mListener.onAlbumSelected(album.id, album.albumName); } } } }