Merge "User switch not handled properly in the accessibility manager service."
This commit is contained in:
@ -718,7 +718,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
|
|||||||
synchronized (mLock) {
|
synchronized (mLock) {
|
||||||
// Disconnect from services for the old user.
|
// Disconnect from services for the old user.
|
||||||
UserState oldUserState = getUserStateLocked(mCurrentUserId);
|
UserState oldUserState = getUserStateLocked(mCurrentUserId);
|
||||||
unbindAllServicesLocked(oldUserState);
|
oldUserState.onSwitchToAnotherUser();
|
||||||
|
|
||||||
// Disable the local managers for the old user.
|
// Disable the local managers for the old user.
|
||||||
if (oldUserState.mClients.getRegisteredCallbackCount() > 0) {
|
if (oldUserState.mClients.getRegisteredCallbackCount() > 0) {
|
||||||
@ -737,11 +737,14 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
|
|||||||
if (userState.mUiAutomationService != null) {
|
if (userState.mUiAutomationService != null) {
|
||||||
// Switching users disables the UI automation service.
|
// Switching users disables the UI automation service.
|
||||||
userState.mUiAutomationService.binderDied();
|
userState.mUiAutomationService.binderDied();
|
||||||
} else if (readConfigurationForUserStateLocked(userState)) {
|
|
||||||
// Update the user state if needed.
|
|
||||||
onUserStateChangedLocked(userState);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
readConfigurationForUserStateLocked(userState);
|
||||||
|
// Even if reading did not yield change, we have to update
|
||||||
|
// the state since the context in which the current user
|
||||||
|
// state was used has changed since it was inactive.
|
||||||
|
onUserStateChangedLocked(userState);
|
||||||
|
|
||||||
if (announceNewUser) {
|
if (announceNewUser) {
|
||||||
// Schedule announcement of the current user if needed.
|
// Schedule announcement of the current user if needed.
|
||||||
mMainHandler.sendEmptyMessageDelayed(MainHandler.MSG_ANNOUNCE_NEW_USER_IF_NEEDED,
|
mMainHandler.sendEmptyMessageDelayed(MainHandler.MSG_ANNOUNCE_NEW_USER_IF_NEEDED,
|
||||||
@ -2561,11 +2564,21 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
|
|||||||
private class UserState {
|
private class UserState {
|
||||||
public final int mUserId;
|
public final int mUserId;
|
||||||
|
|
||||||
public final CopyOnWriteArrayList<Service> mBoundServices = new CopyOnWriteArrayList<Service>();
|
// Non-transient state.
|
||||||
|
|
||||||
public final RemoteCallbackList<IAccessibilityManagerClient> mClients =
|
public final RemoteCallbackList<IAccessibilityManagerClient> mClients =
|
||||||
new RemoteCallbackList<IAccessibilityManagerClient>();
|
new RemoteCallbackList<IAccessibilityManagerClient>();
|
||||||
|
|
||||||
|
public final SparseArray<AccessibilityConnectionWrapper> mInteractionConnections =
|
||||||
|
new SparseArray<AccessibilityConnectionWrapper>();
|
||||||
|
|
||||||
|
public final SparseArray<IBinder> mWindowTokens = new SparseArray<IBinder>();
|
||||||
|
|
||||||
|
// Transient state.
|
||||||
|
|
||||||
|
public final CopyOnWriteArrayList<Service> mBoundServices =
|
||||||
|
new CopyOnWriteArrayList<Service>();
|
||||||
|
|
||||||
public final Map<ComponentName, Service> mComponentNameToServiceMap =
|
public final Map<ComponentName, Service> mComponentNameToServiceMap =
|
||||||
new HashMap<ComponentName, Service>();
|
new HashMap<ComponentName, Service>();
|
||||||
|
|
||||||
@ -2579,15 +2592,9 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
|
|||||||
public final Set<ComponentName> mTouchExplorationGrantedServices =
|
public final Set<ComponentName> mTouchExplorationGrantedServices =
|
||||||
new HashSet<ComponentName>();
|
new HashSet<ComponentName>();
|
||||||
|
|
||||||
public final SparseArray<AccessibilityConnectionWrapper>
|
|
||||||
mInteractionConnections =
|
|
||||||
new SparseArray<AccessibilityConnectionWrapper>();
|
|
||||||
|
|
||||||
public final SparseArray<IBinder> mWindowTokens = new SparseArray<IBinder>();
|
|
||||||
|
|
||||||
public int mHandledFeedbackTypes = 0;
|
public int mHandledFeedbackTypes = 0;
|
||||||
|
|
||||||
public int mLastSentClientState;
|
public int mLastSentClientState = -1;
|
||||||
|
|
||||||
public boolean mIsAccessibilityEnabled;
|
public boolean mIsAccessibilityEnabled;
|
||||||
public boolean mIsTouchExplorationEnabled;
|
public boolean mIsTouchExplorationEnabled;
|
||||||
@ -2612,6 +2619,34 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
|
|||||||
}
|
}
|
||||||
return clientState;
|
return clientState;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void onSwitchToAnotherUser() {
|
||||||
|
// Clear UI test automation state.
|
||||||
|
if (mUiAutomationService != null) {
|
||||||
|
mUiAutomationService.binderDied();
|
||||||
|
mUiAutomationService = null;
|
||||||
|
mUiAutomationServiceClient = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Unbind all services.
|
||||||
|
unbindAllServicesLocked(this);
|
||||||
|
|
||||||
|
// Clear service management state.
|
||||||
|
mBoundServices.clear();
|
||||||
|
mBindingServices.clear();
|
||||||
|
|
||||||
|
// Clear event management state.
|
||||||
|
mHandledFeedbackTypes = 0;
|
||||||
|
mLastSentClientState = -1;
|
||||||
|
|
||||||
|
// Clear state persisted in settings.
|
||||||
|
mEnabledServices.clear();
|
||||||
|
mTouchExplorationGrantedServices.clear();
|
||||||
|
mIsAccessibilityEnabled = false;
|
||||||
|
mIsTouchExplorationEnabled = false;
|
||||||
|
mIsEnhancedWebAccessibilityEnabled = false;
|
||||||
|
mIsDisplayMagnificationEnabled = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private final class AccessibilityContentObserver extends ContentObserver {
|
private final class AccessibilityContentObserver extends ContentObserver {
|
||||||
|
Reference in New Issue
Block a user