diff options
| author | tbalden <illespal@gmail.com> | 2013-03-31 18:33:53 +0200 |
|---|---|---|
| committer | Gerrit Code Review <gerrit@cyanogenmod.org> | 2013-04-13 02:11:01 -0700 |
| commit | 44e5f6caa3df6823984ac08ec45ebabbef199da7 (patch) | |
| tree | 731284a16dcd106943289f8ed295ac9cb679a573 | |
| parent | 651d219160460a539f96b2e5a8461152aac9e5e4 (diff) | |
| download | frameworks_base-44e5f6caa3df6823984ac08ec45ebabbef199da7.zip frameworks_base-44e5f6caa3df6823984ac08ec45ebabbef199da7.tar.gz frameworks_base-44e5f6caa3df6823984ac08ec45ebabbef199da7.tar.bz2 | |
keyboard: adding functional alt/shift lights
This is useful for devices that has QWERTY keyboard
and leds for the Alt/Shift (Fn/Caps) keys, like
htc doubleshot.
Depends on libhardware patch for the light ids:
http://review.cyanogenmod.org/34902
Change-Id: I66ebc2d881438f5b51db77eaa885421e65a7da0d
7 files changed, 92 insertions, 1 deletions
diff --git a/core/java/android/os/IPowerManager.aidl b/core/java/android/os/IPowerManager.aidl index 24849bd..f743f3a 100644 --- a/core/java/android/os/IPowerManager.aidl +++ b/core/java/android/os/IPowerManager.aidl @@ -55,4 +55,7 @@ interface IPowerManager void cpuBoost(int duration); void setKeyboardVisibility(boolean visible); + + void setKeyboardLight(boolean on, int key); + } diff --git a/core/java/android/os/PowerManager.java b/core/java/android/os/PowerManager.java index 235b232..7370cc5 100644 --- a/core/java/android/os/PowerManager.java +++ b/core/java/android/os/PowerManager.java @@ -868,4 +868,22 @@ public final class PowerManager { } catch (RemoteException e) { } } + + /** + * sets the keyboard LED state + * + * @param on boolean state + * @param key 1 for caps, 2 for fn + * + * {@hide} + */ + public void setKeyboardLight(boolean on, int key) + { + try { + mService.setKeyboardLight(on, key); + } catch (RemoteException e) { + } + } + + } diff --git a/core/java/android/text/method/MetaKeyKeyListener.java b/core/java/android/text/method/MetaKeyKeyListener.java index 0a097f9..293b512 100644 --- a/core/java/android/text/method/MetaKeyKeyListener.java +++ b/core/java/android/text/method/MetaKeyKeyListener.java @@ -23,6 +23,9 @@ import android.text.Spanned; import android.view.KeyEvent; import android.view.View; import android.view.KeyCharacterMap; +import android.os.IPowerManager; +import android.os.RemoteException; +import android.os.ServiceManager; /** * This base class encapsulates the behavior for tracking the state of @@ -214,6 +217,14 @@ public abstract class MetaKeyKeyListener { adjust(content, CAP); adjust(content, ALT); adjust(content, SYM); + try { + IPowerManager power = IPowerManager.Stub.asInterface( + ServiceManager.getService("power")); + if (getMetaState(content, META_SHIFT_ON) <= 0) + power.setKeyboardLight(false, 1); + if (getMetaState(content, META_ALT_ON) <= 0) + power.setKeyboardLight(false, 2); + } catch (RemoteException doe) {} } /** @@ -266,12 +277,32 @@ public abstract class MetaKeyKeyListener { public boolean onKeyDown(View view, Editable content, int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_SHIFT_LEFT || keyCode == KeyEvent.KEYCODE_SHIFT_RIGHT) { press(content, CAP); + try { + IPowerManager power = IPowerManager.Stub.asInterface( + ServiceManager.getService("power")); + int state = content.getSpanFlags(CAP); + if (state == PRESSED || state == LOCKED) { + power.setKeyboardLight(true, 1); + } else { + power.setKeyboardLight(false, 1); + } + } catch (RemoteException doe) {} return true; } if (keyCode == KeyEvent.KEYCODE_ALT_LEFT || keyCode == KeyEvent.KEYCODE_ALT_RIGHT || keyCode == KeyEvent.KEYCODE_NUM) { press(content, ALT); + try { + IPowerManager power = IPowerManager.Stub.asInterface( + ServiceManager.getService("power")); + int state = content.getSpanFlags(ALT); + if (state == PRESSED || state == LOCKED) { + power.setKeyboardLight(true, 2); + } else { + power.setKeyboardLight(false, 2); + } + } catch (RemoteException doe) {} return true; } diff --git a/services/java/com/android/server/LightsService.java b/services/java/com/android/server/LightsService.java index 89bfcac..d5ea4f4 100644 --- a/services/java/com/android/server/LightsService.java +++ b/services/java/com/android/server/LightsService.java @@ -39,7 +39,9 @@ public class LightsService { public static final int LIGHT_ID_ATTENTION = 5; public static final int LIGHT_ID_BLUETOOTH = 6; public static final int LIGHT_ID_WIFI = 7; - public static final int LIGHT_ID_COUNT = 8; + public static final int LIGHT_ID_CAPS = 8; + public static final int LIGHT_ID_FUNC = 9; + public static final int LIGHT_ID_COUNT = 10; public static final int LIGHT_FLASH_NONE = 0; public static final int LIGHT_FLASH_TIMED = 1; diff --git a/services/java/com/android/server/power/PowerManagerService.java b/services/java/com/android/server/power/PowerManagerService.java index 156c08f..e8f6b60 100644 --- a/services/java/com/android/server/power/PowerManagerService.java +++ b/services/java/com/android/server/power/PowerManagerService.java @@ -186,6 +186,8 @@ public final class PowerManagerService extends IPowerManager.Stub private LightsService.Light mAttentionLight; private LightsService.Light mButtonsLight; private LightsService.Light mKeyboardLight; + private LightsService.Light mCapsLight; + private LightsService.Light mFnLight; private final Object mLock = new Object(); @@ -455,6 +457,8 @@ public final class PowerManagerService extends IPowerManager.Stub mAttentionLight = mLightsService.getLight(LightsService.LIGHT_ID_ATTENTION); mButtonsLight = mLightsService.getLight(LightsService.LIGHT_ID_BUTTONS); mKeyboardLight = mLightsService.getLight(LightsService.LIGHT_ID_KEYBOARD); + mCapsLight = mLightsService.getLight(LightsService.LIGHT_ID_CAPS); + mFnLight = mLightsService.getLight(LightsService.LIGHT_ID_FUNC); // Register for broadcasts from other components of the system. IntentFilter filter = new IntentFilter(); @@ -901,11 +905,32 @@ public final class PowerManagerService extends IPowerManager.Stub } if (mKeyboardVisible != visible) { mKeyboardVisible = visible; + if (!visible) { + mKeyboardLight.turnOff(); + // If hiding keyboard, turn off leds + setKeyboardLight(false, 1); + setKeyboardLight(false, 2); + } } } } @Override // Binder call + public void setKeyboardLight(boolean on, int key) { + if (key == 1) { + if (on) + mCapsLight.setColor(0x00ffffff); + else + mCapsLight.turnOff(); + } else if (key == 2) { + if (on) + mFnLight.setColor(0x00ffffff); + else + mFnLight.turnOff(); + } + } + + @Override // Binder call public void wakeUp(long eventTime) { if (eventTime > SystemClock.uptimeMillis()) { throw new IllegalArgumentException("event time must not be in the future"); diff --git a/services/jni/com_android_server_LightsService.cpp b/services/jni/com_android_server_LightsService.cpp index 401e1aa..63a47f8 100644 --- a/services/jni/com_android_server_LightsService.cpp +++ b/services/jni/com_android_server_LightsService.cpp @@ -41,6 +41,8 @@ enum { LIGHT_INDEX_ATTENTION = 5, LIGHT_INDEX_BLUETOOTH = 6, LIGHT_INDEX_WIFI = 7, + LIGHT_INDEX_CAPS = 8, + LIGHT_INDEX_FUNC = 9, LIGHT_COUNT }; @@ -86,6 +88,10 @@ static jint init_native(JNIEnv *env, jobject clazz) = get_device(module, LIGHT_ID_BLUETOOTH); devices->lights[LIGHT_INDEX_WIFI] = get_device(module, LIGHT_ID_WIFI); + devices->lights[LIGHT_INDEX_CAPS] + = get_device(module, LIGHT_ID_CAPS); + devices->lights[LIGHT_INDEX_FUNC] + = get_device(module, LIGHT_ID_FUNC); } else { memset(devices, 0, sizeof(Devices)); } diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePowerManager.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePowerManager.java index b4dd542..fb92f80 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePowerManager.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePowerManager.java @@ -129,4 +129,10 @@ public class BridgePowerManager implements IPowerManager { public void setKeyboardVisibility(boolean visible) { } + + @Override + public void setKeyboardLight(boolean on, int key) { + // pass for now + } + } |
