'Quickblox android message read/delivery status issue (Quickblox SDK 2.3.1)
Recently I have upgraded Quickblox Android SDK from 2.3 to 2.3.1. After this upgrade, message read/deliver status is not working in my application. please someone help me. It was working properly in my old versions :( . After a lot of debugging I have found that the message status updation is not hitting in any of the methods provided by the SDK i.e. processMessageDelivered(String messageId, String dialogId, Integer userId) and processMessageRead(String messageId, String dialogId, Integer userId).
I have done the following to make it work. But still not working. Please help.
- chatMessage.setMarkable(true);
- When the user reads (at receiver end) a message, then send a read status QBPrivateChat.readMessage(chatMessage);
- Still the listener is not getting invoked on the sender side. :(
UPDATE: If I reload all messages from Quickblox server, then I can see that all messages have Read/Delivery status. The problem is with the listener and I am not able to process the status at realtime.
Please check the code part below:
Sending private message:
public void sendPrivateMessage(QBChatMessage chatMessage, int opponentId, String dialogId) throws QBResponseException {
chatMessage.setMarkable(true);
if (!TextUtils.isEmpty(dialogId)) {
chatMessage.setProperty(ChatUtils.PROPERTY_DIALOG_ID, dialogId);
}
chatMessage.setRecipientId(opponentId);
QBPrivateChat privateChat = privateChatManager.getChat(opponentId);
String error = null;
try {
if (privateChat == null) {
privateChat = createChatIfNotExist(opponentId);
}
privateChat.sendMessage(chatMessage);
} catch (XMPPException e) {
error = context.getString(R.string.dlg_fail_connection);
} catch (SmackException.NotConnectedException e) {
error = context.getString(R.string.dlg_fail_connection);
}
savePrivateMessageToCache(chatMessage, dialogId);
}
method to update read status to server
public void updateStatusMessageReadServer(String dialogId,QBChatMessage chatMessage, boolean fromPrivate) throws Exception {
StringifyArrayList<String> messagesIdsList = new StringifyArrayList<String>();
messagesIdsList.add(chatMessage.getId());
QBChatService.markMessagesAsRead(dialogId, messagesIdsList);
if (fromPrivate) {
QBPrivateChat privateChat = privateChatManager.getChat(chatMessage.getSenderId());
privateChat.readMessage(chatMessage);
}
}
Receiver part in BaseChatHelper.java:
protected PrivateChatMessageListener privateChatMessageListener;
public BaseChatHelper(Context context) {
super(context);
privateChatMessageListener = new PrivateChatMessageListener();
initPrivacyListsManager();
}
private class PrivateChatMessageListener implements
QBMessageListener<QBPrivateChat>, QBMessageStatusListener {
@Override
public void processMessage(QBPrivateChat privateChat,
final QBChatMessage chatMessage) {
if (ChatUtils.isNotificationMessage(chatMessage)) {
for (QBNotificationChatListener notificationChatListener : notificationChatListeners) {
notificationChatListener.onReceivedNotification(chatMessage
.getProperty(ChatUtils.PROPERTY_NOTIFICATION_TYPE)
.toString(), chatMessage);
}
} else {
onPrivateMessageReceived(privateChat, chatMessage);
}
}
@Override
public void processError(QBPrivateChat privateChat,
QBChatException error, QBChatMessage originMessage) {
// TODO: need to be implemented
}
@Override
public void processMessageDelivered(String messageId, String dialogId, Integer userId) {
updateMessageStatusDeliveredLocal(messageId, true);
}
@Override
public void processMessageRead(String messageId, String dialogId, Integer userId) {
try {
MessageCache messageCache = new MessageCache();
messageCache.setMessageId(messageId);
messageCache.setRead(true);
updateStatusMessageLocal(messageCache);
} catch (QBResponseException e) {
ErrorUtils.logError(e);
}
}
}
Solution 1:[1]
val messageStatusesManager = QBChatService.getInstance().messageStatusesManager
messageStatusesManager.addMessageStatusListener(object : QBMessageStatusListener {
override fun processMessageDelivered(messageId: String?, dialogId: String?, userId: Int?) {
Log.d(TAG, "processMessageRead: Message READ : message ID $messageId")
}
override fun processMessageRead(messageId: String?, dialogId: String?, userId: Int?) {
Log.d(TAG, "processMessageRead: Message READ : message ID $messageId")
}
})
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Kunal Kalwar |
