1c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell/*
2c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * Copyright (C) 2012 The Android Open Source Project
3c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell *
4c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * Licensed under the Apache License, Version 2.0 (the "License");
5c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * you may not use this file except in compliance with the License.
6c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * You may obtain a copy of the License at
7c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell *
8c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell *      http://www.apache.org/licenses/LICENSE-2.0
9c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell *
10c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * Unless required by applicable law or agreed to in writing, software
11c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * distributed under the License is distributed on an "AS IS" BASIS,
12c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * See the License for the specific language governing permissions and
14c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * limitations under the License.
15c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell */
16c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
17c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powellpackage android.support.v4.app;
18c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
19e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hillsimport android.app.Activity;
20c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powellimport android.app.Notification;
21c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powellimport android.app.PendingIntent;
22c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powellimport android.content.Context;
23c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powellimport android.graphics.Bitmap;
2469a58d36f6ed8ec4d076534556aba2f93d00254eDan Sandlerimport android.graphics.Color;
25c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powellimport android.media.AudioManager;
26c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powellimport android.net.Uri;
27c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powellimport android.os.Build;
28b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazenimport android.os.Bundle;
292bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazenimport android.os.Parcelable;
3070acb0c19be3831a2080e4f902324de16bfbf62eTor Norbyeimport android.support.annotation.ColorInt;
315c45c3ad1a128403b8ec12c3f29b9e5f17764821Alex Hillsimport android.support.annotation.NonNull;
32c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viveretteimport android.support.annotation.RestrictTo;
33c485ebd398348372709b10a713fc6d8630b31923Alex Hillsimport android.support.v4.os.BuildCompat;
342bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazenimport android.support.v4.view.GravityCompat;
352bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazenimport android.view.Gravity;
36c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powellimport android.widget.RemoteViews;
37300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
38f021758934b35e3b842c6799344531d7ea2969daChris Wrenimport java.util.ArrayList;
392bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazenimport java.util.Collections;
402bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazenimport java.util.List;
41c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
42c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viveretteimport static android.support.annotation.RestrictTo.Scope.GROUP_ID;
43c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viverette
44080df8ffb0920eccb300baa39180eb956a000a53Chris Wren/**
45080df8ffb0920eccb300baa39180eb956a000a53Chris Wren * Helper for accessing features in {@link android.app.Notification}
46080df8ffb0920eccb300baa39180eb956a000a53Chris Wren * introduced after API level 4 in a backwards compatible fashion.
47080df8ffb0920eccb300baa39180eb956a000a53Chris Wren */
48c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powellpublic class NotificationCompat {
49c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
50c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
51c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Use all default values (where applicable).
52c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
53c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final int DEFAULT_ALL = ~0;
54c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
55c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
56c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Use the default notification sound. This will ignore any sound set using
57c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * {@link Builder#setSound}
58c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     *
59e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren     * <p>
60e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren     * A notification that is noisy is more likely to be presented as a heads-up notification,
61e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren     * on some platforms.
62e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren     * </p>
63e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren     *
64c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * @see Builder#setDefaults
65c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
66c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final int DEFAULT_SOUND = 1;
67c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
68c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
69c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Use the default notification vibrate. This will ignore any vibrate set using
70c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * {@link Builder#setVibrate}. Using phone vibration requires the
71c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * {@link android.Manifest.permission#VIBRATE VIBRATE} permission.
72c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     *
73e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren     * <p>
74e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren     * A notification that vibrates is more likely to be presented as a heads-up notification,
75e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren     * on some platforms.
76e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren     * </p>
77e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren     *
78c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * @see Builder#setDefaults
79c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
80c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final int DEFAULT_VIBRATE = 2;
81c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
82c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
83c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Use the default notification lights. This will ignore the
84c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * {@link #FLAG_SHOW_LIGHTS} bit, and values set with {@link Builder#setLights}.
85c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     *
86c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * @see Builder#setDefaults
87c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
88c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final int DEFAULT_LIGHTS = 4;
89c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
90c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
91c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Use this constant as the value for audioStreamType to request that
92c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * the default stream type for notifications be used.  Currently the
93c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * default stream type is {@link AudioManager#STREAM_NOTIFICATION}.
94c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
95c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final int STREAM_DEFAULT = -1;
96c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
97c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
98c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Bit set in the Notification flags field when LEDs should be turned on
99c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * for this notification.
100c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
101c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final int FLAG_SHOW_LIGHTS        = 0x00000001;
102c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
103c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
104c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Bit set in the Notification flags field if this notification is in
105c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * reference to something that is ongoing, like a phone call.  It should
106c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * not be set if this notification is in reference to something that
107c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * happened at a particular point in time, like a missed phone call.
108c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
109c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final int FLAG_ONGOING_EVENT      = 0x00000002;
110c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
111c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
112c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Bit set in the Notification flags field if
113c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * the audio will be repeated until the notification is
114c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * cancelled or the notification window is opened.
115c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
116c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final int FLAG_INSISTENT          = 0x00000004;
117c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
118c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
119c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Bit set in the Notification flags field if the notification's sound,
120c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * vibrate and ticker should only be played if the notification is not already showing.
121c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
122c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final int FLAG_ONLY_ALERT_ONCE    = 0x00000008;
123c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
124c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
125c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Bit set in the Notification flags field if the notification should be canceled when
126c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * it is clicked by the user.
127c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
128c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final int FLAG_AUTO_CANCEL        = 0x00000010;
129c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
130c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
131c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Bit set in the Notification flags field if the notification should not be canceled
132c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * when the user clicks the Clear all button.
133c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
134c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final int FLAG_NO_CLEAR           = 0x00000020;
135c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
136c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
137c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Bit set in the Notification flags field if this notification represents a currently
138c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * running service.  This will normally be set for you by
139c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * {@link android.app.Service#startForeground}.
140c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
141c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final int FLAG_FOREGROUND_SERVICE = 0x00000040;
142c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
143c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell    /**
144f021758934b35e3b842c6799344531d7ea2969daChris Wren     * Obsolete flag indicating high-priority notifications; use the priority field instead.
145884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     *
146f021758934b35e3b842c6799344531d7ea2969daChris Wren     * @deprecated Use {@link NotificationCompat.Builder#setPriority(int)} with a positive value.
147c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell     */
148d805095048f6be52cddbd572ee343c4639ba8187Alan Viverette    @Deprecated
149ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    public static final int FLAG_HIGH_PRIORITY      = 0x00000080;
150ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
151ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    /**
152ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     * Bit set in the Notification flags field if this notification is relevant to the current
153ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     * device only and it is not recommended that it bridge to other devices.
154ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     */
155ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    public static final int FLAG_LOCAL_ONLY         = 0x00000100;
156ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
157ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    /**
158ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     * Bit set in the Notification flags field if this notification is the group summary for a
159ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     * group of notifications. Grouped notifications may display in a cluster or stack on devices
160ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     * which support such rendering. Requires a group key also be set using
161ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     * {@link Builder#setGroup}.
162ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     */
163ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    public static final int FLAG_GROUP_SUMMARY      = 0x00000200;
164c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
165f021758934b35e3b842c6799344531d7ea2969daChris Wren    /**
166f021758934b35e3b842c6799344531d7ea2969daChris Wren     * Default notification priority for {@link NotificationCompat.Builder#setPriority(int)}.
167f021758934b35e3b842c6799344531d7ea2969daChris Wren     * If your application does not prioritize its own notifications,
168f021758934b35e3b842c6799344531d7ea2969daChris Wren     * use this value for all notifications.
169f021758934b35e3b842c6799344531d7ea2969daChris Wren     */
170f021758934b35e3b842c6799344531d7ea2969daChris Wren    public static final int PRIORITY_DEFAULT = 0;
171f021758934b35e3b842c6799344531d7ea2969daChris Wren
172f021758934b35e3b842c6799344531d7ea2969daChris Wren    /**
173f021758934b35e3b842c6799344531d7ea2969daChris Wren     * Lower notification priority for {@link NotificationCompat.Builder#setPriority(int)},
174f021758934b35e3b842c6799344531d7ea2969daChris Wren     * for items that are less important. The UI may choose to show
175f021758934b35e3b842c6799344531d7ea2969daChris Wren     * these items smaller, or at a different position in the list,
176f021758934b35e3b842c6799344531d7ea2969daChris Wren     * compared with your app's {@link #PRIORITY_DEFAULT} items.
177f021758934b35e3b842c6799344531d7ea2969daChris Wren     */
178f021758934b35e3b842c6799344531d7ea2969daChris Wren    public static final int PRIORITY_LOW = -1;
179f021758934b35e3b842c6799344531d7ea2969daChris Wren
180f021758934b35e3b842c6799344531d7ea2969daChris Wren    /**
181f021758934b35e3b842c6799344531d7ea2969daChris Wren     * Lowest notification priority for {@link NotificationCompat.Builder#setPriority(int)};
182f021758934b35e3b842c6799344531d7ea2969daChris Wren     * these items might not be shown to the user except under
183f021758934b35e3b842c6799344531d7ea2969daChris Wren     * special circumstances, such as detailed notification logs.
184f021758934b35e3b842c6799344531d7ea2969daChris Wren     */
185f021758934b35e3b842c6799344531d7ea2969daChris Wren    public static final int PRIORITY_MIN = -2;
186f021758934b35e3b842c6799344531d7ea2969daChris Wren
187f021758934b35e3b842c6799344531d7ea2969daChris Wren    /**
188f021758934b35e3b842c6799344531d7ea2969daChris Wren     * Higher notification priority for {@link NotificationCompat.Builder#setPriority(int)},
189f021758934b35e3b842c6799344531d7ea2969daChris Wren     * for more important notifications or alerts. The UI may choose
190f021758934b35e3b842c6799344531d7ea2969daChris Wren     * to show these items larger, or at a different position in
191f021758934b35e3b842c6799344531d7ea2969daChris Wren     * notification lists, compared with your app's {@link #PRIORITY_DEFAULT} items.
192f021758934b35e3b842c6799344531d7ea2969daChris Wren     */
193f021758934b35e3b842c6799344531d7ea2969daChris Wren    public static final int PRIORITY_HIGH = 1;
194f021758934b35e3b842c6799344531d7ea2969daChris Wren
195f021758934b35e3b842c6799344531d7ea2969daChris Wren    /**
196f021758934b35e3b842c6799344531d7ea2969daChris Wren     * Highest notification priority for {@link NotificationCompat.Builder#setPriority(int)},
197f021758934b35e3b842c6799344531d7ea2969daChris Wren     * for your application's most important items that require the user's
198f021758934b35e3b842c6799344531d7ea2969daChris Wren     * prompt attention or input.
199f021758934b35e3b842c6799344531d7ea2969daChris Wren     */
200f021758934b35e3b842c6799344531d7ea2969daChris Wren    public static final int PRIORITY_MAX = 2;
201f021758934b35e3b842c6799344531d7ea2969daChris Wren
202c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
203c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Notification extras key: this is the title of the notification,
204c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * as supplied to {@link Builder#setContentTitle(CharSequence)}.
205c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
206c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final String EXTRA_TITLE = "android.title";
207c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
208c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
209c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Notification extras key: this is the title of the notification when shown in expanded form,
210c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * e.g. as supplied to {@link BigTextStyle#setBigContentTitle(CharSequence)}.
211c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
212c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final String EXTRA_TITLE_BIG = EXTRA_TITLE + ".big";
213c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
214c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
215c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Notification extras key: this is the main text payload, as supplied to
216c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * {@link Builder#setContentText(CharSequence)}.
217c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
218c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final String EXTRA_TEXT = "android.text";
219c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
220c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
221c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Notification extras key: this is a third line of text, as supplied to
222c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * {@link Builder#setSubText(CharSequence)}.
223c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
224c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final String EXTRA_SUB_TEXT = "android.subText";
225c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
226c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
227aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas     * Notification extras key: this is the remote input history, as supplied to
228aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas     * {@link Builder#setRemoteInputHistory(CharSequence[])}.
229aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas     *
230aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas     * Apps can fill this through {@link Builder#setRemoteInputHistory(CharSequence[])}
231aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas     * with the most recent inputs that have been sent through a {@link RemoteInput} of this
232aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas     * Notification and are expected to clear it once the it is no longer relevant (e.g. for chat
233aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas     * notifications once the other party has responded).
234aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas     *
235aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas     * The extra with this key is of type CharSequence[] and contains the most recent entry at
236aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas     * the 0 index, the second most recent at the 1 index, etc.
237aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas     *
238aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas     * @see Builder#setRemoteInputHistory(CharSequence[])
239aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas     */
240aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas    public static final String EXTRA_REMOTE_INPUT_HISTORY = "android.remoteInputHistory";
241aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas
242aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas    /**
243c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Notification extras key: this is a small piece of additional text as supplied to
244c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * {@link Builder#setContentInfo(CharSequence)}.
245c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
246c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final String EXTRA_INFO_TEXT = "android.infoText";
247c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
248c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
249c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Notification extras key: this is a line of summary information intended to be shown
250c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * alongside expanded notifications, as supplied to (e.g.)
251c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * {@link BigTextStyle#setSummaryText(CharSequence)}.
252c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
253c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final String EXTRA_SUMMARY_TEXT = "android.summaryText";
254c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
255c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
25648d8878e34b0d9983166418378125b63faac9aabGriff Hazen     * Notification extras key: this is the longer text shown in the big form of a
25748d8878e34b0d9983166418378125b63faac9aabGriff Hazen     * {@link BigTextStyle} notification, as supplied to
25848d8878e34b0d9983166418378125b63faac9aabGriff Hazen     * {@link BigTextStyle#bigText(CharSequence)}.
25948d8878e34b0d9983166418378125b63faac9aabGriff Hazen     */
26048d8878e34b0d9983166418378125b63faac9aabGriff Hazen    public static final String EXTRA_BIG_TEXT = "android.bigText";
26148d8878e34b0d9983166418378125b63faac9aabGriff Hazen
26248d8878e34b0d9983166418378125b63faac9aabGriff Hazen    /**
263c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Notification extras key: this is the resource ID of the notification's main small icon, as
264c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * supplied to {@link Builder#setSmallIcon(int)}.
265c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
266c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final String EXTRA_SMALL_ICON = "android.icon";
267c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
268c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
269c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Notification extras key: this is a bitmap to be used instead of the small icon when showing the
270c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * notification payload, as
271c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * supplied to {@link Builder#setLargeIcon(android.graphics.Bitmap)}.
272c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
273c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final String EXTRA_LARGE_ICON = "android.largeIcon";
274c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
275c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
276c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Notification extras key: this is a bitmap to be used instead of the one from
277c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * {@link Builder#setLargeIcon(android.graphics.Bitmap)} when the notification is
278c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * shown in its expanded form, as supplied to
279c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * {@link BigPictureStyle#bigLargeIcon(android.graphics.Bitmap)}.
280c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
281c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final String EXTRA_LARGE_ICON_BIG = EXTRA_LARGE_ICON + ".big";
282c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
283c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
284c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Notification extras key: this is the progress value supplied to
285c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * {@link Builder#setProgress(int, int, boolean)}.
286c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
287c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final String EXTRA_PROGRESS = "android.progress";
288c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
289c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
290c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Notification extras key: this is the maximum value supplied to
291c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * {@link Builder#setProgress(int, int, boolean)}.
292c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
293c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final String EXTRA_PROGRESS_MAX = "android.progressMax";
294c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
295c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
296c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Notification extras key: whether the progress bar is indeterminate, supplied to
297c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * {@link Builder#setProgress(int, int, boolean)}.
298c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
299c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final String EXTRA_PROGRESS_INDETERMINATE = "android.progressIndeterminate";
300c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
301c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
302c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Notification extras key: whether the when field set using {@link Builder#setWhen} should
303c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * be shown as a count-up timer (specifically a {@link android.widget.Chronometer}) instead
304c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * of a timestamp, as supplied to {@link Builder#setUsesChronometer(boolean)}.
305c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
306c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final String EXTRA_SHOW_CHRONOMETER = "android.showChronometer";
307c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
308c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
30948d8878e34b0d9983166418378125b63faac9aabGriff Hazen     * Notification extras key: whether the when field set using {@link Builder#setWhen} should
31048d8878e34b0d9983166418378125b63faac9aabGriff Hazen     * be shown, as supplied to {@link Builder#setShowWhen(boolean)}.
31148d8878e34b0d9983166418378125b63faac9aabGriff Hazen     */
31248d8878e34b0d9983166418378125b63faac9aabGriff Hazen    public static final String EXTRA_SHOW_WHEN = "android.showWhen";
31348d8878e34b0d9983166418378125b63faac9aabGriff Hazen
31448d8878e34b0d9983166418378125b63faac9aabGriff Hazen    /**
315c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Notification extras key: this is a bitmap to be shown in {@link BigPictureStyle} expanded
316c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * notifications, supplied to {@link BigPictureStyle#bigPicture(android.graphics.Bitmap)}.
317c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
318c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final String EXTRA_PICTURE = "android.picture";
319c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
320c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
321c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * Notification extras key: An array of CharSequences to show in {@link InboxStyle} expanded
322c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     * notifications, each of which was supplied to {@link InboxStyle#addLine(CharSequence)}.
323c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
324c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final String EXTRA_TEXT_LINES = "android.textLines";
325c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
326c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    /**
32741484f326c4dd126e84b26828ba340a8ae9406e8Christoph Studer     * Notification extras key: A string representing the name of the specific
32841484f326c4dd126e84b26828ba340a8ae9406e8Christoph Studer     * {@link android.app.Notification.Style} used to create this notification.
32941484f326c4dd126e84b26828ba340a8ae9406e8Christoph Studer     */
33041484f326c4dd126e84b26828ba340a8ae9406e8Christoph Studer    public static final String EXTRA_TEMPLATE = "android.template";
33141484f326c4dd126e84b26828ba340a8ae9406e8Christoph Studer
33241484f326c4dd126e84b26828ba340a8ae9406e8Christoph Studer    /**
33389e6774cdb200acc2dd5f4c9022a7e1aeeb05bceChris Wren     * Notification extras key: A String array containing the people that this
33489e6774cdb200acc2dd5f4c9022a7e1aeeb05bceChris Wren     * notification relates to, each of which was supplied to
33589e6774cdb200acc2dd5f4c9022a7e1aeeb05bceChris Wren     * {@link Builder#addPerson(String)}.
336c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen     */
337c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen    public static final String EXTRA_PEOPLE = "android.people";
338c4e68f1b0c0cb95f499812383ccb282643777226Griff Hazen
33969a58d36f6ed8ec4d076534556aba2f93d00254eDan Sandler    /**
34041484f326c4dd126e84b26828ba340a8ae9406e8Christoph Studer     * Notification extras key: A
34141484f326c4dd126e84b26828ba340a8ae9406e8Christoph Studer     * {@link android.content.ContentUris content URI} pointing to an image that can be displayed
34241484f326c4dd126e84b26828ba340a8ae9406e8Christoph Studer     * in the background when the notification is selected. The URI must point to an image stream
34341484f326c4dd126e84b26828ba340a8ae9406e8Christoph Studer     * suitable for passing into
34441484f326c4dd126e84b26828ba340a8ae9406e8Christoph Studer     * {@link android.graphics.BitmapFactory#decodeStream(java.io.InputStream)
34541484f326c4dd126e84b26828ba340a8ae9406e8Christoph Studer     * BitmapFactory.decodeStream}; all other content types will be ignored. The content provider
34641484f326c4dd126e84b26828ba340a8ae9406e8Christoph Studer     * URI used for this purpose must require no permissions to read the image data.
34741484f326c4dd126e84b26828ba340a8ae9406e8Christoph Studer     */
34841484f326c4dd126e84b26828ba340a8ae9406e8Christoph Studer    public static final String EXTRA_BACKGROUND_IMAGE_URI = "android.backgroundImageUri";
34941484f326c4dd126e84b26828ba340a8ae9406e8Christoph Studer
35041484f326c4dd126e84b26828ba340a8ae9406e8Christoph Studer    /**
35141484f326c4dd126e84b26828ba340a8ae9406e8Christoph Studer     * Notification key: A
35241484f326c4dd126e84b26828ba340a8ae9406e8Christoph Studer     * {@link android.media.session.MediaSession.Token} associated with a
35341484f326c4dd126e84b26828ba340a8ae9406e8Christoph Studer     * {@link android.app.Notification.MediaStyle} notification.
35441484f326c4dd126e84b26828ba340a8ae9406e8Christoph Studer     */
35541484f326c4dd126e84b26828ba340a8ae9406e8Christoph Studer    public static final String EXTRA_MEDIA_SESSION = "android.mediaSession";
35641484f326c4dd126e84b26828ba340a8ae9406e8Christoph Studer
35741484f326c4dd126e84b26828ba340a8ae9406e8Christoph Studer    /**
358b2216c3ffda4d63d3f0c9f6b16afc8c912c4296eBryan Mawhinney     * Notification extras key: the indices of actions to be shown in the compact view,
359b2216c3ffda4d63d3f0c9f6b16afc8c912c4296eBryan Mawhinney     * as supplied to (e.g.) {@link Notification.MediaStyle#setShowActionsInCompactView(int...)}.
360569c49e672218d3a9d391a16e4c1b50507d5eccfBryan Mawhinney     */
361569c49e672218d3a9d391a16e4c1b50507d5eccfBryan Mawhinney    public static final String EXTRA_COMPACT_ACTIONS = "android.compactActions";
362569c49e672218d3a9d391a16e4c1b50507d5eccfBryan Mawhinney
363569c49e672218d3a9d391a16e4c1b50507d5eccfBryan Mawhinney    /**
36443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills     * Notification key: the username to be displayed for all messages sent by the user
36543cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills     * including
36643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills     * direct replies
36743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills     * {@link MessagingStyle} notification.
36843cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills     */
36943cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills    public static final String EXTRA_SELF_DISPLAY_NAME = "android.selfDisplayName";
37043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills
37143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills    /**
37243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills     * Notification key: a {@link String} to be displayed as the title to a conversation
37343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills     * represented by a {@link MessagingStyle}
37443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills     */
37543cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills    public static final String EXTRA_CONVERSATION_TITLE = "android.conversationTitle";
37643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills
37743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills    /**
37843cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills     * Notification key: an array of {@link Bundle} objects representing
37943cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills     * {@link MessagingStyle.Message} objects for a {@link MessagingStyle} notification.
38043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills     */
38143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills    public static final String EXTRA_MESSAGES = "android.messages";
38243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills
38343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills    /**
38469a58d36f6ed8ec4d076534556aba2f93d00254eDan Sandler     * Value of {@link Notification#color} equal to 0 (also known as
38569a58d36f6ed8ec4d076534556aba2f93d00254eDan Sandler     * {@link android.graphics.Color#TRANSPARENT Color.TRANSPARENT}),
38669a58d36f6ed8ec4d076534556aba2f93d00254eDan Sandler     * telling the system not to decorate this notification with any special color but instead use
38769a58d36f6ed8ec4d076534556aba2f93d00254eDan Sandler     * default colors when presenting this notification.
38869a58d36f6ed8ec4d076534556aba2f93d00254eDan Sandler     */
38970acb0c19be3831a2080e4f902324de16bfbf62eTor Norbye    @ColorInt
39069a58d36f6ed8ec4d076534556aba2f93d00254eDan Sandler    public static final int COLOR_DEFAULT = Color.TRANSPARENT;
39169a58d36f6ed8ec4d076534556aba2f93d00254eDan Sandler
392df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler    /**
393df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler     * Notification visibility: Show this notification in its entirety on all lockscreens.
394df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler     *
395df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler     * {@see android.app.Notification#visibility}
396df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler     */
397df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler    public static final int VISIBILITY_PUBLIC = 1;
398df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler
399df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler    /**
400df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler     * Notification visibility: Show this notification on all lockscreens, but conceal sensitive or
401df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler     * private information on secure lockscreens.
402df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler     *
403df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler     * {@see android.app.Notification#visibility}
404df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler     */
405df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler    public static final int VISIBILITY_PRIVATE = 0;
406df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler
407df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler    /**
408df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler     * Notification visibility: Do not reveal any part of this notification on a secure lockscreen.
409df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler     *
410df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler     * {@see android.app.Notification#visibility}
411df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler     */
412df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler    public static final int VISIBILITY_SECRET = -1;
413df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler
4141f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney    /**
4151f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney     * Notification category: incoming call (voice or video) or similar synchronous communication request.
4161f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney     */
4171f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney    public static final String CATEGORY_CALL = NotificationCompatApi21.CATEGORY_CALL;
4181f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney
4191f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney    /**
4201f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney     * Notification category: incoming direct message (SMS, instant message, etc.).
4211f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney     */
4221f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney    public static final String CATEGORY_MESSAGE = NotificationCompatApi21.CATEGORY_MESSAGE;
4231f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney
4241f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney    /**
4251f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney     * Notification category: asynchronous bulk message (email).
4261f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney     */
4271f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney    public static final String CATEGORY_EMAIL = NotificationCompatApi21.CATEGORY_EMAIL;
4281f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney
4291f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney    /**
4301f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney     * Notification category: calendar event.
4311f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney     */
4321f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney    public static final String CATEGORY_EVENT = NotificationCompatApi21.CATEGORY_EVENT;
4331f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney
4341f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney    /**
4351f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney     * Notification category: promotion or advertisement.
4361f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney     */
4371f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney    public static final String CATEGORY_PROMO = NotificationCompatApi21.CATEGORY_PROMO;
4381f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney
4391f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney    /**
4401f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney     * Notification category: alarm or timer.
4411f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney     */
4421f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney    public static final String CATEGORY_ALARM = NotificationCompatApi21.CATEGORY_ALARM;
4431f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney
4441f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney    /**
4451f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney     * Notification category: progress of a long-running background operation.
4461f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney     */
4471f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney    public static final String CATEGORY_PROGRESS = NotificationCompatApi21.CATEGORY_PROGRESS;
4481f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney
4491f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney    /**
4501f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney     * Notification category: social network or sharing update.
4511f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney     */
4521f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney    public static final String CATEGORY_SOCIAL = NotificationCompatApi21.CATEGORY_SOCIAL;
4531f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney
4541f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney    /**
4551f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney     * Notification category: error in background operation or authentication status.
4561f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney     */
4571f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney    public static final String CATEGORY_ERROR = NotificationCompatApi21.CATEGORY_ERROR;
4581f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney
4591f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney    /**
4601f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney     * Notification category: media transport control for playback.
4611f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney     */
4621f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney    public static final String CATEGORY_TRANSPORT = NotificationCompatApi21.CATEGORY_TRANSPORT;
4631f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney
4641f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney    /**
4651f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney     * Notification category: system or device status update.  Reserved for system use.
4661f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney     */
4671f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney    public static final String CATEGORY_SYSTEM = NotificationCompatApi21.CATEGORY_SYSTEM;
4681f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney
4691f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney    /**
4701f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney     * Notification category: indication of running background service.
4711f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney     */
4721f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney    public static final String CATEGORY_SERVICE = NotificationCompatApi21.CATEGORY_SERVICE;
4731f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney
4741f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney    /**
4757c1fcb24cdd2ede9eed84fe8cd784e45192eb0d4Chris Wren     * Notification category: user-scheduled reminder.
4767c1fcb24cdd2ede9eed84fe8cd784e45192eb0d4Chris Wren     */
4777c1fcb24cdd2ede9eed84fe8cd784e45192eb0d4Chris Wren    public static final String CATEGORY_REMINDER = NotificationCompatApi23.CATEGORY_REMINDER;
4787c1fcb24cdd2ede9eed84fe8cd784e45192eb0d4Chris Wren
4797c1fcb24cdd2ede9eed84fe8cd784e45192eb0d4Chris Wren    /**
4801f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney     * Notification category: a specific, timely recommendation for a single thing.
4811f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney     * For example, a news app might want to recommend a news story it believes the user will
4821f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney     * want to read next.
4831f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney     */
4841f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney    public static final String CATEGORY_RECOMMENDATION =
4851f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney            NotificationCompatApi21.CATEGORY_RECOMMENDATION;
4861f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney
4871f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney    /**
4881f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney     * Notification category: ongoing information about device or contextual status.
4891f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney     */
4901f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney    public static final String CATEGORY_STATUS = NotificationCompatApi21.CATEGORY_STATUS;
4911f94e518424cbf818607f63e353f2a597ed1dd37Bryan Mawhinney
492552766fa685c63ad760c92239faaba12e6ad51f1Aurimas Liutikas    static final NotificationCompatImpl IMPL;
493c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
494c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell    interface NotificationCompatImpl {
49510d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi        public Notification build(Builder b, BuilderExtender extender);
496b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        public Bundle getExtras(Notification n);
497300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        public int getActionCount(Notification n);
498300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        public Action getAction(Notification n, int actionIndex);
4992bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public Action[] getActionsFromParcelableArrayList(ArrayList<Parcelable> parcelables);
5002bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public ArrayList<Parcelable> getParcelableArrayListForActions(Action[] actions);
50175e2071f16bae2b22d1618026d10337daad862cfBryan Mawhinney        public String getCategory(Notification n);
502b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        public boolean getLocalOnly(Notification n);
503ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        public String getGroup(Notification n);
504ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        public boolean isGroupSummary(Notification n);
505ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        public String getSortKey(Notification n);
5068eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song        Bundle getBundleForUnreadConversation(NotificationCompatBase.UnreadConversation uc);
5078eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song        NotificationCompatBase.UnreadConversation getUnreadConversationFromBundle(
5088eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                Bundle b, NotificationCompatBase.UnreadConversation.Factory factory,
5098eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                RemoteInputCompatBase.RemoteInput.Factory remoteInputFactory);
510c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell    }
511c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
51210d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi    /**
51310d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi     * Interface for appcompat to extend v4 builder with media style.
51410d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi     *
51510d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi     * @hide
51610d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi     */
517c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viverette    @RestrictTo(GROUP_ID)
51810d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi    protected static class BuilderExtender {
51910d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi        public Notification build(Builder b, NotificationBuilderWithBuilderAccessor builder) {
5203b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek            Notification n = builder.build();
5213b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek            if (b.mContentView != null) {
5223b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek                n.contentView = b.mContentView;
5233b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek            }
5243b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek            return n;
52510d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi        }
52610d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi    }
52710d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi
528c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell    static class NotificationCompatImplBase implements NotificationCompatImpl {
529b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        @Override
53010d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi        public Notification build(Builder b, BuilderExtender extender) {
531fe3b5bac4901a4bb8cf51c09fe4910b02388818aGriff Hazen            Notification result = b.mNotification;
532475f4c62881dbdfb02aa9a78ae1e1cec1d3bb96fKirill Grouchnikov            result = NotificationCompatBase.add(result, b.mContext,
533cd40090290dbd6f81ea40592bb8c699bb03ab931Selim Cinek                    b.resolveTitle(), b.resolveText(), b.mContentIntent, b.mFullScreenIntent);
534f021758934b35e3b842c6799344531d7ea2969daChris Wren            // translate high priority requests into legacy flag
535f021758934b35e3b842c6799344531d7ea2969daChris Wren            if (b.mPriority > PRIORITY_DEFAULT) {
536884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin                result.flags |= FLAG_HIGH_PRIORITY;
537f021758934b35e3b842c6799344531d7ea2969daChris Wren            }
538c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds            if (b.mContentView != null) {
539c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds                result.contentView = b.mContentView;
540c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds            }
541c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return result;
542c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
543b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen
544b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        @Override
545b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        public Bundle getExtras(Notification n) {
546b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            return null;
547b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        }
548b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen
549b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        @Override
550300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        public int getActionCount(Notification n) {
551300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            return 0;
552300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        }
553300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
554300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        @Override
555300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        public Action getAction(Notification n, int actionIndex) {
556300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            return null;
557300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        }
558300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
559300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        @Override
5602bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public Action[] getActionsFromParcelableArrayList(
5612bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                ArrayList<Parcelable> parcelables) {
5622bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return null;
5632bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
5642bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
5652bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        @Override
5662bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public ArrayList<Parcelable> getParcelableArrayListForActions(Action[] actions) {
5672bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return null;
5682bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
5692bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
5702bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        @Override
57175e2071f16bae2b22d1618026d10337daad862cfBryan Mawhinney        public String getCategory(Notification n) {
57275e2071f16bae2b22d1618026d10337daad862cfBryan Mawhinney            return null;
57375e2071f16bae2b22d1618026d10337daad862cfBryan Mawhinney        }
57475e2071f16bae2b22d1618026d10337daad862cfBryan Mawhinney
57575e2071f16bae2b22d1618026d10337daad862cfBryan Mawhinney        @Override
576b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        public boolean getLocalOnly(Notification n) {
577b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            return false;
578b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        }
579ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
580ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        @Override
581ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        public String getGroup(Notification n) {
582ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return null;
583ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        }
584ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
585ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        @Override
586ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        public boolean isGroupSummary(Notification n) {
587ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return false;
588ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        }
589ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
590ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        @Override
591ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        public String getSortKey(Notification n) {
592ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return null;
593ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        }
5948eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song
5958eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song        @Override
5968eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song        public Bundle getBundleForUnreadConversation(NotificationCompatBase.UnreadConversation uc) {
5978eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song            return null;
5988eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song        }
5998eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song
6008eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song        @Override
6018eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song        public NotificationCompatBase.UnreadConversation getUnreadConversationFromBundle(
6028eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                Bundle b, NotificationCompatBase.UnreadConversation.Factory factory,
6038eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                RemoteInputCompatBase.RemoteInput.Factory remoteInputFactory) {
6048eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song            return null;
6058eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song        }
606c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell    }
607c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
608b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen    static class NotificationCompatImplHoneycomb extends NotificationCompatImplBase {
609b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        @Override
61010d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi        public Notification build(Builder b, BuilderExtender extender) {
611c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds            Notification notification = NotificationCompatHoneycomb.add(b.mContext, b.mNotification,
612cd40090290dbd6f81ea40592bb8c699bb03ab931Selim Cinek                    b.resolveTitle(), b.resolveText(), b.mContentInfo, b.mTickerView,
613c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell                    b.mNumber, b.mContentIntent, b.mFullScreenIntent, b.mLargeIcon);
614c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds            if (b.mContentView != null) {
615c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds                notification.contentView = b.mContentView;
616c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds            }
617c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds            return notification;
618c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
619c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell    }
620c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
621b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen    static class NotificationCompatImplIceCreamSandwich extends NotificationCompatImplBase {
622b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        @Override
62310d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi        public Notification build(Builder b, BuilderExtender extender) {
62410d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi            NotificationCompatIceCreamSandwich.Builder builder =
625cd40090290dbd6f81ea40592bb8c699bb03ab931Selim Cinek                    new NotificationCompatIceCreamSandwich.Builder(b.mContext, b.mNotification,
626cd40090290dbd6f81ea40592bb8c699bb03ab931Selim Cinek                            b.resolveTitle(), b.resolveText(), b.mContentInfo, b.mTickerView,
627cd40090290dbd6f81ea40592bb8c699bb03ab931Selim Cinek                            b.mNumber, b.mContentIntent, b.mFullScreenIntent, b.mLargeIcon,
62843cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills                            b.mProgressMax, b.mProgress, b.mProgressIndeterminate);
6293b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek            return extender.build(b, builder);
630f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
631f021758934b35e3b842c6799344531d7ea2969daChris Wren    }
632f021758934b35e3b842c6799344531d7ea2969daChris Wren
633b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen    static class NotificationCompatImplJellybean extends NotificationCompatImplBase {
634b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        @Override
63510d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi        public Notification build(Builder b, BuilderExtender extender) {
636b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            NotificationCompatJellybean.Builder builder = new NotificationCompatJellybean.Builder(
637cd40090290dbd6f81ea40592bb8c699bb03ab931Selim Cinek                    b.mContext, b.mNotification, b.resolveTitle(), b.resolveText(), b.mContentInfo,
638f021758934b35e3b842c6799344531d7ea2969daChris Wren                    b.mTickerView, b.mNumber, b.mContentIntent, b.mFullScreenIntent, b.mLargeIcon,
639f021758934b35e3b842c6799344531d7ea2969daChris Wren                    b.mProgressMax, b.mProgress, b.mProgressIndeterminate,
640ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                    b.mUseChronometer, b.mPriority, b.mSubText, b.mLocalOnly, b.mExtras,
641c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds                    b.mGroupKey, b.mGroupSummary, b.mSortKey, b.mContentView, b.mBigContentView);
642b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            addActionsToBuilder(builder, b.mActions);
643b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            addStyleToBuilderJellybean(builder, b.mStyle);
64443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            Notification notification = extender.build(b, builder);
64543cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            if (b.mStyle != null) {
646cd40090290dbd6f81ea40592bb8c699bb03ab931Selim Cinek                Bundle extras = getExtras(notification);
647cd40090290dbd6f81ea40592bb8c699bb03ab931Selim Cinek                if (extras != null) {
648cd40090290dbd6f81ea40592bb8c699bb03ab931Selim Cinek                    b.mStyle.addCompatExtras(extras);
649cd40090290dbd6f81ea40592bb8c699bb03ab931Selim Cinek                }
65043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            }
65143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            return notification;
652b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        }
653b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen
654b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        @Override
655b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        public Bundle getExtras(Notification n) {
656b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            return NotificationCompatJellybean.getExtras(n);
657b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        }
658b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen
659b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        @Override
660300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        public int getActionCount(Notification n) {
661300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            return NotificationCompatJellybean.getActionCount(n);
662300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        }
663300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
664300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        @Override
665300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        public Action getAction(Notification n, int actionIndex) {
666ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return (Action) NotificationCompatJellybean.getAction(n, actionIndex, Action.FACTORY,
667ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                    RemoteInput.FACTORY);
668300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        }
669300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
670300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        @Override
6712bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public Action[] getActionsFromParcelableArrayList(
6722bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                ArrayList<Parcelable> parcelables) {
6732bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return (Action[]) NotificationCompatJellybean.getActionsFromParcelableArrayList(
6742bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                    parcelables, Action.FACTORY, RemoteInput.FACTORY);
6752bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
6762bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
6772bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        @Override
6782bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public ArrayList<Parcelable> getParcelableArrayListForActions(
6792bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                Action[] actions) {
6802bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return NotificationCompatJellybean.getParcelableArrayListForActions(actions);
6812bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
6822bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
6832bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        @Override
68447702147608084fec16a50640da54b412c737b9cGriff Hazen        public boolean getLocalOnly(Notification n) {
68547702147608084fec16a50640da54b412c737b9cGriff Hazen            return NotificationCompatJellybean.getLocalOnly(n);
68647702147608084fec16a50640da54b412c737b9cGriff Hazen        }
687ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
688ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        @Override
689ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        public String getGroup(Notification n) {
690ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return NotificationCompatJellybean.getGroup(n);
691ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        }
692ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
693ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        @Override
694ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        public boolean isGroupSummary(Notification n) {
695ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return NotificationCompatJellybean.isGroupSummary(n);
696ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        }
697ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
698ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        @Override
699ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        public String getSortKey(Notification n) {
700ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return NotificationCompatJellybean.getSortKey(n);
701ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        }
70247702147608084fec16a50640da54b412c737b9cGriff Hazen    }
70347702147608084fec16a50640da54b412c737b9cGriff Hazen
704ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    static class NotificationCompatImplKitKat extends NotificationCompatImplJellybean {
70547702147608084fec16a50640da54b412c737b9cGriff Hazen        @Override
70610d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi        public Notification build(Builder b, BuilderExtender extender) {
70747702147608084fec16a50640da54b412c737b9cGriff Hazen            NotificationCompatKitKat.Builder builder = new NotificationCompatKitKat.Builder(
708cd40090290dbd6f81ea40592bb8c699bb03ab931Selim Cinek                    b.mContext, b.mNotification, b.resolveTitle(), b.resolveText(), b.mContentInfo,
70947702147608084fec16a50640da54b412c737b9cGriff Hazen                    b.mTickerView, b.mNumber, b.mContentIntent, b.mFullScreenIntent, b.mLargeIcon,
71048d8878e34b0d9983166418378125b63faac9aabGriff Hazen                    b.mProgressMax, b.mProgress, b.mProgressIndeterminate, b.mShowWhen,
71148d8878e34b0d9983166418378125b63faac9aabGriff Hazen                    b.mUseChronometer, b.mPriority, b.mSubText, b.mLocalOnly,
712c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds                    b.mPeople, b.mExtras, b.mGroupKey, b.mGroupSummary, b.mSortKey,
713c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds                    b.mContentView, b.mBigContentView);
71447702147608084fec16a50640da54b412c737b9cGriff Hazen            addActionsToBuilder(builder, b.mActions);
71547702147608084fec16a50640da54b412c737b9cGriff Hazen            addStyleToBuilderJellybean(builder, b.mStyle);
71610d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi            return extender.build(b, builder);
71747702147608084fec16a50640da54b412c737b9cGriff Hazen        }
71847702147608084fec16a50640da54b412c737b9cGriff Hazen
71947702147608084fec16a50640da54b412c737b9cGriff Hazen        @Override
72047702147608084fec16a50640da54b412c737b9cGriff Hazen        public Bundle getExtras(Notification n) {
72147702147608084fec16a50640da54b412c737b9cGriff Hazen            return NotificationCompatKitKat.getExtras(n);
72247702147608084fec16a50640da54b412c737b9cGriff Hazen        }
72347702147608084fec16a50640da54b412c737b9cGriff Hazen
72447702147608084fec16a50640da54b412c737b9cGriff Hazen        @Override
725300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        public int getActionCount(Notification n) {
726300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            return NotificationCompatKitKat.getActionCount(n);
727300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        }
728300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
729300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        @Override
730300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        public Action getAction(Notification n, int actionIndex) {
731ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return (Action) NotificationCompatKitKat.getAction(n, actionIndex, Action.FACTORY,
732ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                    RemoteInput.FACTORY);
733300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        }
734300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
735300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        @Override
73647702147608084fec16a50640da54b412c737b9cGriff Hazen        public boolean getLocalOnly(Notification n) {
73747702147608084fec16a50640da54b412c737b9cGriff Hazen            return NotificationCompatKitKat.getLocalOnly(n);
738b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        }
739ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
740ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        @Override
741ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        public String getGroup(Notification n) {
742ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return NotificationCompatKitKat.getGroup(n);
743ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        }
744ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
745ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        @Override
746ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        public boolean isGroupSummary(Notification n) {
747ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return NotificationCompatKitKat.isGroupSummary(n);
748ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        }
749ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
750ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        @Override
751ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        public String getSortKey(Notification n) {
752ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return NotificationCompatKitKat.getSortKey(n);
753ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        }
754b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen    }
755b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen
756ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    static class NotificationCompatImplApi20 extends NotificationCompatImplKitKat {
757b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        @Override
75810d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi        public Notification build(Builder b, BuilderExtender extender) {
759b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            NotificationCompatApi20.Builder builder = new NotificationCompatApi20.Builder(
760cd40090290dbd6f81ea40592bb8c699bb03ab931Selim Cinek                    b.mContext, b.mNotification, b.resolveTitle(), b.resolveText(), b.mContentInfo,
761b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                    b.mTickerView, b.mNumber, b.mContentIntent, b.mFullScreenIntent, b.mLargeIcon,
76248d8878e34b0d9983166418378125b63faac9aabGriff Hazen                    b.mProgressMax, b.mProgress, b.mProgressIndeterminate, b.mShowWhen,
76343c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen                    b.mUseChronometer, b.mPriority, b.mSubText, b.mLocalOnly, b.mPeople, b.mExtras,
764c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds                    b.mGroupKey, b.mGroupSummary, b.mSortKey, b.mContentView, b.mBigContentView);
765b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            addActionsToBuilder(builder, b.mActions);
766b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            addStyleToBuilderJellybean(builder, b.mStyle);
76743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            Notification notification = extender.build(b, builder);
76843cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            if (b.mStyle != null) {
76943cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills                b.mStyle.addCompatExtras(getExtras(notification));
77043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            }
77143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            return notification;
772b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        }
773b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen
774b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        @Override
775ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        public Action getAction(Notification n, int actionIndex) {
776ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return (Action) NotificationCompatApi20.getAction(n, actionIndex, Action.FACTORY,
777ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                    RemoteInput.FACTORY);
778b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        }
779b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen
780b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        @Override
7812bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public Action[] getActionsFromParcelableArrayList(
7822bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                ArrayList<Parcelable> parcelables) {
7832bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return (Action[]) NotificationCompatApi20.getActionsFromParcelableArrayList(
7842bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                    parcelables, Action.FACTORY, RemoteInput.FACTORY);
7852bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
7862bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
7872bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        @Override
7882bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public ArrayList<Parcelable> getParcelableArrayListForActions(
7892bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                Action[] actions) {
7902bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return NotificationCompatApi20.getParcelableArrayListForActions(actions);
7912bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
7922bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
7932bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        @Override
794ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        public boolean getLocalOnly(Notification n) {
795ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return NotificationCompatApi20.getLocalOnly(n);
796300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        }
797300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
798300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        @Override
799ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        public String getGroup(Notification n) {
800ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return NotificationCompatApi20.getGroup(n);
801300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        }
802300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
803300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        @Override
804ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        public boolean isGroupSummary(Notification n) {
805ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return NotificationCompatApi20.isGroupSummary(n);
806ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        }
807ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
808ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        @Override
809ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        public String getSortKey(Notification n) {
810ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return NotificationCompatApi20.getSortKey(n);
811b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        }
812b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen    }
813b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen
81443c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen    static class NotificationCompatImplApi21 extends NotificationCompatImplApi20 {
81543c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen        @Override
81610d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi        public Notification build(Builder b, BuilderExtender extender) {
81743c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen            NotificationCompatApi21.Builder builder = new NotificationCompatApi21.Builder(
818cd40090290dbd6f81ea40592bb8c699bb03ab931Selim Cinek                    b.mContext, b.mNotification, b.resolveTitle(), b.resolveText(), b.mContentInfo,
81943c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen                    b.mTickerView, b.mNumber, b.mContentIntent, b.mFullScreenIntent, b.mLargeIcon,
82048d8878e34b0d9983166418378125b63faac9aabGriff Hazen                    b.mProgressMax, b.mProgress, b.mProgressIndeterminate, b.mShowWhen,
82143c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen                    b.mUseChronometer, b.mPriority, b.mSubText, b.mLocalOnly, b.mCategory,
82243c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen                    b.mPeople, b.mExtras, b.mColor, b.mVisibility, b.mPublicVersion,
823c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds                    b.mGroupKey, b.mGroupSummary, b.mSortKey, b.mContentView, b.mBigContentView,
824c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds                    b.mHeadsUpContentView);
82543c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen            addActionsToBuilder(builder, b.mActions);
82643c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen            addStyleToBuilderJellybean(builder, b.mStyle);
82743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            Notification notification = extender.build(b, builder);
82843cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            if (b.mStyle != null) {
82943cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills                b.mStyle.addCompatExtras(getExtras(notification));
83043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            }
83143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            return notification;
83243c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen        }
83343c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen
83443c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen        @Override
83543c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen        public String getCategory(Notification notif) {
83643c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen            return NotificationCompatApi21.getCategory(notif);
83743c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen        }
8388eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song
8398eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song        @Override
8408eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song        public Bundle getBundleForUnreadConversation(NotificationCompatBase.UnreadConversation uc) {
8418eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song            return NotificationCompatApi21.getBundleForUnreadConversation(uc);
8428eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song        }
8438eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song
8448eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song        @Override
8458eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song        public NotificationCompatBase.UnreadConversation getUnreadConversationFromBundle(
8468eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                Bundle b, NotificationCompatBase.UnreadConversation.Factory factory,
8478eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                RemoteInputCompatBase.RemoteInput.Factory remoteInputFactory) {
8488eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song            return NotificationCompatApi21.getUnreadConversationFromBundle(
8498eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                    b, factory, remoteInputFactory);
8508eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song        }
85143c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen    }
85243c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen
85343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills    static class NotificationCompatImplApi24 extends NotificationCompatImplApi21 {
85443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills        @Override
85543cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills        public Notification build(Builder b,
85643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills                BuilderExtender extender) {
85743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            NotificationCompatApi24.Builder builder = new NotificationCompatApi24.Builder(
85843cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills                    b.mContext, b.mNotification, b.mContentTitle, b.mContentText, b.mContentInfo,
85943cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills                    b.mTickerView, b.mNumber, b.mContentIntent, b.mFullScreenIntent, b.mLargeIcon,
86043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills                    b.mProgressMax, b.mProgress, b.mProgressIndeterminate, b.mShowWhen,
86143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills                    b.mUseChronometer, b.mPriority, b.mSubText, b.mLocalOnly, b.mCategory,
86243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills                    b.mPeople, b.mExtras, b.mColor, b.mVisibility, b.mPublicVersion,
863c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds                    b.mGroupKey, b.mGroupSummary, b.mSortKey, b.mRemoteInputHistory, b.mContentView,
864c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds                    b.mBigContentView, b.mHeadsUpContentView);
86543cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            addActionsToBuilder(builder, b.mActions);
86643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            addStyleToBuilderApi24(builder, b.mStyle);
86743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            Notification notification = extender.build(b, builder);
86843cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            if (b.mStyle != null) {
86943cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills                b.mStyle.addCompatExtras(getExtras(notification));
87043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            }
87143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            return notification;
87243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills        }
87343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills    }
87443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills
875552766fa685c63ad760c92239faaba12e6ad51f1Aurimas Liutikas    static void addActionsToBuilder(NotificationBuilderWithActions builder,
876b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            ArrayList<Action> actions) {
877b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        for (Action action : actions) {
878ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            builder.addAction(action);
879b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        }
880b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen    }
881b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen
882552766fa685c63ad760c92239faaba12e6ad51f1Aurimas Liutikas    static void addStyleToBuilderJellybean(NotificationBuilderWithBuilderAccessor builder,
883b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            Style style) {
884b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        if (style != null) {
885b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            if (style instanceof BigTextStyle) {
886b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                BigTextStyle bigTextStyle = (BigTextStyle) style;
887b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                NotificationCompatJellybean.addBigTextStyle(builder,
888b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                        bigTextStyle.mBigContentTitle,
889b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                        bigTextStyle.mSummaryTextSet,
890b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                        bigTextStyle.mSummaryText,
891b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                        bigTextStyle.mBigText);
892b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            } else if (style instanceof InboxStyle) {
893b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                InboxStyle inboxStyle = (InboxStyle) style;
894b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                NotificationCompatJellybean.addInboxStyle(builder,
895b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                        inboxStyle.mBigContentTitle,
896b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                        inboxStyle.mSummaryTextSet,
897b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                        inboxStyle.mSummaryText,
898b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                        inboxStyle.mTexts);
899b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            } else if (style instanceof BigPictureStyle) {
900b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                BigPictureStyle bigPictureStyle = (BigPictureStyle) style;
901b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                NotificationCompatJellybean.addBigPictureStyle(builder,
902b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                        bigPictureStyle.mBigContentTitle,
903b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                        bigPictureStyle.mSummaryTextSet,
904b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                        bigPictureStyle.mSummaryText,
905b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                        bigPictureStyle.mPicture,
906b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                        bigPictureStyle.mBigLargeIcon,
907b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                        bigPictureStyle.mBigLargeIconSet);
90843cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            }
90943cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills        }
91043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills    }
91143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills
912552766fa685c63ad760c92239faaba12e6ad51f1Aurimas Liutikas    static void addStyleToBuilderApi24(NotificationBuilderWithBuilderAccessor builder,
91343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            Style style) {
91443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills        if (style != null) {
91543cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            if (style instanceof MessagingStyle) {
91643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills                MessagingStyle messagingStyle = (MessagingStyle) style;
91743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills                List<CharSequence> texts = new ArrayList<>();
91843cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills                List<Long> timestamps = new ArrayList<>();
91943cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills                List<CharSequence> senders = new ArrayList<>();
92043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills                List<String> dataMimeTypes = new ArrayList<>();
92143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills                List<Uri> dataUris = new ArrayList<>();
92243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills
92343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills                for (MessagingStyle.Message message : messagingStyle.mMessages) {
92443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills                    texts.add(message.getText());
92543cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills                    timestamps.add(message.getTimestamp());
92643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills                    senders.add(message.getSender());
92743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills                    dataMimeTypes.add(message.getDataMimeType());
92843cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills                    dataUris.add(message.getDataUri());
92943cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills                }
93043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills                NotificationCompatApi24.addMessagingStyle(builder, messagingStyle.mUserDisplayName,
931300828fd69bd2bfcefaf54795d03492938efd971Alex Hills                        messagingStyle.mConversationTitle, texts, timestamps, senders,
932300828fd69bd2bfcefaf54795d03492938efd971Alex Hills                        dataMimeTypes, dataUris);
93343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            } else {
93443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills                addStyleToBuilderJellybean(builder, style);
935f021758934b35e3b842c6799344531d7ea2969daChris Wren            }
936f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
937f021758934b35e3b842c6799344531d7ea2969daChris Wren    }
938f021758934b35e3b842c6799344531d7ea2969daChris Wren
939c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell    static {
940c485ebd398348372709b10a713fc6d8630b31923Alex Hills        if (BuildCompat.isAtLeastN()) {
94143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            IMPL = new NotificationCompatImplApi24();
94243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills        } else if (Build.VERSION.SDK_INT >= 21) {
94375e2071f16bae2b22d1618026d10337daad862cfBryan Mawhinney            IMPL = new NotificationCompatImplApi21();
94475e2071f16bae2b22d1618026d10337daad862cfBryan Mawhinney        } else if (Build.VERSION.SDK_INT >= 20) {
945334514fd61bd192cee3475b3ba44adb4f54a1f89Chris Wren            IMPL = new NotificationCompatImplApi20();
946334514fd61bd192cee3475b3ba44adb4f54a1f89Chris Wren        } else if (Build.VERSION.SDK_INT >= 19) {
94747702147608084fec16a50640da54b412c737b9cGriff Hazen            IMPL = new NotificationCompatImplKitKat();
94847702147608084fec16a50640da54b412c737b9cGriff Hazen        } else if (Build.VERSION.SDK_INT >= 16) {
949f021758934b35e3b842c6799344531d7ea2969daChris Wren            IMPL = new NotificationCompatImplJellybean();
950080df8ffb0920eccb300baa39180eb956a000a53Chris Wren        } else if (Build.VERSION.SDK_INT >= 14) {
951f021758934b35e3b842c6799344531d7ea2969daChris Wren            IMPL = new NotificationCompatImplIceCreamSandwich();
952f021758934b35e3b842c6799344531d7ea2969daChris Wren        } else if (Build.VERSION.SDK_INT >= 11) {
953c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            IMPL = new NotificationCompatImplHoneycomb();
954c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        } else {
955c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            IMPL = new NotificationCompatImplBase();
956c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
957c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell    }
958c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
959c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell    /**
960884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * Builder class for {@link NotificationCompat} objects.  Allows easier control over
961c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell     * all the flags, as well as help constructing the typical notification layouts.
962884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * <p>
963884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * On platform versions that don't offer expanded notifications, methods that depend on
964884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * expanded notifications have no effect.
965884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * </p>
966884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * <p>
967884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * For example, action buttons won't appear on platforms prior to Android 4.1. Action
968884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * buttons depend on expanded notifications, which are only available in Android 4.1
969884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * and later.
970884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * <p>
971884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * For this reason, you should always ensure that UI controls in a notification are also
972884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * available in an {@link android.app.Activity} in your app, and you should always start that
973884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * {@link android.app.Activity} when users click the notification. To do this, use the
974884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * {@link NotificationCompat.Builder#setContentIntent setContentIntent()}
975884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * method.
976884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * </p>
977884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     *
978c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell     */
979c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell    public static class Builder {
98024c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer        /**
98124c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer         * Maximum length of CharSequences accepted by Builder and friends.
98224c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer         *
98324c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer         * <p>
98424c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer         * Avoids spamming the system with overly large strings such as full e-mails.
98524c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer         */
98624c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer        private static final int MAX_CHARSEQUENCE_LENGTH = 5 * 1024;
98724c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer
98810d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi        // All these variables are declared public/hidden so they can be accessed by a builder
98910d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi        // extender.
99010d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi
99110d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi        /** @hide */
992c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viverette        @RestrictTo(GROUP_ID)
99310d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi        public Context mContext;
994c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
99510d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi        /** @hide */
996c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viverette        @RestrictTo(GROUP_ID)
99710d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi        public CharSequence mContentTitle;
99810d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi        /** @hide */
999c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viverette        @RestrictTo(GROUP_ID)
100010d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi        public CharSequence mContentText;
1001c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        PendingIntent mContentIntent;
1002c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        PendingIntent mFullScreenIntent;
1003c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        RemoteViews mTickerView;
100410d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi        /** @hide */
1005c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viverette        @RestrictTo(GROUP_ID)
100610d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi        public Bitmap mLargeIcon;
100710d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi        /** @hide */
1008c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viverette        @RestrictTo(GROUP_ID)
100910d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi        public CharSequence mContentInfo;
101010d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi        /** @hide */
1011c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viverette        @RestrictTo(GROUP_ID)
101210d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi        public int mNumber;
1013f021758934b35e3b842c6799344531d7ea2969daChris Wren        int mPriority;
10144c7c4787069fe222c2f74bbaa078debe389ae383Christoph Studer        boolean mShowWhen = true;
101510d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi        /** @hide */
1016c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viverette        @RestrictTo(GROUP_ID)
101710d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi        public boolean mUseChronometer;
101810d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi        /** @hide */
1019c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viverette        @RestrictTo(GROUP_ID)
102010d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi        public Style mStyle;
102110d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi        /** @hide */
1022c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viverette        @RestrictTo(GROUP_ID)
102310d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi        public CharSequence mSubText;
1024aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas        /** @hide */
1025c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viverette        @RestrictTo(GROUP_ID)
1026aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas        public CharSequence[] mRemoteInputHistory;
1027f021758934b35e3b842c6799344531d7ea2969daChris Wren        int mProgressMax;
1028f021758934b35e3b842c6799344531d7ea2969daChris Wren        int mProgress;
1029f021758934b35e3b842c6799344531d7ea2969daChris Wren        boolean mProgressIndeterminate;
1030ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        String mGroupKey;
1031ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        boolean mGroupSummary;
1032ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        String mSortKey;
103310d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi        /** @hide */
1034c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viverette        @RestrictTo(GROUP_ID)
103510d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi        public ArrayList<Action> mActions = new ArrayList<Action>();
1036b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        boolean mLocalOnly = false;
1037d3f7b5bb2422645d85b0e0131ff1c323f38bfed0John Spurlock        String mCategory;
1038ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen        Bundle mExtras;
103969a58d36f6ed8ec4d076534556aba2f93d00254eDan Sandler        int mColor = COLOR_DEFAULT;
1040df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler        int mVisibility = VISIBILITY_PRIVATE;
1041df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler        Notification mPublicVersion;
1042c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds        RemoteViews mContentView;
1043c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds        RemoteViews mBigContentView;
1044c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds        RemoteViews mHeadsUpContentView;
1045c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
104610d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi        /** @hide */
1047c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viverette        @RestrictTo(GROUP_ID)
104810d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi        public Notification mNotification = new Notification();
1049334514fd61bd192cee3475b3ba44adb4f54a1f89Chris Wren        public ArrayList<String> mPeople;
1050c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
1051c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
1052c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Constructor.
1053c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         *
1054c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Automatically sets the when field to {@link System#currentTimeMillis()
1055c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * System.currentTimeMillis()} and the audio stream to the
1056c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * {@link Notification#STREAM_DEFAULT}.
1057c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         *
1058c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * @param context A {@link Context} that will be used to construct the
1059c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         *      RemoteViews. The Context will not be held past the lifetime of this
1060c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         *      Builder object.
1061c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
1062c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder(Context context) {
1063c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mContext = context;
1064c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
1065c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            // Set defaults to match the defaults of a Notification
1066c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.when = System.currentTimeMillis();
1067c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.audioStreamType = Notification.STREAM_DEFAULT;
1068f021758934b35e3b842c6799344531d7ea2969daChris Wren            mPriority = PRIORITY_DEFAULT;
1069334514fd61bd192cee3475b3ba44adb4f54a1f89Chris Wren            mPeople = new ArrayList<String>();
1070c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
1071c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
1072c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
1073c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Set the time that the event occurred.  Notifications in the panel are
1074c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * sorted by this time.
1075c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
1076c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setWhen(long when) {
1077c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.when = when;
1078c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
1079c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
1080c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
1081c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
108248d8878e34b0d9983166418378125b63faac9aabGriff Hazen         * Control whether the timestamp set with {@link #setWhen(long) setWhen} is shown
108348d8878e34b0d9983166418378125b63faac9aabGriff Hazen         * in the content view.
108448d8878e34b0d9983166418378125b63faac9aabGriff Hazen         */
108548d8878e34b0d9983166418378125b63faac9aabGriff Hazen        public Builder setShowWhen(boolean show) {
108648d8878e34b0d9983166418378125b63faac9aabGriff Hazen            mShowWhen = show;
108748d8878e34b0d9983166418378125b63faac9aabGriff Hazen            return this;
108848d8878e34b0d9983166418378125b63faac9aabGriff Hazen        }
108948d8878e34b0d9983166418378125b63faac9aabGriff Hazen
109048d8878e34b0d9983166418378125b63faac9aabGriff Hazen        /**
1091f021758934b35e3b842c6799344531d7ea2969daChris Wren         * Show the {@link Notification#when} field as a stopwatch.
1092884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin         *
1093884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin         * Instead of presenting <code>when</code> as a timestamp, the notification will show an
1094f021758934b35e3b842c6799344531d7ea2969daChris Wren         * automatically updating display of the minutes and seconds since <code>when</code>.
1095f021758934b35e3b842c6799344531d7ea2969daChris Wren         *
1096f021758934b35e3b842c6799344531d7ea2969daChris Wren         * Useful when showing an elapsed time (like an ongoing phone call).
1097f021758934b35e3b842c6799344531d7ea2969daChris Wren         *
1098f021758934b35e3b842c6799344531d7ea2969daChris Wren         * @see android.widget.Chronometer
1099f021758934b35e3b842c6799344531d7ea2969daChris Wren         * @see Notification#when
1100f021758934b35e3b842c6799344531d7ea2969daChris Wren         */
1101f021758934b35e3b842c6799344531d7ea2969daChris Wren        public Builder setUsesChronometer(boolean b) {
1102f021758934b35e3b842c6799344531d7ea2969daChris Wren            mUseChronometer = b;
1103f021758934b35e3b842c6799344531d7ea2969daChris Wren            return this;
1104f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
1105f021758934b35e3b842c6799344531d7ea2969daChris Wren
1106f021758934b35e3b842c6799344531d7ea2969daChris Wren        /**
1107c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Set the small icon to use in the notification layouts.  Different classes of devices
1108c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * may return different sizes.  See the UX guidelines for more information on how to
1109c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * design these icons.
1110c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         *
1111c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * @param icon A resource ID in the application's package of the drawble to use.
1112c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
1113c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setSmallIcon(int icon) {
1114c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.icon = icon;
1115c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
1116c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
1117c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
1118c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
1119c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * A variant of {@link #setSmallIcon(int) setSmallIcon(int)} that takes an additional
1120c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * level parameter for when the icon is a {@link android.graphics.drawable.LevelListDrawable
1121c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * LevelListDrawable}.
1122c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         *
1123c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * @param icon A resource ID in the application's package of the drawble to use.
1124c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * @param level The level to use for the icon.
1125c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         *
1126c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * @see android.graphics.drawable.LevelListDrawable
1127c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
1128c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setSmallIcon(int icon, int level) {
1129c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.icon = icon;
1130c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.iconLevel = level;
1131c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
1132c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
1133c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
1134c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
1135c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Set the title (first row) of the notification, in a standard notification.
1136c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
1137c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setContentTitle(CharSequence title) {
113824c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer            mContentTitle = limitCharSequenceLength(title);
1139c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
1140c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
1141c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
1142c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
1143c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Set the text (second row) of the notification, in a standard notification.
1144c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
1145c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setContentText(CharSequence text) {
114624c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer            mContentText = limitCharSequenceLength(text);
1147c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
1148c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
1149c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
1150c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
1151884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin         * Set the third line of text in the platform notification template.
1152f021758934b35e3b842c6799344531d7ea2969daChris Wren         * Don't use if you're also using {@link #setProgress(int, int, boolean)};
1153f021758934b35e3b842c6799344531d7ea2969daChris Wren         * they occupy the same location in the standard template.
1154884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin         * <br>
1155884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin         * If the platform does not provide large-format notifications, this method has no effect.
1156884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin         * The third line of text only appears in expanded view.
1157884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin         * <br>
1158f021758934b35e3b842c6799344531d7ea2969daChris Wren         */
1159f021758934b35e3b842c6799344531d7ea2969daChris Wren        public Builder setSubText(CharSequence text) {
116024c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer            mSubText = limitCharSequenceLength(text);
1161f021758934b35e3b842c6799344531d7ea2969daChris Wren            return this;
1162f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
1163f021758934b35e3b842c6799344531d7ea2969daChris Wren
1164f021758934b35e3b842c6799344531d7ea2969daChris Wren        /**
1165aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas         * Set the remote input history.
1166aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas         *
1167aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas         * This should be set to the most recent inputs that have been sent
1168aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas         * through a {@link RemoteInput} of this Notification and cleared once the it is no
1169aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas         * longer relevant (e.g. for chat notifications once the other party has responded).
1170aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas         *
1171aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas         * The most recent input must be stored at the 0 index, the second most recent at the
1172aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas         * 1 index, etc. Note that the system will limit both how far back the inputs will be shown
1173aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas         * and how much of each individual input is shown.
1174aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas         *
1175aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas         * <p>Note: The reply text will only be shown on notifications that have least one action
1176aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas         * with a {@code RemoteInput}.</p>
1177aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas         */
1178aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas        public Builder setRemoteInputHistory(CharSequence[] text) {
1179aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas            mRemoteInputHistory = text;
1180aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas            return this;
1181aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas        }
1182aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas
1183aa9f90a465c9297207f4a52153216fa305bbafd3Aurimas Liutikas        /**
1184c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Set the large number at the right-hand side of the notification.  This is
1185c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * equivalent to setContentInfo, although it might show the number in a different
1186c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * font size for readability.
1187c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
1188c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setNumber(int number) {
1189c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNumber = number;
1190c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
1191c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
1192c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
1193c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
1194c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Set the large text at the right-hand side of the notification.
1195c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
1196c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setContentInfo(CharSequence info) {
119724c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer            mContentInfo = limitCharSequenceLength(info);
1198c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
1199c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
1200c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
1201c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
1202c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Set the progress this notification represents, which may be
1203f021758934b35e3b842c6799344531d7ea2969daChris Wren         * represented as a {@link android.widget.ProgressBar}.
1204c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
1205c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setProgress(int max, int progress, boolean indeterminate) {
1206c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mProgressMax = max;
1207c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mProgress = progress;
1208c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mProgressIndeterminate = indeterminate;
1209c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
1210f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
1211c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
1212c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
1213c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Supply a custom RemoteViews to use instead of the standard one.
1214c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
1215c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setContent(RemoteViews views) {
1216c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.contentView = views;
1217c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
1218c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
1219c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
1220c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
1221c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Supply a {@link PendingIntent} to send when the notification is clicked.
1222c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * If you do not supply an intent, you can now add PendingIntents to individual
1223c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * views to be launched when clicked by calling {@link RemoteViews#setOnClickPendingIntent
1224c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * RemoteViews.setOnClickPendingIntent(int,PendingIntent)}.  Be sure to
1225c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * read {@link Notification#contentIntent Notification.contentIntent} for
1226c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * how to correctly use this.
1227c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
1228c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setContentIntent(PendingIntent intent) {
1229c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mContentIntent = intent;
1230c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
1231c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
1232c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
1233c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
1234c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Supply a {@link PendingIntent} to send when the notification is cleared by the user
1235c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * directly from the notification panel.  For example, this intent is sent when the user
1236c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * clicks the "Clear all" button, or the individual "X" buttons on notifications.  This
1237ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * intent is not sent when the application calls
1238ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * {@link android.app.NotificationManager#cancel NotificationManager.cancel(int)}.
1239c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
1240c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setDeleteIntent(PendingIntent intent) {
1241c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.deleteIntent = intent;
1242c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
1243c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
1244c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
1245c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
1246c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * An intent to launch instead of posting the notification to the status bar.
1247c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Only for use with extremely high-priority notifications demanding the user's
1248c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * <strong>immediate</strong> attention, such as an incoming phone call or
1249c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * alarm clock that the user has explicitly set to a particular time.
1250c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * If this facility is used for something else, please give the user an option
1251c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * to turn it off and use a normal notification, as this can be extremely
1252c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * disruptive.
1253c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         *
1254e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren         * <p>
1255e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren         * On some platforms, the system UI may choose to display a heads-up notification,
1256e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren         * instead of launching this intent, while the user is using the device.
1257e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren         * </p>
1258e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren         *
1259c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * @param intent The pending intent to launch.
1260c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * @param highPriority Passing true will cause this notification to be sent
1261c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         *          even if other notifications are suppressed.
1262c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
1263c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setFullScreenIntent(PendingIntent intent, boolean highPriority) {
1264c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mFullScreenIntent = intent;
1265c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            setFlag(FLAG_HIGH_PRIORITY, highPriority);
1266c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
1267c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
1268c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
1269c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
1270c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Set the text that is displayed in the status bar when the notification first
1271c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * arrives.
1272c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
1273c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setTicker(CharSequence tickerText) {
127424c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer            mNotification.tickerText = limitCharSequenceLength(tickerText);
1275c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
1276c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
1277c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
1278c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
1279c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Set the text that is displayed in the status bar when the notification first
1280c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * arrives, and also a RemoteViews object that may be displayed instead on some
1281c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * devices.
1282c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
1283c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setTicker(CharSequence tickerText, RemoteViews views) {
128424c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer            mNotification.tickerText = limitCharSequenceLength(tickerText);
1285c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mTickerView = views;
1286c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
1287c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
1288c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
1289c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
1290c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Set the large icon that is shown in the ticker and notification.
1291c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
1292c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setLargeIcon(Bitmap icon) {
1293c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mLargeIcon = icon;
1294c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
1295c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
1296c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
1297c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
1298c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Set the sound to play.  It will play on the default stream.
1299e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren         *
1300e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren         * <p>
1301e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren         * On some platforms, a notification that is noisy is more likely to be presented
1302e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren         * as a heads-up notification.
1303e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren         * </p>
1304c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
1305c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setSound(Uri sound) {
1306c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.sound = sound;
1307c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.audioStreamType = Notification.STREAM_DEFAULT;
1308c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
1309c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
1310c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
1311c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
1312c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Set the sound to play.  It will play on the stream you supply.
1313c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         *
1314e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren         * <p>
1315e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren         * On some platforms, a notification that is noisy is more likely to be presented
1316e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren         * as a heads-up notification.
1317e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren         * </p>
1318e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren         *
1319fe3b5bac4901a4bb8cf51c09fe4910b02388818aGriff Hazen         * @see Notification#STREAM_DEFAULT
1320c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * @see AudioManager for the <code>STREAM_</code> constants.
1321c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
1322c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setSound(Uri sound, int streamType) {
1323c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.sound = sound;
1324c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.audioStreamType = streamType;
1325c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
1326c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
1327c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
1328c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
1329c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Set the vibration pattern to use.
1330c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         *
1331e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren         * <p>
1332e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren         * On some platforms, a notification that vibrates is more likely to be presented
1333e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren         * as a heads-up notification.
1334e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren         * </p>
1335e616137cc03e4b4be450cbaa4a9c29f2b77d991aChris Wren         *
1336c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * @see android.os.Vibrator for a discussion of the <code>pattern</code>
1337c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * parameter.
1338c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
1339c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setVibrate(long[] pattern) {
1340c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.vibrate = pattern;
1341c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
1342c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
1343c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
1344c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
1345ca3133e389ded7b6fd142d514523c6ebf41d6599Aurimas Liutikas         * Set the argb value that you would like the LED on the device to blink, as well as the
1346c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * rate.  The rate is specified in terms of the number of milliseconds to be on
1347c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * and then the number of milliseconds to be off.
1348c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
134970acb0c19be3831a2080e4f902324de16bfbf62eTor Norbye        public Builder setLights(@ColorInt int argb, int onMs, int offMs) {
1350c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.ledARGB = argb;
1351c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.ledOnMS = onMs;
1352c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.ledOffMS = offMs;
1353c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            boolean showLights = mNotification.ledOnMS != 0 && mNotification.ledOffMS != 0;
1354c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.flags = (mNotification.flags & ~Notification.FLAG_SHOW_LIGHTS) |
1355c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell                    (showLights ? Notification.FLAG_SHOW_LIGHTS : 0);
1356c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
1357c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
1358c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
1359c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
1360c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Set whether this is an ongoing notification.
1361c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         *
1362c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * <p>Ongoing notifications differ from regular notifications in the following ways:
1363c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * <ul>
1364c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         *   <li>Ongoing notifications are sorted above the regular notifications in the
1365c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         *   notification panel.</li>
1366c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         *   <li>Ongoing notifications do not have an 'X' close button, and are not affected
1367c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         *   by the "Clear all" button.
1368c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * </ul>
1369c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
1370c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setOngoing(boolean ongoing) {
1371c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            setFlag(Notification.FLAG_ONGOING_EVENT, ongoing);
1372c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
1373c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
1374c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
1375c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
1376c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Set this flag if you would only like the sound, vibrate
1377c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * and ticker to be played if the notification is not already showing.
1378c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
1379c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setOnlyAlertOnce(boolean onlyAlertOnce) {
1380c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            setFlag(Notification.FLAG_ONLY_ALERT_ONCE, onlyAlertOnce);
1381c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
1382c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
1383c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
1384c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
1385c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Setting this flag will make it so the notification is automatically
1386c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * canceled when the user clicks it in the panel.  The PendingIntent
1387c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * set with {@link #setDeleteIntent} will be broadcast when the notification
1388c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * is canceled.
1389c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
1390c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setAutoCancel(boolean autoCancel) {
1391c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            setFlag(Notification.FLAG_AUTO_CANCEL, autoCancel);
1392c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
1393c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
1394c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
1395c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
1396b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen         * Set whether or not this notification is only relevant to the current device.
1397b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen         *
1398b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen         * <p>Some notifications can be bridged to other devices for remote display.
1399b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen         * This hint can be set to recommend this notification not be bridged.
1400b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen         */
1401b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        public Builder setLocalOnly(boolean b) {
1402b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            mLocalOnly = b;
1403b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            return this;
1404b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        }
1405b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen
1406b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        /**
1407d3f7b5bb2422645d85b0e0131ff1c323f38bfed0John Spurlock         * Set the notification category.
1408d3f7b5bb2422645d85b0e0131ff1c323f38bfed0John Spurlock         *
1409d3f7b5bb2422645d85b0e0131ff1c323f38bfed0John Spurlock         * <p>Must be one of the predefined notification categories (see the <code>CATEGORY_*</code>
1410d3f7b5bb2422645d85b0e0131ff1c323f38bfed0John Spurlock         * constants in {@link Notification}) that best describes this notification.
1411d3f7b5bb2422645d85b0e0131ff1c323f38bfed0John Spurlock         * May be used by the system for ranking and filtering.
1412d3f7b5bb2422645d85b0e0131ff1c323f38bfed0John Spurlock         */
1413d3f7b5bb2422645d85b0e0131ff1c323f38bfed0John Spurlock        public Builder setCategory(String category) {
1414d3f7b5bb2422645d85b0e0131ff1c323f38bfed0John Spurlock            mCategory = category;
1415d3f7b5bb2422645d85b0e0131ff1c323f38bfed0John Spurlock            return this;
1416d3f7b5bb2422645d85b0e0131ff1c323f38bfed0John Spurlock        }
1417d3f7b5bb2422645d85b0e0131ff1c323f38bfed0John Spurlock
1418d3f7b5bb2422645d85b0e0131ff1c323f38bfed0John Spurlock        /**
1419c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Set the default notification options that will be used.
1420c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * <p>
1421c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * The value should be one or more of the following fields combined with
1422c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * bitwise-or:
1423c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * {@link Notification#DEFAULT_SOUND}, {@link Notification#DEFAULT_VIBRATE},
1424c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * {@link Notification#DEFAULT_LIGHTS}.
1425c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * <p>
1426c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * For all default values, use {@link Notification#DEFAULT_ALL}.
1427c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
1428c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setDefaults(int defaults) {
1429c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.defaults = defaults;
1430c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            if ((defaults & Notification.DEFAULT_LIGHTS) != 0) {
1431c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell                mNotification.flags |= Notification.FLAG_SHOW_LIGHTS;
1432c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            }
1433c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
1434c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
1435c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
1436c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        private void setFlag(int mask, boolean value) {
1437c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            if (value) {
1438c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell                mNotification.flags |= mask;
1439c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            } else {
1440c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell                mNotification.flags &= ~mask;
1441c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            }
1442c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
1443c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
1444c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
1445f021758934b35e3b842c6799344531d7ea2969daChris Wren         * Set the relative priority for this notification.
1446884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin         *
1447f021758934b35e3b842c6799344531d7ea2969daChris Wren         * Priority is an indication of how much of the user's
1448f021758934b35e3b842c6799344531d7ea2969daChris Wren         * valuable attention should be consumed by this
1449f021758934b35e3b842c6799344531d7ea2969daChris Wren         * notification. Low-priority notifications may be hidden from
1450f021758934b35e3b842c6799344531d7ea2969daChris Wren         * the user in certain situations, while the user might be
1451884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin         * interrupted for a higher-priority notification.
1452884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin         * The system sets a notification's priority based on various factors including the
1453884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin         * setPriority value. The effect may differ slightly on different platforms.
14547c94c9ad26555427345c6c540bf761bf73389016Andrew Solovay         *
14557c94c9ad26555427345c6c540bf761bf73389016Andrew Solovay         * @param pri Relative priority for this notification. Must be one of
14567c94c9ad26555427345c6c540bf761bf73389016Andrew Solovay         *     the priority constants defined by {@link NotificationCompat}.
14577c94c9ad26555427345c6c540bf761bf73389016Andrew Solovay         *     Acceptable values range from {@link
14587c94c9ad26555427345c6c540bf761bf73389016Andrew Solovay         *     NotificationCompat#PRIORITY_MIN} (-2) to {@link
14597c94c9ad26555427345c6c540bf761bf73389016Andrew Solovay         *     NotificationCompat#PRIORITY_MAX} (2).
1460f021758934b35e3b842c6799344531d7ea2969daChris Wren         */
1461f021758934b35e3b842c6799344531d7ea2969daChris Wren        public Builder setPriority(int pri) {
1462f021758934b35e3b842c6799344531d7ea2969daChris Wren            mPriority = pri;
1463f021758934b35e3b842c6799344531d7ea2969daChris Wren            return this;
1464f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
1465f021758934b35e3b842c6799344531d7ea2969daChris Wren
1466f021758934b35e3b842c6799344531d7ea2969daChris Wren        /**
1467334514fd61bd192cee3475b3ba44adb4f54a1f89Chris Wren         * Add a person that is relevant to this notification.
1468334514fd61bd192cee3475b3ba44adb4f54a1f89Chris Wren         *
146989e6774cdb200acc2dd5f4c9022a7e1aeeb05bceChris Wren         * <P>
147089e6774cdb200acc2dd5f4c9022a7e1aeeb05bceChris Wren         * Depending on user preferences, this annotation may allow the notification to pass
147189e6774cdb200acc2dd5f4c9022a7e1aeeb05bceChris Wren         * through interruption filters, and to appear more prominently in the user interface.
147289e6774cdb200acc2dd5f4c9022a7e1aeeb05bceChris Wren         * </P>
147389e6774cdb200acc2dd5f4c9022a7e1aeeb05bceChris Wren         *
147489e6774cdb200acc2dd5f4c9022a7e1aeeb05bceChris Wren         * <P>
147589e6774cdb200acc2dd5f4c9022a7e1aeeb05bceChris Wren         * The person should be specified by the {@code String} representation of a
147689e6774cdb200acc2dd5f4c9022a7e1aeeb05bceChris Wren         * {@link android.provider.ContactsContract.Contacts#CONTENT_LOOKUP_URI}.
147789e6774cdb200acc2dd5f4c9022a7e1aeeb05bceChris Wren         * </P>
147889e6774cdb200acc2dd5f4c9022a7e1aeeb05bceChris Wren         *
147989e6774cdb200acc2dd5f4c9022a7e1aeeb05bceChris Wren         * <P>The system will also attempt to resolve {@code mailto:} and {@code tel:} schema
148089e6774cdb200acc2dd5f4c9022a7e1aeeb05bceChris Wren         * URIs.  The path part of these URIs must exist in the contacts database, in the
148189e6774cdb200acc2dd5f4c9022a7e1aeeb05bceChris Wren         * appropriate column, or the reference will be discarded as invalid. Telephone schema
148289e6774cdb200acc2dd5f4c9022a7e1aeeb05bceChris Wren         * URIs will be resolved by {@link android.provider.ContactsContract.PhoneLookup}.
148389e6774cdb200acc2dd5f4c9022a7e1aeeb05bceChris Wren         * </P>
148489e6774cdb200acc2dd5f4c9022a7e1aeeb05bceChris Wren         *
148589e6774cdb200acc2dd5f4c9022a7e1aeeb05bceChris Wren         * @param uri A URI for the person.
1486334514fd61bd192cee3475b3ba44adb4f54a1f89Chris Wren         * @see Notification#EXTRA_PEOPLE
1487334514fd61bd192cee3475b3ba44adb4f54a1f89Chris Wren         */
148889e6774cdb200acc2dd5f4c9022a7e1aeeb05bceChris Wren        public Builder addPerson(String uri) {
148989e6774cdb200acc2dd5f4c9022a7e1aeeb05bceChris Wren            mPeople.add(uri);
1490334514fd61bd192cee3475b3ba44adb4f54a1f89Chris Wren            return this;
1491334514fd61bd192cee3475b3ba44adb4f54a1f89Chris Wren        }
1492334514fd61bd192cee3475b3ba44adb4f54a1f89Chris Wren
1493334514fd61bd192cee3475b3ba44adb4f54a1f89Chris Wren        /**
1494ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * Set this notification to be part of a group of notifications sharing the same key.
1495ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * Grouped notifications may display in a cluster or stack on devices which
1496ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * support such rendering.
1497ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         *
1498ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * <p>To make this notification the summary for its group, also call
1499ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * {@link #setGroupSummary}. A sort order can be specified for group members by using
1500ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * {@link #setSortKey}.
1501ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * @param groupKey The group key of the group.
1502ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * @return this object for method chaining
1503ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         */
1504ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        public Builder setGroup(String groupKey) {
1505ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            mGroupKey = groupKey;
1506ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return this;
1507ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        }
1508ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
1509ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        /**
1510ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * Set this notification to be the group summary for a group of notifications.
1511ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * Grouped notifications may display in a cluster or stack on devices which
1512ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * support such rendering. Requires a group key also be set using {@link #setGroup}.
1513ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * @param isGroupSummary Whether this notification should be a group summary.
1514ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * @return this object for method chaining
1515ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         */
1516ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        public Builder setGroupSummary(boolean isGroupSummary) {
1517ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            mGroupSummary = isGroupSummary;
1518ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return this;
1519ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        }
1520ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
1521ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        /**
1522ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * Set a sort key that orders this notification among other notifications from the
1523ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * same package. This can be useful if an external sort was already applied and an app
1524ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * would like to preserve this. Notifications will be sorted lexicographically using this
1525ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * value, although providing different priorities in addition to providing sort key may
1526ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * cause this value to be ignored.
1527ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         *
1528ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * <p>This sort key can also be used to order members of a notification group. See
1529ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * {@link Builder#setGroup}.
1530ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         *
1531ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * @see String#compareTo(String)
1532ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         */
1533ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        public Builder setSortKey(String sortKey) {
1534ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            mSortKey = sortKey;
1535ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return this;
1536ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        }
1537ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
1538ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        /**
1539ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         * Merge additional metadata into this notification.
1540ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         *
1541ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         * <p>Values within the Bundle will replace existing extras values in this Builder.
1542ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         *
1543ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         * @see Notification#extras
1544ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         */
1545300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        public Builder addExtras(Bundle extras) {
1546300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            if (extras != null) {
1547300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen                if (mExtras == null) {
1548300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen                    mExtras = new Bundle(extras);
1549300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen                } else {
1550300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen                    mExtras.putAll(extras);
1551300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen                }
1552ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen            }
1553ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen            return this;
1554ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen        }
1555ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen
1556ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen        /**
1557ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         * Set metadata for this notification.
1558ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         *
1559ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         * <p>A reference to the Bundle is held for the lifetime of this Builder, and the Bundle's
1560ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         * current contents are copied into the Notification each time {@link #build()} is
1561ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         * called.
1562ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         *
1563ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         * <p>Replaces any existing extras values with those from the provided Bundle.
1564ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         * Use {@link #addExtras} to merge in metadata instead.
1565ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         *
1566ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         * @see Notification#extras
1567ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         */
1568300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        public Builder setExtras(Bundle extras) {
1569300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            mExtras = extras;
1570ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen            return this;
1571ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen        }
1572ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen
1573ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen        /**
1574ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         * Get the current metadata Bundle used by this notification Builder.
1575ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         *
1576ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         * <p>The returned Bundle is shared with this Builder.
1577ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         *
1578ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         * <p>The current contents of this Bundle are copied into the Notification each time
1579ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         * {@link #build()} is called.
1580ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         *
1581ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         * @see Notification#extras
1582ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen         */
1583ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen        public Bundle getExtras() {
1584ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen            if (mExtras == null) {
1585ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen                mExtras = new Bundle();
1586ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen            }
1587ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen            return mExtras;
1588ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen        }
1589ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen
1590ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen        /**
1591f021758934b35e3b842c6799344531d7ea2969daChris Wren         * Add an action to this notification. Actions are typically displayed by
1592f021758934b35e3b842c6799344531d7ea2969daChris Wren         * the system as a button adjacent to the notification content.
1593884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin         * <br>
1594884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin         * Action buttons won't appear on platforms prior to Android 4.1. Action
1595884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin         * buttons depend on expanded notifications, which are only available in Android 4.1
1596884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin         * and later. To ensure that an action button's functionality is always available, first
1597884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin         * implement the functionality in the {@link android.app.Activity} that starts when a user
1598884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin         * clicks the  notification (see {@link #setContentIntent setContentIntent()}), and then
1599884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin         * enhance the notification by implementing the same functionality with
1600884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin         * {@link #addAction addAction()}.
1601f021758934b35e3b842c6799344531d7ea2969daChris Wren         *
1602f021758934b35e3b842c6799344531d7ea2969daChris Wren         * @param icon Resource ID of a drawable that represents the action.
1603f021758934b35e3b842c6799344531d7ea2969daChris Wren         * @param title Text describing the action.
1604884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin         * @param intent {@link android.app.PendingIntent} to be fired when the action is invoked.
1605f021758934b35e3b842c6799344531d7ea2969daChris Wren         */
1606f021758934b35e3b842c6799344531d7ea2969daChris Wren        public Builder addAction(int icon, CharSequence title, PendingIntent intent) {
1607f021758934b35e3b842c6799344531d7ea2969daChris Wren            mActions.add(new Action(icon, title, intent));
1608f021758934b35e3b842c6799344531d7ea2969daChris Wren            return this;
1609f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
1610f021758934b35e3b842c6799344531d7ea2969daChris Wren
1611f021758934b35e3b842c6799344531d7ea2969daChris Wren        /**
1612300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen         * Add an action to this notification. Actions are typically displayed by
1613300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen         * the system as a button adjacent to the notification content.
1614300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen         * <br>
1615300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen         * Action buttons won't appear on platforms prior to Android 4.1. Action
1616300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen         * buttons depend on expanded notifications, which are only available in Android 4.1
1617300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen         * and later. To ensure that an action button's functionality is always available, first
1618300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen         * implement the functionality in the {@link android.app.Activity} that starts when a user
1619300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen         * clicks the  notification (see {@link #setContentIntent setContentIntent()}), and then
1620300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen         * enhance the notification by implementing the same functionality with
1621300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen         * {@link #addAction addAction()}.
1622300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen         *
1623300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen         * @param action The action to add.
1624300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen         */
1625300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        public Builder addAction(Action action) {
1626300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            mActions.add(action);
1627300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            return this;
1628300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        }
1629300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
1630300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        /**
1631f021758934b35e3b842c6799344531d7ea2969daChris Wren         * Add a rich notification style to be applied at build time.
1632884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin         * <br>
1633884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin         * If the platform does not provide rich notification styles, this method has no effect. The
1634884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin         * user will always see the normal notification style.
1635f021758934b35e3b842c6799344531d7ea2969daChris Wren         *
1636f021758934b35e3b842c6799344531d7ea2969daChris Wren         * @param style Object responsible for modifying the notification style.
1637f021758934b35e3b842c6799344531d7ea2969daChris Wren         */
1638f021758934b35e3b842c6799344531d7ea2969daChris Wren        public Builder setStyle(Style style) {
1639f021758934b35e3b842c6799344531d7ea2969daChris Wren            if (mStyle != style) {
1640f021758934b35e3b842c6799344531d7ea2969daChris Wren                mStyle = style;
1641f021758934b35e3b842c6799344531d7ea2969daChris Wren                if (mStyle != null) {
1642f021758934b35e3b842c6799344531d7ea2969daChris Wren                    mStyle.setBuilder(this);
1643f021758934b35e3b842c6799344531d7ea2969daChris Wren                }
1644f021758934b35e3b842c6799344531d7ea2969daChris Wren            }
1645f021758934b35e3b842c6799344531d7ea2969daChris Wren            return this;
1646f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
1647f021758934b35e3b842c6799344531d7ea2969daChris Wren
1648f021758934b35e3b842c6799344531d7ea2969daChris Wren        /**
164969a58d36f6ed8ec4d076534556aba2f93d00254eDan Sandler         * Sets {@link Notification#color}.
165069a58d36f6ed8ec4d076534556aba2f93d00254eDan Sandler         *
165169a58d36f6ed8ec4d076534556aba2f93d00254eDan Sandler         * @param argb The accent color to use
165269a58d36f6ed8ec4d076534556aba2f93d00254eDan Sandler         *
165369a58d36f6ed8ec4d076534556aba2f93d00254eDan Sandler         * @return The same Builder.
165469a58d36f6ed8ec4d076534556aba2f93d00254eDan Sandler         */
165570acb0c19be3831a2080e4f902324de16bfbf62eTor Norbye        public Builder setColor(@ColorInt int argb) {
165669a58d36f6ed8ec4d076534556aba2f93d00254eDan Sandler            mColor = argb;
165769a58d36f6ed8ec4d076534556aba2f93d00254eDan Sandler            return this;
165869a58d36f6ed8ec4d076534556aba2f93d00254eDan Sandler        }
165969a58d36f6ed8ec4d076534556aba2f93d00254eDan Sandler
166069a58d36f6ed8ec4d076534556aba2f93d00254eDan Sandler        /**
1661df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler         * Sets {@link Notification#visibility}.
1662df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler         *
1663df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler         * @param visibility One of {@link Notification#VISIBILITY_PRIVATE} (the default),
1664df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler         *                   {@link Notification#VISIBILITY_PUBLIC}, or
1665df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler         *                   {@link Notification#VISIBILITY_SECRET}.
1666df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler         */
1667df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler        public Builder setVisibility(int visibility) {
1668df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler            mVisibility = visibility;
1669df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler            return this;
1670df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler        }
1671df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler
1672df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler        /**
1673df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler         * Supply a replacement Notification whose contents should be shown in insecure contexts
1674df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler         * (i.e. atop the secure lockscreen). See {@link Notification#visibility} and
1675df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler         * {@link #VISIBILITY_PUBLIC}.
1676df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler         *
1677df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler         * @param n A replacement notification, presumably with some or all info redacted.
1678df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler         * @return The same Builder.
1679df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler         */
1680df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler        public Builder setPublicVersion(Notification n) {
1681df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler            mPublicVersion = n;
1682df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler            return this;
1683df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler        }
1684df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler
1685df2eaed1544ecba7a4a258061e58aa93692d4a6aDan Sandler        /**
1686c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds         * Supply custom RemoteViews to use instead of the platform template.
1687c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds         *
1688c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds         * This will override the layout that would otherwise be constructed by this Builder
1689c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds         * object.
1690c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds         */
1691c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds        public Builder setCustomContentView(RemoteViews contentView) {
1692c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds            mContentView = contentView;
1693c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds            return this;
1694c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds        }
1695c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds
1696c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds        /**
1697c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds         * Supply custom RemoteViews to use instead of the platform template in the expanded form.
1698c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds         *
1699c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds         * This will override the expanded layout that would otherwise be constructed by this
1700c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds         * Builder object.
1701c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds         *
1702c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds         * No-op on versions prior to {@link android.os.Build.VERSION_CODES#JELLY_BEAN}.
1703c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds         */
1704c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds        public Builder setCustomBigContentView(RemoteViews contentView) {
1705c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds            mBigContentView = contentView;
1706c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds            return this;
1707c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds        }
1708c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds
1709c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds        /**
1710c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds         * Supply custom RemoteViews to use instead of the platform template in the heads up dialog.
1711c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds         *
1712c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds         * This will override the heads-up layout that would otherwise be constructed by this
1713c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds         * Builder object.
1714c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds         *
1715c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds         * No-op on versions prior to {@link android.os.Build.VERSION_CODES#LOLLIPOP}.
1716c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds         */
1717c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds        public Builder setCustomHeadsUpContentView(RemoteViews contentView) {
1718c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds            mHeadsUpContentView = contentView;
1719c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds            return this;
1720c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds        }
1721c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds
1722c158ac834fd71f19bbbdadc71de0d64c99b5d84aJulia Reynolds        /**
1723ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * Apply an extender to this notification builder. Extenders may be used to add
1724ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * metadata or change options on this builder.
1725ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         */
17262bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public Builder extend(Extender extender) {
17272bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            extender.extend(this);
1728ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return this;
1729ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        }
1730ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
1731ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        /**
1732f021758934b35e3b842c6799344531d7ea2969daChris Wren         * @deprecated Use {@link #build()} instead.
1733f021758934b35e3b842c6799344531d7ea2969daChris Wren         */
1734f021758934b35e3b842c6799344531d7ea2969daChris Wren        @Deprecated
1735f021758934b35e3b842c6799344531d7ea2969daChris Wren        public Notification getNotification() {
173610d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi            return build();
1737f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
1738f021758934b35e3b842c6799344531d7ea2969daChris Wren
1739f021758934b35e3b842c6799344531d7ea2969daChris Wren        /**
1740c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Combine all of the options that have been set and return a new {@link Notification}
1741c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * object.
1742c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
1743f021758934b35e3b842c6799344531d7ea2969daChris Wren        public Notification build() {
174410d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi            return IMPL.build(this, getExtender());
174510d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi        }
174610d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi
174710d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi        /**
174810d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi         * @hide
174910d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi         */
1750c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viverette        @RestrictTo(GROUP_ID)
175110d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi        protected BuilderExtender getExtender() {
175210d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi            return new BuilderExtender();
1753f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
175424c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer
175524c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer        protected static CharSequence limitCharSequenceLength(CharSequence cs) {
175624c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer            if (cs == null) return cs;
175724c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer            if (cs.length() > MAX_CHARSEQUENCE_LENGTH) {
175824c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer                cs = cs.subSequence(0, MAX_CHARSEQUENCE_LENGTH);
175924c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer            }
176024c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer            return cs;
176124c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer        }
17623b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek
17633b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek        /**
17643b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek         * @hide
17653b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek         */
1766c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viverette        @RestrictTo(GROUP_ID)
17673b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek        public RemoteViews getContentView() {
17683b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek            return mContentView;
17693b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek        }
17703b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek
17713b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek        /**
17723b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek         * @hide
17733b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek         */
1774c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viverette        @RestrictTo(GROUP_ID)
17753b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek        public RemoteViews getBigContentView() {
17763b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek            return mBigContentView;
17773b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek        }
17783b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek
17793b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek        /**
17803b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek         * @hide
17813b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek         */
1782c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viverette        @RestrictTo(GROUP_ID)
17833b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek        public RemoteViews getHeadsUpContentView() {
17843b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek            return mHeadsUpContentView;
17853b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek        }
17863b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek
17873b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek        /**
17883b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek         * return when if it is showing or 0 otherwise
17893b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek         *
17903b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek         * @hide
17913b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek         */
1792c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viverette        @RestrictTo(GROUP_ID)
17933b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek        public long getWhenIfShowing() {
17943b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek            return mShowWhen ? mNotification.when : 0;
17953b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek        }
17963b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek
17973b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek        /**
17983b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek         * @return the priority set on the notification
17993b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek         *
18003b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek         * @hide
18013b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek         */
1802c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viverette        @RestrictTo(GROUP_ID)
18033b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek        public int getPriority() {
18043b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek            return mPriority;
18053b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek        }
18063b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek
18073b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek        /**
18083b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek         * @return the color of the notification
18093b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek         *
18103b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek         * @hide
18113b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek         */
1812c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viverette        @RestrictTo(GROUP_ID)
18133b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek        public int getColor() {
18143b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek            return mColor;
18153b3e1c4da1c0a710a74204a6ba44389a6f26b27aSelim Cinek        }
1816cd40090290dbd6f81ea40592bb8c699bb03ab931Selim Cinek
1817cd40090290dbd6f81ea40592bb8c699bb03ab931Selim Cinek
1818cd40090290dbd6f81ea40592bb8c699bb03ab931Selim Cinek        /**
1819cd40090290dbd6f81ea40592bb8c699bb03ab931Selim Cinek         * @return the text of the notification
1820cd40090290dbd6f81ea40592bb8c699bb03ab931Selim Cinek         *
1821cd40090290dbd6f81ea40592bb8c699bb03ab931Selim Cinek         * @hide
1822cd40090290dbd6f81ea40592bb8c699bb03ab931Selim Cinek         */
1823c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viverette        @RestrictTo(GROUP_ID)
1824cd40090290dbd6f81ea40592bb8c699bb03ab931Selim Cinek        protected CharSequence resolveText() {
1825cd40090290dbd6f81ea40592bb8c699bb03ab931Selim Cinek            return mContentText;
1826cd40090290dbd6f81ea40592bb8c699bb03ab931Selim Cinek        }
1827cd40090290dbd6f81ea40592bb8c699bb03ab931Selim Cinek
1828cd40090290dbd6f81ea40592bb8c699bb03ab931Selim Cinek        /**
1829cd40090290dbd6f81ea40592bb8c699bb03ab931Selim Cinek         * @return the title of the notification
1830cd40090290dbd6f81ea40592bb8c699bb03ab931Selim Cinek         *
1831cd40090290dbd6f81ea40592bb8c699bb03ab931Selim Cinek         * @hide
1832cd40090290dbd6f81ea40592bb8c699bb03ab931Selim Cinek         */
1833c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viverette        @RestrictTo(GROUP_ID)
1834cd40090290dbd6f81ea40592bb8c699bb03ab931Selim Cinek        protected CharSequence resolveTitle() {
1835cd40090290dbd6f81ea40592bb8c699bb03ab931Selim Cinek            return mContentTitle;
1836cd40090290dbd6f81ea40592bb8c699bb03ab931Selim Cinek        }
1837f021758934b35e3b842c6799344531d7ea2969daChris Wren    }
1838f021758934b35e3b842c6799344531d7ea2969daChris Wren
1839f021758934b35e3b842c6799344531d7ea2969daChris Wren    /**
1840f021758934b35e3b842c6799344531d7ea2969daChris Wren     * An object that can apply a rich notification style to a {@link Notification.Builder}
1841f021758934b35e3b842c6799344531d7ea2969daChris Wren     * object.
1842884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * <br>
1843884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * If the platform does not provide rich notification styles, methods in this class have no
1844884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * effect.
1845f021758934b35e3b842c6799344531d7ea2969daChris Wren     */
1846fe3b5bac4901a4bb8cf51c09fe4910b02388818aGriff Hazen    public static abstract class Style {
1847f021758934b35e3b842c6799344531d7ea2969daChris Wren        Builder mBuilder;
1848f021758934b35e3b842c6799344531d7ea2969daChris Wren        CharSequence mBigContentTitle;
1849f021758934b35e3b842c6799344531d7ea2969daChris Wren        CharSequence mSummaryText;
1850f021758934b35e3b842c6799344531d7ea2969daChris Wren        boolean mSummaryTextSet = false;
1851f021758934b35e3b842c6799344531d7ea2969daChris Wren
1852f021758934b35e3b842c6799344531d7ea2969daChris Wren        public void setBuilder(Builder builder) {
1853f021758934b35e3b842c6799344531d7ea2969daChris Wren            if (mBuilder != builder) {
1854f021758934b35e3b842c6799344531d7ea2969daChris Wren                mBuilder = builder;
1855f021758934b35e3b842c6799344531d7ea2969daChris Wren                if (mBuilder != null) {
1856f021758934b35e3b842c6799344531d7ea2969daChris Wren                    mBuilder.setStyle(this);
1857f021758934b35e3b842c6799344531d7ea2969daChris Wren                }
1858f021758934b35e3b842c6799344531d7ea2969daChris Wren            }
1859f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
1860f021758934b35e3b842c6799344531d7ea2969daChris Wren
1861f021758934b35e3b842c6799344531d7ea2969daChris Wren        public Notification build() {
1862f021758934b35e3b842c6799344531d7ea2969daChris Wren            Notification notification = null;
1863f021758934b35e3b842c6799344531d7ea2969daChris Wren            if (mBuilder != null) {
1864f021758934b35e3b842c6799344531d7ea2969daChris Wren                notification = mBuilder.build();
1865884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin            }
1866f021758934b35e3b842c6799344531d7ea2969daChris Wren            return notification;
1867f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
186843cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills
186943cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills        /**
187043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills         * @hide
187143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills         */
1872c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viverette        @RestrictTo(GROUP_ID)
187343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills        // TODO: implement for all styles
187443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills        public void addCompatExtras(Bundle extras) {
187543cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills        }
187643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills
187743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills        /**
187843cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills         * @hide
187943cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills         */
1880c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viverette        @RestrictTo(GROUP_ID)
188143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills        // TODO: implement for all styles
188243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills        protected void restoreFromCompatExtras(Bundle extras) {
188343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills        }
1884f021758934b35e3b842c6799344531d7ea2969daChris Wren    }
1885f021758934b35e3b842c6799344531d7ea2969daChris Wren
1886f021758934b35e3b842c6799344531d7ea2969daChris Wren    /**
1887f021758934b35e3b842c6799344531d7ea2969daChris Wren     * Helper class for generating large-format notifications that include a large image attachment.
1888884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * <br>
1889884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * If the platform does not provide large-format notifications, this method has no effect. The
1890884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * user will always see the normal notification view.
1891884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * <br>
1892f021758934b35e3b842c6799344531d7ea2969daChris Wren     * This class is a "rebuilder": It attaches to a Builder object and modifies its behavior, like so:
1893f021758934b35e3b842c6799344531d7ea2969daChris Wren     * <pre class="prettyprint">
189477b88e3651ede1a5d45fb4c19f34b2f78d67f33fRobert Ly     * Notification notif = new Notification.Builder(mContext)
1895f021758934b35e3b842c6799344531d7ea2969daChris Wren     *     .setContentTitle(&quot;New photo from &quot; + sender.toString())
1896f021758934b35e3b842c6799344531d7ea2969daChris Wren     *     .setContentText(subject)
1897f021758934b35e3b842c6799344531d7ea2969daChris Wren     *     .setSmallIcon(R.drawable.new_post)
1898f021758934b35e3b842c6799344531d7ea2969daChris Wren     *     .setLargeIcon(aBitmap)
1899f021758934b35e3b842c6799344531d7ea2969daChris Wren     *     .setStyle(new Notification.BigPictureStyle()
1900f021758934b35e3b842c6799344531d7ea2969daChris Wren     *         .bigPicture(aBigBitmap))
1901f021758934b35e3b842c6799344531d7ea2969daChris Wren     *     .build();
1902f021758934b35e3b842c6799344531d7ea2969daChris Wren     * </pre>
1903884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     *
1904f021758934b35e3b842c6799344531d7ea2969daChris Wren     * @see Notification#bigContentView
1905f021758934b35e3b842c6799344531d7ea2969daChris Wren     */
1906f021758934b35e3b842c6799344531d7ea2969daChris Wren    public static class BigPictureStyle extends Style {
1907f021758934b35e3b842c6799344531d7ea2969daChris Wren        Bitmap mPicture;
190849714d665f839c4804a17eea129092f8b472926dRoman Nurik        Bitmap mBigLargeIcon;
190949714d665f839c4804a17eea129092f8b472926dRoman Nurik        boolean mBigLargeIconSet;
1910f021758934b35e3b842c6799344531d7ea2969daChris Wren
1911f021758934b35e3b842c6799344531d7ea2969daChris Wren        public BigPictureStyle() {
1912f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
1913f021758934b35e3b842c6799344531d7ea2969daChris Wren
1914f021758934b35e3b842c6799344531d7ea2969daChris Wren        public BigPictureStyle(Builder builder) {
1915f021758934b35e3b842c6799344531d7ea2969daChris Wren            setBuilder(builder);
1916f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
1917f021758934b35e3b842c6799344531d7ea2969daChris Wren
1918f021758934b35e3b842c6799344531d7ea2969daChris Wren        /**
1919f021758934b35e3b842c6799344531d7ea2969daChris Wren         * Overrides ContentTitle in the big form of the template.
1920f021758934b35e3b842c6799344531d7ea2969daChris Wren         * This defaults to the value passed to setContentTitle().
1921f021758934b35e3b842c6799344531d7ea2969daChris Wren         */
1922f021758934b35e3b842c6799344531d7ea2969daChris Wren        public BigPictureStyle setBigContentTitle(CharSequence title) {
192324c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer            mBigContentTitle = Builder.limitCharSequenceLength(title);
1924f021758934b35e3b842c6799344531d7ea2969daChris Wren            return this;
1925f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
1926f021758934b35e3b842c6799344531d7ea2969daChris Wren
1927f021758934b35e3b842c6799344531d7ea2969daChris Wren        /**
1928f021758934b35e3b842c6799344531d7ea2969daChris Wren         * Set the first line of text after the detail section in the big form of the template.
1929f021758934b35e3b842c6799344531d7ea2969daChris Wren         */
1930f021758934b35e3b842c6799344531d7ea2969daChris Wren        public BigPictureStyle setSummaryText(CharSequence cs) {
193124c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer            mSummaryText = Builder.limitCharSequenceLength(cs);
1932f021758934b35e3b842c6799344531d7ea2969daChris Wren            mSummaryTextSet = true;
1933f021758934b35e3b842c6799344531d7ea2969daChris Wren            return this;
1934f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
1935f021758934b35e3b842c6799344531d7ea2969daChris Wren
1936b41a213761ff07de2fcfdaf16790fdcca1a1ee1bChris Wren        /**
1937b41a213761ff07de2fcfdaf16790fdcca1a1ee1bChris Wren         * Provide the bitmap to be used as the payload for the BigPicture notification.
1938b41a213761ff07de2fcfdaf16790fdcca1a1ee1bChris Wren         */
1939f021758934b35e3b842c6799344531d7ea2969daChris Wren        public BigPictureStyle bigPicture(Bitmap b) {
1940f021758934b35e3b842c6799344531d7ea2969daChris Wren            mPicture = b;
1941f021758934b35e3b842c6799344531d7ea2969daChris Wren            return this;
1942f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
194349714d665f839c4804a17eea129092f8b472926dRoman Nurik
194449714d665f839c4804a17eea129092f8b472926dRoman Nurik        /**
194549714d665f839c4804a17eea129092f8b472926dRoman Nurik         * Override the large icon when the big notification is shown.
194649714d665f839c4804a17eea129092f8b472926dRoman Nurik         */
194749714d665f839c4804a17eea129092f8b472926dRoman Nurik        public BigPictureStyle bigLargeIcon(Bitmap b) {
194849714d665f839c4804a17eea129092f8b472926dRoman Nurik            mBigLargeIcon = b;
194949714d665f839c4804a17eea129092f8b472926dRoman Nurik            mBigLargeIconSet = true;
195049714d665f839c4804a17eea129092f8b472926dRoman Nurik            return this;
195149714d665f839c4804a17eea129092f8b472926dRoman Nurik        }
1952f021758934b35e3b842c6799344531d7ea2969daChris Wren    }
1953f021758934b35e3b842c6799344531d7ea2969daChris Wren
1954f021758934b35e3b842c6799344531d7ea2969daChris Wren    /**
1955f021758934b35e3b842c6799344531d7ea2969daChris Wren     * Helper class for generating large-format notifications that include a lot of text.
1956884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     *
1957884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * <br>
1958884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * If the platform does not provide large-format notifications, this method has no effect. The
1959884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * user will always see the normal notification view.
1960884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * <br>
1961f021758934b35e3b842c6799344531d7ea2969daChris Wren     * This class is a "rebuilder": It attaches to a Builder object and modifies its behavior, like so:
1962f021758934b35e3b842c6799344531d7ea2969daChris Wren     * <pre class="prettyprint">
196377b88e3651ede1a5d45fb4c19f34b2f78d67f33fRobert Ly     * Notification notif = new Notification.Builder(mContext)
1964f021758934b35e3b842c6799344531d7ea2969daChris Wren     *     .setContentTitle(&quot;New mail from &quot; + sender.toString())
1965f021758934b35e3b842c6799344531d7ea2969daChris Wren     *     .setContentText(subject)
1966f021758934b35e3b842c6799344531d7ea2969daChris Wren     *     .setSmallIcon(R.drawable.new_mail)
1967f021758934b35e3b842c6799344531d7ea2969daChris Wren     *     .setLargeIcon(aBitmap)
1968f021758934b35e3b842c6799344531d7ea2969daChris Wren     *     .setStyle(new Notification.BigTextStyle()
1969f021758934b35e3b842c6799344531d7ea2969daChris Wren     *         .bigText(aVeryLongString))
1970f021758934b35e3b842c6799344531d7ea2969daChris Wren     *     .build();
1971f021758934b35e3b842c6799344531d7ea2969daChris Wren     * </pre>
1972884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     *
1973f021758934b35e3b842c6799344531d7ea2969daChris Wren     * @see Notification#bigContentView
1974f021758934b35e3b842c6799344531d7ea2969daChris Wren     */
1975f021758934b35e3b842c6799344531d7ea2969daChris Wren    public static class BigTextStyle extends Style {
1976f021758934b35e3b842c6799344531d7ea2969daChris Wren        CharSequence mBigText;
1977f021758934b35e3b842c6799344531d7ea2969daChris Wren
1978f021758934b35e3b842c6799344531d7ea2969daChris Wren        public BigTextStyle() {
1979f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
1980f021758934b35e3b842c6799344531d7ea2969daChris Wren
1981f021758934b35e3b842c6799344531d7ea2969daChris Wren        public BigTextStyle(Builder builder) {
1982f021758934b35e3b842c6799344531d7ea2969daChris Wren            setBuilder(builder);
1983f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
1984f021758934b35e3b842c6799344531d7ea2969daChris Wren
1985f021758934b35e3b842c6799344531d7ea2969daChris Wren        /**
1986f021758934b35e3b842c6799344531d7ea2969daChris Wren         * Overrides ContentTitle in the big form of the template.
1987f021758934b35e3b842c6799344531d7ea2969daChris Wren         * This defaults to the value passed to setContentTitle().
1988f021758934b35e3b842c6799344531d7ea2969daChris Wren         */
1989f021758934b35e3b842c6799344531d7ea2969daChris Wren        public BigTextStyle setBigContentTitle(CharSequence title) {
199024c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer            mBigContentTitle = Builder.limitCharSequenceLength(title);
1991f021758934b35e3b842c6799344531d7ea2969daChris Wren            return this;
1992f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
1993f021758934b35e3b842c6799344531d7ea2969daChris Wren
1994f021758934b35e3b842c6799344531d7ea2969daChris Wren        /**
1995f021758934b35e3b842c6799344531d7ea2969daChris Wren         * Set the first line of text after the detail section in the big form of the template.
1996f021758934b35e3b842c6799344531d7ea2969daChris Wren         */
1997f021758934b35e3b842c6799344531d7ea2969daChris Wren        public BigTextStyle setSummaryText(CharSequence cs) {
199824c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer            mSummaryText = Builder.limitCharSequenceLength(cs);
1999f021758934b35e3b842c6799344531d7ea2969daChris Wren            mSummaryTextSet = true;
2000f021758934b35e3b842c6799344531d7ea2969daChris Wren            return this;
2001f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
2002f021758934b35e3b842c6799344531d7ea2969daChris Wren
2003b41a213761ff07de2fcfdaf16790fdcca1a1ee1bChris Wren        /**
2004b41a213761ff07de2fcfdaf16790fdcca1a1ee1bChris Wren         * Provide the longer text to be displayed in the big form of the
2005b41a213761ff07de2fcfdaf16790fdcca1a1ee1bChris Wren         * template in place of the content text.
2006b41a213761ff07de2fcfdaf16790fdcca1a1ee1bChris Wren         */
2007f021758934b35e3b842c6799344531d7ea2969daChris Wren        public BigTextStyle bigText(CharSequence cs) {
200824c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer            mBigText = Builder.limitCharSequenceLength(cs);
2009f021758934b35e3b842c6799344531d7ea2969daChris Wren            return this;
2010f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
2011f021758934b35e3b842c6799344531d7ea2969daChris Wren    }
2012f021758934b35e3b842c6799344531d7ea2969daChris Wren
2013f021758934b35e3b842c6799344531d7ea2969daChris Wren    /**
201443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills     * Helper class for generating large-format notifications that include multiple back-and-forth
201543cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills     * messages of varying types between any number of people.
201643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills     *
201743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills     * <br>
2018cd40090290dbd6f81ea40592bb8c699bb03ab931Selim Cinek     * In order to get a backwards compatible behavior, the app needs to use the v7 version of the
2019cd40090290dbd6f81ea40592bb8c699bb03ab931Selim Cinek     * notification builder together with this style, otherwise the user will see the normal
2020cd40090290dbd6f81ea40592bb8c699bb03ab931Selim Cinek     * notification view.
202143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills     * <br>
202243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills     * This class is a "rebuilder": It attaches to a Builder object and modifies its behavior, like
202343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills     * so:
202443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills     * <pre class="prettyprint">
202543cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills     *
202643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills     * Notification noti = new Notification.Builder()
202743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills     *     .setContentTitle(&quot;2 new messages wtih &quot; + sender.toString())
202843cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills     *     .setContentText(subject)
202943cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills     *     .setSmallIcon(R.drawable.new_message)
203043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills     *     .setLargeIcon(aBitmap)
203143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills     *     .setStyle(new Notification.MessagingStyle(resources.getString(R.string.reply_name))
203243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills     *         .addMessage(messages[0].getText(), messages[0].getTime(), messages[0].getSender())
203343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills     *         .addMessage(messages[1].getText(), messages[1].getTime(), messages[1].getSender()))
203443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills     *     .build();
203543cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills     * </pre>
203643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills     */
203743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills    public static class MessagingStyle extends Style {
203843cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills
203943cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills        /**
204043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills         * The maximum number of messages that will be retained in the Notification itself (the
204143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills         * number displayed is up to the platform).
204243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills         */
204343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills        public static final int MAXIMUM_RETAINED_MESSAGES = 25;
204443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills
204543cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills        CharSequence mUserDisplayName;
204643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills        CharSequence mConversationTitle;
204743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills        List<Message> mMessages = new ArrayList<>();
204843cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills
204943cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills        MessagingStyle() {
205043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills        }
205143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills
205243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills        /**
20535c45c3ad1a128403b8ec12c3f29b9e5f17764821Alex Hills         * @param userDisplayName Required - the name to be displayed for any replies sent by the
20545c45c3ad1a128403b8ec12c3f29b9e5f17764821Alex Hills         * user before the posting app reposts the notification with those messages after they've
20555c45c3ad1a128403b8ec12c3f29b9e5f17764821Alex Hills         * been actually sent and in previous messages sent by the user added in
205643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills         * {@link #addMessage(Message)}
205743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills         */
20585c45c3ad1a128403b8ec12c3f29b9e5f17764821Alex Hills        public MessagingStyle(@NonNull CharSequence userDisplayName) {
205943cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            mUserDisplayName = userDisplayName;
206043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills        }
206143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills
206243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills        /**
206343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills         * Returns the name to be displayed for any replies sent by the user
206443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills         */
206543cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills        public CharSequence getUserDisplayName() {
206643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            return mUserDisplayName;
206743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills        }
206843cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills
206943cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills        /**
207043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills         * Sets the title to be displayed on this conversation. This should only be used for
207143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills         * group messaging and left unset for one-on-one conversations.
207243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills         * @param conversationTitle
207343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills         * @return this object for method chaining.
207443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills         */
207543cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills        public MessagingStyle setConversationTitle(CharSequence conversationTitle) {
207643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            mConversationTitle = conversationTitle;
207743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            return this;
207843cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills        }
207943cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills
208043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills        /**
208143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills         * Return the title to be displayed on this conversation. Can be <code>null</code> and
208243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills         * should be for one-on-one conversations
208343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills         */
208443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills        public CharSequence getConversationTitle() {
208543cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            return mConversationTitle;
208643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills        }
208743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills
208843cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills        /**
208943cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills         * Adds a message for display by this notification. Convenience call for a simple
209043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills         * {@link Message} in {@link #addMessage(Message)}
209143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills         * @param text A {@link CharSequence} to be displayed as the message content
209243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills         * @param timestamp Time at which the message arrived
209343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills         * @param sender A {@link CharSequence} to be used for displaying the name of the
209443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills         * sender. Should be <code>null</code> for messages by the current user, in which case
209543cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills         * the platform will insert {@link #getUserDisplayName()}.
209643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills         * Should be unique amongst all individuals in the conversation, and should be
209743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills         * consistent during re-posts of the notification.
209843cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills         *
209943cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills         * @see Message#Message(CharSequence, long, CharSequence)
210043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills         *
210143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills         * @return this object for method chaining
210243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills         */
210343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills        public MessagingStyle addMessage(CharSequence text, long timestamp, CharSequence sender) {
210443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            mMessages.add(new Message(text, timestamp, sender));
210543cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            if (mMessages.size() > MAXIMUM_RETAINED_MESSAGES) {
210643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills                mMessages.remove(0);
210743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            }
210843cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            return this;
210943cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills        }
211043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills
211143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills        /**
211243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills         * Adds a {@link Message} for display in this notification.
211343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills         * @param message The {@link Message} to be displayed
211443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills         * @return this object for method chaining
211543cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills         */
211643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills        public MessagingStyle addMessage(Message message) {
211743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            mMessages.add(message);
211843cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            if (mMessages.size() > MAXIMUM_RETAINED_MESSAGES) {
211943cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills                mMessages.remove(0);
212043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            }
212143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            return this;
212243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills        }
212343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills
212443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills        /**
212543cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills         * Gets the list of {@code Message} objects that represent the notification
212643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills         */
212743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills        public List<Message> getMessages() {
212843cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            return mMessages;
212943cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills        }
213043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills
2131c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills        /**
2132c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills         * Retrieves a {@link MessagingStyle} from a {@link Notification}, enabling an application
2133c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills         * that has set a {@link MessagingStyle} using {@link NotificationCompat} or
2134c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills         * {@link android.app.Notification.Builder} to send messaging information to another
2135c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills         * application using {@link NotificationCompat}, regardless of the API level of the system.
2136c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills         * Returns {@code null} if there is no {@link MessagingStyle} set.
2137c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills         */
2138c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills        public static MessagingStyle extractMessagingStyleFromNotification(Notification notif) {
2139c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills            MessagingStyle style;
2140c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills            Bundle extras = IMPL.getExtras(notif);
2141c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills            if (!extras.containsKey(EXTRA_SELF_DISPLAY_NAME)) {
2142c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills                style = null;
2143c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills            } else {
2144c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills                try {
2145c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills                    style = new MessagingStyle();
2146c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills                    style.restoreFromCompatExtras(extras);
2147c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills                } catch (ClassCastException e) {
2148c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills                    style = null;
2149c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills                }
2150c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills            }
2151c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills            return style;
2152c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills        }
2153c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills
215443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills        @Override
215543cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills        public void addCompatExtras(Bundle extras) {
215643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            super.addCompatExtras(extras);
215743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            if (mUserDisplayName != null) {
215843cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills                extras.putCharSequence(EXTRA_SELF_DISPLAY_NAME, mUserDisplayName);
215943cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            }
216043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            if (mConversationTitle != null) {
216143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills                extras.putCharSequence(EXTRA_CONVERSATION_TITLE, mConversationTitle);
216243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            }
216343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            if (!mMessages.isEmpty()) { extras.putParcelableArray(EXTRA_MESSAGES,
216443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills                    Message.getBundleArrayForMessages(mMessages));
216543cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            }
216643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills        }
216743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills
216843cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills        /**
216943cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills         * @hide
217043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills         */
2171c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viverette        @RestrictTo(GROUP_ID)
217243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills        @Override
217343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills        protected void restoreFromCompatExtras(Bundle extras) {
217443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            mMessages.clear();
217543cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            mUserDisplayName = extras.getString(EXTRA_SELF_DISPLAY_NAME);
217643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            mConversationTitle = extras.getString(EXTRA_CONVERSATION_TITLE);
217743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            Parcelable[] parcelables = extras.getParcelableArray(EXTRA_MESSAGES);
21783503d49de59151a0c2fc972e6a8fdc6e9966dffeAdrian Roos            if (parcelables != null) {
21793503d49de59151a0c2fc972e6a8fdc6e9966dffeAdrian Roos                mMessages = Message.getMessagesFromBundleArray(parcelables);
218043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            }
218143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills        }
218243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills
218343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills        public static final class Message {
218443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills
2185c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills            static final String KEY_TEXT = "text";
2186c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills            static final String KEY_TIMESTAMP = "time";
2187c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills            static final String KEY_SENDER = "sender";
2188c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills            static final String KEY_DATA_MIME_TYPE = "type";
2189c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills            static final String KEY_DATA_URI= "uri";
219043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills
219143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            private final CharSequence mText;
219243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            private final long mTimestamp;
219343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            private final CharSequence mSender;
219443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills
219543cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            private String mDataMimeType;
219643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            private Uri mDataUri;
219743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills
219843cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            /**
219943cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills             * Constructor
220043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills             * @param text A {@link CharSequence} to be displayed as the message content
220143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills             * @param timestamp Time at which the message arrived
220243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills             * @param sender A {@link CharSequence} to be used for displaying the name of the
220343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills             * sender. Should be <code>null</code> for messages by the current user, in which case
220443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills             * the platform will insert {@link MessagingStyle#getUserDisplayName()}.
220543cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills             * Should be unique amongst all individuals in the conversation, and should be
220643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills             * consistent during re-posts of the notification.
220743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills             */
220843cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            public Message(CharSequence text, long timestamp, CharSequence sender){
220943cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills                mText = text;
221043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills                mTimestamp = timestamp;
221143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills                mSender = sender;
221243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            }
221343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills
221443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            /**
221543cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills             * Sets a binary blob of data and an associated MIME type for a message. In the case
221643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills             * where the platform doesn't support the MIME type, the original text provided in the
221743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills             * constructor will be used.
221843cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills             * @param dataMimeType The MIME type of the content. See
221943cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills             * <a href="{@docRoot}notifications/messaging.html"> for the list of supported MIME
222043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills             * types on Android and Android Wear.
222143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills             * @param dataUri The uri containing the content whose type is given by the MIME type.
222243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills             * <p class="note">
222343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills             * <ol>
222443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills             *   <li>Notification Listeners including the System UI need permission to access the
222543cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills             *       data the Uri points to. The recommended ways to do this are:</li>
222643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills             *   <li>Store the data in your own ContentProvider, making sure that other apps have
222743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills             *       the correct permission to access your provider. The preferred mechanism for
222843cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills             *       providing access is to use per-URI permissions which are temporary and only
222943cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills             *       grant access to the receiving application. An easy way to create a
223043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills             *       ContentProvider like this is to use the FileProvider helper class.</li>
223143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills             *   <li>Use the system MediaStore. The MediaStore is primarily aimed at video, audio
223243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills             *       and image MIME types, however beginning with Android 3.0 (API level 11) it can
223343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills             *       also store non-media types (see MediaStore.Files for more info). Files can be
223443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills             *       inserted into the MediaStore using scanFile() after which a content:// style
223543cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills             *       Uri suitable for sharing is passed to the provided onScanCompleted() callback.
223643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills             *       Note that once added to the system MediaStore the content is accessible to any
223743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills             *       app on the device.</li>
223843cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills             * </ol>
223943cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills             * @return this object for method chaining
224043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills             */
224143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            public Message setData(String dataMimeType, Uri dataUri) {
224243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills                mDataMimeType = dataMimeType;
224343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills                mDataUri = dataUri;
224443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills                return this;
224543cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            }
224643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills
224743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            /**
224843cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills             * Get the text to be used for this message, or the fallback text if a type and content
224943cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills             * Uri have been set
225043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills             */
225143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            public CharSequence getText() {
225243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills                return mText;
225343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            }
225443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills
225543cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            /**
225643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills             * Get the time at which this message arrived
225743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills             */
225843cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            public long getTimestamp() {
225943cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills                return mTimestamp;
226043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            }
226143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills
226243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            /**
226343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills             * Get the text used to display the contact's name in the messaging experience
226443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills             */
226543cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            public CharSequence getSender() {
226643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills                return mSender;
226743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            }
226843cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills
226943cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            /**
227043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills             * Get the MIME type of the data pointed to by the Uri
227143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills             */
227243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            public String getDataMimeType() {
227343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills                return mDataMimeType;
227443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            }
227543cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills
227643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            /**
227743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills             * Get the the Uri pointing to the content of the message. Can be null, in which case
227843cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills             * {@see #getText()} is used.
227943cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills             */
228043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            public Uri getDataUri() {
228143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills                return mDataUri;
228243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            }
228343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills
2284c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills            private Bundle toBundle() {
228543cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills                Bundle bundle = new Bundle();
228643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills                if (mText != null) {
228743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills                    bundle.putCharSequence(KEY_TEXT, mText);
228843cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills                }
228943cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills                bundle.putLong(KEY_TIMESTAMP, mTimestamp);
229043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills                if (mSender != null) {
229143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills                    bundle.putCharSequence(KEY_SENDER, mSender);
229243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills                }
229343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills                if (mDataMimeType != null) {
229443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills                    bundle.putString(KEY_DATA_MIME_TYPE, mDataMimeType);
229543cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills                }
229643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills                if (mDataUri != null) {
229743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills                    bundle.putParcelable(KEY_DATA_URI, mDataUri);
229843cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills                }
229943cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills                return bundle;
230043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            }
230143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills
230243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            static Bundle[] getBundleArrayForMessages(List<Message> messages) {
230343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills                Bundle[] bundles = new Bundle[messages.size()];
2304c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills                final int N = messages.size();
2305c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills                for (int i = 0; i < N; i++) {
230643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills                    bundles[i] = messages.get(i).toBundle();
230743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills                }
230843cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills                return bundles;
230943cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            }
231043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills
23113503d49de59151a0c2fc972e6a8fdc6e9966dffeAdrian Roos            static List<Message> getMessagesFromBundleArray(Parcelable[] bundles) {
231243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills                List<Message> messages = new ArrayList<>(bundles.length);
231343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills                for (int i = 0; i < bundles.length; i++) {
23143503d49de59151a0c2fc972e6a8fdc6e9966dffeAdrian Roos                    if (bundles[i] instanceof Bundle) {
23153503d49de59151a0c2fc972e6a8fdc6e9966dffeAdrian Roos                        Message message = getMessageFromBundle((Bundle)bundles[i]);
23163503d49de59151a0c2fc972e6a8fdc6e9966dffeAdrian Roos                        if (message != null) {
23173503d49de59151a0c2fc972e6a8fdc6e9966dffeAdrian Roos                            messages.add(message);
23183503d49de59151a0c2fc972e6a8fdc6e9966dffeAdrian Roos                        }
2319c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills                    }
232043cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills                }
232143cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills                return messages;
232243cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills            }
2323c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills
2324c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills            static Message getMessageFromBundle(Bundle bundle) {
2325c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills                try {
232676e0c28c0b99134694c4bd8ae3a5367ee5efbb0dAdrian Roos                    if (!bundle.containsKey(KEY_TEXT) || !bundle.containsKey(KEY_TIMESTAMP)) {
2327c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills                        return null;
2328c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills                    } else {
2329c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills                        Message message = new Message(bundle.getCharSequence(KEY_TEXT),
2330c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills                                bundle.getLong(KEY_TIMESTAMP), bundle.getCharSequence(KEY_SENDER));
2331c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills                        if (bundle.containsKey(KEY_DATA_MIME_TYPE) &&
2332c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills                                bundle.containsKey(KEY_DATA_URI)) {
2333c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills
2334c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills                            message.setData(bundle.getString(KEY_DATA_MIME_TYPE),
2335c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills                                    (Uri) bundle.getParcelable(KEY_DATA_URI));
2336c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills                        }
2337c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills                        return message;
2338c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills                    }
2339c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills                } catch (ClassCastException e) {
2340c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills                    return null;
2341c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills                }
2342c226c509cb0b085027f4dbf3f5cac297fa31b375Alex Hills            }
234343cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills        }
234443cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills    }
234543cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills
234643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills    /**
2347f021758934b35e3b842c6799344531d7ea2969daChris Wren     * Helper class for generating large-format notifications that include a list of (up to 5) strings.
2348884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     *
2349884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * <br>
2350884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * If the platform does not provide large-format notifications, this method has no effect. The
2351884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * user will always see the normal notification view.
2352884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     * <br>
2353f021758934b35e3b842c6799344531d7ea2969daChris Wren     * This class is a "rebuilder": It attaches to a Builder object and modifies its behavior, like so:
2354f021758934b35e3b842c6799344531d7ea2969daChris Wren     * <pre class="prettyprint">
2355f021758934b35e3b842c6799344531d7ea2969daChris Wren     * Notification noti = new Notification.Builder()
2356f021758934b35e3b842c6799344531d7ea2969daChris Wren     *     .setContentTitle(&quot;5 New mails from &quot; + sender.toString())
2357f021758934b35e3b842c6799344531d7ea2969daChris Wren     *     .setContentText(subject)
2358f021758934b35e3b842c6799344531d7ea2969daChris Wren     *     .setSmallIcon(R.drawable.new_mail)
2359f021758934b35e3b842c6799344531d7ea2969daChris Wren     *     .setLargeIcon(aBitmap)
2360f021758934b35e3b842c6799344531d7ea2969daChris Wren     *     .setStyle(new Notification.InboxStyle()
2361f021758934b35e3b842c6799344531d7ea2969daChris Wren     *         .addLine(str1)
2362f021758934b35e3b842c6799344531d7ea2969daChris Wren     *         .addLine(str2)
2363f021758934b35e3b842c6799344531d7ea2969daChris Wren     *         .setContentTitle(&quot;&quot;)
2364f021758934b35e3b842c6799344531d7ea2969daChris Wren     *         .setSummaryText(&quot;+3 more&quot;))
2365f021758934b35e3b842c6799344531d7ea2969daChris Wren     *     .build();
2366f021758934b35e3b842c6799344531d7ea2969daChris Wren     * </pre>
2367884c97b0015a71381bc2a534438b2a0e7e7abd6aJoe Malin     *
2368f021758934b35e3b842c6799344531d7ea2969daChris Wren     * @see Notification#bigContentView
2369f021758934b35e3b842c6799344531d7ea2969daChris Wren     */
2370f021758934b35e3b842c6799344531d7ea2969daChris Wren    public static class InboxStyle extends Style {
2371f021758934b35e3b842c6799344531d7ea2969daChris Wren        ArrayList<CharSequence> mTexts = new ArrayList<CharSequence>();
2372f021758934b35e3b842c6799344531d7ea2969daChris Wren
2373f021758934b35e3b842c6799344531d7ea2969daChris Wren        public InboxStyle() {
2374f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
2375f021758934b35e3b842c6799344531d7ea2969daChris Wren
2376f021758934b35e3b842c6799344531d7ea2969daChris Wren        public InboxStyle(Builder builder) {
2377f021758934b35e3b842c6799344531d7ea2969daChris Wren            setBuilder(builder);
2378f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
2379f021758934b35e3b842c6799344531d7ea2969daChris Wren
2380f021758934b35e3b842c6799344531d7ea2969daChris Wren        /**
2381f021758934b35e3b842c6799344531d7ea2969daChris Wren         * Overrides ContentTitle in the big form of the template.
2382f021758934b35e3b842c6799344531d7ea2969daChris Wren         * This defaults to the value passed to setContentTitle().
2383f021758934b35e3b842c6799344531d7ea2969daChris Wren         */
2384f021758934b35e3b842c6799344531d7ea2969daChris Wren        public InboxStyle setBigContentTitle(CharSequence title) {
238524c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer            mBigContentTitle = Builder.limitCharSequenceLength(title);
2386f021758934b35e3b842c6799344531d7ea2969daChris Wren            return this;
2387f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
2388f021758934b35e3b842c6799344531d7ea2969daChris Wren
2389f021758934b35e3b842c6799344531d7ea2969daChris Wren        /**
2390f021758934b35e3b842c6799344531d7ea2969daChris Wren         * Set the first line of text after the detail section in the big form of the template.
2391f021758934b35e3b842c6799344531d7ea2969daChris Wren         */
2392f021758934b35e3b842c6799344531d7ea2969daChris Wren        public InboxStyle setSummaryText(CharSequence cs) {
239324c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer            mSummaryText = Builder.limitCharSequenceLength(cs);
2394f021758934b35e3b842c6799344531d7ea2969daChris Wren            mSummaryTextSet = true;
2395f021758934b35e3b842c6799344531d7ea2969daChris Wren            return this;
2396f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
2397f021758934b35e3b842c6799344531d7ea2969daChris Wren
2398b41a213761ff07de2fcfdaf16790fdcca1a1ee1bChris Wren        /**
2399b41a213761ff07de2fcfdaf16790fdcca1a1ee1bChris Wren         * Append a line to the digest section of the Inbox notification.
2400b41a213761ff07de2fcfdaf16790fdcca1a1ee1bChris Wren         */
2401f021758934b35e3b842c6799344531d7ea2969daChris Wren        public InboxStyle addLine(CharSequence cs) {
240224c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer            mTexts.add(Builder.limitCharSequenceLength(cs));
2403f021758934b35e3b842c6799344531d7ea2969daChris Wren            return this;
2404f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
2405f021758934b35e3b842c6799344531d7ea2969daChris Wren    }
2406f021758934b35e3b842c6799344531d7ea2969daChris Wren
2407300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen    /**
2408300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen     * Structure to encapsulate a named action that can be shown as part of this notification.
2409300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen     * It must include an icon, a label, and a {@link PendingIntent} to be fired when the action is
2410300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen     * selected by the user. Action buttons won't appear on platforms prior to Android 4.1.
2411300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen     * <p>
2412300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen     * Apps should use {@link NotificationCompat.Builder#addAction(int, CharSequence, PendingIntent)}
2413300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen     * or {@link NotificationCompat.Builder#addAction(NotificationCompat.Action)}
2414300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen     * to attach actions.
2415300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen     */
2416ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    public static class Action extends NotificationCompatBase.Action {
2417552766fa685c63ad760c92239faaba12e6ad51f1Aurimas Liutikas        final Bundle mExtras;
24182bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private final RemoteInput[] mRemoteInputs;
2419300828fd69bd2bfcefaf54795d03492938efd971Alex Hills        private boolean mAllowGeneratedReplies = false;
2420300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
2421300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        /**
2422300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen         * Small icon representing the action.
2423300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen         */
2424f021758934b35e3b842c6799344531d7ea2969daChris Wren        public int icon;
2425300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        /**
2426300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen         * Title of the action.
2427300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen         */
2428f021758934b35e3b842c6799344531d7ea2969daChris Wren        public CharSequence title;
2429300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        /**
2430300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen         * Intent to send when the user invokes this action. May be null, in which case the action
2431300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen         * may be rendered in a disabled presentation.
2432300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen         */
2433f021758934b35e3b842c6799344531d7ea2969daChris Wren        public PendingIntent actionIntent;
2434f021758934b35e3b842c6799344531d7ea2969daChris Wren
2435300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        public Action(int icon, CharSequence title, PendingIntent intent) {
2436300828fd69bd2bfcefaf54795d03492938efd971Alex Hills            this(icon, title, intent, new Bundle(), null, false);
2437300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        }
2438300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
2439552766fa685c63ad760c92239faaba12e6ad51f1Aurimas Liutikas        Action(int icon, CharSequence title, PendingIntent intent, Bundle extras,
2440300828fd69bd2bfcefaf54795d03492938efd971Alex Hills                RemoteInput[] remoteInputs, boolean allowGeneratedReplies) {
2441300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            this.icon = icon;
244224c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer            this.title = NotificationCompat.Builder.limitCharSequenceLength(title);
2443300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            this.actionIntent = intent;
2444300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            this.mExtras = extras != null ? extras : new Bundle();
2445ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            this.mRemoteInputs = remoteInputs;
2446300828fd69bd2bfcefaf54795d03492938efd971Alex Hills            this.mAllowGeneratedReplies = allowGeneratedReplies;
2447ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        }
2448ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
2449ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        @Override
245010d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi        public int getIcon() {
2451ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return icon;
2452ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        }
2453ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
2454ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        @Override
245510d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi        public CharSequence getTitle() {
2456ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return title;
2457ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        }
2458ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
2459ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        @Override
246010d7d250bc41b21059a90095e8b693c9e7bc3bc3Jorim Jaggi        public PendingIntent getActionIntent() {
2461ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return actionIntent;
2462300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        }
2463300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
2464300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        /**
2465300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen         * Get additional metadata carried around with this Action.
2466300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen         */
24678eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song        @Override
2468300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        public Bundle getExtras() {
2469300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            return mExtras;
2470300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        }
2471300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
2472300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        /**
2473300828fd69bd2bfcefaf54795d03492938efd971Alex Hills         * Return whether the platform should automatically generate possible replies for this
2474300828fd69bd2bfcefaf54795d03492938efd971Alex Hills         * {@link Action}
2475300828fd69bd2bfcefaf54795d03492938efd971Alex Hills         */
2476300828fd69bd2bfcefaf54795d03492938efd971Alex Hills        @Override
2477300828fd69bd2bfcefaf54795d03492938efd971Alex Hills        public boolean getAllowGeneratedReplies() {
2478300828fd69bd2bfcefaf54795d03492938efd971Alex Hills            return mAllowGeneratedReplies;
2479300828fd69bd2bfcefaf54795d03492938efd971Alex Hills        }
2480300828fd69bd2bfcefaf54795d03492938efd971Alex Hills
2481300828fd69bd2bfcefaf54795d03492938efd971Alex Hills        /**
2482ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * Get the list of inputs to be collected from the user when this action is sent.
2483ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         * May return null if no remote inputs were added.
2484ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen         */
24858eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song        @Override
2486ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        public RemoteInput[] getRemoteInputs() {
2487ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return mRemoteInputs;
2488ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        }
2489ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
2490ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        /**
2491300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen         * Builder class for {@link Action} objects.
2492300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen         */
2493ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        public static final class Builder {
2494300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            private final int mIcon;
2495300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            private final CharSequence mTitle;
2496300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            private final PendingIntent mIntent;
2497300828fd69bd2bfcefaf54795d03492938efd971Alex Hills            private boolean mAllowGeneratedReplies;
2498300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            private final Bundle mExtras;
2499ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            private ArrayList<RemoteInput> mRemoteInputs;
2500300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
2501300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            /**
2502300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen             * Construct a new builder for {@link Action} object.
2503300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen             * @param icon icon to show for this action
2504300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen             * @param title the title of the action
2505300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen             * @param intent the {@link PendingIntent} to fire when users trigger this action
2506300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen             */
2507300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            public Builder(int icon, CharSequence title, PendingIntent intent) {
2508300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen                this(icon, title, intent, new Bundle());
2509300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            }
2510300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
2511300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            /**
2512300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen             * Construct a new builder for {@link Action} object using the fields from an
2513300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen             * {@link Action}.
2514300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen             * @param action the action to read fields from.
2515300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen             */
2516300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            public Builder(Action action) {
2517300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen                this(action.icon, action.title, action.actionIntent, new Bundle(action.mExtras));
2518300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            }
2519300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
2520300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            private Builder(int icon, CharSequence title, PendingIntent intent, Bundle extras) {
2521300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen                mIcon = icon;
252224c306a957c2c0de030d87269bb28b19d7bd7100Christoph Studer                mTitle = NotificationCompat.Builder.limitCharSequenceLength(title);
2523300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen                mIntent = intent;
2524300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen                mExtras = extras;
2525300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            }
2526300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
2527300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            /**
2528300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen             * Merge additional metadata into this builder.
2529300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen             *
2530300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen             * <p>Values within the Bundle will replace existing extras values in this Builder.
2531300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen             *
2532300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen             * @see NotificationCompat.Action#getExtras
2533300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen             */
2534300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            public Builder addExtras(Bundle extras) {
2535300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen                if (extras != null) {
2536300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen                    mExtras.putAll(extras);
2537300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen                }
2538300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen                return this;
2539300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            }
2540300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
2541300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            /**
2542300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen             * Get the metadata Bundle used by this Builder.
2543300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen             *
2544300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen             * <p>The returned Bundle is shared with this Builder.
2545300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen             */
2546300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            public Bundle getExtras() {
2547300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen                return mExtras;
2548300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            }
2549300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
2550300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            /**
2551ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen             * Add an input to be collected from the user when this action is sent.
2552ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen             * Response values can be retrieved from the fired intent by using the
2553ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen             * {@link RemoteInput#getResultsFromIntent} function.
2554ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen             * @param remoteInput a {@link RemoteInput} to add to the action
2555ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen             * @return this object for method chaining
2556ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen             */
2557ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            public Builder addRemoteInput(RemoteInput remoteInput) {
2558ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                if (mRemoteInputs == null) {
2559ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                    mRemoteInputs = new ArrayList<RemoteInput>();
2560ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                }
2561ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                mRemoteInputs.add(remoteInput);
2562ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                return this;
2563ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            }
2564ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
2565ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            /**
2566300828fd69bd2bfcefaf54795d03492938efd971Alex Hills             * Set whether the platform should automatically generate possible replies to add to
2567300828fd69bd2bfcefaf54795d03492938efd971Alex Hills             * {@link RemoteInput#getChoices()}. If the {@link Action} doesn't have a
2568300828fd69bd2bfcefaf54795d03492938efd971Alex Hills             * {@link RemoteInput}, this has no effect.
2569300828fd69bd2bfcefaf54795d03492938efd971Alex Hills             * @param allowGeneratedReplies {@code true} to allow generated replies, {@code false}
2570300828fd69bd2bfcefaf54795d03492938efd971Alex Hills             * otherwise
2571300828fd69bd2bfcefaf54795d03492938efd971Alex Hills             * @return this object for method chaining
2572300828fd69bd2bfcefaf54795d03492938efd971Alex Hills             * The default value is {@code false}
2573300828fd69bd2bfcefaf54795d03492938efd971Alex Hills             */
2574300828fd69bd2bfcefaf54795d03492938efd971Alex Hills            public Builder setAllowGeneratedReplies(boolean allowGeneratedReplies) {
2575300828fd69bd2bfcefaf54795d03492938efd971Alex Hills                mAllowGeneratedReplies = allowGeneratedReplies;
2576300828fd69bd2bfcefaf54795d03492938efd971Alex Hills                return this;
2577300828fd69bd2bfcefaf54795d03492938efd971Alex Hills            }
2578300828fd69bd2bfcefaf54795d03492938efd971Alex Hills
2579300828fd69bd2bfcefaf54795d03492938efd971Alex Hills            /**
2580ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen             * Apply an extender to this action builder. Extenders may be used to add
2581ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen             * metadata or change options on this builder.
2582ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen             */
25832bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            public Builder extend(Extender extender) {
25842bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                extender.extend(this);
2585ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                return this;
2586ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            }
2587ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
2588ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            /**
2589300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen             * Combine all of the options that have been set and return a new {@link Action}
2590300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen             * object.
2591300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen             * @return the built action
2592300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen             */
2593300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            public Action build() {
2594ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                RemoteInput[] remoteInputs = mRemoteInputs != null
2595ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                        ? mRemoteInputs.toArray(new RemoteInput[mRemoteInputs.size()]) : null;
2596300828fd69bd2bfcefaf54795d03492938efd971Alex Hills                return new Action(mIcon, mTitle, mIntent, mExtras, remoteInputs,
2597300828fd69bd2bfcefaf54795d03492938efd971Alex Hills                        mAllowGeneratedReplies);
2598300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen            }
2599300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        }
2600300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
26012bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
26022bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
26032bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Extender interface for use with {@link Builder#extend}. Extenders may be used to add
26042bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * metadata or change options on an action builder.
26052bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
26062bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public interface Extender {
26072bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            /**
26082bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             * Apply this extender to a notification action builder.
26092bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             * @param builder the builder to be modified.
26102bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             * @return the build object for chaining.
26112bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             */
26122bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            public Builder extend(Builder builder);
26132bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
26142bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
26152bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
26162bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Wearable extender for notification actions. To add extensions to an action,
26172bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * create a new {@link NotificationCompat.Action.WearableExtender} object using
26182bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * the {@code WearableExtender()} constructor and apply it to a
26192bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * {@link NotificationCompat.Action.Builder} using
26202bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * {@link NotificationCompat.Action.Builder#extend}.
26212bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         *
26222bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * <pre class="prettyprint">
26232bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * NotificationCompat.Action action = new NotificationCompat.Action.Builder(
26242bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         *         R.drawable.archive_all, "Archive all", actionIntent)
262533176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         *         .extend(new NotificationCompat.Action.WearableExtender()
26262bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         *                 .setAvailableOffline(false))
262733176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         *         .build();</pre>
26282bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
26292bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public static final class WearableExtender implements Extender {
26302bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            /** Notification action extra which contains wearable extensions */
26312bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            private static final String EXTRA_WEARABLE_EXTENSIONS = "android.wearable.EXTENSIONS";
26322bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
26331cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast            // Keys within EXTRA_WEARABLE_EXTENSIONS for wearable options.
26342bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            private static final String KEY_FLAGS = "flags";
26351cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast            private static final String KEY_IN_PROGRESS_LABEL = "inProgressLabel";
26361cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast            private static final String KEY_CONFIRM_LABEL = "confirmLabel";
26371cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast            private static final String KEY_CANCEL_LABEL = "cancelLabel";
26382bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
26392bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            // Flags bitwise-ored to mFlags
26402bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            private static final int FLAG_AVAILABLE_OFFLINE = 0x1;
2641e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills            private static final int FLAG_HINT_LAUNCHES_ACTIVITY = 1 << 1;
26426dd2db03b7cde79c5f61ba08ac5387e8c8395513Alex Hills            private static final int FLAG_HINT_DISPLAY_INLINE = 1 << 2;
26432bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
26442bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            // Default value for flags integer
26452bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            private static final int DEFAULT_FLAGS = FLAG_AVAILABLE_OFFLINE;
26462bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
26472bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            private int mFlags = DEFAULT_FLAGS;
26482bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
26491cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast            private CharSequence mInProgressLabel;
26501cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast            private CharSequence mConfirmLabel;
26511cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast            private CharSequence mCancelLabel;
26521cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast
26532bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            /**
26542bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             * Create a {@link NotificationCompat.Action.WearableExtender} with default
26552bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             * options.
26562bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             */
26572bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            public WearableExtender() {
26582bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            }
26592bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
26602bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            /**
26612bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             * Create a {@link NotificationCompat.Action.WearableExtender} by reading
26622bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             * wearable options present in an existing notification action.
26632bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             * @param action the notification action to inspect.
26642bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             */
26652bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            public WearableExtender(Action action) {
26662bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                Bundle wearableBundle = action.getExtras().getBundle(EXTRA_WEARABLE_EXTENSIONS);
26672bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                if (wearableBundle != null) {
26682bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                    mFlags = wearableBundle.getInt(KEY_FLAGS, DEFAULT_FLAGS);
26691cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast                    mInProgressLabel = wearableBundle.getCharSequence(KEY_IN_PROGRESS_LABEL);
26701cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast                    mConfirmLabel = wearableBundle.getCharSequence(KEY_CONFIRM_LABEL);
26711cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast                    mCancelLabel = wearableBundle.getCharSequence(KEY_CANCEL_LABEL);
26722bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                }
26732bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            }
26742bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
26752bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            /**
26762bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             * Apply wearable extensions to a notification action that is being built. This is
26772bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             * typically called by the {@link NotificationCompat.Action.Builder#extend}
26782bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             * method of {@link NotificationCompat.Action.Builder}.
26792bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             */
26802bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            @Override
26812bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            public Action.Builder extend(Action.Builder builder) {
26822bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                Bundle wearableBundle = new Bundle();
26832bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
26842bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                if (mFlags != DEFAULT_FLAGS) {
26852bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                    wearableBundle.putInt(KEY_FLAGS, mFlags);
26862bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                }
26871cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast                if (mInProgressLabel != null) {
26881cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast                    wearableBundle.putCharSequence(KEY_IN_PROGRESS_LABEL, mInProgressLabel);
26891cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast                }
26901cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast                if (mConfirmLabel != null) {
26911cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast                    wearableBundle.putCharSequence(KEY_CONFIRM_LABEL, mConfirmLabel);
26921cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast                }
26931cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast                if (mCancelLabel != null) {
26941cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast                    wearableBundle.putCharSequence(KEY_CANCEL_LABEL, mCancelLabel);
26951cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast                }
26962bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
26972bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                builder.getExtras().putBundle(EXTRA_WEARABLE_EXTENSIONS, wearableBundle);
26982bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                return builder;
26992bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            }
27002bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
27012bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            @Override
27022bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            public WearableExtender clone() {
27032bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                WearableExtender that = new WearableExtender();
27042bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                that.mFlags = this.mFlags;
27051cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast                that.mInProgressLabel = this.mInProgressLabel;
27061cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast                that.mConfirmLabel = this.mConfirmLabel;
27071cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast                that.mCancelLabel = this.mCancelLabel;
27082bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                return that;
27092bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            }
27102bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
27112bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            /**
27122bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             * Set whether this action is available when the wearable device is not connected to
27132bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             * a companion device. The user can still trigger this action when the wearable device
27142bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             * is offline, but a visual hint will indicate that the action may not be available.
27152bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             * Defaults to true.
27162bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             */
27172bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            public WearableExtender setAvailableOffline(boolean availableOffline) {
27182bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                setFlag(FLAG_AVAILABLE_OFFLINE, availableOffline);
27192bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                return this;
27202bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            }
27212bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
27222bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            /**
27232bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             * Get whether this action is available when the wearable device is not connected to
27242bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             * a companion device. The user can still trigger this action when the wearable device
27252bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             * is offline, but a visual hint will indicate that the action may not be available.
27262bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             * Defaults to true.
27272bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen             */
27282bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            public boolean isAvailableOffline() {
27292bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                return (mFlags & FLAG_AVAILABLE_OFFLINE) != 0;
27302bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            }
27312bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
27322bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            private void setFlag(int mask, boolean value) {
27332bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                if (value) {
27342bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                    mFlags |= mask;
27352bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                } else {
27362bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                    mFlags &= ~mask;
27372bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                }
27382bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            }
27391cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast
27401cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast            /**
27411cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast             * Set a label to display while the wearable is preparing to automatically execute the
27421cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast             * action. This is usually a 'ing' verb ending in ellipsis like "Sending..."
27431cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast             *
27441cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast             * @param label the label to display while the action is being prepared to execute
27451cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast             * @return this object for method chaining
27461cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast             */
27471cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast            public WearableExtender setInProgressLabel(CharSequence label) {
27481cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast                mInProgressLabel = label;
27491cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast                return this;
27501cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast            }
27511cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast
27521cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast            /**
27531cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast             * Get the label to display while the wearable is preparing to automatically execute
27541cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast             * the action. This is usually a 'ing' verb ending in ellipsis like "Sending..."
27551cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast             *
27561cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast             * @return the label to display while the action is being prepared to execute
27571cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast             */
27581cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast            public CharSequence getInProgressLabel() {
27591cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast                return mInProgressLabel;
27601cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast            }
27611cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast
27621cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast            /**
27631cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast             * Set a label to display to confirm that the action should be executed.
27641cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast             * This is usually an imperative verb like "Send".
27651cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast             *
27661cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast             * @param label the label to confirm the action should be executed
27671cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast             * @return this object for method chaining
27681cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast             */
27691cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast            public WearableExtender setConfirmLabel(CharSequence label) {
27701cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast                mConfirmLabel = label;
27711cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast                return this;
27721cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast            }
27731cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast
27741cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast            /**
27751cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast             * Get the label to display to confirm that the action should be executed.
27761cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast             * This is usually an imperative verb like "Send".
27771cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast             *
27781cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast             * @return the label to confirm the action should be executed
27791cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast             */
27801cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast            public CharSequence getConfirmLabel() {
27811cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast                return mConfirmLabel;
27821cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast            }
27831cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast
27841cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast            /**
27851cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast             * Set a label to display to cancel the action.
27861cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast             * This is usually an imperative verb, like "Cancel".
27871cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast             *
27881cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast             * @param label the label to display to cancel the action
27891cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast             * @return this object for method chaining
27901cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast             */
27911cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast            public WearableExtender setCancelLabel(CharSequence label) {
27921cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast                mCancelLabel = label;
27931cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast                return this;
27941cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast            }
27951cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast
27961cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast            /**
27971cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast             * Get the label to display to cancel the action.
27981cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast             * This is usually an imperative verb like "Cancel".
27991cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast             *
28001cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast             * @return the label to display to cancel the action
28011cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast             */
28021cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast            public CharSequence getCancelLabel() {
28031cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast                return mCancelLabel;
28041cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast            }
2805e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills
2806e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills            /**
2807e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills             * Set a hint that this Action will launch an {@link Activity} directly, telling the
2808e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills             * platform that it can generate the appropriate transitions.
2809e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills             * @param hintLaunchesActivity {@code true} if the content intent will launch
2810e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills             * an activity and transitions should be generated, false otherwise.
2811e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills             * @return this object for method chaining
2812e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills             */
2813e487f46ffcf6026b2b8e1c5220e3a86067a85e90Alex Hills            public WearableExtender setHintLaunchesActivity(
2814e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills                    boolean hintLaunchesActivity) {
2815e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills                setFlag(FLAG_HINT_LAUNCHES_ACTIVITY, hintLaunchesActivity);
2816e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills                return this;
2817e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills            }
2818e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills
2819e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills            /**
2820e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills             * Get a hint that this Action will launch an {@link Activity} directly, telling the
2821e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills             * platform that it can generate the appropriate transitions
2822e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills             * @return {@code true} if the content intent will launch an activity and transitions
2823e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills             * should be generated, false otherwise. The default value is {@code false} if this was
2824e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills             * never set.
2825e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills             */
2826e487f46ffcf6026b2b8e1c5220e3a86067a85e90Alex Hills            public boolean getHintLaunchesActivity() {
2827e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills                return (mFlags & FLAG_HINT_LAUNCHES_ACTIVITY) != 0;
2828e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills            }
28296dd2db03b7cde79c5f61ba08ac5387e8c8395513Alex Hills
28306dd2db03b7cde79c5f61ba08ac5387e8c8395513Alex Hills            /**
28312847bad82ad07175d98912009b22838d47cd8376Alex Hills             * Set a hint that this Action should be displayed inline - i.e. it will have a visual
28322847bad82ad07175d98912009b22838d47cd8376Alex Hills             * representation directly on the notification surface in addition to the expanded
28332847bad82ad07175d98912009b22838d47cd8376Alex Hills             * Notification
28346dd2db03b7cde79c5f61ba08ac5387e8c8395513Alex Hills             *
28356dd2db03b7cde79c5f61ba08ac5387e8c8395513Alex Hills             * @param hintDisplayInline {@code true} if action should be displayed inline, false
28366dd2db03b7cde79c5f61ba08ac5387e8c8395513Alex Hills             *        otherwise
28376dd2db03b7cde79c5f61ba08ac5387e8c8395513Alex Hills             * @return this object for method chaining
28386dd2db03b7cde79c5f61ba08ac5387e8c8395513Alex Hills             */
28396dd2db03b7cde79c5f61ba08ac5387e8c8395513Alex Hills            public WearableExtender setHintDisplayActionInline(
28406dd2db03b7cde79c5f61ba08ac5387e8c8395513Alex Hills                    boolean hintDisplayInline) {
28416dd2db03b7cde79c5f61ba08ac5387e8c8395513Alex Hills                setFlag(FLAG_HINT_DISPLAY_INLINE, hintDisplayInline);
28426dd2db03b7cde79c5f61ba08ac5387e8c8395513Alex Hills                return this;
28436dd2db03b7cde79c5f61ba08ac5387e8c8395513Alex Hills            }
28446dd2db03b7cde79c5f61ba08ac5387e8c8395513Alex Hills
28456dd2db03b7cde79c5f61ba08ac5387e8c8395513Alex Hills            /**
28462847bad82ad07175d98912009b22838d47cd8376Alex Hills             * Get a hint that this Action should be displayed inline - i.e. it should have a
28472847bad82ad07175d98912009b22838d47cd8376Alex Hills             * visual representation directly on the notification surface in addition to the
28482847bad82ad07175d98912009b22838d47cd8376Alex Hills             * expanded Notification
28496dd2db03b7cde79c5f61ba08ac5387e8c8395513Alex Hills             *
28506dd2db03b7cde79c5f61ba08ac5387e8c8395513Alex Hills             * @return {@code true} if the Action should be displayed inline, {@code false}
28516dd2db03b7cde79c5f61ba08ac5387e8c8395513Alex Hills             *         otherwise. The default value is {@code false} if this was never set.
28526dd2db03b7cde79c5f61ba08ac5387e8c8395513Alex Hills             */
28536dd2db03b7cde79c5f61ba08ac5387e8c8395513Alex Hills            public boolean getHintDisplayActionInline() {
28546dd2db03b7cde79c5f61ba08ac5387e8c8395513Alex Hills                return (mFlags & FLAG_HINT_DISPLAY_INLINE) != 0;
28556dd2db03b7cde79c5f61ba08ac5387e8c8395513Alex Hills            }
28562bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
28572bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
2858ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        /** @hide */
2859c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viverette        @RestrictTo(GROUP_ID)
2860ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        public static final Factory FACTORY = new Factory() {
2861ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            @Override
2862300828fd69bd2bfcefaf54795d03492938efd971Alex Hills            public NotificationCompatBase.Action build(int icon, CharSequence title,
2863ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                    PendingIntent actionIntent, Bundle extras,
2864300828fd69bd2bfcefaf54795d03492938efd971Alex Hills                    RemoteInputCompatBase.RemoteInput[] remoteInputs,
2865300828fd69bd2bfcefaf54795d03492938efd971Alex Hills                    boolean allowGeneratedReplies) {
2866ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                return new Action(icon, title, actionIntent, extras,
2867300828fd69bd2bfcefaf54795d03492938efd971Alex Hills                        (RemoteInput[]) remoteInputs, allowGeneratedReplies);
2868ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            }
2869300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
2870ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            @Override
2871ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            public Action[] newArray(int length) {
2872ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                return new Action[length];
2873ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            }
2874ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        };
2875c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell    }
2876b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen
28772bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
28782bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen    /**
28792bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     * Extender interface for use with {@link Builder#extend}. Extenders may be used to add
28802bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     * metadata or change options on a notification builder.
28812bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     */
28822bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen    public interface Extender {
28832bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
28842bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Apply this extender to a notification builder.
28852bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @param builder the builder to be modified.
28862bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @return the build object for chaining.
28872bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
28882bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public Builder extend(Builder builder);
28892bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen    }
28902bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
28912bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen    /**
28922bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     * Helper class to add wearable extensions to notifications.
28932bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     * <p class="note"> See
28942bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     * <a href="{@docRoot}wear/notifications/creating.html">Creating Notifications
28952bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     * for Android Wear</a> for more information on how to use this class.
28962bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     * <p>
28972bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     * To create a notification with wearable extensions:
28982bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     * <ol>
28992bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     *   <li>Create a {@link NotificationCompat.Builder}, setting any desired
29002bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     *   properties.
29012bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     *   <li>Create a {@link NotificationCompat.WearableExtender}.
29022bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     *   <li>Set wearable-specific properties using the
29032bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     *   {@code add} and {@code set} methods of {@link NotificationCompat.WearableExtender}.
29042bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     *   <li>Call {@link NotificationCompat.Builder#extend} to apply the extensions to a
29052bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     *   notification.
29062bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     *   <li>Post the notification to the notification
29072bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     *   system with the {@code NotificationManagerCompat.notify(...)} methods
29082bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     *   and not the {@code NotificationManager.notify(...)} methods.
29092bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     * </ol>
29102bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     *
29112bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     * <pre class="prettyprint">
29122bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     * Notification notif = new NotificationCompat.Builder(mContext)
29132bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     *         .setContentTitle(&quot;New mail from &quot; + sender.toString())
29142bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     *         .setContentText(subject)
29152bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     *         .setSmallIcon(R.drawable.new_mail)
29162bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     *         .extend(new NotificationCompat.WearableExtender()
29172bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     *                 .setContentIcon(R.drawable.new_mail))
29182bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     *         .build();
29192bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     * NotificationManagerCompat.from(mContext).notify(0, notif);</pre>
29202bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     *
29212bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     * <p>Wearable extensions can be accessed on an existing notification by using the
29222bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     * {@code WearableExtender(Notification)} constructor,
29232bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     * and then using the {@code get} methods to access values.
29242bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     *
29252bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     * <pre class="prettyprint">
29262bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     * NotificationCompat.WearableExtender wearableExtender =
29272bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     *         new NotificationCompat.WearableExtender(notification);
292833176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen     * List&lt;Notification&gt; pages = wearableExtender.getPages();</pre>
29292bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     */
29302bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen    public static final class WearableExtender implements Extender {
29312bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
29322bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Sentinel value for an action index that is unset.
29332bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
29342bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public static final int UNSET_ACTION_INDEX = -1;
29352bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
29362bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
29372bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Size value for use with {@link #setCustomSizePreset} to show this notification with
29382bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * default sizing.
29392bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * <p>For custom display notifications created using {@link #setDisplayIntent},
294015cb52e3a9d304154149f4ca1fa836ac15dc897bPaul Soulos         * the default is {@link #SIZE_MEDIUM}. All other notifications size automatically based
29412bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * on their content.
29422bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
29432bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public static final int SIZE_DEFAULT = 0;
29442bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
29452bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
29462bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Size value for use with {@link #setCustomSizePreset} to show this notification
29472bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * with an extra small size.
29482bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * <p>This value is only applicable for custom display notifications created using
29492bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * {@link #setDisplayIntent}.
29502bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
29512bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public static final int SIZE_XSMALL = 1;
29522bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
29532bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
29542bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Size value for use with {@link #setCustomSizePreset} to show this notification
29552bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * with a small size.
29562bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * <p>This value is only applicable for custom display notifications created using
29572bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * {@link #setDisplayIntent}.
29582bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
29592bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public static final int SIZE_SMALL = 2;
29602bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
29612bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
29622bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Size value for use with {@link #setCustomSizePreset} to show this notification
29632bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * with a medium size.
29642bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * <p>This value is only applicable for custom display notifications created using
29652bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * {@link #setDisplayIntent}.
29662bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
29672bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public static final int SIZE_MEDIUM = 3;
29682bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
29692bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
29702bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Size value for use with {@link #setCustomSizePreset} to show this notification
29712bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * with a large size.
29722bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * <p>This value is only applicable for custom display notifications created using
29732bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * {@link #setDisplayIntent}.
29742bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
29752bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public static final int SIZE_LARGE = 4;
29762bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
2977fd5d0d05e9b44fcb0a9dab91290d53b464fc0939Griff Hazen        /**
2978fd5d0d05e9b44fcb0a9dab91290d53b464fc0939Griff Hazen         * Size value for use with {@link #setCustomSizePreset} to show this notification
2979fd5d0d05e9b44fcb0a9dab91290d53b464fc0939Griff Hazen         * full screen.
2980fd5d0d05e9b44fcb0a9dab91290d53b464fc0939Griff Hazen         * <p>This value is only applicable for custom display notifications created using
2981fd5d0d05e9b44fcb0a9dab91290d53b464fc0939Griff Hazen         * {@link #setDisplayIntent}.
2982fd5d0d05e9b44fcb0a9dab91290d53b464fc0939Griff Hazen         */
2983fd5d0d05e9b44fcb0a9dab91290d53b464fc0939Griff Hazen        public static final int SIZE_FULL_SCREEN = 5;
2984fd5d0d05e9b44fcb0a9dab91290d53b464fc0939Griff Hazen
2985c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen        /**
2986c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen         * Sentinel value for use with {@link #setHintScreenTimeout} to keep the screen on for a
2987c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen         * short amount of time when this notification is displayed on the screen. This
2988c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen         * is the default value.
2989c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen         */
2990c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen        public static final int SCREEN_TIMEOUT_SHORT = 0;
2991c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen
2992c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen        /**
2993c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen         * Sentinel value for use with {@link #setHintScreenTimeout} to keep the screen on
2994c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen         * for a longer amount of time when this notification is displayed on the screen.
2995c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen         */
2996c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen        public static final int SCREEN_TIMEOUT_LONG = -1;
2997c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen
29982bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /** Notification extra which contains wearable extensions */
29992bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private static final String EXTRA_WEARABLE_EXTENSIONS = "android.wearable.EXTENSIONS";
30002bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
30011cbde29329daabfbda18aabf7fb547d3a4c4a9c6Pete Gast        // Keys within EXTRA_WEARABLE_EXTENSIONS for wearable options.
30022bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private static final String KEY_ACTIONS = "actions";
30032bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private static final String KEY_FLAGS = "flags";
30042bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private static final String KEY_DISPLAY_INTENT = "displayIntent";
30052bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private static final String KEY_PAGES = "pages";
30062bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private static final String KEY_BACKGROUND = "background";
30072bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private static final String KEY_CONTENT_ICON = "contentIcon";
30082bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private static final String KEY_CONTENT_ICON_GRAVITY = "contentIconGravity";
30092bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private static final String KEY_CONTENT_ACTION_INDEX = "contentActionIndex";
30102bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private static final String KEY_CUSTOM_SIZE_PRESET = "customSizePreset";
30112bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private static final String KEY_CUSTOM_CONTENT_HEIGHT = "customContentHeight";
30122bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private static final String KEY_GRAVITY = "gravity";
3013c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen        private static final String KEY_HINT_SCREEN_TIMEOUT = "hintScreenTimeout";
301411ae0cf88a236c2be6a043314c7a67e888db10a8Nadia Benbernou        private static final String KEY_DISMISSAL_ID = "dismissalId";
3015eb11c916765fb435c4847056acb3677fae85ae5dAriel Gertzenstein        private static final String KEY_BRIDGE_TAG = "bridgeTag";
30162bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
30172bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        // Flags bitwise-ored to mFlags
30182bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private static final int FLAG_CONTENT_INTENT_AVAILABLE_OFFLINE = 0x1;
30192bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private static final int FLAG_HINT_HIDE_ICON = 1 << 1;
30202bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private static final int FLAG_HINT_SHOW_BACKGROUND_ONLY = 1 << 2;
30212bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private static final int FLAG_START_SCROLL_BOTTOM = 1 << 3;
3022c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen        private static final int FLAG_HINT_AVOID_BACKGROUND_CLIPPING = 1 << 4;
3023377a53b843a0787e9f760dc1898bcabe50236321Alex Hills        private static final int FLAG_BIG_PICTURE_AMBIENT = 1 << 5;
3024e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills        private static final int FLAG_HINT_CONTENT_INTENT_LAUNCHES_ACTIVITY = 1 << 6;
30252bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
30262bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        // Default value for flags integer
30272bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private static final int DEFAULT_FLAGS = FLAG_CONTENT_INTENT_AVAILABLE_OFFLINE;
30282bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
30292bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private static final int DEFAULT_CONTENT_ICON_GRAVITY = GravityCompat.END;
30302bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private static final int DEFAULT_GRAVITY = Gravity.BOTTOM;
30312bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
30322bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private ArrayList<Action> mActions = new ArrayList<Action>();
30332bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private int mFlags = DEFAULT_FLAGS;
30342bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private PendingIntent mDisplayIntent;
30352bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private ArrayList<Notification> mPages = new ArrayList<Notification>();
30362bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private Bitmap mBackground;
30372bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private int mContentIcon;
30382bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private int mContentIconGravity = DEFAULT_CONTENT_ICON_GRAVITY;
30392bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private int mContentActionIndex = UNSET_ACTION_INDEX;
30402bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private int mCustomSizePreset = SIZE_DEFAULT;
30412bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private int mCustomContentHeight;
30422bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private int mGravity = DEFAULT_GRAVITY;
3043c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen        private int mHintScreenTimeout;
304411ae0cf88a236c2be6a043314c7a67e888db10a8Nadia Benbernou        private String mDismissalId;
3045eb11c916765fb435c4847056acb3677fae85ae5dAriel Gertzenstein        private String mBridgeTag;
30462bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
30472bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
30482bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Create a {@link NotificationCompat.WearableExtender} with default
30492bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * options.
30502bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
30512bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public WearableExtender() {
30522bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
30532bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
30542bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public WearableExtender(Notification notif) {
30552bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            Bundle extras = getExtras(notif);
30562bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            Bundle wearableBundle = extras != null ? extras.getBundle(EXTRA_WEARABLE_EXTENSIONS)
30572bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                    : null;
30582bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            if (wearableBundle != null) {
30592bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                Action[] actions = IMPL.getActionsFromParcelableArrayList(
30602bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                        wearableBundle.getParcelableArrayList(KEY_ACTIONS));
30612bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                if (actions != null) {
30622bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                    Collections.addAll(mActions, actions);
30632bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                }
30642bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
30652bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                mFlags = wearableBundle.getInt(KEY_FLAGS, DEFAULT_FLAGS);
30662bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                mDisplayIntent = wearableBundle.getParcelable(KEY_DISPLAY_INTENT);
30672bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
30682bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                Notification[] pages = getNotificationArrayFromBundle(
30692bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                        wearableBundle, KEY_PAGES);
30702bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                if (pages != null) {
30712bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                    Collections.addAll(mPages, pages);
30722bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                }
30732bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
30742bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                mBackground = wearableBundle.getParcelable(KEY_BACKGROUND);
30752bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                mContentIcon = wearableBundle.getInt(KEY_CONTENT_ICON);
30762bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                mContentIconGravity = wearableBundle.getInt(KEY_CONTENT_ICON_GRAVITY,
30772bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                        DEFAULT_CONTENT_ICON_GRAVITY);
30782bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                mContentActionIndex = wearableBundle.getInt(KEY_CONTENT_ACTION_INDEX,
30792bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                        UNSET_ACTION_INDEX);
30802bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                mCustomSizePreset = wearableBundle.getInt(KEY_CUSTOM_SIZE_PRESET,
30812bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                        SIZE_DEFAULT);
30822bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                mCustomContentHeight = wearableBundle.getInt(KEY_CUSTOM_CONTENT_HEIGHT);
30832bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                mGravity = wearableBundle.getInt(KEY_GRAVITY, DEFAULT_GRAVITY);
3084c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen                mHintScreenTimeout = wearableBundle.getInt(KEY_HINT_SCREEN_TIMEOUT);
308511ae0cf88a236c2be6a043314c7a67e888db10a8Nadia Benbernou                mDismissalId = wearableBundle.getString(KEY_DISMISSAL_ID);
3086eb11c916765fb435c4847056acb3677fae85ae5dAriel Gertzenstein                mBridgeTag = wearableBundle.getString(KEY_BRIDGE_TAG);
30872bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            }
30882bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
30892bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
30902bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
30912bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Apply wearable extensions to a notification that is being built. This is typically
30922bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * called by the {@link NotificationCompat.Builder#extend} method of
30932bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * {@link NotificationCompat.Builder}.
30942bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
30952bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        @Override
30962bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public NotificationCompat.Builder extend(NotificationCompat.Builder builder) {
30972bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            Bundle wearableBundle = new Bundle();
30982bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
30992bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            if (!mActions.isEmpty()) {
31002bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                wearableBundle.putParcelableArrayList(KEY_ACTIONS,
31012bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                        IMPL.getParcelableArrayListForActions(mActions.toArray(
31022bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                                new Action[mActions.size()])));
31032bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            }
31042bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            if (mFlags != DEFAULT_FLAGS) {
31052bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                wearableBundle.putInt(KEY_FLAGS, mFlags);
31062bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            }
31072bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            if (mDisplayIntent != null) {
31082bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                wearableBundle.putParcelable(KEY_DISPLAY_INTENT, mDisplayIntent);
31092bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            }
31102bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            if (!mPages.isEmpty()) {
31112bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                wearableBundle.putParcelableArray(KEY_PAGES, mPages.toArray(
31122bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                        new Notification[mPages.size()]));
31132bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            }
31142bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            if (mBackground != null) {
31152bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                wearableBundle.putParcelable(KEY_BACKGROUND, mBackground);
31162bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            }
31172bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            if (mContentIcon != 0) {
31182bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                wearableBundle.putInt(KEY_CONTENT_ICON, mContentIcon);
31192bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            }
31202bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            if (mContentIconGravity != DEFAULT_CONTENT_ICON_GRAVITY) {
31212bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                wearableBundle.putInt(KEY_CONTENT_ICON_GRAVITY, mContentIconGravity);
31222bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            }
31232bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            if (mContentActionIndex != UNSET_ACTION_INDEX) {
31242bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                wearableBundle.putInt(KEY_CONTENT_ACTION_INDEX,
31252bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                        mContentActionIndex);
31262bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            }
31272bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            if (mCustomSizePreset != SIZE_DEFAULT) {
31282bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                wearableBundle.putInt(KEY_CUSTOM_SIZE_PRESET, mCustomSizePreset);
31292bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            }
31302bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            if (mCustomContentHeight != 0) {
31312bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                wearableBundle.putInt(KEY_CUSTOM_CONTENT_HEIGHT, mCustomContentHeight);
31322bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            }
31332bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            if (mGravity != DEFAULT_GRAVITY) {
31342bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                wearableBundle.putInt(KEY_GRAVITY, mGravity);
31352bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            }
3136c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen            if (mHintScreenTimeout != 0) {
3137c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen                wearableBundle.putInt(KEY_HINT_SCREEN_TIMEOUT, mHintScreenTimeout);
3138c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen            }
313911ae0cf88a236c2be6a043314c7a67e888db10a8Nadia Benbernou            if (mDismissalId != null) {
314011ae0cf88a236c2be6a043314c7a67e888db10a8Nadia Benbernou                wearableBundle.putString(KEY_DISMISSAL_ID, mDismissalId);
314111ae0cf88a236c2be6a043314c7a67e888db10a8Nadia Benbernou            }
3142eb11c916765fb435c4847056acb3677fae85ae5dAriel Gertzenstein            if (mBridgeTag != null) {
3143eb11c916765fb435c4847056acb3677fae85ae5dAriel Gertzenstein                wearableBundle.putString(KEY_BRIDGE_TAG, mBridgeTag);
3144eb11c916765fb435c4847056acb3677fae85ae5dAriel Gertzenstein            }
31452bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
31462bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            builder.getExtras().putBundle(EXTRA_WEARABLE_EXTENSIONS, wearableBundle);
31472bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return builder;
31482bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
31492bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
31502bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        @Override
31512bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public WearableExtender clone() {
31522bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            WearableExtender that = new WearableExtender();
31532bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            that.mActions = new ArrayList<Action>(this.mActions);
31542bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            that.mFlags = this.mFlags;
31552bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            that.mDisplayIntent = this.mDisplayIntent;
31562bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            that.mPages = new ArrayList<Notification>(this.mPages);
31572bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            that.mBackground = this.mBackground;
31582bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            that.mContentIcon = this.mContentIcon;
31592bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            that.mContentIconGravity = this.mContentIconGravity;
31602bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            that.mContentActionIndex = this.mContentActionIndex;
31612bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            that.mCustomSizePreset = this.mCustomSizePreset;
31622bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            that.mCustomContentHeight = this.mCustomContentHeight;
31632bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            that.mGravity = this.mGravity;
3164c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen            that.mHintScreenTimeout = this.mHintScreenTimeout;
316511ae0cf88a236c2be6a043314c7a67e888db10a8Nadia Benbernou            that.mDismissalId = this.mDismissalId;
3166eb11c916765fb435c4847056acb3677fae85ae5dAriel Gertzenstein            that.mBridgeTag = this.mBridgeTag;
31672bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return that;
31682bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
31692bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
31702bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
31712bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Add a wearable action to this notification.
31722bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         *
31732bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * <p>When wearable actions are added using this method, the set of actions that
31742bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * show on a wearable device splits from devices that only show actions added
31752bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * using {@link NotificationCompat.Builder#addAction}. This allows for customization
31762bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * of which actions display on different devices.
31772bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         *
31782bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @param action the action to add to this notification
31792bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @return this object for method chaining
31802bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @see NotificationCompat.Action
31812bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
31822bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public WearableExtender addAction(Action action) {
31832bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            mActions.add(action);
31842bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return this;
31852bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
31862bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
31872bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
31882bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Adds wearable actions to this notification.
31892bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         *
31902bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * <p>When wearable actions are added using this method, the set of actions that
31912bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * show on a wearable device splits from devices that only show actions added
31922bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * using {@link NotificationCompat.Builder#addAction}. This allows for customization
31932bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * of which actions display on different devices.
31942bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         *
31952bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @param actions the actions to add to this notification
31962bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @return this object for method chaining
31972bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @see NotificationCompat.Action
31982bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
31992bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public WearableExtender addActions(List<Action> actions) {
32002bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            mActions.addAll(actions);
32012bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return this;
32022bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
32032bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
32042bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
32052bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Clear all wearable actions present on this builder.
32062bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @return this object for method chaining.
32072bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @see #addAction
32082bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
32092bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public WearableExtender clearActions() {
32102bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            mActions.clear();
32112bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return this;
32122bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
32132bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
32142bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
32152bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Get the wearable actions present on this notification.
32162bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
32172bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public List<Action> getActions() {
32182bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return mActions;
32192bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
32202bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
32212bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
32222bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Set an intent to launch inside of an activity view when displaying
322333176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * this notification. The {@link PendingIntent} provided should be for an activity.
322433176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         *
322533176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * <pre class="prettyprint">
322633176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * Intent displayIntent = new Intent(context, MyDisplayActivity.class);
322733176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * PendingIntent displayPendingIntent = PendingIntent.getActivity(context,
322833176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         *         0, displayIntent, PendingIntent.FLAG_UPDATE_CURRENT);
322933176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * Notification notif = new NotificationCompat.Builder(context)
323033176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         *         .extend(new NotificationCompat.WearableExtender()
323133176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         *                 .setDisplayIntent(displayPendingIntent)
323233176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         *                 .setCustomSizePreset(NotificationCompat.WearableExtender.SIZE_MEDIUM))
323333176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         *         .build();</pre>
323433176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         *
323533176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * <p>The activity to launch needs to allow embedding, must be exported, and
3236bc8f49b8cd63e6c24322a013d47e805a8789685eGriff Hazen         * should have an empty task affinity. It is also recommended to use the device
3237bc8f49b8cd63e6c24322a013d47e805a8789685eGriff Hazen         * default light theme.
323833176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         *
323933176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * <p>Example AndroidManifest.xml entry:
324033176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * <pre class="prettyprint">
324133176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * &lt;activity android:name=&quot;com.example.MyDisplayActivity&quot;
324233176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         *     android:exported=&quot;true&quot;
324333176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         *     android:allowEmbedded=&quot;true&quot;
3244bc8f49b8cd63e6c24322a013d47e805a8789685eGriff Hazen         *     android:taskAffinity=&quot;&quot;
3245bc8f49b8cd63e6c24322a013d47e805a8789685eGriff Hazen         *     android:theme=&quot;@android:style/Theme.DeviceDefault.Light&quot; /&gt;</pre>
32462bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         *
32472bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @param intent the {@link PendingIntent} for an activity
32482bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @return this object for method chaining
32492bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @see NotificationCompat.WearableExtender#getDisplayIntent
32502bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
32512bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public WearableExtender setDisplayIntent(PendingIntent intent) {
32522bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            mDisplayIntent = intent;
32532bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return this;
32542bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
32552bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
32562bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
32572bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Get the intent to launch inside of an activity view when displaying this
32582bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * notification. This {@code PendingIntent} should be for an activity.
32592bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
32602bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public PendingIntent getDisplayIntent() {
32612bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return mDisplayIntent;
32622bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
32632bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
32642bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
32652bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Add an additional page of content to display with this notification. The current
32662bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * notification forms the first page, and pages added using this function form
32672bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * subsequent pages. This field can be used to separate a notification into multiple
32682bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * sections.
32692bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         *
32702bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @param page the notification to add as another page
32712bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @return this object for method chaining
32722bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @see NotificationCompat.WearableExtender#getPages
32732bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
32742bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public WearableExtender addPage(Notification page) {
32752bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            mPages.add(page);
32762bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return this;
32772bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
32782bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
32792bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
32802bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Add additional pages of content to display with this notification. The current
32812bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * notification forms the first page, and pages added using this function form
32822bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * subsequent pages. This field can be used to separate a notification into multiple
32832bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * sections.
32842bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         *
32852bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @param pages a list of notifications
32862bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @return this object for method chaining
32872bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @see NotificationCompat.WearableExtender#getPages
32882bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
32892bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public WearableExtender addPages(List<Notification> pages) {
32902bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            mPages.addAll(pages);
32912bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return this;
32922bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
32932bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
32942bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
32952bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Clear all additional pages present on this builder.
32962bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @return this object for method chaining.
32972bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @see #addPage
32982bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
32992bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public WearableExtender clearPages() {
33002bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            mPages.clear();
33012bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return this;
33022bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
33032bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
33042bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
33052bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Get the array of additional pages of content for displaying this notification. The
33062bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * current notification forms the first page, and elements within this array form
33072bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * subsequent pages. This field can be used to separate a notification into multiple
33082bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * sections.
33092bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @return the pages for this notification
33102bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
33112bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public List<Notification> getPages() {
33122bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return mPages;
33132bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
33142bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
33152bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
33162bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Set a background image to be displayed behind the notification content.
33172bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Contrary to the {@link NotificationCompat.BigPictureStyle}, this background
33182bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * will work with any notification style.
33192bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         *
33202bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @param background the background bitmap
33212bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @return this object for method chaining
33222bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @see NotificationCompat.WearableExtender#getBackground
33232bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
33242bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public WearableExtender setBackground(Bitmap background) {
33252bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            mBackground = background;
33262bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return this;
33272bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
33282bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
33292bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
33302bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Get a background image to be displayed behind the notification content.
33312bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Contrary to the {@link NotificationCompat.BigPictureStyle}, this background
33322bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * will work with any notification style.
33332bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         *
33342bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @return the background image
33352bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @see NotificationCompat.WearableExtender#setBackground
33362bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
33372bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public Bitmap getBackground() {
33382bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return mBackground;
33392bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
33402bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
33412bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
33422bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Set an icon that goes with the content of this notification.
33432bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
33442bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public WearableExtender setContentIcon(int icon) {
33452bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            mContentIcon = icon;
33462bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return this;
33472bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
33482bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
33492bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
33502bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Get an icon that goes with the content of this notification.
33512bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
33522bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public int getContentIcon() {
33532bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return mContentIcon;
33542bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
33552bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
33562bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
33572bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Set the gravity that the content icon should have within the notification display.
33582bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Supported values include {@link android.view.Gravity#START} and
33592bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * {@link android.view.Gravity#END}. The default value is {@link android.view.Gravity#END}.
33602bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @see #setContentIcon
33612bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
33622bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public WearableExtender setContentIconGravity(int contentIconGravity) {
33632bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            mContentIconGravity = contentIconGravity;
33642bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return this;
33652bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
33662bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
33672bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
33682bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Get the gravity that the content icon should have within the notification display.
33692bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Supported values include {@link android.view.Gravity#START} and
33702bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * {@link android.view.Gravity#END}. The default value is {@link android.view.Gravity#END}.
33712bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @see #getContentIcon
33722bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
33732bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public int getContentIconGravity() {
33742bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return mContentIconGravity;
33752bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
33762bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
33772bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
33782bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Set an action from this notification's actions to be clickable with the content of
337933176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * this notification. This action will no longer display separately from the
338033176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * notification's content.
338133176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         *
338233176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * <p>For notifications with multiple pages, child pages can also have content actions
338333176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * set, although the list of available actions comes from the main notification and not
338433176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * from the child page's notification.
338533176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         *
338633176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * @param actionIndex The index of the action to hoist onto the current notification page.
338733176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         *                    If wearable actions were added to the main notification, this index
338833176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         *                    will apply to that list, otherwise it will apply to the regular
338933176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         *                    actions list.
33902bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
33912bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public WearableExtender setContentAction(int actionIndex) {
33922bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            mContentActionIndex = actionIndex;
33932bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return this;
33942bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
33952bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
33962bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
339733176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * Get the index of the notification action, if any, that was specified as being clickable
339833176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * with the content of this notification. This action will no longer display separately
339933176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * from the notification's content.
340033176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         *
340133176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * <p>For notifications with multiple pages, child pages can also have content actions
340233176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * set, although the list of available actions comes from the main notification and not
340333176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * from the child page's notification.
340433176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         *
340533176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * <p>If wearable specific actions were added to the main notification, this index will
340633176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * apply to that list, otherwise it will apply to the regular actions list.
34072bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         *
340833176ed929ad69d9b700fb4da97948e61d0e7c93Griff Hazen         * @return the action index or {@link #UNSET_ACTION_INDEX} if no action was selected.
34092bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
34102bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public int getContentAction() {
34112bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return mContentActionIndex;
34122bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
34132bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
34142bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
34152bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Set the gravity that this notification should have within the available viewport space.
34162bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Supported values include {@link android.view.Gravity#TOP},
34172bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * {@link android.view.Gravity#CENTER_VERTICAL} and {@link android.view.Gravity#BOTTOM}.
34182bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * The default value is {@link android.view.Gravity#BOTTOM}.
34192bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
34202bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public WearableExtender setGravity(int gravity) {
34212bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            mGravity = gravity;
34222bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return this;
34232bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
34242bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
34252bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
34262bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Get the gravity that this notification should have within the available viewport space.
34272bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Supported values include {@link android.view.Gravity#TOP},
34282bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * {@link android.view.Gravity#CENTER_VERTICAL} and {@link android.view.Gravity#BOTTOM}.
34292bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * The default value is {@link android.view.Gravity#BOTTOM}.
34302bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
34312bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public int getGravity() {
34322bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return mGravity;
34332bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
34342bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
34352bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
34362bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Set the custom size preset for the display of this notification out of the available
34372bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * presets found in {@link NotificationCompat.WearableExtender}, e.g.
34382bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * {@link #SIZE_LARGE}.
34392bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * <p>Some custom size presets are only applicable for custom display notifications created
34402bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * using {@link NotificationCompat.WearableExtender#setDisplayIntent}. Check the
34412bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * documentation for the preset in question. See also
34422bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * {@link #setCustomContentHeight} and {@link #getCustomSizePreset}.
34432bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
34442bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public WearableExtender setCustomSizePreset(int sizePreset) {
34452bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            mCustomSizePreset = sizePreset;
34462bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return this;
34472bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
34482bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
34492bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
34502bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Get the custom size preset for the display of this notification out of the available
34512bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * presets found in {@link NotificationCompat.WearableExtender}, e.g.
34522bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * {@link #SIZE_LARGE}.
34532bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * <p>Some custom size presets are only applicable for custom display notifications created
34542bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * using {@link #setDisplayIntent}. Check the documentation for the preset in question.
34552bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * See also {@link #setCustomContentHeight} and {@link #setCustomSizePreset}.
34562bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
34572bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public int getCustomSizePreset() {
34582bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return mCustomSizePreset;
34592bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
34602bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
34612bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
34622bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Set the custom height in pixels for the display of this notification's content.
34632bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * <p>This option is only available for custom display notifications created
34642bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * using {@link NotificationCompat.WearableExtender#setDisplayIntent}. See also
34652bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * {@link NotificationCompat.WearableExtender#setCustomSizePreset} and
34662bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * {@link #getCustomContentHeight}.
34672bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
34682bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public WearableExtender setCustomContentHeight(int height) {
34692bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            mCustomContentHeight = height;
34702bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return this;
34712bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
34722bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
34732bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
34742bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Get the custom height in pixels for the display of this notification's content.
34752bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * <p>This option is only available for custom display notifications created
34762bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * using {@link #setDisplayIntent}. See also {@link #setCustomSizePreset} and
34772bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * {@link #setCustomContentHeight}.
34782bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
34792bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public int getCustomContentHeight() {
34802bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return mCustomContentHeight;
34812bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
34822bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
34832bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
34842bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Set whether the scrolling position for the contents of this notification should start
34852bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * at the bottom of the contents instead of the top when the contents are too long to
34862bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * display within the screen.  Default is false (start scroll at the top).
34872bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
34882bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public WearableExtender setStartScrollBottom(boolean startScrollBottom) {
34892bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            setFlag(FLAG_START_SCROLL_BOTTOM, startScrollBottom);
34902bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return this;
34912bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
34922bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
34932bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
34942bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Get whether the scrolling position for the contents of this notification should start
34952bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * at the bottom of the contents instead of the top when the contents are too long to
34962bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * display within the screen. Default is false (start scroll at the top).
34972bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
34982bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public boolean getStartScrollBottom() {
34992bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return (mFlags & FLAG_START_SCROLL_BOTTOM) != 0;
35002bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
35012bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
35022bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
35032bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Set whether the content intent is available when the wearable device is not connected
35042bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * to a companion device.  The user can still trigger this intent when the wearable device
35052bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * is offline, but a visual hint will indicate that the content intent may not be available.
35062bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Defaults to true.
35072bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
35082bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public WearableExtender setContentIntentAvailableOffline(
35092bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                boolean contentIntentAvailableOffline) {
35102bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            setFlag(FLAG_CONTENT_INTENT_AVAILABLE_OFFLINE, contentIntentAvailableOffline);
35112bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return this;
35122bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
35132bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
35142bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
35152bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Get whether the content intent is available when the wearable device is not connected
35162bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * to a companion device.  The user can still trigger this intent when the wearable device
35172bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * is offline, but a visual hint will indicate that the content intent may not be available.
35182bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Defaults to true.
35192bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
35202bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public boolean getContentIntentAvailableOffline() {
35212bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return (mFlags & FLAG_CONTENT_INTENT_AVAILABLE_OFFLINE) != 0;
35222bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
35232bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
35242bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
35252bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Set a hint that this notification's icon should not be displayed.
35262bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @param hintHideIcon {@code true} to hide the icon, {@code false} otherwise.
35272bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @return this object for method chaining
35282bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
35292bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public WearableExtender setHintHideIcon(boolean hintHideIcon) {
35302bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            setFlag(FLAG_HINT_HIDE_ICON, hintHideIcon);
35312bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return this;
35322bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
35332bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
35342bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
35352bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Get a hint that this notification's icon should not be displayed.
35362bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * @return {@code true} if this icon should not be displayed, false otherwise.
35372bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * The default value is {@code false} if this was never set.
35382bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
35392bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public boolean getHintHideIcon() {
35402bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return (mFlags & FLAG_HINT_HIDE_ICON) != 0;
35412bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
35422bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
35432bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
35442bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Set a visual hint that only the background image of this notification should be
35452bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * displayed, and other semantic content should be hidden. This hint is only applicable
35462bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * to sub-pages added using {@link #addPage}.
35472bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
35482bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public WearableExtender setHintShowBackgroundOnly(boolean hintShowBackgroundOnly) {
35492bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            setFlag(FLAG_HINT_SHOW_BACKGROUND_ONLY, hintShowBackgroundOnly);
35502bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return this;
35512bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
35522bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
35532bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        /**
35542bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * Get a visual hint that only the background image of this notification should be
35552bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * displayed, and other semantic content should be hidden. This hint is only applicable
35562bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         * to sub-pages added using {@link NotificationCompat.WearableExtender#addPage}.
35572bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen         */
35582bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        public boolean getHintShowBackgroundOnly() {
35592bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return (mFlags & FLAG_HINT_SHOW_BACKGROUND_ONLY) != 0;
35602bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
35612bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
3562c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen        /**
3563db11b694337b2a9320d7d7a5e156169a08d28a6dGriff Hazen         * Set a hint that this notification's background should not be clipped if possible,
3564db11b694337b2a9320d7d7a5e156169a08d28a6dGriff Hazen         * and should instead be resized to fully display on the screen, retaining the aspect
3565db11b694337b2a9320d7d7a5e156169a08d28a6dGriff Hazen         * ratio of the image. This can be useful for images like barcodes or qr codes.
3566c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen         * @param hintAvoidBackgroundClipping {@code true} to avoid clipping if possible.
3567c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen         * @return this object for method chaining
3568c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen         */
3569c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen        public WearableExtender setHintAvoidBackgroundClipping(
3570c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen                boolean hintAvoidBackgroundClipping) {
3571c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen            setFlag(FLAG_HINT_AVOID_BACKGROUND_CLIPPING, hintAvoidBackgroundClipping);
3572c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen            return this;
3573c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen        }
3574c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen
3575c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen        /**
3576db11b694337b2a9320d7d7a5e156169a08d28a6dGriff Hazen         * Get a hint that this notification's background should not be clipped if possible,
3577db11b694337b2a9320d7d7a5e156169a08d28a6dGriff Hazen         * and should instead be resized to fully display on the screen, retaining the aspect
3578db11b694337b2a9320d7d7a5e156169a08d28a6dGriff Hazen         * ratio of the image. This can be useful for images like barcodes or qr codes.
3579c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen         * @return {@code true} if it's ok if the background is clipped on the screen, false
3580c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen         * otherwise. The default value is {@code false} if this was never set.
3581c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen         */
3582c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen        public boolean getHintAvoidBackgroundClipping() {
3583c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen            return (mFlags & FLAG_HINT_AVOID_BACKGROUND_CLIPPING) != 0;
3584c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen        }
3585c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen
3586c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen        /**
3587c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen         * Set a hint that the screen should remain on for at least this duration when
3588c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen         * this notification is displayed on the screen.
3589c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen         * @param timeout The requested screen timeout in milliseconds. Can also be either
3590c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen         *     {@link #SCREEN_TIMEOUT_SHORT} or {@link #SCREEN_TIMEOUT_LONG}.
3591c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen         * @return this object for method chaining
3592c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen         */
3593c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen        public WearableExtender setHintScreenTimeout(int timeout) {
3594c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen            mHintScreenTimeout = timeout;
3595c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen            return this;
3596c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen        }
3597c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen
3598c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen        /**
3599c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen         * Get the duration, in milliseconds, that the screen should remain on for
3600c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen         * when this notification is displayed.
3601c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen         * @return the duration in milliseconds if > 0, or either one of the sentinel values
3602c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen         *     {@link #SCREEN_TIMEOUT_SHORT} or {@link #SCREEN_TIMEOUT_LONG}.
3603c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen         */
3604c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen        public int getHintScreenTimeout() {
3605c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen            return mHintScreenTimeout;
3606c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen        }
3607c9e4b6fcfcc361f65f2f579b2c001ad99a194638Griff Hazen
3608e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills        /**
3609377a53b843a0787e9f760dc1898bcabe50236321Alex Hills         * Set a hint that this notification's {@link BigPictureStyle} (if present) should be
3610377a53b843a0787e9f760dc1898bcabe50236321Alex Hills         * converted to low-bit and displayed in ambient mode, especially useful for barcodes and
3611377a53b843a0787e9f760dc1898bcabe50236321Alex Hills         * qr codes, as well as other simple black-and-white tickets.
3612377a53b843a0787e9f760dc1898bcabe50236321Alex Hills         * @param hintAmbientBigPicture {@code true} to enable converstion and ambient.
3613377a53b843a0787e9f760dc1898bcabe50236321Alex Hills         * @return this object for method chaining
3614377a53b843a0787e9f760dc1898bcabe50236321Alex Hills         */
3615377a53b843a0787e9f760dc1898bcabe50236321Alex Hills        public WearableExtender setHintAmbientBigPicture(boolean hintAmbientBigPicture) {
3616377a53b843a0787e9f760dc1898bcabe50236321Alex Hills            setFlag(FLAG_BIG_PICTURE_AMBIENT, hintAmbientBigPicture);
3617377a53b843a0787e9f760dc1898bcabe50236321Alex Hills            return this;
3618377a53b843a0787e9f760dc1898bcabe50236321Alex Hills        }
3619377a53b843a0787e9f760dc1898bcabe50236321Alex Hills
3620377a53b843a0787e9f760dc1898bcabe50236321Alex Hills        /**
3621377a53b843a0787e9f760dc1898bcabe50236321Alex Hills         * Get a hint that this notification's {@link BigPictureStyle} (if present) should be
3622377a53b843a0787e9f760dc1898bcabe50236321Alex Hills         * converted to low-bit and displayed in ambient mode, especially useful for barcodes and
3623377a53b843a0787e9f760dc1898bcabe50236321Alex Hills         * qr codes, as well as other simple black-and-white tickets.
3624377a53b843a0787e9f760dc1898bcabe50236321Alex Hills         * @return {@code true} if it should be displayed in ambient, false otherwise
3625377a53b843a0787e9f760dc1898bcabe50236321Alex Hills         * otherwise. The default value is {@code false} if this was never set.
3626377a53b843a0787e9f760dc1898bcabe50236321Alex Hills         */
3627377a53b843a0787e9f760dc1898bcabe50236321Alex Hills        public boolean getHintAmbientBigPicture() {
3628377a53b843a0787e9f760dc1898bcabe50236321Alex Hills            return (mFlags & FLAG_BIG_PICTURE_AMBIENT) != 0;
3629377a53b843a0787e9f760dc1898bcabe50236321Alex Hills        }
3630377a53b843a0787e9f760dc1898bcabe50236321Alex Hills
3631377a53b843a0787e9f760dc1898bcabe50236321Alex Hills        /**
3632e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills         * Set a hint that this notification's content intent will launch an {@link Activity}
3633e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills         * directly, telling the platform that it can generate the appropriate transitions.
3634e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills         * @param hintContentIntentLaunchesActivity {@code true} if the content intent will launch
3635e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills         * an activity and transitions should be generated, false otherwise.
3636e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills         * @return this object for method chaining
3637e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills         */
3638e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills        public WearableExtender setHintContentIntentLaunchesActivity(
3639e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills                boolean hintContentIntentLaunchesActivity) {
3640e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills            setFlag(FLAG_HINT_CONTENT_INTENT_LAUNCHES_ACTIVITY, hintContentIntentLaunchesActivity);
3641e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills            return this;
3642e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills        }
3643e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills
3644e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills        /**
3645e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills         * Get a hint that this notification's content intent will launch an {@link Activity}
3646e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills         * directly, telling the platform that it can generate the appropriate transitions
3647e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills         * @return {@code true} if the content intent will launch an activity and transitions should
3648e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills         * be generated, false otherwise. The default value is {@code false} if this was never set.
3649e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills         */
3650e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills        public boolean getHintContentIntentLaunchesActivity() {
3651e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills            return (mFlags & FLAG_HINT_CONTENT_INTENT_LAUNCHES_ACTIVITY) != 0;
3652e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills        }
3653e37023bf2df865d8a64095bfe36fb52343331b1fAlex Hills
365411ae0cf88a236c2be6a043314c7a67e888db10a8Nadia Benbernou        /**
3655eb11c916765fb435c4847056acb3677fae85ae5dAriel Gertzenstein         * Sets the dismissal id for this notification. If a notification is posted with a
3656eb11c916765fb435c4847056acb3677fae85ae5dAriel Gertzenstein         * dismissal id, then when that notification is canceled, notifications on other wearables
3657eb11c916765fb435c4847056acb3677fae85ae5dAriel Gertzenstein         * and the paired Android phone having that same dismissal id will also be canceled. See
365811ae0cf88a236c2be6a043314c7a67e888db10a8Nadia Benbernou         * <a href="{@docRoot}wear/notifications/index.html">Adding Wearable Features to
3659eb11c916765fb435c4847056acb3677fae85ae5dAriel Gertzenstein         * Notifications</a> for more information.
366011ae0cf88a236c2be6a043314c7a67e888db10a8Nadia Benbernou         * @param dismissalId the dismissal id of the notification.
366111ae0cf88a236c2be6a043314c7a67e888db10a8Nadia Benbernou         * @return this object for method chaining
366211ae0cf88a236c2be6a043314c7a67e888db10a8Nadia Benbernou         */
366311ae0cf88a236c2be6a043314c7a67e888db10a8Nadia Benbernou        public WearableExtender setDismissalId(String dismissalId) {
366411ae0cf88a236c2be6a043314c7a67e888db10a8Nadia Benbernou            mDismissalId = dismissalId;
366511ae0cf88a236c2be6a043314c7a67e888db10a8Nadia Benbernou            return this;
366611ae0cf88a236c2be6a043314c7a67e888db10a8Nadia Benbernou        }
366711ae0cf88a236c2be6a043314c7a67e888db10a8Nadia Benbernou
366811ae0cf88a236c2be6a043314c7a67e888db10a8Nadia Benbernou        /**
366911ae0cf88a236c2be6a043314c7a67e888db10a8Nadia Benbernou         * Returns the dismissal id of the notification.
367011ae0cf88a236c2be6a043314c7a67e888db10a8Nadia Benbernou         * @return the dismissal id of the notification or null if it has not been set.
367111ae0cf88a236c2be6a043314c7a67e888db10a8Nadia Benbernou         */
367211ae0cf88a236c2be6a043314c7a67e888db10a8Nadia Benbernou        public String getDismissalId() {
367311ae0cf88a236c2be6a043314c7a67e888db10a8Nadia Benbernou            return mDismissalId;
367411ae0cf88a236c2be6a043314c7a67e888db10a8Nadia Benbernou        }
367511ae0cf88a236c2be6a043314c7a67e888db10a8Nadia Benbernou
3676eb11c916765fb435c4847056acb3677fae85ae5dAriel Gertzenstein        /**
3677eb11c916765fb435c4847056acb3677fae85ae5dAriel Gertzenstein         * Sets a bridge tag for this notification. A bridge tag can be set for notifications
3678eb11c916765fb435c4847056acb3677fae85ae5dAriel Gertzenstein         * posted from a phone to provide finer-grained control on what notifications are bridged
3679eb11c916765fb435c4847056acb3677fae85ae5dAriel Gertzenstein         * to wearables. See <a href="{@docRoot}wear/notifications/index.html">Adding Wearable
3680eb11c916765fb435c4847056acb3677fae85ae5dAriel Gertzenstein         * Features to Notifications</a> for more information.
3681eb11c916765fb435c4847056acb3677fae85ae5dAriel Gertzenstein         * @param bridgeTag the bridge tag of the notification.
3682eb11c916765fb435c4847056acb3677fae85ae5dAriel Gertzenstein         * @return this object for method chaining
3683eb11c916765fb435c4847056acb3677fae85ae5dAriel Gertzenstein         */
3684eb11c916765fb435c4847056acb3677fae85ae5dAriel Gertzenstein        public WearableExtender setBridgeTag(String bridgeTag) {
3685eb11c916765fb435c4847056acb3677fae85ae5dAriel Gertzenstein            mBridgeTag = bridgeTag;
3686eb11c916765fb435c4847056acb3677fae85ae5dAriel Gertzenstein            return this;
3687eb11c916765fb435c4847056acb3677fae85ae5dAriel Gertzenstein        }
3688eb11c916765fb435c4847056acb3677fae85ae5dAriel Gertzenstein
3689eb11c916765fb435c4847056acb3677fae85ae5dAriel Gertzenstein        /**
3690eb11c916765fb435c4847056acb3677fae85ae5dAriel Gertzenstein         * Returns the bridge tag of the notification.
3691eb11c916765fb435c4847056acb3677fae85ae5dAriel Gertzenstein         * @return the bridge tag or null if not present.
3692eb11c916765fb435c4847056acb3677fae85ae5dAriel Gertzenstein         */
3693eb11c916765fb435c4847056acb3677fae85ae5dAriel Gertzenstein        public String getBridgeTag() {
3694eb11c916765fb435c4847056acb3677fae85ae5dAriel Gertzenstein            return mBridgeTag;
3695eb11c916765fb435c4847056acb3677fae85ae5dAriel Gertzenstein        }
3696eb11c916765fb435c4847056acb3677fae85ae5dAriel Gertzenstein
36972bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        private void setFlag(int mask, boolean value) {
36982bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            if (value) {
36992bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                mFlags |= mask;
37002bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            } else {
37012bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                mFlags &= ~mask;
37022bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            }
37032bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
37042bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen    }
37052bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
37062bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen    /**
37078eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song     * <p>Helper class to add Android Auto extensions to notifications. To create a notification
37088eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song     * with car extensions:
37098eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song     *
37108eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song     * <ol>
37118eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song     *  <li>Create an {@link NotificationCompat.Builder}, setting any desired
37128eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song     *  properties.
37138eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song     *  <li>Create a {@link CarExtender}.
37148eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song     *  <li>Set car-specific properties using the {@code add} and {@code set} methods of
37158eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song     *  {@link CarExtender}.
37168eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song     *  <li>Call {@link android.support.v4.app.NotificationCompat.Builder#extend(NotificationCompat.Extender)}
37178eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song     *  to apply the extensions to a notification.
37188eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song     *  <li>Post the notification to the notification system with the
37198eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song     *  {@code NotificationManagerCompat.notify(...)} methods and not the
37208eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song     *  {@code NotificationManager.notify(...)} methods.
37218eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song     * </ol>
37228eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song     *
37238eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song     * <pre class="prettyprint">
37248eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song     * Notification notification = new NotificationCompat.Builder(context)
37258eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song     *         ...
37268eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song     *         .extend(new CarExtender()
37278eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song     *                 .set*(...))
37288eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song     *         .build();
37298eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song     * </pre>
37308eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song     *
37318eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song     * <p>Car extensions can be accessed on an existing notification by using the
37328eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song     * {@code CarExtender(Notification)} constructor, and then using the {@code get} methods
37338eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song     * to access values.
37348eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song     */
37358eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song    public static final class CarExtender implements Extender {
37368eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song        private static final String TAG = "CarExtender";
37378eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song
37388eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song        private static final String EXTRA_CAR_EXTENDER = "android.car.EXTENSIONS";
37398eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song        private static final String EXTRA_LARGE_ICON = "large_icon";
37408eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song        private static final String EXTRA_CONVERSATION = "car_conversation";
37418eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song        private static final String EXTRA_COLOR = "app_color";
37428eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song
37438eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song        private Bitmap mLargeIcon;
37448eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song        private UnreadConversation mUnreadConversation;
37458eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song        private int mColor = NotificationCompat.COLOR_DEFAULT;
37468eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song
37478eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song        /**
37488eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song         * Create a {@link CarExtender} with default options.
37498eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song         */
37508eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song        public CarExtender() {
37518eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song        }
37528eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song
37538eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song        /**
37548eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song         * Create a {@link CarExtender} from the CarExtender options of an existing Notification.
37558eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song         *
37568eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song         * @param notif The notification from which to copy options.
37578eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song         */
37588eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song        public CarExtender(Notification notif) {
37598eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song            if (Build.VERSION.SDK_INT < 21) {
37608eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                return;
37618eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song            }
37628eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song
37638eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song            Bundle carBundle = getExtras(notif)==null ?
37648eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                    null : getExtras(notif).getBundle(EXTRA_CAR_EXTENDER);
37658eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song            if (carBundle != null) {
37668eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                mLargeIcon = carBundle.getParcelable(EXTRA_LARGE_ICON);
37678eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                mColor = carBundle.getInt(EXTRA_COLOR, NotificationCompat.COLOR_DEFAULT);
37688eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song
37698eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                Bundle b = carBundle.getBundle(EXTRA_CONVERSATION);
37708eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                mUnreadConversation = (UnreadConversation) IMPL.getUnreadConversationFromBundle(
37718eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                        b, UnreadConversation.FACTORY, RemoteInput.FACTORY);
37728eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song            }
37738eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song        }
37748eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song
37758eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song        /**
37768eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song         * Apply car extensions to a notification that is being built. This is typically called by
37778eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song         * the {@link android.support.v4.app.NotificationCompat.Builder#extend(NotificationCompat.Extender)}
37788eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song         * method of {@link NotificationCompat.Builder}.
37798eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song         */
37808eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song        @Override
37818eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song        public NotificationCompat.Builder extend(NotificationCompat.Builder builder) {
37828eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song            if (Build.VERSION.SDK_INT < 21) {
37838eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                return builder;
37848eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song            }
37858eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song
37868eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song            Bundle carExtensions = new Bundle();
37878eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song
37888eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song            if (mLargeIcon != null) {
37898eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                carExtensions.putParcelable(EXTRA_LARGE_ICON, mLargeIcon);
37908eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song            }
37918eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song            if (mColor != NotificationCompat.COLOR_DEFAULT) {
37928eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                carExtensions.putInt(EXTRA_COLOR, mColor);
37938eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song            }
37948eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song
37958eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song            if (mUnreadConversation != null) {
37968eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                Bundle b = IMPL.getBundleForUnreadConversation(mUnreadConversation);
37978eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                carExtensions.putBundle(EXTRA_CONVERSATION, b);
37988eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song            }
37998eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song
38008eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song            builder.getExtras().putBundle(EXTRA_CAR_EXTENDER, carExtensions);
38018eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song            return builder;
38028eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song        }
38038eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song
38048eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song        /**
38058eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song         * Sets the accent color to use when Android Auto presents the notification.
38068eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song         *
38078eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song         * Android Auto uses the color set with {@link android.support.v4.app.NotificationCompat.Builder#setColor(int)}
38088eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song         * to accent the displayed notification. However, not all colors are acceptable in an
38098eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song         * automotive setting. This method can be used to override the color provided in the
38108eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song         * notification in such a situation.
38118eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song         */
381270acb0c19be3831a2080e4f902324de16bfbf62eTor Norbye        public CarExtender setColor(@ColorInt int color) {
38138eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song            mColor = color;
38148eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song            return this;
38158eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song        }
38168eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song
38178eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song        /**
38188eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song         * Gets the accent color.
38198eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song         *
3820ac1666bf1cb1e0688943d651c6c759d3f8061af3Julia Reynolds         * @see #setColor
38218eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song         */
382270acb0c19be3831a2080e4f902324de16bfbf62eTor Norbye        @ColorInt
38238eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song        public int getColor() {
38248eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song            return mColor;
38258eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song        }
38268eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song
38278eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song        /**
38288eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song         * Sets the large icon of the car notification.
38298eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song         *
38308eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song         * If no large icon is set in the extender, Android Auto will display the icon
38318eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song         * specified by {@link android.support.v4.app.NotificationCompat.Builder#setLargeIcon(android.graphics.Bitmap)}
38328eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song         *
38338eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song         * @param largeIcon The large icon to use in the car notification.
38348eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song         * @return This object for method chaining.
38358eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song         */
38368eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song        public CarExtender setLargeIcon(Bitmap largeIcon) {
38378eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song            mLargeIcon = largeIcon;
38388eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song            return this;
38398eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song        }
38408eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song
38418eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song        /**
38428eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song         * Gets the large icon used in this car notification, or null if no icon has been set.
38438eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song         *
38448eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song         * @return The large icon for the car notification.
38458eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song         * @see CarExtender#setLargeIcon
38468eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song         */
38478eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song        public Bitmap getLargeIcon() {
38488eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song            return mLargeIcon;
38498eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song        }
38508eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song
38518eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song        /**
38528eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song         * Sets the unread conversation in a message notification.
38538eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song         *
38548eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song         * @param unreadConversation The unread part of the conversation this notification conveys.
38558eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song         * @return This object for method chaining.
38568eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song         */
38578eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song        public CarExtender setUnreadConversation(UnreadConversation unreadConversation) {
38588eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song            mUnreadConversation = unreadConversation;
38598eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song            return this;
38608eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song        }
38618eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song
38628eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song        /**
38638eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song         * Returns the unread conversation conveyed by this notification.
38648eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song         * @see #setUnreadConversation(UnreadConversation)
38658eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song         */
38668eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song        public UnreadConversation getUnreadConversation() {
38678eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song            return mUnreadConversation;
38688eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song        }
38698eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song
38708eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song        /**
38718eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song         * A class which holds the unread messages from a conversation.
38728eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song         */
38738eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song        public static class UnreadConversation extends NotificationCompatBase.UnreadConversation {
38748eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song            private final String[] mMessages;
38758eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song            private final RemoteInput mRemoteInput;
38768eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song            private final PendingIntent mReplyPendingIntent;
38778eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song            private final PendingIntent mReadPendingIntent;
38788eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song            private final String[] mParticipants;
38798eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song            private final long mLatestTimestamp;
38808eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song
38818eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song            UnreadConversation(String[] messages, RemoteInput remoteInput,
38828eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                    PendingIntent replyPendingIntent, PendingIntent readPendingIntent,
38838eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                    String[] participants, long latestTimestamp) {
38848eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                mMessages = messages;
38858eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                mRemoteInput = remoteInput;
38868eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                mReadPendingIntent = readPendingIntent;
38878eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                mReplyPendingIntent = replyPendingIntent;
38888eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                mParticipants = participants;
38898eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                mLatestTimestamp = latestTimestamp;
38908eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song            }
38918eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song
38928eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song            /**
38938eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song             * Gets the list of messages conveyed by this notification.
38948eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song             */
38958eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song            @Override
389605bc3aaa395a0de55ec2e1f30d69bc6d1c18b150Zhen Yu Song            public String[] getMessages() {
38978eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                return mMessages;
38988eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song            }
38998eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song
39008eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song            /**
39018eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song             * Gets the remote input that will be used to convey the response to a message list, or
39028eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song             * null if no such remote input exists.
39038eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song             */
39048eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song            @Override
390505bc3aaa395a0de55ec2e1f30d69bc6d1c18b150Zhen Yu Song            public RemoteInput getRemoteInput() {
39068eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                return mRemoteInput;
39078eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song            }
39088eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song
39098eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song            /**
39108eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song             * Gets the pending intent that will be triggered when the user replies to this
39118eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song             * notification.
39128eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song             */
39138eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song            @Override
391405bc3aaa395a0de55ec2e1f30d69bc6d1c18b150Zhen Yu Song            public PendingIntent getReplyPendingIntent() {
39158eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                return mReplyPendingIntent;
39168eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song            }
39178eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song
39188eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song            /**
39198eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song             * Gets the pending intent that Android Auto will send after it reads aloud all messages
39208eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song             * in this object's message list.
39218eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song             */
39228eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song            @Override
392305bc3aaa395a0de55ec2e1f30d69bc6d1c18b150Zhen Yu Song            public PendingIntent getReadPendingIntent() {
39248eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                return mReadPendingIntent;
39258eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song            }
39268eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song
39278eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song            /**
39288eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song             * Gets the participants in the conversation.
39298eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song             */
39308eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song            @Override
393105bc3aaa395a0de55ec2e1f30d69bc6d1c18b150Zhen Yu Song            public String[] getParticipants() {
39328eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                return mParticipants;
39338eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song            }
39348eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song
39358eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song            /**
39368eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song             * Gets the firs participant in the conversation.
39378eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song             */
39388eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song            @Override
393905bc3aaa395a0de55ec2e1f30d69bc6d1c18b150Zhen Yu Song            public String getParticipant() {
39408eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                return mParticipants.length > 0 ? mParticipants[0] : null;
39418eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song            }
39428eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song
39438eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song            /**
39448eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song             * Gets the timestamp of the conversation.
39458eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song             */
39468eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song            @Override
394705bc3aaa395a0de55ec2e1f30d69bc6d1c18b150Zhen Yu Song            public long getLatestTimestamp() {
39488eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                return mLatestTimestamp;
39498eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song            }
39508eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song
39518eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song            static final Factory FACTORY = new Factory() {
39528eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                @Override
39538eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                public UnreadConversation build(
39548eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                        String[] messages, RemoteInputCompatBase.RemoteInput remoteInput,
39558eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                        PendingIntent replyPendingIntent, PendingIntent readPendingIntent,
39568eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                        String[] participants, long latestTimestamp) {
39578eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                    return new UnreadConversation(
39588eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                            messages, (RemoteInput) remoteInput, replyPendingIntent,
39598eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                            readPendingIntent,
39608eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                            participants, latestTimestamp);
39618eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                }
39628eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song            };
39638eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song
39648eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song            /**
39658eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song             * Builder class for {@link CarExtender.UnreadConversation} objects.
39668eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song             */
39678eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song            public static class Builder {
39688eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                private final List<String> mMessages = new ArrayList<String>();
39698eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                private final String mParticipant;
39708eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                private RemoteInput mRemoteInput;
39718eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                private PendingIntent mReadPendingIntent;
39728eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                private PendingIntent mReplyPendingIntent;
39738eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                private long mLatestTimestamp;
39748eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song
39758eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                /**
39768eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                 * Constructs a new builder for {@link CarExtender.UnreadConversation}.
39778eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                 *
39788eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                 * @param name The name of the other participant in the conversation.
39798eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                 */
39808eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                public Builder(String name) {
39818eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                    mParticipant = name;
39828eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                }
39838eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song
39848eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                /**
39858eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                 * Appends a new unread message to the list of messages for this conversation.
39868eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                 *
39878eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                 * The messages should be added from oldest to newest.
39888eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                 *
39898eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                 * @param message The text of the new unread message.
39908eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                 * @return This object for method chaining.
39918eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                 */
39928eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                public Builder addMessage(String message) {
39938eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                    mMessages.add(message);
39948eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                    return this;
39958eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                }
39968eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song
39978eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                /**
39988eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                 * Sets the pending intent and remote input which will convey the reply to this
39998eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                 * notification.
40008eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                 *
40018eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                 * @param pendingIntent The pending intent which will be triggered on a reply.
40028eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                 * @param remoteInput The remote input parcelable which will carry the reply.
40038eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                 * @return This object for method chaining.
40048eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                 *
40058eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                 * @see CarExtender.UnreadConversation#getRemoteInput
40068eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                 * @see CarExtender.UnreadConversation#getReplyPendingIntent
40078eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                 */
40088eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                public Builder setReplyAction(
40098eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                        PendingIntent pendingIntent, RemoteInput remoteInput) {
40108eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                    mRemoteInput = remoteInput;
40118eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                    mReplyPendingIntent = pendingIntent;
40128eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song
40138eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                    return this;
40148eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                }
40158eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song
40168eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                /**
40178eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                 * Sets the pending intent that will be sent once the messages in this notification
40188eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                 * are read.
40198eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                 *
40208eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                 * @param pendingIntent The pending intent to use.
40218eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                 * @return This object for method chaining.
40228eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                 */
40238eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                public Builder setReadPendingIntent(PendingIntent pendingIntent) {
40248eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                    mReadPendingIntent = pendingIntent;
40258eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                    return this;
40268eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                }
40278eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song
40288eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                /**
40298eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                 * Sets the timestamp of the most recent message in an unread conversation.
40308eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                 *
40318eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                 * If a messaging notification has been posted by your application and has not
40328eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                 * yet been cancelled, posting a later notification with the same id and tag
40338eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                 * but without a newer timestamp may result in Android Auto not displaying a
40348eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                 * heads up notification for the later notification.
40358eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                 *
40368eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                 * @param timestamp The timestamp of the most recent message in the conversation.
40378eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                 * @return This object for method chaining.
40388eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                 */
40398eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                public Builder setLatestTimestamp(long timestamp) {
40408eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                    mLatestTimestamp = timestamp;
40418eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                    return this;
40428eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                }
40438eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song
40448eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                /**
40458eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                 * Builds a new unread conversation object.
40468eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                 *
40478eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                 * @return The new unread conversation object.
40488eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                 */
40498eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                public UnreadConversation build() {
40508eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                    String[] messages = mMessages.toArray(new String[mMessages.size()]);
40518eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                    String[] participants = { mParticipant };
40528eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                    return new UnreadConversation(messages, mRemoteInput, mReplyPendingIntent,
40538eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                            mReadPendingIntent, participants, mLatestTimestamp);
40548eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song                }
40558eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song            }
40568eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song        }
40578eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song    }
40588eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song
40598eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song
40608eb16c1d9f309b829348e3c9342b745ce8cdef44Zhen Yu Song    /**
40612bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     * Get an array of Notification objects from a parcelable array bundle field.
40622bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     * Update the bundle to have a typed array so fetches in the future don't need
40632bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     * to do an array copy.
40642bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen     */
4065552766fa685c63ad760c92239faaba12e6ad51f1Aurimas Liutikas    static Notification[] getNotificationArrayFromBundle(Bundle bundle, String key) {
40662bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        Parcelable[] array = bundle.getParcelableArray(key);
40672bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        if (array instanceof Notification[] || array == null) {
40682bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            return (Notification[]) array;
40692bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
40702bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        Notification[] typedArray = new Notification[array.length];
40712bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        for (int i = 0; i < array.length; i++) {
40722bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            typedArray[i] = (Notification) array[i];
40732bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        }
40742bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        bundle.putParcelableArray(key, typedArray);
40752bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen        return typedArray;
40762bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen    }
40772bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
4078b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen    /**
4079b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen     * Gets the {@link Notification#extras} field from a notification in a backwards
4080b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen     * compatible manner. Extras field was supported from JellyBean (Api level 16)
4081b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen     * forwards. This function will return null on older api levels.
4082b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen     */
4083b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen    public static Bundle getExtras(Notification notif) {
4084b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        return IMPL.getExtras(notif);
4085b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen    }
4086b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen
4087b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen    /**
4088300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen     * Get the number of actions in this notification in a backwards compatible
4089300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen     * manner. Actions were supported from JellyBean (Api level 16) forwards.
4090300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen     */
4091300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen    public static int getActionCount(Notification notif) {
4092300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        return IMPL.getActionCount(notif);
4093300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen    }
4094300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
4095300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen    /**
4096300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen     * Get an action on this notification in a backwards compatible
4097300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen     * manner. Actions were supported from JellyBean (Api level 16) forwards.
4098300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen     * @param notif The notification to inspect.
4099300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen     * @param actionIndex The index of the action to retrieve.
4100300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen     */
4101300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen    public static Action getAction(Notification notif, int actionIndex) {
4102300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen        return IMPL.getAction(notif, actionIndex);
4103300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen    }
4104300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen
4105300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen    /**
410643cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills     * Get the category of this notification in a backwards compatible
410743cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills     * manner.
410843cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills     * @param notif The notification to inspect.
410943cbaca7b2d9a888c0a65df5fb6da73bf288505fAlex Hills     */
411075e2071f16bae2b22d1618026d10337daad862cfBryan Mawhinney    public static String getCategory(Notification notif) {
411175e2071f16bae2b22d1618026d10337daad862cfBryan Mawhinney        return IMPL.getCategory(notif);
411275e2071f16bae2b22d1618026d10337daad862cfBryan Mawhinney    }
411375e2071f16bae2b22d1618026d10337daad862cfBryan Mawhinney
411475e2071f16bae2b22d1618026d10337daad862cfBryan Mawhinney    /**
4115b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen     * Get whether or not this notification is only relevant to the current device.
4116b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen     *
4117b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen     * <p>Some notifications can be bridged to other devices for remote display.
4118b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen     * If this hint is set, it is recommend that this notification not be bridged.
4119b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen     */
4120b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen    public static boolean getLocalOnly(Notification notif) {
4121b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        return IMPL.getLocalOnly(notif);
4122b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen    }
4123ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
4124ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    /**
4125ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     * Get the key used to group this notification into a cluster or stack
4126ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     * with other notifications on devices which support such rendering.
4127ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     */
4128ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    public static String getGroup(Notification notif) {
4129ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        return IMPL.getGroup(notif);
4130ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    }
4131ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
4132ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    /**
4133ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     * Get whether this notification to be the group summary for a group of notifications.
4134ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     * Grouped notifications may display in a cluster or stack on devices which
4135ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     * support such rendering. Requires a group key also be set using {@link Builder#setGroup}.
4136ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     * @return Whether this notification is a group summary.
4137ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     */
4138ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    public static boolean isGroupSummary(Notification notif) {
4139ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        return IMPL.isGroupSummary(notif);
4140ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    }
4141ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
4142ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    /**
4143ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     * Get a sort key that orders this notification among other notifications from the
4144ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     * same package. This can be useful if an external sort was already applied and an app
4145ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     * would like to preserve this. Notifications will be sorted lexicographically using this
4146ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     * value, although providing different priorities in addition to providing sort key may
4147ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     * cause this value to be ignored.
4148ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     *
4149ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     * <p>This sort key can also be used to order members of a notification group. See
4150ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     * {@link Builder#setGroup}.
4151ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     *
4152ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     * @see String#compareTo(String)
4153ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen     */
4154ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    public static String getSortKey(Notification notif) {
4155ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        return IMPL.getSortKey(notif);
4156ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    }
4157c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell}
4158