package com.yidianling.uikit.business.ait;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import com.netease.nimlib.sdk.robot.model.NimRobotInfo;
import com.netease.nimlib.sdk.team.model.TeamMember;
import com.yidianling.uikit.business.ait.selector.AitContactSelectorActivity;
import com.yidianling.uikit.business.uinfo.UserInfoHelper;
import java.util.List;
/**
* Created by hzchenkang on 2017/7/10.
*/
public class AitManager implements TextWatcher {
private Context context;
private String tid;
private AitContactsModel aitContactsModel;
private int curPos;
private boolean ignoreTextChange = false;
private AitTextChangeListener listener;
public AitManager(Context context, String tid) {
this.context = context;
this.tid = tid;
aitContactsModel = new AitContactsModel();
}
public void setTextChangeListener(AitTextChangeListener listener) {
this.listener = listener;
}
public List<String> getAitTeamMember() {
return aitContactsModel.getAitTeamMember();
}
public String getAitRobot() {
return aitContactsModel.getFirstAitRobot();
}
public String removeRobotAitString(String text, String robotAccount) {
AitBlock block = aitContactsModel.getAitBlock(robotAccount);
if (block != null) {
return text.replaceAll(block.text, "");
} else {
return text;
}
}
public void reset() {
aitContactsModel.reset();
ignoreTextChange = false;
curPos = 0;
}
/**
* ------------------------------ 增加@成员 --------------------------------------
*/
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == AitContactSelectorActivity.REQUEST_CODE && resultCode == Activity.RESULT_OK) {
int type = data.getIntExtra(AitContactSelectorActivity.RESULT_TYPE, -1);
String account = "";
String name = "";
if (type == AitContactType.TEAM_MEMBER) {
TeamMember member = (TeamMember) data.getSerializableExtra(AitContactSelectorActivity.RESULT_DATA);
account = member.getAccount();
name = getAitTeamMemberName(member);
} else if (type == AitContactType.ROBOT) {
NimRobotInfo robotInfo = (NimRobotInfo) data.getSerializableExtra(AitContactSelectorActivity.RESULT_DATA);
account = robotInfo.getAccount();
name = robotInfo.getName();
}
insertAitMemberInner(account, name, type, curPos, false);
}
}
// 群昵称 > 用户昵称 > 账号
private static String getAitTeamMemberName(TeamMember member) {
if (member == null) {
return "";
}
String memberNick = member.getTeamNick();
if (!TextUtils.isEmpty(memberNick)) {
return memberNick;
}
return UserInfoHelper.getUserName(member.getAccount());
}
public void insertAitRobot(String account, String name, int start) {
insertAitMemberInner(account, name, AitContactType.ROBOT, start, true);
}
private void insertAitMemberInner(String account, String name, int type, int start, boolean needInsertAitInText) {
name = name + " ";
String content = needInsertAitInText ? "@" + name : name;
if (listener != null) {
// 关闭监听
ignoreTextChange = true;
// insert 文本到editText
listener.onTextAdd(content, start, content.length());
// 开启监听
ignoreTextChange = false;
}
// update 已有的 aitBlock
aitContactsModel.onInsertText(start, content);
int index = needInsertAitInText ? start : start - 1;
// 添加当前到 aitBlock
aitContactsModel.addAitMember(account, name, type, index);
}
/**
* ------------------------------ editText 监听 --------------------------------------
*/
// 当删除尾部空格时,删除一整个segment,包含界面上也删除
private boolean deleteSegment(int start, int count) {
if (count != 1) {
return false;
}
boolean result = false;
AitBlock.AitSegment segment = aitContactsModel.findAitSegmentByEndPos(start);
if (segment != null) {
int length = start - segment.start;
if (listener != null) {
ignoreTextChange = true;
listener.onTextDelete(segment.start, length);
ignoreTextChange = false;
}
aitContactsModel.onDeleteText(start, length);
result = true;
}
return result;
}
/**
* @param editable 变化后的Editable
* @param start text 变化区块的起始index
* @param count text 变化区块的大小
* @param delete 是否是删除
*/
private void afterTextChanged(Editable editable, int start, int count, boolean delete) {
curPos = delete ? start : count + start;
if (ignoreTextChange) {
return;
}
if (delete) {
int before = start + count;
if (deleteSegment(before, count)) {
return;
}
aitContactsModel.onDeleteText(before, count);
} else {
if (count <= 0 || editable.length() < start + count) {
return;
}
CharSequence s = editable.subSequence(start, start + count);
if (s == null) {
return;
}
if (s.toString().equals("@")) {
// 启动@联系人界面
if (!TextUtils.isEmpty(tid) ) {
AitContactSelectorActivity.start(context, tid);
}
}
aitContactsModel.onInsertText(start, s.toString());
}
}
private int editTextStart;
private int editTextCount;
private int editTextBefore;
private boolean delete;
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
delete = count > after;
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
this.editTextStart = start;
this.editTextCount = count;
this.editTextBefore = before;
}
@Override
public void afterTextChanged(Editable s) {
afterTextChanged(s, editTextStart, delete ? editTextBefore : editTextCount, delete);
}
}