summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortbalden <illespal@gmail.com>2013-03-31 18:33:53 +0200
committerGerrit Code Review <gerrit@cyanogenmod.org>2013-04-13 02:11:01 -0700
commit44e5f6caa3df6823984ac08ec45ebabbef199da7 (patch)
tree731284a16dcd106943289f8ed295ac9cb679a573
parent651d219160460a539f96b2e5a8461152aac9e5e4 (diff)
downloadframeworks_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
-rw-r--r--core/java/android/os/IPowerManager.aidl3
-rw-r--r--core/java/android/os/PowerManager.java18
-rw-r--r--core/java/android/text/method/MetaKeyKeyListener.java31
-rw-r--r--services/java/com/android/server/LightsService.java4
-rw-r--r--services/java/com/android/server/power/PowerManagerService.java25
-rw-r--r--services/jni/com_android_server_LightsService.cpp6
-rw-r--r--tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePowerManager.java6
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
+ }
+
}