DO NOT MERGE Allow app switches for accessibility services

Set allow app switches so the accessibility service can start activity
without delay.

Bug: 141873810
TEST: atest AccessibilityServiceConnectionTest
Change-Id: I4204c4cf0baa1f66d6d2d73d56a342ae803d24dd
(cherry picked from commit 24ef87d5f1)
This commit is contained in:
Alex.tc Huang
2019-10-29 19:10:41 +08:00
committed by Alex Huang
parent 8e4e8fd6a0
commit a5b6b37c02
3 changed files with 27 additions and 4 deletions

View File

@@ -217,6 +217,8 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
private final AppOpsManager mAppOpsManager; private final AppOpsManager mAppOpsManager;
private final ActivityTaskManagerInternal mActivityTaskManagerService;
private final MainHandler mMainHandler; private final MainHandler mMainHandler;
private final GlobalActionPerformer mGlobalActionPerformer; private final GlobalActionPerformer mGlobalActionPerformer;
@@ -308,6 +310,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
mMainHandler = new MainHandler(mContext.getMainLooper()); mMainHandler = new MainHandler(mContext.getMainLooper());
mGlobalActionPerformer = new GlobalActionPerformer(mContext, mWindowManagerService); mGlobalActionPerformer = new GlobalActionPerformer(mContext, mWindowManagerService);
mA11yDisplayListener = new AccessibilityDisplayListener(mContext, mMainHandler); mA11yDisplayListener = new AccessibilityDisplayListener(mContext, mMainHandler);
mActivityTaskManagerService = LocalServices.getService(ActivityTaskManagerInternal.class);
registerBroadcastReceivers(); registerBroadcastReceivers();
new AccessibilityContentObserver(mMainHandler).register( new AccessibilityContentObserver(mMainHandler).register(
@@ -1635,7 +1638,8 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
if (service == null) { if (service == null) {
service = new AccessibilityServiceConnection(userState, mContext, componentName, service = new AccessibilityServiceConnection(userState, mContext, componentName,
installedService, sIdCounter++, mMainHandler, mLock, mSecurityPolicy, installedService, sIdCounter++, mMainHandler, mLock, mSecurityPolicy,
this, mWindowManagerService, mGlobalActionPerformer); this, mWindowManagerService, mGlobalActionPerformer,
mActivityTaskManagerService);
} else if (userState.mBoundServices.contains(service)) { } else if (userState.mBoundServices.contains(service)) {
continue; continue;
} }
@@ -3028,7 +3032,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
userState, mContext, userState, mContext,
COMPONENT_NAME, info, sIdCounter++, mMainHandler, mLock, mSecurityPolicy, COMPONENT_NAME, info, sIdCounter++, mMainHandler, mLock, mSecurityPolicy,
AccessibilityManagerService.this, mWindowManagerService, AccessibilityManagerService.this, mWindowManagerService,
mGlobalActionPerformer) { mGlobalActionPerformer, mActivityTaskManagerService) {
@Override @Override
public boolean supportsFlagForNotImportantViews(AccessibilityServiceInfo info) { public boolean supportsFlagForNotImportantViews(AccessibilityServiceInfo info) {
return true; return true;

View File

@@ -34,6 +34,7 @@ import android.util.Slog;
import com.android.server.accessibility.AccessibilityManagerService.SecurityPolicy; import com.android.server.accessibility.AccessibilityManagerService.SecurityPolicy;
import com.android.server.accessibility.AccessibilityManagerService.UserState; import com.android.server.accessibility.AccessibilityManagerService.UserState;
import com.android.server.wm.ActivityTaskManagerInternal;
import com.android.server.wm.WindowManagerInternal; import com.android.server.wm.WindowManagerInternal;
import java.lang.ref.WeakReference; import java.lang.ref.WeakReference;
@@ -58,6 +59,7 @@ class AccessibilityServiceConnection extends AbstractAccessibilityServiceConnect
*/ */
final WeakReference<UserState> mUserStateWeakReference; final WeakReference<UserState> mUserStateWeakReference;
final Intent mIntent; final Intent mIntent;
final ActivityTaskManagerInternal mActivityTaskManagerService;
private final Handler mMainHandler; private final Handler mMainHandler;
@@ -69,7 +71,8 @@ class AccessibilityServiceConnection extends AbstractAccessibilityServiceConnect
AccessibilityServiceInfo accessibilityServiceInfo, int id, Handler mainHandler, AccessibilityServiceInfo accessibilityServiceInfo, int id, Handler mainHandler,
Object lock, SecurityPolicy securityPolicy, SystemSupport systemSupport, Object lock, SecurityPolicy securityPolicy, SystemSupport systemSupport,
WindowManagerInternal windowManagerInternal, WindowManagerInternal windowManagerInternal,
GlobalActionPerformer globalActionPerfomer) { GlobalActionPerformer globalActionPerfomer,
ActivityTaskManagerInternal activityTaskManagerService) {
super(context, componentName, accessibilityServiceInfo, id, mainHandler, lock, super(context, componentName, accessibilityServiceInfo, id, mainHandler, lock,
securityPolicy, systemSupport, windowManagerInternal, globalActionPerfomer); securityPolicy, systemSupport, windowManagerInternal, globalActionPerfomer);
mUserStateWeakReference = new WeakReference<UserState>(userState); mUserStateWeakReference = new WeakReference<UserState>(userState);
@@ -77,6 +80,7 @@ class AccessibilityServiceConnection extends AbstractAccessibilityServiceConnect
mMainHandler = mainHandler; mMainHandler = mainHandler;
mIntent.putExtra(Intent.EXTRA_CLIENT_LABEL, mIntent.putExtra(Intent.EXTRA_CLIENT_LABEL,
com.android.internal.R.string.accessibility_binding_label); com.android.internal.R.string.accessibility_binding_label);
mActivityTaskManagerService = activityTaskManagerService;
final long identity = Binder.clearCallingIdentity(); final long identity = Binder.clearCallingIdentity();
try { try {
mIntent.putExtra(Intent.EXTRA_CLIENT_INTENT, mSystemSupport.getPendingIntentActivity( mIntent.putExtra(Intent.EXTRA_CLIENT_INTENT, mSystemSupport.getPendingIntentActivity(
@@ -103,6 +107,9 @@ class AccessibilityServiceConnection extends AbstractAccessibilityServiceConnect
} finally { } finally {
Binder.restoreCallingIdentity(identity); Binder.restoreCallingIdentity(identity);
} }
mActivityTaskManagerService.setAllowAppSwitches(mComponentName.flattenToString(),
mAccessibilityServiceInfo.getResolveInfo().serviceInfo.applicationInfo.uid,
userState.mUserId);
} }
public void unbindLocked() { public void unbindLocked() {
@@ -111,6 +118,9 @@ class AccessibilityServiceConnection extends AbstractAccessibilityServiceConnect
if (userState == null) return; if (userState == null) return;
userState.removeServiceLocked(this); userState.removeServiceLocked(this);
mSystemSupport.getMagnificationController().resetAllIfNeeded(mId); mSystemSupport.getMagnificationController().resetAllIfNeeded(mId);
// Set uid to -1 to clear allowing app switches.
mActivityTaskManagerService.setAllowAppSwitches(mComponentName.flattenToString(),
/* uid= */ -1, userState.mUserId);
resetLocked(); resetLocked();
} }
@@ -208,6 +218,12 @@ class AccessibilityServiceConnection extends AbstractAccessibilityServiceConnect
@Override @Override
public void onServiceDisconnected(ComponentName componentName) { public void onServiceDisconnected(ComponentName componentName) {
binderDied(); 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 @Override

View File

@@ -39,6 +39,7 @@ import android.os.IBinder;
import android.os.RemoteException; import android.os.RemoteException;
import android.os.UserHandle; import android.os.UserHandle;
import com.android.server.wm.ActivityTaskManagerInternal;
import com.android.server.wm.WindowManagerInternal; import com.android.server.wm.WindowManagerInternal;
import org.junit.After; import org.junit.After;
@@ -67,6 +68,7 @@ public class AccessibilityServiceConnectionTest {
@Mock AccessibilityServiceInfo mMockServiceInfo; @Mock AccessibilityServiceInfo mMockServiceInfo;
@Mock ResolveInfo mMockResolveInfo; @Mock ResolveInfo mMockResolveInfo;
@Mock AccessibilityManagerService.SecurityPolicy mMockSecurityPolicy; @Mock AccessibilityManagerService.SecurityPolicy mMockSecurityPolicy;
@Mock ActivityTaskManagerInternal mMockActivityTaskManagerInternal;
@Mock AbstractAccessibilityServiceConnection.SystemSupport mMockSystemSupport; @Mock AbstractAccessibilityServiceConnection.SystemSupport mMockSystemSupport;
@Mock WindowManagerInternal mMockWindowManagerInternal; @Mock WindowManagerInternal mMockWindowManagerInternal;
@Mock GlobalActionPerformer mMockGlobalActionPerformer; @Mock GlobalActionPerformer mMockGlobalActionPerformer;
@@ -89,7 +91,8 @@ public class AccessibilityServiceConnectionTest {
mConnection = new AccessibilityServiceConnection(mMockUserState, mMockContext, mConnection = new AccessibilityServiceConnection(mMockUserState, mMockContext,
COMPONENT_NAME, mMockServiceInfo, SERVICE_ID, mHandler, new Object(), COMPONENT_NAME, mMockServiceInfo, SERVICE_ID, mHandler, new Object(),
mMockSecurityPolicy, mMockSystemSupport, mMockWindowManagerInternal, mMockSecurityPolicy, mMockSystemSupport, mMockWindowManagerInternal,
mMockGlobalActionPerformer); mMockGlobalActionPerformer, mMockActivityTaskManagerInternal);
when(mMockSecurityPolicy.canPerformGestures(mConnection)).thenReturn(true);
} }
@After @After