OSDN Git Service

Be more resiliant to notifications that don't use a builder.
authorJulia Reynolds <juliacr@google.com>
Mon, 23 Nov 2015 19:00:20 +0000 (14:00 -0500)
committerJulia Reynolds <juliacr@google.com>
Tue, 24 Nov 2015 15:41:55 +0000 (10:41 -0500)
Bug: 25772839
Change-Id: I526001a21f959f7229443f487439c51c8d84f1ea

core/java/android/app/Notification.java
core/java/android/app/NotificationManager.java
services/core/java/com/android/server/notification/RankingHelper.java

index 848b33f..b592bb7 100644 (file)
@@ -1915,6 +1915,19 @@ public class Notification implements Parcelable
         builder.build(); // callers expect this notification to be ready to use
     }
 
+    /**
+     * @hide
+     */
+    public static void addFieldsFromContext(Context context, Notification notification) {
+        if (notification.extras.getParcelable(EXTRA_BUILDER_APPLICATION_INFO) == null) {
+            notification.extras.putParcelable(EXTRA_BUILDER_APPLICATION_INFO,
+                    context.getApplicationInfo());
+        }
+        if (!notification.extras.containsKey(EXTRA_ORIGINATING_USERID)) {
+            notification.extras.putInt(EXTRA_ORIGINATING_USERID, context.getUserId());
+        }
+    }
+
     @Override
     public String toString() {
         StringBuilder sb = new StringBuilder();
@@ -2105,11 +2118,6 @@ public class Notification implements Parcelable
         private boolean mColorUtilInited = false;
 
         /**
-         * The user that built the notification originally.
-         */
-        private int mOriginatingUserId;
-
-        /**
          * Constructs a new Builder with the defaults:
          *
 
@@ -2940,7 +2948,7 @@ public class Notification implements Parcelable
             // Note: This assumes that the current user can read the profile badge of the
             // originating user.
             return mContext.getPackageManager().getUserBadgeForDensity(
-                    new UserHandle(mOriginatingUserId), 0);
+                    new UserHandle(mContext.getUserId()), 0);
         }
 
         private Bitmap getProfileBadge() {
@@ -3423,10 +3431,6 @@ public class Notification implements Parcelable
                 mN.extras.putStringArray(EXTRA_PEOPLE,
                         mPersonList.toArray(new String[mPersonList.size()]));
             }
-            if (mN.topic == null) {
-                mN.topic = new Topic(TOPIC_DEFAULT, mContext.getString(
-                        R.string.default_notification_topic_label));
-            }
             return mN;
         }
 
@@ -3435,12 +3439,16 @@ public class Notification implements Parcelable
             ApplicationInfo applicationInfo = n.extras.getParcelable(
                     EXTRA_BUILDER_APPLICATION_INFO);
             Context builderContext;
-            try {
-                builderContext = context.createApplicationContext(applicationInfo,
-                        Context.CONTEXT_RESTRICTED);
-            } catch (NameNotFoundException e) {
-                Log.e(TAG, "ApplicationInfo " + applicationInfo + " not found");
-                builderContext = context;  // try with our context
+            if (applicationInfo != null) {
+                try {
+                    builderContext = context.createApplicationContext(applicationInfo,
+                            Context.CONTEXT_RESTRICTED);
+                } catch (NameNotFoundException e) {
+                    Log.e(TAG, "ApplicationInfo " + applicationInfo + " not found");
+                    builderContext = context;  // try with our context
+                }
+            } else {
+                builderContext = context; // try with given context
             }
 
             return new Builder(builderContext, n);
@@ -3489,9 +3497,7 @@ public class Notification implements Parcelable
             }
 
             // lazy stuff from mContext; see comment in Builder(Context, Notification)
-            mN.extras.putParcelable(EXTRA_BUILDER_APPLICATION_INFO, mContext.getApplicationInfo());
-            mOriginatingUserId = mContext.getUserId();
-            mN.extras.putInt(EXTRA_ORIGINATING_USERID, mOriginatingUserId);
+            Notification.addFieldsFromContext(mContext, mN);
 
             buildUnstyled();
 
index 043c503..3eb3e0f 100644 (file)
@@ -218,6 +218,8 @@ public class NotificationManager
         int[] idOut = new int[1];
         INotificationManager service = getService();
         String pkg = mContext.getPackageName();
+        // Fix the notification as best we can.
+        Notification.addFieldsFromContext(mContext, notification);
         if (notification.sound != null) {
             notification.sound = notification.sound.getCanonicalUri();
             if (StrictMode.vmFileUriExposureEnabled()) {
index 4d33248..543cd89 100644 (file)
@@ -226,9 +226,7 @@ public class RankingHelper implements RankingConfig {
             r = new Record();
             r.pkg = pkg;
             r.uid = uid;
-            r.topics.put(Notification.TOPIC_DEFAULT,
-                    new Topic(new Notification.Topic(Notification.TOPIC_DEFAULT,
-                            mContext.getString(R.string.default_notification_topic_label))));
+            r.topics.put(Notification.TOPIC_DEFAULT, new Topic(createDefaultTopic()));
             mRecords.put(key, r);
         }
         return r;
@@ -406,6 +404,9 @@ public class RankingHelper implements RankingConfig {
     }
 
     private Topic getOrCreateTopic(Record r, Notification.Topic topic) {
+        if (topic == null) {
+            topic = createDefaultTopic();
+        }
         Topic t = r.topics.get(topic.getId());
         if (t != null) {
             return t;
@@ -416,6 +417,11 @@ public class RankingHelper implements RankingConfig {
         }
     }
 
+    private Notification.Topic createDefaultTopic() {
+        return new Notification.Topic(Notification.TOPIC_DEFAULT,
+                mContext.getString(R.string.default_notification_topic_label));
+    }
+
     public void dump(PrintWriter pw, String prefix, NotificationManagerService.DumpFilter filter) {
         if (filter == null) {
             final int N = mSignalExtractors.length;