Merge "Synchronize managed services approval list" into qt-qpr1-dev

This commit is contained in:
TreeHugger Robot
2019-07-29 04:50:10 +00:00
committed by Android (Google) Code Review

View File

@@ -196,8 +196,9 @@ abstract public class ManagedServices {
public void dump(PrintWriter pw, DumpFilter filter) { public void dump(PrintWriter pw, DumpFilter filter) {
pw.println(" Allowed " + getCaption() + "s:"); pw.println(" Allowed " + getCaption() + "s:");
synchronized (mApproved) {
final int N = mApproved.size(); final int N = mApproved.size();
for (int i = 0 ; i < N; i++) { for (int i = 0; i < N; i++) {
final int userId = mApproved.keyAt(i); final int userId = mApproved.keyAt(i);
final ArrayMap<Boolean, ArraySet<String>> approvedByType = mApproved.valueAt(i); final ArrayMap<Boolean, ArraySet<String>> approvedByType = mApproved.valueAt(i);
if (approvedByType != null) { if (approvedByType != null) {
@@ -212,6 +213,7 @@ abstract public class ManagedServices {
} }
} }
} }
}
pw.println(" All " + getCaption() + "s (" + mEnabledServicesForCurrentProfiles.size() pw.println(" All " + getCaption() + "s (" + mEnabledServicesForCurrentProfiles.size()
+ ") enabled for current profiles:"); + ") enabled for current profiles:");
@@ -240,8 +242,9 @@ abstract public class ManagedServices {
public void dump(ProtoOutputStream proto, DumpFilter filter) { public void dump(ProtoOutputStream proto, DumpFilter filter) {
proto.write(ManagedServicesProto.CAPTION, getCaption()); proto.write(ManagedServicesProto.CAPTION, getCaption());
synchronized (mApproved) {
final int N = mApproved.size(); final int N = mApproved.size();
for (int i = 0 ; i < N; i++) { for (int i = 0; i < N; i++) {
final int userId = mApproved.keyAt(i); final int userId = mApproved.keyAt(i);
final ArrayMap<Boolean, ArraySet<String>> approvedByType = mApproved.valueAt(i); final ArrayMap<Boolean, ArraySet<String>> approvedByType = mApproved.valueAt(i);
if (approvedByType != null) { if (approvedByType != null) {
@@ -261,6 +264,7 @@ abstract public class ManagedServices {
} }
} }
} }
}
for (ComponentName cmpt : mEnabledServicesForCurrentProfiles) { for (ComponentName cmpt : mEnabledServicesForCurrentProfiles) {
if (filter != null && !filter.matches(cmpt)) continue; if (filter != null && !filter.matches(cmpt)) continue;
@@ -315,8 +319,9 @@ abstract public class ManagedServices {
trimApprovedListsAccordingToInstalledServices(userId); trimApprovedListsAccordingToInstalledServices(userId);
} }
synchronized (mApproved) {
final int N = mApproved.size(); final int N = mApproved.size();
for (int i = 0 ; i < N; i++) { for (int i = 0; i < N; i++) {
final int approvedUserId = mApproved.keyAt(i); final int approvedUserId = mApproved.keyAt(i);
if (forBackup && approvedUserId != userId) { if (forBackup && approvedUserId != userId) {
continue; continue;
@@ -339,13 +344,15 @@ abstract public class ManagedServices {
if (!forBackup && isPrimary) { if (!forBackup && isPrimary) {
// Also write values to settings, for observers who haven't migrated yet // Also write values to settings, for observers who haven't migrated yet
Settings.Secure.putStringForUser(mContext.getContentResolver(), Settings.Secure.putStringForUser(mContext.getContentResolver(),
getConfig().secureSettingName, allowedItems, approvedUserId); getConfig().secureSettingName, allowedItems,
approvedUserId);
} }
} }
} }
} }
} }
}
writeExtraXmlTags(out); writeExtraXmlTags(out);
@@ -440,6 +447,7 @@ abstract public class ManagedServices {
if (TextUtils.isEmpty(approved)) { if (TextUtils.isEmpty(approved)) {
approved = ""; approved = "";
} }
synchronized (mApproved) {
ArrayMap<Boolean, ArraySet<String>> approvedByType = mApproved.get(userId); ArrayMap<Boolean, ArraySet<String>> approvedByType = mApproved.get(userId);
if (approvedByType == null) { if (approvedByType == null) {
approvedByType = new ArrayMap<>(); approvedByType = new ArrayMap<>();
@@ -460,6 +468,7 @@ abstract public class ManagedServices {
} }
} }
} }
}
protected boolean isComponentEnabledForPackage(String pkg) { protected boolean isComponentEnabledForPackage(String pkg) {
return mEnabledServicesPackageNames.contains(pkg); return mEnabledServicesPackageNames.contains(pkg);
@@ -469,6 +478,7 @@ abstract public class ManagedServices {
boolean isPrimary, boolean enabled) { boolean isPrimary, boolean enabled) {
Slog.i(TAG, Slog.i(TAG,
(enabled ? " Allowing " : "Disallowing ") + mConfig.caption + " " + pkgOrComponent); (enabled ? " Allowing " : "Disallowing ") + mConfig.caption + " " + pkgOrComponent);
synchronized (mApproved) {
ArrayMap<Boolean, ArraySet<String>> allowedByType = mApproved.get(userId); ArrayMap<Boolean, ArraySet<String>> allowedByType = mApproved.get(userId);
if (allowedByType == null) { if (allowedByType == null) {
allowedByType = new ArrayMap<>(); allowedByType = new ArrayMap<>();
@@ -488,6 +498,7 @@ abstract public class ManagedServices {
approved.remove(approvedItem); approved.remove(approvedItem);
} }
} }
}
rebindServices(false, userId); rebindServices(false, userId);
} }
@@ -504,14 +515,17 @@ abstract public class ManagedServices {
} }
protected String getApproved(int userId, boolean primary) { protected String getApproved(int userId, boolean primary) {
synchronized (mApproved) {
final ArrayMap<Boolean, ArraySet<String>> allowedByType = final ArrayMap<Boolean, ArraySet<String>> allowedByType =
mApproved.getOrDefault(userId, new ArrayMap<>()); mApproved.getOrDefault(userId, new ArrayMap<>());
ArraySet<String> approved = allowedByType.getOrDefault(primary, new ArraySet<>()); ArraySet<String> approved = allowedByType.getOrDefault(primary, new ArraySet<>());
return String.join(ENABLED_SERVICES_SEPARATOR, approved); return String.join(ENABLED_SERVICES_SEPARATOR, approved);
} }
}
protected List<ComponentName> getAllowedComponents(int userId) { protected List<ComponentName> getAllowedComponents(int userId) {
final List<ComponentName> allowedComponents = new ArrayList<>(); final List<ComponentName> allowedComponents = new ArrayList<>();
synchronized (mApproved) {
final ArrayMap<Boolean, ArraySet<String>> allowedByType = final ArrayMap<Boolean, ArraySet<String>> allowedByType =
mApproved.getOrDefault(userId, new ArrayMap<>()); mApproved.getOrDefault(userId, new ArrayMap<>());
for (int i = 0; i < allowedByType.size(); i++) { for (int i = 0; i < allowedByType.size(); i++) {
@@ -523,11 +537,13 @@ abstract public class ManagedServices {
} }
} }
} }
}
return allowedComponents; return allowedComponents;
} }
protected List<String> getAllowedPackages(int userId) { protected List<String> getAllowedPackages(int userId) {
final List<String> allowedPackages = new ArrayList<>(); final List<String> allowedPackages = new ArrayList<>();
synchronized (mApproved) {
final ArrayMap<Boolean, ArraySet<String>> allowedByType = final ArrayMap<Boolean, ArraySet<String>> allowedByType =
mApproved.getOrDefault(userId, new ArrayMap<>()); mApproved.getOrDefault(userId, new ArrayMap<>());
for (int i = 0; i < allowedByType.size(); i++) { for (int i = 0; i < allowedByType.size(); i++) {
@@ -539,10 +555,12 @@ abstract public class ManagedServices {
} }
} }
} }
}
return allowedPackages; return allowedPackages;
} }
protected boolean isPackageOrComponentAllowed(String pkgOrComponent, int userId) { protected boolean isPackageOrComponentAllowed(String pkgOrComponent, int userId) {
synchronized (mApproved) {
ArrayMap<Boolean, ArraySet<String>> allowedByType = ArrayMap<Boolean, ArraySet<String>> allowedByType =
mApproved.getOrDefault(userId, new ArrayMap<>()); mApproved.getOrDefault(userId, new ArrayMap<>());
for (int i = 0; i < allowedByType.size(); i++) { for (int i = 0; i < allowedByType.size(); i++) {
@@ -551,6 +569,7 @@ abstract public class ManagedServices {
return true; return true;
} }
} }
}
return false; return false;
} }
@@ -558,6 +577,7 @@ abstract public class ManagedServices {
if (pkg == null) { if (pkg == null) {
return false; return false;
} }
synchronized (mApproved) {
ArrayMap<Boolean, ArraySet<String>> allowedByType = ArrayMap<Boolean, ArraySet<String>> allowedByType =
mApproved.getOrDefault(userId, new ArrayMap<>()); mApproved.getOrDefault(userId, new ArrayMap<>());
for (int i = 0; i < allowedByType.size(); i++) { for (int i = 0; i < allowedByType.size(); i++) {
@@ -575,6 +595,7 @@ abstract public class ManagedServices {
} }
} }
} }
}
return false; return false;
} }
@@ -616,7 +637,9 @@ abstract public class ManagedServices {
public void onUserRemoved(int user) { public void onUserRemoved(int user) {
Slog.i(TAG, "Removing approved services for removed user " + user); Slog.i(TAG, "Removing approved services for removed user " + user);
synchronized (mApproved) {
mApproved.remove(user); mApproved.remove(user);
}
rebindServices(true, user); rebindServices(true, user);
} }
@@ -797,6 +820,7 @@ abstract public class ManagedServices {
protected Set<String> getAllowedPackages() { protected Set<String> getAllowedPackages() {
final Set<String> allowedPackages = new ArraySet<>(); final Set<String> allowedPackages = new ArraySet<>();
synchronized (mApproved) {
for (int k = 0; k < mApproved.size(); k++) { for (int k = 0; k < mApproved.size(); k++) {
ArrayMap<Boolean, ArraySet<String>> allowedByType = mApproved.valueAt(k); ArrayMap<Boolean, ArraySet<String>> allowedByType = mApproved.valueAt(k);
for (int i = 0; i < allowedByType.size(); i++) { for (int i = 0; i < allowedByType.size(); i++) {
@@ -809,10 +833,12 @@ abstract public class ManagedServices {
} }
} }
} }
}
return allowedPackages; return allowedPackages;
} }
private void trimApprovedListsAccordingToInstalledServices(int userId) { private void trimApprovedListsAccordingToInstalledServices(int userId) {
synchronized (mApproved) {
final ArrayMap<Boolean, ArraySet<String>> approvedByType = mApproved.get(userId); final ArrayMap<Boolean, ArraySet<String>> approvedByType = mApproved.get(userId);
if (approvedByType == null) { if (approvedByType == null) {
return; return;
@@ -821,7 +847,7 @@ abstract public class ManagedServices {
final ArraySet<String> approved = approvedByType.valueAt(i); final ArraySet<String> approved = approvedByType.valueAt(i);
for (int j = approved.size() - 1; j >= 0; j--) { for (int j = approved.size() - 1; j >= 0; j--) {
final String approvedPackageOrComponent = approved.valueAt(j); final String approvedPackageOrComponent = approved.valueAt(j);
if (!isValidEntry(approvedPackageOrComponent, userId)){ if (!isValidEntry(approvedPackageOrComponent, userId)) {
approved.removeAt(j); approved.removeAt(j);
Slog.v(TAG, "Removing " + approvedPackageOrComponent Slog.v(TAG, "Removing " + approvedPackageOrComponent
+ " from approved list; no matching services found"); + " from approved list; no matching services found");
@@ -834,10 +860,13 @@ abstract public class ManagedServices {
} }
} }
} }
}
private boolean removeUninstalledItemsFromApprovedLists(int uninstalledUserId, String pkg) { private boolean removeUninstalledItemsFromApprovedLists(int uninstalledUserId, String pkg) {
boolean removed = false; boolean removed = false;
final ArrayMap<Boolean, ArraySet<String>> approvedByType = mApproved.get(uninstalledUserId); synchronized (mApproved) {
final ArrayMap<Boolean, ArraySet<String>> approvedByType = mApproved.get(
uninstalledUserId);
if (approvedByType != null) { if (approvedByType != null) {
int M = approvedByType.size(); int M = approvedByType.size();
for (int j = 0; j < M; j++) { for (int j = 0; j < M; j++) {
@@ -856,6 +885,7 @@ abstract public class ManagedServices {
} }
} }
} }
}
return removed; return removed;
} }
@@ -887,6 +917,7 @@ abstract public class ManagedServices {
for (int i = 0; i < nUserIds; ++i) { for (int i = 0; i < nUserIds; ++i) {
final int userId = userIds.get(i); final int userId = userIds.get(i);
synchronized (mApproved) {
final ArrayMap<Boolean, ArraySet<String>> approvedLists = mApproved.get(userId); final ArrayMap<Boolean, ArraySet<String>> approvedLists = mApproved.get(userId);
if (approvedLists != null) { if (approvedLists != null) {
final int N = approvedLists.size(); final int N = approvedLists.size();
@@ -901,6 +932,7 @@ abstract public class ManagedServices {
} }
} }
} }
}
return componentsByUser; return componentsByUser;
} }