Add a way for wallpapers to know the delta between virtual screens.
diff --git a/api/6.xml b/api/6.xml
index eaad28a..32d0f1e 100644
--- a/api/6.xml
+++ b/api/6.xml
@@ -25097,6 +25097,21 @@
<exception name="IOException" type="java.io.IOException">
</exception>
</method>
+<method name="setWallpaperOffsetSteps"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="xStep" type="float">
+</parameter>
+<parameter name="yStep" type="float">
+</parameter>
+</method>
<method name="setWallpaperOffsets"
return="void"
abstract="false"
@@ -123675,6 +123690,10 @@
</parameter>
<parameter name="yOffset" type="float">
</parameter>
+<parameter name="xOffsetStep" type="float">
+</parameter>
+<parameter name="yOffsetStep" type="float">
+</parameter>
<parameter name="xPixelOffset" type="int">
</parameter>
<parameter name="yPixelOffset" type="int">
diff --git a/api/current.xml b/api/current.xml
index eaad28a..32d0f1e 100644
--- a/api/current.xml
+++ b/api/current.xml
@@ -25097,6 +25097,21 @@
<exception name="IOException" type="java.io.IOException">
</exception>
</method>
+<method name="setWallpaperOffsetSteps"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="xStep" type="float">
+</parameter>
+<parameter name="yStep" type="float">
+</parameter>
+</method>
<method name="setWallpaperOffsets"
return="void"
abstract="false"
@@ -123675,6 +123690,10 @@
</parameter>
<parameter name="yOffset" type="float">
</parameter>
+<parameter name="xOffsetStep" type="float">
+</parameter>
+<parameter name="yOffsetStep" type="float">
+</parameter>
<parameter name="xPixelOffset" type="int">
</parameter>
<parameter name="yPixelOffset" type="int">
diff --git a/core/java/android/app/WallpaperManager.java b/core/java/android/app/WallpaperManager.java
index 66a3396..e98b286 100644
--- a/core/java/android/app/WallpaperManager.java
+++ b/core/java/android/app/WallpaperManager.java
@@ -53,6 +53,8 @@
public class WallpaperManager {
private static String TAG = "WallpaperManager";
private static boolean DEBUG = false;
+ private float mWallpaperXStep = -1;
+ private float mWallpaperYStep = -1;
/**
* Launch an activity for the user to pick the current global live
@@ -575,14 +577,14 @@
* @param windowToken The window who these offsets should be associated
* with, as returned by {@link android.view.View#getWindowToken()
* View.getWindowToken()}.
- * @param xOffset The offset olong the X dimension, from 0 to 1.
+ * @param xOffset The offset along the X dimension, from 0 to 1.
* @param yOffset The offset along the Y dimension, from 0 to 1.
*/
public void setWallpaperOffsets(IBinder windowToken, float xOffset, float yOffset) {
try {
//Log.v(TAG, "Sending new wallpaper offsets from app...");
ViewRoot.getWindowSession(mContext.getMainLooper()).setWallpaperPosition(
- windowToken, xOffset, yOffset);
+ windowToken, xOffset, yOffset, mWallpaperXStep, mWallpaperYStep);
//Log.v(TAG, "...app returning after sending offsets!");
} catch (RemoteException e) {
// Ignore.
@@ -590,6 +592,19 @@
}
/**
+ * For applications that use multiple virtual screens showing a wallpaper,
+ * specify the step size between virtual screens. For example, if the
+ * launcher has 5 virtual screens, it would specify an xStep of 0.5,
+ * since the X offset for those screens are 0.0, 0.5 and 1.0
+ * @param xStep The X offset delta from one screen to the next one
+ * @param yStep The Y offset delta from one screen to the next one
+ */
+ public void setWallpaperOffsetSteps(float xStep, float yStep) {
+ mWallpaperXStep = xStep;
+ mWallpaperYStep = yStep;
+ }
+
+ /**
* Send an arbitrary command to the current active wallpaper.
*
* @param windowToken The window who these offsets should be associated
@@ -627,7 +642,7 @@
public void clearWallpaperOffsets(IBinder windowToken) {
try {
ViewRoot.getWindowSession(mContext.getMainLooper()).setWallpaperPosition(
- windowToken, -1, -1);
+ windowToken, -1, -1, -1, -1);
} catch (RemoteException e) {
// Ignore.
}
diff --git a/core/java/android/service/wallpaper/WallpaperService.java b/core/java/android/service/wallpaper/WallpaperService.java
index 573be1e..e79832b 100644
--- a/core/java/android/service/wallpaper/WallpaperService.java
+++ b/core/java/android/service/wallpaper/WallpaperService.java
@@ -134,6 +134,8 @@
boolean mOffsetMessageEnqueued;
float mPendingXOffset;
float mPendingYOffset;
+ float mPendingXOffsetStep;
+ float mPendingYOffsetStep;
boolean mPendingSync;
MotionEvent mPendingMove;
@@ -227,11 +229,14 @@
}
@Override
- public void dispatchWallpaperOffsets(float x, float y, boolean sync) {
+ public void dispatchWallpaperOffsets(float x, float y, float xStep, float yStep,
+ boolean sync) {
synchronized (mLock) {
if (DEBUG) Log.v(TAG, "Dispatch wallpaper offsets: " + x + ", " + y);
mPendingXOffset = x;
mPendingYOffset = y;
+ mPendingXOffsetStep = xStep;
+ mPendingYOffsetStep = yStep;
if (sync) {
mPendingSync = true;
}
@@ -360,6 +365,7 @@
* WallpaperManager.setWallpaperOffsets()}.
*/
public void onOffsetsChanged(float xOffset, float yOffset,
+ float xOffsetStep, float yOffsetStep,
int xPixelOffset, int yPixelOffset) {
}
@@ -608,10 +614,14 @@
float xOffset;
float yOffset;
+ float xOffsetStep;
+ float yOffsetStep;
boolean sync;
synchronized (mLock) {
xOffset = mPendingXOffset;
yOffset = mPendingYOffset;
+ xOffsetStep = mPendingXOffsetStep;
+ yOffsetStep = mPendingYOffsetStep;
sync = mPendingSync;
mPendingSync = false;
mOffsetMessageEnqueued = false;
@@ -622,7 +632,7 @@
final int xPixels = availw > 0 ? -(int)(availw*xOffset+.5f) : 0;
final int availh = mIWallpaperEngine.mReqHeight-mCurHeight;
final int yPixels = availh > 0 ? -(int)(availh*yOffset+.5f) : 0;
- onOffsetsChanged(xOffset, yOffset, xPixels, yPixels);
+ onOffsetsChanged(xOffset, yOffset, xOffsetStep, yOffsetStep, xPixels, yPixels);
if (sync) {
try {
diff --git a/core/java/android/view/IWindow.aidl b/core/java/android/view/IWindow.aidl
index 6bfc8b5..71302cb 100644
--- a/core/java/android/view/IWindow.aidl
+++ b/core/java/android/view/IWindow.aidl
@@ -62,7 +62,7 @@
/**
* Called for wallpaper windows when their offsets change.
*/
- void dispatchWallpaperOffsets(float x, float y, boolean sync);
+ void dispatchWallpaperOffsets(float x, float y, float xStep, float yStep, boolean sync);
void dispatchWallpaperCommand(String action, int x, int y,
int z, in Bundle extras, boolean sync);
diff --git a/core/java/android/view/IWindowSession.aidl b/core/java/android/view/IWindowSession.aidl
index 7e7a38f..b6b009b 100644
--- a/core/java/android/view/IWindowSession.aidl
+++ b/core/java/android/view/IWindowSession.aidl
@@ -113,8 +113,10 @@
/**
* For windows with the wallpaper behind them, and the wallpaper is
* larger than the screen, set the offset within the screen.
+ * For multi screen launcher type applications, xstep and ystep indicate
+ * how big the increment is from one screen to another.
*/
- void setWallpaperPosition(IBinder windowToken, float x, float y);
+ void setWallpaperPosition(IBinder windowToken, float x, float y, float xstep, float ystep);
void wallpaperOffsetsComplete(IBinder window);
diff --git a/core/java/android/view/ViewRoot.java b/core/java/android/view/ViewRoot.java
index f4593f5..bef3e58 100644
--- a/core/java/android/view/ViewRoot.java
+++ b/core/java/android/view/ViewRoot.java
@@ -2895,7 +2895,8 @@
}
}
- public void dispatchWallpaperOffsets(float x, float y, boolean sync) {
+ public void dispatchWallpaperOffsets(float x, float y, float xStep, float yStep,
+ boolean sync) {
if (sync) {
try {
sWindowSession.wallpaperOffsetsComplete(asBinder());
diff --git a/core/java/com/android/internal/service/wallpaper/ImageWallpaper.java b/core/java/com/android/internal/service/wallpaper/ImageWallpaper.java
index 6d29038..c09ecfb 100644
--- a/core/java/com/android/internal/service/wallpaper/ImageWallpaper.java
+++ b/core/java/com/android/internal/service/wallpaper/ImageWallpaper.java
@@ -102,6 +102,7 @@
@Override
public void onOffsetsChanged(float xOffset, float yOffset,
+ float xOffsetStep, float yOffsetStep,
int xPixels, int yPixels) {
mXOffset = xOffset;
mYOffset = yOffset;
diff --git a/core/java/com/android/internal/view/BaseIWindow.java b/core/java/com/android/internal/view/BaseIWindow.java
index 2674262..15dcbd6 100644
--- a/core/java/com/android/internal/view/BaseIWindow.java
+++ b/core/java/com/android/internal/view/BaseIWindow.java
@@ -94,7 +94,7 @@
public void closeSystemDialogs(String reason) {
}
- public void dispatchWallpaperOffsets(float x, float y, boolean sync) {
+ public void dispatchWallpaperOffsets(float x, float y, float xStep, float yStep, boolean sync) {
if (sync) {
try {
mSession.wallpaperOffsetsComplete(asBinder());
diff --git a/services/java/com/android/server/WindowManagerService.java b/services/java/com/android/server/WindowManagerService.java
index 9acc97a..69f4b89 100644
--- a/services/java/com/android/server/WindowManagerService.java
+++ b/services/java/com/android/server/WindowManagerService.java
@@ -433,6 +433,8 @@
int mWallpaperAnimLayerAdjustment;
float mLastWallpaperX = -1;
float mLastWallpaperY = -1;
+ float mLastWallpaperXStep = -1;
+ float mLastWallpaperYStep = -1;
// This is set when we are waiting for a wallpaper to tell us it is done
// changing its scroll position.
WindowState mWaitingOnWallpaper;
@@ -1465,9 +1467,11 @@
if (visible) {
if (mWallpaperTarget.mWallpaperX >= 0) {
mLastWallpaperX = mWallpaperTarget.mWallpaperX;
+ mLastWallpaperXStep = mWallpaperTarget.mWallpaperXStep;
}
if (mWallpaperTarget.mWallpaperY >= 0) {
mLastWallpaperY = mWallpaperTarget.mWallpaperY;
+ mLastWallpaperYStep = mWallpaperTarget.mWallpaperYStep;
}
}
@@ -1570,6 +1574,7 @@
boolean changed = false;
boolean rawChanged = false;
float wpx = mLastWallpaperX >= 0 ? mLastWallpaperX : 0.5f;
+ float wpxs = mLastWallpaperXStep >= 0 ? mLastWallpaperXStep : -1.0f;
int availw = wallpaperWin.mFrame.right-wallpaperWin.mFrame.left-dw;
int offset = availw > 0 ? -(int)(availw*wpx+.5f) : 0;
changed = wallpaperWin.mXOffset != offset;
@@ -1578,12 +1583,14 @@
+ wallpaperWin + " x: " + offset);
wallpaperWin.mXOffset = offset;
}
- if (wallpaperWin.mWallpaperX != wpx) {
+ if (wallpaperWin.mWallpaperX != wpx || wallpaperWin.mWallpaperXStep != wpxs) {
wallpaperWin.mWallpaperX = wpx;
+ wallpaperWin.mWallpaperXStep = wpxs;
rawChanged = true;
}
float wpy = mLastWallpaperY >= 0 ? mLastWallpaperY : 0.5f;
+ float wpys = mLastWallpaperYStep >= 0 ? mLastWallpaperYStep : -1.0f;
int availh = wallpaperWin.mFrame.bottom-wallpaperWin.mFrame.top-dh;
offset = availh > 0 ? -(int)(availh*wpy+.5f) : 0;
if (wallpaperWin.mYOffset != offset) {
@@ -1592,8 +1599,9 @@
changed = true;
wallpaperWin.mYOffset = offset;
}
- if (wallpaperWin.mWallpaperY != wpy) {
+ if (wallpaperWin.mWallpaperY != wpy || wallpaperWin.mWallpaperYStep != wpys) {
wallpaperWin.mWallpaperY = wpy;
+ wallpaperWin.mWallpaperYStep = wpys;
rawChanged = true;
}
@@ -1606,7 +1614,8 @@
mWaitingOnWallpaper = wallpaperWin;
}
wallpaperWin.mClient.dispatchWallpaperOffsets(
- wallpaperWin.mWallpaperX, wallpaperWin.mWallpaperY, sync);
+ wallpaperWin.mWallpaperX, wallpaperWin.mWallpaperY,
+ wallpaperWin.mWallpaperXStep, wallpaperWin.mWallpaperYStep, sync);
if (sync) {
if (mWaitingOnWallpaper != null) {
long start = SystemClock.uptimeMillis();
@@ -2181,10 +2190,13 @@
}
}
- public void setWindowWallpaperPositionLocked(WindowState window, float x, float y) {
+ public void setWindowWallpaperPositionLocked(WindowState window, float x, float y,
+ float xStep, float yStep) {
if (window.mWallpaperX != x || window.mWallpaperY != y) {
window.mWallpaperX = x;
window.mWallpaperY = y;
+ window.mWallpaperXStep = xStep;
+ window.mWallpaperYStep = yStep;
if (updateWallpaperOffsetLocked(window, true)) {
performLayoutAndPlaceSurfacesLocked();
}
@@ -6585,12 +6597,12 @@
}
}
- public void setWallpaperPosition(IBinder window, float x, float y) {
+ public void setWallpaperPosition(IBinder window, float x, float y, float xStep, float yStep) {
synchronized(mWindowMap) {
long ident = Binder.clearCallingIdentity();
try {
setWindowWallpaperPositionLocked(windowForClientLocked(this, window),
- x, y);
+ x, y, xStep, yStep);
} finally {
Binder.restoreCallingIdentity(ident);
}
@@ -6804,7 +6816,12 @@
// wallpaper; if a wallpaper window: the currently applied offset.
float mWallpaperX = -1;
float mWallpaperY = -1;
-
+
+ // If a window showing a wallpaper: what fraction of the offset
+ // range corresponds to a full virtual screen.
+ float mWallpaperXStep = -1;
+ float mWallpaperYStep = -1;
+
// Wallpaper windows: pixels offset based on above variables.
int mXOffset;
int mYOffset;
@@ -8037,6 +8054,10 @@
pw.print(prefix); pw.print("mWallpaperX="); pw.print(mWallpaperX);
pw.print(" mWallpaperY="); pw.println(mWallpaperY);
}
+ if (mWallpaperXStep != -1 || mWallpaperYStep != -1) {
+ pw.print(prefix); pw.print("mWallpaperXStep="); pw.print(mWallpaperXStep);
+ pw.print(" mWallpaperYStep="); pw.println(mWallpaperYStep);
+ }
}
@Override
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java
index f0223e8..c455977 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java
@@ -1060,7 +1060,8 @@
}
@SuppressWarnings("unused")
- public void setWallpaperPosition(IBinder window, float x, float y) {
+ public void setWallpaperPosition(IBinder window, float x, float y,
+ float xStep, float yStep) {
// pass for now.
}
@@ -1140,7 +1141,8 @@
}
@SuppressWarnings("unused")
- public void dispatchWallpaperOffsets(float x, float y, boolean sync) {
+ public void dispatchWallpaperOffsets(float x, float y, float xStep, float yStep,
+ boolean sync) {
// pass for now.
}