diff options
author | Jeff Brown <jeffbrown@google.com> | 2011-06-03 15:50:27 -0700 |
---|---|---|
committer | Jeff Brown <jeffbrown@google.com> | 2011-06-03 15:50:27 -0700 |
commit | 7218d830e27d81141588cd6e37f206d141a18f62 (patch) | |
tree | fae19a482a9c238fb94b1f46e7b37daf4f18a3ab /services/input | |
parent | a742f854901b8306d3696c9e9b7881c207130a01 (diff) | |
parent | ca2b552d981239043a575dfc9db86966492d0f9e (diff) | |
download | frameworks_base-7218d830e27d81141588cd6e37f206d141a18f62.zip frameworks_base-7218d830e27d81141588cd6e37f206d141a18f62.tar.gz frameworks_base-7218d830e27d81141588cd6e37f206d141a18f62.tar.bz2 |
resolved conflicts for merge of ca2b552d to master
Change-Id: I2f3693a59042ac5aa2d7bcdc3a504c78dc99a18b
Diffstat (limited to 'services/input')
-rw-r--r-- | services/input/EventHub.cpp | 53 | ||||
-rw-r--r-- | services/input/EventHub.h | 17 | ||||
-rw-r--r-- | services/input/InputReader.cpp | 26 | ||||
-rw-r--r-- | services/input/InputReader.h | 17 | ||||
-rw-r--r-- | services/input/tests/InputReader_test.cpp | 7 |
5 files changed, 87 insertions, 33 deletions
diff --git a/services/input/EventHub.cpp b/services/input/EventHub.cpp index af30887..29add52 100644 --- a/services/input/EventHub.cpp +++ b/services/input/EventHub.cpp @@ -33,6 +33,7 @@ #include <hardware_legacy/power.h> +#include <cutils/atomic.h> #include <cutils/properties.h> #include <utils/Log.h> #include <utils/Timers.h> @@ -128,6 +129,7 @@ EventHub::EventHub(void) : mError(NO_INIT), mBuiltInKeyboardId(-1), mNextDeviceId(1), mOpeningDevices(0), mClosingDevices(0), mOpened(false), mNeedToSendFinishedDeviceScan(false), + mNeedToReopenDevices(0), mNeedToScanDevices(false), mInputFdIndex(1) { acquire_wake_lock(PARTIAL_WAKE_LOCK, WAKE_LOCK_ID); @@ -393,12 +395,10 @@ status_t EventHub::mapAxis(int32_t deviceId, int scancode, AxisInfo* outAxisInfo return NAME_NOT_FOUND; } -void EventHub::addExcludedDevice(const char* deviceName) -{ +void EventHub::setExcludedDevices(const Vector<String8>& devices) { AutoMutex _l(mLock); - String8 name(deviceName); - mExcludedDevices.push_back(name); + mExcludedDevices = devices; } bool EventHub::hasLed(int32_t deviceId, int32_t led) const { @@ -466,9 +466,11 @@ size_t EventHub::getEvents(int timeoutMillis, RawEvent* buffer, size_t bufferSiz LOG_ASSERT(bufferSize >= 1); if (!mOpened) { + android_atomic_acquire_store(0, &mNeedToReopenDevices); + mError = openPlatformInput() ? NO_ERROR : UNKNOWN_ERROR; mOpened = true; - mNeedToSendFinishedDeviceScan = true; + mNeedToScanDevices = true; } struct input_event readBuffer[bufferSize]; @@ -478,6 +480,20 @@ size_t EventHub::getEvents(int timeoutMillis, RawEvent* buffer, size_t bufferSiz for (;;) { nsecs_t now = systemTime(SYSTEM_TIME_MONOTONIC); + // Reopen input devices if needed. + if (android_atomic_acquire_load(&mNeedToReopenDevices)) { + android_atomic_acquire_store(0, &mNeedToReopenDevices); + + LOGI("Reopening all input devices due to a configuration change."); + + AutoMutex _l(mLock); + while (mDevices.size() > 1) { + closeDeviceAtIndexLocked(mDevices.size() - 1); + } + mNeedToScanDevices = true; + break; // return to the caller before we actually rescan + } + // Report any devices that had last been added/removed. while (mClosingDevices) { Device* device = mClosingDevices; @@ -495,6 +511,12 @@ size_t EventHub::getEvents(int timeoutMillis, RawEvent* buffer, size_t bufferSiz } } + if (mNeedToScanDevices) { + mNeedToScanDevices = false; + scanDevices(); + mNeedToSendFinishedDeviceScan = true; + } + while (mOpeningDevices != NULL) { Device* device = mOpeningDevices; LOGV("Reporting device opened: id=%d, name=%s\n", @@ -696,13 +718,14 @@ bool EventHub::openPlatformInput(void) { pollfd.revents = 0; mFds.push(pollfd); mDevices.push(NULL); + return true; +} - res = scanDir(DEVICE_PATH); +void EventHub::scanDevices() { + int res = scanDir(DEVICE_PATH); if(res < 0) { LOGE("scan dir failed for %s\n", DEVICE_PATH); } - - return true; } // ---------------------------------------------------------------------------- @@ -755,12 +778,10 @@ int EventHub::openDevice(const char *devicePath) { } // Check to see if the device is on our excluded list - List<String8>::iterator iter = mExcludedDevices.begin(); - List<String8>::iterator end = mExcludedDevices.end(); - for ( ; iter != end; iter++) { - const char* test = *iter; - if (identifier.name == test) { - LOGI("ignoring event id %s driver %s\n", devicePath, test); + for (size_t i = 0; i < mExcludedDevices.size(); i++) { + const String8& item = mExcludedDevices.itemAt(i); + if (identifier.name == item) { + LOGI("ignoring event id %s driver %s\n", devicePath, item.string()); close(fd); return -1; } @@ -1223,6 +1244,10 @@ int EventHub::scanDir(const char *dirname) return 0; } +void EventHub::reopenDevices() { + android_atomic_release_store(1, &mNeedToReopenDevices); +} + void EventHub::dump(String8& dump) { dump.append("Event Hub State:\n"); diff --git a/services/input/EventHub.h b/services/input/EventHub.h index ca33619..558959b 100644 --- a/services/input/EventHub.h +++ b/services/input/EventHub.h @@ -193,9 +193,9 @@ public: virtual status_t mapAxis(int32_t deviceId, int scancode, AxisInfo* outAxisInfo) const = 0; - // exclude a particular device from opening - // this can be used to ignore input devices for sensors - virtual void addExcludedDevice(const char* deviceName) = 0; + // Sets devices that are excluded from opening. + // This can be used to ignore input devices for sensors. + virtual void setExcludedDevices(const Vector<String8>& devices) = 0; /* * Wait for events to become available and returns them. @@ -230,6 +230,8 @@ public: virtual void getVirtualKeyDefinitions(int32_t deviceId, Vector<VirtualKeyDefinition>& outVirtualKeys) const = 0; + virtual void reopenDevices() = 0; + virtual void dump(String8& dump) = 0; }; @@ -259,7 +261,7 @@ public: virtual status_t mapAxis(int32_t deviceId, int scancode, AxisInfo* outAxisInfo) const; - virtual void addExcludedDevice(const char* deviceName); + virtual void setExcludedDevices(const Vector<String8>& devices); virtual int32_t getScanCodeState(int32_t deviceId, int32_t scanCode) const; virtual int32_t getKeyCodeState(int32_t deviceId, int32_t keyCode) const; @@ -276,6 +278,8 @@ public: virtual void getVirtualKeyDefinitions(int32_t deviceId, Vector<VirtualKeyDefinition>& outVirtualKeys) const; + virtual void reopenDevices(); + virtual void dump(String8& dump); protected: @@ -288,6 +292,7 @@ private: int closeDevice(const char *devicePath); int closeDeviceAtIndexLocked(int index); int scanDir(const char *dirname); + void scanDevices(); int readNotify(int nfd); status_t mError; @@ -351,7 +356,9 @@ private: bool mOpened; bool mNeedToSendFinishedDeviceScan; - List<String8> mExcludedDevices; + volatile int32_t mNeedToReopenDevices; // must be modified atomically + bool mNeedToScanDevices; + Vector<String8> mExcludedDevices; // device ids that report particular switches. int32_t mSwitches[SW_MAX + 1]; diff --git a/services/input/InputReader.cpp b/services/input/InputReader.cpp index 8c9bad8..2924d3e 100644 --- a/services/input/InputReader.cpp +++ b/services/input/InputReader.cpp @@ -38,6 +38,7 @@ #include "InputReader.h" +#include <cutils/atomic.h> #include <cutils/log.h> #include <ui/Keyboard.h> #include <ui/VirtualKeyMap.h> @@ -260,10 +261,9 @@ InputReader::InputReader(const sp<EventHubInterface>& eventHub, const sp<InputReaderPolicyInterface>& policy, const sp<InputDispatcherInterface>& dispatcher) : mEventHub(eventHub), mPolicy(policy), mDispatcher(dispatcher), - mGlobalMetaState(0), mDisableVirtualKeysTimeout(LLONG_MIN), mNextTimeout(LLONG_MAX) { - mPolicy->getReaderConfiguration(&mConfig); - - configureExcludedDevices(); + mGlobalMetaState(0), mDisableVirtualKeysTimeout(LLONG_MIN), mNextTimeout(LLONG_MAX), + mRefreshConfiguration(0) { + configure(true /*firstTime*/); updateGlobalMetaState(); updateInputConfiguration(); } @@ -275,6 +275,11 @@ InputReader::~InputReader() { } void InputReader::loopOnce() { + if (android_atomic_acquire_load(&mRefreshConfiguration)) { + android_atomic_release_store(0, &mRefreshConfiguration); + configure(false /*firstTime*/); + } + int32_t timeoutMillis = -1; if (mNextTimeout != LLONG_MAX) { nsecs_t now = systemTime(SYSTEM_TIME_MONOTONIC); @@ -495,9 +500,12 @@ void InputReader::handleConfigurationChanged(nsecs_t when) { mDispatcher->notifyConfigurationChanged(when); } -void InputReader::configureExcludedDevices() { - for (size_t i = 0; i < mConfig.excludedDeviceNames.size(); i++) { - mEventHub->addExcludedDevice(mConfig.excludedDeviceNames[i]); +void InputReader::configure(bool firstTime) { + mPolicy->getReaderConfiguration(&mConfig); + mEventHub->setExcludedDevices(mConfig.excludedDeviceNames); + + if (!firstTime) { + mEventHub->reopenDevices(); } } @@ -718,6 +726,10 @@ bool InputReader::markSupportedKeyCodes(int32_t deviceId, uint32_t sourceMask, s } // release device registy reader lock } +void InputReader::refreshConfiguration() { + android_atomic_release_store(1, &mRefreshConfiguration); +} + void InputReader::dump(String8& dump) { mEventHub->dump(dump); dump.append("\n"); diff --git a/services/input/InputReader.h b/services/input/InputReader.h index 5abf404..1d4ad87 100644 --- a/services/input/InputReader.h +++ b/services/input/InputReader.h @@ -145,7 +145,7 @@ struct InputReaderConfiguration { pointerGestureMultitouchMinSpeed(150.0f), // 150 pixels per second pointerGestureSwipeTransitionAngleCosine(0.5f), // cosine of 45degrees pointerGestureSwipeMaxWidthRatio(0.333f), - pointerGestureMovementSpeedRatio(0.5f), + pointerGestureMovementSpeedRatio(0.3f), pointerGestureZoomSpeedRatio(0.3f) { } }; @@ -234,6 +234,9 @@ public: /* Determine whether physical keys exist for the given framework-domain key codes. */ virtual bool hasKeys(int32_t deviceId, uint32_t sourceMask, size_t numCodes, const int32_t* keyCodes, uint8_t* outFlags) = 0; + + /* Reopens and reconfigures all input devices. */ + virtual void refreshConfiguration() = 0; }; @@ -298,6 +301,8 @@ public: virtual bool hasKeys(int32_t deviceId, uint32_t sourceMask, size_t numCodes, const int32_t* keyCodes, uint8_t* outFlags); + virtual void refreshConfiguration(); + protected: // These methods are protected virtual so they can be overridden and instrumented // by test cases. @@ -339,18 +344,17 @@ private: void timeoutExpired(nsecs_t when); void handleConfigurationChanged(nsecs_t when); - void configureExcludedDevices(); // state management for all devices Mutex mStateLock; - int32_t mGlobalMetaState; + int32_t mGlobalMetaState; // guarded by mStateLock virtual void updateGlobalMetaState(); virtual int32_t getGlobalMetaState(); virtual void fadePointer(); - InputConfiguration mInputConfiguration; + InputConfiguration mInputConfiguration; // guarded by mStateLock void updateInputConfiguration(); nsecs_t mDisableVirtualKeysTimeout; // only accessed by reader thread @@ -358,9 +362,12 @@ private: virtual bool shouldDropVirtualKey(nsecs_t now, InputDevice* device, int32_t keyCode, int32_t scanCode); - nsecs_t mNextTimeout; // only accessed by reader thread + nsecs_t mNextTimeout; // only accessed by reader thread, not guarded virtual void requestTimeoutAtTime(nsecs_t when); + volatile int32_t mRefreshConfiguration; // atomic + void configure(bool firstTime); + // state queries typedef int32_t (InputDevice::*GetStateFunc)(uint32_t sourceMask, int32_t code); int32_t getState(int32_t deviceId, uint32_t sourceMask, int32_t code, diff --git a/services/input/tests/InputReader_test.cpp b/services/input/tests/InputReader_test.cpp index 3a1beb6..00b4222 100644 --- a/services/input/tests/InputReader_test.cpp +++ b/services/input/tests/InputReader_test.cpp @@ -629,8 +629,8 @@ private: return NAME_NOT_FOUND; } - virtual void addExcludedDevice(const char* deviceName) { - mExcludedDevices.add(String8(deviceName)); + virtual void setExcludedDevices(const Vector<String8>& devices) { + mExcludedDevices = devices; } virtual size_t getEvents(int timeoutMillis, RawEvent* buffer, size_t bufferSize) { @@ -728,6 +728,9 @@ private: virtual void dump(String8& dump) { } + + virtual void reopenDevices() { + } }; |