Loading services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +41 −21 Original line number Original line Diff line number Diff line Loading @@ -322,28 +322,28 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub @Override @Override public void setImeSessionEnabled(SparseArray<IInputMethodSession> sessions, public void setImeSessionEnabled(SparseArray<IInputMethodSession> sessions, boolean enabled) { boolean enabled) { mService.setImeSessionEnabled(sessions, enabled); mService.scheduleSetImeSessionEnabled(sessions, enabled); } } @Override @Override public void unbindInput() { public void unbindInput() { mService.unbindInput(); mService.scheduleUnbindInput(); } } @Override @Override public void bindInput(InputBinding binding) { public void bindInput(InputBinding binding) { mService.bindInput(binding); mService.scheduleBindInput(binding); } } @Override @Override public void createImeSession(ArraySet<Integer> ignoreSet) { public void createImeSession(ArraySet<Integer> ignoreSet) { mService.createImeSession(ignoreSet); mService.scheduleCreateImeSession(ignoreSet); } } @Override @Override public void startInput(IBinder startInputToken, IInputContext inputContext, public void startInput(IBinder startInputToken, IInputContext inputContext, EditorInfo editorInfo, boolean restarting) { EditorInfo editorInfo, boolean restarting) { mService.startInput(startInputToken, inputContext, editorInfo, restarting); mService.scheduleStartInput(startInputToken, inputContext, editorInfo, restarting); } } } } Loading Loading @@ -4377,12 +4377,16 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub * * * @param binding Information given to an accessibility service about a client connecting to it. * @param binding Information given to an accessibility service about a client connecting to it. */ */ public void bindInput(InputBinding binding) { public void scheduleBindInput(InputBinding binding) { AccessibilityUserState userState; mMainHandler.sendMessage(obtainMessage(AccessibilityManagerService::bindInput, this, binding)); } private void bindInput(InputBinding binding) { synchronized (mLock) { synchronized (mLock) { // Keep records of these in case new Accessibility Services are enabled. // Keep records of these in case new Accessibility Services are enabled. mInputBinding = binding; mInputBinding = binding; userState = getCurrentUserStateLocked(); AccessibilityUserState userState = getCurrentUserStateLocked(); for (int i = userState.mBoundServices.size() - 1; i >= 0; i--) { for (int i = userState.mBoundServices.size() - 1; i >= 0; i--) { final AccessibilityServiceConnection service = userState.mBoundServices.get(i); final AccessibilityServiceConnection service = userState.mBoundServices.get(i); if (service.requestImeApis()) { if (service.requestImeApis()) { Loading @@ -4395,11 +4399,13 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub /** /** * Unbind input for accessibility services which request ime capabilities. * Unbind input for accessibility services which request ime capabilities. */ */ public void unbindInput() { public void scheduleUnbindInput() { AccessibilityUserState userState; mMainHandler.sendMessage(obtainMessage(AccessibilityManagerService::unbindInput, this)); // TODO(b/218182733): Resolve the Imf lock and mLock possible deadlock } private void unbindInput() { synchronized (mLock) { synchronized (mLock) { userState = getCurrentUserStateLocked(); AccessibilityUserState userState = getCurrentUserStateLocked(); for (int i = userState.mBoundServices.size() - 1; i >= 0; i--) { for (int i = userState.mBoundServices.size() - 1; i >= 0; i--) { final AccessibilityServiceConnection service = userState.mBoundServices.get(i); final AccessibilityServiceConnection service = userState.mBoundServices.get(i); if (service.requestImeApis()) { if (service.requestImeApis()) { Loading @@ -4412,16 +4418,21 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub /** /** * Start input for accessibility services which request ime capabilities. * Start input for accessibility services which request ime capabilities. */ */ public void startInput(IBinder startInputToken, IInputContext inputContext, public void scheduleStartInput(IBinder startInputToken, IInputContext inputContext, EditorInfo editorInfo, boolean restarting) { mMainHandler.sendMessage(obtainMessage(AccessibilityManagerService::startInput, this, startInputToken, inputContext, editorInfo, restarting)); } private void startInput(IBinder startInputToken, IInputContext inputContext, EditorInfo editorInfo, boolean restarting) { EditorInfo editorInfo, boolean restarting) { AccessibilityUserState userState; synchronized (mLock) { synchronized (mLock) { // Keep records of these in case new Accessibility Services are enabled. // Keep records of these in case new Accessibility Services are enabled. mStartInputToken = startInputToken; mStartInputToken = startInputToken; mInputContext = inputContext; mInputContext = inputContext; mEditorInfo = editorInfo; mEditorInfo = editorInfo; mRestarting = restarting; mRestarting = restarting; userState = getCurrentUserStateLocked(); AccessibilityUserState userState = getCurrentUserStateLocked(); for (int i = userState.mBoundServices.size() - 1; i >= 0; i--) { for (int i = userState.mBoundServices.size() - 1; i >= 0; i--) { final AccessibilityServiceConnection service = userState.mBoundServices.get(i); final AccessibilityServiceConnection service = userState.mBoundServices.get(i); if (service.requestImeApis()) { if (service.requestImeApis()) { Loading @@ -4435,11 +4446,15 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub * Request input sessions from all accessibility services which request ime capabilities and * Request input sessions from all accessibility services which request ime capabilities and * whose id is not in the ignoreSet * whose id is not in the ignoreSet */ */ public void createImeSession(ArraySet<Integer> ignoreSet) { public void scheduleCreateImeSession(ArraySet<Integer> ignoreSet) { AccessibilityUserState userState; mMainHandler.sendMessage(obtainMessage(AccessibilityManagerService::createImeSession, this, ignoreSet)); } private void createImeSession(ArraySet<Integer> ignoreSet) { synchronized (mLock) { synchronized (mLock) { mInputSessionRequested = true; mInputSessionRequested = true; userState = getCurrentUserStateLocked(); AccessibilityUserState userState = getCurrentUserStateLocked(); for (int i = userState.mBoundServices.size() - 1; i >= 0; i--) { for (int i = userState.mBoundServices.size() - 1; i >= 0; i--) { final AccessibilityServiceConnection service = userState.mBoundServices.get(i); final AccessibilityServiceConnection service = userState.mBoundServices.get(i); if ((!ignoreSet.contains(service.mId)) && service.requestImeApis()) { if ((!ignoreSet.contains(service.mId)) && service.requestImeApis()) { Loading @@ -4455,10 +4470,15 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub * @param sessions Sessions to enable or disable. * @param sessions Sessions to enable or disable. * @param enabled True if enable the sessions or false if disable the sessions. * @param enabled True if enable the sessions or false if disable the sessions. */ */ public void setImeSessionEnabled(SparseArray<IInputMethodSession> sessions, boolean enabled) { public void scheduleSetImeSessionEnabled(SparseArray<IInputMethodSession> sessions, AccessibilityUserState userState; boolean enabled) { mMainHandler.sendMessage(obtainMessage(AccessibilityManagerService::setImeSessionEnabled, this, sessions, enabled)); } private void setImeSessionEnabled(SparseArray<IInputMethodSession> sessions, boolean enabled) { synchronized (mLock) { synchronized (mLock) { userState = getCurrentUserStateLocked(); AccessibilityUserState userState = getCurrentUserStateLocked(); for (int i = userState.mBoundServices.size() - 1; i >= 0; i--) { for (int i = userState.mBoundServices.size() - 1; i >= 0; i--) { final AccessibilityServiceConnection service = userState.mBoundServices.get(i); final AccessibilityServiceConnection service = userState.mBoundServices.get(i); if (sessions.contains(service.mId) && service.requestImeApis()) { if (sessions.contains(service.mId) && service.requestImeApis()) { Loading Loading
services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +41 −21 Original line number Original line Diff line number Diff line Loading @@ -322,28 +322,28 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub @Override @Override public void setImeSessionEnabled(SparseArray<IInputMethodSession> sessions, public void setImeSessionEnabled(SparseArray<IInputMethodSession> sessions, boolean enabled) { boolean enabled) { mService.setImeSessionEnabled(sessions, enabled); mService.scheduleSetImeSessionEnabled(sessions, enabled); } } @Override @Override public void unbindInput() { public void unbindInput() { mService.unbindInput(); mService.scheduleUnbindInput(); } } @Override @Override public void bindInput(InputBinding binding) { public void bindInput(InputBinding binding) { mService.bindInput(binding); mService.scheduleBindInput(binding); } } @Override @Override public void createImeSession(ArraySet<Integer> ignoreSet) { public void createImeSession(ArraySet<Integer> ignoreSet) { mService.createImeSession(ignoreSet); mService.scheduleCreateImeSession(ignoreSet); } } @Override @Override public void startInput(IBinder startInputToken, IInputContext inputContext, public void startInput(IBinder startInputToken, IInputContext inputContext, EditorInfo editorInfo, boolean restarting) { EditorInfo editorInfo, boolean restarting) { mService.startInput(startInputToken, inputContext, editorInfo, restarting); mService.scheduleStartInput(startInputToken, inputContext, editorInfo, restarting); } } } } Loading Loading @@ -4377,12 +4377,16 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub * * * @param binding Information given to an accessibility service about a client connecting to it. * @param binding Information given to an accessibility service about a client connecting to it. */ */ public void bindInput(InputBinding binding) { public void scheduleBindInput(InputBinding binding) { AccessibilityUserState userState; mMainHandler.sendMessage(obtainMessage(AccessibilityManagerService::bindInput, this, binding)); } private void bindInput(InputBinding binding) { synchronized (mLock) { synchronized (mLock) { // Keep records of these in case new Accessibility Services are enabled. // Keep records of these in case new Accessibility Services are enabled. mInputBinding = binding; mInputBinding = binding; userState = getCurrentUserStateLocked(); AccessibilityUserState userState = getCurrentUserStateLocked(); for (int i = userState.mBoundServices.size() - 1; i >= 0; i--) { for (int i = userState.mBoundServices.size() - 1; i >= 0; i--) { final AccessibilityServiceConnection service = userState.mBoundServices.get(i); final AccessibilityServiceConnection service = userState.mBoundServices.get(i); if (service.requestImeApis()) { if (service.requestImeApis()) { Loading @@ -4395,11 +4399,13 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub /** /** * Unbind input for accessibility services which request ime capabilities. * Unbind input for accessibility services which request ime capabilities. */ */ public void unbindInput() { public void scheduleUnbindInput() { AccessibilityUserState userState; mMainHandler.sendMessage(obtainMessage(AccessibilityManagerService::unbindInput, this)); // TODO(b/218182733): Resolve the Imf lock and mLock possible deadlock } private void unbindInput() { synchronized (mLock) { synchronized (mLock) { userState = getCurrentUserStateLocked(); AccessibilityUserState userState = getCurrentUserStateLocked(); for (int i = userState.mBoundServices.size() - 1; i >= 0; i--) { for (int i = userState.mBoundServices.size() - 1; i >= 0; i--) { final AccessibilityServiceConnection service = userState.mBoundServices.get(i); final AccessibilityServiceConnection service = userState.mBoundServices.get(i); if (service.requestImeApis()) { if (service.requestImeApis()) { Loading @@ -4412,16 +4418,21 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub /** /** * Start input for accessibility services which request ime capabilities. * Start input for accessibility services which request ime capabilities. */ */ public void startInput(IBinder startInputToken, IInputContext inputContext, public void scheduleStartInput(IBinder startInputToken, IInputContext inputContext, EditorInfo editorInfo, boolean restarting) { mMainHandler.sendMessage(obtainMessage(AccessibilityManagerService::startInput, this, startInputToken, inputContext, editorInfo, restarting)); } private void startInput(IBinder startInputToken, IInputContext inputContext, EditorInfo editorInfo, boolean restarting) { EditorInfo editorInfo, boolean restarting) { AccessibilityUserState userState; synchronized (mLock) { synchronized (mLock) { // Keep records of these in case new Accessibility Services are enabled. // Keep records of these in case new Accessibility Services are enabled. mStartInputToken = startInputToken; mStartInputToken = startInputToken; mInputContext = inputContext; mInputContext = inputContext; mEditorInfo = editorInfo; mEditorInfo = editorInfo; mRestarting = restarting; mRestarting = restarting; userState = getCurrentUserStateLocked(); AccessibilityUserState userState = getCurrentUserStateLocked(); for (int i = userState.mBoundServices.size() - 1; i >= 0; i--) { for (int i = userState.mBoundServices.size() - 1; i >= 0; i--) { final AccessibilityServiceConnection service = userState.mBoundServices.get(i); final AccessibilityServiceConnection service = userState.mBoundServices.get(i); if (service.requestImeApis()) { if (service.requestImeApis()) { Loading @@ -4435,11 +4446,15 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub * Request input sessions from all accessibility services which request ime capabilities and * Request input sessions from all accessibility services which request ime capabilities and * whose id is not in the ignoreSet * whose id is not in the ignoreSet */ */ public void createImeSession(ArraySet<Integer> ignoreSet) { public void scheduleCreateImeSession(ArraySet<Integer> ignoreSet) { AccessibilityUserState userState; mMainHandler.sendMessage(obtainMessage(AccessibilityManagerService::createImeSession, this, ignoreSet)); } private void createImeSession(ArraySet<Integer> ignoreSet) { synchronized (mLock) { synchronized (mLock) { mInputSessionRequested = true; mInputSessionRequested = true; userState = getCurrentUserStateLocked(); AccessibilityUserState userState = getCurrentUserStateLocked(); for (int i = userState.mBoundServices.size() - 1; i >= 0; i--) { for (int i = userState.mBoundServices.size() - 1; i >= 0; i--) { final AccessibilityServiceConnection service = userState.mBoundServices.get(i); final AccessibilityServiceConnection service = userState.mBoundServices.get(i); if ((!ignoreSet.contains(service.mId)) && service.requestImeApis()) { if ((!ignoreSet.contains(service.mId)) && service.requestImeApis()) { Loading @@ -4455,10 +4470,15 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub * @param sessions Sessions to enable or disable. * @param sessions Sessions to enable or disable. * @param enabled True if enable the sessions or false if disable the sessions. * @param enabled True if enable the sessions or false if disable the sessions. */ */ public void setImeSessionEnabled(SparseArray<IInputMethodSession> sessions, boolean enabled) { public void scheduleSetImeSessionEnabled(SparseArray<IInputMethodSession> sessions, AccessibilityUserState userState; boolean enabled) { mMainHandler.sendMessage(obtainMessage(AccessibilityManagerService::setImeSessionEnabled, this, sessions, enabled)); } private void setImeSessionEnabled(SparseArray<IInputMethodSession> sessions, boolean enabled) { synchronized (mLock) { synchronized (mLock) { userState = getCurrentUserStateLocked(); AccessibilityUserState userState = getCurrentUserStateLocked(); for (int i = userState.mBoundServices.size() - 1; i >= 0; i--) { for (int i = userState.mBoundServices.size() - 1; i >= 0; i--) { final AccessibilityServiceConnection service = userState.mBoundServices.get(i); final AccessibilityServiceConnection service = userState.mBoundServices.get(i); if (sessions.contains(service.mId) && service.requestImeApis()) { if (sessions.contains(service.mId) && service.requestImeApis()) { Loading