From 8c12028e716792bb083dc57dda58b8be26a16ef7 Mon Sep 17 00:00:00 2001 From: Bobby Georgescu Date: Wed, 6 Mar 2013 19:54:37 -0800 Subject: [PATCH] Album set shim Change-Id: I12257ea09b7b5bc4b1d5ef638e685c66df86538a --- res/layout/album_set_item.xml | 2 + src/com/android/photos/AlbumSetFragment.java | 70 +++++++++++++++++++----- src/com/android/photos/data/AlbumSetLoader.java | 22 ++++---- src/com/android/photos/shims/MediaSetLoader.java | 62 +++++++++++++++++++-- 4 files changed, 128 insertions(+), 28 deletions(-) diff --git a/res/layout/album_set_item.xml b/res/layout/album_set_item.xml index 46084e938..bdecd5fd1 100644 --- a/res/layout/album_set_item.xml +++ b/res/layout/album_set_item.xml @@ -12,6 +12,8 @@ android:layout_alignParentTop="true" android:layout_marginLeft="10dp" android:layout_marginTop="10dp" + android:ellipsize="end" + android:singleLine="true" android:textAppearance="?android:attr/textAppearanceMedium" /> { + private GridView mAlbumSetView; private View mEmptyView; - private CursorAdapter mAdapter; + private AlbumSetCursorAdapter mAdapter; + + private static final int LOADER_ALBUMSET = 1; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, @@ -57,11 +63,37 @@ public class AlbumSetFragment extends Fragment implements OnItemClickListener { mAdapter = new AlbumSetCursorAdapter(getActivity()); mAlbumSetView.setAdapter(mAdapter); mAlbumSetView.setOnItemClickListener(this); - mAdapter.swapCursor(AlbumSetLoader.MOCK); + getLoaderManager().initLoader(LOADER_ALBUMSET, null, this); + updateEmptyStatus(); return root; } @Override + public Loader onCreateLoader(int id, Bundle args) { + // TODO: Switch to AlbumSetLoader + MediaSetLoader loader = new MediaSetLoader(getActivity()); + mAdapter.setDrawableFactory(loader); + return loader; + } + + @Override + public void onLoadFinished(Loader loader, + Cursor data) { + mAdapter.swapCursor(data); + updateEmptyStatus(); + } + + private void updateEmptyStatus() { + boolean empty = (mAdapter == null || mAdapter.getCount() == 0); + mAlbumSetView.setVisibility(empty ? View.GONE : View.VISIBLE); + mEmptyView.setVisibility(empty ? View.VISIBLE : View.GONE); + } + + @Override + public void onLoaderReset(Loader loader) { + } + + @Override public void onItemClick(AdapterView av, View v, int pos, long id) { Cursor c = (Cursor) av.getItemAtPosition(pos); int albumId = c.getInt(AlbumSetLoader.INDEX_ID); @@ -71,6 +103,11 @@ public class AlbumSetFragment extends Fragment implements OnItemClickListener { private static class AlbumSetCursorAdapter extends CursorAdapter { + private DrawableFactory mDrawableFactory; + + public void setDrawableFactory(DrawableFactory factory) { + mDrawableFactory = factory; + } private Date mDate = new Date(); // Used for converting timestamps for display public AlbumSetCursorAdapter(Context context) { @@ -85,8 +122,13 @@ public class AlbumSetFragment extends Fragment implements OnItemClickListener { TextView dateTextView = (TextView) v.findViewById( R.id.album_set_item_date); - mDate.setTime(cursor.getLong(AlbumSetLoader.INDEX_TIMESTAMP)); - dateTextView.setText(DateFormat.getMediumDateFormat(context).format(mDate)); + long timestamp = cursor.getLong(AlbumSetLoader.INDEX_TIMESTAMP); + if (timestamp > 0) { + mDate.setTime(timestamp); + dateTextView.setText(DateFormat.getMediumDateFormat(context).format(mDate)); + } else { + dateTextView.setText(null); + } ProgressBar uploadProgressBar = (ProgressBar) v.findViewById( R.id.album_set_item_upload_progress); @@ -97,17 +139,19 @@ public class AlbumSetFragment extends Fragment implements OnItemClickListener { uploadProgressBar.setVisibility(View.INVISIBLE); } - // TODO show the thumbnail + ImageView thumbImageView = (ImageView) v.findViewById( + R.id.album_set_item_image); + Drawable recycle = thumbImageView.getDrawable(); + Drawable drawable = mDrawableFactory.drawableForItem(cursor, recycle); + if (recycle != drawable) { + thumbImageView.setImageDrawable(drawable); + } } @Override public View newView(Context context, Cursor cursor, ViewGroup parent) { - View v = LayoutInflater.from(context).inflate( + return LayoutInflater.from(context).inflate( R.layout.album_set_item, parent, false); - ImageView thumbImageView = (ImageView) v.findViewById( - R.id.album_set_item_image); - thumbImageView.setImageResource(android.R.color.darker_gray); - return v; } } } diff --git a/src/com/android/photos/data/AlbumSetLoader.java b/src/com/android/photos/data/AlbumSetLoader.java index f5fc3b732..b2b5204e6 100644 --- a/src/com/android/photos/data/AlbumSetLoader.java +++ b/src/com/android/photos/data/AlbumSetLoader.java @@ -13,20 +13,20 @@ public class AlbumSetLoader { public static final int INDEX_COUNT_PENDING_UPLOAD = 6; public static final int INDEX_COUNT = 7; + public static final String[] PROJECTION = { + "_id", + "title", + "timestamp", + "thumb_uri", + "thumb_width", + "thumb_height", + "count_pending_upload", + "_count" + }; public static final MatrixCursor MOCK = createRandomCursor(30); private static MatrixCursor createRandomCursor(int count) { - String[] rows = { - "_id", - "title", - "timestamp", - "thumb_uri", - "thumb_width", - "thumb_height", - "count_pending_upload", - "_count" - }; - MatrixCursor c = new MatrixCursor(rows, count); + MatrixCursor c = new MatrixCursor(PROJECTION, count); for (int i = 0; i < count; i++) { c.addRow(createRandomRow()); } diff --git a/src/com/android/photos/shims/MediaSetLoader.java b/src/com/android/photos/shims/MediaSetLoader.java index 353fd4e1a..7a6fcb865 100644 --- a/src/com/android/photos/shims/MediaSetLoader.java +++ b/src/com/android/photos/shims/MediaSetLoader.java @@ -18,17 +18,32 @@ package com.android.photos.shims; import android.content.AsyncTaskLoader; import android.content.Context; +import android.database.Cursor; +import android.database.MatrixCursor; +import android.graphics.drawable.Drawable; +import android.provider.MediaStore.Files.FileColumns; import com.android.gallery3d.data.ContentListener; import com.android.gallery3d.data.DataManager; +import com.android.gallery3d.data.MediaDetails; +import com.android.gallery3d.data.MediaItem; import com.android.gallery3d.data.MediaSet; +import com.android.gallery3d.data.MediaSet.ItemConsumer; import com.android.gallery3d.data.MediaSet.SyncListener; import com.android.gallery3d.util.Future; +import com.android.photos.data.AlbumSetLoader; +import com.android.photos.data.PhotoSetLoader; +import com.android.photos.drawables.DrawableFactory; + +import java.text.DateFormat; +import java.text.ParseException; +import java.util.ArrayList; /** - * Proof of concept, don't use + * Returns all MediaSets in a MediaSet, wrapping them in a cursor to appear + * like a AlbumSetLoader. */ -public class MediaSetLoader extends AsyncTaskLoader { +public class MediaSetLoader extends AsyncTaskLoader implements DrawableFactory{ private static final SyncListener sNullListener = new SyncListener() { @Override @@ -45,6 +60,15 @@ public class MediaSetLoader extends AsyncTaskLoader { } }; + private ArrayList mCoverItems = new ArrayList(); + + public MediaSetLoader(Context context) { + super(context); + DataManager dm = DataManager.from(context); + String path = dm.getTopSetPath(DataManager.INCLUDE_ALL); + mMediaSet = dm.getMediaSet(path); + } + public MediaSetLoader(Context context, String path) { super(context); mMediaSet = DataManager.from(getContext()).getMediaSet(path); @@ -81,9 +105,39 @@ public class MediaSetLoader extends AsyncTaskLoader { } @Override - public MediaSet loadInBackground() { + public Cursor loadInBackground() { mMediaSet.loadIfDirty(); - return mMediaSet; + final MatrixCursor cursor = new MatrixCursor(AlbumSetLoader.PROJECTION); + final Object[] row = new Object[AlbumSetLoader.PROJECTION.length]; + int count = mMediaSet.getSubMediaSetCount(); + for (int i = 0; i < count; i++) { + MediaSet m = mMediaSet.getSubMediaSet(i); + m.loadIfDirty(); + row[AlbumSetLoader.INDEX_ID] = i; + row[AlbumSetLoader.INDEX_TITLE] = m.getName(); + row[AlbumSetLoader.INDEX_COUNT] = m.getMediaItemCount(); + MediaItem coverItem = m.getCoverMediaItem(); + row[AlbumSetLoader.INDEX_TIMESTAMP] = coverItem.getDateInMs(); + mCoverItems.add(coverItem); + cursor.addRow(row); + } + return cursor; } + @Override + public Drawable drawableForItem(Cursor item, Drawable recycle) { + BitmapJobDrawable drawable = null; + if (recycle == null || !(recycle instanceof BitmapJobDrawable)) { + drawable = new BitmapJobDrawable(); + } else { + drawable = (BitmapJobDrawable) recycle; + } + int index = item.getInt(AlbumSetLoader.INDEX_ID); + drawable.setMediaItem(mCoverItems.get(index)); + return drawable; + } + + public static int getThumbnailSize() { + return MediaItem.getTargetSize(MediaItem.TYPE_MICROTHUMBNAIL); + } } -- 2.11.0