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
18c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufinoimport android.annotation.Nullable;
19b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynoldsimport android.annotation.SystemApi;
206503bd8e33dbf6e8357256d43c6e1158e32a0268Jeff Sharkeyimport android.app.NotificationManager.Importance;
21c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufinoimport android.content.ContentResolver;
22c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufinoimport android.content.Context;
231d97e6a0c1341e3a6d8547fa843cb60ce6677a11Julia Reynoldsimport android.content.Intent;
24619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynoldsimport android.media.AudioAttributes;
25b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynoldsimport android.net.Uri;
26b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynoldsimport android.os.Parcel;
27b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynoldsimport android.os.Parcelable;
28184b86da382b8e24cdd0e5629e70d7057d418883Julia Reynoldsimport android.provider.Settings;
29b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynoldsimport android.service.notification.NotificationListenerService;
30b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynoldsimport android.text.TextUtils;
3162b4224757cf60fe57d8c9b0d43ab357f4df056dKweku Adamsimport android.util.proto.ProtoOutputStream;
32b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
33c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufinoimport com.android.internal.util.Preconditions;
34c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino
350f17000fb3b417fbc6129b47385c5f3c3dfd2de5Julia Reynoldsimport org.json.JSONException;
360f17000fb3b417fbc6129b47385c5f3c3dfd2de5Julia Reynoldsimport org.json.JSONObject;
370f17000fb3b417fbc6129b47385c5f3c3dfd2de5Julia Reynoldsimport org.xmlpull.v1.XmlPullParser;
380f17000fb3b417fbc6129b47385c5f3c3dfd2de5Julia Reynoldsimport org.xmlpull.v1.XmlSerializer;
390f17000fb3b417fbc6129b47385c5f3c3dfd2de5Julia Reynolds
40b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynoldsimport java.io.IOException;
41f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynoldsimport java.util.Arrays;
42b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
43b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds/**
44b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds * A representation of settings that apply to a collection of similarly themed notifications.
45b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds */
46b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynoldspublic final class NotificationChannel implements Parcelable {
47b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
48b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    /**
49bad42976009ffb61010136ed8055f9e0f6d2e416Julia Reynolds     * The id of the default channel for an app. This id is reserved by the system. All
50bad42976009ffb61010136ed8055f9e0f6d2e416Julia Reynolds     * notifications posted from apps targeting {@link android.os.Build.VERSION_CODES#N_MR1} or
51bad42976009ffb61010136ed8055f9e0f6d2e416Julia Reynolds     * earlier without a notification channel specified are posted to this channel.
52b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     */
53b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    public static final String DEFAULT_CHANNEL_ID = "miscellaneous";
54b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
552c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds    /**
562c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds     * The maximum length for text fields in a NotificationChannel. Fields will be truncated at this
572c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds     * limit.
582c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds     */
592c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds    private static final int MAX_TEXT_LENGTH = 1000;
602c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds
61b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    private static final String TAG_CHANNEL = "channel";
62b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    private static final String ATT_NAME = "name";
632c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds    private static final String ATT_DESC = "desc";
64b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    private static final String ATT_ID = "id";
654036e8d4c636ae36f28585d283b522a7a97eaf72Julia Reynolds    private static final String ATT_DELETED = "deleted";
66b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    private static final String ATT_PRIORITY = "priority";
67b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    private static final String ATT_VISIBILITY = "visibility";
68b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    private static final String ATT_IMPORTANCE = "importance";
69b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    private static final String ATT_LIGHTS = "lights";
7059e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds    private static final String ATT_LIGHT_COLOR = "light_color";
71b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    private static final String ATT_VIBRATION = "vibration";
72f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds    private static final String ATT_VIBRATION_ENABLED = "vibration_enabled";
730c299d4d6316d14e43d386b4562782083fe3c886Julia Reynolds    private static final String ATT_SOUND = "sound";
74619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds    private static final String ATT_USAGE = "usage";
75619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds    private static final String ATT_FLAGS = "flags";
76619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds    private static final String ATT_CONTENT_TYPE = "content_type";
77baff400fa5a93d157934818982fcf534327f9830Julia Reynolds    private static final String ATT_SHOW_BADGE = "show_badge";
7885769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    private static final String ATT_USER_LOCKED = "locked";
79025d4a59fced3af7acfccef9cbae13735ddce7c8Dianne Hackborn    private static final String ATT_FG_SERVICE_SHOWN = "fgservice";
8059e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds    private static final String ATT_GROUP = "group";
81f732159cf8d6a4e1cd17542a3a2cf020ad6919a3Julia Reynolds    private static final String ATT_BLOCKABLE_SYSTEM = "blockable_system";
82f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds    private static final String DELIMITER = ",";
8385769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds
8485769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    /**
8585769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds     * @hide
8685769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds     */
8785769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    public static final int USER_LOCKED_PRIORITY = 0x00000001;
8885769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    /**
8985769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds     * @hide
9085769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds     */
9185769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    public static final int USER_LOCKED_VISIBILITY = 0x00000002;
9285769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    /**
9385769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds     * @hide
9485769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds     */
9585769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    public static final int USER_LOCKED_IMPORTANCE = 0x00000004;
9685769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    /**
9785769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds     * @hide
9885769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds     */
9985769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    public static final int USER_LOCKED_LIGHTS = 0x00000008;
10085769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    /**
10185769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds     * @hide
10285769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds     */
10385769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    public static final int USER_LOCKED_VIBRATION = 0x00000010;
10485769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    /**
10585769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds     * @hide
10685769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds     */
1070c299d4d6316d14e43d386b4562782083fe3c886Julia Reynolds    public static final int USER_LOCKED_SOUND = 0x00000020;
108b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
109baff400fa5a93d157934818982fcf534327f9830Julia Reynolds    /**
110baff400fa5a93d157934818982fcf534327f9830Julia Reynolds     * @hide
111baff400fa5a93d157934818982fcf534327f9830Julia Reynolds     */
112baff400fa5a93d157934818982fcf534327f9830Julia Reynolds    public static final int USER_LOCKED_SHOW_BADGE = 0x00000080;
113baff400fa5a93d157934818982fcf534327f9830Julia Reynolds
114baff400fa5a93d157934818982fcf534327f9830Julia Reynolds    /**
115baff400fa5a93d157934818982fcf534327f9830Julia Reynolds     * @hide
116baff400fa5a93d157934818982fcf534327f9830Julia Reynolds     */
117baff400fa5a93d157934818982fcf534327f9830Julia Reynolds    public static final int[] LOCKABLE_FIELDS = new int[] {
118baff400fa5a93d157934818982fcf534327f9830Julia Reynolds            USER_LOCKED_PRIORITY,
119baff400fa5a93d157934818982fcf534327f9830Julia Reynolds            USER_LOCKED_VISIBILITY,
120baff400fa5a93d157934818982fcf534327f9830Julia Reynolds            USER_LOCKED_IMPORTANCE,
121baff400fa5a93d157934818982fcf534327f9830Julia Reynolds            USER_LOCKED_LIGHTS,
122baff400fa5a93d157934818982fcf534327f9830Julia Reynolds            USER_LOCKED_VIBRATION,
123baff400fa5a93d157934818982fcf534327f9830Julia Reynolds            USER_LOCKED_SOUND,
124619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds            USER_LOCKED_SHOW_BADGE,
125baff400fa5a93d157934818982fcf534327f9830Julia Reynolds    };
126baff400fa5a93d157934818982fcf534327f9830Julia Reynolds
127529e3329e68963eff0dd1cf40d938a9953cd5060Julia Reynolds    private static final int DEFAULT_LIGHT_COLOR = 0;
128b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    private static final int DEFAULT_VISIBILITY =
12985769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds            NotificationManager.VISIBILITY_NO_OVERRIDE;
130b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    private static final int DEFAULT_IMPORTANCE =
13185769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds            NotificationManager.IMPORTANCE_UNSPECIFIED;
1324036e8d4c636ae36f28585d283b522a7a97eaf72Julia Reynolds    private static final boolean DEFAULT_DELETED = false;
133924eed1ca6d3fec5dae7eb0f9c11b8f23f628697Julia Reynolds    private static final boolean DEFAULT_SHOW_BADGE = true;
134b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
135b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    private final String mId;
1362c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds    private String mName;
1372c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds    private String mDesc;
138b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    private int mImportance = DEFAULT_IMPORTANCE;
139b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    private boolean mBypassDnd;
140b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    private int mLockscreenVisibility = DEFAULT_VISIBILITY;
141184b86da382b8e24cdd0e5629e70d7057d418883Julia Reynolds    private Uri mSound = Settings.System.DEFAULT_NOTIFICATION_URI;
142b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    private boolean mLights;
143529e3329e68963eff0dd1cf40d938a9953cd5060Julia Reynolds    private int mLightColor = DEFAULT_LIGHT_COLOR;
144f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds    private long[] mVibration;
14562b4224757cf60fe57d8c9b0d43ab357f4df056dKweku Adams    // Bitwise representation of fields that have been changed by the user, preventing the app from
14662b4224757cf60fe57d8c9b0d43ab357f4df056dKweku Adams    // making changes to these fields.
14785769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    private int mUserLockedFields;
148025d4a59fced3af7acfccef9cbae13735ddce7c8Dianne Hackborn    private boolean mFgServiceShown;
149f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds    private boolean mVibrationEnabled;
150924eed1ca6d3fec5dae7eb0f9c11b8f23f628697Julia Reynolds    private boolean mShowBadge = DEFAULT_SHOW_BADGE;
1514036e8d4c636ae36f28585d283b522a7a97eaf72Julia Reynolds    private boolean mDeleted = DEFAULT_DELETED;
15259e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds    private String mGroup;
153619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds    private AudioAttributes mAudioAttributes = Notification.AUDIO_ATTRIBUTES_DEFAULT;
15462b4224757cf60fe57d8c9b0d43ab357f4df056dKweku Adams    // If this is a blockable system notification channel.
155f732159cf8d6a4e1cd17542a3a2cf020ad6919a3Julia Reynolds    private boolean mBlockableSystem = false;
156b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
157b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    /**
158b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     * Creates a notification channel.
159b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     *
1602c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds     * @param id The id of the channel. Must be unique per package. The value may be truncated if
1612c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds     *           it is too long.
1622c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds     * @param name The user visible name of the channel. You can rename this channel when the system
1631d97e6a0c1341e3a6d8547fa843cb60ce6677a11Julia Reynolds     *             locale changes by listening for the {@link Intent#ACTION_LOCALE_CHANGED}
1642c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds     *             broadcast. The recommended maximum length is 40 characters; the value may be
1652c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds     *             truncated if it is too long.
16685769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds     * @param importance The importance of the channel. This controls how interruptive notifications
16730e06bb668f2e4b024c4ebc2a131de91c96de5ebJeff Sharkey     *                   posted to this channel are.
168b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     */
16930e06bb668f2e4b024c4ebc2a131de91c96de5ebJeff Sharkey    public NotificationChannel(String id, CharSequence name, @Importance int importance) {
1702c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds        this.mId = getTrimmedString(id);
1712c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds        this.mName = name != null ? getTrimmedString(name.toString()) : null;
17285769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds        this.mImportance = importance;
173b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
174b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
175bad42976009ffb61010136ed8055f9e0f6d2e416Julia Reynolds    /**
176bad42976009ffb61010136ed8055f9e0f6d2e416Julia Reynolds     * @hide
177bad42976009ffb61010136ed8055f9e0f6d2e416Julia Reynolds     */
178b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    protected NotificationChannel(Parcel in) {
179b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        if (in.readByte() != 0) {
180b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds            mId = in.readString();
181b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        } else {
182b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds            mId = null;
183b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        }
1842c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds        if (in.readByte() != 0) {
1852c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds            mName = in.readString();
1862c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds        } else {
1872c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds            mName = null;
1882c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds        }
1892c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds        if (in.readByte() != 0) {
1902c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds            mDesc = in.readString();
1912c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds        } else {
1922c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds            mDesc = null;
1932c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds        }
194b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        mImportance = in.readInt();
195b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        mBypassDnd = in.readByte() != 0;
196b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        mLockscreenVisibility = in.readInt();
197b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        if (in.readByte() != 0) {
1980c299d4d6316d14e43d386b4562782083fe3c886Julia Reynolds            mSound = Uri.CREATOR.createFromParcel(in);
199b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        } else {
2000c299d4d6316d14e43d386b4562782083fe3c886Julia Reynolds            mSound = null;
201b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        }
202b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        mLights = in.readByte() != 0;
203f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        mVibration = in.createLongArray();
20485769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds        mUserLockedFields = in.readInt();
205025d4a59fced3af7acfccef9cbae13735ddce7c8Dianne Hackborn        mFgServiceShown = in.readByte() != 0;
206f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        mVibrationEnabled = in.readByte() != 0;
207baff400fa5a93d157934818982fcf534327f9830Julia Reynolds        mShowBadge = in.readByte() != 0;
2084036e8d4c636ae36f28585d283b522a7a97eaf72Julia Reynolds        mDeleted = in.readByte() != 0;
20959e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds        if (in.readByte() != 0) {
21059e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds            mGroup = in.readString();
21159e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds        } else {
21259e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds            mGroup = null;
21359e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds        }
214619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds        mAudioAttributes = in.readInt() > 0 ? AudioAttributes.CREATOR.createFromParcel(in) : null;
215529e3329e68963eff0dd1cf40d938a9953cd5060Julia Reynolds        mLightColor = in.readInt();
216f732159cf8d6a4e1cd17542a3a2cf020ad6919a3Julia Reynolds        mBlockableSystem = in.readBoolean();
217b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
218b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
219b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    @Override
220b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    public void writeToParcel(Parcel dest, int flags) {
221b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        if (mId != null) {
222b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds            dest.writeByte((byte) 1);
223b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds            dest.writeString(mId);
224b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        } else {
225b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds            dest.writeByte((byte) 0);
226b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        }
2272c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds        if (mName != null) {
2282c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds            dest.writeByte((byte) 1);
2292c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds            dest.writeString(mName);
2302c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds        } else {
2312c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds            dest.writeByte((byte) 0);
2322c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds        }
2332c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds        if (mDesc != null) {
2342c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds            dest.writeByte((byte) 1);
2352c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds            dest.writeString(mDesc);
2362c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds        } else {
2372c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds            dest.writeByte((byte) 0);
2382c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds        }
239b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        dest.writeInt(mImportance);
240b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        dest.writeByte(mBypassDnd ? (byte) 1 : (byte) 0);
241b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        dest.writeInt(mLockscreenVisibility);
2420c299d4d6316d14e43d386b4562782083fe3c886Julia Reynolds        if (mSound != null) {
243b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds            dest.writeByte((byte) 1);
2440c299d4d6316d14e43d386b4562782083fe3c886Julia Reynolds            mSound.writeToParcel(dest, 0);
245b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        } else {
246b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds            dest.writeByte((byte) 0);
247b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        }
248b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        dest.writeByte(mLights ? (byte) 1 : (byte) 0);
249f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        dest.writeLongArray(mVibration);
25085769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds        dest.writeInt(mUserLockedFields);
251025d4a59fced3af7acfccef9cbae13735ddce7c8Dianne Hackborn        dest.writeByte(mFgServiceShown ? (byte) 1 : (byte) 0);
252f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        dest.writeByte(mVibrationEnabled ? (byte) 1 : (byte) 0);
253baff400fa5a93d157934818982fcf534327f9830Julia Reynolds        dest.writeByte(mShowBadge ? (byte) 1 : (byte) 0);
2544036e8d4c636ae36f28585d283b522a7a97eaf72Julia Reynolds        dest.writeByte(mDeleted ? (byte) 1 : (byte) 0);
25559e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds        if (mGroup != null) {
25659e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds            dest.writeByte((byte) 1);
25759e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds            dest.writeString(mGroup);
25859e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds        } else {
25959e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds            dest.writeByte((byte) 0);
26059e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds        }
261619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds        if (mAudioAttributes != null) {
262619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds            dest.writeInt(1);
263619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds            mAudioAttributes.writeToParcel(dest, 0);
264619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds        } else {
265619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds            dest.writeInt(0);
266619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds        }
267529e3329e68963eff0dd1cf40d938a9953cd5060Julia Reynolds        dest.writeInt(mLightColor);
268f732159cf8d6a4e1cd17542a3a2cf020ad6919a3Julia Reynolds        dest.writeBoolean(mBlockableSystem);
269b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
270b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
271b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    /**
272b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     * @hide
273b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     */
27485769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    public void lockFields(int field) {
27585769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds        mUserLockedFields |= field;
276b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
277b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
2784036e8d4c636ae36f28585d283b522a7a97eaf72Julia Reynolds    /**
2794036e8d4c636ae36f28585d283b522a7a97eaf72Julia Reynolds     * @hide
2804036e8d4c636ae36f28585d283b522a7a97eaf72Julia Reynolds     */
281e0b25746267972b370a1c773ad18d146ee8163c3Julia Reynolds    public void unlockFields(int field) {
282e0b25746267972b370a1c773ad18d146ee8163c3Julia Reynolds        mUserLockedFields &= ~field;
283e0b25746267972b370a1c773ad18d146ee8163c3Julia Reynolds    }
284e0b25746267972b370a1c773ad18d146ee8163c3Julia Reynolds
285e0b25746267972b370a1c773ad18d146ee8163c3Julia Reynolds    /**
286e0b25746267972b370a1c773ad18d146ee8163c3Julia Reynolds     * @hide
287e0b25746267972b370a1c773ad18d146ee8163c3Julia Reynolds     */
288025d4a59fced3af7acfccef9cbae13735ddce7c8Dianne Hackborn    public void setFgServiceShown(boolean shown) {
289025d4a59fced3af7acfccef9cbae13735ddce7c8Dianne Hackborn        mFgServiceShown = shown;
290025d4a59fced3af7acfccef9cbae13735ddce7c8Dianne Hackborn    }
291025d4a59fced3af7acfccef9cbae13735ddce7c8Dianne Hackborn
292025d4a59fced3af7acfccef9cbae13735ddce7c8Dianne Hackborn    /**
293025d4a59fced3af7acfccef9cbae13735ddce7c8Dianne Hackborn     * @hide
294025d4a59fced3af7acfccef9cbae13735ddce7c8Dianne Hackborn     */
2954036e8d4c636ae36f28585d283b522a7a97eaf72Julia Reynolds    public void setDeleted(boolean deleted) {
2964036e8d4c636ae36f28585d283b522a7a97eaf72Julia Reynolds        mDeleted = deleted;
2974036e8d4c636ae36f28585d283b522a7a97eaf72Julia Reynolds    }
2984036e8d4c636ae36f28585d283b522a7a97eaf72Julia Reynolds
299f732159cf8d6a4e1cd17542a3a2cf020ad6919a3Julia Reynolds    /**
300f732159cf8d6a4e1cd17542a3a2cf020ad6919a3Julia Reynolds     * @hide
301f732159cf8d6a4e1cd17542a3a2cf020ad6919a3Julia Reynolds     */
302f732159cf8d6a4e1cd17542a3a2cf020ad6919a3Julia Reynolds    public void setBlockableSystem(boolean blockableSystem) {
303f732159cf8d6a4e1cd17542a3a2cf020ad6919a3Julia Reynolds        mBlockableSystem = blockableSystem;
304f732159cf8d6a4e1cd17542a3a2cf020ad6919a3Julia Reynolds    }
3052c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds    // Modifiable by apps post channel creation
306b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
307b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    /**
3082c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds     * Sets the user visible name of this channel.
309baff400fa5a93d157934818982fcf534327f9830Julia Reynolds     *
3102c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds     * <p>The recommended maximum length is 40 characters; the value may be truncated if it is too
3112c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds     * long.
312b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     */
3132c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds    public void setName(CharSequence name) {
3142c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds        mName = name != null ? getTrimmedString(name.toString()) : null;
315b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
316b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
317b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    /**
3182c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds     * Sets the user visible description of this channel.
31985769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds     *
3202c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds     * <p>The recommended maximum length is 300 characters; the value may be truncated if it is too
3212c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds     * long.
322b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     */
3232c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds    public void setDescription(String description) {
3242c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds        mDesc = getTrimmedString(description);
325b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
326b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
3272c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds    private String getTrimmedString(String input) {
3282c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds        if (input != null && input.length() > MAX_TEXT_LENGTH) {
3292c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds            return input.substring(0, MAX_TEXT_LENGTH);
3302c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds        }
3312c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds        return input;
33285769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    }
33385769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds
3348f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds    // Modifiable by apps on channel creation.
335b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
336b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    /**
33759e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds     * Sets what group this channel belongs to.
33859e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds     *
33959e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds     * Group information is only used for presentation, not for behavior.
34059e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds     *
341619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds     * Only modifiable before the channel is submitted to
34282a9cf60f36ad3c08e87945814b0a4455d9bdb3aJulia Reynolds     * {@link NotificationManager#createNotificationChannel(NotificationChannel)}, unless the
34382a9cf60f36ad3c08e87945814b0a4455d9bdb3aJulia Reynolds     * channel is not currently part of a group.
344619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds     *
34559e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds     * @param groupId the id of a group created by
34659e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds     * {@link NotificationManager#createNotificationChannelGroup(NotificationChannelGroup)}.
34759e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds     */
34859e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds    public void setGroup(String groupId) {
34959e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds        this.mGroup = groupId;
35059e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds    }
35159e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds
35259e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds    /**
353f35e3976e3c01077f8d8d0938d2ba0b3e5b80613Julia Reynolds     * Sets whether notifications posted to this channel can appear as application icon badges
354f35e3976e3c01077f8d8d0938d2ba0b3e5b80613Julia Reynolds     * in a Launcher.
355f35e3976e3c01077f8d8d0938d2ba0b3e5b80613Julia Reynolds     *
35682a9cf60f36ad3c08e87945814b0a4455d9bdb3aJulia Reynolds     * Only modifiable before the channel is submitted to
35782a9cf60f36ad3c08e87945814b0a4455d9bdb3aJulia Reynolds     * {@link NotificationManager#createNotificationChannel(NotificationChannel)}.
35882a9cf60f36ad3c08e87945814b0a4455d9bdb3aJulia Reynolds     *
359f35e3976e3c01077f8d8d0938d2ba0b3e5b80613Julia Reynolds     * @param showBadge true if badges should be allowed to be shown.
360f35e3976e3c01077f8d8d0938d2ba0b3e5b80613Julia Reynolds     */
361f35e3976e3c01077f8d8d0938d2ba0b3e5b80613Julia Reynolds    public void setShowBadge(boolean showBadge) {
362f35e3976e3c01077f8d8d0938d2ba0b3e5b80613Julia Reynolds        this.mShowBadge = showBadge;
363f35e3976e3c01077f8d8d0938d2ba0b3e5b80613Julia Reynolds    }
364f35e3976e3c01077f8d8d0938d2ba0b3e5b80613Julia Reynolds
365f35e3976e3c01077f8d8d0938d2ba0b3e5b80613Julia Reynolds    /**
366619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds     * Sets the sound that should be played for notifications posted to this channel and its
367184b86da382b8e24cdd0e5629e70d7057d418883Julia Reynolds     * audio attributes. Notification channels with an {@link #getImportance() importance} of at
368184b86da382b8e24cdd0e5629e70d7057d418883Julia Reynolds     * least {@link NotificationManager#IMPORTANCE_DEFAULT} should have a sound.
369619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds     *
370619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds     * Only modifiable before the channel is submitted to
37182a9cf60f36ad3c08e87945814b0a4455d9bdb3aJulia Reynolds     * {@link NotificationManager#createNotificationChannel(NotificationChannel)}.
372b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     */
373619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds    public void setSound(Uri sound, AudioAttributes audioAttributes) {
3740c299d4d6316d14e43d386b4562782083fe3c886Julia Reynolds        this.mSound = sound;
375619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds        this.mAudioAttributes = audioAttributes;
376b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
377b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
378b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    /**
379b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     * Sets whether notifications posted to this channel should display notification lights,
380619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds     * on devices that support that feature.
381619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds     *
382619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds     * Only modifiable before the channel is submitted to
38382a9cf60f36ad3c08e87945814b0a4455d9bdb3aJulia Reynolds     * {@link NotificationManager#createNotificationChannel(NotificationChannel)}.
384b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     */
385529e3329e68963eff0dd1cf40d938a9953cd5060Julia Reynolds    public void enableLights(boolean lights) {
386b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        this.mLights = lights;
387b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
388b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
389b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    /**
390529e3329e68963eff0dd1cf40d938a9953cd5060Julia Reynolds     * Sets the notification light color for notifications posted to this channel, if lights are
391529e3329e68963eff0dd1cf40d938a9953cd5060Julia Reynolds     * {@link #enableLights(boolean) enabled} on this channel and the device supports that feature.
392529e3329e68963eff0dd1cf40d938a9953cd5060Julia Reynolds     *
393529e3329e68963eff0dd1cf40d938a9953cd5060Julia Reynolds     * Only modifiable before the channel is submitted to
39482a9cf60f36ad3c08e87945814b0a4455d9bdb3aJulia Reynolds     * {@link NotificationManager#createNotificationChannel(NotificationChannel)}.
395529e3329e68963eff0dd1cf40d938a9953cd5060Julia Reynolds     */
396529e3329e68963eff0dd1cf40d938a9953cd5060Julia Reynolds    public void setLightColor(int argb) {
397529e3329e68963eff0dd1cf40d938a9953cd5060Julia Reynolds        this.mLightColor = argb;
398529e3329e68963eff0dd1cf40d938a9953cd5060Julia Reynolds    }
399529e3329e68963eff0dd1cf40d938a9953cd5060Julia Reynolds
400529e3329e68963eff0dd1cf40d938a9953cd5060Julia Reynolds    /**
401f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds     * Sets whether notification posted to this channel should vibrate. The vibration pattern can
402619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds     * be set with {@link #setVibrationPattern(long[])}.
403619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds     *
404619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds     * Only modifiable before the channel is submitted to
40582a9cf60f36ad3c08e87945814b0a4455d9bdb3aJulia Reynolds     * {@link NotificationManager#createNotificationChannel(NotificationChannel)}.
406f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds     */
407f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds    public void enableVibration(boolean vibration) {
408f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        this.mVibrationEnabled = vibration;
409f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds    }
410f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds
411f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds    /**
412a33f5c4312ce708933454dfd1b154ccc46be099cJulia Reynolds     * Sets the vibration pattern for notifications posted to this channel. If the provided
413a33f5c4312ce708933454dfd1b154ccc46be099cJulia Reynolds     * pattern is valid (non-null, non-empty), will {@link #enableVibration(boolean)} enable
414a33f5c4312ce708933454dfd1b154ccc46be099cJulia Reynolds     * vibration} as well. Otherwise, vibration will be disabled.
415619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds     *
416619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds     * Only modifiable before the channel is submitted to
41782a9cf60f36ad3c08e87945814b0a4455d9bdb3aJulia Reynolds     * {@link NotificationManager#createNotificationChannel(NotificationChannel)}.
418b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     */
419f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds    public void setVibrationPattern(long[] vibrationPattern) {
420a33f5c4312ce708933454dfd1b154ccc46be099cJulia Reynolds        this.mVibrationEnabled = vibrationPattern != null && vibrationPattern.length > 0;
421f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        this.mVibration = vibrationPattern;
422b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
423b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
424b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    /**
42582a9cf60f36ad3c08e87945814b0a4455d9bdb3aJulia Reynolds     * Sets the level of interruption of this notification channel.
42682a9cf60f36ad3c08e87945814b0a4455d9bdb3aJulia Reynolds     *
42782a9cf60f36ad3c08e87945814b0a4455d9bdb3aJulia Reynolds     * Only modifiable before the channel is submitted to
42882a9cf60f36ad3c08e87945814b0a4455d9bdb3aJulia Reynolds     * {@link NotificationManager#createNotificationChannel(NotificationChannel)}.
4292c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds     *
4306503bd8e33dbf6e8357256d43c6e1158e32a0268Jeff Sharkey     * @param importance the amount the user should be interrupted by
4316503bd8e33dbf6e8357256d43c6e1158e32a0268Jeff Sharkey     *            notifications from this channel.
4322c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds     */
4336503bd8e33dbf6e8357256d43c6e1158e32a0268Jeff Sharkey    public void setImportance(@Importance int importance) {
4342c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds        this.mImportance = importance;
4352c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds    }
4362c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds
4372c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds    // Modifiable by a notification ranker.
4382c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds
4392c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds    /**
4402c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds     * Sets whether or not notifications posted to this channel can interrupt the user in
4412c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds     * {@link android.app.NotificationManager.Policy#INTERRUPTION_FILTER_PRIORITY} mode.
4422c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds     *
4432c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds     * Only modifiable by the system and notification ranker.
4442c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds     */
4452c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds    public void setBypassDnd(boolean bypassDnd) {
4462c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds        this.mBypassDnd = bypassDnd;
4472c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds    }
4482c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds
4492c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds    /**
4502c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds     * Sets whether notifications posted to this channel appear on the lockscreen or not, and if so,
4512c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds     * whether they appear in a redacted form. See e.g. {@link Notification#VISIBILITY_SECRET}.
4522c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds     *
4532c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds     * Only modifiable by the system and notification ranker.
4542c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds     */
4552c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds    public void setLockscreenVisibility(int lockscreenVisibility) {
4562c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds        this.mLockscreenVisibility = lockscreenVisibility;
4572c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds    }
4582c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds
4592c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds    /**
460b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     * Returns the id of this channel.
461b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     */
462b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    public String getId() {
463b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        return mId;
464b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
465b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
466b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    /**
467b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     * Returns the user visible name of this channel.
468b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     */
4692c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds    public CharSequence getName() {
470b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        return mName;
471b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
472b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
473b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    /**
4742c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds     * Returns the user visible description of this channel.
4752c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds     */
4762c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds    public String getDescription() {
4772c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds        return mDesc;
4782c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds    }
4792c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds
4802c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds    /**
481184b86da382b8e24cdd0e5629e70d7057d418883Julia Reynolds     * Returns the user specified importance e.g. {@link NotificationManager#IMPORTANCE_LOW} for
4828d2b053611fe4a52602c125bf1f577c12083848aJulia Reynolds     * notifications posted to this channel. Note: This value might be >
4838d2b053611fe4a52602c125bf1f577c12083848aJulia Reynolds     * {@link NotificationManager#IMPORTANCE_NONE}, but notifications posted to this channel will
4848d2b053611fe4a52602c125bf1f577c12083848aJulia Reynolds     * not be shown to the user if the parent {@link NotificationChannelGroup} or app is blocked.
4858d2b053611fe4a52602c125bf1f577c12083848aJulia Reynolds     * See {@link NotificationChannelGroup#isBlocked()} and
4868d2b053611fe4a52602c125bf1f577c12083848aJulia Reynolds     * {@link NotificationManager#areNotificationsEnabled()}.
487b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     */
488b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    public int getImportance() {
489b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        return mImportance;
490b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
491b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
492b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    /**
493b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     * Whether or not notifications posted to this channel can bypass the Do Not Disturb
494b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     * {@link NotificationManager#INTERRUPTION_FILTER_PRIORITY} mode.
495b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     */
496b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    public boolean canBypassDnd() {
497b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        return mBypassDnd;
498b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
499b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
500b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    /**
501b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     * Returns the notification sound for this channel.
502b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     */
5030c299d4d6316d14e43d386b4562782083fe3c886Julia Reynolds    public Uri getSound() {
5040c299d4d6316d14e43d386b4562782083fe3c886Julia Reynolds        return mSound;
505b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
506b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
507b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    /**
508619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds     * Returns the audio attributes for sound played by notifications posted to this channel.
509619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds     */
510619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds    public AudioAttributes getAudioAttributes() {
511619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds        return mAudioAttributes;
512619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds    }
513619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds
514619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds    /**
515b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     * Returns whether notifications posted to this channel trigger notification lights.
516b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     */
517b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    public boolean shouldShowLights() {
518b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        return mLights;
519b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
520b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
521b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    /**
522529e3329e68963eff0dd1cf40d938a9953cd5060Julia Reynolds     * Returns the notification light color for notifications posted to this channel. Irrelevant
523529e3329e68963eff0dd1cf40d938a9953cd5060Julia Reynolds     * unless {@link #shouldShowLights()}.
524529e3329e68963eff0dd1cf40d938a9953cd5060Julia Reynolds     */
525529e3329e68963eff0dd1cf40d938a9953cd5060Julia Reynolds    public int getLightColor() {
526529e3329e68963eff0dd1cf40d938a9953cd5060Julia Reynolds        return mLightColor;
527529e3329e68963eff0dd1cf40d938a9953cd5060Julia Reynolds    }
528529e3329e68963eff0dd1cf40d938a9953cd5060Julia Reynolds
529529e3329e68963eff0dd1cf40d938a9953cd5060Julia Reynolds    /**
530b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     * Returns whether notifications posted to this channel always vibrate.
531b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     */
532b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    public boolean shouldVibrate() {
533f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        return mVibrationEnabled;
534f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds    }
535f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds
536f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds    /**
537f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds     * Returns the vibration pattern for notifications posted to this channel. Will be ignored if
538f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds     * vibration is not enabled ({@link #shouldVibrate()}.
539f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds     */
540f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds    public long[] getVibrationPattern() {
541b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        return mVibration;
542b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
543b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
544b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    /**
54585769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds     * Returns whether or not notifications posted to this channel are shown on the lockscreen in
54685769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds     * full or redacted form.
547b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     */
548b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    public int getLockscreenVisibility() {
549b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        return mLockscreenVisibility;
550b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
551b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
552b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    /**
553baff400fa5a93d157934818982fcf534327f9830Julia Reynolds     * Returns whether notifications posted to this channel can appear as badges in a Launcher
554baff400fa5a93d157934818982fcf534327f9830Julia Reynolds     * application.
555924eed1ca6d3fec5dae7eb0f9c11b8f23f628697Julia Reynolds     *
556924eed1ca6d3fec5dae7eb0f9c11b8f23f628697Julia Reynolds     * Note that badging may be disabled for other reasons.
557baff400fa5a93d157934818982fcf534327f9830Julia Reynolds     */
558baff400fa5a93d157934818982fcf534327f9830Julia Reynolds    public boolean canShowBadge() {
559baff400fa5a93d157934818982fcf534327f9830Julia Reynolds        return mShowBadge;
560baff400fa5a93d157934818982fcf534327f9830Julia Reynolds    }
561baff400fa5a93d157934818982fcf534327f9830Julia Reynolds
562baff400fa5a93d157934818982fcf534327f9830Julia Reynolds    /**
56359e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds     * Returns what group this channel belongs to.
56459e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds     *
56559e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds     * This is used only for visually grouping channels in the UI.
56659e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds     */
56759e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds    public String getGroup() {
56859e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds        return mGroup;
56959e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds    }
57059e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds
57159e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds    /**
5724036e8d4c636ae36f28585d283b522a7a97eaf72Julia Reynolds     * @hide
573baff400fa5a93d157934818982fcf534327f9830Julia Reynolds     */
5744036e8d4c636ae36f28585d283b522a7a97eaf72Julia Reynolds    @SystemApi
5754036e8d4c636ae36f28585d283b522a7a97eaf72Julia Reynolds    public boolean isDeleted() {
5764036e8d4c636ae36f28585d283b522a7a97eaf72Julia Reynolds        return mDeleted;
577baff400fa5a93d157934818982fcf534327f9830Julia Reynolds    }
578baff400fa5a93d157934818982fcf534327f9830Julia Reynolds
579baff400fa5a93d157934818982fcf534327f9830Julia Reynolds    /**
580b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     * @hide
581b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     */
582b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    @SystemApi
58385769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    public int getUserLockedFields() {
58485769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds        return mUserLockedFields;
58585769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    }
58685769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds
58785769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    /**
58885769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds     * @hide
58985769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds     */
590025d4a59fced3af7acfccef9cbae13735ddce7c8Dianne Hackborn    public boolean isFgServiceShown() {
591025d4a59fced3af7acfccef9cbae13735ddce7c8Dianne Hackborn        return mFgServiceShown;
592025d4a59fced3af7acfccef9cbae13735ddce7c8Dianne Hackborn    }
593025d4a59fced3af7acfccef9cbae13735ddce7c8Dianne Hackborn
594025d4a59fced3af7acfccef9cbae13735ddce7c8Dianne Hackborn    /**
595025d4a59fced3af7acfccef9cbae13735ddce7c8Dianne Hackborn     * @hide
596025d4a59fced3af7acfccef9cbae13735ddce7c8Dianne Hackborn     */
597f732159cf8d6a4e1cd17542a3a2cf020ad6919a3Julia Reynolds    public boolean isBlockableSystem() {
598f732159cf8d6a4e1cd17542a3a2cf020ad6919a3Julia Reynolds        return mBlockableSystem;
599f732159cf8d6a4e1cd17542a3a2cf020ad6919a3Julia Reynolds    }
600f732159cf8d6a4e1cd17542a3a2cf020ad6919a3Julia Reynolds
601f732159cf8d6a4e1cd17542a3a2cf020ad6919a3Julia Reynolds    /**
602f732159cf8d6a4e1cd17542a3a2cf020ad6919a3Julia Reynolds     * @hide
603f732159cf8d6a4e1cd17542a3a2cf020ad6919a3Julia Reynolds     */
604c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino    public void populateFromXmlForRestore(XmlPullParser parser, Context context) {
605c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino        populateFromXml(parser, true, context);
606c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino    }
607c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino
608c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino    /**
609c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino     * @hide
610c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino     */
61185769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    @SystemApi
612b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    public void populateFromXml(XmlPullParser parser) {
613c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino        populateFromXml(parser, false, null);
614c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino    }
615c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino
616c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino    /**
617c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino     * If {@param forRestore} is true, {@param Context} MUST be non-null.
618c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino     */
619c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino    private void populateFromXml(XmlPullParser parser, boolean forRestore,
620c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino            @Nullable Context context) {
621c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino        Preconditions.checkArgument(!forRestore || context != null,
622c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino                "forRestore is true but got null context");
623c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino
62485769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds        // Name, id, and importance are set in the constructor.
6252c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds        setDescription(parser.getAttributeValue(null, ATT_DESC));
626b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        setBypassDnd(Notification.PRIORITY_DEFAULT
627b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds                != safeInt(parser, ATT_PRIORITY, Notification.PRIORITY_DEFAULT));
628b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        setLockscreenVisibility(safeInt(parser, ATT_VISIBILITY, DEFAULT_VISIBILITY));
629c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino
630c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino        Uri sound = safeUri(parser, ATT_SOUND);
631c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino        setSound(forRestore ? restoreSoundUri(context, sound) : sound, safeAudioAttributes(parser));
632c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino
633529e3329e68963eff0dd1cf40d938a9953cd5060Julia Reynolds        enableLights(safeBool(parser, ATT_LIGHTS, false));
634529e3329e68963eff0dd1cf40d938a9953cd5060Julia Reynolds        setLightColor(safeInt(parser, ATT_LIGHT_COLOR, DEFAULT_LIGHT_COLOR));
635f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        setVibrationPattern(safeLongArray(parser, ATT_VIBRATION, null));
636745c15477b22f88af303065e18025af386582736Julia Reynolds        enableVibration(safeBool(parser, ATT_VIBRATION_ENABLED, false));
637baff400fa5a93d157934818982fcf534327f9830Julia Reynolds        setShowBadge(safeBool(parser, ATT_SHOW_BADGE, false));
6384036e8d4c636ae36f28585d283b522a7a97eaf72Julia Reynolds        setDeleted(safeBool(parser, ATT_DELETED, false));
63959e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds        setGroup(parser.getAttributeValue(null, ATT_GROUP));
64085769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds        lockFields(safeInt(parser, ATT_USER_LOCKED, 0));
641025d4a59fced3af7acfccef9cbae13735ddce7c8Dianne Hackborn        setFgServiceShown(safeBool(parser, ATT_FG_SERVICE_SHOWN, false));
642f732159cf8d6a4e1cd17542a3a2cf020ad6919a3Julia Reynolds        setBlockableSystem(safeBool(parser, ATT_BLOCKABLE_SYSTEM, false));
643b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
644b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
645c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino    @Nullable
646c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino    private Uri restoreSoundUri(Context context, @Nullable Uri uri) {
647c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino        if (uri == null) {
648c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino            return null;
649c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino        }
650c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino        ContentResolver contentResolver = context.getContentResolver();
651c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino        // There are backups out there with uncanonical uris (because we fixed this after
652c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino        // shipping). If uncanonical uris are given to MediaProvider.uncanonicalize it won't
653c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino        // verify the uri against device storage and we'll possibly end up with a broken uri.
654c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino        // We then canonicalize the uri to uncanonicalize it back, which means we properly check
655c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino        // the uri and in the case of not having the resource we end up with the default - better
656c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino        // than broken. As a side effect we'll canonicalize already canonicalized uris, this is fine
657c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino        // according to the docs because canonicalize method has to handle canonical uris as well.
658c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino        Uri canonicalizedUri = contentResolver.canonicalize(uri);
659c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino        if (canonicalizedUri == null) {
660c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino            // We got a null because the uri in the backup does not exist here, so we return default
661c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino            return Settings.System.DEFAULT_NOTIFICATION_URI;
662c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino        }
663c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino        return contentResolver.uncanonicalize(canonicalizedUri);
664c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino    }
665c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino
666b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    /**
667b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     * @hide
668b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     */
669b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    @SystemApi
670b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    public void writeXml(XmlSerializer out) throws IOException {
671c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino        writeXml(out, false, null);
672c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino    }
673c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino
674c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino    /**
675c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino     * @hide
676c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino     */
677c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino    public void writeXmlForBackup(XmlSerializer out, Context context) throws IOException {
678c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino        writeXml(out, true, context);
679c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino    }
680c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino
681c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino    private Uri getSoundForBackup(Context context) {
682c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino        Uri sound = getSound();
683c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino        if (sound == null) {
684c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino            return null;
685c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino        }
686c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino        Uri canonicalSound = context.getContentResolver().canonicalize(sound);
687c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino        if (canonicalSound == null) {
688c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino            // The content provider does not support canonical uris so we backup the default
689c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino            return Settings.System.DEFAULT_NOTIFICATION_URI;
690c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino        }
691c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino        return canonicalSound;
692c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino    }
693c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino
694c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino    /**
695c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino     * If {@param forBackup} is true, {@param Context} MUST be non-null.
696c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino     */
697c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino    private void writeXml(XmlSerializer out, boolean forBackup, @Nullable Context context)
698c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino            throws IOException {
699c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino        Preconditions.checkArgument(!forBackup || context != null,
700c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino                "forBackup is true but got null context");
701b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        out.startTag(null, TAG_CHANNEL);
702b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        out.attribute(null, ATT_ID, getId());
7035a31193497fa923e24bc5c9796b40fdfae604d31Julia Reynolds        if (getName() != null) {
7045a31193497fa923e24bc5c9796b40fdfae604d31Julia Reynolds            out.attribute(null, ATT_NAME, getName().toString());
7055a31193497fa923e24bc5c9796b40fdfae604d31Julia Reynolds        }
7062c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds        if (getDescription() != null) {
7072c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds            out.attribute(null, ATT_DESC, getDescription());
7082c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds        }
709b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        if (getImportance() != DEFAULT_IMPORTANCE) {
710b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds            out.attribute(
711b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds                    null, ATT_IMPORTANCE, Integer.toString(getImportance()));
712b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        }
713b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        if (canBypassDnd()) {
714b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds            out.attribute(
715b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds                    null, ATT_PRIORITY, Integer.toString(Notification.PRIORITY_MAX));
716b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        }
717b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        if (getLockscreenVisibility() != DEFAULT_VISIBILITY) {
718b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds            out.attribute(null, ATT_VISIBILITY,
719b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds                    Integer.toString(getLockscreenVisibility()));
720b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        }
721c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino        Uri sound = forBackup ? getSoundForBackup(context) : getSound();
722c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino        if (sound != null) {
723c27bb6ad34fd59161f6460b692ba72c7ede789b6Bernardo Rufino            out.attribute(null, ATT_SOUND, sound.toString());
724b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        }
725619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds        if (getAudioAttributes() != null) {
726619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds            out.attribute(null, ATT_USAGE, Integer.toString(getAudioAttributes().getUsage()));
727619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds            out.attribute(null, ATT_CONTENT_TYPE,
728619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds                    Integer.toString(getAudioAttributes().getContentType()));
729619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds            out.attribute(null, ATT_FLAGS, Integer.toString(getAudioAttributes().getFlags()));
730619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds        }
731b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        if (shouldShowLights()) {
732b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds            out.attribute(null, ATT_LIGHTS, Boolean.toString(shouldShowLights()));
733b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        }
734529e3329e68963eff0dd1cf40d938a9953cd5060Julia Reynolds        if (getLightColor() != DEFAULT_LIGHT_COLOR) {
735529e3329e68963eff0dd1cf40d938a9953cd5060Julia Reynolds            out.attribute(null, ATT_LIGHT_COLOR, Integer.toString(getLightColor()));
736529e3329e68963eff0dd1cf40d938a9953cd5060Julia Reynolds        }
737b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        if (shouldVibrate()) {
738f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds            out.attribute(null, ATT_VIBRATION_ENABLED, Boolean.toString(shouldVibrate()));
739f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        }
740f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        if (getVibrationPattern() != null) {
741f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds            out.attribute(null, ATT_VIBRATION, longArrayToString(getVibrationPattern()));
742b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        }
74385769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds        if (getUserLockedFields() != 0) {
74485769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds            out.attribute(null, ATT_USER_LOCKED, Integer.toString(getUserLockedFields()));
74585769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds        }
746025d4a59fced3af7acfccef9cbae13735ddce7c8Dianne Hackborn        if (isFgServiceShown()) {
747025d4a59fced3af7acfccef9cbae13735ddce7c8Dianne Hackborn            out.attribute(null, ATT_FG_SERVICE_SHOWN, Boolean.toString(isFgServiceShown()));
748025d4a59fced3af7acfccef9cbae13735ddce7c8Dianne Hackborn        }
749baff400fa5a93d157934818982fcf534327f9830Julia Reynolds        if (canShowBadge()) {
750baff400fa5a93d157934818982fcf534327f9830Julia Reynolds            out.attribute(null, ATT_SHOW_BADGE, Boolean.toString(canShowBadge()));
751baff400fa5a93d157934818982fcf534327f9830Julia Reynolds        }
7524036e8d4c636ae36f28585d283b522a7a97eaf72Julia Reynolds        if (isDeleted()) {
7534036e8d4c636ae36f28585d283b522a7a97eaf72Julia Reynolds            out.attribute(null, ATT_DELETED, Boolean.toString(isDeleted()));
7544036e8d4c636ae36f28585d283b522a7a97eaf72Julia Reynolds        }
75559e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds        if (getGroup() != null) {
75659e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds            out.attribute(null, ATT_GROUP, getGroup());
75759e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds        }
758f732159cf8d6a4e1cd17542a3a2cf020ad6919a3Julia Reynolds        if (isBlockableSystem()) {
759f732159cf8d6a4e1cd17542a3a2cf020ad6919a3Julia Reynolds            out.attribute(null, ATT_BLOCKABLE_SYSTEM, Boolean.toString(isBlockableSystem()));
760f732159cf8d6a4e1cd17542a3a2cf020ad6919a3Julia Reynolds        }
76185769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds
762b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        out.endTag(null, TAG_CHANNEL);
763b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
764b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
765b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    /**
766b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     * @hide
767b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     */
768b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    @SystemApi
769b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    public JSONObject toJson() throws JSONException {
770b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        JSONObject record = new JSONObject();
771b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        record.put(ATT_ID, getId());
772b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        record.put(ATT_NAME, getName());
7732c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds        record.put(ATT_DESC, getDescription());
774b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        if (getImportance() != DEFAULT_IMPORTANCE) {
775b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds            record.put(ATT_IMPORTANCE,
776b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds                    NotificationListenerService.Ranking.importanceToString(getImportance()));
777b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        }
778b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        if (canBypassDnd()) {
779b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds            record.put(ATT_PRIORITY, Notification.PRIORITY_MAX);
780b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        }
781b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        if (getLockscreenVisibility() != DEFAULT_VISIBILITY) {
782b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds            record.put(ATT_VISIBILITY, Notification.visibilityToString(getLockscreenVisibility()));
783b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        }
7840c299d4d6316d14e43d386b4562782083fe3c886Julia Reynolds        if (getSound() != null) {
7850c299d4d6316d14e43d386b4562782083fe3c886Julia Reynolds            record.put(ATT_SOUND, getSound().toString());
786b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        }
787619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds        if (getAudioAttributes() != null) {
788619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds            record.put(ATT_USAGE, Integer.toString(getAudioAttributes().getUsage()));
789619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds            record.put(ATT_CONTENT_TYPE,
790619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds                    Integer.toString(getAudioAttributes().getContentType()));
791619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds            record.put(ATT_FLAGS, Integer.toString(getAudioAttributes().getFlags()));
792619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds        }
793b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        record.put(ATT_LIGHTS, Boolean.toString(shouldShowLights()));
794529e3329e68963eff0dd1cf40d938a9953cd5060Julia Reynolds        record.put(ATT_LIGHT_COLOR, Integer.toString(getLightColor()));
795f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        record.put(ATT_VIBRATION_ENABLED, Boolean.toString(shouldVibrate()));
79685769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds        record.put(ATT_USER_LOCKED, Integer.toString(getUserLockedFields()));
797025d4a59fced3af7acfccef9cbae13735ddce7c8Dianne Hackborn        record.put(ATT_FG_SERVICE_SHOWN, Boolean.toString(isFgServiceShown()));
798f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        record.put(ATT_VIBRATION, longArrayToString(getVibrationPattern()));
799baff400fa5a93d157934818982fcf534327f9830Julia Reynolds        record.put(ATT_SHOW_BADGE, Boolean.toString(canShowBadge()));
8004036e8d4c636ae36f28585d283b522a7a97eaf72Julia Reynolds        record.put(ATT_DELETED, Boolean.toString(isDeleted()));
80159e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds        record.put(ATT_GROUP, getGroup());
802f732159cf8d6a4e1cd17542a3a2cf020ad6919a3Julia Reynolds        record.put(ATT_BLOCKABLE_SYSTEM, isBlockableSystem());
803b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        return record;
804b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
805b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
806619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds    private static AudioAttributes safeAudioAttributes(XmlPullParser parser) {
807619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds        int usage = safeInt(parser, ATT_USAGE, AudioAttributes.USAGE_NOTIFICATION);
808619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds        int contentType = safeInt(parser, ATT_CONTENT_TYPE,
809619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds                AudioAttributes.CONTENT_TYPE_SONIFICATION);
810619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds        int flags = safeInt(parser, ATT_FLAGS, 0);
811619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds        return new AudioAttributes.Builder()
812619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds                .setUsage(usage)
813619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds                .setContentType(contentType)
814619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds                .setFlags(flags)
815619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds                .build();
816619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds    }
817619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds
818b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    private static Uri safeUri(XmlPullParser parser, String att) {
819b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        final String val = parser.getAttributeValue(null, att);
820b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        return val == null ? null : Uri.parse(val);
821b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
822b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
823b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    private static int safeInt(XmlPullParser parser, String att, int defValue) {
824b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        final String val = parser.getAttributeValue(null, att);
825b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        return tryParseInt(val, defValue);
826b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
827b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
828b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    private static int tryParseInt(String value, int defValue) {
829b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        if (TextUtils.isEmpty(value)) return defValue;
830b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        try {
831b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds            return Integer.parseInt(value);
832b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        } catch (NumberFormatException e) {
833b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds            return defValue;
834b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        }
835b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
836b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
837b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    private static boolean safeBool(XmlPullParser parser, String att, boolean defValue) {
838b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        final String value = parser.getAttributeValue(null, att);
839b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        if (TextUtils.isEmpty(value)) return defValue;
840b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        return Boolean.parseBoolean(value);
841b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
842b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
843f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds    private static long[] safeLongArray(XmlPullParser parser, String att, long[] defValue) {
844f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        final String attributeValue = parser.getAttributeValue(null, att);
845f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        if (TextUtils.isEmpty(attributeValue)) return defValue;
846f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        String[] values = attributeValue.split(DELIMITER);
847f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        long[] longValues = new long[values.length];
848f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        for (int i = 0; i < values.length; i++) {
849f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds            try {
850f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds                longValues[i] = Long.parseLong(values[i]);
851f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds            } catch (NumberFormatException e) {
852f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds                longValues[i] = 0;
853f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds            }
854f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        }
855f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        return longValues;
856f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds    }
857f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds
858f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds    private static String longArrayToString(long[] values) {
859f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        StringBuffer sb = new StringBuffer();
8600f17000fb3b417fbc6129b47385c5f3c3dfd2de5Julia Reynolds        if (values != null && values.length > 0) {
86159e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds            for (int i = 0; i < values.length - 1; i++) {
86259e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds                sb.append(values[i]).append(DELIMITER);
86359e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds            }
86459e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds            sb.append(values[values.length - 1]);
865f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        }
866f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        return sb.toString();
867f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds    }
868f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds
869b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    public static final Creator<NotificationChannel> CREATOR = new Creator<NotificationChannel>() {
870b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        @Override
871b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        public NotificationChannel createFromParcel(Parcel in) {
872b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds            return new NotificationChannel(in);
873b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        }
874b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
875b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        @Override
876b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        public NotificationChannel[] newArray(int size) {
877b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds            return new NotificationChannel[size];
878b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        }
879b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    };
880b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
881b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    @Override
882b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    public int describeContents() {
883b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        return 0;
884b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
885b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
886b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    @Override
887b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    public boolean equals(Object o) {
888b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        if (this == o) return true;
889b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        if (o == null || getClass() != o.getClass()) return false;
890b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
891b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        NotificationChannel that = (NotificationChannel) o;
892b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
89359e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds        if (getImportance() != that.getImportance()) return false;
894b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        if (mBypassDnd != that.mBypassDnd) return false;
89559e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds        if (getLockscreenVisibility() != that.getLockscreenVisibility()) return false;
896b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        if (mLights != that.mLights) return false;
897529e3329e68963eff0dd1cf40d938a9953cd5060Julia Reynolds        if (getLightColor() != that.getLightColor()) return false;
89859e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds        if (getUserLockedFields() != that.getUserLockedFields()) return false;
899f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        if (mVibrationEnabled != that.mVibrationEnabled) return false;
900baff400fa5a93d157934818982fcf534327f9830Julia Reynolds        if (mShowBadge != that.mShowBadge) return false;
90159e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds        if (isDeleted() != that.isDeleted()) return false;
902f732159cf8d6a4e1cd17542a3a2cf020ad6919a3Julia Reynolds        if (isBlockableSystem() != that.isBlockableSystem()) return false;
90359e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds        if (getId() != null ? !getId().equals(that.getId()) : that.getId() != null) return false;
90459e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds        if (getName() != null ? !getName().equals(that.getName()) : that.getName() != null) {
90559e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds            return false;
90659e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds        }
9072c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds        if (getDescription() != null ? !getDescription().equals(that.getDescription())
9082c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds                : that.getDescription() != null) {
9092c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds            return false;
9102c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds        }
91159e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds        if (getSound() != null ? !getSound().equals(that.getSound()) : that.getSound() != null) {
91259e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds            return false;
91359e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds        }
91459e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds        if (!Arrays.equals(mVibration, that.mVibration)) return false;
915619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds        if (getGroup() != null ? !getGroup().equals(that.getGroup()) : that.getGroup() != null) {
916619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds            return false;
917619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds        }
918619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds        return getAudioAttributes() != null ? getAudioAttributes().equals(that.getAudioAttributes())
919619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds                : that.getAudioAttributes() == null;
92085769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds
92185769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    }
92285769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds
92385769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    @Override
92485769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    public int hashCode() {
92559e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds        int result = getId() != null ? getId().hashCode() : 0;
92659e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds        result = 31 * result + (getName() != null ? getName().hashCode() : 0);
9272c891c92fabb0ef8fdb77870b0272c156c71c7f0Julia Reynolds        result = 31 * result + (getDescription() != null ? getDescription().hashCode() : 0);
92859e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds        result = 31 * result + getImportance();
92985769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds        result = 31 * result + (mBypassDnd ? 1 : 0);
93059e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds        result = 31 * result + getLockscreenVisibility();
93159e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds        result = 31 * result + (getSound() != null ? getSound().hashCode() : 0);
93285769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds        result = 31 * result + (mLights ? 1 : 0);
933529e3329e68963eff0dd1cf40d938a9953cd5060Julia Reynolds        result = 31 * result + getLightColor();
934f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        result = 31 * result + Arrays.hashCode(mVibration);
93559e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds        result = 31 * result + getUserLockedFields();
936f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        result = 31 * result + (mVibrationEnabled ? 1 : 0);
937baff400fa5a93d157934818982fcf534327f9830Julia Reynolds        result = 31 * result + (mShowBadge ? 1 : 0);
93859e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds        result = 31 * result + (isDeleted() ? 1 : 0);
93959e152e92e6ebb71bab974973ce29b4f8d11f7cfJulia Reynolds        result = 31 * result + (getGroup() != null ? getGroup().hashCode() : 0);
940619a69f722b75241b372cf7b01b45b2dd1c862faJulia Reynolds        result = 31 * result + (getAudioAttributes() != null ? getAudioAttributes().hashCode() : 0);
941f732159cf8d6a4e1cd17542a3a2cf020ad6919a3Julia Reynolds        result = 31 * result + (isBlockableSystem() ? 1 : 0);
94285769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds        return result;
943b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
944b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
945b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    @Override
946b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    public String toString() {
947005c8b9098120526fa69f98bce3a5e1f79e3699bJulia Reynolds        return "NotificationChannel{"
948005c8b9098120526fa69f98bce3a5e1f79e3699bJulia Reynolds                + "mId='" + mId + '\''
949005c8b9098120526fa69f98bce3a5e1f79e3699bJulia Reynolds                + ", mName=" + mName
950005c8b9098120526fa69f98bce3a5e1f79e3699bJulia Reynolds                + ", mDescription=" + (!TextUtils.isEmpty(mDesc) ? "hasDescription " : "")
951005c8b9098120526fa69f98bce3a5e1f79e3699bJulia Reynolds                + ", mImportance=" + mImportance
952005c8b9098120526fa69f98bce3a5e1f79e3699bJulia Reynolds                + ", mBypassDnd=" + mBypassDnd
953005c8b9098120526fa69f98bce3a5e1f79e3699bJulia Reynolds                + ", mLockscreenVisibility=" + mLockscreenVisibility
954005c8b9098120526fa69f98bce3a5e1f79e3699bJulia Reynolds                + ", mSound=" + mSound
955005c8b9098120526fa69f98bce3a5e1f79e3699bJulia Reynolds                + ", mLights=" + mLights
956005c8b9098120526fa69f98bce3a5e1f79e3699bJulia Reynolds                + ", mLightColor=" + mLightColor
957005c8b9098120526fa69f98bce3a5e1f79e3699bJulia Reynolds                + ", mVibration=" + Arrays.toString(mVibration)
958005c8b9098120526fa69f98bce3a5e1f79e3699bJulia Reynolds                + ", mUserLockedFields=" + Integer.toHexString(mUserLockedFields)
959025d4a59fced3af7acfccef9cbae13735ddce7c8Dianne Hackborn                + ", mFgServiceShown=" + mFgServiceShown
960005c8b9098120526fa69f98bce3a5e1f79e3699bJulia Reynolds                + ", mVibrationEnabled=" + mVibrationEnabled
961005c8b9098120526fa69f98bce3a5e1f79e3699bJulia Reynolds                + ", mShowBadge=" + mShowBadge
962005c8b9098120526fa69f98bce3a5e1f79e3699bJulia Reynolds                + ", mDeleted=" + mDeleted
963005c8b9098120526fa69f98bce3a5e1f79e3699bJulia Reynolds                + ", mGroup='" + mGroup + '\''
964005c8b9098120526fa69f98bce3a5e1f79e3699bJulia Reynolds                + ", mAudioAttributes=" + mAudioAttributes
965005c8b9098120526fa69f98bce3a5e1f79e3699bJulia Reynolds                + ", mBlockableSystem=" + mBlockableSystem
966005c8b9098120526fa69f98bce3a5e1f79e3699bJulia Reynolds                + '}';
967b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
96862b4224757cf60fe57d8c9b0d43ab357f4df056dKweku Adams
96962b4224757cf60fe57d8c9b0d43ab357f4df056dKweku Adams    /** @hide */
970bc84aecc76b75fb8a4fa9df10f3cc84dbaf4a5d4Kweku Adams    public void writeToProto(ProtoOutputStream proto, long fieldId) {
971bc84aecc76b75fb8a4fa9df10f3cc84dbaf4a5d4Kweku Adams        final long token = proto.start(fieldId);
972bc84aecc76b75fb8a4fa9df10f3cc84dbaf4a5d4Kweku Adams
97362b4224757cf60fe57d8c9b0d43ab357f4df056dKweku Adams        proto.write(NotificationChannelProto.ID, mId);
97462b4224757cf60fe57d8c9b0d43ab357f4df056dKweku Adams        proto.write(NotificationChannelProto.NAME, mName);
97562b4224757cf60fe57d8c9b0d43ab357f4df056dKweku Adams        proto.write(NotificationChannelProto.DESCRIPTION, mDesc);
97662b4224757cf60fe57d8c9b0d43ab357f4df056dKweku Adams        proto.write(NotificationChannelProto.IMPORTANCE, mImportance);
97762b4224757cf60fe57d8c9b0d43ab357f4df056dKweku Adams        proto.write(NotificationChannelProto.CAN_BYPASS_DND, mBypassDnd);
97862b4224757cf60fe57d8c9b0d43ab357f4df056dKweku Adams        proto.write(NotificationChannelProto.LOCKSCREEN_VISIBILITY, mLockscreenVisibility);
97962b4224757cf60fe57d8c9b0d43ab357f4df056dKweku Adams        if (mSound != null) {
98062b4224757cf60fe57d8c9b0d43ab357f4df056dKweku Adams            proto.write(NotificationChannelProto.SOUND, mSound.toString());
98162b4224757cf60fe57d8c9b0d43ab357f4df056dKweku Adams        }
98262b4224757cf60fe57d8c9b0d43ab357f4df056dKweku Adams        proto.write(NotificationChannelProto.USE_LIGHTS, mLights);
98362b4224757cf60fe57d8c9b0d43ab357f4df056dKweku Adams        proto.write(NotificationChannelProto.LIGHT_COLOR, mLightColor);
98462b4224757cf60fe57d8c9b0d43ab357f4df056dKweku Adams        if (mVibration != null) {
98562b4224757cf60fe57d8c9b0d43ab357f4df056dKweku Adams            for (long v : mVibration) {
98662b4224757cf60fe57d8c9b0d43ab357f4df056dKweku Adams                proto.write(NotificationChannelProto.VIBRATION, v);
98762b4224757cf60fe57d8c9b0d43ab357f4df056dKweku Adams            }
98862b4224757cf60fe57d8c9b0d43ab357f4df056dKweku Adams        }
98962b4224757cf60fe57d8c9b0d43ab357f4df056dKweku Adams        proto.write(NotificationChannelProto.USER_LOCKED_FIELDS, mUserLockedFields);
990025d4a59fced3af7acfccef9cbae13735ddce7c8Dianne Hackborn        proto.write(NotificationChannelProto.FG_SERVICE_SHOWN, mFgServiceShown);
99162b4224757cf60fe57d8c9b0d43ab357f4df056dKweku Adams        proto.write(NotificationChannelProto.IS_VIBRATION_ENABLED, mVibrationEnabled);
99262b4224757cf60fe57d8c9b0d43ab357f4df056dKweku Adams        proto.write(NotificationChannelProto.SHOW_BADGE, mShowBadge);
99362b4224757cf60fe57d8c9b0d43ab357f4df056dKweku Adams        proto.write(NotificationChannelProto.IS_DELETED, mDeleted);
99462b4224757cf60fe57d8c9b0d43ab357f4df056dKweku Adams        proto.write(NotificationChannelProto.GROUP, mGroup);
99562b4224757cf60fe57d8c9b0d43ab357f4df056dKweku Adams        if (mAudioAttributes != null) {
996bc84aecc76b75fb8a4fa9df10f3cc84dbaf4a5d4Kweku Adams            mAudioAttributes.writeToProto(proto, NotificationChannelProto.AUDIO_ATTRIBUTES);
99762b4224757cf60fe57d8c9b0d43ab357f4df056dKweku Adams        }
99862b4224757cf60fe57d8c9b0d43ab357f4df056dKweku Adams        proto.write(NotificationChannelProto.IS_BLOCKABLE_SYSTEM, mBlockableSystem);
999bc84aecc76b75fb8a4fa9df10f3cc84dbaf4a5d4Kweku Adams
1000bc84aecc76b75fb8a4fa9df10f3cc84dbaf4a5d4Kweku Adams        proto.end(token);
100162b4224757cf60fe57d8c9b0d43ab357f4df056dKweku Adams    }
1002b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds}
1003