summaryrefslogtreecommitdiffstats
path: root/core/java/android/view/ViewRoot.java
diff options
context:
space:
mode:
authorThe Android Open Source Project <initial-contribution@android.com>2009-03-13 13:04:22 -0700
committerThe Android Open Source Project <initial-contribution@android.com>2009-03-13 13:04:22 -0700
commitba87e3e6c985e7175152993b5efcc7dd2f0e1c93 (patch)
treeee35f76532767dc29411a8738a434d1d88d330f2 /core/java/android/view/ViewRoot.java
parentc39a6e0c51e182338deb8b63d07933b585134929 (diff)
downloadframeworks_base-ba87e3e6c985e7175152993b5efcc7dd2f0e1c93.zip
frameworks_base-ba87e3e6c985e7175152993b5efcc7dd2f0e1c93.tar.gz
frameworks_base-ba87e3e6c985e7175152993b5efcc7dd2f0e1c93.tar.bz2
auto import from //branches/cupcake_rel/...@138607
Diffstat (limited to 'core/java/android/view/ViewRoot.java')
-rw-r--r--core/java/android/view/ViewRoot.java71
1 files changed, 68 insertions, 3 deletions
diff --git a/core/java/android/view/ViewRoot.java b/core/java/android/view/ViewRoot.java
index 9b13d38..dd2b154 100644
--- a/core/java/android/view/ViewRoot.java
+++ b/core/java/android/view/ViewRoot.java
@@ -219,7 +219,7 @@ public final class ViewRoot extends Handler implements ViewParent,
mVisRect = new Rect();
mVisPoint = new Point();
mWinFrame = new Rect();
- mWindow = new W(this);
+ mWindow = new W(this, context);
mInputMethodCallback = new InputMethodCallback(this);
mViewVisibility = View.GONE;
mTransparentRegion = new Region();
@@ -2453,11 +2453,71 @@ public final class ViewRoot extends Handler implements ViewParent,
}
}
+ static class EventCompletion extends Handler {
+ final IWindow mWindow;
+ final KeyEvent mKeyEvent;
+ final boolean mIsPointer;
+ final MotionEvent mMotionEvent;
+
+ EventCompletion(Looper looper, IWindow window, KeyEvent key,
+ boolean isPointer, MotionEvent motion) {
+ super(looper);
+ mWindow = window;
+ mKeyEvent = key;
+ mIsPointer = isPointer;
+ mMotionEvent = motion;
+ sendEmptyMessage(0);
+ }
+
+ @Override
+ public void handleMessage(Message msg) {
+ if (mKeyEvent != null) {
+ try {
+ sWindowSession.finishKey(mWindow);
+ } catch (RemoteException e) {
+ }
+ } else if (mIsPointer) {
+ boolean didFinish;
+ MotionEvent event = mMotionEvent;
+ if (event == null) {
+ try {
+ event = sWindowSession.getPendingPointerMove(mWindow);
+ } catch (RemoteException e) {
+ }
+ didFinish = true;
+ } else {
+ didFinish = event.getAction() == MotionEvent.ACTION_OUTSIDE;
+ }
+ if (!didFinish) {
+ try {
+ sWindowSession.finishKey(mWindow);
+ } catch (RemoteException e) {
+ }
+ }
+ } else {
+ MotionEvent event = mMotionEvent;
+ if (event == null) {
+ try {
+ event = sWindowSession.getPendingTrackballMove(mWindow);
+ } catch (RemoteException e) {
+ }
+ } else {
+ try {
+ sWindowSession.finishKey(mWindow);
+ } catch (RemoteException e) {
+ }
+ }
+ }
+ }
+ }
+
static class W extends IWindow.Stub {
- private WeakReference<ViewRoot> mViewRoot;
+ private final WeakReference<ViewRoot> mViewRoot;
+ private final Looper mMainLooper;
- public W(ViewRoot viewRoot) {
+ public W(ViewRoot viewRoot, Context context) {
mViewRoot = new WeakReference<ViewRoot>(viewRoot);
+ mMainLooper = context.getMainLooper();
}
public void resized(int w, int h, Rect coveredInsets,
@@ -2475,6 +2535,7 @@ public final class ViewRoot extends Handler implements ViewParent,
viewRoot.dispatchKey(event);
} else {
Log.w("ViewRoot.W", "Key event " + event + " but no ViewRoot available!");
+ new EventCompletion(mMainLooper, this, event, false, null);
}
}
@@ -2482,6 +2543,8 @@ public final class ViewRoot extends Handler implements ViewParent,
final ViewRoot viewRoot = mViewRoot.get();
if (viewRoot != null) {
viewRoot.dispatchPointer(event, eventTime);
+ } else {
+ new EventCompletion(mMainLooper, this, null, true, event);
}
}
@@ -2489,6 +2552,8 @@ public final class ViewRoot extends Handler implements ViewParent,
final ViewRoot viewRoot = mViewRoot.get();
if (viewRoot != null) {
viewRoot.dispatchTrackball(event, eventTime);
+ } else {
+ new EventCompletion(mMainLooper, this, null, false, event);
}
}