summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkaiyiz <kaiyiz@codeaurora.org>2014-10-15 10:10:13 +0800
committercretin45 <cretin45@gmail.com>2014-12-15 14:47:22 -0800
commit44940177d5ca662c641dcb33ef19dd5b314c9109 (patch)
tree1ab20afe035d3361697c6cce674319655435102e
parentda6c9f85f9945e20cf981d25c3eb4f553ad29667 (diff)
downloadandroid_packages_apps_Gallery2-44940177d5ca662c641dcb33ef19dd5b314c9109.tar.gz
android_packages_apps_Gallery2-44940177d5ca662c641dcb33ef19dd5b314c9109.tar.bz2
android_packages_apps_Gallery2-44940177d5ca662c641dcb33ef19dd5b314c9109.zip
Gallery2: Reginal requirement for RTL
Add RTL logic in load picture, pick picture, show picture, delete picture, load album, pick album, show album, show widget, pick widget, scroll timebar. Change Camera setting to support RTL. Change-Id: Ica264f624e0f20153280066264943882ad22f2db
-rw-r--r--src/com/android/gallery3d/app/AlbumDataLoader.java7
-rw-r--r--src/com/android/gallery3d/app/AlbumPage.java68
-rw-r--r--src/com/android/gallery3d/app/MovieControllerOverlay.java3
-rwxr-xr-xsrc/com/android/gallery3d/app/PhotoDataAdapter.java116
-rwxr-xr-xsrc/com/android/gallery3d/app/PhotoPage.java65
-rwxr-xr-xsrc/com/android/gallery3d/app/TimeBar.java82
-rw-r--r--src/com/android/gallery3d/data/FilterDeleteSet.java5
-rw-r--r--src/com/android/gallery3d/data/MediaSet.java5
-rw-r--r--src/com/android/gallery3d/gadget/WidgetClickHandler.java2
-rw-r--r--src/com/android/gallery3d/ui/AlbumLabelMaker.java79
-rw-r--r--src/com/android/gallery3d/ui/DialogDetailsView.java18
-rw-r--r--src/com/android/gallery3d/ui/SlotView.java53
12 files changed, 443 insertions, 60 deletions
diff --git a/src/com/android/gallery3d/app/AlbumDataLoader.java b/src/com/android/gallery3d/app/AlbumDataLoader.java
index 28a822830..b56304e39 100644
--- a/src/com/android/gallery3d/app/AlbumDataLoader.java
+++ b/src/com/android/gallery3d/app/AlbumDataLoader.java
@@ -19,6 +19,8 @@ package com.android.gallery3d.app;
import android.os.Handler;
import android.os.Message;
import android.os.Process;
+import android.text.TextUtils;
+import android.view.View;
import com.android.gallery3d.common.Utils;
import com.android.gallery3d.data.ContentListener;
@@ -33,6 +35,7 @@ import java.util.Arrays;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
+import java.util.Locale;
public class AlbumDataLoader {
@SuppressWarnings("unused")
@@ -119,7 +122,9 @@ public class AlbumDataLoader {
}
public MediaItem get(int index) {
- if (!isActive(index)) {
+ if (!isActive(index)
+ && View.LAYOUT_DIRECTION_LTR == TextUtils
+ .getLayoutDirectionFromLocale(Locale.getDefault())) {
return mSource.getMediaItem(index, 1).get(0);
}
return mData[index % mData.length];
diff --git a/src/com/android/gallery3d/app/AlbumPage.java b/src/com/android/gallery3d/app/AlbumPage.java
index 44f24043b..0614eef86 100644
--- a/src/com/android/gallery3d/app/AlbumPage.java
+++ b/src/com/android/gallery3d/app/AlbumPage.java
@@ -25,10 +25,12 @@ import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.provider.MediaStore;
+import android.text.TextUtils;
import android.view.HapticFeedbackConstants;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
+import android.view.View;
import android.widget.Toast;
import com.android.gallery3d.R;
@@ -59,6 +61,7 @@ import com.android.gallery3d.util.Future;
import com.android.gallery3d.util.GalleryUtils;
import com.android.gallery3d.util.MediaSetUtils;
+import java.util.Locale;
public class AlbumPage extends ActivityState implements GalleryActionBar.ClusterRunner,
SelectionManager.SelectionListener, MediaSet.SyncListener, GalleryActionBar.OnAlbumModeSelectedListener {
@@ -82,6 +85,9 @@ public class AlbumPage extends ActivityState implements GalleryActionBar.Cluster
private static final float USER_DISTANCE_METER = 0.3f;
+ // Data cache size, equal to AlbumDataLoader.DATA_CACHE_SIZE
+ private static final int DATA_CACHE_SIZE = 256;
+
private boolean mIsActive = false;
private AlbumSlotRenderer mAlbumView;
private Path mMediaSetPath;
@@ -266,6 +272,17 @@ public class AlbumPage extends ActivityState implements GalleryActionBar.Cluster
}
private void pickPhoto(int slotIndex) {
+ if ((View.LAYOUT_DIRECTION_RTL == TextUtils
+ .getLayoutDirectionFromLocale(Locale.getDefault()))
+ && !mGetContent) {
+ // Fetch corresponding slotIndex from another side, (RTL)
+ if (slotIndex > DATA_CACHE_SIZE / 2
+ && slotIndex < mAlbumDataAdapter.size() - DATA_CACHE_SIZE / 2) {
+ slotIndex = mAlbumDataAdapter.size() - slotIndex - 2;
+ } else {
+ slotIndex = mAlbumDataAdapter.size() - slotIndex - 1;
+ }
+ }
pickPhoto(slotIndex, false);
}
@@ -278,10 +295,25 @@ public class AlbumPage extends ActivityState implements GalleryActionBar.Cluster
}
MediaItem item = mAlbumDataAdapter.get(slotIndex);
- if (item == null) return; // Item not ready yet, ignore the click
+
+ // Checking it is RTL or not
+ boolean isLayoutRtl = (View.LAYOUT_DIRECTION_RTL == TextUtils
+ .getLayoutDirectionFromLocale(Locale.getDefault())) ? true : false;
+
+ // When not RTL, return directly to ignore the click
+ if (!isLayoutRtl && item == null) {
+ return;
+ }
+
if (mGetContent) {
+ if (isLayoutRtl && item == null) {
+ return; // Item not ready yet, ignore the click
+ }
onGetContent(item);
} else if (mLaunchedFromPhotoPage) {
+ if (isLayoutRtl && item == null) {
+ return; // Item not ready yet, ignore the click
+ }
TransitionStore transitions = mActivity.getTransitionStore();
transitions.put(
PhotoPage.KEY_ALBUMPAGE_TRANSITION,
@@ -297,8 +329,12 @@ public class AlbumPage extends ActivityState implements GalleryActionBar.Cluster
mSlotView.getSlotRect(slotIndex, mRootPane));
data.putString(PhotoPage.KEY_MEDIA_SET_PATH,
mMediaSetPath.toString());
- data.putString(PhotoPage.KEY_MEDIA_ITEM_PATH,
- item.getPath().toString());
+
+ // Item not ready yet, don't pass the photo path to bundle
+ if (!isLayoutRtl && item != null) {
+ data.putString(PhotoPage.KEY_MEDIA_ITEM_PATH,
+ item.getPath().toString());
+ }
data.putInt(PhotoPage.KEY_ALBUMPAGE_TRANSITION,
PhotoPage.MSG_ALBUMPAGE_STARTED);
data.putBoolean(PhotoPage.KEY_START_IN_FILMSTRIP,
@@ -574,8 +610,17 @@ public class AlbumPage extends ActivityState implements GalleryActionBar.Cluster
}
private void switchToFilmstrip() {
- if (mAlbumDataAdapter.size() < 1) return;
+ // Invalid album, return back directly.
+ if (mAlbumDataAdapter.size() < 1) {
+ return;
+ }
+
int targetPhoto = mSlotView.getVisibleStart();
+ if (View.LAYOUT_DIRECTION_RTL == TextUtils
+ .getLayoutDirectionFromLocale(Locale.getDefault())) {
+ // Fetch corresponding index from another side, only in RTL
+ targetPhoto = mAlbumDataAdapter.size() - targetPhoto - 1;
+ }
prepareAnimationBackToFilmstrip(targetPhoto);
if(mLaunchedFromPhotoPage) {
onBackPressed();
@@ -642,7 +687,22 @@ public class AlbumPage extends ActivityState implements GalleryActionBar.Cluster
case REQUEST_PHOTO: {
if (data == null) return;
mFocusIndex = data.getIntExtra(PhotoPage.KEY_RETURN_INDEX_HINT, 0);
+ if (View.LAYOUT_DIRECTION_RTL == TextUtils
+ .getLayoutDirectionFromLocale(Locale.getDefault())) {
+ // Fetch corresponding index from another side, only in RTL
+ mFocusIndex = mAlbumDataAdapter.size() - mFocusIndex - 1;
+ // Prepare to jump to mFocusIndex position, only enabled in RTL
+ mSlotView.setIsFromPhotoPage(true);
+ }
+
+ // Let picture of mFocusIndex visible
mSlotView.makeSlotVisible(mFocusIndex);
+
+ if (View.LAYOUT_DIRECTION_RTL == TextUtils
+ .getLayoutDirectionFromLocale(Locale.getDefault())) {
+ // Reset variable
+ mSlotView.setIsFromPhotoPage(false);
+ }
break;
}
case REQUEST_DO_ANIMATION: {
diff --git a/src/com/android/gallery3d/app/MovieControllerOverlay.java b/src/com/android/gallery3d/app/MovieControllerOverlay.java
index 8c69a3136..74d94f3c8 100644
--- a/src/com/android/gallery3d/app/MovieControllerOverlay.java
+++ b/src/com/android/gallery3d/app/MovieControllerOverlay.java
@@ -827,6 +827,9 @@ public class MovieControllerOverlay extends CommonControllerOverlay implements
mForward.setOnClickListener(this);
mContollerButtons.addView(mForward, buttonParam);
+ // Do NOT RTL for media controller
+ mContollerButtons.setLayoutDirection(View.LAYOUT_DIRECTION_LTR);
+
addView(mContollerButtons, wrapContent);
}
diff --git a/src/com/android/gallery3d/app/PhotoDataAdapter.java b/src/com/android/gallery3d/app/PhotoDataAdapter.java
index 40967a118..7be48ebeb 100755
--- a/src/com/android/gallery3d/app/PhotoDataAdapter.java
+++ b/src/com/android/gallery3d/app/PhotoDataAdapter.java
@@ -20,15 +20,19 @@ import android.graphics.Bitmap;
import android.graphics.BitmapRegionDecoder;
import android.os.Handler;
import android.os.Message;
+import android.text.TextUtils;
+import android.view.View;
import com.android.gallery3d.common.BitmapUtils;
import com.android.gallery3d.common.Utils;
+import com.android.gallery3d.data.CameraShortcutImage;
import com.android.gallery3d.data.ContentListener;
import com.android.gallery3d.data.LocalMediaItem;
import com.android.gallery3d.data.MediaItem;
import com.android.gallery3d.data.MediaObject;
import com.android.gallery3d.data.MediaSet;
import com.android.gallery3d.data.Path;
+import com.android.gallery3d.data.SnailItem;
import com.android.gallery3d.glrenderer.TiledTexture;
import com.android.gallery3d.ui.PhotoView;
import com.android.gallery3d.ui.ScreenNail;
@@ -49,6 +53,7 @@ import java.util.HashSet;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
+import java.util.Locale;
public class PhotoDataAdapter implements PhotoPage.Model {
@SuppressWarnings("unused")
@@ -155,6 +160,9 @@ public class PhotoDataAdapter implements PhotoPage.Model {
private int mFocusHintDirection = FOCUS_HINT_NEXT;
private Path mFocusHintPath = null;
+ // If Bundle is from widget, it's true, otherwise it's false.
+ private boolean mIsFromWidget = false;
+
public interface DataListener extends LoadingListener {
public void onPhotoChanged(int index, Path item);
}
@@ -292,6 +300,13 @@ public class PhotoDataAdapter implements PhotoPage.Model {
mDataListener = listener;
}
+ /**
+ * Set this to true if it is from widget.
+ */
+ public void setFromWidget(boolean isFromWidget) {
+ mIsFromWidget = isFromWidget;
+ }
+
private void updateScreenNail(Path path, Future<ScreenNail> future) {
ImageEntry entry = mImageCache.get(path);
ScreenNail screenNail = future.get();
@@ -660,6 +675,31 @@ public class PhotoDataAdapter implements PhotoPage.Model {
}
}
+ /**
+ * Update the image window and data window for RTL.
+ */
+ private void updateSlidingWindowForRTL() {
+ // 1. Update the image window
+ int nStart = Utils.clamp(mCurrentIndex - IMAGE_CACHE_SIZE / 2,
+ 0, Math.max(0, mSize - IMAGE_CACHE_SIZE));
+ int nEnd = Math.min(mSize, nStart + IMAGE_CACHE_SIZE);
+
+ if (mActiveStart == nStart && mActiveEnd == nEnd) {
+ return; // don't need to refresh
+ }
+
+ mActiveStart = nStart;
+ mActiveEnd = nEnd;
+
+ // 2. Update the data window
+ nStart = Utils.clamp(mCurrentIndex - DATA_CACHE_SIZE / 2,
+ 0, Math.max(0, mSize - DATA_CACHE_SIZE));
+ nEnd = Math.min(mSize, nStart + DATA_CACHE_SIZE);
+
+ mContentStart = nStart;
+ mContentEnd = nEnd;
+ }
+
private void updateImageRequests() {
if (!mIsActive) return;
@@ -1040,13 +1080,75 @@ public class PhotoDataAdapter implements PhotoPage.Model {
UpdateInfo info = executeAndWait(new GetUpdateInfo());
updateLoading(true);
long version = mSource.reload();
+
+ // Used for delete photo, RTL need to re-decide the slide range.
+ if (View.LAYOUT_DIRECTION_RTL == TextUtils
+ .getLayoutDirectionFromLocale(Locale.getDefault())
+ && mSource.getCurrectSize() == 1 && mCurrentIndex > 0) {
+ mCurrentIndex = mCurrentIndex - 1;
+ mSize = mSource.getMediaItemCount();
+ updateSlidingWindowForRTL();
+ info = executeAndWait(new GetUpdateInfo());
+ }
+
if (info.version != version) {
info.reloadContent = true;
info.size = mSource.getMediaItemCount();
}
if (!info.reloadContent) continue;
- info.items = mSource.getMediaItem(
- info.contentStart, info.contentEnd);
+
+ // Check it is from camera or not
+ boolean isCameraFlag = false;
+ if (mCameraIndex == mCurrentIndex) {
+ info.items = mSource.getMediaItem(mCameraIndex, 1);
+ if (info.items.get(0) instanceof CameraShortcutImage
+ || info.items.get(0) instanceof SnailItem) {
+ isCameraFlag = true;
+ }
+ }
+
+ // If RTL, need to descending photos
+ if (!isCameraFlag
+ && info.contentStart < info.contentEnd
+ && (View.LAYOUT_DIRECTION_RTL == TextUtils
+ .getLayoutDirectionFromLocale(Locale.getDefault()))) {
+
+ // Calculate picture index/range etc..
+ int nIndex = isCameraFlag ? mCurrentIndex : info.size - mCurrentIndex - 1;
+ int nStart = Utils.clamp(nIndex - DATA_CACHE_SIZE / 2, 0,
+ Math.max(0, info.size - DATA_CACHE_SIZE));
+ info.items = mSource.getMediaItem(nStart, DATA_CACHE_SIZE);
+
+ // Initialize temporary picture list
+ ArrayList<MediaItem> mediaItemList = new ArrayList<MediaItem>();
+
+ // Fetch source, check the first item is camera or not
+ ArrayList<MediaItem> itemstmpList = mSource.getMediaItem(0, 1);
+ MediaItem itemstmp = itemstmpList.size() > 0 ? itemstmpList.get(0) : null;
+ boolean isCameraItem = (itemstmp != null)
+ && (itemstmp instanceof CameraShortcutImage
+ || itemstmp instanceof SnailItem);
+ if (isCameraItem) {
+ // If it's camera mode, need to put camera to first position
+ mediaItemList.add(itemstmp);
+ }
+
+ // Descending
+ for (int i = info.items.size() - 1; i >= 0; i--) {
+ if (isCameraItem && 0 == i) {
+ continue;
+ }
+ mediaItemList.add(info.items.get(i));
+ }
+ info.items = (ArrayList<MediaItem>) mediaItemList.clone();
+
+ // Clear temporary list and free memory immediately
+ mediaItemList.clear();
+ mediaItemList = null;
+ } else {
+ info.items = mSource.getMediaItem(
+ info.contentStart, info.contentEnd);
+ } // If RTL, need to descending photos end
int index = MediaSet.INDEX_NOT_FOUND;
@@ -1062,7 +1164,15 @@ public class PhotoDataAdapter implements PhotoPage.Model {
if (item != null && item.getPath() == info.target) {
index = info.indexHint;
} else {
- index = findIndexOfTarget(info);
+ // If RTL and it's not from widget, the index don't need to be amended
+ if (View.LAYOUT_DIRECTION_RTL == TextUtils
+ .getLayoutDirectionFromLocale(Locale.getDefault())
+ && !mIsFromWidget) {
+ index = info.indexHint;
+ } else {
+ index = findIndexOfTarget(info);
+ mIsFromWidget = false;
+ }
}
}
diff --git a/src/com/android/gallery3d/app/PhotoPage.java b/src/com/android/gallery3d/app/PhotoPage.java
index 667ab3805..fb2b4ae1f 100755
--- a/src/com/android/gallery3d/app/PhotoPage.java
+++ b/src/com/android/gallery3d/app/PhotoPage.java
@@ -33,6 +33,7 @@ import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.SystemClock;
+import android.text.TextUtils;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
@@ -74,6 +75,9 @@ import com.android.gallery3d.util.GalleryUtils;
import com.android.gallery3d.util.UsageStatistics;
import com.android.gallery3d.util.ViewGifImage;
+import java.util.ArrayList;
+import java.util.Locale;
+
public abstract class PhotoPage extends ActivityState implements
PhotoView.Listener, AppBridge.Server, ShareActionProvider.OnShareTargetSelectedListener,
PhotoPageBottomControls.Delegate, GalleryActionBar.OnAlbumModeSelectedListener {
@@ -103,6 +107,9 @@ public abstract class PhotoPage extends ActivityState implements
private static final int REQUEST_PLAY_VIDEO = 5;
private static final int REQUEST_TRIM = 6;
+ // Data cache size, equal to AlbumDataLoader.DATA_CACHE_SIZE
+ private static final int DATA_CACHE_SIZE = 256;
+
public static final String KEY_MEDIA_SET_PATH = "media-set-path";
public static final String KEY_MEDIA_ITEM_PATH = "media-item-path";
public static final String KEY_INDEX_HINT = "index-hint";
@@ -115,6 +122,10 @@ public abstract class PhotoPage extends ActivityState implements
public static final String KEY_IN_CAMERA_ROLL = "in_camera_roll";
public static final String KEY_READONLY = "read-only";
+
+ // Bundle key, used for checking whether it is from widget
+ public static final String KEY_IS_FROM_WIDGET = "is_from_widget";
+
public static final String KEY_ALBUMPAGE_TRANSITION = "albumpage-transition";
public static final int MSG_ALBUMPAGE_NONE = 0;
public static final int MSG_ALBUMPAGE_STARTED = 1;
@@ -160,6 +171,8 @@ public abstract class PhotoPage extends ActivityState implements
private SnailAlbum mScreenNailSet;
private OrientationManager mOrientationManager;
private boolean mTreatBackAsUp;
+ // Used for checking whether it is from widget
+ private boolean mIsFromWidget;
private boolean mStartInFilmstrip;
private boolean mHasCameraScreennailOrPlaceholder = false;
private boolean mRecenterCameraOnResume = true;
@@ -390,6 +403,7 @@ public abstract class PhotoPage extends ActivityState implements
Path.fromString(data.getString(KEY_MEDIA_ITEM_PATH)) :
null;
mTreatBackAsUp = data.getBoolean(KEY_TREAT_BACK_AS_UP, false);
+ mIsFromWidget = data.getBoolean(KEY_IS_FROM_WIDGET, false);
mStartInFilmstrip = data.getBoolean(KEY_START_IN_FILMSTRIP, false);
boolean inCameraRoll = data.getBoolean(KEY_IN_CAMERA_ROLL, false);
mCurrentIndex = data.getInt(KEY_INDEX_HINT, 0);
@@ -466,6 +480,30 @@ public abstract class PhotoPage extends ActivityState implements
return;
}
}
+
+ // If it is from widget, need to re-calcuate index and range
+ if (View.LAYOUT_DIRECTION_RTL == TextUtils
+ .getLayoutDirectionFromLocale(Locale.getDefault())
+ && mIsFromWidget) {
+ int nMediaItemCount = mMediaSet.getMediaItemCount();
+ ArrayList<MediaItem> mediaItemList = mMediaSet.getMediaItem(0, nMediaItemCount);
+ int nItemIndex;
+ for (nItemIndex = 0; nItemIndex < nMediaItemCount; nItemIndex++) {
+ if (mediaItemList.get(nItemIndex).getPath().toString()
+ .equals(itemPath.toString())) {
+ int nIndex;
+ if (nItemIndex > DATA_CACHE_SIZE / 2
+ && nItemIndex < (mMediaSet.getMediaItemCount() -
+ DATA_CACHE_SIZE / 2)) {
+ nIndex = mMediaSet.getMediaItemCount() - nItemIndex - 2;
+ } else {
+ nIndex = mMediaSet.getMediaItemCount() - nItemIndex - 1;
+ }
+ itemPath = mMediaSet.getMediaItem(nIndex, 1).get(0).getPath();
+ break;
+ }
+ }
+ }
PhotoDataAdapter pda = new PhotoDataAdapter(
mActivity, mPhotoView, mMediaSet, itemPath, mCurrentIndex,
mAppBridge == null ? -1 : 0,
@@ -474,6 +512,12 @@ public abstract class PhotoPage extends ActivityState implements
mModel = pda;
mPhotoView.setModel(mModel);
+ // If RTL and from widget, set the flag into PhotoDataAdapter.
+ if (View.LAYOUT_DIRECTION_RTL == TextUtils
+ .getLayoutDirectionFromLocale(Locale.getDefault())
+ && mIsFromWidget) {
+ pda.setFromWidget(mIsFromWidget);
+ }
pda.setDataListener(new PhotoDataAdapter.DataListener() {
@Override
@@ -1023,6 +1067,12 @@ public abstract class PhotoPage extends ActivityState implements
return true;
}
int currentIndex = mModel.getCurrentIndex();
+
+ // If RTL, the current index need be revised.
+ if (View.LAYOUT_DIRECTION_RTL == TextUtils
+ .getLayoutDirectionFromLocale(Locale.getDefault())) {
+ currentIndex = mMediaSet.getMediaItemCount() - currentIndex - 1;
+ }
Path path = current.getPath();
DataManager manager = mActivity.getDataManager();
@@ -1205,7 +1255,14 @@ public abstract class PhotoPage extends ActivityState implements
onCommitDeleteImage(); // commit the previous deletion
mDeletePath = path;
mDeleteIsFocus = (offset == 0);
- mMediaSet.addDeletion(path, mCurrentIndex + offset);
+
+ // If RTL, the index need be revised.
+ if (View.LAYOUT_DIRECTION_RTL == TextUtils
+ .getLayoutDirectionFromLocale(Locale.getDefault())) {
+ mMediaSet.addDeletion(path, mMediaSet.getMediaItemCount() - mCurrentIndex - 1);
+ } else {
+ mMediaSet.addDeletion(path, mCurrentIndex + offset);
+ }
}
@Override
@@ -1289,6 +1346,12 @@ public abstract class PhotoPage extends ActivityState implements
if (data == null) break;
String path = data.getStringExtra(SlideshowPage.KEY_ITEM_PATH);
int index = data.getIntExtra(SlideshowPage.KEY_PHOTO_INDEX, 0);
+
+ // If RTL, the index need be revised.
+ if (View.LAYOUT_DIRECTION_RTL == TextUtils
+ .getLayoutDirectionFromLocale(Locale.getDefault())) {
+ index = mMediaSet.getMediaItemCount() - index - 1;
+ }
if (path != null) {
mModel.setCurrentPhoto(Path.fromString(path), index);
}
diff --git a/src/com/android/gallery3d/app/TimeBar.java b/src/com/android/gallery3d/app/TimeBar.java
index 1b9ac24ed..c07500e4f 100755
--- a/src/com/android/gallery3d/app/TimeBar.java
+++ b/src/com/android/gallery3d/app/TimeBar.java
@@ -22,6 +22,7 @@ import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
+import android.text.TextUtils;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.MotionEvent;
@@ -30,6 +31,8 @@ import android.view.View;
import com.android.gallery3d.R;
import com.android.gallery3d.common.Utils;
+import java.util.Locale;
+
/**
* The time bar view, which includes the current and total time, the progress
* bar, and the scrubber.
@@ -127,9 +130,15 @@ public class TimeBar extends View {
mPlayedBar.set(mProgressBar);
if (mTotalTime > 0) {
- mPlayedBar.right =
- mPlayedBar.left
- + (int) ((mProgressBar.width() * (long) mCurrentTime) / mTotalTime);
+ if (View.LAYOUT_DIRECTION_RTL == TextUtils
+ .getLayoutDirectionFromLocale(Locale.getDefault())) {
+ // The progress bar should be reversed in RTL.
+ mPlayedBar.left = mPlayedBar.right
+ - (int) ((mProgressBar.width() * (long) mCurrentTime) / mTotalTime);
+ } else {
+ mPlayedBar.right = mPlayedBar.left
+ + (int) ((mProgressBar.width() * (long) mCurrentTime) / mTotalTime);
+ }
/*
* M: if duration is not accurate, here just adjust playedBar we
* also show the accurate position text to final user.
@@ -138,11 +147,23 @@ public class TimeBar extends View {
mPlayedBar.right = mProgressBar.right;
}
} else {
- mPlayedBar.right = mProgressBar.left;
+ if (View.LAYOUT_DIRECTION_RTL == TextUtils
+ .getLayoutDirectionFromLocale(Locale.getDefault())) {
+ // The progress bar should be reversed in RTL.
+ mPlayedBar.left = mProgressBar.right;
+ } else {
+ mPlayedBar.right = mProgressBar.left;
+ }
}
if (!mScrubbing) {
- mScrubberLeft = mPlayedBar.right - mScrubber.getWidth() / 2;
+ if (View.LAYOUT_DIRECTION_RTL == TextUtils.getLayoutDirectionFromLocale(
+ Locale.getDefault())) {
+ // The progress bar should be reversed in RTL.
+ mScrubberLeft = mPlayedBar.left - mScrubber.getWidth() / 2;
+ } else {
+ mScrubberLeft = mPlayedBar.right - mScrubber.getWidth() / 2;
+ }
}
// update text bounds when layout changed or time changed
updateBounds();
@@ -194,9 +215,17 @@ public class TimeBar extends View {
}
private int getScrubberTime() {
- return (int) ((long) (mScrubberLeft + mScrubber.getWidth() / 2 - mProgressBar.left)
- * mTotalTime / mProgressBar.width());
- }
+ if (View.LAYOUT_DIRECTION_RTL == TextUtils
+ .getLayoutDirectionFromLocale(Locale.getDefault())) {
+ // The progress bar's scrubber time should be reversed in RTL.
+ return (int) ((long) (mProgressBar.width() - (mScrubberLeft
+ + mScrubber.getWidth() / 2 - mProgressBar.left))
+ * mTotalTime / mProgressBar.width());
+ } else {
+ return (int) ((long) (mScrubberLeft + mScrubber.getWidth() / 2 - mProgressBar.left)
+ * mTotalTime / mProgressBar.width());
+ }
+ }
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
@@ -232,18 +261,31 @@ public class TimeBar extends View {
canvas.drawBitmap(mScrubber, mScrubberLeft, mScrubberTop, null);
}
if (mShowTimes) {
- canvas.drawText(
- stringForTime(mCurrentTime),
- mTimeBounds.width() / 2 + getPaddingLeft(),
- mTimeBounds.height() + mVPaddingInPx / 2 + mScrubberPadding + 1
- + mLayoutExt.getTimeOffset(),
- mTimeTextPaint);
- canvas.drawText(
- stringForTime(mTotalTime),
- getWidth() - getPaddingRight() - mTimeBounds.width() / 2,
- mTimeBounds.height() + mVPaddingInPx / 2 + mScrubberPadding + 1
- + mLayoutExt.getTimeOffset(),
- mTimeTextPaint);
+ if (View.LAYOUT_DIRECTION_RTL == TextUtils
+ .getLayoutDirectionFromLocale(Locale.getDefault())) {
+ // The progress bar's time should be reversed in RTL.
+ canvas.drawText(
+ stringForTime(mCurrentTime),
+ getWidth() - getPaddingRight() - mTimeBounds.width() / 2,
+ mTimeBounds.height() + mVPaddingInPx / 2 + mScrubberPadding + 1,
+ mTimeTextPaint);
+ canvas.drawText(
+ stringForTime(mTotalTime),
+ mTimeBounds.width() / 2 + getPaddingLeft(),
+ mTimeBounds.height() + mVPaddingInPx / 2 + mScrubberPadding + 1,
+ mTimeTextPaint);
+ } else {
+ canvas.drawText(
+ stringForTime(mCurrentTime),
+ mTimeBounds.width() / 2 + getPaddingLeft(),
+ mTimeBounds.height() + mVPaddingInPx / 2 + mScrubberPadding + 1,
+ mTimeTextPaint);
+ canvas.drawText(
+ stringForTime(mTotalTime),
+ getWidth() - getPaddingRight() - mTimeBounds.width() / 2,
+ mTimeBounds.height() + mVPaddingInPx / 2 + mScrubberPadding + 1,
+ mTimeTextPaint);
+ }
}
mInfoExt.draw(canvas, mLayoutExt.getInfoBounds(this, mTimeBounds));
}
diff --git a/src/com/android/gallery3d/data/FilterDeleteSet.java b/src/com/android/gallery3d/data/FilterDeleteSet.java
index c76412ff8..f7329739d 100644
--- a/src/com/android/gallery3d/data/FilterDeleteSet.java
+++ b/src/com/android/gallery3d/data/FilterDeleteSet.java
@@ -223,6 +223,11 @@ public class FilterDeleteSet extends MediaSet implements ContentListener {
return mDataVersion;
}
+ @Override
+ public int getCurrectSize() {
+ return mCurrent.size();
+ }
+
private void sendRequest(int type, Path path, int indexHint) {
Request r = new Request(type, path, indexHint);
synchronized (mRequests) {
diff --git a/src/com/android/gallery3d/data/MediaSet.java b/src/com/android/gallery3d/data/MediaSet.java
index 683aa6b32..4c009c735 100644
--- a/src/com/android/gallery3d/data/MediaSet.java
+++ b/src/com/android/gallery3d/data/MediaSet.java
@@ -87,6 +87,11 @@ public abstract class MediaSet extends MediaObject {
return 0;
}
+ public int getCurrectSize() {
+ // Dummy method, need to be override in implementation classes
+ return 0;
+ }
+
public MediaSet getSubMediaSet(int index) {
throw new IndexOutOfBoundsException();
}
diff --git a/src/com/android/gallery3d/gadget/WidgetClickHandler.java b/src/com/android/gallery3d/gadget/WidgetClickHandler.java
index e66a2a66f..e5b0a376c 100644
--- a/src/com/android/gallery3d/gadget/WidgetClickHandler.java
+++ b/src/com/android/gallery3d/gadget/WidgetClickHandler.java
@@ -57,6 +57,8 @@ public class WidgetClickHandler extends Activity {
Intent intent;
if (isValidDataUri(uri)) {
intent = new Intent(Intent.ACTION_VIEW, uri);
+ // Used for checking whether it is from widget
+ intent.putExtra(PhotoPage.KEY_IS_FROM_WIDGET, true);
if (tediousBack) {
intent.putExtra(PhotoPage.KEY_TREAT_BACK_AS_UP, true);
}
diff --git a/src/com/android/gallery3d/ui/AlbumLabelMaker.java b/src/com/android/gallery3d/ui/AlbumLabelMaker.java
index da1cac0bd..3ac3bb7fe 100644
--- a/src/com/android/gallery3d/ui/AlbumLabelMaker.java
+++ b/src/com/android/gallery3d/ui/AlbumLabelMaker.java
@@ -25,6 +25,7 @@ import android.graphics.PorterDuff;
import android.graphics.Typeface;
import android.text.TextPaint;
import android.text.TextUtils;
+import android.view.View;
import com.android.gallery3d.R;
import com.android.gallery3d.data.DataSourceType;
@@ -32,6 +33,8 @@ import com.android.photos.data.GalleryBitmapPool;
import com.android.gallery3d.util.ThreadPool;
import com.android.gallery3d.util.ThreadPool.JobContext;
+import java.util.Locale;
+
public class AlbumLabelMaker {
private static final int BORDER_SIZE = 0;
@@ -170,30 +173,60 @@ public class AlbumLabelMaker {
canvas.translate(BORDER_SIZE, BORDER_SIZE);
- // draw title
- if (jc.isCancelled()) return null;
- int x = s.leftMargin + s.iconSize;
- // TODO: is the offset relevant in new reskin?
- // int y = s.titleOffset;
- int y = (s.labelBackgroundHeight - s.titleFontSize) / 2;
- drawText(canvas, x, y, title, labelWidth - s.leftMargin - x -
- s.titleRightMargin, mTitlePaint);
-
- // draw count
- if (jc.isCancelled()) return null;
- x = labelWidth - s.titleRightMargin;
- y = (s.labelBackgroundHeight - s.countFontSize) / 2;
- drawText(canvas, x, y, count,
- labelWidth - x , mCountPaint);
-
- // draw the icon
- if (icon != null) {
+ if (View.LAYOUT_DIRECTION_RTL == TextUtils
+ .getLayoutDirectionFromLocale(Locale.getDefault())) {// RTL
+ // draw title
+ if (jc.isCancelled()) return null;
+ int strLength = (int) mTitlePaint.measureText(title);
+ int x = labelWidth - (s.leftMargin + s.iconSize) - strLength;
+ // TODO: is the offset relevant in new reskin?
+ // int y = s.titleOffset;
+ int y = (s.labelBackgroundHeight - s.titleFontSize) / 2;
+ drawText(canvas, x, y, title, labelWidth - s.leftMargin - x -
+ s.titleRightMargin, mTitlePaint);
+
+ // draw count
+ if (jc.isCancelled()) return null;
+ x = s.leftMargin + 10;// plus 10 to get a much bigger margin
+ y = (s.labelBackgroundHeight - s.countFontSize) / 2;
+ drawText(canvas, x, y, count,
+ labelWidth - x, mCountPaint);
+ // draw the icon
+ if (icon != null) {
+ if (jc.isCancelled()) return null;
+ float scale = (float) s.iconSize / icon.getWidth();
+ canvas.translate(labelWidth - s.leftMargin - s.iconSize,
+ (s.labelBackgroundHeight -
+ Math.round(scale * icon.getHeight())) / 2f);
+ canvas.scale(scale, scale);
+ canvas.drawBitmap(icon, 0, 0, null);
+ }
+ } else { // LTR
+ // draw title
+ if (jc.isCancelled()) return null;
+ int x = s.leftMargin + s.iconSize;
+ // TODO: is the offset relevant in new reskin?
+ // int y = s.titleOffset;
+ int y = (s.labelBackgroundHeight - s.titleFontSize) / 2;
+ drawText(canvas, x, y, title, labelWidth - s.leftMargin - x -
+ s.titleRightMargin, mTitlePaint);
+
+ // draw count
if (jc.isCancelled()) return null;
- float scale = (float) s.iconSize / icon.getWidth();
- canvas.translate(s.leftMargin, (s.labelBackgroundHeight -
- Math.round(scale * icon.getHeight()))/2f);
- canvas.scale(scale, scale);
- canvas.drawBitmap(icon, 0, 0, null);
+ x = labelWidth - s.titleRightMargin;
+ y = (s.labelBackgroundHeight - s.countFontSize) / 2;
+ drawText(canvas, x, y, count,
+ labelWidth - x, mCountPaint);
+
+ // draw the icon
+ if (icon != null) {
+ if (jc.isCancelled()) return null;
+ float scale = (float) s.iconSize / icon.getWidth();
+ canvas.translate(s.leftMargin, (s.labelBackgroundHeight -
+ Math.round(scale * icon.getHeight())) / 2f);
+ canvas.scale(scale, scale);
+ canvas.drawBitmap(icon, 0, 0, null);
+ }
}
return bitmap;
diff --git a/src/com/android/gallery3d/ui/DialogDetailsView.java b/src/com/android/gallery3d/ui/DialogDetailsView.java
index 30fd1e18f..26934105b 100644
--- a/src/com/android/gallery3d/ui/DialogDetailsView.java
+++ b/src/com/android/gallery3d/ui/DialogDetailsView.java
@@ -21,6 +21,7 @@ import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnDismissListener;
+import android.text.TextUtils;
import android.text.format.Formatter;
import android.view.LayoutInflater;
import android.view.View;
@@ -236,13 +237,20 @@ public class DialogDetailsView implements DetailsViewContainer {
value = String.format("%s: %s %s", DetailsHelper.getDetailsName(
context, key), value, context.getString(details.getUnit(key)));
} else {
- value = String.format("%s: %s", DetailsHelper.getDetailsName(
- context, key), value);
+ if (View.LAYOUT_DIRECTION_RTL == TextUtils
+ .getLayoutDirectionFromLocale(Locale.getDefault())
+ && (key == MediaDetails.INDEX_PATH)) {
+ value = String.format("%s : \n%s",
+ DetailsHelper.getDetailsName(context, key), value);
+ } else {
+ value = String.format("%s: %s", DetailsHelper.getDetailsName(context, key),
+ value);
+ }
}
mItems.add(value);
- }
- if (!resolutionIsValid) {
- DetailsHelper.resolveResolution(path, this);
+ if (!resolutionIsValid) {
+ DetailsHelper.resolveResolution(path, this);
+ }
}
}
diff --git a/src/com/android/gallery3d/ui/SlotView.java b/src/com/android/gallery3d/ui/SlotView.java
index bd0ffdc15..eaf23f553 100644
--- a/src/com/android/gallery3d/ui/SlotView.java
+++ b/src/com/android/gallery3d/ui/SlotView.java
@@ -18,8 +18,10 @@ package com.android.gallery3d.ui;
import android.graphics.Rect;
import android.os.Handler;
+import android.text.TextUtils;
import android.view.GestureDetector;
import android.view.MotionEvent;
+import android.view.View;
import android.view.animation.DecelerateInterpolator;
import com.android.gallery3d.anim.Animation;
@@ -27,6 +29,8 @@ import com.android.gallery3d.app.AbstractGalleryActivity;
import com.android.gallery3d.common.Utils;
import com.android.gallery3d.glrenderer.GLCanvas;
+import java.util.Locale;
+
public class SlotView extends GLView {
@SuppressWarnings("unused")
private static final String TAG = "SlotView";
@@ -88,6 +92,9 @@ public class SlotView extends GLView {
// to prevent allocating memory
private final Rect mTempRect = new Rect();
+ // Flag to check whether it is come from Photo Page.
+ private boolean isFromPhotoPage = false;
+
public SlotView(AbstractGalleryActivity activity, Spec spec) {
mGestureDetector = new GestureDetector(activity, new MyGestureListener());
mScroller = new ScrollerHelper(activity);
@@ -135,7 +142,20 @@ public class SlotView extends GLView {
setScrollPosition(position);
}
+ /**
+ * Set the flag which used for check whether it is come from Photo Page.
+ */
+ public void setIsFromPhotoPage(boolean flag) {
+ isFromPhotoPage = flag;
+ }
+
public void setScrollPosition(int position) {
+ if (View.LAYOUT_DIRECTION_RTL == TextUtils
+ .getLayoutDirectionFromLocale(Locale.getDefault())
+ && position == 0 && !isFromPhotoPage) {
+ // If RTL and not from Photo Page, set position to max.
+ position = mLayout.getScrollLimit();
+ }
position = Utils.clamp(position, 0, mLayout.getScrollLimit());
mScroller.setPosition(position);
updateScrollPosition(position, false);
@@ -435,8 +455,16 @@ public class SlotView extends GLView {
public Rect getSlotRect(int index, Rect rect) {
int col, row;
if (WIDE) {
- col = index / mUnitCount;
- row = index - col * mUnitCount;
+ if (View.LAYOUT_DIRECTION_RTL == TextUtils
+ .getLayoutDirectionFromLocale(Locale.getDefault())) {
+ // If RTL, recalculate the columns and rows.
+ int count = ((mSlotCount + mUnitCount - 1) / mUnitCount);
+ col = count - index / mUnitCount - 1;
+ row = index % mUnitCount;
+ } else {
+ col = index / mUnitCount;
+ row = index - col * mUnitCount;
+ }
} else {
row = index / mUnitCount;
col = index - row * mUnitCount;
@@ -531,6 +559,13 @@ public class SlotView extends GLView {
int position = mScrollPosition;
if (WIDE) {
+ if (View.LAYOUT_DIRECTION_RTL == TextUtils
+ .getLayoutDirectionFromLocale(Locale.getDefault())) {
+ // If RTL, recalculate the position.
+ position = mContentLength > mWidth ? (mContentLength - position - mWidth)
+ : position;
+ position = Math.max(0, position);
+ }
int startCol = position / (mSlotWidth + mSlotGap);
int start = Math.max(0, mUnitCount * startCol);
int endCol = (position + mWidth + mSlotWidth + mSlotGap - 1) /
@@ -577,7 +612,12 @@ public class SlotView extends GLView {
public int getSlotIndexByPosition(float x, float y) {
int absoluteX = Math.round(x) + (WIDE ? mScrollPosition : 0);
int absoluteY = Math.round(y) + (WIDE ? 0 : mScrollPosition);
-
+ if (View.LAYOUT_DIRECTION_RTL == TextUtils
+ .getLayoutDirectionFromLocale(Locale.getDefault())) {
+ // If RTL, recalculate the absoluteX.
+ absoluteX = mContentLength > mWidth ? (mContentLength - absoluteX) : mWidth
+ - absoluteX;
+ }
absoluteX -= mHorizontalPadding.get();
absoluteY -= mVerticalPadding.get();
@@ -785,4 +825,11 @@ public class SlotView extends GLView {
if (progress == 1f) mEnabled = false;
}
}
+
+ /**
+ * Get the SlotView's max scroll value.
+ */
+ public int getScrollLimit() {
+ return mLayout.getScrollLimit();
+ }
}