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