1976b6a8c18550ace670e0410453741d11dafa474Ian Lake/*
2976b6a8c18550ace670e0410453741d11dafa474Ian Lake * Copyright (C) 2015 The Android Open Source Project
3976b6a8c18550ace670e0410453741d11dafa474Ian Lake *
4976b6a8c18550ace670e0410453741d11dafa474Ian Lake * Licensed under the Apache License, Version 2.0 (the "License");
5976b6a8c18550ace670e0410453741d11dafa474Ian Lake * you may not use this file except in compliance with the License.
6976b6a8c18550ace670e0410453741d11dafa474Ian Lake * You may obtain a copy of the License at
7976b6a8c18550ace670e0410453741d11dafa474Ian Lake *
8976b6a8c18550ace670e0410453741d11dafa474Ian Lake *      http://www.apache.org/licenses/LICENSE-2.0
9976b6a8c18550ace670e0410453741d11dafa474Ian Lake *
10976b6a8c18550ace670e0410453741d11dafa474Ian Lake * Unless required by applicable law or agreed to in writing, software
11976b6a8c18550ace670e0410453741d11dafa474Ian Lake * distributed under the License is distributed on an "AS IS" BASIS,
12976b6a8c18550ace670e0410453741d11dafa474Ian Lake * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13976b6a8c18550ace670e0410453741d11dafa474Ian Lake * See the License for the specific language governing permissions and
14976b6a8c18550ace670e0410453741d11dafa474Ian Lake * limitations under the License.
15976b6a8c18550ace670e0410453741d11dafa474Ian Lake */
16976b6a8c18550ace670e0410453741d11dafa474Ian Lake
17976b6a8c18550ace670e0410453741d11dafa474Ian Lakepackage android.support.v7.app;
18976b6a8c18550ace670e0410453741d11dafa474Ian Lake
19976b6a8c18550ace670e0410453741d11dafa474Ian Lakeimport android.app.Notification;
20976b6a8c18550ace670e0410453741d11dafa474Ian Lakeimport android.app.PendingIntent;
21976b6a8c18550ace670e0410453741d11dafa474Ian Lakeimport android.content.Context;
22976b6a8c18550ace670e0410453741d11dafa474Ian Lakeimport android.os.Build;
23976b6a8c18550ace670e0410453741d11dafa474Ian Lakeimport android.support.v4.app.NotificationBuilderWithBuilderAccessor;
24976b6a8c18550ace670e0410453741d11dafa474Ian Lakeimport android.support.v4.media.session.MediaSessionCompat;
25976b6a8c18550ace670e0410453741d11dafa474Ian Lake
26976b6a8c18550ace670e0410453741d11dafa474Ian Lake/**
27976b6a8c18550ace670e0410453741d11dafa474Ian Lake * An extension of {@link android.support.v4.app.NotificationCompat} which supports
28976b6a8c18550ace670e0410453741d11dafa474Ian Lake * {@link android.support.v7.app.NotificationCompat.MediaStyle}. You should start using this variant
29976b6a8c18550ace670e0410453741d11dafa474Ian Lake * if you need support for media styled notifications.
30976b6a8c18550ace670e0410453741d11dafa474Ian Lake */
31976b6a8c18550ace670e0410453741d11dafa474Ian Lakepublic class NotificationCompat extends android.support.v4.app.NotificationCompat {
32976b6a8c18550ace670e0410453741d11dafa474Ian Lake
33976b6a8c18550ace670e0410453741d11dafa474Ian Lake    private static void addMediaStyleToBuilderLollipop(
34976b6a8c18550ace670e0410453741d11dafa474Ian Lake            NotificationBuilderWithBuilderAccessor builder, android.support.v4.app.NotificationCompat.Style style) {
35976b6a8c18550ace670e0410453741d11dafa474Ian Lake        if (style instanceof MediaStyle) {
36976b6a8c18550ace670e0410453741d11dafa474Ian Lake            MediaStyle mediaStyle = (MediaStyle) style;
37976b6a8c18550ace670e0410453741d11dafa474Ian Lake            NotificationCompatImpl21.addMediaStyle(builder,
38976b6a8c18550ace670e0410453741d11dafa474Ian Lake                    mediaStyle.mActionsToShowInCompact,
39976b6a8c18550ace670e0410453741d11dafa474Ian Lake                    mediaStyle.mToken != null ? mediaStyle.mToken.getToken() : null);
40976b6a8c18550ace670e0410453741d11dafa474Ian Lake        }
41976b6a8c18550ace670e0410453741d11dafa474Ian Lake    }
42976b6a8c18550ace670e0410453741d11dafa474Ian Lake
43976b6a8c18550ace670e0410453741d11dafa474Ian Lake    private static void addMediaStyleToBuilderIcs(NotificationBuilderWithBuilderAccessor builder,
44976b6a8c18550ace670e0410453741d11dafa474Ian Lake            android.support.v4.app.NotificationCompat.Builder b) {
45976b6a8c18550ace670e0410453741d11dafa474Ian Lake        if (b.mStyle instanceof MediaStyle) {
46976b6a8c18550ace670e0410453741d11dafa474Ian Lake            MediaStyle mediaStyle = (MediaStyle) b.mStyle;
47976b6a8c18550ace670e0410453741d11dafa474Ian Lake            NotificationCompatImplBase.overrideContentView(builder, b.mContext,
48976b6a8c18550ace670e0410453741d11dafa474Ian Lake                    b.mContentTitle,
49976b6a8c18550ace670e0410453741d11dafa474Ian Lake                    b.mContentText, b.mContentInfo, b.mNumber, b.mLargeIcon, b.mSubText,
50976b6a8c18550ace670e0410453741d11dafa474Ian Lake                    b.mUseChronometer, b.mNotification.when, b.mActions,
51976b6a8c18550ace670e0410453741d11dafa474Ian Lake                    mediaStyle.mActionsToShowInCompact, mediaStyle.mShowCancelButton,
52976b6a8c18550ace670e0410453741d11dafa474Ian Lake                    mediaStyle.mCancelButtonIntent);
53976b6a8c18550ace670e0410453741d11dafa474Ian Lake        }
54976b6a8c18550ace670e0410453741d11dafa474Ian Lake    }
55976b6a8c18550ace670e0410453741d11dafa474Ian Lake
56976b6a8c18550ace670e0410453741d11dafa474Ian Lake    private static void addBigMediaStyleToBuilderJellybean(Notification n,
57976b6a8c18550ace670e0410453741d11dafa474Ian Lake            android.support.v4.app.NotificationCompat.Builder b) {
58976b6a8c18550ace670e0410453741d11dafa474Ian Lake        if (b.mStyle instanceof MediaStyle) {
59976b6a8c18550ace670e0410453741d11dafa474Ian Lake            MediaStyle mediaStyle = (MediaStyle) b.mStyle;
60976b6a8c18550ace670e0410453741d11dafa474Ian Lake            NotificationCompatImplBase.overrideBigContentView(n, b.mContext,
61976b6a8c18550ace670e0410453741d11dafa474Ian Lake                    b.mContentTitle,
62976b6a8c18550ace670e0410453741d11dafa474Ian Lake                    b.mContentText, b.mContentInfo, b.mNumber, b.mLargeIcon, b.mSubText,
63976b6a8c18550ace670e0410453741d11dafa474Ian Lake                    b.mUseChronometer, b.mNotification.when, b.mActions,
64976b6a8c18550ace670e0410453741d11dafa474Ian Lake                    mediaStyle.mShowCancelButton, mediaStyle.mCancelButtonIntent);
65976b6a8c18550ace670e0410453741d11dafa474Ian Lake        }
66976b6a8c18550ace670e0410453741d11dafa474Ian Lake    }
67976b6a8c18550ace670e0410453741d11dafa474Ian Lake
68976b6a8c18550ace670e0410453741d11dafa474Ian Lake    /**
69976b6a8c18550ace670e0410453741d11dafa474Ian Lake     * See {@link android.support.v4.app.NotificationCompat}. In addition to the builder in v4, this
70976b6a8c18550ace670e0410453741d11dafa474Ian Lake     * builder also supports {@link MediaStyle}.
71976b6a8c18550ace670e0410453741d11dafa474Ian Lake     */
72976b6a8c18550ace670e0410453741d11dafa474Ian Lake    public static class Builder extends android.support.v4.app.NotificationCompat.Builder {
73976b6a8c18550ace670e0410453741d11dafa474Ian Lake
74976b6a8c18550ace670e0410453741d11dafa474Ian Lake        /**
75976b6a8c18550ace670e0410453741d11dafa474Ian Lake         * @inheritDoc
76976b6a8c18550ace670e0410453741d11dafa474Ian Lake         */
77976b6a8c18550ace670e0410453741d11dafa474Ian Lake        public Builder(Context context) {
78976b6a8c18550ace670e0410453741d11dafa474Ian Lake            super(context);
79976b6a8c18550ace670e0410453741d11dafa474Ian Lake        }
80976b6a8c18550ace670e0410453741d11dafa474Ian Lake
810123b49428d4073cc4c7e04b16fe0cf658ecc7edAlan Viverette        /**
820123b49428d4073cc4c7e04b16fe0cf658ecc7edAlan Viverette         * @hide
830123b49428d4073cc4c7e04b16fe0cf658ecc7edAlan Viverette         */
84976b6a8c18550ace670e0410453741d11dafa474Ian Lake        @Override
85976b6a8c18550ace670e0410453741d11dafa474Ian Lake        protected BuilderExtender getExtender() {
86976b6a8c18550ace670e0410453741d11dafa474Ian Lake            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
87976b6a8c18550ace670e0410453741d11dafa474Ian Lake                return new LollipopExtender();
88976b6a8c18550ace670e0410453741d11dafa474Ian Lake            } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
89976b6a8c18550ace670e0410453741d11dafa474Ian Lake                return new JellybeanExtender();
90976b6a8c18550ace670e0410453741d11dafa474Ian Lake            } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
91976b6a8c18550ace670e0410453741d11dafa474Ian Lake                return new IceCreamSandwichExtender();
92976b6a8c18550ace670e0410453741d11dafa474Ian Lake            } else {
93976b6a8c18550ace670e0410453741d11dafa474Ian Lake                return super.getExtender();
94976b6a8c18550ace670e0410453741d11dafa474Ian Lake            }
95976b6a8c18550ace670e0410453741d11dafa474Ian Lake        }
96976b6a8c18550ace670e0410453741d11dafa474Ian Lake    }
97976b6a8c18550ace670e0410453741d11dafa474Ian Lake
98976b6a8c18550ace670e0410453741d11dafa474Ian Lake    private static class IceCreamSandwichExtender extends BuilderExtender {
99976b6a8c18550ace670e0410453741d11dafa474Ian Lake
100976b6a8c18550ace670e0410453741d11dafa474Ian Lake        @Override
101976b6a8c18550ace670e0410453741d11dafa474Ian Lake        public Notification build(android.support.v4.app.NotificationCompat.Builder b,
102976b6a8c18550ace670e0410453741d11dafa474Ian Lake                NotificationBuilderWithBuilderAccessor builder) {
103976b6a8c18550ace670e0410453741d11dafa474Ian Lake            addMediaStyleToBuilderIcs(builder, b);
104976b6a8c18550ace670e0410453741d11dafa474Ian Lake            return builder.build();
105976b6a8c18550ace670e0410453741d11dafa474Ian Lake        }
106976b6a8c18550ace670e0410453741d11dafa474Ian Lake    }
107976b6a8c18550ace670e0410453741d11dafa474Ian Lake
108976b6a8c18550ace670e0410453741d11dafa474Ian Lake    private static class JellybeanExtender extends BuilderExtender {
109976b6a8c18550ace670e0410453741d11dafa474Ian Lake
110976b6a8c18550ace670e0410453741d11dafa474Ian Lake        @Override
111976b6a8c18550ace670e0410453741d11dafa474Ian Lake        public Notification build(android.support.v4.app.NotificationCompat.Builder b,
112976b6a8c18550ace670e0410453741d11dafa474Ian Lake                NotificationBuilderWithBuilderAccessor builder) {
113976b6a8c18550ace670e0410453741d11dafa474Ian Lake            addMediaStyleToBuilderIcs(builder, b);
114976b6a8c18550ace670e0410453741d11dafa474Ian Lake            Notification n = builder.build();
115976b6a8c18550ace670e0410453741d11dafa474Ian Lake            addBigMediaStyleToBuilderJellybean(n, b);
116976b6a8c18550ace670e0410453741d11dafa474Ian Lake            return n;
117976b6a8c18550ace670e0410453741d11dafa474Ian Lake        }
118976b6a8c18550ace670e0410453741d11dafa474Ian Lake    }
119976b6a8c18550ace670e0410453741d11dafa474Ian Lake
120976b6a8c18550ace670e0410453741d11dafa474Ian Lake    private static class LollipopExtender extends BuilderExtender {
121976b6a8c18550ace670e0410453741d11dafa474Ian Lake
122976b6a8c18550ace670e0410453741d11dafa474Ian Lake        @Override
123976b6a8c18550ace670e0410453741d11dafa474Ian Lake        public Notification build(android.support.v4.app.NotificationCompat.Builder b,
124976b6a8c18550ace670e0410453741d11dafa474Ian Lake                NotificationBuilderWithBuilderAccessor builder) {
125976b6a8c18550ace670e0410453741d11dafa474Ian Lake            addMediaStyleToBuilderLollipop(builder, b.mStyle);
126976b6a8c18550ace670e0410453741d11dafa474Ian Lake            return builder.build();
127976b6a8c18550ace670e0410453741d11dafa474Ian Lake        }
128976b6a8c18550ace670e0410453741d11dafa474Ian Lake    }
129976b6a8c18550ace670e0410453741d11dafa474Ian Lake
130976b6a8c18550ace670e0410453741d11dafa474Ian Lake    /**
131976b6a8c18550ace670e0410453741d11dafa474Ian Lake     * Notification style for media playback notifications.
132976b6a8c18550ace670e0410453741d11dafa474Ian Lake     *
133976b6a8c18550ace670e0410453741d11dafa474Ian Lake     * In the expanded form, {@link Notification#bigContentView}, up to 5
134976b6a8c18550ace670e0410453741d11dafa474Ian Lake     * {@link android.support.v4.app.NotificationCompat.Action}s specified with
135976b6a8c18550ace670e0410453741d11dafa474Ian Lake     * {@link NotificationCompat.Builder#addAction(int, CharSequence, PendingIntent) addAction} will
136976b6a8c18550ace670e0410453741d11dafa474Ian Lake     * be shown as icon-only pushbuttons, suitable for transport controls. The Bitmap given to
137976b6a8c18550ace670e0410453741d11dafa474Ian Lake     * {@link NotificationCompat.Builder#setLargeIcon(android.graphics.Bitmap) setLargeIcon()} will
138976b6a8c18550ace670e0410453741d11dafa474Ian Lake     * be treated as album artwork.
139976b6a8c18550ace670e0410453741d11dafa474Ian Lake     *
140976b6a8c18550ace670e0410453741d11dafa474Ian Lake     * Unlike the other styles provided here, MediaStyle can also modify the standard-size
141976b6a8c18550ace670e0410453741d11dafa474Ian Lake     * {@link Notification#contentView}; by providing action indices to
142976b6a8c18550ace670e0410453741d11dafa474Ian Lake     * {@link #setShowActionsInCompactView(int...)} you can promote up to 3 actions to be displayed
143976b6a8c18550ace670e0410453741d11dafa474Ian Lake     * in the standard view alongside the usual content.
144976b6a8c18550ace670e0410453741d11dafa474Ian Lake     *
145976b6a8c18550ace670e0410453741d11dafa474Ian Lake     * Notifications created with MediaStyle will have their category set to
146976b6a8c18550ace670e0410453741d11dafa474Ian Lake     * {@link Notification#CATEGORY_TRANSPORT CATEGORY_TRANSPORT} unless you set a different
147976b6a8c18550ace670e0410453741d11dafa474Ian Lake     * category using {@link NotificationCompat.Builder#setCategory(String) setCategory()}.
148976b6a8c18550ace670e0410453741d11dafa474Ian Lake     *
149976b6a8c18550ace670e0410453741d11dafa474Ian Lake     * Finally, if you attach a {@link android.media.session.MediaSession.Token} using
150976b6a8c18550ace670e0410453741d11dafa474Ian Lake     * {@link android.support.v7.app.NotificationCompat.MediaStyle#setMediaSession}, the System UI
151976b6a8c18550ace670e0410453741d11dafa474Ian Lake     * can identify this as a notification representing an active media session and respond
152976b6a8c18550ace670e0410453741d11dafa474Ian Lake     * accordingly (by showing album artwork in the lockscreen, for example).
153976b6a8c18550ace670e0410453741d11dafa474Ian Lake     *
154976b6a8c18550ace670e0410453741d11dafa474Ian Lake     * To use this style with your Notification, feed it to
155976b6a8c18550ace670e0410453741d11dafa474Ian Lake     * {@link NotificationCompat.Builder#setStyle} like so:
156976b6a8c18550ace670e0410453741d11dafa474Ian Lake     * <pre class="prettyprint">
157976b6a8c18550ace670e0410453741d11dafa474Ian Lake     * Notification noti = new NotificationCompat.Builder()
158976b6a8c18550ace670e0410453741d11dafa474Ian Lake     *     .setSmallIcon(R.drawable.ic_stat_player)
159976b6a8c18550ace670e0410453741d11dafa474Ian Lake     *     .setContentTitle(&quot;Track title&quot;)
160976b6a8c18550ace670e0410453741d11dafa474Ian Lake     *     .setContentText(&quot;Artist - Album&quot;)
161976b6a8c18550ace670e0410453741d11dafa474Ian Lake     *     .setLargeIcon(albumArtBitmap))
162976b6a8c18550ace670e0410453741d11dafa474Ian Lake     *     .setStyle(<b>new NotificationCompat.MediaStyle()</b>
163976b6a8c18550ace670e0410453741d11dafa474Ian Lake     *         .setMediaSession(mySession))
164976b6a8c18550ace670e0410453741d11dafa474Ian Lake     *     .build();
165976b6a8c18550ace670e0410453741d11dafa474Ian Lake     * </pre>
166976b6a8c18550ace670e0410453741d11dafa474Ian Lake     *
167976b6a8c18550ace670e0410453741d11dafa474Ian Lake     * @see Notification#bigContentView
168976b6a8c18550ace670e0410453741d11dafa474Ian Lake     */
169976b6a8c18550ace670e0410453741d11dafa474Ian Lake    public static class MediaStyle extends android.support.v4.app.NotificationCompat.Style {
170976b6a8c18550ace670e0410453741d11dafa474Ian Lake
171976b6a8c18550ace670e0410453741d11dafa474Ian Lake        int[] mActionsToShowInCompact = null;
172976b6a8c18550ace670e0410453741d11dafa474Ian Lake        MediaSessionCompat.Token mToken;
173976b6a8c18550ace670e0410453741d11dafa474Ian Lake        boolean mShowCancelButton;
174976b6a8c18550ace670e0410453741d11dafa474Ian Lake        PendingIntent mCancelButtonIntent;
175976b6a8c18550ace670e0410453741d11dafa474Ian Lake
176976b6a8c18550ace670e0410453741d11dafa474Ian Lake        public MediaStyle() {
177976b6a8c18550ace670e0410453741d11dafa474Ian Lake        }
178976b6a8c18550ace670e0410453741d11dafa474Ian Lake
179976b6a8c18550ace670e0410453741d11dafa474Ian Lake        public MediaStyle(android.support.v4.app.NotificationCompat.Builder builder) {
180976b6a8c18550ace670e0410453741d11dafa474Ian Lake            setBuilder(builder);
181976b6a8c18550ace670e0410453741d11dafa474Ian Lake        }
182976b6a8c18550ace670e0410453741d11dafa474Ian Lake
183976b6a8c18550ace670e0410453741d11dafa474Ian Lake        /**
184976b6a8c18550ace670e0410453741d11dafa474Ian Lake         * Request up to 3 actions (by index in the order of addition) to be shown in the compact
185976b6a8c18550ace670e0410453741d11dafa474Ian Lake         * notification view.
186976b6a8c18550ace670e0410453741d11dafa474Ian Lake         *
187976b6a8c18550ace670e0410453741d11dafa474Ian Lake         * @param actions the indices of the actions to show in the compact notification view
188976b6a8c18550ace670e0410453741d11dafa474Ian Lake         */
189976b6a8c18550ace670e0410453741d11dafa474Ian Lake        public MediaStyle setShowActionsInCompactView(int...actions) {
190976b6a8c18550ace670e0410453741d11dafa474Ian Lake            mActionsToShowInCompact = actions;
191976b6a8c18550ace670e0410453741d11dafa474Ian Lake            return this;
192976b6a8c18550ace670e0410453741d11dafa474Ian Lake        }
193976b6a8c18550ace670e0410453741d11dafa474Ian Lake
194976b6a8c18550ace670e0410453741d11dafa474Ian Lake        /**
195976b6a8c18550ace670e0410453741d11dafa474Ian Lake         * Attach a {@link MediaSessionCompat.Token} to this Notification
196976b6a8c18550ace670e0410453741d11dafa474Ian Lake         * to provide additional playback information and control to the SystemUI.
197976b6a8c18550ace670e0410453741d11dafa474Ian Lake         */
198976b6a8c18550ace670e0410453741d11dafa474Ian Lake        public MediaStyle setMediaSession(MediaSessionCompat.Token token) {
199976b6a8c18550ace670e0410453741d11dafa474Ian Lake            mToken = token;
200976b6a8c18550ace670e0410453741d11dafa474Ian Lake            return this;
201976b6a8c18550ace670e0410453741d11dafa474Ian Lake        }
202976b6a8c18550ace670e0410453741d11dafa474Ian Lake
203976b6a8c18550ace670e0410453741d11dafa474Ian Lake        /**
204976b6a8c18550ace670e0410453741d11dafa474Ian Lake         * Sets whether a cancel button at the top right should be shown in the notification on
205976b6a8c18550ace670e0410453741d11dafa474Ian Lake         * platforms before Lollipop.
206976b6a8c18550ace670e0410453741d11dafa474Ian Lake         *
207976b6a8c18550ace670e0410453741d11dafa474Ian Lake         * <p>Prior to Lollipop, there was a bug in the framework which prevented the developer to
208976b6a8c18550ace670e0410453741d11dafa474Ian Lake         * make a notification dismissable again after having used the same notification as the
209976b6a8c18550ace670e0410453741d11dafa474Ian Lake         * ongoing notification for a foreground service. When the notification was posted by
210976b6a8c18550ace670e0410453741d11dafa474Ian Lake         * {@link android.app.Service#startForeground}, but then the service exited foreground mode
211976b6a8c18550ace670e0410453741d11dafa474Ian Lake         * via {@link android.app.Service#stopForeground}, without removing the notification, the
212976b6a8c18550ace670e0410453741d11dafa474Ian Lake         * notification stayed ongoing, and thus not dismissable.
213976b6a8c18550ace670e0410453741d11dafa474Ian Lake         *
214976b6a8c18550ace670e0410453741d11dafa474Ian Lake         * <p>This is a common scenario for media notifications, as this is exactly the service
215976b6a8c18550ace670e0410453741d11dafa474Ian Lake         * lifecycle that happens when playing/pausing media. Thus, a workaround is provided by the
216976b6a8c18550ace670e0410453741d11dafa474Ian Lake         * support library: Instead of making the notification ongoing depending on the playback
217976b6a8c18550ace670e0410453741d11dafa474Ian Lake         * state, the support library provides the ability to add an explicit cancel button to the
218976b6a8c18550ace670e0410453741d11dafa474Ian Lake         * notification.
219976b6a8c18550ace670e0410453741d11dafa474Ian Lake         *
220976b6a8c18550ace670e0410453741d11dafa474Ian Lake         * <p>Note that the notification is enforced to be ongoing if a cancel button is shown to
221976b6a8c18550ace670e0410453741d11dafa474Ian Lake         * provide a consistent user experience.
222976b6a8c18550ace670e0410453741d11dafa474Ian Lake         *
223976b6a8c18550ace670e0410453741d11dafa474Ian Lake         * <p>Also note that this method is a no-op when running on Lollipop and later.
224976b6a8c18550ace670e0410453741d11dafa474Ian Lake         *
225976b6a8c18550ace670e0410453741d11dafa474Ian Lake         * @param show whether to show a cancel button
226976b6a8c18550ace670e0410453741d11dafa474Ian Lake         */
227924b73bd0744363c063dc75a879414680c9cbeb4Ian Lake        public MediaStyle setShowCancelButton(boolean show) {
228976b6a8c18550ace670e0410453741d11dafa474Ian Lake            mShowCancelButton = show;
229924b73bd0744363c063dc75a879414680c9cbeb4Ian Lake            return this;
230976b6a8c18550ace670e0410453741d11dafa474Ian Lake        }
231976b6a8c18550ace670e0410453741d11dafa474Ian Lake
232976b6a8c18550ace670e0410453741d11dafa474Ian Lake        /**
233976b6a8c18550ace670e0410453741d11dafa474Ian Lake         * Sets the pending intent to be sent when the cancel button is pressed. See {@link
234976b6a8c18550ace670e0410453741d11dafa474Ian Lake         * #setShowCancelButton}.
235976b6a8c18550ace670e0410453741d11dafa474Ian Lake         *
236976b6a8c18550ace670e0410453741d11dafa474Ian Lake         * @param pendingIntent the intent to be sent when the cancel button is pressed
237976b6a8c18550ace670e0410453741d11dafa474Ian Lake         */
238924b73bd0744363c063dc75a879414680c9cbeb4Ian Lake        public MediaStyle setCancelButtonIntent(PendingIntent pendingIntent) {
239976b6a8c18550ace670e0410453741d11dafa474Ian Lake            mCancelButtonIntent = pendingIntent;
240924b73bd0744363c063dc75a879414680c9cbeb4Ian Lake            return this;
241976b6a8c18550ace670e0410453741d11dafa474Ian Lake        }
242976b6a8c18550ace670e0410453741d11dafa474Ian Lake    }
243976b6a8c18550ace670e0410453741d11dafa474Ian Lake}
244