diff options
| author | Chet Haase <chet@google.com> | 2011-11-05 12:01:51 -0700 |
|---|---|---|
| committer | Chet Haase <chet@google.com> | 2011-11-05 12:01:51 -0700 |
| commit | 2a639347aebb56febdef21a78c70fb0433adc1e5 (patch) | |
| tree | 26c26baa7152c55eb7041740471bba9833cf4ffc /core/java/android/view/ViewRootImpl.java | |
| parent | 3f3e8f0c371eff9d9454779e42fb02db67d91a9f (diff) | |
| parent | aa4d2f69bdc2acbed04b7662a55308b72f108dff (diff) | |
| download | frameworks_base-2a639347aebb56febdef21a78c70fb0433adc1e5.zip frameworks_base-2a639347aebb56febdef21a78c70fb0433adc1e5.tar.gz frameworks_base-2a639347aebb56febdef21a78c70fb0433adc1e5.tar.bz2 | |
resolved conflicts for merge of aa4d2f69 to master
Change-Id: Iadb63ecf52d8bd2911276fa3db55a43c9c378620
Diffstat (limited to 'core/java/android/view/ViewRootImpl.java')
| -rw-r--r-- | core/java/android/view/ViewRootImpl.java | 104 |
1 files changed, 98 insertions, 6 deletions
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 231d926..ec25b64 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -219,6 +219,7 @@ public final class ViewRootImpl extends Handler implements ViewParent, boolean mNewSurfaceNeeded; boolean mHasHadWindowFocus; boolean mLastWasImTarget; + InputEventMessage mPendingInputEvents = null; boolean mWindowAttributesChanged = false; int mWindowAttributesChangesFlag = 0; @@ -833,10 +834,24 @@ public final class ViewRootImpl extends Handler implements ViewParent, } } + private void processInputEvents(boolean outOfOrder) { + while (mPendingInputEvents != null) { + handleMessage(mPendingInputEvents.mMessage); + InputEventMessage tmpMessage = mPendingInputEvents; + mPendingInputEvents = mPendingInputEvents.mNext; + tmpMessage.recycle(); + if (outOfOrder) { + removeMessages(PROCESS_INPUT_EVENTS); + } + } + } + private void performTraversals() { // cache mView since it is used so much below... final View host = mView; + processInputEvents(true); + if (DBG) { System.out.println("======================================"); System.out.println("performTraversals"); @@ -2337,6 +2352,7 @@ public final class ViewRootImpl extends Handler implements ViewParent, public final static int DO_FIND_ACCESSIBLITY_NODE_INFO_BY_ACCESSIBILITY_ID = 1021; public final static int DO_FIND_ACCESSIBLITY_NODE_INFO_BY_VIEW_ID = 1022; public final static int DO_FIND_ACCESSIBLITY_NODE_INFO_BY_TEXT = 1023; + public final static int PROCESS_INPUT_EVENTS = 1024; @Override public String getMessageName(Message message) { @@ -2389,7 +2405,8 @@ public final class ViewRootImpl extends Handler implements ViewParent, return "DO_FIND_ACCESSIBLITY_NODE_INFO_BY_VIEW_ID"; case DO_FIND_ACCESSIBLITY_NODE_INFO_BY_TEXT: return "DO_FIND_ACCESSIBLITY_NODE_INFO_BY_TEXT"; - + case PROCESS_INPUT_EVENTS: + return "PROCESS_INPUT_EVENTS"; } return super.getMessageName(message); } @@ -2448,6 +2465,9 @@ public final class ViewRootImpl extends Handler implements ViewParent, case DISPATCH_GENERIC_MOTION: deliverGenericMotionEvent((MotionEvent) msg.obj, msg.arg1 != 0); break; + case PROCESS_INPUT_EVENTS: + processInputEvents(false); + break; case DISPATCH_APP_VISIBILITY: handleAppVisibility(msg.arg1 != 0); break; @@ -3745,7 +3765,7 @@ public final class ViewRootImpl extends Handler implements ViewParent, msg.obj = ri; sendMessage(msg); } - + private long mInputEventReceiveTimeNanos; private long mInputEventDeliverTimeNanos; private long mInputEventDeliverPostImeTimeNanos; @@ -3763,6 +3783,78 @@ public final class ViewRootImpl extends Handler implements ViewParent, } }; + /** + * Utility class used to queue up input events which are then handled during + * performTraversals(). Doing it this way allows us to ensure that we are up to date with + * all input events just prior to drawing, instead of placing those events on the regular + * handler queue, potentially behind a drawing event. + */ + static class InputEventMessage { + Message mMessage; + InputEventMessage mNext; + + private static final Object sPoolSync = new Object(); + private static InputEventMessage sPool; + private static int sPoolSize = 0; + + private static final int MAX_POOL_SIZE = 10; + + private InputEventMessage(Message m) { + mMessage = m; + mNext = null; + } + + /** + * Return a new Message instance from the global pool. Allows us to + * avoid allocating new objects in many cases. + */ + public static InputEventMessage obtain(Message msg) { + synchronized (sPoolSync) { + if (sPool != null) { + InputEventMessage m = sPool; + sPool = m.mNext; + m.mNext = null; + sPoolSize--; + m.mMessage = msg; + return m; + } + } + return new InputEventMessage(msg); + } + + /** + * Return the message to the pool. + */ + public void recycle() { + mMessage.recycle(); + synchronized (sPoolSync) { + if (sPoolSize < MAX_POOL_SIZE) { + mNext = sPool; + sPool = this; + sPoolSize++; + } + } + + } + } + + /** + * Place the input event message at the end of the current pending list + */ + private void enqueueInputEvent(Message msg, long when) { + InputEventMessage inputMessage = InputEventMessage.obtain(msg); + if (mPendingInputEvents == null) { + mPendingInputEvents = inputMessage; + } else { + InputEventMessage currMessage = mPendingInputEvents; + while (currMessage.mNext != null) { + currMessage = currMessage.mNext; + } + currMessage.mNext = inputMessage; + } + sendEmptyMessageAtTime(PROCESS_INPUT_EVENTS, when); + } + public void dispatchKey(KeyEvent event) { dispatchKey(event, false); } @@ -3787,7 +3879,7 @@ public final class ViewRootImpl extends Handler implements ViewParent, if (LOCAL_LOGV) Log.v( TAG, "sending key " + event + " to " + mView); - sendMessageAtTime(msg, event.getEventTime()); + enqueueInputEvent(msg, event.getEventTime()); } private void dispatchMotion(MotionEvent event, boolean sendDone) { @@ -3805,21 +3897,21 @@ public final class ViewRootImpl extends Handler implements ViewParent, Message msg = obtainMessage(DISPATCH_POINTER); msg.obj = event; msg.arg1 = sendDone ? 1 : 0; - sendMessageAtTime(msg, event.getEventTime()); + enqueueInputEvent(msg, event.getEventTime()); } private void dispatchTrackball(MotionEvent event, boolean sendDone) { Message msg = obtainMessage(DISPATCH_TRACKBALL); msg.obj = event; msg.arg1 = sendDone ? 1 : 0; - sendMessageAtTime(msg, event.getEventTime()); + enqueueInputEvent(msg, event.getEventTime()); } private void dispatchGenericMotion(MotionEvent event, boolean sendDone) { Message msg = obtainMessage(DISPATCH_GENERIC_MOTION); msg.obj = event; msg.arg1 = sendDone ? 1 : 0; - sendMessageAtTime(msg, event.getEventTime()); + enqueueInputEvent(msg, event.getEventTime()); } public void dispatchAppVisibility(boolean visible) { |
