|  | @@ -0,0 +1,285 @@
 | 
	
		
			
				|  |  | +package com.common.im.ui.activity;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +import android.os.Bundle;
 | 
	
		
			
				|  |  | +import android.os.Handler;
 | 
	
		
			
				|  |  | +import android.text.Editable;
 | 
	
		
			
				|  |  | +import android.text.SpannableStringBuilder;
 | 
	
		
			
				|  |  | +import android.text.Spanned;
 | 
	
		
			
				|  |  | +import android.text.TextUtils;
 | 
	
		
			
				|  |  | +import android.text.TextWatcher;
 | 
	
		
			
				|  |  | +import android.text.style.ForegroundColorSpan;
 | 
	
		
			
				|  |  | +import android.view.View;
 | 
	
		
			
				|  |  | +import android.widget.EditText;
 | 
	
		
			
				|  |  | +import android.widget.ImageView;
 | 
	
		
			
				|  |  | +import android.widget.TextView;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +import androidx.annotation.NonNull;
 | 
	
		
			
				|  |  | +import androidx.annotation.Nullable;
 | 
	
		
			
				|  |  | +import androidx.recyclerview.widget.LinearLayoutManager;
 | 
	
		
			
				|  |  | +import androidx.recyclerview.widget.RecyclerView;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +import com.alibaba.android.arouter.facade.annotation.Route;
 | 
	
		
			
				|  |  | +import com.chad.library.adapter.base.BaseQuickAdapter;
 | 
	
		
			
				|  |  | +import com.chad.library.adapter.base.listener.OnItemClickListener;
 | 
	
		
			
				|  |  | +import com.common.im.adapter.MessageSearchAdapter;
 | 
	
		
			
				|  |  | +import com.common.im.contract.SearchHistoryMessageContract;
 | 
	
		
			
				|  |  | +import com.common.im.presenter.SearchHistoryMessagePresenter;
 | 
	
		
			
				|  |  | +import com.common.im_ui.databinding.ActivitySearchHistoryMessageBinding;
 | 
	
		
			
				|  |  | +import com.cooleshow.base.router.RouterPath;
 | 
	
		
			
				|  |  | +import com.cooleshow.base.ui.activity.BaseMVPActivity;
 | 
	
		
			
				|  |  | +import com.cooleshow.base.utils.SoftKeyboardUtil;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +import java.util.ArrayList;
 | 
	
		
			
				|  |  | +import java.util.Iterator;
 | 
	
		
			
				|  |  | +import java.util.List;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +import io.rong.imkit.RongIM;
 | 
	
		
			
				|  |  | +import io.rong.imkit.userinfo.RongUserInfoManager;
 | 
	
		
			
				|  |  | +import io.rong.imkit.utils.StatusBarUtil;
 | 
	
		
			
				|  |  | +import io.rong.imlib.RongIMClient;
 | 
	
		
			
				|  |  | +import io.rong.imlib.model.Conversation;
 | 
	
		
			
				|  |  | +import io.rong.imlib.model.Group;
 | 
	
		
			
				|  |  | +import io.rong.imlib.model.Message;
 | 
	
		
			
				|  |  | +import io.rong.imlib.model.SearchConversationResult;
 | 
	
		
			
				|  |  | +import io.rong.imlib.model.UserInfo;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/**
 | 
	
		
			
				|  |  | + * 创建日期:2022/6/11 16:02
 | 
	
		
			
				|  |  | + *
 | 
	
		
			
				|  |  | + * @author Ryan
 | 
	
		
			
				|  |  | + * 类说明:
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +@Route(path = RouterPath.ChatCenter.CHAT_GROUP_SEARCH_HISTORY)
 | 
	
		
			
				|  |  | +public class SearchHistoryMessageActivity extends BaseMVPActivity<ActivitySearchHistoryMessageBinding, SearchHistoryMessagePresenter> implements SearchHistoryMessageContract.SearchHistoryMessageView, TextWatcher {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    private EditText etSearch;
 | 
	
		
			
				|  |  | +    private ImageView ivSearch;
 | 
	
		
			
				|  |  | +    private TextView tvAction;
 | 
	
		
			
				|  |  | +    private RecyclerView recyclerView;
 | 
	
		
			
				|  |  | +    private TextView tvEmpty;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    private MessageSearchAdapter adapter;
 | 
	
		
			
				|  |  | +    private List<Message> data = new ArrayList<>();
 | 
	
		
			
				|  |  | +    private List<Conversation> conversations = new ArrayList<>();
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    protected void initView() {
 | 
	
		
			
				|  |  | +        etSearch = viewBinding.etSearch;
 | 
	
		
			
				|  |  | +        ivSearch = viewBinding.ivSearch;
 | 
	
		
			
				|  |  | +        tvAction = viewBinding.tvAction;
 | 
	
		
			
				|  |  | +        recyclerView = viewBinding.recyclerView;
 | 
	
		
			
				|  |  | +        tvEmpty = viewBinding.tvEmptyView;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        etSearch.addTextChangedListener(this);
 | 
	
		
			
				|  |  | +        ivSearch.setOnClickListener(view -> {
 | 
	
		
			
				|  |  | +            searchMessage(targetId, Conversation.ConversationType.GROUP, etSearch.getText().toString().trim());
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  | +        tvAction.setOnClickListener(view -> {
 | 
	
		
			
				|  |  | +            SoftKeyboardUtil.hideSoftKeyboard(this);
 | 
	
		
			
				|  |  | +            finish();
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        adapter = new MessageSearchAdapter(data);
 | 
	
		
			
				|  |  | +        recyclerView.setLayoutManager(new LinearLayoutManager(this));
 | 
	
		
			
				|  |  | +        recyclerView.setAdapter(adapter);
 | 
	
		
			
				|  |  | +        if (TextUtils.isEmpty(targetId)) {
 | 
	
		
			
				|  |  | +            RongIM.getInstance().getConversationList(new RongIMClient.ResultCallback<List<Conversation>>() {
 | 
	
		
			
				|  |  | +                @Override
 | 
	
		
			
				|  |  | +                public void onSuccess(List<Conversation> conversations) {
 | 
	
		
			
				|  |  | +                    if (conversations != null && conversations.size() > 0) {
 | 
	
		
			
				|  |  | +                        SearchHistoryMessageActivity.this.conversations.addAll(conversations);
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                @Override
 | 
	
		
			
				|  |  | +                public void onError(RongIMClient.ErrorCode errorCode) {
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            }, Conversation.ConversationType.GROUP, Conversation.ConversationType.PRIVATE);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        adapter.setOnItemClickListener(new OnItemClickListener() {
 | 
	
		
			
				|  |  | +            @Override
 | 
	
		
			
				|  |  | +            public void onItemClick(@NonNull BaseQuickAdapter<?, ?> adapter, @NonNull View view, int position) {
 | 
	
		
			
				|  |  | +                Message message = (Message) adapter.getItem(position);
 | 
	
		
			
				|  |  | +                if (message != null) {
 | 
	
		
			
				|  |  | +                    String name = "";
 | 
	
		
			
				|  |  | +                    if (Conversation.ConversationType.GROUP == message.getConversationType()) {
 | 
	
		
			
				|  |  | +                        Group groupInfo = RongUserInfoManager.getInstance().getGroupInfo(message.getTargetId());
 | 
	
		
			
				|  |  | +                        if (groupInfo != null) {
 | 
	
		
			
				|  |  | +                            name = groupInfo.getName();
 | 
	
		
			
				|  |  | +                        }
 | 
	
		
			
				|  |  | +                    } else {
 | 
	
		
			
				|  |  | +                        UserInfo userInfo = RongUserInfoManager.getInstance().getUserInfo(message.getSenderUserId());
 | 
	
		
			
				|  |  | +                        if (userInfo != null) {
 | 
	
		
			
				|  |  | +                            name = userInfo.getName();
 | 
	
		
			
				|  |  | +                        }
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                    RongIM.getInstance().startConversation(SearchHistoryMessageActivity.this,
 | 
	
		
			
				|  |  | +                            message.getConversationType(),
 | 
	
		
			
				|  |  | +                            message.getTargetId(), name,
 | 
	
		
			
				|  |  | +                            message.getSentTime());
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    protected void onCreate(@Nullable Bundle savedInstanceState) {
 | 
	
		
			
				|  |  | +        super.onCreate(savedInstanceState);
 | 
	
		
			
				|  |  | +        StatusBarUtil.setStatusBarDarkTheme(this, true);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    private String targetId;
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    public void initData() {
 | 
	
		
			
				|  |  | +        super.initData();
 | 
	
		
			
				|  |  | +        targetId = getIntent().getStringExtra("targetId");
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    public void searchMessage(String targetId, Conversation.ConversationType
 | 
	
		
			
				|  |  | +            conversationType, String match) {
 | 
	
		
			
				|  |  | +        data.clear();
 | 
	
		
			
				|  |  | +        if (TextUtils.isEmpty(targetId)) {
 | 
	
		
			
				|  |  | +            for (Conversation conversation : conversations) {
 | 
	
		
			
				|  |  | +                searchIMClientMessage(conversation.getTargetId(), conversation.getConversationType(), match);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        searchIMClientMessage(targetId, conversationType, match);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    protected ActivitySearchHistoryMessageBinding getLayoutView() {
 | 
	
		
			
				|  |  | +        return ActivitySearchHistoryMessageBinding.inflate(getLayoutInflater());
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    protected SearchHistoryMessagePresenter createPresenter() {
 | 
	
		
			
				|  |  | +        return new SearchHistoryMessagePresenter();
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    private void searchIMClientMessage(String targetId, Conversation.ConversationType
 | 
	
		
			
				|  |  | +            conversationType, String match) {
 | 
	
		
			
				|  |  | +        RongIMClient.getInstance().searchMessages(conversationType,
 | 
	
		
			
				|  |  | +                targetId, match, 0, 0, new RongIMClient.ResultCallback<List<Message>>() {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                    @Override
 | 
	
		
			
				|  |  | +                    public void onSuccess(List<Message> messages) {
 | 
	
		
			
				|  |  | +                        Iterator<Message> it = messages.iterator();
 | 
	
		
			
				|  |  | +                        while(it.hasNext()){
 | 
	
		
			
				|  |  | +                            Message conversation = it.next();
 | 
	
		
			
				|  |  | +                            if (conversation.getTargetId().contains("S") || conversation.getTargetId().contains("DAYA") || conversation.getTargetId().contains("I")) {
 | 
	
		
			
				|  |  | +                                it.remove();
 | 
	
		
			
				|  |  | +                            }
 | 
	
		
			
				|  |  | +                        }
 | 
	
		
			
				|  |  | +                        updateData(messages, match);
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                    @Override
 | 
	
		
			
				|  |  | +                    public void onError(RongIMClient.ErrorCode errorCode) {
 | 
	
		
			
				|  |  | +                        updateData(new ArrayList<>(), match);
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                });
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    public void updateData(List<Message> data, String search) {
 | 
	
		
			
				|  |  | +        if (data != null && data.size() > 0) {
 | 
	
		
			
				|  |  | +            this.data.addAll(data);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        if (this.data.size() == 0) {
 | 
	
		
			
				|  |  | +            tvEmpty.setVisibility(View.VISIBLE);
 | 
	
		
			
				|  |  | +            String empty = String.format("没有搜到%s相关的信息", search);
 | 
	
		
			
				|  |  | +            int start = empty.indexOf(search);
 | 
	
		
			
				|  |  | +            tvEmpty.setText(getSpannable(empty, start, start + search.length()));
 | 
	
		
			
				|  |  | +            recyclerView.setVisibility(View.GONE);
 | 
	
		
			
				|  |  | +        } else {
 | 
	
		
			
				|  |  | +            tvEmpty.setVisibility(View.GONE);
 | 
	
		
			
				|  |  | +            recyclerView.setVisibility(View.VISIBLE);
 | 
	
		
			
				|  |  | +            if (adapter != null) {
 | 
	
		
			
				|  |  | +                adapter.setSearch(search);
 | 
	
		
			
				|  |  | +                adapter.notifyDataSetChanged();
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    public SpannableStringBuilder getSpannable(String target, int start, int end) {
 | 
	
		
			
				|  |  | +        SpannableStringBuilder spannableStringBuilder;
 | 
	
		
			
				|  |  | +        if (TextUtils.isEmpty(target)) {
 | 
	
		
			
				|  |  | +            spannableStringBuilder = new SpannableStringBuilder("");
 | 
	
		
			
				|  |  | +        } else {
 | 
	
		
			
				|  |  | +            spannableStringBuilder = new SpannableStringBuilder(target);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        spannableStringBuilder.setSpan(new ForegroundColorSpan(getResources().getColor(com.cooleshow.base.R.color.color_2dc7aa)), start, end, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
 | 
	
		
			
				|  |  | +        return spannableStringBuilder;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    public void search(String search) {
 | 
	
		
			
				|  |  | +        if (TextUtils.isEmpty(search)) {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            clear();
 | 
	
		
			
				|  |  | +            recyclerView.setVisibility(View.GONE);
 | 
	
		
			
				|  |  | +            tvEmpty.setVisibility(View.GONE);
 | 
	
		
			
				|  |  | +        } else {
 | 
	
		
			
				|  |  | +            searchMessage(targetId, Conversation.ConversationType.GROUP, search);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    public void clear() {
 | 
	
		
			
				|  |  | +        this.data.clear();
 | 
	
		
			
				|  |  | +        adapter.setSearch("");
 | 
	
		
			
				|  |  | +        adapter.notifyDataSetChanged();
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * 搜索会话
 | 
	
		
			
				|  |  | +     *
 | 
	
		
			
				|  |  | +     * @param match
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    public void searchConversation(String match) {
 | 
	
		
			
				|  |  | +        RongIMClient.getInstance().searchConversations(match,
 | 
	
		
			
				|  |  | +                new Conversation.ConversationType[]{Conversation.ConversationType.PRIVATE, Conversation.ConversationType.GROUP},
 | 
	
		
			
				|  |  | +                new String[]{"RC:TxtMsg", "RC:ImgTextMsg", "RC:FileMsg"}, new RongIMClient.ResultCallback<List<SearchConversationResult>>() {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                    @Override
 | 
	
		
			
				|  |  | +                    public void onSuccess(List<SearchConversationResult> searchConversationResults) {
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                    @Override
 | 
	
		
			
				|  |  | +                    public void onError(RongIMClient.ErrorCode errorCode) {
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                });
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    public void onTextChanged(CharSequence s, int start, int before, int count) {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    public void afterTextChanged(Editable editable) {
 | 
	
		
			
				|  |  | +        new Handler().postDelayed(new Runnable() {
 | 
	
		
			
				|  |  | +            @Override
 | 
	
		
			
				|  |  | +            public void run() {
 | 
	
		
			
				|  |  | +                String search = editable.toString();
 | 
	
		
			
				|  |  | +                if (TextUtils.isEmpty(search)) {
 | 
	
		
			
				|  |  | +                    clear();
 | 
	
		
			
				|  |  | +                } else {
 | 
	
		
			
				|  |  | +                    search(search);
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }, 300);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +}
 |