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