diff options
9 files changed, 137 insertions, 1 deletions
diff --git a/core/java/android/os/IPowerManager.aidl b/core/java/android/os/IPowerManager.aidl index 9d7da1a..fa72db5 100644 --- a/core/java/android/os/IPowerManager.aidl +++ b/core/java/android/os/IPowerManager.aidl @@ -62,4 +62,9 @@ interface IPowerManager void setAttentionLight(boolean on, int color); // update the uids being synchronized by network socket request manager void updateBlockedUids(int uid, boolean isBlocked); + + 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 9a1a03e..8a67e4e 100644 --- a/core/java/android/os/PowerManager.java +++ b/core/java/android/os/PowerManager.java @@ -1235,4 +1235,35 @@ public final class PowerManager { } } } + + /** + * @hide + */ + public void setKeyboardVisibility(boolean visible) + { + try { + if (mService != null) { + mService.setKeyboardVisibility(visible); + } + } 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 e9db5fd..569ca60 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 @@ -273,6 +276,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) {} } /** @@ -325,12 +336,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/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java index 2b9e4d0..349027f 100644 --- a/services/core/java/com/android/server/display/DisplayPowerController.java +++ b/services/core/java/com/android/server/display/DisplayPowerController.java @@ -601,11 +601,13 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call if (state == Display.STATE_OFF) { brightness = PowerManager.BRIGHTNESS_OFF; mLights.getLight(LightsManager.LIGHT_ID_BUTTONS).setBrightness(brightness); + mLights.getLight(LightsManager.LIGHT_ID_KEYBOARD).setBrightness(brightness); } // Disable button lights when dozing if (state == Display.STATE_DOZE || state == Display.STATE_DOZE_SUSPEND) { mLights.getLight(LightsManager.LIGHT_ID_BUTTONS).setBrightness(PowerManager.BRIGHTNESS_OFF); + mLights.getLight(LightsManager.LIGHT_ID_KEYBOARD).setBrightness(brightness); } // Configure auto-brightness. diff --git a/services/core/java/com/android/server/lights/LightsManager.java b/services/core/java/com/android/server/lights/LightsManager.java index 2f20509..e1e5aa3 100644 --- a/services/core/java/com/android/server/lights/LightsManager.java +++ b/services/core/java/com/android/server/lights/LightsManager.java @@ -25,7 +25,9 @@ public abstract class LightsManager { 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 abstract Light getLight(int id); } diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index 920d944..cb8b41b 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -2175,6 +2175,10 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } + private boolean isBuiltInKeyboardVisible() { + return mHaveBuiltInKeyboard && !isHidden(mLidKeyboardAccessibility); + } + /** {@inheritDoc} */ @Override public void adjustConfigurationLw(Configuration config, int keyboardPresence, @@ -6525,6 +6529,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { } private void applyLidSwitchState() { + mPowerManager.setKeyboardVisibility(isBuiltInKeyboardVisible()); + if (mLidState == LID_CLOSED && mLidControlsSleep) { mPowerManager.goToSleep(SystemClock.uptimeMillis(), PowerManager.GO_TO_SLEEP_REASON_LID_SWITCH, diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java index ce3497d..97a7bbd 100644 --- a/services/core/java/com/android/server/power/PowerManagerService.java +++ b/services/core/java/com/android/server/power/PowerManagerService.java @@ -177,6 +177,9 @@ public final class PowerManagerService extends SystemService private DreamManagerInternal mDreamManager; private Light mAttentionLight; private Light mButtonsLight; + private Light mKeyboardLight; + private Light mCapsLight; + private Light mFnLight; private final Object mLock = new Object(); @@ -467,6 +470,7 @@ public final class PowerManagerService extends SystemService private static native void nativeSetAutoSuspend(boolean enable); private static native void nativeSendPowerHint(int hintId, int data); private static native void nativeSetFeature(int featureId, int data); + private boolean mKeyboardVisible = false; public PowerManagerService(Context context) { super(context); @@ -547,6 +551,9 @@ public final class PowerManagerService extends SystemService mLightsManager = getLocalService(LightsManager.class); mAttentionLight = mLightsManager.getLight(LightsManager.LIGHT_ID_ATTENTION); mButtonsLight = mLightsManager.getLight(LightsManager.LIGHT_ID_BUTTONS); + mKeyboardLight = mLightsManager.getLight(LightsManager.LIGHT_ID_KEYBOARD); + mCapsLight = mLightsManager.getLight(LightsManager.LIGHT_ID_CAPS); + mFnLight = mLightsManager.getLight(LightsManager.LIGHT_ID_FUNC); // Initialize display power management. mDisplayManagerInternal.initPowerManagement( @@ -1549,8 +1556,10 @@ public final class PowerManagerService extends SystemService if (now < nextTimeout) { if (now > mLastUserActivityTime + BUTTON_ON_DURATION) { mButtonsLight.setBrightness(0); + mKeyboardLight.setBrightness(0); } else { mButtonsLight.setBrightness(mDisplayPowerRequest.screenBrightness); + mKeyboardLight.setBrightness(mKeyboardVisible ? mDisplayPowerRequest.screenBrightness : 0); nextTimeout = now + BUTTON_ON_DURATION; } mUserActivitySummary = USER_ACTIVITY_SCREEN_BRIGHT; @@ -3175,6 +3184,39 @@ public final class PowerManagerService extends SystemService } @Override // Binder call + public void setKeyboardVisibility(boolean visible) { + synchronized (mLock) { + if (DEBUG_SPEW) { + Slog.d(TAG, "setKeyboardVisibility: " + visible); + } + 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, String reason, String opPackageName) { if (eventTime > SystemClock.uptimeMillis()) { throw new IllegalArgumentException("event time must not be in the future"); diff --git a/services/core/jni/com_android_server_lights_LightsService.cpp b/services/core/jni/com_android_server_lights_LightsService.cpp index b2b2783..9c164ed 100644 --- a/services/core/jni/com_android_server_lights_LightsService.cpp +++ b/services/core/jni/com_android_server_lights_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 jlong 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 895f9c9..c0a9d25 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 @@ -155,4 +155,15 @@ public class BridgePowerManager implements IPowerManager { public boolean isScreenBrightnessBoosted() throws RemoteException { return false; } + + @Override + public void setKeyboardVisibility(boolean visible) { + // pass for now + } + + @Override + public void setKeyboardLight(boolean on, int key) { + // pass for now + } + } |
