Merge "Improve Launcher drag performance." into ics-mr1

This commit is contained in:
Chet Haase
2011-11-04 11:01:25 -07:00
committed by Android (Google) Code Review

View File

@@ -218,6 +218,7 @@ public final class ViewRootImpl extends Handler implements ViewParent,
boolean mNewSurfaceNeeded;
boolean mHasHadWindowFocus;
boolean mLastWasImTarget;
InputEventMessage mPendingInputEvents = null;
boolean mWindowAttributesChanged = false;
int mWindowAttributesChangesFlag = 0;
@@ -832,10 +833,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");
@@ -2336,6 +2351,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_VIEW_TEXT = 1023;
public final static int PROCESS_INPUT_EVENTS = 1024;
@Override
public String getMessageName(Message message) {
@@ -2388,7 +2404,9 @@ public final class ViewRootImpl extends Handler implements ViewParent,
return "DO_FIND_ACCESSIBLITY_NODE_INFO_BY_VIEW_ID";
case DO_FIND_ACCESSIBLITY_NODE_INFO_BY_VIEW_TEXT:
return "DO_FIND_ACCESSIBLITY_NODE_INFO_BY_VIEW_TEXT";
case PROCESS_INPUT_EVENTS:
return "PROCESS_INPUT_EVENTS";
}
return super.getMessageName(message);
}
@@ -2447,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;
@@ -3744,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;
@@ -3762,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);
}
@@ -3786,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) {
@@ -3804,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) {