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