MsgReceiveHelper.java 6.07 KB
Newer Older
konghaorui committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
package com.yidianling.im.helper;

import com.netease.nimlib.sdk.NIMClient;
import com.netease.nimlib.sdk.NIMSDK;
import com.netease.nimlib.sdk.RequestCallbackWrapper;
import com.netease.nimlib.sdk.msg.MsgService;
import com.netease.nimlib.sdk.msg.constant.NotificationType;
import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum;
import com.netease.nimlib.sdk.msg.model.RecentContact;
import com.netease.nimlib.sdk.team.model.MemberChangeAttachment;
import com.yidianling.common.tools.LogUtil;
import com.yidianling.im.event.UpdateTabUnreadNumEvent;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;

import de.greenrobot.event.EventBus;
import io.reactivex.Observable;
import io.reactivex.android.schedulers.AndroidSchedulers;

/**
 * 接收到消息后的更新机制
 * Created by zqk on 2017/11/08;
 */
public class MsgReceiveHelper {

    private static Map<String, Integer> unreadNumMap = new HashMap<>();


    public static void updateNum(String accId, int unreadUnm) {
        unreadNumMap.put(accId, unreadUnm);
    }

    public static int getUnNum(String accId) {
        if (unreadNumMap.get(accId) != null) {
            return unreadNumMap.get(accId);
        } else {
            return 0;
        }
    }

    public static void onMessageReceived() {

        reQueryUnreadNum();
    }

    public static void reQueryUnreadNum() {
        NIMClient.getService(MsgService.class).queryRecentContacts()
                .setCallback(new RequestCallbackWrapper<List<RecentContact>>() {
                    @Override
                    public void onResult(int code, List<RecentContact> recentList, Throwable e) {
                        // recentList参数即为最近联系人列表(最近会话列表)
                        if (recentList != null && recentList.size() != 0) {
                            for (RecentContact r : recentList) {
                                if (r.getSessionType() == SessionTypeEnum.Team && r.getAttachment() instanceof MemberChangeAttachment) {
                                    if (((MemberChangeAttachment) r.getAttachment()).getType() == NotificationType.KickMember) {
                                        //如果是群聊,且有被踢的消息,删除该群聊
                                        NIMClient.getService(MsgService.class).deleteRecentContact(r);
                                        continue;
                                    }
                                }
                                LogUtil.d(MsgReceiveHelper.class.getSimpleName(), "account:" + r.getContactId() + "--" + "num:" + r.getUnreadCount());
                                MsgReceiveHelper.updateNum(r.getContactId(), r.getUnreadCount());
                            }
                        }
                        Observable.timer(500, TimeUnit.MILLISECONDS)
                                .observeOn(AndroidSchedulers.mainThread())
                                .subscribe(aLong -> {
                                    EventBus.getDefault().post(new UpdateTabUnreadNumEvent());
                                });
                    }
                });
    }

    public interface MessageRefreshCallback {
        void onSuccess();
    }

    //更新未读数量及最近联系人列表
    public static void reQueryUnreadNumber(MessageRefreshCallback callback) {
        NIMClient.getService(MsgService.class).queryRecentContacts()
                .setCallback(new RequestCallbackWrapper<List<RecentContact>>() {
                    @Override
                    public void onResult(int code, List<RecentContact> recentList, Throwable e) {
                        // recentList参数即为最近联系人列表(最近会话列表)
                        if (recentList != null && recentList.size() != 0) {
                            for (RecentContact r : recentList) {
                                if (r.getSessionType() == SessionTypeEnum.Team && r.getAttachment() instanceof MemberChangeAttachment) {
                                    if (((MemberChangeAttachment) r.getAttachment()).getType() == NotificationType.KickMember) {
                                        //如果是群聊,且有被踢的消息,删除该群聊
                                        NIMClient.getService(MsgService.class).deleteRecentContact(r);
                                        continue;
                                    }
                                }
                                MsgReceiveHelper.updateNum(r.getContactId(), r.getUnreadCount());
                            }
                        }
                        if (callback != null) {
                            callback.onSuccess();
                        }
                    }
                });
    }

    public static void markAllRead() {
        NIMSDK.getMsgService().clearAllUnreadCount();
        NIMClient.getService(MsgService.class).queryRecentContacts()
                .setCallback(new RequestCallbackWrapper<List<RecentContact>>() {
                    @Override
                    public void onResult(int code, List<RecentContact> recentList, Throwable e) {
                        // recentList参数即为最近联系人列表(最近会话列表)
                        if (recentList != null && recentList.size() != 0) {
                            for (RecentContact r : recentList) {
                                MsgReceiveHelper.updateNum(r.getContactId(), 0);
                            }
                        }
                    }
                });
        Observable.timer(1500, TimeUnit.MILLISECONDS)
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(aLong -> EventBus.getDefault().post(new UpdateTabUnreadNumEvent()));
    }

    public static void markTeamChatRead(String contactId) {
        NIMClient.getService(MsgService.class).clearUnreadCount(contactId, SessionTypeEnum.Team);
        MsgReceiveHelper.updateNum(contactId, 0);
        //跟新首页底部未读消息树
        EventBus.getDefault().post(new UpdateTabUnreadNumEvent());
    }


    public static boolean isHasUnread = false;

}