Merge commit 'a8f1a805c8b6dff5becbd95122462d91c1d1b254' into eclair-mr2-plus-aosp * commit 'a8f1a805c8b6dff5becbd95122462d91c1d1b254': Improve wallpaper offset handling.
This commit is contained in:
@@ -430,8 +430,8 @@ public class WindowManagerService extends IWindowManager.Stub
|
|||||||
// to another, and this is the higher one in Z-order.
|
// to another, and this is the higher one in Z-order.
|
||||||
WindowState mUpperWallpaperTarget = null;
|
WindowState mUpperWallpaperTarget = null;
|
||||||
int mWallpaperAnimLayerAdjustment;
|
int mWallpaperAnimLayerAdjustment;
|
||||||
float mLastWallpaperX;
|
float mLastWallpaperX = -1;
|
||||||
float mLastWallpaperY;
|
float mLastWallpaperY = -1;
|
||||||
// Lock for waiting for the wallpaper.
|
// Lock for waiting for the wallpaper.
|
||||||
final Object mWaitingOnWallpaperLock = new Object();
|
final Object mWaitingOnWallpaperLock = new Object();
|
||||||
// This is set when we are waiting for a wallpaper to tell us it is done
|
// This is set when we are waiting for a wallpaper to tell us it is done
|
||||||
@@ -1464,8 +1464,12 @@ public class WindowManagerService extends IWindowManager.Stub
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (visible) {
|
if (visible) {
|
||||||
mLastWallpaperX = mWallpaperTarget.mWallpaperX;
|
if (mWallpaperTarget.mWallpaperX >= 0) {
|
||||||
mLastWallpaperY = mWallpaperTarget.mWallpaperY;
|
mLastWallpaperX = mWallpaperTarget.mWallpaperX;
|
||||||
|
}
|
||||||
|
if (mWallpaperTarget.mWallpaperY >= 0) {
|
||||||
|
mLastWallpaperY = mWallpaperTarget.mWallpaperY;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Start stepping backwards from here, ensuring that our wallpaper windows
|
// Start stepping backwards from here, ensuring that our wallpaper windows
|
||||||
@@ -1566,34 +1570,32 @@ public class WindowManagerService extends IWindowManager.Stub
|
|||||||
boolean sync) {
|
boolean sync) {
|
||||||
boolean changed = false;
|
boolean changed = false;
|
||||||
boolean rawChanged = false;
|
boolean rawChanged = false;
|
||||||
if (mLastWallpaperX >= 0) {
|
float wpx = mLastWallpaperX >= 0 ? mLastWallpaperX : 0.5f;
|
||||||
int availw = wallpaperWin.mFrame.right-wallpaperWin.mFrame.left-dw;
|
int availw = wallpaperWin.mFrame.right-wallpaperWin.mFrame.left-dw;
|
||||||
int offset = availw > 0 ? -(int)(availw*mLastWallpaperX+.5f) : 0;
|
int offset = availw > 0 ? -(int)(availw*wpx+.5f) : 0;
|
||||||
changed = wallpaperWin.mXOffset != offset;
|
changed = wallpaperWin.mXOffset != offset;
|
||||||
if (changed) {
|
if (changed) {
|
||||||
if (DEBUG_WALLPAPER) Log.v(TAG, "Update wallpaper "
|
if (DEBUG_WALLPAPER) Log.v(TAG, "Update wallpaper "
|
||||||
+ wallpaperWin + " x: " + offset);
|
+ wallpaperWin + " x: " + offset);
|
||||||
wallpaperWin.mXOffset = offset;
|
wallpaperWin.mXOffset = offset;
|
||||||
}
|
}
|
||||||
if (wallpaperWin.mWallpaperX != mLastWallpaperX) {
|
if (wallpaperWin.mWallpaperX != wpx) {
|
||||||
wallpaperWin.mWallpaperX = mLastWallpaperX;
|
wallpaperWin.mWallpaperX = wpx;
|
||||||
rawChanged = true;
|
rawChanged = true;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mLastWallpaperY >= 0) {
|
float wpy = mLastWallpaperY >= 0 ? mLastWallpaperY : 0.5f;
|
||||||
int availh = wallpaperWin.mFrame.bottom-wallpaperWin.mFrame.top-dh;
|
int availh = wallpaperWin.mFrame.bottom-wallpaperWin.mFrame.top-dh;
|
||||||
int offset = availh > 0 ? -(int)(availh*mLastWallpaperY+.5f) : 0;
|
offset = availh > 0 ? -(int)(availh*wpy+.5f) : 0;
|
||||||
if (wallpaperWin.mYOffset != offset) {
|
if (wallpaperWin.mYOffset != offset) {
|
||||||
if (DEBUG_WALLPAPER) Log.v(TAG, "Update wallpaper "
|
if (DEBUG_WALLPAPER) Log.v(TAG, "Update wallpaper "
|
||||||
+ wallpaperWin + " y: " + offset);
|
+ wallpaperWin + " y: " + offset);
|
||||||
changed = true;
|
changed = true;
|
||||||
wallpaperWin.mYOffset = offset;
|
wallpaperWin.mYOffset = offset;
|
||||||
}
|
}
|
||||||
if (wallpaperWin.mWallpaperY != mLastWallpaperY) {
|
if (wallpaperWin.mWallpaperY != wpy) {
|
||||||
wallpaperWin.mWallpaperY = mLastWallpaperY;
|
wallpaperWin.mWallpaperY = wpy;
|
||||||
rawChanged = true;
|
rawChanged = true;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rawChanged) {
|
if (rawChanged) {
|
||||||
@@ -1649,7 +1651,7 @@ public class WindowManagerService extends IWindowManager.Stub
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean updateWallpaperOffsetLocked(boolean sync) {
|
boolean updateWallpaperOffsetLocked(WindowState changingTarget, boolean sync) {
|
||||||
final int dw = mDisplay.getWidth();
|
final int dw = mDisplay.getWidth();
|
||||||
final int dh = mDisplay.getHeight();
|
final int dh = mDisplay.getHeight();
|
||||||
|
|
||||||
@@ -1657,22 +1659,31 @@ public class WindowManagerService extends IWindowManager.Stub
|
|||||||
|
|
||||||
WindowState target = mWallpaperTarget;
|
WindowState target = mWallpaperTarget;
|
||||||
if (target != null) {
|
if (target != null) {
|
||||||
mLastWallpaperX = target.mWallpaperX;
|
if (target.mWallpaperX >= 0) {
|
||||||
mLastWallpaperY = target.mWallpaperY;
|
mLastWallpaperX = target.mWallpaperX;
|
||||||
int curTokenIndex = mWallpaperTokens.size();
|
} else if (changingTarget.mWallpaperX >= 0) {
|
||||||
while (curTokenIndex > 0) {
|
mLastWallpaperX = changingTarget.mWallpaperX;
|
||||||
curTokenIndex--;
|
}
|
||||||
WindowToken token = mWallpaperTokens.get(curTokenIndex);
|
if (target.mWallpaperY >= 0) {
|
||||||
int curWallpaperIndex = token.windows.size();
|
mLastWallpaperY = target.mWallpaperY;
|
||||||
while (curWallpaperIndex > 0) {
|
} else if (changingTarget.mWallpaperY >= 0) {
|
||||||
curWallpaperIndex--;
|
mLastWallpaperY = changingTarget.mWallpaperY;
|
||||||
WindowState wallpaper = token.windows.get(curWallpaperIndex);
|
}
|
||||||
if (updateWallpaperOffsetLocked(wallpaper, dw, dh, sync)) {
|
}
|
||||||
wallpaper.computeShownFrameLocked();
|
|
||||||
changed = true;
|
int curTokenIndex = mWallpaperTokens.size();
|
||||||
// We only want to be synchronous with one wallpaper.
|
while (curTokenIndex > 0) {
|
||||||
sync = false;
|
curTokenIndex--;
|
||||||
}
|
WindowToken token = mWallpaperTokens.get(curTokenIndex);
|
||||||
|
int curWallpaperIndex = token.windows.size();
|
||||||
|
while (curWallpaperIndex > 0) {
|
||||||
|
curWallpaperIndex--;
|
||||||
|
WindowState wallpaper = token.windows.get(curWallpaperIndex);
|
||||||
|
if (updateWallpaperOffsetLocked(wallpaper, dw, dh, sync)) {
|
||||||
|
wallpaper.computeShownFrameLocked();
|
||||||
|
changed = true;
|
||||||
|
// We only want to be synchronous with one wallpaper.
|
||||||
|
sync = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2179,11 +2190,8 @@ public class WindowManagerService extends IWindowManager.Stub
|
|||||||
if (window.mWallpaperX != x || window.mWallpaperY != y) {
|
if (window.mWallpaperX != x || window.mWallpaperY != y) {
|
||||||
window.mWallpaperX = x;
|
window.mWallpaperX = x;
|
||||||
window.mWallpaperY = y;
|
window.mWallpaperY = y;
|
||||||
|
if (updateWallpaperOffsetLocked(window, true)) {
|
||||||
if (mWallpaperTarget == window) {
|
performLayoutAndPlaceSurfacesLocked();
|
||||||
if (updateWallpaperOffsetLocked(true)) {
|
|
||||||
performLayoutAndPlaceSurfacesLocked();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user