summaryrefslogtreecommitdiffstats
path: root/services/input
diff options
context:
space:
mode:
authorJeff Brown <jeffbrown@google.com>2011-06-03 15:50:27 -0700
committerJeff Brown <jeffbrown@google.com>2011-06-03 15:50:27 -0700
commit7218d830e27d81141588cd6e37f206d141a18f62 (patch)
treefae19a482a9c238fb94b1f46e7b37daf4f18a3ab /services/input
parenta742f854901b8306d3696c9e9b7881c207130a01 (diff)
parentca2b552d981239043a575dfc9db86966492d0f9e (diff)
downloadframeworks_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.cpp53
-rw-r--r--services/input/EventHub.h17
-rw-r--r--services/input/InputReader.cpp26
-rw-r--r--services/input/InputReader.h17
-rw-r--r--services/input/tests/InputReader_test.cpp7
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() {
+ }
};