Skip to main content

Message Listeners

You can register multiple listeners.

JIM.getInstance().getMessageManager().addListener("main", new IMessageManager.IMessageListener() {
/// message-receive callback
@Override
public void onMessageReceive(Message message) {
Log.d("TAG", "onMessageReceive, conversationType is " + message.getConversation().getConversationType() + ", conversationId is " + message.getConversation().getConversationId());
MessageContent content = message.getContent();
if (content instanceof TextMessage) {
Log.d("TAG", "text did receive, content is " + ((TextMessage) content).getContent());
} else if (content instanceof ImageMessage) {
Log.d("TAG", "image did receive, url is " + ((ImageMessage) content).getUrl());
} else if (content instanceof FileMessage) {
Log.d("TAG", "file did receive, name is " + ((FileMessage) content).getName());
} else if (content instanceof VoiceMessage) {
Log.d("TAG", "voice did receive");
}
}

/// message-recall callback
@Override
public void onMessageRecall(Message message) {
Log.d("TAG", "onMessageRecall, messageId is " + message.getMessageId());
}

/// message-update callback
@Override
public void onMessageUpdate(Message message) {
Log.d("TAG", "onMessageUpdate, messageId is " + message.getMessageId());
}

/// message-delete callback
/// conversation: conversation identifier
/// clientMsgNos: list of unique local message numbers
@Override
public void onMessageDelete(Conversation conversation, List<Long> clientMsgNos) {
Log.d("TAG", "onMessageDelete, conversation is " + conversation.getConversationId() + ", clientMsgNo is " + clientMsgNos);
}

/// callback triggered when all messages before a specified time in a conversation are cleared
/// conversation: conversation identifier
/// timestamp: timestamp in milliseconds; messages before timestamp are cleared
/// senderId: if non-empty, only messages sent by senderId are cleared
@Override
public void onMessageClear(Conversation conversation, long timestamp, String senderId) {
Log.d("TAG", "onMessageClear, conversation is " + conversation.getConversationId() + ", timestamp is " + timestamp + ", senderId is " + senderId);
}

/// callback triggered when a message reaction is added
/// conversation: containing conversation
/// reaction: added message reaction
@Override
public void onMessageReactionAdd(Conversation conversation, MessageReaction reaction) {

}

/// callback triggered when a message reaction is removed
/// conversation: containing conversation
/// reaction: removed message reaction
void onMessageReactionRemove(Conversation conversation, MessageReaction reaction) {

}

/// callback triggered when a message is pinned or unpinned
/// message: corresponding message
/// operator: user who performed the pin operation
/// isTop: true false indicates unpinning
void onMessageSetTop(Message message, UserInfo operator, boolean isTop) {

}
});

Message Read-Status Listeners

You can register multiple listeners.

JIM.getInstance().getMessageManager().addReadReceiptListener("main", new IMessageManager.IMessageReadReceiptListener() {
/// private chat message read callback
/// conversation: containing conversation
/// messageIds: message ID array
@Override
public void onMessagesRead(Conversation conversation, List<String> messageIds) {
Log.d("TAG", "onMessageRead, count is " + messageIds.size() + ", conversationType is " + conversation.getConversationType() + ", conversationId is " + conversation.getConversationId());
}

/// group-message read callback
/// conversation: containing conversation
/// messages: messageId is the key
@Override
public void onGroupMessagesRead(Conversation conversation, Map<String, GroupMessageReadInfo> messages) {
Log.d("TAG", "onGroupMessagesRead, conversationType is " + conversation.getConversationType() + ", id is " + conversation.getConversationId() + ", count is " + messages.size());
}
});

Message Destruction Listeners

You can register multiple listeners.

JIM.getInstance().getMessageManager().addDestroyListener("main", new IMessageManager.IMessageDestroyListener() {
/**
* callback triggered when a message's destruction time changes (typically for burn-after-reading)
* @param messageId message ID
* @param conversation containing conversation
* @param destroyTime updated destruction time
*/
@Override
public void onMessageDestroyTimeUpdate(String messageId, Conversation conversation, long destroyTime) {

}
});

Message Encryption and Decryption Callback

Only one message encryption and decryption listener can be configured.

JIM.getInstance().getMessageManager().setPreprocessor(new IMessageManager.IMessagePreprocessor() {
/**
* message-encryption callback
* callback timing: after the message is stored and before it is sent
* @param content message content to send, serialized as byte[]
* @param conversation containing conversation
* @param contentType message type
* @return processed message content.
*/
@Override
public byte[] encryptMessageContent(byte[] content, Conversation conversation, String contentType) {

}

/**
* message-decryption callback
* callback timing: after receiving the message and before storing it
* @param content received message content as byte[], not yet deserialized
* @param conversation containing conversation
* @param contentType message type
* @return processed message content.
*/
@Override
public byte[] decryptMessageContent(byte[] content, Conversation conversation, String contentType) {

}
});