NotificationCompat.java revision cd40090290dbd6f81ea40592bb8c699bb03ab931
1c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell/* 2c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * Copyright (C) 2012 The Android Open Source Project 3c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * 4c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * Licensed under the Apache License, Version 2.0 (the "License"); 5c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * you may not use this file except in compliance with the License. 6c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * You may obtain a copy of the License at 7c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * 8c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * http://www.apache.org/licenses/LICENSE-2.0 9c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * 10c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * Unless required by applicable law or agreed to in writing, software 11c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * distributed under the License is distributed on an "AS IS" BASIS, 12c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * See the License for the specific language governing permissions and 14c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * limitations under the License. 15c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell */ 16c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell 17c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powellpackage android.support.v4.app; 18c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell 19e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hillsimport android.app.Activity; 20c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powellimport android.app.Notification; 21c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powellimport android.app.PendingIntent; 22c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powellimport android.content.Context; 23c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powellimport android.graphics.Bitmap; 2469a58d36f6ed8ec4d076534556aba2f93d00254eDan Sandlerimport android.graphics.Color; 25c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powellimport android.media.AudioManager; 26c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powellimport android.net.Uri; 27c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powellimport android.os.Build; 28b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazenimport android.os.Bundle; 292bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazenimport android.os.Parcelable; 3070acb0c19be3831a2080e4f902324de16bfbf62eTor Norbyeimport android.support.annotation.ColorInt; 31c485ebd398348372709b10a713fc6d8630b31923Alex Hillsimport android.support.v4.os.BuildCompat; 322bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazenimport android.support.v4.view.GravityCompat; 332bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazenimport android.view.Gravity; 34c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powellimport android.widget.RemoteViews; 35300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen 36f021758934b35e3b842c6799344531d7ea2969daChris Wrenimport java.util.ArrayList; 372bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazenimport java.util.Collections; 382bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazenimport java.util.List; 39c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell 40080df8ffb0920eccb300baa39180eb956a000a53Chris Wren/** 41080df8ffb0920eccb300baa39180eb956a000a53Chris Wren * Helper for accessing features in {@link android.app.Notification} 42080df8ffb0920eccb300baa39180eb956a000a53Chris Wren * introduced after API level 4 in a backwards compatible fashion. 43080df8ffb0920eccb300baa39180eb956a000a53Chris Wren */ 44c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powellpublic class NotificationCompat { 45c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen 46c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen /** 47c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen * Use all default values (where applicable). 48c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen */ 49c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen public static final int DEFAULT_ALL = ~0; 50c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen 51c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen /** 52c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen * Use the default notification sound. This will ignore any sound set using 53c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen * {@link Builder#setSound} 54c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen * 55e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren * <p> 56e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren * A notification that is noisy is more likely to be presented as a heads-up notification, 57e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren * on some platforms. 58e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren * </p> 59e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren * 60c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen * @see Builder#setDefaults 61c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen */ 62c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen public static final int DEFAULT_SOUND = 1; 63c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen 64c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen /** 65c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen * Use the default notification vibrate. This will ignore any vibrate set using 66c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen * {@link Builder#setVibrate}. Using phone vibration requires the 67c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen * {@link android.Manifest.permission#VIBRATE VIBRATE} permission. 68c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen * 69e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren * <p> 70e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren * A notification that vibrates is more likely to be presented as a heads-up notification, 71e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren * on some platforms. 72e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren * </p> 73e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren * 74c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen * @see Builder#setDefaults 75c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen */ 76c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen public static final int DEFAULT_VIBRATE = 2; 77c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen 78c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen /** 79c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen * Use the default notification lights. This will ignore the 80c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen * {@link #FLAG_SHOW_LIGHTS} bit, and values set with {@link Builder#setLights}. 81c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen * 82c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen * @see Builder#setDefaults 83c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen */ 84c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen public static final int DEFAULT_LIGHTS = 4; 85c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen 86c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen /** 87c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen * Use this constant as the value for audioStreamType to request that 88c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen * the default stream type for notifications be used. Currently the 89c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen * default stream type is {@link AudioManager#STREAM_NOTIFICATION}. 90c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen */ 91c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen public static final int STREAM_DEFAULT = -1; 92c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen 93c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen /** 94c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen * Bit set in the Notification flags field when LEDs should be turned on 95c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen * for this notification. 96c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen */ 97c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen public static final int FLAG_SHOW_LIGHTS = 0x00000001; 98c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen 99c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen /** 100c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen * Bit set in the Notification flags field if this notification is in 101c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen * reference to something that is ongoing, like a phone call. It should 102c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen * not be set if this notification is in reference to something that 103c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen * happened at a particular point in time, like a missed phone call. 104c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen */ 105c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen public static final int FLAG_ONGOING_EVENT = 0x00000002; 106c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen 107c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen /** 108c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen * Bit set in the Notification flags field if 109c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen * the audio will be repeated until the notification is 110c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen * cancelled or the notification window is opened. 111c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen */ 112c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen public static final int FLAG_INSISTENT = 0x00000004; 113c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen 114c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen /** 115c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen * Bit set in the Notification flags field if the notification's sound, 116c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen * vibrate and ticker should only be played if the notification is not already showing. 117c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen */ 118c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen public static final int FLAG_ONLY_ALERT_ONCE = 0x00000008; 119c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen 120c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen /** 121c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen * Bit set in the Notification flags field if the notification should be canceled when 122c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen * it is clicked by the user. 123c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen */ 124c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen public static final int FLAG_AUTO_CANCEL = 0x00000010; 125c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen 126c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen /** 127c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen * Bit set in the Notification flags field if the notification should not be canceled 128c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen * when the user clicks the Clear all button. 129c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen */ 130c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen public static final int FLAG_NO_CLEAR = 0x00000020; 131c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen 132c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen /** 133c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen * Bit set in the Notification flags field if this notification represents a currently 134c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen * running service. This will normally be set for you by 135c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen * {@link android.app.Service#startForeground}. 136c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen */ 137c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen public static final int FLAG_FOREGROUND_SERVICE = 0x00000040; 138c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen 139c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell /** 140f021758934b35e3b842c6799344531d7ea2969daChris Wren * Obsolete flag indicating high-priority notifications; use the priority field instead. 141884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin * 142f021758934b35e3b842c6799344531d7ea2969daChris Wren * @deprecated Use {@link NotificationCompat.Builder#setPriority(int)} with a positive value. 143c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell */ 144d805095048f6be52cddbd572ee343c4639ba8187Alan Viverette @Deprecated 145ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen public static final int FLAG_HIGH_PRIORITY = 0x00000080; 146ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen 147ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen /** 148ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen * Bit set in the Notification flags field if this notification is relevant to the current 149ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen * device only and it is not recommended that it bridge to other devices. 150ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen */ 151ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen public static final int FLAG_LOCAL_ONLY = 0x00000100; 152ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen 153ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen /** 154ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen * Bit set in the Notification flags field if this notification is the group summary for a 155ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen * group of notifications. Grouped notifications may display in a cluster or stack on devices 156ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen * which support such rendering. Requires a group key also be set using 157ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen * {@link Builder#setGroup}. 158ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen */ 159ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen public static final int FLAG_GROUP_SUMMARY = 0x00000200; 160c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell 161f021758934b35e3b842c6799344531d7ea2969daChris Wren /** 162f021758934b35e3b842c6799344531d7ea2969daChris Wren * Default notification priority for {@link NotificationCompat.Builder#setPriority(int)}. 163f021758934b35e3b842c6799344531d7ea2969daChris Wren * If your application does not prioritize its own notifications, 164f021758934b35e3b842c6799344531d7ea2969daChris Wren * use this value for all notifications. 165f021758934b35e3b842c6799344531d7ea2969daChris Wren */ 166f021758934b35e3b842c6799344531d7ea2969daChris Wren public static final int PRIORITY_DEFAULT = 0; 167f021758934b35e3b842c6799344531d7ea2969daChris Wren 168f021758934b35e3b842c6799344531d7ea2969daChris Wren /** 169f021758934b35e3b842c6799344531d7ea2969daChris Wren * Lower notification priority for {@link NotificationCompat.Builder#setPriority(int)}, 170f021758934b35e3b842c6799344531d7ea2969daChris Wren * for items that are less important. The UI may choose to show 171f021758934b35e3b842c6799344531d7ea2969daChris Wren * these items smaller, or at a different position in the list, 172f021758934b35e3b842c6799344531d7ea2969daChris Wren * compared with your app's {@link #PRIORITY_DEFAULT} items. 173f021758934b35e3b842c6799344531d7ea2969daChris Wren */ 174f021758934b35e3b842c6799344531d7ea2969daChris Wren public static final int PRIORITY_LOW = -1; 175f021758934b35e3b842c6799344531d7ea2969daChris Wren 176f021758934b35e3b842c6799344531d7ea2969daChris Wren /** 177f021758934b35e3b842c6799344531d7ea2969daChris Wren * Lowest notification priority for {@link NotificationCompat.Builder#setPriority(int)}; 178f021758934b35e3b842c6799344531d7ea2969daChris Wren * these items might not be shown to the user except under 179f021758934b35e3b842c6799344531d7ea2969daChris Wren * special circumstances, such as detailed notification logs. 180f021758934b35e3b842c6799344531d7ea2969daChris Wren */ 181f021758934b35e3b842c6799344531d7ea2969daChris Wren public static final int PRIORITY_MIN = -2; 182f021758934b35e3b842c6799344531d7ea2969daChris Wren 183f021758934b35e3b842c6799344531d7ea2969daChris Wren /** 184f021758934b35e3b842c6799344531d7ea2969daChris Wren * Higher notification priority for {@link NotificationCompat.Builder#setPriority(int)}, 185f021758934b35e3b842c6799344531d7ea2969daChris Wren * for more important notifications or alerts. The UI may choose 186f021758934b35e3b842c6799344531d7ea2969daChris Wren * to show these items larger, or at a different position in 187f021758934b35e3b842c6799344531d7ea2969daChris Wren * notification lists, compared with your app's {@link #PRIORITY_DEFAULT} items. 188f021758934b35e3b842c6799344531d7ea2969daChris Wren */ 189f021758934b35e3b842c6799344531d7ea2969daChris Wren public static final int PRIORITY_HIGH = 1; 190f021758934b35e3b842c6799344531d7ea2969daChris Wren 191f021758934b35e3b842c6799344531d7ea2969daChris Wren /** 192f021758934b35e3b842c6799344531d7ea2969daChris Wren * Highest notification priority for {@link NotificationCompat.Builder#setPriority(int)}, 193f021758934b35e3b842c6799344531d7ea2969daChris Wren * for your application's most important items that require the user's 194f021758934b35e3b842c6799344531d7ea2969daChris Wren * prompt attention or input. 195f021758934b35e3b842c6799344531d7ea2969daChris Wren */ 196f021758934b35e3b842c6799344531d7ea2969daChris Wren public static final int PRIORITY_MAX = 2; 197f021758934b35e3b842c6799344531d7ea2969daChris Wren 198c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen /** 199c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen * Notification extras key: this is the title of the notification, 200c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen * as supplied to {@link Builder#setContentTitle(CharSequence)}. 201c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen */ 202c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen public static final String EXTRA_TITLE = "android.title"; 203c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen 204c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen /** 205c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen * Notification extras key: this is the title of the notification when shown in expanded form, 206c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen * e.g. as supplied to {@link BigTextStyle#setBigContentTitle(CharSequence)}. 207c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen */ 208c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen public static final String EXTRA_TITLE_BIG = EXTRA_TITLE + ".big"; 209c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen 210c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen /** 211c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen * Notification extras key: this is the main text payload, as supplied to 212c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen * {@link Builder#setContentText(CharSequence)}. 213c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen */ 214c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen public static final String EXTRA_TEXT = "android.text"; 215c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen 216c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen /** 217c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen * Notification extras key: this is a third line of text, as supplied to 218c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen * {@link Builder#setSubText(CharSequence)}. 219c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen */ 220c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen public static final String EXTRA_SUB_TEXT = "android.subText"; 221c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen 222c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen /** 223aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas * Notification extras key: this is the remote input history, as supplied to 224aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas * {@link Builder#setRemoteInputHistory(CharSequence[])}. 225aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas * 226aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas * Apps can fill this through {@link Builder#setRemoteInputHistory(CharSequence[])} 227aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas * with the most recent inputs that have been sent through a {@link RemoteInput} of this 228aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas * Notification and are expected to clear it once the it is no longer relevant (e.g. for chat 229aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas * notifications once the other party has responded). 230aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas * 231aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas * The extra with this key is of type CharSequence[] and contains the most recent entry at 232aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas * the 0 index, the second most recent at the 1 index, etc. 233aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas * 234aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas * @see Builder#setRemoteInputHistory(CharSequence[]) 235aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas */ 236aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas public static final String EXTRA_REMOTE_INPUT_HISTORY = "android.remoteInputHistory"; 237aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas 238aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas /** 239c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen * Notification extras key: this is a small piece of additional text as supplied to 240c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen * {@link Builder#setContentInfo(CharSequence)}. 241c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen */ 242c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen public static final String EXTRA_INFO_TEXT = "android.infoText"; 243c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen 244c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen /** 245c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen * Notification extras key: this is a line of summary information intended to be shown 246c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen * alongside expanded notifications, as supplied to (e.g.) 247c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen * {@link BigTextStyle#setSummaryText(CharSequence)}. 248c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen */ 249c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen public static final String EXTRA_SUMMARY_TEXT = "android.summaryText"; 250c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen 251c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen /** 25248d8878e34b0d9983166418378125b63faac9aabGriff Hazen * Notification extras key: this is the longer text shown in the big form of a 25348d8878e34b0d9983166418378125b63faac9aabGriff Hazen * {@link BigTextStyle} notification, as supplied to 25448d8878e34b0d9983166418378125b63faac9aabGriff Hazen * {@link BigTextStyle#bigText(CharSequence)}. 25548d8878e34b0d9983166418378125b63faac9aabGriff Hazen */ 25648d8878e34b0d9983166418378125b63faac9aabGriff Hazen public static final String EXTRA_BIG_TEXT = "android.bigText"; 25748d8878e34b0d9983166418378125b63faac9aabGriff Hazen 25848d8878e34b0d9983166418378125b63faac9aabGriff Hazen /** 259c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen * Notification extras key: this is the resource ID of the notification's main small icon, as 260c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen * supplied to {@link Builder#setSmallIcon(int)}. 261c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen */ 262c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen public static final String EXTRA_SMALL_ICON = "android.icon"; 263c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen 264c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen /** 265c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen * Notification extras key: this is a bitmap to be used instead of the small icon when showing the 266c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen * notification payload, as 267c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen * supplied to {@link Builder#setLargeIcon(android.graphics.Bitmap)}. 268c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen */ 269c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen public static final String EXTRA_LARGE_ICON = "android.largeIcon"; 270c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen 271c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen /** 272c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen * Notification extras key: this is a bitmap to be used instead of the one from 273c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen * {@link Builder#setLargeIcon(android.graphics.Bitmap)} when the notification is 274c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen * shown in its expanded form, as supplied to 275c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen * {@link BigPictureStyle#bigLargeIcon(android.graphics.Bitmap)}. 276c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen */ 277c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen public static final String EXTRA_LARGE_ICON_BIG = EXTRA_LARGE_ICON + ".big"; 278c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen 279c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen /** 280c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen * Notification extras key: this is the progress value supplied to 281c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen * {@link Builder#setProgress(int, int, boolean)}. 282c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen */ 283c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen public static final String EXTRA_PROGRESS = "android.progress"; 284c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen 285c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen /** 286c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen * Notification extras key: this is the maximum value supplied to 287c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen * {@link Builder#setProgress(int, int, boolean)}. 288c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen */ 289c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen public static final String EXTRA_PROGRESS_MAX = "android.progressMax"; 290c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen 291c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen /** 292c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen * Notification extras key: whether the progress bar is indeterminate, supplied to 293c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen * {@link Builder#setProgress(int, int, boolean)}. 294c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen */ 295c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen public static final String EXTRA_PROGRESS_INDETERMINATE = "android.progressIndeterminate"; 296c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen 297c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen /** 298c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen * Notification extras key: whether the when field set using {@link Builder#setWhen} should 299c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen * be shown as a count-up timer (specifically a {@link android.widget.Chronometer}) instead 300c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen * of a timestamp, as supplied to {@link Builder#setUsesChronometer(boolean)}. 301c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen */ 302c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen public static final String EXTRA_SHOW_CHRONOMETER = "android.showChronometer"; 303c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen 304c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen /** 30548d8878e34b0d9983166418378125b63faac9aabGriff Hazen * Notification extras key: whether the when field set using {@link Builder#setWhen} should 30648d8878e34b0d9983166418378125b63faac9aabGriff Hazen * be shown, as supplied to {@link Builder#setShowWhen(boolean)}. 30748d8878e34b0d9983166418378125b63faac9aabGriff Hazen */ 30848d8878e34b0d9983166418378125b63faac9aabGriff Hazen public static final String EXTRA_SHOW_WHEN = "android.showWhen"; 30948d8878e34b0d9983166418378125b63faac9aabGriff Hazen 31048d8878e34b0d9983166418378125b63faac9aabGriff Hazen /** 311c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen * Notification extras key: this is a bitmap to be shown in {@link BigPictureStyle} expanded 312c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen * notifications, supplied to {@link BigPictureStyle#bigPicture(android.graphics.Bitmap)}. 313c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen */ 314c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen public static final String EXTRA_PICTURE = "android.picture"; 315c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen 316c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen /** 317c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen * Notification extras key: An array of CharSequences to show in {@link InboxStyle} expanded 318c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen * notifications, each of which was supplied to {@link InboxStyle#addLine(CharSequence)}. 319c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen */ 320c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen public static final String EXTRA_TEXT_LINES = "android.textLines"; 321c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen 322c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen /** 32341484f326c4dd126e84b26828ba340a8ae9406e8Christoph Studer * Notification extras key: A string representing the name of the specific 32441484f326c4dd126e84b26828ba340a8ae9406e8Christoph Studer * {@link android.app.Notification.Style} used to create this notification. 32541484f326c4dd126e84b26828ba340a8ae9406e8Christoph Studer */ 32641484f326c4dd126e84b26828ba340a8ae9406e8Christoph Studer public static final String EXTRA_TEMPLATE = "android.template"; 32741484f326c4dd126e84b26828ba340a8ae9406e8Christoph Studer 32841484f326c4dd126e84b26828ba340a8ae9406e8Christoph Studer /** 32989e6774cdb200acc2dd5f4c9022a7e1aeeb05bceChris Wren * Notification extras key: A String array containing the people that this 33089e6774cdb200acc2dd5f4c9022a7e1aeeb05bceChris Wren * notification relates to, each of which was supplied to 33189e6774cdb200acc2dd5f4c9022a7e1aeeb05bceChris Wren * {@link Builder#addPerson(String)}. 332c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen */ 333c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen public static final String EXTRA_PEOPLE = "android.people"; 334c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen 33569a58d36f6ed8ec4d076534556aba2f93d00254eDan Sandler /** 33641484f326c4dd126e84b26828ba340a8ae9406e8Christoph Studer * Notification extras key: A 33741484f326c4dd126e84b26828ba340a8ae9406e8Christoph Studer * {@link android.content.ContentUris content URI} pointing to an image that can be displayed 33841484f326c4dd126e84b26828ba340a8ae9406e8Christoph Studer * in the background when the notification is selected. The URI must point to an image stream 33941484f326c4dd126e84b26828ba340a8ae9406e8Christoph Studer * suitable for passing into 34041484f326c4dd126e84b26828ba340a8ae9406e8Christoph Studer * {@link android.graphics.BitmapFactory#decodeStream(java.io.InputStream) 34141484f326c4dd126e84b26828ba340a8ae9406e8Christoph Studer * BitmapFactory.decodeStream}; all other content types will be ignored. The content provider 34241484f326c4dd126e84b26828ba340a8ae9406e8Christoph Studer * URI used for this purpose must require no permissions to read the image data. 34341484f326c4dd126e84b26828ba340a8ae9406e8Christoph Studer */ 34441484f326c4dd126e84b26828ba340a8ae9406e8Christoph Studer public static final String EXTRA_BACKGROUND_IMAGE_URI = "android.backgroundImageUri"; 34541484f326c4dd126e84b26828ba340a8ae9406e8Christoph Studer 34641484f326c4dd126e84b26828ba340a8ae9406e8Christoph Studer /** 34741484f326c4dd126e84b26828ba340a8ae9406e8Christoph Studer * Notification key: A 34841484f326c4dd126e84b26828ba340a8ae9406e8Christoph Studer * {@link android.media.session.MediaSession.Token} associated with a 34941484f326c4dd126e84b26828ba340a8ae9406e8Christoph Studer * {@link android.app.Notification.MediaStyle} notification. 35041484f326c4dd126e84b26828ba340a8ae9406e8Christoph Studer */ 35141484f326c4dd126e84b26828ba340a8ae9406e8Christoph Studer public static final String EXTRA_MEDIA_SESSION = "android.mediaSession"; 35241484f326c4dd126e84b26828ba340a8ae9406e8Christoph Studer 35341484f326c4dd126e84b26828ba340a8ae9406e8Christoph Studer /** 354b2216c3ffda4d63d3f0c9f6b16afc8c912c4296eBryan Mawhinney * Notification extras key: the indices of actions to be shown in the compact view, 355b2216c3ffda4d63d3f0c9f6b16afc8c912c4296eBryan Mawhinney * as supplied to (e.g.) {@link Notification.MediaStyle#setShowActionsInCompactView(int...)}. 356569c49e672218d3a9d391a16e4c1b50507d5eccfBryan Mawhinney */ 357569c49e672218d3a9d391a16e4c1b50507d5eccfBryan Mawhinney public static final String EXTRA_COMPACT_ACTIONS = "android.compactActions"; 358569c49e672218d3a9d391a16e4c1b50507d5eccfBryan Mawhinney 359569c49e672218d3a9d391a16e4c1b50507d5eccfBryan Mawhinney /** 36043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * Notification key: the username to be displayed for all messages sent by the user 36143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * including 36243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * direct replies 36343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * {@link MessagingStyle} notification. 36443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills */ 36543cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills public static final String EXTRA_SELF_DISPLAY_NAME = "android.selfDisplayName"; 36643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills 36743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills /** 36843cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * Notification key: a {@link String} to be displayed as the title to a conversation 36943cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * represented by a {@link MessagingStyle} 37043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills */ 37143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills public static final String EXTRA_CONVERSATION_TITLE = "android.conversationTitle"; 37243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills 37343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills /** 37443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * Notification key: an array of {@link Bundle} objects representing 37543cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * {@link MessagingStyle.Message} objects for a {@link MessagingStyle} notification. 37643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills */ 37743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills public static final String EXTRA_MESSAGES = "android.messages"; 37843cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills 37943cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills /** 38069a58d36f6ed8ec4d076534556aba2f93d00254eDan Sandler * Value of {@link Notification#color} equal to 0 (also known as 38169a58d36f6ed8ec4d076534556aba2f93d00254eDan Sandler * {@link android.graphics.Color#TRANSPARENT Color.TRANSPARENT}), 38269a58d36f6ed8ec4d076534556aba2f93d00254eDan Sandler * telling the system not to decorate this notification with any special color but instead use 38369a58d36f6ed8ec4d076534556aba2f93d00254eDan Sandler * default colors when presenting this notification. 38469a58d36f6ed8ec4d076534556aba2f93d00254eDan Sandler */ 38570acb0c19be3831a2080e4f902324de16bfbf62eTor Norbye @ColorInt 38669a58d36f6ed8ec4d076534556aba2f93d00254eDan Sandler public static final int COLOR_DEFAULT = Color.TRANSPARENT; 38769a58d36f6ed8ec4d076534556aba2f93d00254eDan Sandler 388df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler /** 389df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler * Notification visibility: Show this notification in its entirety on all lockscreens. 390df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler * 391df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler * {@see android.app.Notification#visibility} 392df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler */ 393df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler public static final int VISIBILITY_PUBLIC = 1; 394df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler 395df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler /** 396df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler * Notification visibility: Show this notification on all lockscreens, but conceal sensitive or 397df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler * private information on secure lockscreens. 398df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler * 399df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler * {@see android.app.Notification#visibility} 400df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler */ 401df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler public static final int VISIBILITY_PRIVATE = 0; 402df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler 403df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler /** 404df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler * Notification visibility: Do not reveal any part of this notification on a secure lockscreen. 405df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler * 406df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler * {@see android.app.Notification#visibility} 407df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler */ 408df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler public static final int VISIBILITY_SECRET = -1; 409df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler 4101f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney /** 4111f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney * Notification category: incoming call (voice or video) or similar synchronous communication request. 4121f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney */ 4131f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney public static final String CATEGORY_CALL = NotificationCompatApi21.CATEGORY_CALL; 4141f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney 4151f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney /** 4161f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney * Notification category: incoming direct message (SMS, instant message, etc.). 4171f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney */ 4181f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney public static final String CATEGORY_MESSAGE = NotificationCompatApi21.CATEGORY_MESSAGE; 4191f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney 4201f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney /** 4211f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney * Notification category: asynchronous bulk message (email). 4221f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney */ 4231f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney public static final String CATEGORY_EMAIL = NotificationCompatApi21.CATEGORY_EMAIL; 4241f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney 4251f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney /** 4261f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney * Notification category: calendar event. 4271f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney */ 4281f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney public static final String CATEGORY_EVENT = NotificationCompatApi21.CATEGORY_EVENT; 4291f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney 4301f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney /** 4311f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney * Notification category: promotion or advertisement. 4321f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney */ 4331f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney public static final String CATEGORY_PROMO = NotificationCompatApi21.CATEGORY_PROMO; 4341f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney 4351f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney /** 4361f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney * Notification category: alarm or timer. 4371f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney */ 4381f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney public static final String CATEGORY_ALARM = NotificationCompatApi21.CATEGORY_ALARM; 4391f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney 4401f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney /** 4411f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney * Notification category: progress of a long-running background operation. 4421f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney */ 4431f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney public static final String CATEGORY_PROGRESS = NotificationCompatApi21.CATEGORY_PROGRESS; 4441f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney 4451f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney /** 4461f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney * Notification category: social network or sharing update. 4471f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney */ 4481f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney public static final String CATEGORY_SOCIAL = NotificationCompatApi21.CATEGORY_SOCIAL; 4491f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney 4501f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney /** 4511f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney * Notification category: error in background operation or authentication status. 4521f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney */ 4531f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney public static final String CATEGORY_ERROR = NotificationCompatApi21.CATEGORY_ERROR; 4541f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney 4551f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney /** 4561f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney * Notification category: media transport control for playback. 4571f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney */ 4581f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney public static final String CATEGORY_TRANSPORT = NotificationCompatApi21.CATEGORY_TRANSPORT; 4591f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney 4601f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney /** 4611f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney * Notification category: system or device status update. Reserved for system use. 4621f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney */ 4631f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney public static final String CATEGORY_SYSTEM = NotificationCompatApi21.CATEGORY_SYSTEM; 4641f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney 4651f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney /** 4661f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney * Notification category: indication of running background service. 4671f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney */ 4681f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney public static final String CATEGORY_SERVICE = NotificationCompatApi21.CATEGORY_SERVICE; 4691f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney 4701f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney /** 4717c1fcb24cdd2ede9eed84fe8cd784e45192eb0d4Chris Wren * Notification category: user-scheduled reminder. 4727c1fcb24cdd2ede9eed84fe8cd784e45192eb0d4Chris Wren */ 4737c1fcb24cdd2ede9eed84fe8cd784e45192eb0d4Chris Wren public static final String CATEGORY_REMINDER = NotificationCompatApi23.CATEGORY_REMINDER; 4747c1fcb24cdd2ede9eed84fe8cd784e45192eb0d4Chris Wren 4757c1fcb24cdd2ede9eed84fe8cd784e45192eb0d4Chris Wren /** 4761f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney * Notification category: a specific, timely recommendation for a single thing. 4771f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney * For example, a news app might want to recommend a news story it believes the user will 4781f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney * want to read next. 4791f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney */ 4801f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney public static final String CATEGORY_RECOMMENDATION = 4811f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney NotificationCompatApi21.CATEGORY_RECOMMENDATION; 4821f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney 4831f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney /** 4841f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney * Notification category: ongoing information about device or contextual status. 4851f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney */ 4861f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney public static final String CATEGORY_STATUS = NotificationCompatApi21.CATEGORY_STATUS; 4871f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney 488c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell private static final NotificationCompatImpl IMPL; 489c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell 490c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell interface NotificationCompatImpl { 49110d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi public Notification build(Builder b, BuilderExtender extender); 492b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen public Bundle getExtras(Notification n); 493300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen public int getActionCount(Notification n); 494300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen public Action getAction(Notification n, int actionIndex); 4952bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen public Action[] getActionsFromParcelableArrayList(ArrayList<Parcelable> parcelables); 4962bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen public ArrayList<Parcelable> getParcelableArrayListForActions(Action[] actions); 49775e2071f16bae2b22d1618026d10337daad862cfBryan Mawhinney public String getCategory(Notification n); 498b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen public boolean getLocalOnly(Notification n); 499ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen public String getGroup(Notification n); 500ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen public boolean isGroupSummary(Notification n); 501ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen public String getSortKey(Notification n); 5028eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song Bundle getBundleForUnreadConversation(NotificationCompatBase.UnreadConversation uc); 5038eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song NotificationCompatBase.UnreadConversation getUnreadConversationFromBundle( 5048eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song Bundle b, NotificationCompatBase.UnreadConversation.Factory factory, 5058eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song RemoteInputCompatBase.RemoteInput.Factory remoteInputFactory); 506c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell } 507c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell 50810d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi /** 50910d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi * Interface for appcompat to extend v4 builder with media style. 51010d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi * 51110d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi * @hide 51210d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi */ 51310d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi protected static class BuilderExtender { 51410d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi public Notification build(Builder b, NotificationBuilderWithBuilderAccessor builder) { 5153b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek Notification n = builder.build(); 5163b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek if (b.mContentView != null) { 5173b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek n.contentView = b.mContentView; 5183b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek } 5193b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek return n; 52010d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi } 52110d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi } 52210d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi 523c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell static class NotificationCompatImplBase implements NotificationCompatImpl { 524b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen @Override 52510d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi public Notification build(Builder b, BuilderExtender extender) { 526fe3b5bac4901a4bb8cf51c09fe4910b02388818aGriff Hazen Notification result = b.mNotification; 527475f4c62881dbdfb02aa9a78ae1e1cec1d3bb96fKirill Grouchnikov result = NotificationCompatBase.add(result, b.mContext, 528cd40090290dbd6f81ea40592bb8c699bb03ab931Selim Cinek b.resolveTitle(), b.resolveText(), b.mContentIntent, b.mFullScreenIntent); 529f021758934b35e3b842c6799344531d7ea2969daChris Wren // translate high priority requests into legacy flag 530f021758934b35e3b842c6799344531d7ea2969daChris Wren if (b.mPriority > PRIORITY_DEFAULT) { 531884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin result.flags |= FLAG_HIGH_PRIORITY; 532f021758934b35e3b842c6799344531d7ea2969daChris Wren } 533c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds if (b.mContentView != null) { 534c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds result.contentView = b.mContentView; 535c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds } 536c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell return result; 537c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell } 538b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen 539b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen @Override 540b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen public Bundle getExtras(Notification n) { 541b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen return null; 542b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen } 543b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen 544b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen @Override 545300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen public int getActionCount(Notification n) { 546300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen return 0; 547300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen } 548300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen 549300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen @Override 550300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen public Action getAction(Notification n, int actionIndex) { 551300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen return null; 552300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen } 553300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen 554300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen @Override 5552bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen public Action[] getActionsFromParcelableArrayList( 5562bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen ArrayList<Parcelable> parcelables) { 5572bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen return null; 5582bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 5592bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 5602bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen @Override 5612bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen public ArrayList<Parcelable> getParcelableArrayListForActions(Action[] actions) { 5622bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen return null; 5632bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 5642bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 5652bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen @Override 56675e2071f16bae2b22d1618026d10337daad862cfBryan Mawhinney public String getCategory(Notification n) { 56775e2071f16bae2b22d1618026d10337daad862cfBryan Mawhinney return null; 56875e2071f16bae2b22d1618026d10337daad862cfBryan Mawhinney } 56975e2071f16bae2b22d1618026d10337daad862cfBryan Mawhinney 57075e2071f16bae2b22d1618026d10337daad862cfBryan Mawhinney @Override 571b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen public boolean getLocalOnly(Notification n) { 572b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen return false; 573b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen } 574ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen 575ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen @Override 576ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen public String getGroup(Notification n) { 577ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen return null; 578ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen } 579ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen 580ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen @Override 581ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen public boolean isGroupSummary(Notification n) { 582ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen return false; 583ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen } 584ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen 585ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen @Override 586ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen public String getSortKey(Notification n) { 587ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen return null; 588ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen } 5898eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song 5908eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song @Override 5918eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song public Bundle getBundleForUnreadConversation(NotificationCompatBase.UnreadConversation uc) { 5928eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song return null; 5938eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song } 5948eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song 5958eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song @Override 5968eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song public NotificationCompatBase.UnreadConversation getUnreadConversationFromBundle( 5978eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song Bundle b, NotificationCompatBase.UnreadConversation.Factory factory, 5988eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song RemoteInputCompatBase.RemoteInput.Factory remoteInputFactory) { 5998eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song return null; 6008eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song } 601c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell } 602c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell 603b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen static class NotificationCompatImplHoneycomb extends NotificationCompatImplBase { 604b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen @Override 60510d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi public Notification build(Builder b, BuilderExtender extender) { 606c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds Notification notification = NotificationCompatHoneycomb.add(b.mContext, b.mNotification, 607cd40090290dbd6f81ea40592bb8c699bb03ab931Selim Cinek b.resolveTitle(), b.resolveText(), b.mContentInfo, b.mTickerView, 608c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell b.mNumber, b.mContentIntent, b.mFullScreenIntent, b.mLargeIcon); 609c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds if (b.mContentView != null) { 610c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds notification.contentView = b.mContentView; 611c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds } 612c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds return notification; 613c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell } 614c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell } 615c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell 616b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen static class NotificationCompatImplIceCreamSandwich extends NotificationCompatImplBase { 617b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen @Override 61810d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi public Notification build(Builder b, BuilderExtender extender) { 61910d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi NotificationCompatIceCreamSandwich.Builder builder = 620cd40090290dbd6f81ea40592bb8c699bb03ab931Selim Cinek new NotificationCompatIceCreamSandwich.Builder(b.mContext, b.mNotification, 621cd40090290dbd6f81ea40592bb8c699bb03ab931Selim Cinek b.resolveTitle(), b.resolveText(), b.mContentInfo, b.mTickerView, 622cd40090290dbd6f81ea40592bb8c699bb03ab931Selim Cinek b.mNumber, b.mContentIntent, b.mFullScreenIntent, b.mLargeIcon, 62343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills b.mProgressMax, b.mProgress, b.mProgressIndeterminate); 6243b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek return extender.build(b, builder); 625f021758934b35e3b842c6799344531d7ea2969daChris Wren } 626f021758934b35e3b842c6799344531d7ea2969daChris Wren } 627f021758934b35e3b842c6799344531d7ea2969daChris Wren 628b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen static class NotificationCompatImplJellybean extends NotificationCompatImplBase { 629b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen @Override 63010d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi public Notification build(Builder b, BuilderExtender extender) { 631b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen NotificationCompatJellybean.Builder builder = new NotificationCompatJellybean.Builder( 632cd40090290dbd6f81ea40592bb8c699bb03ab931Selim Cinek b.mContext, b.mNotification, b.resolveTitle(), b.resolveText(), b.mContentInfo, 633f021758934b35e3b842c6799344531d7ea2969daChris Wren b.mTickerView, b.mNumber, b.mContentIntent, b.mFullScreenIntent, b.mLargeIcon, 634f021758934b35e3b842c6799344531d7ea2969daChris Wren b.mProgressMax, b.mProgress, b.mProgressIndeterminate, 635ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen b.mUseChronometer, b.mPriority, b.mSubText, b.mLocalOnly, b.mExtras, 636c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds b.mGroupKey, b.mGroupSummary, b.mSortKey, b.mContentView, b.mBigContentView); 637b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen addActionsToBuilder(builder, b.mActions); 638b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen addStyleToBuilderJellybean(builder, b.mStyle); 63943cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills Notification notification = extender.build(b, builder); 64043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills if (b.mStyle != null) { 641cd40090290dbd6f81ea40592bb8c699bb03ab931Selim Cinek Bundle extras = getExtras(notification); 642cd40090290dbd6f81ea40592bb8c699bb03ab931Selim Cinek if (extras != null) { 643cd40090290dbd6f81ea40592bb8c699bb03ab931Selim Cinek b.mStyle.addCompatExtras(extras); 644cd40090290dbd6f81ea40592bb8c699bb03ab931Selim Cinek } 64543cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills } 64643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills return notification; 647b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen } 648b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen 649b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen @Override 650b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen public Bundle getExtras(Notification n) { 651b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen return NotificationCompatJellybean.getExtras(n); 652b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen } 653b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen 654b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen @Override 655300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen public int getActionCount(Notification n) { 656300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen return NotificationCompatJellybean.getActionCount(n); 657300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen } 658300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen 659300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen @Override 660300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen public Action getAction(Notification n, int actionIndex) { 661ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen return (Action) NotificationCompatJellybean.getAction(n, actionIndex, Action.FACTORY, 662ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen RemoteInput.FACTORY); 663300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen } 664300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen 665300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen @Override 6662bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen public Action[] getActionsFromParcelableArrayList( 6672bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen ArrayList<Parcelable> parcelables) { 6682bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen return (Action[]) NotificationCompatJellybean.getActionsFromParcelableArrayList( 6692bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen parcelables, Action.FACTORY, RemoteInput.FACTORY); 6702bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 6712bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 6722bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen @Override 6732bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen public ArrayList<Parcelable> getParcelableArrayListForActions( 6742bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen Action[] actions) { 6752bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen return NotificationCompatJellybean.getParcelableArrayListForActions(actions); 6762bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 6772bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 6782bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen @Override 67947702147608084fec16a50640da54b412c737b9cGriff Hazen public boolean getLocalOnly(Notification n) { 68047702147608084fec16a50640da54b412c737b9cGriff Hazen return NotificationCompatJellybean.getLocalOnly(n); 68147702147608084fec16a50640da54b412c737b9cGriff Hazen } 682ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen 683ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen @Override 684ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen public String getGroup(Notification n) { 685ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen return NotificationCompatJellybean.getGroup(n); 686ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen } 687ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen 688ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen @Override 689ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen public boolean isGroupSummary(Notification n) { 690ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen return NotificationCompatJellybean.isGroupSummary(n); 691ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen } 692ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen 693ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen @Override 694ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen public String getSortKey(Notification n) { 695ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen return NotificationCompatJellybean.getSortKey(n); 696ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen } 69747702147608084fec16a50640da54b412c737b9cGriff Hazen } 69847702147608084fec16a50640da54b412c737b9cGriff Hazen 699ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen static class NotificationCompatImplKitKat extends NotificationCompatImplJellybean { 70047702147608084fec16a50640da54b412c737b9cGriff Hazen @Override 70110d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi public Notification build(Builder b, BuilderExtender extender) { 70247702147608084fec16a50640da54b412c737b9cGriff Hazen NotificationCompatKitKat.Builder builder = new NotificationCompatKitKat.Builder( 703cd40090290dbd6f81ea40592bb8c699bb03ab931Selim Cinek b.mContext, b.mNotification, b.resolveTitle(), b.resolveText(), b.mContentInfo, 70447702147608084fec16a50640da54b412c737b9cGriff Hazen b.mTickerView, b.mNumber, b.mContentIntent, b.mFullScreenIntent, b.mLargeIcon, 70548d8878e34b0d9983166418378125b63faac9aabGriff Hazen b.mProgressMax, b.mProgress, b.mProgressIndeterminate, b.mShowWhen, 70648d8878e34b0d9983166418378125b63faac9aabGriff Hazen b.mUseChronometer, b.mPriority, b.mSubText, b.mLocalOnly, 707c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds b.mPeople, b.mExtras, b.mGroupKey, b.mGroupSummary, b.mSortKey, 708c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds b.mContentView, b.mBigContentView); 70947702147608084fec16a50640da54b412c737b9cGriff Hazen addActionsToBuilder(builder, b.mActions); 71047702147608084fec16a50640da54b412c737b9cGriff Hazen addStyleToBuilderJellybean(builder, b.mStyle); 71110d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi return extender.build(b, builder); 71247702147608084fec16a50640da54b412c737b9cGriff Hazen } 71347702147608084fec16a50640da54b412c737b9cGriff Hazen 71447702147608084fec16a50640da54b412c737b9cGriff Hazen @Override 71547702147608084fec16a50640da54b412c737b9cGriff Hazen public Bundle getExtras(Notification n) { 71647702147608084fec16a50640da54b412c737b9cGriff Hazen return NotificationCompatKitKat.getExtras(n); 71747702147608084fec16a50640da54b412c737b9cGriff Hazen } 71847702147608084fec16a50640da54b412c737b9cGriff Hazen 71947702147608084fec16a50640da54b412c737b9cGriff Hazen @Override 720300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen public int getActionCount(Notification n) { 721300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen return NotificationCompatKitKat.getActionCount(n); 722300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen } 723300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen 724300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen @Override 725300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen public Action getAction(Notification n, int actionIndex) { 726ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen return (Action) NotificationCompatKitKat.getAction(n, actionIndex, Action.FACTORY, 727ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen RemoteInput.FACTORY); 728300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen } 729300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen 730300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen @Override 73147702147608084fec16a50640da54b412c737b9cGriff Hazen public boolean getLocalOnly(Notification n) { 73247702147608084fec16a50640da54b412c737b9cGriff Hazen return NotificationCompatKitKat.getLocalOnly(n); 733b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen } 734ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen 735ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen @Override 736ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen public String getGroup(Notification n) { 737ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen return NotificationCompatKitKat.getGroup(n); 738ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen } 739ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen 740ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen @Override 741ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen public boolean isGroupSummary(Notification n) { 742ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen return NotificationCompatKitKat.isGroupSummary(n); 743ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen } 744ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen 745ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen @Override 746ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen public String getSortKey(Notification n) { 747ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen return NotificationCompatKitKat.getSortKey(n); 748ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen } 749b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen } 750b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen 751ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen static class NotificationCompatImplApi20 extends NotificationCompatImplKitKat { 752b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen @Override 75310d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi public Notification build(Builder b, BuilderExtender extender) { 754b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen NotificationCompatApi20.Builder builder = new NotificationCompatApi20.Builder( 755cd40090290dbd6f81ea40592bb8c699bb03ab931Selim Cinek b.mContext, b.mNotification, b.resolveTitle(), b.resolveText(), b.mContentInfo, 756b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen b.mTickerView, b.mNumber, b.mContentIntent, b.mFullScreenIntent, b.mLargeIcon, 75748d8878e34b0d9983166418378125b63faac9aabGriff Hazen b.mProgressMax, b.mProgress, b.mProgressIndeterminate, b.mShowWhen, 75843c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen b.mUseChronometer, b.mPriority, b.mSubText, b.mLocalOnly, b.mPeople, b.mExtras, 759c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds b.mGroupKey, b.mGroupSummary, b.mSortKey, b.mContentView, b.mBigContentView); 760b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen addActionsToBuilder(builder, b.mActions); 761b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen addStyleToBuilderJellybean(builder, b.mStyle); 76243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills Notification notification = extender.build(b, builder); 76343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills if (b.mStyle != null) { 76443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills b.mStyle.addCompatExtras(getExtras(notification)); 76543cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills } 76643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills return notification; 767b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen } 768b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen 769b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen @Override 770ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen public Action getAction(Notification n, int actionIndex) { 771ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen return (Action) NotificationCompatApi20.getAction(n, actionIndex, Action.FACTORY, 772ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen RemoteInput.FACTORY); 773b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen } 774b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen 775b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen @Override 7762bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen public Action[] getActionsFromParcelableArrayList( 7772bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen ArrayList<Parcelable> parcelables) { 7782bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen return (Action[]) NotificationCompatApi20.getActionsFromParcelableArrayList( 7792bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen parcelables, Action.FACTORY, RemoteInput.FACTORY); 7802bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 7812bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 7822bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen @Override 7832bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen public ArrayList<Parcelable> getParcelableArrayListForActions( 7842bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen Action[] actions) { 7852bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen return NotificationCompatApi20.getParcelableArrayListForActions(actions); 7862bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 7872bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 7882bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen @Override 789ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen public boolean getLocalOnly(Notification n) { 790ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen return NotificationCompatApi20.getLocalOnly(n); 791300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen } 792300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen 793300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen @Override 794ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen public String getGroup(Notification n) { 795ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen return NotificationCompatApi20.getGroup(n); 796300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen } 797300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen 798300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen @Override 799ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen public boolean isGroupSummary(Notification n) { 800ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen return NotificationCompatApi20.isGroupSummary(n); 801ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen } 802ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen 803ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen @Override 804ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen public String getSortKey(Notification n) { 805ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen return NotificationCompatApi20.getSortKey(n); 806b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen } 807b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen } 808b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen 80943c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen static class NotificationCompatImplApi21 extends NotificationCompatImplApi20 { 81043c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen @Override 81110d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi public Notification build(Builder b, BuilderExtender extender) { 81243c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen NotificationCompatApi21.Builder builder = new NotificationCompatApi21.Builder( 813cd40090290dbd6f81ea40592bb8c699bb03ab931Selim Cinek b.mContext, b.mNotification, b.resolveTitle(), b.resolveText(), b.mContentInfo, 81443c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen b.mTickerView, b.mNumber, b.mContentIntent, b.mFullScreenIntent, b.mLargeIcon, 81548d8878e34b0d9983166418378125b63faac9aabGriff Hazen b.mProgressMax, b.mProgress, b.mProgressIndeterminate, b.mShowWhen, 81643c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen b.mUseChronometer, b.mPriority, b.mSubText, b.mLocalOnly, b.mCategory, 81743c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen b.mPeople, b.mExtras, b.mColor, b.mVisibility, b.mPublicVersion, 818c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds b.mGroupKey, b.mGroupSummary, b.mSortKey, b.mContentView, b.mBigContentView, 819c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds b.mHeadsUpContentView); 82043c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen addActionsToBuilder(builder, b.mActions); 82143c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen addStyleToBuilderJellybean(builder, b.mStyle); 82243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills Notification notification = extender.build(b, builder); 82343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills if (b.mStyle != null) { 82443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills b.mStyle.addCompatExtras(getExtras(notification)); 82543cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills } 82643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills return notification; 82743c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen } 82843c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen 82943c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen @Override 83043c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen public String getCategory(Notification notif) { 83143c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen return NotificationCompatApi21.getCategory(notif); 83243c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen } 8338eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song 8348eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song @Override 8358eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song public Bundle getBundleForUnreadConversation(NotificationCompatBase.UnreadConversation uc) { 8368eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song return NotificationCompatApi21.getBundleForUnreadConversation(uc); 8378eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song } 8388eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song 8398eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song @Override 8408eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song public NotificationCompatBase.UnreadConversation getUnreadConversationFromBundle( 8418eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song Bundle b, NotificationCompatBase.UnreadConversation.Factory factory, 8428eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song RemoteInputCompatBase.RemoteInput.Factory remoteInputFactory) { 8438eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song return NotificationCompatApi21.getUnreadConversationFromBundle( 8448eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song b, factory, remoteInputFactory); 8458eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song } 84643c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen } 84743c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen 84843cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills static class NotificationCompatImplApi24 extends NotificationCompatImplApi21 { 84943cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills @Override 85043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills public Notification build(Builder b, 85143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills BuilderExtender extender) { 85243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills NotificationCompatApi24.Builder builder = new NotificationCompatApi24.Builder( 85343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills b.mContext, b.mNotification, b.mContentTitle, b.mContentText, b.mContentInfo, 85443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills b.mTickerView, b.mNumber, b.mContentIntent, b.mFullScreenIntent, b.mLargeIcon, 85543cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills b.mProgressMax, b.mProgress, b.mProgressIndeterminate, b.mShowWhen, 85643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills b.mUseChronometer, b.mPriority, b.mSubText, b.mLocalOnly, b.mCategory, 85743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills b.mPeople, b.mExtras, b.mColor, b.mVisibility, b.mPublicVersion, 858c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds b.mGroupKey, b.mGroupSummary, b.mSortKey, b.mRemoteInputHistory, b.mContentView, 859c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds b.mBigContentView, b.mHeadsUpContentView); 86043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills addActionsToBuilder(builder, b.mActions); 86143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills addStyleToBuilderApi24(builder, b.mStyle); 86243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills Notification notification = extender.build(b, builder); 86343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills if (b.mStyle != null) { 86443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills b.mStyle.addCompatExtras(getExtras(notification)); 86543cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills } 86643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills return notification; 86743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills } 86843cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills } 86943cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills 870b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen private static void addActionsToBuilder(NotificationBuilderWithActions builder, 871b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen ArrayList<Action> actions) { 872b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen for (Action action : actions) { 873ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen builder.addAction(action); 874b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen } 875b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen } 876b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen 877b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen private static void addStyleToBuilderJellybean(NotificationBuilderWithBuilderAccessor builder, 878b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen Style style) { 879b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen if (style != null) { 880b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen if (style instanceof BigTextStyle) { 881b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen BigTextStyle bigTextStyle = (BigTextStyle) style; 882b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen NotificationCompatJellybean.addBigTextStyle(builder, 883b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen bigTextStyle.mBigContentTitle, 884b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen bigTextStyle.mSummaryTextSet, 885b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen bigTextStyle.mSummaryText, 886b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen bigTextStyle.mBigText); 887b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen } else if (style instanceof InboxStyle) { 888b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen InboxStyle inboxStyle = (InboxStyle) style; 889b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen NotificationCompatJellybean.addInboxStyle(builder, 890b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen inboxStyle.mBigContentTitle, 891b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen inboxStyle.mSummaryTextSet, 892b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen inboxStyle.mSummaryText, 893b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen inboxStyle.mTexts); 894b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen } else if (style instanceof BigPictureStyle) { 895b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen BigPictureStyle bigPictureStyle = (BigPictureStyle) style; 896b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen NotificationCompatJellybean.addBigPictureStyle(builder, 897b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen bigPictureStyle.mBigContentTitle, 898b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen bigPictureStyle.mSummaryTextSet, 899b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen bigPictureStyle.mSummaryText, 900b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen bigPictureStyle.mPicture, 901b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen bigPictureStyle.mBigLargeIcon, 902b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen bigPictureStyle.mBigLargeIconSet); 90343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills } 90443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills } 90543cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills } 90643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills 90743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills private static void addStyleToBuilderApi24(NotificationBuilderWithBuilderAccessor builder, 90843cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills Style style) { 90943cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills if (style != null) { 91043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills if (style instanceof MessagingStyle) { 91143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills MessagingStyle messagingStyle = (MessagingStyle) style; 91243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills List<CharSequence> texts = new ArrayList<>(); 91343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills List<Long> timestamps = new ArrayList<>(); 91443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills List<CharSequence> senders = new ArrayList<>(); 91543cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills List<String> dataMimeTypes = new ArrayList<>(); 91643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills List<Uri> dataUris = new ArrayList<>(); 91743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills 91843cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills for (MessagingStyle.Message message : messagingStyle.mMessages) { 91943cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills texts.add(message.getText()); 92043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills timestamps.add(message.getTimestamp()); 92143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills senders.add(message.getSender()); 92243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills dataMimeTypes.add(message.getDataMimeType()); 92343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills dataUris.add(message.getDataUri()); 92443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills } 92543cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills NotificationCompatApi24.addMessagingStyle(builder, messagingStyle.mUserDisplayName, 926300828fd69bd2bfcefaf54795d03492938efd971Alex Hills messagingStyle.mConversationTitle, texts, timestamps, senders, 927300828fd69bd2bfcefaf54795d03492938efd971Alex Hills dataMimeTypes, dataUris); 92843cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills } else { 92943cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills addStyleToBuilderJellybean(builder, style); 930f021758934b35e3b842c6799344531d7ea2969daChris Wren } 931f021758934b35e3b842c6799344531d7ea2969daChris Wren } 932f021758934b35e3b842c6799344531d7ea2969daChris Wren } 933f021758934b35e3b842c6799344531d7ea2969daChris Wren 934c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell static { 935c485ebd398348372709b10a713fc6d8630b31923Alex Hills if (BuildCompat.isAtLeastN()) { 93643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills IMPL = new NotificationCompatImplApi24(); 93743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills } else if (Build.VERSION.SDK_INT >= 21) { 93875e2071f16bae2b22d1618026d10337daad862cfBryan Mawhinney IMPL = new NotificationCompatImplApi21(); 93975e2071f16bae2b22d1618026d10337daad862cfBryan Mawhinney } else if (Build.VERSION.SDK_INT >= 20) { 940334514fd61bd192cee3475b3ba44adb4f54a1f89Chris Wren IMPL = new NotificationCompatImplApi20(); 941334514fd61bd192cee3475b3ba44adb4f54a1f89Chris Wren } else if (Build.VERSION.SDK_INT >= 19) { 94247702147608084fec16a50640da54b412c737b9cGriff Hazen IMPL = new NotificationCompatImplKitKat(); 94347702147608084fec16a50640da54b412c737b9cGriff Hazen } else if (Build.VERSION.SDK_INT >= 16) { 944f021758934b35e3b842c6799344531d7ea2969daChris Wren IMPL = new NotificationCompatImplJellybean(); 945080df8ffb0920eccb300baa39180eb956a000a53Chris Wren } else if (Build.VERSION.SDK_INT >= 14) { 946f021758934b35e3b842c6799344531d7ea2969daChris Wren IMPL = new NotificationCompatImplIceCreamSandwich(); 947f021758934b35e3b842c6799344531d7ea2969daChris Wren } else if (Build.VERSION.SDK_INT >= 11) { 948c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell IMPL = new NotificationCompatImplHoneycomb(); 949c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell } else { 950c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell IMPL = new NotificationCompatImplBase(); 951c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell } 952c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell } 953c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell 954c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell /** 955884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin * Builder class for {@link NotificationCompat} objects. Allows easier control over 956c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * all the flags, as well as help constructing the typical notification layouts. 957884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin * <p> 958884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin * On platform versions that don't offer expanded notifications, methods that depend on 959884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin * expanded notifications have no effect. 960884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin * </p> 961884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin * <p> 962884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin * For example, action buttons won't appear on platforms prior to Android 4.1. Action 963884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin * buttons depend on expanded notifications, which are only available in Android 4.1 964884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin * and later. 965884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin * <p> 966884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin * For this reason, you should always ensure that UI controls in a notification are also 967884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin * available in an {@link android.app.Activity} in your app, and you should always start that 968884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin * {@link android.app.Activity} when users click the notification. To do this, use the 969884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin * {@link NotificationCompat.Builder#setContentIntent setContentIntent()} 970884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin * method. 971884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin * </p> 972884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin * 973c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell */ 974c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell public static class Builder { 97524c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer /** 97624c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer * Maximum length of CharSequences accepted by Builder and friends. 97724c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer * 97824c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer * <p> 97924c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer * Avoids spamming the system with overly large strings such as full e-mails. 98024c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer */ 98124c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer private static final int MAX_CHARSEQUENCE_LENGTH = 5 * 1024; 98224c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer 98310d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi // All these variables are declared public/hidden so they can be accessed by a builder 98410d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi // extender. 98510d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi 98610d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi /** @hide */ 98710d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi public Context mContext; 988c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell 98910d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi /** @hide */ 99010d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi public CharSequence mContentTitle; 99110d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi /** @hide */ 99210d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi public CharSequence mContentText; 993c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell PendingIntent mContentIntent; 994c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell PendingIntent mFullScreenIntent; 995c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell RemoteViews mTickerView; 99610d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi /** @hide */ 99710d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi public Bitmap mLargeIcon; 99810d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi /** @hide */ 99910d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi public CharSequence mContentInfo; 100010d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi /** @hide */ 100110d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi public int mNumber; 1002f021758934b35e3b842c6799344531d7ea2969daChris Wren int mPriority; 10034c7c4787069fe222c2f74bbaa078debe389ae383Christoph Studer boolean mShowWhen = true; 100410d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi /** @hide */ 100510d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi public boolean mUseChronometer; 100610d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi /** @hide */ 100710d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi public Style mStyle; 100810d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi /** @hide */ 100910d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi public CharSequence mSubText; 1010aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas /** @hide */ 1011aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas public CharSequence[] mRemoteInputHistory; 1012f021758934b35e3b842c6799344531d7ea2969daChris Wren int mProgressMax; 1013f021758934b35e3b842c6799344531d7ea2969daChris Wren int mProgress; 1014f021758934b35e3b842c6799344531d7ea2969daChris Wren boolean mProgressIndeterminate; 1015ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen String mGroupKey; 1016ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen boolean mGroupSummary; 1017ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen String mSortKey; 101810d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi /** @hide */ 101910d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi public ArrayList<Action> mActions = new ArrayList<Action>(); 1020b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen boolean mLocalOnly = false; 1021d3f7b5bb2422645d85b0e0131ff1c323f38bfed0John Spurlock String mCategory; 1022ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen Bundle mExtras; 102369a58d36f6ed8ec4d076534556aba2f93d00254eDan Sandler int mColor = COLOR_DEFAULT; 1024df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler int mVisibility = VISIBILITY_PRIVATE; 1025df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler Notification mPublicVersion; 1026c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds RemoteViews mContentView; 1027c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds RemoteViews mBigContentView; 1028c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds RemoteViews mHeadsUpContentView; 1029c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell 103010d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi /** @hide */ 103110d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi public Notification mNotification = new Notification(); 1032334514fd61bd192cee3475b3ba44adb4f54a1f89Chris Wren public ArrayList<String> mPeople; 1033c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell 1034c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell /** 1035c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * Constructor. 1036c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * 1037c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * Automatically sets the when field to {@link System#currentTimeMillis() 1038c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * System.currentTimeMillis()} and the audio stream to the 1039c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * {@link Notification#STREAM_DEFAULT}. 1040c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * 1041c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * @param context A {@link Context} that will be used to construct the 1042c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * RemoteViews. The Context will not be held past the lifetime of this 1043c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * Builder object. 1044c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell */ 1045c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell public Builder(Context context) { 1046c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell mContext = context; 1047c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell 1048c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell // Set defaults to match the defaults of a Notification 1049c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell mNotification.when = System.currentTimeMillis(); 1050c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell mNotification.audioStreamType = Notification.STREAM_DEFAULT; 1051f021758934b35e3b842c6799344531d7ea2969daChris Wren mPriority = PRIORITY_DEFAULT; 1052334514fd61bd192cee3475b3ba44adb4f54a1f89Chris Wren mPeople = new ArrayList<String>(); 1053c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell } 1054c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell 1055c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell /** 1056c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * Set the time that the event occurred. Notifications in the panel are 1057c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * sorted by this time. 1058c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell */ 1059c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell public Builder setWhen(long when) { 1060c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell mNotification.when = when; 1061c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell return this; 1062c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell } 1063c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell 1064c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell /** 106548d8878e34b0d9983166418378125b63faac9aabGriff Hazen * Control whether the timestamp set with {@link #setWhen(long) setWhen} is shown 106648d8878e34b0d9983166418378125b63faac9aabGriff Hazen * in the content view. 106748d8878e34b0d9983166418378125b63faac9aabGriff Hazen */ 106848d8878e34b0d9983166418378125b63faac9aabGriff Hazen public Builder setShowWhen(boolean show) { 106948d8878e34b0d9983166418378125b63faac9aabGriff Hazen mShowWhen = show; 107048d8878e34b0d9983166418378125b63faac9aabGriff Hazen return this; 107148d8878e34b0d9983166418378125b63faac9aabGriff Hazen } 107248d8878e34b0d9983166418378125b63faac9aabGriff Hazen 107348d8878e34b0d9983166418378125b63faac9aabGriff Hazen /** 1074f021758934b35e3b842c6799344531d7ea2969daChris Wren * Show the {@link Notification#when} field as a stopwatch. 1075884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin * 1076884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin * Instead of presenting <code>when</code> as a timestamp, the notification will show an 1077f021758934b35e3b842c6799344531d7ea2969daChris Wren * automatically updating display of the minutes and seconds since <code>when</code>. 1078f021758934b35e3b842c6799344531d7ea2969daChris Wren * 1079f021758934b35e3b842c6799344531d7ea2969daChris Wren * Useful when showing an elapsed time (like an ongoing phone call). 1080f021758934b35e3b842c6799344531d7ea2969daChris Wren * 1081f021758934b35e3b842c6799344531d7ea2969daChris Wren * @see android.widget.Chronometer 1082f021758934b35e3b842c6799344531d7ea2969daChris Wren * @see Notification#when 1083f021758934b35e3b842c6799344531d7ea2969daChris Wren */ 1084f021758934b35e3b842c6799344531d7ea2969daChris Wren public Builder setUsesChronometer(boolean b) { 1085f021758934b35e3b842c6799344531d7ea2969daChris Wren mUseChronometer = b; 1086f021758934b35e3b842c6799344531d7ea2969daChris Wren return this; 1087f021758934b35e3b842c6799344531d7ea2969daChris Wren } 1088f021758934b35e3b842c6799344531d7ea2969daChris Wren 1089f021758934b35e3b842c6799344531d7ea2969daChris Wren /** 1090c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * Set the small icon to use in the notification layouts. Different classes of devices 1091c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * may return different sizes. See the UX guidelines for more information on how to 1092c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * design these icons. 1093c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * 1094c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * @param icon A resource ID in the application's package of the drawble to use. 1095c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell */ 1096c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell public Builder setSmallIcon(int icon) { 1097c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell mNotification.icon = icon; 1098c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell return this; 1099c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell } 1100c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell 1101c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell /** 1102c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * A variant of {@link #setSmallIcon(int) setSmallIcon(int)} that takes an additional 1103c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * level parameter for when the icon is a {@link android.graphics.drawable.LevelListDrawable 1104c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * LevelListDrawable}. 1105c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * 1106c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * @param icon A resource ID in the application's package of the drawble to use. 1107c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * @param level The level to use for the icon. 1108c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * 1109c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * @see android.graphics.drawable.LevelListDrawable 1110c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell */ 1111c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell public Builder setSmallIcon(int icon, int level) { 1112c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell mNotification.icon = icon; 1113c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell mNotification.iconLevel = level; 1114c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell return this; 1115c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell } 1116c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell 1117c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell /** 1118c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * Set the title (first row) of the notification, in a standard notification. 1119c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell */ 1120c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell public Builder setContentTitle(CharSequence title) { 112124c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer mContentTitle = limitCharSequenceLength(title); 1122c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell return this; 1123c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell } 1124c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell 1125c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell /** 1126c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * Set the text (second row) of the notification, in a standard notification. 1127c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell */ 1128c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell public Builder setContentText(CharSequence text) { 112924c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer mContentText = limitCharSequenceLength(text); 1130c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell return this; 1131c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell } 1132c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell 1133c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell /** 1134884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin * Set the third line of text in the platform notification template. 1135f021758934b35e3b842c6799344531d7ea2969daChris Wren * Don't use if you're also using {@link #setProgress(int, int, boolean)}; 1136f021758934b35e3b842c6799344531d7ea2969daChris Wren * they occupy the same location in the standard template. 1137884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin * <br> 1138884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin * If the platform does not provide large-format notifications, this method has no effect. 1139884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin * The third line of text only appears in expanded view. 1140884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin * <br> 1141f021758934b35e3b842c6799344531d7ea2969daChris Wren */ 1142f021758934b35e3b842c6799344531d7ea2969daChris Wren public Builder setSubText(CharSequence text) { 114324c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer mSubText = limitCharSequenceLength(text); 1144f021758934b35e3b842c6799344531d7ea2969daChris Wren return this; 1145f021758934b35e3b842c6799344531d7ea2969daChris Wren } 1146f021758934b35e3b842c6799344531d7ea2969daChris Wren 1147f021758934b35e3b842c6799344531d7ea2969daChris Wren /** 1148aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas * Set the remote input history. 1149aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas * 1150aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas * This should be set to the most recent inputs that have been sent 1151aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas * through a {@link RemoteInput} of this Notification and cleared once the it is no 1152aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas * longer relevant (e.g. for chat notifications once the other party has responded). 1153aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas * 1154aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas * The most recent input must be stored at the 0 index, the second most recent at the 1155aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas * 1 index, etc. Note that the system will limit both how far back the inputs will be shown 1156aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas * and how much of each individual input is shown. 1157aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas * 1158aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas * <p>Note: The reply text will only be shown on notifications that have least one action 1159aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas * with a {@code RemoteInput}.</p> 1160aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas */ 1161aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas public Builder setRemoteInputHistory(CharSequence[] text) { 1162aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas mRemoteInputHistory = text; 1163aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas return this; 1164aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas } 1165aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas 1166aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas /** 1167c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * Set the large number at the right-hand side of the notification. This is 1168c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * equivalent to setContentInfo, although it might show the number in a different 1169c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * font size for readability. 1170c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell */ 1171c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell public Builder setNumber(int number) { 1172c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell mNumber = number; 1173c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell return this; 1174c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell } 1175c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell 1176c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell /** 1177c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * Set the large text at the right-hand side of the notification. 1178c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell */ 1179c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell public Builder setContentInfo(CharSequence info) { 118024c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer mContentInfo = limitCharSequenceLength(info); 1181c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell return this; 1182c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell } 1183c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell 1184c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell /** 1185c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * Set the progress this notification represents, which may be 1186f021758934b35e3b842c6799344531d7ea2969daChris Wren * represented as a {@link android.widget.ProgressBar}. 1187c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell */ 1188c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell public Builder setProgress(int max, int progress, boolean indeterminate) { 1189c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell mProgressMax = max; 1190c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell mProgress = progress; 1191c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell mProgressIndeterminate = indeterminate; 1192c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell return this; 1193f021758934b35e3b842c6799344531d7ea2969daChris Wren } 1194c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell 1195c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell /** 1196c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * Supply a custom RemoteViews to use instead of the standard one. 1197c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell */ 1198c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell public Builder setContent(RemoteViews views) { 1199c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell mNotification.contentView = views; 1200c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell return this; 1201c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell } 1202c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell 1203c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell /** 1204c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * Supply a {@link PendingIntent} to send when the notification is clicked. 1205c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * If you do not supply an intent, you can now add PendingIntents to individual 1206c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * views to be launched when clicked by calling {@link RemoteViews#setOnClickPendingIntent 1207c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * RemoteViews.setOnClickPendingIntent(int,PendingIntent)}. Be sure to 1208c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * read {@link Notification#contentIntent Notification.contentIntent} for 1209c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * how to correctly use this. 1210c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell */ 1211c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell public Builder setContentIntent(PendingIntent intent) { 1212c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell mContentIntent = intent; 1213c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell return this; 1214c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell } 1215c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell 1216c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell /** 1217c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * Supply a {@link PendingIntent} to send when the notification is cleared by the user 1218c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * directly from the notification panel. For example, this intent is sent when the user 1219c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * clicks the "Clear all" button, or the individual "X" buttons on notifications. This 1220ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen * intent is not sent when the application calls 1221ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen * {@link android.app.NotificationManager#cancel NotificationManager.cancel(int)}. 1222c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell */ 1223c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell public Builder setDeleteIntent(PendingIntent intent) { 1224c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell mNotification.deleteIntent = intent; 1225c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell return this; 1226c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell } 1227c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell 1228c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell /** 1229c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * An intent to launch instead of posting the notification to the status bar. 1230c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * Only for use with extremely high-priority notifications demanding the user's 1231c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * <strong>immediate</strong> attention, such as an incoming phone call or 1232c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * alarm clock that the user has explicitly set to a particular time. 1233c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * If this facility is used for something else, please give the user an option 1234c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * to turn it off and use a normal notification, as this can be extremely 1235c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * disruptive. 1236c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * 1237e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren * <p> 1238e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren * On some platforms, the system UI may choose to display a heads-up notification, 1239e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren * instead of launching this intent, while the user is using the device. 1240e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren * </p> 1241e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren * 1242c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * @param intent The pending intent to launch. 1243c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * @param highPriority Passing true will cause this notification to be sent 1244c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * even if other notifications are suppressed. 1245c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell */ 1246c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell public Builder setFullScreenIntent(PendingIntent intent, boolean highPriority) { 1247c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell mFullScreenIntent = intent; 1248c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell setFlag(FLAG_HIGH_PRIORITY, highPriority); 1249c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell return this; 1250c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell } 1251c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell 1252c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell /** 1253c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * Set the text that is displayed in the status bar when the notification first 1254c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * arrives. 1255c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell */ 1256c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell public Builder setTicker(CharSequence tickerText) { 125724c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer mNotification.tickerText = limitCharSequenceLength(tickerText); 1258c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell return this; 1259c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell } 1260c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell 1261c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell /** 1262c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * Set the text that is displayed in the status bar when the notification first 1263c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * arrives, and also a RemoteViews object that may be displayed instead on some 1264c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * devices. 1265c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell */ 1266c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell public Builder setTicker(CharSequence tickerText, RemoteViews views) { 126724c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer mNotification.tickerText = limitCharSequenceLength(tickerText); 1268c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell mTickerView = views; 1269c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell return this; 1270c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell } 1271c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell 1272c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell /** 1273c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * Set the large icon that is shown in the ticker and notification. 1274c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell */ 1275c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell public Builder setLargeIcon(Bitmap icon) { 1276c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell mLargeIcon = icon; 1277c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell return this; 1278c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell } 1279c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell 1280c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell /** 1281c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * Set the sound to play. It will play on the default stream. 1282e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren * 1283e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren * <p> 1284e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren * On some platforms, a notification that is noisy is more likely to be presented 1285e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren * as a heads-up notification. 1286e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren * </p> 1287c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell */ 1288c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell public Builder setSound(Uri sound) { 1289c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell mNotification.sound = sound; 1290c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell mNotification.audioStreamType = Notification.STREAM_DEFAULT; 1291c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell return this; 1292c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell } 1293c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell 1294c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell /** 1295c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * Set the sound to play. It will play on the stream you supply. 1296c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * 1297e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren * <p> 1298e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren * On some platforms, a notification that is noisy is more likely to be presented 1299e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren * as a heads-up notification. 1300e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren * </p> 1301e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren * 1302fe3b5bac4901a4bb8cf51c09fe4910b02388818aGriff Hazen * @see Notification#STREAM_DEFAULT 1303c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * @see AudioManager for the <code>STREAM_</code> constants. 1304c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell */ 1305c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell public Builder setSound(Uri sound, int streamType) { 1306c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell mNotification.sound = sound; 1307c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell mNotification.audioStreamType = streamType; 1308c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell return this; 1309c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell } 1310c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell 1311c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell /** 1312c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * Set the vibration pattern to use. 1313c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * 1314e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren * <p> 1315e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren * On some platforms, a notification that vibrates is more likely to be presented 1316e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren * as a heads-up notification. 1317e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren * </p> 1318e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren * 1319c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * @see android.os.Vibrator for a discussion of the <code>pattern</code> 1320c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * parameter. 1321c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell */ 1322c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell public Builder setVibrate(long[] pattern) { 1323c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell mNotification.vibrate = pattern; 1324c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell return this; 1325c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell } 1326c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell 1327c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell /** 1328ca3133e389ded7b6fd142d514523c6ebf41d6599Aurimas Liutikas * Set the argb value that you would like the LED on the device to blink, as well as the 1329c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * rate. The rate is specified in terms of the number of milliseconds to be on 1330c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * and then the number of milliseconds to be off. 1331c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell */ 133270acb0c19be3831a2080e4f902324de16bfbf62eTor Norbye public Builder setLights(@ColorInt int argb, int onMs, int offMs) { 1333c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell mNotification.ledARGB = argb; 1334c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell mNotification.ledOnMS = onMs; 1335c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell mNotification.ledOffMS = offMs; 1336c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell boolean showLights = mNotification.ledOnMS != 0 && mNotification.ledOffMS != 0; 1337c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell mNotification.flags = (mNotification.flags & ~Notification.FLAG_SHOW_LIGHTS) | 1338c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell (showLights ? Notification.FLAG_SHOW_LIGHTS : 0); 1339c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell return this; 1340c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell } 1341c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell 1342c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell /** 1343c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * Set whether this is an ongoing notification. 1344c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * 1345c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * <p>Ongoing notifications differ from regular notifications in the following ways: 1346c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * <ul> 1347c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * <li>Ongoing notifications are sorted above the regular notifications in the 1348c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * notification panel.</li> 1349c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * <li>Ongoing notifications do not have an 'X' close button, and are not affected 1350c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * by the "Clear all" button. 1351c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * </ul> 1352c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell */ 1353c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell public Builder setOngoing(boolean ongoing) { 1354c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell setFlag(Notification.FLAG_ONGOING_EVENT, ongoing); 1355c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell return this; 1356c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell } 1357c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell 1358c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell /** 1359c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * Set this flag if you would only like the sound, vibrate 1360c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * and ticker to be played if the notification is not already showing. 1361c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell */ 1362c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell public Builder setOnlyAlertOnce(boolean onlyAlertOnce) { 1363c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell setFlag(Notification.FLAG_ONLY_ALERT_ONCE, onlyAlertOnce); 1364c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell return this; 1365c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell } 1366c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell 1367c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell /** 1368c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * Setting this flag will make it so the notification is automatically 1369c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * canceled when the user clicks it in the panel. The PendingIntent 1370c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * set with {@link #setDeleteIntent} will be broadcast when the notification 1371c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * is canceled. 1372c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell */ 1373c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell public Builder setAutoCancel(boolean autoCancel) { 1374c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell setFlag(Notification.FLAG_AUTO_CANCEL, autoCancel); 1375c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell return this; 1376c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell } 1377c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell 1378c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell /** 1379b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen * Set whether or not this notification is only relevant to the current device. 1380b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen * 1381b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen * <p>Some notifications can be bridged to other devices for remote display. 1382b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen * This hint can be set to recommend this notification not be bridged. 1383b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen */ 1384b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen public Builder setLocalOnly(boolean b) { 1385b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen mLocalOnly = b; 1386b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen return this; 1387b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen } 1388b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen 1389b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen /** 1390d3f7b5bb2422645d85b0e0131ff1c323f38bfed0John Spurlock * Set the notification category. 1391d3f7b5bb2422645d85b0e0131ff1c323f38bfed0John Spurlock * 1392d3f7b5bb2422645d85b0e0131ff1c323f38bfed0John Spurlock * <p>Must be one of the predefined notification categories (see the <code>CATEGORY_*</code> 1393d3f7b5bb2422645d85b0e0131ff1c323f38bfed0John Spurlock * constants in {@link Notification}) that best describes this notification. 1394d3f7b5bb2422645d85b0e0131ff1c323f38bfed0John Spurlock * May be used by the system for ranking and filtering. 1395d3f7b5bb2422645d85b0e0131ff1c323f38bfed0John Spurlock */ 1396d3f7b5bb2422645d85b0e0131ff1c323f38bfed0John Spurlock public Builder setCategory(String category) { 1397d3f7b5bb2422645d85b0e0131ff1c323f38bfed0John Spurlock mCategory = category; 1398d3f7b5bb2422645d85b0e0131ff1c323f38bfed0John Spurlock return this; 1399d3f7b5bb2422645d85b0e0131ff1c323f38bfed0John Spurlock } 1400d3f7b5bb2422645d85b0e0131ff1c323f38bfed0John Spurlock 1401d3f7b5bb2422645d85b0e0131ff1c323f38bfed0John Spurlock /** 1402c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * Set the default notification options that will be used. 1403c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * <p> 1404c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * The value should be one or more of the following fields combined with 1405c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * bitwise-or: 1406c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * {@link Notification#DEFAULT_SOUND}, {@link Notification#DEFAULT_VIBRATE}, 1407c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * {@link Notification#DEFAULT_LIGHTS}. 1408c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * <p> 1409c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * For all default values, use {@link Notification#DEFAULT_ALL}. 1410c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell */ 1411c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell public Builder setDefaults(int defaults) { 1412c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell mNotification.defaults = defaults; 1413c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell if ((defaults & Notification.DEFAULT_LIGHTS) != 0) { 1414c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell mNotification.flags |= Notification.FLAG_SHOW_LIGHTS; 1415c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell } 1416c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell return this; 1417c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell } 1418c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell 1419c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell private void setFlag(int mask, boolean value) { 1420c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell if (value) { 1421c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell mNotification.flags |= mask; 1422c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell } else { 1423c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell mNotification.flags &= ~mask; 1424c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell } 1425c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell } 1426c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell 1427c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell /** 1428f021758934b35e3b842c6799344531d7ea2969daChris Wren * Set the relative priority for this notification. 1429884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin * 1430f021758934b35e3b842c6799344531d7ea2969daChris Wren * Priority is an indication of how much of the user's 1431f021758934b35e3b842c6799344531d7ea2969daChris Wren * valuable attention should be consumed by this 1432f021758934b35e3b842c6799344531d7ea2969daChris Wren * notification. Low-priority notifications may be hidden from 1433f021758934b35e3b842c6799344531d7ea2969daChris Wren * the user in certain situations, while the user might be 1434884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin * interrupted for a higher-priority notification. 1435884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin * The system sets a notification's priority based on various factors including the 1436884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin * setPriority value. The effect may differ slightly on different platforms. 14377c94c9ad26555427345c6c540bf761bf73389016Andrew Solovay * 14387c94c9ad26555427345c6c540bf761bf73389016Andrew Solovay * @param pri Relative priority for this notification. Must be one of 14397c94c9ad26555427345c6c540bf761bf73389016Andrew Solovay * the priority constants defined by {@link NotificationCompat}. 14407c94c9ad26555427345c6c540bf761bf73389016Andrew Solovay * Acceptable values range from {@link 14417c94c9ad26555427345c6c540bf761bf73389016Andrew Solovay * NotificationCompat#PRIORITY_MIN} (-2) to {@link 14427c94c9ad26555427345c6c540bf761bf73389016Andrew Solovay * NotificationCompat#PRIORITY_MAX} (2). 1443f021758934b35e3b842c6799344531d7ea2969daChris Wren */ 1444f021758934b35e3b842c6799344531d7ea2969daChris Wren public Builder setPriority(int pri) { 1445f021758934b35e3b842c6799344531d7ea2969daChris Wren mPriority = pri; 1446f021758934b35e3b842c6799344531d7ea2969daChris Wren return this; 1447f021758934b35e3b842c6799344531d7ea2969daChris Wren } 1448f021758934b35e3b842c6799344531d7ea2969daChris Wren 1449f021758934b35e3b842c6799344531d7ea2969daChris Wren /** 1450334514fd61bd192cee3475b3ba44adb4f54a1f89Chris Wren * Add a person that is relevant to this notification. 1451334514fd61bd192cee3475b3ba44adb4f54a1f89Chris Wren * 145289e6774cdb200acc2dd5f4c9022a7e1aeeb05bceChris Wren * <P> 145389e6774cdb200acc2dd5f4c9022a7e1aeeb05bceChris Wren * Depending on user preferences, this annotation may allow the notification to pass 145489e6774cdb200acc2dd5f4c9022a7e1aeeb05bceChris Wren * through interruption filters, and to appear more prominently in the user interface. 145589e6774cdb200acc2dd5f4c9022a7e1aeeb05bceChris Wren * </P> 145689e6774cdb200acc2dd5f4c9022a7e1aeeb05bceChris Wren * 145789e6774cdb200acc2dd5f4c9022a7e1aeeb05bceChris Wren * <P> 145889e6774cdb200acc2dd5f4c9022a7e1aeeb05bceChris Wren * The person should be specified by the {@code String} representation of a 145989e6774cdb200acc2dd5f4c9022a7e1aeeb05bceChris Wren * {@link android.provider.ContactsContract.Contacts#CONTENT_LOOKUP_URI}. 146089e6774cdb200acc2dd5f4c9022a7e1aeeb05bceChris Wren * </P> 146189e6774cdb200acc2dd5f4c9022a7e1aeeb05bceChris Wren * 146289e6774cdb200acc2dd5f4c9022a7e1aeeb05bceChris Wren * <P>The system will also attempt to resolve {@code mailto:} and {@code tel:} schema 146389e6774cdb200acc2dd5f4c9022a7e1aeeb05bceChris Wren * URIs. The path part of these URIs must exist in the contacts database, in the 146489e6774cdb200acc2dd5f4c9022a7e1aeeb05bceChris Wren * appropriate column, or the reference will be discarded as invalid. Telephone schema 146589e6774cdb200acc2dd5f4c9022a7e1aeeb05bceChris Wren * URIs will be resolved by {@link android.provider.ContactsContract.PhoneLookup}. 146689e6774cdb200acc2dd5f4c9022a7e1aeeb05bceChris Wren * </P> 146789e6774cdb200acc2dd5f4c9022a7e1aeeb05bceChris Wren * 146889e6774cdb200acc2dd5f4c9022a7e1aeeb05bceChris Wren * @param uri A URI for the person. 1469334514fd61bd192cee3475b3ba44adb4f54a1f89Chris Wren * @see Notification#EXTRA_PEOPLE 1470334514fd61bd192cee3475b3ba44adb4f54a1f89Chris Wren */ 147189e6774cdb200acc2dd5f4c9022a7e1aeeb05bceChris Wren public Builder addPerson(String uri) { 147289e6774cdb200acc2dd5f4c9022a7e1aeeb05bceChris Wren mPeople.add(uri); 1473334514fd61bd192cee3475b3ba44adb4f54a1f89Chris Wren return this; 1474334514fd61bd192cee3475b3ba44adb4f54a1f89Chris Wren } 1475334514fd61bd192cee3475b3ba44adb4f54a1f89Chris Wren 1476334514fd61bd192cee3475b3ba44adb4f54a1f89Chris Wren /** 1477ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen * Set this notification to be part of a group of notifications sharing the same key. 1478ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen * Grouped notifications may display in a cluster or stack on devices which 1479ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen * support such rendering. 1480ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen * 1481ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen * <p>To make this notification the summary for its group, also call 1482ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen * {@link #setGroupSummary}. A sort order can be specified for group members by using 1483ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen * {@link #setSortKey}. 1484ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen * @param groupKey The group key of the group. 1485ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen * @return this object for method chaining 1486ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen */ 1487ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen public Builder setGroup(String groupKey) { 1488ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen mGroupKey = groupKey; 1489ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen return this; 1490ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen } 1491ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen 1492ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen /** 1493ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen * Set this notification to be the group summary for a group of notifications. 1494ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen * Grouped notifications may display in a cluster or stack on devices which 1495ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen * support such rendering. Requires a group key also be set using {@link #setGroup}. 1496ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen * @param isGroupSummary Whether this notification should be a group summary. 1497ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen * @return this object for method chaining 1498ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen */ 1499ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen public Builder setGroupSummary(boolean isGroupSummary) { 1500ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen mGroupSummary = isGroupSummary; 1501ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen return this; 1502ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen } 1503ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen 1504ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen /** 1505ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen * Set a sort key that orders this notification among other notifications from the 1506ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen * same package. This can be useful if an external sort was already applied and an app 1507ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen * would like to preserve this. Notifications will be sorted lexicographically using this 1508ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen * value, although providing different priorities in addition to providing sort key may 1509ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen * cause this value to be ignored. 1510ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen * 1511ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen * <p>This sort key can also be used to order members of a notification group. See 1512ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen * {@link Builder#setGroup}. 1513ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen * 1514ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen * @see String#compareTo(String) 1515ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen */ 1516ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen public Builder setSortKey(String sortKey) { 1517ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen mSortKey = sortKey; 1518ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen return this; 1519ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen } 1520ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen 1521ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen /** 1522ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen * Merge additional metadata into this notification. 1523ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen * 1524ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen * <p>Values within the Bundle will replace existing extras values in this Builder. 1525ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen * 1526ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen * @see Notification#extras 1527ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen */ 1528300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen public Builder addExtras(Bundle extras) { 1529300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen if (extras != null) { 1530300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen if (mExtras == null) { 1531300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen mExtras = new Bundle(extras); 1532300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen } else { 1533300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen mExtras.putAll(extras); 1534300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen } 1535ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen } 1536ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen return this; 1537ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen } 1538ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen 1539ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen /** 1540ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen * Set metadata for this notification. 1541ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen * 1542ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen * <p>A reference to the Bundle is held for the lifetime of this Builder, and the Bundle's 1543ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen * current contents are copied into the Notification each time {@link #build()} is 1544ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen * called. 1545ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen * 1546ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen * <p>Replaces any existing extras values with those from the provided Bundle. 1547ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen * Use {@link #addExtras} to merge in metadata instead. 1548ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen * 1549ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen * @see Notification#extras 1550ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen */ 1551300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen public Builder setExtras(Bundle extras) { 1552300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen mExtras = extras; 1553ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen return this; 1554ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen } 1555ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen 1556ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen /** 1557ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen * Get the current metadata Bundle used by this notification Builder. 1558ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen * 1559ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen * <p>The returned Bundle is shared with this Builder. 1560ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen * 1561ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen * <p>The current contents of this Bundle are copied into the Notification each time 1562ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen * {@link #build()} is called. 1563ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen * 1564ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen * @see Notification#extras 1565ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen */ 1566ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen public Bundle getExtras() { 1567ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen if (mExtras == null) { 1568ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen mExtras = new Bundle(); 1569ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen } 1570ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen return mExtras; 1571ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen } 1572ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen 1573ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen /** 1574f021758934b35e3b842c6799344531d7ea2969daChris Wren * Add an action to this notification. Actions are typically displayed by 1575f021758934b35e3b842c6799344531d7ea2969daChris Wren * the system as a button adjacent to the notification content. 1576884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin * <br> 1577884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin * Action buttons won't appear on platforms prior to Android 4.1. Action 1578884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin * buttons depend on expanded notifications, which are only available in Android 4.1 1579884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin * and later. To ensure that an action button's functionality is always available, first 1580884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin * implement the functionality in the {@link android.app.Activity} that starts when a user 1581884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin * clicks the notification (see {@link #setContentIntent setContentIntent()}), and then 1582884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin * enhance the notification by implementing the same functionality with 1583884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin * {@link #addAction addAction()}. 1584f021758934b35e3b842c6799344531d7ea2969daChris Wren * 1585f021758934b35e3b842c6799344531d7ea2969daChris Wren * @param icon Resource ID of a drawable that represents the action. 1586f021758934b35e3b842c6799344531d7ea2969daChris Wren * @param title Text describing the action. 1587884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin * @param intent {@link android.app.PendingIntent} to be fired when the action is invoked. 1588f021758934b35e3b842c6799344531d7ea2969daChris Wren */ 1589f021758934b35e3b842c6799344531d7ea2969daChris Wren public Builder addAction(int icon, CharSequence title, PendingIntent intent) { 1590f021758934b35e3b842c6799344531d7ea2969daChris Wren mActions.add(new Action(icon, title, intent)); 1591f021758934b35e3b842c6799344531d7ea2969daChris Wren return this; 1592f021758934b35e3b842c6799344531d7ea2969daChris Wren } 1593f021758934b35e3b842c6799344531d7ea2969daChris Wren 1594f021758934b35e3b842c6799344531d7ea2969daChris Wren /** 1595300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen * Add an action to this notification. Actions are typically displayed by 1596300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen * the system as a button adjacent to the notification content. 1597300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen * <br> 1598300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen * Action buttons won't appear on platforms prior to Android 4.1. Action 1599300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen * buttons depend on expanded notifications, which are only available in Android 4.1 1600300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen * and later. To ensure that an action button's functionality is always available, first 1601300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen * implement the functionality in the {@link android.app.Activity} that starts when a user 1602300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen * clicks the notification (see {@link #setContentIntent setContentIntent()}), and then 1603300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen * enhance the notification by implementing the same functionality with 1604300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen * {@link #addAction addAction()}. 1605300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen * 1606300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen * @param action The action to add. 1607300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen */ 1608300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen public Builder addAction(Action action) { 1609300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen mActions.add(action); 1610300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen return this; 1611300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen } 1612300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen 1613300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen /** 1614f021758934b35e3b842c6799344531d7ea2969daChris Wren * Add a rich notification style to be applied at build time. 1615884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin * <br> 1616884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin * If the platform does not provide rich notification styles, this method has no effect. The 1617884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin * user will always see the normal notification style. 1618f021758934b35e3b842c6799344531d7ea2969daChris Wren * 1619f021758934b35e3b842c6799344531d7ea2969daChris Wren * @param style Object responsible for modifying the notification style. 1620f021758934b35e3b842c6799344531d7ea2969daChris Wren */ 1621f021758934b35e3b842c6799344531d7ea2969daChris Wren public Builder setStyle(Style style) { 1622f021758934b35e3b842c6799344531d7ea2969daChris Wren if (mStyle != style) { 1623f021758934b35e3b842c6799344531d7ea2969daChris Wren mStyle = style; 1624f021758934b35e3b842c6799344531d7ea2969daChris Wren if (mStyle != null) { 1625f021758934b35e3b842c6799344531d7ea2969daChris Wren mStyle.setBuilder(this); 1626f021758934b35e3b842c6799344531d7ea2969daChris Wren } 1627f021758934b35e3b842c6799344531d7ea2969daChris Wren } 1628f021758934b35e3b842c6799344531d7ea2969daChris Wren return this; 1629f021758934b35e3b842c6799344531d7ea2969daChris Wren } 1630f021758934b35e3b842c6799344531d7ea2969daChris Wren 1631f021758934b35e3b842c6799344531d7ea2969daChris Wren /** 163269a58d36f6ed8ec4d076534556aba2f93d00254eDan Sandler * Sets {@link Notification#color}. 163369a58d36f6ed8ec4d076534556aba2f93d00254eDan Sandler * 163469a58d36f6ed8ec4d076534556aba2f93d00254eDan Sandler * @param argb The accent color to use 163569a58d36f6ed8ec4d076534556aba2f93d00254eDan Sandler * 163669a58d36f6ed8ec4d076534556aba2f93d00254eDan Sandler * @return The same Builder. 163769a58d36f6ed8ec4d076534556aba2f93d00254eDan Sandler */ 163870acb0c19be3831a2080e4f902324de16bfbf62eTor Norbye public Builder setColor(@ColorInt int argb) { 163969a58d36f6ed8ec4d076534556aba2f93d00254eDan Sandler mColor = argb; 164069a58d36f6ed8ec4d076534556aba2f93d00254eDan Sandler return this; 164169a58d36f6ed8ec4d076534556aba2f93d00254eDan Sandler } 164269a58d36f6ed8ec4d076534556aba2f93d00254eDan Sandler 164369a58d36f6ed8ec4d076534556aba2f93d00254eDan Sandler /** 1644df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler * Sets {@link Notification#visibility}. 1645df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler * 1646df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler * @param visibility One of {@link Notification#VISIBILITY_PRIVATE} (the default), 1647df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler * {@link Notification#VISIBILITY_PUBLIC}, or 1648df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler * {@link Notification#VISIBILITY_SECRET}. 1649df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler */ 1650df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler public Builder setVisibility(int visibility) { 1651df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler mVisibility = visibility; 1652df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler return this; 1653df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler } 1654df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler 1655df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler /** 1656df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler * Supply a replacement Notification whose contents should be shown in insecure contexts 1657df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler * (i.e. atop the secure lockscreen). See {@link Notification#visibility} and 1658df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler * {@link #VISIBILITY_PUBLIC}. 1659df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler * 1660df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler * @param n A replacement notification, presumably with some or all info redacted. 1661df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler * @return The same Builder. 1662df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler */ 1663df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler public Builder setPublicVersion(Notification n) { 1664df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler mPublicVersion = n; 1665df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler return this; 1666df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler } 1667df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler 1668df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler /** 1669c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds * Supply custom RemoteViews to use instead of the platform template. 1670c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds * 1671c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds * This will override the layout that would otherwise be constructed by this Builder 1672c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds * object. 1673c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds */ 1674c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds public Builder setCustomContentView(RemoteViews contentView) { 1675c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds mContentView = contentView; 1676c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds return this; 1677c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds } 1678c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds 1679c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds /** 1680c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds * Supply custom RemoteViews to use instead of the platform template in the expanded form. 1681c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds * 1682c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds * This will override the expanded layout that would otherwise be constructed by this 1683c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds * Builder object. 1684c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds * 1685c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds * No-op on versions prior to {@link android.os.Build.VERSION_CODES#JELLY_BEAN}. 1686c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds */ 1687c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds public Builder setCustomBigContentView(RemoteViews contentView) { 1688c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds mBigContentView = contentView; 1689c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds return this; 1690c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds } 1691c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds 1692c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds /** 1693c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds * Supply custom RemoteViews to use instead of the platform template in the heads up dialog. 1694c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds * 1695c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds * This will override the heads-up layout that would otherwise be constructed by this 1696c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds * Builder object. 1697c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds * 1698c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds * No-op on versions prior to {@link android.os.Build.VERSION_CODES#LOLLIPOP}. 1699c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds */ 1700c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds public Builder setCustomHeadsUpContentView(RemoteViews contentView) { 1701c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds mHeadsUpContentView = contentView; 1702c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds return this; 1703c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds } 1704c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds 1705c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds /** 1706ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen * Apply an extender to this notification builder. Extenders may be used to add 1707ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen * metadata or change options on this builder. 1708ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen */ 17092bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen public Builder extend(Extender extender) { 17102bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen extender.extend(this); 1711ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen return this; 1712ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen } 1713ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen 1714ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen /** 1715f021758934b35e3b842c6799344531d7ea2969daChris Wren * @deprecated Use {@link #build()} instead. 1716f021758934b35e3b842c6799344531d7ea2969daChris Wren */ 1717f021758934b35e3b842c6799344531d7ea2969daChris Wren @Deprecated 1718f021758934b35e3b842c6799344531d7ea2969daChris Wren public Notification getNotification() { 171910d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi return build(); 1720f021758934b35e3b842c6799344531d7ea2969daChris Wren } 1721f021758934b35e3b842c6799344531d7ea2969daChris Wren 1722f021758934b35e3b842c6799344531d7ea2969daChris Wren /** 1723c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * Combine all of the options that have been set and return a new {@link Notification} 1724c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * object. 1725c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell */ 1726f021758934b35e3b842c6799344531d7ea2969daChris Wren public Notification build() { 172710d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi return IMPL.build(this, getExtender()); 172810d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi } 172910d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi 173010d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi /** 173110d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi * @hide 173210d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi */ 173310d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi protected BuilderExtender getExtender() { 173410d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi return new BuilderExtender(); 1735f021758934b35e3b842c6799344531d7ea2969daChris Wren } 173624c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer 173724c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer protected static CharSequence limitCharSequenceLength(CharSequence cs) { 173824c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer if (cs == null) return cs; 173924c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer if (cs.length() > MAX_CHARSEQUENCE_LENGTH) { 174024c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer cs = cs.subSequence(0, MAX_CHARSEQUENCE_LENGTH); 174124c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer } 174224c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer return cs; 174324c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer } 17443b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek 17453b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek /** 17463b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek * @hide 17473b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek */ 17483b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek public RemoteViews getContentView() { 17493b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek return mContentView; 17503b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek } 17513b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek 17523b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek /** 17533b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek * @hide 17543b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek */ 17553b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek public RemoteViews getBigContentView() { 17563b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek return mBigContentView; 17573b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek } 17583b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek 17593b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek /** 17603b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek * @hide 17613b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek */ 17623b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek public RemoteViews getHeadsUpContentView() { 17633b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek return mHeadsUpContentView; 17643b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek } 17653b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek 17663b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek /** 17673b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek * return when if it is showing or 0 otherwise 17683b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek * 17693b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek * @hide 17703b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek */ 17713b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek public long getWhenIfShowing() { 17723b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek return mShowWhen ? mNotification.when : 0; 17733b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek } 17743b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek 17753b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek /** 17763b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek * @return the priority set on the notification 17773b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek * 17783b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek * @hide 17793b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek */ 17803b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek public int getPriority() { 17813b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek return mPriority; 17823b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek } 17833b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek 17843b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek /** 17853b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek * @return the color of the notification 17863b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek * 17873b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek * @hide 17883b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek */ 17893b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek public int getColor() { 17903b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek return mColor; 17913b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek } 1792cd40090290dbd6f81ea40592bb8c699bb03ab931Selim Cinek 1793cd40090290dbd6f81ea40592bb8c699bb03ab931Selim Cinek 1794cd40090290dbd6f81ea40592bb8c699bb03ab931Selim Cinek /** 1795cd40090290dbd6f81ea40592bb8c699bb03ab931Selim Cinek * @return the text of the notification 1796cd40090290dbd6f81ea40592bb8c699bb03ab931Selim Cinek * 1797cd40090290dbd6f81ea40592bb8c699bb03ab931Selim Cinek * @hide 1798cd40090290dbd6f81ea40592bb8c699bb03ab931Selim Cinek */ 1799cd40090290dbd6f81ea40592bb8c699bb03ab931Selim Cinek protected CharSequence resolveText() { 1800cd40090290dbd6f81ea40592bb8c699bb03ab931Selim Cinek return mContentText; 1801cd40090290dbd6f81ea40592bb8c699bb03ab931Selim Cinek } 1802cd40090290dbd6f81ea40592bb8c699bb03ab931Selim Cinek 1803cd40090290dbd6f81ea40592bb8c699bb03ab931Selim Cinek /** 1804cd40090290dbd6f81ea40592bb8c699bb03ab931Selim Cinek * @return the title of the notification 1805cd40090290dbd6f81ea40592bb8c699bb03ab931Selim Cinek * 1806cd40090290dbd6f81ea40592bb8c699bb03ab931Selim Cinek * @hide 1807cd40090290dbd6f81ea40592bb8c699bb03ab931Selim Cinek */ 1808cd40090290dbd6f81ea40592bb8c699bb03ab931Selim Cinek protected CharSequence resolveTitle() { 1809cd40090290dbd6f81ea40592bb8c699bb03ab931Selim Cinek return mContentTitle; 1810cd40090290dbd6f81ea40592bb8c699bb03ab931Selim Cinek } 1811f021758934b35e3b842c6799344531d7ea2969daChris Wren } 1812f021758934b35e3b842c6799344531d7ea2969daChris Wren 1813f021758934b35e3b842c6799344531d7ea2969daChris Wren /** 1814f021758934b35e3b842c6799344531d7ea2969daChris Wren * An object that can apply a rich notification style to a {@link Notification.Builder} 1815f021758934b35e3b842c6799344531d7ea2969daChris Wren * object. 1816884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin * <br> 1817884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin * If the platform does not provide rich notification styles, methods in this class have no 1818884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin * effect. 1819f021758934b35e3b842c6799344531d7ea2969daChris Wren */ 1820fe3b5bac4901a4bb8cf51c09fe4910b02388818aGriff Hazen public static abstract class Style { 1821f021758934b35e3b842c6799344531d7ea2969daChris Wren Builder mBuilder; 1822f021758934b35e3b842c6799344531d7ea2969daChris Wren CharSequence mBigContentTitle; 1823f021758934b35e3b842c6799344531d7ea2969daChris Wren CharSequence mSummaryText; 1824f021758934b35e3b842c6799344531d7ea2969daChris Wren boolean mSummaryTextSet = false; 1825f021758934b35e3b842c6799344531d7ea2969daChris Wren 1826f021758934b35e3b842c6799344531d7ea2969daChris Wren public void setBuilder(Builder builder) { 1827f021758934b35e3b842c6799344531d7ea2969daChris Wren if (mBuilder != builder) { 1828f021758934b35e3b842c6799344531d7ea2969daChris Wren mBuilder = builder; 1829f021758934b35e3b842c6799344531d7ea2969daChris Wren if (mBuilder != null) { 1830f021758934b35e3b842c6799344531d7ea2969daChris Wren mBuilder.setStyle(this); 1831f021758934b35e3b842c6799344531d7ea2969daChris Wren } 1832f021758934b35e3b842c6799344531d7ea2969daChris Wren } 1833f021758934b35e3b842c6799344531d7ea2969daChris Wren } 1834f021758934b35e3b842c6799344531d7ea2969daChris Wren 1835f021758934b35e3b842c6799344531d7ea2969daChris Wren public Notification build() { 1836f021758934b35e3b842c6799344531d7ea2969daChris Wren Notification notification = null; 1837f021758934b35e3b842c6799344531d7ea2969daChris Wren if (mBuilder != null) { 1838f021758934b35e3b842c6799344531d7ea2969daChris Wren notification = mBuilder.build(); 1839884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin } 1840f021758934b35e3b842c6799344531d7ea2969daChris Wren return notification; 1841f021758934b35e3b842c6799344531d7ea2969daChris Wren } 184243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills 184343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills /** 184443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * @hide 184543cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills */ 184643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills // TODO: implement for all styles 184743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills public void addCompatExtras(Bundle extras) { 184843cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills } 184943cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills 185043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills /** 185143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * @hide 185243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills */ 185343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills // TODO: implement for all styles 185443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills protected void restoreFromCompatExtras(Bundle extras) { 185543cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills } 1856f021758934b35e3b842c6799344531d7ea2969daChris Wren } 1857f021758934b35e3b842c6799344531d7ea2969daChris Wren 1858f021758934b35e3b842c6799344531d7ea2969daChris Wren /** 1859f021758934b35e3b842c6799344531d7ea2969daChris Wren * Helper class for generating large-format notifications that include a large image attachment. 1860884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin * <br> 1861884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin * If the platform does not provide large-format notifications, this method has no effect. The 1862884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin * user will always see the normal notification view. 1863884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin * <br> 1864f021758934b35e3b842c6799344531d7ea2969daChris Wren * This class is a "rebuilder": It attaches to a Builder object and modifies its behavior, like so: 1865f021758934b35e3b842c6799344531d7ea2969daChris Wren * <pre class="prettyprint"> 186677b88e3651ede1a5d45fb4c19f34b2f78d67f33fRobert Ly * Notification notif = new Notification.Builder(mContext) 1867f021758934b35e3b842c6799344531d7ea2969daChris Wren * .setContentTitle("New photo from " + sender.toString()) 1868f021758934b35e3b842c6799344531d7ea2969daChris Wren * .setContentText(subject) 1869f021758934b35e3b842c6799344531d7ea2969daChris Wren * .setSmallIcon(R.drawable.new_post) 1870f021758934b35e3b842c6799344531d7ea2969daChris Wren * .setLargeIcon(aBitmap) 1871f021758934b35e3b842c6799344531d7ea2969daChris Wren * .setStyle(new Notification.BigPictureStyle() 1872f021758934b35e3b842c6799344531d7ea2969daChris Wren * .bigPicture(aBigBitmap)) 1873f021758934b35e3b842c6799344531d7ea2969daChris Wren * .build(); 1874f021758934b35e3b842c6799344531d7ea2969daChris Wren * </pre> 1875884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin * 1876f021758934b35e3b842c6799344531d7ea2969daChris Wren * @see Notification#bigContentView 1877f021758934b35e3b842c6799344531d7ea2969daChris Wren */ 1878f021758934b35e3b842c6799344531d7ea2969daChris Wren public static class BigPictureStyle extends Style { 1879f021758934b35e3b842c6799344531d7ea2969daChris Wren Bitmap mPicture; 188049714d665f839c4804a17eea129092f8b472926dRoman Nurik Bitmap mBigLargeIcon; 188149714d665f839c4804a17eea129092f8b472926dRoman Nurik boolean mBigLargeIconSet; 1882f021758934b35e3b842c6799344531d7ea2969daChris Wren 1883f021758934b35e3b842c6799344531d7ea2969daChris Wren public BigPictureStyle() { 1884f021758934b35e3b842c6799344531d7ea2969daChris Wren } 1885f021758934b35e3b842c6799344531d7ea2969daChris Wren 1886f021758934b35e3b842c6799344531d7ea2969daChris Wren public BigPictureStyle(Builder builder) { 1887f021758934b35e3b842c6799344531d7ea2969daChris Wren setBuilder(builder); 1888f021758934b35e3b842c6799344531d7ea2969daChris Wren } 1889f021758934b35e3b842c6799344531d7ea2969daChris Wren 1890f021758934b35e3b842c6799344531d7ea2969daChris Wren /** 1891f021758934b35e3b842c6799344531d7ea2969daChris Wren * Overrides ContentTitle in the big form of the template. 1892f021758934b35e3b842c6799344531d7ea2969daChris Wren * This defaults to the value passed to setContentTitle(). 1893f021758934b35e3b842c6799344531d7ea2969daChris Wren */ 1894f021758934b35e3b842c6799344531d7ea2969daChris Wren public BigPictureStyle setBigContentTitle(CharSequence title) { 189524c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer mBigContentTitle = Builder.limitCharSequenceLength(title); 1896f021758934b35e3b842c6799344531d7ea2969daChris Wren return this; 1897f021758934b35e3b842c6799344531d7ea2969daChris Wren } 1898f021758934b35e3b842c6799344531d7ea2969daChris Wren 1899f021758934b35e3b842c6799344531d7ea2969daChris Wren /** 1900f021758934b35e3b842c6799344531d7ea2969daChris Wren * Set the first line of text after the detail section in the big form of the template. 1901f021758934b35e3b842c6799344531d7ea2969daChris Wren */ 1902f021758934b35e3b842c6799344531d7ea2969daChris Wren public BigPictureStyle setSummaryText(CharSequence cs) { 190324c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer mSummaryText = Builder.limitCharSequenceLength(cs); 1904f021758934b35e3b842c6799344531d7ea2969daChris Wren mSummaryTextSet = true; 1905f021758934b35e3b842c6799344531d7ea2969daChris Wren return this; 1906f021758934b35e3b842c6799344531d7ea2969daChris Wren } 1907f021758934b35e3b842c6799344531d7ea2969daChris Wren 1908b41a213761ff07de2fcfdaf16790fdcca1a1ee1bChris Wren /** 1909b41a213761ff07de2fcfdaf16790fdcca1a1ee1bChris Wren * Provide the bitmap to be used as the payload for the BigPicture notification. 1910b41a213761ff07de2fcfdaf16790fdcca1a1ee1bChris Wren */ 1911f021758934b35e3b842c6799344531d7ea2969daChris Wren public BigPictureStyle bigPicture(Bitmap b) { 1912f021758934b35e3b842c6799344531d7ea2969daChris Wren mPicture = b; 1913f021758934b35e3b842c6799344531d7ea2969daChris Wren return this; 1914f021758934b35e3b842c6799344531d7ea2969daChris Wren } 191549714d665f839c4804a17eea129092f8b472926dRoman Nurik 191649714d665f839c4804a17eea129092f8b472926dRoman Nurik /** 191749714d665f839c4804a17eea129092f8b472926dRoman Nurik * Override the large icon when the big notification is shown. 191849714d665f839c4804a17eea129092f8b472926dRoman Nurik */ 191949714d665f839c4804a17eea129092f8b472926dRoman Nurik public BigPictureStyle bigLargeIcon(Bitmap b) { 192049714d665f839c4804a17eea129092f8b472926dRoman Nurik mBigLargeIcon = b; 192149714d665f839c4804a17eea129092f8b472926dRoman Nurik mBigLargeIconSet = true; 192249714d665f839c4804a17eea129092f8b472926dRoman Nurik return this; 192349714d665f839c4804a17eea129092f8b472926dRoman Nurik } 1924f021758934b35e3b842c6799344531d7ea2969daChris Wren } 1925f021758934b35e3b842c6799344531d7ea2969daChris Wren 1926f021758934b35e3b842c6799344531d7ea2969daChris Wren /** 1927f021758934b35e3b842c6799344531d7ea2969daChris Wren * Helper class for generating large-format notifications that include a lot of text. 1928884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin * 1929884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin * <br> 1930884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin * If the platform does not provide large-format notifications, this method has no effect. The 1931884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin * user will always see the normal notification view. 1932884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin * <br> 1933f021758934b35e3b842c6799344531d7ea2969daChris Wren * This class is a "rebuilder": It attaches to a Builder object and modifies its behavior, like so: 1934f021758934b35e3b842c6799344531d7ea2969daChris Wren * <pre class="prettyprint"> 193577b88e3651ede1a5d45fb4c19f34b2f78d67f33fRobert Ly * Notification notif = new Notification.Builder(mContext) 1936f021758934b35e3b842c6799344531d7ea2969daChris Wren * .setContentTitle("New mail from " + sender.toString()) 1937f021758934b35e3b842c6799344531d7ea2969daChris Wren * .setContentText(subject) 1938f021758934b35e3b842c6799344531d7ea2969daChris Wren * .setSmallIcon(R.drawable.new_mail) 1939f021758934b35e3b842c6799344531d7ea2969daChris Wren * .setLargeIcon(aBitmap) 1940f021758934b35e3b842c6799344531d7ea2969daChris Wren * .setStyle(new Notification.BigTextStyle() 1941f021758934b35e3b842c6799344531d7ea2969daChris Wren * .bigText(aVeryLongString)) 1942f021758934b35e3b842c6799344531d7ea2969daChris Wren * .build(); 1943f021758934b35e3b842c6799344531d7ea2969daChris Wren * </pre> 1944884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin * 1945f021758934b35e3b842c6799344531d7ea2969daChris Wren * @see Notification#bigContentView 1946f021758934b35e3b842c6799344531d7ea2969daChris Wren */ 1947f021758934b35e3b842c6799344531d7ea2969daChris Wren public static class BigTextStyle extends Style { 1948f021758934b35e3b842c6799344531d7ea2969daChris Wren CharSequence mBigText; 1949f021758934b35e3b842c6799344531d7ea2969daChris Wren 1950f021758934b35e3b842c6799344531d7ea2969daChris Wren public BigTextStyle() { 1951f021758934b35e3b842c6799344531d7ea2969daChris Wren } 1952f021758934b35e3b842c6799344531d7ea2969daChris Wren 1953f021758934b35e3b842c6799344531d7ea2969daChris Wren public BigTextStyle(Builder builder) { 1954f021758934b35e3b842c6799344531d7ea2969daChris Wren setBuilder(builder); 1955f021758934b35e3b842c6799344531d7ea2969daChris Wren } 1956f021758934b35e3b842c6799344531d7ea2969daChris Wren 1957f021758934b35e3b842c6799344531d7ea2969daChris Wren /** 1958f021758934b35e3b842c6799344531d7ea2969daChris Wren * Overrides ContentTitle in the big form of the template. 1959f021758934b35e3b842c6799344531d7ea2969daChris Wren * This defaults to the value passed to setContentTitle(). 1960f021758934b35e3b842c6799344531d7ea2969daChris Wren */ 1961f021758934b35e3b842c6799344531d7ea2969daChris Wren public BigTextStyle setBigContentTitle(CharSequence title) { 196224c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer mBigContentTitle = Builder.limitCharSequenceLength(title); 1963f021758934b35e3b842c6799344531d7ea2969daChris Wren return this; 1964f021758934b35e3b842c6799344531d7ea2969daChris Wren } 1965f021758934b35e3b842c6799344531d7ea2969daChris Wren 1966f021758934b35e3b842c6799344531d7ea2969daChris Wren /** 1967f021758934b35e3b842c6799344531d7ea2969daChris Wren * Set the first line of text after the detail section in the big form of the template. 1968f021758934b35e3b842c6799344531d7ea2969daChris Wren */ 1969f021758934b35e3b842c6799344531d7ea2969daChris Wren public BigTextStyle setSummaryText(CharSequence cs) { 197024c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer mSummaryText = Builder.limitCharSequenceLength(cs); 1971f021758934b35e3b842c6799344531d7ea2969daChris Wren mSummaryTextSet = true; 1972f021758934b35e3b842c6799344531d7ea2969daChris Wren return this; 1973f021758934b35e3b842c6799344531d7ea2969daChris Wren } 1974f021758934b35e3b842c6799344531d7ea2969daChris Wren 1975b41a213761ff07de2fcfdaf16790fdcca1a1ee1bChris Wren /** 1976b41a213761ff07de2fcfdaf16790fdcca1a1ee1bChris Wren * Provide the longer text to be displayed in the big form of the 1977b41a213761ff07de2fcfdaf16790fdcca1a1ee1bChris Wren * template in place of the content text. 1978b41a213761ff07de2fcfdaf16790fdcca1a1ee1bChris Wren */ 1979f021758934b35e3b842c6799344531d7ea2969daChris Wren public BigTextStyle bigText(CharSequence cs) { 198024c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer mBigText = Builder.limitCharSequenceLength(cs); 1981f021758934b35e3b842c6799344531d7ea2969daChris Wren return this; 1982f021758934b35e3b842c6799344531d7ea2969daChris Wren } 1983f021758934b35e3b842c6799344531d7ea2969daChris Wren } 1984f021758934b35e3b842c6799344531d7ea2969daChris Wren 1985f021758934b35e3b842c6799344531d7ea2969daChris Wren /** 198643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * Helper class for generating large-format notifications that include multiple back-and-forth 198743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * messages of varying types between any number of people. 198843cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * 198943cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * <br> 1990cd40090290dbd6f81ea40592bb8c699bb03ab931Selim Cinek * In order to get a backwards compatible behavior, the app needs to use the v7 version of the 1991cd40090290dbd6f81ea40592bb8c699bb03ab931Selim Cinek * notification builder together with this style, otherwise the user will see the normal 1992cd40090290dbd6f81ea40592bb8c699bb03ab931Selim Cinek * notification view. 199343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * <br> 199443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * This class is a "rebuilder": It attaches to a Builder object and modifies its behavior, like 199543cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * so: 199643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * <pre class="prettyprint"> 199743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * 199843cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * Notification noti = new Notification.Builder() 199943cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * .setContentTitle("2 new messages wtih " + sender.toString()) 200043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * .setContentText(subject) 200143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * .setSmallIcon(R.drawable.new_message) 200243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * .setLargeIcon(aBitmap) 200343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * .setStyle(new Notification.MessagingStyle(resources.getString(R.string.reply_name)) 200443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * .addMessage(messages[0].getText(), messages[0].getTime(), messages[0].getSender()) 200543cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * .addMessage(messages[1].getText(), messages[1].getTime(), messages[1].getSender())) 200643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * .build(); 200743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * </pre> 200843cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills */ 200943cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills public static class MessagingStyle extends Style { 201043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills 201143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills /** 201243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * The maximum number of messages that will be retained in the Notification itself (the 201343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * number displayed is up to the platform). 201443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills */ 201543cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills public static final int MAXIMUM_RETAINED_MESSAGES = 25; 201643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills 201743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills CharSequence mUserDisplayName; 201843cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills CharSequence mConversationTitle; 201943cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills List<Message> mMessages = new ArrayList<>(); 202043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills 202143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills MessagingStyle() { 202243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills } 202343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills 202443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills /** 202543cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * @param userDisplayName the name to be displayed for any replies sent by the user before the 202643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * posting app reposts the notification with those messages after they've been actually 202743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * sent and in previous messages sent by the user added in 202843cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * {@link #addMessage(Message)} 202943cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills */ 203043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills public MessagingStyle(CharSequence userDisplayName) { 203143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills mUserDisplayName = userDisplayName; 203243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills } 203343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills 203443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills /** 203543cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * Returns the name to be displayed for any replies sent by the user 203643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills */ 203743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills public CharSequence getUserDisplayName() { 203843cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills return mUserDisplayName; 203943cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills } 204043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills 204143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills /** 204243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * Sets the title to be displayed on this conversation. This should only be used for 204343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * group messaging and left unset for one-on-one conversations. 204443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * @param conversationTitle 204543cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * @return this object for method chaining. 204643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills */ 204743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills public MessagingStyle setConversationTitle(CharSequence conversationTitle) { 204843cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills mConversationTitle = conversationTitle; 204943cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills return this; 205043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills } 205143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills 205243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills /** 205343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * Return the title to be displayed on this conversation. Can be <code>null</code> and 205443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * should be for one-on-one conversations 205543cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills */ 205643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills public CharSequence getConversationTitle() { 205743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills return mConversationTitle; 205843cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills } 205943cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills 206043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills /** 206143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * Adds a message for display by this notification. Convenience call for a simple 206243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * {@link Message} in {@link #addMessage(Message)} 206343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * @param text A {@link CharSequence} to be displayed as the message content 206443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * @param timestamp Time at which the message arrived 206543cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * @param sender A {@link CharSequence} to be used for displaying the name of the 206643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * sender. Should be <code>null</code> for messages by the current user, in which case 206743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * the platform will insert {@link #getUserDisplayName()}. 206843cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * Should be unique amongst all individuals in the conversation, and should be 206943cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * consistent during re-posts of the notification. 207043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * 207143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * @see Message#Message(CharSequence, long, CharSequence) 207243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * 207343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * @return this object for method chaining 207443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills */ 207543cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills public MessagingStyle addMessage(CharSequence text, long timestamp, CharSequence sender) { 207643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills mMessages.add(new Message(text, timestamp, sender)); 207743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills if (mMessages.size() > MAXIMUM_RETAINED_MESSAGES) { 207843cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills mMessages.remove(0); 207943cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills } 208043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills return this; 208143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills } 208243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills 208343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills /** 208443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * Adds a {@link Message} for display in this notification. 208543cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * @param message The {@link Message} to be displayed 208643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * @return this object for method chaining 208743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills */ 208843cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills public MessagingStyle addMessage(Message message) { 208943cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills mMessages.add(message); 209043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills if (mMessages.size() > MAXIMUM_RETAINED_MESSAGES) { 209143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills mMessages.remove(0); 209243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills } 209343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills return this; 209443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills } 209543cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills 209643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills /** 209743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * Gets the list of {@code Message} objects that represent the notification 209843cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills */ 209943cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills public List<Message> getMessages() { 210043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills return mMessages; 210143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills } 210243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills 2103c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills /** 2104c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills * Retrieves a {@link MessagingStyle} from a {@link Notification}, enabling an application 2105c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills * that has set a {@link MessagingStyle} using {@link NotificationCompat} or 2106c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills * {@link android.app.Notification.Builder} to send messaging information to another 2107c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills * application using {@link NotificationCompat}, regardless of the API level of the system. 2108c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills * Returns {@code null} if there is no {@link MessagingStyle} set. 2109c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills */ 2110c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills public static MessagingStyle extractMessagingStyleFromNotification(Notification notif) { 2111c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills MessagingStyle style; 2112c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills Bundle extras = IMPL.getExtras(notif); 2113c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills if (!extras.containsKey(EXTRA_SELF_DISPLAY_NAME)) { 2114c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills style = null; 2115c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills } else { 2116c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills try { 2117c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills style = new MessagingStyle(); 2118c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills style.restoreFromCompatExtras(extras); 2119c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills } catch (ClassCastException e) { 2120c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills style = null; 2121c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills } 2122c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills } 2123c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills return style; 2124c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills } 2125c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills 212643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills @Override 212743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills public void addCompatExtras(Bundle extras) { 212843cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills super.addCompatExtras(extras); 212943cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills if (mUserDisplayName != null) { 213043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills extras.putCharSequence(EXTRA_SELF_DISPLAY_NAME, mUserDisplayName); 213143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills } 213243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills if (mConversationTitle != null) { 213343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills extras.putCharSequence(EXTRA_CONVERSATION_TITLE, mConversationTitle); 213443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills } 213543cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills if (!mMessages.isEmpty()) { extras.putParcelableArray(EXTRA_MESSAGES, 213643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills Message.getBundleArrayForMessages(mMessages)); 213743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills } 213843cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills } 213943cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills 214043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills /** 214143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * @hide 214243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills */ 214343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills @Override 214443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills protected void restoreFromCompatExtras(Bundle extras) { 214543cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills mMessages.clear(); 214643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills mUserDisplayName = extras.getString(EXTRA_SELF_DISPLAY_NAME); 214743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills mConversationTitle = extras.getString(EXTRA_CONVERSATION_TITLE); 214843cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills Parcelable[] parcelables = extras.getParcelableArray(EXTRA_MESSAGES); 21493503d49de59151a0c2fc972e6a8fdc6e9966dffeAdrian Roos if (parcelables != null) { 21503503d49de59151a0c2fc972e6a8fdc6e9966dffeAdrian Roos mMessages = Message.getMessagesFromBundleArray(parcelables); 215143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills } 215243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills } 215343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills 215443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills public static final class Message { 215543cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills 2156c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills static final String KEY_TEXT = "text"; 2157c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills static final String KEY_TIMESTAMP = "time"; 2158c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills static final String KEY_SENDER = "sender"; 2159c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills static final String KEY_DATA_MIME_TYPE = "type"; 2160c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills static final String KEY_DATA_URI= "uri"; 216143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills 216243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills private final CharSequence mText; 216343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills private final long mTimestamp; 216443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills private final CharSequence mSender; 216543cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills 216643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills private String mDataMimeType; 216743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills private Uri mDataUri; 216843cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills 216943cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills /** 217043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * Constructor 217143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * @param text A {@link CharSequence} to be displayed as the message content 217243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * @param timestamp Time at which the message arrived 217343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * @param sender A {@link CharSequence} to be used for displaying the name of the 217443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * sender. Should be <code>null</code> for messages by the current user, in which case 217543cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * the platform will insert {@link MessagingStyle#getUserDisplayName()}. 217643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * Should be unique amongst all individuals in the conversation, and should be 217743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * consistent during re-posts of the notification. 217843cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills */ 217943cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills public Message(CharSequence text, long timestamp, CharSequence sender){ 218043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills mText = text; 218143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills mTimestamp = timestamp; 218243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills mSender = sender; 218343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills } 218443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills 218543cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills /** 218643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * Sets a binary blob of data and an associated MIME type for a message. In the case 218743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * where the platform doesn't support the MIME type, the original text provided in the 218843cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * constructor will be used. 218943cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * @param dataMimeType The MIME type of the content. See 219043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * <a href="{@docRoot}notifications/messaging.html"> for the list of supported MIME 219143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * types on Android and Android Wear. 219243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * @param dataUri The uri containing the content whose type is given by the MIME type. 219343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * <p class="note"> 219443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * <ol> 219543cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * <li>Notification Listeners including the System UI need permission to access the 219643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * data the Uri points to. The recommended ways to do this are:</li> 219743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * <li>Store the data in your own ContentProvider, making sure that other apps have 219843cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * the correct permission to access your provider. The preferred mechanism for 219943cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * providing access is to use per-URI permissions which are temporary and only 220043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * grant access to the receiving application. An easy way to create a 220143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * ContentProvider like this is to use the FileProvider helper class.</li> 220243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * <li>Use the system MediaStore. The MediaStore is primarily aimed at video, audio 220343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * and image MIME types, however beginning with Android 3.0 (API level 11) it can 220443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * also store non-media types (see MediaStore.Files for more info). Files can be 220543cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * inserted into the MediaStore using scanFile() after which a content:// style 220643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * Uri suitable for sharing is passed to the provided onScanCompleted() callback. 220743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * Note that once added to the system MediaStore the content is accessible to any 220843cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * app on the device.</li> 220943cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * </ol> 221043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * @return this object for method chaining 221143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills */ 221243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills public Message setData(String dataMimeType, Uri dataUri) { 221343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills mDataMimeType = dataMimeType; 221443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills mDataUri = dataUri; 221543cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills return this; 221643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills } 221743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills 221843cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills /** 221943cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * Get the text to be used for this message, or the fallback text if a type and content 222043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * Uri have been set 222143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills */ 222243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills public CharSequence getText() { 222343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills return mText; 222443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills } 222543cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills 222643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills /** 222743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * Get the time at which this message arrived 222843cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills */ 222943cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills public long getTimestamp() { 223043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills return mTimestamp; 223143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills } 223243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills 223343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills /** 223443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * Get the text used to display the contact's name in the messaging experience 223543cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills */ 223643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills public CharSequence getSender() { 223743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills return mSender; 223843cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills } 223943cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills 224043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills /** 224143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * Get the MIME type of the data pointed to by the Uri 224243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills */ 224343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills public String getDataMimeType() { 224443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills return mDataMimeType; 224543cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills } 224643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills 224743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills /** 224843cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * Get the the Uri pointing to the content of the message. Can be null, in which case 224943cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * {@see #getText()} is used. 225043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills */ 225143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills public Uri getDataUri() { 225243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills return mDataUri; 225343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills } 225443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills 2255c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills private Bundle toBundle() { 225643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills Bundle bundle = new Bundle(); 225743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills if (mText != null) { 225843cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills bundle.putCharSequence(KEY_TEXT, mText); 225943cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills } 226043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills bundle.putLong(KEY_TIMESTAMP, mTimestamp); 226143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills if (mSender != null) { 226243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills bundle.putCharSequence(KEY_SENDER, mSender); 226343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills } 226443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills if (mDataMimeType != null) { 226543cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills bundle.putString(KEY_DATA_MIME_TYPE, mDataMimeType); 226643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills } 226743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills if (mDataUri != null) { 226843cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills bundle.putParcelable(KEY_DATA_URI, mDataUri); 226943cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills } 227043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills return bundle; 227143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills } 227243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills 227343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills static Bundle[] getBundleArrayForMessages(List<Message> messages) { 227443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills Bundle[] bundles = new Bundle[messages.size()]; 2275c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills final int N = messages.size(); 2276c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills for (int i = 0; i < N; i++) { 227743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills bundles[i] = messages.get(i).toBundle(); 227843cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills } 227943cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills return bundles; 228043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills } 228143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills 22823503d49de59151a0c2fc972e6a8fdc6e9966dffeAdrian Roos static List<Message> getMessagesFromBundleArray(Parcelable[] bundles) { 228343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills List<Message> messages = new ArrayList<>(bundles.length); 228443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills for (int i = 0; i < bundles.length; i++) { 22853503d49de59151a0c2fc972e6a8fdc6e9966dffeAdrian Roos if (bundles[i] instanceof Bundle) { 22863503d49de59151a0c2fc972e6a8fdc6e9966dffeAdrian Roos Message message = getMessageFromBundle((Bundle)bundles[i]); 22873503d49de59151a0c2fc972e6a8fdc6e9966dffeAdrian Roos if (message != null) { 22883503d49de59151a0c2fc972e6a8fdc6e9966dffeAdrian Roos messages.add(message); 22893503d49de59151a0c2fc972e6a8fdc6e9966dffeAdrian Roos } 2290c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills } 229143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills } 229243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills return messages; 229343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills } 2294c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills 2295c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills static Message getMessageFromBundle(Bundle bundle) { 2296c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills try { 229776e0c28c0b99134694c4bd8ae3a5367ee5efbb0dAdrian Roos if (!bundle.containsKey(KEY_TEXT) || !bundle.containsKey(KEY_TIMESTAMP)) { 2298c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills return null; 2299c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills } else { 2300c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills Message message = new Message(bundle.getCharSequence(KEY_TEXT), 2301c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills bundle.getLong(KEY_TIMESTAMP), bundle.getCharSequence(KEY_SENDER)); 2302c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills if (bundle.containsKey(KEY_DATA_MIME_TYPE) && 2303c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills bundle.containsKey(KEY_DATA_URI)) { 2304c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills 2305c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills message.setData(bundle.getString(KEY_DATA_MIME_TYPE), 2306c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills (Uri) bundle.getParcelable(KEY_DATA_URI)); 2307c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills } 2308c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills return message; 2309c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills } 2310c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills } catch (ClassCastException e) { 2311c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills return null; 2312c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills } 2313c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills } 231443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills } 231543cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills } 231643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills 231743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills /** 2318f021758934b35e3b842c6799344531d7ea2969daChris Wren * Helper class for generating large-format notifications that include a list of (up to 5) strings. 2319884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin * 2320884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin * <br> 2321884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin * If the platform does not provide large-format notifications, this method has no effect. The 2322884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin * user will always see the normal notification view. 2323884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin * <br> 2324f021758934b35e3b842c6799344531d7ea2969daChris Wren * This class is a "rebuilder": It attaches to a Builder object and modifies its behavior, like so: 2325f021758934b35e3b842c6799344531d7ea2969daChris Wren * <pre class="prettyprint"> 2326f021758934b35e3b842c6799344531d7ea2969daChris Wren * Notification noti = new Notification.Builder() 2327f021758934b35e3b842c6799344531d7ea2969daChris Wren * .setContentTitle("5 New mails from " + sender.toString()) 2328f021758934b35e3b842c6799344531d7ea2969daChris Wren * .setContentText(subject) 2329f021758934b35e3b842c6799344531d7ea2969daChris Wren * .setSmallIcon(R.drawable.new_mail) 2330f021758934b35e3b842c6799344531d7ea2969daChris Wren * .setLargeIcon(aBitmap) 2331f021758934b35e3b842c6799344531d7ea2969daChris Wren * .setStyle(new Notification.InboxStyle() 2332f021758934b35e3b842c6799344531d7ea2969daChris Wren * .addLine(str1) 2333f021758934b35e3b842c6799344531d7ea2969daChris Wren * .addLine(str2) 2334f021758934b35e3b842c6799344531d7ea2969daChris Wren * .setContentTitle("") 2335f021758934b35e3b842c6799344531d7ea2969daChris Wren * .setSummaryText("+3 more")) 2336f021758934b35e3b842c6799344531d7ea2969daChris Wren * .build(); 2337f021758934b35e3b842c6799344531d7ea2969daChris Wren * </pre> 2338884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin * 2339f021758934b35e3b842c6799344531d7ea2969daChris Wren * @see Notification#bigContentView 2340f021758934b35e3b842c6799344531d7ea2969daChris Wren */ 2341f021758934b35e3b842c6799344531d7ea2969daChris Wren public static class InboxStyle extends Style { 2342f021758934b35e3b842c6799344531d7ea2969daChris Wren ArrayList<CharSequence> mTexts = new ArrayList<CharSequence>(); 2343f021758934b35e3b842c6799344531d7ea2969daChris Wren 2344f021758934b35e3b842c6799344531d7ea2969daChris Wren public InboxStyle() { 2345f021758934b35e3b842c6799344531d7ea2969daChris Wren } 2346f021758934b35e3b842c6799344531d7ea2969daChris Wren 2347f021758934b35e3b842c6799344531d7ea2969daChris Wren public InboxStyle(Builder builder) { 2348f021758934b35e3b842c6799344531d7ea2969daChris Wren setBuilder(builder); 2349f021758934b35e3b842c6799344531d7ea2969daChris Wren } 2350f021758934b35e3b842c6799344531d7ea2969daChris Wren 2351f021758934b35e3b842c6799344531d7ea2969daChris Wren /** 2352f021758934b35e3b842c6799344531d7ea2969daChris Wren * Overrides ContentTitle in the big form of the template. 2353f021758934b35e3b842c6799344531d7ea2969daChris Wren * This defaults to the value passed to setContentTitle(). 2354f021758934b35e3b842c6799344531d7ea2969daChris Wren */ 2355f021758934b35e3b842c6799344531d7ea2969daChris Wren public InboxStyle setBigContentTitle(CharSequence title) { 235624c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer mBigContentTitle = Builder.limitCharSequenceLength(title); 2357f021758934b35e3b842c6799344531d7ea2969daChris Wren return this; 2358f021758934b35e3b842c6799344531d7ea2969daChris Wren } 2359f021758934b35e3b842c6799344531d7ea2969daChris Wren 2360f021758934b35e3b842c6799344531d7ea2969daChris Wren /** 2361f021758934b35e3b842c6799344531d7ea2969daChris Wren * Set the first line of text after the detail section in the big form of the template. 2362f021758934b35e3b842c6799344531d7ea2969daChris Wren */ 2363f021758934b35e3b842c6799344531d7ea2969daChris Wren public InboxStyle setSummaryText(CharSequence cs) { 236424c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer mSummaryText = Builder.limitCharSequenceLength(cs); 2365f021758934b35e3b842c6799344531d7ea2969daChris Wren mSummaryTextSet = true; 2366f021758934b35e3b842c6799344531d7ea2969daChris Wren return this; 2367f021758934b35e3b842c6799344531d7ea2969daChris Wren } 2368f021758934b35e3b842c6799344531d7ea2969daChris Wren 2369b41a213761ff07de2fcfdaf16790fdcca1a1ee1bChris Wren /** 2370b41a213761ff07de2fcfdaf16790fdcca1a1ee1bChris Wren * Append a line to the digest section of the Inbox notification. 2371b41a213761ff07de2fcfdaf16790fdcca1a1ee1bChris Wren */ 2372f021758934b35e3b842c6799344531d7ea2969daChris Wren public InboxStyle addLine(CharSequence cs) { 237324c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer mTexts.add(Builder.limitCharSequenceLength(cs)); 2374f021758934b35e3b842c6799344531d7ea2969daChris Wren return this; 2375f021758934b35e3b842c6799344531d7ea2969daChris Wren } 2376f021758934b35e3b842c6799344531d7ea2969daChris Wren } 2377f021758934b35e3b842c6799344531d7ea2969daChris Wren 2378300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen /** 2379300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen * Structure to encapsulate a named action that can be shown as part of this notification. 2380300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen * It must include an icon, a label, and a {@link PendingIntent} to be fired when the action is 2381300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen * selected by the user. Action buttons won't appear on platforms prior to Android 4.1. 2382300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen * <p> 2383300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen * Apps should use {@link NotificationCompat.Builder#addAction(int, CharSequence, PendingIntent)} 2384300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen * or {@link NotificationCompat.Builder#addAction(NotificationCompat.Action)} 2385300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen * to attach actions. 2386300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen */ 2387ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen public static class Action extends NotificationCompatBase.Action { 2388300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen private final Bundle mExtras; 23892bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen private final RemoteInput[] mRemoteInputs; 2390300828fd69bd2bfcefaf54795d03492938efd971Alex Hills private boolean mAllowGeneratedReplies = false; 2391300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen 2392300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen /** 2393300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen * Small icon representing the action. 2394300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen */ 2395f021758934b35e3b842c6799344531d7ea2969daChris Wren public int icon; 2396300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen /** 2397300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen * Title of the action. 2398300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen */ 2399f021758934b35e3b842c6799344531d7ea2969daChris Wren public CharSequence title; 2400300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen /** 2401300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen * Intent to send when the user invokes this action. May be null, in which case the action 2402300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen * may be rendered in a disabled presentation. 2403300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen */ 2404f021758934b35e3b842c6799344531d7ea2969daChris Wren public PendingIntent actionIntent; 2405f021758934b35e3b842c6799344531d7ea2969daChris Wren 2406300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen public Action(int icon, CharSequence title, PendingIntent intent) { 2407300828fd69bd2bfcefaf54795d03492938efd971Alex Hills this(icon, title, intent, new Bundle(), null, false); 2408300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen } 2409300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen 2410ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen private Action(int icon, CharSequence title, PendingIntent intent, Bundle extras, 2411300828fd69bd2bfcefaf54795d03492938efd971Alex Hills RemoteInput[] remoteInputs, boolean allowGeneratedReplies) { 2412300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen this.icon = icon; 241324c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer this.title = NotificationCompat.Builder.limitCharSequenceLength(title); 2414300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen this.actionIntent = intent; 2415300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen this.mExtras = extras != null ? extras : new Bundle(); 2416ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen this.mRemoteInputs = remoteInputs; 2417300828fd69bd2bfcefaf54795d03492938efd971Alex Hills this.mAllowGeneratedReplies = allowGeneratedReplies; 2418ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen } 2419ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen 2420ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen @Override 242110d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi public int getIcon() { 2422ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen return icon; 2423ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen } 2424ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen 2425ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen @Override 242610d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi public CharSequence getTitle() { 2427ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen return title; 2428ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen } 2429ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen 2430ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen @Override 243110d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi public PendingIntent getActionIntent() { 2432ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen return actionIntent; 2433300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen } 2434300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen 2435300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen /** 2436300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen * Get additional metadata carried around with this Action. 2437300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen */ 24388eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song @Override 2439300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen public Bundle getExtras() { 2440300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen return mExtras; 2441300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen } 2442300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen 2443300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen /** 2444300828fd69bd2bfcefaf54795d03492938efd971Alex Hills * Return whether the platform should automatically generate possible replies for this 2445300828fd69bd2bfcefaf54795d03492938efd971Alex Hills * {@link Action} 2446300828fd69bd2bfcefaf54795d03492938efd971Alex Hills */ 2447300828fd69bd2bfcefaf54795d03492938efd971Alex Hills @Override 2448300828fd69bd2bfcefaf54795d03492938efd971Alex Hills public boolean getAllowGeneratedReplies() { 2449300828fd69bd2bfcefaf54795d03492938efd971Alex Hills return mAllowGeneratedReplies; 2450300828fd69bd2bfcefaf54795d03492938efd971Alex Hills } 2451300828fd69bd2bfcefaf54795d03492938efd971Alex Hills 2452300828fd69bd2bfcefaf54795d03492938efd971Alex Hills /** 2453ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen * Get the list of inputs to be collected from the user when this action is sent. 2454ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen * May return null if no remote inputs were added. 2455ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen */ 24568eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song @Override 2457ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen public RemoteInput[] getRemoteInputs() { 2458ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen return mRemoteInputs; 2459ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen } 2460ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen 2461ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen /** 2462300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen * Builder class for {@link Action} objects. 2463300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen */ 2464ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen public static final class Builder { 2465300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen private final int mIcon; 2466300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen private final CharSequence mTitle; 2467300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen private final PendingIntent mIntent; 2468300828fd69bd2bfcefaf54795d03492938efd971Alex Hills private boolean mAllowGeneratedReplies; 2469300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen private final Bundle mExtras; 2470ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen private ArrayList<RemoteInput> mRemoteInputs; 2471300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen 2472300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen /** 2473300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen * Construct a new builder for {@link Action} object. 2474300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen * @param icon icon to show for this action 2475300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen * @param title the title of the action 2476300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen * @param intent the {@link PendingIntent} to fire when users trigger this action 2477300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen */ 2478300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen public Builder(int icon, CharSequence title, PendingIntent intent) { 2479300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen this(icon, title, intent, new Bundle()); 2480300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen } 2481300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen 2482300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen /** 2483300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen * Construct a new builder for {@link Action} object using the fields from an 2484300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen * {@link Action}. 2485300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen * @param action the action to read fields from. 2486300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen */ 2487300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen public Builder(Action action) { 2488300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen this(action.icon, action.title, action.actionIntent, new Bundle(action.mExtras)); 2489300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen } 2490300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen 2491300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen private Builder(int icon, CharSequence title, PendingIntent intent, Bundle extras) { 2492300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen mIcon = icon; 249324c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer mTitle = NotificationCompat.Builder.limitCharSequenceLength(title); 2494300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen mIntent = intent; 2495300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen mExtras = extras; 2496300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen } 2497300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen 2498300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen /** 2499300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen * Merge additional metadata into this builder. 2500300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen * 2501300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen * <p>Values within the Bundle will replace existing extras values in this Builder. 2502300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen * 2503300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen * @see NotificationCompat.Action#getExtras 2504300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen */ 2505300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen public Builder addExtras(Bundle extras) { 2506300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen if (extras != null) { 2507300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen mExtras.putAll(extras); 2508300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen } 2509300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen return this; 2510300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen } 2511300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen 2512300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen /** 2513300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen * Get the metadata Bundle used by this Builder. 2514300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen * 2515300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen * <p>The returned Bundle is shared with this Builder. 2516300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen */ 2517300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen public Bundle getExtras() { 2518300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen return mExtras; 2519300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen } 2520300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen 2521300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen /** 2522ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen * Add an input to be collected from the user when this action is sent. 2523ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen * Response values can be retrieved from the fired intent by using the 2524ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen * {@link RemoteInput#getResultsFromIntent} function. 2525ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen * @param remoteInput a {@link RemoteInput} to add to the action 2526ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen * @return this object for method chaining 2527ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen */ 2528ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen public Builder addRemoteInput(RemoteInput remoteInput) { 2529ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen if (mRemoteInputs == null) { 2530ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen mRemoteInputs = new ArrayList<RemoteInput>(); 2531ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen } 2532ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen mRemoteInputs.add(remoteInput); 2533ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen return this; 2534ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen } 2535ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen 2536ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen /** 2537300828fd69bd2bfcefaf54795d03492938efd971Alex Hills * Set whether the platform should automatically generate possible replies to add to 2538300828fd69bd2bfcefaf54795d03492938efd971Alex Hills * {@link RemoteInput#getChoices()}. If the {@link Action} doesn't have a 2539300828fd69bd2bfcefaf54795d03492938efd971Alex Hills * {@link RemoteInput}, this has no effect. 2540300828fd69bd2bfcefaf54795d03492938efd971Alex Hills * @param allowGeneratedReplies {@code true} to allow generated replies, {@code false} 2541300828fd69bd2bfcefaf54795d03492938efd971Alex Hills * otherwise 2542300828fd69bd2bfcefaf54795d03492938efd971Alex Hills * @return this object for method chaining 2543300828fd69bd2bfcefaf54795d03492938efd971Alex Hills * The default value is {@code false} 2544300828fd69bd2bfcefaf54795d03492938efd971Alex Hills */ 2545300828fd69bd2bfcefaf54795d03492938efd971Alex Hills public Builder setAllowGeneratedReplies(boolean allowGeneratedReplies) { 2546300828fd69bd2bfcefaf54795d03492938efd971Alex Hills mAllowGeneratedReplies = allowGeneratedReplies; 2547300828fd69bd2bfcefaf54795d03492938efd971Alex Hills return this; 2548300828fd69bd2bfcefaf54795d03492938efd971Alex Hills } 2549300828fd69bd2bfcefaf54795d03492938efd971Alex Hills 2550300828fd69bd2bfcefaf54795d03492938efd971Alex Hills /** 2551ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen * Apply an extender to this action builder. Extenders may be used to add 2552ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen * metadata or change options on this builder. 2553ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen */ 25542bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen public Builder extend(Extender extender) { 25552bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen extender.extend(this); 2556ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen return this; 2557ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen } 2558ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen 2559ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen /** 2560300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen * Combine all of the options that have been set and return a new {@link Action} 2561300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen * object. 2562300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen * @return the built action 2563300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen */ 2564300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen public Action build() { 2565ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen RemoteInput[] remoteInputs = mRemoteInputs != null 2566ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen ? mRemoteInputs.toArray(new RemoteInput[mRemoteInputs.size()]) : null; 2567300828fd69bd2bfcefaf54795d03492938efd971Alex Hills return new Action(mIcon, mTitle, mIntent, mExtras, remoteInputs, 2568300828fd69bd2bfcefaf54795d03492938efd971Alex Hills mAllowGeneratedReplies); 2569300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen } 2570300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen } 2571300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen 25722bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 25732bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen /** 25742bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * Extender interface for use with {@link Builder#extend}. Extenders may be used to add 25752bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * metadata or change options on an action builder. 25762bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen */ 25772bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen public interface Extender { 25782bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen /** 25792bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * Apply this extender to a notification action builder. 25802bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * @param builder the builder to be modified. 25812bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * @return the build object for chaining. 25822bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen */ 25832bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen public Builder extend(Builder builder); 25842bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 25852bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 25862bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen /** 25872bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * Wearable extender for notification actions. To add extensions to an action, 25882bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * create a new {@link NotificationCompat.Action.WearableExtender} object using 25892bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * the {@code WearableExtender()} constructor and apply it to a 25902bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * {@link NotificationCompat.Action.Builder} using 25912bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * {@link NotificationCompat.Action.Builder#extend}. 25922bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * 25932bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * <pre class="prettyprint"> 25942bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * NotificationCompat.Action action = new NotificationCompat.Action.Builder( 25952bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * R.drawable.archive_all, "Archive all", actionIntent) 259633176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen * .extend(new NotificationCompat.Action.WearableExtender() 25972bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * .setAvailableOffline(false)) 259833176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen * .build();</pre> 25992bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen */ 26002bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen public static final class WearableExtender implements Extender { 26012bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen /** Notification action extra which contains wearable extensions */ 26022bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen private static final String EXTRA_WEARABLE_EXTENSIONS = "android.wearable.EXTENSIONS"; 26032bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 26041cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast // Keys within EXTRA_WEARABLE_EXTENSIONS for wearable options. 26052bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen private static final String KEY_FLAGS = "flags"; 26061cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast private static final String KEY_IN_PROGRESS_LABEL = "inProgressLabel"; 26071cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast private static final String KEY_CONFIRM_LABEL = "confirmLabel"; 26081cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast private static final String KEY_CANCEL_LABEL = "cancelLabel"; 26092bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 26102bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen // Flags bitwise-ored to mFlags 26112bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen private static final int FLAG_AVAILABLE_OFFLINE = 0x1; 2612e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills private static final int FLAG_HINT_LAUNCHES_ACTIVITY = 1 << 1; 26136dd2db03b7cde79c5f61ba08ac5387e8c8395513Alex Hills private static final int FLAG_HINT_DISPLAY_INLINE = 1 << 2; 26142bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 26152bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen // Default value for flags integer 26162bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen private static final int DEFAULT_FLAGS = FLAG_AVAILABLE_OFFLINE; 26172bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 26182bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen private int mFlags = DEFAULT_FLAGS; 26192bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 26201cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast private CharSequence mInProgressLabel; 26211cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast private CharSequence mConfirmLabel; 26221cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast private CharSequence mCancelLabel; 26231cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast 26242bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen /** 26252bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * Create a {@link NotificationCompat.Action.WearableExtender} with default 26262bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * options. 26272bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen */ 26282bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen public WearableExtender() { 26292bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 26302bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 26312bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen /** 26322bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * Create a {@link NotificationCompat.Action.WearableExtender} by reading 26332bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * wearable options present in an existing notification action. 26342bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * @param action the notification action to inspect. 26352bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen */ 26362bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen public WearableExtender(Action action) { 26372bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen Bundle wearableBundle = action.getExtras().getBundle(EXTRA_WEARABLE_EXTENSIONS); 26382bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen if (wearableBundle != null) { 26392bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen mFlags = wearableBundle.getInt(KEY_FLAGS, DEFAULT_FLAGS); 26401cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast mInProgressLabel = wearableBundle.getCharSequence(KEY_IN_PROGRESS_LABEL); 26411cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast mConfirmLabel = wearableBundle.getCharSequence(KEY_CONFIRM_LABEL); 26421cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast mCancelLabel = wearableBundle.getCharSequence(KEY_CANCEL_LABEL); 26432bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 26442bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 26452bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 26462bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen /** 26472bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * Apply wearable extensions to a notification action that is being built. This is 26482bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * typically called by the {@link NotificationCompat.Action.Builder#extend} 26492bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * method of {@link NotificationCompat.Action.Builder}. 26502bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen */ 26512bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen @Override 26522bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen public Action.Builder extend(Action.Builder builder) { 26532bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen Bundle wearableBundle = new Bundle(); 26542bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 26552bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen if (mFlags != DEFAULT_FLAGS) { 26562bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen wearableBundle.putInt(KEY_FLAGS, mFlags); 26572bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 26581cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast if (mInProgressLabel != null) { 26591cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast wearableBundle.putCharSequence(KEY_IN_PROGRESS_LABEL, mInProgressLabel); 26601cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast } 26611cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast if (mConfirmLabel != null) { 26621cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast wearableBundle.putCharSequence(KEY_CONFIRM_LABEL, mConfirmLabel); 26631cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast } 26641cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast if (mCancelLabel != null) { 26651cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast wearableBundle.putCharSequence(KEY_CANCEL_LABEL, mCancelLabel); 26661cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast } 26672bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 26682bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen builder.getExtras().putBundle(EXTRA_WEARABLE_EXTENSIONS, wearableBundle); 26692bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen return builder; 26702bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 26712bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 26722bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen @Override 26732bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen public WearableExtender clone() { 26742bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen WearableExtender that = new WearableExtender(); 26752bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen that.mFlags = this.mFlags; 26761cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast that.mInProgressLabel = this.mInProgressLabel; 26771cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast that.mConfirmLabel = this.mConfirmLabel; 26781cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast that.mCancelLabel = this.mCancelLabel; 26792bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen return that; 26802bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 26812bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 26822bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen /** 26832bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * Set whether this action is available when the wearable device is not connected to 26842bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * a companion device. The user can still trigger this action when the wearable device 26852bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * is offline, but a visual hint will indicate that the action may not be available. 26862bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * Defaults to true. 26872bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen */ 26882bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen public WearableExtender setAvailableOffline(boolean availableOffline) { 26892bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen setFlag(FLAG_AVAILABLE_OFFLINE, availableOffline); 26902bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen return this; 26912bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 26922bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 26932bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen /** 26942bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * Get whether this action is available when the wearable device is not connected to 26952bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * a companion device. The user can still trigger this action when the wearable device 26962bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * is offline, but a visual hint will indicate that the action may not be available. 26972bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * Defaults to true. 26982bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen */ 26992bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen public boolean isAvailableOffline() { 27002bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen return (mFlags & FLAG_AVAILABLE_OFFLINE) != 0; 27012bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 27022bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 27032bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen private void setFlag(int mask, boolean value) { 27042bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen if (value) { 27052bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen mFlags |= mask; 27062bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } else { 27072bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen mFlags &= ~mask; 27082bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 27092bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 27101cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast 27111cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast /** 27121cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast * Set a label to display while the wearable is preparing to automatically execute the 27131cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast * action. This is usually a 'ing' verb ending in ellipsis like "Sending..." 27141cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast * 27151cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast * @param label the label to display while the action is being prepared to execute 27161cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast * @return this object for method chaining 27171cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast */ 27181cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast public WearableExtender setInProgressLabel(CharSequence label) { 27191cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast mInProgressLabel = label; 27201cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast return this; 27211cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast } 27221cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast 27231cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast /** 27241cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast * Get the label to display while the wearable is preparing to automatically execute 27251cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast * the action. This is usually a 'ing' verb ending in ellipsis like "Sending..." 27261cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast * 27271cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast * @return the label to display while the action is being prepared to execute 27281cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast */ 27291cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast public CharSequence getInProgressLabel() { 27301cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast return mInProgressLabel; 27311cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast } 27321cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast 27331cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast /** 27341cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast * Set a label to display to confirm that the action should be executed. 27351cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast * This is usually an imperative verb like "Send". 27361cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast * 27371cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast * @param label the label to confirm the action should be executed 27381cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast * @return this object for method chaining 27391cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast */ 27401cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast public WearableExtender setConfirmLabel(CharSequence label) { 27411cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast mConfirmLabel = label; 27421cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast return this; 27431cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast } 27441cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast 27451cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast /** 27461cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast * Get the label to display to confirm that the action should be executed. 27471cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast * This is usually an imperative verb like "Send". 27481cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast * 27491cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast * @return the label to confirm the action should be executed 27501cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast */ 27511cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast public CharSequence getConfirmLabel() { 27521cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast return mConfirmLabel; 27531cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast } 27541cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast 27551cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast /** 27561cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast * Set a label to display to cancel the action. 27571cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast * This is usually an imperative verb, like "Cancel". 27581cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast * 27591cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast * @param label the label to display to cancel the action 27601cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast * @return this object for method chaining 27611cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast */ 27621cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast public WearableExtender setCancelLabel(CharSequence label) { 27631cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast mCancelLabel = label; 27641cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast return this; 27651cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast } 27661cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast 27671cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast /** 27681cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast * Get the label to display to cancel the action. 27691cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast * This is usually an imperative verb like "Cancel". 27701cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast * 27711cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast * @return the label to display to cancel the action 27721cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast */ 27731cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast public CharSequence getCancelLabel() { 27741cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast return mCancelLabel; 27751cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast } 2776e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills 2777e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills /** 2778e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills * Set a hint that this Action will launch an {@link Activity} directly, telling the 2779e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills * platform that it can generate the appropriate transitions. 2780e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills * @param hintLaunchesActivity {@code true} if the content intent will launch 2781e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills * an activity and transitions should be generated, false otherwise. 2782e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills * @return this object for method chaining 2783e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills */ 2784e487f46ffcf6026b2b8e1c5220e3a86067a85e90Alex Hills public WearableExtender setHintLaunchesActivity( 2785e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills boolean hintLaunchesActivity) { 2786e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills setFlag(FLAG_HINT_LAUNCHES_ACTIVITY, hintLaunchesActivity); 2787e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills return this; 2788e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills } 2789e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills 2790e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills /** 2791e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills * Get a hint that this Action will launch an {@link Activity} directly, telling the 2792e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills * platform that it can generate the appropriate transitions 2793e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills * @return {@code true} if the content intent will launch an activity and transitions 2794e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills * should be generated, false otherwise. The default value is {@code false} if this was 2795e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills * never set. 2796e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills */ 2797e487f46ffcf6026b2b8e1c5220e3a86067a85e90Alex Hills public boolean getHintLaunchesActivity() { 2798e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills return (mFlags & FLAG_HINT_LAUNCHES_ACTIVITY) != 0; 2799e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills } 28006dd2db03b7cde79c5f61ba08ac5387e8c8395513Alex Hills 28016dd2db03b7cde79c5f61ba08ac5387e8c8395513Alex Hills /** 28022847bad82ad07175d98912009b22838d47cd8376Alex Hills * Set a hint that this Action should be displayed inline - i.e. it will have a visual 28032847bad82ad07175d98912009b22838d47cd8376Alex Hills * representation directly on the notification surface in addition to the expanded 28042847bad82ad07175d98912009b22838d47cd8376Alex Hills * Notification 28056dd2db03b7cde79c5f61ba08ac5387e8c8395513Alex Hills * 28066dd2db03b7cde79c5f61ba08ac5387e8c8395513Alex Hills * @param hintDisplayInline {@code true} if action should be displayed inline, false 28076dd2db03b7cde79c5f61ba08ac5387e8c8395513Alex Hills * otherwise 28086dd2db03b7cde79c5f61ba08ac5387e8c8395513Alex Hills * @return this object for method chaining 28096dd2db03b7cde79c5f61ba08ac5387e8c8395513Alex Hills */ 28106dd2db03b7cde79c5f61ba08ac5387e8c8395513Alex Hills public WearableExtender setHintDisplayActionInline( 28116dd2db03b7cde79c5f61ba08ac5387e8c8395513Alex Hills boolean hintDisplayInline) { 28126dd2db03b7cde79c5f61ba08ac5387e8c8395513Alex Hills setFlag(FLAG_HINT_DISPLAY_INLINE, hintDisplayInline); 28136dd2db03b7cde79c5f61ba08ac5387e8c8395513Alex Hills return this; 28146dd2db03b7cde79c5f61ba08ac5387e8c8395513Alex Hills } 28156dd2db03b7cde79c5f61ba08ac5387e8c8395513Alex Hills 28166dd2db03b7cde79c5f61ba08ac5387e8c8395513Alex Hills /** 28172847bad82ad07175d98912009b22838d47cd8376Alex Hills * Get a hint that this Action should be displayed inline - i.e. it should have a 28182847bad82ad07175d98912009b22838d47cd8376Alex Hills * visual representation directly on the notification surface in addition to the 28192847bad82ad07175d98912009b22838d47cd8376Alex Hills * expanded Notification 28206dd2db03b7cde79c5f61ba08ac5387e8c8395513Alex Hills * 28216dd2db03b7cde79c5f61ba08ac5387e8c8395513Alex Hills * @return {@code true} if the Action should be displayed inline, {@code false} 28226dd2db03b7cde79c5f61ba08ac5387e8c8395513Alex Hills * otherwise. The default value is {@code false} if this was never set. 28236dd2db03b7cde79c5f61ba08ac5387e8c8395513Alex Hills */ 28246dd2db03b7cde79c5f61ba08ac5387e8c8395513Alex Hills public boolean getHintDisplayActionInline() { 28256dd2db03b7cde79c5f61ba08ac5387e8c8395513Alex Hills return (mFlags & FLAG_HINT_DISPLAY_INLINE) != 0; 28266dd2db03b7cde79c5f61ba08ac5387e8c8395513Alex Hills } 28272bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 28282bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 2829ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen /** @hide */ 2830ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen public static final Factory FACTORY = new Factory() { 2831ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen @Override 2832300828fd69bd2bfcefaf54795d03492938efd971Alex Hills public NotificationCompatBase.Action build(int icon, CharSequence title, 2833ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen PendingIntent actionIntent, Bundle extras, 2834300828fd69bd2bfcefaf54795d03492938efd971Alex Hills RemoteInputCompatBase.RemoteInput[] remoteInputs, 2835300828fd69bd2bfcefaf54795d03492938efd971Alex Hills boolean allowGeneratedReplies) { 2836ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen return new Action(icon, title, actionIntent, extras, 2837300828fd69bd2bfcefaf54795d03492938efd971Alex Hills (RemoteInput[]) remoteInputs, allowGeneratedReplies); 2838ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen } 2839300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen 2840ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen @Override 2841ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen public Action[] newArray(int length) { 2842ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen return new Action[length]; 2843ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen } 2844ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen }; 2845c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell } 2846b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen 28472bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 28482bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen /** 28492bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * Extender interface for use with {@link Builder#extend}. Extenders may be used to add 28502bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * metadata or change options on a notification builder. 28512bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen */ 28522bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen public interface Extender { 28532bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen /** 28542bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * Apply this extender to a notification builder. 28552bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * @param builder the builder to be modified. 28562bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * @return the build object for chaining. 28572bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen */ 28582bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen public Builder extend(Builder builder); 28592bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 28602bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 28612bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen /** 28622bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * Helper class to add wearable extensions to notifications. 28632bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * <p class="note"> See 28642bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * <a href="{@docRoot}wear/notifications/creating.html">Creating Notifications 28652bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * for Android Wear</a> for more information on how to use this class. 28662bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * <p> 28672bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * To create a notification with wearable extensions: 28682bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * <ol> 28692bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * <li>Create a {@link NotificationCompat.Builder}, setting any desired 28702bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * properties. 28712bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * <li>Create a {@link NotificationCompat.WearableExtender}. 28722bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * <li>Set wearable-specific properties using the 28732bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * {@code add} and {@code set} methods of {@link NotificationCompat.WearableExtender}. 28742bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * <li>Call {@link NotificationCompat.Builder#extend} to apply the extensions to a 28752bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * notification. 28762bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * <li>Post the notification to the notification 28772bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * system with the {@code NotificationManagerCompat.notify(...)} methods 28782bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * and not the {@code NotificationManager.notify(...)} methods. 28792bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * </ol> 28802bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * 28812bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * <pre class="prettyprint"> 28822bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * Notification notif = new NotificationCompat.Builder(mContext) 28832bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * .setContentTitle("New mail from " + sender.toString()) 28842bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * .setContentText(subject) 28852bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * .setSmallIcon(R.drawable.new_mail) 28862bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * .extend(new NotificationCompat.WearableExtender() 28872bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * .setContentIcon(R.drawable.new_mail)) 28882bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * .build(); 28892bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * NotificationManagerCompat.from(mContext).notify(0, notif);</pre> 28902bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * 28912bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * <p>Wearable extensions can be accessed on an existing notification by using the 28922bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * {@code WearableExtender(Notification)} constructor, 28932bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * and then using the {@code get} methods to access values. 28942bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * 28952bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * <pre class="prettyprint"> 28962bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * NotificationCompat.WearableExtender wearableExtender = 28972bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * new NotificationCompat.WearableExtender(notification); 289833176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen * List<Notification> pages = wearableExtender.getPages();</pre> 28992bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen */ 29002bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen public static final class WearableExtender implements Extender { 29012bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen /** 29022bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * Sentinel value for an action index that is unset. 29032bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen */ 29042bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen public static final int UNSET_ACTION_INDEX = -1; 29052bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 29062bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen /** 29072bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * Size value for use with {@link #setCustomSizePreset} to show this notification with 29082bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * default sizing. 29092bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * <p>For custom display notifications created using {@link #setDisplayIntent}, 291015cb52e3a9d304154149f4ca1fa836ac15dc897bPaul Soulos * the default is {@link #SIZE_MEDIUM}. All other notifications size automatically based 29112bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * on their content. 29122bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen */ 29132bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen public static final int SIZE_DEFAULT = 0; 29142bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 29152bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen /** 29162bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * Size value for use with {@link #setCustomSizePreset} to show this notification 29172bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * with an extra small size. 29182bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * <p>This value is only applicable for custom display notifications created using 29192bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * {@link #setDisplayIntent}. 29202bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen */ 29212bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen public static final int SIZE_XSMALL = 1; 29222bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 29232bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen /** 29242bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * Size value for use with {@link #setCustomSizePreset} to show this notification 29252bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * with a small size. 29262bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * <p>This value is only applicable for custom display notifications created using 29272bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * {@link #setDisplayIntent}. 29282bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen */ 29292bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen public static final int SIZE_SMALL = 2; 29302bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 29312bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen /** 29322bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * Size value for use with {@link #setCustomSizePreset} to show this notification 29332bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * with a medium size. 29342bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * <p>This value is only applicable for custom display notifications created using 29352bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * {@link #setDisplayIntent}. 29362bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen */ 29372bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen public static final int SIZE_MEDIUM = 3; 29382bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 29392bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen /** 29402bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * Size value for use with {@link #setCustomSizePreset} to show this notification 29412bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * with a large size. 29422bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * <p>This value is only applicable for custom display notifications created using 29432bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * {@link #setDisplayIntent}. 29442bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen */ 29452bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen public static final int SIZE_LARGE = 4; 29462bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 2947fd5d0d05e9b44fcb0a9dab91290d53b464fc0939Griff Hazen /** 2948fd5d0d05e9b44fcb0a9dab91290d53b464fc0939Griff Hazen * Size value for use with {@link #setCustomSizePreset} to show this notification 2949fd5d0d05e9b44fcb0a9dab91290d53b464fc0939Griff Hazen * full screen. 2950fd5d0d05e9b44fcb0a9dab91290d53b464fc0939Griff Hazen * <p>This value is only applicable for custom display notifications created using 2951fd5d0d05e9b44fcb0a9dab91290d53b464fc0939Griff Hazen * {@link #setDisplayIntent}. 2952fd5d0d05e9b44fcb0a9dab91290d53b464fc0939Griff Hazen */ 2953fd5d0d05e9b44fcb0a9dab91290d53b464fc0939Griff Hazen public static final int SIZE_FULL_SCREEN = 5; 2954fd5d0d05e9b44fcb0a9dab91290d53b464fc0939Griff Hazen 2955c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen /** 2956c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen * Sentinel value for use with {@link #setHintScreenTimeout} to keep the screen on for a 2957c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen * short amount of time when this notification is displayed on the screen. This 2958c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen * is the default value. 2959c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen */ 2960c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen public static final int SCREEN_TIMEOUT_SHORT = 0; 2961c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen 2962c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen /** 2963c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen * Sentinel value for use with {@link #setHintScreenTimeout} to keep the screen on 2964c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen * for a longer amount of time when this notification is displayed on the screen. 2965c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen */ 2966c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen public static final int SCREEN_TIMEOUT_LONG = -1; 2967c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen 29682bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen /** Notification extra which contains wearable extensions */ 29692bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen private static final String EXTRA_WEARABLE_EXTENSIONS = "android.wearable.EXTENSIONS"; 29702bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 29711cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast // Keys within EXTRA_WEARABLE_EXTENSIONS for wearable options. 29722bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen private static final String KEY_ACTIONS = "actions"; 29732bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen private static final String KEY_FLAGS = "flags"; 29742bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen private static final String KEY_DISPLAY_INTENT = "displayIntent"; 29752bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen private static final String KEY_PAGES = "pages"; 29762bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen private static final String KEY_BACKGROUND = "background"; 29772bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen private static final String KEY_CONTENT_ICON = "contentIcon"; 29782bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen private static final String KEY_CONTENT_ICON_GRAVITY = "contentIconGravity"; 29792bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen private static final String KEY_CONTENT_ACTION_INDEX = "contentActionIndex"; 29802bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen private static final String KEY_CUSTOM_SIZE_PRESET = "customSizePreset"; 29812bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen private static final String KEY_CUSTOM_CONTENT_HEIGHT = "customContentHeight"; 29822bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen private static final String KEY_GRAVITY = "gravity"; 2983c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen private static final String KEY_HINT_SCREEN_TIMEOUT = "hintScreenTimeout"; 298411ae0cf88a236c2be6a043314c7a67e888db10a8Nadia Benbernou private static final String KEY_DISMISSAL_ID = "dismissalId"; 29852bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 29862bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen // Flags bitwise-ored to mFlags 29872bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen private static final int FLAG_CONTENT_INTENT_AVAILABLE_OFFLINE = 0x1; 29882bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen private static final int FLAG_HINT_HIDE_ICON = 1 << 1; 29892bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen private static final int FLAG_HINT_SHOW_BACKGROUND_ONLY = 1 << 2; 29902bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen private static final int FLAG_START_SCROLL_BOTTOM = 1 << 3; 2991c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen private static final int FLAG_HINT_AVOID_BACKGROUND_CLIPPING = 1 << 4; 2992377a53b843a0787e9f760dc1898bcabe50236321Alex Hills private static final int FLAG_BIG_PICTURE_AMBIENT = 1 << 5; 2993e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills private static final int FLAG_HINT_CONTENT_INTENT_LAUNCHES_ACTIVITY = 1 << 6; 29942bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 29952bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen // Default value for flags integer 29962bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen private static final int DEFAULT_FLAGS = FLAG_CONTENT_INTENT_AVAILABLE_OFFLINE; 29972bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 29982bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen private static final int DEFAULT_CONTENT_ICON_GRAVITY = GravityCompat.END; 29992bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen private static final int DEFAULT_GRAVITY = Gravity.BOTTOM; 30002bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 30012bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen private ArrayList<Action> mActions = new ArrayList<Action>(); 30022bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen private int mFlags = DEFAULT_FLAGS; 30032bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen private PendingIntent mDisplayIntent; 30042bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen private ArrayList<Notification> mPages = new ArrayList<Notification>(); 30052bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen private Bitmap mBackground; 30062bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen private int mContentIcon; 30072bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen private int mContentIconGravity = DEFAULT_CONTENT_ICON_GRAVITY; 30082bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen private int mContentActionIndex = UNSET_ACTION_INDEX; 30092bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen private int mCustomSizePreset = SIZE_DEFAULT; 30102bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen private int mCustomContentHeight; 30112bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen private int mGravity = DEFAULT_GRAVITY; 3012c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen private int mHintScreenTimeout; 301311ae0cf88a236c2be6a043314c7a67e888db10a8Nadia Benbernou private String mDismissalId; 30142bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 30152bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen /** 30162bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * Create a {@link NotificationCompat.WearableExtender} with default 30172bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * options. 30182bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen */ 30192bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen public WearableExtender() { 30202bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 30212bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 30222bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen public WearableExtender(Notification notif) { 30232bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen Bundle extras = getExtras(notif); 30242bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen Bundle wearableBundle = extras != null ? extras.getBundle(EXTRA_WEARABLE_EXTENSIONS) 30252bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen : null; 30262bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen if (wearableBundle != null) { 30272bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen Action[] actions = IMPL.getActionsFromParcelableArrayList( 30282bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen wearableBundle.getParcelableArrayList(KEY_ACTIONS)); 30292bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen if (actions != null) { 30302bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen Collections.addAll(mActions, actions); 30312bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 30322bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 30332bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen mFlags = wearableBundle.getInt(KEY_FLAGS, DEFAULT_FLAGS); 30342bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen mDisplayIntent = wearableBundle.getParcelable(KEY_DISPLAY_INTENT); 30352bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 30362bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen Notification[] pages = getNotificationArrayFromBundle( 30372bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen wearableBundle, KEY_PAGES); 30382bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen if (pages != null) { 30392bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen Collections.addAll(mPages, pages); 30402bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 30412bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 30422bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen mBackground = wearableBundle.getParcelable(KEY_BACKGROUND); 30432bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen mContentIcon = wearableBundle.getInt(KEY_CONTENT_ICON); 30442bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen mContentIconGravity = wearableBundle.getInt(KEY_CONTENT_ICON_GRAVITY, 30452bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen DEFAULT_CONTENT_ICON_GRAVITY); 30462bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen mContentActionIndex = wearableBundle.getInt(KEY_CONTENT_ACTION_INDEX, 30472bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen UNSET_ACTION_INDEX); 30482bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen mCustomSizePreset = wearableBundle.getInt(KEY_CUSTOM_SIZE_PRESET, 30492bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen SIZE_DEFAULT); 30502bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen mCustomContentHeight = wearableBundle.getInt(KEY_CUSTOM_CONTENT_HEIGHT); 30512bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen mGravity = wearableBundle.getInt(KEY_GRAVITY, DEFAULT_GRAVITY); 3052c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen mHintScreenTimeout = wearableBundle.getInt(KEY_HINT_SCREEN_TIMEOUT); 305311ae0cf88a236c2be6a043314c7a67e888db10a8Nadia Benbernou mDismissalId = wearableBundle.getString(KEY_DISMISSAL_ID); 30542bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 30552bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 30562bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 30572bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen /** 30582bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * Apply wearable extensions to a notification that is being built. This is typically 30592bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * called by the {@link NotificationCompat.Builder#extend} method of 30602bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * {@link NotificationCompat.Builder}. 30612bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen */ 30622bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen @Override 30632bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen public NotificationCompat.Builder extend(NotificationCompat.Builder builder) { 30642bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen Bundle wearableBundle = new Bundle(); 30652bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 30662bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen if (!mActions.isEmpty()) { 30672bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen wearableBundle.putParcelableArrayList(KEY_ACTIONS, 30682bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen IMPL.getParcelableArrayListForActions(mActions.toArray( 30692bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen new Action[mActions.size()]))); 30702bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 30712bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen if (mFlags != DEFAULT_FLAGS) { 30722bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen wearableBundle.putInt(KEY_FLAGS, mFlags); 30732bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 30742bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen if (mDisplayIntent != null) { 30752bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen wearableBundle.putParcelable(KEY_DISPLAY_INTENT, mDisplayIntent); 30762bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 30772bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen if (!mPages.isEmpty()) { 30782bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen wearableBundle.putParcelableArray(KEY_PAGES, mPages.toArray( 30792bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen new Notification[mPages.size()])); 30802bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 30812bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen if (mBackground != null) { 30822bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen wearableBundle.putParcelable(KEY_BACKGROUND, mBackground); 30832bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 30842bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen if (mContentIcon != 0) { 30852bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen wearableBundle.putInt(KEY_CONTENT_ICON, mContentIcon); 30862bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 30872bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen if (mContentIconGravity != DEFAULT_CONTENT_ICON_GRAVITY) { 30882bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen wearableBundle.putInt(KEY_CONTENT_ICON_GRAVITY, mContentIconGravity); 30892bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 30902bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen if (mContentActionIndex != UNSET_ACTION_INDEX) { 30912bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen wearableBundle.putInt(KEY_CONTENT_ACTION_INDEX, 30922bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen mContentActionIndex); 30932bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 30942bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen if (mCustomSizePreset != SIZE_DEFAULT) { 30952bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen wearableBundle.putInt(KEY_CUSTOM_SIZE_PRESET, mCustomSizePreset); 30962bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 30972bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen if (mCustomContentHeight != 0) { 30982bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen wearableBundle.putInt(KEY_CUSTOM_CONTENT_HEIGHT, mCustomContentHeight); 30992bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 31002bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen if (mGravity != DEFAULT_GRAVITY) { 31012bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen wearableBundle.putInt(KEY_GRAVITY, mGravity); 31022bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 3103c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen if (mHintScreenTimeout != 0) { 3104c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen wearableBundle.putInt(KEY_HINT_SCREEN_TIMEOUT, mHintScreenTimeout); 3105c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen } 310611ae0cf88a236c2be6a043314c7a67e888db10a8Nadia Benbernou if (mDismissalId != null) { 310711ae0cf88a236c2be6a043314c7a67e888db10a8Nadia Benbernou wearableBundle.putString(KEY_DISMISSAL_ID, mDismissalId); 310811ae0cf88a236c2be6a043314c7a67e888db10a8Nadia Benbernou } 31092bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 31102bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen builder.getExtras().putBundle(EXTRA_WEARABLE_EXTENSIONS, wearableBundle); 31112bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen return builder; 31122bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 31132bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 31142bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen @Override 31152bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen public WearableExtender clone() { 31162bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen WearableExtender that = new WearableExtender(); 31172bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen that.mActions = new ArrayList<Action>(this.mActions); 31182bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen that.mFlags = this.mFlags; 31192bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen that.mDisplayIntent = this.mDisplayIntent; 31202bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen that.mPages = new ArrayList<Notification>(this.mPages); 31212bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen that.mBackground = this.mBackground; 31222bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen that.mContentIcon = this.mContentIcon; 31232bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen that.mContentIconGravity = this.mContentIconGravity; 31242bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen that.mContentActionIndex = this.mContentActionIndex; 31252bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen that.mCustomSizePreset = this.mCustomSizePreset; 31262bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen that.mCustomContentHeight = this.mCustomContentHeight; 31272bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen that.mGravity = this.mGravity; 3128c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen that.mHintScreenTimeout = this.mHintScreenTimeout; 312911ae0cf88a236c2be6a043314c7a67e888db10a8Nadia Benbernou that.mDismissalId = this.mDismissalId; 31302bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen return that; 31312bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 31322bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 31332bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen /** 31342bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * Add a wearable action to this notification. 31352bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * 31362bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * <p>When wearable actions are added using this method, the set of actions that 31372bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * show on a wearable device splits from devices that only show actions added 31382bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * using {@link NotificationCompat.Builder#addAction}. This allows for customization 31392bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * of which actions display on different devices. 31402bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * 31412bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * @param action the action to add to this notification 31422bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * @return this object for method chaining 31432bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * @see NotificationCompat.Action 31442bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen */ 31452bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen public WearableExtender addAction(Action action) { 31462bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen mActions.add(action); 31472bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen return this; 31482bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 31492bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 31502bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen /** 31512bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * Adds wearable actions to this notification. 31522bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * 31532bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * <p>When wearable actions are added using this method, the set of actions that 31542bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * show on a wearable device splits from devices that only show actions added 31552bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * using {@link NotificationCompat.Builder#addAction}. This allows for customization 31562bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * of which actions display on different devices. 31572bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * 31582bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * @param actions the actions to add to this notification 31592bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * @return this object for method chaining 31602bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * @see NotificationCompat.Action 31612bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen */ 31622bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen public WearableExtender addActions(List<Action> actions) { 31632bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen mActions.addAll(actions); 31642bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen return this; 31652bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 31662bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 31672bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen /** 31682bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * Clear all wearable actions present on this builder. 31692bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * @return this object for method chaining. 31702bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * @see #addAction 31712bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen */ 31722bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen public WearableExtender clearActions() { 31732bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen mActions.clear(); 31742bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen return this; 31752bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 31762bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 31772bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen /** 31782bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * Get the wearable actions present on this notification. 31792bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen */ 31802bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen public List<Action> getActions() { 31812bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen return mActions; 31822bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 31832bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 31842bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen /** 31852bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * Set an intent to launch inside of an activity view when displaying 318633176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen * this notification. The {@link PendingIntent} provided should be for an activity. 318733176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen * 318833176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen * <pre class="prettyprint"> 318933176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen * Intent displayIntent = new Intent(context, MyDisplayActivity.class); 319033176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen * PendingIntent displayPendingIntent = PendingIntent.getActivity(context, 319133176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen * 0, displayIntent, PendingIntent.FLAG_UPDATE_CURRENT); 319233176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen * Notification notif = new NotificationCompat.Builder(context) 319333176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen * .extend(new NotificationCompat.WearableExtender() 319433176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen * .setDisplayIntent(displayPendingIntent) 319533176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen * .setCustomSizePreset(NotificationCompat.WearableExtender.SIZE_MEDIUM)) 319633176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen * .build();</pre> 319733176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen * 319833176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen * <p>The activity to launch needs to allow embedding, must be exported, and 3199bc8f49b8cd63e6c24322a013d47e805a8789685eGriff Hazen * should have an empty task affinity. It is also recommended to use the device 3200bc8f49b8cd63e6c24322a013d47e805a8789685eGriff Hazen * default light theme. 320133176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen * 320233176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen * <p>Example AndroidManifest.xml entry: 320333176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen * <pre class="prettyprint"> 320433176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen * <activity android:name="com.example.MyDisplayActivity" 320533176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen * android:exported="true" 320633176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen * android:allowEmbedded="true" 3207bc8f49b8cd63e6c24322a013d47e805a8789685eGriff Hazen * android:taskAffinity="" 3208bc8f49b8cd63e6c24322a013d47e805a8789685eGriff Hazen * android:theme="@android:style/Theme.DeviceDefault.Light" /></pre> 32092bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * 32102bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * @param intent the {@link PendingIntent} for an activity 32112bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * @return this object for method chaining 32122bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * @see NotificationCompat.WearableExtender#getDisplayIntent 32132bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen */ 32142bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen public WearableExtender setDisplayIntent(PendingIntent intent) { 32152bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen mDisplayIntent = intent; 32162bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen return this; 32172bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 32182bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 32192bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen /** 32202bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * Get the intent to launch inside of an activity view when displaying this 32212bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * notification. This {@code PendingIntent} should be for an activity. 32222bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen */ 32232bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen public PendingIntent getDisplayIntent() { 32242bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen return mDisplayIntent; 32252bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 32262bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 32272bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen /** 32282bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * Add an additional page of content to display with this notification. The current 32292bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * notification forms the first page, and pages added using this function form 32302bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * subsequent pages. This field can be used to separate a notification into multiple 32312bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * sections. 32322bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * 32332bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * @param page the notification to add as another page 32342bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * @return this object for method chaining 32352bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * @see NotificationCompat.WearableExtender#getPages 32362bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen */ 32372bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen public WearableExtender addPage(Notification page) { 32382bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen mPages.add(page); 32392bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen return this; 32402bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 32412bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 32422bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen /** 32432bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * Add additional pages of content to display with this notification. The current 32442bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * notification forms the first page, and pages added using this function form 32452bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * subsequent pages. This field can be used to separate a notification into multiple 32462bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * sections. 32472bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * 32482bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * @param pages a list of notifications 32492bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * @return this object for method chaining 32502bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * @see NotificationCompat.WearableExtender#getPages 32512bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen */ 32522bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen public WearableExtender addPages(List<Notification> pages) { 32532bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen mPages.addAll(pages); 32542bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen return this; 32552bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 32562bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 32572bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen /** 32582bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * Clear all additional pages present on this builder. 32592bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * @return this object for method chaining. 32602bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * @see #addPage 32612bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen */ 32622bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen public WearableExtender clearPages() { 32632bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen mPages.clear(); 32642bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen return this; 32652bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 32662bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 32672bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen /** 32682bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * Get the array of additional pages of content for displaying this notification. The 32692bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * current notification forms the first page, and elements within this array form 32702bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * subsequent pages. This field can be used to separate a notification into multiple 32712bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * sections. 32722bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * @return the pages for this notification 32732bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen */ 32742bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen public List<Notification> getPages() { 32752bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen return mPages; 32762bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 32772bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 32782bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen /** 32792bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * Set a background image to be displayed behind the notification content. 32802bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * Contrary to the {@link NotificationCompat.BigPictureStyle}, this background 32812bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * will work with any notification style. 32822bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * 32832bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * @param background the background bitmap 32842bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * @return this object for method chaining 32852bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * @see NotificationCompat.WearableExtender#getBackground 32862bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen */ 32872bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen public WearableExtender setBackground(Bitmap background) { 32882bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen mBackground = background; 32892bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen return this; 32902bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 32912bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 32922bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen /** 32932bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * Get a background image to be displayed behind the notification content. 32942bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * Contrary to the {@link NotificationCompat.BigPictureStyle}, this background 32952bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * will work with any notification style. 32962bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * 32972bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * @return the background image 32982bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * @see NotificationCompat.WearableExtender#setBackground 32992bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen */ 33002bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen public Bitmap getBackground() { 33012bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen return mBackground; 33022bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 33032bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 33042bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen /** 33052bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * Set an icon that goes with the content of this notification. 33062bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen */ 33072bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen public WearableExtender setContentIcon(int icon) { 33082bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen mContentIcon = icon; 33092bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen return this; 33102bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 33112bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 33122bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen /** 33132bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * Get an icon that goes with the content of this notification. 33142bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen */ 33152bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen public int getContentIcon() { 33162bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen return mContentIcon; 33172bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 33182bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 33192bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen /** 33202bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * Set the gravity that the content icon should have within the notification display. 33212bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * Supported values include {@link android.view.Gravity#START} and 33222bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * {@link android.view.Gravity#END}. The default value is {@link android.view.Gravity#END}. 33232bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * @see #setContentIcon 33242bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen */ 33252bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen public WearableExtender setContentIconGravity(int contentIconGravity) { 33262bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen mContentIconGravity = contentIconGravity; 33272bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen return this; 33282bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 33292bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 33302bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen /** 33312bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * Get the gravity that the content icon should have within the notification display. 33322bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * Supported values include {@link android.view.Gravity#START} and 33332bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * {@link android.view.Gravity#END}. The default value is {@link android.view.Gravity#END}. 33342bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * @see #getContentIcon 33352bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen */ 33362bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen public int getContentIconGravity() { 33372bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen return mContentIconGravity; 33382bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 33392bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 33402bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen /** 33412bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * Set an action from this notification's actions to be clickable with the content of 334233176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen * this notification. This action will no longer display separately from the 334333176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen * notification's content. 334433176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen * 334533176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen * <p>For notifications with multiple pages, child pages can also have content actions 334633176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen * set, although the list of available actions comes from the main notification and not 334733176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen * from the child page's notification. 334833176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen * 334933176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen * @param actionIndex The index of the action to hoist onto the current notification page. 335033176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen * If wearable actions were added to the main notification, this index 335133176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen * will apply to that list, otherwise it will apply to the regular 335233176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen * actions list. 33532bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen */ 33542bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen public WearableExtender setContentAction(int actionIndex) { 33552bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen mContentActionIndex = actionIndex; 33562bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen return this; 33572bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 33582bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 33592bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen /** 336033176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen * Get the index of the notification action, if any, that was specified as being clickable 336133176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen * with the content of this notification. This action will no longer display separately 336233176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen * from the notification's content. 336333176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen * 336433176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen * <p>For notifications with multiple pages, child pages can also have content actions 336533176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen * set, although the list of available actions comes from the main notification and not 336633176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen * from the child page's notification. 336733176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen * 336833176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen * <p>If wearable specific actions were added to the main notification, this index will 336933176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen * apply to that list, otherwise it will apply to the regular actions list. 33702bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * 337133176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen * @return the action index or {@link #UNSET_ACTION_INDEX} if no action was selected. 33722bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen */ 33732bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen public int getContentAction() { 33742bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen return mContentActionIndex; 33752bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 33762bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 33772bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen /** 33782bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * Set the gravity that this notification should have within the available viewport space. 33792bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * Supported values include {@link android.view.Gravity#TOP}, 33802bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * {@link android.view.Gravity#CENTER_VERTICAL} and {@link android.view.Gravity#BOTTOM}. 33812bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * The default value is {@link android.view.Gravity#BOTTOM}. 33822bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen */ 33832bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen public WearableExtender setGravity(int gravity) { 33842bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen mGravity = gravity; 33852bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen return this; 33862bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 33872bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 33882bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen /** 33892bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * Get the gravity that this notification should have within the available viewport space. 33902bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * Supported values include {@link android.view.Gravity#TOP}, 33912bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * {@link android.view.Gravity#CENTER_VERTICAL} and {@link android.view.Gravity#BOTTOM}. 33922bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * The default value is {@link android.view.Gravity#BOTTOM}. 33932bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen */ 33942bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen public int getGravity() { 33952bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen return mGravity; 33962bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 33972bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 33982bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen /** 33992bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * Set the custom size preset for the display of this notification out of the available 34002bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * presets found in {@link NotificationCompat.WearableExtender}, e.g. 34012bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * {@link #SIZE_LARGE}. 34022bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * <p>Some custom size presets are only applicable for custom display notifications created 34032bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * using {@link NotificationCompat.WearableExtender#setDisplayIntent}. Check the 34042bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * documentation for the preset in question. See also 34052bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * {@link #setCustomContentHeight} and {@link #getCustomSizePreset}. 34062bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen */ 34072bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen public WearableExtender setCustomSizePreset(int sizePreset) { 34082bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen mCustomSizePreset = sizePreset; 34092bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen return this; 34102bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 34112bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 34122bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen /** 34132bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * Get the custom size preset for the display of this notification out of the available 34142bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * presets found in {@link NotificationCompat.WearableExtender}, e.g. 34152bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * {@link #SIZE_LARGE}. 34162bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * <p>Some custom size presets are only applicable for custom display notifications created 34172bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * using {@link #setDisplayIntent}. Check the documentation for the preset in question. 34182bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * See also {@link #setCustomContentHeight} and {@link #setCustomSizePreset}. 34192bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen */ 34202bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen public int getCustomSizePreset() { 34212bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen return mCustomSizePreset; 34222bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 34232bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 34242bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen /** 34252bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * Set the custom height in pixels for the display of this notification's content. 34262bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * <p>This option is only available for custom display notifications created 34272bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * using {@link NotificationCompat.WearableExtender#setDisplayIntent}. See also 34282bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * {@link NotificationCompat.WearableExtender#setCustomSizePreset} and 34292bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * {@link #getCustomContentHeight}. 34302bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen */ 34312bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen public WearableExtender setCustomContentHeight(int height) { 34322bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen mCustomContentHeight = height; 34332bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen return this; 34342bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 34352bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 34362bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen /** 34372bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * Get the custom height in pixels for the display of this notification's content. 34382bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * <p>This option is only available for custom display notifications created 34392bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * using {@link #setDisplayIntent}. See also {@link #setCustomSizePreset} and 34402bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * {@link #setCustomContentHeight}. 34412bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen */ 34422bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen public int getCustomContentHeight() { 34432bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen return mCustomContentHeight; 34442bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 34452bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 34462bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen /** 34472bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * Set whether the scrolling position for the contents of this notification should start 34482bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * at the bottom of the contents instead of the top when the contents are too long to 34492bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * display within the screen. Default is false (start scroll at the top). 34502bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen */ 34512bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen public WearableExtender setStartScrollBottom(boolean startScrollBottom) { 34522bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen setFlag(FLAG_START_SCROLL_BOTTOM, startScrollBottom); 34532bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen return this; 34542bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 34552bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 34562bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen /** 34572bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * Get whether the scrolling position for the contents of this notification should start 34582bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * at the bottom of the contents instead of the top when the contents are too long to 34592bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * display within the screen. Default is false (start scroll at the top). 34602bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen */ 34612bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen public boolean getStartScrollBottom() { 34622bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen return (mFlags & FLAG_START_SCROLL_BOTTOM) != 0; 34632bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 34642bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 34652bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen /** 34662bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * Set whether the content intent is available when the wearable device is not connected 34672bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * to a companion device. The user can still trigger this intent when the wearable device 34682bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * is offline, but a visual hint will indicate that the content intent may not be available. 34692bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * Defaults to true. 34702bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen */ 34712bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen public WearableExtender setContentIntentAvailableOffline( 34722bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen boolean contentIntentAvailableOffline) { 34732bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen setFlag(FLAG_CONTENT_INTENT_AVAILABLE_OFFLINE, contentIntentAvailableOffline); 34742bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen return this; 34752bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 34762bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 34772bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen /** 34782bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * Get whether the content intent is available when the wearable device is not connected 34792bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * to a companion device. The user can still trigger this intent when the wearable device 34802bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * is offline, but a visual hint will indicate that the content intent may not be available. 34812bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * Defaults to true. 34822bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen */ 34832bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen public boolean getContentIntentAvailableOffline() { 34842bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen return (mFlags & FLAG_CONTENT_INTENT_AVAILABLE_OFFLINE) != 0; 34852bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 34862bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 34872bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen /** 34882bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * Set a hint that this notification's icon should not be displayed. 34892bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * @param hintHideIcon {@code true} to hide the icon, {@code false} otherwise. 34902bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * @return this object for method chaining 34912bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen */ 34922bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen public WearableExtender setHintHideIcon(boolean hintHideIcon) { 34932bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen setFlag(FLAG_HINT_HIDE_ICON, hintHideIcon); 34942bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen return this; 34952bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 34962bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 34972bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen /** 34982bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * Get a hint that this notification's icon should not be displayed. 34992bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * @return {@code true} if this icon should not be displayed, false otherwise. 35002bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * The default value is {@code false} if this was never set. 35012bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen */ 35022bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen public boolean getHintHideIcon() { 35032bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen return (mFlags & FLAG_HINT_HIDE_ICON) != 0; 35042bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 35052bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 35062bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen /** 35072bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * Set a visual hint that only the background image of this notification should be 35082bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * displayed, and other semantic content should be hidden. This hint is only applicable 35092bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * to sub-pages added using {@link #addPage}. 35102bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen */ 35112bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen public WearableExtender setHintShowBackgroundOnly(boolean hintShowBackgroundOnly) { 35122bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen setFlag(FLAG_HINT_SHOW_BACKGROUND_ONLY, hintShowBackgroundOnly); 35132bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen return this; 35142bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 35152bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 35162bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen /** 35172bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * Get a visual hint that only the background image of this notification should be 35182bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * displayed, and other semantic content should be hidden. This hint is only applicable 35192bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * to sub-pages added using {@link NotificationCompat.WearableExtender#addPage}. 35202bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen */ 35212bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen public boolean getHintShowBackgroundOnly() { 35222bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen return (mFlags & FLAG_HINT_SHOW_BACKGROUND_ONLY) != 0; 35232bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 35242bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 3525c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen /** 3526db11b694337b2a9320d7d7a5e156169a08d28a6dGriff Hazen * Set a hint that this notification's background should not be clipped if possible, 3527db11b694337b2a9320d7d7a5e156169a08d28a6dGriff Hazen * and should instead be resized to fully display on the screen, retaining the aspect 3528db11b694337b2a9320d7d7a5e156169a08d28a6dGriff Hazen * ratio of the image. This can be useful for images like barcodes or qr codes. 3529c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen * @param hintAvoidBackgroundClipping {@code true} to avoid clipping if possible. 3530c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen * @return this object for method chaining 3531c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen */ 3532c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen public WearableExtender setHintAvoidBackgroundClipping( 3533c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen boolean hintAvoidBackgroundClipping) { 3534c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen setFlag(FLAG_HINT_AVOID_BACKGROUND_CLIPPING, hintAvoidBackgroundClipping); 3535c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen return this; 3536c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen } 3537c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen 3538c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen /** 3539db11b694337b2a9320d7d7a5e156169a08d28a6dGriff Hazen * Get a hint that this notification's background should not be clipped if possible, 3540db11b694337b2a9320d7d7a5e156169a08d28a6dGriff Hazen * and should instead be resized to fully display on the screen, retaining the aspect 3541db11b694337b2a9320d7d7a5e156169a08d28a6dGriff Hazen * ratio of the image. This can be useful for images like barcodes or qr codes. 3542c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen * @return {@code true} if it's ok if the background is clipped on the screen, false 3543c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen * otherwise. The default value is {@code false} if this was never set. 3544c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen */ 3545c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen public boolean getHintAvoidBackgroundClipping() { 3546c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen return (mFlags & FLAG_HINT_AVOID_BACKGROUND_CLIPPING) != 0; 3547c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen } 3548c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen 3549c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen /** 3550c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen * Set a hint that the screen should remain on for at least this duration when 3551c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen * this notification is displayed on the screen. 3552c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen * @param timeout The requested screen timeout in milliseconds. Can also be either 3553c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen * {@link #SCREEN_TIMEOUT_SHORT} or {@link #SCREEN_TIMEOUT_LONG}. 3554c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen * @return this object for method chaining 3555c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen */ 3556c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen public WearableExtender setHintScreenTimeout(int timeout) { 3557c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen mHintScreenTimeout = timeout; 3558c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen return this; 3559c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen } 3560c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen 3561c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen /** 3562c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen * Get the duration, in milliseconds, that the screen should remain on for 3563c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen * when this notification is displayed. 3564c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen * @return the duration in milliseconds if > 0, or either one of the sentinel values 3565c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen * {@link #SCREEN_TIMEOUT_SHORT} or {@link #SCREEN_TIMEOUT_LONG}. 3566c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen */ 3567c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen public int getHintScreenTimeout() { 3568c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen return mHintScreenTimeout; 3569c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen } 3570c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen 3571e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills /** 3572377a53b843a0787e9f760dc1898bcabe50236321Alex Hills * Set a hint that this notification's {@link BigPictureStyle} (if present) should be 3573377a53b843a0787e9f760dc1898bcabe50236321Alex Hills * converted to low-bit and displayed in ambient mode, especially useful for barcodes and 3574377a53b843a0787e9f760dc1898bcabe50236321Alex Hills * qr codes, as well as other simple black-and-white tickets. 3575377a53b843a0787e9f760dc1898bcabe50236321Alex Hills * @param hintAmbientBigPicture {@code true} to enable converstion and ambient. 3576377a53b843a0787e9f760dc1898bcabe50236321Alex Hills * @return this object for method chaining 3577377a53b843a0787e9f760dc1898bcabe50236321Alex Hills */ 3578377a53b843a0787e9f760dc1898bcabe50236321Alex Hills public WearableExtender setHintAmbientBigPicture(boolean hintAmbientBigPicture) { 3579377a53b843a0787e9f760dc1898bcabe50236321Alex Hills setFlag(FLAG_BIG_PICTURE_AMBIENT, hintAmbientBigPicture); 3580377a53b843a0787e9f760dc1898bcabe50236321Alex Hills return this; 3581377a53b843a0787e9f760dc1898bcabe50236321Alex Hills } 3582377a53b843a0787e9f760dc1898bcabe50236321Alex Hills 3583377a53b843a0787e9f760dc1898bcabe50236321Alex Hills /** 3584377a53b843a0787e9f760dc1898bcabe50236321Alex Hills * Get a hint that this notification's {@link BigPictureStyle} (if present) should be 3585377a53b843a0787e9f760dc1898bcabe50236321Alex Hills * converted to low-bit and displayed in ambient mode, especially useful for barcodes and 3586377a53b843a0787e9f760dc1898bcabe50236321Alex Hills * qr codes, as well as other simple black-and-white tickets. 3587377a53b843a0787e9f760dc1898bcabe50236321Alex Hills * @return {@code true} if it should be displayed in ambient, false otherwise 3588377a53b843a0787e9f760dc1898bcabe50236321Alex Hills * otherwise. The default value is {@code false} if this was never set. 3589377a53b843a0787e9f760dc1898bcabe50236321Alex Hills */ 3590377a53b843a0787e9f760dc1898bcabe50236321Alex Hills public boolean getHintAmbientBigPicture() { 3591377a53b843a0787e9f760dc1898bcabe50236321Alex Hills return (mFlags & FLAG_BIG_PICTURE_AMBIENT) != 0; 3592377a53b843a0787e9f760dc1898bcabe50236321Alex Hills } 3593377a53b843a0787e9f760dc1898bcabe50236321Alex Hills 3594377a53b843a0787e9f760dc1898bcabe50236321Alex Hills /** 3595e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills * Set a hint that this notification's content intent will launch an {@link Activity} 3596e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills * directly, telling the platform that it can generate the appropriate transitions. 3597e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills * @param hintContentIntentLaunchesActivity {@code true} if the content intent will launch 3598e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills * an activity and transitions should be generated, false otherwise. 3599e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills * @return this object for method chaining 3600e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills */ 3601e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills public WearableExtender setHintContentIntentLaunchesActivity( 3602e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills boolean hintContentIntentLaunchesActivity) { 3603e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills setFlag(FLAG_HINT_CONTENT_INTENT_LAUNCHES_ACTIVITY, hintContentIntentLaunchesActivity); 3604e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills return this; 3605e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills } 3606e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills 3607e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills /** 3608e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills * Get a hint that this notification's content intent will launch an {@link Activity} 3609e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills * directly, telling the platform that it can generate the appropriate transitions 3610e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills * @return {@code true} if the content intent will launch an activity and transitions should 3611e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills * be generated, false otherwise. The default value is {@code false} if this was never set. 3612e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills */ 3613e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills public boolean getHintContentIntentLaunchesActivity() { 3614e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills return (mFlags & FLAG_HINT_CONTENT_INTENT_LAUNCHES_ACTIVITY) != 0; 3615e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills } 3616e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills 361711ae0cf88a236c2be6a043314c7a67e888db10a8Nadia Benbernou /** 361811ae0cf88a236c2be6a043314c7a67e888db10a8Nadia Benbernou * When you post a notification, if you set the dismissal id field, then when that 361911ae0cf88a236c2be6a043314c7a67e888db10a8Nadia Benbernou * notification is canceled, notifications on other wearables and the paired Android phone 362011ae0cf88a236c2be6a043314c7a67e888db10a8Nadia Benbernou * having that same dismissal id will also be canceled. Note that this only works if you 362111ae0cf88a236c2be6a043314c7a67e888db10a8Nadia Benbernou * have notification bridge mode set to NO_BRIDGING in your Wear app manifest. See 362211ae0cf88a236c2be6a043314c7a67e888db10a8Nadia Benbernou * <a href="{@docRoot}wear/notifications/index.html">Adding Wearable Features to 362311ae0cf88a236c2be6a043314c7a67e888db10a8Nadia Benbernou * Notifications</a> for more information on how to use the bridge mode feature. 362411ae0cf88a236c2be6a043314c7a67e888db10a8Nadia Benbernou * @param dismissalId the dismissal id of the notification. 362511ae0cf88a236c2be6a043314c7a67e888db10a8Nadia Benbernou * @return this object for method chaining 362611ae0cf88a236c2be6a043314c7a67e888db10a8Nadia Benbernou */ 362711ae0cf88a236c2be6a043314c7a67e888db10a8Nadia Benbernou public WearableExtender setDismissalId(String dismissalId) { 362811ae0cf88a236c2be6a043314c7a67e888db10a8Nadia Benbernou mDismissalId = dismissalId; 362911ae0cf88a236c2be6a043314c7a67e888db10a8Nadia Benbernou return this; 363011ae0cf88a236c2be6a043314c7a67e888db10a8Nadia Benbernou } 363111ae0cf88a236c2be6a043314c7a67e888db10a8Nadia Benbernou 363211ae0cf88a236c2be6a043314c7a67e888db10a8Nadia Benbernou /** 363311ae0cf88a236c2be6a043314c7a67e888db10a8Nadia Benbernou * Returns the dismissal id of the notification. 363411ae0cf88a236c2be6a043314c7a67e888db10a8Nadia Benbernou * @return the dismissal id of the notification or null if it has not been set. 363511ae0cf88a236c2be6a043314c7a67e888db10a8Nadia Benbernou */ 363611ae0cf88a236c2be6a043314c7a67e888db10a8Nadia Benbernou public String getDismissalId() { 363711ae0cf88a236c2be6a043314c7a67e888db10a8Nadia Benbernou return mDismissalId; 363811ae0cf88a236c2be6a043314c7a67e888db10a8Nadia Benbernou } 363911ae0cf88a236c2be6a043314c7a67e888db10a8Nadia Benbernou 36402bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen private void setFlag(int mask, boolean value) { 36412bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen if (value) { 36422bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen mFlags |= mask; 36432bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } else { 36442bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen mFlags &= ~mask; 36452bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 36462bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 36472bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 36482bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 36492bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen /** 36508eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * <p>Helper class to add Android Auto extensions to notifications. To create a notification 36518eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * with car extensions: 36528eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * 36538eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * <ol> 36548eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * <li>Create an {@link NotificationCompat.Builder}, setting any desired 36558eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * properties. 36568eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * <li>Create a {@link CarExtender}. 36578eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * <li>Set car-specific properties using the {@code add} and {@code set} methods of 36588eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * {@link CarExtender}. 36598eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * <li>Call {@link android.support.v4.app.NotificationCompat.Builder#extend(NotificationCompat.Extender)} 36608eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * to apply the extensions to a notification. 36618eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * <li>Post the notification to the notification system with the 36628eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * {@code NotificationManagerCompat.notify(...)} methods and not the 36638eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * {@code NotificationManager.notify(...)} methods. 36648eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * </ol> 36658eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * 36668eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * <pre class="prettyprint"> 36678eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * Notification notification = new NotificationCompat.Builder(context) 36688eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * ... 36698eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * .extend(new CarExtender() 36708eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * .set*(...)) 36718eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * .build(); 36728eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * </pre> 36738eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * 36748eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * <p>Car extensions can be accessed on an existing notification by using the 36758eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * {@code CarExtender(Notification)} constructor, and then using the {@code get} methods 36768eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * to access values. 36778eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song */ 36788eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song public static final class CarExtender implements Extender { 36798eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song private static final String TAG = "CarExtender"; 36808eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song 36818eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song private static final String EXTRA_CAR_EXTENDER = "android.car.EXTENSIONS"; 36828eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song private static final String EXTRA_LARGE_ICON = "large_icon"; 36838eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song private static final String EXTRA_CONVERSATION = "car_conversation"; 36848eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song private static final String EXTRA_COLOR = "app_color"; 36858eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song 36868eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song private Bitmap mLargeIcon; 36878eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song private UnreadConversation mUnreadConversation; 36888eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song private int mColor = NotificationCompat.COLOR_DEFAULT; 36898eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song 36908eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song /** 36918eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * Create a {@link CarExtender} with default options. 36928eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song */ 36938eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song public CarExtender() { 36948eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song } 36958eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song 36968eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song /** 36978eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * Create a {@link CarExtender} from the CarExtender options of an existing Notification. 36988eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * 36998eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * @param notif The notification from which to copy options. 37008eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song */ 37018eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song public CarExtender(Notification notif) { 37028eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song if (Build.VERSION.SDK_INT < 21) { 37038eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song return; 37048eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song } 37058eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song 37068eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song Bundle carBundle = getExtras(notif)==null ? 37078eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song null : getExtras(notif).getBundle(EXTRA_CAR_EXTENDER); 37088eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song if (carBundle != null) { 37098eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song mLargeIcon = carBundle.getParcelable(EXTRA_LARGE_ICON); 37108eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song mColor = carBundle.getInt(EXTRA_COLOR, NotificationCompat.COLOR_DEFAULT); 37118eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song 37128eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song Bundle b = carBundle.getBundle(EXTRA_CONVERSATION); 37138eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song mUnreadConversation = (UnreadConversation) IMPL.getUnreadConversationFromBundle( 37148eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song b, UnreadConversation.FACTORY, RemoteInput.FACTORY); 37158eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song } 37168eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song } 37178eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song 37188eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song /** 37198eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * Apply car extensions to a notification that is being built. This is typically called by 37208eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * the {@link android.support.v4.app.NotificationCompat.Builder#extend(NotificationCompat.Extender)} 37218eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * method of {@link NotificationCompat.Builder}. 37228eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song */ 37238eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song @Override 37248eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song public NotificationCompat.Builder extend(NotificationCompat.Builder builder) { 37258eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song if (Build.VERSION.SDK_INT < 21) { 37268eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song return builder; 37278eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song } 37288eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song 37298eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song Bundle carExtensions = new Bundle(); 37308eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song 37318eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song if (mLargeIcon != null) { 37328eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song carExtensions.putParcelable(EXTRA_LARGE_ICON, mLargeIcon); 37338eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song } 37348eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song if (mColor != NotificationCompat.COLOR_DEFAULT) { 37358eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song carExtensions.putInt(EXTRA_COLOR, mColor); 37368eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song } 37378eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song 37388eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song if (mUnreadConversation != null) { 37398eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song Bundle b = IMPL.getBundleForUnreadConversation(mUnreadConversation); 37408eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song carExtensions.putBundle(EXTRA_CONVERSATION, b); 37418eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song } 37428eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song 37438eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song builder.getExtras().putBundle(EXTRA_CAR_EXTENDER, carExtensions); 37448eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song return builder; 37458eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song } 37468eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song 37478eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song /** 37488eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * Sets the accent color to use when Android Auto presents the notification. 37498eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * 37508eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * Android Auto uses the color set with {@link android.support.v4.app.NotificationCompat.Builder#setColor(int)} 37518eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * to accent the displayed notification. However, not all colors are acceptable in an 37528eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * automotive setting. This method can be used to override the color provided in the 37538eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * notification in such a situation. 37548eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song */ 375570acb0c19be3831a2080e4f902324de16bfbf62eTor Norbye public CarExtender setColor(@ColorInt int color) { 37568eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song mColor = color; 37578eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song return this; 37588eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song } 37598eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song 37608eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song /** 37618eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * Gets the accent color. 37628eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * 3763ac1666bf1cb1e0688943d651c6c759d3f8061af3Julia Reynolds * @see #setColor 37648eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song */ 376570acb0c19be3831a2080e4f902324de16bfbf62eTor Norbye @ColorInt 37668eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song public int getColor() { 37678eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song return mColor; 37688eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song } 37698eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song 37708eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song /** 37718eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * Sets the large icon of the car notification. 37728eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * 37738eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * If no large icon is set in the extender, Android Auto will display the icon 37748eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * specified by {@link android.support.v4.app.NotificationCompat.Builder#setLargeIcon(android.graphics.Bitmap)} 37758eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * 37768eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * @param largeIcon The large icon to use in the car notification. 37778eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * @return This object for method chaining. 37788eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song */ 37798eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song public CarExtender setLargeIcon(Bitmap largeIcon) { 37808eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song mLargeIcon = largeIcon; 37818eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song return this; 37828eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song } 37838eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song 37848eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song /** 37858eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * Gets the large icon used in this car notification, or null if no icon has been set. 37868eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * 37878eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * @return The large icon for the car notification. 37888eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * @see CarExtender#setLargeIcon 37898eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song */ 37908eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song public Bitmap getLargeIcon() { 37918eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song return mLargeIcon; 37928eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song } 37938eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song 37948eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song /** 37958eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * Sets the unread conversation in a message notification. 37968eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * 37978eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * @param unreadConversation The unread part of the conversation this notification conveys. 37988eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * @return This object for method chaining. 37998eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song */ 38008eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song public CarExtender setUnreadConversation(UnreadConversation unreadConversation) { 38018eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song mUnreadConversation = unreadConversation; 38028eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song return this; 38038eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song } 38048eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song 38058eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song /** 38068eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * Returns the unread conversation conveyed by this notification. 38078eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * @see #setUnreadConversation(UnreadConversation) 38088eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song */ 38098eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song public UnreadConversation getUnreadConversation() { 38108eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song return mUnreadConversation; 38118eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song } 38128eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song 38138eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song /** 38148eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * A class which holds the unread messages from a conversation. 38158eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song */ 38168eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song public static class UnreadConversation extends NotificationCompatBase.UnreadConversation { 38178eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song private final String[] mMessages; 38188eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song private final RemoteInput mRemoteInput; 38198eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song private final PendingIntent mReplyPendingIntent; 38208eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song private final PendingIntent mReadPendingIntent; 38218eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song private final String[] mParticipants; 38228eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song private final long mLatestTimestamp; 38238eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song 38248eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song UnreadConversation(String[] messages, RemoteInput remoteInput, 38258eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song PendingIntent replyPendingIntent, PendingIntent readPendingIntent, 38268eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song String[] participants, long latestTimestamp) { 38278eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song mMessages = messages; 38288eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song mRemoteInput = remoteInput; 38298eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song mReadPendingIntent = readPendingIntent; 38308eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song mReplyPendingIntent = replyPendingIntent; 38318eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song mParticipants = participants; 38328eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song mLatestTimestamp = latestTimestamp; 38338eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song } 38348eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song 38358eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song /** 38368eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * Gets the list of messages conveyed by this notification. 38378eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song */ 38388eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song @Override 383905bc3aaa395a0de55ec2e1f30d69bc6d1c18b150Zhen Yu Song public String[] getMessages() { 38408eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song return mMessages; 38418eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song } 38428eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song 38438eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song /** 38448eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * Gets the remote input that will be used to convey the response to a message list, or 38458eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * null if no such remote input exists. 38468eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song */ 38478eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song @Override 384805bc3aaa395a0de55ec2e1f30d69bc6d1c18b150Zhen Yu Song public RemoteInput getRemoteInput() { 38498eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song return mRemoteInput; 38508eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song } 38518eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song 38528eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song /** 38538eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * Gets the pending intent that will be triggered when the user replies to this 38548eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * notification. 38558eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song */ 38568eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song @Override 385705bc3aaa395a0de55ec2e1f30d69bc6d1c18b150Zhen Yu Song public PendingIntent getReplyPendingIntent() { 38588eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song return mReplyPendingIntent; 38598eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song } 38608eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song 38618eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song /** 38628eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * Gets the pending intent that Android Auto will send after it reads aloud all messages 38638eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * in this object's message list. 38648eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song */ 38658eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song @Override 386605bc3aaa395a0de55ec2e1f30d69bc6d1c18b150Zhen Yu Song public PendingIntent getReadPendingIntent() { 38678eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song return mReadPendingIntent; 38688eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song } 38698eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song 38708eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song /** 38718eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * Gets the participants in the conversation. 38728eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song */ 38738eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song @Override 387405bc3aaa395a0de55ec2e1f30d69bc6d1c18b150Zhen Yu Song public String[] getParticipants() { 38758eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song return mParticipants; 38768eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song } 38778eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song 38788eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song /** 38798eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * Gets the firs participant in the conversation. 38808eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song */ 38818eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song @Override 388205bc3aaa395a0de55ec2e1f30d69bc6d1c18b150Zhen Yu Song public String getParticipant() { 38838eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song return mParticipants.length > 0 ? mParticipants[0] : null; 38848eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song } 38858eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song 38868eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song /** 38878eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * Gets the timestamp of the conversation. 38888eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song */ 38898eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song @Override 389005bc3aaa395a0de55ec2e1f30d69bc6d1c18b150Zhen Yu Song public long getLatestTimestamp() { 38918eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song return mLatestTimestamp; 38928eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song } 38938eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song 38948eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song /** @hide */ 38958eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song static final Factory FACTORY = new Factory() { 38968eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song @Override 38978eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song public UnreadConversation build( 38988eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song String[] messages, RemoteInputCompatBase.RemoteInput remoteInput, 38998eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song PendingIntent replyPendingIntent, PendingIntent readPendingIntent, 39008eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song String[] participants, long latestTimestamp) { 39018eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song return new UnreadConversation( 39028eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song messages, (RemoteInput) remoteInput, replyPendingIntent, 39038eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song readPendingIntent, 39048eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song participants, latestTimestamp); 39058eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song } 39068eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song }; 39078eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song 39088eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song /** 39098eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * Builder class for {@link CarExtender.UnreadConversation} objects. 39108eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song */ 39118eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song public static class Builder { 39128eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song private final List<String> mMessages = new ArrayList<String>(); 39138eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song private final String mParticipant; 39148eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song private RemoteInput mRemoteInput; 39158eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song private PendingIntent mReadPendingIntent; 39168eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song private PendingIntent mReplyPendingIntent; 39178eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song private long mLatestTimestamp; 39188eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song 39198eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song /** 39208eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * Constructs a new builder for {@link CarExtender.UnreadConversation}. 39218eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * 39228eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * @param name The name of the other participant in the conversation. 39238eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song */ 39248eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song public Builder(String name) { 39258eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song mParticipant = name; 39268eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song } 39278eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song 39288eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song /** 39298eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * Appends a new unread message to the list of messages for this conversation. 39308eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * 39318eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * The messages should be added from oldest to newest. 39328eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * 39338eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * @param message The text of the new unread message. 39348eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * @return This object for method chaining. 39358eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song */ 39368eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song public Builder addMessage(String message) { 39378eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song mMessages.add(message); 39388eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song return this; 39398eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song } 39408eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song 39418eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song /** 39428eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * Sets the pending intent and remote input which will convey the reply to this 39438eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * notification. 39448eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * 39458eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * @param pendingIntent The pending intent which will be triggered on a reply. 39468eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * @param remoteInput The remote input parcelable which will carry the reply. 39478eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * @return This object for method chaining. 39488eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * 39498eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * @see CarExtender.UnreadConversation#getRemoteInput 39508eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * @see CarExtender.UnreadConversation#getReplyPendingIntent 39518eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song */ 39528eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song public Builder setReplyAction( 39538eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song PendingIntent pendingIntent, RemoteInput remoteInput) { 39548eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song mRemoteInput = remoteInput; 39558eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song mReplyPendingIntent = pendingIntent; 39568eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song 39578eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song return this; 39588eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song } 39598eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song 39608eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song /** 39618eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * Sets the pending intent that will be sent once the messages in this notification 39628eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * are read. 39638eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * 39648eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * @param pendingIntent The pending intent to use. 39658eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * @return This object for method chaining. 39668eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song */ 39678eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song public Builder setReadPendingIntent(PendingIntent pendingIntent) { 39688eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song mReadPendingIntent = pendingIntent; 39698eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song return this; 39708eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song } 39718eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song 39728eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song /** 39738eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * Sets the timestamp of the most recent message in an unread conversation. 39748eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * 39758eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * If a messaging notification has been posted by your application and has not 39768eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * yet been cancelled, posting a later notification with the same id and tag 39778eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * but without a newer timestamp may result in Android Auto not displaying a 39788eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * heads up notification for the later notification. 39798eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * 39808eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * @param timestamp The timestamp of the most recent message in the conversation. 39818eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * @return This object for method chaining. 39828eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song */ 39838eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song public Builder setLatestTimestamp(long timestamp) { 39848eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song mLatestTimestamp = timestamp; 39858eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song return this; 39868eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song } 39878eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song 39888eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song /** 39898eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * Builds a new unread conversation object. 39908eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * 39918eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song * @return The new unread conversation object. 39928eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song */ 39938eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song public UnreadConversation build() { 39948eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song String[] messages = mMessages.toArray(new String[mMessages.size()]); 39958eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song String[] participants = { mParticipant }; 39968eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song return new UnreadConversation(messages, mRemoteInput, mReplyPendingIntent, 39978eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song mReadPendingIntent, participants, mLatestTimestamp); 39988eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song } 39998eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song } 40008eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song } 40018eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song } 40028eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song 40038eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song 40048eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song /** 40052bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * Get an array of Notification objects from a parcelable array bundle field. 40062bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * Update the bundle to have a typed array so fetches in the future don't need 40072bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen * to do an array copy. 40082bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen */ 40092bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen private static Notification[] getNotificationArrayFromBundle(Bundle bundle, String key) { 40102bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen Parcelable[] array = bundle.getParcelableArray(key); 40112bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen if (array instanceof Notification[] || array == null) { 40122bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen return (Notification[]) array; 40132bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 40142bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen Notification[] typedArray = new Notification[array.length]; 40152bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen for (int i = 0; i < array.length; i++) { 40162bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen typedArray[i] = (Notification) array[i]; 40172bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 40182bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen bundle.putParcelableArray(key, typedArray); 40192bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen return typedArray; 40202bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen } 40212bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen 4022b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen /** 4023b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen * Gets the {@link Notification#extras} field from a notification in a backwards 4024b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen * compatible manner. Extras field was supported from JellyBean (Api level 16) 4025b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen * forwards. This function will return null on older api levels. 4026b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen */ 4027b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen public static Bundle getExtras(Notification notif) { 4028b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen return IMPL.getExtras(notif); 4029b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen } 4030b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen 4031b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen /** 4032300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen * Get the number of actions in this notification in a backwards compatible 4033300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen * manner. Actions were supported from JellyBean (Api level 16) forwards. 4034300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen */ 4035300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen public static int getActionCount(Notification notif) { 4036300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen return IMPL.getActionCount(notif); 4037300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen } 4038300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen 4039300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen /** 4040300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen * Get an action on this notification in a backwards compatible 4041300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen * manner. Actions were supported from JellyBean (Api level 16) forwards. 4042300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen * @param notif The notification to inspect. 4043300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen * @param actionIndex The index of the action to retrieve. 4044300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen */ 4045300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen public static Action getAction(Notification notif, int actionIndex) { 4046300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen return IMPL.getAction(notif, actionIndex); 4047300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen } 4048300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen 4049300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen /** 405043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * Get the category of this notification in a backwards compatible 405143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * manner. 405243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills * @param notif The notification to inspect. 405343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills */ 405475e2071f16bae2b22d1618026d10337daad862cfBryan Mawhinney public static String getCategory(Notification notif) { 405575e2071f16bae2b22d1618026d10337daad862cfBryan Mawhinney return IMPL.getCategory(notif); 405675e2071f16bae2b22d1618026d10337daad862cfBryan Mawhinney } 405775e2071f16bae2b22d1618026d10337daad862cfBryan Mawhinney 405875e2071f16bae2b22d1618026d10337daad862cfBryan Mawhinney /** 4059b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen * Get whether or not this notification is only relevant to the current device. 4060b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen * 4061b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen * <p>Some notifications can be bridged to other devices for remote display. 4062b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen * If this hint is set, it is recommend that this notification not be bridged. 4063b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen */ 4064b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen public static boolean getLocalOnly(Notification notif) { 4065b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen return IMPL.getLocalOnly(notif); 4066b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen } 4067ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen 4068ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen /** 4069ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen * Get the key used to group this notification into a cluster or stack 4070ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen * with other notifications on devices which support such rendering. 4071ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen */ 4072ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen public static String getGroup(Notification notif) { 4073ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen return IMPL.getGroup(notif); 4074ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen } 4075ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen 4076ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen /** 4077ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen * Get whether this notification to be the group summary for a group of notifications. 4078ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen * Grouped notifications may display in a cluster or stack on devices which 4079ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen * support such rendering. Requires a group key also be set using {@link Builder#setGroup}. 4080ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen * @return Whether this notification is a group summary. 4081ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen */ 4082ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen public static boolean isGroupSummary(Notification notif) { 4083ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen return IMPL.isGroupSummary(notif); 4084ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen } 4085ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen 4086ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen /** 4087ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen * Get a sort key that orders this notification among other notifications from the 4088ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen * same package. This can be useful if an external sort was already applied and an app 4089ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen * would like to preserve this. Notifications will be sorted lexicographically using this 4090ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen * value, although providing different priorities in addition to providing sort key may 4091ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen * cause this value to be ignored. 4092ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen * 4093ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen * <p>This sort key can also be used to order members of a notification group. See 4094ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen * {@link Builder#setGroup}. 4095ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen * 4096ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen * @see String#compareTo(String) 4097ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen */ 4098ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen public static String getSortKey(Notification notif) { 4099ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen return IMPL.getSortKey(notif); 4100ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen } 4101c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell} 4102