NotificationChannel.java revision f35e3976e3c01077f8d8d0938d2ba0b3e5b80613
185769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds/*
285769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds * Copyright (C) 2016 The Android Open Source Project
385769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds *
485769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds * Licensed under the Apache License, Version 2.0 (the "License");
585769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds * you may not use this file except in compliance with the License.
685769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds * You may obtain a copy of the License at
785769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds *
885769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds *      http://www.apache.org/licenses/LICENSE-2.0
985769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds *
1085769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds * Unless required by applicable law or agreed to in writing, software
1185769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds * distributed under the License is distributed on an "AS IS" BASIS,
1285769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1385769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds * See the License for the specific language governing permissions and
1485769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds * limitations under the License.
1585769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds */
16b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynoldspackage android.app;
17b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
18b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynoldsimport org.json.JSONException;
19b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynoldsimport org.json.JSONObject;
20b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynoldsimport org.xmlpull.v1.XmlPullParser;
21b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynoldsimport org.xmlpull.v1.XmlSerializer;
22b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
23b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynoldsimport android.annotation.SystemApi;
24b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynoldsimport android.net.Uri;
25b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynoldsimport android.os.Parcel;
26b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynoldsimport android.os.Parcelable;
27b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynoldsimport android.service.notification.NotificationListenerService;
28b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynoldsimport android.text.TextUtils;
29b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
30b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynoldsimport java.io.IOException;
31f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynoldsimport java.util.Arrays;
32b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
33b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds/**
34b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds * A representation of settings that apply to a collection of similarly themed notifications.
35b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds */
36b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynoldspublic final class NotificationChannel implements Parcelable {
37b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
38b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    /**
39b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     * The id of the default channel for an app. All notifications posted without a notification
40b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     * channel specified are posted to this channel.
41b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     */
42b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    public static final String DEFAULT_CHANNEL_ID = "miscellaneous";
43b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
44b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    private static final String TAG_CHANNEL = "channel";
45b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    private static final String ATT_NAME = "name";
46b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    private static final String ATT_ID = "id";
47b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    private static final String ATT_PRIORITY = "priority";
48b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    private static final String ATT_VISIBILITY = "visibility";
49b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    private static final String ATT_IMPORTANCE = "importance";
50b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    private static final String ATT_LIGHTS = "lights";
51b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    private static final String ATT_VIBRATION = "vibration";
52f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds    private static final String ATT_VIBRATION_ENABLED = "vibration_enabled";
530c299d4d6316d14e43d386b4562782083fe3c886Julia Reynolds    private static final String ATT_SOUND = "sound";
540c299d4d6316d14e43d386b4562782083fe3c886Julia Reynolds    //TODO: add audio attributes support
550c299d4d6316d14e43d386b4562782083fe3c886Julia Reynolds    private static final String ATT_AUDIO_ATTRIBUTES = "audio_attributes";
56baff400fa5a93d157934818982fcf534327f9830Julia Reynolds    private static final String ATT_SHOW_BADGE = "show_badge";
5785769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    private static final String ATT_USER_LOCKED = "locked";
58baff400fa5a93d157934818982fcf534327f9830Julia Reynolds    private static final String ATT_ALLOWED = "allowed";
59f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds    private static final String DELIMITER = ",";
6085769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds
6185769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    /**
6285769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds     * @hide
6385769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds     */
6485769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    @SystemApi
6585769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    public static final int USER_LOCKED_PRIORITY = 0x00000001;
6685769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    /**
6785769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds     * @hide
6885769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds     */
6985769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    @SystemApi
7085769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    public static final int USER_LOCKED_VISIBILITY = 0x00000002;
7185769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    /**
7285769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds     * @hide
7385769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds     */
7485769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    @SystemApi
7585769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    public static final int USER_LOCKED_IMPORTANCE = 0x00000004;
7685769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    /**
7785769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds     * @hide
7885769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds     */
7985769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    @SystemApi
8085769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    public static final int USER_LOCKED_LIGHTS = 0x00000008;
8185769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    /**
8285769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds     * @hide
8385769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds     */
8485769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    @SystemApi
8585769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    public static final int USER_LOCKED_VIBRATION = 0x00000010;
8685769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    /**
8785769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds     * @hide
8885769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds     */
8985769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    @SystemApi
900c299d4d6316d14e43d386b4562782083fe3c886Julia Reynolds    public static final int USER_LOCKED_SOUND = 0x00000020;
91b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
92baff400fa5a93d157934818982fcf534327f9830Julia Reynolds    /**
93baff400fa5a93d157934818982fcf534327f9830Julia Reynolds     * @hide
94baff400fa5a93d157934818982fcf534327f9830Julia Reynolds     */
95baff400fa5a93d157934818982fcf534327f9830Julia Reynolds    @SystemApi
96baff400fa5a93d157934818982fcf534327f9830Julia Reynolds    public static final int USER_LOCKED_ALLOWED = 0x00000040;
97baff400fa5a93d157934818982fcf534327f9830Julia Reynolds
98baff400fa5a93d157934818982fcf534327f9830Julia Reynolds    /**
99baff400fa5a93d157934818982fcf534327f9830Julia Reynolds     * @hide
100baff400fa5a93d157934818982fcf534327f9830Julia Reynolds     */
101baff400fa5a93d157934818982fcf534327f9830Julia Reynolds    @SystemApi
102baff400fa5a93d157934818982fcf534327f9830Julia Reynolds    public static final int USER_LOCKED_SHOW_BADGE = 0x00000080;
103baff400fa5a93d157934818982fcf534327f9830Julia Reynolds
104baff400fa5a93d157934818982fcf534327f9830Julia Reynolds    /**
105baff400fa5a93d157934818982fcf534327f9830Julia Reynolds     * @hide
106baff400fa5a93d157934818982fcf534327f9830Julia Reynolds     */
107baff400fa5a93d157934818982fcf534327f9830Julia Reynolds    @SystemApi
108baff400fa5a93d157934818982fcf534327f9830Julia Reynolds    public static final int[] LOCKABLE_FIELDS = new int[] {
109baff400fa5a93d157934818982fcf534327f9830Julia Reynolds            USER_LOCKED_PRIORITY,
110baff400fa5a93d157934818982fcf534327f9830Julia Reynolds            USER_LOCKED_VISIBILITY,
111baff400fa5a93d157934818982fcf534327f9830Julia Reynolds            USER_LOCKED_IMPORTANCE,
112baff400fa5a93d157934818982fcf534327f9830Julia Reynolds            USER_LOCKED_LIGHTS,
113baff400fa5a93d157934818982fcf534327f9830Julia Reynolds            USER_LOCKED_VIBRATION,
114baff400fa5a93d157934818982fcf534327f9830Julia Reynolds            USER_LOCKED_SOUND,
115baff400fa5a93d157934818982fcf534327f9830Julia Reynolds            USER_LOCKED_ALLOWED,
116baff400fa5a93d157934818982fcf534327f9830Julia Reynolds            USER_LOCKED_SHOW_BADGE
117baff400fa5a93d157934818982fcf534327f9830Julia Reynolds    };
118baff400fa5a93d157934818982fcf534327f9830Julia Reynolds
119baff400fa5a93d157934818982fcf534327f9830Julia Reynolds
120b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    private static final int DEFAULT_VISIBILITY =
12185769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds            NotificationManager.VISIBILITY_NO_OVERRIDE;
122b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    private static final int DEFAULT_IMPORTANCE =
12385769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds            NotificationManager.IMPORTANCE_UNSPECIFIED;
124baff400fa5a93d157934818982fcf534327f9830Julia Reynolds    private static final boolean DEFAULT_ALLOWED = true;
125b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
126b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    private final String mId;
127b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    private CharSequence mName;
128b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    private int mImportance = DEFAULT_IMPORTANCE;
129b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    private boolean mBypassDnd;
130b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    private int mLockscreenVisibility = DEFAULT_VISIBILITY;
1310c299d4d6316d14e43d386b4562782083fe3c886Julia Reynolds    private Uri mSound;
132b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    private boolean mLights;
133f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds    private long[] mVibration;
13485769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    private int mUserLockedFields;
135f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds    private boolean mVibrationEnabled;
136baff400fa5a93d157934818982fcf534327f9830Julia Reynolds    private boolean mShowBadge;
137baff400fa5a93d157934818982fcf534327f9830Julia Reynolds    private boolean mAllowed = DEFAULT_ALLOWED;
138b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
139b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    /**
140b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     * Creates a notification channel.
141b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     *
142b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     * @param id The id of the channel. Must be unique per package.
143b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     * @param name The user visible name of the channel.
14485769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds     * @param importance The importance of the channel. This controls how interruptive notifications
14585769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds     *                   posted to this channel are. See e.g.
14685769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds     *                   {@link NotificationManager#IMPORTANCE_DEFAULT}.
147b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     */
14885769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    public NotificationChannel(String id, CharSequence name, int importance) {
149b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        this.mId = id;
150b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        this.mName = name;
15185769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds        this.mImportance = importance;
152b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
153b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
154b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    protected NotificationChannel(Parcel in) {
155b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        if (in.readByte() != 0) {
156b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds            mId = in.readString();
157b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        } else {
158b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds            mId = null;
159b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        }
160b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        mName = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in);
161b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        mImportance = in.readInt();
162b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        mBypassDnd = in.readByte() != 0;
163b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        mLockscreenVisibility = in.readInt();
164b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        if (in.readByte() != 0) {
1650c299d4d6316d14e43d386b4562782083fe3c886Julia Reynolds            mSound = Uri.CREATOR.createFromParcel(in);
166b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        } else {
1670c299d4d6316d14e43d386b4562782083fe3c886Julia Reynolds            mSound = null;
168b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        }
169b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        mLights = in.readByte() != 0;
170f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        mVibration = in.createLongArray();
17185769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds        mUserLockedFields = in.readInt();
172f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        mVibrationEnabled = in.readByte() != 0;
173baff400fa5a93d157934818982fcf534327f9830Julia Reynolds        mShowBadge = in.readByte() != 0;
174baff400fa5a93d157934818982fcf534327f9830Julia Reynolds        mAllowed = in.readByte() != 0;
175b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
176b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
177b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    @Override
178b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    public void writeToParcel(Parcel dest, int flags) {
179b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        if (mId != null) {
180b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds            dest.writeByte((byte) 1);
181b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds            dest.writeString(mId);
182b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        } else {
183b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds            dest.writeByte((byte) 0);
184b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        }
185b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        TextUtils.writeToParcel(mName, dest, flags);
186b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        dest.writeInt(mImportance);
187b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        dest.writeByte(mBypassDnd ? (byte) 1 : (byte) 0);
188b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        dest.writeInt(mLockscreenVisibility);
1890c299d4d6316d14e43d386b4562782083fe3c886Julia Reynolds        if (mSound != null) {
190b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds            dest.writeByte((byte) 1);
1910c299d4d6316d14e43d386b4562782083fe3c886Julia Reynolds            mSound.writeToParcel(dest, 0);
192b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        } else {
193b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds            dest.writeByte((byte) 0);
194b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        }
195b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        dest.writeByte(mLights ? (byte) 1 : (byte) 0);
196f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        dest.writeLongArray(mVibration);
19785769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds        dest.writeInt(mUserLockedFields);
198f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        dest.writeByte(mVibrationEnabled ? (byte) 1 : (byte) 0);
199baff400fa5a93d157934818982fcf534327f9830Julia Reynolds        dest.writeByte(mShowBadge ? (byte) 1 : (byte) 0);
200baff400fa5a93d157934818982fcf534327f9830Julia Reynolds        dest.writeByte(mAllowed ? (byte) 1 : (byte) 0);
201b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
202b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
203b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    /**
204b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     * @hide
205b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     */
206b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    @SystemApi
20785769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    public void lockFields(int field) {
20885769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds        mUserLockedFields |= field;
209b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
210b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
21185769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    // Modifiable by a notification ranker.
212b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
213b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    /**
214baff400fa5a93d157934818982fcf534327f9830Julia Reynolds     * Sets whether or not notifications posted to this channel can interrupt the user in
21585769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds     * {@link android.app.NotificationManager.Policy#INTERRUPTION_FILTER_PRIORITY} mode.
216baff400fa5a93d157934818982fcf534327f9830Julia Reynolds     *
217baff400fa5a93d157934818982fcf534327f9830Julia Reynolds     * Only modifiable by the system and notification ranker.
218b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     */
219b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    public void setBypassDnd(boolean bypassDnd) {
220b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        this.mBypassDnd = bypassDnd;
221b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
222b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
223b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    /**
224baff400fa5a93d157934818982fcf534327f9830Julia Reynolds     * Sets whether notifications posted to this channel appear on the lockscreen or not, and if so,
225baff400fa5a93d157934818982fcf534327f9830Julia Reynolds     * whether they appear in a redacted form. See e.g. {@link Notification#VISIBILITY_SECRET}.
22685769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds     *
227baff400fa5a93d157934818982fcf534327f9830Julia Reynolds     * Only modifiable by the system and notification ranker.
228b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     */
229b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    public void setLockscreenVisibility(int lockscreenVisibility) {
230b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        this.mLockscreenVisibility = lockscreenVisibility;
231b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
232b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
23385769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    /**
23485769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds     * Sets the level of interruption of this notification channel.
23585769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds     *
236baff400fa5a93d157934818982fcf534327f9830Julia Reynolds     * Only modifiable by the system and notification ranker.
237baff400fa5a93d157934818982fcf534327f9830Julia Reynolds     *
23885769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds     * @param importance the amount the user should be interrupted by notifications from this
23985769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds     *                   channel. See e.g.
24085769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds     *                   {@link android.app.NotificationManager#IMPORTANCE_DEFAULT}.
24185769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds     */
24285769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    public void setImportance(int importance) {
24385769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds        this.mImportance = importance;
24485769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    }
24585769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds
246baff400fa5a93d157934818982fcf534327f9830Julia Reynolds    /**
247baff400fa5a93d157934818982fcf534327f9830Julia Reynolds     * Sets whether notifications are allowed to be posted to this channel.
248baff400fa5a93d157934818982fcf534327f9830Julia Reynolds     *
249baff400fa5a93d157934818982fcf534327f9830Julia Reynolds     * Only modifiable by the system and notification ranker.
250baff400fa5a93d157934818982fcf534327f9830Julia Reynolds     *
251baff400fa5a93d157934818982fcf534327f9830Julia Reynolds     * @param allowed true if notifications are not allowed from this channel.
252baff400fa5a93d157934818982fcf534327f9830Julia Reynolds     */
253baff400fa5a93d157934818982fcf534327f9830Julia Reynolds    public void setAllowed(boolean allowed) {
254baff400fa5a93d157934818982fcf534327f9830Julia Reynolds        this.mAllowed = allowed;
255baff400fa5a93d157934818982fcf534327f9830Julia Reynolds    }
256baff400fa5a93d157934818982fcf534327f9830Julia Reynolds
257baff400fa5a93d157934818982fcf534327f9830Julia Reynolds
2588f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds    // Modifiable by apps on channel creation.
259b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
260b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    /**
261f35e3976e3c01077f8d8d0938d2ba0b3e5b80613Julia Reynolds     * Sets whether notifications posted to this channel can appear as application icon badges
262f35e3976e3c01077f8d8d0938d2ba0b3e5b80613Julia Reynolds     * in a Launcher.
263f35e3976e3c01077f8d8d0938d2ba0b3e5b80613Julia Reynolds     *
264f35e3976e3c01077f8d8d0938d2ba0b3e5b80613Julia Reynolds     * @param showBadge true if badges should be allowed to be shown.
265f35e3976e3c01077f8d8d0938d2ba0b3e5b80613Julia Reynolds     */
266f35e3976e3c01077f8d8d0938d2ba0b3e5b80613Julia Reynolds    public void setShowBadge(boolean showBadge) {
267f35e3976e3c01077f8d8d0938d2ba0b3e5b80613Julia Reynolds        this.mShowBadge = showBadge;
268f35e3976e3c01077f8d8d0938d2ba0b3e5b80613Julia Reynolds    }
269f35e3976e3c01077f8d8d0938d2ba0b3e5b80613Julia Reynolds
270f35e3976e3c01077f8d8d0938d2ba0b3e5b80613Julia Reynolds    /**
2710c299d4d6316d14e43d386b4562782083fe3c886Julia Reynolds     * Sets the sound that should be played for notifications posted to this channel if
2720c299d4d6316d14e43d386b4562782083fe3c886Julia Reynolds     * the notifications don't supply a sound. Only modifiable before the channel is submitted
27385769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds     * to the NotificationManager.
274b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     */
2750c299d4d6316d14e43d386b4562782083fe3c886Julia Reynolds    public void setSound(Uri sound) {
2760c299d4d6316d14e43d386b4562782083fe3c886Julia Reynolds        this.mSound = sound;
277b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
278b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
279b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    /**
280b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     * Sets whether notifications posted to this channel should display notification lights,
28185769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds     * on devices that support that feature. Only modifiable before the channel is submitted to
28285769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds     * the NotificationManager.
283b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     */
284b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    public void setLights(boolean lights) {
285b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        this.mLights = lights;
286b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
287b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
288b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    /**
289f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds     * Sets whether notification posted to this channel should vibrate. The vibration pattern can
290f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds     * be set with {@link #setVibrationPattern(long[])}. Only modifiable before the channel is
291f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds     * submitted to the NotificationManager.
292f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds     */
293f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds    public void enableVibration(boolean vibration) {
294f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        this.mVibrationEnabled = vibration;
295f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds    }
296f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds
297f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds    /**
298f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds     * Sets whether notification posted to this channel should vibrate. Only modifiable before the
299f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds     * channel is submitted to the NotificationManager.
300b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     */
301f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds    public void setVibrationPattern(long[] vibrationPattern) {
302f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        this.mVibration = vibrationPattern;
303b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
304b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
305b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    /**
306b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     * Returns the id of this channel.
307b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     */
308b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    public String getId() {
309b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        return mId;
310b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
311b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
312b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    /**
313b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     * Returns the user visible name of this channel.
314b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     */
315b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    public CharSequence getName() {
316b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        return mName;
317b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
318b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
319b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    /**
320b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     * Returns the user specified importance {e.g. @link NotificationManager#IMPORTANCE_LOW} for
321b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     * notifications posted to this channel.
322b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     */
323b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    public int getImportance() {
324b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        return mImportance;
325b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
326b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
327b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    /**
328b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     * Whether or not notifications posted to this channel can bypass the Do Not Disturb
329b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     * {@link NotificationManager#INTERRUPTION_FILTER_PRIORITY} mode.
330b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     */
331b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    public boolean canBypassDnd() {
332b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        return mBypassDnd;
333b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
334b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
335b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    /**
336b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     * Returns the notification sound for this channel.
337b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     */
3380c299d4d6316d14e43d386b4562782083fe3c886Julia Reynolds    public Uri getSound() {
3390c299d4d6316d14e43d386b4562782083fe3c886Julia Reynolds        return mSound;
340b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
341b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
342b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    /**
343b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     * Returns whether notifications posted to this channel trigger notification lights.
344b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     */
345b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    public boolean shouldShowLights() {
346b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        return mLights;
347b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
348b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
349b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    /**
350b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     * Returns whether notifications posted to this channel always vibrate.
351b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     */
352b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    public boolean shouldVibrate() {
353f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        return mVibrationEnabled;
354f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds    }
355f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds
356f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds    /**
357f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds     * Returns the vibration pattern for notifications posted to this channel. Will be ignored if
358f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds     * vibration is not enabled ({@link #shouldVibrate()}.
359f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds     */
360f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds    public long[] getVibrationPattern() {
361b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        return mVibration;
362b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
363b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
364b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    /**
36585769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds     * Returns whether or not notifications posted to this channel are shown on the lockscreen in
36685769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds     * full or redacted form.
367b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     */
368b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    public int getLockscreenVisibility() {
369b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        return mLockscreenVisibility;
370b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
371b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
372b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    /**
373baff400fa5a93d157934818982fcf534327f9830Julia Reynolds     * Returns whether notifications posted to this channel can appear as badges in a Launcher
374baff400fa5a93d157934818982fcf534327f9830Julia Reynolds     * application.
375baff400fa5a93d157934818982fcf534327f9830Julia Reynolds     */
376baff400fa5a93d157934818982fcf534327f9830Julia Reynolds    public boolean canShowBadge() {
377baff400fa5a93d157934818982fcf534327f9830Julia Reynolds        return mShowBadge;
378baff400fa5a93d157934818982fcf534327f9830Julia Reynolds    }
379baff400fa5a93d157934818982fcf534327f9830Julia Reynolds
380baff400fa5a93d157934818982fcf534327f9830Julia Reynolds    /**
381baff400fa5a93d157934818982fcf534327f9830Julia Reynolds     * Returns whether notifications are allowed to post to this channel.
382baff400fa5a93d157934818982fcf534327f9830Julia Reynolds     */
383baff400fa5a93d157934818982fcf534327f9830Julia Reynolds    public boolean isAllowed() {
384baff400fa5a93d157934818982fcf534327f9830Julia Reynolds        return mAllowed;
385baff400fa5a93d157934818982fcf534327f9830Julia Reynolds    }
386baff400fa5a93d157934818982fcf534327f9830Julia Reynolds
387baff400fa5a93d157934818982fcf534327f9830Julia Reynolds    /**
388b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     * @hide
389b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     */
390b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    @SystemApi
39185769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    public int getUserLockedFields() {
39285769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds        return mUserLockedFields;
39385769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    }
39485769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds
39585769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    /**
39685769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds     * @hide
39785769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds     */
39885769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    @SystemApi
399b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    public void populateFromXml(XmlPullParser parser) {
40085769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds        // Name, id, and importance are set in the constructor.
401b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        setBypassDnd(Notification.PRIORITY_DEFAULT
402b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds                != safeInt(parser, ATT_PRIORITY, Notification.PRIORITY_DEFAULT));
403b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        setLockscreenVisibility(safeInt(parser, ATT_VISIBILITY, DEFAULT_VISIBILITY));
4040c299d4d6316d14e43d386b4562782083fe3c886Julia Reynolds        setSound(safeUri(parser, ATT_SOUND));
405b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        setLights(safeBool(parser, ATT_LIGHTS, false));
406f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        enableVibration(safeBool(parser, ATT_VIBRATION_ENABLED, false));
407f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        setVibrationPattern(safeLongArray(parser, ATT_VIBRATION, null));
408baff400fa5a93d157934818982fcf534327f9830Julia Reynolds        setShowBadge(safeBool(parser, ATT_SHOW_BADGE, false));
409baff400fa5a93d157934818982fcf534327f9830Julia Reynolds        setAllowed(safeBool(parser, ATT_ALLOWED, true));
41085769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds        lockFields(safeInt(parser, ATT_USER_LOCKED, 0));
411b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
412b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
413b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    /**
414b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     * @hide
415b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     */
416b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    @SystemApi
417b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    public void writeXml(XmlSerializer out) throws IOException {
418b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        out.startTag(null, TAG_CHANNEL);
419b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        out.attribute(null, ATT_ID, getId());
420b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        out.attribute(null, ATT_NAME, getName().toString());
421b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        if (getImportance() != DEFAULT_IMPORTANCE) {
422b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds            out.attribute(
423b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds                    null, ATT_IMPORTANCE, Integer.toString(getImportance()));
424b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        }
425b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        if (canBypassDnd()) {
426b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds            out.attribute(
427b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds                    null, ATT_PRIORITY, Integer.toString(Notification.PRIORITY_MAX));
428b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        }
429b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        if (getLockscreenVisibility() != DEFAULT_VISIBILITY) {
430b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds            out.attribute(null, ATT_VISIBILITY,
431b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds                    Integer.toString(getLockscreenVisibility()));
432b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        }
4330c299d4d6316d14e43d386b4562782083fe3c886Julia Reynolds        if (getSound() != null) {
4340c299d4d6316d14e43d386b4562782083fe3c886Julia Reynolds            out.attribute(null, ATT_SOUND, getSound().toString());
435b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        }
436b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        if (shouldShowLights()) {
437b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds            out.attribute(null, ATT_LIGHTS, Boolean.toString(shouldShowLights()));
438b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        }
439b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        if (shouldVibrate()) {
440f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds            out.attribute(null, ATT_VIBRATION_ENABLED, Boolean.toString(shouldVibrate()));
441f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        }
442f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        if (getVibrationPattern() != null) {
443f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds            out.attribute(null, ATT_VIBRATION, longArrayToString(getVibrationPattern()));
444b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        }
44585769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds        if (getUserLockedFields() != 0) {
44685769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds            out.attribute(null, ATT_USER_LOCKED, Integer.toString(getUserLockedFields()));
44785769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds        }
448baff400fa5a93d157934818982fcf534327f9830Julia Reynolds        if (canShowBadge()) {
449baff400fa5a93d157934818982fcf534327f9830Julia Reynolds            out.attribute(null, ATT_SHOW_BADGE, Boolean.toString(canShowBadge()));
450baff400fa5a93d157934818982fcf534327f9830Julia Reynolds        }
451baff400fa5a93d157934818982fcf534327f9830Julia Reynolds        if (!isAllowed()) {
452baff400fa5a93d157934818982fcf534327f9830Julia Reynolds            out.attribute(null, ATT_ALLOWED, Boolean.toString(isAllowed()));
453baff400fa5a93d157934818982fcf534327f9830Julia Reynolds        }
45485769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds
455b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        out.endTag(null, TAG_CHANNEL);
456b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
457b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
458b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    /**
459b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     * @hide
460b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds     */
461b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    @SystemApi
462b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    public JSONObject toJson() throws JSONException {
463b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        JSONObject record = new JSONObject();
464b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        record.put(ATT_ID, getId());
465b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        record.put(ATT_NAME, getName());
466b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        if (getImportance() != DEFAULT_IMPORTANCE) {
467b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds            record.put(ATT_IMPORTANCE,
468b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds                    NotificationListenerService.Ranking.importanceToString(getImportance()));
469b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        }
470b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        if (canBypassDnd()) {
471b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds            record.put(ATT_PRIORITY, Notification.PRIORITY_MAX);
472b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        }
473b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        if (getLockscreenVisibility() != DEFAULT_VISIBILITY) {
474b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds            record.put(ATT_VISIBILITY, Notification.visibilityToString(getLockscreenVisibility()));
475b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        }
4760c299d4d6316d14e43d386b4562782083fe3c886Julia Reynolds        if (getSound() != null) {
4770c299d4d6316d14e43d386b4562782083fe3c886Julia Reynolds            record.put(ATT_SOUND, getSound().toString());
478b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        }
479b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        record.put(ATT_LIGHTS, Boolean.toString(shouldShowLights()));
480f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        record.put(ATT_VIBRATION_ENABLED, Boolean.toString(shouldVibrate()));
48185769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds        record.put(ATT_USER_LOCKED, Integer.toString(getUserLockedFields()));
482f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        record.put(ATT_VIBRATION, longArrayToString(getVibrationPattern()));
483baff400fa5a93d157934818982fcf534327f9830Julia Reynolds        record.put(ATT_SHOW_BADGE, Boolean.toString(canShowBadge()));
484baff400fa5a93d157934818982fcf534327f9830Julia Reynolds        record.put(ATT_ALLOWED, Boolean.toString(isAllowed()));
485b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
486b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        return record;
487b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
488b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
489b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    private static Uri safeUri(XmlPullParser parser, String att) {
490b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        final String val = parser.getAttributeValue(null, att);
491b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        return val == null ? null : Uri.parse(val);
492b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
493b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
494b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    private static int safeInt(XmlPullParser parser, String att, int defValue) {
495b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        final String val = parser.getAttributeValue(null, att);
496b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        return tryParseInt(val, defValue);
497b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
498b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
499b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    private static int tryParseInt(String value, int defValue) {
500b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        if (TextUtils.isEmpty(value)) return defValue;
501b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        try {
502b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds            return Integer.parseInt(value);
503b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        } catch (NumberFormatException e) {
504b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds            return defValue;
505b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        }
506b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
507b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
508b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    private static boolean safeBool(XmlPullParser parser, String att, boolean defValue) {
509b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        final String value = parser.getAttributeValue(null, att);
510b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        if (TextUtils.isEmpty(value)) return defValue;
511b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        return Boolean.parseBoolean(value);
512b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
513b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
514f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds    private static long[] safeLongArray(XmlPullParser parser, String att, long[] defValue) {
515f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        final String attributeValue = parser.getAttributeValue(null, att);
516f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        if (TextUtils.isEmpty(attributeValue)) return defValue;
517f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        String[] values = attributeValue.split(DELIMITER);
518f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        long[] longValues = new long[values.length];
519f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        for (int i = 0; i < values.length; i++) {
520f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds            try {
521f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds                longValues[i] = Long.parseLong(values[i]);
522f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds            } catch (NumberFormatException e) {
523f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds                longValues[i] = 0;
524f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds            }
525f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        }
526f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        return longValues;
527f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds    }
528f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds
529f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds    private static String longArrayToString(long[] values) {
530f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        StringBuffer sb = new StringBuffer();
531f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        for (int i = 0; i < values.length - 1; i++) {
532f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds            sb.append(values[i]).append(DELIMITER);
533f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        }
534f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        sb.append(values[values.length - 1]);
535f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        return sb.toString();
536f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds    }
537f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds
538b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    public static final Creator<NotificationChannel> CREATOR = new Creator<NotificationChannel>() {
539b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        @Override
540b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        public NotificationChannel createFromParcel(Parcel in) {
541b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds            return new NotificationChannel(in);
542b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        }
543b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
544b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        @Override
545b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        public NotificationChannel[] newArray(int size) {
546b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds            return new NotificationChannel[size];
547b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        }
548b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    };
549b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
550b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    @Override
551b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    public int describeContents() {
552b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        return 0;
553b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
554b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
555b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    @Override
556b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    public boolean equals(Object o) {
557b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        if (this == o) return true;
558b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        if (o == null || getClass() != o.getClass()) return false;
559b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
560b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        NotificationChannel that = (NotificationChannel) o;
561b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
562f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        if (mImportance != that.mImportance) return false;
563b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        if (mBypassDnd != that.mBypassDnd) return false;
564f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        if (mLockscreenVisibility != that.mLockscreenVisibility) return false;
565b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        if (mLights != that.mLights) return false;
566f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        if (mUserLockedFields != that.mUserLockedFields) return false;
567f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        if (mVibrationEnabled != that.mVibrationEnabled) return false;
568baff400fa5a93d157934818982fcf534327f9830Julia Reynolds        if (mShowBadge != that.mShowBadge) return false;
569baff400fa5a93d157934818982fcf534327f9830Julia Reynolds        if (mAllowed != that.mAllowed) return false;
570f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        if (mId != null ? !mId.equals(that.mId) : that.mId != null) return false;
571f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        if (mName != null ? !mName.equals(that.mName) : that.mName != null) return false;
572f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        if (mSound != null ? !mSound.equals(that.mSound) : that.mSound != null) return false;
573f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        return Arrays.equals(mVibration, that.mVibration);
57485769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds
57585769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    }
57685769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds
57785769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    @Override
57885769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds    public int hashCode() {
579f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        int result = mId != null ? mId.hashCode() : 0;
580f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        result = 31 * result + (mName != null ? mName.hashCode() : 0);
581f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        result = 31 * result + mImportance;
58285769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds        result = 31 * result + (mBypassDnd ? 1 : 0);
583f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        result = 31 * result + mLockscreenVisibility;
584f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        result = 31 * result + (mSound != null ? mSound.hashCode() : 0);
58585769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds        result = 31 * result + (mLights ? 1 : 0);
586f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        result = 31 * result + Arrays.hashCode(mVibration);
587f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        result = 31 * result + mUserLockedFields;
588f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds        result = 31 * result + (mVibrationEnabled ? 1 : 0);
589baff400fa5a93d157934818982fcf534327f9830Julia Reynolds        result = 31 * result + (mShowBadge ? 1 : 0);
590baff400fa5a93d157934818982fcf534327f9830Julia Reynolds        result = 31 * result + (mAllowed ? 1 : 0);
59185769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds        return result;
592b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
593b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds
594b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    @Override
595b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    public String toString() {
596b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds        return "NotificationChannel{" +
597b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds                "mId='" + mId + '\'' +
598b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds                ", mName=" + mName +
599b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds                ", mImportance=" + mImportance +
600b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds                ", mBypassDnd=" + mBypassDnd +
601b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds                ", mLockscreenVisibility=" + mLockscreenVisibility +
6020c299d4d6316d14e43d386b4562782083fe3c886Julia Reynolds                ", mSound=" + mSound +
603b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds                ", mLights=" + mLights +
604f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds                ", mVibration=" + Arrays.toString(mVibration) +
60585769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynolds                ", mUserLockedFields=" + mUserLockedFields +
606f57de46d0b16fea790dc29062bf5e47cf63bae3eJulia Reynolds                ", mVibrationEnabled=" + mVibrationEnabled +
607baff400fa5a93d157934818982fcf534327f9830Julia Reynolds                ", mShowBadge=" + mShowBadge +
608baff400fa5a93d157934818982fcf534327f9830Julia Reynolds                ", mAllowed=" + mAllowed +
609b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds                '}';
610b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds    }
611b5e44b796618c376cf535e43aaa86ea4522e7770Julia Reynolds}
612