Merge "Revert "Fix binder error when an app has many channels"" into tm-qpr-dev

This commit is contained in:
Julia Reynolds
2022-07-26 14:56:20 +00:00
committed by Android (Google) Code Review
3 changed files with 36 additions and 37 deletions

View File

@@ -20,7 +20,6 @@ import android.annotation.SystemApi;
import android.annotation.TestApi;
import android.compat.annotation.UnsupportedAppUsage;
import android.content.Intent;
import android.content.pm.ParceledListSlice;
import android.os.Parcel;
import android.os.Parcelable;
import android.text.TextUtils;
@@ -67,7 +66,7 @@ public final class NotificationChannelGroup implements Parcelable {
private CharSequence mName;
private String mDescription;
private boolean mBlocked;
private ParceledListSlice<NotificationChannel> mChannels;
private List<NotificationChannel> mChannels = new ArrayList<>();
// Bitwise representation of fields that have been changed by the user
private int mUserLockedFields;
@@ -101,8 +100,7 @@ public final class NotificationChannelGroup implements Parcelable {
} else {
mDescription = null;
}
mChannels = in.readParcelable(
NotificationChannelGroup.class.getClassLoader(), ParceledListSlice.class);
in.readParcelableList(mChannels, NotificationChannel.class.getClassLoader(), android.app.NotificationChannel.class);
mBlocked = in.readBoolean();
mUserLockedFields = in.readInt();
}
@@ -129,7 +127,7 @@ public final class NotificationChannelGroup implements Parcelable {
} else {
dest.writeByte((byte) 0);
}
dest.writeParcelable(mChannels, flags);
dest.writeParcelableList(mChannels, flags);
dest.writeBoolean(mBlocked);
dest.writeInt(mUserLockedFields);
}
@@ -159,7 +157,7 @@ public final class NotificationChannelGroup implements Parcelable {
* Returns the list of channels that belong to this group
*/
public List<NotificationChannel> getChannels() {
return mChannels == null ? new ArrayList<>() : mChannels.getList();
return mChannels;
}
/**
@@ -190,11 +188,18 @@ public final class NotificationChannelGroup implements Parcelable {
mBlocked = blocked;
}
/**
* @hide
*/
public void addChannel(NotificationChannel channel) {
mChannels.add(channel);
}
/**
* @hide
*/
public void setChannels(List<NotificationChannel> channels) {
mChannels = new ParceledListSlice<>(channels);
mChannels = channels;
}
/**
@@ -329,7 +334,7 @@ public final class NotificationChannelGroup implements Parcelable {
proto.write(NotificationChannelGroupProto.NAME, mName.toString());
proto.write(NotificationChannelGroupProto.DESCRIPTION, mDescription);
proto.write(NotificationChannelGroupProto.IS_BLOCKED, mBlocked);
for (NotificationChannel channel : mChannels.getList()) {
for (NotificationChannel channel : mChannels) {
channel.dumpDebug(proto, NotificationChannelGroupProto.CHANNELS);
}
proto.end(token);

View File

@@ -98,7 +98,7 @@ class ChannelEditorDialogControllerTest : SysuiTestCase() {
@Test
fun testPrepareDialogForApp_onlyDefaultChannel() {
group.channels = listOf(channelDefault)
group.addChannel(channelDefault)
controller.prepareDialogForApp(TEST_APP_NAME, TEST_PACKAGE_NAME, TEST_UID,
setOf(channelDefault), appIcon, clickListener)

View File

@@ -86,7 +86,6 @@ import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
@@ -1328,17 +1327,16 @@ public class PreferencesHelper implements RankingConfig {
return null;
}
NotificationChannelGroup group = r.groups.get(groupId).clone();
ArrayList channels = new ArrayList();
group.setChannels(new ArrayList<>());
int N = r.channels.size();
for (int i = 0; i < N; i++) {
final NotificationChannel nc = r.channels.valueAt(i);
if (includeDeleted || !nc.isDeleted()) {
if (groupId.equals(nc.getGroup())) {
channels.add(nc);
group.addChannel(nc);
}
}
}
group.setChannels(channels);
return group;
}
}
@@ -1359,48 +1357,44 @@ public class PreferencesHelper implements RankingConfig {
public ParceledListSlice<NotificationChannelGroup> getNotificationChannelGroups(String pkg,
int uid, boolean includeDeleted, boolean includeNonGrouped, boolean includeEmpty) {
Objects.requireNonNull(pkg);
List<NotificationChannelGroup> groups = new ArrayList<>();
Map<String, NotificationChannelGroup> groups = new ArrayMap<>();
synchronized (mPackagePreferences) {
PackagePreferences r = getPackagePreferencesLocked(pkg, uid);
if (r == null) {
return ParceledListSlice.emptyList();
}
Map<String, ArrayList<NotificationChannel>> groupedChannels = new HashMap();
NotificationChannelGroup nonGrouped = new NotificationChannelGroup(null, null);
int N = r.channels.size();
for (int i = 0; i < N; i++) {
final NotificationChannel nc = r.channels.valueAt(i);
if (includeDeleted || !nc.isDeleted()) {
if (nc.getGroup() != null) {
if (r.groups.get(nc.getGroup()) != null) {
ArrayList<NotificationChannel> channels = groupedChannels.getOrDefault(
nc.getGroup(), new ArrayList<>());
channels.add(nc);
groupedChannels.put(nc.getGroup(), channels);
NotificationChannelGroup ncg = groups.get(nc.getGroup());
if (ncg == null) {
ncg = r.groups.get(nc.getGroup()).clone();
ncg.setChannels(new ArrayList<>());
groups.put(nc.getGroup(), ncg);
}
ncg.addChannel(nc);
}
} else {
ArrayList<NotificationChannel> channels = groupedChannels.getOrDefault(
null, new ArrayList<>());
channels.add(nc);
groupedChannels.put(null, channels);
nonGrouped.addChannel(nc);
}
}
}
for (NotificationChannelGroup group : r.groups.values()) {
ArrayList<NotificationChannel> channels =
groupedChannels.getOrDefault(group.getId(), new ArrayList<>());
if (includeEmpty || !channels.isEmpty()) {
NotificationChannelGroup clone = group.clone();
clone.setChannels(channels);
groups.add(clone);
if (includeNonGrouped && nonGrouped.getChannels().size() > 0) {
groups.put(null, nonGrouped);
}
if (includeEmpty) {
for (NotificationChannelGroup group : r.groups.values()) {
if (!groups.containsKey(group.getId())) {
groups.put(group.getId(), group);
}
}
}
if (includeNonGrouped && groupedChannels.containsKey(null)) {
NotificationChannelGroup nonGrouped = new NotificationChannelGroup(null, null);
nonGrouped.setChannels(groupedChannels.get(null));
groups.add(nonGrouped);
}
return new ParceledListSlice<>(groups);
return new ParceledListSlice<>(new ArrayList<>(groups.values()));
}
}