From 189ed23c1002054fdc06893e99d34a3617f24108 Mon Sep 17 00:00:00 2001 From: Dianne Hackborn Date: Tue, 29 Jun 2010 19:20:40 -0700 Subject: [PATCH] Implement default key handling for native code. The native code now maintains a list of all keys that may use default handling. If the app finishes one of these keys without handling it, the key will be passed back off to Java for default treatment. Change-Id: I6a842a0d728eeafa4de7142fae573f8c11099e18 --- include/ui/Input.h | 10 +++++- include/ui/InputTransport.h | 4 ++- libs/ui/Input.cpp | 64 +++++++++++++++++++++++++++++++++++++ 3 files changed, 76 insertions(+), 2 deletions(-) diff --git a/include/ui/Input.h b/include/ui/Input.h index 889078971..214f587c7 100644 --- a/include/ui/Input.h +++ b/include/ui/Input.h @@ -145,7 +145,7 @@ public: inline int32_t getDeviceId() const { return mDeviceId; } inline int32_t getNature() const { return mNature; } - + protected: void initialize(int32_t deviceId, int32_t nature); @@ -179,6 +179,14 @@ public: inline nsecs_t getEventTime() const { return mEventTime; } + // Return true if this event may have a default action implementation. + static bool hasDefaultAction(int32_t keyCode); + bool hasDefaultAction() const; + + // Return true if this event represents a system key. + static bool isSystemKey(int32_t keyCode); + bool isSystemKey() const; + void initialize( int32_t deviceId, int32_t nature, diff --git a/include/ui/InputTransport.h b/include/ui/InputTransport.h index 4e76051a9..2dfe2a866 100644 --- a/include/ui/InputTransport.h +++ b/include/ui/InputTransport.h @@ -339,12 +339,14 @@ public: explicit AInputQueue(const android::sp& channel); /* Destroys the consumer and releases its input channel. */ - ~AInputQueue(); + virtual ~AInputQueue(); inline android::InputConsumer& getConsumer() { return mConsumer; } android::status_t consume(android::InputEvent** event); + virtual void doDefaultKey(android::KeyEvent* keyEvent) = 0; + private: android::InputConsumer mConsumer; android::PreallocatedInputEventFactory mInputEventFactory; diff --git a/libs/ui/Input.cpp b/libs/ui/Input.cpp index 4121b5a43..a64251f15 100644 --- a/libs/ui/Input.cpp +++ b/libs/ui/Input.cpp @@ -20,6 +20,70 @@ void InputEvent::initialize(int32_t deviceId, int32_t nature) { // class KeyEvent +bool KeyEvent::hasDefaultAction(int32_t keyCode) { + switch (keyCode) { + case KEYCODE_HOME: + case KEYCODE_BACK: + case KEYCODE_CALL: + case KEYCODE_ENDCALL: + case KEYCODE_VOLUME_UP: + case KEYCODE_VOLUME_DOWN: + case KEYCODE_POWER: + case KEYCODE_CAMERA: + case KEYCODE_HEADSETHOOK: + case KEYCODE_MENU: + case KEYCODE_NOTIFICATION: + case KEYCODE_FOCUS: + case KEYCODE_SEARCH: + case KEYCODE_MEDIA_PLAY_PAUSE: + case KEYCODE_MEDIA_STOP: + case KEYCODE_MEDIA_NEXT: + case KEYCODE_MEDIA_PREVIOUS: + case KEYCODE_MEDIA_REWIND: + case KEYCODE_MEDIA_FAST_FORWARD: + case KEYCODE_MUTE: + return true; + } + + return false; +} + +bool KeyEvent::hasDefaultAction() const { + return hasDefaultAction(getKeyCode()); +} + +bool KeyEvent::isSystemKey(int32_t keyCode) { + switch (keyCode) { + case KEYCODE_MENU: + case KEYCODE_SOFT_RIGHT: + case KEYCODE_HOME: + case KEYCODE_BACK: + case KEYCODE_CALL: + case KEYCODE_ENDCALL: + case KEYCODE_VOLUME_UP: + case KEYCODE_VOLUME_DOWN: + case KEYCODE_MUTE: + case KEYCODE_POWER: + case KEYCODE_HEADSETHOOK: + case KEYCODE_MEDIA_PLAY_PAUSE: + case KEYCODE_MEDIA_STOP: + case KEYCODE_MEDIA_NEXT: + case KEYCODE_MEDIA_PREVIOUS: + case KEYCODE_MEDIA_REWIND: + case KEYCODE_MEDIA_FAST_FORWARD: + case KEYCODE_CAMERA: + case KEYCODE_FOCUS: + case KEYCODE_SEARCH: + return true; + } + + return false; +} + +bool KeyEvent::isSystemKey() const { + return isSystemKey(getKeyCode()); +} + void KeyEvent::initialize( int32_t deviceId, int32_t nature,