159e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds/* 259e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds * Copyright (C) 2017 The Android Open Source Project 359e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds * 459e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds * Licensed under the Apache License, Version 2.0 (the "License"); 559e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds * you may not use this file except in compliance with the License. 659e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds * You may obtain a copy of the License at 759e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds * 859e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds * http://www.apache.org/licenses/LICENSE-2.0 959e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds * 1059e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds * Unless required by applicable law or agreed to in writing, software 1159e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds * distributed under the License is distributed on an "AS IS" BASIS, 1259e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1359e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds * See the License for the specific language governing permissions and 1459e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds * limitations under the License. 1559e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds */ 1659e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynoldspackage android.app; 1759e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds 18d5286843737e1117d5c6e90567fd7099a32c3a64Julia Reynoldsimport android.annotation.StringRes; 1959e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynoldsimport android.annotation.SystemApi; 201d97e6a0c1341e3a6d8547fa843cb60ce6677a11Julia Reynoldsimport android.content.Intent; 2159e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynoldsimport android.net.Uri; 2259e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynoldsimport android.os.Parcel; 2359e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynoldsimport android.os.Parcelable; 2459e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynoldsimport android.service.notification.NotificationListenerService; 2559e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynoldsimport android.text.TextUtils; 2659e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynoldsimport android.util.Slog; 2759e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds 2859e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynoldsimport org.json.JSONException; 2959e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynoldsimport org.json.JSONObject; 3059e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynoldsimport org.xmlpull.v1.XmlPullParser; 3159e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynoldsimport org.xmlpull.v1.XmlSerializer; 3259e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds 3359e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynoldsimport java.io.IOException; 3459e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynoldsimport java.util.ArrayList; 3559e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynoldsimport java.util.Arrays; 3659e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynoldsimport java.util.List; 3759e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds 3859e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds/** 3959e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds * A grouping of related notification channels. e.g., channels that all belong to a single account. 4059e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds */ 4159e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynoldspublic final class NotificationChannelGroup implements Parcelable { 4259e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds 432c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds /** 442c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds * The maximum length for text fields in a NotificationChannelGroup. Fields will be truncated at 452c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds * this limit. 462c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds */ 472c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds private static final int MAX_TEXT_LENGTH = 1000; 482c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds 4959e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds private static final String TAG_GROUP = "channelGroup"; 5059e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds private static final String ATT_NAME = "name"; 5159e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds private static final String ATT_ID = "id"; 5259e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds 5359e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds private final String mId; 5459e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds private CharSequence mName; 5559e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds private List<NotificationChannel> mChannels = new ArrayList<>(); 5659e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds 5759e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds /** 581d97e6a0c1341e3a6d8547fa843cb60ce6677a11Julia Reynolds * Creates a notification channel group. 5959e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds * 602c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds * @param id The id of the group. Must be unique per package. the value may be truncated if 612c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds * it is too long. 621d97e6a0c1341e3a6d8547fa843cb60ce6677a11Julia Reynolds * @param name The user visible name of the group. You can rename this group when the system 631d97e6a0c1341e3a6d8547fa843cb60ce6677a11Julia Reynolds * locale changes by listening for the {@link Intent#ACTION_LOCALE_CHANGED} 642c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds * broadcast. <p>The recommended maximum length is 40 characters; the value may be 652c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds * truncated if it is too long. 6659e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds */ 6759e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds public NotificationChannelGroup(String id, CharSequence name) { 682c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds this.mId = getTrimmedString(id); 692c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds this.mName = name != null ? getTrimmedString(name.toString()) : null; 7059e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds } 7159e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds 72bad42976009ffb61010136ed8055f9e0f6d2e416Julia Reynolds /** 73bad42976009ffb61010136ed8055f9e0f6d2e416Julia Reynolds * @hide 74bad42976009ffb61010136ed8055f9e0f6d2e416Julia Reynolds */ 7559e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds protected NotificationChannelGroup(Parcel in) { 7659e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds if (in.readByte() != 0) { 7759e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds mId = in.readString(); 7859e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds } else { 7959e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds mId = null; 8059e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds } 8159e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds mName = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in); 82f02562aeee90e2972849214b715dcfc86aa3084eJulia Reynolds in.readParcelableList(mChannels, NotificationChannel.class.getClassLoader()); 8359e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds } 8459e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds 852c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds private String getTrimmedString(String input) { 862c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds if (input != null && input.length() > MAX_TEXT_LENGTH) { 872c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds return input.substring(0, MAX_TEXT_LENGTH); 882c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds } 892c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds return input; 902c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds } 912c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds 9259e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds @Override 9359e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds public void writeToParcel(Parcel dest, int flags) { 9459e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds if (mId != null) { 9559e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds dest.writeByte((byte) 1); 9659e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds dest.writeString(mId); 9759e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds } else { 9859e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds dest.writeByte((byte) 0); 9959e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds } 10059e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds TextUtils.writeToParcel(mName, dest, flags); 10159e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds dest.writeParcelableList(mChannels, flags); 10259e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds } 10359e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds 10459e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds /** 10559e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds * Returns the id of this channel. 10659e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds */ 10759e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds public String getId() { 10859e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds return mId; 10959e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds } 11059e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds 11159e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds /** 11259e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds * Returns the user visible name of this channel. 11359e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds */ 11459e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds public CharSequence getName() { 11559e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds return mName; 11659e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds } 11759e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds 11859e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds /* 11959e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds * Returns the list of channels that belong to this group 12059e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds * 12159e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds * @hide 12259e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds */ 12359e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds public List<NotificationChannel> getChannels() { 12459e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds return mChannels; 12559e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds } 12659e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds 12759e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds /** 12859e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds * @hide 12959e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds */ 13059e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds public void addChannel(NotificationChannel channel) { 13159e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds mChannels.add(channel); 13259e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds } 13359e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds 13459e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds /** 13559e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds * @hide 13659e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds */ 13759e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds public void writeXml(XmlSerializer out) throws IOException { 13859e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds out.startTag(null, TAG_GROUP); 13959e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds 14059e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds out.attribute(null, ATT_ID, getId()); 141d5286843737e1117d5c6e90567fd7099a32c3a64Julia Reynolds if (getName() != null) { 142d5286843737e1117d5c6e90567fd7099a32c3a64Julia Reynolds out.attribute(null, ATT_NAME, getName().toString()); 143d5286843737e1117d5c6e90567fd7099a32c3a64Julia Reynolds } 14459e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds 14559e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds out.endTag(null, TAG_GROUP); 14659e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds } 14759e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds 14859e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds /** 14959e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds * @hide 15059e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds */ 15159e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds @SystemApi 15259e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds public JSONObject toJson() throws JSONException { 15359e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds JSONObject record = new JSONObject(); 15459e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds record.put(ATT_ID, getId()); 15559e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds record.put(ATT_NAME, getName()); 15659e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds return record; 15759e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds } 15859e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds 15959e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds public static final Creator<NotificationChannelGroup> CREATOR = 16059e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds new Creator<NotificationChannelGroup>() { 16159e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds @Override 16259e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds public NotificationChannelGroup createFromParcel(Parcel in) { 16359e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds return new NotificationChannelGroup(in); 16459e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds } 16559e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds 16659e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds @Override 16759e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds public NotificationChannelGroup[] newArray(int size) { 16859e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds return new NotificationChannelGroup[size]; 16959e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds } 17059e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds }; 17159e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds 17259e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds @Override 17359e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds public int describeContents() { 17459e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds return 0; 17559e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds } 17659e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds 17759e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds @Override 17859e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds public boolean equals(Object o) { 17959e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds if (this == o) return true; 18059e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds if (o == null || getClass() != o.getClass()) return false; 18159e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds 18259e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds NotificationChannelGroup that = (NotificationChannelGroup) o; 18359e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds 18459e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds if (getId() != null ? !getId().equals(that.getId()) : that.getId() != null) return false; 18559e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds if (getName() != null ? !getName().equals(that.getName()) : that.getName() != null) { 18659e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds return false; 18759e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds } 1881d97e6a0c1341e3a6d8547fa843cb60ce6677a11Julia Reynolds return true; 18959e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds } 19059e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds 19159e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds @Override 19274856c4a611b337ded6d3eee14c710cf5f7aae77Julia Reynolds public NotificationChannelGroup clone() { 1931d97e6a0c1341e3a6d8547fa843cb60ce6677a11Julia Reynolds return new NotificationChannelGroup(getId(), getName()); 19474856c4a611b337ded6d3eee14c710cf5f7aae77Julia Reynolds } 19574856c4a611b337ded6d3eee14c710cf5f7aae77Julia Reynolds 19674856c4a611b337ded6d3eee14c710cf5f7aae77Julia Reynolds @Override 19759e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds public int hashCode() { 19859e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds int result = getId() != null ? getId().hashCode() : 0; 19959e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds result = 31 * result + (getName() != null ? getName().hashCode() : 0); 20059e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds return result; 20159e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds } 20259e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds 20359e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds @Override 20459e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds public String toString() { 20559e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds return "NotificationChannelGroup{" + 20659e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds "mId='" + mId + '\'' + 20759e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds ", mName=" + mName + 208d5286843737e1117d5c6e90567fd7099a32c3a64Julia Reynolds ", mChannels=" + mChannels + 20959e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds '}'; 21059e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds } 21159e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds} 212