Merge "Don't leak AccessibilityManager binder proxy." into sc-dev am: 1142e5e8cb
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/14919141 Change-Id: I61fcabaee770c4c820cd380797d2fde846db36ab
This commit is contained in:
@@ -10005,14 +10005,23 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
|
|||||||
return true;
|
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
|
// Not using AccessibilityManager.getInstance because that guesses
|
||||||
// at the user you require based on callingUid and caches for a given
|
// at the user you require based on callingUid and caches for a given
|
||||||
// process.
|
// process.
|
||||||
IBinder iBinder = ServiceManager.getService(Context.ACCESSIBILITY_SERVICE);
|
final IBinder iBinder = ServiceManager.getService(Context.ACCESSIBILITY_SERVICE);
|
||||||
IAccessibilityManager service = iBinder == null
|
final IAccessibilityManager service = iBinder == null
|
||||||
? null : IAccessibilityManager.Stub.asInterface(iBinder);
|
? 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
|
@Override
|
||||||
@@ -10025,22 +10034,21 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
|
|||||||
|
|
||||||
if (packageList != null) {
|
if (packageList != null) {
|
||||||
int userId = caller.getUserId();
|
int userId = caller.getUserId();
|
||||||
List<AccessibilityServiceInfo> enabledServices = null;
|
final List<AccessibilityServiceInfo> enabledServices;
|
||||||
long id = mInjector.binderClearCallingIdentity();
|
long id = mInjector.binderClearCallingIdentity();
|
||||||
try {
|
try {
|
||||||
UserInfo user = getUserInfo(userId);
|
UserInfo user = getUserInfo(userId);
|
||||||
if (user.isManagedProfile()) {
|
if (user.isManagedProfile()) {
|
||||||
userId = user.profileGroupId;
|
userId = user.profileGroupId;
|
||||||
}
|
}
|
||||||
AccessibilityManager accessibilityManager = getAccessibilityManagerForUser(userId);
|
enabledServices = withAccessibilityManager(userId,
|
||||||
enabledServices = accessibilityManager.getEnabledAccessibilityServiceList(
|
am -> am.getEnabledAccessibilityServiceList(FEEDBACK_ALL_MASK));
|
||||||
FEEDBACK_ALL_MASK);
|
|
||||||
} finally {
|
} finally {
|
||||||
mInjector.binderRestoreCallingIdentity(id);
|
mInjector.binderRestoreCallingIdentity(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (enabledServices != null) {
|
if (enabledServices != null) {
|
||||||
List<String> enabledPackages = new ArrayList<String>();
|
List<String> enabledPackages = new ArrayList<>();
|
||||||
for (AccessibilityServiceInfo service : enabledServices) {
|
for (AccessibilityServiceInfo service : enabledServices) {
|
||||||
enabledPackages.add(service.getResolveInfo().serviceInfo.packageName);
|
enabledPackages.add(service.getResolveInfo().serviceInfo.packageName);
|
||||||
}
|
}
|
||||||
@@ -10122,10 +10130,9 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
|
|||||||
if (user.isManagedProfile()) {
|
if (user.isManagedProfile()) {
|
||||||
userId = user.profileGroupId;
|
userId = user.profileGroupId;
|
||||||
}
|
}
|
||||||
AccessibilityManager accessibilityManager =
|
final List<AccessibilityServiceInfo> installedServices =
|
||||||
getAccessibilityManagerForUser(userId);
|
withAccessibilityManager(userId,
|
||||||
List<AccessibilityServiceInfo> installedServices =
|
AccessibilityManager::getInstalledAccessibilityServiceList);
|
||||||
accessibilityManager.getInstalledAccessibilityServiceList();
|
|
||||||
|
|
||||||
if (installedServices != null) {
|
if (installedServices != null) {
|
||||||
for (AccessibilityServiceInfo service : installedServices) {
|
for (AccessibilityServiceInfo service : installedServices) {
|
||||||
|
|||||||
@@ -18,8 +18,6 @@ package com.android.server.devicepolicy;
|
|||||||
|
|
||||||
import static android.accessibilityservice.AccessibilityServiceInfo.FEEDBACK_ALL_MASK;
|
import static android.accessibilityservice.AccessibilityServiceInfo.FEEDBACK_ALL_MASK;
|
||||||
|
|
||||||
import static com.android.server.devicepolicy.DevicePolicyManagerService.LOG_TAG;
|
|
||||||
|
|
||||||
import android.accessibilityservice.AccessibilityServiceInfo;
|
import android.accessibilityservice.AccessibilityServiceInfo;
|
||||||
import android.annotation.Nullable;
|
import android.annotation.Nullable;
|
||||||
import android.annotation.UserIdInt;
|
import android.annotation.UserIdInt;
|
||||||
@@ -142,9 +140,21 @@ public final class PersonalAppsSuspensionHelper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private List<String> getAccessibilityServices() {
|
private List<String> getAccessibilityServices() {
|
||||||
final List<AccessibilityServiceInfo> accessibilityServiceInfos =
|
final List<AccessibilityServiceInfo> accessibilityServiceInfos;
|
||||||
getAccessibilityManagerForUser(mContext.getUserId())
|
// Not using AccessibilityManager.getInstance because that guesses
|
||||||
.getEnabledAccessibilityServiceList(FEEDBACK_ALL_MASK);
|
// 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<>();
|
final List<String> result = new ArrayList<>();
|
||||||
for (final AccessibilityServiceInfo serviceInfo : accessibilityServiceInfos) {
|
for (final AccessibilityServiceInfo serviceInfo : accessibilityServiceInfos) {
|
||||||
final ComponentName componentName =
|
final ComponentName componentName =
|
||||||
@@ -192,12 +202,6 @@ public final class PersonalAppsSuspensionHelper {
|
|||||||
return resolveInfos != null && !resolveInfos.isEmpty();
|
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) {
|
void dump(IndentingPrintWriter pw) {
|
||||||
pw.println("PersonalAppsSuspensionHelper");
|
pw.println("PersonalAppsSuspensionHelper");
|
||||||
|
|||||||
Reference in New Issue
Block a user