Conversation (Android)

Last updated: 2021-10-15 15:19:03

    

    Displaying the Conversation List

    After logging in to the app, you can display a list of recent conversions like WeChat. The entire display process includes the following steps: pulling the conversation list, processing the change notifications, and updating the UI content (including the unread count). This document describes these steps in detail.

    Pulling the conversation list

    After logging in to the app, you can call getConversationList() to pull the local conversation list and display the list on the UI. The conversation list is a list of V2TIMConversation objects, and every object represents a conversation.

    The number of local conversations may be large, for example, more than 500. It may take a long time to load all conversations at a time, which results in slow display of the list on the UI. To improve user experience, the getConversationList() API is provided to support the feature of pulling by page.

    1. When the getConversationList() API is called for the first time, you can set the nextSeq parameter to 0, indicating that the conversation list is pulled from the beginning, and set count to 50, indicating that 50 conversation objects are pulled at a time.
    2. The IM SDK pulls the conversation list in the new-to-old order. After the conversation list is pulled successfully for the first time, V2TIMConversationResult, which is the callback result of getConversationList(), will contain the nextSeq field for the next pulling by page, and the isFinish field that indicates whether the conversation pulling is completed.
      • If the returned value of isFinished is true, all conversations have been pulled.
      • If the returned value of isFinished is false, more conversations can be pulled. This does not mean that the next page of the conversation list will be pulled immediately. In common communications software, pulling by page is often triggered by the swipe operation of the user. Each time when you swipe on the conversation list, pulling by page is triggered once.
    3. When you continue to swipe on the conversation list, if more content of the conversation list is yet to be pulled, the IM SDK can continue to call the getConversationList API and pass in the nextSeq and count parameters again. The values of the two parameters come from the V2TIMConversationResult object returned in the previous pulling.
    4. The IM SDK repeats step 3 until the returned value of isFinished is true.

    Displaying the conversation information

    After obtaining the V2TIMConversation object, the IM SDK can display the conversation information on the UI. V2TIMConversation contains the following key fields, which are often used to construct the conversation list.

    Field Description
    getShowName () The conversion name:
    • For the one-to-one chat, the API preferentially returns the friend’s remark. If the remark is unavailable or if the peer is not a friend, the API returns the nickname of the peer. If the nickname is also unavailable, the API returns the UserID of the peer.
    • For a group chat, the group name is displayed.
    getFaceUrl () The profile photo for the conversation:
    • For a one-to-one chat, the other party’s profile photo is displayed.
    • For a group chat, the group's profile photo is displayed.
    getRecvOpt () The message receiving option, which is generally used for a group conversation. It indicates whether the Mute notifications mode is enabled for the group.
    getUnreadCount () The unread count, which indicates the number of unread messages
    getLastMessage () The last message, which displays the message digest of the conversation

    Updating the conversation list

    After the IM SDK is successfully logged in, or the user goes online, or the connection is re-established after being interrupted, the IM SDK will automatically update the conversation list. The update process is as follows:

    • When any conversation is updated, for example, when a new message is received, the SDK will notify you by using the onConversationChanged event in V2TIMConversationListener.
    • When any conversation is added, the SDK will notify you by using the onNewConversation event in V2TIMConversationListener.
    Note:

    To ensure that the order of the conversation list complies with the sequencing principle specified in the last message, the data source must be re-sequenced based on getTimestamp in getLastMessage.

    Sample code

    The sample code shows how to pull, display, and update the conversation list.

    // 1. Set the conversation listener.
    V2TIMManager.getConversationManager().setConversationListener(this);
    // 2. Pull 50 local conversation to display them on the UI. Set the value of `nextSeq` that is passed in for the first pulling to 0.
    V2TIMManager.getConversationManager().getConversationList(0, 50, 
      new V2TIMValueCallback<V2TIMConversationResult>() {
    @Override
    public void onError(int code, String desc) {
    // The attempt to pull the conversation list fails.
    }
    @Override
    public void onSuccess(V2TIMConversationResult v2TIMConversationResult) {
    // Pulling is successful, and the UI conversation list is updated.
    updateConversation(v2TIMConversationResult.getConversationList(), false);
    if (!v2TIMConversationResult.isFinished()) {
        V2TIMManager.getConversationManager().getConversationList(
            v2TIMConversationResult.getNextSeq(), 50, 
                new V2TIMValueCallback<V2TIMConversationResult>() {
        @Override
        public void onError(int code, String desc) {}
        @Override
        public void onSuccess(V2TIMConversationResult v2TIMConversationResult) {
            // Pulling is successful, and the UI conversation list is updated.
            updateConversation(v2TIMConversationResult.getConversationList(), false);
        }
    });
    }
    }
    // 3.1 Receive the callback for adding a conversation.
    @Override
    public void onNewConversation(List<V2TIMConversation> conversationList) {
    updateConversation(conversationList, true);
    }
    // 3.2 Receive the callback for updating the conversation.
    @Override
    public void onConversationChanged(List<V2TIMConversation> conversationList) {
    updateConversation(conversationList, true);
    }
    private void updateConversation(List<V2TIMConversation> convList, boolean needSort) {
    for (int i = 0; i < convList.size(); i++) {
    V2TIMConversation conv = convList.get(i);
    boolean isExit = false;
    for (int j = 0; j < uiConvList.size(); j++) {
        V2TIMConversation uiConv = uiConvList.get(j);
        // If the conversation exists in the UI conversation list, replace this conversation.
        if (uiConv.getConversationID().equals(conv.getConversationID())) {
            uiConvList.set(j, conv);
            isExit = true;
            break;
        }
    }
    // If the conversation does not exist in the UI conversation list, add this conversation.
    if (!isExit) {
        uiConvList.add(conv);
    }
    }
    // 4. Based on the timestamp in the lastMessage of the conversation, sort the UI conversation list, and refresh the UI.
    if (needSort) {
    Collections.sort(uiConvList, new Comparator<V2TIMConversation>() {
        @Override
        public int compare(V2TIMConversation o1, V2TIMConversation o2) {
            if (o1.getLastMessage().getTimestamp() > o2.getLastMessage().getTimestamp()) {
                    return -1;
            } else {
                    return 1;
            }
        }
    });
    }
    ...
    mAdapter.setDataResource(uiConvList);
    mAdapter.notifyDataSetChanged();
    }
    

    Obtaining the Total Unread Message Count of All Conversations (Only Available in Lite Edition v5.3.425 and Above)

    You can call the getTotalUnreadMessageCount API to get the total unread count of all conversations. You don't need to go through the conversation list and add up the unread count of each conversation to get the total unread count. When the total unread count changes, the SDK will proactively call back onTotalUnreadMessageCountChanged to your app to notify you of the latest unread count.

    Pinning a Conversation on Top (Only Available in Lite Edition v5.3.425 and Above)

    You can pin a one-to-one or group conversation on the top of the conversation list so you can quickly find it. The new SDK version has added the pinConversation API to pin/unpin conversations to/from top. It also supports roaming and multi-client synchronization.
    The V2TIMConversation conversation object has added the isPinned API, which is used to determine whether a conversion is pinned on top. When the pinned-on-top status of a conversation changes, the SDK will call back onConversationChanged to your app.

    Deleting a Conversation

    You can call the deleteConversation API to delete a conversation. Conversation deletion cannot be synchronized across multiple clients. When a conversation is deleted, the message history of this conversation will be deleted from the local storage and the server by default, and cannot be recovered.

    Drafts

    When sending a message, you may need to switch to another chat window before message editing is completed. In this case, you can call the setConversationDraft API to save the unfinished message. Later, you can return to the original chat window and call getDraftText to continue editing the message.

    Note:

    • Only text content can be stored in Drafts.
    • Drafts are stored only locally, instead of on the server. Therefore, drafts cannot be synchronized across multiple devices. If the program is uninstalled, drafts cannot be reloaded.

    FAQs

    1. What is the upper limit for the number of conversations that can be stored in a conversation list?

    A locally stored conversation list can have unlimited number of conversations. A conversation list stored in the cloud can have up to 100 conversations.
    If the information of a conversation has not been updated for a long time, this conversation can be stored in the cloud for at most 7 days. To adjust the period for storing the conversation, contact us.

    2. Why are the conversation lists pulled on different mobile phones by using the same account inconsistent?

    Locally stored conversations may not always be consistent with those stored in the cloud. If you do not call the deleteConversation API to delete the local conversations, these conversations will always exist. However, at most 100 conversations can be stored in the cloud. In addition, if the information of a conversation has not been updated for a long time, this conversation can be stored in the cloud for at most 7 days. Therefore, local conversations displayed on different mobile phones may be inconsistent with each other.

    3. Why are repeated conversations pulled?

    Conversations that are pulled by the getConversationList API may have already been added to the data source of the UI conversation list through the onNewConversation callback API. Therefore, to avoid adding the same conversation repeatedly, you need to find and replace the same conversations based on getConversationID.

    4. Does the IM SDK support the feature of pinning a conversation to the top?

    IM SDK supports pinning a conversation to the top and sync to the cloud starting from v5.3.425.