diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 7198ef46d7c44d10c5948123e23a7a34d1d17649..3608280c7f94b26cc8ad8e5ff963c8e92109d92f 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -5599,6 +5599,12 @@ public final class Settings { */ public static final String KEY_EDGE_LONG_SWIPE_ACTION = "key_edge_long_swipe_action"; + /** + * Swap volume buttons on rotation + * @hide + */ + public static final String SWAP_VOLUME_KEYS_ON_ROTATION = "swap_volume_keys_on_rotation"; + /** * IMPORTANT: If you add a new public settings you also have to add it to * PUBLIC_SETTINGS below. If the new setting is hidden you have to add diff --git a/services/core/java/com/android/server/input/InputManagerService.java b/services/core/java/com/android/server/input/InputManagerService.java index fae7e451b5291035ec91482971d133786e2b6e76..7b3342f8b19702cf3bc6c650b61b34987ee730b7 100644 --- a/services/core/java/com/android/server/input/InputManagerService.java +++ b/services/core/java/com/android/server/input/InputManagerService.java @@ -316,6 +316,7 @@ public class InputManagerService extends IInputManager.Stub private static native boolean nativeTransferTouch(long ptr, IBinder destChannelToken); private static native void nativeSetPointerSpeed(long ptr, int speed); private static native void nativeSetShowTouches(long ptr, boolean enabled); + private static native void nativeSetVolumeKeysRotation(long ptr, int mode); private static native void nativeSetInteractive(long ptr, boolean interactive); private static native void nativeReloadCalibration(long ptr); private static native void nativeVibrate(long ptr, int deviceId, long[] pattern, @@ -486,6 +487,7 @@ public class InputManagerService extends IInputManager.Stub registerLongPressTimeoutObserver(); registerMaximumObscuringOpacityForTouchSettingObserver(); registerBlockUntrustedTouchesModeSettingObserver(); + registerVolumeKeysRotationSettingObserver(); mContext.registerReceiver(new BroadcastReceiver() { @Override @@ -494,6 +496,7 @@ public class InputManagerService extends IInputManager.Stub updateShowTouchesFromSettings(); updateAccessibilityLargePointerFromSettings(); updateDeepPressStatusFromSettings("user switched"); + updateVolumeKeysRotationFromSettings(); } }, new IntentFilter(Intent.ACTION_USER_SWITCHED), null, mHandler); @@ -503,6 +506,7 @@ public class InputManagerService extends IInputManager.Stub updateDeepPressStatusFromSettings("just booted"); updateMaximumObscuringOpacityForTouchFromSettings(); updateBlockUntrustedTouchesModeFromSettings(); + updateVolumeKeysRotationFromSettings(); } // TODO(BT) Pass in parameter for bluetooth system @@ -2066,6 +2070,33 @@ public class InputManagerService extends IInputManager.Stub return v; } + public void updateVolumeKeysRotationFromSettings() { + int mode = getVolumeKeysRotationSetting(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(); + } + }); + } + + private int getVolumeKeysRotationSetting(int defaultValue) { + int result = defaultValue; + try { + result = Settings.System.getIntForUser(mContext.getContentResolver(), + Settings.System.SWAP_VOLUME_KEYS_ON_ROTATION, UserHandle.USER_CURRENT); + } catch (SettingNotFoundException snfe) { + } + return result; + } + // Binder call @Override public void vibrate(int deviceId, VibrationEffect effect, IBinder token) { diff --git a/services/core/jni/com_android_server_input_InputManagerService.cpp b/services/core/jni/com_android_server_input_InputManagerService.cpp index bb9740b60f7824e07395e5bd3c08907ca4ac4311..c1e6e0494658ea200f2848bd964884e085b56fdb 100644 --- a/services/core/jni/com_android_server_input_InputManagerService.cpp +++ b/services/core/jni/com_android_server_input_InputManagerService.cpp @@ -283,6 +283,7 @@ public: void setPointerSpeed(int32_t speed); void setInputDeviceEnabled(uint32_t deviceId, bool enabled); void setShowTouches(bool enabled); + void setVolumeKeysRotation(int mode); void setInteractive(bool interactive); void reloadCalibration(); void setPointerIconType(int32_t iconId); @@ -375,6 +376,9 @@ private: // The latest request to enable or disable Pointer Capture. PointerCaptureRequest pointerCaptureRequest; + // Volume keys rotation mode (0 - off, 1 - phone, 2 - tablet) + int32_t volumeKeysRotationMode; + // Sprite controller singleton, created on first use. sp<SpriteController> spriteController; @@ -418,6 +422,7 @@ NativeInputManager::NativeInputManager(jobject contextObj, mLocked.pointerGesturesEnabled = true; mLocked.showTouches = false; mLocked.pointerDisplayId = ADISPLAY_ID_DEFAULT; + mLocked.volumeKeysRotationMode = 0; } mInteractive = true; @@ -634,6 +639,7 @@ void NativeInputManager::getReaderConfiguration(InputReaderConfiguration* outCon outConfig->pointerGesturesEnabled = mLocked.pointerGesturesEnabled; outConfig->showTouches = mLocked.showTouches; + outConfig->volumeKeysRotationMode = mLocked.volumeKeysRotationMode; outConfig->pointerCaptureRequest = mLocked.pointerCaptureRequest; @@ -1093,6 +1099,22 @@ void NativeInputManager::requestPointerCapture(const sp<IBinder>& windowToken, b mInputManager->getDispatcher()->requestPointerCapture(windowToken, 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); +} + void NativeInputManager::setInteractive(bool interactive) { mInteractive = interactive; } @@ -1859,6 +1881,13 @@ static void nativeSetShowTouches(JNIEnv* /* env */, im->setShowTouches(enabled); } +static void nativeSetVolumeKeysRotation(JNIEnv* env, + jclass clazz, jlong ptr, int mode) { + NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); + + im->setVolumeKeysRotation(mode); +} + static void nativeSetInteractive(JNIEnv* env, jclass clazz, jlong ptr, jboolean interactive) { NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); @@ -2316,6 +2345,7 @@ static const JNINativeMethod gInputManagerMethods[] = { {"nativeTransferTouch", "(JLandroid/os/IBinder;)Z", (void*)nativeTransferTouch}, {"nativeSetPointerSpeed", "(JI)V", (void*)nativeSetPointerSpeed}, {"nativeSetShowTouches", "(JZ)V", (void*)nativeSetShowTouches}, + {"nativeSetVolumeKeysRotation", "(JI)V", (void*)nativeSetVolumeKeysRotation}, {"nativeSetInteractive", "(JZ)V", (void*)nativeSetInteractive}, {"nativeReloadCalibration", "(J)V", (void*)nativeReloadCalibration}, {"nativeVibrate", "(JI[J[III)V", (void*)nativeVibrate},