summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChih-Chung Chang <chihchung@google.com>2011-09-19 11:09:39 +0800
committerChih-Chung Chang <chihchung@google.com>2011-09-20 12:18:21 +0800
commit70a73a7f7fad0a8d09fdb744bd3ca2051b39a93d (patch)
tree0f0f6c9071b340ed9efc97472bc9fc9ef090b61b
parentaf84ef2bc0b41c029ab1f8f589b4cf25c90331c1 (diff)
downloadandroid_packages_apps_Snap-70a73a7f7fad0a8d09fdb744bd3ca2051b39a93d.tar.gz
android_packages_apps_Snap-70a73a7f7fad0a8d09fdb744bd3ca2051b39a93d.tar.bz2
android_packages_apps_Snap-70a73a7f7fad0a8d09fdb744bd3ca2051b39a93d.zip
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
-rw-r--r--src/com/android/gallery3d/app/AlbumPage.java26
-rw-r--r--src/com/android/gallery3d/app/AlbumSetPage.java26
-rw-r--r--src/com/android/gallery3d/app/Config.java12
-rw-r--r--src/com/android/gallery3d/app/ManageCachePage.java28
-rw-r--r--src/com/android/gallery3d/data/LocalImage.java12
-rw-r--r--src/com/android/gallery3d/data/LocalVideo.java12
-rw-r--r--src/com/android/gallery3d/data/MediaItem.java5
-rw-r--r--src/com/android/gallery3d/data/MtpImage.java9
-rw-r--r--src/com/android/gallery3d/data/UriImage.java10
-rw-r--r--src/com/android/gallery3d/ui/AlbumSetSlidingWindow.java33
-rw-r--r--src/com/android/gallery3d/ui/AlbumSetView.java6
-rw-r--r--src/com/android/gallery3d/ui/AlbumSlidingWindow.java5
-rw-r--r--src/com/android/gallery3d/ui/FilmStripView.java59
-rw-r--r--src/com/android/gallery3d/ui/GridDrawer.java23
-rw-r--r--src/com/android/gallery3d/ui/HighlightDrawer.java27
-rw-r--r--src/com/android/gallery3d/ui/IconDrawer.java49
-rw-r--r--src/com/android/gallery3d/ui/ManageCacheDrawer.java90
-rw-r--r--src/com/android/gallery3d/ui/SelectionDrawer.java8
-rw-r--r--src/com/android/gallery3d/ui/SelectionManager.java9
-rw-r--r--src/com/android/gallery3d/ui/SlotView.java36
-rw-r--r--src/com/android/gallery3d/ui/StripDrawer.java23
-rw-r--r--src/com/android/gallery3d/util/GalleryUtils.java7
-rw-r--r--tests/src/com/android/gallery3d/data/MockItem.java10
23 files changed, 397 insertions, 128 deletions
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) {
@@ -363,9 +375,20 @@ public class AlbumPage extends ActivityState implements GalleryActionBar.Cluster
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) {
@@ -317,9 +329,20 @@ public class AlbumSetPage extends ActivityState implements
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
@@ -286,6 +298,16 @@ public class ManageCachePage extends ActivityState implements
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<Path> 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);
+ }
}
diff --git a/tests/src/com/android/gallery3d/data/MockItem.java b/tests/src/com/android/gallery3d/data/MockItem.java
index bd6dcd9cb..2901979de 100644
--- a/tests/src/com/android/gallery3d/data/MockItem.java
+++ b/tests/src/com/android/gallery3d/data/MockItem.java
@@ -40,4 +40,14 @@ public class MockItem extends MediaItem {
public String getMimeType() {
return null;
}
+
+ @Override
+ public int getWidth() {
+ return 0;
+ }
+
+ @Override
+ public int getHeight() {
+ return 0;
+ }
}