Working around incorrect wallpaper offsets being calculated in RTL.
am: c7d2e83c15
Change-Id: I6477d7e7ed8686c8ccc5deab06621dc6496351e1
diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java
index 78e0aa0..5f5ac2e 100644
--- a/src/com/android/launcher3/Launcher.java
+++ b/src/com/android/launcher3/Launcher.java
@@ -1376,6 +1376,9 @@
mWorkspace.setHapticFeedbackEnabled(false);
mWorkspace.setOnLongClickListener(this);
mWorkspace.setup(mDragController);
+ // Until the workspace is bound, ensure that we keep the wallpaper offset locked to the
+ // default state, otherwise we will update to the wrong offsets in RTL
+ mWorkspace.lockWallpaperToDefaultPage();
mWorkspace.bindAndInitFirstWorkspaceScreen(null /* recycled qsb */);
mDragController.addDragListener(mWorkspace);
@@ -3679,6 +3682,11 @@
mWorkspace.createCustomContentContainer();
populateCustomContentContainer();
}
+
+ // After we have added all the screens, if the wallpaper was locked to the default state,
+ // then notify to indicate that it can be released and a proper wallpaper offset can be
+ // computed before the next layout
+ mWorkspace.unlockWallpaperFromDefaultPageOnNextLayout();
}
private void bindAddScreens(ArrayList<Long> orderedScreenIds) {
diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java
index 341c7c8..5663444 100644
--- a/src/com/android/launcher3/Workspace.java
+++ b/src/com/android/launcher3/Workspace.java
@@ -90,7 +90,6 @@
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
-import java.util.concurrent.atomic.AtomicInteger;
/**
* The workspace is a wide area with a wallpaper and a finite number of pages.
@@ -253,6 +252,7 @@
private boolean mWorkspaceFadeInAdjacentScreens;
final WallpaperOffsetInterpolator mWallpaperOffset;
+ private boolean mUnlockWallpaperFromDefaultPageOnLayout;
@Thunk Runnable mDelayedResizeRunnable;
private Runnable mDelayedSnapToPageRunnable;
@@ -1616,6 +1616,17 @@
});
}
+ public void lockWallpaperToDefaultPage() {
+ mWallpaperOffset.setLockToDefaultPage(true);
+ }
+
+ public void unlockWallpaperFromDefaultPageOnNextLayout() {
+ if (mWallpaperOffset.isLockedToDefaultPage()) {
+ mUnlockWallpaperFromDefaultPageOnLayout = true;
+ requestLayout();
+ }
+ }
+
protected void snapToPage(int whichPage, Runnable r) {
snapToPage(whichPage, SLOW_PAGE_SNAP_ANIMATION_DURATION, r);
}
@@ -1797,6 +1808,10 @@
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
+ if (mUnlockWallpaperFromDefaultPageOnLayout) {
+ mWallpaperOffset.setLockToDefaultPage(false);
+ mUnlockWallpaperFromDefaultPageOnLayout = false;
+ }
if (mFirstLayout && mCurrentPage >= 0 && mCurrentPage < getChildCount()) {
mWallpaperOffset.syncWithScroll();
mWallpaperOffset.jumpToFinal();
diff --git a/src/com/android/launcher3/util/WallpaperOffsetInterpolator.java b/src/com/android/launcher3/util/WallpaperOffsetInterpolator.java
index 1568beb..d7b3914 100644
--- a/src/com/android/launcher3/util/WallpaperOffsetInterpolator.java
+++ b/src/com/android/launcher3/util/WallpaperOffsetInterpolator.java
@@ -33,6 +33,7 @@
private float mFinalOffset = 0.0f;
private float mCurrentOffset = 0.5f; // to force an initial update
private boolean mWaitingForUpdate;
+ private boolean mLockedToDefaultPage;
private boolean mAnimating;
private long mAnimationStartTime;
@@ -68,6 +69,17 @@
}
}
+ /**
+ * Locks the wallpaper offset to the offset in the default state of Launcher.
+ */
+ public void setLockToDefaultPage(boolean lockToDefaultPage) {
+ mLockedToDefaultPage = lockToDefaultPage;
+ }
+
+ public boolean isLockedToDefaultPage() {
+ return mLockedToDefaultPage;
+ }
+
public boolean computeScrollOffset() {
final float oldOffset = mCurrentOffset;
if (mAnimating) {
@@ -97,7 +109,7 @@
// To match the default wallpaper behavior in the system, we default to either the left
// or right edge on initialization
int numScrollingPages = getNumScreensExcludingEmptyAndCustom();
- if (numScrollingPages <= 1) {
+ if (mLockedToDefaultPage || numScrollingPages <= 1) {
return mIsRtl ? 1f : 0f;
}
@@ -194,7 +206,7 @@
public void setFinalX(float x) {
scheduleUpdate();
- mFinalOffset = Math.max(0f, Math.min(x, 1.0f));
+ mFinalOffset = Math.max(0f, Math.min(x, 1f));
if (getNumScreensExcludingEmptyAndCustom() != mNumScreens) {
if (mNumScreens > 0) {
// Don't animate if we're going from 0 screens