summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--media/java/android/media/AudioManager.java38
-rw-r--r--services/input/InputReader.cpp32
-rw-r--r--services/input/InputReader.h15
-rw-r--r--services/java/com/android/server/input/InputManagerService.java20
-rw-r--r--services/jni/com_android_server_input_InputManagerService.cpp31
5 files changed, 100 insertions, 36 deletions
diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java
index ac2588d..f55a0bb 100644
--- a/media/java/android/media/AudioManager.java
+++ b/media/java/android/media/AudioManager.java
@@ -36,9 +36,7 @@ import android.os.ServiceManager;
import android.provider.Settings;
import android.util.Log;
import android.view.KeyEvent;
-import android.view.Surface;
import android.view.VolumePanel;
-import android.view.WindowManager;
import java.util.HashMap;
@@ -56,7 +54,6 @@ public class AudioManager {
private final boolean mUseVolumeKeySounds;
private static String TAG = "AudioManager";
private final ProfileManager mProfileManager;
- private final WindowManager mWindowManager;
/**
* Broadcast intent, a hint for applications that audio is about to become
@@ -429,7 +426,6 @@ public class AudioManager {
mUseVolumeKeySounds = mContext.getResources().getBoolean(
com.android.internal.R.bool.config_useVolumeKeySounds);
mProfileManager = (ProfileManager) context.getSystemService(Context.PROFILE_SERVICE);
- mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
}
private static IAudioService getService()
@@ -480,33 +476,21 @@ public class AudioManager {
* Adjust the volume in on key down since it is more
* responsive to the user.
*/
- int direction;
- int swapKeys = Settings.System.getInt(mContext.getContentResolver(),
- Settings.System.SWAP_VOLUME_KEYS_ON_ROTATION, 0);
- int rotation = mWindowManager.getDefaultDisplay().getRotation();
- if (swapKeys == 1 // phone or hybrid
- && (rotation == Surface.ROTATION_90
- || rotation == Surface.ROTATION_180)) {
- direction = keyCode == KeyEvent.KEYCODE_VOLUME_UP
- ? ADJUST_LOWER
- : ADJUST_RAISE;
- } else if (swapKeys == 2 // tablet
- && (rotation == Surface.ROTATION_180
- || rotation == Surface.ROTATION_270)) {
- direction = keyCode == KeyEvent.KEYCODE_VOLUME_UP
- ? ADJUST_LOWER
- : ADJUST_RAISE;
- } else {
- direction = keyCode == KeyEvent.KEYCODE_VOLUME_UP
- ? ADJUST_RAISE
- : ADJUST_LOWER;
- }
int flags = FLAG_SHOW_UI | FLAG_VIBRATE;
if (mUseMasterVolume) {
- adjustMasterVolume(direction, flags);
+ adjustMasterVolume(
+ keyCode == KeyEvent.KEYCODE_VOLUME_UP
+ ? ADJUST_RAISE
+ : ADJUST_LOWER,
+ flags);
} else {
- adjustSuggestedStreamVolume(direction, stream, flags);
+ adjustSuggestedStreamVolume(
+ keyCode == KeyEvent.KEYCODE_VOLUME_UP
+ ? ADJUST_RAISE
+ : ADJUST_LOWER,
+ stream,
+ flags);
}
break;
case KeyEvent.KEYCODE_VOLUME_MUTE:
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",