Don't leak AccessibilityManager binder proxy.
Bug: 190412311 Test: atest MixedDeviceOwnerTest#testPermittedAccessibilityServices Test: com.android.cts.devicepolicy.OrgOwnedProfileOwnerTest#testPersonalAppsSuspensionNormalApp Change-Id: I34b0ff5cbf52786e0f0c10f787e2ceddfca1e4e1
This commit is contained in:
@@ -10005,14 +10005,23 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
|
||||
return true;
|
||||
}
|
||||
|
||||
private AccessibilityManager getAccessibilityManagerForUser(int userId) {
|
||||
/**
|
||||
* Invoke a method in AccessibilityManager ensuring the client is removed.
|
||||
*/
|
||||
private <T> T withAccessibilityManager(
|
||||
int userId, Function<AccessibilityManager, T> function) {
|
||||
// Not using AccessibilityManager.getInstance because that guesses
|
||||
// at the user you require based on callingUid and caches for a given
|
||||
// process.
|
||||
IBinder iBinder = ServiceManager.getService(Context.ACCESSIBILITY_SERVICE);
|
||||
IAccessibilityManager service = iBinder == null
|
||||
final IBinder iBinder = ServiceManager.getService(Context.ACCESSIBILITY_SERVICE);
|
||||
final IAccessibilityManager service = iBinder == null
|
||||
? null : IAccessibilityManager.Stub.asInterface(iBinder);
|
||||
return new AccessibilityManager(mContext, service, userId);
|
||||
final AccessibilityManager am = new AccessibilityManager(mContext, service, userId);
|
||||
try {
|
||||
return function.apply(am);
|
||||
} finally {
|
||||
am.removeClient();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -10025,22 +10034,21 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
|
||||
|
||||
if (packageList != null) {
|
||||
int userId = caller.getUserId();
|
||||
List<AccessibilityServiceInfo> enabledServices = null;
|
||||
final List<AccessibilityServiceInfo> enabledServices;
|
||||
long id = mInjector.binderClearCallingIdentity();
|
||||
try {
|
||||
UserInfo user = getUserInfo(userId);
|
||||
if (user.isManagedProfile()) {
|
||||
userId = user.profileGroupId;
|
||||
}
|
||||
AccessibilityManager accessibilityManager = getAccessibilityManagerForUser(userId);
|
||||
enabledServices = accessibilityManager.getEnabledAccessibilityServiceList(
|
||||
FEEDBACK_ALL_MASK);
|
||||
enabledServices = withAccessibilityManager(userId,
|
||||
am -> am.getEnabledAccessibilityServiceList(FEEDBACK_ALL_MASK));
|
||||
} finally {
|
||||
mInjector.binderRestoreCallingIdentity(id);
|
||||
}
|
||||
|
||||
if (enabledServices != null) {
|
||||
List<String> enabledPackages = new ArrayList<String>();
|
||||
List<String> enabledPackages = new ArrayList<>();
|
||||
for (AccessibilityServiceInfo service : enabledServices) {
|
||||
enabledPackages.add(service.getResolveInfo().serviceInfo.packageName);
|
||||
}
|
||||
@@ -10122,10 +10130,9 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
|
||||
if (user.isManagedProfile()) {
|
||||
userId = user.profileGroupId;
|
||||
}
|
||||
AccessibilityManager accessibilityManager =
|
||||
getAccessibilityManagerForUser(userId);
|
||||
List<AccessibilityServiceInfo> installedServices =
|
||||
accessibilityManager.getInstalledAccessibilityServiceList();
|
||||
final List<AccessibilityServiceInfo> installedServices =
|
||||
withAccessibilityManager(userId,
|
||||
AccessibilityManager::getInstalledAccessibilityServiceList);
|
||||
|
||||
if (installedServices != null) {
|
||||
for (AccessibilityServiceInfo service : installedServices) {
|
||||
|
||||
@@ -18,8 +18,6 @@ package com.android.server.devicepolicy;
|
||||
|
||||
import static android.accessibilityservice.AccessibilityServiceInfo.FEEDBACK_ALL_MASK;
|
||||
|
||||
import static com.android.server.devicepolicy.DevicePolicyManagerService.LOG_TAG;
|
||||
|
||||
import android.accessibilityservice.AccessibilityServiceInfo;
|
||||
import android.annotation.Nullable;
|
||||
import android.annotation.UserIdInt;
|
||||
@@ -142,9 +140,21 @@ public final class PersonalAppsSuspensionHelper {
|
||||
}
|
||||
|
||||
private List<String> getAccessibilityServices() {
|
||||
final List<AccessibilityServiceInfo> accessibilityServiceInfos =
|
||||
getAccessibilityManagerForUser(mContext.getUserId())
|
||||
.getEnabledAccessibilityServiceList(FEEDBACK_ALL_MASK);
|
||||
final List<AccessibilityServiceInfo> accessibilityServiceInfos;
|
||||
// Not using AccessibilityManager.getInstance because that guesses
|
||||
// at the user you require based on callingUid and caches for a given
|
||||
// process.
|
||||
final IBinder iBinder = ServiceManager.getService(Context.ACCESSIBILITY_SERVICE);
|
||||
final IAccessibilityManager service = iBinder == null
|
||||
? null : IAccessibilityManager.Stub.asInterface(iBinder);
|
||||
final AccessibilityManager am =
|
||||
new AccessibilityManager(mContext, service, mContext.getUserId());
|
||||
try {
|
||||
accessibilityServiceInfos = am.getEnabledAccessibilityServiceList(FEEDBACK_ALL_MASK);
|
||||
} finally {
|
||||
am.removeClient();
|
||||
}
|
||||
|
||||
final List<String> result = new ArrayList<>();
|
||||
for (final AccessibilityServiceInfo serviceInfo : accessibilityServiceInfos) {
|
||||
final ComponentName componentName =
|
||||
@@ -192,12 +202,6 @@ public final class PersonalAppsSuspensionHelper {
|
||||
return resolveInfos != null && !resolveInfos.isEmpty();
|
||||
}
|
||||
|
||||
private AccessibilityManager getAccessibilityManagerForUser(int userId) {
|
||||
final IBinder iBinder = ServiceManager.getService(Context.ACCESSIBILITY_SERVICE);
|
||||
final IAccessibilityManager service =
|
||||
iBinder == null ? null : IAccessibilityManager.Stub.asInterface(iBinder);
|
||||
return new AccessibilityManager(mContext, service, userId);
|
||||
}
|
||||
|
||||
void dump(IndentingPrintWriter pw) {
|
||||
pw.println("PersonalAppsSuspensionHelper");
|
||||
|
||||
Reference in New Issue
Block a user