diff options
author | Jeff Brown <jeffbrown@google.com> | 2011-12-01 14:01:49 -0800 |
---|---|---|
committer | Jeff Brown <jeffbrown@google.com> | 2011-12-01 21:04:47 -0800 |
commit | 32cbc3855c2a971aa5a801fd339fb6a37db91a1a (patch) | |
tree | 40d3fcf12181eb6d50fac3a3734ecf3c9f4953ec /policy | |
parent | db918cf171afd3d4b3c22aab6dd3403d1dec94de (diff) | |
download | frameworks_base-32cbc3855c2a971aa5a801fd339fb6a37db91a1a.zip frameworks_base-32cbc3855c2a971aa5a801fd339fb6a37db91a1a.tar.gz frameworks_base-32cbc3855c2a971aa5a801fd339fb6a37db91a1a.tar.bz2 |
Refactor InputQueue as InputEventReceiver.
This change simplifies the code associated with receiving input
events from input channels and makes it more robust. It also
does a better job of ensuring that input events are properly
recycled (sometimes we dropped them on the floor).
This change also adds a sequence number to all events, which is
handy for determining whether we are looking at the same event or a
new one, particularly when events are recycled.
Change-Id: I4ebd88f73b5f77f3e150778cd550e7f91956aac2
Diffstat (limited to 'policy')
-rwxr-xr-x | policy/src/com/android/internal/policy/impl/PhoneWindowManager.java | 53 |
1 files changed, 36 insertions, 17 deletions
diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java index 08cef01..e6b86fc 100755 --- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java +++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java @@ -45,6 +45,7 @@ import android.os.Handler; import android.os.IBinder; import android.os.IRemoteCallback; import android.os.LocalPowerManager; +import android.os.Looper; import android.os.Message; import android.os.Messenger; import android.os.PowerManager; @@ -75,8 +76,7 @@ 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.InputEventReceiver; import android.view.KeyCharacterMap; import android.view.KeyEvent; import android.view.MotionEvent; @@ -345,10 +345,13 @@ public class PhoneWindowManager implements WindowManagerPolicy { WindowState mFocusedWindow; IApplicationToken mFocusedApp; - private final InputHandler mPointerLocationInputHandler = new InputHandler() { + final class PointerLocationInputEventReceiver extends InputEventReceiver { + public PointerLocationInputEventReceiver(InputChannel inputChannel, Looper looper) { + super(inputChannel, looper); + } + @Override - public void handleInputEvent(InputEvent event, - InputQueue.FinishedCallback finishedCallback) { + public void onInputEvent(InputEvent event) { boolean handled = false; try { if (event instanceof MotionEvent @@ -362,11 +365,12 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } } finally { - finishedCallback.finished(handled); + finishInputEvent(event, handled); } } - }; - + } + PointerLocationInputEventReceiver mPointerLocationInputEventReceiver; + // The current size of the screen; really; (ir)regardless of whether the status // bar can be hidden or not int mUnrestrictedScreenLeft, mUnrestrictedScreenTop; @@ -1003,9 +1007,10 @@ public class PhoneWindowManager implements WindowManagerPolicy { if (mPointerLocationInputChannel == null) { try { mPointerLocationInputChannel = - mWindowManager.monitorInput("PointerLocationView"); - InputQueue.registerInputChannel(mPointerLocationInputChannel, - mPointerLocationInputHandler, mHandler.getLooper().getQueue()); + mWindowManager.monitorInput("PointerLocationView"); + mPointerLocationInputEventReceiver = + new PointerLocationInputEventReceiver( + mPointerLocationInputChannel, mHandler.getLooper()); } catch (RemoteException ex) { Slog.e(TAG, "Could not set up input monitoring channel for PointerLocation.", ex); @@ -1013,8 +1018,11 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } if (removeView != null) { + if (mPointerLocationInputEventReceiver != null) { + mPointerLocationInputEventReceiver.dispose(); + mPointerLocationInputEventReceiver = null; + } if (mPointerLocationInputChannel != null) { - InputQueue.unregisterInputChannel(mPointerLocationInputChannel); mPointerLocationInputChannel.dispose(); mPointerLocationInputChannel = null; } @@ -1839,10 +1847,13 @@ 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 InputHandler() { + final class HideNavInputEventReceiver extends InputEventReceiver { + public HideNavInputEventReceiver(InputChannel inputChannel, Looper looper) { + super(inputChannel, looper); + } + @Override - public void handleInputEvent(InputEvent event, - InputQueue.FinishedCallback finishedCallback) { + public void onInputEvent(InputEvent event) { boolean handled = false; try { if (event instanceof MotionEvent @@ -1885,9 +1896,17 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } } finally { - finishedCallback.finished(handled); + finishInputEvent(event, handled); } } + } + final InputEventReceiver.Factory mHideNavInputEventReceiverFactory = + new InputEventReceiver.Factory() { + @Override + public InputEventReceiver createInputEventReceiver( + InputChannel inputChannel, Looper looper) { + return new HideNavInputEventReceiver(inputChannel, looper); + } }; @Override @@ -1951,7 +1970,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } else if (mHideNavFakeWindow == null) { mHideNavFakeWindow = mWindowManagerFuncs.addFakeWindow( - mHandler.getLooper(), mHideNavInputHandler, + mHandler.getLooper(), mHideNavInputEventReceiverFactory, "hidden nav", WindowManager.LayoutParams.TYPE_HIDDEN_NAV_CONSUMER, 0, false, false, true); } |