1c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell/*
2c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * Copyright (C) 2012 The Android Open Source Project
3c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell *
4c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * Licensed under the Apache License, Version 2.0 (the "License");
5c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * you may not use this file except in compliance with the License.
6c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * You may obtain a copy of the License at
7c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell *
8c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell *      http://www.apache.org/licenses/LICENSE-2.0
9c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell *
10c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * Unless required by applicable law or agreed to in writing, software
11c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * distributed under the License is distributed on an "AS IS" BASIS,
12c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * See the License for the specific language governing permissions and
14c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell * limitations under the License.
15c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell */
16c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
17c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powellpackage android.support.v4.app;
18c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
19c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powellimport android.app.Notification;
20c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powellimport android.app.NotificationManager;
21c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powellimport android.app.PendingIntent;
22c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powellimport android.content.Context;
23c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powellimport android.graphics.Bitmap;
24c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powellimport android.media.AudioManager;
25c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powellimport android.net.Uri;
26c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powellimport android.os.Build;
27c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powellimport android.widget.RemoteViews;
28c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
29c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powellpublic class NotificationCompat {
30c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell    /**
31c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell     * Bit to be bitwise-ored into the {@link Notification#flags} field that should be set if
32c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell     * this notification represents a high-priority event that may be shown to the user even
33c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell     * if notifications are otherwise unavailable (that is, when the status bar is hidden).
34c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell     * This flag is ideally used in conjunction with fullScreenIntent.
35c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell     *
36c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell     * <p>This will only be respected on API level 9 and above.</p>
37c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell     */
38c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell    public static final int FLAG_HIGH_PRIORITY = 0x00000080;
39c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
40c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell    private static final NotificationCompatImpl IMPL;
41c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
42c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell    interface NotificationCompatImpl {
43c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Notification getNotification(Builder b);
44c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell    }
45c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
46c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell    static class NotificationCompatImplBase implements NotificationCompatImpl {
47c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Notification getNotification(Builder b) {
48c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            Notification result = (Notification) b.mNotification;
49c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            result.setLatestEventInfo(b.mContext, b.mContentTitle,
50c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell                    b.mContentText, b.mContentIntent);
51c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return result;
52c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
53c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell    }
54c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
55c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell    static class NotificationCompatImplHoneycomb implements NotificationCompatImpl {
56c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Notification getNotification(Builder b) {
57c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return NotificationCompatHoneycomb.add(b.mContext, b.mNotification,
58c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell                    b.mContentTitle, b.mContentText, b.mContentInfo, b.mTickerView,
59c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell                    b.mNumber, b.mContentIntent, b.mFullScreenIntent, b.mLargeIcon);
60c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
61c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell    }
62c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
63c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell    static {
64c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        if (Build.VERSION.SDK_INT >= 11) {
65c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            IMPL = new NotificationCompatImplHoneycomb();
66c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        } else {
67c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            IMPL = new NotificationCompatImplBase();
68c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
69c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell    }
70c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
71c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell    /**
72c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell     * Builder class for {@link Notification} objects.  Allows easier control over
73c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell     * all the flags, as well as help constructing the typical notification layouts.
74c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell     */
75c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell    public static class Builder {
76c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        Context mContext;
77c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
78c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        CharSequence mContentTitle;
79c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        CharSequence mContentText;
80c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        PendingIntent mContentIntent;
81c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        PendingIntent mFullScreenIntent;
82c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        RemoteViews mTickerView;
83c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        Bitmap mLargeIcon;
84c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        CharSequence mContentInfo;
85c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        int mNumber;
86c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
87c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        Notification mNotification = new Notification();
88c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
89c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
90c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Constructor.
91c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         *
92c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Automatically sets the when field to {@link System#currentTimeMillis()
93c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * System.currentTimeMillis()} and the audio stream to the
94c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * {@link Notification#STREAM_DEFAULT}.
95c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         *
96c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * @param context A {@link Context} that will be used to construct the
97c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         *      RemoteViews. The Context will not be held past the lifetime of this
98c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         *      Builder object.
99c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
100c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder(Context context) {
101c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mContext = context;
102c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
103c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            // Set defaults to match the defaults of a Notification
104c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.when = System.currentTimeMillis();
105c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.audioStreamType = Notification.STREAM_DEFAULT;
106c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
107c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
108c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
109c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Set the time that the event occurred.  Notifications in the panel are
110c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * sorted by this time.
111c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
112c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setWhen(long when) {
113c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.when = when;
114c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
115c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
116c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
117c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
118c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Set the small icon to use in the notification layouts.  Different classes of devices
119c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * may return different sizes.  See the UX guidelines for more information on how to
120c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * design these icons.
121c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         *
122c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * @param icon A resource ID in the application's package of the drawble to use.
123c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
124c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setSmallIcon(int icon) {
125c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.icon = icon;
126c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
127c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
128c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
129c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
130c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * A variant of {@link #setSmallIcon(int) setSmallIcon(int)} that takes an additional
131c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * level parameter for when the icon is a {@link android.graphics.drawable.LevelListDrawable
132c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * LevelListDrawable}.
133c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         *
134c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * @param icon A resource ID in the application's package of the drawble to use.
135c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * @param level The level to use for the icon.
136c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         *
137c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * @see android.graphics.drawable.LevelListDrawable
138c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
139c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setSmallIcon(int icon, int level) {
140c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.icon = icon;
141c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.iconLevel = level;
142c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
143c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
144c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
145c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
146c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Set the title (first row) of the notification, in a standard notification.
147c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
148c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setContentTitle(CharSequence title) {
149c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mContentTitle = title;
150c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
151c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
152c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
153c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
154c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Set the text (second row) of the notification, in a standard notification.
155c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
156c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setContentText(CharSequence text) {
157c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mContentText = text;
158c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
159c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
160c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
161c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
162c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Set the large number at the right-hand side of the notification.  This is
163c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * equivalent to setContentInfo, although it might show the number in a different
164c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * font size for readability.
165c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
166c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setNumber(int number) {
167c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNumber = number;
168c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
169c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
170c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
171c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
172c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Set the large text at the right-hand side of the notification.
173c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
174c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setContentInfo(CharSequence info) {
175c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mContentInfo = info;
176c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
177c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
178c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
179c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
180c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Set the progress this notification represents, which may be
181c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * represented as a {@link ProgressBar}.
182c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
183c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /* TODO
184c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setProgress(int max, int progress, boolean indeterminate) {
185c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mProgressMax = max;
186c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mProgress = progress;
187c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mProgressIndeterminate = indeterminate;
188c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
189c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }*/
190c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
191c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
192c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Supply a custom RemoteViews to use instead of the standard one.
193c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
194c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setContent(RemoteViews views) {
195c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.contentView = views;
196c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
197c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
198c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
199c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
200c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Supply a {@link PendingIntent} to send when the notification is clicked.
201c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * If you do not supply an intent, you can now add PendingIntents to individual
202c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * views to be launched when clicked by calling {@link RemoteViews#setOnClickPendingIntent
203c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * RemoteViews.setOnClickPendingIntent(int,PendingIntent)}.  Be sure to
204c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * read {@link Notification#contentIntent Notification.contentIntent} for
205c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * how to correctly use this.
206c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
207c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setContentIntent(PendingIntent intent) {
208c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mContentIntent = intent;
209c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
210c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
211c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
212c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
213c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Supply a {@link PendingIntent} to send when the notification is cleared by the user
214c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * directly from the notification panel.  For example, this intent is sent when the user
215c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * clicks the "Clear all" button, or the individual "X" buttons on notifications.  This
216c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * intent is not sent when the application calls {@link NotificationManager#cancel
217c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * NotificationManager.cancel(int)}.
218c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
219c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setDeleteIntent(PendingIntent intent) {
220c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.deleteIntent = intent;
221c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
222c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
223c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
224c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
225c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * An intent to launch instead of posting the notification to the status bar.
226c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Only for use with extremely high-priority notifications demanding the user's
227c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * <strong>immediate</strong> attention, such as an incoming phone call or
228c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * alarm clock that the user has explicitly set to a particular time.
229c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * If this facility is used for something else, please give the user an option
230c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * to turn it off and use a normal notification, as this can be extremely
231c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * disruptive.
232c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         *
233c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * @param intent The pending intent to launch.
234c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * @param highPriority Passing true will cause this notification to be sent
235c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         *          even if other notifications are suppressed.
236c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
237c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setFullScreenIntent(PendingIntent intent, boolean highPriority) {
238c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mFullScreenIntent = intent;
239c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            setFlag(FLAG_HIGH_PRIORITY, highPriority);
240c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
241c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
242c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
243c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
244c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Set the text that is displayed in the status bar when the notification first
245c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * arrives.
246c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
247c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setTicker(CharSequence tickerText) {
248c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.tickerText = tickerText;
249c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
250c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
251c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
252c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
253c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Set the text that is displayed in the status bar when the notification first
254c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * arrives, and also a RemoteViews object that may be displayed instead on some
255c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * devices.
256c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
257c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setTicker(CharSequence tickerText, RemoteViews views) {
258c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.tickerText = tickerText;
259c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mTickerView = views;
260c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
261c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
262c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
263c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
264c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Set the large icon that is shown in the ticker and notification.
265c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
266c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setLargeIcon(Bitmap icon) {
267c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mLargeIcon = icon;
268c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
269c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
270c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
271c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
272c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Set the sound to play.  It will play on the default stream.
273c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
274c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setSound(Uri sound) {
275c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.sound = sound;
276c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.audioStreamType = Notification.STREAM_DEFAULT;
277c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
278c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
279c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
280c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
281c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Set the sound to play.  It will play on the stream you supply.
282c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         *
283c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * @see #STREAM_DEFAULT
284c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * @see AudioManager for the <code>STREAM_</code> constants.
285c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
286c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setSound(Uri sound, int streamType) {
287c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.sound = sound;
288c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.audioStreamType = streamType;
289c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
290c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
291c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
292c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
293c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Set the vibration pattern to use.
294c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         *
295c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * @see android.os.Vibrator for a discussion of the <code>pattern</code>
296c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * parameter.
297c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
298c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setVibrate(long[] pattern) {
299c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.vibrate = pattern;
300c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
301c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
302c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
303c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
304c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Set the argb value that you would like the LED on the device to blnk, as well as the
305c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * rate.  The rate is specified in terms of the number of milliseconds to be on
306c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * and then the number of milliseconds to be off.
307c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
308c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setLights(int argb, int onMs, int offMs) {
309c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.ledARGB = argb;
310c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.ledOnMS = onMs;
311c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.ledOffMS = offMs;
312c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            boolean showLights = mNotification.ledOnMS != 0 && mNotification.ledOffMS != 0;
313c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.flags = (mNotification.flags & ~Notification.FLAG_SHOW_LIGHTS) |
314c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell                    (showLights ? Notification.FLAG_SHOW_LIGHTS : 0);
315c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
316c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
317c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
318c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
319c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Set whether this is an ongoing notification.
320c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         *
321c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * <p>Ongoing notifications differ from regular notifications in the following ways:
322c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * <ul>
323c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         *   <li>Ongoing notifications are sorted above the regular notifications in the
324c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         *   notification panel.</li>
325c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         *   <li>Ongoing notifications do not have an 'X' close button, and are not affected
326c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         *   by the "Clear all" button.
327c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * </ul>
328c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
329c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setOngoing(boolean ongoing) {
330c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            setFlag(Notification.FLAG_ONGOING_EVENT, ongoing);
331c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
332c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
333c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
334c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
335c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Set this flag if you would only like the sound, vibrate
336c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * and ticker to be played if the notification is not already showing.
337c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
338c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setOnlyAlertOnce(boolean onlyAlertOnce) {
339c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            setFlag(Notification.FLAG_ONLY_ALERT_ONCE, onlyAlertOnce);
340c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
341c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
342c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
343c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
344c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Setting this flag will make it so the notification is automatically
345c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * canceled when the user clicks it in the panel.  The PendingIntent
346c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * set with {@link #setDeleteIntent} will be broadcast when the notification
347c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * is canceled.
348c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
349c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setAutoCancel(boolean autoCancel) {
350c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            setFlag(Notification.FLAG_AUTO_CANCEL, autoCancel);
351c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
352c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
353c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
354c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
355c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Set the default notification options that will be used.
356c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * <p>
357c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * The value should be one or more of the following fields combined with
358c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * bitwise-or:
359c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * {@link Notification#DEFAULT_SOUND}, {@link Notification#DEFAULT_VIBRATE},
360c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * {@link Notification#DEFAULT_LIGHTS}.
361c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * <p>
362c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * For all default values, use {@link Notification#DEFAULT_ALL}.
363c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
364c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Builder setDefaults(int defaults) {
365c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            mNotification.defaults = defaults;
366c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            if ((defaults & Notification.DEFAULT_LIGHTS) != 0) {
367c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell                mNotification.flags |= Notification.FLAG_SHOW_LIGHTS;
368c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            }
369c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return this;
370c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
371c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
372c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        private void setFlag(int mask, boolean value) {
373c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            if (value) {
374c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell                mNotification.flags |= mask;
375c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            } else {
376c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell                mNotification.flags &= ~mask;
377c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            }
378c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
379c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell
380c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        /**
381c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * Combine all of the options that have been set and return a new {@link Notification}
382c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         * object.
383c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell         */
384c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        public Notification getNotification() {
385c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell            return (Notification) IMPL.getNotification(this);
386c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell        }
387c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell    }
388c9cf2eb0a9b6694d0fda3dbc313844955db60820Adam Powell}
389