diff --git a/.idea/compiler.xml b/.idea/compiler.xml
index b86273d..b589d56 100644
--- a/.idea/compiler.xml
+++ b/.idea/compiler.xml
@@ -1,6 +1,6 @@
-
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
index 90b9ca7..3223143 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -1,7 +1,7 @@
-
+
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 36df234..2bb1445 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -9,6 +9,7 @@
tools:ignore="ScopedStorage" />
+
type = MsgTypeStateEnum.MSG_FROM_OTHER_TXT
+ ProjectConfig.MSG_IMG -> type = MsgTypeStateEnum.MSG_FROM_OTHER_IMG
+ ProjectConfig.MSG_FILE -> type = MsgTypeStateEnum.MSG_FROM_OTHER_FILE
+ ProjectConfig.MSG_VIDEO -> type = MsgTypeStateEnum.MSG_FROM_OTHER_MOVIE
+ }
+ return CoverSealedBean.Msg(
+ MsgBean(
+ messageId = sBean.messageId,
+ messageType = sBean.messageType,
+ metadata = sBean.metadata,
+ receiverId = sBean.receiver.receiverId,
+ receiverType = sBean.receiver.receiverType,
+ senderType = sBean.sender.senderType,
+ senderId = sBean.sender.senderId,
+ body = sBean.body,
+ msgType = type,
+ timestamp = sBean.timestamp,
+ status = sBean.status,
+ customMessageType = ""
+ )
+ )
+ } else {
+ return CoverSealedBean.StateBean(sBean)
+ }
+ }
+
+ fun convertBeanToMsgBean(cBean: MsgConvertBean): MsgBean {
+ var type: Int = -1
+ when (cBean.messageType) {
+ ProjectConfig.MSG_TEXT -> type = MsgTypeStateEnum.MSG_TO_OTHER_TXT
+ ProjectConfig.MSG_IMG -> type = MsgTypeStateEnum.MSG_TO_OTHER_IMG
+ ProjectConfig.MSG_FILE -> type = MsgTypeStateEnum.MSG_TO_OTHER_FILE
+ ProjectConfig.MSG_VIDEO -> type = MsgTypeStateEnum.MSG_TO_OTHER_MOVIE
+ }
+ return MsgBean(
+ messageId = cBean.messageId,
+ messageType = cBean.messageType,
+ metadata = cBean.metadata,
+ receiverId = cBean.receiver.receiverId,
+ receiverType = cBean.receiver.receiverType,
+ senderType = cBean.sender.senderType,
+ senderId = cBean.sender.senderId,
+ body = cBean.body,
+ msgType = type,
+ timestamp = cBean.timestamp,
+ status = cBean.status,
+ customMessageType = ""
+ )
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/tenlionsoft/aimz_k/adapter/CategoryAdapter.kt b/app/src/main/java/com/tenlionsoft/aimz_k/adapter/CategoryAdapter.kt
index 215b974..e12539f 100644
--- a/app/src/main/java/com/tenlionsoft/aimz_k/adapter/CategoryAdapter.kt
+++ b/app/src/main/java/com/tenlionsoft/aimz_k/adapter/CategoryAdapter.kt
@@ -12,13 +12,14 @@ class CategoryAdapter(
private val viewModel: MsgViewModel
) : BaseBindingAdapter(datas) {
- override fun getItemBinding(parent: ViewGroup,viewType:Int): ItemCategoryBinding {
+ override fun getItemBinding(parent: ViewGroup, viewType: Int): ItemCategoryBinding {
return ItemCategoryBinding.inflate(LayoutInflater.from(parent.context), parent, false)
}
override fun bindItem(holder: BaseViewHolder, position: Int) {
holder.binding.pos = position
holder.binding.item = list[position]
+ holder.binding.size = if (list.isNotEmpty()) list.size - 1 else 0
holder.binding.root.setOnClickListener {
viewModel.onItemClickListener?.onItemClick(list[position])
}
diff --git a/app/src/main/java/com/tenlionsoft/aimz_k/adapter/ChatMsgAdapter.kt b/app/src/main/java/com/tenlionsoft/aimz_k/adapter/ChatMsgAdapter.kt
index 4c259bd..d5cddf9 100644
--- a/app/src/main/java/com/tenlionsoft/aimz_k/adapter/ChatMsgAdapter.kt
+++ b/app/src/main/java/com/tenlionsoft/aimz_k/adapter/ChatMsgAdapter.kt
@@ -23,8 +23,6 @@ class ChatMsgAdapter(var datas: List) :
MsgTypeStateEnum.MSG_TO_OTHER_TXT -> {
return ItemMsgMyBinding.inflate(LayoutInflater.from(parent.context), parent, false)
}//发送文本
-// itemView = LayoutInflater.from(mContext).inflate(R.layout.item_msg_my, parent, false);
-// holder = new MsgMyTextHolder(itemView);
MsgTypeStateEnum.MSG_FROM_OTHER_TXT -> {
return ItemMsgOtherBinding.inflate(
LayoutInflater.from(parent.context),
@@ -32,9 +30,6 @@ class ChatMsgAdapter(var datas: List) :
false
)
}//收到文本信息
-// itemView = LayoutInflater.from(mContext).inflate(R.layout.item_msg_other, parent, false);
-// holder = new MsgMyOtherHolder(itemView);
-// break;
MsgTypeStateEnum.MSG_TO_OTHER_MOVIE -> {
return ItemMsgMyVideoBinding.inflate(
LayoutInflater.from(parent.context),
@@ -42,9 +37,6 @@ class ChatMsgAdapter(var datas: List) :
false
)
}//发送视频
-// itemView = LayoutInflater.from(mContext).inflate(R.layout.item_msg_my_video, parent, false);
-// holder = new MsgVideoHolder(itemView);
-// break;
MsgTypeStateEnum.MSG_FROM_OTHER_MOVIE -> {
return ItemMsgOtherVideoBinding.inflate(
LayoutInflater.from(parent.context),
@@ -52,9 +44,6 @@ class ChatMsgAdapter(var datas: List) :
false
)
}//收到视频
-// itemView = LayoutInflater.from(mContext).inflate(R.layout.item_msg_other_video, parent, false);
-// holder = new MsgVideoHolder(itemView);
-// break;
MsgTypeStateEnum.MSG_TO_OTHER_IMG -> {
return ItemMsgMyImgBinding.inflate(
LayoutInflater.from(parent.context),
@@ -62,9 +51,6 @@ class ChatMsgAdapter(var datas: List) :
false
)
}//发送图片
-// itemView = LayoutInflater.from(mContext).inflate(R.layout.item_msg_my_img, parent, false);
-// holder = new MsgImageHolder(itemView);
-// break;
MsgTypeStateEnum.MSG_FROM_OTHER_IMG -> {
return ItemMsgOtherImgBinding.inflate(
LayoutInflater.from(parent.context),
@@ -72,9 +58,6 @@ class ChatMsgAdapter(var datas: List) :
false
)
}//收到图片
-// itemView = LayoutInflater.from(mContext).inflate(R.layout.item_msg_other_img, parent, false);
-// holder = new MsgImageHolder(itemView);
-// break;
MsgTypeStateEnum.MSG_TO_OTHER_VOICE -> {
return ItemMsgMyAudioBinding.inflate(
LayoutInflater.from(parent.context),
@@ -82,9 +65,6 @@ class ChatMsgAdapter(var datas: List) :
false
)
}//语音
-// itemView = LayoutInflater.from(mContext).inflate(R.layout.item_msg_my_audio, parent, false);
-// holder = new MsgAudioHolder(itemView);
-// break;
MsgTypeStateEnum.MSG_FROM_OTHER_VOICE -> {
return ItemMsgOtherAudioBinding.inflate(
LayoutInflater.from(parent.context),
@@ -92,18 +72,14 @@ class ChatMsgAdapter(var datas: List) :
false
)
}//语音
-// itemView = LayoutInflater.from(mContext).inflate(R.layout.item_msg_other_audio, parent, false);
-// holder = new MsgAudioHolder(itemView);
-// break;
else -> {
-// return BaseViewHolder()
throw IllegalArgumentException("Invalid view type")
}
}
}
override fun getItemViewType(position: Int): Int {
- return list.get(position).msgType
+ return list[position].msgType!!
}
override fun bindItem(holder: BaseViewHolder, position: Int) {
@@ -112,42 +88,42 @@ class ChatMsgAdapter(var datas: List) :
MsgTypeStateEnum.MSG_TO_OTHER_TXT -> {
(holder.binding as ItemMsgMyBinding).pos = position
(holder.binding as ItemMsgMyBinding).bean = list[position]
- (holder.binding as ItemMsgMyBinding).state = list[position].sendState
+ (holder.binding as ItemMsgMyBinding).state = list[position].status
}//发送文本
MsgTypeStateEnum.MSG_FROM_OTHER_TXT -> {
(holder.binding as ItemMsgOtherBinding).pos = position
(holder.binding as ItemMsgOtherBinding).bean = list[position]
- (holder.binding as ItemMsgOtherBinding).state = list[position].sendState
+ (holder.binding as ItemMsgOtherBinding).state = list[position].status
}//收到文本信息
MsgTypeStateEnum.MSG_TO_OTHER_MOVIE -> {
(holder.binding as ItemMsgMyVideoBinding).pos = position
(holder.binding as ItemMsgMyVideoBinding).bean = list[position]
- (holder.binding as ItemMsgMyVideoBinding).state = list[position].sendState
+ (holder.binding as ItemMsgMyVideoBinding).state = list[position].status
}//发送视频
MsgTypeStateEnum.MSG_FROM_OTHER_MOVIE -> {
(holder.binding as ItemMsgOtherVideoBinding).pos = position
(holder.binding as ItemMsgOtherVideoBinding).bean = list[position]
- (holder.binding as ItemMsgOtherVideoBinding).state = list[position].sendState
+ (holder.binding as ItemMsgOtherVideoBinding).state = list[position].status
}//收到视频
MsgTypeStateEnum.MSG_TO_OTHER_IMG -> {
(holder.binding as ItemMsgMyImgBinding).pos = position
(holder.binding as ItemMsgMyImgBinding).bean = list[position]
- (holder.binding as ItemMsgMyImgBinding).state = list[position].sendState
+ (holder.binding as ItemMsgMyImgBinding).state = list[position].status
}//发送图片
MsgTypeStateEnum.MSG_FROM_OTHER_IMG -> {
(holder.binding as ItemMsgOtherImgBinding).pos = position
(holder.binding as ItemMsgOtherImgBinding).bean = list[position]
- (holder.binding as ItemMsgOtherImgBinding).state = list[position].sendState
+ (holder.binding as ItemMsgOtherImgBinding).state = list[position].status
}//收到图片
MsgTypeStateEnum.MSG_TO_OTHER_VOICE -> {
(holder.binding as ItemMsgMyAudioBinding).pos = position
(holder.binding as ItemMsgMyAudioBinding).bean = list[position]
- (holder.binding as ItemMsgMyAudioBinding).state = list[position].sendState
+ (holder.binding as ItemMsgMyAudioBinding).state = list[position].status
}//语音
MsgTypeStateEnum.MSG_FROM_OTHER_VOICE -> {
(holder.binding as ItemMsgOtherAudioBinding).pos = position
(holder.binding as ItemMsgOtherAudioBinding).bean = list[position]
- (holder.binding as ItemMsgOtherAudioBinding).state = list[position].sendState
+ (holder.binding as ItemMsgOtherAudioBinding).state = list[position].status
}//语音
else -> {
throw IllegalArgumentException("Invalid view type")
diff --git a/app/src/main/java/com/tenlionsoft/aimz_k/model/CoverSealedBean.kt b/app/src/main/java/com/tenlionsoft/aimz_k/model/CoverSealedBean.kt
new file mode 100644
index 0000000..4966f2b
--- /dev/null
+++ b/app/src/main/java/com/tenlionsoft/aimz_k/model/CoverSealedBean.kt
@@ -0,0 +1,7 @@
+package com.tenlionsoft.aimz_k.model
+
+sealed class CoverSealedBean {
+ data class StateBean(val data: MsgConvertBean) : CoverSealedBean()
+ data class Msg(val msgBean: MsgBean) : CoverSealedBean()
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/tenlionsoft/aimz_k/model/MsgBean.kt b/app/src/main/java/com/tenlionsoft/aimz_k/model/MsgBean.kt
index 523f7d7..efecf9b 100644
--- a/app/src/main/java/com/tenlionsoft/aimz_k/model/MsgBean.kt
+++ b/app/src/main/java/com/tenlionsoft/aimz_k/model/MsgBean.kt
@@ -2,33 +2,72 @@ package com.tenlionsoft.aimz_k.model
import androidx.room.ColumnInfo
import androidx.room.Entity
-import androidx.room.Ignore
import androidx.room.PrimaryKey
-import androidx.room.TypeConverters
import java.io.Serializable
+
+//{
+// "body": "{\"msg\":\"\",\"statusType\":\"SUCCESS_SEND\"}",
+// "customMessageType": "",
+// "messageId": "1730344667596",
+// "messageType": "STATUS",
+// "metadata": "",
+// "receiver": {
+// "receiverId": "1",
+// "receiverType": "SINGLE_USER"
+//},
+// "sender": {
+// "senderId": "system",
+// "senderType": "SYSTEM"
+//},
+// "timestamp": 1730344666322
+//}
+
+//发送格式
+//messageId: `${datetime}`,
+//timestamp: datetime,
+//messageType: 'MSG_TEXT',
+//body: JSON.stringify({content: chat.send.value}),
+//sender: {
+// senderId: chat.senderId,
+// senderType: 'ANONYMOUS'
+//},
+//receiver: {
+// receiverId: chat.receiverId,
+// receiverType: 'SINGLE_USER'
+//},
+//metadata: '',
+//status: 'PENDING',
+
+
@Entity(tableName = "db_msg")
data class MsgBean(
@PrimaryKey(autoGenerate = true)
- var id: Long,
- @ColumnInfo(name = "type")
- var type: Int, //消息类型
- @ColumnInfo(name = "isSystem")
- var isSystem: Boolean, //是否为系统信息
- @ColumnInfo(name = "from")
- var from: String, //来源,系统消息为:SYSTEM 非系统消息为UserID
- @ColumnInfo(name = "to")
- var to: String, //去处 系统消息为appId 非系统消息为userId
- @ColumnInfo(name = "body")
- var body: String, //消息体
+ var id: Long = 0,
+ @ColumnInfo(name = "messageId")
+ var messageId: String?, //消息唯一ID
+ @ColumnInfo(name = "messageType")
+ var messageType: String?, //消息类型
+ @ColumnInfo(name = "customMessageType")
+ var customMessageType: String?, //预留
+ @ColumnInfo(name = "metadata")
+ var metadata: String?,
+ @ColumnInfo(name = "receiverId")
+ var receiverId: String?, //接受人ID
+ @ColumnInfo(name = "receiverType")
+ var receiverType: String?, //接受人Type
+ @ColumnInfo(name = "senderId")
+ var senderId: String?, //发送人ID
+ @ColumnInfo(name = "senderType")
+ var senderType: String?, //发送人类型
@ColumnInfo(name = "timestamp")
- var timestamp: Long,
- @ColumnInfo(name = "sendState")
- var sendState: Int, //发送状态 11发送中 12发送失败 13发送成功
- @ColumnInfo(name = "fromName")
- var fromName: String, //来源名称
+ var timestamp: Long?, //时间戳
+ @ColumnInfo(name = "body")
+ var body: String?, //消息体
@ColumnInfo(name = "msgType")
- var msgType: Int,
+ var msgType: Int?,
+ @ColumnInfo(name = "status")
+ var status: String? //发送状态 11发送中 12发送失败 13发送成功
/**
* 信息类型
@@ -48,7 +87,4 @@ data class MsgBean(
* 151 我发送给其他人的文件信息
* 152 其他人发送给我的文件信息
*/
-) : Serializable {
- @Ignore
- var msgWhat: Long = 0L
-}
\ No newline at end of file
+) : Serializable
\ No newline at end of file
diff --git a/app/src/main/java/com/tenlionsoft/aimz_k/model/MsgCategoryBean.kt b/app/src/main/java/com/tenlionsoft/aimz_k/model/MsgCategoryBean.kt
index 398892c..410d1ea 100644
--- a/app/src/main/java/com/tenlionsoft/aimz_k/model/MsgCategoryBean.kt
+++ b/app/src/main/java/com/tenlionsoft/aimz_k/model/MsgCategoryBean.kt
@@ -5,24 +5,55 @@ import androidx.room.Entity
import androidx.room.PrimaryKey
import java.io.Serializable
+//@ColumnInfo(name = "messageId")
+//var messageId: String?, //消息唯一ID
+//@ColumnInfo(name = "messageType")
+//var messageType: String?, //消息类型
+//@ColumnInfo(name = "customMessageType")
+//var customMessageType: String?, //预留
+//@ColumnInfo(name = "metadata")
+//var metadata: String?,
+//@ColumnInfo(name = "receiverId")
+//var receiverId: String?, //接受人ID
+//@ColumnInfo(name = "receiverType")
+//var receiverType: String?, //接受人Type
+//@ColumnInfo(name = "senderId")
+//var senderId: String?, //发送人ID
+//@ColumnInfo(name = "senderType")
+//var senderType: String?, //发送人类型
+//@ColumnInfo(name = "timestamp")
+//var timestamp: Long?, //时间戳
+//@ColumnInfo(name = "body")
+//var body: String?, //消息体
+//@ColumnInfo(name = "msgType")
+//var msgType: Int?,
+//@ColumnInfo(name = "status")
+//var status: String? //发送状态 11发送中 12发送失败 13发送成功
+
@Entity(tableName = "db_category")
data class MsgCategoryBean(
@PrimaryKey(autoGenerate = true)
var id: Long = 0,
@ColumnInfo(name = "avatar")
var avatar: String,
- @ColumnInfo(name = "from")
- var from: String, //来源,系统消息为:SYSTEM 非系统消息为UserID
- @ColumnInfo(name = "to")
- var to: String, //去处 系统消息为appId 非系统消息为userId
+ @ColumnInfo(name = "messageId")
+ var messageId: String?, //消息ID
+ @ColumnInfo(name = "messageType")
+ var messageType: String, //消息类型
+ @ColumnInfo(name = "receiverId")
+ var receiverId: String?, //接受人ID
+ @ColumnInfo(name = "receiverType")
+ var receiverType: String?, //接受人Type
+ @ColumnInfo(name = "senderId")
+ var senderId: String?, //发送人ID
+ @ColumnInfo(name = "senderType")
+ var senderType: String?, //发送人类型
@ColumnInfo(name = "timestamp")
- var timestamp: Long, // 时间戳
- @ColumnInfo(name = "sendState")
- var sendState: Int, //发送状态 11发送中 12发送失败 13发送成功
- @ColumnInfo(name = "fromName")
- var fromName: String, //来源名称
+ var timestamp: Long?, //时间戳
@ColumnInfo(name = "body")
- var body: String,
- @ColumnInfo(name = "isRead") //是否回复
- var isRead: Boolean,
+ var body: String?, //消息体
+ @ColumnInfo(name = "msgType")
+ var msgType: Int?, //用来在列表中判断显示
+ @ColumnInfo(name = "status")
+ var status: String?, //消息状态
) : Serializable
\ No newline at end of file
diff --git a/app/src/main/java/com/tenlionsoft/aimz_k/model/MsgCategoryDao.kt b/app/src/main/java/com/tenlionsoft/aimz_k/model/MsgCategoryDao.kt
index 77ad650..544918b 100644
--- a/app/src/main/java/com/tenlionsoft/aimz_k/model/MsgCategoryDao.kt
+++ b/app/src/main/java/com/tenlionsoft/aimz_k/model/MsgCategoryDao.kt
@@ -16,6 +16,12 @@ interface MsgCategoryDao {
@Query("SELECT * FROM db_category")
fun getAllCategory(): List
+ /**
+ * 根据发送人ID获取
+ */
+ @Query("SELECT * FROM db_category WHERE senderId=:senderId")
+ fun getCategoryBySenderId(senderId: String): MsgCategoryBean?
+
/**
* 根据ID获取消息
*
@@ -31,7 +37,7 @@ interface MsgCategoryDao {
* @param from
* @return
*/
- @Query("SELECT * FROM db_category WHERE `from`=(:from)")
+ @Query("SELECT * FROM db_category WHERE `senderId`=(:from)")
fun getCategoryByFrom(from: String?): List
@@ -48,7 +54,7 @@ interface MsgCategoryDao {
/**
* 清空与某个人的聊天记录
*/
- @Query("DELETE FROM db_category WHERE `from`=(:from) AND `to`=(:to) OR `from`=(:to) AND `to`=(:from)")
+ @Query("DELETE FROM db_category WHERE `senderId`=(:from) AND receiverId=(:to) OR `senderId`=(:to) AND receiverId=(:from)")
fun delChatHistory(from: String?, to: String?)
/**
@@ -79,4 +85,16 @@ interface MsgCategoryDao {
*/
@Query("DELETE FROM db_category")
fun delAllMsg()
+
+ /**
+ * 根据发送人的ID插入或者更新
+ */
+ fun updateOrInsert(senderId: String, msgBean: MsgBean)
+
+ /**
+ * 更新 消息体 时间戳 状态
+ * @Query("UPDATE db_msg SET status = :status WHERE messageId = :messageId")
+ */
+ @Query("UPDATE db_category SET status= :status , body=:body , timestamp=:time WHERE senderId=:senderId")
+ fun updateCategory(senderId: String, status:String,body:String,time:Long)
}
\ No newline at end of file
diff --git a/app/src/main/java/com/tenlionsoft/aimz_k/model/MsgCategoryDaoImpl.kt b/app/src/main/java/com/tenlionsoft/aimz_k/model/MsgCategoryDaoImpl.kt
new file mode 100644
index 0000000..7c31ec5
--- /dev/null
+++ b/app/src/main/java/com/tenlionsoft/aimz_k/model/MsgCategoryDaoImpl.kt
@@ -0,0 +1,17 @@
+package com.tenlionsoft.aimz_k.model
+
+abstract class MsgCategoryDaoImpl : MsgCategoryDao {
+
+ override fun updateOrInsert(senderId: String, msgBean: MsgBean) {
+ val bean = getCategoryBySenderId(senderId)
+ if (bean == null) {
+ //需要转换成MsgCategoryBean
+
+// insertMsg(msgBean)
+ } else {
+ updateCategory(senderId, msgBean.status!!, msgBean.body!!, msgBean.timestamp!!)
+ }
+ }
+
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/tenlionsoft/aimz_k/model/MsgConvertBean.kt b/app/src/main/java/com/tenlionsoft/aimz_k/model/MsgConvertBean.kt
new file mode 100644
index 0000000..ce421d4
--- /dev/null
+++ b/app/src/main/java/com/tenlionsoft/aimz_k/model/MsgConvertBean.kt
@@ -0,0 +1,32 @@
+package com.tenlionsoft.aimz_k.model
+
+import java.io.Serializable
+
+data class MsgConvertBean(
+ val body: String,
+ val customMessageType: String,
+ val messageId: String,
+ val messageType: String,
+ val metadata: String,
+ val `receiver`: Receiver,
+ val sender: Sender,
+ val timestamp: Long,
+ val status: String
+) : Serializable
+
+public data class Receiver(
+ val receiverId: String?,
+ val receiverType: String?
+) : Serializable
+
+public data class Sender(
+ val senderId: String?,
+ val senderType: String?
+) : Serializable
+
+//"{\"msg\":\"\",\"statusType\":\"SUCCESS_SEND\"}",
+data class BodyContent(
+ val content: String?,
+ val msg: String?,
+ val statusType: String?
+) : Serializable
\ No newline at end of file
diff --git a/app/src/main/java/com/tenlionsoft/aimz_k/model/MsgDao.kt b/app/src/main/java/com/tenlionsoft/aimz_k/model/MsgDao.kt
index ba5d386..357d2bf 100644
--- a/app/src/main/java/com/tenlionsoft/aimz_k/model/MsgDao.kt
+++ b/app/src/main/java/com/tenlionsoft/aimz_k/model/MsgDao.kt
@@ -7,6 +7,12 @@ import androidx.room.Query
@Dao
interface MsgDao {
+ /**
+ * 更新信息状态
+ */
+ @Query("UPDATE db_msg SET status = :status WHERE messageId = :messageId")
+ fun updateStatus(messageId: String, status: String)
+
/**
* 获取全部信息
*
@@ -24,13 +30,17 @@ interface MsgDao {
@Query("SELECT * FROM db_msg WHERE id =(:id) ")
fun getMsgById(id: String?): List?
+ /**
+ *
+ */
+
/**
* 根据信息来源查询消息
*
* @param from
* @return
*/
- @Query("SELECT * FROM db_msg WHERE `from`=(:from)")
+ @Query("SELECT * FROM db_msg WHERE `senderId`=(:from)")
fun getMsgByFrom(from: String?): List?
/**
@@ -39,7 +49,7 @@ interface MsgDao {
* @param to
* @return
*/
- @Query("SELECT * FROM db_msg WHERE `to` =(:to)")
+ @Query("SELECT * FROM db_msg WHERE `receiverId` =(:to)")
fun getMsgByTo(to: String?): List?
@@ -51,13 +61,13 @@ interface MsgDao {
* @param page
* @return
*/
- @Query("SELECT * FROM db_msg WHERE `from`=(:form) ORDER BY timestamp LIMIT (((:page)-1)*(:pageSize)),(:pageSize)")
+ @Query("SELECT * FROM db_msg WHERE `senderId`=(:form) ORDER BY timestamp LIMIT (((:page)-1)*(:pageSize)),(:pageSize)")
fun getMsgByPage(form: String?, pageSize: Int, page: Int): List?
/**
* 查询与单人的聊天记录
*/
- @Query("SELECT * FROM db_msg t1 WHERE t1.id IN (SELECT id FROM db_msg WHERE `from`=(:form) AND `to`=(:to) OR `from`=(:to) AND `to`=(:form) ORDER BY timestamp DESC LIMIT (((:page)-1)*(:pageSize)),(:pageSize)) ORDER by t1.timestamp ASC")
+ @Query("SELECT * FROM db_msg t1 WHERE t1.id IN (SELECT id FROM db_msg WHERE `senderId`=(:form) AND `receiverId`=(:to) OR `senderId`=(:to) AND `receiverId`=(:form) ORDER BY timestamp DESC LIMIT (((:page)-1)*(:pageSize)),(:pageSize)) ORDER by t1.timestamp ASC")
fun getMsgByFromOrToPage(
form: String?,
to: String?,
@@ -68,7 +78,7 @@ interface MsgDao {
/**
* 清空与某个人的聊天记录
*/
- @Query("DELETE FROM db_msg WHERE `from`=(:from) AND `to`=(:to) OR `from`=(:to) AND `to`=(:from)")
+ @Query("DELETE FROM db_msg WHERE `senderId`=(:from) AND `receiverId`=(:to) OR `receiverId`=(:to) AND `senderId`=(:from)")
fun delChatHistory(from: String?, to: String?)
/**
diff --git a/app/src/main/java/com/tenlionsoft/aimz_k/model/MsgTypeStateEnum.kt b/app/src/main/java/com/tenlionsoft/aimz_k/model/MsgTypeStateEnum.kt
index 0241619..f7010b7 100644
--- a/app/src/main/java/com/tenlionsoft/aimz_k/model/MsgTypeStateEnum.kt
+++ b/app/src/main/java/com/tenlionsoft/aimz_k/model/MsgTypeStateEnum.kt
@@ -6,9 +6,6 @@ import com.tenlionsoft.aimz_k.model.MsgTypeStateEnum.MSG_FROM_OTHER_IMG
import com.tenlionsoft.aimz_k.model.MsgTypeStateEnum.MSG_FROM_OTHER_MOVIE
import com.tenlionsoft.aimz_k.model.MsgTypeStateEnum.MSG_FROM_OTHER_TXT
import com.tenlionsoft.aimz_k.model.MsgTypeStateEnum.MSG_FROM_OTHER_VOICE
-import com.tenlionsoft.aimz_k.model.MsgTypeStateEnum.MSG_SEND_FAIL
-import com.tenlionsoft.aimz_k.model.MsgTypeStateEnum.MSG_SEND_ING
-import com.tenlionsoft.aimz_k.model.MsgTypeStateEnum.MSG_SEND_SUCCESS
import com.tenlionsoft.aimz_k.model.MsgTypeStateEnum.MSG_TO_OTHER_FILE
import com.tenlionsoft.aimz_k.model.MsgTypeStateEnum.MSG_TO_OTHER_IMG
import com.tenlionsoft.aimz_k.model.MsgTypeStateEnum.MSG_TO_OTHER_MOVIE
@@ -28,9 +25,6 @@ object MsgTypeStateEnum {
const val MSG_FROM_OTHER_FILE: Int = 152 // * 152 其他人发送给我的文件信息
const val MSG_TO_OTHER_HREF: Int = 161 // * 161 我发送给其他人的文件信息
const val MSG_FROM_OTHER_HREF: Int = 162 // * 162 其他人发送给我的文件信息
- const val MSG_SEND_ING: Int = 1001//11 //发送中
- const val MSG_SEND_FAIL: Int = 1002//12 //发送失败
- const val MSG_SEND_SUCCESS: Int = 1003////发送成功
}
@@ -46,9 +40,6 @@ object MsgTypeStateEnum {
MSG_FROM_OTHER_IMG,
MSG_FROM_OTHER_MOVIE,
MSG_FROM_OTHER_FILE,
- MSG_SEND_ING,
- MSG_SEND_FAIL,
- MSG_SEND_SUCCESS
)
@Retention(AnnotationRetention.SOURCE)
annotation class MsgState
\ No newline at end of file
diff --git a/app/src/main/java/com/tenlionsoft/aimz_k/net/UserApi.kt b/app/src/main/java/com/tenlionsoft/aimz_k/net/UserApi.kt
index 7427e32..f3e1753 100644
--- a/app/src/main/java/com/tenlionsoft/aimz_k/net/UserApi.kt
+++ b/app/src/main/java/com/tenlionsoft/aimz_k/net/UserApi.kt
@@ -22,7 +22,14 @@ interface UserApi {
@Headers("Content-Type: application/json", "Accept: application/json", "projectName:usercenter")
@POST("api/jwt/login")
suspend fun doLogin(@Body user: RequestBody): BaseSuccessBean
-
+ /**
+ * 登陆Socket系统
+ * http://192.168.0.26:8888/system/api/anonymous/login
+ *
+ */
+ @Headers("Content-Type: application/json", "Accept: application/json", "projectName:usercenter")
+ @POST("api/anonymous/login")
+ suspend fun doLoginSocket(@Body user: RequestBody): BaseSuccessBean
/**
* 获取App版本
diff --git a/app/src/main/java/com/tenlionsoft/aimz_k/page/activity/ChatActivity.kt b/app/src/main/java/com/tenlionsoft/aimz_k/page/activity/ChatActivity.kt
index 4a30c78..8159889 100644
--- a/app/src/main/java/com/tenlionsoft/aimz_k/page/activity/ChatActivity.kt
+++ b/app/src/main/java/com/tenlionsoft/aimz_k/page/activity/ChatActivity.kt
@@ -1,9 +1,11 @@
package com.tenlionsoft.aimz_k.page.activity
-import android.app.Activity
+import android.content.BroadcastReceiver
+import android.content.Context
+import android.content.Intent
+import android.content.IntentFilter
import android.util.Log
import android.view.WindowManager
-import androidx.activity.result.contract.ActivityResultContracts
import androidx.core.content.ContextCompat
import androidx.databinding.DataBindingUtil
import androidx.lifecycle.ViewModelProvider
@@ -13,6 +15,7 @@ import com.tenlionsoft.aimz_k.databinding.ActivityChatBinding
import com.tenlionsoft.aimz_k.model.PickerType
import com.tenlionsoft.aimz_k.viewmodel.ChatPageViewModel
import com.tenlionsoft.baselib.base.BaseActivity
+import com.tenlionsoft.baselib.contacts.ProjectConfig
import com.tenlionsoft.baselib.widget.wheel.WheelView
/**
@@ -23,6 +26,7 @@ class ChatActivity : BaseActivity() {
private val chatPageViewModel: ChatPageViewModel by lazy {
ViewModelProvider(this)[ChatPageViewModel::class.java]
}
+ private lateinit var mLocalReceiver: LocalReceiver
private val filePicker = FilePicker.getInstance(this)
override fun bindView() {
@@ -93,67 +97,37 @@ class ChatActivity : BaseActivity() {
else -> {}
}
}
-
-// chatPageViewModel.showReplyLayout.observe(this) {
-// if (it) {
-// hideSoftKeyboard()
-// }
-// }
-// chatPageViewModel.showEmojiLayout.observe(this) {
-// if (it) {
-// hideSoftKeyboard()
-// }
-// }
-// chatPageViewModel.showChooseLayout.observe(this) {
-// if (it) {
-// hideSoftKeyboard()
-// }
-// }
-
-// rootView = findViewById(android.R.id.content)
-// rootView.viewTreeObserver.addOnGlobalLayoutListener {
-// val r = Rect()
-// rootView.getWindowVisibleDisplayFrame(r)
-// val screenHeight = rootView.rootView.height
-// val heightDiff = screenHeight - (r.bottom - r.top)
-// Log.e("ChatActivity", "bindView: ${heightDiff}")
-// if (heightDiff > 100) {
-// chatPageViewModel.showEmojiLayout.value = false
-// chatPageViewModel.showReplyLayout.value = false
-// chatPageViewModel.showChooseLayout.value = false
-// }
-// }
+ registerLocalReceiver()
}
+
+ private fun registerLocalReceiver() {
+ mLocalReceiver = LocalReceiver()
+ val intentFilter = IntentFilter()
+ intentFilter.addAction(ProjectConfig.A_S_MSG_RECEIVER)
+ registerReceiver(mLocalReceiver, intentFilter)
+ }
+
+ private fun unRegisterLocalReceiver() {
+ unregisterReceiver(mLocalReceiver)
+ }
+
+ override fun onDestroy() {
+ super.onDestroy()
+ unRegisterLocalReceiver()
+ }
+
+ inner class LocalReceiver : BroadcastReceiver() {
+ override fun onReceive(context: Context?, intent: Intent?) {
+ when (intent?.action) {
+ ProjectConfig.A_S_MSG_RECEIVER -> {
+ val msg = intent.getStringExtra("msg")
+ Log.e("LocalReceiver", "onReceive: ${msg}")
+ chatPageViewModel.receiveMsg(msg)
+ }//接收到信息
+ }
+ }
+ }
}
-//XXPermissions.with(this)
-//// 申请单个权限
-//.permission(Permission.RECORD_AUDIO)
-//// 申请多个权限
-//.permission(Permission.Group.CALENDAR)
-//// 设置权限请求拦截器(局部设置)
-////.interceptor(new PermissionInterceptor())
-//// 设置不触发错误检测机制(局部设置)
-////.unchecked()
-//.request(object : OnPermissionCallback {
-//
-// override fun onGranted(permissions: MutableList, allGranted: Boolean) {
-// if (!allGranted) {
-// toast("获取部分权限成功,但部分权限未正常授予")
-// return
-// }
-// toast("获取录音和日历权限成功")
-// }
-//
-// override fun onDenied(permissions: MutableList, doNotAskAgain: Boolean) {
-// if (doNotAskAgain) {
-// toast("被永久拒绝授权,请手动授予录音和日历权限")
-// // 如果是被永久拒绝就跳转到应用权限系统设置页面
-// XXPermissions.startPermissionActivity(context, permissions)
-// } else {
-// toast("获取录音和日历权限失败")
-// }
-// }
-//})
diff --git a/app/src/main/java/com/tenlionsoft/aimz_k/page/activity/LoginActivity.kt b/app/src/main/java/com/tenlionsoft/aimz_k/page/activity/LoginActivity.kt
index f349356..6a7a5c4 100644
--- a/app/src/main/java/com/tenlionsoft/aimz_k/page/activity/LoginActivity.kt
+++ b/app/src/main/java/com/tenlionsoft/aimz_k/page/activity/LoginActivity.kt
@@ -40,8 +40,7 @@ class LoginActivity : BaseActivity() {
}
loginPageViewModel.isLoginSuccess.observe(this) {
if (it) {
-// startActivity(Intent(this@LoginActivity, MainActivity::class.java))
- startActivity(Intent(this@LoginActivity, ChatActivity::class.java))
+ startActivity(Intent(this@LoginActivity, MainActivity::class.java))
finish()
}
}
diff --git a/app/src/main/java/com/tenlionsoft/aimz_k/page/activity/MainActivity.kt b/app/src/main/java/com/tenlionsoft/aimz_k/page/activity/MainActivity.kt
index 57764b8..73334fb 100644
--- a/app/src/main/java/com/tenlionsoft/aimz_k/page/activity/MainActivity.kt
+++ b/app/src/main/java/com/tenlionsoft/aimz_k/page/activity/MainActivity.kt
@@ -8,30 +8,26 @@ import android.content.IntentFilter
import android.net.Uri
import android.os.Build
import android.provider.Settings
+import android.util.Log
import androidx.activity.OnBackPressedCallback
import androidx.databinding.DataBindingUtil
import androidx.fragment.app.Fragment
-import androidx.lifecycle.lifecycleScope
+import androidx.lifecycle.ViewModelProvider
import com.tenlionsoft.aimz_k.R
import com.tenlionsoft.aimz_k.adapter.VpAdapter
import com.tenlionsoft.aimz_k.databinding.ActivityMainBinding
-import com.tenlionsoft.aimz_k.net.UserApi
import com.tenlionsoft.aimz_k.page.fragments.CenterFragment
import com.tenlionsoft.aimz_k.page.fragments.MineFragment
import com.tenlionsoft.aimz_k.page.fragments.MsgFragment
+import com.tenlionsoft.aimz_k.viewmodel.MainPageViewModel
import com.tenlionsoft.baselib.base.BaseActivity
import com.tenlionsoft.baselib.contacts.ProjectConfig
import com.tenlionsoft.baselib.net.DownloadApkService
-import com.tenlionsoft.baselib.net.ExParse
-import com.tenlionsoft.baselib.net.RetrofitClient
import com.tenlionsoft.baselib.utils.AppUtils
import com.tenlionsoft.baselib.utils.DensityUtils
import com.tenlionsoft.baselib.utils.LogUtils
import com.tenlionsoft.baselib.utils.ToastUtils
import com.tenlionsoft.baselib.widget.CenterProgressUpdateView
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.launch
-import kotlinx.coroutines.withContext
import java.io.File
/**
@@ -51,10 +47,14 @@ class MainActivity : BaseActivity() {
private lateinit var mLocalReceiver: MainBroadcastReceiver
private var mUpdateView: CenterProgressUpdateView? = null
private var mApkFile: File? = null
-
+ private var onSocketConnectListener: OnSocketConnectListener? = null
+ private val mainPageViewModel: MainPageViewModel by lazy {
+ ViewModelProvider(this)[MainPageViewModel::class.java]
+ }
override fun bindView() {
mBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
+ mBinding.mainModel = mainPageViewModel
initView();
}
@@ -108,26 +108,10 @@ class MainActivity : BaseActivity() {
}
}
})
- registerLocalReceiver()
- checkAppVersion()
- }
-
- private fun checkAppVersion() {
- lifecycleScope.launch {
- withContext(Dispatchers.IO) {
- try {
- val appVersion = RetrofitClient.getInstance(this@MainActivity)
- .create(UserApi::class.java)
- .doCheckAppVersion(ProjectConfig.APP_VERSION_ID)
- if (appVersion.versioncode.isNotEmpty()) {
- val isNeedUpdate = AppUtils.checkcode(appVersion.versioncode)
- if (isNeedUpdate) {
- startDownloadApk()
- }
- }
- } catch (e: Exception) {
- ExParse.parse(e)
- }
+ mainPageViewModel.doCheckAppVersion(this@MainActivity)
+ mainPageViewModel.isNeedDownload.observe(this) {
+ if (it) {
+ startDownloadApk()
}
}
}
@@ -145,16 +129,17 @@ class MainActivity : BaseActivity() {
filter.addAction(ProjectConfig.ACTION_UPDATE_ERROR) //下载失败
filter.addAction(ProjectConfig.ACTION_UPDATE_PROGRESS) //进度更新
filter.addAction(ProjectConfig.ACTION_UPDATE_START) //开始下载App
+ filter.addAction(ProjectConfig.A_S_CONNECTED)//socket连接成功
+ filter.addAction(ProjectConfig.A_S_FAIL)//socket连接失败
+ filter.addAction(ProjectConfig.A_S_DISCONNECT)//socket连接断开
registerReceiver(mLocalReceiver, filter)
}
- private suspend fun startDownloadApk() {
- withContext(Dispatchers.Main) {
- ToastUtils.normal("检测到新版本,开始下载")
- val intent = Intent(this@MainActivity, DownloadApkService::class.java)
- intent.putExtra(ProjectConfig.APK_DOWNLOAD_URL, ProjectConfig.APP_DOWNLOAD_URL)
- startService(intent)
- }
+ private fun startDownloadApk() {
+ ToastUtils.normal("检测到新版本,开始下载")
+ val intent = Intent(this@MainActivity, DownloadApkService::class.java)
+ intent.putExtra(ProjectConfig.APK_DOWNLOAD_URL, ProjectConfig.APP_DOWNLOAD_URL)
+ startService(intent)
}
@@ -186,15 +171,25 @@ class MainActivity : BaseActivity() {
}
}
+ override fun onStart() {
+ super.onStart()
+ registerLocalReceiver()
+ }
- override fun onDestroy() {
- super.onDestroy()
+ override fun onPause() {
+ super.onPause()
unRegisterLocalReceiver()
}
+
+ fun setOnSocketListener(onSocketConnectListener: OnSocketConnectListener) {
+ this.onSocketConnectListener = onSocketConnectListener
+ }
+
inner class MainBroadcastReceiver : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
+ Log.e("MainBroadcastReceiver", "onReceive: ${intent?.action}")
when (intent?.action) {
ProjectConfig.ACTION_UPDATE_START -> {
showUpdateProgress()
@@ -215,10 +210,27 @@ class MainActivity : BaseActivity() {
val apkFile = intent.getSerializableExtra("apkFile") as File?
installApk(apkFile!!)
}//下载成功
+ ProjectConfig.A_S_CONNECTED -> {
+ onSocketConnectListener?.onListener(ProjectConfig.A_S_CONNECTED)
+ }//socket 连接成功
+ ProjectConfig.A_S_FAIL -> {
+ onSocketConnectListener?.onListener(ProjectConfig.A_S_FAIL)
+ }//连接失败
+ ProjectConfig.A_S_MSG_RECEIVER -> {
+ val extra = intent.getStringExtra(ProjectConfig.MSG_TEXT)
+ if (!extra.isNullOrEmpty()) {
+ onSocketConnectListener?.onReceiverMsg(extra)
+ }
+ }//接收到信息
else -> {}
}
}
}
+
+ interface OnSocketConnectListener {
+ fun onListener(status: String)
+ fun onReceiverMsg(msg: String)
+ }
}
diff --git a/app/src/main/java/com/tenlionsoft/aimz_k/page/fragments/MsgFragment.kt b/app/src/main/java/com/tenlionsoft/aimz_k/page/fragments/MsgFragment.kt
index a978895..1e9bda4 100644
--- a/app/src/main/java/com/tenlionsoft/aimz_k/page/fragments/MsgFragment.kt
+++ b/app/src/main/java/com/tenlionsoft/aimz_k/page/fragments/MsgFragment.kt
@@ -1,5 +1,6 @@
package com.tenlionsoft.aimz_k.page.fragments
+import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.util.Log
@@ -8,18 +9,21 @@ import android.view.View
import android.view.ViewGroup
import androidx.databinding.DataBindingUtil
import androidx.fragment.app.Fragment
-import androidx.fragment.app.FragmentActivity
import androidx.fragment.app.viewModels
import com.tenlionsoft.aimz_k.R
import com.tenlionsoft.aimz_k.databinding.FragmentMsgBinding
import com.tenlionsoft.aimz_k.model.MsgCategoryBean
import com.tenlionsoft.aimz_k.page.activity.ChatActivity
+import com.tenlionsoft.aimz_k.page.activity.MainActivity
+import com.tenlionsoft.aimz_k.services.SocketService
import com.tenlionsoft.aimz_k.viewmodel.MsgViewModel
+import com.tenlionsoft.baselib.contacts.ProjectConfig
import com.tenlionsoft.baselib.widget.LoadingDialog
-class MsgFragment : Fragment(), MsgViewModel.OnItemClickListener {
+class MsgFragment : Fragment(), MsgViewModel.OnItemClickListener,
+ MainActivity.OnSocketConnectListener {
private lateinit var mMsgBinding: FragmentMsgBinding
- private var mActivity: FragmentActivity? = null
+ private var mActivity: MainActivity? = null
private var mLoading: LoadingDialog? = null;
companion object {
@@ -43,7 +47,6 @@ class MsgFragment : Fragment(), MsgViewModel.OnItemClickListener {
container,
false
);
- mActivity = activity
mMsgBinding.llSearchLayout.llSearchLayout.setOnClickListener {
startActivity(Intent(this@MsgFragment.context, ChatActivity::class.java))
}
@@ -66,6 +69,34 @@ class MsgFragment : Fragment(), MsgViewModel.OnItemClickListener {
mMsgBinding.srlMsgs.finishRefresh()
mMsgBinding.srlMsgs.finishLoadMore()
}
+ viewModel.isLogining.observe(viewLifecycleOwner) {
+ if (it) {
+ mMsgBinding.llSearchLayout.tvSocketStatus.text = "登陆中..."
+ mMsgBinding.llSearchLayout.ivSocketStatus.visibility = View.GONE
+ mMsgBinding.llSearchLayout.pbSocketLoading.visibility = View.VISIBLE
+ toStartService()
+ } else {
+ mMsgBinding.llSearchLayout.ivSocketStatus.visibility = View.VISIBLE
+ mMsgBinding.llSearchLayout.ivSocketStatus.setImageResource(R.drawable.shp_circle_green)
+ mMsgBinding.llSearchLayout.tvSocketStatus.visibility = View.GONE
+ mMsgBinding.llSearchLayout.pbSocketLoading.visibility = View.GONE
+ }
+ }
+ //登陆socket
+ viewModel.doLoginWebsocket()
+ }
+
+ override fun onAttach(context: Context) {
+ super.onAttach(context)
+ if (context is MainActivity) {
+ mActivity = context
+ mActivity!!.setOnSocketListener(this)
+ }
+ }
+
+ //开启service
+ private fun toStartService() {
+ mActivity?.startService(Intent(mActivity!!, SocketService::class.java))
}
/**
@@ -76,4 +107,25 @@ class MsgFragment : Fragment(), MsgViewModel.OnItemClickListener {
startActivity(Intent(mActivity, ChatActivity::class.java))
}
+ //监听socket连接状态
+ override fun onListener(status: String) {
+ Log.e("MsgFragment", "onListener: ${status}")
+ when (status) {
+ ProjectConfig.A_S_CONNECTED -> {
+ viewModel.isLogining.value = false
+ }//连接成功
+ ProjectConfig.A_S_FAIL -> {
+ viewModel.isLogining.value = true
+ }//连接失败
+ ProjectConfig.A_S_DISCONNECT -> {}//连接断开
+ }
+ }
+
+ //接收到socket信息
+ override fun onReceiverMsg(msg: String) {
+ if (msg.isNotEmpty()) {
+ viewModel.fromMsg(msg)
+ }
+ }
+
}
\ No newline at end of file
diff --git a/app/src/main/java/com/tenlionsoft/aimz_k/services/SocketService.kt b/app/src/main/java/com/tenlionsoft/aimz_k/services/SocketService.kt
index dd6b934..4d11fa6 100644
--- a/app/src/main/java/com/tenlionsoft/aimz_k/services/SocketService.kt
+++ b/app/src/main/java/com/tenlionsoft/aimz_k/services/SocketService.kt
@@ -1,23 +1,30 @@
package com.tenlionsoft.aimz_k.services
import android.annotation.SuppressLint
-import android.app.Notification
import android.app.NotificationChannel
import android.app.NotificationManager
import android.app.Service
+import android.content.BroadcastReceiver
+import android.content.Context
import android.content.Intent
+import android.content.IntentFilter
import android.os.Build
import android.os.IBinder
-import com.tenlionsoft.aimz_k.R
+import android.util.Log
+import com.google.gson.Gson
import com.tenlionsoft.aimz_k.socket.WsManager
+import com.tenlionsoft.baselib.contacts.NetConfig
import com.tenlionsoft.baselib.contacts.ProjectConfig
+import com.tenlionsoft.baselib.utils.SpUtils
/**
* Socket service
*/
-class SocketService : Service() {
+class SocketService : Service(), WsManager.MsgCallBack {
private var mWsManager: WsManager? = null
+ private val gson = Gson()
+ private lateinit var mLocalReceiver: LocalReceiver
override fun onCreate() {
super.onCreate()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
@@ -33,30 +40,40 @@ class SocketService : Service() {
@SuppressLint("ForegroundServiceType")
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
- val builder: Notification.Builder
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
- builder = Notification.Builder(this, ProjectConfig.NOTIFY_CHANNEL_ID)
- } else {
- builder = Notification.Builder(this)
- }
- builder.setContentTitle("Ai秒著")
- .setContentText("聊天已经登陆")
- .setSmallIcon(R.drawable.app_logo_small)
- val notification: Notification = builder.build()
- startForeground(startId, notification)
+// val builder: Notification.Builder
+// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+// builder = Notification.Builder(this, ProjectConfig.NOTIFY_CHANNEL_ID)
+// } else {
+// builder = Notification.Builder(this)
+// }
+// builder.setContentTitle("Ai秒著")
+// .setContentText("聊天已经登陆")
+// .setSmallIcon(R.drawable.app_logo_small)
+// val notification: Notification = builder.build()
+// startForeground(startId, notification)
this.startSocket();//开启Socket
+ registerLocalReceiver()
return START_STICKY
}
+
+ private fun registerLocalReceiver() {
+ val intentFilter = IntentFilter()
+ mLocalReceiver = LocalReceiver()
+ intentFilter.addAction(ProjectConfig.A_S_MSG_SEND)//发送消息
+ registerReceiver(mLocalReceiver, intentFilter)
+ }
+
/**
* 开启链接socket
*/
- fun startSocket() {
+ private fun startSocket() {
if (mWsManager == null) {
mWsManager = WsManager.Builder(applicationContext)
- .wsUrl(ProjectConfig.SOCKET_MSG_SECRET)
+ .wsUrl(NetConfig.WS_URL + "?token=" + SpUtils.getToken())
.needReconnect(true)
+ .addCallBack(this)
.build()
}
if (!mWsManager!!.isWsConnected()) {
@@ -65,7 +82,7 @@ class SocketService : Service() {
}
- fun stopSocket() {
+ private fun stopSocket() {
if (mWsManager != null && mWsManager!!.isWsConnected()) {
mWsManager!!.stopConnect();
mWsManager = null;
@@ -78,6 +95,28 @@ class SocketService : Service() {
override fun onDestroy() {
stopSocket();
+ unregisterReceiver(mLocalReceiver)
super.onDestroy()
}
+
+ inner class LocalReceiver : BroadcastReceiver() {
+ override fun onReceive(context: Context?, intent: Intent?) {
+ when (intent?.action) {
+ ProjectConfig.A_S_MSG_SEND -> {
+ val msgConvertBean = intent.getSerializableExtra("msgBean")
+ val msg = gson.toJson(msgConvertBean)
+ mWsManager?.sendMessage(msg)
+ }//发送消息
+ }
+ }
+
+ }
+
+ //socket接收到信息
+ override fun onCallBackMsg(str: String) {
+ Log.e("SocketService", "接收信息: ${str}")
+ val intent = Intent(ProjectConfig.A_S_MSG_RECEIVER)
+ intent.putExtra("msg", str)
+ sendBroadcast(intent)
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/tenlionsoft/aimz_k/socket/WsManager.kt b/app/src/main/java/com/tenlionsoft/aimz_k/socket/WsManager.kt
index 3b97fb3..322aadd 100644
--- a/app/src/main/java/com/tenlionsoft/aimz_k/socket/WsManager.kt
+++ b/app/src/main/java/com/tenlionsoft/aimz_k/socket/WsManager.kt
@@ -40,8 +40,10 @@ class WsManager private constructor(val builder: Builder) : IWsManager {
private var mLock: Lock = ReentrantLock()
private val wsMainHandler: Handler = Handler(Looper.getMainLooper())
private var reconnectCount = 5 //重连次数
+ private var mMsgCallBack: MsgCallBack? = builder.callBack
private val reconnectRunnable = Runnable {
if (reconnectCount < 10) {
+ //重新连接
val intent = Intent()
// intent.setAction(PathConfig.ACTION_SOCKET_RELINK)
mContext.sendBroadcast(intent)
@@ -50,43 +52,12 @@ class WsManager private constructor(val builder: Builder) : IWsManager {
private val mWebSocketListener: WebSocketListener = object : WebSocketListener() {
- private fun buildMsgBean(type: Int, body: String): String {
-// val message: AppSocketMessage = AppSocketMessage()
-// message.setType(type)
-// val userId: String = GlobalProvider.getString(mContext, "userId")
-// message.setFrom(userId)
-// message.setTo(userId)
-//
-// var bodyBean: BaseSocketBodyBean? = null
-// when (type) {
-// 1000 -> {
-// bodyBean = SocketRegisterBodyBean()
-// (bodyBean as SocketRegisterBodyBean?).setSessionId(body)
-// }
-// }
-// val gson = Gson()
-// val s = gson.toJson(bodyBean)
-// message.setBody(s)
-// val messageStr = gson.toJson(message)
-// return messageStr
- return body
-
- }
override fun onOpen(webSocket: WebSocket, response: Response) {
mWebSocket = webSocket
setCurrentStatus(WsStatus.CONNECTED)
connected()
- //注册websocket
-// TODO val sessionId: String = GlobalProvider.getString(mContext, StatusCode.SESSION_ID)
- var sessionId: String = ""
- LogUtils.e("Session_Id==$sessionId")
- val messageStr = buildMsgBean(1000, sessionId)
- if (Looper.myLooper() != Looper.getMainLooper()) { //主线程
- val isSend = sendMessage(messageStr)
- } else { //子线程
- val isSend = sendMessage(messageStr)
- }
+ sendBroadcast(ProjectConfig.A_S_CONNECTED)
}
override fun onMessage(webSocket: WebSocket, bytes: ByteString) {
@@ -124,9 +95,8 @@ class WsManager private constructor(val builder: Builder) : IWsManager {
override fun onFailure(webSocket: WebSocket, t: Throwable, response: Response?) {
try {
tryReconnect()
- val intent = Intent()
-//TODO intent.setAction(PathConfig.ACTION_MSG_SOCKET_FAIL)
- mContext!!.sendBroadcast(intent)
+ //发送失败广播
+ sendBroadcast(ProjectConfig.A_S_FAIL)
} catch (e: Exception) {
e.printStackTrace()
}
@@ -152,9 +122,16 @@ class WsManager private constructor(val builder: Builder) : IWsManager {
mLock.unlock()
}
} catch (e: InterruptedException) {
+ e.printStackTrace()
}
}
+ //发送广播
+ private fun sendBroadcast(action: String) {
+ val intent = Intent(action)
+ mContext.sendBroadcast(intent)
+ }
+
override fun getWebSocket(): WebSocket? {
return mWebSocket
}
@@ -291,10 +268,7 @@ class WsManager private constructor(val builder: Builder) : IWsManager {
private fun isNetworkConnected(context: Context?): Boolean {
if (context != null) {
val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
- val activeNetwork: Network? = cm.getActiveNetwork()
- if (activeNetwork == null) {
- return false
- }
+ val activeNetwork: Network = cm.activeNetwork ?: return false
val capabilities = cm.getNetworkCapabilities(activeNetwork)
return capabilities != null && capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
} else {
@@ -303,33 +277,20 @@ class WsManager private constructor(val builder: Builder) : IWsManager {
}
private fun sendNotify(jsonStr: String) {
-// if (!TextUtils.isEmpty(jsonStr)) {
-// LogUtils.e("收到消息:$jsonStr")
-// val broadCstIntent = Intent()
-// if (PathConfig.IS_SECRET) {
-// try {
-// val msg: String =
-// AesUtil.aesCommonDecoder(PathConfig.SOCKET_MSG_SECRET, jsonStr)
-// broadCstIntent.setAction(PathConfig.ACTION_FROM_SOCKET_PUSH_MSG)
-// broadCstIntent.putExtra(StatusCode.PUSH_DATA_KEY, msg)
-// mContext!!.sendBroadcast(broadCstIntent)
-// } catch (e: Exception) {
-// e.printStackTrace()
-// }
-// } else {
-// broadCstIntent.setAction(PathConfig.ACTION_FROM_SOCKET_PUSH_MSG)
-// broadCstIntent.putExtra(StatusCode.PUSH_DATA_KEY, jsonStr)
-// mContext!!.sendBroadcast(broadCstIntent)
-// }
-// }
+ if (jsonStr.isNotEmpty()) {
+ mMsgCallBack?.onCallBackMsg(jsonStr)
+ }
}
+ interface MsgCallBack {
+ fun onCallBackMsg(str: String)
+ }
class Builder(val mContext: Context) {
lateinit var wsUrl: String
var needReconnect: Boolean = true
var mOkHttpClient: OkHttpClient? = null
-
+ var callBack: MsgCallBack? = null
fun wsUrl(url: String): Builder {
wsUrl = url
return this
@@ -345,6 +306,11 @@ class WsManager private constructor(val builder: Builder) : IWsManager {
return this
}
+ fun addCallBack(callBack: MsgCallBack): Builder {
+ this.callBack = callBack
+ return this
+ }
+
fun build(): WsManager {
return WsManager(this)
}
diff --git a/app/src/main/java/com/tenlionsoft/aimz_k/viewmodel/ChatPageViewModel.kt b/app/src/main/java/com/tenlionsoft/aimz_k/viewmodel/ChatPageViewModel.kt
index cb8cc53..23cd82f 100644
--- a/app/src/main/java/com/tenlionsoft/aimz_k/viewmodel/ChatPageViewModel.kt
+++ b/app/src/main/java/com/tenlionsoft/aimz_k/viewmodel/ChatPageViewModel.kt
@@ -1,27 +1,45 @@
package com.tenlionsoft.aimz_k.viewmodel
+import android.content.Intent
import android.util.Log
+import android.view.View
import androidx.lifecycle.MutableLiveData
+import androidx.lifecycle.viewModelScope
import com.atwa.filepicker.result.FileMeta
import com.atwa.filepicker.result.ImageMeta
import com.atwa.filepicker.result.VideoMeta
+import com.google.gson.Gson
+import com.tenlionsoft.aimz_k.ConvertBeanUtils
+import com.tenlionsoft.aimz_k.model.BodyContent
+import com.tenlionsoft.aimz_k.model.CoverSealedBean
+import com.tenlionsoft.aimz_k.model.DbManager
+import com.tenlionsoft.aimz_k.model.MsgConvertBean
import com.tenlionsoft.aimz_k.model.PickerType
+import com.tenlionsoft.aimz_k.model.Receiver
+import com.tenlionsoft.aimz_k.model.Sender
import com.tenlionsoft.baselib.base.BaseViewModel
+import com.tenlionsoft.baselib.contacts.ProjectConfig
+import com.tenlionsoft.baselib.utils.SpUtils
+import com.tenlionsoft.baselib.utils.TimeUtils
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.withContext
class ChatPageViewModel : BaseViewModel() {
- var txtMsg: String = ""
+ val txtMsg = MutableLiveData("")
val showSendBtn = MutableLiveData(false)//显示/隐藏发送按钮
val showEmojiLayout = MutableLiveData(false)//显示/隐藏emoji
val showReplyLayout = MutableLiveData(false)//显示/隐藏快速回复
val showChooseLayout = MutableLiveData(false)//显示/隐藏选择
val chooseType = MutableLiveData()//选择文件类型
+ private val mGson: Gson = Gson()
init {
Log.e("ChatPageViewModel", "Init: ${showSendBtn.value}")
}
fun onTxtChange(s: CharSequence, start: Int, before: Int, count: Int) {
- this.txtMsg = s.toString()
+ this.txtMsg.value = s.toString()
showSendBtn.value = s.isNotEmpty()
Log.e("ChatPageViewModel", "onTxtChange: ${showSendBtn.value}")
@@ -103,7 +121,87 @@ class ChatPageViewModel : BaseViewModel() {
/**
* 发送文本信息
*/
- fun sendTxtMsg() {
+ fun sendTxtMsg(v: View) {
+ if (txtMsg.value!!.isNotEmpty()) {
+ val intent = Intent(ProjectConfig.A_S_MSG_SEND)
+ val b = buildSendBean()
+ viewModelScope.launch {
+ withContext(Dispatchers.IO) {
+ val dao = DbManager.db.msgDao()
+ val msgBean = ConvertBeanUtils.convertBeanToMsgBean(b)
+ dao.insertMsg(msgBean)
+ }
+ }
+ Log.e("ChatPageViewModel", "sendTxtMsg: ${b}")
+ intent.putExtra("msgBean", b)
+ v.context.sendBroadcast(intent)
+ txtMsg.value = ""
+ }
+
+ //TODO 刷新列表
+ }
+
+ //收到消息
+ fun receiveMsg(msg: String?) {
+ if (!msg.isNullOrEmpty()) {
+ val bean = ConvertBeanUtils.covertBean(msg)
+ Log.e("ChatPageViewModel", "receiveMsg: ${bean}")
+ when (bean) {
+ //状态消息
+ is CoverSealedBean.StateBean -> {
+ viewModelScope.launch {
+ withContext(Dispatchers.IO) {
+ val dao = DbManager.db.msgDao()
+ //TODO 并且更新Category表
+ dao.updateStatus(
+ bean.data.messageId,
+ mGson.fromJson(bean.data.body, BodyContent::class.java).statusType!!
+ )
+ }
+ //TODO 刷新列表
+ }
+ }
+ //消息
+ is CoverSealedBean.Msg -> {
+ //插入信息表
+ //并更新category表
+ viewModelScope.launch {
+ withContext(Dispatchers.IO) {
+ val msgDao = DbManager.db.msgDao()
+ val cDao = DbManager.db.categoryDao()
+ msgDao.insertMsg(bean.msgBean)
+ cDao.updateOrInsert(bean.msgBean.senderId!!, bean.msgBean)
+ }
+ }
+ //刷新列表
+
+ Log.e("ChatPageViewModel", "receiveMsg接收到消息: ${bean.msgBean}")
+ }
+ }
+ }
+ }
+
+
+ private fun buildSendBean(): MsgConvertBean {
+ val bodyBean = BodyContent(content = txtMsg.value, null, null)
+ var body = mGson.toJson(bodyBean)
+ return MsgConvertBean(
+ body = body,
+ customMessageType = "",
+ messageId = TimeUtils.getNowDateMillis().toString(),
+ messageType = ProjectConfig.MSG_TEXT,
+ metadata = "",
+ timestamp = TimeUtils.getNowDateMillis(),
+ sender = Sender(
+ senderId = SpUtils.getId(),
+ senderType = ""
+ ),
+ receiver = Receiver(
+ receiverId = "2",
+ receiverType = "SINGLE_USER"
+ ),
+ status = ProjectConfig.MSG_SEND_ING,
+ )
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/tenlionsoft/aimz_k/viewmodel/LoginPageViewModel.kt b/app/src/main/java/com/tenlionsoft/aimz_k/viewmodel/LoginPageViewModel.kt
index 5133c80..154c9b1 100644
--- a/app/src/main/java/com/tenlionsoft/aimz_k/viewmodel/LoginPageViewModel.kt
+++ b/app/src/main/java/com/tenlionsoft/aimz_k/viewmodel/LoginPageViewModel.kt
@@ -37,7 +37,6 @@ class LoginPageViewModel : BaseViewModel() {
}
fun doLogin() {
- isLoginSuccess.value = true
val isLegal = checkParams();
if (isLegal) {
viewModelScope.launch {
@@ -56,12 +55,11 @@ class LoginPageViewModel : BaseViewModel() {
userPwd,
userName
);
-
+ Log.e("LoginPageViewModel", "登陆前: Thread${Thread.currentThread().name}")
val loginUserStr = gson.toJson(userBody)
val body =
loginUserStr.toRequestBody("application/json; charset=utf-8".toMediaTypeOrNull())
val user = userApi.doLogin(body);
- Log.e("LoginPageViewModel", "login: ${user.code}")
if (user.code == 200) {
//登陆成功
val token = JwtUtils.parseToken(user.data)
@@ -71,12 +69,16 @@ class LoginPageViewModel : BaseViewModel() {
} else {
//登陆成功
//解析Token
- Log.e("LoginPageViewModel", "login: $token")
+ Log.e("LoginPageViewModel", "login: ${token}")
val appTokenUser = gson.fromJson(token, AppTokenUser::class.java)
+ Log.e(
+ "LoginPageViewModel",
+ "Thread ${Thread.currentThread().name} login: UserId${appTokenUser.user.id}"
+ )
SpUtils.putPassword(userPwd)
SpUtils.putAvatar(appTokenUser.user.avatar)
SpUtils.putNickName(appTokenUser.user.nickname)
- SpUtils.putId(appTokenUser.user.id)
+ SpUtils.putId(appTokenUser.user.userId)
SpUtils.putEmail(appTokenUser.user.email)
SpUtils.putUserName(appTokenUser.user.username)
SpUtils.putPhone(appTokenUser.user.phone)
diff --git a/app/src/main/java/com/tenlionsoft/aimz_k/viewmodel/MainPageViewModel.kt b/app/src/main/java/com/tenlionsoft/aimz_k/viewmodel/MainPageViewModel.kt
new file mode 100644
index 0000000..76e86a5
--- /dev/null
+++ b/app/src/main/java/com/tenlionsoft/aimz_k/viewmodel/MainPageViewModel.kt
@@ -0,0 +1,39 @@
+package com.tenlionsoft.aimz_k.viewmodel
+
+import android.content.Context
+import androidx.lifecycle.MutableLiveData
+import androidx.lifecycle.viewModelScope
+import com.tenlionsoft.aimz_k.net.UserApi
+import com.tenlionsoft.baselib.base.BaseViewModel
+import com.tenlionsoft.baselib.contacts.ProjectConfig
+import com.tenlionsoft.baselib.net.ExParse
+import com.tenlionsoft.baselib.net.RetrofitClient
+import com.tenlionsoft.baselib.utils.AppUtils
+import kotlinx.coroutines.launch
+
+class MainPageViewModel : BaseViewModel() {
+ val isNeedDownload = MutableLiveData(false)
+
+ //校验Appversion
+ fun doCheckAppVersion(context: Context) {
+ viewModelScope.launch {
+ getAppVersion(context)
+ }
+ }
+
+ private suspend fun getAppVersion(context: Context) {
+ try {
+ val appVersion = RetrofitClient.getInstance(context)
+ .create(UserApi::class.java)
+ .doCheckAppVersion(ProjectConfig.APP_VERSION_ID)
+ if (appVersion.versioncode.isNotEmpty()) {
+ val isNeedUpdate = AppUtils.checkcode(appVersion.versioncode)
+ if (isNeedUpdate) {
+ isNeedDownload.value = true
+ }
+ }
+ } catch (e: Exception) {
+ ExParse.parse(e)
+ }
+ }
+}
diff --git a/app/src/main/java/com/tenlionsoft/aimz_k/viewmodel/MsgViewModel.kt b/app/src/main/java/com/tenlionsoft/aimz_k/viewmodel/MsgViewModel.kt
index 608be0b..d1e1ad7 100644
--- a/app/src/main/java/com/tenlionsoft/aimz_k/viewmodel/MsgViewModel.kt
+++ b/app/src/main/java/com/tenlionsoft/aimz_k/viewmodel/MsgViewModel.kt
@@ -1,36 +1,34 @@
package com.tenlionsoft.aimz_k.viewmodel
-import android.util.Log
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
+import com.tenlionsoft.aimz_k.ConvertBeanUtils
+import com.tenlionsoft.aimz_k.adapter.CategoryAdapter
+import com.tenlionsoft.aimz_k.model.CoverSealedBean
import com.tenlionsoft.aimz_k.model.DbManager
import com.tenlionsoft.aimz_k.model.MsgCategoryBean
-import com.tenlionsoft.aimz_k.adapter.CategoryAdapter
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
class MsgViewModel : ViewModel() {
private val _pwdList = MutableLiveData>()
- var adapter: CategoryAdapter = CategoryAdapter(_pwdList.value ?: emptyList(),this)
+ var adapter: CategoryAdapter = CategoryAdapter(_pwdList.value ?: emptyList(), this)
var onItemClickListener: OnItemClickListener? = null
-
+ val isLogining = MutableLiveData(false)
private var mCurrentPage: Int = 1
- var isHasMore: MutableLiveData = MutableLiveData().apply {
- value = false
- }
+ var isHasMore: MutableLiveData = MutableLiveData(false)
init {
- Log.e("MsgViewModel", "Init:${_pwdList.value} ")
- getPwdList(true)
+ getList(true)
}
/**
* 获取列表数据
*/
- private fun getPwdList(isFirst: Boolean) {
+ private fun getList(isFirst: Boolean) {
viewModelScope.launch {
if (isFirst) {
_pwdList.value = emptyList()
@@ -46,7 +44,6 @@ class MsgViewModel : ViewModel() {
}
val updateData: List = _pwdList.value!! + list
_pwdList.value = updateData
- Log.e("MsgViewModel", "getPwdList: ${_pwdList.value}")
adapter.setData(_pwdList.value!!)
}
}
@@ -64,14 +61,30 @@ class MsgViewModel : ViewModel() {
* 加载更多
*/
fun loadMore() {
- getPwdList(false)
+ getList(false)
+ }
+
+ /**
+ * 登陆websocket
+ */
+ fun doLoginWebsocket() {
+ isLogining.value = true
+ }
+
+ //接收到信息
+ fun fromMsg(msg: String) {
+ val bean = ConvertBeanUtils.covertBean(msg)
+ when (bean) {
+ is CoverSealedBean.StateBean -> {}//消息状态
+ is CoverSealedBean.Msg -> {}//消息
+ }
}
/**
* 刷新
*/
fun refresh() {
- getPwdList(true)
+ getList(true)
}
interface OnItemClickListener {
diff --git a/app/src/main/java/com/tenlionsoft/aimz_k/widget/BindingUtils.kt b/app/src/main/java/com/tenlionsoft/aimz_k/widget/BindingUtils.kt
index d20f330..cece061 100644
--- a/app/src/main/java/com/tenlionsoft/aimz_k/widget/BindingUtils.kt
+++ b/app/src/main/java/com/tenlionsoft/aimz_k/widget/BindingUtils.kt
@@ -10,7 +10,7 @@ import com.bumptech.glide.Glide
import com.bumptech.glide.load.engine.DiskCacheStrategy
import com.bumptech.glide.request.RequestOptions
import com.tenlionsoft.aimz_k.R
-import com.tenlionsoft.aimz_k.model.MsgTypeStateEnum
+import com.tenlionsoft.baselib.contacts.ProjectConfig
object BindingUtils {
@@ -52,11 +52,11 @@ object BindingUtils {
//发送中
@BindingAdapter("isShowLoading")
@JvmStatic
- fun sending(view: View, status: Int) {
+ fun sending(view: View, status: String) {
when (status) {
- MsgTypeStateEnum.MSG_SEND_SUCCESS -> view.visibility = View.GONE
- MsgTypeStateEnum.MSG_SEND_FAIL -> view.visibility = View.GONE
- MsgTypeStateEnum.MSG_SEND_ING -> view.visibility = View.VISIBLE
+ ProjectConfig.MSG_SEND_SUCCESS -> view.visibility = View.GONE
+ ProjectConfig.MSG_SEND_FAIL -> view.visibility = View.GONE
+ ProjectConfig.MSG_SEND_ING -> view.visibility = View.VISIBLE
else -> view.visibility = View.GONE
}
}
@@ -64,11 +64,11 @@ object BindingUtils {
//发送失败
@BindingAdapter("isShowFail")
@JvmStatic
- fun sendFail(view: View, status: Int) {
+ fun sendFail(view: View, status: String) {
when (status) {
- MsgTypeStateEnum.MSG_SEND_SUCCESS -> view.visibility = View.GONE
- MsgTypeStateEnum.MSG_SEND_FAIL -> view.visibility = View.GONE
- MsgTypeStateEnum.MSG_SEND_ING -> view.visibility = View.VISIBLE
+ ProjectConfig.MSG_SEND_SUCCESS -> view.visibility = View.GONE
+ ProjectConfig.MSG_SEND_FAIL -> view.visibility = View.GONE
+ ProjectConfig.MSG_SEND_ING -> view.visibility = View.VISIBLE
else -> view.visibility = View.GONE
}
}
diff --git a/app/src/main/res/drawable/shp_circle_green.xml b/app/src/main/res/drawable/shp_circle_green.xml
new file mode 100644
index 0000000..e1a5fbe
--- /dev/null
+++ b/app/src/main/res/drawable/shp_circle_green.xml
@@ -0,0 +1,5 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_chat.xml b/app/src/main/res/layout/activity_chat.xml
index 6d2de1c..4a566b1 100644
--- a/app/src/main/res/layout/activity_chat.xml
+++ b/app/src/main/res/layout/activity_chat.xml
@@ -4,7 +4,8 @@
-
+
+
@@ -125,7 +126,7 @@
android:id="@+id/iv_send"
android:layout_width="35dp"
android:layout_height="30dp"
- android:onClick="@{()->viewModel.sendTxtMsg()}"
+ android:onClick="@{(v)->viewModel.sendTxtMsg(v)}"
android:scaleType="fitXY"
android:src="@drawable/ic_send_msg"
android:visibility="@{viewModel.showSendBtn? View.VISIBLE:View.GONE}" />
@@ -181,9 +182,9 @@
+ android:layout_weight="1"
+ android:onClick="@{()->viewModel.showChoosePic()}">
+ android:layout_weight="1"
+ android:onClick="@{()->viewModel.showChooseVideo()}">
+ android:layout_weight="1"
+ android:onClick="@{()->viewModel.showChooseFile()}">
+
+
+
+ type="String" />
+ type="String" />
+ type="String" />
+ type="String" />>
+ type="String" />
+ type="String" />
diff --git a/app/src/main/res/layout/item_msg_other_img.xml b/app/src/main/res/layout/item_msg_other_img.xml
index 28d74d6..7f79b8c 100644
--- a/app/src/main/res/layout/item_msg_other_img.xml
+++ b/app/src/main/res/layout/item_msg_other_img.xml
@@ -13,7 +13,7 @@
type="com.tenlionsoft.aimz_k.model.MsgBean" />
+ type="String" />
+ type="String" />>
-
-
+
-
+
+
+
+
+
+
+
-
+ android:layout_centerInParent="true"
+ android:orientation="horizontal">
+
+
+
+
+
+
\ No newline at end of file
diff --git a/baselib/src/main/java/com/tenlionsoft/baselib/contacts/NetConfig.kt b/baselib/src/main/java/com/tenlionsoft/baselib/contacts/NetConfig.kt
index 24bf568..4442979 100644
--- a/baselib/src/main/java/com/tenlionsoft/baselib/contacts/NetConfig.kt
+++ b/baselib/src/main/java/com/tenlionsoft/baselib/contacts/NetConfig.kt
@@ -3,7 +3,7 @@ package com.tenlionsoft.baselib.contacts
object NetConfig {
const val BASE_URL = "http://192.168.0.26:8888/"
- const val WS_URL = "wss://192.168.0.0:8089/wsscoket";//Socket连接地址
+ const val WS_URL = "ws://192.168.0.26:1991/";//Socket连接地址
const val MAIN_URL = BASE_URL + "system/"
diff --git a/baselib/src/main/java/com/tenlionsoft/baselib/contacts/ProjectConfig.kt b/baselib/src/main/java/com/tenlionsoft/baselib/contacts/ProjectConfig.kt
index ce26214..fffd18b 100644
--- a/baselib/src/main/java/com/tenlionsoft/baselib/contacts/ProjectConfig.kt
+++ b/baselib/src/main/java/com/tenlionsoft/baselib/contacts/ProjectConfig.kt
@@ -5,6 +5,7 @@ package com.tenlionsoft.baselib.contacts
*/
object ProjectConfig {
+
const val IS_SECRET = false;
const val SECRET: String = "CMXX_TOKEN_INFOS"; //秘钥
const val SOCKET_MSG_SECRET: String = "SocKEtsEcReT_KeY"; //消息秘钥
@@ -15,6 +16,15 @@ object ProjectConfig {
const val APP_DOWNLOAD_URL: String =
NetConfig.MAIN_URL + "app/appversion/download/" + APP_VERSION_ID
+ //消息类型
+ const val MSG_TEXT = "MSG_TEXT"
+ const val MSG_FILE = "MSG_FILE"
+ const val MSG_IMG = "MSG_IMG"
+ const val MSG_VIDEO = "MSG_VIDEO"
+ const val MSG_STATUS = "STATUS" //状态消息
+ const val MSG_SEND_ING: String = "PENDING"//11 //发送中
+ const val MSG_SEND_FAIL: String = "ERROR"//12 //发送失败
+ const val MSG_SEND_SUCCESS: String = "SUCCESS_SEND"////发送成功
/********Action********/
@@ -23,4 +33,11 @@ object ProjectConfig {
const val ACTION_UPDATE_SUCCESS: String = "com.tenlion.soft.aimz_k.update_success"
const val ACTION_UPDATE_START: String = "com.tenlion.soft.aimz_k.update_start"
+ /********socket*********/
+ const val A_S_CONNECTED: String = "com.tenlion.soft.aimz_k.socket.connected" //连接socket
+ const val A_S_FAIL: String = "com.tenlion.soft.aimz_k.socket.fail"//socket连接失败
+ const val A_S_DISCONNECT: String = "com.tenlion.soft.aimz_k.socket.disconnect"//连接断开
+ const val A_S_MSG_RECEIVER: String = "com.tenlion.soft.aimz_k.socket.receiver" //接收到信息
+ const val A_S_MSG_SEND: String = "com.tenlion.soft.aimz_k.socket.send"//发送信息
+
}
\ No newline at end of file
diff --git a/baselib/src/main/java/com/tenlionsoft/baselib/net/BaseUrlInterceptor.kt b/baselib/src/main/java/com/tenlionsoft/baselib/net/BaseUrlInterceptor.kt
index dfec99d..8dd68f8 100644
--- a/baselib/src/main/java/com/tenlionsoft/baselib/net/BaseUrlInterceptor.kt
+++ b/baselib/src/main/java/com/tenlionsoft/baselib/net/BaseUrlInterceptor.kt
@@ -18,9 +18,13 @@ class BaseUrlInterceptor : Interceptor {
val builder = request.newBuilder();
val oldHttpUrl = request.url;
val headers = request.headers("project");
- //公共header
- builder.addHeader("X-WG-TOKEN", SpUtils.getToken())
- builder.addHeader("X-WG-TYPE", "APP")
+ //公共Token header
+ if (headers.indexOf("token") != -1) {
+ builder.removeHeader("token")
+ builder.addHeader("X-WG-TOKEN", SpUtils.getToken())
+ builder.addHeader("X-WG-TYPE", "APP")
+ }
+
if (headers.isNotEmpty()) {
builder.removeHeader("project");
diff --git a/baselib/src/main/java/com/tenlionsoft/baselib/utils/TimeUtils.kt b/baselib/src/main/java/com/tenlionsoft/baselib/utils/TimeUtils.kt
new file mode 100644
index 0000000..3139f8c
--- /dev/null
+++ b/baselib/src/main/java/com/tenlionsoft/baselib/utils/TimeUtils.kt
@@ -0,0 +1,7 @@
+package com.tenlionsoft.baselib.utils
+
+object TimeUtils {
+ fun getNowDateMillis(): Long {
+ return System.currentTimeMillis()
+ }
+}
\ No newline at end of file
diff --git a/baselib/src/main/res/layout/custom_loading_view.xml b/baselib/src/main/res/layout/custom_loading_view.xml
index da8d3d8..c4acbe8 100644
--- a/baselib/src/main/res/layout/custom_loading_view.xml
+++ b/baselib/src/main/res/layout/custom_loading_view.xml
@@ -37,7 +37,7 @@
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:clickable="true"
- android:textColor="@color/white"
+ android:textColor="@color/black"
android:textSize="18sp"
tools:text="加载数据失败" />
diff --git a/baselib/src/main/res/values/colors.xml b/baselib/src/main/res/values/colors.xml
index 694c7d2..43d6243 100644
--- a/baselib/src/main/res/values/colors.xml
+++ b/baselib/src/main/res/values/colors.xml
@@ -4,8 +4,10 @@
#FFFFFF
#F5F5F5
#00FFFFFF
- #54000000
+ #A3FFFFFF
#EDEDED
#E75D58
+ #45F68B
+ #6F6E6E
#000000
\ No newline at end of file