summaryrefslogtreecommitdiffstats
path: root/core/java/android/view/ViewRootImpl.java
diff options
context:
space:
mode:
authorChet Haase <chet@google.com>2011-11-05 12:01:51 -0700
committerChet Haase <chet@google.com>2011-11-05 12:01:51 -0700
commit2a639347aebb56febdef21a78c70fb0433adc1e5 (patch)
tree26c26baa7152c55eb7041740471bba9833cf4ffc /core/java/android/view/ViewRootImpl.java
parent3f3e8f0c371eff9d9454779e42fb02db67d91a9f (diff)
parentaa4d2f69bdc2acbed04b7662a55308b72f108dff (diff)
downloadframeworks_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.java104
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) {