Merge "DO NOT MERGE Allow app switches for accessibility services" into qt-qpr1-dev

This commit is contained in:
Alex Huang
2019-12-10 05:33:45 +00:00
committed by Android (Google) Code Review
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