Skip to content

Commit ae4f12e

Browse files
authored
Add support for new media types in ACS Communication Messages (#42463)
### Features Added - Added ImageNotificationContent to send image messgae. - Added DocumentNotificationContent to send document message. - Added VideoNotificationContent to send video message. - Added AudioNotificationContent to send audio message. - Deprecated MediaNotificationContent.
1 parent 1a11f25 commit ae4f12e

28 files changed

+1041
-214
lines changed

eng/versioning/version_client.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ com.azure:azure-communication-common-perf;1.0.0-beta.1;1.0.0-beta.1
7676
com.azure:azure-communication-email;1.0.17;1.1.0-beta.2
7777
com.azure:azure-communication-identity;1.6.0;1.7.0-beta.1
7878
com.azure:azure-communication-jobrouter;1.1.8;2.0.0-beta.1
79-
com.azure:azure-communication-messages;1.0.7;1.1.0-beta.1
79+
com.azure:azure-communication-messages;1.0.7;1.1.0
8080
com.azure:azure-communication-phonenumbers;1.1.17;1.2.0-beta.4
8181
com.azure:azure-communication-rooms;1.1.6;1.2.0-beta.1
8282
com.azure:azure-communication-sms;1.1.28;1.2.0-beta.1

sdk/communication/azure-communication-messages/CHANGELOG.md

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,13 @@
11
# Release History
22

3-
## 1.1.0-beta.1 (Unreleased)
3+
## 1.1.0 (2024-10-30)
44

55
### Features Added
6-
7-
### Breaking Changes
8-
9-
### Bugs Fixed
10-
11-
### Other Changes
12-
6+
- Added ImageNotificationContent to send image messgae.
7+
- Added DocumentNotificationContent to send document message.
8+
- Added VideoNotificationContent to send video message.
9+
- Added AudioNotificationContent to send audio message.
10+
- Deprecated MediaNotificationContent.
1311

1412
## 1.0.7 (2024-09-27)
1513

sdk/communication/azure-communication-messages/README.md

Lines changed: 65 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -194,12 +194,13 @@ private void sendTextMessage() {
194194
}
195195
```
196196

197-
```java readme-sample-sendMediaMessage
197+
```java readme-sample-sendImageMessage
198198
/*
199-
* This sample shows how to send simple media (image, video, document) message with below details
199+
* This sample shows how to send image message with below details.
200+
* Supported image - image/jpeg (.jpeg), image/png (.png)
200201
* Note: Business cannot initiate conversation with media message.
201202
* */
202-
public void sendMediaMessage() {
203+
public void sendImageMessage() {
203204
//Update the Media URL
204205
String mediaUrl = "https://wallpapercave.com/wp/wp2163723.jpg";
205206
List<String> recipients = new ArrayList<>();
@@ -208,7 +209,67 @@ public void sendMediaMessage() {
208209
.connectionString("<CONNECTION_STRING>")
209210
.buildClient();
210211
SendMessageResult result = client.send(
211-
new MediaNotificationContent("<CHANNEL_ID>", recipients, mediaUrl));
212+
new ImageNotificationContent("<CHANNEL_ID>", recipients, mediaUrl));
213+
214+
result.getReceipts().forEach(r -> System.out.println("Message sent to:" + r.getTo() + " and message id:" + r.getMessageId()));
215+
}
216+
```
217+
```java readme-sample-sendVideoMessage
218+
/*
219+
* This sample shows how to send video message with below details
220+
* Supported video - video/3gp (.3gp), video/mp4 (.mp4)
221+
* Note: Business cannot initiate conversation with media message.
222+
* */
223+
public void sendVideoMessage() {
224+
//Update the Media URL
225+
String mediaUrl = "https://sample-videos.com/video321/mp4/480/big_buck_bunny_480p_1mb.mp4";
226+
List<String> recipients = new ArrayList<>();
227+
recipients.add("<RECIPIENT_IDENTIFIER e.g. PhoneNumber>");
228+
NotificationMessagesClient client = new NotificationMessagesClientBuilder()
229+
.connectionString("<CONNECTION_STRING>")
230+
.buildClient();
231+
SendMessageResult result = client.send(
232+
new VideoNotificationContent("<CHANNEL_ID>", recipients, mediaUrl));
233+
234+
result.getReceipts().forEach(r -> System.out.println("Message sent to:" + r.getTo() + " and message id:" + r.getMessageId()));
235+
}
236+
```
237+
```java readme-sample-sendAudioMessage
238+
/*
239+
* This sample shows how to send audio message with below details
240+
* Supported audio - audio/aac (.aac), audio/amr (.amr), audio/mpeg (.mp3), audio/a4a (.mp4), audio/ogg (.ogg )
241+
* Note: Business cannot initiate conversation with media message.
242+
* */
243+
public void sendAudioMessage() {
244+
//Update the Media URL
245+
String mediaUrl = "https://sample-videos.com/audio/mp3/wave.mp3";
246+
List<String> recipients = new ArrayList<>();
247+
recipients.add("<RECIPIENT_IDENTIFIER e.g. PhoneNumber>");
248+
NotificationMessagesClient client = new NotificationMessagesClientBuilder()
249+
.connectionString("<CONNECTION_STRING>")
250+
.buildClient();
251+
SendMessageResult result = client.send(
252+
new AudioNotificationContent("<CHANNEL_ID>", recipients, mediaUrl));
253+
254+
result.getReceipts().forEach(r -> System.out.println("Message sent to:" + r.getTo() + " and message id:" + r.getMessageId()));
255+
}
256+
```
257+
```java readme-sample-sendDocumentMessage
258+
/*
259+
* This sample shows how to send document message with below details
260+
* Supported Document type - Plain Text (.txt), PDF (.pdf), Microsoft Excel, Word, PowerPoint
261+
* Note: Business cannot initiate conversation with media message.
262+
* */
263+
public void sendDocumentMessage() {
264+
//Update the Media URL
265+
String mediaUrl = "https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf";
266+
List<String> recipients = new ArrayList<>();
267+
recipients.add("<RECIPIENT_IDENTIFIER e.g. PhoneNumber>");
268+
NotificationMessagesClient client = new NotificationMessagesClientBuilder()
269+
.connectionString("<CONNECTION_STRING>")
270+
.buildClient();
271+
SendMessageResult result = client.send(
272+
new DocumentNotificationContent("<CHANNEL_ID>", recipients, mediaUrl));
212273

213274
result.getReceipts().forEach(r -> System.out.println("Message sent to:" + r.getTo() + " and message id:" + r.getMessageId()));
214275
}

sdk/communication/azure-communication-messages/assets.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@
22
"AssetsRepo" : "Azure/azure-sdk-assets",
33
"AssetsRepoPrefixPath" : "java",
44
"TagPrefix" : "java/communication/azure-communication-messages",
5-
"Tag" : "java/communication/azure-communication-messages_4553d6f877"
5+
"Tag" : "java/communication/azure-communication-messages_d7c7441f3b"
66
}

sdk/communication/azure-communication-messages/customization/src/main/java/MessagesSdkCustomization.java

Lines changed: 61 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import com.github.javaparser.ast.type.ClassOrInterfaceType;
1313
import com.github.javaparser.javadoc.Javadoc;
1414
import com.github.javaparser.javadoc.description.JavadocDescription;
15+
import com.github.javaparser.javadoc.description.JavadocSnippet;
1516
import org.slf4j.Logger;
1617

1718
public class MessagesSdkCustomization extends Customization {
@@ -25,26 +26,27 @@ public void customize(LibraryCustomization libraryCustomization, Logger logger)
2526
updateBuilderClass(packageCustomization, "MessageTemplateClientBuilder");
2627

2728
PackageCustomization modelsPackage = libraryCustomization.getPackage("com.azure.communication.messages.models");
29+
updateModelClassModifierToAbstract(modelsPackage, "NotificationContent");
30+
updateModelClassModifierToAbstract(modelsPackage, "MessageTemplateValue");
31+
updateModelClassModifierToAbstract(modelsPackage, "MessageTemplateItem");
2832
customizeMessageTemplateLocation(modelsPackage);
29-
customizeNotificationContentModel(modelsPackage);
30-
customizeMessageTemplateValueModel(modelsPackage);
3133
customizeMessageTemplateItemModel(modelsPackage);
3234

3335
PackageCustomization channelsModelsPackage = libraryCustomization.getPackage(
3436
"com.azure.communication.messages.models.channels");
3537
updateWhatsAppMessageTemplateItemWithBinaryDataContent(channelsModelsPackage);
36-
}
3738

38-
private void customizeNotificationContentModel(PackageCustomization modelsPackage) {
39-
modelsPackage.getClass("NotificationContent")
40-
.customizeAst(ast -> ast.getPrimaryType()
41-
.ifPresent(clazz -> clazz.getConstructors().get(0).setModifiers(Modifier.Keyword.PROTECTED)));
39+
AddDeprecateAnnotationToMediaNotificationContent(modelsPackage);
40+
41+
AddDeprecateAnnotationForImageV0CommunicationKind(modelsPackage);
4242
}
4343

44-
private void customizeMessageTemplateValueModel(PackageCustomization modelsPackage) {
45-
modelsPackage.getClass("MessageTemplateValue")
46-
.customizeAst(ast -> ast.getPrimaryType()
47-
.ifPresent(clazz -> clazz.getConstructors().get(0).setModifiers(Modifier.Keyword.PROTECTED)));
44+
private void updateModelClassModifierToAbstract(PackageCustomization modelsPackage, String className) {
45+
modelsPackage.getClass(className)
46+
.customizeAst(ast -> ast.getClassByName(className)
47+
.ifPresent(clazz -> clazz.setModifiers(Modifier.Keyword.PUBLIC, Modifier.Keyword.ABSTRACT)
48+
.getConstructors().get(0).setModifiers(Modifier.Keyword.PROTECTED)));
49+
removeJsonKnownDiscriminatorMethod(modelsPackage, className);
4850
}
4951

5052
private void customizeMessageTemplateItemModel(PackageCustomization modelsPackage) {
@@ -190,4 +192,52 @@ private void updateWhatsAppMessageTemplateItemWithBinaryDataContent(PackageCusto
190192
});
191193
});
192194
}
195+
196+
private void removeJsonKnownDiscriminatorMethod(PackageCustomization modelPackage, String className) {
197+
modelPackage.getClass(className).customizeAst(ast -> {
198+
ast.getClassByName(className).ifPresent( clazz -> {
199+
String fromJson = clazz.getMethodsByName("fromJson")
200+
.get(0).getBody().get().toString()
201+
.replace("return fromJsonKnownDiscriminator(readerToUse.reset());",
202+
"throw new IllegalStateException(\"Invalid Kind value - \"+discriminatorValue); ");
203+
clazz.getMethodsByName("fromJson").get(0).setBody(StaticJavaParser.parseBlock(fromJson));
204+
clazz.getMethodsByName("fromJsonKnownDiscriminator").get(0).remove();
205+
});
206+
});
207+
}
208+
209+
private void AddDeprecateAnnotationToMediaNotificationContent(PackageCustomization modelsPackage) {
210+
modelsPackage.getClass("MediaNotificationContent").customizeAst(ast -> {
211+
ast.getClassByName("MediaNotificationContent").ifPresent(clazz -> {
212+
clazz.addAnnotation(Deprecated.class);
213+
214+
// Remove the @deprecated comment as it cause special character and fails in style check
215+
clazz.getJavadoc().ifPresent(doc -> {
216+
String description = doc.getDescription().getElements().get(0).toText()
217+
.replace("&#064;deprecated", "@deprecated");
218+
doc.getDescription().getElements().set(0, new JavadocSnippet(description));
219+
clazz.setJavadocComment(doc.toComment());
220+
});
221+
});
222+
});
223+
}
224+
225+
private void AddDeprecateAnnotationForImageV0CommunicationKind(PackageCustomization modelsPackage) {
226+
modelsPackage.getClass("CommunicationMessageKind").customizeAst(ast -> {
227+
ast.getClassByName("CommunicationMessageKind")
228+
.flatMap(clazz -> clazz.getFieldByName("IMAGE_V0"))
229+
.ifPresent(f -> {
230+
f.addAnnotation(Deprecated.class);
231+
f.getJavadocComment().ifPresent(comment -> {
232+
/*
233+
Reducing size comment by replacing with @deprecated since it doesn't fit single line
234+
and fails in style check
235+
*/
236+
String content = comment.getContent()
237+
.replace("Image message type.", "@deprecated");
238+
f.setJavadocComment(content);
239+
});
240+
});
241+
});
242+
}
193243
}

sdk/communication/azure-communication-messages/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414

1515
<groupId>com.azure</groupId>
1616
<artifactId>azure-communication-messages</artifactId>
17-
<version>1.1.0-beta.1</version> <!-- {x-version-update;com.azure:azure-communication-messages;current} -->
17+
<version>1.1.0</version> <!-- {x-version-update;com.azure:azure-communication-messages;current} -->
1818
<packaging>jar</packaging>
1919

2020
<name>Microsoft Azure client library for Azure Communication Services - Messaging application</name>

sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/MessagesServiceVersion.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,12 @@ public enum MessagesServiceVersion implements ServiceVersion {
1313
/**
1414
* Enum value 2024-02-01.
1515
*/
16-
V2024_02_01("2024-02-01");
16+
V2024_02_01("2024-02-01"),
17+
18+
/**
19+
* Enum value 2024-08-30.
20+
*/
21+
V2024_08_30("2024-08-30");
1722

1823
private final String version;
1924

@@ -35,6 +40,6 @@ public String getVersion() {
3540
* @return The latest {@link MessagesServiceVersion}.
3641
*/
3742
public static MessagesServiceVersion getLatest() {
38-
return V2024_02_01;
43+
return V2024_08_30;
3944
}
4045
}

sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/NotificationMessagesAsyncClient.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ public final class NotificationMessagesAsyncClient {
5555
* <pre>
5656
* {@code
5757
* {
58-
* kind: String(text/image/template) (Required)
58+
* kind: String(text/image/image_v0/document/video/audio/template) (Required)
5959
* channelRegistrationId: String (Required)
6060
* to (Required): [
6161
* String (Required)

sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/NotificationMessagesClient.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ public final class NotificationMessagesClient {
5353
* <pre>
5454
* {@code
5555
* {
56-
* kind: String(text/image/template) (Required)
56+
* kind: String(text/image/image_v0/document/video/audio/template) (Required)
5757
* channelRegistrationId: String (Required)
5858
* to (Required): [
5959
* String (Required)

sdk/communication/azure-communication-messages/src/main/java/com/azure/communication/messages/implementation/NotificationMessagesClientImpl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,7 @@ Response<BinaryData> downloadMediaSync(@HostParam("endpoint") String endpoint,
212212
* <pre>
213213
* {@code
214214
* {
215-
* kind: String(text/image/template) (Required)
215+
* kind: String(text/image/image_v0/document/video/audio/template) (Required)
216216
* channelRegistrationId: String (Required)
217217
* to (Required): [
218218
* String (Required)
@@ -284,7 +284,7 @@ public Mono<Response<BinaryData>> sendWithResponseAsync(BinaryData notificationC
284284
* <pre>
285285
* {@code
286286
* {
287-
* kind: String(text/image/template) (Required)
287+
* kind: String(text/image/image_v0/document/video/audio/template) (Required)
288288
* channelRegistrationId: String (Required)
289289
* to (Required): [
290290
* String (Required)

0 commit comments

Comments
 (0)