19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.app;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19110988c8b70f4ab089b179b7966497d508506263Andy Stadlerimport com.android.internal.R;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent;
239f7936a30bc097c31962891945802507cb4aeb82Daniel Sandlerimport android.content.res.Resources;
24ef1e7763c2dc5b9bac69cc747efe05c81d9fd9fcJoe Onoratoimport android.graphics.Bitmap;
25098d580cc2bb6c0891c756a4e5230c6c6b0d2376Jeff Sharkeyimport android.media.AudioManager;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri;
272561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandlerimport android.os.Bundle;
28a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandlerimport android.os.IBinder;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcelable;
31a2985ed3099c9206a4fd9fd8eaf0e4025b82aca9Daniel Sandlerimport android.os.SystemClock;
326d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkeyimport android.os.UserHandle;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.TextUtils;
34a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandlerimport android.util.IntProperty;
3596fd7c1c1acc03b40b1813ef65793560c175ef80Daniel Sandlerimport android.util.Log;
369f7936a30bc097c31962891945802507cb4aeb82Daniel Sandlerimport android.util.Slog;
379f7936a30bc097c31962891945802507cb4aeb82Daniel Sandlerimport android.util.TypedValue;
388595a3dd9a6feff70f8ddbad924d79b591d611e4Joe Onoratoimport android.view.View;
391c40013bb2afbd76050ac681d7880476aa7fc70dJeff Sharkeyimport android.widget.ProgressBar;
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.RemoteViews;
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42110988c8b70f4ab089b179b7966497d508506263Andy Stadlerimport java.text.NumberFormat;
432561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandlerimport java.util.ArrayList;
44561d3858bb9409b999a19f7ba93f0b12e1db835fJoe Onorato
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A class that represents how a persistent notification is to be presented to
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the user using the {@link android.app.NotificationManager}.
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato * <p>The {@link Notification.Builder Notification.Builder} has been added to make it
50cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato * easier to construct Notifications.</p>
51cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato *
52558459fe85f56f29a6ed6a4d0adb4a0bd6665884Joe Fernandez * <div class="special reference">
53558459fe85f56f29a6ed6a4d0adb4a0bd6665884Joe Fernandez * <h3>Developer Guides</h3>
54558459fe85f56f29a6ed6a4d0adb4a0bd6665884Joe Fernandez * <p>For a guide to creating notifications, read the
55558459fe85f56f29a6ed6a4d0adb4a0bd6665884Joe Fernandez * <a href="{@docRoot}guide/topics/ui/notifiers/notifications.html">Status Bar Notifications</a>
56558459fe85f56f29a6ed6a4d0adb4a0bd6665884Joe Fernandez * developer guide.</p>
57558459fe85f56f29a6ed6a4d0adb4a0bd6665884Joe Fernandez * </div>
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class Notification implements Parcelable
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use all default values (where applicable).
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int DEFAULT_ALL = ~0;
652561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use the default notification sound. This will ignore any given
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #sound}.
692561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     *
702561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #defaults
722561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     */
732561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int DEFAULT_SOUND = 1;
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use the default notification vibrate. This will ignore any given
782561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     * {@link #vibrate}. Using phone vibration requires the
79b8b3645a9799c38ad68549316ebbf7a4849f2e0cScott Main     * {@link android.Manifest.permission#VIBRATE VIBRATE} permission.
802561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     *
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #defaults
822561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     */
832561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int DEFAULT_VIBRATE = 2;
852561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use the default notification lights. This will ignore the
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #FLAG_SHOW_LIGHTS} bit, and {@link #ledARGB}, {@link #ledOffMS}, or
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #ledOnMS}.
902561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     *
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #defaults
922561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     */
932561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int DEFAULT_LIGHTS = 4;
952561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
972561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     * A timestamp related to this notification, in milliseconds since the epoch.
982561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     *
992561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     * Default value: {@link System#currentTimeMillis() Now}.
1002561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     *
1012561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     * Choose a timestamp that will be most relevant to the user. For most finite events, this
1022561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     * corresponds to the time the event happened (or will happen, in the case of events that have
1032561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     * yet to occur but about which the user is being informed). Indefinite events should be
1042561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     * timestamped according to when the activity began.
1052561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     *
1062561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     * Some examples:
1072561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     *
1082561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     * <ul>
1092561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     *   <li>Notification of a new chat message should be stamped when the message was received.</li>
1102561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     *   <li>Notification of an ongoing file download (with a progress bar, for example) should be stamped when the download started.</li>
1112561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     *   <li>Notification of a completed file download should be stamped when the download finished.</li>
1122561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     *   <li>Notification of an upcoming meeting should be stamped with the time the meeting will begin (that is, in the future).</li>
1132561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     *   <li>Notification of an ongoing stopwatch (increasing timer) should be stamped with the watch's start time.
1142561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     *   <li>Notification of an ongoing countdown timer should be stamped with the timer's end time.
1152561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     * </ul>
1162561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     *
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long when;
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The resource id of a drawable to use as the icon in the status bar.
122d952daec06018fe7064b8cafd31dfc71f9eee383Daniel Sandler     * This is required; notifications with an invalid icon resource will not be shown.
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int icon;
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
12746439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato     * If the icon in the status bar is to have more than one level, you can set this.  Otherwise,
12846439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato     * leave it at its default value of 0.
12946439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato     *
13046439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato     * @see android.widget.ImageView#setImageLevel
13146439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato     * @see android.graphics.drawable#setLevel
13246439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato     */
13346439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato    public int iconLevel;
13446439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato
13546439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato    /**
1362561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     * The number of events that this notification represents. For example, in a new mail
1372561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     * notification, this could be the number of unread messages.
1382561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     *
1392561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     * The system may or may not use this field to modify the appearance of the notification. For
1402561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     * example, before {@link android.os.Build.VERSION_CODES#HONEYCOMB}, this number was
1412561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     * superimposed over the icon in the status bar. Starting with
1422561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     * {@link android.os.Build.VERSION_CODES#HONEYCOMB}, the template used by
1432561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     * {@link Notification.Builder} has displayed the number in the expanded notification view.
1442561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     *
1452561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     * If the number is 0 or negative, it is never shown.
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int number;
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The intent to execute when the expanded status entry is clicked.  If
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this is an activity, it must include the
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.content.Intent#FLAG_ACTIVITY_NEW_TASK} flag, which requires
1537aee61f5a96e94e158bf5ad3d8e192c4d4f7eff6Scott Main     * that you take care of task management as described in the
1547aee61f5a96e94e158bf5ad3d8e192c4d4f7eff6Scott Main     * <a href="{@docRoot}guide/topics/fundamentals/tasks-and-back-stack.html">Tasks and Back
1556ceca588a268ed8fef4b32df278ca7567e608510Dianne Hackborn     * Stack</a> document.  In particular, make sure to read the notification section
1566ceca588a268ed8fef4b32df278ca7567e608510Dianne Hackborn     * <a href="{@docRoot}guide/topics/ui/notifiers/notifications.html#HandlingNotifications">Handling
1576ceca588a268ed8fef4b32df278ca7567e608510Dianne Hackborn     * Notifications</a> for the correct ways to launch an application from a
1586ceca588a268ed8fef4b32df278ca7567e608510Dianne Hackborn     * notification.
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public PendingIntent contentIntent;
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1632561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     * The intent to execute when the notification is explicitly dismissed by the user, either with
1642561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     * the "Clear All" button or by swiping it away individually.
1652561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     *
1662561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     * This probably shouldn't be launching an activity since several of those will be sent
1672561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     * at the same time.
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public PendingIntent deleteIntent;
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
172170bae7d832e0fd68e1ee9d96893b97e1dd98c52Dianne Hackborn     * An intent to launch instead of posting the notification to the status bar.
173cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato     *
174cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato     * @see Notification.Builder#setFullScreenIntent
175e46cbd379a3c19708c7f7e5d3f35e2c596de0c46Daniel Sandler     */
176e46cbd379a3c19708c7f7e5d3f35e2c596de0c46Daniel Sandler    public PendingIntent fullScreenIntent;
177e46cbd379a3c19708c7f7e5d3f35e2c596de0c46Daniel Sandler
178e46cbd379a3c19708c7f7e5d3f35e2c596de0c46Daniel Sandler    /**
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Text to scroll across the screen when this item is added to
180ef1e7763c2dc5b9bac69cc747efe05c81d9fd9fcJoe Onorato     * the status bar on large and smaller devices.
181ef1e7763c2dc5b9bac69cc747efe05c81d9fd9fcJoe Onorato     *
18246439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato     * @see #tickerView
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public CharSequence tickerText;
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
18746439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato     * The view to show as the ticker in the status bar when the notification
18846439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato     * is posted.
189ef1e7763c2dc5b9bac69cc747efe05c81d9fd9fcJoe Onorato     */
19046439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato    public RemoteViews tickerView;
191ef1e7763c2dc5b9bac69cc747efe05c81d9fd9fcJoe Onorato
192ef1e7763c2dc5b9bac69cc747efe05c81d9fd9fcJoe Onorato    /**
193e46cbd379a3c19708c7f7e5d3f35e2c596de0c46Daniel Sandler     * The view that will represent this notification in the expanded status bar.
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public RemoteViews contentView;
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
197a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler    /**
1984dfbe83e1a110b416badf73ddf68c83db0d415aeDaniel Sandler     * A large-format version of {@link #contentView}, giving the Notification an
199f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler     * opportunity to show more detail. The system UI may choose to show this
200f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler     * instead of the normal content view at its discretion.
201f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler     */
202f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler    public RemoteViews bigContentView;
203f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler
204f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler    /**
20546439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato     * The bitmap that may escape the bounds of the panel and bar.
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
20746439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato    public Bitmap largeIcon;
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The sound to play.
2112561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     *
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
2132561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     * To play the default notification sound, see {@link #defaults}.
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * </p>
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Uri sound;
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use this constant as the value for audioStreamType to request that
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the default stream type for notifications be used.  Currently the
221098d580cc2bb6c0891c756a4e5230c6c6b0d2376Jeff Sharkey     * default stream type is {@link AudioManager#STREAM_NOTIFICATION}.
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int STREAM_DEFAULT = -1;
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The audio stream type to use when playing the sound.
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Should be one of the STREAM_ constants from
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.media.AudioManager}.
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int audioStreamType = STREAM_DEFAULT;
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2332561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     * The pattern with which to vibrate.
2342561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     *
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * To vibrate the default pattern, see {@link #defaults}.
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * </p>
2382561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     *
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.os.Vibrator#vibrate(long[],int)
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long[] vibrate;
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The color of the led.  The hardware will do its best approximation.
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #FLAG_SHOW_LIGHTS
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #flags
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int ledARGB;
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The number of milliseconds for the LED to be on while it's flashing.
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The hardware will do its best approximation.
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #FLAG_SHOW_LIGHTS
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #flags
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int ledOnMS;
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The number of milliseconds for the LED to be off while it's flashing.
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The hardware will do its best approximation.
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #FLAG_SHOW_LIGHTS
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #flags
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int ledOffMS;
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Specifies which values should be taken from the defaults.
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * To set, OR the desired from {@link #DEFAULT_SOUND},
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #DEFAULT_VIBRATE}, {@link #DEFAULT_LIGHTS}. For all default
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * values, use {@link #DEFAULT_ALL}.
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * </p>
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int defaults;
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Bit to be bitwise-ored into the {@link #flags} field that should be
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * set if you want the LED on for this notification.
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <ul>
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <li>To turn the LED off, pass 0 in the alpha channel for colorARGB
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *      or 0 for both ledOnMS and ledOffMS.</li>
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <li>To turn the LED on, pass 1 for ledOnMS and 0 for ledOffMS.</li>
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <li>To flash the LED, pass the number of milliseconds that it should
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *      be on and off to ledOnMS and ledOffMS.</li>
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * </ul>
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Since hardware varies, you are not guaranteed that any of the values
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * you pass are honored exactly.  Use the system defaults (TODO) if possible
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * because they will be set to values that work on any given hardware.
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The alpha channel must be set for forward compatibility.
2952561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     *
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int FLAG_SHOW_LIGHTS        = 0x00000001;
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Bit to be bitwise-ored into the {@link #flags} field that should be
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * set if this notification is in reference to something that is ongoing,
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * like a phone call.  It should not be set if this notification is in
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * reference to something that happened at a particular point in time,
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * like a missed phone call.
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int FLAG_ONGOING_EVENT      = 0x00000002;
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Bit to be bitwise-ored into the {@link #flags} field that if set,
310b8b3645a9799c38ad68549316ebbf7a4849f2e0cScott Main     * the audio will be repeated until the notification is
311b8b3645a9799c38ad68549316ebbf7a4849f2e0cScott Main     * cancelled or the notification window is opened.
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int FLAG_INSISTENT          = 0x00000004;
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Bit to be bitwise-ored into the {@link #flags} field that should be
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * set if you want the sound and/or vibration play each time the
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * notification is sent, even if it has not been canceled before that.
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int FLAG_ONLY_ALERT_ONCE    = 0x00000008;
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Bit to be bitwise-ored into the {@link #flags} field that should be
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * set if the notification should be canceled when it is clicked by the
3252561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     * user.  On tablets, the
3262561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int FLAG_AUTO_CANCEL        = 0x00000010;
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Bit to be bitwise-ored into the {@link #flags} field that should be
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * set if the notification should not be canceled when the user clicks
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the Clear all button.
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int FLAG_NO_CLEAR           = 0x00000020;
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
337d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn    /**
338d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn     * Bit to be bitwise-ored into the {@link #flags} field that should be
339d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn     * set if this notification represents a currently running service.  This
340d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn     * will normally be set for you by {@link Service#startForeground}.
341d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn     */
342d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn    public static final int FLAG_FOREGROUND_SERVICE = 0x00000040;
343d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn
344e46cbd379a3c19708c7f7e5d3f35e2c596de0c46Daniel Sandler    /**
3452561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     * Obsolete flag indicating high-priority notifications; use the priority field instead.
3462561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     *
3472561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     * @deprecated Use {@link #priority} with a positive value.
348e46cbd379a3c19708c7f7e5d3f35e2c596de0c46Daniel Sandler     */
3492561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler    public static final int FLAG_HIGH_PRIORITY      = 0x00000080;
350e46cbd379a3c19708c7f7e5d3f35e2c596de0c46Daniel Sandler
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int flags;
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3542561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     * Default notification {@link #priority}. If your application does not prioritize its own
3552561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     * notifications, use this value for all notifications.
3562561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     */
3572561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler    public static final int PRIORITY_DEFAULT = 0;
3582561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler
3592561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler    /**
3602561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     * Lower {@link #priority}, for items that are less important. The UI may choose to show these
3612561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     * items smaller, or at a different position in the list, compared with your app's
3622561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     * {@link #PRIORITY_DEFAULT} items.
3632561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     */
3642561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler    public static final int PRIORITY_LOW = -1;
3652561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler
3662561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler    /**
3672561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     * Lowest {@link #priority}; these items might not be shown to the user except under special
3682561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     * circumstances, such as detailed notification logs.
3692561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     */
3702561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler    public static final int PRIORITY_MIN = -2;
3712561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler
3722561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler    /**
3732561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     * Higher {@link #priority}, for more important notifications or alerts. The UI may choose to
3742561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     * show these items larger, or at a different position in notification lists, compared with
3752561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     * your app's {@link #PRIORITY_DEFAULT} items.
3762561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     */
3772561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler    public static final int PRIORITY_HIGH = 1;
3782561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler
3792561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler    /**
3802561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     * Highest {@link #priority}, for your application's most important items that require the
3812561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     * user's prompt attention or input.
3822561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     */
3832561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler    public static final int PRIORITY_MAX = 2;
3842561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler
3852561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler    /**
3862561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     * Relative priority for this notification.
3872561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     *
3882561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     * Priority is an indication of how much of the user's valuable attention should be consumed by
3892561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     * this notification. Low-priority notifications may be hidden from the user in certain
3902561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     * situations, while the user might be interrupted for a higher-priority notification. The
3912561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     * system will make a determination about how to interpret notification priority as described in
3922561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     * MUMBLE MUMBLE.
3932561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     */
3942561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler    public int priority;
3952561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler
3962561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler    /**
397d33b803b6bfcbc509dd7cee3ee23f819dfff296eDaniel Sandler     * @hide
3982561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     * Notification type: incoming call (voice or video) or similar synchronous communication request.
3992561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     */
4002561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler    public static final String KIND_CALL = "android.call";
4012561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler
4022561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler    /**
403d33b803b6bfcbc509dd7cee3ee23f819dfff296eDaniel Sandler     * @hide
4042561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     * Notification type: incoming direct message (SMS, instant message, etc.).
4052561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     */
4062561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler    public static final String KIND_MESSAGE = "android.message";
4072561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler
4082561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler    /**
409d33b803b6bfcbc509dd7cee3ee23f819dfff296eDaniel Sandler     * @hide
4102561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     * Notification type: asynchronous bulk message (email).
4112561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     */
4122561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler    public static final String KIND_EMAIL = "android.email";
4132561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler
4142561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler    /**
415d33b803b6bfcbc509dd7cee3ee23f819dfff296eDaniel Sandler     * @hide
4162561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     * Notification type: calendar event.
4172561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     */
4182561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler    public static final String KIND_EVENT = "android.event";
4192561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler
4202561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler    /**
421a90513d5f4e9f9ba20fca60bcf8548e23863c395Daniel Sandler     * @hide
4222561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     * Notification type: promotion or advertisement.
4232561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     */
4242561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler    public static final String KIND_PROMO = "android.promo";
4252561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler
4262561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler    /**
427d33b803b6bfcbc509dd7cee3ee23f819dfff296eDaniel Sandler     * @hide
4282561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     * If this notification matches of one or more special types (see the <code>KIND_*</code>
4292561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     * constants), add them here, best match first.
4302561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     */
4312561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler    public String[] kind;
4322561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler
4332561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler    /**
4342561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     * Extra key for people values (type TBD).
4352561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     *
4362561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     * @hide
4372561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     */
4382561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler    public static final String EXTRA_PEOPLE = "android.people";
4392561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler
4402561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler    private Bundle extras;
4412561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler
4422561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler    /**
443a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler     * Structure to encapsulate an "action", including title and icon, that can be attached to a Notification.
444a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler     * @hide
445a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler     */
446a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler    private static class Action implements Parcelable {
447a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler        public int icon;
448a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler        public CharSequence title;
449a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler        public PendingIntent actionIntent;
450a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler        @SuppressWarnings("unused")
451a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler        public Action() { }
452a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler        private Action(Parcel in) {
453a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler            icon = in.readInt();
454a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler            title = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in);
455a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler            if (in.readInt() == 1) {
456a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler                actionIntent = PendingIntent.CREATOR.createFromParcel(in);
457a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler            }
458a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler        }
459a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler        public Action(int icon_, CharSequence title_, PendingIntent intent_) {
460a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler            this.icon = icon_;
461a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler            this.title = title_;
462a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler            this.actionIntent = intent_;
463a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler        }
464a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler        @Override
465a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler        public Action clone() {
466a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler            return new Action(
467a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler                this.icon,
468a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler                this.title.toString(),
469a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler                this.actionIntent // safe to alias
470a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler            );
471a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler        }
472a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler        @Override
473a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler        public int describeContents() {
474a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler            return 0;
475a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler        }
476a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler        @Override
477a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler        public void writeToParcel(Parcel out, int flags) {
478a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler            out.writeInt(icon);
479a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler            TextUtils.writeToParcel(title, out, flags);
480a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler            if (actionIntent != null) {
481a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler                out.writeInt(1);
482a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler                actionIntent.writeToParcel(out, flags);
483a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler            } else {
484a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler                out.writeInt(0);
485a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler            }
486a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler        }
487a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler        public static final Parcelable.Creator<Action> CREATOR
488a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler        = new Parcelable.Creator<Action>() {
489a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler            public Action createFromParcel(Parcel in) {
490a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler                return new Action(in);
491a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler            }
492a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler            public Action[] newArray(int size) {
493a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler                return new Action[size];
494a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler            }
495a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler        };
496a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler    }
497a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler
498a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler    private Action[] actions;
499a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler
500a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler    /**
5012561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     * Constructs a Notification object with default values.
50246439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato     * You might want to consider using {@link Builder} instead.
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Notification()
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this.when = System.currentTimeMillis();
5072561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler        this.priority = PRIORITY_DEFAULT;
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Notification(Context context, int icon, CharSequence tickerText, long when,
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CharSequence contentTitle, CharSequence contentText, Intent contentIntent)
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this.when = when;
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this.icon = icon;
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this.tickerText = tickerText;
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setLatestEventInfo(context, contentTitle, contentText,
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                PendingIntent.getActivity(context, 0, contentIntent, 0));
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Constructs a Notification object with the information needed to
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * have a status bar icon without the standard expanded view.
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param icon          The resource id of the icon to put in the status bar.
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param tickerText    The text that flows by in the status bar when the notification first
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                      activates.
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param when          The time to show in the time field.  In the System.currentTimeMillis
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                      timebase.
53246439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato     *
53346439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato     * @deprecated Use {@link Builder} instead.
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
53546439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato    @Deprecated
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Notification(int icon, CharSequence tickerText, long when)
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this.icon = icon;
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this.tickerText = tickerText;
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this.when = when;
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Unflatten the notification from a parcel.
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Notification(Parcel parcel)
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int version = parcel.readInt();
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        when = parcel.readLong();
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        icon = parcel.readInt();
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        number = parcel.readInt();
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (parcel.readInt() != 0) {
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            contentIntent = PendingIntent.CREATOR.createFromParcel(parcel);
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (parcel.readInt() != 0) {
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            deleteIntent = PendingIntent.CREATOR.createFromParcel(parcel);
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (parcel.readInt() != 0) {
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            tickerText = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(parcel);
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (parcel.readInt() != 0) {
56346439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            tickerView = RemoteViews.CREATOR.createFromParcel(parcel);
564ef1e7763c2dc5b9bac69cc747efe05c81d9fd9fcJoe Onorato        }
565ef1e7763c2dc5b9bac69cc747efe05c81d9fd9fcJoe Onorato        if (parcel.readInt() != 0) {
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            contentView = RemoteViews.CREATOR.createFromParcel(parcel);
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
568561d3858bb9409b999a19f7ba93f0b12e1db835fJoe Onorato        if (parcel.readInt() != 0) {
569561d3858bb9409b999a19f7ba93f0b12e1db835fJoe Onorato            largeIcon = Bitmap.CREATOR.createFromParcel(parcel);
570561d3858bb9409b999a19f7ba93f0b12e1db835fJoe Onorato        }
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        defaults = parcel.readInt();
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        flags = parcel.readInt();
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (parcel.readInt() != 0) {
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sound = Uri.CREATOR.createFromParcel(parcel);
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        audioStreamType = parcel.readInt();
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        vibrate = parcel.createLongArray();
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ledARGB = parcel.readInt();
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ledOnMS = parcel.readInt();
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ledOffMS = parcel.readInt();
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        iconLevel = parcel.readInt();
583e46cbd379a3c19708c7f7e5d3f35e2c596de0c46Daniel Sandler
584e46cbd379a3c19708c7f7e5d3f35e2c596de0c46Daniel Sandler        if (parcel.readInt() != 0) {
585e46cbd379a3c19708c7f7e5d3f35e2c596de0c46Daniel Sandler            fullScreenIntent = PendingIntent.CREATOR.createFromParcel(parcel);
586e46cbd379a3c19708c7f7e5d3f35e2c596de0c46Daniel Sandler        }
5872561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler
5882561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler        priority = parcel.readInt();
589a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler
5902561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler        kind = parcel.createStringArray(); // may set kind to null
5912561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler
5922561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler        if (parcel.readInt() != 0) {
5932561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler            extras = parcel.readBundle();
5942561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler        }
595a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler
596a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler        actions = parcel.createTypedArray(Action.CREATOR);
597a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler        if (parcel.readInt() != 0) {
598f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler            bigContentView = RemoteViews.CREATOR.createFromParcel(parcel);
599f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler        }
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
602110988c8b70f4ab089b179b7966497d508506263Andy Stadler    @Override
60318e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato    public Notification clone() {
60418e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato        Notification that = new Notification();
60518e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato
60618e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato        that.when = this.when;
60718e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato        that.icon = this.icon;
60818e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato        that.number = this.number;
60918e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato
61018e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato        // PendingIntents are global, so there's no reason (or way) to clone them.
61118e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato        that.contentIntent = this.contentIntent;
61218e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato        that.deleteIntent = this.deleteIntent;
613e46cbd379a3c19708c7f7e5d3f35e2c596de0c46Daniel Sandler        that.fullScreenIntent = this.fullScreenIntent;
61418e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato
61518e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato        if (this.tickerText != null) {
61618e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato            that.tickerText = this.tickerText.toString();
61718e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato        }
61846439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        if (this.tickerView != null) {
61946439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            that.tickerView = this.tickerView.clone();
620ef1e7763c2dc5b9bac69cc747efe05c81d9fd9fcJoe Onorato        }
62118e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato        if (this.contentView != null) {
62218e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato            that.contentView = this.contentView.clone();
62318e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato        }
624561d3858bb9409b999a19f7ba93f0b12e1db835fJoe Onorato        if (this.largeIcon != null) {
625561d3858bb9409b999a19f7ba93f0b12e1db835fJoe Onorato            that.largeIcon = Bitmap.createBitmap(this.largeIcon);
626561d3858bb9409b999a19f7ba93f0b12e1db835fJoe Onorato        }
627a8b9183a7cb4dca8d8e6507abc765c581bf67dcbJozef BABJAK        that.iconLevel = this.iconLevel;
62818e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato        that.sound = this.sound; // android.net.Uri is immutable
62918e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato        that.audioStreamType = this.audioStreamType;
63018e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato
63118e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato        final long[] vibrate = this.vibrate;
63218e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato        if (vibrate != null) {
63318e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato            final int N = vibrate.length;
63418e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato            final long[] vib = that.vibrate = new long[N];
63518e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato            System.arraycopy(vibrate, 0, vib, 0, N);
63618e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato        }
63718e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato
63818e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato        that.ledARGB = this.ledARGB;
63918e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato        that.ledOnMS = this.ledOnMS;
64018e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato        that.ledOffMS = this.ledOffMS;
64118e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato        that.defaults = this.defaults;
6422561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler
64318e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato        that.flags = this.flags;
64418e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato
6452561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler        that.priority = this.priority;
6462561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler
6472561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler        final String[] thiskind = this.kind;
6482561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler        if (thiskind != null) {
6492561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler            final int N = thiskind.length;
6502561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler            final String[] thatkind = that.kind = new String[N];
6512561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler            System.arraycopy(thiskind, 0, thatkind, 0, N);
6522561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler        }
6532561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler
6542561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler        if (this.extras != null) {
6552561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler            that.extras = new Bundle(this.extras);
6562561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler
6572561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler        }
6582561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler
659a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler        that.actions = new Action[this.actions.length];
660a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler        for(int i=0; i<this.actions.length; i++) {
661a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler            that.actions[i] = this.actions[i].clone();
662a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler        }
663f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler        if (this.bigContentView != null) {
664f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler            that.bigContentView = this.bigContentView.clone();
665f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler        }
666a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler
66718e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato        return that;
66818e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato    }
66918e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int describeContents() {
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Flatten this notification from a parcel.
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void writeToParcel(Parcel parcel, int flags)
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        parcel.writeInt(1);
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        parcel.writeLong(when);
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        parcel.writeInt(icon);
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        parcel.writeInt(number);
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (contentIntent != null) {
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            parcel.writeInt(1);
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            contentIntent.writeToParcel(parcel, 0);
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            parcel.writeInt(0);
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (deleteIntent != null) {
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            parcel.writeInt(1);
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            deleteIntent.writeToParcel(parcel, 0);
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            parcel.writeInt(0);
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (tickerText != null) {
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            parcel.writeInt(1);
6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            TextUtils.writeToParcel(tickerText, parcel, flags);
6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            parcel.writeInt(0);
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
70246439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        if (tickerView != null) {
703ef1e7763c2dc5b9bac69cc747efe05c81d9fd9fcJoe Onorato            parcel.writeInt(1);
70446439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            tickerView.writeToParcel(parcel, 0);
705ef1e7763c2dc5b9bac69cc747efe05c81d9fd9fcJoe Onorato        } else {
706ef1e7763c2dc5b9bac69cc747efe05c81d9fd9fcJoe Onorato            parcel.writeInt(0);
707ef1e7763c2dc5b9bac69cc747efe05c81d9fd9fcJoe Onorato        }
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (contentView != null) {
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            parcel.writeInt(1);
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            contentView.writeToParcel(parcel, 0);
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            parcel.writeInt(0);
7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
714561d3858bb9409b999a19f7ba93f0b12e1db835fJoe Onorato        if (largeIcon != null) {
715561d3858bb9409b999a19f7ba93f0b12e1db835fJoe Onorato            parcel.writeInt(1);
716561d3858bb9409b999a19f7ba93f0b12e1db835fJoe Onorato            largeIcon.writeToParcel(parcel, 0);
717561d3858bb9409b999a19f7ba93f0b12e1db835fJoe Onorato        } else {
718561d3858bb9409b999a19f7ba93f0b12e1db835fJoe Onorato            parcel.writeInt(0);
719561d3858bb9409b999a19f7ba93f0b12e1db835fJoe Onorato        }
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        parcel.writeInt(defaults);
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        parcel.writeInt(this.flags);
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sound != null) {
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            parcel.writeInt(1);
7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sound.writeToParcel(parcel, 0);
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            parcel.writeInt(0);
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        parcel.writeInt(audioStreamType);
7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        parcel.writeLongArray(vibrate);
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        parcel.writeInt(ledARGB);
7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        parcel.writeInt(ledOnMS);
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        parcel.writeInt(ledOffMS);
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        parcel.writeInt(iconLevel);
736e46cbd379a3c19708c7f7e5d3f35e2c596de0c46Daniel Sandler
737e46cbd379a3c19708c7f7e5d3f35e2c596de0c46Daniel Sandler        if (fullScreenIntent != null) {
738e46cbd379a3c19708c7f7e5d3f35e2c596de0c46Daniel Sandler            parcel.writeInt(1);
739e46cbd379a3c19708c7f7e5d3f35e2c596de0c46Daniel Sandler            fullScreenIntent.writeToParcel(parcel, 0);
740e46cbd379a3c19708c7f7e5d3f35e2c596de0c46Daniel Sandler        } else {
741e46cbd379a3c19708c7f7e5d3f35e2c596de0c46Daniel Sandler            parcel.writeInt(0);
742e46cbd379a3c19708c7f7e5d3f35e2c596de0c46Daniel Sandler        }
7432561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler
7442561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler        parcel.writeInt(priority);
7452561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler
7462561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler        parcel.writeStringArray(kind); // ok for null
7472561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler
7482561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler        if (extras != null) {
7492561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler            parcel.writeInt(1);
7502561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler            extras.writeToParcel(parcel, 0);
7512561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler        } else {
7522561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler            parcel.writeInt(0);
7532561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler        }
754a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler
755a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler        parcel.writeTypedArray(actions, 0);
756a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler
757f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler        if (bigContentView != null) {
758f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler            parcel.writeInt(1);
759f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler            bigContentView.writeToParcel(parcel, 0);
760f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler        } else {
761f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler            parcel.writeInt(0);
762f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler        }
7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Parcelable.Creator that instantiates Notification objects
7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final Parcelable.Creator<Notification> CREATOR
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            = new Parcelable.Creator<Notification>()
7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Notification createFromParcel(Parcel parcel)
7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        {
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new Notification(parcel);
7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Notification[] newArray(int size)
7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        {
7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new Notification[size];
7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the {@link #contentView} field to be a view with the standard "Latest Event"
7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * layout.
7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Uses the {@link #icon} and {@link #when} fields to set the icon and time fields
7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * in the view.</p>
7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param context       The context for your application / activity.
7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param contentTitle The title that goes in the expanded entry.
7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param contentText  The text that goes in the expanded entry.
7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param contentIntent The intent to launch when the user clicks the expanded notification.
7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If this is an activity, it must include the
7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.content.Intent#FLAG_ACTIVITY_NEW_TASK} flag, which requires
7947aee61f5a96e94e158bf5ad3d8e192c4d4f7eff6Scott Main     * that you take care of task management as described in the
7957aee61f5a96e94e158bf5ad3d8e192c4d4f7eff6Scott Main     * <a href="{@docRoot}guide/topics/fundamentals/tasks-and-back-stack.html">Tasks and Back
7967aee61f5a96e94e158bf5ad3d8e192c4d4f7eff6Scott Main     * Stack</a> document.
7972561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     *
79846439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato     * @deprecated Use {@link Builder} instead.
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
80046439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato    @Deprecated
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setLatestEventInfo(Context context,
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CharSequence contentTitle, CharSequence contentText, PendingIntent contentIntent) {
803cde8aae955f2c1074a840074a9f586f95c3f61f7Daniel Sandler        // TODO: rewrite this to use Builder
8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        RemoteViews contentView = new RemoteViews(context.getPackageName(),
80596fd7c1c1acc03b40b1813ef65793560c175ef80Daniel Sandler                R.layout.notification_template_base);
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (this.icon != 0) {
807561d3858bb9409b999a19f7ba93f0b12e1db835fJoe Onorato            contentView.setImageViewResource(R.id.icon, this.icon);
8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
809e95658c98e4154a2daf0ed70d15d24f8bf3153f0Daniel Sandler        if (priority < PRIORITY_LOW) {
810e95658c98e4154a2daf0ed70d15d24f8bf3153f0Daniel Sandler            contentView.setInt(R.id.icon,
811e95658c98e4154a2daf0ed70d15d24f8bf3153f0Daniel Sandler                    "setBackgroundResource", R.drawable.notification_template_icon_low_bg);
812e95658c98e4154a2daf0ed70d15d24f8bf3153f0Daniel Sandler            contentView.setInt(R.id.status_bar_latest_event_content,
813e95658c98e4154a2daf0ed70d15d24f8bf3153f0Daniel Sandler                    "setBackgroundResource", R.drawable.notification_bg_low);
814e95658c98e4154a2daf0ed70d15d24f8bf3153f0Daniel Sandler        }
8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (contentTitle != null) {
816561d3858bb9409b999a19f7ba93f0b12e1db835fJoe Onorato            contentView.setTextViewText(R.id.title, contentTitle);
8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (contentText != null) {
819561d3858bb9409b999a19f7ba93f0b12e1db835fJoe Onorato            contentView.setTextViewText(R.id.text, contentText);
8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (this.when != 0) {
822cde8aae955f2c1074a840074a9f586f95c3f61f7Daniel Sandler            contentView.setViewVisibility(R.id.time, View.VISIBLE);
823561d3858bb9409b999a19f7ba93f0b12e1db835fJoe Onorato            contentView.setLong(R.id.time, "setTime", when);
8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
825b4b2223fa188d4f680209c80ba6bbe681a300bd5Daniel Sandler        if (this.number != 0) {
826b4b2223fa188d4f680209c80ba6bbe681a300bd5Daniel Sandler            NumberFormat f = NumberFormat.getIntegerInstance();
827b4b2223fa188d4f680209c80ba6bbe681a300bd5Daniel Sandler            contentView.setTextViewText(R.id.info, f.format(this.number));
828b4b2223fa188d4f680209c80ba6bbe681a300bd5Daniel Sandler        }
8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this.contentView = contentView;
8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this.contentIntent = contentIntent;
8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String toString() {
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        StringBuilder sb = new StringBuilder();
8372561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler        sb.append("Notification(pri=");
8382561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler        sb.append(priority);
8392561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler        sb.append(" contentView=");
840c9596d6d8e9154b5f87c8e887bfabf7546b68af5Joe Onorato        if (contentView != null) {
841c9596d6d8e9154b5f87c8e887bfabf7546b68af5Joe Onorato            sb.append(contentView.getPackage());
842c9596d6d8e9154b5f87c8e887bfabf7546b68af5Joe Onorato            sb.append("/0x");
843c9596d6d8e9154b5f87c8e887bfabf7546b68af5Joe Onorato            sb.append(Integer.toHexString(contentView.getLayoutId()));
844c9596d6d8e9154b5f87c8e887bfabf7546b68af5Joe Onorato        } else {
845c9596d6d8e9154b5f87c8e887bfabf7546b68af5Joe Onorato            sb.append("null");
846c9596d6d8e9154b5f87c8e887bfabf7546b68af5Joe Onorato        }
8472561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler        // TODO(dsandler): defaults take precedence over local values, so reorder the branches below
848c9596d6d8e9154b5f87c8e887bfabf7546b68af5Joe Onorato        sb.append(" vibrate=");
8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (this.vibrate != null) {
8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int N = this.vibrate.length-1;
8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sb.append("[");
8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=0; i<N; i++) {
8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sb.append(this.vibrate[i]);
8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sb.append(',');
8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8568cf97d9982aae6197e48aabf2a3ada79fb39a041Simon Schoar            if (N != -1) {
8578cf97d9982aae6197e48aabf2a3ada79fb39a041Simon Schoar                sb.append(this.vibrate[N]);
8588cf97d9982aae6197e48aabf2a3ada79fb39a041Simon Schoar            }
8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sb.append("]");
8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if ((this.defaults & DEFAULT_VIBRATE) != 0) {
8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sb.append("default");
8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sb.append("null");
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8652561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler        sb.append(" sound=");
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (this.sound != null) {
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sb.append(this.sound.toString());
8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if ((this.defaults & DEFAULT_SOUND) != 0) {
8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sb.append("default");
8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sb.append("null");
8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8732561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler        sb.append(" defaults=0x");
8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sb.append(Integer.toHexString(this.defaults));
8752561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler        sb.append(" flags=0x");
876e46cbd379a3c19708c7f7e5d3f35e2c596de0c46Daniel Sandler        sb.append(Integer.toHexString(this.flags));
8772561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler        sb.append(" kind=[");
8782561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler        if (this.kind == null) {
8792561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler            sb.append("null");
8802561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler        } else {
8812561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler            for (int i=0; i<this.kind.length; i++) {
8822561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler                if (i>0) sb.append(",");
8832561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler                sb.append(this.kind[i]);
8842561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler            }
885e46cbd379a3c19708c7f7e5d3f35e2c596de0c46Daniel Sandler        }
886a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler        sb.append("]");
887a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler        if (actions != null) {
888a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler            sb.append(" ");
889a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler            sb.append(actions.length);
890a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler            sb.append(" action");
891a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler            if (actions.length > 1) sb.append("s");
892a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler        }
893a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler        sb.append(")");
8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return sb.toString();
8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
89646439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato
8976d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey    /** {@hide} */
8986d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey    public void setUser(UserHandle user) {
899ecbd68b0de73a16ce9d0cf2baa7153e1db14b34aAmith Yamasani        if (user.getIdentifier() == UserHandle.USER_ALL) {
900ecbd68b0de73a16ce9d0cf2baa7153e1db14b34aAmith Yamasani            user = UserHandle.OWNER;
901ecbd68b0de73a16ce9d0cf2baa7153e1db14b34aAmith Yamasani        }
9026d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey        if (tickerView != null) {
9036d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey            tickerView.setUser(user);
9046d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey        }
9056d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey        if (contentView != null) {
9066d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey            contentView.setUser(user);
9076d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey        }
9086d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey        if (bigContentView != null) {
9096d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey            bigContentView.setUser(user);
9106d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey        }
9116d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey    }
9126d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey
913cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato    /**
9142561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     * Builder class for {@link Notification} objects.
9152561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     *
9162561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     * Provides a convenient way to set the various fields of a {@link Notification} and generate
917183bf116978e3c44292c9ead2bceb47e972624a1Scott Main     * content views using the platform's notification layout template. If your app supports
918183bf116978e3c44292c9ead2bceb47e972624a1Scott Main     * versions of Android as old as API level 4, you can instead use
919183bf116978e3c44292c9ead2bceb47e972624a1Scott Main     * {@link android.support.v4.app.NotificationCompat.Builder NotificationCompat.Builder},
920183bf116978e3c44292c9ead2bceb47e972624a1Scott Main     * available in the <a href="{@docRoot}tools/extras/support-library.html">Android Support
921183bf116978e3c44292c9ead2bceb47e972624a1Scott Main     * library</a>.
9222561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     *
923183bf116978e3c44292c9ead2bceb47e972624a1Scott Main     * <p>Example:
9242561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     *
9252561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     * <pre class="prettyprint">
926183bf116978e3c44292c9ead2bceb47e972624a1Scott Main     * Notification noti = new Notification.Builder(mContext)
9272561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     *         .setContentTitle(&quot;New mail from &quot; + sender.toString())
9282561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     *         .setContentText(subject)
9292561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     *         .setSmallIcon(R.drawable.new_mail)
9302561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     *         .setLargeIcon(aBitmap)
931fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren     *         .build();
9322561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler     * </pre>
933cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato     */
93446439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato    public static class Builder {
935602ad1c978ddbf8be2c272cd610e18a626cd8b33Daniel Sandler        private static final int MAX_ACTION_BUTTONS = 3;
9368680bf865a08f876fc3986c50a193e3186ff6f02Daniel Sandler
93746439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        private Context mContext;
93846439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato
93946439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        private long mWhen;
94046439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        private int mSmallIcon;
94146439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        private int mSmallIconLevel;
9428595a3dd9a6feff70f8ddbad924d79b591d611e4Joe Onorato        private int mNumber;
94346439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        private CharSequence mContentTitle;
94446439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        private CharSequence mContentText;
94546439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        private CharSequence mContentInfo;
946f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler        private CharSequence mSubText;
94746439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        private PendingIntent mContentIntent;
94846439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        private RemoteViews mContentView;
94946439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        private PendingIntent mDeleteIntent;
95046439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        private PendingIntent mFullScreenIntent;
95146439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        private CharSequence mTickerText;
95246439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        private RemoteViews mTickerView;
95346439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        private Bitmap mLargeIcon;
95446439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        private Uri mSound;
95546439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        private int mAudioStreamType;
95646439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        private long[] mVibrate;
95746439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        private int mLedArgb;
95846439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        private int mLedOnMs;
95946439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        private int mLedOffMs;
96046439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        private int mDefaults;
96146439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        private int mFlags;
9621c40013bb2afbd76050ac681d7880476aa7fc70dJeff Sharkey        private int mProgressMax;
9631c40013bb2afbd76050ac681d7880476aa7fc70dJeff Sharkey        private int mProgress;
9641c40013bb2afbd76050ac681d7880476aa7fc70dJeff Sharkey        private boolean mProgressIndeterminate;
9652561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler        private ArrayList<String> mKindList = new ArrayList<String>(1);
9662561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler        private Bundle mExtras;
9672561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler        private int mPriority;
9688680bf865a08f876fc3986c50a193e3186ff6f02Daniel Sandler        private ArrayList<Action> mActions = new ArrayList<Action>(MAX_ACTION_BUTTONS);
969a2985ed3099c9206a4fd9fd8eaf0e4025b82aca9Daniel Sandler        private boolean mUseChronometer;
970fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren        private Style mStyle;
9710c89049ebf463bde186c41fe9fad63ad27182eb2Daniel Sandler        private boolean mShowWhen = true;
97246439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato
973cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato        /**
9742561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * Constructs a new Builder with the defaults:
975cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato         *
9762561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler
9772561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * <table>
9782561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * <tr><th align=right>priority</th>
9792561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         *     <td>{@link #PRIORITY_DEFAULT}</td></tr>
9802561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * <tr><th align=right>when</th>
9812561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         *     <td>now ({@link System#currentTimeMillis()})</td></tr>
9822561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * <tr><th align=right>audio stream</th>
9832561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         *     <td>{@link #STREAM_DEFAULT}</td></tr>
9842561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * </table>
985cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato         *
9862561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler
9872561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * @param context
9882561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         *            A {@link Context} that will be used by the Builder to construct the
9892561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         *            RemoteViews. The Context will not be held past the lifetime of this Builder
9902561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         *            object.
991cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato         */
99246439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        public Builder(Context context) {
99346439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            mContext = context;
994110988c8b70f4ab089b179b7966497d508506263Andy Stadler
995110988c8b70f4ab089b179b7966497d508506263Andy Stadler            // Set defaults to match the defaults of a Notification
99646439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            mWhen = System.currentTimeMillis();
997110988c8b70f4ab089b179b7966497d508506263Andy Stadler            mAudioStreamType = STREAM_DEFAULT;
9982561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler            mPriority = PRIORITY_DEFAULT;
99946439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        }
100046439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato
1001cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato        /**
10022561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * Add a timestamp pertaining to the notification (usually the time the event occurred).
10030c89049ebf463bde186c41fe9fad63ad27182eb2Daniel Sandler         * It will be shown in the notification content view by default; use
10040c89049ebf463bde186c41fe9fad63ad27182eb2Daniel Sandler         * {@link Builder#setShowWhen(boolean) setShowWhen} to control this.
10052561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         *
10062561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * @see Notification#when
1007cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato         */
100846439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        public Builder setWhen(long when) {
100946439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            mWhen = when;
101046439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            return this;
101146439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        }
101246439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato
1013cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato        /**
10140c89049ebf463bde186c41fe9fad63ad27182eb2Daniel Sandler         * Control whether the timestamp set with {@link Builder#setWhen(long) setWhen} is shown
10150c89049ebf463bde186c41fe9fad63ad27182eb2Daniel Sandler         * in the content view.
10160c89049ebf463bde186c41fe9fad63ad27182eb2Daniel Sandler         */
10170c89049ebf463bde186c41fe9fad63ad27182eb2Daniel Sandler        public Builder setShowWhen(boolean show) {
10180c89049ebf463bde186c41fe9fad63ad27182eb2Daniel Sandler            mShowWhen = show;
10190c89049ebf463bde186c41fe9fad63ad27182eb2Daniel Sandler            return this;
10200c89049ebf463bde186c41fe9fad63ad27182eb2Daniel Sandler        }
10210c89049ebf463bde186c41fe9fad63ad27182eb2Daniel Sandler
10220c89049ebf463bde186c41fe9fad63ad27182eb2Daniel Sandler        /**
1023d33b803b6bfcbc509dd7cee3ee23f819dfff296eDaniel Sandler         * Show the {@link Notification#when} field as a stopwatch.
1024d33b803b6bfcbc509dd7cee3ee23f819dfff296eDaniel Sandler         *
1025d33b803b6bfcbc509dd7cee3ee23f819dfff296eDaniel Sandler         * Instead of presenting <code>when</code> as a timestamp, the notification will show an
1026d33b803b6bfcbc509dd7cee3ee23f819dfff296eDaniel Sandler         * automatically updating display of the minutes and seconds since <code>when</code>.
1027a2985ed3099c9206a4fd9fd8eaf0e4025b82aca9Daniel Sandler         *
1028d33b803b6bfcbc509dd7cee3ee23f819dfff296eDaniel Sandler         * Useful when showing an elapsed time (like an ongoing phone call).
1029d33b803b6bfcbc509dd7cee3ee23f819dfff296eDaniel Sandler         *
1030d33b803b6bfcbc509dd7cee3ee23f819dfff296eDaniel Sandler         * @see android.widget.Chronometer
1031a2985ed3099c9206a4fd9fd8eaf0e4025b82aca9Daniel Sandler         * @see Notification#when
1032a2985ed3099c9206a4fd9fd8eaf0e4025b82aca9Daniel Sandler         */
1033a2985ed3099c9206a4fd9fd8eaf0e4025b82aca9Daniel Sandler        public Builder setUsesChronometer(boolean b) {
1034a2985ed3099c9206a4fd9fd8eaf0e4025b82aca9Daniel Sandler            mUseChronometer = b;
1035a2985ed3099c9206a4fd9fd8eaf0e4025b82aca9Daniel Sandler            return this;
1036a2985ed3099c9206a4fd9fd8eaf0e4025b82aca9Daniel Sandler        }
1037a2985ed3099c9206a4fd9fd8eaf0e4025b82aca9Daniel Sandler
1038a2985ed3099c9206a4fd9fd8eaf0e4025b82aca9Daniel Sandler        /**
10392561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * Set the small icon resource, which will be used to represent the notification in the
10402561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * status bar.
1041cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato         *
10422561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler
10432561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * The platform template for the expanded view will draw this icon in the left, unless a
10442561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * {@link #setLargeIcon(Bitmap) large icon} has also been specified, in which case the small
10452561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * icon will be moved to the right-hand side.
10462561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         *
10472561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler
10482561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * @param icon
10492561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         *            A resource ID in the application's package of the drawable to use.
10502561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * @see Notification#icon
1051cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato         */
105246439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        public Builder setSmallIcon(int icon) {
105346439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            mSmallIcon = icon;
105446439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            return this;
105546439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        }
105646439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato
1057cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato        /**
1058cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato         * A variant of {@link #setSmallIcon(int) setSmallIcon(int)} that takes an additional
1059cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato         * level parameter for when the icon is a {@link android.graphics.drawable.LevelListDrawable
1060cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato         * LevelListDrawable}.
1061cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato         *
10622561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * @param icon A resource ID in the application's package of the drawable to use.
1063cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato         * @param level The level to use for the icon.
1064cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato         *
10652561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * @see Notification#icon
10662561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * @see Notification#iconLevel
1067cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato         */
106846439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        public Builder setSmallIcon(int icon, int level) {
106946439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            mSmallIcon = icon;
107046439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            mSmallIconLevel = level;
107146439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            return this;
107246439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        }
107346439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato
1074cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato        /**
10752561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * Set the first line of text in the platform notification template.
1076cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato         */
107746439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        public Builder setContentTitle(CharSequence title) {
107846439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            mContentTitle = title;
107946439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            return this;
108046439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        }
108146439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato
1082cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato        /**
10832561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * Set the second line of text in the platform notification template.
1084cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato         */
108546439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        public Builder setContentText(CharSequence text) {
108646439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            mContentText = text;
108746439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            return this;
108846439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        }
108946439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato
1090cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato        /**
1091f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler         * Set the third line of text in the platform notification template.
1092f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler         * Don't use if you're also using {@link #setProgress(int, int, boolean)}; they occupy the same location in the standard template.
1093f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler         */
1094f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler        public Builder setSubText(CharSequence text) {
1095f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler            mSubText = text;
1096f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler            return this;
1097f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler        }
1098f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler
1099f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler        /**
1100cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato         * Set the large number at the right-hand side of the notification.  This is
1101cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato         * equivalent to setContentInfo, although it might show the number in a different
1102cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato         * font size for readability.
1103cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato         */
11048595a3dd9a6feff70f8ddbad924d79b591d611e4Joe Onorato        public Builder setNumber(int number) {
11058595a3dd9a6feff70f8ddbad924d79b591d611e4Joe Onorato            mNumber = number;
11068595a3dd9a6feff70f8ddbad924d79b591d611e4Joe Onorato            return this;
11078595a3dd9a6feff70f8ddbad924d79b591d611e4Joe Onorato        }
11088595a3dd9a6feff70f8ddbad924d79b591d611e4Joe Onorato
1109cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato        /**
11102561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * A small piece of additional information pertaining to this notification.
11112561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         *
11122561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * The platform template will draw this on the last line of the notification, at the far
11132561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * right (to the right of a smallIcon if it has been placed there).
1114cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato         */
111546439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        public Builder setContentInfo(CharSequence info) {
111646439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            mContentInfo = info;
111746439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            return this;
111846439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        }
111946439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato
1120cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato        /**
11212561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * Set the progress this notification represents.
11222561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         *
11232561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * The platform template will represent this using a {@link ProgressBar}.
11241c40013bb2afbd76050ac681d7880476aa7fc70dJeff Sharkey         */
11251c40013bb2afbd76050ac681d7880476aa7fc70dJeff Sharkey        public Builder setProgress(int max, int progress, boolean indeterminate) {
11261c40013bb2afbd76050ac681d7880476aa7fc70dJeff Sharkey            mProgressMax = max;
11271c40013bb2afbd76050ac681d7880476aa7fc70dJeff Sharkey            mProgress = progress;
11281c40013bb2afbd76050ac681d7880476aa7fc70dJeff Sharkey            mProgressIndeterminate = indeterminate;
11291c40013bb2afbd76050ac681d7880476aa7fc70dJeff Sharkey            return this;
11301c40013bb2afbd76050ac681d7880476aa7fc70dJeff Sharkey        }
11311c40013bb2afbd76050ac681d7880476aa7fc70dJeff Sharkey
11321c40013bb2afbd76050ac681d7880476aa7fc70dJeff Sharkey        /**
11332561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * Supply a custom RemoteViews to use instead of the platform template.
11342561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         *
11352561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * @see Notification#contentView
1136cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato         */
113746439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        public Builder setContent(RemoteViews views) {
113846439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            mContentView = views;
113946439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            return this;
114046439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        }
114146439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato
1142cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato        /**
11432561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * Supply a {@link PendingIntent} to be sent when the notification is clicked.
11442561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         *
11452561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * As of {@link android.os.Build.VERSION_CODES#HONEYCOMB}, if this field is unset and you
11462561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * have specified a custom RemoteViews with {@link #setContent(RemoteViews)}, you can use
11472561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * {@link RemoteViews#setOnClickPendingIntent RemoteViews.setOnClickPendingIntent(int,PendingIntent)}
11482561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * to assign PendingIntents to individual views in that custom layout (i.e., to create
1149f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler         * clickable buttons inside the notification view).
11502561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         *
11512561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * @see Notification#contentIntent Notification.contentIntent
1152cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato         */
115346439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        public Builder setContentIntent(PendingIntent intent) {
115446439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            mContentIntent = intent;
115546439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            return this;
115646439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        }
115746439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato
1158cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato        /**
11592561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * Supply a {@link PendingIntent} to send when the notification is cleared explicitly by the user.
11602561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         *
11612561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * @see Notification#deleteIntent
1162cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato         */
116346439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        public Builder setDeleteIntent(PendingIntent intent) {
116446439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            mDeleteIntent = intent;
116546439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            return this;
116646439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        }
116746439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato
1168cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato        /**
1169cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato         * An intent to launch instead of posting the notification to the status bar.
1170cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato         * Only for use with extremely high-priority notifications demanding the user's
1171cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato         * <strong>immediate</strong> attention, such as an incoming phone call or
1172cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato         * alarm clock that the user has explicitly set to a particular time.
1173cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato         * If this facility is used for something else, please give the user an option
1174cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato         * to turn it off and use a normal notification, as this can be extremely
1175cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato         * disruptive.
1176cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato         *
1177cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato         * @param intent The pending intent to launch.
1178cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato         * @param highPriority Passing true will cause this notification to be sent
1179cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato         *          even if other notifications are suppressed.
11802561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         *
11812561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * @see Notification#fullScreenIntent
1182cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato         */
118346439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        public Builder setFullScreenIntent(PendingIntent intent, boolean highPriority) {
118446439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            mFullScreenIntent = intent;
118546439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            setFlag(FLAG_HIGH_PRIORITY, highPriority);
118646439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            return this;
118746439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        }
118846439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato
1189cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato        /**
11902561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * Set the "ticker" text which is displayed in the status bar when the notification first
1191cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato         * arrives.
11922561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         *
11932561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * @see Notification#tickerText
1194cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato         */
119546439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        public Builder setTicker(CharSequence tickerText) {
119646439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            mTickerText = tickerText;
119746439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            return this;
119846439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        }
119946439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato
1200cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato        /**
1201cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato         * Set the text that is displayed in the status bar when the notification first
1202cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato         * arrives, and also a RemoteViews object that may be displayed instead on some
1203cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato         * devices.
12042561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         *
12052561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * @see Notification#tickerText
12062561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * @see Notification#tickerView
1207cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato         */
120846439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        public Builder setTicker(CharSequence tickerText, RemoteViews views) {
120946439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            mTickerText = tickerText;
121046439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            mTickerView = views;
121146439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            return this;
121246439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        }
121346439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato
1214cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato        /**
12152561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * Add a large icon to the notification (and the ticker on some devices).
12162561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         *
12172561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * In the platform template, this image will be shown on the left of the notification view
12182561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * in place of the {@link #setSmallIcon(int) small icon} (which will move to the right side).
12192561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         *
12202561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * @see Notification#largeIcon
1221cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato         */
122246439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        public Builder setLargeIcon(Bitmap icon) {
122346439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            mLargeIcon = icon;
122446439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            return this;
122546439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        }
122646439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato
1227cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato        /**
12282561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * Set the sound to play.
12292561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         *
12302561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * It will be played on the {@link #STREAM_DEFAULT default stream} for notifications.
12312561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         *
12322561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * @see Notification#sound
1233cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato         */
123452f80cd36f406725e85a1825741a45c69de3d898Joe Onorato        public Builder setSound(Uri sound) {
123552f80cd36f406725e85a1825741a45c69de3d898Joe Onorato            mSound = sound;
123652f80cd36f406725e85a1825741a45c69de3d898Joe Onorato            mAudioStreamType = STREAM_DEFAULT;
123752f80cd36f406725e85a1825741a45c69de3d898Joe Onorato            return this;
123852f80cd36f406725e85a1825741a45c69de3d898Joe Onorato        }
123952f80cd36f406725e85a1825741a45c69de3d898Joe Onorato
1240cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato        /**
12412561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * Set the sound to play, along with a specific stream on which to play it.
1242cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato         *
12432561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * See {@link android.media.AudioManager} for the <code>STREAM_</code> constants.
12442561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         *
12452561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * @see Notification#sound
1246cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato         */
124746439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        public Builder setSound(Uri sound, int streamType) {
124846439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            mSound = sound;
124946439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            mAudioStreamType = streamType;
125046439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            return this;
125146439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        }
125246439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato
1253cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato        /**
1254cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato         * Set the vibration pattern to use.
1255cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato         *
12562561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler
12572561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * See {@link android.os.Vibrator#vibrate(long[], int)} for a discussion of the
12582561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * <code>pattern</code> parameter.
12592561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         *
12602561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler
12612561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * @see Notification#vibrate
1262cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato         */
126346439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        public Builder setVibrate(long[] pattern) {
126446439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            mVibrate = pattern;
126546439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            return this;
126646439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        }
126746439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato
1268cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato        /**
12692561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * Set the desired color for the indicator LED on the device, as well as the
12702561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * blink duty cycle (specified in milliseconds).
12712561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         *
12722561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler
12732561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * Not all devices will honor all (or even any) of these values.
12742561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         *
12752561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler
12762561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * @see Notification#ledARGB
12772561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * @see Notification#ledOnMS
12782561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * @see Notification#ledOffMS
1279cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato         */
128046439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        public Builder setLights(int argb, int onMs, int offMs) {
128146439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            mLedArgb = argb;
128246439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            mLedOnMs = onMs;
128346439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            mLedOffMs = offMs;
128446439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            return this;
128546439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        }
128646439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato
1287cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato        /**
12882561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * Set whether this is an "ongoing" notification.
1289cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato         *
12902561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler
12912561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * Ongoing notifications cannot be dismissed by the user, so your application or service
12922561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * must take care of canceling them.
12932561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         *
12942561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler
12952561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * They are typically used to indicate a background task that the user is actively engaged
12962561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * with (e.g., playing music) or is pending in some way and therefore occupying the device
12972561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * (e.g., a file download, sync operation, active network connection).
12982561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         *
12992561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler
13002561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * @see Notification#FLAG_ONGOING_EVENT
13012561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * @see Service#setForeground(boolean)
1302cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato         */
130346439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        public Builder setOngoing(boolean ongoing) {
130446439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            setFlag(FLAG_ONGOING_EVENT, ongoing);
130546439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            return this;
130646439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        }
130746439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato
1308cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato        /**
1309cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato         * Set this flag if you would only like the sound, vibrate
1310cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato         * and ticker to be played if the notification is not already showing.
13112561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         *
13122561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * @see Notification#FLAG_ONLY_ALERT_ONCE
1313cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato         */
131446439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        public Builder setOnlyAlertOnce(boolean onlyAlertOnce) {
131546439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            setFlag(FLAG_ONLY_ALERT_ONCE, onlyAlertOnce);
131646439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            return this;
131746439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        }
131846439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato
1319cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato        /**
13202561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * Make this notification automatically dismissed when the user touches it. The
13212561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * PendingIntent set with {@link #setDeleteIntent} will be sent when this happens.
13222561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         *
13232561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * @see Notification#FLAG_AUTO_CANCEL
1324cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato         */
132546439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        public Builder setAutoCancel(boolean autoCancel) {
1326281d83f61f4036503ded1a967b8b43bfbaa373d0Joe Onorato            setFlag(FLAG_AUTO_CANCEL, autoCancel);
132746439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            return this;
132846439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        }
132946439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato
1330cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato        /**
13312561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * Set which notification properties will be inherited from system defaults.
1332cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato         * <p>
1333cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato         * The value should be one or more of the following fields combined with
1334cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato         * bitwise-or:
1335cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato         * {@link #DEFAULT_SOUND}, {@link #DEFAULT_VIBRATE}, {@link #DEFAULT_LIGHTS}.
1336cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato         * <p>
1337cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato         * For all default values, use {@link #DEFAULT_ALL}.
1338cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato         */
133946439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        public Builder setDefaults(int defaults) {
134046439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            mDefaults = defaults;
134146439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            return this;
134246439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        }
134346439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato
13442561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler        /**
13452561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * Set the priority of this notification.
13462561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         *
13472561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * @see Notification#priority
13482561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         */
13492561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler        public Builder setPriority(int pri) {
13502561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler            mPriority = pri;
13512561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler            return this;
13522561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler        }
13532561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler
13542561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler        /**
1355d33b803b6bfcbc509dd7cee3ee23f819dfff296eDaniel Sandler         * @hide
1356d33b803b6bfcbc509dd7cee3ee23f819dfff296eDaniel Sandler         *
13572561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * Add a kind (category) to this notification. Optional.
13582561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         *
13592561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * @see Notification#kind
13602561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         */
13612561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler        public Builder addKind(String k) {
13622561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler            mKindList.add(k);
13632561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler            return this;
13642561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler        }
13652561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler
13662561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler        /**
13672561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * Add metadata to this notification.
13682561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         *
13692561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * A reference to the Bundle is held for the lifetime of this Builder, and the Bundle's
1370fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren         * current contents are copied into the Notification each time {@link #build()} is
13712561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * called.
13722561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         *
13732561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * @see Notification#extras
13742561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         * @hide
13752561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler         */
13762561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler        public Builder setExtras(Bundle bag) {
13772561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler            mExtras = bag;
13782561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler            return this;
13792561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler        }
13802561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler
1381a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler        /**
1382a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler         * Add an action to this notification. Actions are typically displayed by
1383a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler         * the system as a button adjacent to the notification content.
1384a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler         *
1385a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler         * @param icon Resource ID of a drawable that represents the action.
1386a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler         * @param title Text describing the action.
1387a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler         * @param intent PendingIntent to be fired when the action is invoked.
1388a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler         */
1389a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler        public Builder addAction(int icon, CharSequence title, PendingIntent intent) {
1390a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler            mActions.add(new Action(icon, title, intent));
1391a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler            return this;
1392a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler        }
1393a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler
1394fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren        /**
1395fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren         * Add a rich notification style to be applied at build time.
1396fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren         *
1397fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren         * @param style Object responsible for modifying the notification style.
1398fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren         */
1399fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren        public Builder setStyle(Style style) {
1400fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren            if (mStyle != style) {
1401fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren                mStyle = style;
1402c08dea2aa4f66f888f01fa7ed2be46d4c4651a1eDaniel Sandler                if (mStyle != null) {
1403c08dea2aa4f66f888f01fa7ed2be46d4c4651a1eDaniel Sandler                    mStyle.setBuilder(this);
1404c08dea2aa4f66f888f01fa7ed2be46d4c4651a1eDaniel Sandler                }
1405fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren            }
1406fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren            return this;
1407fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren        }
1408fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren
140946439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        private void setFlag(int mask, boolean value) {
141046439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            if (value) {
141146439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato                mFlags |= mask;
141246439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            } else {
141346439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato                mFlags &= ~mask;
141446439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            }
141546439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        }
141646439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato
14176387d2f6dae27ba6e8481883325adad96d3010f4Daniel Sandler        private RemoteViews applyStandardTemplate(int resId, boolean fitIn1U) {
1418561d3858bb9409b999a19f7ba93f0b12e1db835fJoe Onorato            RemoteViews contentView = new RemoteViews(mContext.getPackageName(), resId);
14199f7936a30bc097c31962891945802507cb4aeb82Daniel Sandler            boolean showLine3 = false;
14209f7936a30bc097c31962891945802507cb4aeb82Daniel Sandler            boolean showLine2 = false;
1421f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler            int smallIconImageViewId = R.id.icon;
1422f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler            if (mLargeIcon != null) {
1423f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler                contentView.setImageViewBitmap(R.id.icon, mLargeIcon);
1424f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler                smallIconImageViewId = R.id.right_icon;
1425f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler            }
1426e95658c98e4154a2daf0ed70d15d24f8bf3153f0Daniel Sandler            if (mPriority < PRIORITY_LOW) {
1427e95658c98e4154a2daf0ed70d15d24f8bf3153f0Daniel Sandler                contentView.setInt(R.id.icon,
1428e95658c98e4154a2daf0ed70d15d24f8bf3153f0Daniel Sandler                        "setBackgroundResource", R.drawable.notification_template_icon_low_bg);
1429e95658c98e4154a2daf0ed70d15d24f8bf3153f0Daniel Sandler                contentView.setInt(R.id.status_bar_latest_event_content,
1430e95658c98e4154a2daf0ed70d15d24f8bf3153f0Daniel Sandler                        "setBackgroundResource", R.drawable.notification_bg_low);
1431e95658c98e4154a2daf0ed70d15d24f8bf3153f0Daniel Sandler            }
1432561d3858bb9409b999a19f7ba93f0b12e1db835fJoe Onorato            if (mSmallIcon != 0) {
1433f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler                contentView.setImageViewResource(smallIconImageViewId, mSmallIcon);
1434f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler                contentView.setViewVisibility(smallIconImageViewId, View.VISIBLE);
14351c40013bb2afbd76050ac681d7880476aa7fc70dJeff Sharkey            } else {
1436f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler                contentView.setViewVisibility(smallIconImageViewId, View.GONE);
1437561d3858bb9409b999a19f7ba93f0b12e1db835fJoe Onorato            }
1438561d3858bb9409b999a19f7ba93f0b12e1db835fJoe Onorato            if (mContentTitle != null) {
1439561d3858bb9409b999a19f7ba93f0b12e1db835fJoe Onorato                contentView.setTextViewText(R.id.title, mContentTitle);
1440561d3858bb9409b999a19f7ba93f0b12e1db835fJoe Onorato            }
1441561d3858bb9409b999a19f7ba93f0b12e1db835fJoe Onorato            if (mContentText != null) {
14429f7936a30bc097c31962891945802507cb4aeb82Daniel Sandler                contentView.setTextViewText(R.id.text, mContentText);
14439f7936a30bc097c31962891945802507cb4aeb82Daniel Sandler                showLine3 = true;
1444561d3858bb9409b999a19f7ba93f0b12e1db835fJoe Onorato            }
1445561d3858bb9409b999a19f7ba93f0b12e1db835fJoe Onorato            if (mContentInfo != null) {
1446561d3858bb9409b999a19f7ba93f0b12e1db835fJoe Onorato                contentView.setTextViewText(R.id.info, mContentInfo);
14471c40013bb2afbd76050ac681d7880476aa7fc70dJeff Sharkey                contentView.setViewVisibility(R.id.info, View.VISIBLE);
14489f7936a30bc097c31962891945802507cb4aeb82Daniel Sandler                showLine3 = true;
1449561d3858bb9409b999a19f7ba93f0b12e1db835fJoe Onorato            } else if (mNumber > 0) {
1450ebce0115e239919680fc5574ae4ca79e617fcce8Daniel Sandler                final int tooBig = mContext.getResources().getInteger(
1451ebce0115e239919680fc5574ae4ca79e617fcce8Daniel Sandler                        R.integer.status_bar_notification_info_maxnum);
1452ebce0115e239919680fc5574ae4ca79e617fcce8Daniel Sandler                if (mNumber > tooBig) {
1453ebce0115e239919680fc5574ae4ca79e617fcce8Daniel Sandler                    contentView.setTextViewText(R.id.info, mContext.getResources().getString(
1454ebce0115e239919680fc5574ae4ca79e617fcce8Daniel Sandler                                R.string.status_bar_notification_info_overflow));
1455059a2f8664571098fac665747d8bb8f84c5e07edJoe Onorato                } else {
1456059a2f8664571098fac665747d8bb8f84c5e07edJoe Onorato                    NumberFormat f = NumberFormat.getIntegerInstance();
1457059a2f8664571098fac665747d8bb8f84c5e07edJoe Onorato                    contentView.setTextViewText(R.id.info, f.format(mNumber));
1458059a2f8664571098fac665747d8bb8f84c5e07edJoe Onorato                }
14591c40013bb2afbd76050ac681d7880476aa7fc70dJeff Sharkey                contentView.setViewVisibility(R.id.info, View.VISIBLE);
14609f7936a30bc097c31962891945802507cb4aeb82Daniel Sandler                showLine3 = true;
1461561d3858bb9409b999a19f7ba93f0b12e1db835fJoe Onorato            } else {
1462561d3858bb9409b999a19f7ba93f0b12e1db835fJoe Onorato                contentView.setViewVisibility(R.id.info, View.GONE);
1463561d3858bb9409b999a19f7ba93f0b12e1db835fJoe Onorato            }
1464f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler
14659f7936a30bc097c31962891945802507cb4aeb82Daniel Sandler            // Need to show three lines?
1466f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler            if (mSubText != null) {
1467f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler                contentView.setTextViewText(R.id.text, mSubText);
14689f7936a30bc097c31962891945802507cb4aeb82Daniel Sandler                if (mContentText != null) {
14699f7936a30bc097c31962891945802507cb4aeb82Daniel Sandler                    contentView.setTextViewText(R.id.text2, mContentText);
14709f7936a30bc097c31962891945802507cb4aeb82Daniel Sandler                    contentView.setViewVisibility(R.id.text2, View.VISIBLE);
14719f7936a30bc097c31962891945802507cb4aeb82Daniel Sandler                    showLine2 = true;
14729f7936a30bc097c31962891945802507cb4aeb82Daniel Sandler                } else {
14739f7936a30bc097c31962891945802507cb4aeb82Daniel Sandler                    contentView.setViewVisibility(R.id.text2, View.GONE);
14749f7936a30bc097c31962891945802507cb4aeb82Daniel Sandler                }
14751c40013bb2afbd76050ac681d7880476aa7fc70dJeff Sharkey            } else {
1476f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler                contentView.setViewVisibility(R.id.text2, View.GONE);
1477f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler                if (mProgressMax != 0 || mProgressIndeterminate) {
1478f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler                    contentView.setProgressBar(
1479f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler                            R.id.progress, mProgressMax, mProgress, mProgressIndeterminate);
1480f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler                    contentView.setViewVisibility(R.id.progress, View.VISIBLE);
14819f7936a30bc097c31962891945802507cb4aeb82Daniel Sandler                    showLine2 = true;
1482f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler                } else {
1483f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler                    contentView.setViewVisibility(R.id.progress, View.GONE);
1484f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler                }
14851c40013bb2afbd76050ac681d7880476aa7fc70dJeff Sharkey            }
14869f7936a30bc097c31962891945802507cb4aeb82Daniel Sandler            if (showLine2) {
14876387d2f6dae27ba6e8481883325adad96d3010f4Daniel Sandler                if (fitIn1U) {
14886387d2f6dae27ba6e8481883325adad96d3010f4Daniel Sandler                    // need to shrink all the type to make sure everything fits
14896387d2f6dae27ba6e8481883325adad96d3010f4Daniel Sandler                    final Resources res = mContext.getResources();
14906387d2f6dae27ba6e8481883325adad96d3010f4Daniel Sandler                    final float subTextSize = res.getDimensionPixelSize(
14916387d2f6dae27ba6e8481883325adad96d3010f4Daniel Sandler                            R.dimen.notification_subtext_size);
14926387d2f6dae27ba6e8481883325adad96d3010f4Daniel Sandler                    contentView.setTextViewTextSize(R.id.text, TypedValue.COMPLEX_UNIT_PX, subTextSize);
14936387d2f6dae27ba6e8481883325adad96d3010f4Daniel Sandler                }
14949f7936a30bc097c31962891945802507cb4aeb82Daniel Sandler                // vertical centering
14959f7936a30bc097c31962891945802507cb4aeb82Daniel Sandler                contentView.setViewPadding(R.id.line1, 0, 0, 0, 0);
14969f7936a30bc097c31962891945802507cb4aeb82Daniel Sandler            }
14979f7936a30bc097c31962891945802507cb4aeb82Daniel Sandler
14980c89049ebf463bde186c41fe9fad63ad27182eb2Daniel Sandler            if (mWhen != 0 && mShowWhen) {
1499a2985ed3099c9206a4fd9fd8eaf0e4025b82aca9Daniel Sandler                if (mUseChronometer) {
1500a2985ed3099c9206a4fd9fd8eaf0e4025b82aca9Daniel Sandler                    contentView.setViewVisibility(R.id.chronometer, View.VISIBLE);
1501a2985ed3099c9206a4fd9fd8eaf0e4025b82aca9Daniel Sandler                    contentView.setLong(R.id.chronometer, "setBase",
1502a2985ed3099c9206a4fd9fd8eaf0e4025b82aca9Daniel Sandler                            mWhen + (SystemClock.elapsedRealtime() - System.currentTimeMillis()));
1503a2985ed3099c9206a4fd9fd8eaf0e4025b82aca9Daniel Sandler                    contentView.setBoolean(R.id.chronometer, "setStarted", true);
1504a2985ed3099c9206a4fd9fd8eaf0e4025b82aca9Daniel Sandler                } else {
1505a2985ed3099c9206a4fd9fd8eaf0e4025b82aca9Daniel Sandler                    contentView.setViewVisibility(R.id.time, View.VISIBLE);
1506a2985ed3099c9206a4fd9fd8eaf0e4025b82aca9Daniel Sandler                    contentView.setLong(R.id.time, "setTime", mWhen);
1507a2985ed3099c9206a4fd9fd8eaf0e4025b82aca9Daniel Sandler                }
15080c89049ebf463bde186c41fe9fad63ad27182eb2Daniel Sandler            } else {
15090c89049ebf463bde186c41fe9fad63ad27182eb2Daniel Sandler                contentView.setViewVisibility(R.id.time, View.GONE);
1510561d3858bb9409b999a19f7ba93f0b12e1db835fJoe Onorato            }
15110c89049ebf463bde186c41fe9fad63ad27182eb2Daniel Sandler
15129f7936a30bc097c31962891945802507cb4aeb82Daniel Sandler            contentView.setViewVisibility(R.id.line3, showLine3 ? View.VISIBLE : View.GONE);
15136387d2f6dae27ba6e8481883325adad96d3010f4Daniel Sandler            contentView.setViewVisibility(R.id.overflow_divider, showLine3 ? View.VISIBLE : View.GONE);
1514561d3858bb9409b999a19f7ba93f0b12e1db835fJoe Onorato            return contentView;
1515561d3858bb9409b999a19f7ba93f0b12e1db835fJoe Onorato        }
1516561d3858bb9409b999a19f7ba93f0b12e1db835fJoe Onorato
151796fd7c1c1acc03b40b1813ef65793560c175ef80Daniel Sandler        private RemoteViews applyStandardTemplateWithActions(int layoutId) {
15186387d2f6dae27ba6e8481883325adad96d3010f4Daniel Sandler            RemoteViews big = applyStandardTemplate(layoutId, false);
151996fd7c1c1acc03b40b1813ef65793560c175ef80Daniel Sandler
152096fd7c1c1acc03b40b1813ef65793560c175ef80Daniel Sandler            int N = mActions.size();
152196fd7c1c1acc03b40b1813ef65793560c175ef80Daniel Sandler            if (N > 0) {
1522d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren                // Log.d("Notification", "has actions: " + mContentText);
152396fd7c1c1acc03b40b1813ef65793560c175ef80Daniel Sandler                big.setViewVisibility(R.id.actions, View.VISIBLE);
15246387d2f6dae27ba6e8481883325adad96d3010f4Daniel Sandler                big.setViewVisibility(R.id.action_divider, View.VISIBLE);
15258680bf865a08f876fc3986c50a193e3186ff6f02Daniel Sandler                if (N>MAX_ACTION_BUTTONS) N=MAX_ACTION_BUTTONS;
15262c22eb0a49b369767eaa4e04c1727f947cfdec13Chris Wren                big.removeAllViews(R.id.actions);
152796fd7c1c1acc03b40b1813ef65793560c175ef80Daniel Sandler                for (int i=0; i<N; i++) {
152896fd7c1c1acc03b40b1813ef65793560c175ef80Daniel Sandler                    final RemoteViews button = generateActionButton(mActions.get(i));
1529d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren                    //Log.d("Notification", "adding action " + i + ": " + mActions.get(i).title);
153096fd7c1c1acc03b40b1813ef65793560c175ef80Daniel Sandler                    big.addView(R.id.actions, button);
153196fd7c1c1acc03b40b1813ef65793560c175ef80Daniel Sandler                }
153296fd7c1c1acc03b40b1813ef65793560c175ef80Daniel Sandler            }
153396fd7c1c1acc03b40b1813ef65793560c175ef80Daniel Sandler            return big;
153496fd7c1c1acc03b40b1813ef65793560c175ef80Daniel Sandler        }
153596fd7c1c1acc03b40b1813ef65793560c175ef80Daniel Sandler
153646439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        private RemoteViews makeContentView() {
153746439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            if (mContentView != null) {
153846439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato                return mContentView;
153946439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            } else {
15406387d2f6dae27ba6e8481883325adad96d3010f4Daniel Sandler                return applyStandardTemplate(R.layout.notification_template_base, true); // no more special large_icon flavor
154146439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            }
154246439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        }
154346439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato
154446439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        private RemoteViews makeTickerView() {
154546439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            if (mTickerView != null) {
154646439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato                return mTickerView;
154746439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            } else {
1548561d3858bb9409b999a19f7ba93f0b12e1db835fJoe Onorato                if (mContentView == null) {
1549f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler                    return applyStandardTemplate(mLargeIcon == null
1550561d3858bb9409b999a19f7ba93f0b12e1db835fJoe Onorato                            ? R.layout.status_bar_latest_event_ticker
15516387d2f6dae27ba6e8481883325adad96d3010f4Daniel Sandler                            : R.layout.status_bar_latest_event_ticker_large_icon, true);
1552561d3858bb9409b999a19f7ba93f0b12e1db835fJoe Onorato                } else {
1553561d3858bb9409b999a19f7ba93f0b12e1db835fJoe Onorato                    return null;
1554561d3858bb9409b999a19f7ba93f0b12e1db835fJoe Onorato                }
155546439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            }
155646439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        }
155746439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato
155896fd7c1c1acc03b40b1813ef65793560c175ef80Daniel Sandler        private RemoteViews makeBigContentView() {
155996fd7c1c1acc03b40b1813ef65793560c175ef80Daniel Sandler            if (mActions.size() == 0) return null;
156096fd7c1c1acc03b40b1813ef65793560c175ef80Daniel Sandler
1561b023bf85a080442117b5dae8d402bce60cd0a610Chris Wren            return applyStandardTemplateWithActions(R.layout.notification_template_big_base);
156296fd7c1c1acc03b40b1813ef65793560c175ef80Daniel Sandler        }
156396fd7c1c1acc03b40b1813ef65793560c175ef80Daniel Sandler
156496fd7c1c1acc03b40b1813ef65793560c175ef80Daniel Sandler        private RemoteViews generateActionButton(Action action) {
15658680bf865a08f876fc3986c50a193e3186ff6f02Daniel Sandler            final boolean tombstone = (action.actionIntent == null);
15668680bf865a08f876fc3986c50a193e3186ff6f02Daniel Sandler            RemoteViews button = new RemoteViews(mContext.getPackageName(),
15678680bf865a08f876fc3986c50a193e3186ff6f02Daniel Sandler                    tombstone ? R.layout.notification_action_tombstone
15688680bf865a08f876fc3986c50a193e3186ff6f02Daniel Sandler                              : R.layout.notification_action);
156996fd7c1c1acc03b40b1813ef65793560c175ef80Daniel Sandler            button.setTextViewCompoundDrawables(R.id.action0, action.icon, 0, 0, 0);
157096fd7c1c1acc03b40b1813ef65793560c175ef80Daniel Sandler            button.setTextViewText(R.id.action0, action.title);
15718680bf865a08f876fc3986c50a193e3186ff6f02Daniel Sandler            if (!tombstone) {
1572e551884b0972280c9aee451b489832e67395c8e2Daniel Sandler                button.setOnClickPendingIntent(R.id.action0, action.actionIntent);
1573e551884b0972280c9aee451b489832e67395c8e2Daniel Sandler            }
157496fd7c1c1acc03b40b1813ef65793560c175ef80Daniel Sandler            button.setContentDescription(R.id.action0, action.title);
157596fd7c1c1acc03b40b1813ef65793560c175ef80Daniel Sandler            return button;
157696fd7c1c1acc03b40b1813ef65793560c175ef80Daniel Sandler        }
157796fd7c1c1acc03b40b1813ef65793560c175ef80Daniel Sandler
1578cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato        /**
1579fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren         * Apply the unstyled operations and return a new {@link Notification} object.
1580cb109a0eeaca12cdd954c567da4fc5f45a23213bJoe Onorato         */
1581fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren        private Notification buildUnstyled() {
158246439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            Notification n = new Notification();
158346439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            n.when = mWhen;
158446439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            n.icon = mSmallIcon;
158546439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            n.iconLevel = mSmallIconLevel;
15868595a3dd9a6feff70f8ddbad924d79b591d611e4Joe Onorato            n.number = mNumber;
158746439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            n.contentView = makeContentView();
158846439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            n.contentIntent = mContentIntent;
158946439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            n.deleteIntent = mDeleteIntent;
159046439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            n.fullScreenIntent = mFullScreenIntent;
159146439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            n.tickerText = mTickerText;
159246439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            n.tickerView = makeTickerView();
159346439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            n.largeIcon = mLargeIcon;
159446439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            n.sound = mSound;
159546439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            n.audioStreamType = mAudioStreamType;
159646439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            n.vibrate = mVibrate;
159746439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            n.ledARGB = mLedArgb;
159846439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            n.ledOnMS = mLedOnMs;
159946439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            n.ledOffMS = mLedOffMs;
160046439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            n.defaults = mDefaults;
160146439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            n.flags = mFlags;
160296fd7c1c1acc03b40b1813ef65793560c175ef80Daniel Sandler            n.bigContentView = makeBigContentView();
16038d0b655c496e9125fc8d289c4e5bc9a78297ba3dJoe Onorato            if (mLedOnMs != 0 && mLedOffMs != 0) {
16048d0b655c496e9125fc8d289c4e5bc9a78297ba3dJoe Onorato                n.flags |= FLAG_SHOW_LIGHTS;
16058d0b655c496e9125fc8d289c4e5bc9a78297ba3dJoe Onorato            }
16068d0b655c496e9125fc8d289c4e5bc9a78297ba3dJoe Onorato            if ((mDefaults & DEFAULT_LIGHTS) != 0) {
16078d0b655c496e9125fc8d289c4e5bc9a78297ba3dJoe Onorato                n.flags |= FLAG_SHOW_LIGHTS;
16088d0b655c496e9125fc8d289c4e5bc9a78297ba3dJoe Onorato            }
16092561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler            if (mKindList.size() > 0) {
16102561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler                n.kind = new String[mKindList.size()];
16112561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler                mKindList.toArray(n.kind);
16122561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler            } else {
16132561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler                n.kind = null;
16142561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler            }
16152561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler            n.priority = mPriority;
16162561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler            n.extras = mExtras != null ? new Bundle(mExtras) : null;
1617a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler            if (mActions.size() > 0) {
1618a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler                n.actions = new Action[mActions.size()];
1619a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler                mActions.toArray(n.actions);
1620a0a938cd5f6eaed449678a00420916cde711de63Daniel Sandler            }
162146439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            return n;
162246439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        }
1623fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren
1624fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren        /**
1625fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren         * @deprecated Use {@link #build()} instead.
1626fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren         */
1627fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren        @Deprecated
1628fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren        public Notification getNotification() {
1629fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren            return build();
1630fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren        }
1631fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren
1632fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren        /**
1633fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren         * Combine all of the options that have been set and return a new {@link Notification}
1634fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren         * object.
1635fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren         */
1636fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren        public Notification build() {
1637fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren            if (mStyle != null) {
1638fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren                return mStyle.build();
1639fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren            } else {
1640fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren                return buildUnstyled();
1641fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren            }
1642fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren        }
1643fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren    }
1644fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren
1645fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren
1646fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren    /**
1647fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren     * An object that can apply a rich notification style to a {@link Notification.Builder}
1648fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren     * object.
1649fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren     */
1650d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren    public static abstract class Style
1651d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren    {
1652d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren        private CharSequence mBigContentTitle;
1653d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren        private CharSequence mSummaryText = null;
1654619738c9e7b321d3a7f297b95955c681f5de56baDaniel Sandler        private boolean mSummaryTextSet = false;
1655d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren
1656fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren        protected Builder mBuilder;
1657fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren
1658d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren        /**
1659d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren         * Overrides ContentTitle in the big form of the template.
1660d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren         * This defaults to the value passed to setContentTitle().
1661d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren         */
1662d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren        protected void internalSetBigContentTitle(CharSequence title) {
1663d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren            mBigContentTitle = title;
1664d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren        }
1665d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren
1666d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren        /**
1667d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren         * Set the first line of text after the detail section in the big form of the template.
1668d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren         */
1669d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren        protected void internalSetSummaryText(CharSequence cs) {
1670d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren            mSummaryText = cs;
1671619738c9e7b321d3a7f297b95955c681f5de56baDaniel Sandler            mSummaryTextSet = true;
1672d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren        }
1673d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren
1674fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren        public void setBuilder(Builder builder) {
1675fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren            if (mBuilder != builder) {
1676fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren                mBuilder = builder;
1677c08dea2aa4f66f888f01fa7ed2be46d4c4651a1eDaniel Sandler                if (mBuilder != null) {
1678c08dea2aa4f66f888f01fa7ed2be46d4c4651a1eDaniel Sandler                    mBuilder.setStyle(this);
1679c08dea2aa4f66f888f01fa7ed2be46d4c4651a1eDaniel Sandler                }
1680fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren            }
1681fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren        }
1682fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren
1683d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren        protected void checkBuilder() {
1684fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren            if (mBuilder == null) {
1685fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren                throw new IllegalArgumentException("Style requires a valid Builder object");
1686fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren            }
1687fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren        }
1688d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren
1689d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren        protected RemoteViews getStandardView(int layoutId) {
1690d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren            checkBuilder();
1691d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren
1692d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren            if (mBigContentTitle != null) {
1693d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren                mBuilder.setContentTitle(mBigContentTitle);
1694d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren            }
1695d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren
1696d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren            RemoteViews contentView = mBuilder.applyStandardTemplateWithActions(layoutId);
1697d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren
1698d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren            if (mBigContentTitle != null && mBigContentTitle.equals("")) {
1699d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren                contentView.setViewVisibility(R.id.line1, View.GONE);
170067dc9a02cfa1873f67128fba7fbdf33f8fe18a24Chris Wren            } else {
170167dc9a02cfa1873f67128fba7fbdf33f8fe18a24Chris Wren                contentView.setViewVisibility(R.id.line1, View.VISIBLE);
1702d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren            }
1703d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren
1704619738c9e7b321d3a7f297b95955c681f5de56baDaniel Sandler            // The last line defaults to the subtext, but can be replaced by mSummaryText
1705619738c9e7b321d3a7f297b95955c681f5de56baDaniel Sandler            final CharSequence overflowText =
1706619738c9e7b321d3a7f297b95955c681f5de56baDaniel Sandler                    mSummaryTextSet ? mSummaryText
1707619738c9e7b321d3a7f297b95955c681f5de56baDaniel Sandler                                    : mBuilder.mSubText;
1708619738c9e7b321d3a7f297b95955c681f5de56baDaniel Sandler            if (overflowText != null) {
1709619738c9e7b321d3a7f297b95955c681f5de56baDaniel Sandler                contentView.setTextViewText(R.id.text, overflowText);
1710619738c9e7b321d3a7f297b95955c681f5de56baDaniel Sandler                contentView.setViewVisibility(R.id.overflow_divider, View.VISIBLE);
17119f7936a30bc097c31962891945802507cb4aeb82Daniel Sandler                contentView.setViewVisibility(R.id.line3, View.VISIBLE);
1712916ad91c3860344250c00b6b3597db6464229c02Daniel Sandler            } else {
1713916ad91c3860344250c00b6b3597db6464229c02Daniel Sandler                contentView.setViewVisibility(R.id.overflow_divider, View.GONE);
1714916ad91c3860344250c00b6b3597db6464229c02Daniel Sandler                contentView.setViewVisibility(R.id.line3, View.GONE);
1715d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren            }
1716d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren
1717d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren            return contentView;
1718d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren        }
1719d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren
1720d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren        public abstract Notification build();
172146439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato    }
1722f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler
1723f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler    /**
17244dfbe83e1a110b416badf73ddf68c83db0d415aeDaniel Sandler     * Helper class for generating large-format notifications that include a large image attachment.
1725f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler     *
17264dfbe83e1a110b416badf73ddf68c83db0d415aeDaniel Sandler     * This class is a "rebuilder": It consumes a Builder object and modifies its behavior, like so:
1727f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler     * <pre class="prettyprint">
1728f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler     * Notification noti = new Notification.BigPictureStyle(
1729f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler     *      new Notification.Builder()
17304dfbe83e1a110b416badf73ddf68c83db0d415aeDaniel Sandler     *         .setContentTitle(&quot;New photo from &quot; + sender.toString())
1731f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler     *         .setContentText(subject)
17324dfbe83e1a110b416badf73ddf68c83db0d415aeDaniel Sandler     *         .setSmallIcon(R.drawable.new_post)
1733f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler     *         .setLargeIcon(aBitmap))
1734f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler     *      .bigPicture(aBigBitmap)
1735f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler     *      .build();
1736f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler     * </pre>
17374dfbe83e1a110b416badf73ddf68c83db0d415aeDaniel Sandler     *
17384dfbe83e1a110b416badf73ddf68c83db0d415aeDaniel Sandler     * @see Notification#bigContentView
1739f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler     */
1740fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren    public static class BigPictureStyle extends Style {
1741f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler        private Bitmap mPicture;
17423745a3da759a9510554c8d2c59f09185e52ed403Chris Wren        private Bitmap mBigLargeIcon;
17433745a3da759a9510554c8d2c59f09185e52ed403Chris Wren        private boolean mBigLargeIconSet = false;
1744f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler
1745fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren        public BigPictureStyle() {
1746fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren        }
1747fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren
1748f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler        public BigPictureStyle(Builder builder) {
1749fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren            setBuilder(builder);
1750f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler        }
1751f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler
1752d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren        /**
1753d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren         * Overrides ContentTitle in the big form of the template.
1754d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren         * This defaults to the value passed to setContentTitle().
1755d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren         */
1756d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren        public BigPictureStyle setBigContentTitle(CharSequence title) {
1757d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren            internalSetBigContentTitle(title);
1758d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren            return this;
1759d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren        }
1760d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren
1761d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren        /**
1762d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren         * Set the first line of text after the detail section in the big form of the template.
1763d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren         */
1764d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren        public BigPictureStyle setSummaryText(CharSequence cs) {
1765d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren            internalSetSummaryText(cs);
1766d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren            return this;
1767d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren        }
1768d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren
17690bd664dab4c1af6ee2048671ed4847e0f52ea179Chris Wren        /**
17700bd664dab4c1af6ee2048671ed4847e0f52ea179Chris Wren         * Provide the bitmap to be used as the payload for the BigPicture notification.
17710bd664dab4c1af6ee2048671ed4847e0f52ea179Chris Wren         */
1772f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler        public BigPictureStyle bigPicture(Bitmap b) {
1773f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler            mPicture = b;
1774f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler            return this;
1775f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler        }
1776f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler
17773745a3da759a9510554c8d2c59f09185e52ed403Chris Wren        /**
17783745a3da759a9510554c8d2c59f09185e52ed403Chris Wren         * Override the large icon when the big notification is shown.
17793745a3da759a9510554c8d2c59f09185e52ed403Chris Wren         */
17803745a3da759a9510554c8d2c59f09185e52ed403Chris Wren        public BigPictureStyle bigLargeIcon(Bitmap b) {
17813745a3da759a9510554c8d2c59f09185e52ed403Chris Wren            mBigLargeIconSet = true;
17823745a3da759a9510554c8d2c59f09185e52ed403Chris Wren            mBigLargeIcon = b;
17833745a3da759a9510554c8d2c59f09185e52ed403Chris Wren            return this;
17843745a3da759a9510554c8d2c59f09185e52ed403Chris Wren        }
17853745a3da759a9510554c8d2c59f09185e52ed403Chris Wren
1786f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler        private RemoteViews makeBigContentView() {
1787d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren            RemoteViews contentView = getStandardView(R.layout.notification_template_big_picture);
1788f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler
1789f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler            contentView.setImageViewBitmap(R.id.big_picture, mPicture);
1790f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler
1791f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler            return contentView;
1792f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler        }
1793f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler
1794fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren        @Override
1795f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler        public Notification build() {
1796d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren            checkBuilder();
1797fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren            Notification wip = mBuilder.buildUnstyled();
17983745a3da759a9510554c8d2c59f09185e52ed403Chris Wren            if (mBigLargeIconSet ) {
17993745a3da759a9510554c8d2c59f09185e52ed403Chris Wren                mBuilder.mLargeIcon = mBigLargeIcon;
18003745a3da759a9510554c8d2c59f09185e52ed403Chris Wren            }
1801f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler            wip.bigContentView = makeBigContentView();
1802f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler            return wip;
1803f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler        }
1804f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler    }
1805f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler
1806f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler    /**
18074dfbe83e1a110b416badf73ddf68c83db0d415aeDaniel Sandler     * Helper class for generating large-format notifications that include a lot of text.
1808f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler     *
18094dfbe83e1a110b416badf73ddf68c83db0d415aeDaniel Sandler     * This class is a "rebuilder": It consumes a Builder object and modifies its behavior, like so:
1810f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler     * <pre class="prettyprint">
18118768278974082decc8fe7b4a6da132bd38f30d7cDaniel Sandler     * Notification noti = new Notification.BigTextStyle(
1812f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler     *      new Notification.Builder()
1813f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler     *         .setContentTitle(&quot;New mail from &quot; + sender.toString())
1814f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler     *         .setContentText(subject)
1815f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler     *         .setSmallIcon(R.drawable.new_mail)
1816f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler     *         .setLargeIcon(aBitmap))
1817f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler     *      .bigText(aVeryLongString)
1818f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler     *      .build();
1819f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler     * </pre>
18204dfbe83e1a110b416badf73ddf68c83db0d415aeDaniel Sandler     *
18214dfbe83e1a110b416badf73ddf68c83db0d415aeDaniel Sandler     * @see Notification#bigContentView
1822f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler     */
1823fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren    public static class BigTextStyle extends Style {
1824f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler        private CharSequence mBigText;
1825f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler
1826fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren        public BigTextStyle() {
1827fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren        }
1828fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren
1829f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler        public BigTextStyle(Builder builder) {
1830fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren            setBuilder(builder);
1831f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler        }
1832f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler
1833d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren        /**
1834d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren         * Overrides ContentTitle in the big form of the template.
1835d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren         * This defaults to the value passed to setContentTitle().
1836d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren         */
1837d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren        public BigTextStyle setBigContentTitle(CharSequence title) {
1838d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren            internalSetBigContentTitle(title);
1839d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren            return this;
1840d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren        }
1841d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren
1842d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren        /**
1843d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren         * Set the first line of text after the detail section in the big form of the template.
1844d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren         */
1845d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren        public BigTextStyle setSummaryText(CharSequence cs) {
1846d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren            internalSetSummaryText(cs);
1847d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren            return this;
1848d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren        }
1849d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren
18500bd664dab4c1af6ee2048671ed4847e0f52ea179Chris Wren        /**
18510bd664dab4c1af6ee2048671ed4847e0f52ea179Chris Wren         * Provide the longer text to be displayed in the big form of the
18520bd664dab4c1af6ee2048671ed4847e0f52ea179Chris Wren         * template in place of the content text.
18530bd664dab4c1af6ee2048671ed4847e0f52ea179Chris Wren         */
1854f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler        public BigTextStyle bigText(CharSequence cs) {
1855f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler            mBigText = cs;
1856f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler            return this;
1857f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler        }
1858f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler
1859f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler        private RemoteViews makeBigContentView() {
1860619738c9e7b321d3a7f297b95955c681f5de56baDaniel Sandler            // Remove the content text so line3 only shows if you have a summary
1861619738c9e7b321d3a7f297b95955c681f5de56baDaniel Sandler            final boolean hadThreeLines = (mBuilder.mContentText != null && mBuilder.mSubText != null);
18626387d2f6dae27ba6e8481883325adad96d3010f4Daniel Sandler            mBuilder.mContentText = null;
1863916ad91c3860344250c00b6b3597db6464229c02Daniel Sandler
1864d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren            RemoteViews contentView = getStandardView(R.layout.notification_template_big_text);
1865619738c9e7b321d3a7f297b95955c681f5de56baDaniel Sandler
1866619738c9e7b321d3a7f297b95955c681f5de56baDaniel Sandler            if (hadThreeLines) {
1867619738c9e7b321d3a7f297b95955c681f5de56baDaniel Sandler                // vertical centering
1868619738c9e7b321d3a7f297b95955c681f5de56baDaniel Sandler                contentView.setViewPadding(R.id.line1, 0, 0, 0, 0);
1869619738c9e7b321d3a7f297b95955c681f5de56baDaniel Sandler            }
1870619738c9e7b321d3a7f297b95955c681f5de56baDaniel Sandler
1871f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler            contentView.setTextViewText(R.id.big_text, mBigText);
1872f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler            contentView.setViewVisibility(R.id.big_text, View.VISIBLE);
18733c5f92432734e1e3b9bdc515628a4c09d7759cd4Chris Wren            contentView.setViewVisibility(R.id.text2, View.GONE);
1874f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler
1875f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler            return contentView;
1876f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler        }
1877f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler
1878fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren        @Override
1879f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler        public Notification build() {
1880d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren            checkBuilder();
1881fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren            Notification wip = mBuilder.buildUnstyled();
1882f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler            wip.bigContentView = makeBigContentView();
1883f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler            return wip;
1884f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler        }
1885f3b7343246bf20a8024853abe9c8eeef767d26daDaniel Sandler    }
1886879c5e07c019bbcd8647e60656d0749eae0467c3Daniel Sandler
1887879c5e07c019bbcd8647e60656d0749eae0467c3Daniel Sandler    /**
1888879c5e07c019bbcd8647e60656d0749eae0467c3Daniel Sandler     * Helper class for generating large-format notifications that include a list of (up to 5) strings.
1889879c5e07c019bbcd8647e60656d0749eae0467c3Daniel Sandler     *
1890879c5e07c019bbcd8647e60656d0749eae0467c3Daniel Sandler     * This class is a "rebuilder": It consumes a Builder object and modifies its behavior, like so:
1891879c5e07c019bbcd8647e60656d0749eae0467c3Daniel Sandler     * <pre class="prettyprint">
1892fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren     * Notification noti = new Notification.InboxStyle(
1893879c5e07c019bbcd8647e60656d0749eae0467c3Daniel Sandler     *      new Notification.Builder()
1894d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren     *         .setContentTitle(&quot;5 New mails from &quot; + sender.toString())
1895879c5e07c019bbcd8647e60656d0749eae0467c3Daniel Sandler     *         .setContentText(subject)
1896879c5e07c019bbcd8647e60656d0749eae0467c3Daniel Sandler     *         .setSmallIcon(R.drawable.new_mail)
1897879c5e07c019bbcd8647e60656d0749eae0467c3Daniel Sandler     *         .setLargeIcon(aBitmap))
1898879c5e07c019bbcd8647e60656d0749eae0467c3Daniel Sandler     *      .addLine(str1)
1899879c5e07c019bbcd8647e60656d0749eae0467c3Daniel Sandler     *      .addLine(str2)
1900d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren     *      .setContentTitle("")
1901d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren     *      .setSummaryText(&quot;+3 more&quot;)
1902879c5e07c019bbcd8647e60656d0749eae0467c3Daniel Sandler     *      .build();
1903879c5e07c019bbcd8647e60656d0749eae0467c3Daniel Sandler     * </pre>
1904879c5e07c019bbcd8647e60656d0749eae0467c3Daniel Sandler     *
1905879c5e07c019bbcd8647e60656d0749eae0467c3Daniel Sandler     * @see Notification#bigContentView
1906879c5e07c019bbcd8647e60656d0749eae0467c3Daniel Sandler     */
1907fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren    public static class InboxStyle extends Style {
1908879c5e07c019bbcd8647e60656d0749eae0467c3Daniel Sandler        private ArrayList<CharSequence> mTexts = new ArrayList<CharSequence>(5);
1909879c5e07c019bbcd8647e60656d0749eae0467c3Daniel Sandler
1910fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren        public InboxStyle() {
1911fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren        }
1912fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren
1913879c5e07c019bbcd8647e60656d0749eae0467c3Daniel Sandler        public InboxStyle(Builder builder) {
1914fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren            setBuilder(builder);
1915879c5e07c019bbcd8647e60656d0749eae0467c3Daniel Sandler        }
1916879c5e07c019bbcd8647e60656d0749eae0467c3Daniel Sandler
1917d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren        /**
1918d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren         * Overrides ContentTitle in the big form of the template.
1919d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren         * This defaults to the value passed to setContentTitle().
1920d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren         */
1921d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren        public InboxStyle setBigContentTitle(CharSequence title) {
1922d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren            internalSetBigContentTitle(title);
1923d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren            return this;
1924d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren        }
1925d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren
1926d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren        /**
1927d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren         * Set the first line of text after the detail section in the big form of the template.
1928d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren         */
1929d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren        public InboxStyle setSummaryText(CharSequence cs) {
1930d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren            internalSetSummaryText(cs);
1931d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren            return this;
1932d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren        }
1933d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren
19340bd664dab4c1af6ee2048671ed4847e0f52ea179Chris Wren        /**
19350bd664dab4c1af6ee2048671ed4847e0f52ea179Chris Wren         * Append a line to the digest section of the Inbox notification.
19360bd664dab4c1af6ee2048671ed4847e0f52ea179Chris Wren         */
1937879c5e07c019bbcd8647e60656d0749eae0467c3Daniel Sandler        public InboxStyle addLine(CharSequence cs) {
1938879c5e07c019bbcd8647e60656d0749eae0467c3Daniel Sandler            mTexts.add(cs);
1939879c5e07c019bbcd8647e60656d0749eae0467c3Daniel Sandler            return this;
1940879c5e07c019bbcd8647e60656d0749eae0467c3Daniel Sandler        }
1941879c5e07c019bbcd8647e60656d0749eae0467c3Daniel Sandler
1942879c5e07c019bbcd8647e60656d0749eae0467c3Daniel Sandler        private RemoteViews makeBigContentView() {
1943619738c9e7b321d3a7f297b95955c681f5de56baDaniel Sandler            // Remove the content text so line3 disappears unless you have a summary
1944619738c9e7b321d3a7f297b95955c681f5de56baDaniel Sandler            mBuilder.mContentText = null;
1945d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren            RemoteViews contentView = getStandardView(R.layout.notification_template_inbox);
1946619738c9e7b321d3a7f297b95955c681f5de56baDaniel Sandler
1947d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren            contentView.setViewVisibility(R.id.text2, View.GONE);
1948d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren
1949d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren            int[] rowIds = {R.id.inbox_text0, R.id.inbox_text1, R.id.inbox_text2, R.id.inbox_text3,
195029bb6d925bcaa562212b3fe41de249c3dfb64354Chris Wren                    R.id.inbox_text4, R.id.inbox_text5, R.id.inbox_text6};
1951879c5e07c019bbcd8647e60656d0749eae0467c3Daniel Sandler
19524ed80d581c3448f075d65efafc585b4691f8b301Chris Wren            // Make sure all rows are gone in case we reuse a view.
19534ed80d581c3448f075d65efafc585b4691f8b301Chris Wren            for (int rowId : rowIds) {
19544ed80d581c3448f075d65efafc585b4691f8b301Chris Wren                contentView.setViewVisibility(rowId, View.GONE);
19554ed80d581c3448f075d65efafc585b4691f8b301Chris Wren            }
19564ed80d581c3448f075d65efafc585b4691f8b301Chris Wren
1957683ab00a2ec2e02f8ad1296efb381aa72d364b57Chris Wren
1958879c5e07c019bbcd8647e60656d0749eae0467c3Daniel Sandler            int i=0;
1959879c5e07c019bbcd8647e60656d0749eae0467c3Daniel Sandler            while (i < mTexts.size() && i < rowIds.length) {
1960879c5e07c019bbcd8647e60656d0749eae0467c3Daniel Sandler                CharSequence str = mTexts.get(i);
1961879c5e07c019bbcd8647e60656d0749eae0467c3Daniel Sandler                if (str != null && !str.equals("")) {
1962879c5e07c019bbcd8647e60656d0749eae0467c3Daniel Sandler                    contentView.setViewVisibility(rowIds[i], View.VISIBLE);
1963879c5e07c019bbcd8647e60656d0749eae0467c3Daniel Sandler                    contentView.setTextViewText(rowIds[i], str);
1964879c5e07c019bbcd8647e60656d0749eae0467c3Daniel Sandler                }
1965879c5e07c019bbcd8647e60656d0749eae0467c3Daniel Sandler                i++;
1966879c5e07c019bbcd8647e60656d0749eae0467c3Daniel Sandler            }
1967879c5e07c019bbcd8647e60656d0749eae0467c3Daniel Sandler
1968683ab00a2ec2e02f8ad1296efb381aa72d364b57Chris Wren            contentView.setViewVisibility(R.id.inbox_end_pad,
1969683ab00a2ec2e02f8ad1296efb381aa72d364b57Chris Wren                    mTexts.size() > 0 ? View.VISIBLE : View.GONE);
1970683ab00a2ec2e02f8ad1296efb381aa72d364b57Chris Wren
1971683ab00a2ec2e02f8ad1296efb381aa72d364b57Chris Wren            contentView.setViewVisibility(R.id.inbox_more,
1972683ab00a2ec2e02f8ad1296efb381aa72d364b57Chris Wren                    mTexts.size() > rowIds.length ? View.VISIBLE : View.GONE);
197329bb6d925bcaa562212b3fe41de249c3dfb64354Chris Wren
1974879c5e07c019bbcd8647e60656d0749eae0467c3Daniel Sandler            return contentView;
1975879c5e07c019bbcd8647e60656d0749eae0467c3Daniel Sandler        }
1976879c5e07c019bbcd8647e60656d0749eae0467c3Daniel Sandler
1977fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren        @Override
1978879c5e07c019bbcd8647e60656d0749eae0467c3Daniel Sandler        public Notification build() {
1979d6297dbfe9b1c9c91907e4ba35d4b1ae7fe610d8Chris Wren            checkBuilder();
1980fbd96ba9baa212d99060c8b93b5c79cf00918bdaChris Wren            Notification wip = mBuilder.buildUnstyled();
1981879c5e07c019bbcd8647e60656d0749eae0467c3Daniel Sandler            wip.bigContentView = makeBigContentView();
1982879c5e07c019bbcd8647e60656d0749eae0467c3Daniel Sandler            return wip;
1983879c5e07c019bbcd8647e60656d0749eae0467c3Daniel Sandler        }
1984879c5e07c019bbcd8647e60656d0749eae0467c3Daniel Sandler    }
19859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1986