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