diff options
author | Jeff Brown <jeffbrown@google.com> | 2011-11-30 19:23:22 -0800 |
---|---|---|
committer | Jeff Brown <jeffbrown@google.com> | 2011-12-01 14:13:48 -0800 |
commit | 4952dfd16a0f839559ffa78f5016394caf85294f (patch) | |
tree | d79061d9e6ceb2671241a059fe6be9522c8bbb10 /policy | |
parent | 95db2b20d7bc0aaf00b1d4418124f5cf0a755d74 (diff) | |
download | frameworks_base-4952dfd16a0f839559ffa78f5016394caf85294f.zip frameworks_base-4952dfd16a0f839559ffa78f5016394caf85294f.tar.gz frameworks_base-4952dfd16a0f839559ffa78f5016394caf85294f.tar.bz2 |
Ensure input events are processed in-order in the application.
As it turns out, it used to be possible for there to be multiple
input events simultaneously in flight in an application. Although
it worked, it made it hard to reason about what was going on.
The problem was somewhat exacerbated by the introduction of a
queue of "InputEventMessage" objects as part of an earlier latency
optimization.
This change restores order from chaos and greatly simplifies the
invariants related to input event dispatch within the application.
Change-Id: I6de5fe61c1fe2ac3dd33edf770d949044df8a019
Diffstat (limited to 'policy')
-rwxr-xr-x | policy/src/com/android/internal/policy/impl/PhoneWindowManager.java | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java index 7684c34..08cef01 100755 --- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java +++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java @@ -61,7 +61,6 @@ import com.android.internal.app.ShutdownThread; import com.android.internal.policy.PolicyManager; import com.android.internal.statusbar.IStatusBarService; import com.android.internal.telephony.ITelephony; -import com.android.internal.view.BaseInputHandler; import com.android.internal.widget.PointerLocationView; import android.util.DisplayMetrics; @@ -75,6 +74,7 @@ import android.view.IApplicationToken; import android.view.IWindowManager; import android.view.InputChannel; import android.view.InputDevice; +import android.view.InputEvent; import android.view.InputQueue; import android.view.InputHandler; import android.view.KeyCharacterMap; @@ -345,15 +345,18 @@ public class PhoneWindowManager implements WindowManagerPolicy { WindowState mFocusedWindow; IApplicationToken mFocusedApp; - private final InputHandler mPointerLocationInputHandler = new BaseInputHandler() { + private final InputHandler mPointerLocationInputHandler = new InputHandler() { @Override - public void handleMotion(MotionEvent event, InputQueue.FinishedCallback finishedCallback) { + public void handleInputEvent(InputEvent event, + InputQueue.FinishedCallback finishedCallback) { boolean handled = false; try { - if ((event.getSource() & InputDevice.SOURCE_CLASS_POINTER) != 0) { + if (event instanceof MotionEvent + && (event.getSource() & InputDevice.SOURCE_CLASS_POINTER) != 0) { + final MotionEvent motionEvent = (MotionEvent)event; synchronized (mLock) { if (mPointerLocationView != null) { - mPointerLocationView.addPointerEvent(event); + mPointerLocationView.addPointerEvent(motionEvent); handled = true; } } @@ -1836,13 +1839,16 @@ public class PhoneWindowManager implements WindowManagerPolicy { * to determine when the nav bar should be shown and prevent applications from * receiving those touches. */ - final InputHandler mHideNavInputHandler = new BaseInputHandler() { + final InputHandler mHideNavInputHandler = new InputHandler() { @Override - public void handleMotion(MotionEvent event, InputQueue.FinishedCallback finishedCallback) { + public void handleInputEvent(InputEvent event, + InputQueue.FinishedCallback finishedCallback) { boolean handled = false; try { - if ((event.getSource() & InputDevice.SOURCE_CLASS_POINTER) != 0) { - if (event.getAction() == MotionEvent.ACTION_DOWN) { + if (event instanceof MotionEvent + && (event.getSource() & InputDevice.SOURCE_CLASS_POINTER) != 0) { + final MotionEvent motionEvent = (MotionEvent)event; + if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) { // When the user taps down, we re-show the nav bar. boolean changed = false; synchronized (mLock) { |