am 48515f49: Merge change I0de7979b into eclair

Merge commit '48515f495b29c01b473579825d5ba5e690ff5db7' into eclair-mr2

* commit '48515f495b29c01b473579825d5ba5e690ff5db7':
  Fix issue #2170897: wallpaper touch-up event not seen when exiting lock screen
This commit is contained in:
Dianne Hackborn
2009-11-11 09:58:38 -08:00
committed by Android Git Automerger
3 changed files with 62 additions and 13 deletions

View File

@@ -16,11 +16,14 @@
package android.service.wallpaper; package android.service.wallpaper;
import android.view.MotionEvent;
/** /**
* @hide * @hide
*/ */
oneway interface IWallpaperEngine { oneway interface IWallpaperEngine {
void setDesiredSize(int width, int height); void setDesiredSize(int width, int height);
void setVisibility(boolean visible); void setVisibility(boolean visible);
void dispatchPointer(in MotionEvent event);
void destroy(); void destroy();
} }

View File

@@ -746,6 +746,12 @@ public abstract class WallpaperService extends Service {
mCaller.sendMessage(msg); mCaller.sendMessage(msg);
} }
public void dispatchPointer(MotionEvent event) {
if (mEngine != null) {
mEngine.mWindow.onDispatchPointer(event, event.getEventTime(), false);
}
}
public void destroy() { public void destroy() {
Message msg = mCaller.obtainMessage(DO_DETACH); Message msg = mCaller.obtainMessage(DO_DETACH);
mCaller.sendMessage(msg); mCaller.sendMessage(msg);
@@ -805,6 +811,7 @@ public abstract class WallpaperService extends Service {
mEngine.mPendingMove = null; mEngine.mPendingMove = null;
} }
} }
if (DEBUG) Log.v(TAG, "Delivering touch event: " + ev);
mEngine.onTouchEvent(ev); mEngine.onTouchEvent(ev);
ev.recycle(); ev.recycle();
} break; } break;

View File

@@ -435,6 +435,7 @@ public class WindowManagerService extends IWindowManager.Stub
float mLastWallpaperY = -1; float mLastWallpaperY = -1;
float mLastWallpaperXStep = -1; float mLastWallpaperXStep = -1;
float mLastWallpaperYStep = -1; float mLastWallpaperYStep = -1;
boolean mSendingPointersToWallpaper = false;
// 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
// changing its scroll position. // changing its scroll position.
WindowState mWaitingOnWallpaper; WindowState mWaitingOnWallpaper;
@@ -1749,8 +1750,20 @@ public class WindowManagerService extends IWindowManager.Stub
} }
try { try {
MotionEvent ev = MotionEvent.obtainNoHistory(pointer); MotionEvent ev = MotionEvent.obtainNoHistory(pointer);
if (srcWin != null) {
ev.offsetLocation(srcWin.mFrame.left-wallpaper.mFrame.left, ev.offsetLocation(srcWin.mFrame.left-wallpaper.mFrame.left,
srcWin.mFrame.top-wallpaper.mFrame.top); srcWin.mFrame.top-wallpaper.mFrame.top);
} else {
ev.offsetLocation(-wallpaper.mFrame.left, -wallpaper.mFrame.top);
}
switch (pointer.getAction()) {
case MotionEvent.ACTION_DOWN:
mSendingPointersToWallpaper = true;
break;
case MotionEvent.ACTION_UP:
mSendingPointersToWallpaper = false;
break;
}
wallpaper.mClient.dispatchPointer(ev, eventTime, false); wallpaper.mClient.dispatchPointer(ev, eventTime, false);
} catch (RemoteException e) { } catch (RemoteException e) {
Log.w(TAG, "Failure sending pointer to wallpaper", e); Log.w(TAG, "Failure sending pointer to wallpaper", e);
@@ -4836,6 +4849,12 @@ public class WindowManagerService extends IWindowManager.Stub
if (action != MotionEvent.ACTION_MOVE) { if (action != MotionEvent.ACTION_MOVE) {
Log.w(TAG, "No window to dispatch pointer action " + ev.getAction()); Log.w(TAG, "No window to dispatch pointer action " + ev.getAction());
} }
synchronized (mWindowMap) {
if (mSendingPointersToWallpaper) {
Log.i(TAG, "Sending skipped pointer to wallpaper!");
sendPointerToWallpaperLocked(null, ev, ev.getEventTime());
}
}
if (qev != null) { if (qev != null) {
mQueue.recycleEvent(qev); mQueue.recycleEvent(qev);
} }
@@ -4843,6 +4862,12 @@ public class WindowManagerService extends IWindowManager.Stub
return INJECT_FAILED; return INJECT_FAILED;
} }
if (targetObj == mKeyWaiter.CONSUMED_EVENT_TOKEN) { if (targetObj == mKeyWaiter.CONSUMED_EVENT_TOKEN) {
synchronized (mWindowMap) {
if (mSendingPointersToWallpaper) {
Log.i(TAG, "Sending skipped pointer to wallpaper!");
sendPointerToWallpaperLocked(null, ev, ev.getEventTime());
}
}
if (qev != null) { if (qev != null) {
mQueue.recycleEvent(qev); mQueue.recycleEvent(qev);
} }
@@ -4963,6 +4988,19 @@ public class WindowManagerService extends IWindowManager.Stub
} }
synchronized(mWindowMap) { synchronized(mWindowMap) {
if (!target.isVisibleLw()) {
// During this motion dispatch, the target window has become
// invisible.
if (mSendingPointersToWallpaper) {
sendPointerToWallpaperLocked(null, ev, eventTime);
}
if (qev != null) {
mQueue.recycleEvent(qev);
}
ev.recycle();
return INJECT_SUCCEEDED;
}
if (qev != null && action == MotionEvent.ACTION_MOVE) { if (qev != null && action == MotionEvent.ACTION_MOVE) {
mKeyWaiter.bindTargetWindowLocked(target, mKeyWaiter.bindTargetWindowLocked(target,
KeyWaiter.RETURN_PENDING_POINTER, qev); KeyWaiter.RETURN_PENDING_POINTER, qev);
@@ -4987,15 +5025,16 @@ public class WindowManagerService extends IWindowManager.Stub
mKeyWaiter.mOutsideTouchTargets = null; mKeyWaiter.mOutsideTouchTargets = null;
} }
} }
final Rect frame = target.mFrame;
ev.offsetLocation(-(float)frame.left, -(float)frame.top);
mKeyWaiter.bindTargetWindowLocked(target);
// If we are on top of the wallpaper, then the wallpaper also // If we are on top of the wallpaper, then the wallpaper also
// gets to see this movement. // gets to see this movement.
if (mWallpaperTarget == target) { if (mWallpaperTarget == target || mSendingPointersToWallpaper) {
sendPointerToWallpaperLocked(target, ev, eventTime); sendPointerToWallpaperLocked(null, ev, eventTime);
} }
final Rect frame = target.mFrame;
ev.offsetLocation(-(float)frame.left, -(float)frame.top);
mKeyWaiter.bindTargetWindowLocked(target);
} }
} }
@@ -5918,15 +5957,15 @@ public class WindowManagerService extends IWindowManager.Stub
res.offsetLocation(-win.mFrame.left, -win.mFrame.top); res.offsetLocation(-win.mFrame.left, -win.mFrame.top);
} }
} }
}
if (res != null && returnWhat == RETURN_PENDING_POINTER) { if (res != null && returnWhat == RETURN_PENDING_POINTER) {
synchronized (mWindowMap) { synchronized (mWindowMap) {
if (mWallpaperTarget == win) { if (mWallpaperTarget == win || mSendingPointersToWallpaper) {
sendPointerToWallpaperLocked(win, res, res.getEventTime()); sendPointerToWallpaperLocked(win, res, res.getEventTime());
} }
} }
} }
}
return res; return res;
} }