From e6080d39a2a3a99ac90a60f065b890451daff73d Mon Sep 17 00:00:00 2001 From: Chong Shao Date: Sun, 4 Aug 2019 20:57:15 -0700 Subject: [PATCH 1/5] Add image in notification support. --- .../messaging/AndroidNotification.java | 17 +++++ .../firebase/messaging/ApnsFcmOptions.java | 15 ++++ .../firebase/messaging/Notification.java | 17 +++++ .../messaging/FirebaseMessagingIT.java | 2 +- .../firebase/messaging/MessageTest.java | 70 +++++++++++++++++++ 5 files changed, 120 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/google/firebase/messaging/AndroidNotification.java b/src/main/java/com/google/firebase/messaging/AndroidNotification.java index 0a6cd0620..81c19fb66 100644 --- a/src/main/java/com/google/firebase/messaging/AndroidNotification.java +++ b/src/main/java/com/google/firebase/messaging/AndroidNotification.java @@ -66,6 +66,9 @@ public class AndroidNotification { @Key("channel_id") private final String channelId; + + @Key("image") + private final String image; private AndroidNotification(Builder builder) { this.title = builder.title; @@ -97,6 +100,7 @@ private AndroidNotification(Builder builder) { this.titleLocArgs = null; } this.channelId = builder.channelId; + this.image = builder.image; } /** @@ -122,6 +126,7 @@ public static class Builder { private String titleLocKey; private List titleLocArgs = new ArrayList<>(); private String channelId; + private String image; private Builder() {} @@ -292,6 +297,18 @@ public Builder setChannelId(String channelId) { return this; } + /** + * Sets the URL of the image that is going to be displayed in the notification. When provided, + * overrides the image set via {@link Notification}. + * + * @param image URL of the image that is going to be displayed in the notification. + * @return This builder. + */ + public Builder setImage(String image) { + this.image = image; + return this; + } + /** * Creates a new {@link AndroidNotification} instance from the parameters set on this builder. * diff --git a/src/main/java/com/google/firebase/messaging/ApnsFcmOptions.java b/src/main/java/com/google/firebase/messaging/ApnsFcmOptions.java index 708c0b56d..dec60c5b7 100644 --- a/src/main/java/com/google/firebase/messaging/ApnsFcmOptions.java +++ b/src/main/java/com/google/firebase/messaging/ApnsFcmOptions.java @@ -24,10 +24,14 @@ public final class ApnsFcmOptions { @Key("analytics_label") private final String analyticsLabel; + + @Key("image") + private final String image; private ApnsFcmOptions(Builder builder) { FcmOptionsUtil.checkAnalyticsLabel(builder.analyticsLabel); this.analyticsLabel = builder.analyticsLabel; + this.image = builder.image; } /** @@ -53,6 +57,8 @@ public static class Builder { private String analyticsLabel; + private String image; + private Builder() {} /** @@ -64,6 +70,15 @@ public Builder setAnalyticsLabel(String analyticsLabel) { return this; } + /** + * @param image URL of the image that is going to be displayed in the notification. + * @return This builder + */ + public Builder setImage(String image) { + this.image = image; + return this; + } + /** * Creates a new {@link ApnsFcmOptions} instance from the parameters set on this builder. * diff --git a/src/main/java/com/google/firebase/messaging/Notification.java b/src/main/java/com/google/firebase/messaging/Notification.java index eaa1e1443..4b8509ffc 100644 --- a/src/main/java/com/google/firebase/messaging/Notification.java +++ b/src/main/java/com/google/firebase/messaging/Notification.java @@ -29,6 +29,9 @@ public class Notification { @Key("body") private final String body; + + @Key("image") + private final String image; /** * Creates a new {@code Notification} using the given title and body. @@ -39,6 +42,20 @@ public class Notification { public Notification(String title, String body) { this.title = title; this.body = body; + this.image = null; + } + + /** + * Creates a new {@code Notification} using the given title, body, and image. + * + * @param title Title of the notification. + * @param body Body of the notification. + * @param image URL of the image that is going to be displayed in the notification. + */ + public Notification(String title, String body, String image) { + this.title = title; + this.body = body; + this.image = image; } } diff --git a/src/test/java/com/google/firebase/messaging/FirebaseMessagingIT.java b/src/test/java/com/google/firebase/messaging/FirebaseMessagingIT.java index 9a2b3ff83..34784ed87 100644 --- a/src/test/java/com/google/firebase/messaging/FirebaseMessagingIT.java +++ b/src/test/java/com/google/firebase/messaging/FirebaseMessagingIT.java @@ -44,7 +44,7 @@ public static void setUpClass() { public void testSend() throws Exception { FirebaseMessaging messaging = FirebaseMessaging.getInstance(); Message message = Message.builder() - .setNotification(new Notification("Title", "Body")) + .setNotification(new Notification("Title", "Body", "Image.png")) .setAndroidConfig(AndroidConfig.builder() .setRestrictedPackageName("com.google.firebase.testing") .build()) diff --git a/src/test/java/com/google/firebase/messaging/MessageTest.java b/src/test/java/com/google/firebase/messaging/MessageTest.java index 5f555fe3d..de96031ed 100644 --- a/src/test/java/com/google/firebase/messaging/MessageTest.java +++ b/src/test/java/com/google/firebase/messaging/MessageTest.java @@ -678,6 +678,76 @@ public void testIncorrectAnalyticsLabelFormat() { } } + @Test + public void testImageInNotification() throws IOException { + Message message = Message.builder() + .setNotification(new Notification("title", "body", "image.png")) + .setTopic("test-topic") + .build(); + Map data = ImmutableMap.of( + "title", "title", "body", "body", "image", "image.png"); + assertJsonEquals(ImmutableMap.of("topic", "test-topic", "notification", data), message); + } + + @Test + public void testImageInAndroidNotification() throws IOException { + Message message = Message.builder() + .setNotification(new Notification("title", "body", "image.png")) + .setAndroidConfig(AndroidConfig.builder() + .setNotification(AndroidNotification.builder() + .setTitle("android-title") + .setBody("android-body") + .setImage("android-image.png") + .build()) + .build()) + .setTopic("test-topic") + .build(); + Map notification = ImmutableMap.builder() + .put("title", "title") + .put("body", "body") + .put("image", "image.png") + .build(); + Map androidConfig = ImmutableMap.builder() + .put("notification", ImmutableMap.builder() + .put("title", "android-title") + .put("body", "android-body") + .put("image", "android-image.png") + .build()) + .build(); + assertJsonEquals(ImmutableMap.of( + "topic", "test-topic", "notification", notification, "android", androidConfig), message); + } + + @Test + public void testImageInApnsNotification() throws IOException { + Message message = Message.builder() + .setTopic("test-topic") + .setNotification(new Notification("title", "body", "image.png")) + .setApnsConfig( + ApnsConfig.builder().setAps(Aps.builder().build()) + .setFcmOptions(ApnsFcmOptions.builder().setImage("apns-image.png").build()) + .build()).build(); + + ImmutableMap notification = + ImmutableMap.builder() + .put("title", "title") + .put("body", "body") + .put("image", "image.png") + .build(); + ImmutableMap apnsConfig = + ImmutableMap.builder() + .put("fcm_options", ImmutableMap.of("image", "apns-image.png")) + .put("payload", ImmutableMap.of("aps", ImmutableMap.of())) + .build(); + ImmutableMap expected = + ImmutableMap.builder() + .put("topic", "test-topic") + .put("notification", notification) + .put("apns", apnsConfig) + .build(); + assertJsonEquals(expected, message); + } + private static void assertJsonEquals( Map expected, Object actual) throws IOException { assertEquals(expected, toMap(actual)); From f141157bb04d6a6bf81c0305fb335a9b5ca91277 Mon Sep 17 00:00:00 2001 From: chong-shao <31256040+chong-shao@users.noreply.github.com> Date: Thu, 8 Aug 2019 12:51:55 -0700 Subject: [PATCH 2/5] Fix indentation --- .../com/google/firebase/messaging/MessageTest.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/test/java/com/google/firebase/messaging/MessageTest.java b/src/test/java/com/google/firebase/messaging/MessageTest.java index de96031ed..bd4544f56 100644 --- a/src/test/java/com/google/firebase/messaging/MessageTest.java +++ b/src/test/java/com/google/firebase/messaging/MessageTest.java @@ -694,12 +694,12 @@ public void testImageInAndroidNotification() throws IOException { Message message = Message.builder() .setNotification(new Notification("title", "body", "image.png")) .setAndroidConfig(AndroidConfig.builder() - .setNotification(AndroidNotification.builder() - .setTitle("android-title") - .setBody("android-body") - .setImage("android-image.png") + .setNotification(AndroidNotification.builder() + .setTitle("android-title") + .setBody("android-body") + .setImage("android-image.png") + .build()) .build()) - .build()) .setTopic("test-topic") .build(); Map notification = ImmutableMap.builder() From 3ee631eb22c0dcb808c86d4e0fc01eb9b7093ea0 Mon Sep 17 00:00:00 2001 From: Chong Shao Date: Wed, 14 Aug 2019 16:06:07 -0700 Subject: [PATCH 3/5] change param name from image to imageUrl --- .../google/firebase/messaging/AndroidNotification.java | 8 ++++---- .../com/google/firebase/messaging/ApnsFcmOptions.java | 6 +++--- .../java/com/google/firebase/messaging/Notification.java | 6 +++--- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/google/firebase/messaging/AndroidNotification.java b/src/main/java/com/google/firebase/messaging/AndroidNotification.java index 81c19fb66..b341603e2 100644 --- a/src/main/java/com/google/firebase/messaging/AndroidNotification.java +++ b/src/main/java/com/google/firebase/messaging/AndroidNotification.java @@ -299,13 +299,13 @@ public Builder setChannelId(String channelId) { /** * Sets the URL of the image that is going to be displayed in the notification. When provided, - * overrides the image set via {@link Notification}. + * overrides the imageUrl set via {@link Notification}. * - * @param image URL of the image that is going to be displayed in the notification. + * @param imageUrl URL of the image that is going to be displayed in the notification. * @return This builder. */ - public Builder setImage(String image) { - this.image = image; + public Builder setImage(String imageUrl) { + this.image = imageUrl; return this; } diff --git a/src/main/java/com/google/firebase/messaging/ApnsFcmOptions.java b/src/main/java/com/google/firebase/messaging/ApnsFcmOptions.java index dec60c5b7..46bc5702f 100644 --- a/src/main/java/com/google/firebase/messaging/ApnsFcmOptions.java +++ b/src/main/java/com/google/firebase/messaging/ApnsFcmOptions.java @@ -71,11 +71,11 @@ public Builder setAnalyticsLabel(String analyticsLabel) { } /** - * @param image URL of the image that is going to be displayed in the notification. + * @param imageUrl URL of the image that is going to be displayed in the notification. * @return This builder */ - public Builder setImage(String image) { - this.image = image; + public Builder setImage(String imageUrl) { + this.image = imageUrl; return this; } diff --git a/src/main/java/com/google/firebase/messaging/Notification.java b/src/main/java/com/google/firebase/messaging/Notification.java index 4b8509ffc..568c3e3d2 100644 --- a/src/main/java/com/google/firebase/messaging/Notification.java +++ b/src/main/java/com/google/firebase/messaging/Notification.java @@ -50,12 +50,12 @@ public Notification(String title, String body) { * * @param title Title of the notification. * @param body Body of the notification. - * @param image URL of the image that is going to be displayed in the notification. + * @param imageUrl URL of the image that is going to be displayed in the notification. */ - public Notification(String title, String body, String image) { + public Notification(String title, String body, String imageUrl) { this.title = title; this.body = body; - this.image = image; + this.image = imageUrl; } } From 048133da6ced7e03d0579e301f46e4f68a6a8762 Mon Sep 17 00:00:00 2001 From: Chong Shao Date: Mon, 26 Aug 2019 22:51:27 -0700 Subject: [PATCH 4/5] Fix minor issues --- src/main/java/com/google/firebase/messaging/Notification.java | 4 +--- .../com/google/firebase/messaging/FirebaseMessagingIT.java | 3 ++- src/test/java/com/google/firebase/messaging/MessageTest.java | 4 +++- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/google/firebase/messaging/Notification.java b/src/main/java/com/google/firebase/messaging/Notification.java index 568c3e3d2..866c06680 100644 --- a/src/main/java/com/google/firebase/messaging/Notification.java +++ b/src/main/java/com/google/firebase/messaging/Notification.java @@ -40,9 +40,7 @@ public class Notification { * @param body Body of the notification. */ public Notification(String title, String body) { - this.title = title; - this.body = body; - this.image = null; + this(title, body, null); } /** diff --git a/src/test/java/com/google/firebase/messaging/FirebaseMessagingIT.java b/src/test/java/com/google/firebase/messaging/FirebaseMessagingIT.java index 34784ed87..da4320d78 100644 --- a/src/test/java/com/google/firebase/messaging/FirebaseMessagingIT.java +++ b/src/test/java/com/google/firebase/messaging/FirebaseMessagingIT.java @@ -34,6 +34,7 @@ public class FirebaseMessagingIT { private static final String TEST_REGISTRATION_TOKEN = "fGw0qy4TGgk:APA91bGtWGjuhp4WRhHXgbabIYp1jxEKI08ofj_v1bKhWAGJQ4e3arRCWzeTfHaLz83mBnDh0a" + "PWB1AykXAVUUGl2h1wT4XI6XazWpvY7RBUSYfoxtqSWGIm2nvWh2BOP1YG501SsRoE"; + private static final String TEST_IMAGE_URL = "https://example.com/image.png"; @BeforeClass public static void setUpClass() { @@ -44,7 +45,7 @@ public static void setUpClass() { public void testSend() throws Exception { FirebaseMessaging messaging = FirebaseMessaging.getInstance(); Message message = Message.builder() - .setNotification(new Notification("Title", "Body", "Image.png")) + .setNotification(new Notification("Title", "Body", TEST_IMAGE_URL)) .setAndroidConfig(AndroidConfig.builder() .setRestrictedPackageName("com.google.firebase.testing") .build()) diff --git a/src/test/java/com/google/firebase/messaging/MessageTest.java b/src/test/java/com/google/firebase/messaging/MessageTest.java index bd4544f56..9872ae6a9 100644 --- a/src/test/java/com/google/firebase/messaging/MessageTest.java +++ b/src/test/java/com/google/firebase/messaging/MessageTest.java @@ -36,6 +36,8 @@ public class MessageTest { + private static final String TEST_IMAGE_URL = "https://example.com/image.png"; + @Test(expected = IllegalArgumentException.class) public void testMessageWithoutTarget() { Message.builder().build(); @@ -681,7 +683,7 @@ public void testIncorrectAnalyticsLabelFormat() { @Test public void testImageInNotification() throws IOException { Message message = Message.builder() - .setNotification(new Notification("title", "body", "image.png")) + .setNotification(new Notification("title", "body", TEST_IMAGE_URL)) .setTopic("test-topic") .build(); Map data = ImmutableMap.of( From 4a03645bbef98a9636fc8068d4637b439d88e4ee Mon Sep 17 00:00:00 2001 From: Chong Shao Date: Mon, 26 Aug 2019 22:58:05 -0700 Subject: [PATCH 5/5] fix tests --- .../firebase/messaging/MessageTest.java | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/test/java/com/google/firebase/messaging/MessageTest.java b/src/test/java/com/google/firebase/messaging/MessageTest.java index 9872ae6a9..b33c58742 100644 --- a/src/test/java/com/google/firebase/messaging/MessageTest.java +++ b/src/test/java/com/google/firebase/messaging/MessageTest.java @@ -37,6 +37,8 @@ public class MessageTest { private static final String TEST_IMAGE_URL = "https://example.com/image.png"; + private static final String TEST_IMAGE_URL_ANDROID = "https://example.com/android-image.png"; + private static final String TEST_IMAGE_URL_APNS = "https://example.com/apns-image.png"; @Test(expected = IllegalArgumentException.class) public void testMessageWithoutTarget() { @@ -687,19 +689,19 @@ public void testImageInNotification() throws IOException { .setTopic("test-topic") .build(); Map data = ImmutableMap.of( - "title", "title", "body", "body", "image", "image.png"); + "title", "title", "body", "body", "image", TEST_IMAGE_URL); assertJsonEquals(ImmutableMap.of("topic", "test-topic", "notification", data), message); } @Test public void testImageInAndroidNotification() throws IOException { Message message = Message.builder() - .setNotification(new Notification("title", "body", "image.png")) + .setNotification(new Notification("title", "body", TEST_IMAGE_URL)) .setAndroidConfig(AndroidConfig.builder() .setNotification(AndroidNotification.builder() .setTitle("android-title") .setBody("android-body") - .setImage("android-image.png") + .setImage(TEST_IMAGE_URL_ANDROID) .build()) .build()) .setTopic("test-topic") @@ -707,13 +709,13 @@ public void testImageInAndroidNotification() throws IOException { Map notification = ImmutableMap.builder() .put("title", "title") .put("body", "body") - .put("image", "image.png") + .put("image", TEST_IMAGE_URL) .build(); Map androidConfig = ImmutableMap.builder() .put("notification", ImmutableMap.builder() .put("title", "android-title") .put("body", "android-body") - .put("image", "android-image.png") + .put("image", TEST_IMAGE_URL_ANDROID) .build()) .build(); assertJsonEquals(ImmutableMap.of( @@ -724,21 +726,21 @@ public void testImageInAndroidNotification() throws IOException { public void testImageInApnsNotification() throws IOException { Message message = Message.builder() .setTopic("test-topic") - .setNotification(new Notification("title", "body", "image.png")) + .setNotification(new Notification("title", "body", TEST_IMAGE_URL)) .setApnsConfig( ApnsConfig.builder().setAps(Aps.builder().build()) - .setFcmOptions(ApnsFcmOptions.builder().setImage("apns-image.png").build()) + .setFcmOptions(ApnsFcmOptions.builder().setImage(TEST_IMAGE_URL_APNS).build()) .build()).build(); ImmutableMap notification = ImmutableMap.builder() .put("title", "title") .put("body", "body") - .put("image", "image.png") + .put("image", TEST_IMAGE_URL) .build(); ImmutableMap apnsConfig = ImmutableMap.builder() - .put("fcm_options", ImmutableMap.of("image", "apns-image.png")) + .put("fcm_options", ImmutableMap.of("image", TEST_IMAGE_URL_APNS)) .put("payload", ImmutableMap.of("aps", ImmutableMap.of())) .build(); ImmutableMap expected =