diff options
author | nadlabak <pavel@doshaska.net> | 2013-05-13 17:41:57 +0200 |
---|---|---|
committer | nadlabak <pavel@doshaska.net> | 2013-09-17 01:23:58 +0200 |
commit | 22a4d65f66a6155a60d77a22922c195fb22a1bd6 (patch) | |
tree | d282a402ce56e1bcb66eb515bbe08d19c568f781 /services | |
parent | d8574e9aa82071f85b751e1f7dccd19759ffc7a9 (diff) | |
download | frameworks_base-22a4d65f66a6155a60d77a22922c195fb22a1bd6.zip frameworks_base-22a4d65f66a6155a60d77a22922c195fb22a1bd6.tar.gz frameworks_base-22a4d65f66a6155a60d77a22922c195fb22a1bd6.tar.bz2 |
Re-implement orientation aware volume buttons at lower level
Rework of http://review.cyanogenmod.org/31979
Fixes:
1. inconsistent volume button behaviour depending on app in use
- the buttons were not swapped for some NDK/OPENSL ES apps like
e.g. MX Player
2. the function of volume buttons on external input devices like BT/USB
keyboards should not be affected by the main unit orientation
This commit finishes http://review.cyanogenmod.org/18273 - use of system
property has been replaced with config push via JNI as suggested during
the original review.
Patch Set 7: Circumvent the need for "keyboard.orientationAware = 1" idc
Patch Set 8: Don't leak implementation details outside InputReader
Change-Id: I19cc60cb0acb0005ab13fa069f52e3d468d694e7
Diffstat (limited to 'services')
-rw-r--r-- | services/input/InputReader.cpp | 32 | ||||
-rw-r--r-- | services/input/InputReader.h | 15 | ||||
-rw-r--r-- | services/java/com/android/server/input/InputManagerService.java | 20 | ||||
-rw-r--r-- | services/jni/com_android_server_input_InputManagerService.cpp | 31 |
4 files changed, 89 insertions, 9 deletions
diff --git a/services/input/InputReader.cpp b/services/input/InputReader.cpp index baba77d..6f2339d 100644 --- a/services/input/InputReader.cpp +++ b/services/input/InputReader.cpp @@ -101,9 +101,10 @@ static inline const char* toString(bool value) { } static int32_t rotateValueUsingRotationMap(int32_t value, int32_t orientation, - const int32_t map[][4], size_t mapSize) { + const int32_t map[][4], size_t mapSize, + int32_t rotationMapOffset) { if (orientation != DISPLAY_ORIENTATION_0) { - for (size_t i = 0; i < mapSize; i++) { + for (size_t i = rotationMapOffset; i < mapSize; i++) { if (value == map[i][0]) { return map[i][orientation]; } @@ -115,6 +116,16 @@ static int32_t rotateValueUsingRotationMap(int32_t value, int32_t orientation, static const int32_t keyCodeRotationMap[][4] = { // key codes enumerated counter-clockwise with the original (unrotated) key first // no rotation, 90 degree rotation, 180 degree rotation, 270 degree rotation + + // volume keys - tablet + { AKEYCODE_VOLUME_UP, AKEYCODE_VOLUME_UP, AKEYCODE_VOLUME_DOWN, AKEYCODE_VOLUME_DOWN }, + { AKEYCODE_VOLUME_DOWN, AKEYCODE_VOLUME_DOWN, AKEYCODE_VOLUME_UP, AKEYCODE_VOLUME_UP }, + + // volume keys - phone or hybrid + { AKEYCODE_VOLUME_UP, AKEYCODE_VOLUME_DOWN, AKEYCODE_VOLUME_DOWN, AKEYCODE_VOLUME_UP }, + { AKEYCODE_VOLUME_DOWN, AKEYCODE_VOLUME_UP, AKEYCODE_VOLUME_UP, AKEYCODE_VOLUME_DOWN }, + + // dpad keys - common { AKEYCODE_DPAD_DOWN, AKEYCODE_DPAD_RIGHT, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_LEFT }, { AKEYCODE_DPAD_RIGHT, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_LEFT, AKEYCODE_DPAD_DOWN }, { AKEYCODE_DPAD_UP, AKEYCODE_DPAD_LEFT, AKEYCODE_DPAD_DOWN, AKEYCODE_DPAD_RIGHT }, @@ -123,9 +134,11 @@ static const int32_t keyCodeRotationMap[][4] = { static const size_t keyCodeRotationMapSize = sizeof(keyCodeRotationMap) / sizeof(keyCodeRotationMap[0]); -static int32_t rotateKeyCode(int32_t keyCode, int32_t orientation) { +static int32_t rotateKeyCode(int32_t keyCode, int32_t orientation, + int32_t rotationMapOffset) { return rotateValueUsingRotationMap(keyCode, orientation, - keyCodeRotationMap, keyCodeRotationMapSize); + keyCodeRotationMap, keyCodeRotationMapSize, + rotationMapOffset); } static void rotateDelta(int32_t orientation, float* deltaX, float* deltaY) { @@ -2039,10 +2052,16 @@ void KeyboardInputMapper::configure(nsecs_t when, mOrientation = DISPLAY_ORIENTATION_0; } } + if (!changes || (changes & InputReaderConfiguration::CHANGE_VOLUME_KEYS_ROTATION)) { + // mode 0 (disabled) ~ offset 4 + // mode 1 (phone) ~ offset 2 + // mode 2 (tablet) ~ offset 0 + mRotationMapOffset = 4 - 2 * config->volumeKeysRotationMode; + } } void KeyboardInputMapper::configureParameters() { - mParameters.orientationAware = false; + mParameters.orientationAware = !getDevice()->isExternal(); getDevice()->getConfiguration().tryGetProperty(String8("keyboard.orientationAware"), mParameters.orientationAware); @@ -2116,7 +2135,8 @@ void KeyboardInputMapper::processKey(nsecs_t when, bool down, int32_t keyCode, if (down) { // Rotate key codes according to orientation if needed. if (mParameters.orientationAware && mParameters.hasAssociatedDisplay) { - keyCode = rotateKeyCode(keyCode, mOrientation); + keyCode = rotateKeyCode(keyCode, mOrientation, + mRotationMapOffset); } // Add key down. diff --git a/services/input/InputReader.h b/services/input/InputReader.h index ab452c8..dc786a6 100644 --- a/services/input/InputReader.h +++ b/services/input/InputReader.h @@ -140,6 +140,9 @@ struct InputReaderConfiguration { // Stylus icon option changed. CHANGE_STYLUS_ICON_ENABLED = 1 << 6, + // Volume keys rotation option changed. + CHANGE_VOLUME_KEYS_ROTATION = 1 << 7, + // All devices must be reopened. CHANGE_MUST_REOPEN = 1 << 31, }; @@ -230,6 +233,10 @@ struct InputReaderConfiguration { // True to show the pointer icon when a stylus is used. bool stylusIconEnabled; + // Remap volume keys according to display rotation + // 0 - disabled, 1 - phone or hybrid rotation mode, 2 - tablet rotation mode + int volumeKeysRotationMode; + // Ignore finger touches this long after the stylus has been used (including hover) nsecs_t stylusPalmRejectionTime; @@ -249,9 +256,10 @@ struct InputReaderConfiguration { pointerGestureSwipeMaxWidthRatio(0.25f), pointerGestureMovementSpeedRatio(0.8f), pointerGestureZoomSpeedRatio(0.3f), - showTouches(false), + showTouches(false), stylusIconEnabled(false), - stylusPalmRejectionTime(50 * 10000000LL) // 50 ms + stylusPalmRejectionTime(50 * 10000000LL), // 50 ms + volumeKeysRotationMode(0) { } bool getDisplayInfo(bool external, DisplayViewport* outViewport) const; @@ -1039,7 +1047,8 @@ private: uint32_t mSource; int32_t mKeyboardType; - int32_t mOrientation; // orientation for dpad keys + int32_t mRotationMapOffset; // determines if and how volume keys rotate + int32_t mOrientation; // orientation for dpad and volume keys Vector<KeyDown> mKeyDowns; // keys that are down int32_t mMetaState; diff --git a/services/java/com/android/server/input/InputManagerService.java b/services/java/com/android/server/input/InputManagerService.java index a1d52d3..c700b66 100644 --- a/services/java/com/android/server/input/InputManagerService.java +++ b/services/java/com/android/server/input/InputManagerService.java @@ -182,6 +182,7 @@ public class InputManagerService extends IInputManager.Stub private static native void nativeSetPointerSpeed(int ptr, int speed); private static native void nativeSetShowTouches(int ptr, boolean enabled); private static native void nativeSetStylusIconEnabled(int ptr, boolean enabled); + private static native void nativeSetVolumeKeysRotation(int ptr, int mode); private static native void nativeVibrate(int ptr, int deviceId, long[] pattern, int repeat, int token); private static native void nativeCancelVibrate(int ptr, int deviceId, int token); @@ -273,6 +274,7 @@ public class InputManagerService extends IInputManager.Stub registerPointerSpeedSettingObserver(); registerShowTouchesSettingObserver(); registerStylusIconEnabledSettingObserver(); + registerVolumeKeysRotationSettingObserver(); mContext.registerReceiver(new BroadcastReceiver() { @Override @@ -285,6 +287,7 @@ public class InputManagerService extends IInputManager.Stub updatePointerSpeedFromSettings(); updateShowTouchesFromSettings(); updateStylusIconEnabledFromSettings(); + updateVolumeKeysRotationFromSettings(); } // TODO(BT) Pass in paramter for bluetooth system @@ -1197,6 +1200,23 @@ public class InputManagerService extends IInputManager.Stub return result; } + public void updateVolumeKeysRotationFromSettings() { + int mode = Settings.System.getInt(mContext.getContentResolver(), + Settings.System.SWAP_VOLUME_KEYS_ON_ROTATION, 0); + nativeSetVolumeKeysRotation(mPtr, mode); + } + + public void registerVolumeKeysRotationSettingObserver() { + mContext.getContentResolver().registerContentObserver( + Settings.System.getUriFor(Settings.System.SWAP_VOLUME_KEYS_ON_ROTATION), false, + new ContentObserver(mHandler) { + @Override + public void onChange(boolean selfChange) { + updateVolumeKeysRotationFromSettings(); + } + }); + } + public void updateShowTouchesFromSettings() { int setting = getShowTouchesSetting(0); nativeSetShowTouches(mPtr, setting != 0); diff --git a/services/jni/com_android_server_input_InputManagerService.cpp b/services/jni/com_android_server_input_InputManagerService.cpp index 55a8061..6d98907 100644 --- a/services/jni/com_android_server_input_InputManagerService.cpp +++ b/services/jni/com_android_server_input_InputManagerService.cpp @@ -177,6 +177,7 @@ public: void setPointerSpeed(int32_t speed); void setShowTouches(bool enabled); void setStylusIconEnabled(bool enabled); + void setVolumeKeysRotation(int mode); /* --- InputReaderPolicyInterface implementation --- */ @@ -240,6 +241,9 @@ private: // Show icon when stylus is used bool stylusIconEnabled; + // Volume keys rotation mode (0 - off, 1 - phone, 2 - tablet) + int32_t volumeKeysRotationMode; + // Sprite controller singleton, created on first use. sp<SpriteController> spriteController; @@ -279,6 +283,7 @@ NativeInputManager::NativeInputManager(jobject contextObj, mLocked.pointerGesturesEnabled = true; mLocked.showTouches = false; mLocked.stylusIconEnabled = false; + mLocked.volumeKeysRotationMode = 0; } sp<EventHub> eventHub = new EventHub(); @@ -412,6 +417,7 @@ void NativeInputManager::getReaderConfiguration(InputReaderConfiguration* outCon outConfig->showTouches = mLocked.showTouches; outConfig->stylusIconEnabled = mLocked.stylusIconEnabled; + outConfig->volumeKeysRotationMode = mLocked.volumeKeysRotationMode; outConfig->setDisplayInfo(false /*external*/, mLocked.internalViewport); outConfig->setDisplayInfo(true /*external*/, mLocked.externalViewport); @@ -752,6 +758,22 @@ void NativeInputManager::setStylusIconEnabled(bool enabled) { InputReaderConfiguration::CHANGE_STYLUS_ICON_ENABLED); } +void NativeInputManager::setVolumeKeysRotation(int mode) { + { // acquire lock + AutoMutex _l(mLock); + + if (mLocked.volumeKeysRotationMode == mode) { + return; + } + + ALOGI("Volume keys: rotation mode set to %d.", mode); + mLocked.volumeKeysRotationMode = mode; + } // release lock + + mInputManager->getReader()->requestRefreshConfiguration( + InputReaderConfiguration::CHANGE_VOLUME_KEYS_ROTATION); +} + bool NativeInputManager::isScreenOn() { return android_server_PowerManagerService_isScreenOn(); } @@ -1250,6 +1272,13 @@ static void nativeSetStylusIconEnabled(JNIEnv* env, im->setStylusIconEnabled(enabled); } +static void nativeSetVolumeKeysRotation(JNIEnv* env, + jclass clazz, jint ptr, int mode) { + NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); + + im->setVolumeKeysRotation(mode); +} + static void nativeVibrate(JNIEnv* env, jclass clazz, jint ptr, jint deviceId, jlongArray patternObj, jint repeat, jint token) { @@ -1357,6 +1386,8 @@ static JNINativeMethod gInputManagerMethods[] = { (void*) nativeSetShowTouches }, { "nativeSetStylusIconEnabled", "(IZ)V", (void*) nativeSetStylusIconEnabled }, + { "nativeSetVolumeKeysRotation", "(II)V", + (void*) nativeSetVolumeKeysRotation }, { "nativeVibrate", "(II[JII)V", (void*) nativeVibrate }, { "nativeCancelVibrate", "(III)V", |