集成融雲Android SDK實現在羣聊/討論組中@人的功能
可以確定的是融雲SDK本身不提供@的功能,需要自定義實現。
在實現這個功能時,基本模仿微信的做法:
- 在列表中顯示有人@了你
- 通知顯示有人@了你
- 羣聊中輸入框輸入@
時彈出羣成員列表,選擇要@的人
- 鍵盤迴刪的時候,不可以彈出成員列表
- 這消息未讀時,有人@了你
一直在列表中顯示,包括程序殺死的情況
- 長按頭像實現@人的功能
實現的邏輯
1.消息發送方:
發送@消息本身是個普通的文本消息,爲了要明確@的人,在消息的extra中添加被@人的id數組(可以@多人)。
具體規則:
- @彈出成員列表時,每點擊一個成員,則用List進行保存(因爲需要get某個id,所以沒辦法使用set)
- 在調用融雲發送消息的時,判斷這個列表是否有id,如果有,則爲文本消息setExtra(ids);
2.接收方:
判定規則:
- 首先判斷是否是羣消息,是
- 判斷是否是文本消息,是
- 判斷是否包含@
,是
- 判斷文本消息中extra是否你的id,是
這個時候可以判定你收到了@消息
,然後就是具體顯示的問題了:
將這條消息的羣id保存到一個set中,如果消息已讀,則把id移除
寫了這麼多,感覺有點廢話,直接上代碼吧
具體實現
1.自定義羣消息provider(列表中的),這個在融雲的demo中有,是討論組provider,拿過來稍微改一下
@ConversationProviderTag(conversationType = "group", portraitPosition = 1)
public class GroupConversationProvider implements IContainerItemProvider.ConversationProvider<UIConversation> {
private static int i = 0;
private String TAG = GroupConversationProvider.class.getSimpleName();
class ViewHolder {
TextView title;
TextView time;
TextView content;
ImageView notificationBlockImage;
TextView atMe;
final GroupConversationProvider provider;
ViewHolder() {
provider = GroupConversationProvider.this;
}
}
public GroupConversationProvider() {
}
@Override
public void bindView(View view, int position, UIConversation data) {
ViewHolder holder = (ViewHolder) view.getTag();
ProviderTag tag = null;
if (data == null) {
holder.title.setText(null);
holder.time.setText(null);
holder.content.setText(null);
} else {
//設置會話標題
holder.title.setText(data.getUIConversationTitle());
//設置會話時間
String time = RongDateUtils.getConversationListFormatDate(new Date(data.getUIConversationTime()));
holder.time.setText(time);
//設置內容
if (!TextUtils.isEmpty(data.getDraft())) {
SpannableStringBuilder builder = new SpannableStringBuilder();
SpannableString string = new SpannableString("[草稿]");
string.setSpan(new ForegroundColorSpan(Color.parseColor("#cb120f")), 0, string.length(), 33);
if(data.getDraft().toString().substring(data.getDraft().toString().length() - 1, data.getDraft().toString().length()).equals("@")){
data.setDraft(data.getDraft().toString().substring(0,data.getDraft().toString().length()-1));
}
builder.append(string).append(data.getDraft());
AndroidEmoji.ensure(builder);
holder.content.setText(builder);
} else {
setDateView(holder, data);
holder.content.setText(data.getConversationContent());
}
if (RongContext.getInstance() != null && data.getMessageContent() != null)
tag = RongContext.getInstance().getMessageProviderTag(data.getMessageContent().getClass());
if (data.getSentStatus() != null && (data.getSentStatus() == io.rong.imlib.model.Message.SentStatus.FAILED || data.getSentStatus() == io.rong.imlib.model.Message.SentStatus.SENDING) && tag != null && tag.showWarning()) {
int width = ViewUtils.dp2px(17);
Drawable drawable = null;
if (data.getSentStatus() == io.rong.imlib.model.Message.SentStatus.FAILED)
drawable = view.getContext().getResources().getDrawable(R.drawable.de_conversation_list_msg_send_failure);
else if (data.getSentStatus() == io.rong.imlib.model.Message.SentStatus.SENDING)
drawable = view.getContext().getResources().getDrawable(R.drawable.de_conversation_list_msg_sending);
if (drawable != null) {
drawable.setBounds(0, 0, width, width);
holder.content.setCompoundDrawablePadding(10);
holder.content.setCompoundDrawables(drawable, null, null, null);
}
} else {
holder.content.setCompoundDrawables(null, null, null, null);
}
ConversationKey key = ConversationKey.obtain(data.getConversationTargetId(), data.getConversationType());
io.rong.imlib.model.Conversation.ConversationNotificationStatus status = RongContext.getInstance().getConversationNotifyStatusFromCache(key);
if (status != null && status.equals(io.rong.imlib.model.Conversation.ConversationNotificationStatus.DO_NOT_DISTURB))
holder.notificationBlockImage.setVisibility(View.VISIBLE);
else
holder.notificationBlockImage.setVisibility(View.GONE);
}
}
/**
* @param holder
* @param data
* @ 消息提示
*/
private void setDateView(ViewHolder holder, UIConversation data) {
if (AtUserService.getInstance().getAtGroupIds() != null && AtUserService.getInstance().getAtGroupIds().size() > 0
&&AtUserService.getInstance().getAtGroupIds().contains(data.getConversationTargetId())) {
if (data.getUnReadMessageCount() == 0) {
holder.atMe.setVisibility(View.GONE);
data.setExtraFlag(false);
} else if (data.getUnReadMessageCount() > 0) {
holder.atMe.setVisibility(View.VISIBLE);
data.setExtraFlag(true);
}
} else {
if (data.getExtraFlag()) {
holder.atMe.setVisibility(View.VISIBLE);
} else {
holder.atMe.setVisibility(View.GONE);
data.setExtraFlag(false);
}
if (data.getUnReadMessageCount() == 0) {
holder.atMe.setVisibility(View.GONE);
data.setExtraFlag(false);
}
}
}
@Override
public View newView(Context context, ViewGroup viewgroup) {
View result = LayoutInflater.from(context).inflate(R.layout.de_item_base_conversation, null);
ViewHolder holder = new ViewHolder();
holder.title = (TextView) result.findViewById(R.id.de_conversation_title);
holder.time = (TextView) result.findViewById(R.id.de_conversation_time);
holder.content = (TextView) result.findViewById(R.id.de_conversation_content);
holder.notificationBlockImage = (ImageView) result.findViewById(R.id.de_conversation_msg_block);
holder.atMe = (TextView) result.findViewById(R.id.de_at_me);
result.setTag(holder);
return result;
}
@Override
public String getTitle(String s) {
String name;
if (RongContext.getInstance().getGroupInfoFromCache(s) == null)
name = "羣組";
else{
name = RongContext.getInstance().getGroupInfoFromCache(s).getName();
}
return name;
}
@Override
public Uri getPortraitUri(String s) {
Uri uri;
if (RongContext.getInstance().getGroupInfoFromCache(s) == null)
uri = null;
else{
uri = RongContext.getInstance().getGroupInfoFromCache(s).getPortraitUri();
}
return uri;
}
}
對應的xml文件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
android:background="#00000000">
<TextView
android:id="@+id/de_conversation_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_marginLeft="5dp"
android:layout_marginRight="85dp"
android:layout_marginTop="4dp"
android:background="#00000000"
android:ellipsize="end"
android:singleLine="true"
android:textColor="#353535"
android:textSize="16sp" />
<TextView
android:id="@+id/de_conversation_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_marginRight="8dp"
android:layout_marginTop="5dp"
android:background="#00000000"
android:textColor="#d7d7d7"
android:textSize="14sp" />
<TextView
android:id="@+id/de_at_me"
android:layout_width="wrap_content"
android:layout_height="24dp"
android:layout_below="@+id/de_conversation_title"
android:layout_marginBottom="2dp"
android:layout_marginLeft="5dp"
android:layout_marginTop="4dp"
android:background="#00000000"
android:ellipsize="end"
android:gravity="center_vertical"
android:singleLine="true"
android:text="[有人@我]"
android:textColor="#cb120f"
android:visibility="gone"
android:textSize="14sp" />
<TextView
android:id="@+id/de_conversation_content"
android:layout_width="wrap_content"
android:layout_height="24dp"
android:layout_toRightOf="@+id/de_at_me"
android:layout_below="@+id/de_conversation_title"
android:layout_marginBottom="2dp"
android:layout_marginLeft="5dp"
android:layout_marginRight="70dp"
android:layout_marginTop="4dp"
android:background="#00000000"
android:ellipsize="end"
android:gravity="center_vertical"
android:singleLine="true"
android:textColor="#999999"
android:textSize="14sp" />
<ImageView
android:id="@+id/de_conversation_msg_block"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_below="@+id/de_conversation_time"
android:layout_marginRight="8dp"
android:layout_marginTop="10dp"
android:src="@drawable/de_ic_message_block"
android:visibility="gone" />
</RelativeLayout>