Loading core/res/res/values/config.xml +4 −0 Original line number Diff line number Diff line Loading @@ -2427,4 +2427,8 @@ <string name="config_rat_2g" translatable="false">2G</string> <string name="config_rat_3g" translatable="false">3G</string> <string name="config_rat_4g" translatable="false">4G</string> <!-- Keypress Optimization --> <bool name="config_enableKeypressOptimization">false</bool> <integer-array name="keypress_param_value"/> </resources> core/res/res/values/symbols.xml +3 −0 Original line number Diff line number Diff line Loading @@ -2419,4 +2419,7 @@ <java-symbol type="array" name="origin_carrier_names" /> <java-symbol type="array" name="locale_carrier_names" /> <!-- keypress optimization --> <java-symbol type="bool" name="config_enableKeypressOptimization" /> <java-symbol type="array" name="keypress_param_value" /> </resources> services/core/java/com/android/server/InputMethodManagerService.java +129 −0 Original line number Diff line number Diff line Loading @@ -39,6 +39,7 @@ import com.android.server.wm.WindowManagerService; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlSerializer; import android.util.BoostFramework; import android.annotation.Nullable; import android.app.ActivityManagerNative; Loading Loading @@ -417,6 +418,67 @@ public class InputMethodManagerService extends IInputMethodManager.Stub */ boolean mIsInteractive = true; class KeyboardDetect { private BoostFramework mPerf = new BoostFramework(); private int keyboardState = 0; private boolean enKeyOpt; private int keypressParamVal[]; final int INACTIVE = 0; final int FOREGROUND = 1; final int BACKGROUND = 2; synchronized int[] getKeyboardParams(Context context){ enKeyOpt = context.getResources().getBoolean( com.android.internal.R.bool.config_enableKeypressOptimization); if (enKeyOpt) { keypressParamVal = context.getResources().getIntArray( com.android.internal.R.array.keypress_param_value); } return keypressParamVal; } synchronized void keyboardPerflockAcquire() { if (mPerf != null) { try { mPerf.perfLockAcquire(0, getKeyboardParams(mContext)); if (DEBUG) Slog.i(TAG, "Keyboard Perflock Acquired"); } catch (Exception e) { Slog.e(TAG, "Exception caught at perflock acquire", e); return; } } else { Slog.e(TAG, "Perflock object null"); return; } } synchronized void keyboardPerflockRelease() { if (mPerf != null) { try { mPerf.perfLockRelease(); if (DEBUG) Slog.i(TAG, "Keyboard Perflock Released"); } catch (Exception e) { Slog.e(TAG, "Exception caught at perflock release", e); return; } } else { Slog.e(TAG, "Perflock object null"); return; } } synchronized int getKeyboardState() { return keyboardState; } synchronized void setKeyboardState(int state) { keyboardState = state; if (DEBUG) Slog.i(TAG, "Keyboard state is " + keyboardState); } } KeyboardDetect kb = new KeyboardDetect(); int mCurUserActionNotificationSequenceNumber = 0; int mBackDisposition = InputMethodService.BACK_DISPOSITION_DEFAULT; Loading Loading @@ -1115,6 +1177,49 @@ public class InputMethodManagerService extends IInputMethodManager.Stub } } private void setImeWindowVisibilityStatusHiddenLocked() { mImeWindowVis = 0; updateImeWindowStatusLocked(); } private void refreshImeWindowVisibilityLocked() { final Configuration conf = mRes.getConfiguration(); final boolean haveHardKeyboard = conf.keyboard != Configuration.KEYBOARD_NOKEYS; final boolean hardKeyShown = haveHardKeyboard && conf.hardKeyboardHidden != Configuration.HARDKEYBOARDHIDDEN_YES; final boolean isScreenLocked = isKeyguardLocked(); final boolean inputActive = !isScreenLocked && (mInputShown || hardKeyShown); // We assume the softkeyboard is shown when the input is active as long as the // hard keyboard is not shown. final boolean inputVisible = inputActive && !hardKeyShown; mImeWindowVis = (inputActive ? InputMethodService.IME_ACTIVE : 0) | (inputVisible ? InputMethodService.IME_VISIBLE : 0); updateImeWindowStatusLocked(); } private void updateImeWindowStatusLocked() { /* Handle soft input interaction with display screen state */ /* Release perflock if soft input was visible when display about to go off */ if ((kb.getKeyboardState() == kb.FOREGROUND) && !mIsInteractive) { kb.keyboardPerflockRelease(); kb.setKeyboardState(kb.BACKGROUND); if (DEBUG) Slog.i(TAG, "Keyboard in background"); } /* Acquire perflock if display is turning on and soft input is active in background */ else if ((kb.getKeyboardState() == kb.BACKGROUND) && mIsInteractive) { kb.keyboardPerflockAcquire(); kb.setKeyboardState(kb.FOREGROUND); if (DEBUG) Slog.i(TAG, "Keyboard in foreground"); } setImeWindowStatus(mCurToken, mImeWindowVis, mBackDisposition); } // --------------------------------------------------------------------------------------- // Check whether or not this is a valid IPC. Assumes an IPC is valid when either // 1) it comes from the system process Loading Loading @@ -2080,6 +2185,13 @@ public class InputMethodManagerService extends IInputMethodManager.Stub | Context.BIND_FOREGROUND_SERVICE); mVisibleBound = true; } /* Acquire perflock if - display is on, soft input is shown * and perflock not yet acquired */ if (mIsInteractive && kb.getKeyboardState() == kb.INACTIVE) { kb.keyboardPerflockAcquire(); kb.setKeyboardState(kb.FOREGROUND); if (DEBUG) Slog.i(TAG, "Keyboard in foreground"); } res = true; } else if (mHaveConnection && SystemClock.uptimeMillis() >= (mLastBindTime+TIME_TO_RECONNECT)) { Loading Loading @@ -2178,6 +2290,23 @@ public class InputMethodManagerService extends IInputMethodManager.Stub mShowRequested = false; mShowExplicitlyRequested = false; mShowForced = false; /* Release perflock if - display is on, soft input is hidden * and perflock is still acquired */ if (mIsInteractive && kb.getKeyboardState() == kb.FOREGROUND) { kb.keyboardPerflockRelease(); kb.setKeyboardState(kb.INACTIVE); if (DEBUG) Slog.i(TAG, "Keyboard hidden by explicitly"); } /* Change keyboard state - some apps can call hide input after * SCREEN OFF intent, in which case if keyboard was in * BACKGROUND state, it needs to be hidden so state has to * change to INACTIVE. After display comes on, keyboard will * not be visible in the app and perflock is in released state. */ else if (!mIsInteractive && kb.getKeyboardState() == kb.BACKGROUND) { kb.setKeyboardState(kb.INACTIVE); if (DEBUG) Slog.i(TAG, "Keyboard hidden by implicitly"); } return res; } Loading Loading
core/res/res/values/config.xml +4 −0 Original line number Diff line number Diff line Loading @@ -2427,4 +2427,8 @@ <string name="config_rat_2g" translatable="false">2G</string> <string name="config_rat_3g" translatable="false">3G</string> <string name="config_rat_4g" translatable="false">4G</string> <!-- Keypress Optimization --> <bool name="config_enableKeypressOptimization">false</bool> <integer-array name="keypress_param_value"/> </resources>
core/res/res/values/symbols.xml +3 −0 Original line number Diff line number Diff line Loading @@ -2419,4 +2419,7 @@ <java-symbol type="array" name="origin_carrier_names" /> <java-symbol type="array" name="locale_carrier_names" /> <!-- keypress optimization --> <java-symbol type="bool" name="config_enableKeypressOptimization" /> <java-symbol type="array" name="keypress_param_value" /> </resources>
services/core/java/com/android/server/InputMethodManagerService.java +129 −0 Original line number Diff line number Diff line Loading @@ -39,6 +39,7 @@ import com.android.server.wm.WindowManagerService; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlSerializer; import android.util.BoostFramework; import android.annotation.Nullable; import android.app.ActivityManagerNative; Loading Loading @@ -417,6 +418,67 @@ public class InputMethodManagerService extends IInputMethodManager.Stub */ boolean mIsInteractive = true; class KeyboardDetect { private BoostFramework mPerf = new BoostFramework(); private int keyboardState = 0; private boolean enKeyOpt; private int keypressParamVal[]; final int INACTIVE = 0; final int FOREGROUND = 1; final int BACKGROUND = 2; synchronized int[] getKeyboardParams(Context context){ enKeyOpt = context.getResources().getBoolean( com.android.internal.R.bool.config_enableKeypressOptimization); if (enKeyOpt) { keypressParamVal = context.getResources().getIntArray( com.android.internal.R.array.keypress_param_value); } return keypressParamVal; } synchronized void keyboardPerflockAcquire() { if (mPerf != null) { try { mPerf.perfLockAcquire(0, getKeyboardParams(mContext)); if (DEBUG) Slog.i(TAG, "Keyboard Perflock Acquired"); } catch (Exception e) { Slog.e(TAG, "Exception caught at perflock acquire", e); return; } } else { Slog.e(TAG, "Perflock object null"); return; } } synchronized void keyboardPerflockRelease() { if (mPerf != null) { try { mPerf.perfLockRelease(); if (DEBUG) Slog.i(TAG, "Keyboard Perflock Released"); } catch (Exception e) { Slog.e(TAG, "Exception caught at perflock release", e); return; } } else { Slog.e(TAG, "Perflock object null"); return; } } synchronized int getKeyboardState() { return keyboardState; } synchronized void setKeyboardState(int state) { keyboardState = state; if (DEBUG) Slog.i(TAG, "Keyboard state is " + keyboardState); } } KeyboardDetect kb = new KeyboardDetect(); int mCurUserActionNotificationSequenceNumber = 0; int mBackDisposition = InputMethodService.BACK_DISPOSITION_DEFAULT; Loading Loading @@ -1115,6 +1177,49 @@ public class InputMethodManagerService extends IInputMethodManager.Stub } } private void setImeWindowVisibilityStatusHiddenLocked() { mImeWindowVis = 0; updateImeWindowStatusLocked(); } private void refreshImeWindowVisibilityLocked() { final Configuration conf = mRes.getConfiguration(); final boolean haveHardKeyboard = conf.keyboard != Configuration.KEYBOARD_NOKEYS; final boolean hardKeyShown = haveHardKeyboard && conf.hardKeyboardHidden != Configuration.HARDKEYBOARDHIDDEN_YES; final boolean isScreenLocked = isKeyguardLocked(); final boolean inputActive = !isScreenLocked && (mInputShown || hardKeyShown); // We assume the softkeyboard is shown when the input is active as long as the // hard keyboard is not shown. final boolean inputVisible = inputActive && !hardKeyShown; mImeWindowVis = (inputActive ? InputMethodService.IME_ACTIVE : 0) | (inputVisible ? InputMethodService.IME_VISIBLE : 0); updateImeWindowStatusLocked(); } private void updateImeWindowStatusLocked() { /* Handle soft input interaction with display screen state */ /* Release perflock if soft input was visible when display about to go off */ if ((kb.getKeyboardState() == kb.FOREGROUND) && !mIsInteractive) { kb.keyboardPerflockRelease(); kb.setKeyboardState(kb.BACKGROUND); if (DEBUG) Slog.i(TAG, "Keyboard in background"); } /* Acquire perflock if display is turning on and soft input is active in background */ else if ((kb.getKeyboardState() == kb.BACKGROUND) && mIsInteractive) { kb.keyboardPerflockAcquire(); kb.setKeyboardState(kb.FOREGROUND); if (DEBUG) Slog.i(TAG, "Keyboard in foreground"); } setImeWindowStatus(mCurToken, mImeWindowVis, mBackDisposition); } // --------------------------------------------------------------------------------------- // Check whether or not this is a valid IPC. Assumes an IPC is valid when either // 1) it comes from the system process Loading Loading @@ -2080,6 +2185,13 @@ public class InputMethodManagerService extends IInputMethodManager.Stub | Context.BIND_FOREGROUND_SERVICE); mVisibleBound = true; } /* Acquire perflock if - display is on, soft input is shown * and perflock not yet acquired */ if (mIsInteractive && kb.getKeyboardState() == kb.INACTIVE) { kb.keyboardPerflockAcquire(); kb.setKeyboardState(kb.FOREGROUND); if (DEBUG) Slog.i(TAG, "Keyboard in foreground"); } res = true; } else if (mHaveConnection && SystemClock.uptimeMillis() >= (mLastBindTime+TIME_TO_RECONNECT)) { Loading Loading @@ -2178,6 +2290,23 @@ public class InputMethodManagerService extends IInputMethodManager.Stub mShowRequested = false; mShowExplicitlyRequested = false; mShowForced = false; /* Release perflock if - display is on, soft input is hidden * and perflock is still acquired */ if (mIsInteractive && kb.getKeyboardState() == kb.FOREGROUND) { kb.keyboardPerflockRelease(); kb.setKeyboardState(kb.INACTIVE); if (DEBUG) Slog.i(TAG, "Keyboard hidden by explicitly"); } /* Change keyboard state - some apps can call hide input after * SCREEN OFF intent, in which case if keyboard was in * BACKGROUND state, it needs to be hidden so state has to * change to INACTIVE. After display comes on, keyboard will * not be visible in the app and perflock is in released state. */ else if (!mIsInteractive && kb.getKeyboardState() == kb.BACKGROUND) { kb.setKeyboardState(kb.INACTIVE); if (DEBUG) Slog.i(TAG, "Keyboard hidden by implicitly"); } return res; } Loading