diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java index 05b937a346260..9bad734cfcfb6 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java @@ -217,6 +217,8 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub private final AppOpsManager mAppOpsManager; + private final ActivityTaskManagerInternal mActivityTaskManagerService; + private final MainHandler mMainHandler; private final GlobalActionPerformer mGlobalActionPerformer; @@ -308,6 +310,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub mMainHandler = new MainHandler(mContext.getMainLooper()); mGlobalActionPerformer = new GlobalActionPerformer(mContext, mWindowManagerService); mA11yDisplayListener = new AccessibilityDisplayListener(mContext, mMainHandler); + mActivityTaskManagerService = LocalServices.getService(ActivityTaskManagerInternal.class); registerBroadcastReceivers(); new AccessibilityContentObserver(mMainHandler).register( @@ -1635,7 +1638,8 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub if (service == null) { service = new AccessibilityServiceConnection(userState, mContext, componentName, installedService, sIdCounter++, mMainHandler, mLock, mSecurityPolicy, - this, mWindowManagerService, mGlobalActionPerformer); + this, mWindowManagerService, mGlobalActionPerformer, + mActivityTaskManagerService); } else if (userState.mBoundServices.contains(service)) { continue; } @@ -3028,7 +3032,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub userState, mContext, COMPONENT_NAME, info, sIdCounter++, mMainHandler, mLock, mSecurityPolicy, AccessibilityManagerService.this, mWindowManagerService, - mGlobalActionPerformer) { + mGlobalActionPerformer, mActivityTaskManagerService) { @Override public boolean supportsFlagForNotImportantViews(AccessibilityServiceInfo info) { return true; diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityServiceConnection.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityServiceConnection.java index b66caa5e324a4..91031e602824a 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityServiceConnection.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityServiceConnection.java @@ -34,6 +34,7 @@ import android.util.Slog; import com.android.server.accessibility.AccessibilityManagerService.SecurityPolicy; import com.android.server.accessibility.AccessibilityManagerService.UserState; +import com.android.server.wm.ActivityTaskManagerInternal; import com.android.server.wm.WindowManagerInternal; import java.lang.ref.WeakReference; @@ -58,6 +59,7 @@ class AccessibilityServiceConnection extends AbstractAccessibilityServiceConnect */ final WeakReference mUserStateWeakReference; final Intent mIntent; + final ActivityTaskManagerInternal mActivityTaskManagerService; private final Handler mMainHandler; @@ -69,7 +71,8 @@ class AccessibilityServiceConnection extends AbstractAccessibilityServiceConnect AccessibilityServiceInfo accessibilityServiceInfo, int id, Handler mainHandler, Object lock, SecurityPolicy securityPolicy, SystemSupport systemSupport, WindowManagerInternal windowManagerInternal, - GlobalActionPerformer globalActionPerfomer) { + GlobalActionPerformer globalActionPerfomer, + ActivityTaskManagerInternal activityTaskManagerService) { super(context, componentName, accessibilityServiceInfo, id, mainHandler, lock, securityPolicy, systemSupport, windowManagerInternal, globalActionPerfomer); mUserStateWeakReference = new WeakReference(userState); @@ -77,6 +80,7 @@ class AccessibilityServiceConnection extends AbstractAccessibilityServiceConnect mMainHandler = mainHandler; mIntent.putExtra(Intent.EXTRA_CLIENT_LABEL, com.android.internal.R.string.accessibility_binding_label); + mActivityTaskManagerService = activityTaskManagerService; final long identity = Binder.clearCallingIdentity(); try { mIntent.putExtra(Intent.EXTRA_CLIENT_INTENT, mSystemSupport.getPendingIntentActivity( @@ -103,6 +107,9 @@ class AccessibilityServiceConnection extends AbstractAccessibilityServiceConnect } finally { Binder.restoreCallingIdentity(identity); } + mActivityTaskManagerService.setAllowAppSwitches(mComponentName.flattenToString(), + mAccessibilityServiceInfo.getResolveInfo().serviceInfo.applicationInfo.uid, + userState.mUserId); } public void unbindLocked() { @@ -111,6 +118,9 @@ class AccessibilityServiceConnection extends AbstractAccessibilityServiceConnect if (userState == null) return; userState.removeServiceLocked(this); mSystemSupport.getMagnificationController().resetAllIfNeeded(mId); + // Set uid to -1 to clear allowing app switches. + mActivityTaskManagerService.setAllowAppSwitches(mComponentName.flattenToString(), + /* uid= */ -1, userState.mUserId); resetLocked(); } @@ -208,6 +218,12 @@ class AccessibilityServiceConnection extends AbstractAccessibilityServiceConnect @Override public void onServiceDisconnected(ComponentName componentName) { binderDied(); + UserState userState = mUserStateWeakReference.get(); + if (userState != null) { + // Set uid to -1 to clear allowing app switches. + mActivityTaskManagerService.setAllowAppSwitches(mComponentName.flattenToString(), + /* uid= */ -1, userState.mUserId); + } } @Override diff --git a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityServiceConnectionTest.java b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityServiceConnectionTest.java index f3364974231bf..ab23b29605aec 100644 --- a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityServiceConnectionTest.java +++ b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityServiceConnectionTest.java @@ -39,6 +39,7 @@ import android.os.IBinder; import android.os.RemoteException; import android.os.UserHandle; +import com.android.server.wm.ActivityTaskManagerInternal; import com.android.server.wm.WindowManagerInternal; import org.junit.After; @@ -67,6 +68,7 @@ public class AccessibilityServiceConnectionTest { @Mock AccessibilityServiceInfo mMockServiceInfo; @Mock ResolveInfo mMockResolveInfo; @Mock AccessibilityManagerService.SecurityPolicy mMockSecurityPolicy; + @Mock ActivityTaskManagerInternal mMockActivityTaskManagerInternal; @Mock AbstractAccessibilityServiceConnection.SystemSupport mMockSystemSupport; @Mock WindowManagerInternal mMockWindowManagerInternal; @Mock GlobalActionPerformer mMockGlobalActionPerformer; @@ -89,7 +91,8 @@ public class AccessibilityServiceConnectionTest { mConnection = new AccessibilityServiceConnection(mMockUserState, mMockContext, COMPONENT_NAME, mMockServiceInfo, SERVICE_ID, mHandler, new Object(), mMockSecurityPolicy, mMockSystemSupport, mMockWindowManagerInternal, - mMockGlobalActionPerformer); + mMockGlobalActionPerformer, mMockActivityTaskManagerInternal); + when(mMockSecurityPolicy.canPerformGestures(mConnection)).thenReturn(true); } @After