NotificationCompat.java revision fd5d0d05e9b44fcb0a9dab91290d53b464fc0939
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;
23c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powellimport android.media.AudioManager;
24c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powellimport android.net.Uri;
25c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powellimport android.os.Build;
26b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazenimport android.os.Bundle;
272bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazenimport android.os.Parcelable;
282bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazenimport android.support.v4.view.GravityCompat;
292bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazenimport android.view.Gravity;
30c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powellimport android.widget.RemoteViews;
31300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
32f021758934b35e3b842c6799344531d7ea2969daChris Wrenimport java.util.ArrayList;
332bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazenimport java.util.Collections;
342bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazenimport java.util.List;
35c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
36080df8ffb0920eccb300baa39180eb956a000a53Chris Wren/**
37080df8ffb0920eccb300baa39180eb956a000a53Chris Wren * Helper for accessing features in {@link android.app.Notification}
38080df8ffb0920eccb300baa39180eb956a000a53Chris Wren * introduced after API level 4 in a backwards compatible fashion.
39080df8ffb0920eccb300baa39180eb956a000a53Chris Wren */
40c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powellpublic class NotificationCompat {
41c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
42c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
43c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Use all default values (where applicable).
44c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
45c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final int DEFAULT_ALL = ~0;
46c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
47c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
48c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Use the default notification sound. This will ignore any sound set using
49c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * {@link Builder#setSound}
50c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     *
51c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * @see Builder#setDefaults
52c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
53c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final int DEFAULT_SOUND = 1;
54c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
55c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
56c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Use the default notification vibrate. This will ignore any vibrate set using
57c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * {@link Builder#setVibrate}. Using phone vibration requires the
58c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * {@link android.Manifest.permission#VIBRATE VIBRATE} permission.
59c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     *
60c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * @see Builder#setDefaults
61c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
62c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final int DEFAULT_VIBRATE = 2;
63c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
64c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
65c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Use the default notification lights. This will ignore the
66c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * {@link #FLAG_SHOW_LIGHTS} bit, and values set with {@link Builder#setLights}.
67c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     *
68c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * @see Builder#setDefaults
69c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
70c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final int DEFAULT_LIGHTS = 4;
71c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
72c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
73c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Use this constant as the value for audioStreamType to request that
74c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * the default stream type for notifications be used.  Currently the
75c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * default stream type is {@link AudioManager#STREAM_NOTIFICATION}.
76c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
77c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final int STREAM_DEFAULT = -1;
78c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
79c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
80c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Bit set in the Notification flags field when LEDs should be turned on
81c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * for this notification.
82c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
83c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final int FLAG_SHOW_LIGHTS        = 0x00000001;
84c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
85c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
86c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Bit set in the Notification flags field if this notification is in
87c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * reference to something that is ongoing, like a phone call.  It should
88c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * not be set if this notification is in reference to something that
89c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * happened at a particular point in time, like a missed phone call.
90c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
91c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final int FLAG_ONGOING_EVENT      = 0x00000002;
92c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
93c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
94c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Bit set in the Notification flags field if
95c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * the audio will be repeated until the notification is
96c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * cancelled or the notification window is opened.
97c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
98c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final int FLAG_INSISTENT          = 0x00000004;
99c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
100c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
101c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Bit set in the Notification flags field if the notification's sound,
102c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * vibrate and ticker should only be played if the notification is not already showing.
103c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
104c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final int FLAG_ONLY_ALERT_ONCE    = 0x00000008;
105c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
106c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
107c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Bit set in the Notification flags field if the notification should be canceled when
108c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * it is clicked by the user.
109c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
110c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final int FLAG_AUTO_CANCEL        = 0x00000010;
111c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
112c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
113c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Bit set in the Notification flags field if the notification should not be canceled
114c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * when the user clicks the Clear all button.
115c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
116c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final int FLAG_NO_CLEAR           = 0x00000020;
117c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
118c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
119c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Bit set in the Notification flags field if this notification represents a currently
120c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * running service.  This will normally be set for you by
121c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * {@link android.app.Service#startForeground}.
122c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
123c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final int FLAG_FOREGROUND_SERVICE = 0x00000040;
124c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
125c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell    /**
126f021758934b35e3b842c6799344531d7ea2969daChris Wren     * Obsolete flag indicating high-priority notifications; use the priority field instead.
127884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     *
128f021758934b35e3b842c6799344531d7ea2969daChris Wren     * @deprecated Use {@link NotificationCompat.Builder#setPriority(int)} with a positive value.
129c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell     */
130ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    public static final int FLAG_HIGH_PRIORITY      = 0x00000080;
131ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
132ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    /**
133ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     * Bit set in the Notification flags field if this notification is relevant to the current
134ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     * device only and it is not recommended that it bridge to other devices.
135ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     */
136ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    public static final int FLAG_LOCAL_ONLY         = 0x00000100;
137ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
138ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    /**
139ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     * Bit set in the Notification flags field if this notification is the group summary for a
140ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     * group of notifications. Grouped notifications may display in a cluster or stack on devices
141ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     * which support such rendering. Requires a group key also be set using
142ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     * {@link Builder#setGroup}.
143ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     */
144ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    public static final int FLAG_GROUP_SUMMARY      = 0x00000200;
145c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
146f021758934b35e3b842c6799344531d7ea2969daChris Wren    /**
147f021758934b35e3b842c6799344531d7ea2969daChris Wren     * Default notification priority for {@link NotificationCompat.Builder#setPriority(int)}.
148f021758934b35e3b842c6799344531d7ea2969daChris Wren     * If your application does not prioritize its own notifications,
149f021758934b35e3b842c6799344531d7ea2969daChris Wren     * use this value for all notifications.
150f021758934b35e3b842c6799344531d7ea2969daChris Wren     */
151f021758934b35e3b842c6799344531d7ea2969daChris Wren    public static final int PRIORITY_DEFAULT = 0;
152f021758934b35e3b842c6799344531d7ea2969daChris Wren
153f021758934b35e3b842c6799344531d7ea2969daChris Wren    /**
154f021758934b35e3b842c6799344531d7ea2969daChris Wren     * Lower notification priority for {@link NotificationCompat.Builder#setPriority(int)},
155f021758934b35e3b842c6799344531d7ea2969daChris Wren     * for items that are less important. The UI may choose to show
156f021758934b35e3b842c6799344531d7ea2969daChris Wren     * these items smaller, or at a different position in the list,
157f021758934b35e3b842c6799344531d7ea2969daChris Wren     * compared with your app's {@link #PRIORITY_DEFAULT} items.
158f021758934b35e3b842c6799344531d7ea2969daChris Wren     */
159f021758934b35e3b842c6799344531d7ea2969daChris Wren    public static final int PRIORITY_LOW = -1;
160f021758934b35e3b842c6799344531d7ea2969daChris Wren
161f021758934b35e3b842c6799344531d7ea2969daChris Wren    /**
162f021758934b35e3b842c6799344531d7ea2969daChris Wren     * Lowest notification priority for {@link NotificationCompat.Builder#setPriority(int)};
163f021758934b35e3b842c6799344531d7ea2969daChris Wren     * these items might not be shown to the user except under
164f021758934b35e3b842c6799344531d7ea2969daChris Wren     * special circumstances, such as detailed notification logs.
165f021758934b35e3b842c6799344531d7ea2969daChris Wren     */
166f021758934b35e3b842c6799344531d7ea2969daChris Wren    public static final int PRIORITY_MIN = -2;
167f021758934b35e3b842c6799344531d7ea2969daChris Wren
168f021758934b35e3b842c6799344531d7ea2969daChris Wren    /**
169f021758934b35e3b842c6799344531d7ea2969daChris Wren     * Higher notification priority for {@link NotificationCompat.Builder#setPriority(int)},
170f021758934b35e3b842c6799344531d7ea2969daChris Wren     * for more important notifications or alerts. The UI may choose
171f021758934b35e3b842c6799344531d7ea2969daChris Wren     * to show these items larger, or at a different position in
172f021758934b35e3b842c6799344531d7ea2969daChris Wren     * notification lists, compared with your app's {@link #PRIORITY_DEFAULT} items.
173f021758934b35e3b842c6799344531d7ea2969daChris Wren     */
174f021758934b35e3b842c6799344531d7ea2969daChris Wren    public static final int PRIORITY_HIGH = 1;
175f021758934b35e3b842c6799344531d7ea2969daChris Wren
176f021758934b35e3b842c6799344531d7ea2969daChris Wren    /**
177f021758934b35e3b842c6799344531d7ea2969daChris Wren     * Highest notification priority for {@link NotificationCompat.Builder#setPriority(int)},
178f021758934b35e3b842c6799344531d7ea2969daChris Wren     * for your application's most important items that require the user's
179f021758934b35e3b842c6799344531d7ea2969daChris Wren     * prompt attention or input.
180f021758934b35e3b842c6799344531d7ea2969daChris Wren     */
181f021758934b35e3b842c6799344531d7ea2969daChris Wren    public static final int PRIORITY_MAX = 2;
182f021758934b35e3b842c6799344531d7ea2969daChris Wren
183c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
184c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Notification extras key: this is the title of the notification,
185c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * as supplied to {@link Builder#setContentTitle(CharSequence)}.
186c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
187c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final String EXTRA_TITLE = "android.title";
188c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
189c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
190c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Notification extras key: this is the title of the notification when shown in expanded form,
191c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * e.g. as supplied to {@link BigTextStyle#setBigContentTitle(CharSequence)}.
192c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
193c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final String EXTRA_TITLE_BIG = EXTRA_TITLE + ".big";
194c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
195c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
196c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Notification extras key: this is the main text payload, as supplied to
197c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * {@link Builder#setContentText(CharSequence)}.
198c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
199c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final String EXTRA_TEXT = "android.text";
200c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
201c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
202c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Notification extras key: this is a third line of text, as supplied to
203c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * {@link Builder#setSubText(CharSequence)}.
204c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
205c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final String EXTRA_SUB_TEXT = "android.subText";
206c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
207c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
208c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Notification extras key: this is a small piece of additional text as supplied to
209c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * {@link Builder#setContentInfo(CharSequence)}.
210c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
211c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final String EXTRA_INFO_TEXT = "android.infoText";
212c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
213c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
214c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Notification extras key: this is a line of summary information intended to be shown
215c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * alongside expanded notifications, as supplied to (e.g.)
216c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * {@link BigTextStyle#setSummaryText(CharSequence)}.
217c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
218c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final String EXTRA_SUMMARY_TEXT = "android.summaryText";
219c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
220c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
221c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Notification extras key: this is the resource ID of the notification's main small icon, as
222c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * supplied to {@link Builder#setSmallIcon(int)}.
223c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
224c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final String EXTRA_SMALL_ICON = "android.icon";
225c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
226c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
227c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Notification extras key: this is a bitmap to be used instead of the small icon when showing the
228c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * notification payload, as
229c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * supplied to {@link Builder#setLargeIcon(android.graphics.Bitmap)}.
230c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
231c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final String EXTRA_LARGE_ICON = "android.largeIcon";
232c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
233c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
234c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Notification extras key: this is a bitmap to be used instead of the one from
235c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * {@link Builder#setLargeIcon(android.graphics.Bitmap)} when the notification is
236c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * shown in its expanded form, as supplied to
237c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * {@link BigPictureStyle#bigLargeIcon(android.graphics.Bitmap)}.
238c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
239c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final String EXTRA_LARGE_ICON_BIG = EXTRA_LARGE_ICON + ".big";
240c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
241c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
242c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Notification extras key: this is the progress value supplied to
243c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * {@link Builder#setProgress(int, int, boolean)}.
244c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
245c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final String EXTRA_PROGRESS = "android.progress";
246c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
247c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
248c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Notification extras key: this is the maximum value supplied to
249c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * {@link Builder#setProgress(int, int, boolean)}.
250c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
251c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final String EXTRA_PROGRESS_MAX = "android.progressMax";
252c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
253c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
254c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Notification extras key: whether the progress bar is indeterminate, supplied to
255c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * {@link Builder#setProgress(int, int, boolean)}.
256c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
257c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final String EXTRA_PROGRESS_INDETERMINATE = "android.progressIndeterminate";
258c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
259c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
260c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Notification extras key: whether the when field set using {@link Builder#setWhen} should
261c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * be shown as a count-up timer (specifically a {@link android.widget.Chronometer}) instead
262c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * of a timestamp, as supplied to {@link Builder#setUsesChronometer(boolean)}.
263c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
264c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final String EXTRA_SHOW_CHRONOMETER = "android.showChronometer";
265c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
266c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
267c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Notification extras key: this is a bitmap to be shown in {@link BigPictureStyle} expanded
268c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * notifications, supplied to {@link BigPictureStyle#bigPicture(android.graphics.Bitmap)}.
269c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
270c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final String EXTRA_PICTURE = "android.picture";
271c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
272c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
273c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Notification extras key: An array of CharSequences to show in {@link InboxStyle} expanded
274c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * notifications, each of which was supplied to {@link InboxStyle#addLine(CharSequence)}.
275c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
276c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final String EXTRA_TEXT_LINES = "android.textLines";
277c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
278c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
279c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Notification extras key: An array of people that this notification relates to, specified
280c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * by contacts provider contact URI.
281c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
282c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final String EXTRA_PEOPLE = "android.people";
283c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
284c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell    private static final NotificationCompatImpl IMPL;
285c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
286c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell    interface NotificationCompatImpl {
287f021758934b35e3b842c6799344531d7ea2969daChris Wren        public Notification build(Builder b);
288b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        public Bundle getExtras(Notification n);
289300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        public int getActionCount(Notification n);
290300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        public Action getAction(Notification n, int actionIndex);
2912bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public Action[] getActionsFromParcelableArrayList(ArrayList<Parcelable> parcelables);
2922bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public ArrayList<Parcelable> getParcelableArrayListForActions(Action[] actions);
293b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        public boolean getLocalOnly(Notification n);
294ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        public String getGroup(Notification n);
295ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        public boolean isGroupSummary(Notification n);
296ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        public String getSortKey(Notification n);
297c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell    }
298c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
299c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell    static class NotificationCompatImplBase implements NotificationCompatImpl {
300b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        @Override
301f021758934b35e3b842c6799344531d7ea2969daChris Wren        public Notification build(Builder b) {
302fe3b5bac4901a4bb8cf51c09fe4910b02388818aGriff Hazen            Notification result = b.mNotification;
303c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            result.setLatestEventInfo(b.mContext, b.mContentTitle,
304c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell                    b.mContentText, b.mContentIntent);
305f021758934b35e3b842c6799344531d7ea2969daChris Wren            // translate high priority requests into legacy flag
306f021758934b35e3b842c6799344531d7ea2969daChris Wren            if (b.mPriority > PRIORITY_DEFAULT) {
307884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin                result.flags |= FLAG_HIGH_PRIORITY;
308f021758934b35e3b842c6799344531d7ea2969daChris Wren            }
309c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return result;
310c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
311b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen
312b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        @Override
313b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        public Bundle getExtras(Notification n) {
314b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            return null;
315b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        }
316b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen
317b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        @Override
318300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        public int getActionCount(Notification n) {
319300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            return 0;
320300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        }
321300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
322300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        @Override
323300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        public Action getAction(Notification n, int actionIndex) {
324300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            return null;
325300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        }
326300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
327300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        @Override
3282bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public Action[] getActionsFromParcelableArrayList(
3292bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                ArrayList<Parcelable> parcelables) {
3302bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return null;
3312bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
3322bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
3332bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        @Override
3342bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public ArrayList<Parcelable> getParcelableArrayListForActions(Action[] actions) {
3352bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return null;
3362bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
3372bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
3382bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        @Override
339b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        public boolean getLocalOnly(Notification n) {
340b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            return false;
341b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        }
342ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
343ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        @Override
344ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        public String getGroup(Notification n) {
345ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return null;
346ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        }
347ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
348ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        @Override
349ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        public boolean isGroupSummary(Notification n) {
350ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return false;
351ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        }
352ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
353ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        @Override
354ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        public String getSortKey(Notification n) {
355ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return null;
356ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        }
357c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell    }
358c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
35929e9b1ca3b576f8d73465f725e0cc623f0d97ffdChris Wren    static class NotificationCompatImplGingerbread extends NotificationCompatImplBase {
360b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        @Override
36129e9b1ca3b576f8d73465f725e0cc623f0d97ffdChris Wren        public Notification build(Builder b) {
362fe3b5bac4901a4bb8cf51c09fe4910b02388818aGriff Hazen            Notification result = b.mNotification;
36329e9b1ca3b576f8d73465f725e0cc623f0d97ffdChris Wren            result.setLatestEventInfo(b.mContext, b.mContentTitle,
36429e9b1ca3b576f8d73465f725e0cc623f0d97ffdChris Wren                    b.mContentText, b.mContentIntent);
36529e9b1ca3b576f8d73465f725e0cc623f0d97ffdChris Wren            result = NotificationCompatGingerbread.add(result, b.mContext,
36629e9b1ca3b576f8d73465f725e0cc623f0d97ffdChris Wren                    b.mContentTitle, b.mContentText, b.mContentIntent, b.mFullScreenIntent);
36729e9b1ca3b576f8d73465f725e0cc623f0d97ffdChris Wren            // translate high priority requests into legacy flag
36829e9b1ca3b576f8d73465f725e0cc623f0d97ffdChris Wren            if (b.mPriority > PRIORITY_DEFAULT) {
36929e9b1ca3b576f8d73465f725e0cc623f0d97ffdChris Wren                result.flags |= FLAG_HIGH_PRIORITY;
37029e9b1ca3b576f8d73465f725e0cc623f0d97ffdChris Wren            }
37129e9b1ca3b576f8d73465f725e0cc623f0d97ffdChris Wren            return result;
37229e9b1ca3b576f8d73465f725e0cc623f0d97ffdChris Wren        }
37329e9b1ca3b576f8d73465f725e0cc623f0d97ffdChris Wren    }
37429e9b1ca3b576f8d73465f725e0cc623f0d97ffdChris Wren
375b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen    static class NotificationCompatImplHoneycomb extends NotificationCompatImplBase {
376b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        @Override
377f021758934b35e3b842c6799344531d7ea2969daChris Wren        public Notification build(Builder b) {
378c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return NotificationCompatHoneycomb.add(b.mContext, b.mNotification,
379c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell                    b.mContentTitle, b.mContentText, b.mContentInfo, b.mTickerView,
380c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell                    b.mNumber, b.mContentIntent, b.mFullScreenIntent, b.mLargeIcon);
381c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
382c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell    }
383c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
384b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen    static class NotificationCompatImplIceCreamSandwich extends NotificationCompatImplBase {
385b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        @Override
386f021758934b35e3b842c6799344531d7ea2969daChris Wren        public Notification build(Builder b) {
387f021758934b35e3b842c6799344531d7ea2969daChris Wren            return NotificationCompatIceCreamSandwich.add(b.mContext, b.mNotification,
388f021758934b35e3b842c6799344531d7ea2969daChris Wren                    b.mContentTitle, b.mContentText, b.mContentInfo, b.mTickerView,
389f021758934b35e3b842c6799344531d7ea2969daChris Wren                    b.mNumber, b.mContentIntent, b.mFullScreenIntent, b.mLargeIcon,
390f021758934b35e3b842c6799344531d7ea2969daChris Wren                    b.mProgressMax, b.mProgress, b.mProgressIndeterminate);
391f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
392f021758934b35e3b842c6799344531d7ea2969daChris Wren    }
393f021758934b35e3b842c6799344531d7ea2969daChris Wren
394b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen    static class NotificationCompatImplJellybean extends NotificationCompatImplBase {
395b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        @Override
396f021758934b35e3b842c6799344531d7ea2969daChris Wren        public Notification build(Builder b) {
397b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            NotificationCompatJellybean.Builder builder = new NotificationCompatJellybean.Builder(
398f021758934b35e3b842c6799344531d7ea2969daChris Wren                    b.mContext, b.mNotification, b.mContentTitle, b.mContentText, b.mContentInfo,
399f021758934b35e3b842c6799344531d7ea2969daChris Wren                    b.mTickerView, b.mNumber, b.mContentIntent, b.mFullScreenIntent, b.mLargeIcon,
400f021758934b35e3b842c6799344531d7ea2969daChris Wren                    b.mProgressMax, b.mProgress, b.mProgressIndeterminate,
401ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                    b.mUseChronometer, b.mPriority, b.mSubText, b.mLocalOnly, b.mExtras,
402ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                    b.mGroupKey, b.mGroupSummary, b.mSortKey);
403b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            addActionsToBuilder(builder, b.mActions);
404b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            addStyleToBuilderJellybean(builder, b.mStyle);
405b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            return builder.build();
406b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        }
407b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen
408b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        @Override
409b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        public Bundle getExtras(Notification n) {
410b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            return NotificationCompatJellybean.getExtras(n);
411b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        }
412b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen
413b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        @Override
414300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        public int getActionCount(Notification n) {
415300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            return NotificationCompatJellybean.getActionCount(n);
416300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        }
417300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
418300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        @Override
419300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        public Action getAction(Notification n, int actionIndex) {
420ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return (Action) NotificationCompatJellybean.getAction(n, actionIndex, Action.FACTORY,
421ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                    RemoteInput.FACTORY);
422300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        }
423300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
424300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        @Override
4252bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public Action[] getActionsFromParcelableArrayList(
4262bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                ArrayList<Parcelable> parcelables) {
4272bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return (Action[]) NotificationCompatJellybean.getActionsFromParcelableArrayList(
4282bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                    parcelables, Action.FACTORY, RemoteInput.FACTORY);
4292bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
4302bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
4312bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        @Override
4322bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public ArrayList<Parcelable> getParcelableArrayListForActions(
4332bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                Action[] actions) {
4342bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return NotificationCompatJellybean.getParcelableArrayListForActions(actions);
4352bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
4362bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
4372bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        @Override
43847702147608084fec16a50640da54b412c737b9cGriff Hazen        public boolean getLocalOnly(Notification n) {
43947702147608084fec16a50640da54b412c737b9cGriff Hazen            return NotificationCompatJellybean.getLocalOnly(n);
44047702147608084fec16a50640da54b412c737b9cGriff Hazen        }
441ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
442ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        @Override
443ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        public String getGroup(Notification n) {
444ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return NotificationCompatJellybean.getGroup(n);
445ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        }
446ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
447ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        @Override
448ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        public boolean isGroupSummary(Notification n) {
449ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return NotificationCompatJellybean.isGroupSummary(n);
450ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        }
451ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
452ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        @Override
453ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        public String getSortKey(Notification n) {
454ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return NotificationCompatJellybean.getSortKey(n);
455ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        }
45647702147608084fec16a50640da54b412c737b9cGriff Hazen    }
45747702147608084fec16a50640da54b412c737b9cGriff Hazen
458ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    static class NotificationCompatImplKitKat extends NotificationCompatImplJellybean {
45947702147608084fec16a50640da54b412c737b9cGriff Hazen        @Override
46047702147608084fec16a50640da54b412c737b9cGriff Hazen        public Notification build(Builder b) {
46147702147608084fec16a50640da54b412c737b9cGriff Hazen            NotificationCompatKitKat.Builder builder = new NotificationCompatKitKat.Builder(
46247702147608084fec16a50640da54b412c737b9cGriff Hazen                    b.mContext, b.mNotification, b.mContentTitle, b.mContentText, b.mContentInfo,
46347702147608084fec16a50640da54b412c737b9cGriff Hazen                    b.mTickerView, b.mNumber, b.mContentIntent, b.mFullScreenIntent, b.mLargeIcon,
46447702147608084fec16a50640da54b412c737b9cGriff Hazen                    b.mProgressMax, b.mProgress, b.mProgressIndeterminate,
465ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                    b.mUseChronometer, b.mPriority, b.mSubText, b.mLocalOnly, b.mExtras,
466ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                    b.mGroupKey, b.mGroupSummary, b.mSortKey);
46747702147608084fec16a50640da54b412c737b9cGriff Hazen            addActionsToBuilder(builder, b.mActions);
46847702147608084fec16a50640da54b412c737b9cGriff Hazen            addStyleToBuilderJellybean(builder, b.mStyle);
46947702147608084fec16a50640da54b412c737b9cGriff Hazen            return builder.build();
47047702147608084fec16a50640da54b412c737b9cGriff Hazen        }
47147702147608084fec16a50640da54b412c737b9cGriff Hazen
47247702147608084fec16a50640da54b412c737b9cGriff Hazen        @Override
47347702147608084fec16a50640da54b412c737b9cGriff Hazen        public Bundle getExtras(Notification n) {
47447702147608084fec16a50640da54b412c737b9cGriff Hazen            return NotificationCompatKitKat.getExtras(n);
47547702147608084fec16a50640da54b412c737b9cGriff Hazen        }
47647702147608084fec16a50640da54b412c737b9cGriff Hazen
47747702147608084fec16a50640da54b412c737b9cGriff Hazen        @Override
478300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        public int getActionCount(Notification n) {
479300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            return NotificationCompatKitKat.getActionCount(n);
480300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        }
481300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
482300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        @Override
483300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        public Action getAction(Notification n, int actionIndex) {
484ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return (Action) NotificationCompatKitKat.getAction(n, actionIndex, Action.FACTORY,
485ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                    RemoteInput.FACTORY);
486300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        }
487300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
488300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        @Override
48947702147608084fec16a50640da54b412c737b9cGriff Hazen        public boolean getLocalOnly(Notification n) {
49047702147608084fec16a50640da54b412c737b9cGriff Hazen            return NotificationCompatKitKat.getLocalOnly(n);
491b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        }
492ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
493ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        @Override
494ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        public String getGroup(Notification n) {
495ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return NotificationCompatKitKat.getGroup(n);
496ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        }
497ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
498ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        @Override
499ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        public boolean isGroupSummary(Notification n) {
500ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return NotificationCompatKitKat.isGroupSummary(n);
501ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        }
502ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
503ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        @Override
504ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        public String getSortKey(Notification n) {
505ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return NotificationCompatKitKat.getSortKey(n);
506ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        }
507b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen    }
508b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen
509ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    static class NotificationCompatImplApi20 extends NotificationCompatImplKitKat {
510b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        @Override
511b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        public Notification build(Builder b) {
512b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            NotificationCompatApi20.Builder builder = new NotificationCompatApi20.Builder(
513b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                    b.mContext, b.mNotification, b.mContentTitle, b.mContentText, b.mContentInfo,
514b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                    b.mTickerView, b.mNumber, b.mContentIntent, b.mFullScreenIntent, b.mLargeIcon,
515b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                    b.mProgressMax, b.mProgress, b.mProgressIndeterminate,
516ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                    b.mUseChronometer, b.mPriority, b.mSubText, b.mLocalOnly, b.mExtras,
517ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                    b.mGroupKey, b.mGroupSummary, b.mSortKey);
518b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            addActionsToBuilder(builder, b.mActions);
519b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            addStyleToBuilderJellybean(builder, b.mStyle);
520b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            return builder.build();
521b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        }
522b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen
523b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        @Override
524ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        public Action getAction(Notification n, int actionIndex) {
525ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return (Action) NotificationCompatApi20.getAction(n, actionIndex, Action.FACTORY,
526ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                    RemoteInput.FACTORY);
527b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        }
528b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen
529b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        @Override
5302bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public Action[] getActionsFromParcelableArrayList(
5312bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                ArrayList<Parcelable> parcelables) {
5322bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return (Action[]) NotificationCompatApi20.getActionsFromParcelableArrayList(
5332bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                    parcelables, Action.FACTORY, RemoteInput.FACTORY);
5342bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
5352bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
5362bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        @Override
5372bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public ArrayList<Parcelable> getParcelableArrayListForActions(
5382bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                Action[] actions) {
5392bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return NotificationCompatApi20.getParcelableArrayListForActions(actions);
5402bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
5412bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
5422bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        @Override
543ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        public boolean getLocalOnly(Notification n) {
544ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return NotificationCompatApi20.getLocalOnly(n);
545300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        }
546300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
547300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        @Override
548ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        public String getGroup(Notification n) {
549ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return NotificationCompatApi20.getGroup(n);
550300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        }
551300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
552300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        @Override
553ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        public boolean isGroupSummary(Notification n) {
554ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return NotificationCompatApi20.isGroupSummary(n);
555ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        }
556ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
557ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        @Override
558ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        public String getSortKey(Notification n) {
559ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return NotificationCompatApi20.getSortKey(n);
560b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        }
561b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen    }
562b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen
563b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen    private static void addActionsToBuilder(NotificationBuilderWithActions builder,
564b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            ArrayList<Action> actions) {
565b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        for (Action action : actions) {
566ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            builder.addAction(action);
567b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        }
568b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen    }
569b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen
570b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen    private static void addStyleToBuilderJellybean(NotificationBuilderWithBuilderAccessor builder,
571b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            Style style) {
572b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        if (style != null) {
573b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            if (style instanceof BigTextStyle) {
574b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                BigTextStyle bigTextStyle = (BigTextStyle) style;
575b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                NotificationCompatJellybean.addBigTextStyle(builder,
576b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                        bigTextStyle.mBigContentTitle,
577b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                        bigTextStyle.mSummaryTextSet,
578b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                        bigTextStyle.mSummaryText,
579b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                        bigTextStyle.mBigText);
580b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            } else if (style instanceof InboxStyle) {
581b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                InboxStyle inboxStyle = (InboxStyle) style;
582b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                NotificationCompatJellybean.addInboxStyle(builder,
583b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                        inboxStyle.mBigContentTitle,
584b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                        inboxStyle.mSummaryTextSet,
585b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                        inboxStyle.mSummaryText,
586b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                        inboxStyle.mTexts);
587b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            } else if (style instanceof BigPictureStyle) {
588b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                BigPictureStyle bigPictureStyle = (BigPictureStyle) style;
589b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                NotificationCompatJellybean.addBigPictureStyle(builder,
590b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                        bigPictureStyle.mBigContentTitle,
591b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                        bigPictureStyle.mSummaryTextSet,
592b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                        bigPictureStyle.mSummaryText,
593b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                        bigPictureStyle.mPicture,
594b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                        bigPictureStyle.mBigLargeIcon,
595b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                        bigPictureStyle.mBigLargeIconSet);
596f021758934b35e3b842c6799344531d7ea2969daChris Wren            }
597f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
598f021758934b35e3b842c6799344531d7ea2969daChris Wren    }
599f021758934b35e3b842c6799344531d7ea2969daChris Wren
600c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell    static {
601300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        if (Build.VERSION.SDK_INT >= 20) {
602300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            IMPL = new NotificationCompatImplApi20();
603300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        } else if (Build.VERSION.SDK_INT >= 19) {
60447702147608084fec16a50640da54b412c737b9cGriff Hazen            IMPL = new NotificationCompatImplKitKat();
60547702147608084fec16a50640da54b412c737b9cGriff Hazen        } else if (Build.VERSION.SDK_INT >= 16) {
606f021758934b35e3b842c6799344531d7ea2969daChris Wren            IMPL = new NotificationCompatImplJellybean();
607080df8ffb0920eccb300baa39180eb956a000a53Chris Wren        } else if (Build.VERSION.SDK_INT >= 14) {
608f021758934b35e3b842c6799344531d7ea2969daChris Wren            IMPL = new NotificationCompatImplIceCreamSandwich();
609f021758934b35e3b842c6799344531d7ea2969daChris Wren        } else if (Build.VERSION.SDK_INT >= 11) {
610c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            IMPL = new NotificationCompatImplHoneycomb();
61129e9b1ca3b576f8d73465f725e0cc623f0d97ffdChris Wren        } else if (Build.VERSION.SDK_INT >= 9) {
61229e9b1ca3b576f8d73465f725e0cc623f0d97ffdChris Wren            IMPL = new NotificationCompatImplGingerbread();
613c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        } else {
614c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            IMPL = new NotificationCompatImplBase();
615c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
616c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell    }
617c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
618c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell    /**
619884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * Builder class for {@link NotificationCompat} objects.  Allows easier control over
620c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell     * all the flags, as well as help constructing the typical notification layouts.
621884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * <p>
622884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * On platform versions that don't offer expanded notifications, methods that depend on
623884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * expanded notifications have no effect.
624884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * </p>
625884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * <p>
626884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * For example, action buttons won't appear on platforms prior to Android 4.1. Action
627884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * buttons depend on expanded notifications, which are only available in Android 4.1
628884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * and later.
629884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * <p>
630884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * For this reason, you should always ensure that UI controls in a notification are also
631884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * available in an {@link android.app.Activity} in your app, and you should always start that
632884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * {@link android.app.Activity} when users click the notification. To do this, use the
633884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * {@link NotificationCompat.Builder#setContentIntent setContentIntent()}
634884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * method.
635884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * </p>
636884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     *
637c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell     */
638c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell    public static class Builder {
639c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        Context mContext;
640c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
641c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        CharSequence mContentTitle;
642c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        CharSequence mContentText;
643c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        PendingIntent mContentIntent;
644c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        PendingIntent mFullScreenIntent;
645c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        RemoteViews mTickerView;
646c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        Bitmap mLargeIcon;
647c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        CharSequence mContentInfo;
648c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        int mNumber;
649f021758934b35e3b842c6799344531d7ea2969daChris Wren        int mPriority;
650f021758934b35e3b842c6799344531d7ea2969daChris Wren        boolean mUseChronometer;
651f021758934b35e3b842c6799344531d7ea2969daChris Wren        Style mStyle;
652f021758934b35e3b842c6799344531d7ea2969daChris Wren        CharSequence mSubText;
653f021758934b35e3b842c6799344531d7ea2969daChris Wren        int mProgressMax;
654f021758934b35e3b842c6799344531d7ea2969daChris Wren        int mProgress;
655f021758934b35e3b842c6799344531d7ea2969daChris Wren        boolean mProgressIndeterminate;
656ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        String mGroupKey;
657ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        boolean mGroupSummary;
658ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        String mSortKey;
659f021758934b35e3b842c6799344531d7ea2969daChris Wren        ArrayList<Action> mActions = new ArrayList<Action>();
660b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        boolean mLocalOnly = false;
661ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen        Bundle mExtras;
662c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
663c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        Notification mNotification = new Notification();
664c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
665c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
666c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Constructor.
667c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         *
668c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Automatically sets the when field to {@link System#currentTimeMillis()
669c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * System.currentTimeMillis()} and the audio stream to the
670c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * {@link Notification#STREAM_DEFAULT}.
671c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         *
672c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * @param context A {@link Context} that will be used to construct the
673c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         *      RemoteViews. The Context will not be held past the lifetime of this
674c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         *      Builder object.
675c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
676c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder(Context context) {
677c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mContext = context;
678c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
679c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            // Set defaults to match the defaults of a Notification
680c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.when = System.currentTimeMillis();
681c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.audioStreamType = Notification.STREAM_DEFAULT;
682f021758934b35e3b842c6799344531d7ea2969daChris Wren            mPriority = PRIORITY_DEFAULT;
683c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
684c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
685c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
686c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Set the time that the event occurred.  Notifications in the panel are
687c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * sorted by this time.
688c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
689c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setWhen(long when) {
690c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.when = when;
691c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
692c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
693c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
694c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
695f021758934b35e3b842c6799344531d7ea2969daChris Wren         * Show the {@link Notification#when} field as a stopwatch.
696884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin         *
697884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin         * Instead of presenting <code>when</code> as a timestamp, the notification will show an
698f021758934b35e3b842c6799344531d7ea2969daChris Wren         * automatically updating display of the minutes and seconds since <code>when</code>.
699f021758934b35e3b842c6799344531d7ea2969daChris Wren         *
700f021758934b35e3b842c6799344531d7ea2969daChris Wren         * Useful when showing an elapsed time (like an ongoing phone call).
701f021758934b35e3b842c6799344531d7ea2969daChris Wren         *
702f021758934b35e3b842c6799344531d7ea2969daChris Wren         * @see android.widget.Chronometer
703f021758934b35e3b842c6799344531d7ea2969daChris Wren         * @see Notification#when
704f021758934b35e3b842c6799344531d7ea2969daChris Wren         */
705f021758934b35e3b842c6799344531d7ea2969daChris Wren        public Builder setUsesChronometer(boolean b) {
706f021758934b35e3b842c6799344531d7ea2969daChris Wren            mUseChronometer = b;
707f021758934b35e3b842c6799344531d7ea2969daChris Wren            return this;
708f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
709f021758934b35e3b842c6799344531d7ea2969daChris Wren
710f021758934b35e3b842c6799344531d7ea2969daChris Wren        /**
711c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Set the small icon to use in the notification layouts.  Different classes of devices
712c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * may return different sizes.  See the UX guidelines for more information on how to
713c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * design these icons.
714c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         *
715c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * @param icon A resource ID in the application's package of the drawble to use.
716c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
717c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setSmallIcon(int icon) {
718c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.icon = icon;
719c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
720c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
721c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
722c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
723c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * A variant of {@link #setSmallIcon(int) setSmallIcon(int)} that takes an additional
724c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * level parameter for when the icon is a {@link android.graphics.drawable.LevelListDrawable
725c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * LevelListDrawable}.
726c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         *
727c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * @param icon A resource ID in the application's package of the drawble to use.
728c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * @param level The level to use for the icon.
729c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         *
730c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * @see android.graphics.drawable.LevelListDrawable
731c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
732c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setSmallIcon(int icon, int level) {
733c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.icon = icon;
734c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.iconLevel = level;
735c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
736c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
737c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
738c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
739c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Set the title (first row) of the notification, in a standard notification.
740c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
741c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setContentTitle(CharSequence title) {
742c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mContentTitle = title;
743c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
744c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
745c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
746c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
747c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Set the text (second row) of the notification, in a standard notification.
748c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
749c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setContentText(CharSequence text) {
750c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mContentText = text;
751c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
752c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
753c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
754c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
755884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin         * Set the third line of text in the platform notification template.
756f021758934b35e3b842c6799344531d7ea2969daChris Wren         * Don't use if you're also using {@link #setProgress(int, int, boolean)};
757f021758934b35e3b842c6799344531d7ea2969daChris Wren         * they occupy the same location in the standard template.
758884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin         * <br>
759884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin         * If the platform does not provide large-format notifications, this method has no effect.
760884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin         * The third line of text only appears in expanded view.
761884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin         * <br>
762f021758934b35e3b842c6799344531d7ea2969daChris Wren         */
763f021758934b35e3b842c6799344531d7ea2969daChris Wren        public Builder setSubText(CharSequence text) {
764f021758934b35e3b842c6799344531d7ea2969daChris Wren            mSubText = text;
765f021758934b35e3b842c6799344531d7ea2969daChris Wren            return this;
766f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
767f021758934b35e3b842c6799344531d7ea2969daChris Wren
768f021758934b35e3b842c6799344531d7ea2969daChris Wren        /**
769c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Set the large number at the right-hand side of the notification.  This is
770c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * equivalent to setContentInfo, although it might show the number in a different
771c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * font size for readability.
772c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
773c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setNumber(int number) {
774c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNumber = number;
775c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
776c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
777c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
778c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
779c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Set the large text at the right-hand side of the notification.
780c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
781c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setContentInfo(CharSequence info) {
782c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mContentInfo = info;
783c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
784c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
785c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
786c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
787c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Set the progress this notification represents, which may be
788f021758934b35e3b842c6799344531d7ea2969daChris Wren         * represented as a {@link android.widget.ProgressBar}.
789c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
790c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setProgress(int max, int progress, boolean indeterminate) {
791c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mProgressMax = max;
792c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mProgress = progress;
793c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mProgressIndeterminate = indeterminate;
794c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
795f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
796c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
797c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
798c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Supply a custom RemoteViews to use instead of the standard one.
799c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
800c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setContent(RemoteViews views) {
801c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.contentView = views;
802c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
803c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
804c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
805c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
806c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Supply a {@link PendingIntent} to send when the notification is clicked.
807c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * If you do not supply an intent, you can now add PendingIntents to individual
808c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * views to be launched when clicked by calling {@link RemoteViews#setOnClickPendingIntent
809c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * RemoteViews.setOnClickPendingIntent(int,PendingIntent)}.  Be sure to
810c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * read {@link Notification#contentIntent Notification.contentIntent} for
811c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * how to correctly use this.
812c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
813c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setContentIntent(PendingIntent intent) {
814c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mContentIntent = intent;
815c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
816c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
817c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
818c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
819c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Supply a {@link PendingIntent} to send when the notification is cleared by the user
820c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * directly from the notification panel.  For example, this intent is sent when the user
821c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * clicks the "Clear all" button, or the individual "X" buttons on notifications.  This
822ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * intent is not sent when the application calls
823ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * {@link android.app.NotificationManager#cancel NotificationManager.cancel(int)}.
824c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
825c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setDeleteIntent(PendingIntent intent) {
826c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.deleteIntent = intent;
827c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
828c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
829c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
830c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
831c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * An intent to launch instead of posting the notification to the status bar.
832c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Only for use with extremely high-priority notifications demanding the user's
833c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * <strong>immediate</strong> attention, such as an incoming phone call or
834c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * alarm clock that the user has explicitly set to a particular time.
835c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * If this facility is used for something else, please give the user an option
836c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * to turn it off and use a normal notification, as this can be extremely
837c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * disruptive.
838c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         *
839c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * @param intent The pending intent to launch.
840c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * @param highPriority Passing true will cause this notification to be sent
841c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         *          even if other notifications are suppressed.
842c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
843c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setFullScreenIntent(PendingIntent intent, boolean highPriority) {
844c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mFullScreenIntent = intent;
845c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            setFlag(FLAG_HIGH_PRIORITY, highPriority);
846c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
847c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
848c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
849c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
850c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Set the text that is displayed in the status bar when the notification first
851c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * arrives.
852c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
853c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setTicker(CharSequence tickerText) {
854c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.tickerText = tickerText;
855c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
856c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
857c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
858c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
859c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Set the text that is displayed in the status bar when the notification first
860c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * arrives, and also a RemoteViews object that may be displayed instead on some
861c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * devices.
862c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
863c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setTicker(CharSequence tickerText, RemoteViews views) {
864c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.tickerText = tickerText;
865c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mTickerView = views;
866c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
867c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
868c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
869c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
870c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Set the large icon that is shown in the ticker and notification.
871c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
872c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setLargeIcon(Bitmap icon) {
873c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mLargeIcon = icon;
874c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
875c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
876c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
877c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
878c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Set the sound to play.  It will play on the default stream.
879c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
880c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setSound(Uri sound) {
881c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.sound = sound;
882c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.audioStreamType = Notification.STREAM_DEFAULT;
883c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
884c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
885c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
886c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
887c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Set the sound to play.  It will play on the stream you supply.
888c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         *
889fe3b5bac4901a4bb8cf51c09fe4910b02388818aGriff Hazen         * @see Notification#STREAM_DEFAULT
890c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * @see AudioManager for the <code>STREAM_</code> constants.
891c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
892c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setSound(Uri sound, int streamType) {
893c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.sound = sound;
894c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.audioStreamType = streamType;
895c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
896c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
897c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
898c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
899c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Set the vibration pattern to use.
900c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         *
901c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * @see android.os.Vibrator for a discussion of the <code>pattern</code>
902c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * parameter.
903c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
904c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setVibrate(long[] pattern) {
905c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.vibrate = pattern;
906c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
907c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
908c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
909c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
910c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Set the argb value that you would like the LED on the device to blnk, as well as the
911c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * rate.  The rate is specified in terms of the number of milliseconds to be on
912c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * and then the number of milliseconds to be off.
913c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
914c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setLights(int argb, int onMs, int offMs) {
915c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.ledARGB = argb;
916c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.ledOnMS = onMs;
917c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.ledOffMS = offMs;
918c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            boolean showLights = mNotification.ledOnMS != 0 && mNotification.ledOffMS != 0;
919c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.flags = (mNotification.flags & ~Notification.FLAG_SHOW_LIGHTS) |
920c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell                    (showLights ? Notification.FLAG_SHOW_LIGHTS : 0);
921c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
922c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
923c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
924c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
925c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Set whether this is an ongoing notification.
926c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         *
927c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * <p>Ongoing notifications differ from regular notifications in the following ways:
928c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * <ul>
929c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         *   <li>Ongoing notifications are sorted above the regular notifications in the
930c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         *   notification panel.</li>
931c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         *   <li>Ongoing notifications do not have an 'X' close button, and are not affected
932c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         *   by the "Clear all" button.
933c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * </ul>
934c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
935c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setOngoing(boolean ongoing) {
936c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            setFlag(Notification.FLAG_ONGOING_EVENT, ongoing);
937c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
938c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
939c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
940c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
941c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Set this flag if you would only like the sound, vibrate
942c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * and ticker to be played if the notification is not already showing.
943c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
944c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setOnlyAlertOnce(boolean onlyAlertOnce) {
945c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            setFlag(Notification.FLAG_ONLY_ALERT_ONCE, onlyAlertOnce);
946c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
947c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
948c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
949c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
950c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Setting this flag will make it so the notification is automatically
951c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * canceled when the user clicks it in the panel.  The PendingIntent
952c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * set with {@link #setDeleteIntent} will be broadcast when the notification
953c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * is canceled.
954c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
955c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setAutoCancel(boolean autoCancel) {
956c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            setFlag(Notification.FLAG_AUTO_CANCEL, autoCancel);
957c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
958c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
959c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
960c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
961b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen         * Set whether or not this notification is only relevant to the current device.
962b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen         *
963b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen         * <p>Some notifications can be bridged to other devices for remote display.
964b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen         * This hint can be set to recommend this notification not be bridged.
965b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen         */
966b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        public Builder setLocalOnly(boolean b) {
967b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            mLocalOnly = b;
968b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            return this;
969b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        }
970b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen
971b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        /**
972c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Set the default notification options that will be used.
973c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * <p>
974c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * The value should be one or more of the following fields combined with
975c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * bitwise-or:
976c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * {@link Notification#DEFAULT_SOUND}, {@link Notification#DEFAULT_VIBRATE},
977c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * {@link Notification#DEFAULT_LIGHTS}.
978c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * <p>
979c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * For all default values, use {@link Notification#DEFAULT_ALL}.
980c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
981c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setDefaults(int defaults) {
982c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.defaults = defaults;
983c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            if ((defaults & Notification.DEFAULT_LIGHTS) != 0) {
984c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell                mNotification.flags |= Notification.FLAG_SHOW_LIGHTS;
985c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            }
986c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
987c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
988c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
989c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        private void setFlag(int mask, boolean value) {
990c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            if (value) {
991c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell                mNotification.flags |= mask;
992c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            } else {
993c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell                mNotification.flags &= ~mask;
994c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            }
995c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
996c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
997c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
998f021758934b35e3b842c6799344531d7ea2969daChris Wren         * Set the relative priority for this notification.
999884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin         *
1000f021758934b35e3b842c6799344531d7ea2969daChris Wren         * Priority is an indication of how much of the user's
1001f021758934b35e3b842c6799344531d7ea2969daChris Wren         * valuable attention should be consumed by this
1002f021758934b35e3b842c6799344531d7ea2969daChris Wren         * notification. Low-priority notifications may be hidden from
1003f021758934b35e3b842c6799344531d7ea2969daChris Wren         * the user in certain situations, while the user might be
1004884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin         * interrupted for a higher-priority notification.
1005884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin         * The system sets a notification's priority based on various factors including the
1006884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin         * setPriority value. The effect may differ slightly on different platforms.
10077c94c9ad26555427345c6c540bf761bf73389016Andrew Solovay         *
10087c94c9ad26555427345c6c540bf761bf73389016Andrew Solovay         * @param pri Relative priority for this notification. Must be one of
10097c94c9ad26555427345c6c540bf761bf73389016Andrew Solovay         *     the priority constants defined by {@link NotificationCompat}.
10107c94c9ad26555427345c6c540bf761bf73389016Andrew Solovay         *     Acceptable values range from {@link
10117c94c9ad26555427345c6c540bf761bf73389016Andrew Solovay         *     NotificationCompat#PRIORITY_MIN} (-2) to {@link
10127c94c9ad26555427345c6c540bf761bf73389016Andrew Solovay         *     NotificationCompat#PRIORITY_MAX} (2).
1013f021758934b35e3b842c6799344531d7ea2969daChris Wren         */
1014f021758934b35e3b842c6799344531d7ea2969daChris Wren        public Builder setPriority(int pri) {
1015f021758934b35e3b842c6799344531d7ea2969daChris Wren            mPriority = pri;
1016f021758934b35e3b842c6799344531d7ea2969daChris Wren            return this;
1017f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
1018f021758934b35e3b842c6799344531d7ea2969daChris Wren
1019f021758934b35e3b842c6799344531d7ea2969daChris Wren        /**
1020ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * Set this notification to be part of a group of notifications sharing the same key.
1021ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * Grouped notifications may display in a cluster or stack on devices which
1022ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * support such rendering.
1023ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         *
1024ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * <p>To make this notification the summary for its group, also call
1025ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * {@link #setGroupSummary}. A sort order can be specified for group members by using
1026ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * {@link #setSortKey}.
1027ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * @param groupKey The group key of the group.
1028ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * @return this object for method chaining
1029ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         */
1030ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        public Builder setGroup(String groupKey) {
1031ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            mGroupKey = groupKey;
1032ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return this;
1033ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        }
1034ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
1035ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        /**
1036ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * Set this notification to be the group summary for a group of notifications.
1037ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * Grouped notifications may display in a cluster or stack on devices which
1038ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * support such rendering. Requires a group key also be set using {@link #setGroup}.
1039ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * @param isGroupSummary Whether this notification should be a group summary.
1040ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * @return this object for method chaining
1041ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         */
1042ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        public Builder setGroupSummary(boolean isGroupSummary) {
1043ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            mGroupSummary = isGroupSummary;
1044ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return this;
1045ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        }
1046ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
1047ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        /**
1048ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * Set a sort key that orders this notification among other notifications from the
1049ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * same package. This can be useful if an external sort was already applied and an app
1050ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * would like to preserve this. Notifications will be sorted lexicographically using this
1051ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * value, although providing different priorities in addition to providing sort key may
1052ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * cause this value to be ignored.
1053ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         *
1054ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * <p>This sort key can also be used to order members of a notification group. See
1055ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * {@link Builder#setGroup}.
1056ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         *
1057ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * @see String#compareTo(String)
1058ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         */
1059ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        public Builder setSortKey(String sortKey) {
1060ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            mSortKey = sortKey;
1061ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return this;
1062ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        }
1063ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
1064ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        /**
1065ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         * Merge additional metadata into this notification.
1066ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         *
1067ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         * <p>Values within the Bundle will replace existing extras values in this Builder.
1068ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         *
1069ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         * @see Notification#extras
1070ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         */
1071300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        public Builder addExtras(Bundle extras) {
1072300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            if (extras != null) {
1073300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen                if (mExtras == null) {
1074300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen                    mExtras = new Bundle(extras);
1075300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen                } else {
1076300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen                    mExtras.putAll(extras);
1077300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen                }
1078ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen            }
1079ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen            return this;
1080ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen        }
1081ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen
1082ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen        /**
1083ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         * Set metadata for this notification.
1084ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         *
1085ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         * <p>A reference to the Bundle is held for the lifetime of this Builder, and the Bundle's
1086ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         * current contents are copied into the Notification each time {@link #build()} is
1087ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         * called.
1088ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         *
1089ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         * <p>Replaces any existing extras values with those from the provided Bundle.
1090ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         * Use {@link #addExtras} to merge in metadata instead.
1091ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         *
1092ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         * @see Notification#extras
1093ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         */
1094300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        public Builder setExtras(Bundle extras) {
1095300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            mExtras = extras;
1096ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen            return this;
1097ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen        }
1098ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen
1099ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen        /**
1100ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         * Get the current metadata Bundle used by this notification Builder.
1101ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         *
1102ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         * <p>The returned Bundle is shared with this Builder.
1103ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         *
1104ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         * <p>The current contents of this Bundle are copied into the Notification each time
1105ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         * {@link #build()} is called.
1106ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         *
1107ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         * @see Notification#extras
1108ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         */
1109ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen        public Bundle getExtras() {
1110ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen            if (mExtras == null) {
1111ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen                mExtras = new Bundle();
1112ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen            }
1113ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen            return mExtras;
1114ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen        }
1115ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen
1116ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen        /**
1117f021758934b35e3b842c6799344531d7ea2969daChris Wren         * Add an action to this notification. Actions are typically displayed by
1118f021758934b35e3b842c6799344531d7ea2969daChris Wren         * the system as a button adjacent to the notification content.
1119884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin         * <br>
1120884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin         * Action buttons won't appear on platforms prior to Android 4.1. Action
1121884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin         * buttons depend on expanded notifications, which are only available in Android 4.1
1122884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin         * and later. To ensure that an action button's functionality is always available, first
1123884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin         * implement the functionality in the {@link android.app.Activity} that starts when a user
1124884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin         * clicks the  notification (see {@link #setContentIntent setContentIntent()}), and then
1125884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin         * enhance the notification by implementing the same functionality with
1126884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin         * {@link #addAction addAction()}.
1127f021758934b35e3b842c6799344531d7ea2969daChris Wren         *
1128f021758934b35e3b842c6799344531d7ea2969daChris Wren         * @param icon Resource ID of a drawable that represents the action.
1129f021758934b35e3b842c6799344531d7ea2969daChris Wren         * @param title Text describing the action.
1130884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin         * @param intent {@link android.app.PendingIntent} to be fired when the action is invoked.
1131f021758934b35e3b842c6799344531d7ea2969daChris Wren         */
1132f021758934b35e3b842c6799344531d7ea2969daChris Wren        public Builder addAction(int icon, CharSequence title, PendingIntent intent) {
1133f021758934b35e3b842c6799344531d7ea2969daChris Wren            mActions.add(new Action(icon, title, intent));
1134f021758934b35e3b842c6799344531d7ea2969daChris Wren            return this;
1135f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
1136f021758934b35e3b842c6799344531d7ea2969daChris Wren
1137f021758934b35e3b842c6799344531d7ea2969daChris Wren        /**
1138300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen         * Add an action to this notification. Actions are typically displayed by
1139300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen         * the system as a button adjacent to the notification content.
1140300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen         * <br>
1141300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen         * Action buttons won't appear on platforms prior to Android 4.1. Action
1142300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen         * buttons depend on expanded notifications, which are only available in Android 4.1
1143300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen         * and later. To ensure that an action button's functionality is always available, first
1144300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen         * implement the functionality in the {@link android.app.Activity} that starts when a user
1145300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen         * clicks the  notification (see {@link #setContentIntent setContentIntent()}), and then
1146300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen         * enhance the notification by implementing the same functionality with
1147300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen         * {@link #addAction addAction()}.
1148300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen         *
1149300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen         * @param action The action to add.
1150300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen         */
1151300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        public Builder addAction(Action action) {
1152300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            mActions.add(action);
1153300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            return this;
1154300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        }
1155300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
1156300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        /**
1157f021758934b35e3b842c6799344531d7ea2969daChris Wren         * Add a rich notification style to be applied at build time.
1158884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin         * <br>
1159884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin         * If the platform does not provide rich notification styles, this method has no effect. The
1160884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin         * user will always see the normal notification style.
1161f021758934b35e3b842c6799344531d7ea2969daChris Wren         *
1162f021758934b35e3b842c6799344531d7ea2969daChris Wren         * @param style Object responsible for modifying the notification style.
1163f021758934b35e3b842c6799344531d7ea2969daChris Wren         */
1164f021758934b35e3b842c6799344531d7ea2969daChris Wren        public Builder setStyle(Style style) {
1165f021758934b35e3b842c6799344531d7ea2969daChris Wren            if (mStyle != style) {
1166f021758934b35e3b842c6799344531d7ea2969daChris Wren                mStyle = style;
1167f021758934b35e3b842c6799344531d7ea2969daChris Wren                if (mStyle != null) {
1168f021758934b35e3b842c6799344531d7ea2969daChris Wren                    mStyle.setBuilder(this);
1169f021758934b35e3b842c6799344531d7ea2969daChris Wren                }
1170f021758934b35e3b842c6799344531d7ea2969daChris Wren            }
1171f021758934b35e3b842c6799344531d7ea2969daChris Wren            return this;
1172f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
1173f021758934b35e3b842c6799344531d7ea2969daChris Wren
1174f021758934b35e3b842c6799344531d7ea2969daChris Wren        /**
1175ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * Apply an extender to this notification builder. Extenders may be used to add
1176ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * metadata or change options on this builder.
1177ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         */
11782bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public Builder extend(Extender extender) {
11792bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            extender.extend(this);
1180ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return this;
1181ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        }
1182ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
1183ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        /**
1184f021758934b35e3b842c6799344531d7ea2969daChris Wren         * @deprecated Use {@link #build()} instead.
1185f021758934b35e3b842c6799344531d7ea2969daChris Wren         */
1186f021758934b35e3b842c6799344531d7ea2969daChris Wren        @Deprecated
1187f021758934b35e3b842c6799344531d7ea2969daChris Wren        public Notification getNotification() {
1188fe3b5bac4901a4bb8cf51c09fe4910b02388818aGriff Hazen            return IMPL.build(this);
1189f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
1190f021758934b35e3b842c6799344531d7ea2969daChris Wren
1191f021758934b35e3b842c6799344531d7ea2969daChris Wren        /**
1192c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Combine all of the options that have been set and return a new {@link Notification}
1193c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * object.
1194c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
1195f021758934b35e3b842c6799344531d7ea2969daChris Wren        public Notification build() {
1196fe3b5bac4901a4bb8cf51c09fe4910b02388818aGriff Hazen            return IMPL.build(this);
1197f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
1198f021758934b35e3b842c6799344531d7ea2969daChris Wren    }
1199f021758934b35e3b842c6799344531d7ea2969daChris Wren
1200f021758934b35e3b842c6799344531d7ea2969daChris Wren    /**
1201f021758934b35e3b842c6799344531d7ea2969daChris Wren     * An object that can apply a rich notification style to a {@link Notification.Builder}
1202f021758934b35e3b842c6799344531d7ea2969daChris Wren     * object.
1203884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * <br>
1204884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * If the platform does not provide rich notification styles, methods in this class have no
1205884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * effect.
1206f021758934b35e3b842c6799344531d7ea2969daChris Wren     */
1207fe3b5bac4901a4bb8cf51c09fe4910b02388818aGriff Hazen    public static abstract class Style {
1208f021758934b35e3b842c6799344531d7ea2969daChris Wren        Builder mBuilder;
1209f021758934b35e3b842c6799344531d7ea2969daChris Wren        CharSequence mBigContentTitle;
1210f021758934b35e3b842c6799344531d7ea2969daChris Wren        CharSequence mSummaryText;
1211f021758934b35e3b842c6799344531d7ea2969daChris Wren        boolean mSummaryTextSet = false;
1212f021758934b35e3b842c6799344531d7ea2969daChris Wren
1213f021758934b35e3b842c6799344531d7ea2969daChris Wren        public void setBuilder(Builder builder) {
1214f021758934b35e3b842c6799344531d7ea2969daChris Wren            if (mBuilder != builder) {
1215f021758934b35e3b842c6799344531d7ea2969daChris Wren                mBuilder = builder;
1216f021758934b35e3b842c6799344531d7ea2969daChris Wren                if (mBuilder != null) {
1217f021758934b35e3b842c6799344531d7ea2969daChris Wren                    mBuilder.setStyle(this);
1218f021758934b35e3b842c6799344531d7ea2969daChris Wren                }
1219f021758934b35e3b842c6799344531d7ea2969daChris Wren            }
1220f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
1221f021758934b35e3b842c6799344531d7ea2969daChris Wren
1222f021758934b35e3b842c6799344531d7ea2969daChris Wren        public Notification build() {
1223f021758934b35e3b842c6799344531d7ea2969daChris Wren            Notification notification = null;
1224f021758934b35e3b842c6799344531d7ea2969daChris Wren            if (mBuilder != null) {
1225f021758934b35e3b842c6799344531d7ea2969daChris Wren                notification = mBuilder.build();
1226884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin            }
1227f021758934b35e3b842c6799344531d7ea2969daChris Wren            return notification;
1228f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
1229f021758934b35e3b842c6799344531d7ea2969daChris Wren    }
1230f021758934b35e3b842c6799344531d7ea2969daChris Wren
1231f021758934b35e3b842c6799344531d7ea2969daChris Wren    /**
1232f021758934b35e3b842c6799344531d7ea2969daChris Wren     * Helper class for generating large-format notifications that include a large image attachment.
1233884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * <br>
1234884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * If the platform does not provide large-format notifications, this method has no effect. The
1235884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * user will always see the normal notification view.
1236884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * <br>
1237f021758934b35e3b842c6799344531d7ea2969daChris Wren     * This class is a "rebuilder": It attaches to a Builder object and modifies its behavior, like so:
1238f021758934b35e3b842c6799344531d7ea2969daChris Wren     * <pre class="prettyprint">
1239f021758934b35e3b842c6799344531d7ea2969daChris Wren     * Notification noti = new Notification.Builder()
1240f021758934b35e3b842c6799344531d7ea2969daChris Wren     *     .setContentTitle(&quot;New photo from &quot; + sender.toString())
1241f021758934b35e3b842c6799344531d7ea2969daChris Wren     *     .setContentText(subject)
1242f021758934b35e3b842c6799344531d7ea2969daChris Wren     *     .setSmallIcon(R.drawable.new_post)
1243f021758934b35e3b842c6799344531d7ea2969daChris Wren     *     .setLargeIcon(aBitmap)
1244f021758934b35e3b842c6799344531d7ea2969daChris Wren     *     .setStyle(new Notification.BigPictureStyle()
1245f021758934b35e3b842c6799344531d7ea2969daChris Wren     *         .bigPicture(aBigBitmap))
1246f021758934b35e3b842c6799344531d7ea2969daChris Wren     *     .build();
1247f021758934b35e3b842c6799344531d7ea2969daChris Wren     * </pre>
1248884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     *
1249f021758934b35e3b842c6799344531d7ea2969daChris Wren     * @see Notification#bigContentView
1250f021758934b35e3b842c6799344531d7ea2969daChris Wren     */
1251f021758934b35e3b842c6799344531d7ea2969daChris Wren    public static class BigPictureStyle extends Style {
1252f021758934b35e3b842c6799344531d7ea2969daChris Wren        Bitmap mPicture;
125349714d665f839c4804a17eea129092f8b472926dRoman Nurik        Bitmap mBigLargeIcon;
125449714d665f839c4804a17eea129092f8b472926dRoman Nurik        boolean mBigLargeIconSet;
1255f021758934b35e3b842c6799344531d7ea2969daChris Wren
1256f021758934b35e3b842c6799344531d7ea2969daChris Wren        public BigPictureStyle() {
1257f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
1258f021758934b35e3b842c6799344531d7ea2969daChris Wren
1259f021758934b35e3b842c6799344531d7ea2969daChris Wren        public BigPictureStyle(Builder builder) {
1260f021758934b35e3b842c6799344531d7ea2969daChris Wren            setBuilder(builder);
1261f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
1262f021758934b35e3b842c6799344531d7ea2969daChris Wren
1263f021758934b35e3b842c6799344531d7ea2969daChris Wren        /**
1264f021758934b35e3b842c6799344531d7ea2969daChris Wren         * Overrides ContentTitle in the big form of the template.
1265f021758934b35e3b842c6799344531d7ea2969daChris Wren         * This defaults to the value passed to setContentTitle().
1266f021758934b35e3b842c6799344531d7ea2969daChris Wren         */
1267f021758934b35e3b842c6799344531d7ea2969daChris Wren        public BigPictureStyle setBigContentTitle(CharSequence title) {
1268f021758934b35e3b842c6799344531d7ea2969daChris Wren            mBigContentTitle = title;
1269f021758934b35e3b842c6799344531d7ea2969daChris Wren            return this;
1270f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
1271f021758934b35e3b842c6799344531d7ea2969daChris Wren
1272f021758934b35e3b842c6799344531d7ea2969daChris Wren        /**
1273f021758934b35e3b842c6799344531d7ea2969daChris Wren         * Set the first line of text after the detail section in the big form of the template.
1274f021758934b35e3b842c6799344531d7ea2969daChris Wren         */
1275f021758934b35e3b842c6799344531d7ea2969daChris Wren        public BigPictureStyle setSummaryText(CharSequence cs) {
1276f021758934b35e3b842c6799344531d7ea2969daChris Wren            mSummaryText = cs;
1277f021758934b35e3b842c6799344531d7ea2969daChris Wren            mSummaryTextSet = true;
1278f021758934b35e3b842c6799344531d7ea2969daChris Wren            return this;
1279f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
1280f021758934b35e3b842c6799344531d7ea2969daChris Wren
1281b41a213761ff07de2fcfdaf16790fdcca1a1ee1bChris Wren        /**
1282b41a213761ff07de2fcfdaf16790fdcca1a1ee1bChris Wren         * Provide the bitmap to be used as the payload for the BigPicture notification.
1283b41a213761ff07de2fcfdaf16790fdcca1a1ee1bChris Wren         */
1284f021758934b35e3b842c6799344531d7ea2969daChris Wren        public BigPictureStyle bigPicture(Bitmap b) {
1285f021758934b35e3b842c6799344531d7ea2969daChris Wren            mPicture = b;
1286f021758934b35e3b842c6799344531d7ea2969daChris Wren            return this;
1287f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
128849714d665f839c4804a17eea129092f8b472926dRoman Nurik
128949714d665f839c4804a17eea129092f8b472926dRoman Nurik        /**
129049714d665f839c4804a17eea129092f8b472926dRoman Nurik         * Override the large icon when the big notification is shown.
129149714d665f839c4804a17eea129092f8b472926dRoman Nurik         */
129249714d665f839c4804a17eea129092f8b472926dRoman Nurik        public BigPictureStyle bigLargeIcon(Bitmap b) {
129349714d665f839c4804a17eea129092f8b472926dRoman Nurik            mBigLargeIcon = b;
129449714d665f839c4804a17eea129092f8b472926dRoman Nurik            mBigLargeIconSet = true;
129549714d665f839c4804a17eea129092f8b472926dRoman Nurik            return this;
129649714d665f839c4804a17eea129092f8b472926dRoman Nurik        }
1297f021758934b35e3b842c6799344531d7ea2969daChris Wren    }
1298f021758934b35e3b842c6799344531d7ea2969daChris Wren
1299f021758934b35e3b842c6799344531d7ea2969daChris Wren    /**
1300f021758934b35e3b842c6799344531d7ea2969daChris Wren     * Helper class for generating large-format notifications that include a lot of text.
1301884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     *
1302884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * <br>
1303884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * If the platform does not provide large-format notifications, this method has no effect. The
1304884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * user will always see the normal notification view.
1305884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * <br>
1306f021758934b35e3b842c6799344531d7ea2969daChris Wren     * This class is a "rebuilder": It attaches to a Builder object and modifies its behavior, like so:
1307f021758934b35e3b842c6799344531d7ea2969daChris Wren     * <pre class="prettyprint">
1308f021758934b35e3b842c6799344531d7ea2969daChris Wren     * Notification noti = new Notification.Builder()
1309f021758934b35e3b842c6799344531d7ea2969daChris Wren     *     .setContentTitle(&quot;New mail from &quot; + sender.toString())
1310f021758934b35e3b842c6799344531d7ea2969daChris Wren     *     .setContentText(subject)
1311f021758934b35e3b842c6799344531d7ea2969daChris Wren     *     .setSmallIcon(R.drawable.new_mail)
1312f021758934b35e3b842c6799344531d7ea2969daChris Wren     *     .setLargeIcon(aBitmap)
1313f021758934b35e3b842c6799344531d7ea2969daChris Wren     *     .setStyle(new Notification.BigTextStyle()
1314f021758934b35e3b842c6799344531d7ea2969daChris Wren     *         .bigText(aVeryLongString))
1315f021758934b35e3b842c6799344531d7ea2969daChris Wren     *     .build();
1316f021758934b35e3b842c6799344531d7ea2969daChris Wren     * </pre>
1317884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     *
1318f021758934b35e3b842c6799344531d7ea2969daChris Wren     * @see Notification#bigContentView
1319f021758934b35e3b842c6799344531d7ea2969daChris Wren     */
1320f021758934b35e3b842c6799344531d7ea2969daChris Wren    public static class BigTextStyle extends Style {
1321f021758934b35e3b842c6799344531d7ea2969daChris Wren        CharSequence mBigText;
1322f021758934b35e3b842c6799344531d7ea2969daChris Wren
1323f021758934b35e3b842c6799344531d7ea2969daChris Wren        public BigTextStyle() {
1324f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
1325f021758934b35e3b842c6799344531d7ea2969daChris Wren
1326f021758934b35e3b842c6799344531d7ea2969daChris Wren        public BigTextStyle(Builder builder) {
1327f021758934b35e3b842c6799344531d7ea2969daChris Wren            setBuilder(builder);
1328f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
1329f021758934b35e3b842c6799344531d7ea2969daChris Wren
1330f021758934b35e3b842c6799344531d7ea2969daChris Wren        /**
1331f021758934b35e3b842c6799344531d7ea2969daChris Wren         * Overrides ContentTitle in the big form of the template.
1332f021758934b35e3b842c6799344531d7ea2969daChris Wren         * This defaults to the value passed to setContentTitle().
1333f021758934b35e3b842c6799344531d7ea2969daChris Wren         */
1334f021758934b35e3b842c6799344531d7ea2969daChris Wren        public BigTextStyle setBigContentTitle(CharSequence title) {
1335f021758934b35e3b842c6799344531d7ea2969daChris Wren            mBigContentTitle = title;
1336f021758934b35e3b842c6799344531d7ea2969daChris Wren            return this;
1337f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
1338f021758934b35e3b842c6799344531d7ea2969daChris Wren
1339f021758934b35e3b842c6799344531d7ea2969daChris Wren        /**
1340f021758934b35e3b842c6799344531d7ea2969daChris Wren         * Set the first line of text after the detail section in the big form of the template.
1341f021758934b35e3b842c6799344531d7ea2969daChris Wren         */
1342f021758934b35e3b842c6799344531d7ea2969daChris Wren        public BigTextStyle setSummaryText(CharSequence cs) {
1343f021758934b35e3b842c6799344531d7ea2969daChris Wren            mSummaryText = cs;
1344f021758934b35e3b842c6799344531d7ea2969daChris Wren            mSummaryTextSet = true;
1345f021758934b35e3b842c6799344531d7ea2969daChris Wren            return this;
1346f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
1347f021758934b35e3b842c6799344531d7ea2969daChris Wren
1348b41a213761ff07de2fcfdaf16790fdcca1a1ee1bChris Wren        /**
1349b41a213761ff07de2fcfdaf16790fdcca1a1ee1bChris Wren         * Provide the longer text to be displayed in the big form of the
1350b41a213761ff07de2fcfdaf16790fdcca1a1ee1bChris Wren         * template in place of the content text.
1351b41a213761ff07de2fcfdaf16790fdcca1a1ee1bChris Wren         */
1352f021758934b35e3b842c6799344531d7ea2969daChris Wren        public BigTextStyle bigText(CharSequence cs) {
1353f021758934b35e3b842c6799344531d7ea2969daChris Wren            mBigText = cs;
1354f021758934b35e3b842c6799344531d7ea2969daChris Wren            return this;
1355f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
1356f021758934b35e3b842c6799344531d7ea2969daChris Wren    }
1357f021758934b35e3b842c6799344531d7ea2969daChris Wren
1358f021758934b35e3b842c6799344531d7ea2969daChris Wren    /**
1359f021758934b35e3b842c6799344531d7ea2969daChris Wren     * Helper class for generating large-format notifications that include a list of (up to 5) strings.
1360884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     *
1361884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * <br>
1362884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * If the platform does not provide large-format notifications, this method has no effect. The
1363884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * user will always see the normal notification view.
1364884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * <br>
1365f021758934b35e3b842c6799344531d7ea2969daChris Wren     * This class is a "rebuilder": It attaches to a Builder object and modifies its behavior, like so:
1366f021758934b35e3b842c6799344531d7ea2969daChris Wren     * <pre class="prettyprint">
1367f021758934b35e3b842c6799344531d7ea2969daChris Wren     * Notification noti = new Notification.Builder()
1368f021758934b35e3b842c6799344531d7ea2969daChris Wren     *     .setContentTitle(&quot;5 New mails from &quot; + sender.toString())
1369f021758934b35e3b842c6799344531d7ea2969daChris Wren     *     .setContentText(subject)
1370f021758934b35e3b842c6799344531d7ea2969daChris Wren     *     .setSmallIcon(R.drawable.new_mail)
1371f021758934b35e3b842c6799344531d7ea2969daChris Wren     *     .setLargeIcon(aBitmap)
1372f021758934b35e3b842c6799344531d7ea2969daChris Wren     *     .setStyle(new Notification.InboxStyle()
1373f021758934b35e3b842c6799344531d7ea2969daChris Wren     *         .addLine(str1)
1374f021758934b35e3b842c6799344531d7ea2969daChris Wren     *         .addLine(str2)
1375f021758934b35e3b842c6799344531d7ea2969daChris Wren     *         .setContentTitle(&quot;&quot;)
1376f021758934b35e3b842c6799344531d7ea2969daChris Wren     *         .setSummaryText(&quot;+3 more&quot;))
1377f021758934b35e3b842c6799344531d7ea2969daChris Wren     *     .build();
1378f021758934b35e3b842c6799344531d7ea2969daChris Wren     * </pre>
1379884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     *
1380f021758934b35e3b842c6799344531d7ea2969daChris Wren     * @see Notification#bigContentView
1381f021758934b35e3b842c6799344531d7ea2969daChris Wren     */
1382f021758934b35e3b842c6799344531d7ea2969daChris Wren    public static class InboxStyle extends Style {
1383f021758934b35e3b842c6799344531d7ea2969daChris Wren        ArrayList<CharSequence> mTexts = new ArrayList<CharSequence>();
1384f021758934b35e3b842c6799344531d7ea2969daChris Wren
1385f021758934b35e3b842c6799344531d7ea2969daChris Wren        public InboxStyle() {
1386f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
1387f021758934b35e3b842c6799344531d7ea2969daChris Wren
1388f021758934b35e3b842c6799344531d7ea2969daChris Wren        public InboxStyle(Builder builder) {
1389f021758934b35e3b842c6799344531d7ea2969daChris Wren            setBuilder(builder);
1390f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
1391f021758934b35e3b842c6799344531d7ea2969daChris Wren
1392f021758934b35e3b842c6799344531d7ea2969daChris Wren        /**
1393f021758934b35e3b842c6799344531d7ea2969daChris Wren         * Overrides ContentTitle in the big form of the template.
1394f021758934b35e3b842c6799344531d7ea2969daChris Wren         * This defaults to the value passed to setContentTitle().
1395f021758934b35e3b842c6799344531d7ea2969daChris Wren         */
1396f021758934b35e3b842c6799344531d7ea2969daChris Wren        public InboxStyle setBigContentTitle(CharSequence title) {
1397f021758934b35e3b842c6799344531d7ea2969daChris Wren            mBigContentTitle = title;
1398f021758934b35e3b842c6799344531d7ea2969daChris Wren            return this;
1399f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
1400f021758934b35e3b842c6799344531d7ea2969daChris Wren
1401f021758934b35e3b842c6799344531d7ea2969daChris Wren        /**
1402f021758934b35e3b842c6799344531d7ea2969daChris Wren         * Set the first line of text after the detail section in the big form of the template.
1403f021758934b35e3b842c6799344531d7ea2969daChris Wren         */
1404f021758934b35e3b842c6799344531d7ea2969daChris Wren        public InboxStyle setSummaryText(CharSequence cs) {
1405f021758934b35e3b842c6799344531d7ea2969daChris Wren            mSummaryText = cs;
1406f021758934b35e3b842c6799344531d7ea2969daChris Wren            mSummaryTextSet = true;
1407f021758934b35e3b842c6799344531d7ea2969daChris Wren            return this;
1408f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
1409f021758934b35e3b842c6799344531d7ea2969daChris Wren
1410b41a213761ff07de2fcfdaf16790fdcca1a1ee1bChris Wren        /**
1411b41a213761ff07de2fcfdaf16790fdcca1a1ee1bChris Wren         * Append a line to the digest section of the Inbox notification.
1412b41a213761ff07de2fcfdaf16790fdcca1a1ee1bChris Wren         */
1413f021758934b35e3b842c6799344531d7ea2969daChris Wren        public InboxStyle addLine(CharSequence cs) {
1414f021758934b35e3b842c6799344531d7ea2969daChris Wren            mTexts.add(cs);
1415f021758934b35e3b842c6799344531d7ea2969daChris Wren            return this;
1416f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
1417f021758934b35e3b842c6799344531d7ea2969daChris Wren    }
1418f021758934b35e3b842c6799344531d7ea2969daChris Wren
1419300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen    /**
1420300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen     * Structure to encapsulate a named action that can be shown as part of this notification.
1421300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen     * It must include an icon, a label, and a {@link PendingIntent} to be fired when the action is
1422300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen     * selected by the user. Action buttons won't appear on platforms prior to Android 4.1.
1423300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen     * <p>
1424300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen     * Apps should use {@link NotificationCompat.Builder#addAction(int, CharSequence, PendingIntent)}
1425300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen     * or {@link NotificationCompat.Builder#addAction(NotificationCompat.Action)}
1426300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen     * to attach actions.
1427300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen     */
1428ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    public static class Action extends NotificationCompatBase.Action {
1429300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        private final Bundle mExtras;
14302bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private final RemoteInput[] mRemoteInputs;
1431300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
1432300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        /**
1433300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen         * Small icon representing the action.
1434300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen         */
1435f021758934b35e3b842c6799344531d7ea2969daChris Wren        public int icon;
1436300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        /**
1437300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen         * Title of the action.
1438300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen         */
1439f021758934b35e3b842c6799344531d7ea2969daChris Wren        public CharSequence title;
1440300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        /**
1441300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen         * Intent to send when the user invokes this action. May be null, in which case the action
1442300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen         * may be rendered in a disabled presentation.
1443300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen         */
1444f021758934b35e3b842c6799344531d7ea2969daChris Wren        public PendingIntent actionIntent;
1445f021758934b35e3b842c6799344531d7ea2969daChris Wren
1446300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        public Action(int icon, CharSequence title, PendingIntent intent) {
1447ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            this(icon, title, intent, new Bundle(), null);
1448300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        }
1449300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
1450ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        private Action(int icon, CharSequence title, PendingIntent intent, Bundle extras,
1451ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                RemoteInput[] remoteInputs) {
1452300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            this.icon = icon;
1453300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            this.title = title;
1454300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            this.actionIntent = intent;
1455300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            this.mExtras = extras != null ? extras : new Bundle();
1456ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            this.mRemoteInputs = remoteInputs;
1457ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        }
1458ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
1459ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        @Override
1460ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        protected int getIcon() {
1461ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return icon;
1462ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        }
1463ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
1464ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        @Override
1465ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        protected CharSequence getTitle() {
1466ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return title;
1467ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        }
1468ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
1469ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        @Override
1470ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        protected PendingIntent getActionIntent() {
1471ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return actionIntent;
1472300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        }
1473300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
1474300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        /**
1475300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen         * Get additional metadata carried around with this Action.
1476300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen         */
1477300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        public Bundle getExtras() {
1478300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            return mExtras;
1479300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        }
1480300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
1481300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        /**
1482ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * Get the list of inputs to be collected from the user when this action is sent.
1483ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * May return null if no remote inputs were added.
1484ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         */
1485ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        public RemoteInput[] getRemoteInputs() {
1486ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return mRemoteInputs;
1487ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        }
1488ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
1489ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        /**
1490300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen         * Builder class for {@link Action} objects.
1491300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen         */
1492ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        public static final class Builder {
1493300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            private final int mIcon;
1494300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            private final CharSequence mTitle;
1495300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            private final PendingIntent mIntent;
1496300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            private final Bundle mExtras;
1497ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            private ArrayList<RemoteInput> mRemoteInputs;
1498300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
1499300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            /**
1500300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen             * Construct a new builder for {@link Action} object.
1501300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen             * @param icon icon to show for this action
1502300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen             * @param title the title of the action
1503300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen             * @param intent the {@link PendingIntent} to fire when users trigger this action
1504300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen             */
1505300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            public Builder(int icon, CharSequence title, PendingIntent intent) {
1506300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen                this(icon, title, intent, new Bundle());
1507300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            }
1508300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
1509300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            /**
1510300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen             * Construct a new builder for {@link Action} object using the fields from an
1511300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen             * {@link Action}.
1512300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen             * @param action the action to read fields from.
1513300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen             */
1514300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            public Builder(Action action) {
1515300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen                this(action.icon, action.title, action.actionIntent, new Bundle(action.mExtras));
1516300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            }
1517300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
1518300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            private Builder(int icon, CharSequence title, PendingIntent intent, Bundle extras) {
1519300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen                mIcon = icon;
1520300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen                mTitle = title;
1521300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen                mIntent = intent;
1522300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen                mExtras = extras;
1523300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            }
1524300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
1525300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            /**
1526300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen             * Merge additional metadata into this builder.
1527300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen             *
1528300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen             * <p>Values within the Bundle will replace existing extras values in this Builder.
1529300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen             *
1530300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen             * @see NotificationCompat.Action#getExtras
1531300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen             */
1532300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            public Builder addExtras(Bundle extras) {
1533300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen                if (extras != null) {
1534300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen                    mExtras.putAll(extras);
1535300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen                }
1536300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen                return this;
1537300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            }
1538300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
1539300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            /**
1540300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen             * Get the metadata Bundle used by this Builder.
1541300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen             *
1542300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen             * <p>The returned Bundle is shared with this Builder.
1543300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen             */
1544300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            public Bundle getExtras() {
1545300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen                return mExtras;
1546300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            }
1547300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
1548300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            /**
1549ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen             * Add an input to be collected from the user when this action is sent.
1550ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen             * Response values can be retrieved from the fired intent by using the
1551ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen             * {@link RemoteInput#getResultsFromIntent} function.
1552ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen             * @param remoteInput a {@link RemoteInput} to add to the action
1553ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen             * @return this object for method chaining
1554ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen             */
1555ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            public Builder addRemoteInput(RemoteInput remoteInput) {
1556ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                if (mRemoteInputs == null) {
1557ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                    mRemoteInputs = new ArrayList<RemoteInput>();
1558ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                }
1559ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                mRemoteInputs.add(remoteInput);
1560ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                return this;
1561ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            }
1562ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
1563ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            /**
1564ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen             * Apply an extender to this action builder. Extenders may be used to add
1565ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen             * metadata or change options on this builder.
1566ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen             */
15672bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            public Builder extend(Extender extender) {
15682bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                extender.extend(this);
1569ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                return this;
1570ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            }
1571ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
1572ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            /**
1573300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen             * Combine all of the options that have been set and return a new {@link Action}
1574300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen             * object.
1575300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen             * @return the built action
1576300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen             */
1577300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            public Action build() {
1578ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                RemoteInput[] remoteInputs = mRemoteInputs != null
1579ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                        ? mRemoteInputs.toArray(new RemoteInput[mRemoteInputs.size()]) : null;
1580ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                return new Action(mIcon, mTitle, mIntent, mExtras, remoteInputs);
1581300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            }
1582300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        }
1583300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
15842bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
15852bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
15862bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Extender interface for use with {@link Builder#extend}. Extenders may be used to add
15872bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * metadata or change options on an action builder.
15882bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
15892bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public interface Extender {
15902bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            /**
15912bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             * Apply this extender to a notification action builder.
15922bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             * @param builder the builder to be modified.
15932bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             * @return the build object for chaining.
15942bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             */
15952bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            public Builder extend(Builder builder);
15962bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
15972bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
15982bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
15992bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Wearable extender for notification actions. To add extensions to an action,
16002bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * create a new {@link NotificationCompat.Action.WearableExtender} object using
16012bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * the {@code WearableExtender()} constructor and apply it to a
16022bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * {@link NotificationCompat.Action.Builder} using
16032bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * {@link NotificationCompat.Action.Builder#extend}.
16042bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         *
16052bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * <pre class="prettyprint">
16062bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * NotificationCompat.Action action = new NotificationCompat.Action.Builder(
16072bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         *         R.drawable.archive_all, "Archive all", actionIntent)
160833176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         *         .extend(new NotificationCompat.Action.WearableExtender()
16092bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         *                 .setAvailableOffline(false))
161033176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         *         .build();</pre>
16112bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
16122bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public static final class WearableExtender implements Extender {
16132bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            /** Notification action extra which contains wearable extensions */
16142bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            private static final String EXTRA_WEARABLE_EXTENSIONS = "android.wearable.EXTENSIONS";
16152bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
16162bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            private static final String KEY_FLAGS = "flags";
16172bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
16182bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            // Flags bitwise-ored to mFlags
16192bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            private static final int FLAG_AVAILABLE_OFFLINE = 0x1;
16202bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
16212bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            // Default value for flags integer
16222bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            private static final int DEFAULT_FLAGS = FLAG_AVAILABLE_OFFLINE;
16232bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
16242bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            private int mFlags = DEFAULT_FLAGS;
16252bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
16262bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            /**
16272bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             * Create a {@link NotificationCompat.Action.WearableExtender} with default
16282bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             * options.
16292bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             */
16302bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            public WearableExtender() {
16312bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            }
16322bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
16332bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            /**
16342bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             * Create a {@link NotificationCompat.Action.WearableExtender} by reading
16352bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             * wearable options present in an existing notification action.
16362bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             * @param action the notification action to inspect.
16372bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             */
16382bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            public WearableExtender(Action action) {
16392bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                Bundle wearableBundle = action.getExtras().getBundle(EXTRA_WEARABLE_EXTENSIONS);
16402bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                if (wearableBundle != null) {
16412bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                    mFlags = wearableBundle.getInt(KEY_FLAGS, DEFAULT_FLAGS);
16422bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                }
16432bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            }
16442bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
16452bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            /**
16462bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             * Apply wearable extensions to a notification action that is being built. This is
16472bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             * typically called by the {@link NotificationCompat.Action.Builder#extend}
16482bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             * method of {@link NotificationCompat.Action.Builder}.
16492bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             */
16502bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            @Override
16512bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            public Action.Builder extend(Action.Builder builder) {
16522bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                Bundle wearableBundle = new Bundle();
16532bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
16542bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                if (mFlags != DEFAULT_FLAGS) {
16552bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                    wearableBundle.putInt(KEY_FLAGS, mFlags);
16562bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                }
16572bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
16582bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                builder.getExtras().putBundle(EXTRA_WEARABLE_EXTENSIONS, wearableBundle);
16592bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                return builder;
16602bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            }
16612bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
16622bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            @Override
16632bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            public WearableExtender clone() {
16642bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                WearableExtender that = new WearableExtender();
16652bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                that.mFlags = this.mFlags;
16662bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                return that;
16672bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            }
16682bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
16692bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            /**
16702bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             * Set whether this action is available when the wearable device is not connected to
16712bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             * a companion device. The user can still trigger this action when the wearable device
16722bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             * is offline, but a visual hint will indicate that the action may not be available.
16732bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             * Defaults to true.
16742bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             */
16752bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            public WearableExtender setAvailableOffline(boolean availableOffline) {
16762bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                setFlag(FLAG_AVAILABLE_OFFLINE, availableOffline);
16772bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                return this;
16782bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            }
16792bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
16802bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            /**
16812bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             * Get whether this action is available when the wearable device is not connected to
16822bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             * a companion device. The user can still trigger this action when the wearable device
16832bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             * is offline, but a visual hint will indicate that the action may not be available.
16842bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             * Defaults to true.
16852bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             */
16862bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            public boolean isAvailableOffline() {
16872bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                return (mFlags & FLAG_AVAILABLE_OFFLINE) != 0;
16882bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            }
16892bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
16902bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            private void setFlag(int mask, boolean value) {
16912bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                if (value) {
16922bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                    mFlags |= mask;
16932bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                } else {
16942bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                    mFlags &= ~mask;
16952bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                }
16962bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            }
16972bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
16982bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
1699ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        /** @hide */
1700ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        public static final Factory FACTORY = new Factory() {
1701ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            @Override
1702ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            public Action build(int icon, CharSequence title,
1703ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                    PendingIntent actionIntent, Bundle extras,
1704ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                    RemoteInputCompatBase.RemoteInput[] remoteInputs) {
1705ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                return new Action(icon, title, actionIntent, extras,
1706ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                        (RemoteInput[]) remoteInputs);
1707ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            }
1708300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
1709ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            @Override
1710ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            public Action[] newArray(int length) {
1711ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                return new Action[length];
1712ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            }
1713ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        };
1714c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell    }
1715b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen
17162bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
17172bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen    /**
17182bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     * Extender interface for use with {@link Builder#extend}. Extenders may be used to add
17192bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     * metadata or change options on a notification builder.
17202bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     */
17212bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen    public interface Extender {
17222bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
17232bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Apply this extender to a notification builder.
17242bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @param builder the builder to be modified.
17252bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @return the build object for chaining.
17262bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
17272bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public Builder extend(Builder builder);
17282bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen    }
17292bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
17302bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen    /**
17312bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     * Helper class to add wearable extensions to notifications.
17322bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     * <p class="note"> See
17332bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     * <a href="{@docRoot}wear/notifications/creating.html">Creating Notifications
17342bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     * for Android Wear</a> for more information on how to use this class.
17352bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     * <p>
17362bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     * To create a notification with wearable extensions:
17372bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     * <ol>
17382bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     *   <li>Create a {@link NotificationCompat.Builder}, setting any desired
17392bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     *   properties.
17402bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     *   <li>Create a {@link NotificationCompat.WearableExtender}.
17412bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     *   <li>Set wearable-specific properties using the
17422bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     *   {@code add} and {@code set} methods of {@link NotificationCompat.WearableExtender}.
17432bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     *   <li>Call {@link NotificationCompat.Builder#extend} to apply the extensions to a
17442bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     *   notification.
17452bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     *   <li>Post the notification to the notification
17462bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     *   system with the {@code NotificationManagerCompat.notify(...)} methods
17472bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     *   and not the {@code NotificationManager.notify(...)} methods.
17482bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     * </ol>
17492bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     *
17502bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     * <pre class="prettyprint">
17512bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     * Notification notif = new NotificationCompat.Builder(mContext)
17522bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     *         .setContentTitle(&quot;New mail from &quot; + sender.toString())
17532bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     *         .setContentText(subject)
17542bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     *         .setSmallIcon(R.drawable.new_mail)
17552bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     *         .extend(new NotificationCompat.WearableExtender()
17562bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     *                 .setContentIcon(R.drawable.new_mail))
17572bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     *         .build();
17582bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     * NotificationManagerCompat.from(mContext).notify(0, notif);</pre>
17592bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     *
17602bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     * <p>Wearable extensions can be accessed on an existing notification by using the
17612bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     * {@code WearableExtender(Notification)} constructor,
17622bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     * and then using the {@code get} methods to access values.
17632bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     *
17642bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     * <pre class="prettyprint">
17652bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     * NotificationCompat.WearableExtender wearableExtender =
17662bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     *         new NotificationCompat.WearableExtender(notification);
176733176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen     * List&lt;Notification&gt; pages = wearableExtender.getPages();</pre>
17682bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     */
17692bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen    public static final class WearableExtender implements Extender {
17702bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
17712bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Sentinel value for an action index that is unset.
17722bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
17732bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public static final int UNSET_ACTION_INDEX = -1;
17742bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
17752bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
17762bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Size value for use with {@link #setCustomSizePreset} to show this notification with
17772bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * default sizing.
17782bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * <p>For custom display notifications created using {@link #setDisplayIntent},
17792bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * the default is {@link #SIZE_LARGE}. All other notifications size automatically based
17802bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * on their content.
17812bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
17822bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public static final int SIZE_DEFAULT = 0;
17832bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
17842bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
17852bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Size value for use with {@link #setCustomSizePreset} to show this notification
17862bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * with an extra small size.
17872bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * <p>This value is only applicable for custom display notifications created using
17882bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * {@link #setDisplayIntent}.
17892bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
17902bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public static final int SIZE_XSMALL = 1;
17912bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
17922bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
17932bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Size value for use with {@link #setCustomSizePreset} to show this notification
17942bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * with a small size.
17952bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * <p>This value is only applicable for custom display notifications created using
17962bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * {@link #setDisplayIntent}.
17972bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
17982bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public static final int SIZE_SMALL = 2;
17992bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
18002bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
18012bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Size value for use with {@link #setCustomSizePreset} to show this notification
18022bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * with a medium size.
18032bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * <p>This value is only applicable for custom display notifications created using
18042bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * {@link #setDisplayIntent}.
18052bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
18062bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public static final int SIZE_MEDIUM = 3;
18072bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
18082bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
18092bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Size value for use with {@link #setCustomSizePreset} to show this notification
18102bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * with a large size.
18112bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * <p>This value is only applicable for custom display notifications created using
18122bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * {@link #setDisplayIntent}.
18132bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
18142bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public static final int SIZE_LARGE = 4;
18152bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
1816fd5d0d05e9b44fcb0a9dab91290d53b464fc0939Griff Hazen        /**
1817fd5d0d05e9b44fcb0a9dab91290d53b464fc0939Griff Hazen         * Size value for use with {@link #setCustomSizePreset} to show this notification
1818fd5d0d05e9b44fcb0a9dab91290d53b464fc0939Griff Hazen         * full screen.
1819fd5d0d05e9b44fcb0a9dab91290d53b464fc0939Griff Hazen         * <p>This value is only applicable for custom display notifications created using
1820fd5d0d05e9b44fcb0a9dab91290d53b464fc0939Griff Hazen         * {@link #setDisplayIntent}.
1821fd5d0d05e9b44fcb0a9dab91290d53b464fc0939Griff Hazen         */
1822fd5d0d05e9b44fcb0a9dab91290d53b464fc0939Griff Hazen        public static final int SIZE_FULL_SCREEN = 5;
1823fd5d0d05e9b44fcb0a9dab91290d53b464fc0939Griff Hazen
18242bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /** Notification extra which contains wearable extensions */
18252bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private static final String EXTRA_WEARABLE_EXTENSIONS = "android.wearable.EXTENSIONS";
18262bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
18272bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        // Keys within EXTRA_WEARABLE_OPTIONS for wearable options.
18282bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private static final String KEY_ACTIONS = "actions";
18292bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private static final String KEY_FLAGS = "flags";
18302bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private static final String KEY_DISPLAY_INTENT = "displayIntent";
18312bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private static final String KEY_PAGES = "pages";
18322bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private static final String KEY_BACKGROUND = "background";
18332bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private static final String KEY_CONTENT_ICON = "contentIcon";
18342bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private static final String KEY_CONTENT_ICON_GRAVITY = "contentIconGravity";
18352bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private static final String KEY_CONTENT_ACTION_INDEX = "contentActionIndex";
18362bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private static final String KEY_CUSTOM_SIZE_PRESET = "customSizePreset";
18372bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private static final String KEY_CUSTOM_CONTENT_HEIGHT = "customContentHeight";
18382bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private static final String KEY_GRAVITY = "gravity";
18392bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
18402bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        // Flags bitwise-ored to mFlags
18412bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private static final int FLAG_CONTENT_INTENT_AVAILABLE_OFFLINE = 0x1;
18422bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private static final int FLAG_HINT_HIDE_ICON = 1 << 1;
18432bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private static final int FLAG_HINT_SHOW_BACKGROUND_ONLY = 1 << 2;
18442bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private static final int FLAG_START_SCROLL_BOTTOM = 1 << 3;
18452bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
18462bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        // Default value for flags integer
18472bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private static final int DEFAULT_FLAGS = FLAG_CONTENT_INTENT_AVAILABLE_OFFLINE;
18482bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
18492bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private static final int DEFAULT_CONTENT_ICON_GRAVITY = GravityCompat.END;
18502bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private static final int DEFAULT_GRAVITY = Gravity.BOTTOM;
18512bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
18522bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private ArrayList<Action> mActions = new ArrayList<Action>();
18532bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private int mFlags = DEFAULT_FLAGS;
18542bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private PendingIntent mDisplayIntent;
18552bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private ArrayList<Notification> mPages = new ArrayList<Notification>();
18562bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private Bitmap mBackground;
18572bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private int mContentIcon;
18582bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private int mContentIconGravity = DEFAULT_CONTENT_ICON_GRAVITY;
18592bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private int mContentActionIndex = UNSET_ACTION_INDEX;
18602bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private int mCustomSizePreset = SIZE_DEFAULT;
18612bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private int mCustomContentHeight;
18622bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private int mGravity = DEFAULT_GRAVITY;
18632bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
18642bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
18652bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Create a {@link NotificationCompat.WearableExtender} with default
18662bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * options.
18672bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
18682bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public WearableExtender() {
18692bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
18702bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
18712bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public WearableExtender(Notification notif) {
18722bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            Bundle extras = getExtras(notif);
18732bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            Bundle wearableBundle = extras != null ? extras.getBundle(EXTRA_WEARABLE_EXTENSIONS)
18742bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                    : null;
18752bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            if (wearableBundle != null) {
18762bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                Action[] actions = IMPL.getActionsFromParcelableArrayList(
18772bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                        wearableBundle.getParcelableArrayList(KEY_ACTIONS));
18782bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                if (actions != null) {
18792bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                    Collections.addAll(mActions, actions);
18802bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                }
18812bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
18822bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                mFlags = wearableBundle.getInt(KEY_FLAGS, DEFAULT_FLAGS);
18832bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                mDisplayIntent = wearableBundle.getParcelable(KEY_DISPLAY_INTENT);
18842bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
18852bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                Notification[] pages = getNotificationArrayFromBundle(
18862bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                        wearableBundle, KEY_PAGES);
18872bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                if (pages != null) {
18882bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                    Collections.addAll(mPages, pages);
18892bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                }
18902bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
18912bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                mBackground = wearableBundle.getParcelable(KEY_BACKGROUND);
18922bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                mContentIcon = wearableBundle.getInt(KEY_CONTENT_ICON);
18932bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                mContentIconGravity = wearableBundle.getInt(KEY_CONTENT_ICON_GRAVITY,
18942bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                        DEFAULT_CONTENT_ICON_GRAVITY);
18952bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                mContentActionIndex = wearableBundle.getInt(KEY_CONTENT_ACTION_INDEX,
18962bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                        UNSET_ACTION_INDEX);
18972bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                mCustomSizePreset = wearableBundle.getInt(KEY_CUSTOM_SIZE_PRESET,
18982bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                        SIZE_DEFAULT);
18992bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                mCustomContentHeight = wearableBundle.getInt(KEY_CUSTOM_CONTENT_HEIGHT);
19002bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                mGravity = wearableBundle.getInt(KEY_GRAVITY, DEFAULT_GRAVITY);
19012bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            }
19022bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
19032bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
19042bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
19052bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Apply wearable extensions to a notification that is being built. This is typically
19062bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * called by the {@link NotificationCompat.Builder#extend} method of
19072bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * {@link NotificationCompat.Builder}.
19082bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
19092bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        @Override
19102bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public NotificationCompat.Builder extend(NotificationCompat.Builder builder) {
19112bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            Bundle wearableBundle = new Bundle();
19122bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
19132bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            if (!mActions.isEmpty()) {
19142bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                wearableBundle.putParcelableArrayList(KEY_ACTIONS,
19152bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                        IMPL.getParcelableArrayListForActions(mActions.toArray(
19162bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                                new Action[mActions.size()])));
19172bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            }
19182bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            if (mFlags != DEFAULT_FLAGS) {
19192bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                wearableBundle.putInt(KEY_FLAGS, mFlags);
19202bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            }
19212bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            if (mDisplayIntent != null) {
19222bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                wearableBundle.putParcelable(KEY_DISPLAY_INTENT, mDisplayIntent);
19232bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            }
19242bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            if (!mPages.isEmpty()) {
19252bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                wearableBundle.putParcelableArray(KEY_PAGES, mPages.toArray(
19262bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                        new Notification[mPages.size()]));
19272bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            }
19282bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            if (mBackground != null) {
19292bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                wearableBundle.putParcelable(KEY_BACKGROUND, mBackground);
19302bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            }
19312bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            if (mContentIcon != 0) {
19322bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                wearableBundle.putInt(KEY_CONTENT_ICON, mContentIcon);
19332bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            }
19342bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            if (mContentIconGravity != DEFAULT_CONTENT_ICON_GRAVITY) {
19352bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                wearableBundle.putInt(KEY_CONTENT_ICON_GRAVITY, mContentIconGravity);
19362bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            }
19372bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            if (mContentActionIndex != UNSET_ACTION_INDEX) {
19382bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                wearableBundle.putInt(KEY_CONTENT_ACTION_INDEX,
19392bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                        mContentActionIndex);
19402bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            }
19412bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            if (mCustomSizePreset != SIZE_DEFAULT) {
19422bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                wearableBundle.putInt(KEY_CUSTOM_SIZE_PRESET, mCustomSizePreset);
19432bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            }
19442bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            if (mCustomContentHeight != 0) {
19452bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                wearableBundle.putInt(KEY_CUSTOM_CONTENT_HEIGHT, mCustomContentHeight);
19462bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            }
19472bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            if (mGravity != DEFAULT_GRAVITY) {
19482bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                wearableBundle.putInt(KEY_GRAVITY, mGravity);
19492bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            }
19502bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
19512bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            builder.getExtras().putBundle(EXTRA_WEARABLE_EXTENSIONS, wearableBundle);
19522bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return builder;
19532bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
19542bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
19552bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        @Override
19562bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public WearableExtender clone() {
19572bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            WearableExtender that = new WearableExtender();
19582bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            that.mActions = new ArrayList<Action>(this.mActions);
19592bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            that.mFlags = this.mFlags;
19602bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            that.mDisplayIntent = this.mDisplayIntent;
19612bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            that.mPages = new ArrayList<Notification>(this.mPages);
19622bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            that.mBackground = this.mBackground;
19632bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            that.mContentIcon = this.mContentIcon;
19642bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            that.mContentIconGravity = this.mContentIconGravity;
19652bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            that.mContentActionIndex = this.mContentActionIndex;
19662bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            that.mCustomSizePreset = this.mCustomSizePreset;
19672bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            that.mCustomContentHeight = this.mCustomContentHeight;
19682bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            that.mGravity = this.mGravity;
19692bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return that;
19702bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
19712bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
19722bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
19732bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Add a wearable action to this notification.
19742bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         *
19752bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * <p>When wearable actions are added using this method, the set of actions that
19762bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * show on a wearable device splits from devices that only show actions added
19772bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * using {@link NotificationCompat.Builder#addAction}. This allows for customization
19782bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * of which actions display on different devices.
19792bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         *
19802bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @param action the action to add to this notification
19812bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @return this object for method chaining
19822bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @see NotificationCompat.Action
19832bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
19842bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public WearableExtender addAction(Action action) {
19852bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            mActions.add(action);
19862bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return this;
19872bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
19882bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
19892bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
19902bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Adds wearable actions to this notification.
19912bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         *
19922bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * <p>When wearable actions are added using this method, the set of actions that
19932bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * show on a wearable device splits from devices that only show actions added
19942bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * using {@link NotificationCompat.Builder#addAction}. This allows for customization
19952bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * of which actions display on different devices.
19962bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         *
19972bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @param actions the actions to add to this notification
19982bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @return this object for method chaining
19992bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @see NotificationCompat.Action
20002bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
20012bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public WearableExtender addActions(List<Action> actions) {
20022bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            mActions.addAll(actions);
20032bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return this;
20042bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
20052bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
20062bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
20072bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Clear all wearable actions present on this builder.
20082bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @return this object for method chaining.
20092bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @see #addAction
20102bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
20112bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public WearableExtender clearActions() {
20122bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            mActions.clear();
20132bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return this;
20142bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
20152bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
20162bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
20172bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Get the wearable actions present on this notification.
20182bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
20192bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public List<Action> getActions() {
20202bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return mActions;
20212bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
20222bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
20232bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
20242bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Set an intent to launch inside of an activity view when displaying
202533176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * this notification. The {@link PendingIntent} provided should be for an activity.
202633176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         *
202733176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * <pre class="prettyprint">
202833176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * Intent displayIntent = new Intent(context, MyDisplayActivity.class);
202933176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * PendingIntent displayPendingIntent = PendingIntent.getActivity(context,
203033176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         *         0, displayIntent, PendingIntent.FLAG_UPDATE_CURRENT);
203133176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * Notification notif = new NotificationCompat.Builder(context)
203233176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         *         .extend(new NotificationCompat.WearableExtender()
203333176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         *                 .setDisplayIntent(displayPendingIntent)
203433176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         *                 .setCustomSizePreset(NotificationCompat.WearableExtender.SIZE_MEDIUM))
203533176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         *         .build();</pre>
203633176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         *
203733176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * <p>The activity to launch needs to allow embedding, must be exported, and
203833176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * should have an empty task affinity.
203933176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         *
204033176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * <p>Example AndroidManifest.xml entry:
204133176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * <pre class="prettyprint">
204233176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * &lt;activity android:name=&quot;com.example.MyDisplayActivity&quot;
204333176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         *     android:exported=&quot;true&quot;
204433176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         *     android:allowEmbedded=&quot;true&quot;
204533176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         *     android:taskAffinity=&quot;&quot; /&gt;</pre>
20462bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         *
20472bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @param intent the {@link PendingIntent} for an activity
20482bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @return this object for method chaining
20492bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @see NotificationCompat.WearableExtender#getDisplayIntent
20502bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
20512bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public WearableExtender setDisplayIntent(PendingIntent intent) {
20522bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            mDisplayIntent = intent;
20532bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return this;
20542bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
20552bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
20562bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
20572bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Get the intent to launch inside of an activity view when displaying this
20582bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * notification. This {@code PendingIntent} should be for an activity.
20592bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
20602bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public PendingIntent getDisplayIntent() {
20612bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return mDisplayIntent;
20622bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
20632bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
20642bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
20652bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Add an additional page of content to display with this notification. The current
20662bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * notification forms the first page, and pages added using this function form
20672bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * subsequent pages. This field can be used to separate a notification into multiple
20682bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * sections.
20692bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         *
20702bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @param page the notification to add as another page
20712bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @return this object for method chaining
20722bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @see NotificationCompat.WearableExtender#getPages
20732bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
20742bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public WearableExtender addPage(Notification page) {
20752bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            mPages.add(page);
20762bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return this;
20772bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
20782bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
20792bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
20802bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Add additional pages of content to display with this notification. The current
20812bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * notification forms the first page, and pages added using this function form
20822bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * subsequent pages. This field can be used to separate a notification into multiple
20832bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * sections.
20842bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         *
20852bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @param pages a list of notifications
20862bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @return this object for method chaining
20872bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @see NotificationCompat.WearableExtender#getPages
20882bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
20892bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public WearableExtender addPages(List<Notification> pages) {
20902bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            mPages.addAll(pages);
20912bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return this;
20922bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
20932bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
20942bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
20952bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Clear all additional pages present on this builder.
20962bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @return this object for method chaining.
20972bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @see #addPage
20982bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
20992bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public WearableExtender clearPages() {
21002bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            mPages.clear();
21012bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return this;
21022bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
21032bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
21042bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
21052bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Get the array of additional pages of content for displaying this notification. The
21062bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * current notification forms the first page, and elements within this array form
21072bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * subsequent pages. This field can be used to separate a notification into multiple
21082bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * sections.
21092bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @return the pages for this notification
21102bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
21112bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public List<Notification> getPages() {
21122bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return mPages;
21132bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
21142bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
21152bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
21162bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Set a background image to be displayed behind the notification content.
21172bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Contrary to the {@link NotificationCompat.BigPictureStyle}, this background
21182bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * will work with any notification style.
21192bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         *
21202bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @param background the background bitmap
21212bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @return this object for method chaining
21222bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @see NotificationCompat.WearableExtender#getBackground
21232bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
21242bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public WearableExtender setBackground(Bitmap background) {
21252bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            mBackground = background;
21262bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return this;
21272bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
21282bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
21292bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
21302bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Get a background image to be displayed behind the notification content.
21312bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Contrary to the {@link NotificationCompat.BigPictureStyle}, this background
21322bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * will work with any notification style.
21332bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         *
21342bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @return the background image
21352bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @see NotificationCompat.WearableExtender#setBackground
21362bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
21372bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public Bitmap getBackground() {
21382bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return mBackground;
21392bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
21402bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
21412bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
21422bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Set an icon that goes with the content of this notification.
21432bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
21442bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public WearableExtender setContentIcon(int icon) {
21452bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            mContentIcon = icon;
21462bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return this;
21472bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
21482bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
21492bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
21502bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Get an icon that goes with the content of this notification.
21512bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
21522bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public int getContentIcon() {
21532bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return mContentIcon;
21542bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
21552bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
21562bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
21572bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Set the gravity that the content icon should have within the notification display.
21582bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Supported values include {@link android.view.Gravity#START} and
21592bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * {@link android.view.Gravity#END}. The default value is {@link android.view.Gravity#END}.
21602bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @see #setContentIcon
21612bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
21622bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public WearableExtender setContentIconGravity(int contentIconGravity) {
21632bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            mContentIconGravity = contentIconGravity;
21642bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return this;
21652bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
21662bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
21672bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
21682bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Get the gravity that the content icon should have within the notification display.
21692bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Supported values include {@link android.view.Gravity#START} and
21702bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * {@link android.view.Gravity#END}. The default value is {@link android.view.Gravity#END}.
21712bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @see #getContentIcon
21722bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
21732bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public int getContentIconGravity() {
21742bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return mContentIconGravity;
21752bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
21762bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
21772bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
21782bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Set an action from this notification's actions to be clickable with the content of
217933176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * this notification. This action will no longer display separately from the
218033176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * notification's content.
218133176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         *
218233176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * <p>For notifications with multiple pages, child pages can also have content actions
218333176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * set, although the list of available actions comes from the main notification and not
218433176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * from the child page's notification.
218533176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         *
218633176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * @param actionIndex The index of the action to hoist onto the current notification page.
218733176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         *                    If wearable actions were added to the main notification, this index
218833176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         *                    will apply to that list, otherwise it will apply to the regular
218933176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         *                    actions list.
21902bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
21912bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public WearableExtender setContentAction(int actionIndex) {
21922bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            mContentActionIndex = actionIndex;
21932bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return this;
21942bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
21952bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
21962bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
219733176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * Get the index of the notification action, if any, that was specified as being clickable
219833176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * with the content of this notification. This action will no longer display separately
219933176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * from the notification's content.
220033176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         *
220133176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * <p>For notifications with multiple pages, child pages can also have content actions
220233176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * set, although the list of available actions comes from the main notification and not
220333176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * from the child page's notification.
220433176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         *
220533176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * <p>If wearable specific actions were added to the main notification, this index will
220633176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * apply to that list, otherwise it will apply to the regular actions list.
22072bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         *
220833176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * @return the action index or {@link #UNSET_ACTION_INDEX} if no action was selected.
22092bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
22102bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public int getContentAction() {
22112bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return mContentActionIndex;
22122bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
22132bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
22142bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
22152bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Set the gravity that this notification should have within the available viewport space.
22162bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Supported values include {@link android.view.Gravity#TOP},
22172bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * {@link android.view.Gravity#CENTER_VERTICAL} and {@link android.view.Gravity#BOTTOM}.
22182bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * The default value is {@link android.view.Gravity#BOTTOM}.
22192bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
22202bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public WearableExtender setGravity(int gravity) {
22212bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            mGravity = gravity;
22222bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return this;
22232bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
22242bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
22252bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
22262bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Get the gravity that this notification should have within the available viewport space.
22272bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Supported values include {@link android.view.Gravity#TOP},
22282bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * {@link android.view.Gravity#CENTER_VERTICAL} and {@link android.view.Gravity#BOTTOM}.
22292bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * The default value is {@link android.view.Gravity#BOTTOM}.
22302bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
22312bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public int getGravity() {
22322bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return mGravity;
22332bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
22342bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
22352bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
22362bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Set the custom size preset for the display of this notification out of the available
22372bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * presets found in {@link NotificationCompat.WearableExtender}, e.g.
22382bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * {@link #SIZE_LARGE}.
22392bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * <p>Some custom size presets are only applicable for custom display notifications created
22402bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * using {@link NotificationCompat.WearableExtender#setDisplayIntent}. Check the
22412bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * documentation for the preset in question. See also
22422bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * {@link #setCustomContentHeight} and {@link #getCustomSizePreset}.
22432bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
22442bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public WearableExtender setCustomSizePreset(int sizePreset) {
22452bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            mCustomSizePreset = sizePreset;
22462bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return this;
22472bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
22482bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
22492bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
22502bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Get the custom size preset for the display of this notification out of the available
22512bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * presets found in {@link NotificationCompat.WearableExtender}, e.g.
22522bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * {@link #SIZE_LARGE}.
22532bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * <p>Some custom size presets are only applicable for custom display notifications created
22542bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * using {@link #setDisplayIntent}. Check the documentation for the preset in question.
22552bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * See also {@link #setCustomContentHeight} and {@link #setCustomSizePreset}.
22562bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
22572bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public int getCustomSizePreset() {
22582bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return mCustomSizePreset;
22592bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
22602bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
22612bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
22622bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Set the custom height in pixels for the display of this notification's content.
22632bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * <p>This option is only available for custom display notifications created
22642bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * using {@link NotificationCompat.WearableExtender#setDisplayIntent}. See also
22652bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * {@link NotificationCompat.WearableExtender#setCustomSizePreset} and
22662bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * {@link #getCustomContentHeight}.
22672bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
22682bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public WearableExtender setCustomContentHeight(int height) {
22692bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            mCustomContentHeight = height;
22702bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return this;
22712bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
22722bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
22732bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
22742bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Get the custom height in pixels for the display of this notification's content.
22752bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * <p>This option is only available for custom display notifications created
22762bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * using {@link #setDisplayIntent}. See also {@link #setCustomSizePreset} and
22772bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * {@link #setCustomContentHeight}.
22782bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
22792bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public int getCustomContentHeight() {
22802bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return mCustomContentHeight;
22812bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
22822bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
22832bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
22842bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Set whether the scrolling position for the contents of this notification should start
22852bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * at the bottom of the contents instead of the top when the contents are too long to
22862bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * display within the screen.  Default is false (start scroll at the top).
22872bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
22882bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public WearableExtender setStartScrollBottom(boolean startScrollBottom) {
22892bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            setFlag(FLAG_START_SCROLL_BOTTOM, startScrollBottom);
22902bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return this;
22912bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
22922bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
22932bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
22942bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Get whether the scrolling position for the contents of this notification should start
22952bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * at the bottom of the contents instead of the top when the contents are too long to
22962bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * display within the screen. Default is false (start scroll at the top).
22972bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
22982bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public boolean getStartScrollBottom() {
22992bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return (mFlags & FLAG_START_SCROLL_BOTTOM) != 0;
23002bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
23012bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
23022bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
23032bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Set whether the content intent is available when the wearable device is not connected
23042bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * to a companion device.  The user can still trigger this intent when the wearable device
23052bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * is offline, but a visual hint will indicate that the content intent may not be available.
23062bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Defaults to true.
23072bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
23082bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public WearableExtender setContentIntentAvailableOffline(
23092bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                boolean contentIntentAvailableOffline) {
23102bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            setFlag(FLAG_CONTENT_INTENT_AVAILABLE_OFFLINE, contentIntentAvailableOffline);
23112bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return this;
23122bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
23132bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
23142bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
23152bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Get whether the content intent is available when the wearable device is not connected
23162bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * to a companion device.  The user can still trigger this intent when the wearable device
23172bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * is offline, but a visual hint will indicate that the content intent may not be available.
23182bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Defaults to true.
23192bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
23202bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public boolean getContentIntentAvailableOffline() {
23212bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return (mFlags & FLAG_CONTENT_INTENT_AVAILABLE_OFFLINE) != 0;
23222bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
23232bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
23242bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
23252bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Set a hint that this notification's icon should not be displayed.
23262bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @param hintHideIcon {@code true} to hide the icon, {@code false} otherwise.
23272bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @return this object for method chaining
23282bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
23292bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public WearableExtender setHintHideIcon(boolean hintHideIcon) {
23302bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            setFlag(FLAG_HINT_HIDE_ICON, hintHideIcon);
23312bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return this;
23322bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
23332bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
23342bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
23352bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Get a hint that this notification's icon should not be displayed.
23362bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @return {@code true} if this icon should not be displayed, false otherwise.
23372bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * The default value is {@code false} if this was never set.
23382bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
23392bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public boolean getHintHideIcon() {
23402bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return (mFlags & FLAG_HINT_HIDE_ICON) != 0;
23412bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
23422bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
23432bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
23442bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Set a visual hint that only the background image of this notification should be
23452bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * displayed, and other semantic content should be hidden. This hint is only applicable
23462bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * to sub-pages added using {@link #addPage}.
23472bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
23482bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public WearableExtender setHintShowBackgroundOnly(boolean hintShowBackgroundOnly) {
23492bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            setFlag(FLAG_HINT_SHOW_BACKGROUND_ONLY, hintShowBackgroundOnly);
23502bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return this;
23512bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
23522bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
23532bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
23542bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Get a visual hint that only the background image of this notification should be
23552bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * displayed, and other semantic content should be hidden. This hint is only applicable
23562bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * to sub-pages added using {@link NotificationCompat.WearableExtender#addPage}.
23572bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
23582bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public boolean getHintShowBackgroundOnly() {
23592bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return (mFlags & FLAG_HINT_SHOW_BACKGROUND_ONLY) != 0;
23602bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
23612bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
23622bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private void setFlag(int mask, boolean value) {
23632bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            if (value) {
23642bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                mFlags |= mask;
23652bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            } else {
23662bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                mFlags &= ~mask;
23672bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            }
23682bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
23692bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen    }
23702bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
23712bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen    /**
23722bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     * Get an array of Notification objects from a parcelable array bundle field.
23732bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     * Update the bundle to have a typed array so fetches in the future don't need
23742bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     * to do an array copy.
23752bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     */
23762bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen    private static Notification[] getNotificationArrayFromBundle(Bundle bundle, String key) {
23772bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        Parcelable[] array = bundle.getParcelableArray(key);
23782bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        if (array instanceof Notification[] || array == null) {
23792bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return (Notification[]) array;
23802bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
23812bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        Notification[] typedArray = new Notification[array.length];
23822bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        for (int i = 0; i < array.length; i++) {
23832bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            typedArray[i] = (Notification) array[i];
23842bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
23852bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        bundle.putParcelableArray(key, typedArray);
23862bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        return typedArray;
23872bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen    }
23882bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
2389b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen    /**
2390b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen     * Gets the {@link Notification#extras} field from a notification in a backwards
2391b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen     * compatible manner. Extras field was supported from JellyBean (Api level 16)
2392b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen     * forwards. This function will return null on older api levels.
2393b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen     */
2394b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen    public static Bundle getExtras(Notification notif) {
2395b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        return IMPL.getExtras(notif);
2396b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen    }
2397b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen
2398b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen    /**
2399300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen     * Get the number of actions in this notification in a backwards compatible
2400300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen     * manner. Actions were supported from JellyBean (Api level 16) forwards.
2401300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen     */
2402300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen    public static int getActionCount(Notification notif) {
2403300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        return IMPL.getActionCount(notif);
2404300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen    }
2405300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
2406300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen    /**
2407300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen     * Get an action on this notification in a backwards compatible
2408300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen     * manner. Actions were supported from JellyBean (Api level 16) forwards.
2409300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen     * @param notif The notification to inspect.
2410300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen     * @param actionIndex The index of the action to retrieve.
2411300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen     */
2412300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen    public static Action getAction(Notification notif, int actionIndex) {
2413300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        return IMPL.getAction(notif, actionIndex);
2414300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen    }
2415300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
2416300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen    /**
2417b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen     * Get whether or not this notification is only relevant to the current device.
2418b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen     *
2419b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen     * <p>Some notifications can be bridged to other devices for remote display.
2420b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen     * If this hint is set, it is recommend that this notification not be bridged.
2421b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen     */
2422b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen    public static boolean getLocalOnly(Notification notif) {
2423b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        return IMPL.getLocalOnly(notif);
2424b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen    }
2425ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
2426ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    /**
2427ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     * Get the key used to group this notification into a cluster or stack
2428ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     * with other notifications on devices which support such rendering.
2429ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     */
2430ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    public static String getGroup(Notification notif) {
2431ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        return IMPL.getGroup(notif);
2432ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    }
2433ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
2434ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    /**
2435ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     * Get whether this notification to be the group summary for a group of notifications.
2436ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     * Grouped notifications may display in a cluster or stack on devices which
2437ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     * support such rendering. Requires a group key also be set using {@link Builder#setGroup}.
2438ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     * @return Whether this notification is a group summary.
2439ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     */
2440ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    public static boolean isGroupSummary(Notification notif) {
2441ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        return IMPL.isGroupSummary(notif);
2442ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    }
2443ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
2444ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    /**
2445ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     * Get a sort key that orders this notification among other notifications from the
2446ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     * same package. This can be useful if an external sort was already applied and an app
2447ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     * would like to preserve this. Notifications will be sorted lexicographically using this
2448ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     * value, although providing different priorities in addition to providing sort key may
2449ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     * cause this value to be ignored.
2450ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     *
2451ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     * <p>This sort key can also be used to order members of a notification group. See
2452ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     * {@link Builder#setGroup}.
2453ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     *
2454ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     * @see String#compareTo(String)
2455ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     */
2456ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    public static String getSortKey(Notification notif) {
2457ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        return IMPL.getSortKey(notif);
2458ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    }
2459c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell}
2460