NotificationCompat.java revision 89e6774cdb200acc2dd5f4c9022a7e1aeeb05bce
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
19c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powellimport android.app.Notification;
20c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powellimport android.app.PendingIntent;
21c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powellimport android.content.Context;
22c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powellimport android.graphics.Bitmap;
2369a58d36f6ed8ec4d076534556aba2f93d00254eDan Sandlerimport android.graphics.Color;
24c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powellimport android.media.AudioManager;
25c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powellimport android.net.Uri;
26c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powellimport android.os.Build;
27b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazenimport android.os.Bundle;
282bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazenimport android.os.Parcelable;
292bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazenimport android.support.v4.view.GravityCompat;
302bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazenimport android.view.Gravity;
31c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powellimport android.widget.RemoteViews;
32300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
33f021758934b35e3b842c6799344531d7ea2969daChris Wrenimport java.util.ArrayList;
342bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazenimport java.util.Collections;
352bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazenimport java.util.List;
36c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
37080df8ffb0920eccb300baa39180eb956a000a53Chris Wren/**
38080df8ffb0920eccb300baa39180eb956a000a53Chris Wren * Helper for accessing features in {@link android.app.Notification}
39080df8ffb0920eccb300baa39180eb956a000a53Chris Wren * introduced after API level 4 in a backwards compatible fashion.
40080df8ffb0920eccb300baa39180eb956a000a53Chris Wren */
41c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powellpublic class NotificationCompat {
42c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
43c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
44c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Use all default values (where applicable).
45c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
46c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final int DEFAULT_ALL = ~0;
47c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
48c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
49c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Use the default notification sound. This will ignore any sound set using
50c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * {@link Builder#setSound}
51c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     *
52e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren     * <p>
53e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren     * A notification that is noisy is more likely to be presented as a heads-up notification,
54e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren     * on some platforms.
55e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren     * </p>
56e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren     *
57c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * @see Builder#setDefaults
58c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
59c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final int DEFAULT_SOUND = 1;
60c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
61c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
62c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Use the default notification vibrate. This will ignore any vibrate set using
63c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * {@link Builder#setVibrate}. Using phone vibration requires the
64c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * {@link android.Manifest.permission#VIBRATE VIBRATE} permission.
65c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     *
66e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren     * <p>
67e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren     * A notification that vibrates is more likely to be presented as a heads-up notification,
68e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren     * on some platforms.
69e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren     * </p>
70e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren     *
71c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * @see Builder#setDefaults
72c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
73c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final int DEFAULT_VIBRATE = 2;
74c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
75c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
76c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Use the default notification lights. This will ignore the
77c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * {@link #FLAG_SHOW_LIGHTS} bit, and values set with {@link Builder#setLights}.
78c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     *
79c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * @see Builder#setDefaults
80c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
81c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final int DEFAULT_LIGHTS = 4;
82c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
83c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
84c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Use this constant as the value for audioStreamType to request that
85c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * the default stream type for notifications be used.  Currently the
86c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * default stream type is {@link AudioManager#STREAM_NOTIFICATION}.
87c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
88c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final int STREAM_DEFAULT = -1;
89c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
90c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
91c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Bit set in the Notification flags field when LEDs should be turned on
92c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * for this notification.
93c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
94c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final int FLAG_SHOW_LIGHTS        = 0x00000001;
95c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
96c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
97c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Bit set in the Notification flags field if this notification is in
98c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * reference to something that is ongoing, like a phone call.  It should
99c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * not be set if this notification is in reference to something that
100c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * happened at a particular point in time, like a missed phone call.
101c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
102c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final int FLAG_ONGOING_EVENT      = 0x00000002;
103c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
104c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
105c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Bit set in the Notification flags field if
106c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * the audio will be repeated until the notification is
107c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * cancelled or the notification window is opened.
108c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
109c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final int FLAG_INSISTENT          = 0x00000004;
110c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
111c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
112c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Bit set in the Notification flags field if the notification's sound,
113c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * vibrate and ticker should only be played if the notification is not already showing.
114c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
115c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final int FLAG_ONLY_ALERT_ONCE    = 0x00000008;
116c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
117c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
118c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Bit set in the Notification flags field if the notification should be canceled when
119c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * it is clicked by the user.
120c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
121c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final int FLAG_AUTO_CANCEL        = 0x00000010;
122c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
123c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
124c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Bit set in the Notification flags field if the notification should not be canceled
125c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * when the user clicks the Clear all button.
126c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
127c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final int FLAG_NO_CLEAR           = 0x00000020;
128c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
129c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
130c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Bit set in the Notification flags field if this notification represents a currently
131c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * running service.  This will normally be set for you by
132c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * {@link android.app.Service#startForeground}.
133c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
134c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final int FLAG_FOREGROUND_SERVICE = 0x00000040;
135c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
136c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell    /**
137f021758934b35e3b842c6799344531d7ea2969daChris Wren     * Obsolete flag indicating high-priority notifications; use the priority field instead.
138884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     *
139f021758934b35e3b842c6799344531d7ea2969daChris Wren     * @deprecated Use {@link NotificationCompat.Builder#setPriority(int)} with a positive value.
140c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell     */
141ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    public static final int FLAG_HIGH_PRIORITY      = 0x00000080;
142ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
143ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    /**
144ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     * Bit set in the Notification flags field if this notification is relevant to the current
145ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     * device only and it is not recommended that it bridge to other devices.
146ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     */
147ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    public static final int FLAG_LOCAL_ONLY         = 0x00000100;
148ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
149ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    /**
150ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     * Bit set in the Notification flags field if this notification is the group summary for a
151ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     * group of notifications. Grouped notifications may display in a cluster or stack on devices
152ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     * which support such rendering. Requires a group key also be set using
153ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     * {@link Builder#setGroup}.
154ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     */
155ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    public static final int FLAG_GROUP_SUMMARY      = 0x00000200;
156c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
157f021758934b35e3b842c6799344531d7ea2969daChris Wren    /**
158f021758934b35e3b842c6799344531d7ea2969daChris Wren     * Default notification priority for {@link NotificationCompat.Builder#setPriority(int)}.
159f021758934b35e3b842c6799344531d7ea2969daChris Wren     * If your application does not prioritize its own notifications,
160f021758934b35e3b842c6799344531d7ea2969daChris Wren     * use this value for all notifications.
161f021758934b35e3b842c6799344531d7ea2969daChris Wren     */
162f021758934b35e3b842c6799344531d7ea2969daChris Wren    public static final int PRIORITY_DEFAULT = 0;
163f021758934b35e3b842c6799344531d7ea2969daChris Wren
164f021758934b35e3b842c6799344531d7ea2969daChris Wren    /**
165f021758934b35e3b842c6799344531d7ea2969daChris Wren     * Lower notification priority for {@link NotificationCompat.Builder#setPriority(int)},
166f021758934b35e3b842c6799344531d7ea2969daChris Wren     * for items that are less important. The UI may choose to show
167f021758934b35e3b842c6799344531d7ea2969daChris Wren     * these items smaller, or at a different position in the list,
168f021758934b35e3b842c6799344531d7ea2969daChris Wren     * compared with your app's {@link #PRIORITY_DEFAULT} items.
169f021758934b35e3b842c6799344531d7ea2969daChris Wren     */
170f021758934b35e3b842c6799344531d7ea2969daChris Wren    public static final int PRIORITY_LOW = -1;
171f021758934b35e3b842c6799344531d7ea2969daChris Wren
172f021758934b35e3b842c6799344531d7ea2969daChris Wren    /**
173f021758934b35e3b842c6799344531d7ea2969daChris Wren     * Lowest notification priority for {@link NotificationCompat.Builder#setPriority(int)};
174f021758934b35e3b842c6799344531d7ea2969daChris Wren     * these items might not be shown to the user except under
175f021758934b35e3b842c6799344531d7ea2969daChris Wren     * special circumstances, such as detailed notification logs.
176f021758934b35e3b842c6799344531d7ea2969daChris Wren     */
177f021758934b35e3b842c6799344531d7ea2969daChris Wren    public static final int PRIORITY_MIN = -2;
178f021758934b35e3b842c6799344531d7ea2969daChris Wren
179f021758934b35e3b842c6799344531d7ea2969daChris Wren    /**
180f021758934b35e3b842c6799344531d7ea2969daChris Wren     * Higher notification priority for {@link NotificationCompat.Builder#setPriority(int)},
181f021758934b35e3b842c6799344531d7ea2969daChris Wren     * for more important notifications or alerts. The UI may choose
182f021758934b35e3b842c6799344531d7ea2969daChris Wren     * to show these items larger, or at a different position in
183f021758934b35e3b842c6799344531d7ea2969daChris Wren     * notification lists, compared with your app's {@link #PRIORITY_DEFAULT} items.
184f021758934b35e3b842c6799344531d7ea2969daChris Wren     */
185f021758934b35e3b842c6799344531d7ea2969daChris Wren    public static final int PRIORITY_HIGH = 1;
186f021758934b35e3b842c6799344531d7ea2969daChris Wren
187f021758934b35e3b842c6799344531d7ea2969daChris Wren    /**
188f021758934b35e3b842c6799344531d7ea2969daChris Wren     * Highest notification priority for {@link NotificationCompat.Builder#setPriority(int)},
189f021758934b35e3b842c6799344531d7ea2969daChris Wren     * for your application's most important items that require the user's
190f021758934b35e3b842c6799344531d7ea2969daChris Wren     * prompt attention or input.
191f021758934b35e3b842c6799344531d7ea2969daChris Wren     */
192f021758934b35e3b842c6799344531d7ea2969daChris Wren    public static final int PRIORITY_MAX = 2;
193f021758934b35e3b842c6799344531d7ea2969daChris Wren
194c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
195c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Notification extras key: this is the title of the notification,
196c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * as supplied to {@link Builder#setContentTitle(CharSequence)}.
197c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
198c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final String EXTRA_TITLE = "android.title";
199c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
200c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
201c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Notification extras key: this is the title of the notification when shown in expanded form,
202c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * e.g. as supplied to {@link BigTextStyle#setBigContentTitle(CharSequence)}.
203c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
204c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final String EXTRA_TITLE_BIG = EXTRA_TITLE + ".big";
205c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
206c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
207c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Notification extras key: this is the main text payload, as supplied to
208c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * {@link Builder#setContentText(CharSequence)}.
209c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
210c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final String EXTRA_TEXT = "android.text";
211c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
212c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
213c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Notification extras key: this is a third line of text, as supplied to
214c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * {@link Builder#setSubText(CharSequence)}.
215c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
216c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final String EXTRA_SUB_TEXT = "android.subText";
217c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
218c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
219c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Notification extras key: this is a small piece of additional text as supplied to
220c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * {@link Builder#setContentInfo(CharSequence)}.
221c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
222c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final String EXTRA_INFO_TEXT = "android.infoText";
223c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
224c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
225c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Notification extras key: this is a line of summary information intended to be shown
226c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * alongside expanded notifications, as supplied to (e.g.)
227c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * {@link BigTextStyle#setSummaryText(CharSequence)}.
228c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
229c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final String EXTRA_SUMMARY_TEXT = "android.summaryText";
230c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
231c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
23248d8878e34b0d9983166418378125b63faac9aabGriff Hazen     * Notification extras key: this is the longer text shown in the big form of a
23348d8878e34b0d9983166418378125b63faac9aabGriff Hazen     * {@link BigTextStyle} notification, as supplied to
23448d8878e34b0d9983166418378125b63faac9aabGriff Hazen     * {@link BigTextStyle#bigText(CharSequence)}.
23548d8878e34b0d9983166418378125b63faac9aabGriff Hazen     */
23648d8878e34b0d9983166418378125b63faac9aabGriff Hazen    public static final String EXTRA_BIG_TEXT = "android.bigText";
23748d8878e34b0d9983166418378125b63faac9aabGriff Hazen
23848d8878e34b0d9983166418378125b63faac9aabGriff Hazen    /**
239c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Notification extras key: this is the resource ID of the notification's main small icon, as
240c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * supplied to {@link Builder#setSmallIcon(int)}.
241c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
242c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final String EXTRA_SMALL_ICON = "android.icon";
243c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
244c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
245c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Notification extras key: this is a bitmap to be used instead of the small icon when showing the
246c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * notification payload, as
247c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * supplied to {@link Builder#setLargeIcon(android.graphics.Bitmap)}.
248c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
249c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final String EXTRA_LARGE_ICON = "android.largeIcon";
250c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
251c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
252c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Notification extras key: this is a bitmap to be used instead of the one from
253c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * {@link Builder#setLargeIcon(android.graphics.Bitmap)} when the notification is
254c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * shown in its expanded form, as supplied to
255c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * {@link BigPictureStyle#bigLargeIcon(android.graphics.Bitmap)}.
256c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
257c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final String EXTRA_LARGE_ICON_BIG = EXTRA_LARGE_ICON + ".big";
258c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
259c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
260c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Notification extras key: this is the progress value supplied to
261c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * {@link Builder#setProgress(int, int, boolean)}.
262c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
263c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final String EXTRA_PROGRESS = "android.progress";
264c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
265c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
266c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Notification extras key: this is the maximum value supplied to
267c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * {@link Builder#setProgress(int, int, boolean)}.
268c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
269c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final String EXTRA_PROGRESS_MAX = "android.progressMax";
270c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
271c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
272c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Notification extras key: whether the progress bar is indeterminate, supplied to
273c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * {@link Builder#setProgress(int, int, boolean)}.
274c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
275c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final String EXTRA_PROGRESS_INDETERMINATE = "android.progressIndeterminate";
276c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
277c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
278c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Notification extras key: whether the when field set using {@link Builder#setWhen} should
279c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * be shown as a count-up timer (specifically a {@link android.widget.Chronometer}) instead
280c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * of a timestamp, as supplied to {@link Builder#setUsesChronometer(boolean)}.
281c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
282c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final String EXTRA_SHOW_CHRONOMETER = "android.showChronometer";
283c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
284c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
28548d8878e34b0d9983166418378125b63faac9aabGriff Hazen     * Notification extras key: whether the when field set using {@link Builder#setWhen} should
28648d8878e34b0d9983166418378125b63faac9aabGriff Hazen     * be shown, as supplied to {@link Builder#setShowWhen(boolean)}.
28748d8878e34b0d9983166418378125b63faac9aabGriff Hazen     */
28848d8878e34b0d9983166418378125b63faac9aabGriff Hazen    public static final String EXTRA_SHOW_WHEN = "android.showWhen";
28948d8878e34b0d9983166418378125b63faac9aabGriff Hazen
29048d8878e34b0d9983166418378125b63faac9aabGriff Hazen    /**
291c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Notification extras key: this is a bitmap to be shown in {@link BigPictureStyle} expanded
292c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * notifications, supplied to {@link BigPictureStyle#bigPicture(android.graphics.Bitmap)}.
293c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
294c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final String EXTRA_PICTURE = "android.picture";
295c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
296c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
297c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Notification extras key: An array of CharSequences to show in {@link InboxStyle} expanded
298c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * notifications, each of which was supplied to {@link InboxStyle#addLine(CharSequence)}.
299c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
300c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final String EXTRA_TEXT_LINES = "android.textLines";
301c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
302c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
30341484f326c4dd126e84b26828ba340a8ae9406e8Christoph Studer     * Notification extras key: A string representing the name of the specific
30441484f326c4dd126e84b26828ba340a8ae9406e8Christoph Studer     * {@link android.app.Notification.Style} used to create this notification.
30541484f326c4dd126e84b26828ba340a8ae9406e8Christoph Studer     */
30641484f326c4dd126e84b26828ba340a8ae9406e8Christoph Studer    public static final String EXTRA_TEMPLATE = "android.template";
30741484f326c4dd126e84b26828ba340a8ae9406e8Christoph Studer
30841484f326c4dd126e84b26828ba340a8ae9406e8Christoph Studer    /**
30989e6774cdb200acc2dd5f4c9022a7e1aeeb05bceChris Wren     * Notification extras key: A String array containing the people that this
31089e6774cdb200acc2dd5f4c9022a7e1aeeb05bceChris Wren     * notification relates to, each of which was supplied to
31189e6774cdb200acc2dd5f4c9022a7e1aeeb05bceChris Wren     * {@link Builder#addPerson(String)}.
312c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
313c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final String EXTRA_PEOPLE = "android.people";
314c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
31569a58d36f6ed8ec4d076534556aba2f93d00254eDan Sandler    /**
31641484f326c4dd126e84b26828ba340a8ae9406e8Christoph Studer     * Notification extras key: A
31741484f326c4dd126e84b26828ba340a8ae9406e8Christoph Studer     * {@link android.content.ContentUris content URI} pointing to an image that can be displayed
31841484f326c4dd126e84b26828ba340a8ae9406e8Christoph Studer     * in the background when the notification is selected. The URI must point to an image stream
31941484f326c4dd126e84b26828ba340a8ae9406e8Christoph Studer     * suitable for passing into
32041484f326c4dd126e84b26828ba340a8ae9406e8Christoph Studer     * {@link android.graphics.BitmapFactory#decodeStream(java.io.InputStream)
32141484f326c4dd126e84b26828ba340a8ae9406e8Christoph Studer     * BitmapFactory.decodeStream}; all other content types will be ignored. The content provider
32241484f326c4dd126e84b26828ba340a8ae9406e8Christoph Studer     * URI used for this purpose must require no permissions to read the image data.
32341484f326c4dd126e84b26828ba340a8ae9406e8Christoph Studer     */
32441484f326c4dd126e84b26828ba340a8ae9406e8Christoph Studer    public static final String EXTRA_BACKGROUND_IMAGE_URI = "android.backgroundImageUri";
32541484f326c4dd126e84b26828ba340a8ae9406e8Christoph Studer
32641484f326c4dd126e84b26828ba340a8ae9406e8Christoph Studer    /**
32741484f326c4dd126e84b26828ba340a8ae9406e8Christoph Studer     * Notification key: A
32841484f326c4dd126e84b26828ba340a8ae9406e8Christoph Studer     * {@link android.media.session.MediaSession.Token} associated with a
32941484f326c4dd126e84b26828ba340a8ae9406e8Christoph Studer     * {@link android.app.Notification.MediaStyle} notification.
33041484f326c4dd126e84b26828ba340a8ae9406e8Christoph Studer     */
33141484f326c4dd126e84b26828ba340a8ae9406e8Christoph Studer    public static final String EXTRA_MEDIA_SESSION = "android.mediaSession";
33241484f326c4dd126e84b26828ba340a8ae9406e8Christoph Studer
33341484f326c4dd126e84b26828ba340a8ae9406e8Christoph Studer    /**
334b2216c3ffda4d63d3f0c9f6b16afc8c912c4296eBryan Mawhinney     * Notification extras key: the indices of actions to be shown in the compact view,
335b2216c3ffda4d63d3f0c9f6b16afc8c912c4296eBryan Mawhinney     * as supplied to (e.g.) {@link Notification.MediaStyle#setShowActionsInCompactView(int...)}.
336569c49e672218d3a9d391a16e4c1b50507d5eccfBryan Mawhinney     */
337569c49e672218d3a9d391a16e4c1b50507d5eccfBryan Mawhinney    public static final String EXTRA_COMPACT_ACTIONS = "android.compactActions";
338569c49e672218d3a9d391a16e4c1b50507d5eccfBryan Mawhinney
339569c49e672218d3a9d391a16e4c1b50507d5eccfBryan Mawhinney    /**
34069a58d36f6ed8ec4d076534556aba2f93d00254eDan Sandler     * Value of {@link Notification#color} equal to 0 (also known as
34169a58d36f6ed8ec4d076534556aba2f93d00254eDan Sandler     * {@link android.graphics.Color#TRANSPARENT Color.TRANSPARENT}),
34269a58d36f6ed8ec4d076534556aba2f93d00254eDan Sandler     * telling the system not to decorate this notification with any special color but instead use
34369a58d36f6ed8ec4d076534556aba2f93d00254eDan Sandler     * default colors when presenting this notification.
34469a58d36f6ed8ec4d076534556aba2f93d00254eDan Sandler     */
34569a58d36f6ed8ec4d076534556aba2f93d00254eDan Sandler    public static final int COLOR_DEFAULT = Color.TRANSPARENT;
34669a58d36f6ed8ec4d076534556aba2f93d00254eDan Sandler
347df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler    /**
348df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler     * Notification visibility: Show this notification in its entirety on all lockscreens.
349df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler     *
350df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler     * {@see android.app.Notification#visibility}
351df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler     */
352df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler    public static final int VISIBILITY_PUBLIC = 1;
353df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler
354df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler    /**
355df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler     * Notification visibility: Show this notification on all lockscreens, but conceal sensitive or
356df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler     * private information on secure lockscreens.
357df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler     *
358df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler     * {@see android.app.Notification#visibility}
359df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler     */
360df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler    public static final int VISIBILITY_PRIVATE = 0;
361df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler
362df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler    /**
363df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler     * Notification visibility: Do not reveal any part of this notification on a secure lockscreen.
364df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler     *
365df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler     * {@see android.app.Notification#visibility}
366df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler     */
367df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler    public static final int VISIBILITY_SECRET = -1;
368df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler
3691f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney    /**
3701f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney     * Notification category: incoming call (voice or video) or similar synchronous communication request.
3711f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney     */
3721f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney    public static final String CATEGORY_CALL = NotificationCompatApi21.CATEGORY_CALL;
3731f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney
3741f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney    /**
3751f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney     * Notification category: incoming direct message (SMS, instant message, etc.).
3761f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney     */
3771f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney    public static final String CATEGORY_MESSAGE = NotificationCompatApi21.CATEGORY_MESSAGE;
3781f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney
3791f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney    /**
3801f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney     * Notification category: asynchronous bulk message (email).
3811f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney     */
3821f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney    public static final String CATEGORY_EMAIL = NotificationCompatApi21.CATEGORY_EMAIL;
3831f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney
3841f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney    /**
3851f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney     * Notification category: calendar event.
3861f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney     */
3871f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney    public static final String CATEGORY_EVENT = NotificationCompatApi21.CATEGORY_EVENT;
3881f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney
3891f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney    /**
3901f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney     * Notification category: promotion or advertisement.
3911f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney     */
3921f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney    public static final String CATEGORY_PROMO = NotificationCompatApi21.CATEGORY_PROMO;
3931f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney
3941f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney    /**
3951f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney     * Notification category: alarm or timer.
3961f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney     */
3971f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney    public static final String CATEGORY_ALARM = NotificationCompatApi21.CATEGORY_ALARM;
3981f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney
3991f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney    /**
4001f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney     * Notification category: progress of a long-running background operation.
4011f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney     */
4021f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney    public static final String CATEGORY_PROGRESS = NotificationCompatApi21.CATEGORY_PROGRESS;
4031f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney
4041f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney    /**
4051f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney     * Notification category: social network or sharing update.
4061f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney     */
4071f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney    public static final String CATEGORY_SOCIAL = NotificationCompatApi21.CATEGORY_SOCIAL;
4081f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney
4091f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney    /**
4101f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney     * Notification category: error in background operation or authentication status.
4111f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney     */
4121f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney    public static final String CATEGORY_ERROR = NotificationCompatApi21.CATEGORY_ERROR;
4131f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney
4141f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney    /**
4151f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney     * Notification category: media transport control for playback.
4161f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney     */
4171f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney    public static final String CATEGORY_TRANSPORT = NotificationCompatApi21.CATEGORY_TRANSPORT;
4181f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney
4191f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney    /**
4201f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney     * Notification category: system or device status update.  Reserved for system use.
4211f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney     */
4221f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney    public static final String CATEGORY_SYSTEM = NotificationCompatApi21.CATEGORY_SYSTEM;
4231f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney
4241f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney    /**
4251f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney     * Notification category: indication of running background service.
4261f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney     */
4271f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney    public static final String CATEGORY_SERVICE = NotificationCompatApi21.CATEGORY_SERVICE;
4281f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney
4291f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney    /**
4301f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney     * Notification category: a specific, timely recommendation for a single thing.
4311f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney     * For example, a news app might want to recommend a news story it believes the user will
4321f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney     * want to read next.
4331f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney     */
4341f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney    public static final String CATEGORY_RECOMMENDATION =
4351f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney            NotificationCompatApi21.CATEGORY_RECOMMENDATION;
4361f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney
4371f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney    /**
4381f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney     * Notification category: ongoing information about device or contextual status.
4391f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney     */
4401f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney    public static final String CATEGORY_STATUS = NotificationCompatApi21.CATEGORY_STATUS;
4411f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney
442c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell    private static final NotificationCompatImpl IMPL;
443c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
444c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell    interface NotificationCompatImpl {
445f021758934b35e3b842c6799344531d7ea2969daChris Wren        public Notification build(Builder b);
446b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        public Bundle getExtras(Notification n);
447300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        public int getActionCount(Notification n);
448300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        public Action getAction(Notification n, int actionIndex);
4492bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public Action[] getActionsFromParcelableArrayList(ArrayList<Parcelable> parcelables);
4502bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public ArrayList<Parcelable> getParcelableArrayListForActions(Action[] actions);
45175e2071f16bae2b22d1618026d10337daad862cfBryan Mawhinney        public String getCategory(Notification n);
452b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        public boolean getLocalOnly(Notification n);
453ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        public String getGroup(Notification n);
454ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        public boolean isGroupSummary(Notification n);
455ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        public String getSortKey(Notification n);
456c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell    }
457c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
458c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell    static class NotificationCompatImplBase implements NotificationCompatImpl {
459b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        @Override
460f021758934b35e3b842c6799344531d7ea2969daChris Wren        public Notification build(Builder b) {
461fe3b5bac4901a4bb8cf51c09fe4910b02388818aGriff Hazen            Notification result = b.mNotification;
462c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            result.setLatestEventInfo(b.mContext, b.mContentTitle,
463c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell                    b.mContentText, b.mContentIntent);
464f021758934b35e3b842c6799344531d7ea2969daChris Wren            // translate high priority requests into legacy flag
465f021758934b35e3b842c6799344531d7ea2969daChris Wren            if (b.mPriority > PRIORITY_DEFAULT) {
466884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin                result.flags |= FLAG_HIGH_PRIORITY;
467f021758934b35e3b842c6799344531d7ea2969daChris Wren            }
468c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return result;
469c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
470b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen
471b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        @Override
472b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        public Bundle getExtras(Notification n) {
473b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            return null;
474b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        }
475b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen
476b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        @Override
477300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        public int getActionCount(Notification n) {
478300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            return 0;
479300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        }
480300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
481300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        @Override
482300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        public Action getAction(Notification n, int actionIndex) {
483300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            return null;
484300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        }
485300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
486300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        @Override
4872bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public Action[] getActionsFromParcelableArrayList(
4882bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                ArrayList<Parcelable> parcelables) {
4892bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return null;
4902bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
4912bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
4922bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        @Override
4932bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public ArrayList<Parcelable> getParcelableArrayListForActions(Action[] actions) {
4942bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return null;
4952bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
4962bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
4972bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        @Override
49875e2071f16bae2b22d1618026d10337daad862cfBryan Mawhinney        public String getCategory(Notification n) {
49975e2071f16bae2b22d1618026d10337daad862cfBryan Mawhinney            return null;
50075e2071f16bae2b22d1618026d10337daad862cfBryan Mawhinney        }
50175e2071f16bae2b22d1618026d10337daad862cfBryan Mawhinney
50275e2071f16bae2b22d1618026d10337daad862cfBryan Mawhinney        @Override
503b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        public boolean getLocalOnly(Notification n) {
504b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            return false;
505b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        }
506ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
507ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        @Override
508ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        public String getGroup(Notification n) {
509ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return null;
510ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        }
511ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
512ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        @Override
513ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        public boolean isGroupSummary(Notification n) {
514ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return false;
515ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        }
516ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
517ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        @Override
518ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        public String getSortKey(Notification n) {
519ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return null;
520ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        }
521c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell    }
522c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
52329e9b1ca3b576f8d73465f725e0cc623f0d97ffdChris Wren    static class NotificationCompatImplGingerbread extends NotificationCompatImplBase {
524b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        @Override
52529e9b1ca3b576f8d73465f725e0cc623f0d97ffdChris Wren        public Notification build(Builder b) {
526fe3b5bac4901a4bb8cf51c09fe4910b02388818aGriff Hazen            Notification result = b.mNotification;
52729e9b1ca3b576f8d73465f725e0cc623f0d97ffdChris Wren            result.setLatestEventInfo(b.mContext, b.mContentTitle,
52829e9b1ca3b576f8d73465f725e0cc623f0d97ffdChris Wren                    b.mContentText, b.mContentIntent);
52929e9b1ca3b576f8d73465f725e0cc623f0d97ffdChris Wren            result = NotificationCompatGingerbread.add(result, b.mContext,
53029e9b1ca3b576f8d73465f725e0cc623f0d97ffdChris Wren                    b.mContentTitle, b.mContentText, b.mContentIntent, b.mFullScreenIntent);
53129e9b1ca3b576f8d73465f725e0cc623f0d97ffdChris Wren            // translate high priority requests into legacy flag
53229e9b1ca3b576f8d73465f725e0cc623f0d97ffdChris Wren            if (b.mPriority > PRIORITY_DEFAULT) {
53329e9b1ca3b576f8d73465f725e0cc623f0d97ffdChris Wren                result.flags |= FLAG_HIGH_PRIORITY;
53429e9b1ca3b576f8d73465f725e0cc623f0d97ffdChris Wren            }
53529e9b1ca3b576f8d73465f725e0cc623f0d97ffdChris Wren            return result;
53629e9b1ca3b576f8d73465f725e0cc623f0d97ffdChris Wren        }
53729e9b1ca3b576f8d73465f725e0cc623f0d97ffdChris Wren    }
53829e9b1ca3b576f8d73465f725e0cc623f0d97ffdChris Wren
539b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen    static class NotificationCompatImplHoneycomb extends NotificationCompatImplBase {
540b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        @Override
541f021758934b35e3b842c6799344531d7ea2969daChris Wren        public Notification build(Builder b) {
542c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return NotificationCompatHoneycomb.add(b.mContext, b.mNotification,
543c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell                    b.mContentTitle, b.mContentText, b.mContentInfo, b.mTickerView,
544c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell                    b.mNumber, b.mContentIntent, b.mFullScreenIntent, b.mLargeIcon);
545c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
546c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell    }
547c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
548b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen    static class NotificationCompatImplIceCreamSandwich extends NotificationCompatImplBase {
549b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        @Override
550f021758934b35e3b842c6799344531d7ea2969daChris Wren        public Notification build(Builder b) {
551f021758934b35e3b842c6799344531d7ea2969daChris Wren            return NotificationCompatIceCreamSandwich.add(b.mContext, b.mNotification,
552f021758934b35e3b842c6799344531d7ea2969daChris Wren                    b.mContentTitle, b.mContentText, b.mContentInfo, b.mTickerView,
553f021758934b35e3b842c6799344531d7ea2969daChris Wren                    b.mNumber, b.mContentIntent, b.mFullScreenIntent, b.mLargeIcon,
554f021758934b35e3b842c6799344531d7ea2969daChris Wren                    b.mProgressMax, b.mProgress, b.mProgressIndeterminate);
555f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
556f021758934b35e3b842c6799344531d7ea2969daChris Wren    }
557f021758934b35e3b842c6799344531d7ea2969daChris Wren
558b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen    static class NotificationCompatImplJellybean extends NotificationCompatImplBase {
559b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        @Override
560f021758934b35e3b842c6799344531d7ea2969daChris Wren        public Notification build(Builder b) {
561b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            NotificationCompatJellybean.Builder builder = new NotificationCompatJellybean.Builder(
562f021758934b35e3b842c6799344531d7ea2969daChris Wren                    b.mContext, b.mNotification, b.mContentTitle, b.mContentText, b.mContentInfo,
563f021758934b35e3b842c6799344531d7ea2969daChris Wren                    b.mTickerView, b.mNumber, b.mContentIntent, b.mFullScreenIntent, b.mLargeIcon,
564f021758934b35e3b842c6799344531d7ea2969daChris Wren                    b.mProgressMax, b.mProgress, b.mProgressIndeterminate,
565ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                    b.mUseChronometer, b.mPriority, b.mSubText, b.mLocalOnly, b.mExtras,
566ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                    b.mGroupKey, b.mGroupSummary, b.mSortKey);
567b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            addActionsToBuilder(builder, b.mActions);
568b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            addStyleToBuilderJellybean(builder, b.mStyle);
569b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            return builder.build();
570b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        }
571b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen
572b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        @Override
573b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        public Bundle getExtras(Notification n) {
574b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            return NotificationCompatJellybean.getExtras(n);
575b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        }
576b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen
577b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        @Override
578300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        public int getActionCount(Notification n) {
579300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            return NotificationCompatJellybean.getActionCount(n);
580300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        }
581300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
582300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        @Override
583300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        public Action getAction(Notification n, int actionIndex) {
584ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return (Action) NotificationCompatJellybean.getAction(n, actionIndex, Action.FACTORY,
585ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                    RemoteInput.FACTORY);
586300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        }
587300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
588300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        @Override
5892bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public Action[] getActionsFromParcelableArrayList(
5902bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                ArrayList<Parcelable> parcelables) {
5912bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return (Action[]) NotificationCompatJellybean.getActionsFromParcelableArrayList(
5922bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                    parcelables, Action.FACTORY, RemoteInput.FACTORY);
5932bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
5942bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
5952bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        @Override
5962bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public ArrayList<Parcelable> getParcelableArrayListForActions(
5972bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                Action[] actions) {
5982bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return NotificationCompatJellybean.getParcelableArrayListForActions(actions);
5992bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
6002bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
6012bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        @Override
60247702147608084fec16a50640da54b412c737b9cGriff Hazen        public boolean getLocalOnly(Notification n) {
60347702147608084fec16a50640da54b412c737b9cGriff Hazen            return NotificationCompatJellybean.getLocalOnly(n);
60447702147608084fec16a50640da54b412c737b9cGriff Hazen        }
605ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
606ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        @Override
607ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        public String getGroup(Notification n) {
608ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return NotificationCompatJellybean.getGroup(n);
609ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        }
610ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
611ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        @Override
612ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        public boolean isGroupSummary(Notification n) {
613ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return NotificationCompatJellybean.isGroupSummary(n);
614ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        }
615ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
616ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        @Override
617ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        public String getSortKey(Notification n) {
618ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return NotificationCompatJellybean.getSortKey(n);
619ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        }
62047702147608084fec16a50640da54b412c737b9cGriff Hazen    }
62147702147608084fec16a50640da54b412c737b9cGriff Hazen
622ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    static class NotificationCompatImplKitKat extends NotificationCompatImplJellybean {
62347702147608084fec16a50640da54b412c737b9cGriff Hazen        @Override
62447702147608084fec16a50640da54b412c737b9cGriff Hazen        public Notification build(Builder b) {
62547702147608084fec16a50640da54b412c737b9cGriff Hazen            NotificationCompatKitKat.Builder builder = new NotificationCompatKitKat.Builder(
62647702147608084fec16a50640da54b412c737b9cGriff Hazen                    b.mContext, b.mNotification, b.mContentTitle, b.mContentText, b.mContentInfo,
62747702147608084fec16a50640da54b412c737b9cGriff Hazen                    b.mTickerView, b.mNumber, b.mContentIntent, b.mFullScreenIntent, b.mLargeIcon,
62848d8878e34b0d9983166418378125b63faac9aabGriff Hazen                    b.mProgressMax, b.mProgress, b.mProgressIndeterminate, b.mShowWhen,
62948d8878e34b0d9983166418378125b63faac9aabGriff Hazen                    b.mUseChronometer, b.mPriority, b.mSubText, b.mLocalOnly,
63048d8878e34b0d9983166418378125b63faac9aabGriff Hazen                    b.mPeople, b.mExtras, b.mGroupKey, b.mGroupSummary, b.mSortKey);
63147702147608084fec16a50640da54b412c737b9cGriff Hazen            addActionsToBuilder(builder, b.mActions);
63247702147608084fec16a50640da54b412c737b9cGriff Hazen            addStyleToBuilderJellybean(builder, b.mStyle);
63347702147608084fec16a50640da54b412c737b9cGriff Hazen            return builder.build();
63447702147608084fec16a50640da54b412c737b9cGriff Hazen        }
63547702147608084fec16a50640da54b412c737b9cGriff Hazen
63647702147608084fec16a50640da54b412c737b9cGriff Hazen        @Override
63747702147608084fec16a50640da54b412c737b9cGriff Hazen        public Bundle getExtras(Notification n) {
63847702147608084fec16a50640da54b412c737b9cGriff Hazen            return NotificationCompatKitKat.getExtras(n);
63947702147608084fec16a50640da54b412c737b9cGriff Hazen        }
64047702147608084fec16a50640da54b412c737b9cGriff Hazen
64147702147608084fec16a50640da54b412c737b9cGriff Hazen        @Override
642300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        public int getActionCount(Notification n) {
643300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            return NotificationCompatKitKat.getActionCount(n);
644300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        }
645300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
646300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        @Override
647300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        public Action getAction(Notification n, int actionIndex) {
648ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return (Action) NotificationCompatKitKat.getAction(n, actionIndex, Action.FACTORY,
649ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                    RemoteInput.FACTORY);
650300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        }
651300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
652300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        @Override
65347702147608084fec16a50640da54b412c737b9cGriff Hazen        public boolean getLocalOnly(Notification n) {
65447702147608084fec16a50640da54b412c737b9cGriff Hazen            return NotificationCompatKitKat.getLocalOnly(n);
655b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        }
656ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
657ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        @Override
658ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        public String getGroup(Notification n) {
659ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return NotificationCompatKitKat.getGroup(n);
660ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        }
661ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
662ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        @Override
663ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        public boolean isGroupSummary(Notification n) {
664ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return NotificationCompatKitKat.isGroupSummary(n);
665ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        }
666ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
667ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        @Override
668ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        public String getSortKey(Notification n) {
669ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return NotificationCompatKitKat.getSortKey(n);
670ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        }
671b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen    }
672b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen
673ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    static class NotificationCompatImplApi20 extends NotificationCompatImplKitKat {
674b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        @Override
675b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        public Notification build(Builder b) {
676b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            NotificationCompatApi20.Builder builder = new NotificationCompatApi20.Builder(
677b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                    b.mContext, b.mNotification, b.mContentTitle, b.mContentText, b.mContentInfo,
678b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                    b.mTickerView, b.mNumber, b.mContentIntent, b.mFullScreenIntent, b.mLargeIcon,
67948d8878e34b0d9983166418378125b63faac9aabGriff Hazen                    b.mProgressMax, b.mProgress, b.mProgressIndeterminate, b.mShowWhen,
68043c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen                    b.mUseChronometer, b.mPriority, b.mSubText, b.mLocalOnly, b.mPeople, b.mExtras,
681ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                    b.mGroupKey, b.mGroupSummary, b.mSortKey);
682b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            addActionsToBuilder(builder, b.mActions);
683b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            addStyleToBuilderJellybean(builder, b.mStyle);
684b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            return builder.build();
685b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        }
686b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen
687b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        @Override
688ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        public Action getAction(Notification n, int actionIndex) {
689ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return (Action) NotificationCompatApi20.getAction(n, actionIndex, Action.FACTORY,
690ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                    RemoteInput.FACTORY);
691b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        }
692b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen
693b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        @Override
6942bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public Action[] getActionsFromParcelableArrayList(
6952bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                ArrayList<Parcelable> parcelables) {
6962bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return (Action[]) NotificationCompatApi20.getActionsFromParcelableArrayList(
6972bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                    parcelables, Action.FACTORY, RemoteInput.FACTORY);
6982bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
6992bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
7002bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        @Override
7012bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public ArrayList<Parcelable> getParcelableArrayListForActions(
7022bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                Action[] actions) {
7032bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return NotificationCompatApi20.getParcelableArrayListForActions(actions);
7042bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
7052bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
7062bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        @Override
707ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        public boolean getLocalOnly(Notification n) {
708ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return NotificationCompatApi20.getLocalOnly(n);
709300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        }
710300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
711300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        @Override
712ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        public String getGroup(Notification n) {
713ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return NotificationCompatApi20.getGroup(n);
714300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        }
715300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
716300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        @Override
717ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        public boolean isGroupSummary(Notification n) {
718ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return NotificationCompatApi20.isGroupSummary(n);
719ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        }
720ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
721ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        @Override
722ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        public String getSortKey(Notification n) {
723ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return NotificationCompatApi20.getSortKey(n);
724b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        }
725b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen    }
726b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen
72743c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen    static class NotificationCompatImplApi21 extends NotificationCompatImplApi20 {
72843c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen        @Override
72943c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen        public Notification build(Builder b) {
73043c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen            NotificationCompatApi21.Builder builder = new NotificationCompatApi21.Builder(
73143c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen                    b.mContext, b.mNotification, b.mContentTitle, b.mContentText, b.mContentInfo,
73243c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen                    b.mTickerView, b.mNumber, b.mContentIntent, b.mFullScreenIntent, b.mLargeIcon,
73348d8878e34b0d9983166418378125b63faac9aabGriff Hazen                    b.mProgressMax, b.mProgress, b.mProgressIndeterminate, b.mShowWhen,
73443c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen                    b.mUseChronometer, b.mPriority, b.mSubText, b.mLocalOnly, b.mCategory,
73543c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen                    b.mPeople, b.mExtras, b.mColor, b.mVisibility, b.mPublicVersion,
73643c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen                    b.mGroupKey, b.mGroupSummary, b.mSortKey);
73743c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen            addActionsToBuilder(builder, b.mActions);
73843c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen            addStyleToBuilderJellybean(builder, b.mStyle);
73943c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen            return builder.build();
74043c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen        }
74143c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen
74243c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen        @Override
74343c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen        public String getCategory(Notification notif) {
74443c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen            return NotificationCompatApi21.getCategory(notif);
74543c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen        }
74643c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen    }
74743c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen
748b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen    private static void addActionsToBuilder(NotificationBuilderWithActions builder,
749b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            ArrayList<Action> actions) {
750b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        for (Action action : actions) {
751ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            builder.addAction(action);
752b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        }
753b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen    }
754b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen
755b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen    private static void addStyleToBuilderJellybean(NotificationBuilderWithBuilderAccessor builder,
756b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            Style style) {
757b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        if (style != null) {
758b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            if (style instanceof BigTextStyle) {
759b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                BigTextStyle bigTextStyle = (BigTextStyle) style;
760b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                NotificationCompatJellybean.addBigTextStyle(builder,
761b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                        bigTextStyle.mBigContentTitle,
762b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                        bigTextStyle.mSummaryTextSet,
763b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                        bigTextStyle.mSummaryText,
764b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                        bigTextStyle.mBigText);
765b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            } else if (style instanceof InboxStyle) {
766b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                InboxStyle inboxStyle = (InboxStyle) style;
767b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                NotificationCompatJellybean.addInboxStyle(builder,
768b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                        inboxStyle.mBigContentTitle,
769b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                        inboxStyle.mSummaryTextSet,
770b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                        inboxStyle.mSummaryText,
771b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                        inboxStyle.mTexts);
772b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            } else if (style instanceof BigPictureStyle) {
773b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                BigPictureStyle bigPictureStyle = (BigPictureStyle) style;
774b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                NotificationCompatJellybean.addBigPictureStyle(builder,
775b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                        bigPictureStyle.mBigContentTitle,
776b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                        bigPictureStyle.mSummaryTextSet,
777b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                        bigPictureStyle.mSummaryText,
778b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                        bigPictureStyle.mPicture,
779b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                        bigPictureStyle.mBigLargeIcon,
780b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                        bigPictureStyle.mBigLargeIconSet);
781f021758934b35e3b842c6799344531d7ea2969daChris Wren            }
782f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
783f021758934b35e3b842c6799344531d7ea2969daChris Wren    }
784f021758934b35e3b842c6799344531d7ea2969daChris Wren
785c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell    static {
786a52784195525cdb1f2bb4d8dde1b8b314f480957Chet Haase        if (Build.VERSION.SDK_INT >= 21) {
78775e2071f16bae2b22d1618026d10337daad862cfBryan Mawhinney            IMPL = new NotificationCompatImplApi21();
78875e2071f16bae2b22d1618026d10337daad862cfBryan Mawhinney        } else if (Build.VERSION.SDK_INT >= 20) {
789334514fd61bd192cee3475b3ba44adb4f54a1f89Chris Wren            IMPL = new NotificationCompatImplApi20();
790334514fd61bd192cee3475b3ba44adb4f54a1f89Chris Wren        } else if (Build.VERSION.SDK_INT >= 19) {
79147702147608084fec16a50640da54b412c737b9cGriff Hazen            IMPL = new NotificationCompatImplKitKat();
79247702147608084fec16a50640da54b412c737b9cGriff Hazen        } else if (Build.VERSION.SDK_INT >= 16) {
793f021758934b35e3b842c6799344531d7ea2969daChris Wren            IMPL = new NotificationCompatImplJellybean();
794080df8ffb0920eccb300baa39180eb956a000a53Chris Wren        } else if (Build.VERSION.SDK_INT >= 14) {
795f021758934b35e3b842c6799344531d7ea2969daChris Wren            IMPL = new NotificationCompatImplIceCreamSandwich();
796f021758934b35e3b842c6799344531d7ea2969daChris Wren        } else if (Build.VERSION.SDK_INT >= 11) {
797c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            IMPL = new NotificationCompatImplHoneycomb();
79829e9b1ca3b576f8d73465f725e0cc623f0d97ffdChris Wren        } else if (Build.VERSION.SDK_INT >= 9) {
79929e9b1ca3b576f8d73465f725e0cc623f0d97ffdChris Wren            IMPL = new NotificationCompatImplGingerbread();
800c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        } else {
801c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            IMPL = new NotificationCompatImplBase();
802c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
803c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell    }
804c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
805c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell    /**
806884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * Builder class for {@link NotificationCompat} objects.  Allows easier control over
807c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell     * all the flags, as well as help constructing the typical notification layouts.
808884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * <p>
809884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * On platform versions that don't offer expanded notifications, methods that depend on
810884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * expanded notifications have no effect.
811884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * </p>
812884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * <p>
813884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * For example, action buttons won't appear on platforms prior to Android 4.1. Action
814884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * buttons depend on expanded notifications, which are only available in Android 4.1
815884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * and later.
816884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * <p>
817884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * For this reason, you should always ensure that UI controls in a notification are also
818884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * available in an {@link android.app.Activity} in your app, and you should always start that
819884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * {@link android.app.Activity} when users click the notification. To do this, use the
820884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * {@link NotificationCompat.Builder#setContentIntent setContentIntent()}
821884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * method.
822884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * </p>
823884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     *
824c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell     */
825c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell    public static class Builder {
82624c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer        /**
82724c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer         * Maximum length of CharSequences accepted by Builder and friends.
82824c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer         *
82924c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer         * <p>
83024c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer         * Avoids spamming the system with overly large strings such as full e-mails.
83124c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer         */
83224c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer        private static final int MAX_CHARSEQUENCE_LENGTH = 5 * 1024;
83324c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer
834c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        Context mContext;
835c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
836c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        CharSequence mContentTitle;
837c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        CharSequence mContentText;
838c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        PendingIntent mContentIntent;
839c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        PendingIntent mFullScreenIntent;
840c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        RemoteViews mTickerView;
841c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        Bitmap mLargeIcon;
842c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        CharSequence mContentInfo;
843c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        int mNumber;
844f021758934b35e3b842c6799344531d7ea2969daChris Wren        int mPriority;
8454c7c4787069fe222c2f74bbaa078debe389ae383Christoph Studer        boolean mShowWhen = true;
846f021758934b35e3b842c6799344531d7ea2969daChris Wren        boolean mUseChronometer;
847f021758934b35e3b842c6799344531d7ea2969daChris Wren        Style mStyle;
848f021758934b35e3b842c6799344531d7ea2969daChris Wren        CharSequence mSubText;
849f021758934b35e3b842c6799344531d7ea2969daChris Wren        int mProgressMax;
850f021758934b35e3b842c6799344531d7ea2969daChris Wren        int mProgress;
851f021758934b35e3b842c6799344531d7ea2969daChris Wren        boolean mProgressIndeterminate;
852ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        String mGroupKey;
853ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        boolean mGroupSummary;
854ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        String mSortKey;
855f021758934b35e3b842c6799344531d7ea2969daChris Wren        ArrayList<Action> mActions = new ArrayList<Action>();
856b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        boolean mLocalOnly = false;
857d3f7b5bb2422645d85b0e0131ff1c323f38bfed0John Spurlock        String mCategory;
858ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen        Bundle mExtras;
85969a58d36f6ed8ec4d076534556aba2f93d00254eDan Sandler        int mColor = COLOR_DEFAULT;
860df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler        int mVisibility = VISIBILITY_PRIVATE;
861df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler        Notification mPublicVersion;
862c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
863c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        Notification mNotification = new Notification();
864334514fd61bd192cee3475b3ba44adb4f54a1f89Chris Wren        public ArrayList<String> mPeople;
865c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
866c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
867c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Constructor.
868c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         *
869c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Automatically sets the when field to {@link System#currentTimeMillis()
870c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * System.currentTimeMillis()} and the audio stream to the
871c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * {@link Notification#STREAM_DEFAULT}.
872c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         *
873c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * @param context A {@link Context} that will be used to construct the
874c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         *      RemoteViews. The Context will not be held past the lifetime of this
875c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         *      Builder object.
876c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
877c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder(Context context) {
878c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mContext = context;
879c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
880c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            // Set defaults to match the defaults of a Notification
881c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.when = System.currentTimeMillis();
882c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.audioStreamType = Notification.STREAM_DEFAULT;
883f021758934b35e3b842c6799344531d7ea2969daChris Wren            mPriority = PRIORITY_DEFAULT;
884334514fd61bd192cee3475b3ba44adb4f54a1f89Chris Wren            mPeople = new ArrayList<String>();
885c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
886c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
887c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
888c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Set the time that the event occurred.  Notifications in the panel are
889c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * sorted by this time.
890c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
891c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setWhen(long when) {
892c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.when = when;
893c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
894c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
895c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
896c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
89748d8878e34b0d9983166418378125b63faac9aabGriff Hazen         * Control whether the timestamp set with {@link #setWhen(long) setWhen} is shown
89848d8878e34b0d9983166418378125b63faac9aabGriff Hazen         * in the content view.
89948d8878e34b0d9983166418378125b63faac9aabGriff Hazen         */
90048d8878e34b0d9983166418378125b63faac9aabGriff Hazen        public Builder setShowWhen(boolean show) {
90148d8878e34b0d9983166418378125b63faac9aabGriff Hazen            mShowWhen = show;
90248d8878e34b0d9983166418378125b63faac9aabGriff Hazen            return this;
90348d8878e34b0d9983166418378125b63faac9aabGriff Hazen        }
90448d8878e34b0d9983166418378125b63faac9aabGriff Hazen
90548d8878e34b0d9983166418378125b63faac9aabGriff Hazen        /**
906f021758934b35e3b842c6799344531d7ea2969daChris Wren         * Show the {@link Notification#when} field as a stopwatch.
907884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin         *
908884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin         * Instead of presenting <code>when</code> as a timestamp, the notification will show an
909f021758934b35e3b842c6799344531d7ea2969daChris Wren         * automatically updating display of the minutes and seconds since <code>when</code>.
910f021758934b35e3b842c6799344531d7ea2969daChris Wren         *
911f021758934b35e3b842c6799344531d7ea2969daChris Wren         * Useful when showing an elapsed time (like an ongoing phone call).
912f021758934b35e3b842c6799344531d7ea2969daChris Wren         *
913f021758934b35e3b842c6799344531d7ea2969daChris Wren         * @see android.widget.Chronometer
914f021758934b35e3b842c6799344531d7ea2969daChris Wren         * @see Notification#when
915f021758934b35e3b842c6799344531d7ea2969daChris Wren         */
916f021758934b35e3b842c6799344531d7ea2969daChris Wren        public Builder setUsesChronometer(boolean b) {
917f021758934b35e3b842c6799344531d7ea2969daChris Wren            mUseChronometer = b;
918f021758934b35e3b842c6799344531d7ea2969daChris Wren            return this;
919f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
920f021758934b35e3b842c6799344531d7ea2969daChris Wren
921f021758934b35e3b842c6799344531d7ea2969daChris Wren        /**
922c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Set the small icon to use in the notification layouts.  Different classes of devices
923c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * may return different sizes.  See the UX guidelines for more information on how to
924c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * design these icons.
925c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         *
926c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * @param icon A resource ID in the application's package of the drawble to use.
927c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
928c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setSmallIcon(int icon) {
929c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.icon = icon;
930c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
931c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
932c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
933c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
934c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * A variant of {@link #setSmallIcon(int) setSmallIcon(int)} that takes an additional
935c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * level parameter for when the icon is a {@link android.graphics.drawable.LevelListDrawable
936c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * LevelListDrawable}.
937c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         *
938c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * @param icon A resource ID in the application's package of the drawble to use.
939c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * @param level The level to use for the icon.
940c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         *
941c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * @see android.graphics.drawable.LevelListDrawable
942c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
943c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setSmallIcon(int icon, int level) {
944c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.icon = icon;
945c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.iconLevel = level;
946c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
947c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
948c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
949c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
950c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Set the title (first row) of the notification, in a standard notification.
951c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
952c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setContentTitle(CharSequence title) {
95324c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer            mContentTitle = limitCharSequenceLength(title);
954c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
955c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
956c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
957c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
958c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Set the text (second row) of the notification, in a standard notification.
959c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
960c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setContentText(CharSequence text) {
96124c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer            mContentText = limitCharSequenceLength(text);
962c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
963c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
964c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
965c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
966884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin         * Set the third line of text in the platform notification template.
967f021758934b35e3b842c6799344531d7ea2969daChris Wren         * Don't use if you're also using {@link #setProgress(int, int, boolean)};
968f021758934b35e3b842c6799344531d7ea2969daChris Wren         * they occupy the same location in the standard template.
969884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin         * <br>
970884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin         * If the platform does not provide large-format notifications, this method has no effect.
971884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin         * The third line of text only appears in expanded view.
972884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin         * <br>
973f021758934b35e3b842c6799344531d7ea2969daChris Wren         */
974f021758934b35e3b842c6799344531d7ea2969daChris Wren        public Builder setSubText(CharSequence text) {
97524c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer            mSubText = limitCharSequenceLength(text);
976f021758934b35e3b842c6799344531d7ea2969daChris Wren            return this;
977f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
978f021758934b35e3b842c6799344531d7ea2969daChris Wren
979f021758934b35e3b842c6799344531d7ea2969daChris Wren        /**
980c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Set the large number at the right-hand side of the notification.  This is
981c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * equivalent to setContentInfo, although it might show the number in a different
982c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * font size for readability.
983c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
984c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setNumber(int number) {
985c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNumber = number;
986c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
987c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
988c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
989c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
990c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Set the large text at the right-hand side of the notification.
991c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
992c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setContentInfo(CharSequence info) {
99324c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer            mContentInfo = limitCharSequenceLength(info);
994c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
995c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
996c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
997c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
998c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Set the progress this notification represents, which may be
999f021758934b35e3b842c6799344531d7ea2969daChris Wren         * represented as a {@link android.widget.ProgressBar}.
1000c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
1001c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setProgress(int max, int progress, boolean indeterminate) {
1002c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mProgressMax = max;
1003c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mProgress = progress;
1004c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mProgressIndeterminate = indeterminate;
1005c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
1006f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
1007c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
1008c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
1009c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Supply a custom RemoteViews to use instead of the standard one.
1010c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
1011c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setContent(RemoteViews views) {
1012c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.contentView = views;
1013c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
1014c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
1015c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
1016c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
1017c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Supply a {@link PendingIntent} to send when the notification is clicked.
1018c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * If you do not supply an intent, you can now add PendingIntents to individual
1019c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * views to be launched when clicked by calling {@link RemoteViews#setOnClickPendingIntent
1020c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * RemoteViews.setOnClickPendingIntent(int,PendingIntent)}.  Be sure to
1021c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * read {@link Notification#contentIntent Notification.contentIntent} for
1022c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * how to correctly use this.
1023c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
1024c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setContentIntent(PendingIntent intent) {
1025c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mContentIntent = intent;
1026c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
1027c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
1028c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
1029c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
1030c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Supply a {@link PendingIntent} to send when the notification is cleared by the user
1031c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * directly from the notification panel.  For example, this intent is sent when the user
1032c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * clicks the "Clear all" button, or the individual "X" buttons on notifications.  This
1033ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * intent is not sent when the application calls
1034ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * {@link android.app.NotificationManager#cancel NotificationManager.cancel(int)}.
1035c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
1036c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setDeleteIntent(PendingIntent intent) {
1037c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.deleteIntent = intent;
1038c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
1039c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
1040c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
1041c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
1042c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * An intent to launch instead of posting the notification to the status bar.
1043c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Only for use with extremely high-priority notifications demanding the user's
1044c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * <strong>immediate</strong> attention, such as an incoming phone call or
1045c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * alarm clock that the user has explicitly set to a particular time.
1046c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * If this facility is used for something else, please give the user an option
1047c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * to turn it off and use a normal notification, as this can be extremely
1048c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * disruptive.
1049c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         *
1050e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren         * <p>
1051e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren         * On some platforms, the system UI may choose to display a heads-up notification,
1052e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren         * instead of launching this intent, while the user is using the device.
1053e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren         * </p>
1054e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren         *
1055c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * @param intent The pending intent to launch.
1056c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * @param highPriority Passing true will cause this notification to be sent
1057c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         *          even if other notifications are suppressed.
1058c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
1059c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setFullScreenIntent(PendingIntent intent, boolean highPriority) {
1060c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mFullScreenIntent = intent;
1061c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            setFlag(FLAG_HIGH_PRIORITY, highPriority);
1062c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
1063c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
1064c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
1065c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
1066c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Set the text that is displayed in the status bar when the notification first
1067c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * arrives.
1068c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
1069c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setTicker(CharSequence tickerText) {
107024c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer            mNotification.tickerText = limitCharSequenceLength(tickerText);
1071c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
1072c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
1073c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
1074c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
1075c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Set the text that is displayed in the status bar when the notification first
1076c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * arrives, and also a RemoteViews object that may be displayed instead on some
1077c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * devices.
1078c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
1079c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setTicker(CharSequence tickerText, RemoteViews views) {
108024c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer            mNotification.tickerText = limitCharSequenceLength(tickerText);
1081c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mTickerView = views;
1082c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
1083c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
1084c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
1085c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
1086c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Set the large icon that is shown in the ticker and notification.
1087c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
1088c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setLargeIcon(Bitmap icon) {
1089c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mLargeIcon = icon;
1090c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
1091c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
1092c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
1093c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
1094c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Set the sound to play.  It will play on the default stream.
1095e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren         *
1096e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren         * <p>
1097e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren         * On some platforms, a notification that is noisy is more likely to be presented
1098e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren         * as a heads-up notification.
1099e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren         * </p>
1100c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
1101c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setSound(Uri sound) {
1102c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.sound = sound;
1103c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.audioStreamType = Notification.STREAM_DEFAULT;
1104c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
1105c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
1106c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
1107c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
1108c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Set the sound to play.  It will play on the stream you supply.
1109c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         *
1110e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren         * <p>
1111e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren         * On some platforms, a notification that is noisy is more likely to be presented
1112e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren         * as a heads-up notification.
1113e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren         * </p>
1114e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren         *
1115fe3b5bac4901a4bb8cf51c09fe4910b02388818aGriff Hazen         * @see Notification#STREAM_DEFAULT
1116c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * @see AudioManager for the <code>STREAM_</code> constants.
1117c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
1118c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setSound(Uri sound, int streamType) {
1119c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.sound = sound;
1120c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.audioStreamType = streamType;
1121c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
1122c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
1123c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
1124c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
1125c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Set the vibration pattern to use.
1126c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         *
1127e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren         * <p>
1128e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren         * On some platforms, a notification that vibrates is more likely to be presented
1129e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren         * as a heads-up notification.
1130e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren         * </p>
1131e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren         *
1132c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * @see android.os.Vibrator for a discussion of the <code>pattern</code>
1133c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * parameter.
1134c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
1135c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setVibrate(long[] pattern) {
1136c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.vibrate = pattern;
1137c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
1138c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
1139c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
1140c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
1141c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Set the argb value that you would like the LED on the device to blnk, as well as the
1142c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * rate.  The rate is specified in terms of the number of milliseconds to be on
1143c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * and then the number of milliseconds to be off.
1144c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
1145c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setLights(int argb, int onMs, int offMs) {
1146c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.ledARGB = argb;
1147c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.ledOnMS = onMs;
1148c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.ledOffMS = offMs;
1149c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            boolean showLights = mNotification.ledOnMS != 0 && mNotification.ledOffMS != 0;
1150c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.flags = (mNotification.flags & ~Notification.FLAG_SHOW_LIGHTS) |
1151c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell                    (showLights ? Notification.FLAG_SHOW_LIGHTS : 0);
1152c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
1153c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
1154c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
1155c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
1156c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Set whether this is an ongoing notification.
1157c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         *
1158c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * <p>Ongoing notifications differ from regular notifications in the following ways:
1159c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * <ul>
1160c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         *   <li>Ongoing notifications are sorted above the regular notifications in the
1161c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         *   notification panel.</li>
1162c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         *   <li>Ongoing notifications do not have an 'X' close button, and are not affected
1163c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         *   by the "Clear all" button.
1164c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * </ul>
1165c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
1166c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setOngoing(boolean ongoing) {
1167c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            setFlag(Notification.FLAG_ONGOING_EVENT, ongoing);
1168c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
1169c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
1170c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
1171c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
1172c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Set this flag if you would only like the sound, vibrate
1173c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * and ticker to be played if the notification is not already showing.
1174c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
1175c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setOnlyAlertOnce(boolean onlyAlertOnce) {
1176c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            setFlag(Notification.FLAG_ONLY_ALERT_ONCE, onlyAlertOnce);
1177c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
1178c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
1179c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
1180c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
1181c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Setting this flag will make it so the notification is automatically
1182c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * canceled when the user clicks it in the panel.  The PendingIntent
1183c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * set with {@link #setDeleteIntent} will be broadcast when the notification
1184c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * is canceled.
1185c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
1186c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setAutoCancel(boolean autoCancel) {
1187c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            setFlag(Notification.FLAG_AUTO_CANCEL, autoCancel);
1188c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
1189c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
1190c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
1191c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
1192b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen         * Set whether or not this notification is only relevant to the current device.
1193b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen         *
1194b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen         * <p>Some notifications can be bridged to other devices for remote display.
1195b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen         * This hint can be set to recommend this notification not be bridged.
1196b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen         */
1197b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        public Builder setLocalOnly(boolean b) {
1198b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            mLocalOnly = b;
1199b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            return this;
1200b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        }
1201b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen
1202b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        /**
1203d3f7b5bb2422645d85b0e0131ff1c323f38bfed0John Spurlock         * Set the notification category.
1204d3f7b5bb2422645d85b0e0131ff1c323f38bfed0John Spurlock         *
1205d3f7b5bb2422645d85b0e0131ff1c323f38bfed0John Spurlock         * <p>Must be one of the predefined notification categories (see the <code>CATEGORY_*</code>
1206d3f7b5bb2422645d85b0e0131ff1c323f38bfed0John Spurlock         * constants in {@link Notification}) that best describes this notification.
1207d3f7b5bb2422645d85b0e0131ff1c323f38bfed0John Spurlock         * May be used by the system for ranking and filtering.
1208d3f7b5bb2422645d85b0e0131ff1c323f38bfed0John Spurlock         */
1209d3f7b5bb2422645d85b0e0131ff1c323f38bfed0John Spurlock        public Builder setCategory(String category) {
1210d3f7b5bb2422645d85b0e0131ff1c323f38bfed0John Spurlock            mCategory = category;
1211d3f7b5bb2422645d85b0e0131ff1c323f38bfed0John Spurlock            return this;
1212d3f7b5bb2422645d85b0e0131ff1c323f38bfed0John Spurlock        }
1213d3f7b5bb2422645d85b0e0131ff1c323f38bfed0John Spurlock
1214d3f7b5bb2422645d85b0e0131ff1c323f38bfed0John Spurlock        /**
1215c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Set the default notification options that will be used.
1216c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * <p>
1217c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * The value should be one or more of the following fields combined with
1218c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * bitwise-or:
1219c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * {@link Notification#DEFAULT_SOUND}, {@link Notification#DEFAULT_VIBRATE},
1220c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * {@link Notification#DEFAULT_LIGHTS}.
1221c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * <p>
1222c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * For all default values, use {@link Notification#DEFAULT_ALL}.
1223c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
1224c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setDefaults(int defaults) {
1225c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.defaults = defaults;
1226c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            if ((defaults & Notification.DEFAULT_LIGHTS) != 0) {
1227c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell                mNotification.flags |= Notification.FLAG_SHOW_LIGHTS;
1228c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            }
1229c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
1230c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
1231c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
1232c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        private void setFlag(int mask, boolean value) {
1233c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            if (value) {
1234c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell                mNotification.flags |= mask;
1235c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            } else {
1236c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell                mNotification.flags &= ~mask;
1237c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            }
1238c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
1239c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
1240c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
1241f021758934b35e3b842c6799344531d7ea2969daChris Wren         * Set the relative priority for this notification.
1242884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin         *
1243f021758934b35e3b842c6799344531d7ea2969daChris Wren         * Priority is an indication of how much of the user's
1244f021758934b35e3b842c6799344531d7ea2969daChris Wren         * valuable attention should be consumed by this
1245f021758934b35e3b842c6799344531d7ea2969daChris Wren         * notification. Low-priority notifications may be hidden from
1246f021758934b35e3b842c6799344531d7ea2969daChris Wren         * the user in certain situations, while the user might be
1247884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin         * interrupted for a higher-priority notification.
1248884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin         * The system sets a notification's priority based on various factors including the
1249884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin         * setPriority value. The effect may differ slightly on different platforms.
12507c94c9ad26555427345c6c540bf761bf73389016Andrew Solovay         *
12517c94c9ad26555427345c6c540bf761bf73389016Andrew Solovay         * @param pri Relative priority for this notification. Must be one of
12527c94c9ad26555427345c6c540bf761bf73389016Andrew Solovay         *     the priority constants defined by {@link NotificationCompat}.
12537c94c9ad26555427345c6c540bf761bf73389016Andrew Solovay         *     Acceptable values range from {@link
12547c94c9ad26555427345c6c540bf761bf73389016Andrew Solovay         *     NotificationCompat#PRIORITY_MIN} (-2) to {@link
12557c94c9ad26555427345c6c540bf761bf73389016Andrew Solovay         *     NotificationCompat#PRIORITY_MAX} (2).
1256f021758934b35e3b842c6799344531d7ea2969daChris Wren         */
1257f021758934b35e3b842c6799344531d7ea2969daChris Wren        public Builder setPriority(int pri) {
1258f021758934b35e3b842c6799344531d7ea2969daChris Wren            mPriority = pri;
1259f021758934b35e3b842c6799344531d7ea2969daChris Wren            return this;
1260f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
1261f021758934b35e3b842c6799344531d7ea2969daChris Wren
1262f021758934b35e3b842c6799344531d7ea2969daChris Wren        /**
1263334514fd61bd192cee3475b3ba44adb4f54a1f89Chris Wren         * Add a person that is relevant to this notification.
1264334514fd61bd192cee3475b3ba44adb4f54a1f89Chris Wren         *
126589e6774cdb200acc2dd5f4c9022a7e1aeeb05bceChris Wren         * <P>
126689e6774cdb200acc2dd5f4c9022a7e1aeeb05bceChris Wren         * Depending on user preferences, this annotation may allow the notification to pass
126789e6774cdb200acc2dd5f4c9022a7e1aeeb05bceChris Wren         * through interruption filters, and to appear more prominently in the user interface.
126889e6774cdb200acc2dd5f4c9022a7e1aeeb05bceChris Wren         * </P>
126989e6774cdb200acc2dd5f4c9022a7e1aeeb05bceChris Wren         *
127089e6774cdb200acc2dd5f4c9022a7e1aeeb05bceChris Wren         * <P>
127189e6774cdb200acc2dd5f4c9022a7e1aeeb05bceChris Wren         * The person should be specified by the {@code String} representation of a
127289e6774cdb200acc2dd5f4c9022a7e1aeeb05bceChris Wren         * {@link android.provider.ContactsContract.Contacts#CONTENT_LOOKUP_URI}.
127389e6774cdb200acc2dd5f4c9022a7e1aeeb05bceChris Wren         * </P>
127489e6774cdb200acc2dd5f4c9022a7e1aeeb05bceChris Wren         *
127589e6774cdb200acc2dd5f4c9022a7e1aeeb05bceChris Wren         * <P>The system will also attempt to resolve {@code mailto:} and {@code tel:} schema
127689e6774cdb200acc2dd5f4c9022a7e1aeeb05bceChris Wren         * URIs.  The path part of these URIs must exist in the contacts database, in the
127789e6774cdb200acc2dd5f4c9022a7e1aeeb05bceChris Wren         * appropriate column, or the reference will be discarded as invalid. Telephone schema
127889e6774cdb200acc2dd5f4c9022a7e1aeeb05bceChris Wren         * URIs will be resolved by {@link android.provider.ContactsContract.PhoneLookup}.
127989e6774cdb200acc2dd5f4c9022a7e1aeeb05bceChris Wren         * </P>
128089e6774cdb200acc2dd5f4c9022a7e1aeeb05bceChris Wren         *
128189e6774cdb200acc2dd5f4c9022a7e1aeeb05bceChris Wren         * @param uri A URI for the person.
1282334514fd61bd192cee3475b3ba44adb4f54a1f89Chris Wren         * @see Notification#EXTRA_PEOPLE
1283334514fd61bd192cee3475b3ba44adb4f54a1f89Chris Wren         */
128489e6774cdb200acc2dd5f4c9022a7e1aeeb05bceChris Wren        public Builder addPerson(String uri) {
128589e6774cdb200acc2dd5f4c9022a7e1aeeb05bceChris Wren            mPeople.add(uri);
1286334514fd61bd192cee3475b3ba44adb4f54a1f89Chris Wren            return this;
1287334514fd61bd192cee3475b3ba44adb4f54a1f89Chris Wren        }
1288334514fd61bd192cee3475b3ba44adb4f54a1f89Chris Wren
1289334514fd61bd192cee3475b3ba44adb4f54a1f89Chris Wren        /**
1290ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * Set this notification to be part of a group of notifications sharing the same key.
1291ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * Grouped notifications may display in a cluster or stack on devices which
1292ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * support such rendering.
1293ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         *
1294ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * <p>To make this notification the summary for its group, also call
1295ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * {@link #setGroupSummary}. A sort order can be specified for group members by using
1296ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * {@link #setSortKey}.
1297ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * @param groupKey The group key of the group.
1298ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * @return this object for method chaining
1299ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         */
1300ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        public Builder setGroup(String groupKey) {
1301ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            mGroupKey = groupKey;
1302ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return this;
1303ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        }
1304ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
1305ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        /**
1306ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * Set this notification to be the group summary for a group of notifications.
1307ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * Grouped notifications may display in a cluster or stack on devices which
1308ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * support such rendering. Requires a group key also be set using {@link #setGroup}.
1309ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * @param isGroupSummary Whether this notification should be a group summary.
1310ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * @return this object for method chaining
1311ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         */
1312ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        public Builder setGroupSummary(boolean isGroupSummary) {
1313ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            mGroupSummary = isGroupSummary;
1314ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return this;
1315ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        }
1316ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
1317ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        /**
1318ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * Set a sort key that orders this notification among other notifications from the
1319ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * same package. This can be useful if an external sort was already applied and an app
1320ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * would like to preserve this. Notifications will be sorted lexicographically using this
1321ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * value, although providing different priorities in addition to providing sort key may
1322ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * cause this value to be ignored.
1323ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         *
1324ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * <p>This sort key can also be used to order members of a notification group. See
1325ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * {@link Builder#setGroup}.
1326ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         *
1327ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * @see String#compareTo(String)
1328ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         */
1329ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        public Builder setSortKey(String sortKey) {
1330ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            mSortKey = sortKey;
1331ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return this;
1332ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        }
1333ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
1334ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        /**
1335ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         * Merge additional metadata into this notification.
1336ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         *
1337ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         * <p>Values within the Bundle will replace existing extras values in this Builder.
1338ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         *
1339ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         * @see Notification#extras
1340ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         */
1341300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        public Builder addExtras(Bundle extras) {
1342300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            if (extras != null) {
1343300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen                if (mExtras == null) {
1344300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen                    mExtras = new Bundle(extras);
1345300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen                } else {
1346300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen                    mExtras.putAll(extras);
1347300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen                }
1348ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen            }
1349ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen            return this;
1350ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen        }
1351ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen
1352ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen        /**
1353ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         * Set metadata for this notification.
1354ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         *
1355ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         * <p>A reference to the Bundle is held for the lifetime of this Builder, and the Bundle's
1356ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         * current contents are copied into the Notification each time {@link #build()} is
1357ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         * called.
1358ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         *
1359ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         * <p>Replaces any existing extras values with those from the provided Bundle.
1360ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         * Use {@link #addExtras} to merge in metadata instead.
1361ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         *
1362ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         * @see Notification#extras
1363ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         */
1364300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        public Builder setExtras(Bundle extras) {
1365300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            mExtras = extras;
1366ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen            return this;
1367ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen        }
1368ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen
1369ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen        /**
1370ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         * Get the current metadata Bundle used by this notification Builder.
1371ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         *
1372ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         * <p>The returned Bundle is shared with this Builder.
1373ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         *
1374ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         * <p>The current contents of this Bundle are copied into the Notification each time
1375ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         * {@link #build()} is called.
1376ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         *
1377ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         * @see Notification#extras
1378ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         */
1379ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen        public Bundle getExtras() {
1380ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen            if (mExtras == null) {
1381ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen                mExtras = new Bundle();
1382ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen            }
1383ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen            return mExtras;
1384ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen        }
1385ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen
1386ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen        /**
1387f021758934b35e3b842c6799344531d7ea2969daChris Wren         * Add an action to this notification. Actions are typically displayed by
1388f021758934b35e3b842c6799344531d7ea2969daChris Wren         * the system as a button adjacent to the notification content.
1389884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin         * <br>
1390884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin         * Action buttons won't appear on platforms prior to Android 4.1. Action
1391884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin         * buttons depend on expanded notifications, which are only available in Android 4.1
1392884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin         * and later. To ensure that an action button's functionality is always available, first
1393884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin         * implement the functionality in the {@link android.app.Activity} that starts when a user
1394884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin         * clicks the  notification (see {@link #setContentIntent setContentIntent()}), and then
1395884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin         * enhance the notification by implementing the same functionality with
1396884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin         * {@link #addAction addAction()}.
1397f021758934b35e3b842c6799344531d7ea2969daChris Wren         *
1398f021758934b35e3b842c6799344531d7ea2969daChris Wren         * @param icon Resource ID of a drawable that represents the action.
1399f021758934b35e3b842c6799344531d7ea2969daChris Wren         * @param title Text describing the action.
1400884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin         * @param intent {@link android.app.PendingIntent} to be fired when the action is invoked.
1401f021758934b35e3b842c6799344531d7ea2969daChris Wren         */
1402f021758934b35e3b842c6799344531d7ea2969daChris Wren        public Builder addAction(int icon, CharSequence title, PendingIntent intent) {
1403f021758934b35e3b842c6799344531d7ea2969daChris Wren            mActions.add(new Action(icon, title, intent));
1404f021758934b35e3b842c6799344531d7ea2969daChris Wren            return this;
1405f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
1406f021758934b35e3b842c6799344531d7ea2969daChris Wren
1407f021758934b35e3b842c6799344531d7ea2969daChris Wren        /**
1408300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen         * Add an action to this notification. Actions are typically displayed by
1409300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen         * the system as a button adjacent to the notification content.
1410300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen         * <br>
1411300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen         * Action buttons won't appear on platforms prior to Android 4.1. Action
1412300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen         * buttons depend on expanded notifications, which are only available in Android 4.1
1413300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen         * and later. To ensure that an action button's functionality is always available, first
1414300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen         * implement the functionality in the {@link android.app.Activity} that starts when a user
1415300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen         * clicks the  notification (see {@link #setContentIntent setContentIntent()}), and then
1416300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen         * enhance the notification by implementing the same functionality with
1417300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen         * {@link #addAction addAction()}.
1418300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen         *
1419300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen         * @param action The action to add.
1420300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen         */
1421300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        public Builder addAction(Action action) {
1422300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            mActions.add(action);
1423300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            return this;
1424300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        }
1425300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
1426300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        /**
1427f021758934b35e3b842c6799344531d7ea2969daChris Wren         * Add a rich notification style to be applied at build time.
1428884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin         * <br>
1429884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin         * If the platform does not provide rich notification styles, this method has no effect. The
1430884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin         * user will always see the normal notification style.
1431f021758934b35e3b842c6799344531d7ea2969daChris Wren         *
1432f021758934b35e3b842c6799344531d7ea2969daChris Wren         * @param style Object responsible for modifying the notification style.
1433f021758934b35e3b842c6799344531d7ea2969daChris Wren         */
1434f021758934b35e3b842c6799344531d7ea2969daChris Wren        public Builder setStyle(Style style) {
1435f021758934b35e3b842c6799344531d7ea2969daChris Wren            if (mStyle != style) {
1436f021758934b35e3b842c6799344531d7ea2969daChris Wren                mStyle = style;
1437f021758934b35e3b842c6799344531d7ea2969daChris Wren                if (mStyle != null) {
1438f021758934b35e3b842c6799344531d7ea2969daChris Wren                    mStyle.setBuilder(this);
1439f021758934b35e3b842c6799344531d7ea2969daChris Wren                }
1440f021758934b35e3b842c6799344531d7ea2969daChris Wren            }
1441f021758934b35e3b842c6799344531d7ea2969daChris Wren            return this;
1442f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
1443f021758934b35e3b842c6799344531d7ea2969daChris Wren
1444f021758934b35e3b842c6799344531d7ea2969daChris Wren        /**
144569a58d36f6ed8ec4d076534556aba2f93d00254eDan Sandler         * Sets {@link Notification#color}.
144669a58d36f6ed8ec4d076534556aba2f93d00254eDan Sandler         *
144769a58d36f6ed8ec4d076534556aba2f93d00254eDan Sandler         * @param argb The accent color to use
144869a58d36f6ed8ec4d076534556aba2f93d00254eDan Sandler         *
144969a58d36f6ed8ec4d076534556aba2f93d00254eDan Sandler         * @return The same Builder.
145069a58d36f6ed8ec4d076534556aba2f93d00254eDan Sandler         */
145169a58d36f6ed8ec4d076534556aba2f93d00254eDan Sandler        public Builder setColor(int argb) {
145269a58d36f6ed8ec4d076534556aba2f93d00254eDan Sandler            mColor = argb;
145369a58d36f6ed8ec4d076534556aba2f93d00254eDan Sandler            return this;
145469a58d36f6ed8ec4d076534556aba2f93d00254eDan Sandler        }
145569a58d36f6ed8ec4d076534556aba2f93d00254eDan Sandler
145669a58d36f6ed8ec4d076534556aba2f93d00254eDan Sandler        /**
1457df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler         * Sets {@link Notification#visibility}.
1458df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler         *
1459df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler         * @param visibility One of {@link Notification#VISIBILITY_PRIVATE} (the default),
1460df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler         *                   {@link Notification#VISIBILITY_PUBLIC}, or
1461df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler         *                   {@link Notification#VISIBILITY_SECRET}.
1462df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler         */
1463df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler        public Builder setVisibility(int visibility) {
1464df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler            mVisibility = visibility;
1465df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler            return this;
1466df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler        }
1467df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler
1468df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler        /**
1469df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler         * Supply a replacement Notification whose contents should be shown in insecure contexts
1470df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler         * (i.e. atop the secure lockscreen). See {@link Notification#visibility} and
1471df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler         * {@link #VISIBILITY_PUBLIC}.
1472df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler         *
1473df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler         * @param n A replacement notification, presumably with some or all info redacted.
1474df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler         * @return The same Builder.
1475df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler         */
1476df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler        public Builder setPublicVersion(Notification n) {
1477df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler            mPublicVersion = n;
1478df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler            return this;
1479df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler        }
1480df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler
1481df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler        /**
1482ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * Apply an extender to this notification builder. Extenders may be used to add
1483ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * metadata or change options on this builder.
1484ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         */
14852bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public Builder extend(Extender extender) {
14862bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            extender.extend(this);
1487ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return this;
1488ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        }
1489ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
1490ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        /**
1491f021758934b35e3b842c6799344531d7ea2969daChris Wren         * @deprecated Use {@link #build()} instead.
1492f021758934b35e3b842c6799344531d7ea2969daChris Wren         */
1493f021758934b35e3b842c6799344531d7ea2969daChris Wren        @Deprecated
1494f021758934b35e3b842c6799344531d7ea2969daChris Wren        public Notification getNotification() {
1495fe3b5bac4901a4bb8cf51c09fe4910b02388818aGriff Hazen            return IMPL.build(this);
1496f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
1497f021758934b35e3b842c6799344531d7ea2969daChris Wren
1498f021758934b35e3b842c6799344531d7ea2969daChris Wren        /**
1499c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Combine all of the options that have been set and return a new {@link Notification}
1500c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * object.
1501c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
1502f021758934b35e3b842c6799344531d7ea2969daChris Wren        public Notification build() {
1503fe3b5bac4901a4bb8cf51c09fe4910b02388818aGriff Hazen            return IMPL.build(this);
1504f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
150524c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer
150624c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer        protected static CharSequence limitCharSequenceLength(CharSequence cs) {
150724c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer            if (cs == null) return cs;
150824c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer            if (cs.length() > MAX_CHARSEQUENCE_LENGTH) {
150924c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer                cs = cs.subSequence(0, MAX_CHARSEQUENCE_LENGTH);
151024c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer            }
151124c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer            return cs;
151224c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer        }
1513f021758934b35e3b842c6799344531d7ea2969daChris Wren    }
1514f021758934b35e3b842c6799344531d7ea2969daChris Wren
1515f021758934b35e3b842c6799344531d7ea2969daChris Wren    /**
1516f021758934b35e3b842c6799344531d7ea2969daChris Wren     * An object that can apply a rich notification style to a {@link Notification.Builder}
1517f021758934b35e3b842c6799344531d7ea2969daChris Wren     * object.
1518884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * <br>
1519884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * If the platform does not provide rich notification styles, methods in this class have no
1520884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * effect.
1521f021758934b35e3b842c6799344531d7ea2969daChris Wren     */
1522fe3b5bac4901a4bb8cf51c09fe4910b02388818aGriff Hazen    public static abstract class Style {
1523f021758934b35e3b842c6799344531d7ea2969daChris Wren        Builder mBuilder;
1524f021758934b35e3b842c6799344531d7ea2969daChris Wren        CharSequence mBigContentTitle;
1525f021758934b35e3b842c6799344531d7ea2969daChris Wren        CharSequence mSummaryText;
1526f021758934b35e3b842c6799344531d7ea2969daChris Wren        boolean mSummaryTextSet = false;
1527f021758934b35e3b842c6799344531d7ea2969daChris Wren
1528f021758934b35e3b842c6799344531d7ea2969daChris Wren        public void setBuilder(Builder builder) {
1529f021758934b35e3b842c6799344531d7ea2969daChris Wren            if (mBuilder != builder) {
1530f021758934b35e3b842c6799344531d7ea2969daChris Wren                mBuilder = builder;
1531f021758934b35e3b842c6799344531d7ea2969daChris Wren                if (mBuilder != null) {
1532f021758934b35e3b842c6799344531d7ea2969daChris Wren                    mBuilder.setStyle(this);
1533f021758934b35e3b842c6799344531d7ea2969daChris Wren                }
1534f021758934b35e3b842c6799344531d7ea2969daChris Wren            }
1535f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
1536f021758934b35e3b842c6799344531d7ea2969daChris Wren
1537f021758934b35e3b842c6799344531d7ea2969daChris Wren        public Notification build() {
1538f021758934b35e3b842c6799344531d7ea2969daChris Wren            Notification notification = null;
1539f021758934b35e3b842c6799344531d7ea2969daChris Wren            if (mBuilder != null) {
1540f021758934b35e3b842c6799344531d7ea2969daChris Wren                notification = mBuilder.build();
1541884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin            }
1542f021758934b35e3b842c6799344531d7ea2969daChris Wren            return notification;
1543f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
1544f021758934b35e3b842c6799344531d7ea2969daChris Wren    }
1545f021758934b35e3b842c6799344531d7ea2969daChris Wren
1546f021758934b35e3b842c6799344531d7ea2969daChris Wren    /**
1547f021758934b35e3b842c6799344531d7ea2969daChris Wren     * Helper class for generating large-format notifications that include a large image attachment.
1548884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * <br>
1549884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * If the platform does not provide large-format notifications, this method has no effect. The
1550884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * user will always see the normal notification view.
1551884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * <br>
1552f021758934b35e3b842c6799344531d7ea2969daChris Wren     * This class is a "rebuilder": It attaches to a Builder object and modifies its behavior, like so:
1553f021758934b35e3b842c6799344531d7ea2969daChris Wren     * <pre class="prettyprint">
155477b88e3651ede1a5d45fb4c19f34b2f78d67f33fRobert Ly     * Notification notif = new Notification.Builder(mContext)
1555f021758934b35e3b842c6799344531d7ea2969daChris Wren     *     .setContentTitle(&quot;New photo from &quot; + sender.toString())
1556f021758934b35e3b842c6799344531d7ea2969daChris Wren     *     .setContentText(subject)
1557f021758934b35e3b842c6799344531d7ea2969daChris Wren     *     .setSmallIcon(R.drawable.new_post)
1558f021758934b35e3b842c6799344531d7ea2969daChris Wren     *     .setLargeIcon(aBitmap)
1559f021758934b35e3b842c6799344531d7ea2969daChris Wren     *     .setStyle(new Notification.BigPictureStyle()
1560f021758934b35e3b842c6799344531d7ea2969daChris Wren     *         .bigPicture(aBigBitmap))
1561f021758934b35e3b842c6799344531d7ea2969daChris Wren     *     .build();
1562f021758934b35e3b842c6799344531d7ea2969daChris Wren     * </pre>
1563884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     *
1564f021758934b35e3b842c6799344531d7ea2969daChris Wren     * @see Notification#bigContentView
1565f021758934b35e3b842c6799344531d7ea2969daChris Wren     */
1566f021758934b35e3b842c6799344531d7ea2969daChris Wren    public static class BigPictureStyle extends Style {
1567f021758934b35e3b842c6799344531d7ea2969daChris Wren        Bitmap mPicture;
156849714d665f839c4804a17eea129092f8b472926dRoman Nurik        Bitmap mBigLargeIcon;
156949714d665f839c4804a17eea129092f8b472926dRoman Nurik        boolean mBigLargeIconSet;
1570f021758934b35e3b842c6799344531d7ea2969daChris Wren
1571f021758934b35e3b842c6799344531d7ea2969daChris Wren        public BigPictureStyle() {
1572f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
1573f021758934b35e3b842c6799344531d7ea2969daChris Wren
1574f021758934b35e3b842c6799344531d7ea2969daChris Wren        public BigPictureStyle(Builder builder) {
1575f021758934b35e3b842c6799344531d7ea2969daChris Wren            setBuilder(builder);
1576f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
1577f021758934b35e3b842c6799344531d7ea2969daChris Wren
1578f021758934b35e3b842c6799344531d7ea2969daChris Wren        /**
1579f021758934b35e3b842c6799344531d7ea2969daChris Wren         * Overrides ContentTitle in the big form of the template.
1580f021758934b35e3b842c6799344531d7ea2969daChris Wren         * This defaults to the value passed to setContentTitle().
1581f021758934b35e3b842c6799344531d7ea2969daChris Wren         */
1582f021758934b35e3b842c6799344531d7ea2969daChris Wren        public BigPictureStyle setBigContentTitle(CharSequence title) {
158324c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer            mBigContentTitle = Builder.limitCharSequenceLength(title);
1584f021758934b35e3b842c6799344531d7ea2969daChris Wren            return this;
1585f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
1586f021758934b35e3b842c6799344531d7ea2969daChris Wren
1587f021758934b35e3b842c6799344531d7ea2969daChris Wren        /**
1588f021758934b35e3b842c6799344531d7ea2969daChris Wren         * Set the first line of text after the detail section in the big form of the template.
1589f021758934b35e3b842c6799344531d7ea2969daChris Wren         */
1590f021758934b35e3b842c6799344531d7ea2969daChris Wren        public BigPictureStyle setSummaryText(CharSequence cs) {
159124c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer            mSummaryText = Builder.limitCharSequenceLength(cs);
1592f021758934b35e3b842c6799344531d7ea2969daChris Wren            mSummaryTextSet = true;
1593f021758934b35e3b842c6799344531d7ea2969daChris Wren            return this;
1594f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
1595f021758934b35e3b842c6799344531d7ea2969daChris Wren
1596b41a213761ff07de2fcfdaf16790fdcca1a1ee1bChris Wren        /**
1597b41a213761ff07de2fcfdaf16790fdcca1a1ee1bChris Wren         * Provide the bitmap to be used as the payload for the BigPicture notification.
1598b41a213761ff07de2fcfdaf16790fdcca1a1ee1bChris Wren         */
1599f021758934b35e3b842c6799344531d7ea2969daChris Wren        public BigPictureStyle bigPicture(Bitmap b) {
1600f021758934b35e3b842c6799344531d7ea2969daChris Wren            mPicture = b;
1601f021758934b35e3b842c6799344531d7ea2969daChris Wren            return this;
1602f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
160349714d665f839c4804a17eea129092f8b472926dRoman Nurik
160449714d665f839c4804a17eea129092f8b472926dRoman Nurik        /**
160549714d665f839c4804a17eea129092f8b472926dRoman Nurik         * Override the large icon when the big notification is shown.
160649714d665f839c4804a17eea129092f8b472926dRoman Nurik         */
160749714d665f839c4804a17eea129092f8b472926dRoman Nurik        public BigPictureStyle bigLargeIcon(Bitmap b) {
160849714d665f839c4804a17eea129092f8b472926dRoman Nurik            mBigLargeIcon = b;
160949714d665f839c4804a17eea129092f8b472926dRoman Nurik            mBigLargeIconSet = true;
161049714d665f839c4804a17eea129092f8b472926dRoman Nurik            return this;
161149714d665f839c4804a17eea129092f8b472926dRoman Nurik        }
1612f021758934b35e3b842c6799344531d7ea2969daChris Wren    }
1613f021758934b35e3b842c6799344531d7ea2969daChris Wren
1614f021758934b35e3b842c6799344531d7ea2969daChris Wren    /**
1615f021758934b35e3b842c6799344531d7ea2969daChris Wren     * Helper class for generating large-format notifications that include a lot of text.
1616884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     *
1617884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * <br>
1618884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * If the platform does not provide large-format notifications, this method has no effect. The
1619884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * user will always see the normal notification view.
1620884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * <br>
1621f021758934b35e3b842c6799344531d7ea2969daChris Wren     * This class is a "rebuilder": It attaches to a Builder object and modifies its behavior, like so:
1622f021758934b35e3b842c6799344531d7ea2969daChris Wren     * <pre class="prettyprint">
162377b88e3651ede1a5d45fb4c19f34b2f78d67f33fRobert Ly     * Notification notif = new Notification.Builder(mContext)
1624f021758934b35e3b842c6799344531d7ea2969daChris Wren     *     .setContentTitle(&quot;New mail from &quot; + sender.toString())
1625f021758934b35e3b842c6799344531d7ea2969daChris Wren     *     .setContentText(subject)
1626f021758934b35e3b842c6799344531d7ea2969daChris Wren     *     .setSmallIcon(R.drawable.new_mail)
1627f021758934b35e3b842c6799344531d7ea2969daChris Wren     *     .setLargeIcon(aBitmap)
1628f021758934b35e3b842c6799344531d7ea2969daChris Wren     *     .setStyle(new Notification.BigTextStyle()
1629f021758934b35e3b842c6799344531d7ea2969daChris Wren     *         .bigText(aVeryLongString))
1630f021758934b35e3b842c6799344531d7ea2969daChris Wren     *     .build();
1631f021758934b35e3b842c6799344531d7ea2969daChris Wren     * </pre>
1632884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     *
1633f021758934b35e3b842c6799344531d7ea2969daChris Wren     * @see Notification#bigContentView
1634f021758934b35e3b842c6799344531d7ea2969daChris Wren     */
1635f021758934b35e3b842c6799344531d7ea2969daChris Wren    public static class BigTextStyle extends Style {
1636f021758934b35e3b842c6799344531d7ea2969daChris Wren        CharSequence mBigText;
1637f021758934b35e3b842c6799344531d7ea2969daChris Wren
1638f021758934b35e3b842c6799344531d7ea2969daChris Wren        public BigTextStyle() {
1639f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
1640f021758934b35e3b842c6799344531d7ea2969daChris Wren
1641f021758934b35e3b842c6799344531d7ea2969daChris Wren        public BigTextStyle(Builder builder) {
1642f021758934b35e3b842c6799344531d7ea2969daChris Wren            setBuilder(builder);
1643f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
1644f021758934b35e3b842c6799344531d7ea2969daChris Wren
1645f021758934b35e3b842c6799344531d7ea2969daChris Wren        /**
1646f021758934b35e3b842c6799344531d7ea2969daChris Wren         * Overrides ContentTitle in the big form of the template.
1647f021758934b35e3b842c6799344531d7ea2969daChris Wren         * This defaults to the value passed to setContentTitle().
1648f021758934b35e3b842c6799344531d7ea2969daChris Wren         */
1649f021758934b35e3b842c6799344531d7ea2969daChris Wren        public BigTextStyle setBigContentTitle(CharSequence title) {
165024c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer            mBigContentTitle = Builder.limitCharSequenceLength(title);
1651f021758934b35e3b842c6799344531d7ea2969daChris Wren            return this;
1652f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
1653f021758934b35e3b842c6799344531d7ea2969daChris Wren
1654f021758934b35e3b842c6799344531d7ea2969daChris Wren        /**
1655f021758934b35e3b842c6799344531d7ea2969daChris Wren         * Set the first line of text after the detail section in the big form of the template.
1656f021758934b35e3b842c6799344531d7ea2969daChris Wren         */
1657f021758934b35e3b842c6799344531d7ea2969daChris Wren        public BigTextStyle setSummaryText(CharSequence cs) {
165824c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer            mSummaryText = Builder.limitCharSequenceLength(cs);
1659f021758934b35e3b842c6799344531d7ea2969daChris Wren            mSummaryTextSet = true;
1660f021758934b35e3b842c6799344531d7ea2969daChris Wren            return this;
1661f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
1662f021758934b35e3b842c6799344531d7ea2969daChris Wren
1663b41a213761ff07de2fcfdaf16790fdcca1a1ee1bChris Wren        /**
1664b41a213761ff07de2fcfdaf16790fdcca1a1ee1bChris Wren         * Provide the longer text to be displayed in the big form of the
1665b41a213761ff07de2fcfdaf16790fdcca1a1ee1bChris Wren         * template in place of the content text.
1666b41a213761ff07de2fcfdaf16790fdcca1a1ee1bChris Wren         */
1667f021758934b35e3b842c6799344531d7ea2969daChris Wren        public BigTextStyle bigText(CharSequence cs) {
166824c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer            mBigText = Builder.limitCharSequenceLength(cs);
1669f021758934b35e3b842c6799344531d7ea2969daChris Wren            return this;
1670f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
1671f021758934b35e3b842c6799344531d7ea2969daChris Wren    }
1672f021758934b35e3b842c6799344531d7ea2969daChris Wren
1673f021758934b35e3b842c6799344531d7ea2969daChris Wren    /**
1674f021758934b35e3b842c6799344531d7ea2969daChris Wren     * Helper class for generating large-format notifications that include a list of (up to 5) strings.
1675884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     *
1676884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * <br>
1677884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * If the platform does not provide large-format notifications, this method has no effect. The
1678884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * user will always see the normal notification view.
1679884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * <br>
1680f021758934b35e3b842c6799344531d7ea2969daChris Wren     * This class is a "rebuilder": It attaches to a Builder object and modifies its behavior, like so:
1681f021758934b35e3b842c6799344531d7ea2969daChris Wren     * <pre class="prettyprint">
1682f021758934b35e3b842c6799344531d7ea2969daChris Wren     * Notification noti = new Notification.Builder()
1683f021758934b35e3b842c6799344531d7ea2969daChris Wren     *     .setContentTitle(&quot;5 New mails from &quot; + sender.toString())
1684f021758934b35e3b842c6799344531d7ea2969daChris Wren     *     .setContentText(subject)
1685f021758934b35e3b842c6799344531d7ea2969daChris Wren     *     .setSmallIcon(R.drawable.new_mail)
1686f021758934b35e3b842c6799344531d7ea2969daChris Wren     *     .setLargeIcon(aBitmap)
1687f021758934b35e3b842c6799344531d7ea2969daChris Wren     *     .setStyle(new Notification.InboxStyle()
1688f021758934b35e3b842c6799344531d7ea2969daChris Wren     *         .addLine(str1)
1689f021758934b35e3b842c6799344531d7ea2969daChris Wren     *         .addLine(str2)
1690f021758934b35e3b842c6799344531d7ea2969daChris Wren     *         .setContentTitle(&quot;&quot;)
1691f021758934b35e3b842c6799344531d7ea2969daChris Wren     *         .setSummaryText(&quot;+3 more&quot;))
1692f021758934b35e3b842c6799344531d7ea2969daChris Wren     *     .build();
1693f021758934b35e3b842c6799344531d7ea2969daChris Wren     * </pre>
1694884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     *
1695f021758934b35e3b842c6799344531d7ea2969daChris Wren     * @see Notification#bigContentView
1696f021758934b35e3b842c6799344531d7ea2969daChris Wren     */
1697f021758934b35e3b842c6799344531d7ea2969daChris Wren    public static class InboxStyle extends Style {
1698f021758934b35e3b842c6799344531d7ea2969daChris Wren        ArrayList<CharSequence> mTexts = new ArrayList<CharSequence>();
1699f021758934b35e3b842c6799344531d7ea2969daChris Wren
1700f021758934b35e3b842c6799344531d7ea2969daChris Wren        public InboxStyle() {
1701f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
1702f021758934b35e3b842c6799344531d7ea2969daChris Wren
1703f021758934b35e3b842c6799344531d7ea2969daChris Wren        public InboxStyle(Builder builder) {
1704f021758934b35e3b842c6799344531d7ea2969daChris Wren            setBuilder(builder);
1705f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
1706f021758934b35e3b842c6799344531d7ea2969daChris Wren
1707f021758934b35e3b842c6799344531d7ea2969daChris Wren        /**
1708f021758934b35e3b842c6799344531d7ea2969daChris Wren         * Overrides ContentTitle in the big form of the template.
1709f021758934b35e3b842c6799344531d7ea2969daChris Wren         * This defaults to the value passed to setContentTitle().
1710f021758934b35e3b842c6799344531d7ea2969daChris Wren         */
1711f021758934b35e3b842c6799344531d7ea2969daChris Wren        public InboxStyle setBigContentTitle(CharSequence title) {
171224c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer            mBigContentTitle = Builder.limitCharSequenceLength(title);
1713f021758934b35e3b842c6799344531d7ea2969daChris Wren            return this;
1714f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
1715f021758934b35e3b842c6799344531d7ea2969daChris Wren
1716f021758934b35e3b842c6799344531d7ea2969daChris Wren        /**
1717f021758934b35e3b842c6799344531d7ea2969daChris Wren         * Set the first line of text after the detail section in the big form of the template.
1718f021758934b35e3b842c6799344531d7ea2969daChris Wren         */
1719f021758934b35e3b842c6799344531d7ea2969daChris Wren        public InboxStyle setSummaryText(CharSequence cs) {
172024c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer            mSummaryText = Builder.limitCharSequenceLength(cs);
1721f021758934b35e3b842c6799344531d7ea2969daChris Wren            mSummaryTextSet = true;
1722f021758934b35e3b842c6799344531d7ea2969daChris Wren            return this;
1723f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
1724f021758934b35e3b842c6799344531d7ea2969daChris Wren
1725b41a213761ff07de2fcfdaf16790fdcca1a1ee1bChris Wren        /**
1726b41a213761ff07de2fcfdaf16790fdcca1a1ee1bChris Wren         * Append a line to the digest section of the Inbox notification.
1727b41a213761ff07de2fcfdaf16790fdcca1a1ee1bChris Wren         */
1728f021758934b35e3b842c6799344531d7ea2969daChris Wren        public InboxStyle addLine(CharSequence cs) {
172924c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer            mTexts.add(Builder.limitCharSequenceLength(cs));
1730f021758934b35e3b842c6799344531d7ea2969daChris Wren            return this;
1731f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
1732f021758934b35e3b842c6799344531d7ea2969daChris Wren    }
1733f021758934b35e3b842c6799344531d7ea2969daChris Wren
1734300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen    /**
1735300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen     * Structure to encapsulate a named action that can be shown as part of this notification.
1736300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen     * It must include an icon, a label, and a {@link PendingIntent} to be fired when the action is
1737300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen     * selected by the user. Action buttons won't appear on platforms prior to Android 4.1.
1738300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen     * <p>
1739300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen     * Apps should use {@link NotificationCompat.Builder#addAction(int, CharSequence, PendingIntent)}
1740300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen     * or {@link NotificationCompat.Builder#addAction(NotificationCompat.Action)}
1741300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen     * to attach actions.
1742300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen     */
1743ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    public static class Action extends NotificationCompatBase.Action {
1744300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        private final Bundle mExtras;
17452bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private final RemoteInput[] mRemoteInputs;
1746300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
1747300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        /**
1748300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen         * Small icon representing the action.
1749300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen         */
1750f021758934b35e3b842c6799344531d7ea2969daChris Wren        public int icon;
1751300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        /**
1752300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen         * Title of the action.
1753300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen         */
1754f021758934b35e3b842c6799344531d7ea2969daChris Wren        public CharSequence title;
1755300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        /**
1756300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen         * Intent to send when the user invokes this action. May be null, in which case the action
1757300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen         * may be rendered in a disabled presentation.
1758300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen         */
1759f021758934b35e3b842c6799344531d7ea2969daChris Wren        public PendingIntent actionIntent;
1760f021758934b35e3b842c6799344531d7ea2969daChris Wren
1761300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        public Action(int icon, CharSequence title, PendingIntent intent) {
1762ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            this(icon, title, intent, new Bundle(), null);
1763300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        }
1764300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
1765ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        private Action(int icon, CharSequence title, PendingIntent intent, Bundle extras,
1766ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                RemoteInput[] remoteInputs) {
1767300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            this.icon = icon;
176824c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer            this.title = NotificationCompat.Builder.limitCharSequenceLength(title);
1769300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            this.actionIntent = intent;
1770300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            this.mExtras = extras != null ? extras : new Bundle();
1771ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            this.mRemoteInputs = remoteInputs;
1772ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        }
1773ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
1774ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        @Override
1775ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        protected int getIcon() {
1776ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return icon;
1777ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        }
1778ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
1779ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        @Override
1780ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        protected CharSequence getTitle() {
1781ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return title;
1782ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        }
1783ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
1784ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        @Override
1785ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        protected PendingIntent getActionIntent() {
1786ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return actionIntent;
1787300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        }
1788300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
1789300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        /**
1790300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen         * Get additional metadata carried around with this Action.
1791300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen         */
1792300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        public Bundle getExtras() {
1793300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            return mExtras;
1794300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        }
1795300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
1796300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        /**
1797ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * Get the list of inputs to be collected from the user when this action is sent.
1798ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * May return null if no remote inputs were added.
1799ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         */
1800ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        public RemoteInput[] getRemoteInputs() {
1801ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return mRemoteInputs;
1802ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        }
1803ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
1804ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        /**
1805300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen         * Builder class for {@link Action} objects.
1806300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen         */
1807ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        public static final class Builder {
1808300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            private final int mIcon;
1809300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            private final CharSequence mTitle;
1810300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            private final PendingIntent mIntent;
1811300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            private final Bundle mExtras;
1812ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            private ArrayList<RemoteInput> mRemoteInputs;
1813300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
1814300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            /**
1815300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen             * Construct a new builder for {@link Action} object.
1816300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen             * @param icon icon to show for this action
1817300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen             * @param title the title of the action
1818300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen             * @param intent the {@link PendingIntent} to fire when users trigger this action
1819300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen             */
1820300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            public Builder(int icon, CharSequence title, PendingIntent intent) {
1821300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen                this(icon, title, intent, new Bundle());
1822300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            }
1823300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
1824300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            /**
1825300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen             * Construct a new builder for {@link Action} object using the fields from an
1826300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen             * {@link Action}.
1827300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen             * @param action the action to read fields from.
1828300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen             */
1829300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            public Builder(Action action) {
1830300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen                this(action.icon, action.title, action.actionIntent, new Bundle(action.mExtras));
1831300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            }
1832300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
1833300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            private Builder(int icon, CharSequence title, PendingIntent intent, Bundle extras) {
1834300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen                mIcon = icon;
183524c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer                mTitle = NotificationCompat.Builder.limitCharSequenceLength(title);
1836300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen                mIntent = intent;
1837300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen                mExtras = extras;
1838300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            }
1839300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
1840300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            /**
1841300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen             * Merge additional metadata into this builder.
1842300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen             *
1843300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen             * <p>Values within the Bundle will replace existing extras values in this Builder.
1844300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen             *
1845300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen             * @see NotificationCompat.Action#getExtras
1846300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen             */
1847300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            public Builder addExtras(Bundle extras) {
1848300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen                if (extras != null) {
1849300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen                    mExtras.putAll(extras);
1850300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen                }
1851300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen                return this;
1852300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            }
1853300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
1854300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            /**
1855300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen             * Get the metadata Bundle used by this Builder.
1856300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen             *
1857300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen             * <p>The returned Bundle is shared with this Builder.
1858300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen             */
1859300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            public Bundle getExtras() {
1860300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen                return mExtras;
1861300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            }
1862300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
1863300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            /**
1864ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen             * Add an input to be collected from the user when this action is sent.
1865ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen             * Response values can be retrieved from the fired intent by using the
1866ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen             * {@link RemoteInput#getResultsFromIntent} function.
1867ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen             * @param remoteInput a {@link RemoteInput} to add to the action
1868ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen             * @return this object for method chaining
1869ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen             */
1870ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            public Builder addRemoteInput(RemoteInput remoteInput) {
1871ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                if (mRemoteInputs == null) {
1872ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                    mRemoteInputs = new ArrayList<RemoteInput>();
1873ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                }
1874ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                mRemoteInputs.add(remoteInput);
1875ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                return this;
1876ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            }
1877ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
1878ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            /**
1879ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen             * Apply an extender to this action builder. Extenders may be used to add
1880ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen             * metadata or change options on this builder.
1881ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen             */
18822bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            public Builder extend(Extender extender) {
18832bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                extender.extend(this);
1884ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                return this;
1885ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            }
1886ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
1887ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            /**
1888300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen             * Combine all of the options that have been set and return a new {@link Action}
1889300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen             * object.
1890300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen             * @return the built action
1891300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen             */
1892300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            public Action build() {
1893ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                RemoteInput[] remoteInputs = mRemoteInputs != null
1894ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                        ? mRemoteInputs.toArray(new RemoteInput[mRemoteInputs.size()]) : null;
1895ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                return new Action(mIcon, mTitle, mIntent, mExtras, remoteInputs);
1896300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            }
1897300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        }
1898300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
18992bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
19002bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
19012bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Extender interface for use with {@link Builder#extend}. Extenders may be used to add
19022bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * metadata or change options on an action builder.
19032bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
19042bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public interface Extender {
19052bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            /**
19062bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             * Apply this extender to a notification action builder.
19072bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             * @param builder the builder to be modified.
19082bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             * @return the build object for chaining.
19092bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             */
19102bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            public Builder extend(Builder builder);
19112bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
19122bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
19132bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
19142bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Wearable extender for notification actions. To add extensions to an action,
19152bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * create a new {@link NotificationCompat.Action.WearableExtender} object using
19162bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * the {@code WearableExtender()} constructor and apply it to a
19172bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * {@link NotificationCompat.Action.Builder} using
19182bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * {@link NotificationCompat.Action.Builder#extend}.
19192bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         *
19202bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * <pre class="prettyprint">
19212bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * NotificationCompat.Action action = new NotificationCompat.Action.Builder(
19222bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         *         R.drawable.archive_all, "Archive all", actionIntent)
192333176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         *         .extend(new NotificationCompat.Action.WearableExtender()
19242bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         *                 .setAvailableOffline(false))
192533176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         *         .build();</pre>
19262bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
19272bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public static final class WearableExtender implements Extender {
19282bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            /** Notification action extra which contains wearable extensions */
19292bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            private static final String EXTRA_WEARABLE_EXTENSIONS = "android.wearable.EXTENSIONS";
19302bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
19312bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            private static final String KEY_FLAGS = "flags";
19322bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
19332bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            // Flags bitwise-ored to mFlags
19342bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            private static final int FLAG_AVAILABLE_OFFLINE = 0x1;
19352bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
19362bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            // Default value for flags integer
19372bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            private static final int DEFAULT_FLAGS = FLAG_AVAILABLE_OFFLINE;
19382bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
19392bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            private int mFlags = DEFAULT_FLAGS;
19402bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
19412bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            /**
19422bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             * Create a {@link NotificationCompat.Action.WearableExtender} with default
19432bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             * options.
19442bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             */
19452bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            public WearableExtender() {
19462bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            }
19472bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
19482bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            /**
19492bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             * Create a {@link NotificationCompat.Action.WearableExtender} by reading
19502bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             * wearable options present in an existing notification action.
19512bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             * @param action the notification action to inspect.
19522bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             */
19532bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            public WearableExtender(Action action) {
19542bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                Bundle wearableBundle = action.getExtras().getBundle(EXTRA_WEARABLE_EXTENSIONS);
19552bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                if (wearableBundle != null) {
19562bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                    mFlags = wearableBundle.getInt(KEY_FLAGS, DEFAULT_FLAGS);
19572bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                }
19582bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            }
19592bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
19602bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            /**
19612bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             * Apply wearable extensions to a notification action that is being built. This is
19622bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             * typically called by the {@link NotificationCompat.Action.Builder#extend}
19632bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             * method of {@link NotificationCompat.Action.Builder}.
19642bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             */
19652bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            @Override
19662bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            public Action.Builder extend(Action.Builder builder) {
19672bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                Bundle wearableBundle = new Bundle();
19682bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
19692bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                if (mFlags != DEFAULT_FLAGS) {
19702bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                    wearableBundle.putInt(KEY_FLAGS, mFlags);
19712bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                }
19722bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
19732bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                builder.getExtras().putBundle(EXTRA_WEARABLE_EXTENSIONS, wearableBundle);
19742bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                return builder;
19752bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            }
19762bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
19772bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            @Override
19782bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            public WearableExtender clone() {
19792bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                WearableExtender that = new WearableExtender();
19802bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                that.mFlags = this.mFlags;
19812bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                return that;
19822bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            }
19832bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
19842bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            /**
19852bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             * Set whether this action is available when the wearable device is not connected to
19862bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             * a companion device. The user can still trigger this action when the wearable device
19872bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             * is offline, but a visual hint will indicate that the action may not be available.
19882bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             * Defaults to true.
19892bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             */
19902bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            public WearableExtender setAvailableOffline(boolean availableOffline) {
19912bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                setFlag(FLAG_AVAILABLE_OFFLINE, availableOffline);
19922bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                return this;
19932bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            }
19942bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
19952bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            /**
19962bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             * Get whether this action is available when the wearable device is not connected to
19972bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             * a companion device. The user can still trigger this action when the wearable device
19982bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             * is offline, but a visual hint will indicate that the action may not be available.
19992bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             * Defaults to true.
20002bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             */
20012bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            public boolean isAvailableOffline() {
20022bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                return (mFlags & FLAG_AVAILABLE_OFFLINE) != 0;
20032bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            }
20042bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
20052bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            private void setFlag(int mask, boolean value) {
20062bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                if (value) {
20072bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                    mFlags |= mask;
20082bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                } else {
20092bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                    mFlags &= ~mask;
20102bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                }
20112bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            }
20122bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
20132bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
2014ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        /** @hide */
2015ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        public static final Factory FACTORY = new Factory() {
2016ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            @Override
2017ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            public Action build(int icon, CharSequence title,
2018ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                    PendingIntent actionIntent, Bundle extras,
2019ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                    RemoteInputCompatBase.RemoteInput[] remoteInputs) {
2020ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                return new Action(icon, title, actionIntent, extras,
2021ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                        (RemoteInput[]) remoteInputs);
2022ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            }
2023300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
2024ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            @Override
2025ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            public Action[] newArray(int length) {
2026ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                return new Action[length];
2027ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            }
2028ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        };
2029c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell    }
2030b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen
20312bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
20322bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen    /**
20332bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     * Extender interface for use with {@link Builder#extend}. Extenders may be used to add
20342bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     * metadata or change options on a notification builder.
20352bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     */
20362bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen    public interface Extender {
20372bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
20382bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Apply this extender to a notification builder.
20392bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @param builder the builder to be modified.
20402bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @return the build object for chaining.
20412bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
20422bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public Builder extend(Builder builder);
20432bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen    }
20442bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
20452bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen    /**
20462bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     * Helper class to add wearable extensions to notifications.
20472bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     * <p class="note"> See
20482bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     * <a href="{@docRoot}wear/notifications/creating.html">Creating Notifications
20492bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     * for Android Wear</a> for more information on how to use this class.
20502bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     * <p>
20512bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     * To create a notification with wearable extensions:
20522bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     * <ol>
20532bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     *   <li>Create a {@link NotificationCompat.Builder}, setting any desired
20542bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     *   properties.
20552bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     *   <li>Create a {@link NotificationCompat.WearableExtender}.
20562bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     *   <li>Set wearable-specific properties using the
20572bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     *   {@code add} and {@code set} methods of {@link NotificationCompat.WearableExtender}.
20582bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     *   <li>Call {@link NotificationCompat.Builder#extend} to apply the extensions to a
20592bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     *   notification.
20602bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     *   <li>Post the notification to the notification
20612bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     *   system with the {@code NotificationManagerCompat.notify(...)} methods
20622bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     *   and not the {@code NotificationManager.notify(...)} methods.
20632bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     * </ol>
20642bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     *
20652bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     * <pre class="prettyprint">
20662bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     * Notification notif = new NotificationCompat.Builder(mContext)
20672bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     *         .setContentTitle(&quot;New mail from &quot; + sender.toString())
20682bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     *         .setContentText(subject)
20692bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     *         .setSmallIcon(R.drawable.new_mail)
20702bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     *         .extend(new NotificationCompat.WearableExtender()
20712bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     *                 .setContentIcon(R.drawable.new_mail))
20722bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     *         .build();
20732bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     * NotificationManagerCompat.from(mContext).notify(0, notif);</pre>
20742bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     *
20752bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     * <p>Wearable extensions can be accessed on an existing notification by using the
20762bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     * {@code WearableExtender(Notification)} constructor,
20772bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     * and then using the {@code get} methods to access values.
20782bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     *
20792bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     * <pre class="prettyprint">
20802bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     * NotificationCompat.WearableExtender wearableExtender =
20812bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     *         new NotificationCompat.WearableExtender(notification);
208233176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen     * List&lt;Notification&gt; pages = wearableExtender.getPages();</pre>
20832bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     */
20842bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen    public static final class WearableExtender implements Extender {
20852bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
20862bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Sentinel value for an action index that is unset.
20872bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
20882bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public static final int UNSET_ACTION_INDEX = -1;
20892bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
20902bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
20912bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Size value for use with {@link #setCustomSizePreset} to show this notification with
20922bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * default sizing.
20932bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * <p>For custom display notifications created using {@link #setDisplayIntent},
20942bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * the default is {@link #SIZE_LARGE}. All other notifications size automatically based
20952bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * on their content.
20962bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
20972bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public static final int SIZE_DEFAULT = 0;
20982bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
20992bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
21002bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Size value for use with {@link #setCustomSizePreset} to show this notification
21012bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * with an extra small size.
21022bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * <p>This value is only applicable for custom display notifications created using
21032bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * {@link #setDisplayIntent}.
21042bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
21052bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public static final int SIZE_XSMALL = 1;
21062bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
21072bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
21082bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Size value for use with {@link #setCustomSizePreset} to show this notification
21092bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * with a small size.
21102bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * <p>This value is only applicable for custom display notifications created using
21112bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * {@link #setDisplayIntent}.
21122bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
21132bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public static final int SIZE_SMALL = 2;
21142bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
21152bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
21162bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Size value for use with {@link #setCustomSizePreset} to show this notification
21172bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * with a medium size.
21182bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * <p>This value is only applicable for custom display notifications created using
21192bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * {@link #setDisplayIntent}.
21202bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
21212bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public static final int SIZE_MEDIUM = 3;
21222bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
21232bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
21242bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Size value for use with {@link #setCustomSizePreset} to show this notification
21252bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * with a large size.
21262bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * <p>This value is only applicable for custom display notifications created using
21272bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * {@link #setDisplayIntent}.
21282bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
21292bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public static final int SIZE_LARGE = 4;
21302bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
2131fd5d0d05e9b44fcb0a9dab91290d53b464fc0939Griff Hazen        /**
2132fd5d0d05e9b44fcb0a9dab91290d53b464fc0939Griff Hazen         * Size value for use with {@link #setCustomSizePreset} to show this notification
2133fd5d0d05e9b44fcb0a9dab91290d53b464fc0939Griff Hazen         * full screen.
2134fd5d0d05e9b44fcb0a9dab91290d53b464fc0939Griff Hazen         * <p>This value is only applicable for custom display notifications created using
2135fd5d0d05e9b44fcb0a9dab91290d53b464fc0939Griff Hazen         * {@link #setDisplayIntent}.
2136fd5d0d05e9b44fcb0a9dab91290d53b464fc0939Griff Hazen         */
2137fd5d0d05e9b44fcb0a9dab91290d53b464fc0939Griff Hazen        public static final int SIZE_FULL_SCREEN = 5;
2138fd5d0d05e9b44fcb0a9dab91290d53b464fc0939Griff Hazen
21392bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /** Notification extra which contains wearable extensions */
21402bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private static final String EXTRA_WEARABLE_EXTENSIONS = "android.wearable.EXTENSIONS";
21412bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
21422bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        // Keys within EXTRA_WEARABLE_OPTIONS for wearable options.
21432bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private static final String KEY_ACTIONS = "actions";
21442bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private static final String KEY_FLAGS = "flags";
21452bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private static final String KEY_DISPLAY_INTENT = "displayIntent";
21462bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private static final String KEY_PAGES = "pages";
21472bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private static final String KEY_BACKGROUND = "background";
21482bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private static final String KEY_CONTENT_ICON = "contentIcon";
21492bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private static final String KEY_CONTENT_ICON_GRAVITY = "contentIconGravity";
21502bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private static final String KEY_CONTENT_ACTION_INDEX = "contentActionIndex";
21512bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private static final String KEY_CUSTOM_SIZE_PRESET = "customSizePreset";
21522bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private static final String KEY_CUSTOM_CONTENT_HEIGHT = "customContentHeight";
21532bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private static final String KEY_GRAVITY = "gravity";
21542bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
21552bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        // Flags bitwise-ored to mFlags
21562bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private static final int FLAG_CONTENT_INTENT_AVAILABLE_OFFLINE = 0x1;
21572bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private static final int FLAG_HINT_HIDE_ICON = 1 << 1;
21582bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private static final int FLAG_HINT_SHOW_BACKGROUND_ONLY = 1 << 2;
21592bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private static final int FLAG_START_SCROLL_BOTTOM = 1 << 3;
21602bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
21612bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        // Default value for flags integer
21622bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private static final int DEFAULT_FLAGS = FLAG_CONTENT_INTENT_AVAILABLE_OFFLINE;
21632bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
21642bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private static final int DEFAULT_CONTENT_ICON_GRAVITY = GravityCompat.END;
21652bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private static final int DEFAULT_GRAVITY = Gravity.BOTTOM;
21662bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
21672bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private ArrayList<Action> mActions = new ArrayList<Action>();
21682bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private int mFlags = DEFAULT_FLAGS;
21692bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private PendingIntent mDisplayIntent;
21702bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private ArrayList<Notification> mPages = new ArrayList<Notification>();
21712bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private Bitmap mBackground;
21722bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private int mContentIcon;
21732bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private int mContentIconGravity = DEFAULT_CONTENT_ICON_GRAVITY;
21742bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private int mContentActionIndex = UNSET_ACTION_INDEX;
21752bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private int mCustomSizePreset = SIZE_DEFAULT;
21762bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private int mCustomContentHeight;
21772bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private int mGravity = DEFAULT_GRAVITY;
21782bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
21792bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
21802bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Create a {@link NotificationCompat.WearableExtender} with default
21812bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * options.
21822bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
21832bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public WearableExtender() {
21842bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
21852bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
21862bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public WearableExtender(Notification notif) {
21872bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            Bundle extras = getExtras(notif);
21882bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            Bundle wearableBundle = extras != null ? extras.getBundle(EXTRA_WEARABLE_EXTENSIONS)
21892bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                    : null;
21902bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            if (wearableBundle != null) {
21912bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                Action[] actions = IMPL.getActionsFromParcelableArrayList(
21922bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                        wearableBundle.getParcelableArrayList(KEY_ACTIONS));
21932bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                if (actions != null) {
21942bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                    Collections.addAll(mActions, actions);
21952bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                }
21962bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
21972bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                mFlags = wearableBundle.getInt(KEY_FLAGS, DEFAULT_FLAGS);
21982bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                mDisplayIntent = wearableBundle.getParcelable(KEY_DISPLAY_INTENT);
21992bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
22002bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                Notification[] pages = getNotificationArrayFromBundle(
22012bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                        wearableBundle, KEY_PAGES);
22022bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                if (pages != null) {
22032bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                    Collections.addAll(mPages, pages);
22042bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                }
22052bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
22062bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                mBackground = wearableBundle.getParcelable(KEY_BACKGROUND);
22072bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                mContentIcon = wearableBundle.getInt(KEY_CONTENT_ICON);
22082bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                mContentIconGravity = wearableBundle.getInt(KEY_CONTENT_ICON_GRAVITY,
22092bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                        DEFAULT_CONTENT_ICON_GRAVITY);
22102bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                mContentActionIndex = wearableBundle.getInt(KEY_CONTENT_ACTION_INDEX,
22112bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                        UNSET_ACTION_INDEX);
22122bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                mCustomSizePreset = wearableBundle.getInt(KEY_CUSTOM_SIZE_PRESET,
22132bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                        SIZE_DEFAULT);
22142bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                mCustomContentHeight = wearableBundle.getInt(KEY_CUSTOM_CONTENT_HEIGHT);
22152bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                mGravity = wearableBundle.getInt(KEY_GRAVITY, DEFAULT_GRAVITY);
22162bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            }
22172bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
22182bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
22192bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
22202bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Apply wearable extensions to a notification that is being built. This is typically
22212bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * called by the {@link NotificationCompat.Builder#extend} method of
22222bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * {@link NotificationCompat.Builder}.
22232bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
22242bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        @Override
22252bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public NotificationCompat.Builder extend(NotificationCompat.Builder builder) {
22262bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            Bundle wearableBundle = new Bundle();
22272bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
22282bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            if (!mActions.isEmpty()) {
22292bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                wearableBundle.putParcelableArrayList(KEY_ACTIONS,
22302bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                        IMPL.getParcelableArrayListForActions(mActions.toArray(
22312bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                                new Action[mActions.size()])));
22322bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            }
22332bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            if (mFlags != DEFAULT_FLAGS) {
22342bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                wearableBundle.putInt(KEY_FLAGS, mFlags);
22352bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            }
22362bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            if (mDisplayIntent != null) {
22372bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                wearableBundle.putParcelable(KEY_DISPLAY_INTENT, mDisplayIntent);
22382bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            }
22392bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            if (!mPages.isEmpty()) {
22402bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                wearableBundle.putParcelableArray(KEY_PAGES, mPages.toArray(
22412bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                        new Notification[mPages.size()]));
22422bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            }
22432bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            if (mBackground != null) {
22442bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                wearableBundle.putParcelable(KEY_BACKGROUND, mBackground);
22452bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            }
22462bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            if (mContentIcon != 0) {
22472bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                wearableBundle.putInt(KEY_CONTENT_ICON, mContentIcon);
22482bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            }
22492bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            if (mContentIconGravity != DEFAULT_CONTENT_ICON_GRAVITY) {
22502bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                wearableBundle.putInt(KEY_CONTENT_ICON_GRAVITY, mContentIconGravity);
22512bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            }
22522bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            if (mContentActionIndex != UNSET_ACTION_INDEX) {
22532bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                wearableBundle.putInt(KEY_CONTENT_ACTION_INDEX,
22542bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                        mContentActionIndex);
22552bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            }
22562bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            if (mCustomSizePreset != SIZE_DEFAULT) {
22572bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                wearableBundle.putInt(KEY_CUSTOM_SIZE_PRESET, mCustomSizePreset);
22582bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            }
22592bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            if (mCustomContentHeight != 0) {
22602bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                wearableBundle.putInt(KEY_CUSTOM_CONTENT_HEIGHT, mCustomContentHeight);
22612bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            }
22622bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            if (mGravity != DEFAULT_GRAVITY) {
22632bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                wearableBundle.putInt(KEY_GRAVITY, mGravity);
22642bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            }
22652bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
22662bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            builder.getExtras().putBundle(EXTRA_WEARABLE_EXTENSIONS, wearableBundle);
22672bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return builder;
22682bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
22692bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
22702bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        @Override
22712bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public WearableExtender clone() {
22722bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            WearableExtender that = new WearableExtender();
22732bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            that.mActions = new ArrayList<Action>(this.mActions);
22742bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            that.mFlags = this.mFlags;
22752bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            that.mDisplayIntent = this.mDisplayIntent;
22762bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            that.mPages = new ArrayList<Notification>(this.mPages);
22772bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            that.mBackground = this.mBackground;
22782bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            that.mContentIcon = this.mContentIcon;
22792bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            that.mContentIconGravity = this.mContentIconGravity;
22802bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            that.mContentActionIndex = this.mContentActionIndex;
22812bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            that.mCustomSizePreset = this.mCustomSizePreset;
22822bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            that.mCustomContentHeight = this.mCustomContentHeight;
22832bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            that.mGravity = this.mGravity;
22842bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return that;
22852bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
22862bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
22872bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
22882bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Add a wearable action to this notification.
22892bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         *
22902bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * <p>When wearable actions are added using this method, the set of actions that
22912bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * show on a wearable device splits from devices that only show actions added
22922bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * using {@link NotificationCompat.Builder#addAction}. This allows for customization
22932bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * of which actions display on different devices.
22942bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         *
22952bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @param action the action to add to this notification
22962bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @return this object for method chaining
22972bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @see NotificationCompat.Action
22982bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
22992bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public WearableExtender addAction(Action action) {
23002bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            mActions.add(action);
23012bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return this;
23022bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
23032bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
23042bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
23052bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Adds wearable actions to this notification.
23062bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         *
23072bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * <p>When wearable actions are added using this method, the set of actions that
23082bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * show on a wearable device splits from devices that only show actions added
23092bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * using {@link NotificationCompat.Builder#addAction}. This allows for customization
23102bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * of which actions display on different devices.
23112bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         *
23122bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @param actions the actions to add to this notification
23132bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @return this object for method chaining
23142bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @see NotificationCompat.Action
23152bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
23162bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public WearableExtender addActions(List<Action> actions) {
23172bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            mActions.addAll(actions);
23182bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return this;
23192bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
23202bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
23212bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
23222bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Clear all wearable actions present on this builder.
23232bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @return this object for method chaining.
23242bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @see #addAction
23252bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
23262bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public WearableExtender clearActions() {
23272bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            mActions.clear();
23282bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return this;
23292bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
23302bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
23312bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
23322bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Get the wearable actions present on this notification.
23332bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
23342bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public List<Action> getActions() {
23352bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return mActions;
23362bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
23372bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
23382bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
23392bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Set an intent to launch inside of an activity view when displaying
234033176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * this notification. The {@link PendingIntent} provided should be for an activity.
234133176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         *
234233176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * <pre class="prettyprint">
234333176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * Intent displayIntent = new Intent(context, MyDisplayActivity.class);
234433176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * PendingIntent displayPendingIntent = PendingIntent.getActivity(context,
234533176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         *         0, displayIntent, PendingIntent.FLAG_UPDATE_CURRENT);
234633176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * Notification notif = new NotificationCompat.Builder(context)
234733176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         *         .extend(new NotificationCompat.WearableExtender()
234833176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         *                 .setDisplayIntent(displayPendingIntent)
234933176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         *                 .setCustomSizePreset(NotificationCompat.WearableExtender.SIZE_MEDIUM))
235033176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         *         .build();</pre>
235133176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         *
235233176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * <p>The activity to launch needs to allow embedding, must be exported, and
2353bc8f49b8cd63e6c24322a013d47e805a8789685eGriff Hazen         * should have an empty task affinity. It is also recommended to use the device
2354bc8f49b8cd63e6c24322a013d47e805a8789685eGriff Hazen         * default light theme.
235533176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         *
235633176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * <p>Example AndroidManifest.xml entry:
235733176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * <pre class="prettyprint">
235833176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * &lt;activity android:name=&quot;com.example.MyDisplayActivity&quot;
235933176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         *     android:exported=&quot;true&quot;
236033176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         *     android:allowEmbedded=&quot;true&quot;
2361bc8f49b8cd63e6c24322a013d47e805a8789685eGriff Hazen         *     android:taskAffinity=&quot;&quot;
2362bc8f49b8cd63e6c24322a013d47e805a8789685eGriff Hazen         *     android:theme=&quot;@android:style/Theme.DeviceDefault.Light&quot; /&gt;</pre>
23632bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         *
23642bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @param intent the {@link PendingIntent} for an activity
23652bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @return this object for method chaining
23662bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @see NotificationCompat.WearableExtender#getDisplayIntent
23672bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
23682bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public WearableExtender setDisplayIntent(PendingIntent intent) {
23692bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            mDisplayIntent = intent;
23702bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return this;
23712bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
23722bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
23732bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
23742bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Get the intent to launch inside of an activity view when displaying this
23752bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * notification. This {@code PendingIntent} should be for an activity.
23762bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
23772bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public PendingIntent getDisplayIntent() {
23782bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return mDisplayIntent;
23792bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
23802bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
23812bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
23822bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Add an additional page of content to display with this notification. The current
23832bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * notification forms the first page, and pages added using this function form
23842bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * subsequent pages. This field can be used to separate a notification into multiple
23852bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * sections.
23862bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         *
23872bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @param page the notification to add as another page
23882bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @return this object for method chaining
23892bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @see NotificationCompat.WearableExtender#getPages
23902bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
23912bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public WearableExtender addPage(Notification page) {
23922bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            mPages.add(page);
23932bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return this;
23942bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
23952bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
23962bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
23972bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Add additional pages of content to display with this notification. The current
23982bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * notification forms the first page, and pages added using this function form
23992bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * subsequent pages. This field can be used to separate a notification into multiple
24002bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * sections.
24012bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         *
24022bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @param pages a list of notifications
24032bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @return this object for method chaining
24042bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @see NotificationCompat.WearableExtender#getPages
24052bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
24062bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public WearableExtender addPages(List<Notification> pages) {
24072bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            mPages.addAll(pages);
24082bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return this;
24092bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
24102bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
24112bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
24122bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Clear all additional pages present on this builder.
24132bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @return this object for method chaining.
24142bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @see #addPage
24152bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
24162bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public WearableExtender clearPages() {
24172bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            mPages.clear();
24182bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return this;
24192bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
24202bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
24212bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
24222bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Get the array of additional pages of content for displaying this notification. The
24232bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * current notification forms the first page, and elements within this array form
24242bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * subsequent pages. This field can be used to separate a notification into multiple
24252bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * sections.
24262bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @return the pages for this notification
24272bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
24282bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public List<Notification> getPages() {
24292bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return mPages;
24302bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
24312bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
24322bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
24332bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Set a background image to be displayed behind the notification content.
24342bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Contrary to the {@link NotificationCompat.BigPictureStyle}, this background
24352bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * will work with any notification style.
24362bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         *
24372bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @param background the background bitmap
24382bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @return this object for method chaining
24392bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @see NotificationCompat.WearableExtender#getBackground
24402bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
24412bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public WearableExtender setBackground(Bitmap background) {
24422bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            mBackground = background;
24432bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return this;
24442bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
24452bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
24462bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
24472bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Get a background image to be displayed behind the notification content.
24482bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Contrary to the {@link NotificationCompat.BigPictureStyle}, this background
24492bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * will work with any notification style.
24502bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         *
24512bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @return the background image
24522bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @see NotificationCompat.WearableExtender#setBackground
24532bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
24542bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public Bitmap getBackground() {
24552bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return mBackground;
24562bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
24572bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
24582bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
24592bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Set an icon that goes with the content of this notification.
24602bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
24612bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public WearableExtender setContentIcon(int icon) {
24622bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            mContentIcon = icon;
24632bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return this;
24642bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
24652bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
24662bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
24672bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Get an icon that goes with the content of this notification.
24682bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
24692bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public int getContentIcon() {
24702bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return mContentIcon;
24712bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
24722bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
24732bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
24742bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Set the gravity that the content icon should have within the notification display.
24752bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Supported values include {@link android.view.Gravity#START} and
24762bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * {@link android.view.Gravity#END}. The default value is {@link android.view.Gravity#END}.
24772bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @see #setContentIcon
24782bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
24792bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public WearableExtender setContentIconGravity(int contentIconGravity) {
24802bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            mContentIconGravity = contentIconGravity;
24812bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return this;
24822bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
24832bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
24842bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
24852bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Get the gravity that the content icon should have within the notification display.
24862bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Supported values include {@link android.view.Gravity#START} and
24872bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * {@link android.view.Gravity#END}. The default value is {@link android.view.Gravity#END}.
24882bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @see #getContentIcon
24892bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
24902bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public int getContentIconGravity() {
24912bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return mContentIconGravity;
24922bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
24932bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
24942bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
24952bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Set an action from this notification's actions to be clickable with the content of
249633176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * this notification. This action will no longer display separately from the
249733176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * notification's content.
249833176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         *
249933176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * <p>For notifications with multiple pages, child pages can also have content actions
250033176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * set, although the list of available actions comes from the main notification and not
250133176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * from the child page's notification.
250233176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         *
250333176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * @param actionIndex The index of the action to hoist onto the current notification page.
250433176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         *                    If wearable actions were added to the main notification, this index
250533176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         *                    will apply to that list, otherwise it will apply to the regular
250633176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         *                    actions list.
25072bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
25082bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public WearableExtender setContentAction(int actionIndex) {
25092bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            mContentActionIndex = actionIndex;
25102bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return this;
25112bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
25122bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
25132bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
251433176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * Get the index of the notification action, if any, that was specified as being clickable
251533176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * with the content of this notification. This action will no longer display separately
251633176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * from the notification's content.
251733176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         *
251833176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * <p>For notifications with multiple pages, child pages can also have content actions
251933176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * set, although the list of available actions comes from the main notification and not
252033176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * from the child page's notification.
252133176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         *
252233176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * <p>If wearable specific actions were added to the main notification, this index will
252333176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * apply to that list, otherwise it will apply to the regular actions list.
25242bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         *
252533176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * @return the action index or {@link #UNSET_ACTION_INDEX} if no action was selected.
25262bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
25272bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public int getContentAction() {
25282bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return mContentActionIndex;
25292bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
25302bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
25312bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
25322bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Set the gravity that this notification should have within the available viewport space.
25332bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Supported values include {@link android.view.Gravity#TOP},
25342bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * {@link android.view.Gravity#CENTER_VERTICAL} and {@link android.view.Gravity#BOTTOM}.
25352bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * The default value is {@link android.view.Gravity#BOTTOM}.
25362bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
25372bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public WearableExtender setGravity(int gravity) {
25382bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            mGravity = gravity;
25392bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return this;
25402bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
25412bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
25422bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
25432bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Get the gravity that this notification should have within the available viewport space.
25442bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Supported values include {@link android.view.Gravity#TOP},
25452bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * {@link android.view.Gravity#CENTER_VERTICAL} and {@link android.view.Gravity#BOTTOM}.
25462bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * The default value is {@link android.view.Gravity#BOTTOM}.
25472bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
25482bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public int getGravity() {
25492bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return mGravity;
25502bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
25512bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
25522bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
25532bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Set the custom size preset for the display of this notification out of the available
25542bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * presets found in {@link NotificationCompat.WearableExtender}, e.g.
25552bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * {@link #SIZE_LARGE}.
25562bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * <p>Some custom size presets are only applicable for custom display notifications created
25572bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * using {@link NotificationCompat.WearableExtender#setDisplayIntent}. Check the
25582bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * documentation for the preset in question. See also
25592bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * {@link #setCustomContentHeight} and {@link #getCustomSizePreset}.
25602bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
25612bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public WearableExtender setCustomSizePreset(int sizePreset) {
25622bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            mCustomSizePreset = sizePreset;
25632bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return this;
25642bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
25652bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
25662bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
25672bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Get the custom size preset for the display of this notification out of the available
25682bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * presets found in {@link NotificationCompat.WearableExtender}, e.g.
25692bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * {@link #SIZE_LARGE}.
25702bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * <p>Some custom size presets are only applicable for custom display notifications created
25712bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * using {@link #setDisplayIntent}. Check the documentation for the preset in question.
25722bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * See also {@link #setCustomContentHeight} and {@link #setCustomSizePreset}.
25732bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
25742bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public int getCustomSizePreset() {
25752bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return mCustomSizePreset;
25762bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
25772bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
25782bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
25792bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Set the custom height in pixels for the display of this notification's content.
25802bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * <p>This option is only available for custom display notifications created
25812bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * using {@link NotificationCompat.WearableExtender#setDisplayIntent}. See also
25822bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * {@link NotificationCompat.WearableExtender#setCustomSizePreset} and
25832bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * {@link #getCustomContentHeight}.
25842bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
25852bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public WearableExtender setCustomContentHeight(int height) {
25862bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            mCustomContentHeight = height;
25872bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return this;
25882bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
25892bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
25902bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
25912bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Get the custom height in pixels for the display of this notification's content.
25922bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * <p>This option is only available for custom display notifications created
25932bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * using {@link #setDisplayIntent}. See also {@link #setCustomSizePreset} and
25942bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * {@link #setCustomContentHeight}.
25952bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
25962bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public int getCustomContentHeight() {
25972bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return mCustomContentHeight;
25982bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
25992bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
26002bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
26012bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Set whether the scrolling position for the contents of this notification should start
26022bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * at the bottom of the contents instead of the top when the contents are too long to
26032bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * display within the screen.  Default is false (start scroll at the top).
26042bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
26052bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public WearableExtender setStartScrollBottom(boolean startScrollBottom) {
26062bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            setFlag(FLAG_START_SCROLL_BOTTOM, startScrollBottom);
26072bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return this;
26082bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
26092bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
26102bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
26112bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Get whether the scrolling position for the contents of this notification should start
26122bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * at the bottom of the contents instead of the top when the contents are too long to
26132bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * display within the screen. Default is false (start scroll at the top).
26142bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
26152bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public boolean getStartScrollBottom() {
26162bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return (mFlags & FLAG_START_SCROLL_BOTTOM) != 0;
26172bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
26182bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
26192bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
26202bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Set whether the content intent is available when the wearable device is not connected
26212bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * to a companion device.  The user can still trigger this intent when the wearable device
26222bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * is offline, but a visual hint will indicate that the content intent may not be available.
26232bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Defaults to true.
26242bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
26252bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public WearableExtender setContentIntentAvailableOffline(
26262bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                boolean contentIntentAvailableOffline) {
26272bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            setFlag(FLAG_CONTENT_INTENT_AVAILABLE_OFFLINE, contentIntentAvailableOffline);
26282bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return this;
26292bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
26302bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
26312bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
26322bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Get whether the content intent is available when the wearable device is not connected
26332bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * to a companion device.  The user can still trigger this intent when the wearable device
26342bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * is offline, but a visual hint will indicate that the content intent may not be available.
26352bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Defaults to true.
26362bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
26372bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public boolean getContentIntentAvailableOffline() {
26382bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return (mFlags & FLAG_CONTENT_INTENT_AVAILABLE_OFFLINE) != 0;
26392bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
26402bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
26412bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
26422bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Set a hint that this notification's icon should not be displayed.
26432bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @param hintHideIcon {@code true} to hide the icon, {@code false} otherwise.
26442bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @return this object for method chaining
26452bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
26462bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public WearableExtender setHintHideIcon(boolean hintHideIcon) {
26472bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            setFlag(FLAG_HINT_HIDE_ICON, hintHideIcon);
26482bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return this;
26492bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
26502bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
26512bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
26522bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Get a hint that this notification's icon should not be displayed.
26532bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @return {@code true} if this icon should not be displayed, false otherwise.
26542bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * The default value is {@code false} if this was never set.
26552bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
26562bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public boolean getHintHideIcon() {
26572bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return (mFlags & FLAG_HINT_HIDE_ICON) != 0;
26582bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
26592bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
26602bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
26612bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Set a visual hint that only the background image of this notification should be
26622bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * displayed, and other semantic content should be hidden. This hint is only applicable
26632bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * to sub-pages added using {@link #addPage}.
26642bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
26652bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public WearableExtender setHintShowBackgroundOnly(boolean hintShowBackgroundOnly) {
26662bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            setFlag(FLAG_HINT_SHOW_BACKGROUND_ONLY, hintShowBackgroundOnly);
26672bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return this;
26682bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
26692bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
26702bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
26712bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Get a visual hint that only the background image of this notification should be
26722bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * displayed, and other semantic content should be hidden. This hint is only applicable
26732bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * to sub-pages added using {@link NotificationCompat.WearableExtender#addPage}.
26742bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
26752bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public boolean getHintShowBackgroundOnly() {
26762bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return (mFlags & FLAG_HINT_SHOW_BACKGROUND_ONLY) != 0;
26772bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
26782bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
26792bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private void setFlag(int mask, boolean value) {
26802bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            if (value) {
26812bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                mFlags |= mask;
26822bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            } else {
26832bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                mFlags &= ~mask;
26842bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            }
26852bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
26862bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen    }
26872bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
26882bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen    /**
26892bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     * Get an array of Notification objects from a parcelable array bundle field.
26902bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     * Update the bundle to have a typed array so fetches in the future don't need
26912bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     * to do an array copy.
26922bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     */
26932bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen    private static Notification[] getNotificationArrayFromBundle(Bundle bundle, String key) {
26942bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        Parcelable[] array = bundle.getParcelableArray(key);
26952bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        if (array instanceof Notification[] || array == null) {
26962bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return (Notification[]) array;
26972bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
26982bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        Notification[] typedArray = new Notification[array.length];
26992bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        for (int i = 0; i < array.length; i++) {
27002bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            typedArray[i] = (Notification) array[i];
27012bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
27022bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        bundle.putParcelableArray(key, typedArray);
27032bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        return typedArray;
27042bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen    }
27052bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
2706b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen    /**
2707b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen     * Gets the {@link Notification#extras} field from a notification in a backwards
2708b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen     * compatible manner. Extras field was supported from JellyBean (Api level 16)
2709b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen     * forwards. This function will return null on older api levels.
2710b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen     */
2711b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen    public static Bundle getExtras(Notification notif) {
2712b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        return IMPL.getExtras(notif);
2713b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen    }
2714b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen
2715b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen    /**
2716300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen     * Get the number of actions in this notification in a backwards compatible
2717300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen     * manner. Actions were supported from JellyBean (Api level 16) forwards.
2718300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen     */
2719300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen    public static int getActionCount(Notification notif) {
2720300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        return IMPL.getActionCount(notif);
2721300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen    }
2722300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
2723300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen    /**
2724300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen     * Get an action on this notification in a backwards compatible
2725300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen     * manner. Actions were supported from JellyBean (Api level 16) forwards.
2726300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen     * @param notif The notification to inspect.
2727300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen     * @param actionIndex The index of the action to retrieve.
2728300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen     */
2729300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen    public static Action getAction(Notification notif, int actionIndex) {
2730300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        return IMPL.getAction(notif, actionIndex);
2731300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen    }
2732300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
2733300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen    /**
273475e2071f16bae2b22d1618026d10337daad862cfBryan Mawhinney    * Get the category of this notification in a backwards compatible
273575e2071f16bae2b22d1618026d10337daad862cfBryan Mawhinney    * manner.
273675e2071f16bae2b22d1618026d10337daad862cfBryan Mawhinney    * @param notif The notification to inspect.
273775e2071f16bae2b22d1618026d10337daad862cfBryan Mawhinney    */
273875e2071f16bae2b22d1618026d10337daad862cfBryan Mawhinney    public static String getCategory(Notification notif) {
273975e2071f16bae2b22d1618026d10337daad862cfBryan Mawhinney        return IMPL.getCategory(notif);
274075e2071f16bae2b22d1618026d10337daad862cfBryan Mawhinney    }
274175e2071f16bae2b22d1618026d10337daad862cfBryan Mawhinney
274275e2071f16bae2b22d1618026d10337daad862cfBryan Mawhinney    /**
2743b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen     * Get whether or not this notification is only relevant to the current device.
2744b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen     *
2745b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen     * <p>Some notifications can be bridged to other devices for remote display.
2746b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen     * If this hint is set, it is recommend that this notification not be bridged.
2747b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen     */
2748b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen    public static boolean getLocalOnly(Notification notif) {
2749b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        return IMPL.getLocalOnly(notif);
2750b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen    }
2751ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
2752ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    /**
2753ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     * Get the key used to group this notification into a cluster or stack
2754ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     * with other notifications on devices which support such rendering.
2755ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     */
2756ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    public static String getGroup(Notification notif) {
2757ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        return IMPL.getGroup(notif);
2758ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    }
2759ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
2760ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    /**
2761ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     * Get whether this notification to be the group summary for a group of notifications.
2762ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     * Grouped notifications may display in a cluster or stack on devices which
2763ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     * support such rendering. Requires a group key also be set using {@link Builder#setGroup}.
2764ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     * @return Whether this notification is a group summary.
2765ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     */
2766ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    public static boolean isGroupSummary(Notification notif) {
2767ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        return IMPL.isGroupSummary(notif);
2768ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    }
2769ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
2770ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    /**
2771ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     * Get a sort key that orders this notification among other notifications from the
2772ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     * same package. This can be useful if an external sort was already applied and an app
2773ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     * would like to preserve this. Notifications will be sorted lexicographically using this
2774ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     * value, although providing different priorities in addition to providing sort key may
2775ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     * cause this value to be ignored.
2776ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     *
2777ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     * <p>This sort key can also be used to order members of a notification group. See
2778ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     * {@link Builder#setGroup}.
2779ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     *
2780ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     * @see String#compareTo(String)
2781ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     */
2782ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    public static String getSortKey(Notification notif) {
2783ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        return IMPL.getSortKey(notif);
2784ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    }
2785c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell}
2786