zhibo/android-app/app/src/main/java/com/example/livestreaming/ChatMessage.java

315 lines
8.9 KiB
Java
Raw Normal View History

2025-12-18 14:52:20 +08:00
package com.example.livestreaming;
import com.example.livestreaming.net.MessageReaction;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
2025-12-18 14:52:20 +08:00
public class ChatMessage {
public enum MessageStatus {
SENDING, // 发送中
SENT, // 已发送
READ // 已读
}
public enum MessageType {
TEXT, // 文本消息
IMAGE, // 图片消息
VOICE, // 语音消息
BURN_IMAGE
}
private String messageId;
2025-12-18 14:52:20 +08:00
private String username;
private String message; // 文本消息内容
2025-12-18 14:52:20 +08:00
private long timestamp;
private boolean isSystemMessage;
private boolean isGiftMessage; // 是否是礼物消息
private boolean isOutgoing; // 是否是自己发送的消息
private MessageStatus status;
private String avatarUrl; // 发送者头像 URL后续从后端获取
// 新增字段:消息类型和媒体相关
private MessageType messageType; // 消息类型
private String mediaUrl; // 图片/语音的 URL从后端获取
private String localMediaPath; // 本地图片/语音路径(发送前使用)
private int voiceDuration; // 语音时长(秒)
private int imageWidth; // 图片宽度
private int imageHeight; // 图片高度
private Integer burnSeconds;
private Long viewedAt;
private Long burnAt;
private Boolean burned;
// 表情回应相关字段
private List<MessageReaction> reactions; // 表情回应列表
// 文本消息构造函数
2025-12-18 14:52:20 +08:00
public ChatMessage(String username, String message) {
this.messageId = UUID.randomUUID().toString();
2025-12-18 14:52:20 +08:00
this.username = username;
this.message = message;
this.timestamp = System.currentTimeMillis();
this.isSystemMessage = false;
this.isGiftMessage = false;
this.messageType = MessageType.TEXT;
// 如果是自己发送的消息,初始状态为发送中
this.isOutgoing = "".equals(username);
this.status = this.isOutgoing ? MessageStatus.SENDING : MessageStatus.SENT;
2025-12-18 14:52:20 +08:00
}
// 系统消息构造函数
2025-12-18 14:52:20 +08:00
public ChatMessage(String message, boolean isSystemMessage) {
this.messageId = UUID.randomUUID().toString();
2025-12-18 14:52:20 +08:00
this.message = message;
this.timestamp = System.currentTimeMillis();
this.isSystemMessage = isSystemMessage;
this.isGiftMessage = false;
2025-12-18 14:52:20 +08:00
this.username = isSystemMessage ? "系统" : "匿名用户";
this.status = MessageStatus.SENT; // 系统消息默认已发送
this.messageType = MessageType.TEXT;
}
// 礼物消息构造函数
public ChatMessage(String username, String message, boolean isGiftMessage) {
this.messageId = UUID.randomUUID().toString();
this.username = username;
this.message = message;
this.timestamp = System.currentTimeMillis();
this.isSystemMessage = false;
this.isGiftMessage = isGiftMessage;
this.messageType = MessageType.TEXT;
this.status = MessageStatus.SENT;
}
// 完整构造函数(从后端数据构造)
public ChatMessage(String messageId, String username, String message, long timestamp,
boolean isSystemMessage, MessageStatus status) {
this.messageId = messageId;
this.username = username;
this.message = message;
this.timestamp = timestamp;
this.isSystemMessage = isSystemMessage;
this.status = status;
this.messageType = MessageType.TEXT;
this.isOutgoing = "".equals(username);
}
// 完整构造函数(从后端数据构造,带 isOutgoing 参数)
public ChatMessage(String messageId, String username, String message, long timestamp,
boolean isSystemMessage, MessageStatus status, boolean isOutgoing) {
this.messageId = messageId;
this.username = username;
this.message = message;
this.timestamp = timestamp;
this.isSystemMessage = isSystemMessage;
this.status = status;
this.messageType = MessageType.TEXT;
this.isOutgoing = isOutgoing;
}
// 图片消息构造函数
public static ChatMessage createImageMessage(String username, String localPath) {
ChatMessage msg = new ChatMessage(username, "");
msg.messageType = MessageType.IMAGE;
msg.localMediaPath = localPath;
msg.status = "".equals(username) ? MessageStatus.SENDING : MessageStatus.SENT;
return msg;
}
// 语音消息构造函数
public static ChatMessage createVoiceMessage(String username, String localPath, int duration) {
ChatMessage msg = new ChatMessage(username, "");
msg.messageType = MessageType.VOICE;
msg.localMediaPath = localPath;
msg.voiceDuration = duration;
msg.status = "".equals(username) ? MessageStatus.SENDING : MessageStatus.SENT;
return msg;
}
public static ChatMessage createBurnImageMessage(String username, String localPath, Integer burnSeconds) {
ChatMessage msg = new ChatMessage(username, "");
msg.messageType = MessageType.BURN_IMAGE;
msg.localMediaPath = localPath;
msg.burnSeconds = burnSeconds;
msg.burned = false;
msg.status = "".equals(username) ? MessageStatus.SENDING : MessageStatus.SENT;
return msg;
}
// Getters and Setters
public String getMessageId() {
return messageId;
}
public void setMessageId(String messageId) {
this.messageId = messageId;
2025-12-18 14:52:20 +08:00
}
public String getUsername() {
return username;
}
public String getMessage() {
return message;
}
public long getTimestamp() {
return timestamp;
}
public boolean isSystemMessage() {
return isSystemMessage;
}
public boolean isGiftMessage() {
return isGiftMessage;
}
public void setGiftMessage(boolean giftMessage) {
isGiftMessage = giftMessage;
}
public boolean isOutgoing() {
return isOutgoing;
}
public void setOutgoing(boolean outgoing) {
isOutgoing = outgoing;
}
public MessageStatus getStatus() {
return status;
}
public void setStatus(MessageStatus status) {
this.status = status;
}
2025-12-18 14:52:20 +08:00
public void setUsername(String username) {
this.username = username;
}
public void setMessage(String message) {
this.message = message;
}
public void setTimestamp(long timestamp) {
this.timestamp = timestamp;
}
public void setSystemMessage(boolean systemMessage) {
isSystemMessage = systemMessage;
}
public String getAvatarUrl() {
return avatarUrl;
}
public void setAvatarUrl(String avatarUrl) {
this.avatarUrl = avatarUrl;
}
public MessageType getMessageType() {
return messageType;
}
public void setMessageType(MessageType messageType) {
this.messageType = messageType;
}
public String getMediaUrl() {
return mediaUrl;
}
public void setMediaUrl(String mediaUrl) {
this.mediaUrl = mediaUrl;
}
public String getLocalMediaPath() {
return localMediaPath;
}
public void setLocalMediaPath(String localMediaPath) {
this.localMediaPath = localMediaPath;
}
public int getVoiceDuration() {
return voiceDuration;
}
public void setVoiceDuration(int voiceDuration) {
this.voiceDuration = voiceDuration;
}
public int getImageWidth() {
return imageWidth;
}
public void setImageWidth(int imageWidth) {
this.imageWidth = imageWidth;
}
public int getImageHeight() {
return imageHeight;
}
public void setImageHeight(int imageHeight) {
this.imageHeight = imageHeight;
}
public Integer getBurnSeconds() {
return burnSeconds;
}
public void setBurnSeconds(Integer burnSeconds) {
this.burnSeconds = burnSeconds;
}
public Long getViewedAt() {
return viewedAt;
}
public void setViewedAt(Long viewedAt) {
this.viewedAt = viewedAt;
}
public Long getBurnAt() {
return burnAt;
}
public void setBurnAt(Long burnAt) {
this.burnAt = burnAt;
}
public Boolean getBurned() {
return burned;
}
public void setBurned(Boolean burned) {
this.burned = burned;
}
public List<MessageReaction> getReactions() {
return reactions;
}
public void setReactions(List<MessageReaction> reactions) {
this.reactions = reactions;
}
public void addReaction(MessageReaction reaction) {
if (this.reactions == null) {
this.reactions = new ArrayList<>();
}
this.reactions.add(reaction);
}
public void removeReaction(String emoji) {
if (this.reactions != null) {
this.reactions.removeIf(r -> r.getEmoji().equals(emoji));
}
}
2025-12-18 14:52:20 +08:00
}