'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.

  1. chatMessage.setMarkable(true);
  2. When the user reads (at receiver end) a message, then send a read status QBPrivateChat.readMessage(chatMessage);
  3. 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")
        }
    })

https://docs.quickblox.com/docs/android-chat-messaging

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