Fixing RTL wallpaper scrolling.

- Ensure that we map the scroll offsets to the full wallpaper offset 
  range
- Default to either edge of the wallpaper (depending on RTL) to match
  the default system wallpaper behavior (ag/1265418)

Bug: 28795125
Bug: 29398681
Change-Id: I36c316095057912d2dda0beb43bd1e6aaeac3fdc
This commit is contained in:
Winson
2016-07-28 12:24:55 -07:00
parent 71538da6e2
commit d96fa13369
@@ -18,7 +18,7 @@ public class WallpaperOffsetInterpolator implements Choreographer.FrameCallback
private static final int ANIMATION_DURATION = 250;
// Don't use all the wallpaper for parallax until you have at least this many pages
private static final int MIN_PARALLAX_PAGE_SPAN = 3;
private static final int MIN_PARALLAX_PAGE_SPAN = 4;
private final Choreographer mChoreographer;
private final Interpolator mInterpolator;
@@ -90,57 +90,60 @@ public class WallpaperOffsetInterpolator implements Choreographer.FrameCallback
return false;
}
/**
* TODO: do different behavior if it's a live wallpaper?
*/
public float wallpaperOffsetForScroll(int scroll) {
// TODO: do different behavior if it's a live wallpaper?
// Don't use up all the wallpaper parallax until you have at least
// MIN_PARALLAX_PAGE_SPAN pages
// To match the default wallpaper behavior in the system, we default to either the left
// or right edge on initialization
int numScrollingPages = getNumScreensExcludingEmptyAndCustom();
int parallaxPageSpan;
if (numScrollingPages <= 1) {
return mIsRtl ? 1f : 0f;
}
// Distribute the wallpaper parallax over a minimum of MIN_PARALLAX_PAGE_SPAN workspace
// screens, not including the custom screen, and empty screens (if > MIN_PARALLAX_PAGE_SPAN)
if (mWallpaperIsLiveWallpaper) {
parallaxPageSpan = numScrollingPages - 1;
mNumPagesForWallpaperParallax = numScrollingPages;
} else {
parallaxPageSpan = Math.max(MIN_PARALLAX_PAGE_SPAN, numScrollingPages - 1);
}
mNumPagesForWallpaperParallax = parallaxPageSpan;
if (mWorkspace.getChildCount() <= 1) {
if (mIsRtl) {
return 1 - 1.0f/mNumPagesForWallpaperParallax;
}
return 0;
mNumPagesForWallpaperParallax = Math.max(MIN_PARALLAX_PAGE_SPAN, numScrollingPages);
}
// Exclude the leftmost page
int emptyExtraPages = numEmptyScreensToIgnore();
int firstIndex = mWorkspace.numCustomPages();
// Exclude the last extra empty screen (if we have > MIN_PARALLAX_PAGE_SPAN pages)
int lastIndex = mWorkspace.getChildCount() - 1 - emptyExtraPages;
// Offset by the custom screen
int leftPageIndex;
int rightPageIndex;
if (mIsRtl) {
int temp = firstIndex;
firstIndex = lastIndex;
lastIndex = temp;
}
int firstPageScrollX = mWorkspace.getScrollForPage(firstIndex);
int scrollRange = mWorkspace.getScrollForPage(lastIndex) - firstPageScrollX;
if (scrollRange == 0) {
return 0;
rightPageIndex = mWorkspace.numCustomPages();
leftPageIndex = rightPageIndex + numScrollingPages - 1;
} else {
// Sometimes the left parameter of the pages is animated during a layout transition;
// this parameter offsets it to keep the wallpaper from animating as well
int adjustedScroll =
scroll - firstPageScrollX - mWorkspace.getLayoutTransitionOffsetForPage(0);
float offset = Math.min(1, adjustedScroll / (float) scrollRange);
offset = Math.max(0, offset);
// On RTL devices, push the wallpaper offset to the right if we don't have enough
// pages (ie if numScrollingPages < MIN_PARALLAX_PAGE_SPAN)
if (!mWallpaperIsLiveWallpaper && numScrollingPages < MIN_PARALLAX_PAGE_SPAN
&& mIsRtl) {
return offset * (parallaxPageSpan - numScrollingPages + 1) / parallaxPageSpan;
}
return offset * (numScrollingPages - 1) / parallaxPageSpan;
leftPageIndex = mWorkspace.numCustomPages();
rightPageIndex = leftPageIndex + numScrollingPages - 1;
}
// Calculate the scroll range
int leftPageScrollX = mWorkspace.getScrollForPage(leftPageIndex);
int rightPageScrollX = mWorkspace.getScrollForPage(rightPageIndex);
int scrollRange = rightPageScrollX - leftPageScrollX;
if (scrollRange == 0) {
return 0f;
}
// Sometimes the left parameter of the pages is animated during a layout transition;
// this parameter offsets it to keep the wallpaper from animating as well
int adjustedScroll = scroll - leftPageScrollX -
mWorkspace.getLayoutTransitionOffsetForPage(0);
float offset = Utilities.boundToRange((float) adjustedScroll / scrollRange, 0f, 1f);
// The offset is now distributed 0..1 between the left and right pages that we care about,
// so we just map that between the pages that we are using for parallax
float rtlOffset = 0;
if (mIsRtl) {
// In RTL, the pages are right aligned, so adjust the offset from the end
rtlOffset = (float) ((mNumPagesForWallpaperParallax - 1) - (numScrollingPages - 1)) /
(mNumPagesForWallpaperParallax - 1);
}
return rtlOffset + offset *
((float) (numScrollingPages - 1) / (mNumPagesForWallpaperParallax - 1));
}
private float wallpaperOffsetForCurrentScroll() {
@@ -182,7 +185,7 @@ public class WallpaperOffsetInterpolator implements Choreographer.FrameCallback
private void setWallpaperOffsetSteps() {
// Set wallpaper offset steps (1 / (number of screens - 1))
float xOffset = 1.0f / mNumPagesForWallpaperParallax;
float xOffset = 1.0f / (mNumPagesForWallpaperParallax - 1);
if (xOffset != mLastSetWallpaperOffsetSteps) {
mWallpaperManager.setWallpaperOffsetSteps(xOffset, 1.0f);
mLastSetWallpaperOffsetSteps = xOffset;