diff options
| author | The Android Open Source Project <initial-contribution@android.com> | 2009-03-13 13:04:22 -0700 | 
|---|---|---|
| committer | The Android Open Source Project <initial-contribution@android.com> | 2009-03-13 13:04:22 -0700 | 
| commit | ba87e3e6c985e7175152993b5efcc7dd2f0e1c93 (patch) | |
| tree | ee35f76532767dc29411a8738a434d1d88d330f2 /core/java/android/view/ViewRoot.java | |
| parent | c39a6e0c51e182338deb8b63d07933b585134929 (diff) | |
| download | frameworks_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.java | 71 | 
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);              }          } | 
