Merge "DO NOT MERGE Allow app switches for accessibility services" into qt-qpr1-dev
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user