diff --git a/include/ui/EventHub.h b/include/ui/EventHub.h index d6b09dc01..d077d0e42 100644 --- a/include/ui/EventHub.h +++ b/include/ui/EventHub.h @@ -181,6 +181,8 @@ public: */ virtual bool markSupportedKeyCodes(int32_t deviceId, size_t numCodes, const int32_t* keyCodes, uint8_t* outFlags) const = 0; + + virtual void dump(String8& dump) = 0; }; class EventHub : public EventHubInterface @@ -211,6 +213,8 @@ public: virtual bool getEvent(RawEvent* outEvent); + virtual void dump(String8& dump); + protected: virtual ~EventHub(); @@ -239,8 +243,8 @@ private: ~device_t(); }; - device_t* getDevice(int32_t deviceId) const; - bool hasKeycode(device_t* device, int keycode) const; + device_t* getDeviceLocked(int32_t deviceId) const; + bool hasKeycodeLocked(device_t* device, int keycode) const; int32_t getScanCodeStateLocked(device_t* device, int32_t scanCode) const; int32_t getKeyCodeStateLocked(device_t* device, int32_t keyCode) const; diff --git a/libs/ui/EventHub.cpp b/libs/ui/EventHub.cpp index 1d38b4ba8..094096e3e 100644 --- a/libs/ui/EventHub.cpp +++ b/libs/ui/EventHub.cpp @@ -73,6 +73,10 @@ #define ABS_MT_POSITION_Y 0x36 /* Center Y ellipse position */ #endif +#define INDENT " " +#define INDENT2 " " +#define INDENT3 " " + namespace android { static const char *WAKE_LOCK_ID = "KeyEvents"; @@ -84,6 +88,10 @@ static inline int max(int v1, int v2) return (v1 > v2) ? v1 : v2; } +static inline const char* toString(bool value) { + return value ? "true" : "false"; +} + EventHub::device_t::device_t(int32_t _id, const char* _path, const char* name) : id(_id), path(_path), name(name), classes(0) , keyBitmask(NULL), layoutMap(new KeyLayoutMap()), fd(-1), next(NULL) { @@ -124,7 +132,7 @@ status_t EventHub::errorCheck() const String8 EventHub::getDeviceName(int32_t deviceId) const { AutoMutex _l(mLock); - device_t* device = getDevice(deviceId); + device_t* device = getDeviceLocked(deviceId); if (device == NULL) return String8(); return device->name; } @@ -132,7 +140,7 @@ String8 EventHub::getDeviceName(int32_t deviceId) const uint32_t EventHub::getDeviceClasses(int32_t deviceId) const { AutoMutex _l(mLock); - device_t* device = getDevice(deviceId); + device_t* device = getDeviceLocked(deviceId); if (device == NULL) return 0; return device->classes; } @@ -142,7 +150,7 @@ status_t EventHub::getAbsoluteAxisInfo(int32_t deviceId, int axis, outAxisInfo->clear(); AutoMutex _l(mLock); - device_t* device = getDevice(deviceId); + device_t* device = getDeviceLocked(deviceId); if (device == NULL) return -1; struct input_absinfo info; @@ -167,7 +175,7 @@ int32_t EventHub::getScanCodeState(int32_t deviceId, int32_t scanCode) const { if (scanCode >= 0 && scanCode <= KEY_MAX) { AutoMutex _l(mLock); - device_t* device = getDevice(deviceId); + device_t* device = getDeviceLocked(deviceId); if (device != NULL) { return getScanCodeStateLocked(device, scanCode); } @@ -188,7 +196,7 @@ int32_t EventHub::getScanCodeStateLocked(device_t* device, int32_t scanCode) con int32_t EventHub::getKeyCodeState(int32_t deviceId, int32_t keyCode) const { AutoMutex _l(mLock); - device_t* device = getDevice(deviceId); + device_t* device = getDeviceLocked(deviceId); if (device != NULL) { return getKeyCodeStateLocked(device, keyCode); } @@ -225,7 +233,7 @@ int32_t EventHub::getSwitchState(int32_t deviceId, int32_t sw) const { if (sw >= 0 && sw <= SW_MAX) { AutoMutex _l(mLock); - device_t* device = getDevice(deviceId); + device_t* device = getDeviceLocked(deviceId); if (device != NULL) { return getSwitchStateLocked(device, sw); } @@ -248,7 +256,7 @@ bool EventHub::markSupportedKeyCodes(int32_t deviceId, size_t numCodes, const int32_t* keyCodes, uint8_t* outFlags) const { AutoMutex _l(mLock); - device_t* device = getDevice(deviceId); + device_t* device = getDeviceLocked(deviceId); if (device != NULL) { return markSupportedKeyCodesLocked(device, numCodes, keyCodes, outFlags); } @@ -284,7 +292,7 @@ status_t EventHub::scancodeToKeycode(int32_t deviceId, int scancode, int32_t* outKeycode, uint32_t* outFlags) const { AutoMutex _l(mLock); - device_t* device = getDevice(deviceId); + device_t* device = getDeviceLocked(deviceId); if (device != NULL && device->layoutMap != NULL) { status_t err = device->layoutMap->map(scancode, outKeycode, outFlags); @@ -294,7 +302,7 @@ status_t EventHub::scancodeToKeycode(int32_t deviceId, int scancode, } if (mHaveFirstKeyboard) { - device = getDevice(mFirstKeyboardId); + device = getDeviceLocked(mFirstKeyboardId); if (device != NULL && device->layoutMap != NULL) { status_t err = device->layoutMap->map(scancode, outKeycode, outFlags); @@ -311,11 +319,13 @@ status_t EventHub::scancodeToKeycode(int32_t deviceId, int scancode, void EventHub::addExcludedDevice(const char* deviceName) { + AutoMutex _l(mLock); + String8 name(deviceName); mExcludedDevices.push_back(name); } -EventHub::device_t* EventHub::getDevice(int32_t deviceId) const +EventHub::device_t* EventHub::getDeviceLocked(int32_t deviceId) const { if (deviceId == 0) deviceId = mFirstKeyboardId; int32_t id = deviceId & ID_MASK; @@ -782,22 +792,22 @@ int EventHub::open_device(const char *deviceName) property_set(propName, name); // 'Q' key support = cheap test of whether this is an alpha-capable kbd - if (hasKeycode(device, AKEYCODE_Q)) { + if (hasKeycodeLocked(device, AKEYCODE_Q)) { device->classes |= INPUT_DEVICE_CLASS_ALPHAKEY; } // See if this device has a DPAD. - if (hasKeycode(device, AKEYCODE_DPAD_UP) && - hasKeycode(device, AKEYCODE_DPAD_DOWN) && - hasKeycode(device, AKEYCODE_DPAD_LEFT) && - hasKeycode(device, AKEYCODE_DPAD_RIGHT) && - hasKeycode(device, AKEYCODE_DPAD_CENTER)) { + if (hasKeycodeLocked(device, AKEYCODE_DPAD_UP) && + hasKeycodeLocked(device, AKEYCODE_DPAD_DOWN) && + hasKeycodeLocked(device, AKEYCODE_DPAD_LEFT) && + hasKeycodeLocked(device, AKEYCODE_DPAD_RIGHT) && + hasKeycodeLocked(device, AKEYCODE_DPAD_CENTER)) { device->classes |= INPUT_DEVICE_CLASS_DPAD; } // See if this device has a gamepad. for (size_t i = 0; i < sizeof(GAMEPAD_KEYCODES); i++) { - if (hasKeycode(device, GAMEPAD_KEYCODES[i])) { + if (hasKeycodeLocked(device, GAMEPAD_KEYCODES[i])) { device->classes |= INPUT_DEVICE_CLASS_GAMEPAD; break; } @@ -830,7 +840,7 @@ int EventHub::open_device(const char *deviceName) return 0; } -bool EventHub::hasKeycode(device_t* device, int keycode) const +bool EventHub::hasKeycodeLocked(device_t* device, int keycode) const { if (device->keyBitmask == NULL || device->layoutMap == NULL) { return false; @@ -972,4 +982,32 @@ int EventHub::scan_dir(const char *dirname) return 0; } +void EventHub::dump(String8& dump) { + dump.append("Event Hub State:\n"); + + { // acquire lock + AutoMutex _l(mLock); + + dump.appendFormat(INDENT "HaveFirstKeyboard: %s\n", toString(mHaveFirstKeyboard)); + dump.appendFormat(INDENT "FirstKeyboardId: 0x%x\n", mFirstKeyboardId); + + dump.append(INDENT "Devices:\n"); + + for (int i = 0; i < mNumDevicesById; i++) { + const device_t* device = mDevicesById[i].device; + if (device) { + if (mFirstKeyboardId == device->id) { + dump.appendFormat(INDENT2 "0x%x: %s (aka device 0 - first keyboard)\n", + device->id, device->name.string()); + } else { + dump.appendFormat(INDENT2 "0x%x: %s\n", device->id, device->name.string()); + } + dump.appendFormat(INDENT3 "Classes: 0x%08x\n", device->classes); + dump.appendFormat(INDENT3 "Path: %s\n", device->path.string()); + dump.appendFormat(INDENT3 "KeyLayoutFile: %s\n", device->keylayoutFilename.string()); + } + } + } // release lock +} + }; // namespace android diff --git a/libs/ui/InputDispatcher.cpp b/libs/ui/InputDispatcher.cpp index 9544a95fb..aa54f82e9 100644 --- a/libs/ui/InputDispatcher.cpp +++ b/libs/ui/InputDispatcher.cpp @@ -46,6 +46,9 @@ #include #include +#define INDENT " " +#define INDENT2 " " + namespace android { // Delay between reporting long touch events to the power manager. @@ -2490,74 +2493,96 @@ void InputDispatcher::logDispatchStateLocked() { } void InputDispatcher::dumpDispatchStateLocked(String8& dump) { - dump.appendFormat(" dispatchEnabled: %d\n", mDispatchEnabled); - dump.appendFormat(" dispatchFrozen: %d\n", mDispatchFrozen); + dump.appendFormat(INDENT "DispatchEnabled: %d\n", mDispatchEnabled); + dump.appendFormat(INDENT "DispatchFrozen: %d\n", mDispatchFrozen); if (mFocusedApplication) { - dump.appendFormat(" focusedApplication: name='%s', dispatchingTimeout=%0.3fms\n", + dump.appendFormat(INDENT "FocusedApplication: name='%s', dispatchingTimeout=%0.3fms\n", mFocusedApplication->name.string(), mFocusedApplication->dispatchingTimeout / 1000000.0); } else { - dump.append(" focusedApplication: \n"); + dump.append(INDENT "FocusedApplication: \n"); } - dump.appendFormat(" focusedWindow: name='%s'\n", + dump.appendFormat(INDENT "FocusedWindow: name='%s'\n", mFocusedWindow != NULL ? mFocusedWindow->name.string() : ""); - dump.appendFormat(" touchState: down=%s, split=%s\n", toString(mTouchState.down), - toString(mTouchState.split)); - for (size_t i = 0; i < mTouchState.windows.size(); i++) { - const TouchedWindow& touchedWindow = mTouchState.windows[i]; - dump.appendFormat(" touchedWindow[%d]: name='%s', pointerIds=0x%0x, targetFlags=0x%x\n", - i, touchedWindow.window->name.string(), touchedWindow.pointerIds.value, - touchedWindow.targetFlags); - } - for (size_t i = 0; i < mWindows.size(); i++) { - dump.appendFormat(" windows[%d]: name='%s', paused=%s, hasFocus=%s, hasWallpaper=%s, " - "visible=%s, canReceiveKeys=%s, flags=0x%08x, type=0x%08x, layer=%d, " - "frame=[%d,%d][%d,%d], " - "visibleFrame=[%d,%d][%d,%d], " - "touchableArea=[%d,%d][%d,%d], " - "ownerPid=%d, ownerUid=%d, dispatchingTimeout=%0.3fms\n", - i, mWindows[i].name.string(), - toString(mWindows[i].paused), - toString(mWindows[i].hasFocus), - toString(mWindows[i].hasWallpaper), - toString(mWindows[i].visible), - toString(mWindows[i].canReceiveKeys), - mWindows[i].layoutParamsFlags, mWindows[i].layoutParamsType, - mWindows[i].layer, - mWindows[i].frameLeft, mWindows[i].frameTop, - mWindows[i].frameRight, mWindows[i].frameBottom, - mWindows[i].visibleFrameLeft, mWindows[i].visibleFrameTop, - mWindows[i].visibleFrameRight, mWindows[i].visibleFrameBottom, - mWindows[i].touchableAreaLeft, mWindows[i].touchableAreaTop, - mWindows[i].touchableAreaRight, mWindows[i].touchableAreaBottom, - mWindows[i].ownerPid, mWindows[i].ownerUid, - mWindows[i].dispatchingTimeout / 1000000.0); + + dump.appendFormat(INDENT "TouchDown: %s\n", toString(mTouchState.down)); + dump.appendFormat(INDENT "TouchSplit: %s\n", toString(mTouchState.split)); + if (!mTouchState.windows.isEmpty()) { + dump.append(INDENT "TouchedWindows:\n"); + for (size_t i = 0; i < mTouchState.windows.size(); i++) { + const TouchedWindow& touchedWindow = mTouchState.windows[i]; + dump.appendFormat(INDENT2 "%d: name='%s', pointerIds=0x%0x, targetFlags=0x%x\n", + i, touchedWindow.window->name.string(), touchedWindow.pointerIds.value, + touchedWindow.targetFlags); + } + } else { + dump.append(INDENT "TouchedWindows: \n"); } - for (size_t i = 0; i < mMonitoringChannels.size(); i++) { - const sp& channel = mMonitoringChannels[i]; - dump.appendFormat(" monitoringChannel[%d]: '%s'\n", - i, channel->getName().string()); + if (!mWindows.isEmpty()) { + dump.append(INDENT "Windows:\n"); + for (size_t i = 0; i < mWindows.size(); i++) { + const InputWindow& window = mWindows[i]; + dump.appendFormat(INDENT2 "%d: name='%s', paused=%s, hasFocus=%s, hasWallpaper=%s, " + "visible=%s, canReceiveKeys=%s, flags=0x%08x, type=0x%08x, layer=%d, " + "frame=[%d,%d][%d,%d], " + "visibleFrame=[%d,%d][%d,%d], " + "touchableArea=[%d,%d][%d,%d], " + "ownerPid=%d, ownerUid=%d, dispatchingTimeout=%0.3fms\n", + i, window.name.string(), + toString(window.paused), + toString(window.hasFocus), + toString(window.hasWallpaper), + toString(window.visible), + toString(window.canReceiveKeys), + window.layoutParamsFlags, window.layoutParamsType, + window.layer, + window.frameLeft, window.frameTop, + window.frameRight, window.frameBottom, + window.visibleFrameLeft, window.visibleFrameTop, + window.visibleFrameRight, window.visibleFrameBottom, + window.touchableAreaLeft, window.touchableAreaTop, + window.touchableAreaRight, window.touchableAreaBottom, + window.ownerPid, window.ownerUid, + window.dispatchingTimeout / 1000000.0); + } + } else { + dump.append(INDENT "Windows: \n"); } - dump.appendFormat(" inboundQueue: length=%u", mInboundQueue.count()); + if (!mMonitoringChannels.isEmpty()) { + dump.append(INDENT "MonitoringChannels:\n"); + for (size_t i = 0; i < mMonitoringChannels.size(); i++) { + const sp& channel = mMonitoringChannels[i]; + dump.appendFormat(INDENT2 "%d: '%s'\n", i, channel->getName().string()); + } + } else { + dump.append(INDENT "MonitoringChannels: \n"); + } - for (size_t i = 0; i < mActiveConnections.size(); i++) { - const Connection* connection = mActiveConnections[i]; - dump.appendFormat(" activeConnection[%d]: '%s', status=%s, outboundQueueLength=%u" - "inputState.isNeutral=%s, inputState.isOutOfSync=%s\n", - i, connection->getInputChannelName(), connection->getStatusLabel(), - connection->outboundQueue.count(), - toString(connection->inputState.isNeutral()), - toString(connection->inputState.isOutOfSync())); + dump.appendFormat(INDENT "InboundQueue: length=%u\n", mInboundQueue.count()); + + if (!mActiveConnections.isEmpty()) { + dump.append(INDENT "ActiveConnections:\n"); + for (size_t i = 0; i < mActiveConnections.size(); i++) { + const Connection* connection = mActiveConnections[i]; + dump.appendFormat(INDENT2 "%d: '%s', status=%s, outboundQueueLength=%u" + "inputState.isNeutral=%s, inputState.isOutOfSync=%s\n", + i, connection->getInputChannelName(), connection->getStatusLabel(), + connection->outboundQueue.count(), + toString(connection->inputState.isNeutral()), + toString(connection->inputState.isOutOfSync())); + } + } else { + dump.append(INDENT "ActiveConnections: \n"); } if (isAppSwitchPendingLocked()) { - dump.appendFormat(" appSwitch: pending, due in %01.1fms\n", + dump.appendFormat(INDENT "AppSwitch: pending, due in %01.1fms\n", (mAppSwitchDueTime - now()) / 1000000.0); } else { - dump.append(" appSwitch: not pending\n"); + dump.append(INDENT "AppSwitch: not pending\n"); } } @@ -2774,6 +2799,7 @@ void InputDispatcher::updateDispatchStatisticsLocked(nsecs_t currentTime, const } void InputDispatcher::dump(String8& dump) { + dump.append("Input Dispatcher State:\n"); dumpDispatchStateLocked(dump); } diff --git a/libs/ui/InputReader.cpp b/libs/ui/InputReader.cpp index 825febcf8..ea05f5c3f 100644 --- a/libs/ui/InputReader.cpp +++ b/libs/ui/InputReader.cpp @@ -575,6 +575,11 @@ bool InputReader::markSupportedKeyCodes(int32_t deviceId, uint32_t sourceMask, s } void InputReader::dump(String8& dump) { + mEventHub->dump(dump); + dump.append("\n"); + + dump.append("Input Reader State:\n"); + { // acquire device registry reader lock RWLock::AutoRLock _rl(mDeviceRegistryLock); @@ -861,7 +866,6 @@ void KeyboardInputMapper::dump(String8& dump) { AutoMutex _l(mLock); dump.append(INDENT2 "Keyboard Input Mapper:\n"); dump.appendFormat(INDENT3 "AssociatedDisplayId: %d\n", mAssociatedDisplayId); - dump.appendFormat(INDENT3 "Sources: 0x%x\n", mSources); dump.appendFormat(INDENT3 "KeyboardType: %d\n", mKeyboardType); dump.appendFormat(INDENT3 "KeyDowns: %d keys currently down\n", mLocked.keyDowns.size()); dump.appendFormat(INDENT3 "MetaState: 0x%0x\n", mLocked.metaState);