NotificationCompatJellybean.java revision b56de0d1a113c71a2808303009ab4d9708ed6e84
1f021758934b35e3b842c6799344531d7ea2969daChris Wren/*
2f021758934b35e3b842c6799344531d7ea2969daChris Wren * Copyright (C) 2012 The Android Open Source Project
3f021758934b35e3b842c6799344531d7ea2969daChris Wren *
4f021758934b35e3b842c6799344531d7ea2969daChris Wren * Licensed under the Apache License, Version 2.0 (the "License");
5f021758934b35e3b842c6799344531d7ea2969daChris Wren * you may not use this file except in compliance with the License.
6f021758934b35e3b842c6799344531d7ea2969daChris Wren * You may obtain a copy of the License at
7f021758934b35e3b842c6799344531d7ea2969daChris Wren *
8f021758934b35e3b842c6799344531d7ea2969daChris Wren *      http://www.apache.org/licenses/LICENSE-2.0
9f021758934b35e3b842c6799344531d7ea2969daChris Wren *
10f021758934b35e3b842c6799344531d7ea2969daChris Wren * Unless required by applicable law or agreed to in writing, software
11f021758934b35e3b842c6799344531d7ea2969daChris Wren * distributed under the License is distributed on an "AS IS" BASIS,
12f021758934b35e3b842c6799344531d7ea2969daChris Wren * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f021758934b35e3b842c6799344531d7ea2969daChris Wren * See the License for the specific language governing permissions and
14f021758934b35e3b842c6799344531d7ea2969daChris Wren * limitations under the License.
15f021758934b35e3b842c6799344531d7ea2969daChris Wren */
16f021758934b35e3b842c6799344531d7ea2969daChris Wren
17f021758934b35e3b842c6799344531d7ea2969daChris Wrenpackage android.support.v4.app;
18f021758934b35e3b842c6799344531d7ea2969daChris Wren
19f021758934b35e3b842c6799344531d7ea2969daChris Wrenimport android.app.Notification;
20f021758934b35e3b842c6799344531d7ea2969daChris Wrenimport android.app.PendingIntent;
21f021758934b35e3b842c6799344531d7ea2969daChris Wrenimport android.content.Context;
22f021758934b35e3b842c6799344531d7ea2969daChris Wrenimport android.graphics.Bitmap;
23b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazenimport android.os.Bundle;
24f021758934b35e3b842c6799344531d7ea2969daChris Wrenimport android.widget.RemoteViews;
25b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen
26b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazenimport java.lang.reflect.Field;
27f021758934b35e3b842c6799344531d7ea2969daChris Wrenimport java.util.ArrayList;
28f021758934b35e3b842c6799344531d7ea2969daChris Wren
29f021758934b35e3b842c6799344531d7ea2969daChris Wrenclass NotificationCompatJellybean {
30b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen    /** Extras key used for Jellybean SDK and below. */
31b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen    static final String EXTRA_LOCAL_ONLY = "android.support.localOnly";
32b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen
33b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen    private static volatile Field sExtrasField;
34b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen
35b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen    public static class Builder implements NotificationBuilderWithBuilderAccessor,
36b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            NotificationBuilderWithActions {
37b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        private Notification.Builder b;
38b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        private final boolean mLocalOnly;
39b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen
40b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        public Builder(Context context, Notification n,
41b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                CharSequence contentTitle, CharSequence contentText, CharSequence contentInfo,
42b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                RemoteViews tickerView, int number,
43b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                PendingIntent contentIntent, PendingIntent fullScreenIntent, Bitmap largeIcon,
44b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                int mProgressMax, int mProgress, boolean mProgressIndeterminate,
45b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            boolean useChronometer, int priority, CharSequence subText, boolean localOnly) {
46b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            b = new Notification.Builder(context)
47b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                .setWhen(n.when)
48b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                .setSmallIcon(n.icon, n.iconLevel)
49b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                .setContent(n.contentView)
50b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                .setTicker(n.tickerText, tickerView)
51b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                .setSound(n.sound, n.audioStreamType)
52b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                .setVibrate(n.vibrate)
53b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                .setLights(n.ledARGB, n.ledOnMS, n.ledOffMS)
54b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                .setOngoing((n.flags & Notification.FLAG_ONGOING_EVENT) != 0)
55b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                .setOnlyAlertOnce((n.flags & Notification.FLAG_ONLY_ALERT_ONCE) != 0)
56b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                .setAutoCancel((n.flags & Notification.FLAG_AUTO_CANCEL) != 0)
57b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                .setDefaults(n.defaults)
58b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                .setContentTitle(contentTitle)
59b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                .setContentText(contentText)
60b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                .setSubText(subText)
61b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                .setContentInfo(contentInfo)
62b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                .setContentIntent(contentIntent)
63b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                .setDeleteIntent(n.deleteIntent)
64b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                .setFullScreenIntent(fullScreenIntent,
65b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                        (n.flags & Notification.FLAG_HIGH_PRIORITY) != 0)
66b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                .setLargeIcon(largeIcon)
67b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                .setNumber(number)
68b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                .setUsesChronometer(useChronometer)
69b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                .setPriority(priority)
70b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                .setProgress(mProgressMax, mProgress, mProgressIndeterminate);
71b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            mLocalOnly = localOnly;
72b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        }
73b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen
74b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        @Override
75b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        public void addAction(int icon, CharSequence title, PendingIntent intent) {
76b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            b.addAction(icon, title, intent);
77b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        }
78b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen
79b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        @Override
80b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        public Notification.Builder getBuilder() {
81b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            return b;
82b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        }
83c55d0160b764bbad4e386556cab3ccac72686b0cGriff Hazen
84b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        public Notification build() {
85b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            Notification notif = b.build();
86b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            if (mLocalOnly) {
87b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                getExtras(notif).putBoolean(EXTRA_LOCAL_ONLY, mLocalOnly);
88b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            }
89b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            return notif;
90b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        }
91f021758934b35e3b842c6799344531d7ea2969daChris Wren    }
92f021758934b35e3b842c6799344531d7ea2969daChris Wren
93b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen    public static void addBigTextStyle(NotificationBuilderWithBuilderAccessor b,
94b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            CharSequence bigContentTitle, boolean useSummary,
95f021758934b35e3b842c6799344531d7ea2969daChris Wren            CharSequence summaryText, CharSequence bigText) {
96b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        Notification.BigTextStyle style = new Notification.BigTextStyle(b.getBuilder())
97f021758934b35e3b842c6799344531d7ea2969daChris Wren            .setBigContentTitle(bigContentTitle)
98f021758934b35e3b842c6799344531d7ea2969daChris Wren            .bigText(bigText);
99f021758934b35e3b842c6799344531d7ea2969daChris Wren        if (useSummary) {
100f021758934b35e3b842c6799344531d7ea2969daChris Wren            style.setSummaryText(summaryText);
101fe3b5bac4901a4bb8cf51c09fe4910b02388818aGriff Hazen        }
102f021758934b35e3b842c6799344531d7ea2969daChris Wren    }
103f021758934b35e3b842c6799344531d7ea2969daChris Wren
104b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen    public static void addBigPictureStyle(NotificationBuilderWithBuilderAccessor b,
105b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            CharSequence bigContentTitle, boolean useSummary,
10649714d665f839c4804a17eea129092f8b472926dRoman Nurik            CharSequence summaryText, Bitmap bigPicture, Bitmap bigLargeIcon,
10749714d665f839c4804a17eea129092f8b472926dRoman Nurik            boolean bigLargeIconSet) {
108b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        Notification.BigPictureStyle style = new Notification.BigPictureStyle(b.getBuilder())
109fe3b5bac4901a4bb8cf51c09fe4910b02388818aGriff Hazen            .setBigContentTitle(bigContentTitle)
110fe3b5bac4901a4bb8cf51c09fe4910b02388818aGriff Hazen            .bigPicture(bigPicture);
111fe3b5bac4901a4bb8cf51c09fe4910b02388818aGriff Hazen        if (bigLargeIconSet) {
112fe3b5bac4901a4bb8cf51c09fe4910b02388818aGriff Hazen            style.bigLargeIcon(bigLargeIcon);
113fe3b5bac4901a4bb8cf51c09fe4910b02388818aGriff Hazen        }
114f021758934b35e3b842c6799344531d7ea2969daChris Wren        if (useSummary) {
115f021758934b35e3b842c6799344531d7ea2969daChris Wren            style.setSummaryText(summaryText);
116fe3b5bac4901a4bb8cf51c09fe4910b02388818aGriff Hazen        }
117f021758934b35e3b842c6799344531d7ea2969daChris Wren    }
118f021758934b35e3b842c6799344531d7ea2969daChris Wren
119b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen    public static void addInboxStyle(NotificationBuilderWithBuilderAccessor b,
120b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            CharSequence bigContentTitle, boolean useSummary,
121f021758934b35e3b842c6799344531d7ea2969daChris Wren            CharSequence summaryText, ArrayList<CharSequence> texts) {
122b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        Notification.InboxStyle style = new Notification.InboxStyle(b.getBuilder())
123f021758934b35e3b842c6799344531d7ea2969daChris Wren            .setBigContentTitle(bigContentTitle);
124f021758934b35e3b842c6799344531d7ea2969daChris Wren        if (useSummary) {
125f021758934b35e3b842c6799344531d7ea2969daChris Wren            style.setSummaryText(summaryText);
126f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
127f021758934b35e3b842c6799344531d7ea2969daChris Wren        for (CharSequence text: texts) {
128f021758934b35e3b842c6799344531d7ea2969daChris Wren            style.addLine(text);
129f021758934b35e3b842c6799344531d7ea2969daChris Wren        }
130f021758934b35e3b842c6799344531d7ea2969daChris Wren    }
131f021758934b35e3b842c6799344531d7ea2969daChris Wren
132b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen    /**
133b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen     * Get the extras Bundle from a notification using reflection. Extras were present in
134b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen     * Jellybean notifications, but the field was private until KitKat.
135b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen     */
136b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen    public static Bundle getExtras(Notification notif) {
137b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        try {
138b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            if (sExtrasField == null) {
139b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                Field extrasField = Notification.class.getDeclaredField("extras");
140b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                extrasField.setAccessible(true);
141b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                sExtrasField = extrasField;
142b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            }
143b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            Bundle extras = (Bundle) sExtrasField.get(notif);
144b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            if (extras == null) {
145b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                extras = new Bundle();
146b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                sExtrasField.set(notif, extras);
147b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            }
148b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            return extras;
149b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        } catch (IllegalAccessException e) {
150b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            throw new IllegalStateException("Unable to access notification extras", e);
151b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        } catch (NoSuchFieldException e) {
152b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen            throw new IllegalStateException("Unable to access notification extras", e);
153b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        }
154b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen    }
155b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen
156b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen    public static boolean getLocalOnly(Notification notif) {
157b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        return getExtras(notif).getBoolean(EXTRA_LOCAL_ONLY);
15862d32dda7a6dd510ba7bbf11bb3edaa314c4948eGriff Hazen    }
159f021758934b35e3b842c6799344531d7ea2969daChris Wren}
160