From f5a7838e19c1cb6437a8b32ba9980ac1ce8804e2 Mon Sep 17 00:00:00 2001 From: Daniel Sandler Date: Fri, 15 May 2015 23:59:36 -0400 Subject: [PATCH] Make all icon fields & extras sent to listeners backward-compatible. For final release, we will only be doing this for notification listeners targeting older SDKs. Bug: 21207612 Change-Id: I28fdaa5666698150ab455f9bfb63251b9418519e --- .../NotificationListenerService.java | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/core/java/android/service/notification/NotificationListenerService.java b/core/java/android/service/notification/NotificationListenerService.java index 7956a3f16ce76..e4cdc97ba6bfd 100644 --- a/core/java/android/service/notification/NotificationListenerService.java +++ b/core/java/android/service/notification/NotificationListenerService.java @@ -27,6 +27,10 @@ import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.pm.ParceledListSlice; +import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.Drawable; +import android.graphics.drawable.Icon; +import android.graphics.Bitmap; import android.os.Bundle; import android.os.IBinder; import android.os.Parcel; @@ -322,7 +326,7 @@ public abstract class NotificationListenerService extends Service { if (!isBound()) return; try { getNotificationInterface().cancelNotificationsFromListener(mWrapper, - new String[] {key}); + new String[] { key }); } catch (android.os.RemoteException ex) { Log.v(TAG, "Unable to contact notification manager", ex); } @@ -636,6 +640,24 @@ public abstract class NotificationListenerService extends Service { } } + /** Convert new-style Icons to legacy representations for pre-M clients. */ + private void createLegacyIconExtras(Notification n) { + Icon smallIcon = n.getSmallIcon(); + Icon largeIcon = n.getLargeIcon(); + if (smallIcon.getType() == Icon.TYPE_RESOURCE) { + n.extras.putInt(Notification.EXTRA_SMALL_ICON, smallIcon.getResId()); + n.icon = smallIcon.getResId(); + } + if (largeIcon != null) { + Drawable d = largeIcon.loadDrawable(getContext()); + if (d != null && d instanceof BitmapDrawable) { + final Bitmap largeIconBits = ((BitmapDrawable) d).getBitmap(); + n.extras.putParcelable(Notification.EXTRA_LARGE_ICON, largeIconBits); + n.largeIcon = largeIconBits; + } + } + } + private class INotificationListenerWrapper extends INotificationListener.Stub { @Override public void onNotificationPosted(IStatusBarNotificationHolder sbnHolder, @@ -649,6 +671,9 @@ public abstract class NotificationListenerService extends Service { } Notification.Builder.rebuild(getContext(), sbn.getNotification()); + // convert icon metadata to legacy format for older clients + createLegacyIconExtras(sbn.getNotification()); + // protect subclass from concurrent modifications of (@link mNotificationKeys}. synchronized (mWrapper) { applyUpdate(update);