package cn.rongcloud.im.message; import android.os.Parcel; import android.text.TextUtils; import android.util.Log; import org.json.JSONException; import org.json.JSONObject; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import io.rong.common.ParcelUtils; import io.rong.imlib.MessageTag; import io.rong.imlib.model.MentionedInfo; import io.rong.imlib.model.MessageContent; import io.rong.imlib.model.UserInfo; /** * Created by Beyond on 2016/12/5. */ @MessageTag(value = "RCD:TstMsg", flag = MessageTag.ISCOUNTED | MessageTag.ISPERSISTED) public class TestMessage extends MessageContent { private final static String TAG = "TestMessage"; private String content; protected String extra; /** * 将本地消息对象序列化为消息数据。 * * @return 消息数据。 */ @Override public byte[] encode() { JSONObject jsonObj = new JSONObject(); try { jsonObj.put("content", getEmotion(getContent())); if (!TextUtils.isEmpty(getExtra())) jsonObj.put("extra", getExtra()); if (getJSONUserInfo() != null) jsonObj.putOpt("user", getJSONUserInfo()); if (getJsonMentionInfo() != null) { jsonObj.putOpt("mentionedInfo", getJsonMentionInfo()); } } catch (JSONException e) { Log.e(TAG, "JSONException " + e.getMessage()); } try { return jsonObj.toString().getBytes("UTF-8"); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } /** * Android 的表情unicode跟ios不一样,为了做到两个平台统一,android 这边设置了表情映射,根据unicode来映射具体的图片。 * */ private String getEmotion(String content) { Pattern pattern = Pattern.compile("\\[/u([0-9A-Fa-f]+)\\]"); Matcher matcher = pattern.matcher(content); StringBuffer sb = new StringBuffer(); while (matcher.find()) { int inthex = Integer.parseInt(matcher.group(1), 16); matcher.appendReplacement(sb, String.valueOf(Character.toChars(inthex))); } matcher.appendTail(sb); return sb.toString(); } public TestMessage() { } public static TestMessage obtain(String text) { TestMessage model = new TestMessage(); model.setContent(text); return model; } public TestMessage(byte[] data) { String jsonStr = null; try { jsonStr = new String(data, "UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } try { JSONObject jsonObj = new JSONObject(jsonStr); if (jsonObj.has("content")) setContent(jsonObj.optString("content")); if (jsonObj.has("extra")) setExtra(jsonObj.optString("extra")); if (jsonObj.has("user")) { setUserInfo(parseJsonToUserInfo(jsonObj.getJSONObject("user"))); } if (jsonObj.has("mentionedInfo")) { setMentionedInfo(parseJsonToMentionInfo(jsonObj.getJSONObject("mentionedInfo"))); } } catch (JSONException e) { Log.e(TAG, "JSONException " + e.getMessage()); } } /** * 描述了包含在 Parcelable 对象排列信息中的特殊对象的类型。 * * @return 一个标志位,表明Parcelable对象特殊对象类型集合的排列。 */ public int describeContents() { return 0; } /** * 将类的数据写入外部提供的 Parcel 中。 * * @param dest 对象被写入的 Parcel。 * @param flags 对象如何被写入的附加标志,可能是 0 或 PARCELABLE_WRITE_RETURN_VALUE。 */ @Override public void writeToParcel(Parcel dest, int flags) { ParcelUtils.writeToParcel(dest, getExtra()); ParcelUtils.writeToParcel(dest, content); ParcelUtils.writeToParcel(dest, getUserInfo()); ParcelUtils.writeToParcel(dest, getMentionedInfo()); } /** * 构造函数。 * * @param in 初始化传入的 Parcel。 */ public TestMessage(Parcel in) { setExtra(ParcelUtils.readFromParcel(in)); setContent(ParcelUtils.readFromParcel(in)); setUserInfo(ParcelUtils.readFromParcel(in, UserInfo.class)); setMentionedInfo(ParcelUtils.readFromParcel(in, MentionedInfo.class)); } /** * 读取接口,目的是要从Parcel中构造一个实现了Parcelable的类的实例处理。 */ public static final Creator<TestMessage> CREATOR = new Creator<TestMessage>() { @Override public TestMessage createFromParcel(Parcel source) { return new TestMessage(source); } @Override public TestMessage[] newArray(int size) { return new TestMessage[size]; } }; /** * 构造函数。 * * * @param content 文字消息的内容。 */ public TestMessage(String content) { this.setContent(content); } /** * 获取文字消息的内容。 * * @return 文字消息的内容。 */ public String getContent() { return content; } /** * 设置文字消息的内容。 * * @param content 文字消息的内容。 */ public void setContent(String content) { this.content = content; } /** * 获取消息扩展信息 * @return 扩展信息 */ public String getExtra() { return extra; } /** * 设置消息扩展信息 * @param extra 扩展信息 */ public void setExtra(String extra) { this.extra = extra; } @Override public List<String> getSearchableWord() { List<String> words = new ArrayList<>(); words.add(content); return words; } }