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