Merge "Synchronize access to ranking helper records." into oc-dev

This commit is contained in:
TreeHugger Robot
2017-04-14 18:52:36 +00:00
committed by Android (Google) Code Review

View File

@@ -232,7 +232,9 @@ public class RankingHelper implements RankingConfig {
private Record getRecord(String pkg, int uid) {
final String key = recordKey(pkg, uid);
return mRecords.get(key);
synchronized (mRecords) {
return mRecords.get(key);
}
}
private Record getOrCreateRecord(String pkg, int uid) {
@@ -243,29 +245,32 @@ public class RankingHelper implements RankingConfig {
private Record getOrCreateRecord(String pkg, int uid, int importance, int priority,
int visibility, boolean showBadge) {
final String key = recordKey(pkg, uid);
Record r = (uid == Record.UNKNOWN_UID) ? mRestoredWithoutUids.get(pkg) : mRecords.get(key);
if (r == null) {
r = new Record();
r.pkg = pkg;
r.uid = uid;
r.importance = importance;
r.priority = priority;
r.visibility = visibility;
r.showBadge = showBadge;
synchronized (mRecords) {
Record r = (uid == Record.UNKNOWN_UID) ? mRestoredWithoutUids.get(pkg) : mRecords.get(
key);
if (r == null) {
r = new Record();
r.pkg = pkg;
r.uid = uid;
r.importance = importance;
r.priority = priority;
r.visibility = visibility;
r.showBadge = showBadge;
try {
createDefaultChannelIfNeeded(r);
} catch (NameNotFoundException e) {
Slog.e(TAG, "createDefaultChannelIfNeeded - Exception: " + e);
}
try {
createDefaultChannelIfNeeded(r);
} catch (NameNotFoundException e) {
Slog.e(TAG, "createDefaultChannelIfNeeded - Exception: " + e);
}
if (r.uid == Record.UNKNOWN_UID) {
mRestoredWithoutUids.put(pkg, r);
} else {
mRecords.put(key, r);
if (r.uid == Record.UNKNOWN_UID) {
mRestoredWithoutUids.put(pkg, r);
} else {
mRecords.put(key, r);
}
}
return r;
}
return r;
}
private boolean shouldHaveDefaultChannel(Record r) throws NameNotFoundException {
@@ -346,46 +351,48 @@ public class RankingHelper implements RankingConfig {
out.startTag(null, TAG_RANKING);
out.attribute(null, ATT_VERSION, Integer.toString(XML_VERSION));
final int N = mRecords.size();
for (int i = 0; i < N; i++) {
final Record r = mRecords.valueAt(i);
//TODO: http://b/22388012
if (forBackup && UserHandle.getUserId(r.uid) != UserHandle.USER_SYSTEM) {
continue;
}
final boolean hasNonDefaultSettings = r.importance != DEFAULT_IMPORTANCE
|| r.priority != DEFAULT_PRIORITY || r.visibility != DEFAULT_VISIBILITY
|| r.showBadge != DEFAULT_SHOW_BADGE || r.channels.size() > 0
|| r.groups.size() > 0;
if (hasNonDefaultSettings) {
out.startTag(null, TAG_PACKAGE);
out.attribute(null, ATT_NAME, r.pkg);
if (r.importance != DEFAULT_IMPORTANCE) {
out.attribute(null, ATT_IMPORTANCE, Integer.toString(r.importance));
synchronized (mRecords) {
final int N = mRecords.size();
for (int i = 0; i < N; i++) {
final Record r = mRecords.valueAt(i);
//TODO: http://b/22388012
if (forBackup && UserHandle.getUserId(r.uid) != UserHandle.USER_SYSTEM) {
continue;
}
if (r.priority != DEFAULT_PRIORITY) {
out.attribute(null, ATT_PRIORITY, Integer.toString(r.priority));
}
if (r.visibility != DEFAULT_VISIBILITY) {
out.attribute(null, ATT_VISIBILITY, Integer.toString(r.visibility));
}
out.attribute(null, ATT_SHOW_BADGE, Boolean.toString(r.showBadge));
if (!forBackup) {
out.attribute(null, ATT_UID, Integer.toString(r.uid));
}
for (NotificationChannelGroup group : r.groups.values()) {
group.writeXml(out);
}
for (NotificationChannel channel : r.channels.values()) {
if (!forBackup || (forBackup && !channel.isDeleted())) {
channel.writeXml(out);
final boolean hasNonDefaultSettings = r.importance != DEFAULT_IMPORTANCE
|| r.priority != DEFAULT_PRIORITY || r.visibility != DEFAULT_VISIBILITY
|| r.showBadge != DEFAULT_SHOW_BADGE || r.channels.size() > 0
|| r.groups.size() > 0;
if (hasNonDefaultSettings) {
out.startTag(null, TAG_PACKAGE);
out.attribute(null, ATT_NAME, r.pkg);
if (r.importance != DEFAULT_IMPORTANCE) {
out.attribute(null, ATT_IMPORTANCE, Integer.toString(r.importance));
}
}
if (r.priority != DEFAULT_PRIORITY) {
out.attribute(null, ATT_PRIORITY, Integer.toString(r.priority));
}
if (r.visibility != DEFAULT_VISIBILITY) {
out.attribute(null, ATT_VISIBILITY, Integer.toString(r.visibility));
}
out.attribute(null, ATT_SHOW_BADGE, Boolean.toString(r.showBadge));
out.endTag(null, TAG_PACKAGE);
if (!forBackup) {
out.attribute(null, ATT_UID, Integer.toString(r.uid));
}
for (NotificationChannelGroup group : r.groups.values()) {
group.writeXml(out);
}
for (NotificationChannel channel : r.channels.values()) {
if (!forBackup || (forBackup && !channel.isDeleted())) {
channel.writeXml(out);
}
}
out.endTag(null, TAG_PACKAGE);
}
}
}
out.endTag(null, TAG_RANKING);
@@ -814,7 +821,9 @@ public class RankingHelper implements RankingConfig {
pw.println("per-package config:");
}
pw.println("Records:");
dumpRecords(pw, prefix, filter, mRecords);
synchronized (mRecords) {
dumpRecords(pw, prefix, filter, mRecords);
}
pw.println("Restored without uid:");
dumpRecords(pw, prefix, filter, mRestoredWithoutUids);
}
@@ -870,36 +879,38 @@ public class RankingHelper implements RankingConfig {
} catch (JSONException e) {
// pass
}
final int N = mRecords.size();
for (int i = 0; i < N; i++) {
final Record r = mRecords.valueAt(i);
if (filter == null || filter.matches(r.pkg)) {
JSONObject record = new JSONObject();
try {
record.put("userId", UserHandle.getUserId(r.uid));
record.put("packageName", r.pkg);
if (r.importance != DEFAULT_IMPORTANCE) {
record.put("importance", Ranking.importanceToString(r.importance));
synchronized (mRecords) {
final int N = mRecords.size();
for (int i = 0; i < N; i++) {
final Record r = mRecords.valueAt(i);
if (filter == null || filter.matches(r.pkg)) {
JSONObject record = new JSONObject();
try {
record.put("userId", UserHandle.getUserId(r.uid));
record.put("packageName", r.pkg);
if (r.importance != DEFAULT_IMPORTANCE) {
record.put("importance", Ranking.importanceToString(r.importance));
}
if (r.priority != DEFAULT_PRIORITY) {
record.put("priority", Notification.priorityToString(r.priority));
}
if (r.visibility != DEFAULT_VISIBILITY) {
record.put("visibility", Notification.visibilityToString(r.visibility));
}
if (r.showBadge != DEFAULT_SHOW_BADGE) {
record.put("showBadge", Boolean.valueOf(r.showBadge));
}
for (NotificationChannel channel : r.channels.values()) {
record.put("channel", channel.toJson());
}
for (NotificationChannelGroup group : r.groups.values()) {
record.put("group", group.toJson());
}
} catch (JSONException e) {
// pass
}
if (r.priority != DEFAULT_PRIORITY) {
record.put("priority", Notification.priorityToString(r.priority));
}
if (r.visibility != DEFAULT_VISIBILITY) {
record.put("visibility", Notification.visibilityToString(r.visibility));
}
if (r.showBadge != DEFAULT_SHOW_BADGE) {
record.put("showBadge", Boolean.valueOf(r.showBadge));
}
for (NotificationChannel channel : r.channels.values()) {
record.put("channel", channel.toJson());
}
for (NotificationChannelGroup group : r.groups.values()) {
record.put("group", group.toJson());
}
} catch (JSONException e) {
// pass
records.put(record);
}
records.put(record);
}
}
try {
@@ -940,15 +951,18 @@ public class RankingHelper implements RankingConfig {
}
public Map<Integer, String> getPackageBans() {
final int N = mRecords.size();
ArrayMap<Integer, String> packageBans = new ArrayMap<>(N);
for (int i = 0; i < N; i++) {
final Record r = mRecords.valueAt(i);
if (r.importance == NotificationManager.IMPORTANCE_NONE) {
packageBans.put(r.uid, r.pkg);
synchronized (mRecords) {
final int N = mRecords.size();
ArrayMap<Integer, String> packageBans = new ArrayMap<>(N);
for (int i = 0; i < N; i++) {
final Record r = mRecords.valueAt(i);
if (r.importance == NotificationManager.IMPORTANCE_NONE) {
packageBans.put(r.uid, r.pkg);
}
}
return packageBans;
}
return packageBans;
}
/**
@@ -981,15 +995,17 @@ public class RankingHelper implements RankingConfig {
private Map<String, Integer> getPackageChannels() {
ArrayMap<String, Integer> packageChannels = new ArrayMap<>();
for (int i = 0; i < mRecords.size(); i++) {
final Record r = mRecords.valueAt(i);
int channelCount = 0;
for (int j = 0; j < r.channels.size();j++) {
if (!r.channels.valueAt(j).isDeleted()) {
channelCount++;
synchronized (mRecords) {
for (int i = 0; i < mRecords.size(); i++) {
final Record r = mRecords.valueAt(i);
int channelCount = 0;
for (int j = 0; j < r.channels.size(); j++) {
if (!r.channels.valueAt(j).isDeleted()) {
channelCount++;
}
}
packageChannels.put(r.pkg, channelCount);
}
packageChannels.put(r.pkg, channelCount);
}
return packageChannels;
}
@@ -1006,7 +1022,9 @@ public class RankingHelper implements RankingConfig {
for (int i = 0; i < size; i++) {
final String pkg = pkgList[i];
final int uid = uidList[i];
mRecords.remove(recordKey(pkg, uid));
synchronized (mRecords) {
mRecords.remove(recordKey(pkg, uid));
}
mRestoredWithoutUids.remove(pkg);
updated = true;
}
@@ -1018,7 +1036,9 @@ public class RankingHelper implements RankingConfig {
try {
r.uid = mPm.getPackageUidAsUser(r.pkg, changeUserId);
mRestoredWithoutUids.remove(pkg);
mRecords.put(recordKey(r.pkg, r.uid), r);
synchronized (mRecords) {
mRecords.put(recordKey(r.pkg, r.uid), r);
}
updated = true;
} catch (NameNotFoundException e) {
// noop