From 70a73a7f7fad0a8d09fdb744bd3ca2051b39a93d Mon Sep 17 00:00:00 2001 From: Chih-Chung Chang Date: Mon, 19 Sep 2011 11:09:39 +0800 Subject: Fix 5299746: New UI layout, part 2. - Replace various icons and add xhdpi/sw600dp-mdpi versions of them. - When user press on the thumbnails, show a color overlay on it. - For a wide (w/h > 2) picture, add panorama overlay on it. - Align photo count label position when there is no icon for it. - Adjust offline page layout. Change-Id: I327d25806e99843bfa05d3ca0e9be5a8f9375595 --- src/com/android/gallery3d/app/AlbumPage.java | 26 ++++++- src/com/android/gallery3d/app/AlbumSetPage.java | 26 ++++++- src/com/android/gallery3d/app/Config.java | 12 +-- src/com/android/gallery3d/app/ManageCachePage.java | 28 ++++++- src/com/android/gallery3d/data/LocalImage.java | 12 +++ src/com/android/gallery3d/data/LocalVideo.java | 12 +++ src/com/android/gallery3d/data/MediaItem.java | 5 ++ src/com/android/gallery3d/data/MtpImage.java | 9 +++ src/com/android/gallery3d/data/UriImage.java | 10 +++ .../gallery3d/ui/AlbumSetSlidingWindow.java | 33 ++++---- src/com/android/gallery3d/ui/AlbumSetView.java | 6 +- .../android/gallery3d/ui/AlbumSlidingWindow.java | 5 +- src/com/android/gallery3d/ui/FilmStripView.java | 59 ++++++++++---- src/com/android/gallery3d/ui/GridDrawer.java | 23 +++--- src/com/android/gallery3d/ui/HighlightDrawer.java | 27 ++++--- src/com/android/gallery3d/ui/IconDrawer.java | 49 +++++++++--- .../android/gallery3d/ui/ManageCacheDrawer.java | 90 +++++++++++----------- src/com/android/gallery3d/ui/SelectionDrawer.java | 8 +- src/com/android/gallery3d/ui/SelectionManager.java | 9 +++ src/com/android/gallery3d/ui/SlotView.java | 36 ++++++++- src/com/android/gallery3d/ui/StripDrawer.java | 23 +++++- src/com/android/gallery3d/util/GalleryUtils.java | 7 ++ 22 files changed, 387 insertions(+), 128 deletions(-) (limited to 'src/com') diff --git a/src/com/android/gallery3d/app/AlbumPage.java b/src/com/android/gallery3d/app/AlbumPage.java index 1feb96ed8..55feb3888 100644 --- a/src/com/android/gallery3d/app/AlbumPage.java +++ b/src/com/android/gallery3d/app/AlbumPage.java @@ -148,6 +148,18 @@ public class AlbumPage extends ActivityState implements GalleryActionBar.Cluster } } + private void onDown(int index) { + MediaItem item = mAlbumDataAdapter.get(index); + Path path = (item == null) ? null : item.getPath(); + mSelectionManager.setPressedPath(path); + mAlbumView.invalidate(); + } + + private void onUp() { + mSelectionManager.setPressedPath(null); + mAlbumView.invalidate(); + } + public void onSingleTapUp(int slotIndex) { MediaItem item = mAlbumDataAdapter.get(slotIndex); if (item == null) { @@ -362,10 +374,21 @@ public class AlbumPage extends ActivityState implements GalleryActionBar.Cluster mAlbumView.setSelectionDrawer(mGridDrawer); mRootPane.addComponent(mAlbumView); mAlbumView.setListener(new SlotView.SimpleListener() { + @Override + public void onDown(int index) { + AlbumPage.this.onDown(index); + } + + @Override + public void onUp() { + AlbumPage.this.onUp(); + } + @Override public void onSingleTapUp(int slotIndex) { AlbumPage.this.onSingleTapUp(slotIndex); } + @Override public void onLongTap(int slotIndex) { AlbumPage.this.onLongTap(slotIndex); @@ -395,7 +418,8 @@ public class AlbumPage extends ActivityState implements GalleryActionBar.Cluster private void showDetails() { mShowDetails = true; if (mDetailsHelper == null) { - mHighlightDrawer = new HighlightDrawer(mActivity.getAndroidContext()); + mHighlightDrawer = new HighlightDrawer(mActivity.getAndroidContext(), + mSelectionManager); mDetailsHelper = new DetailsHelper(mActivity, mRootPane, mDetailsSource); mDetailsHelper.setCloseListener(new CloseListener() { public void onClose() { diff --git a/src/com/android/gallery3d/app/AlbumSetPage.java b/src/com/android/gallery3d/app/AlbumSetPage.java index eac1abce2..0726ba1f8 100644 --- a/src/com/android/gallery3d/app/AlbumSetPage.java +++ b/src/com/android/gallery3d/app/AlbumSetPage.java @@ -210,6 +210,18 @@ public class AlbumSetPage extends ActivityState implements } } + private void onDown(int index) { + MediaSet set = mAlbumSetDataAdapter.getMediaSet(index); + Path path = (set == null) ? null : set.getPath(); + mSelectionManager.setPressedPath(path); + mAlbumSetView.invalidate(); + } + + private void onUp() { + mSelectionManager.setPressedPath(null); + mAlbumSetView.invalidate(); + } + public void onLongTap(int slotIndex) { if (mGetContent || mGetAlbum) return; if (mShowDetails) { @@ -316,10 +328,21 @@ public class AlbumSetPage extends ActivityState implements mAlbumSetView = new AlbumSetView(mActivity, mGridDrawer, config.slotViewSpec, config.labelSpec); mAlbumSetView.setListener(new SlotView.SimpleListener() { + @Override + public void onDown(int index) { + AlbumSetPage.this.onDown(index); + } + + @Override + public void onUp() { + AlbumSetPage.this.onUp(); + } + @Override public void onSingleTapUp(int slotIndex) { AlbumSetPage.this.onSingleTapUp(slotIndex); } + @Override public void onLongTap(int slotIndex) { AlbumSetPage.this.onLongTap(slotIndex); @@ -518,7 +541,8 @@ public class AlbumSetPage extends ActivityState implements private void showDetails() { mShowDetails = true; if (mDetailsHelper == null) { - mHighlightDrawer = new HighlightDrawer(mActivity.getAndroidContext()); + mHighlightDrawer = new HighlightDrawer(mActivity.getAndroidContext(), + mSelectionManager); mDetailsHelper = new DetailsHelper(mActivity, mRootPane, mDetailsSource); mDetailsHelper.setCloseListener(new CloseListener() { public void onClose() { diff --git a/src/com/android/gallery3d/app/Config.java b/src/com/android/gallery3d/app/Config.java index 0cea6c852..be1417ab9 100644 --- a/src/com/android/gallery3d/app/Config.java +++ b/src/com/android/gallery3d/app/Config.java @@ -46,16 +46,16 @@ final class Config { slotViewSpec.slotGap = r.getDimensionPixelSize(R.dimen.albumset_slot_gap); labelSpec = new AlbumSetView.LabelSpec(); - labelSpec.darkStripHeight = r.getDimensionPixelSize( - R.dimen.albumset_dark_strip_height); + labelSpec.labelBackgroundHeight = r.getDimensionPixelSize( + R.dimen.albumset_label_background_height); labelSpec.titleOffset = r.getDimensionPixelSize( R.dimen.albumset_title_offset); - labelSpec.numberOffset = r.getDimensionPixelSize( - R.dimen.albumset_number_offset); + labelSpec.countOffset = r.getDimensionPixelSize( + R.dimen.albumset_count_offset); labelSpec.titleFontSize = r.getDimensionPixelSize( R.dimen.albumset_title_font_size); - labelSpec.numberFontSize = r.getDimensionPixelSize( - R.dimen.albumset_number_font_size); + labelSpec.countFontSize = r.getDimensionPixelSize( + R.dimen.albumset_count_font_size); labelSpec.leftMargin = r.getDimensionPixelSize( R.dimen.albumset_left_margin); labelSpec.iconSize = r.getDimensionPixelSize( diff --git a/src/com/android/gallery3d/app/ManageCachePage.java b/src/com/android/gallery3d/app/ManageCachePage.java index 7e301f28c..01efaea5e 100644 --- a/src/com/android/gallery3d/app/ManageCachePage.java +++ b/src/com/android/gallery3d/app/ManageCachePage.java @@ -113,10 +113,10 @@ public class ManageCachePage extends ActivityState implements int slotViewTop = GalleryActionBar.getHeight(activity); int slotViewBottom = bottom - top; - View cacheBar = activity.findViewById(R.id.cache_bar); - if (cacheBar != null) { + View footer = activity.findViewById(R.id.footer); + if (footer != null) { int location[] = {0, 0}; - cacheBar.getLocationOnScreen(location); + footer.getLocationOnScreen(location); slotViewBottom = location[1]; } @@ -143,6 +143,18 @@ public class ManageCachePage extends ActivityState implements mRootPane.invalidate(); } + private void onDown(int index) { + MediaSet set = mAlbumSetDataAdapter.getMediaSet(index); + Path path = (set == null) ? null : set.getPath(); + mSelectionManager.setPressedPath(path); + mAlbumSetView.invalidate(); + } + + private void onUp() { + mSelectionManager.setPressedPath(null); + mAlbumSetView.invalidate(); + } + public void onSingleTapUp(int slotIndex) { MediaSet targetSet = mAlbumSetDataAdapter.getMediaSet(slotIndex); if (targetSet == null) return; // Content is dirty, we shall reload soon @@ -285,6 +297,16 @@ public class ManageCachePage extends ActivityState implements mAlbumSetView = new AlbumSetView(mActivity, mSelectionDrawer, config.slotViewSpec, config.labelSpec); mAlbumSetView.setListener(new SlotView.SimpleListener() { + @Override + public void onDown(int index) { + ManageCachePage.this.onDown(index); + } + + @Override + public void onUp() { + ManageCachePage.this.onUp(); + } + @Override public void onSingleTapUp(int slotIndex) { ManageCachePage.this.onSingleTapUp(slotIndex); diff --git a/src/com/android/gallery3d/data/LocalImage.java b/src/com/android/gallery3d/data/LocalImage.java index 7ab04c568..ca87b9421 100644 --- a/src/com/android/gallery3d/data/LocalImage.java +++ b/src/com/android/gallery3d/data/LocalImage.java @@ -306,4 +306,16 @@ public class LocalImage extends LocalMediaItem { public int getRotation() { return rotation; } + + @Override + public int getWidth() { + // TODO + return 0; + } + + @Override + public int getHeight() { + // TODO + return 0; + } } diff --git a/src/com/android/gallery3d/data/LocalVideo.java b/src/com/android/gallery3d/data/LocalVideo.java index d1498e856..785bed150 100644 --- a/src/com/android/gallery3d/data/LocalVideo.java +++ b/src/com/android/gallery3d/data/LocalVideo.java @@ -210,4 +210,16 @@ public class LocalVideo extends LocalMediaItem { } return details; } + + @Override + public int getWidth() { + // TODO + return 0; + } + + @Override + public int getHeight() { + // TODO + return 0; + } } diff --git a/src/com/android/gallery3d/data/MediaItem.java b/src/com/android/gallery3d/data/MediaItem.java index 090625192..a0c6d8c9e 100644 --- a/src/com/android/gallery3d/data/MediaItem.java +++ b/src/com/android/gallery3d/data/MediaItem.java @@ -78,4 +78,9 @@ public abstract class MediaItem extends MediaObject { } public abstract String getMimeType(); + + // Returns width and height of the media item. + // Returns 0, 0 if the information is not available. + public abstract int getWidth(); + public abstract int getHeight(); } diff --git a/src/com/android/gallery3d/data/MtpImage.java b/src/com/android/gallery3d/data/MtpImage.java index 218f70483..211b2f2ee 100644 --- a/src/com/android/gallery3d/data/MtpImage.java +++ b/src/com/android/gallery3d/data/MtpImage.java @@ -157,4 +157,13 @@ public class MtpImage extends MediaItem { return details; } + @Override + public int getWidth() { + return mImageWidth; + } + + @Override + public int getHeight() { + return mImageHeight; + } } diff --git a/src/com/android/gallery3d/data/UriImage.java b/src/com/android/gallery3d/data/UriImage.java index 3a7ed7c3f..e97b03544 100644 --- a/src/com/android/gallery3d/data/UriImage.java +++ b/src/com/android/gallery3d/data/UriImage.java @@ -263,4 +263,14 @@ public class UriImage extends MediaItem { super.finalize(); } } + + @Override + public int getWidth() { + return 0; + } + + @Override + public int getHeight() { + return 0; + } } diff --git a/src/com/android/gallery3d/ui/AlbumSetSlidingWindow.java b/src/com/android/gallery3d/ui/AlbumSetSlidingWindow.java index 9ad0937d1..4253685e8 100644 --- a/src/com/android/gallery3d/ui/AlbumSetSlidingWindow.java +++ b/src/com/android/gallery3d/ui/AlbumSetSlidingWindow.java @@ -25,6 +25,7 @@ import com.android.gallery3d.data.Path; import com.android.gallery3d.ui.AlbumSetView.AlbumSetItem; import com.android.gallery3d.util.Future; import com.android.gallery3d.util.FutureListener; +import com.android.gallery3d.util.GalleryUtils; import com.android.gallery3d.util.MediaSetUtils; import com.android.gallery3d.util.ThreadPool; @@ -337,6 +338,7 @@ public class AlbumSetSlidingWindow implements AlbumSetView.ModelListener { private final int mMediaType; private Texture mContent; private final long mDataVersion; + private boolean mIsPanorama; public GalleryDisplayItem(int slotIndex, int coverIndex, MediaItem item) { super(item); @@ -344,6 +346,7 @@ public class AlbumSetSlidingWindow implements AlbumSetView.ModelListener { mCoverIndex = coverIndex; mMediaType = item.getMediaType(); mDataVersion = item.getDataVersion(); + mIsPanorama = GalleryUtils.isPanorama(item); updateContent(mWaitLoadingTexture); } @@ -392,7 +395,7 @@ public class AlbumSetSlidingWindow implements AlbumSetView.ModelListener { mSelectionDrawer.draw(canvas, mContent, width, height, getRotation(), path, mCoverIndex, sourceType, mMediaType, - mLabelSpec.darkStripHeight, + mIsPanorama, mLabelSpec.labelBackgroundHeight, cacheFlag == MediaSet.CACHE_FLAG_FULL, (cacheFlag == MediaSet.CACHE_FLAG_FULL) && (cacheStatus != MediaSet.CACHE_STATUS_CACHED_FULL)); @@ -471,14 +474,15 @@ public class AlbumSetSlidingWindow implements AlbumSetView.ModelListener { private class LabelDisplayItem extends DisplayItem { private static final int FONT_COLOR_TITLE = Color.WHITE; - private static final int FONT_COLOR_NUMBER = 0x80FFFFFF; // 50% white + private static final int FONT_COLOR_COUNT = 0x80FFFFFF; // 50% white private StringTexture mTextureTitle; - private StringTexture mTextureNumber; + private StringTexture mTextureCount; private String mTitle; - private String mNumber; + private String mCount; private int mLastWidth; private final int mSlotIndex; + private boolean mHasIcon; public LabelDisplayItem(int slotIndex) { mSlotIndex = slotIndex; @@ -486,27 +490,29 @@ public class AlbumSetSlidingWindow implements AlbumSetView.ModelListener { public boolean updateContent() { String title = mLoadingLabel; - String number = ""; + String count = ""; MediaSet set = mSource.getMediaSet(mSlotIndex); if (set != null) { title = Utils.ensureNotNull(set.getName()); - number = "" + set.getTotalMediaItemCount(); + count = "" + set.getTotalMediaItemCount(); } if (Utils.equals(title, mTitle) - && Utils.equals(number, mNumber) + && Utils.equals(count, mCount) && Utils.equals(mBoxWidth, mLastWidth)) { return false; } mTitle = title; - mNumber = number; + mCount = count; mLastWidth = mBoxWidth; + mHasIcon = (identifySourceType(set) != + SelectionDrawer.DATASOURCE_TYPE_NOT_CATEGORIZED); AlbumSetView.LabelSpec s = mLabelSpec; mTextureTitle = StringTexture.newInstance( title, s.titleFontSize, FONT_COLOR_TITLE, mBoxWidth - s.leftMargin, false); - mTextureNumber = StringTexture.newInstance( - number, s.numberFontSize, FONT_COLOR_NUMBER, + mTextureCount = StringTexture.newInstance( + count, s.countFontSize, FONT_COLOR_COUNT, mBoxWidth - s.leftMargin, true); return true; @@ -520,11 +526,12 @@ public class AlbumSetSlidingWindow implements AlbumSetView.ModelListener { AlbumSetView.LabelSpec s = mLabelSpec; int x = -mBoxWidth / 2; - int y = (mBoxHeight + 1) / 2 - s.darkStripHeight; + int y = (mBoxHeight + 1) / 2 - s.labelBackgroundHeight; y += s.titleOffset; mTextureTitle.draw(canvas, x + s.leftMargin, y); - y += s.titleFontSize + s.numberOffset; - mTextureNumber.draw(canvas, x + s.iconSize, y); + y += s.titleFontSize + s.countOffset; + x += mHasIcon ? s.iconSize : s.leftMargin; + mTextureCount.draw(canvas, x, y); return false; } diff --git a/src/com/android/gallery3d/ui/AlbumSetView.java b/src/com/android/gallery3d/ui/AlbumSetView.java index c122fe777..89dfe4a5c 100644 --- a/src/com/android/gallery3d/ui/AlbumSetView.java +++ b/src/com/android/gallery3d/ui/AlbumSetView.java @@ -64,11 +64,11 @@ public class AlbumSetView extends SlotView { } public static class LabelSpec { - public int darkStripHeight; + public int labelBackgroundHeight; public int titleOffset; - public int numberOffset; + public int countOffset; public int titleFontSize; - public int numberFontSize; + public int countFontSize; public int leftMargin; public int iconSize; } diff --git a/src/com/android/gallery3d/ui/AlbumSlidingWindow.java b/src/com/android/gallery3d/ui/AlbumSlidingWindow.java index 46d9e9ef7..5184d1cce 100644 --- a/src/com/android/gallery3d/ui/AlbumSlidingWindow.java +++ b/src/com/android/gallery3d/ui/AlbumSlidingWindow.java @@ -24,6 +24,7 @@ import com.android.gallery3d.data.MediaItem; import com.android.gallery3d.data.Path; import com.android.gallery3d.util.Future; import com.android.gallery3d.util.FutureListener; +import com.android.gallery3d.util.GalleryUtils; import com.android.gallery3d.util.JobLimiter; import com.android.gallery3d.util.ThreadPool.Job; import com.android.gallery3d.util.ThreadPool.JobContext; @@ -283,6 +284,7 @@ public class AlbumSlidingWindow implements AlbumView.ModelListener { private final int mSlotIndex; private final int mMediaType; private Texture mContent; + private boolean mIsPanorama; public AlbumDisplayItem(int slotIndex, MediaItem item) { super(item); @@ -290,6 +292,7 @@ public class AlbumSlidingWindow implements AlbumView.ModelListener { ? MediaItem.MEDIA_TYPE_UNKNOWN : item.getMediaType(); mSlotIndex = slotIndex; + mIsPanorama = GalleryUtils.isPanorama(item); updateContent(mWaitLoadingTexture); } @@ -332,7 +335,7 @@ public class AlbumSlidingWindow implements AlbumView.ModelListener { Path path = null; if (mMediaItem != null) path = mMediaItem.getPath(); mSelectionDrawer.draw(canvas, mContent, width, height, - getRotation(), path, mMediaType); + getRotation(), path, mMediaType, mIsPanorama); return (mFocusIndex == mSlotIndex); } else if (pass == 1) { mSelectionDrawer.drawFocus(canvas, width, height); diff --git a/src/com/android/gallery3d/ui/FilmStripView.java b/src/com/android/gallery3d/ui/FilmStripView.java index 6a80564d9..eaf041ead 100644 --- a/src/com/android/gallery3d/ui/FilmStripView.java +++ b/src/com/android/gallery3d/ui/FilmStripView.java @@ -20,14 +20,16 @@ import com.android.gallery3d.R; import com.android.gallery3d.anim.AlphaAnimation; import com.android.gallery3d.app.AlbumDataAdapter; import com.android.gallery3d.app.GalleryActivity; +import com.android.gallery3d.data.MediaItem; import com.android.gallery3d.data.MediaSet; +import com.android.gallery3d.data.Path; import android.content.Context; import android.view.MotionEvent; import android.view.View.MeasureSpec; -public class FilmStripView extends GLView implements SlotView.Listener, - ScrollBarView.Listener, UserInteractionListener { +public class FilmStripView extends GLView implements ScrollBarView.Listener, + UserInteractionListener { @SuppressWarnings("unused") private static final String TAG = "FilmStripView"; @@ -79,7 +81,28 @@ public class FilmStripView extends GLView implements SlotView.Listener, mAlbumView = new AlbumView(activity, spec, thumbSize); mAlbumView.setOverscrollEffect(SlotView.OVERSCROLL_SYSTEM); mAlbumView.setSelectionDrawer(mStripDrawer); - mAlbumView.setListener(this); + mAlbumView.setListener(new SlotView.SimpleListener() { + @Override + public void onDown(int index) { + FilmStripView.this.onDown(index); + } + @Override + public void onUp() { + FilmStripView.this.onUp(); + } + @Override + public void onSingleTapUp(int slotIndex) { + FilmStripView.this.onSingleTapUp(slotIndex); + } + @Override + public void onLongTap(int slotIndex) { + FilmStripView.this.onLongTap(slotIndex); + } + @Override + public void onScrollPositionChanged(int position, int total) { + FilmStripView.this.onScrollPositionChanged(position, total); + } + }); mAlbumView.setUserInteractionListener(this); mAlbumDataAdapter = new AlbumDataAdapter(activity, mediaSet); addComponent(mAlbumView); @@ -172,20 +195,32 @@ public class FilmStripView extends GLView implements SlotView.Listener, super.render(canvas); } - // Called by AlbumView - @Override - public void onSingleTapUp(int slotIndex) { + private void onDown(int index) { + MediaItem item = mAlbumDataAdapter.get(index); + Path path = (item == null) ? null : item.getPath(); + mStripDrawer.setPressedPath(path); + mAlbumView.invalidate(); + } + + private void onUp() { + mStripDrawer.setPressedPath(null); + mAlbumView.invalidate(); + } + + private void onSingleTapUp(int slotIndex) { if (mListener.onSlotSelected(slotIndex)) { mAlbumView.setFocusIndex(slotIndex); } } - // Called by AlbumView - @Override - public void onLongTap(int slotIndex) { + private void onLongTap(int slotIndex) { onSingleTapUp(slotIndex); } + private void onScrollPositionChanged(int position, int total) { + mScrollBarView.setContentPosition(position, total); + } + // Called by AlbumView @Override public void onUserInteractionBegin() { @@ -204,12 +239,6 @@ public class FilmStripView extends GLView implements SlotView.Listener, mUIListener.onUserInteraction(); } - // Called by AlbumView - @Override - public void onScrollPositionChanged(int position, int total) { - mScrollBarView.setContentPosition(position, total); - } - // Called by ScrollBarView @Override public void onScrollBarPositionChanged(int position) { diff --git a/src/com/android/gallery3d/ui/GridDrawer.java b/src/com/android/gallery3d/ui/GridDrawer.java index cc861844b..394a6c7ae 100644 --- a/src/com/android/gallery3d/ui/GridDrawer.java +++ b/src/com/android/gallery3d/ui/GridDrawer.java @@ -47,10 +47,10 @@ public class GridDrawer extends IconDrawer { } @Override - public void draw(GLCanvas canvas, Texture content, int width, int height, - int rotation, Path path, int topIndex, int dataSourceType, - int mediaType, int darkStripHeight, boolean wantCache, - boolean isCaching) { + public void draw(GLCanvas canvas, Texture content, int width, + int height, int rotation, Path path, int topIndex, + int dataSourceType, int mediaType, boolean isPanorama, + int labelBackgroundHeight, boolean wantCache, boolean isCaching) { int x = -width / 2; int y = -height / 2; @@ -66,19 +66,22 @@ public class GridDrawer extends IconDrawer { y = -height / 2; } - drawVideoOverlay(canvas, mediaType, x, y, width, height, topIndex); - - if (mSelectionMode && mSelectionManager.isItemSelected(path)) { - drawFrame(canvas, mFrameSelected, x, y, width, height); - } + drawMediaTypeOverlay(canvas, mediaType, isPanorama, x, y, width, height, + topIndex); if (topIndex == 0) { - drawDarkStrip(canvas, width, height, darkStripHeight); + drawLabelBackground(canvas, width, height, labelBackgroundHeight); drawIcon(canvas, width, height, dataSourceType); if (dataSourceType == DATASOURCE_TYPE_MTP) { drawImportLabel(canvas, width, height); } } + + if (mSelectionManager.isPressedPath(path)) { + drawPressedFrame(canvas, x, y, width, height); + } else if (mSelectionMode && mSelectionManager.isItemSelected(path)) { + drawFrame(canvas, mFrameSelected, x, y, width, height); + } } // Draws the "click to import" label at the center of the frame diff --git a/src/com/android/gallery3d/ui/HighlightDrawer.java b/src/com/android/gallery3d/ui/HighlightDrawer.java index 52c31f7d4..ee37d263a 100644 --- a/src/com/android/gallery3d/ui/HighlightDrawer.java +++ b/src/com/android/gallery3d/ui/HighlightDrawer.java @@ -25,19 +25,21 @@ public class HighlightDrawer extends IconDrawer { private SelectionManager mSelectionManager; private Path mHighlightItem; - public HighlightDrawer(Context context) { + public HighlightDrawer(Context context, SelectionManager selectionManager) { super(context); mFrameSelected = new NinePatchTexture(context, R.drawable.grid_selected); + mSelectionManager = selectionManager; } public void setHighlightItem(Path item) { mHighlightItem = item; } - public void draw(GLCanvas canvas, Texture content, int width, int height, - int rotation, Path path, int topIndex, int dataSourceType, - int mediaType, int darkStripHeight, boolean wantCache, - boolean isCaching) { + @Override + public void draw(GLCanvas canvas, Texture content, int width, + int height, int rotation, Path path, int topIndex, + int dataSourceType, int mediaType, boolean isPanorama, + int labelBackgroundHeight, boolean wantCache, boolean isCaching) { int x = -width / 2; int y = -height / 2; @@ -52,15 +54,18 @@ public class HighlightDrawer extends IconDrawer { y = -height / 2; } - drawVideoOverlay(canvas, mediaType, x, y, width, height, topIndex); - - if (path == mHighlightItem) { - drawFrame(canvas, mFrameSelected, x, y, width, height); - } + drawMediaTypeOverlay(canvas, mediaType, isPanorama, x, y, width, height, + topIndex); if (topIndex == 0) { - drawDarkStrip(canvas, width, height, darkStripHeight); + drawLabelBackground(canvas, width, height, labelBackgroundHeight); drawIcon(canvas, width, height, dataSourceType); } + + if (mSelectionManager.isPressedPath(path)) { + drawPressedFrame(canvas, x, y, width, height); + } else if (path == mHighlightItem) { + drawFrame(canvas, mFrameSelected, x, y, width, height); + } } } diff --git a/src/com/android/gallery3d/ui/IconDrawer.java b/src/com/android/gallery3d/ui/IconDrawer.java index 86fdf68ca..781046c4a 100644 --- a/src/com/android/gallery3d/ui/IconDrawer.java +++ b/src/com/android/gallery3d/ui/IconDrawer.java @@ -22,12 +22,14 @@ import android.content.Context; public abstract class IconDrawer extends SelectionDrawer { private static final String TAG = "IconDrawer"; - private static final int DARK_STRIP_COLOR = 0x99000000; // 60% black + private static final int LABEL_BACKGROUND_COLOR = 0x99000000; // 60% black private final ResourceTexture mLocalSetIcon; private final ResourceTexture mCameraIcon; private final ResourceTexture mPicasaIcon; private final ResourceTexture mMtpIcon; + private final NinePatchTexture mFramePressed; + private final ResourceTexture mPanoramaBorder; private final Texture mVideoOverlay; private final Texture mVideoPlayIcon; private final int mIconSize; @@ -43,9 +45,11 @@ public abstract class IconDrawer extends SelectionDrawer { mLocalSetIcon = new ResourceTexture(context, R.drawable.frame_overlay_gallery_folder); mCameraIcon = new ResourceTexture(context, R.drawable.frame_overlay_gallery_camera); mPicasaIcon = new ResourceTexture(context, R.drawable.frame_overlay_gallery_picasa); - mMtpIcon = new ResourceTexture(context, R.drawable.ic_album_overlay_ptp_holo); + mMtpIcon = new ResourceTexture(context, R.drawable.frame_overlay_gallery_ptp); mVideoOverlay = new ResourceTexture(context, R.drawable.ic_video_thumb); mVideoPlayIcon = new ResourceTexture(context, R.drawable.ic_gallery_play); + mPanoramaBorder = new ResourceTexture(context, R.drawable.ic_pan_thumb); + mFramePressed = new NinePatchTexture(context, R.drawable.grid_pressed); mIconSize = context.getResources().getDimensionPixelSize( R.dimen.albumset_icon_size); } @@ -95,14 +99,23 @@ public abstract class IconDrawer extends SelectionDrawer { id.width = Math.round(scale * icon.getWidth()); id.height = Math.round(scale * icon.getHeight()); id.x = -width / 2; - id.y = height / 2 - id.height; + id.y = (height + 1) / 2 - id.height; return id; } - protected void drawVideoOverlay(GLCanvas canvas, int mediaType, - int x, int y, int width, int height, int topIndex) { - if (mediaType != MediaObject.MEDIA_TYPE_VIDEO) return; + protected void drawMediaTypeOverlay(GLCanvas canvas, int mediaType, + boolean isPanorama, int x, int y, int width, int height, + int topIndex) { + if (mediaType == MediaObject.MEDIA_TYPE_VIDEO) { + drawVideoOverlay(canvas, x, y, width, height, topIndex); + } + if (isPanorama) { + drawPanoramaBorder(canvas, x, y, width, height); + } + } + protected void drawVideoOverlay(GLCanvas canvas, int x, int y, + int width, int height, int topIndex) { // Scale the video overlay to the height of the thumbnail and put it // on the left side. float scale = (float) height / mVideoOverlay.getHeight(); @@ -116,11 +129,27 @@ public abstract class IconDrawer extends SelectionDrawer { } } - protected void drawDarkStrip(GLCanvas canvas, int width, int height, - int darkStripHeight) { + protected void drawPanoramaBorder(GLCanvas canvas, int x, int y, + int width, int height) { + float scale = (float) width / mPanoramaBorder.getWidth(); + int w = Math.round(scale * mPanoramaBorder.getWidth()); + int h = Math.round(scale * mPanoramaBorder.getHeight()); + // draw at the top + mPanoramaBorder.draw(canvas, x, y, w, h); + // draw at the bottom + mPanoramaBorder.draw(canvas, x, y + width - h, w, h); + } + + protected void drawLabelBackground(GLCanvas canvas, int width, int height, + int drawLabelBackground) { int x = -width / 2; - int y = (height + 1) / 2 - darkStripHeight; - canvas.fillRect(x, y, width, darkStripHeight, DARK_STRIP_COLOR); + int y = (height + 1) / 2 - drawLabelBackground; + canvas.fillRect(x, y, width, drawLabelBackground, LABEL_BACKGROUND_COLOR); + } + + protected void drawPressedFrame(GLCanvas canvas, int x, int y, int width, + int height) { + drawFrame(canvas, mFramePressed, x, y, width, height); } @Override diff --git a/src/com/android/gallery3d/ui/ManageCacheDrawer.java b/src/com/android/gallery3d/ui/ManageCacheDrawer.java index e25e7793e..ed84a1826 100644 --- a/src/com/android/gallery3d/ui/ManageCacheDrawer.java +++ b/src/com/android/gallery3d/ui/ManageCacheDrawer.java @@ -23,14 +23,13 @@ import com.android.gallery3d.data.Path; import android.content.Context; public class ManageCacheDrawer extends IconDrawer { - private static final int COLOR_CACHING_BACKGROUND = 0x7F000000; private static final int ICON_SIZE = 36; private final ResourceTexture mCheckedItem; private final ResourceTexture mUnCheckedItem; private final SelectionManager mSelectionManager; private final ResourceTexture mLocalAlbumIcon; - private final StringTexture mCaching; + private final StringTexture mCachingText; public ManageCacheDrawer(Context context, SelectionManager selectionManager) { super(context); @@ -38,7 +37,7 @@ public class ManageCacheDrawer extends IconDrawer { mUnCheckedItem = new ResourceTexture(context, R.drawable.btn_make_offline_normal_off_holo_dark); mLocalAlbumIcon = new ResourceTexture(context, R.drawable.btn_make_offline_disabled_on_holo_dark); String cachingLabel = context.getString(R.string.caching_label); - mCaching = StringTexture.newInstance(cachingLabel, 12, 0xffffffff); + mCachingText = StringTexture.newInstance(cachingLabel, 12, 0xffffffff); mSelectionManager = selectionManager; } @@ -51,13 +50,11 @@ public class ManageCacheDrawer extends IconDrawer { } @Override - public void draw(GLCanvas canvas, Texture content, int width, int height, - int rotation, Path path, int topIndex, int dataSourceType, - int mediaType, int darkStripHeight, boolean wantCache, - boolean isCaching) { + public void draw(GLCanvas canvas, Texture content, int width, + int height, int rotation, Path path, int topIndex, + int dataSourceType, int mediaType, boolean isPanorama, + int labelBackgroundHeight, boolean wantCache, boolean isCaching) { - boolean selected = mSelectionManager.isItemSelected(path); - boolean chooseToCache = wantCache ^ selected; int x = -width / 2; int y = -height / 2; @@ -73,48 +70,53 @@ public class ManageCacheDrawer extends IconDrawer { y = -height / 2; } - drawVideoOverlay(canvas, mediaType, x, y, width, height, topIndex); + drawMediaTypeOverlay(canvas, mediaType, isPanorama, x, y, width, height, + topIndex); if (topIndex == 0) { - drawDarkStrip(canvas, width, height, darkStripHeight); + drawLabelBackground(canvas, width, height, labelBackgroundHeight); drawIcon(canvas, width, height, dataSourceType); } if (topIndex == 0) { - ResourceTexture icon = null; - if (isLocal(dataSourceType)) { - icon = mLocalAlbumIcon; - } else if (chooseToCache) { - icon = mCheckedItem; - } else { - icon = mUnCheckedItem; - } - - int w = ICON_SIZE; - int h = ICON_SIZE; - x = width / 2 - w; - y = -height / 2; + drawCachingIcon(canvas, path, dataSourceType, isCaching, wantCache, + width, height); + } + + if (mSelectionManager.isPressedPath(path)) { + drawPressedFrame(canvas, x, y, width, height); + } + } + + private void drawCachingIcon(GLCanvas canvas, Path path, int dataSourceType, + boolean isCaching, boolean wantCache, int width, int height) { + boolean selected = mSelectionManager.isItemSelected(path); + boolean chooseToCache = wantCache ^ selected; + + ResourceTexture icon = null; + if (isLocal(dataSourceType)) { + icon = mLocalAlbumIcon; + } else if (chooseToCache) { + icon = mCheckedItem; + } else { + icon = mUnCheckedItem; + } - icon.draw(canvas, x, y, w, h); - - if (isCaching) { - int textWidth = mCaching.getWidth(); - int textHeight = mCaching.getHeight(); - x = -textWidth / 2; - y = height / 2 - textHeight; - - // Leave a few pixels of margin in the background rect. - float sideMargin = Utils.clamp(textWidth * 0.1f, 2.0f, - 6.0f); - float clearance = Utils.clamp(textHeight * 0.1f, 2.0f, - 6.0f); - - // Overlay the "Caching" wording at the bottom-center of the content. - canvas.fillRect(x - sideMargin, y - clearance, - textWidth + sideMargin * 2, textHeight + clearance, - COLOR_CACHING_BACKGROUND); - mCaching.draw(canvas, x, y); - } + int w = ICON_SIZE; + int h = ICON_SIZE; + int right = (width + 1) / 2; + int bottom = (height + 1) / 2; + int x = right - w; + int y = bottom - h; + + icon.draw(canvas, x, y, w, h); + + if (isCaching) { + int textWidth = mCachingText.getWidth(); + int textHeight = mCachingText.getHeight(); + x = right - ICON_SIZE - textWidth; + y = bottom - textHeight; + mCachingText.draw(canvas, x, y); } } diff --git a/src/com/android/gallery3d/ui/SelectionDrawer.java b/src/com/android/gallery3d/ui/SelectionDrawer.java index 05f346cc0..70d8ad57a 100644 --- a/src/com/android/gallery3d/ui/SelectionDrawer.java +++ b/src/com/android/gallery3d/ui/SelectionDrawer.java @@ -34,14 +34,14 @@ public abstract class SelectionDrawer { public abstract void prepareDrawing(); public abstract void draw(GLCanvas canvas, Texture content, int width, int height, int rotation, Path path, - int topIndex, int dataSourceType, int mediaType, - int darkStripHeight, boolean wantCache, boolean isCaching); + int topIndex, int dataSourceType, int mediaType, boolean isPanorama, + int labelBackgroundHeight, boolean wantCache, boolean isCaching); public abstract void drawFocus(GLCanvas canvas, int width, int height); public void draw(GLCanvas canvas, Texture content, int width, int height, - int rotation, Path path, int mediaType) { + int rotation, Path path, int mediaType, boolean isPanorama) { draw(canvas, content, width, height, rotation, path, 0, - DATASOURCE_TYPE_NOT_CATEGORIZED, mediaType, + DATASOURCE_TYPE_NOT_CATEGORIZED, mediaType, isPanorama, 0, false, false); } diff --git a/src/com/android/gallery3d/ui/SelectionManager.java b/src/com/android/gallery3d/ui/SelectionManager.java index 9599f5b3f..0ab69d25e 100644 --- a/src/com/android/gallery3d/ui/SelectionManager.java +++ b/src/com/android/gallery3d/ui/SelectionManager.java @@ -47,6 +47,7 @@ public class SelectionManager { private boolean mInSelectionMode; private boolean mAutoLeave = true; private int mTotal; + private Path mPressedPath; public interface SelectionListener { public void onSelectionModeChange(int mode); @@ -141,6 +142,14 @@ public class SelectionManager { } } + public void setPressedPath(Path path) { + mPressedPath = path; + } + + public boolean isPressedPath(Path path) { + return path != null && path == mPressedPath; + } + private static void expandMediaSet(ArrayList items, MediaSet set) { int subCount = set.getSubMediaSetCount(); for (int i = 0; i < subCount; i++) { diff --git a/src/com/android/gallery3d/ui/SlotView.java b/src/com/android/gallery3d/ui/SlotView.java index 11dbfaab7..3eb3f1734 100644 --- a/src/com/android/gallery3d/ui/SlotView.java +++ b/src/com/android/gallery3d/ui/SlotView.java @@ -39,12 +39,16 @@ public class SlotView extends GLView { private static final int INDEX_NONE = -1; public interface Listener { + public void onDown(int index); + public void onUp(); public void onSingleTapUp(int index); public void onLongTap(int index); public void onScrollPositionChanged(int position, int total); } public static class SimpleListener implements Listener { + public void onDown(int index) {} + public void onUp() {} public void onSingleTapUp(int index) {} public void onLongTap(int index) {} public void onScrollPositionChanged(int position, int total) {} @@ -597,12 +601,37 @@ public class SlotView extends GLView { } } - private class MyGestureListener - extends GestureDetector.SimpleOnGestureListener { + private class MyGestureListener implements + GestureDetector.OnGestureListener { + private boolean isDown; + + // We call the listener's onDown() when our onShowPress() is called and + // call the listener's onUp() when we receive any further event. + @Override + public void onShowPress(MotionEvent e) { + if (isDown) return; + int index = mLayout.getSlotIndexByPosition(e.getX(), e.getY()); + if (index != INDEX_NONE) { + isDown = true; + mListener.onDown(index); + } + } + + private void cancelDown() { + if (!isDown) return; + isDown = false; + mListener.onUp(); + } + + @Override + public boolean onDown(MotionEvent e) { + return false; + } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { + cancelDown(); int scrollLimit = mLayout.getScrollLimit(); if (scrollLimit == 0) return false; float velocity = WIDE ? velocityX : velocityY; @@ -615,6 +644,7 @@ public class SlotView extends GLView { @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { + cancelDown(); float distance = WIDE ? distanceX : distanceY; boolean canMove = mScroller.startScroll( Math.round(distance), 0, mLayout.getScrollLimit()); @@ -627,6 +657,7 @@ public class SlotView extends GLView { @Override public boolean onSingleTapUp(MotionEvent e) { + cancelDown(); if (mDownInScrolling) return true; int index = mLayout.getSlotIndexByPosition(e.getX(), e.getY()); if (index != INDEX_NONE) mListener.onSingleTapUp(index); @@ -635,6 +666,7 @@ public class SlotView extends GLView { @Override public void onLongPress(MotionEvent e) { + cancelDown(); if (mDownInScrolling) return; lockRendering(); try { diff --git a/src/com/android/gallery3d/ui/StripDrawer.java b/src/com/android/gallery3d/ui/StripDrawer.java index be98ae0de..5120a0cdf 100644 --- a/src/com/android/gallery3d/ui/StripDrawer.java +++ b/src/com/android/gallery3d/ui/StripDrawer.java @@ -23,28 +23,43 @@ import android.content.Context; import android.graphics.Rect; public class StripDrawer extends SelectionDrawer { + private NinePatchTexture mFramePressed; private NinePatchTexture mFocusBox; private Rect mFocusBoxPadding; + private Path mPressedPath; public StripDrawer(Context context) { + mFramePressed = new NinePatchTexture(context, R.drawable.grid_pressed); mFocusBox = new NinePatchTexture(context, R.drawable.focus_box); mFocusBoxPadding = mFocusBox.getPaddings(); } + public void setPressedPath(Path path) { + mPressedPath = path; + } + + private boolean isPressedPath(Path path) { + return path != null && path == mPressedPath; + } + @Override public void prepareDrawing() { } @Override - public void draw(GLCanvas canvas, Texture content, int width, int height, - int rotation, Path path, int topIndex, int dataSourceType, - int mediaType, int darkStripHeight, boolean wantCache, - boolean isCaching) { + public void draw(GLCanvas canvas, Texture content, + int width, int height, int rotation, Path path, int topIndex, + int dataSourceType, int mediaType, boolean isPanorama, + int labelBackgroundHeight, boolean wantCache, boolean isCaching) { int x = -width / 2; int y = -height / 2; drawWithRotation(canvas, content, x, y, width, height, rotation); + + if (isPressedPath(path)) { + drawFrame(canvas, mFramePressed, x, y, width, height); + } } @Override diff --git a/src/com/android/gallery3d/util/GalleryUtils.java b/src/com/android/gallery3d/util/GalleryUtils.java index 9c08deaa5..680361183 100644 --- a/src/com/android/gallery3d/util/GalleryUtils.java +++ b/src/com/android/gallery3d/util/GalleryUtils.java @@ -352,4 +352,11 @@ public class GalleryUtils { output[0] = number; } } + + public static boolean isPanorama(MediaItem item) { + if (item == null) return false; + int w = item.getWidth(); + int h = item.getHeight(); + return (h > 0 && w / h >= 2); + } } -- cgit v1.2.3