NotificationChannel.java revision f732159cf8d6a4e1cd17542a3a2cf020ad6919a3
185769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds/*
285769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds * Copyright (C) 2016 The Android Open Source Project
385769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds *
485769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds * Licensed under the Apache License, Version 2.0 (the "License");
585769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds * you may not use this file except in compliance with the License.
685769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds * You may obtain a copy of the License at
785769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds *
885769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds *      http://www.apache.org/licenses/LICENSE-2.0
985769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds *
1085769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds * Unless required by applicable law or agreed to in writing, software
1185769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds * distributed under the License is distributed on an "AS IS" BASIS,
1285769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1385769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds * See the License for the specific language governing permissions and
1485769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds * limitations under the License.
1585769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds */
16b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynoldspackage android.app;
17b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
18b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynoldsimport org.json.JSONException;
19b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynoldsimport org.json.JSONObject;
20b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynoldsimport org.xmlpull.v1.XmlPullParser;
21b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynoldsimport org.xmlpull.v1.XmlSerializer;
22b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
23b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynoldsimport android.annotation.SystemApi;
246503bd8e33dbf6e8357256d43c6e1158e32a0268Jeff Sharkeyimport android.app.NotificationManager.Importance;
251d97e6a0c1341e3a6d8547fa843cb60ce6677a11Julia Reynoldsimport android.content.Intent;
26619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynoldsimport android.media.AudioAttributes;
27b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynoldsimport android.net.Uri;
28b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynoldsimport android.os.Parcel;
29b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynoldsimport android.os.Parcelable;
30184b86da382b8e24cdd0e5629e70d7057d418883Julia Reynoldsimport android.provider.Settings;
31b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynoldsimport android.service.notification.NotificationListenerService;
32b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynoldsimport android.text.TextUtils;
33b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
34b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynoldsimport java.io.IOException;
35f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynoldsimport java.util.Arrays;
36b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
37b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds/**
38b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds * A representation of settings that apply to a collection of similarly themed notifications.
39b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds */
40b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynoldspublic final class NotificationChannel implements Parcelable {
41b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
42b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    /**
43bad42976009ffb61010136ed8055f9e0f6d2e416Julia Reynolds     * The id of the default channel for an app. This id is reserved by the system. All
44bad42976009ffb61010136ed8055f9e0f6d2e416Julia Reynolds     * notifications posted from apps targeting {@link android.os.Build.VERSION_CODES#N_MR1} or
45bad42976009ffb61010136ed8055f9e0f6d2e416Julia Reynolds     * earlier without a notification channel specified are posted to this channel.
46b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     */
47b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    public static final String DEFAULT_CHANNEL_ID = "miscellaneous";
48b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
492c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds    /**
502c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds     * The maximum length for text fields in a NotificationChannel. Fields will be truncated at this
512c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds     * limit.
522c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds     */
532c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds    private static final int MAX_TEXT_LENGTH = 1000;
542c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds
55b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    private static final String TAG_CHANNEL = "channel";
56b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    private static final String ATT_NAME = "name";
572c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds    private static final String ATT_DESC = "desc";
58b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    private static final String ATT_ID = "id";
594036e8d4c636ae36f28585d283b522a7a97eaf72Julia Reynolds    private static final String ATT_DELETED = "deleted";
60b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    private static final String ATT_PRIORITY = "priority";
61b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    private static final String ATT_VISIBILITY = "visibility";
62b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    private static final String ATT_IMPORTANCE = "importance";
63b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    private static final String ATT_LIGHTS = "lights";
6459e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds    private static final String ATT_LIGHT_COLOR = "light_color";
65b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    private static final String ATT_VIBRATION = "vibration";
66f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds    private static final String ATT_VIBRATION_ENABLED = "vibration_enabled";
670c299d4d6316d14e43d386b4562782083fe3c886Julia Reynolds    private static final String ATT_SOUND = "sound";
68619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds    private static final String ATT_USAGE = "usage";
69619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds    private static final String ATT_FLAGS = "flags";
70619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds    private static final String ATT_CONTENT_TYPE = "content_type";
71baff400fa5a93d157934818982fcf534327f9830Julia Reynolds    private static final String ATT_SHOW_BADGE = "show_badge";
7285769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    private static final String ATT_USER_LOCKED = "locked";
7359e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds    private static final String ATT_GROUP = "group";
74f732159cf8d6a4e1cd17542a3a2cf020ad6919a3Julia Reynolds    private static final String ATT_BLOCKABLE_SYSTEM = "blockable_system";
75f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds    private static final String DELIMITER = ",";
7685769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds
7785769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    /**
7885769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds     * @hide
7985769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds     */
8085769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    public static final int USER_LOCKED_PRIORITY = 0x00000001;
8185769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    /**
8285769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds     * @hide
8385769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds     */
8485769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    public static final int USER_LOCKED_VISIBILITY = 0x00000002;
8585769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    /**
8685769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds     * @hide
8785769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds     */
8885769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    public static final int USER_LOCKED_IMPORTANCE = 0x00000004;
8985769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    /**
9085769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds     * @hide
9185769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds     */
9285769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    public static final int USER_LOCKED_LIGHTS = 0x00000008;
9385769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    /**
9485769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds     * @hide
9585769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds     */
9685769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    public static final int USER_LOCKED_VIBRATION = 0x00000010;
9785769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    /**
9885769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds     * @hide
9985769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds     */
1000c299d4d6316d14e43d386b4562782083fe3c886Julia Reynolds    public static final int USER_LOCKED_SOUND = 0x00000020;
101b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
102baff400fa5a93d157934818982fcf534327f9830Julia Reynolds    /**
103baff400fa5a93d157934818982fcf534327f9830Julia Reynolds     * @hide
104baff400fa5a93d157934818982fcf534327f9830Julia Reynolds     */
105baff400fa5a93d157934818982fcf534327f9830Julia Reynolds    public static final int USER_LOCKED_SHOW_BADGE = 0x00000080;
106baff400fa5a93d157934818982fcf534327f9830Julia Reynolds
107baff400fa5a93d157934818982fcf534327f9830Julia Reynolds    /**
108baff400fa5a93d157934818982fcf534327f9830Julia Reynolds     * @hide
109baff400fa5a93d157934818982fcf534327f9830Julia Reynolds     */
110baff400fa5a93d157934818982fcf534327f9830Julia Reynolds    public static final int[] LOCKABLE_FIELDS = new int[] {
111baff400fa5a93d157934818982fcf534327f9830Julia Reynolds            USER_LOCKED_PRIORITY,
112baff400fa5a93d157934818982fcf534327f9830Julia Reynolds            USER_LOCKED_VISIBILITY,
113baff400fa5a93d157934818982fcf534327f9830Julia Reynolds            USER_LOCKED_IMPORTANCE,
114baff400fa5a93d157934818982fcf534327f9830Julia Reynolds            USER_LOCKED_LIGHTS,
115baff400fa5a93d157934818982fcf534327f9830Julia Reynolds            USER_LOCKED_VIBRATION,
116baff400fa5a93d157934818982fcf534327f9830Julia Reynolds            USER_LOCKED_SOUND,
117619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds            USER_LOCKED_SHOW_BADGE,
118baff400fa5a93d157934818982fcf534327f9830Julia Reynolds    };
119baff400fa5a93d157934818982fcf534327f9830Julia Reynolds
120529e3329e68963eff0dd1cf40d938a9953cd5060Julia Reynolds    private static final int DEFAULT_LIGHT_COLOR = 0;
121b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    private static final int DEFAULT_VISIBILITY =
12285769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds            NotificationManager.VISIBILITY_NO_OVERRIDE;
123b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    private static final int DEFAULT_IMPORTANCE =
12485769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds            NotificationManager.IMPORTANCE_UNSPECIFIED;
1254036e8d4c636ae36f28585d283b522a7a97eaf72Julia Reynolds    private static final boolean DEFAULT_DELETED = false;
126924eed1ca6d3fec5dae7eb0f9c11b8f23f628697Julia Reynolds    private static final boolean DEFAULT_SHOW_BADGE = true;
127b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
128b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    private final String mId;
1292c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds    private String mName;
1302c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds    private String mDesc;
131b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    private int mImportance = DEFAULT_IMPORTANCE;
132b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    private boolean mBypassDnd;
133b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    private int mLockscreenVisibility = DEFAULT_VISIBILITY;
134184b86da382b8e24cdd0e5629e70d7057d418883Julia Reynolds    private Uri mSound = Settings.System.DEFAULT_NOTIFICATION_URI;
135b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    private boolean mLights;
136529e3329e68963eff0dd1cf40d938a9953cd5060Julia Reynolds    private int mLightColor = DEFAULT_LIGHT_COLOR;
137f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds    private long[] mVibration;
13885769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    private int mUserLockedFields;
139f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds    private boolean mVibrationEnabled;
140924eed1ca6d3fec5dae7eb0f9c11b8f23f628697Julia Reynolds    private boolean mShowBadge = DEFAULT_SHOW_BADGE;
1414036e8d4c636ae36f28585d283b522a7a97eaf72Julia Reynolds    private boolean mDeleted = DEFAULT_DELETED;
14259e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds    private String mGroup;
143619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds    private AudioAttributes mAudioAttributes = Notification.AUDIO_ATTRIBUTES_DEFAULT;
144f732159cf8d6a4e1cd17542a3a2cf020ad6919a3Julia Reynolds    private boolean mBlockableSystem = false;
145b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
146b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    /**
147b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     * Creates a notification channel.
148b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     *
1492c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds     * @param id The id of the channel. Must be unique per package. The value may be truncated if
1502c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds     *           it is too long.
1512c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds     * @param name The user visible name of the channel. You can rename this channel when the system
1521d97e6a0c1341e3a6d8547fa843cb60ce6677a11Julia Reynolds     *             locale changes by listening for the {@link Intent#ACTION_LOCALE_CHANGED}
1532c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds     *             broadcast. The recommended maximum length is 40 characters; the value may be
1542c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds     *             truncated if it is too long.
15585769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds     * @param importance The importance of the channel. This controls how interruptive notifications
15630e06bb668f2e4b024c4ebc2a131de91c96de5ebJeff Sharkey     *                   posted to this channel are.
157b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     */
15830e06bb668f2e4b024c4ebc2a131de91c96de5ebJeff Sharkey    public NotificationChannel(String id, CharSequence name, @Importance int importance) {
1592c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds        this.mId = getTrimmedString(id);
1602c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds        this.mName = name != null ? getTrimmedString(name.toString()) : null;
16185769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds        this.mImportance = importance;
162b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
163b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
164bad42976009ffb61010136ed8055f9e0f6d2e416Julia Reynolds    /**
165bad42976009ffb61010136ed8055f9e0f6d2e416Julia Reynolds     * @hide
166bad42976009ffb61010136ed8055f9e0f6d2e416Julia Reynolds     */
167b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    protected NotificationChannel(Parcel in) {
168b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        if (in.readByte() != 0) {
169b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds            mId = in.readString();
170b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        } else {
171b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds            mId = null;
172b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        }
1732c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds        if (in.readByte() != 0) {
1742c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds            mName = in.readString();
1752c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds        } else {
1762c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds            mName = null;
1772c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds        }
1782c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds        if (in.readByte() != 0) {
1792c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds            mDesc = in.readString();
1802c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds        } else {
1812c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds            mDesc = null;
1822c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds        }
183b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        mImportance = in.readInt();
184b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        mBypassDnd = in.readByte() != 0;
185b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        mLockscreenVisibility = in.readInt();
186b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        if (in.readByte() != 0) {
1870c299d4d6316d14e43d386b4562782083fe3c886Julia Reynolds            mSound = Uri.CREATOR.createFromParcel(in);
188b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        } else {
1890c299d4d6316d14e43d386b4562782083fe3c886Julia Reynolds            mSound = null;
190b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        }
191b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        mLights = in.readByte() != 0;
192f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        mVibration = in.createLongArray();
19385769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds        mUserLockedFields = in.readInt();
194f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        mVibrationEnabled = in.readByte() != 0;
195baff400fa5a93d157934818982fcf534327f9830Julia Reynolds        mShowBadge = in.readByte() != 0;
1964036e8d4c636ae36f28585d283b522a7a97eaf72Julia Reynolds        mDeleted = in.readByte() != 0;
19759e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds        if (in.readByte() != 0) {
19859e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds            mGroup = in.readString();
19959e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds        } else {
20059e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds            mGroup = null;
20159e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds        }
202619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds        mAudioAttributes = in.readInt() > 0 ? AudioAttributes.CREATOR.createFromParcel(in) : null;
203529e3329e68963eff0dd1cf40d938a9953cd5060Julia Reynolds        mLightColor = in.readInt();
204f732159cf8d6a4e1cd17542a3a2cf020ad6919a3Julia Reynolds        mBlockableSystem = in.readBoolean();
205b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
206b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
207b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    @Override
208b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    public void writeToParcel(Parcel dest, int flags) {
209b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        if (mId != null) {
210b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds            dest.writeByte((byte) 1);
211b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds            dest.writeString(mId);
212b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        } else {
213b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds            dest.writeByte((byte) 0);
214b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        }
2152c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds        if (mName != null) {
2162c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds            dest.writeByte((byte) 1);
2172c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds            dest.writeString(mName);
2182c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds        } else {
2192c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds            dest.writeByte((byte) 0);
2202c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds        }
2212c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds        if (mDesc != null) {
2222c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds            dest.writeByte((byte) 1);
2232c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds            dest.writeString(mDesc);
2242c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds        } else {
2252c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds            dest.writeByte((byte) 0);
2262c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds        }
227b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        dest.writeInt(mImportance);
228b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        dest.writeByte(mBypassDnd ? (byte) 1 : (byte) 0);
229b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        dest.writeInt(mLockscreenVisibility);
2300c299d4d6316d14e43d386b4562782083fe3c886Julia Reynolds        if (mSound != null) {
231b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds            dest.writeByte((byte) 1);
2320c299d4d6316d14e43d386b4562782083fe3c886Julia Reynolds            mSound.writeToParcel(dest, 0);
233b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        } else {
234b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds            dest.writeByte((byte) 0);
235b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        }
236b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        dest.writeByte(mLights ? (byte) 1 : (byte) 0);
237f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        dest.writeLongArray(mVibration);
23885769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds        dest.writeInt(mUserLockedFields);
239f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        dest.writeByte(mVibrationEnabled ? (byte) 1 : (byte) 0);
240baff400fa5a93d157934818982fcf534327f9830Julia Reynolds        dest.writeByte(mShowBadge ? (byte) 1 : (byte) 0);
2414036e8d4c636ae36f28585d283b522a7a97eaf72Julia Reynolds        dest.writeByte(mDeleted ? (byte) 1 : (byte) 0);
24259e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds        if (mGroup != null) {
24359e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds            dest.writeByte((byte) 1);
24459e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds            dest.writeString(mGroup);
24559e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds        } else {
24659e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds            dest.writeByte((byte) 0);
24759e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds        }
248619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds        if (mAudioAttributes != null) {
249619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds            dest.writeInt(1);
250619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds            mAudioAttributes.writeToParcel(dest, 0);
251619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds        } else {
252619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds            dest.writeInt(0);
253619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds        }
254529e3329e68963eff0dd1cf40d938a9953cd5060Julia Reynolds        dest.writeInt(mLightColor);
255f732159cf8d6a4e1cd17542a3a2cf020ad6919a3Julia Reynolds        dest.writeBoolean(mBlockableSystem);
256b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
257b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
258b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    /**
259b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     * @hide
260b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     */
26185769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    public void lockFields(int field) {
26285769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds        mUserLockedFields |= field;
263b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
264b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
2654036e8d4c636ae36f28585d283b522a7a97eaf72Julia Reynolds    /**
2664036e8d4c636ae36f28585d283b522a7a97eaf72Julia Reynolds     * @hide
2674036e8d4c636ae36f28585d283b522a7a97eaf72Julia Reynolds     */
268e0b25746267972b370a1c773ad18d146ee8163c3Julia Reynolds    public void unlockFields(int field) {
269e0b25746267972b370a1c773ad18d146ee8163c3Julia Reynolds        mUserLockedFields &= ~field;
270e0b25746267972b370a1c773ad18d146ee8163c3Julia Reynolds    }
271e0b25746267972b370a1c773ad18d146ee8163c3Julia Reynolds
272e0b25746267972b370a1c773ad18d146ee8163c3Julia Reynolds    /**
273e0b25746267972b370a1c773ad18d146ee8163c3Julia Reynolds     * @hide
274e0b25746267972b370a1c773ad18d146ee8163c3Julia Reynolds     */
2754036e8d4c636ae36f28585d283b522a7a97eaf72Julia Reynolds    public void setDeleted(boolean deleted) {
2764036e8d4c636ae36f28585d283b522a7a97eaf72Julia Reynolds        mDeleted = deleted;
2774036e8d4c636ae36f28585d283b522a7a97eaf72Julia Reynolds    }
2784036e8d4c636ae36f28585d283b522a7a97eaf72Julia Reynolds
279f732159cf8d6a4e1cd17542a3a2cf020ad6919a3Julia Reynolds    /**
280f732159cf8d6a4e1cd17542a3a2cf020ad6919a3Julia Reynolds     * @hide
281f732159cf8d6a4e1cd17542a3a2cf020ad6919a3Julia Reynolds     */
282f732159cf8d6a4e1cd17542a3a2cf020ad6919a3Julia Reynolds    public void setBlockableSystem(boolean blockableSystem) {
283f732159cf8d6a4e1cd17542a3a2cf020ad6919a3Julia Reynolds        mBlockableSystem = blockableSystem;
284f732159cf8d6a4e1cd17542a3a2cf020ad6919a3Julia Reynolds    }
2852c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds    // Modifiable by apps post channel creation
286b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
287b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    /**
2882c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds     * Sets the user visible name of this channel.
289baff400fa5a93d157934818982fcf534327f9830Julia Reynolds     *
2902c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds     * <p>The recommended maximum length is 40 characters; the value may be truncated if it is too
2912c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds     * long.
292b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     */
2932c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds    public void setName(CharSequence name) {
2942c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds        mName = name != null ? getTrimmedString(name.toString()) : null;
295b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
296b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
297b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    /**
2982c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds     * Sets the user visible description of this channel.
29985769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds     *
3002c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds     * <p>The recommended maximum length is 300 characters; the value may be truncated if it is too
3012c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds     * long.
302b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     */
3032c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds    public void setDescription(String description) {
3042c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds        mDesc = getTrimmedString(description);
305b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
306b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
3072c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds    private String getTrimmedString(String input) {
3082c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds        if (input != null && input.length() > MAX_TEXT_LENGTH) {
3092c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds            return input.substring(0, MAX_TEXT_LENGTH);
3102c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds        }
3112c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds        return input;
31285769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    }
31385769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds
3148f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds    // Modifiable by apps on channel creation.
315b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
316b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    /**
31759e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds     * Sets what group this channel belongs to.
31859e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds     *
31959e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds     * Group information is only used for presentation, not for behavior.
32059e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds     *
321619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds     * Only modifiable before the channel is submitted to
322619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds     * {@link NotificationManager#notify(String, int, Notification)}.
323619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds     *
32459e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds     * @param groupId the id of a group created by
32559e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds     * {@link NotificationManager#createNotificationChannelGroup(NotificationChannelGroup)}.
32659e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds     */
32759e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds    public void setGroup(String groupId) {
32859e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds        this.mGroup = groupId;
32959e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds    }
33059e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds
33159e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds    /**
332f35e3976e3c01077f8d8d0938d2ba0b3e5b80613Julia Reynolds     * Sets whether notifications posted to this channel can appear as application icon badges
333f35e3976e3c01077f8d8d0938d2ba0b3e5b80613Julia Reynolds     * in a Launcher.
334f35e3976e3c01077f8d8d0938d2ba0b3e5b80613Julia Reynolds     *
335f35e3976e3c01077f8d8d0938d2ba0b3e5b80613Julia Reynolds     * @param showBadge true if badges should be allowed to be shown.
336f35e3976e3c01077f8d8d0938d2ba0b3e5b80613Julia Reynolds     */
337f35e3976e3c01077f8d8d0938d2ba0b3e5b80613Julia Reynolds    public void setShowBadge(boolean showBadge) {
338f35e3976e3c01077f8d8d0938d2ba0b3e5b80613Julia Reynolds        this.mShowBadge = showBadge;
339f35e3976e3c01077f8d8d0938d2ba0b3e5b80613Julia Reynolds    }
340f35e3976e3c01077f8d8d0938d2ba0b3e5b80613Julia Reynolds
341f35e3976e3c01077f8d8d0938d2ba0b3e5b80613Julia Reynolds    /**
342619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds     * Sets the sound that should be played for notifications posted to this channel and its
343184b86da382b8e24cdd0e5629e70d7057d418883Julia Reynolds     * audio attributes. Notification channels with an {@link #getImportance() importance} of at
344184b86da382b8e24cdd0e5629e70d7057d418883Julia Reynolds     * least {@link NotificationManager#IMPORTANCE_DEFAULT} should have a sound.
345619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds     *
346619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds     * Only modifiable before the channel is submitted to
347619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds     * {@link NotificationManager#notify(String, int, Notification)}.
348b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     */
349619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds    public void setSound(Uri sound, AudioAttributes audioAttributes) {
3500c299d4d6316d14e43d386b4562782083fe3c886Julia Reynolds        this.mSound = sound;
351619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds        this.mAudioAttributes = audioAttributes;
352b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
353b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
354b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    /**
355b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     * Sets whether notifications posted to this channel should display notification lights,
356619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds     * on devices that support that feature.
357619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds     *
358619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds     * Only modifiable before the channel is submitted to
359619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds     * {@link NotificationManager#notify(String, int, Notification)}.
360b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     */
361529e3329e68963eff0dd1cf40d938a9953cd5060Julia Reynolds    public void enableLights(boolean lights) {
362b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        this.mLights = lights;
363b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
364b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
365b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    /**
366529e3329e68963eff0dd1cf40d938a9953cd5060Julia Reynolds     * Sets the notification light color for notifications posted to this channel, if lights are
367529e3329e68963eff0dd1cf40d938a9953cd5060Julia Reynolds     * {@link #enableLights(boolean) enabled} on this channel and the device supports that feature.
368529e3329e68963eff0dd1cf40d938a9953cd5060Julia Reynolds     *
369529e3329e68963eff0dd1cf40d938a9953cd5060Julia Reynolds     * Only modifiable before the channel is submitted to
370529e3329e68963eff0dd1cf40d938a9953cd5060Julia Reynolds     * {@link NotificationManager#notify(String, int, Notification)}.
371529e3329e68963eff0dd1cf40d938a9953cd5060Julia Reynolds     */
372529e3329e68963eff0dd1cf40d938a9953cd5060Julia Reynolds    public void setLightColor(int argb) {
373529e3329e68963eff0dd1cf40d938a9953cd5060Julia Reynolds        this.mLightColor = argb;
374529e3329e68963eff0dd1cf40d938a9953cd5060Julia Reynolds    }
375529e3329e68963eff0dd1cf40d938a9953cd5060Julia Reynolds
376529e3329e68963eff0dd1cf40d938a9953cd5060Julia Reynolds    /**
377f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds     * Sets whether notification posted to this channel should vibrate. The vibration pattern can
378619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds     * be set with {@link #setVibrationPattern(long[])}.
379619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds     *
380619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds     * Only modifiable before the channel is submitted to
381619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds     * {@link NotificationManager#notify(String, int, Notification)}.
382f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds     */
383f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds    public void enableVibration(boolean vibration) {
384f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        this.mVibrationEnabled = vibration;
385f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds    }
386f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds
387f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds    /**
388a33f5c4312ce708933454dfd1b154ccc46be099cJulia Reynolds     * Sets the vibration pattern for notifications posted to this channel. If the provided
389a33f5c4312ce708933454dfd1b154ccc46be099cJulia Reynolds     * pattern is valid (non-null, non-empty), will {@link #enableVibration(boolean)} enable
390a33f5c4312ce708933454dfd1b154ccc46be099cJulia Reynolds     * vibration} as well. Otherwise, vibration will be disabled.
391619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds     *
392619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds     * Only modifiable before the channel is submitted to
393619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds     * {@link NotificationManager#notify(String, int, Notification)}.
394b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     */
395f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds    public void setVibrationPattern(long[] vibrationPattern) {
396a33f5c4312ce708933454dfd1b154ccc46be099cJulia Reynolds        this.mVibrationEnabled = vibrationPattern != null && vibrationPattern.length > 0;
397f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        this.mVibration = vibrationPattern;
398b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
399b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
400b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    /**
4016503bd8e33dbf6e8357256d43c6e1158e32a0268Jeff Sharkey     * Sets the level of interruption of this notification channel. Only
4026503bd8e33dbf6e8357256d43c6e1158e32a0268Jeff Sharkey     * modifiable before the channel is submitted to
4032c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds     * {@link NotificationManager#notify(String, int, Notification)}.
4042c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds     *
4056503bd8e33dbf6e8357256d43c6e1158e32a0268Jeff Sharkey     * @param importance the amount the user should be interrupted by
4066503bd8e33dbf6e8357256d43c6e1158e32a0268Jeff Sharkey     *            notifications from this channel.
4072c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds     */
4086503bd8e33dbf6e8357256d43c6e1158e32a0268Jeff Sharkey    public void setImportance(@Importance int importance) {
4092c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds        this.mImportance = importance;
4102c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds    }
4112c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds
4122c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds    // Modifiable by a notification ranker.
4132c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds
4142c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds    /**
4152c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds     * Sets whether or not notifications posted to this channel can interrupt the user in
4162c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds     * {@link android.app.NotificationManager.Policy#INTERRUPTION_FILTER_PRIORITY} mode.
4172c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds     *
4182c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds     * Only modifiable by the system and notification ranker.
4192c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds     */
4202c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds    public void setBypassDnd(boolean bypassDnd) {
4212c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds        this.mBypassDnd = bypassDnd;
4222c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds    }
4232c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds
4242c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds    /**
4252c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds     * Sets whether notifications posted to this channel appear on the lockscreen or not, and if so,
4262c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds     * whether they appear in a redacted form. See e.g. {@link Notification#VISIBILITY_SECRET}.
4272c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds     *
4282c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds     * Only modifiable by the system and notification ranker.
4292c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds     */
4302c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds    public void setLockscreenVisibility(int lockscreenVisibility) {
4312c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds        this.mLockscreenVisibility = lockscreenVisibility;
4322c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds    }
4332c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds
4342c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds    /**
435b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     * Returns the id of this channel.
436b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     */
437b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    public String getId() {
438b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        return mId;
439b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
440b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
441b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    /**
442b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     * Returns the user visible name of this channel.
443b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     */
4442c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds    public CharSequence getName() {
445b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        return mName;
446b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
447b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
448b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    /**
4492c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds     * Returns the user visible description of this channel.
4502c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds     */
4512c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds    public String getDescription() {
4522c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds        return mDesc;
4532c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds    }
4542c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds
4552c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds    /**
456184b86da382b8e24cdd0e5629e70d7057d418883Julia Reynolds     * Returns the user specified importance e.g. {@link NotificationManager#IMPORTANCE_LOW} for
457b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     * notifications posted to this channel.
458b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     */
459b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    public int getImportance() {
460b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        return mImportance;
461b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
462b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
463b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    /**
464b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     * Whether or not notifications posted to this channel can bypass the Do Not Disturb
465b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     * {@link NotificationManager#INTERRUPTION_FILTER_PRIORITY} mode.
466b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     */
467b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    public boolean canBypassDnd() {
468b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        return mBypassDnd;
469b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
470b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
471b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    /**
472b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     * Returns the notification sound for this channel.
473b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     */
4740c299d4d6316d14e43d386b4562782083fe3c886Julia Reynolds    public Uri getSound() {
4750c299d4d6316d14e43d386b4562782083fe3c886Julia Reynolds        return mSound;
476b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
477b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
478b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    /**
479619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds     * Returns the audio attributes for sound played by notifications posted to this channel.
480619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds     */
481619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds    public AudioAttributes getAudioAttributes() {
482619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds        return mAudioAttributes;
483619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds    }
484619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds
485619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds    /**
486b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     * Returns whether notifications posted to this channel trigger notification lights.
487b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     */
488b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    public boolean shouldShowLights() {
489b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        return mLights;
490b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
491b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
492b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    /**
493529e3329e68963eff0dd1cf40d938a9953cd5060Julia Reynolds     * Returns the notification light color for notifications posted to this channel. Irrelevant
494529e3329e68963eff0dd1cf40d938a9953cd5060Julia Reynolds     * unless {@link #shouldShowLights()}.
495529e3329e68963eff0dd1cf40d938a9953cd5060Julia Reynolds     */
496529e3329e68963eff0dd1cf40d938a9953cd5060Julia Reynolds    public int getLightColor() {
497529e3329e68963eff0dd1cf40d938a9953cd5060Julia Reynolds        return mLightColor;
498529e3329e68963eff0dd1cf40d938a9953cd5060Julia Reynolds    }
499529e3329e68963eff0dd1cf40d938a9953cd5060Julia Reynolds
500529e3329e68963eff0dd1cf40d938a9953cd5060Julia Reynolds    /**
501b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     * Returns whether notifications posted to this channel always vibrate.
502b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     */
503b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    public boolean shouldVibrate() {
504f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        return mVibrationEnabled;
505f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds    }
506f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds
507f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds    /**
508f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds     * Returns the vibration pattern for notifications posted to this channel. Will be ignored if
509f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds     * vibration is not enabled ({@link #shouldVibrate()}.
510f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds     */
511f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds    public long[] getVibrationPattern() {
512b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        return mVibration;
513b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
514b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
515b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    /**
51685769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds     * Returns whether or not notifications posted to this channel are shown on the lockscreen in
51785769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds     * full or redacted form.
518b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     */
519b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    public int getLockscreenVisibility() {
520b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        return mLockscreenVisibility;
521b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
522b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
523b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    /**
524baff400fa5a93d157934818982fcf534327f9830Julia Reynolds     * Returns whether notifications posted to this channel can appear as badges in a Launcher
525baff400fa5a93d157934818982fcf534327f9830Julia Reynolds     * application.
526924eed1ca6d3fec5dae7eb0f9c11b8f23f628697Julia Reynolds     *
527924eed1ca6d3fec5dae7eb0f9c11b8f23f628697Julia Reynolds     * Note that badging may be disabled for other reasons.
528baff400fa5a93d157934818982fcf534327f9830Julia Reynolds     */
529baff400fa5a93d157934818982fcf534327f9830Julia Reynolds    public boolean canShowBadge() {
530baff400fa5a93d157934818982fcf534327f9830Julia Reynolds        return mShowBadge;
531baff400fa5a93d157934818982fcf534327f9830Julia Reynolds    }
532baff400fa5a93d157934818982fcf534327f9830Julia Reynolds
533baff400fa5a93d157934818982fcf534327f9830Julia Reynolds    /**
53459e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds     * Returns what group this channel belongs to.
53559e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds     *
53659e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds     * This is used only for visually grouping channels in the UI.
53759e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds     */
53859e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds    public String getGroup() {
53959e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds        return mGroup;
54059e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds    }
54159e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds
54259e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds    /**
5434036e8d4c636ae36f28585d283b522a7a97eaf72Julia Reynolds     * @hide
544baff400fa5a93d157934818982fcf534327f9830Julia Reynolds     */
5454036e8d4c636ae36f28585d283b522a7a97eaf72Julia Reynolds    @SystemApi
5464036e8d4c636ae36f28585d283b522a7a97eaf72Julia Reynolds    public boolean isDeleted() {
5474036e8d4c636ae36f28585d283b522a7a97eaf72Julia Reynolds        return mDeleted;
548baff400fa5a93d157934818982fcf534327f9830Julia Reynolds    }
549baff400fa5a93d157934818982fcf534327f9830Julia Reynolds
550baff400fa5a93d157934818982fcf534327f9830Julia Reynolds    /**
551b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     * @hide
552b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     */
553b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    @SystemApi
55485769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    public int getUserLockedFields() {
55585769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds        return mUserLockedFields;
55685769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    }
55785769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds
55885769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    /**
55985769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds     * @hide
56085769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds     */
561f732159cf8d6a4e1cd17542a3a2cf020ad6919a3Julia Reynolds    public boolean isBlockableSystem() {
562f732159cf8d6a4e1cd17542a3a2cf020ad6919a3Julia Reynolds        return mBlockableSystem;
563f732159cf8d6a4e1cd17542a3a2cf020ad6919a3Julia Reynolds    }
564f732159cf8d6a4e1cd17542a3a2cf020ad6919a3Julia Reynolds
565f732159cf8d6a4e1cd17542a3a2cf020ad6919a3Julia Reynolds    /**
566f732159cf8d6a4e1cd17542a3a2cf020ad6919a3Julia Reynolds     * @hide
567f732159cf8d6a4e1cd17542a3a2cf020ad6919a3Julia Reynolds     */
56885769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    @SystemApi
569b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    public void populateFromXml(XmlPullParser parser) {
57085769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds        // Name, id, and importance are set in the constructor.
5712c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds        setDescription(parser.getAttributeValue(null, ATT_DESC));
572b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        setBypassDnd(Notification.PRIORITY_DEFAULT
573b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds                != safeInt(parser, ATT_PRIORITY, Notification.PRIORITY_DEFAULT));
574b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        setLockscreenVisibility(safeInt(parser, ATT_VISIBILITY, DEFAULT_VISIBILITY));
575619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds        setSound(safeUri(parser, ATT_SOUND), safeAudioAttributes(parser));
576529e3329e68963eff0dd1cf40d938a9953cd5060Julia Reynolds        enableLights(safeBool(parser, ATT_LIGHTS, false));
577529e3329e68963eff0dd1cf40d938a9953cd5060Julia Reynolds        setLightColor(safeInt(parser, ATT_LIGHT_COLOR, DEFAULT_LIGHT_COLOR));
578f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        enableVibration(safeBool(parser, ATT_VIBRATION_ENABLED, false));
579f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        setVibrationPattern(safeLongArray(parser, ATT_VIBRATION, null));
580baff400fa5a93d157934818982fcf534327f9830Julia Reynolds        setShowBadge(safeBool(parser, ATT_SHOW_BADGE, false));
5814036e8d4c636ae36f28585d283b522a7a97eaf72Julia Reynolds        setDeleted(safeBool(parser, ATT_DELETED, false));
58259e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds        setGroup(parser.getAttributeValue(null, ATT_GROUP));
58385769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds        lockFields(safeInt(parser, ATT_USER_LOCKED, 0));
584f732159cf8d6a4e1cd17542a3a2cf020ad6919a3Julia Reynolds        setBlockableSystem(safeBool(parser, ATT_BLOCKABLE_SYSTEM, false));
585b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
586b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
587b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    /**
588b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     * @hide
589b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     */
590b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    @SystemApi
591b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    public void writeXml(XmlSerializer out) throws IOException {
592b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        out.startTag(null, TAG_CHANNEL);
593b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        out.attribute(null, ATT_ID, getId());
5945a31193497fa923e24bc5c9796b40fdfae604d31Julia Reynolds        if (getName() != null) {
5955a31193497fa923e24bc5c9796b40fdfae604d31Julia Reynolds            out.attribute(null, ATT_NAME, getName().toString());
5965a31193497fa923e24bc5c9796b40fdfae604d31Julia Reynolds        }
5972c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds        if (getDescription() != null) {
5982c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds            out.attribute(null, ATT_DESC, getDescription());
5992c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds        }
600b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        if (getImportance() != DEFAULT_IMPORTANCE) {
601b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds            out.attribute(
602b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds                    null, ATT_IMPORTANCE, Integer.toString(getImportance()));
603b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        }
604b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        if (canBypassDnd()) {
605b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds            out.attribute(
606b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds                    null, ATT_PRIORITY, Integer.toString(Notification.PRIORITY_MAX));
607b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        }
608b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        if (getLockscreenVisibility() != DEFAULT_VISIBILITY) {
609b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds            out.attribute(null, ATT_VISIBILITY,
610b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds                    Integer.toString(getLockscreenVisibility()));
611b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        }
6120c299d4d6316d14e43d386b4562782083fe3c886Julia Reynolds        if (getSound() != null) {
6130c299d4d6316d14e43d386b4562782083fe3c886Julia Reynolds            out.attribute(null, ATT_SOUND, getSound().toString());
614b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        }
615619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds        if (getAudioAttributes() != null) {
616619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds            out.attribute(null, ATT_USAGE, Integer.toString(getAudioAttributes().getUsage()));
617619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds            out.attribute(null, ATT_CONTENT_TYPE,
618619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds                    Integer.toString(getAudioAttributes().getContentType()));
619619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds            out.attribute(null, ATT_FLAGS, Integer.toString(getAudioAttributes().getFlags()));
620619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds        }
621b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        if (shouldShowLights()) {
622b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds            out.attribute(null, ATT_LIGHTS, Boolean.toString(shouldShowLights()));
623b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        }
624529e3329e68963eff0dd1cf40d938a9953cd5060Julia Reynolds        if (getLightColor() != DEFAULT_LIGHT_COLOR) {
625529e3329e68963eff0dd1cf40d938a9953cd5060Julia Reynolds            out.attribute(null, ATT_LIGHT_COLOR, Integer.toString(getLightColor()));
626529e3329e68963eff0dd1cf40d938a9953cd5060Julia Reynolds        }
627b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        if (shouldVibrate()) {
628f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds            out.attribute(null, ATT_VIBRATION_ENABLED, Boolean.toString(shouldVibrate()));
629f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        }
630f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        if (getVibrationPattern() != null) {
631f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds            out.attribute(null, ATT_VIBRATION, longArrayToString(getVibrationPattern()));
632b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        }
63385769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds        if (getUserLockedFields() != 0) {
63485769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds            out.attribute(null, ATT_USER_LOCKED, Integer.toString(getUserLockedFields()));
63585769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds        }
636baff400fa5a93d157934818982fcf534327f9830Julia Reynolds        if (canShowBadge()) {
637baff400fa5a93d157934818982fcf534327f9830Julia Reynolds            out.attribute(null, ATT_SHOW_BADGE, Boolean.toString(canShowBadge()));
638baff400fa5a93d157934818982fcf534327f9830Julia Reynolds        }
6394036e8d4c636ae36f28585d283b522a7a97eaf72Julia Reynolds        if (isDeleted()) {
6404036e8d4c636ae36f28585d283b522a7a97eaf72Julia Reynolds            out.attribute(null, ATT_DELETED, Boolean.toString(isDeleted()));
6414036e8d4c636ae36f28585d283b522a7a97eaf72Julia Reynolds        }
64259e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds        if (getGroup() != null) {
64359e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds            out.attribute(null, ATT_GROUP, getGroup());
64459e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds        }
645f732159cf8d6a4e1cd17542a3a2cf020ad6919a3Julia Reynolds        if (isBlockableSystem()) {
646f732159cf8d6a4e1cd17542a3a2cf020ad6919a3Julia Reynolds            out.attribute(null, ATT_BLOCKABLE_SYSTEM, Boolean.toString(isBlockableSystem()));
647f732159cf8d6a4e1cd17542a3a2cf020ad6919a3Julia Reynolds        }
64885769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds
649b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        out.endTag(null, TAG_CHANNEL);
650b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
651b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
652b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    /**
653b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     * @hide
654b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     */
655b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    @SystemApi
656b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    public JSONObject toJson() throws JSONException {
657b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        JSONObject record = new JSONObject();
658b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        record.put(ATT_ID, getId());
659b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        record.put(ATT_NAME, getName());
6602c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds        record.put(ATT_DESC, getDescription());
661b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        if (getImportance() != DEFAULT_IMPORTANCE) {
662b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds            record.put(ATT_IMPORTANCE,
663b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds                    NotificationListenerService.Ranking.importanceToString(getImportance()));
664b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        }
665b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        if (canBypassDnd()) {
666b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds            record.put(ATT_PRIORITY, Notification.PRIORITY_MAX);
667b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        }
668b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        if (getLockscreenVisibility() != DEFAULT_VISIBILITY) {
669b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds            record.put(ATT_VISIBILITY, Notification.visibilityToString(getLockscreenVisibility()));
670b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        }
6710c299d4d6316d14e43d386b4562782083fe3c886Julia Reynolds        if (getSound() != null) {
6720c299d4d6316d14e43d386b4562782083fe3c886Julia Reynolds            record.put(ATT_SOUND, getSound().toString());
673b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        }
674619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds        if (getAudioAttributes() != null) {
675619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds            record.put(ATT_USAGE, Integer.toString(getAudioAttributes().getUsage()));
676619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds            record.put(ATT_CONTENT_TYPE,
677619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds                    Integer.toString(getAudioAttributes().getContentType()));
678619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds            record.put(ATT_FLAGS, Integer.toString(getAudioAttributes().getFlags()));
679619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds        }
680b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        record.put(ATT_LIGHTS, Boolean.toString(shouldShowLights()));
681529e3329e68963eff0dd1cf40d938a9953cd5060Julia Reynolds        record.put(ATT_LIGHT_COLOR, Integer.toString(getLightColor()));
682f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        record.put(ATT_VIBRATION_ENABLED, Boolean.toString(shouldVibrate()));
68385769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds        record.put(ATT_USER_LOCKED, Integer.toString(getUserLockedFields()));
684f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        record.put(ATT_VIBRATION, longArrayToString(getVibrationPattern()));
685baff400fa5a93d157934818982fcf534327f9830Julia Reynolds        record.put(ATT_SHOW_BADGE, Boolean.toString(canShowBadge()));
6864036e8d4c636ae36f28585d283b522a7a97eaf72Julia Reynolds        record.put(ATT_DELETED, Boolean.toString(isDeleted()));
68759e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds        record.put(ATT_GROUP, getGroup());
688f732159cf8d6a4e1cd17542a3a2cf020ad6919a3Julia Reynolds        record.put(ATT_BLOCKABLE_SYSTEM, isBlockableSystem());
689b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        return record;
690b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
691b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
692619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds    private static AudioAttributes safeAudioAttributes(XmlPullParser parser) {
693619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds        int usage = safeInt(parser, ATT_USAGE, AudioAttributes.USAGE_NOTIFICATION);
694619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds        int contentType = safeInt(parser, ATT_CONTENT_TYPE,
695619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds                AudioAttributes.CONTENT_TYPE_SONIFICATION);
696619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds        int flags = safeInt(parser, ATT_FLAGS, 0);
697619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds        return new AudioAttributes.Builder()
698619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds                .setUsage(usage)
699619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds                .setContentType(contentType)
700619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds                .setFlags(flags)
701619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds                .build();
702619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds    }
703619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds
704b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    private static Uri safeUri(XmlPullParser parser, String att) {
705b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        final String val = parser.getAttributeValue(null, att);
706b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        return val == null ? null : Uri.parse(val);
707b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
708b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
709b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    private static int safeInt(XmlPullParser parser, String att, int defValue) {
710b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        final String val = parser.getAttributeValue(null, att);
711b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        return tryParseInt(val, defValue);
712b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
713b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
714b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    private static int tryParseInt(String value, int defValue) {
715b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        if (TextUtils.isEmpty(value)) return defValue;
716b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        try {
717b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds            return Integer.parseInt(value);
718b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        } catch (NumberFormatException e) {
719b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds            return defValue;
720b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        }
721b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
722b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
723b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    private static boolean safeBool(XmlPullParser parser, String att, boolean defValue) {
724b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        final String value = parser.getAttributeValue(null, att);
725b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        if (TextUtils.isEmpty(value)) return defValue;
726b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        return Boolean.parseBoolean(value);
727b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
728b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
729f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds    private static long[] safeLongArray(XmlPullParser parser, String att, long[] defValue) {
730f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        final String attributeValue = parser.getAttributeValue(null, att);
731f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        if (TextUtils.isEmpty(attributeValue)) return defValue;
732f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        String[] values = attributeValue.split(DELIMITER);
733f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        long[] longValues = new long[values.length];
734f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        for (int i = 0; i < values.length; i++) {
735f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds            try {
736f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds                longValues[i] = Long.parseLong(values[i]);
737f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds            } catch (NumberFormatException e) {
738f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds                longValues[i] = 0;
739f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds            }
740f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        }
741f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        return longValues;
742f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds    }
743f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds
744f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds    private static String longArrayToString(long[] values) {
745f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        StringBuffer sb = new StringBuffer();
74659e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds        if (values != null) {
74759e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds            for (int i = 0; i < values.length - 1; i++) {
74859e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds                sb.append(values[i]).append(DELIMITER);
74959e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds            }
75059e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds            sb.append(values[values.length - 1]);
751f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        }
752f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        return sb.toString();
753f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds    }
754f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds
755b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    public static final Creator<NotificationChannel> CREATOR = new Creator<NotificationChannel>() {
756b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        @Override
757b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        public NotificationChannel createFromParcel(Parcel in) {
758b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds            return new NotificationChannel(in);
759b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        }
760b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
761b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        @Override
762b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        public NotificationChannel[] newArray(int size) {
763b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds            return new NotificationChannel[size];
764b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        }
765b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    };
766b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
767b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    @Override
768b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    public int describeContents() {
769b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        return 0;
770b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
771b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
772b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    @Override
773b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    public boolean equals(Object o) {
774b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        if (this == o) return true;
775b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        if (o == null || getClass() != o.getClass()) return false;
776b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
777b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        NotificationChannel that = (NotificationChannel) o;
778b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
77959e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds        if (getImportance() != that.getImportance()) return false;
780b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        if (mBypassDnd != that.mBypassDnd) return false;
78159e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds        if (getLockscreenVisibility() != that.getLockscreenVisibility()) return false;
782b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        if (mLights != that.mLights) return false;
783529e3329e68963eff0dd1cf40d938a9953cd5060Julia Reynolds        if (getLightColor() != that.getLightColor()) return false;
78459e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds        if (getUserLockedFields() != that.getUserLockedFields()) return false;
785f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        if (mVibrationEnabled != that.mVibrationEnabled) return false;
786baff400fa5a93d157934818982fcf534327f9830Julia Reynolds        if (mShowBadge != that.mShowBadge) return false;
78759e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds        if (isDeleted() != that.isDeleted()) return false;
788f732159cf8d6a4e1cd17542a3a2cf020ad6919a3Julia Reynolds        if (isBlockableSystem() != that.isBlockableSystem()) return false;
78959e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds        if (getId() != null ? !getId().equals(that.getId()) : that.getId() != null) return false;
79059e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds        if (getName() != null ? !getName().equals(that.getName()) : that.getName() != null) {
79159e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds            return false;
79259e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds        }
7932c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds        if (getDescription() != null ? !getDescription().equals(that.getDescription())
7942c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds                : that.getDescription() != null) {
7952c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds            return false;
7962c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds        }
79759e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds        if (getSound() != null ? !getSound().equals(that.getSound()) : that.getSound() != null) {
79859e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds            return false;
79959e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds        }
80059e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds        if (!Arrays.equals(mVibration, that.mVibration)) return false;
801619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds        if (getGroup() != null ? !getGroup().equals(that.getGroup()) : that.getGroup() != null) {
802619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds            return false;
803619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds        }
804619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds        return getAudioAttributes() != null ? getAudioAttributes().equals(that.getAudioAttributes())
805619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds                : that.getAudioAttributes() == null;
80685769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds
80785769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    }
80885769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds
80985769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    @Override
81085769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    public int hashCode() {
81159e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds        int result = getId() != null ? getId().hashCode() : 0;
81259e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds        result = 31 * result + (getName() != null ? getName().hashCode() : 0);
8132c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds        result = 31 * result + (getDescription() != null ? getDescription().hashCode() : 0);
81459e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds        result = 31 * result + getImportance();
81585769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds        result = 31 * result + (mBypassDnd ? 1 : 0);
81659e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds        result = 31 * result + getLockscreenVisibility();
81759e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds        result = 31 * result + (getSound() != null ? getSound().hashCode() : 0);
81885769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds        result = 31 * result + (mLights ? 1 : 0);
819529e3329e68963eff0dd1cf40d938a9953cd5060Julia Reynolds        result = 31 * result + getLightColor();
820f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        result = 31 * result + Arrays.hashCode(mVibration);
82159e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds        result = 31 * result + getUserLockedFields();
822f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        result = 31 * result + (mVibrationEnabled ? 1 : 0);
823baff400fa5a93d157934818982fcf534327f9830Julia Reynolds        result = 31 * result + (mShowBadge ? 1 : 0);
82459e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds        result = 31 * result + (isDeleted() ? 1 : 0);
82559e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds        result = 31 * result + (getGroup() != null ? getGroup().hashCode() : 0);
826619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds        result = 31 * result + (getAudioAttributes() != null ? getAudioAttributes().hashCode() : 0);
827f732159cf8d6a4e1cd17542a3a2cf020ad6919a3Julia Reynolds        result = 31 * result + (isBlockableSystem() ? 1 : 0);
82885769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds        return result;
829b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
830b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
831b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    @Override
832b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    public String toString() {
833b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        return "NotificationChannel{" +
834b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds                "mId='" + mId + '\'' +
835b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds                ", mName=" + mName +
8362c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds                ", mDescription=" + (!TextUtils.isEmpty(mDesc) ? "hasDescription " : "") +
837b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds                ", mImportance=" + mImportance +
838b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds                ", mBypassDnd=" + mBypassDnd +
839b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds                ", mLockscreenVisibility=" + mLockscreenVisibility +
8400c299d4d6316d14e43d386b4562782083fe3c886Julia Reynolds                ", mSound=" + mSound +
841b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds                ", mLights=" + mLights +
842529e3329e68963eff0dd1cf40d938a9953cd5060Julia Reynolds                ", mLightColor=" + mLightColor +
843f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds                ", mVibration=" + Arrays.toString(mVibration) +
84485769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds                ", mUserLockedFields=" + mUserLockedFields +
845f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds                ", mVibrationEnabled=" + mVibrationEnabled +
846baff400fa5a93d157934818982fcf534327f9830Julia Reynolds                ", mShowBadge=" + mShowBadge +
8474036e8d4c636ae36f28585d283b522a7a97eaf72Julia Reynolds                ", mDeleted=" + mDeleted +
84859e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds                ", mGroup='" + mGroup + '\'' +
849619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds                ", mAudioAttributes=" + mAudioAttributes +
850f732159cf8d6a4e1cd17542a3a2cf020ad6919a3Julia Reynolds                ", mBlockableSystem=" + mBlockableSystem +
851b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds                '}';
852b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
853b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds}
854