diff options
| author | Michael Gernoth <michael@gernoth.net> | 2014-11-18 19:43:45 +0100 |
|---|---|---|
| committer | Steve Kondik <steve@cyngn.com> | 2015-10-18 00:51:43 -0700 |
| commit | 11165e591a0e74e889f7b910d8bd81e9ae176a34 (patch) | |
| tree | fc90a44fa4af206555466121f53942d71b119c1f | |
| parent | 4f8045a213600f9115d0e5b43e83627a28ca066c (diff) | |
| download | frameworks_base-11165e591a0e74e889f7b910d8bd81e9ae176a34.zip frameworks_base-11165e591a0e74e889f7b910d8bd81e9ae176a34.tar.gz frameworks_base-11165e591a0e74e889f7b910d8bd81e9ae176a34.tar.bz2 | |
keyboard: re-add code to detect lid state and handle lights
Depends on libhardware patch for the light ids:
http://review.cyanogenmod.org/77944
This squashes the following commits from cm-11.0 and updates
them for cm-12.0:
From: Dave Daynard <nardholio@gmail.com>
Date: Tue, 19 Nov 2013 18:22:45 -0500
Subject: keyboard: re-add code to detect lid state
keyboard: re-add code to detect lid state
This was lost in the cm-11 merge. Without this, a change in lid state
isn't generated to light up the keyboard backlight
Change-Id: Ief35cebcb62da13afe1ae7531d69ab58e196be9e
From: YuanQY <yuanqingyun@gmail.com>
Date: Fri, 8 Feb 2013 10:59:22 +0800
Subject: Keyboard light: Fix the physical keyboard not light when
Keyboard light: Fix the physical keyboard not light when it's visiable.
Change-Id: I595afd3cb6b422a17ae0f6ec20aa51979db13810
From: tbalden <illespal@gmail.com>
Date: Sun, 31 Mar 2013 18:33:53 +0200
Subject: keyboard: adding functional alt/shift lights
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.
Change-Id: I66ebc2d881438f5b51db77eaa885421e65a7da0d
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 + } + } |
