根据id获取聊天对象的昵称和头像
This commit is contained in:
parent
18ecb7a11d
commit
7a533c126c
@ -4,10 +4,10 @@
|
||||
<selectionStates>
|
||||
<SelectionState runConfigName="app">
|
||||
<option name="selectionMode" value="DROPDOWN" />
|
||||
<DropdownSelection timestamp="2024-11-13T09:48:02.640863Z">
|
||||
<DropdownSelection timestamp="2024-11-15T05:53:24.302999Z">
|
||||
<Target type="DEFAULT_BOOT">
|
||||
<handle>
|
||||
<DeviceId pluginId="PhysicalDevice" identifier="serial=10HC690BJT0005G" />
|
||||
<DeviceId pluginId="PhysicalDevice" identifier="serial=586e3fe6" />
|
||||
</handle>
|
||||
</Target>
|
||||
</DropdownSelection>
|
||||
|
@ -18,12 +18,17 @@
|
||||
android:fullBackupContent="@xml/backup_rules"
|
||||
android:icon="@drawable/app_logo"
|
||||
android:label="@string/app_name"
|
||||
android:requestLegacyExternalStorage="true"
|
||||
android:networkSecurityConfig="@xml/network_config"
|
||||
android:roundIcon="@drawable/app_logo"
|
||||
android:supportsRtl="true"
|
||||
android:theme="@style/AppTheme"
|
||||
android:usesCleartextTraffic="true"
|
||||
tools:targetApi="31">
|
||||
<!-- 告知 XXPermissions 当前项目已经适配了分区存储特性 -->
|
||||
<meta-data
|
||||
android:name="ScopedStorage"
|
||||
android:value="true" />
|
||||
<activity
|
||||
android:name=".page.activity.UserInfoEditActivity"
|
||||
android:exported="false" />
|
||||
@ -69,6 +74,7 @@
|
||||
|
||||
<service
|
||||
android:name=".services.SocketService"
|
||||
android:process=":tenlion_msg"
|
||||
android:exported="false" />
|
||||
|
||||
<provider
|
||||
|
@ -164,5 +164,5 @@ interface MsgCategoryDao {
|
||||
)
|
||||
|
||||
@Query("UPDATE db_category set userNickName = :nickName,avatar = :avatar where messageId = :msgId and loginUserId = :logId")
|
||||
suspend fun updateInByMsgId(nickName: String, avatar: String,msgId:String,logId:String)
|
||||
suspend fun updateInByMsgId(nickName: String, avatar: String,msgId:String,logId:String):Int
|
||||
}
|
@ -128,17 +128,15 @@ interface MsgDao {
|
||||
/**
|
||||
* 更新 头像和名称
|
||||
*/
|
||||
@Query("UPDATE db_msg SET userNickName=:nickName,avatar=:avatar,senderAvatar=:sAvatar,senderNickName=:sNickName,receiverAvatar=:rAvatar,receiverNickName=:rNickName WHERE messageId=:messageId AND loginUserId=:loginUserId")
|
||||
@Query("UPDATE db_msg SET senderAvatar=:sAvatar,senderNickName=:sNickName,receiverAvatar=:rAvatar,receiverNickName=:rNickName WHERE messageId=:messageId AND loginUserId=:loginUserId")
|
||||
suspend fun updateUserInfoByMessageId(
|
||||
sAvatar: String,
|
||||
sNickName: String,
|
||||
rAvatar: String,
|
||||
rNickName: String,
|
||||
nickName: String,
|
||||
avatar: String,
|
||||
messageId: String,
|
||||
loginUserId: String
|
||||
)
|
||||
):Int
|
||||
|
||||
/**
|
||||
* 搜索聊天内容
|
||||
|
@ -25,6 +25,7 @@ import com.tenlionsoft.aimz_k.viewmodel.ChatPageViewModel
|
||||
import com.tenlionsoft.baselib.base.BaseActivity
|
||||
import com.tenlionsoft.baselib.contacts.NetConfig
|
||||
import com.tenlionsoft.baselib.contacts.ProjectConfig
|
||||
import com.tenlionsoft.baselib.model.ModelEvent
|
||||
import com.tenlionsoft.baselib.net.DownloadResponseHandler
|
||||
import com.tenlionsoft.baselib.net.FileDownloadUtils
|
||||
import com.tenlionsoft.baselib.utils.DensityUtils
|
||||
@ -115,6 +116,16 @@ class ChatActivity : BaseActivity(), AdapterItemClickListener<MsgBean> {
|
||||
}
|
||||
}
|
||||
}
|
||||
chatPageViewModel!!.showLoad.observe(this) {
|
||||
if (it.isShow) {
|
||||
mLoading = LoadingDialog.Builder(this).setCancelOutside(false).setCancelable(false)
|
||||
.setMessage(it.data.toString()).create()
|
||||
mLoading!!.show()
|
||||
} else {
|
||||
mLoading?.dismiss()
|
||||
mLoading = null
|
||||
}
|
||||
}
|
||||
chatPageViewModel!!.showLoadDialog.observe(this) {
|
||||
if (it) {
|
||||
//显示loading
|
||||
@ -310,14 +321,14 @@ class ChatActivity : BaseActivity(), AdapterItemClickListener<MsgBean> {
|
||||
val body = gson.fromJson(data.body, BodyContent::class.java)
|
||||
val fileDataBean = gson.fromJson(body.content, FileDataBean::class.java)
|
||||
val dir: File = StorageUtils.getExternalCacheCustomDir(this)!!
|
||||
chatPageViewModel?.showLoadDialog?.value = true
|
||||
chatPageViewModel?.showLoad?.value = ModelEvent(true, "下载中...")
|
||||
FileDownloadUtils.getInstance().download(this@ChatActivity,
|
||||
NetConfig.MAIN_URL + fileDataBean.fileUrl,
|
||||
dir.absolutePath,
|
||||
fileDataBean.fileName!!,
|
||||
object : DownloadResponseHandler() {
|
||||
override fun onFinish(downloadFile: File?) {
|
||||
chatPageViewModel?.showLoadDialog?.value = false
|
||||
chatPageViewModel?.showLoad?.value = ModelEvent(false, "下载中...")
|
||||
Log.e("ChatActivity", "onFinish:${downloadFile}")
|
||||
FileUtils.openFile(this@ChatActivity, downloadFile)
|
||||
}
|
||||
@ -327,7 +338,7 @@ class ChatActivity : BaseActivity(), AdapterItemClickListener<MsgBean> {
|
||||
}
|
||||
|
||||
override fun onFailure(errorMsg: String?) {
|
||||
chatPageViewModel?.showLoadDialog?.value = false
|
||||
chatPageViewModel?.showLoad?.value = ModelEvent(false, "下载中...")
|
||||
ToastUtils.error(
|
||||
errorMsg
|
||||
?: "下载失败,请稍后重试"
|
||||
|
@ -7,7 +7,6 @@ import androidx.lifecycle.ViewModelProvider
|
||||
import com.tenlionsoft.aimz_k.R
|
||||
import com.tenlionsoft.aimz_k.databinding.ActivitySearchChatMsgBinding
|
||||
import com.tenlionsoft.aimz_k.model.MsgCategoryBean
|
||||
import com.tenlionsoft.aimz_k.model.MsgTypeStateEnum
|
||||
import com.tenlionsoft.aimz_k.viewmodel.SearchChatMsgViewModel
|
||||
import com.tenlionsoft.baselib.base.BaseActivity
|
||||
import com.tenlionsoft.baselib.model.ViewState
|
||||
@ -39,16 +38,7 @@ class SearchChatMsgActivity : BaseActivity(), AdapterItemClickListener<MsgCatego
|
||||
|
||||
override fun onItemClick(data: MsgCategoryBean) {
|
||||
val intent = Intent(this@SearchChatMsgActivity, ChatActivity::class.java)
|
||||
intent.putExtra("fromId", data.senderId)
|
||||
// when (data.msgType) {
|
||||
// MsgTypeStateEnum.MSG_TO_OTHER_TXT, MsgTypeStateEnum.MSG_TO_OTHER_IMG, MsgTypeStateEnum.MSG_TO_OTHER_FILE, MsgTypeStateEnum.MSG_TO_OTHER_VOICE, MsgTypeStateEnum.MSG_TO_OTHER_MOVIE -> {
|
||||
// intent.putExtra("fromId", data.receiverId)
|
||||
// }
|
||||
//
|
||||
// MsgTypeStateEnum.MSG_FROM_OTHER_IMG, MsgTypeStateEnum.MSG_FROM_OTHER_TXT, MsgTypeStateEnum.MSG_FROM_OTHER_VOICE, MsgTypeStateEnum.MSG_FROM_OTHER_MOVIE, MsgTypeStateEnum.MSG_FROM_OTHER_FILE -> {
|
||||
// intent.putExtra("fromId", data.senderId)
|
||||
// }
|
||||
// }
|
||||
intent.putExtra("fromId", data.receiverId)
|
||||
intent.putExtra("name", data.userNickName)
|
||||
startActivity(intent)
|
||||
}
|
||||
|
@ -3,11 +3,15 @@ package com.tenlionsoft.aimz_k.page.activity
|
||||
import android.content.Intent
|
||||
import androidx.databinding.DataBindingUtil
|
||||
import androidx.lifecycle.lifecycleScope
|
||||
import com.hjq.permissions.OnPermissionCallback
|
||||
import com.hjq.permissions.Permission
|
||||
import com.hjq.permissions.XXPermissions
|
||||
import com.tenlionsoft.aimz_k.R
|
||||
import com.tenlionsoft.aimz_k.dao.DbManager
|
||||
import com.tenlionsoft.aimz_k.databinding.ActivitySplashBinding
|
||||
import com.tenlionsoft.baselib.base.BaseActivity
|
||||
import com.tenlionsoft.baselib.utils.SpUtils
|
||||
import com.tenlionsoft.baselib.utils.ToastUtils
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.withContext
|
||||
@ -24,20 +28,44 @@ class SplashActivity : BaseActivity() {
|
||||
override fun bindView() {
|
||||
mBinding = DataBindingUtil.setContentView(this, R.layout.activity_splash)
|
||||
mBinding.lifecycleOwner = this
|
||||
lifecycleScope.launch {
|
||||
withContext(Dispatchers.IO) {
|
||||
val msgDao = DbManager.db.msgDao()
|
||||
val cDao = DbManager.db.categoryDao()
|
||||
msgDao.queryContent("", SpUtils.getId())
|
||||
cDao.getAllCategory()
|
||||
}
|
||||
Timer().schedule(object : TimerTask() {
|
||||
override fun run() {
|
||||
startActivity(Intent(this@SplashActivity, LoginActivity::class.java));
|
||||
finish();
|
||||
XXPermissions.with(this).permission(Permission.MANAGE_EXTERNAL_STORAGE)
|
||||
.request(object : OnPermissionCallback {
|
||||
override fun onGranted(permissions: MutableList<String>, allGranted: Boolean) {
|
||||
if (allGranted) {
|
||||
lifecycleScope.launch {
|
||||
withContext(Dispatchers.IO) {
|
||||
val msgDao = DbManager.db.msgDao()
|
||||
val cDao = DbManager.db.categoryDao()
|
||||
msgDao.queryContent("", SpUtils.getId())
|
||||
cDao.getAllCategory()
|
||||
}
|
||||
Timer().schedule(object : TimerTask() {
|
||||
override fun run() {
|
||||
startActivity(
|
||||
Intent(
|
||||
this@SplashActivity, LoginActivity::class.java
|
||||
)
|
||||
);
|
||||
finish();
|
||||
}
|
||||
|
||||
}, 500)
|
||||
}
|
||||
} else {
|
||||
ToastUtils.error("你为授权管理文件权限,无法使用软件")
|
||||
}
|
||||
}
|
||||
|
||||
}, 500)
|
||||
}
|
||||
override fun onDenied(permissions: MutableList<String>, doNotAskAgain: Boolean) {
|
||||
if (doNotAskAgain) {
|
||||
ToastUtils.error("被永久拒绝授权,请手动授予")
|
||||
// 如果是被永久拒绝就跳转到应用权限系统设置页面
|
||||
XXPermissions.startPermissionActivity(this@SplashActivity, permissions)
|
||||
} else {
|
||||
ToastUtils.error("获取权限失败")
|
||||
finish()
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
@ -2,6 +2,7 @@ package com.tenlionsoft.aimz_k.page.fragments
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.app.Activity
|
||||
import android.app.ActivityManager
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.os.Bundle
|
||||
@ -16,7 +17,6 @@ import androidx.lifecycle.ViewModelProvider
|
||||
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.model.MsgTypeStateEnum
|
||||
import com.tenlionsoft.aimz_k.page.activity.ChatActivity
|
||||
import com.tenlionsoft.aimz_k.page.activity.MainActivity
|
||||
import com.tenlionsoft.aimz_k.page.activity.SearchChatMsgActivity
|
||||
@ -55,12 +55,11 @@ class MsgFragment : Fragment(), AdapterItemClickListener<MsgCategoryBean>,
|
||||
mMsgBinding.llSearchLayout.llSearchLayout.setOnClickListener {
|
||||
mActivity?.startActivity(Intent(mActivity, SearchChatMsgActivity::class.java))
|
||||
}
|
||||
viewModel =
|
||||
ViewModelProvider(this, object : ViewModelProvider.Factory {
|
||||
override fun <T : ViewModel> create(modelClass: Class<T>): T {
|
||||
return MsgViewModel(mActivity!!.application) as T
|
||||
}
|
||||
})[MsgViewModel::class.java]
|
||||
viewModel = ViewModelProvider(this, object : ViewModelProvider.Factory {
|
||||
override fun <T : ViewModel> create(modelClass: Class<T>): T {
|
||||
return MsgViewModel(mActivity!!.application) as T
|
||||
}
|
||||
})[MsgViewModel::class.java]
|
||||
mMsgBinding.msgViewModel = viewModel
|
||||
mMsgBinding.lifecycleOwner = this
|
||||
viewModel.onItemClickListener = this//条目点击
|
||||
@ -85,7 +84,6 @@ class MsgFragment : Fragment(), AdapterItemClickListener<MsgCategoryBean>,
|
||||
if (it) {
|
||||
mMsgBinding.llSearchLayout.tvSocketStatus.text = "登陆中..."
|
||||
mMsgBinding.llSearchLayout.pbSocketLoading.visibility = View.VISIBLE
|
||||
toStartService()
|
||||
} else {
|
||||
mMsgBinding.llSearchLayout.tvSocketStatus.visibility = View.GONE
|
||||
mMsgBinding.llSearchLayout.pbSocketLoading.visibility = View.GONE
|
||||
@ -119,20 +117,39 @@ class MsgFragment : Fragment(), AdapterItemClickListener<MsgCategoryBean>,
|
||||
private fun toStartService() {
|
||||
//判断是否允许
|
||||
val isRunning =
|
||||
AppUtils.isRunningService(mActivity!!, mActivity!!.packageName + ":tenlion_socket")
|
||||
Log.e("MsgFragment", "toStartService:${isRunning}")
|
||||
if (!isRunning) {
|
||||
mActivity?.startService(Intent(mActivity!!, SocketService::class.java))
|
||||
} else {
|
||||
AppUtils.isRunningService(mActivity!!, mActivity!!.packageName + ":tenlion_msg")
|
||||
if (isRunning) {
|
||||
mActivity?.sendBroadcast(Intent(ProjectConfig.A_S_RE_LOGIN))
|
||||
} else {
|
||||
mActivity?.startService(Intent(mActivity!!, SocketService::class.java))
|
||||
}
|
||||
}
|
||||
|
||||
private fun isRunning(): Boolean {
|
||||
val manager = mActivity?.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
|
||||
val list: List<ActivityManager.RunningServiceInfo> =
|
||||
manager.getRunningServices(Integer.MAX_VALUE)
|
||||
Log.e("MsgFragment", "isRunning:${list}")
|
||||
if (list.isEmpty()) return false
|
||||
for (info in list) {
|
||||
Log.e("MsgFragment", "isRunning:${info}")
|
||||
if ("com.tenlionsoft.aimz_k.services.SocketService" == info.javaClass.name) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
override fun onResume() {
|
||||
super.onResume()
|
||||
viewModel.refresh()
|
||||
}
|
||||
|
||||
override fun onStart() {
|
||||
super.onStart()
|
||||
toStartService()
|
||||
}
|
||||
|
||||
/**
|
||||
* 条目点击
|
||||
*/
|
||||
@ -169,10 +186,8 @@ class MsgFragment : Fragment(), AdapterItemClickListener<MsgCategoryBean>,
|
||||
//更新消息
|
||||
@SuppressLint("CheckResult")
|
||||
override fun updateInfo() {
|
||||
Observable.timer(1000, TimeUnit.MILLISECONDS)
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe {
|
||||
Observable.timer(1000, TimeUnit.MILLISECONDS).subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread()).subscribe {
|
||||
viewModel.refresh()
|
||||
}
|
||||
|
||||
|
@ -89,7 +89,7 @@ class SocketService : Service(), WsManager.MsgCallBack {
|
||||
this.startSocket() //开启Socket
|
||||
mMediaPlayer = MediaPlayer.create(this, com.tenlionsoft.baselib.R.raw.chat)
|
||||
registerLocalReceiver()
|
||||
return START_REDELIVER_INTENT
|
||||
return START_STICKY
|
||||
}
|
||||
|
||||
|
||||
@ -145,8 +145,6 @@ class SocketService : Service(), WsManager.MsgCallBack {
|
||||
//发送消息
|
||||
inner class LocalReceiver : BroadcastReceiver() {
|
||||
override fun onReceive(context: Context?, intent: Intent?) {
|
||||
// val isConnect = AppUtils?.isNetworkConnected(context)
|
||||
// if (true == isConnect) {
|
||||
when (intent?.action) {
|
||||
//发送消息
|
||||
ProjectConfig.A_S_MSG_SEND -> {
|
||||
@ -161,35 +159,31 @@ class SocketService : Service(), WsManager.MsgCallBack {
|
||||
}
|
||||
//重新连接
|
||||
ProjectConfig.A_S_RE_LOGIN -> {
|
||||
stopSocket()
|
||||
startSocket()
|
||||
if (mWsManager == null) {
|
||||
stopSocket()
|
||||
startSocket()
|
||||
} else {
|
||||
val isConnect = mWsManager!!.isWsConnected()
|
||||
if (!isConnect) {
|
||||
stopSocket()
|
||||
startSocket()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// } else {
|
||||
// ToastUtils.error("请检查网络")
|
||||
// }
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
//定时处理消息
|
||||
private fun subscribeMsgChange() {
|
||||
mDispose = Observable.interval(1500, TimeUnit.MILLISECONDS).subscribeOn(Schedulers.io())
|
||||
mDispose = Observable.interval(2000, TimeUnit.MILLISECONDS).subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread()).subscribe {
|
||||
if (msgObserver.isNotEmpty()) {
|
||||
if (msgObserver.size > 1) {
|
||||
if (!msgObserver.toString().contains("STATUS")) {
|
||||
mMediaPlayer.start()
|
||||
}
|
||||
receiveMsgMulti(msgObserver)
|
||||
} else {
|
||||
if (!msgObserver[0].contains("STATUS")) {
|
||||
mMediaPlayer.start()
|
||||
}
|
||||
receiveMsgSingle(msgObserver[0])
|
||||
if (!msgObserver.toString().contains("STATUS")) {
|
||||
mMediaPlayer.start()
|
||||
}
|
||||
msgObserver.clear()
|
||||
receiveMsgMulti(msgObserver)
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -202,34 +196,59 @@ class SocketService : Service(), WsManager.MsgCallBack {
|
||||
Log.e("SocketService", "发送消息:${msg}")
|
||||
mWsManager?.sendMessage(msg)
|
||||
val msgBean = insertMsgBeanToDb(msgConvertBean)
|
||||
// val isExist = userMap.any { it.key == msgBean.receiverId }
|
||||
// if (isExist) {
|
||||
// val userInfoBean = userMap[msgBean.receiverId]
|
||||
// Log.e("SocketService", "已经存在${userInfoBean}")
|
||||
// withContext(Dispatchers.IO) {
|
||||
// //更新数据库
|
||||
// cDao.updateInByMsgId(
|
||||
// userInfoBean!!.nickname,
|
||||
// userInfoBean.avatar,
|
||||
// msgBean.messageId!!,
|
||||
// SpUtils.getId()
|
||||
// )
|
||||
// msgDao.updateUserInfoByMessageId(
|
||||
// sAvatar = SpUtils.getAvatar(),
|
||||
// sNickName = SpUtils.getNickName(),
|
||||
// rAvatar = userInfoBean.avatar,
|
||||
// rNickName = userInfoBean.nickname,
|
||||
// userInfoBean.nickname,
|
||||
// userInfoBean.avatar,
|
||||
// msgBean.messageId!!,
|
||||
// SpUtils.getId()
|
||||
// )
|
||||
// }
|
||||
// } else {
|
||||
// getUserInfo(
|
||||
// msgBean.messageId!!, msgBean.receiverId!!, 23, ProjectConfig.MSG_SINGLE
|
||||
// )
|
||||
// }
|
||||
disposeUserInfo(msgBean)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//处理用户信息
|
||||
private suspend fun disposeUserInfo(msgBean: MsgBean) {
|
||||
withContext(Dispatchers.IO) {
|
||||
val isExist = userMap.any { it.key == msgBean.receiverId }
|
||||
if (isExist) {
|
||||
val userInfoBean = userMap[msgBean.receiverId]
|
||||
//更新数据库
|
||||
val lId = SpUtils.getId() //登录人id
|
||||
val msgId = msgBean.messageId!!
|
||||
val nickName = userInfoBean!!.nickname //接收人
|
||||
val avatar = userInfoBean.avatar //接收人
|
||||
cDao.updateInByMsgId(nickName, avatar, msgId, lId)
|
||||
val sNickName = SpUtils.getNickName()
|
||||
val sAvatar = SpUtils.getAvatar()
|
||||
val line = cDao.updateInByMsgId(nickName, avatar, msgId, lId)
|
||||
val m = msgDao.updateUserInfoByMessageId(
|
||||
sAvatar, sNickName, avatar, nickName, msgId, lId
|
||||
)
|
||||
Log.e("SocketService", "更新头像:本地获取 MSG=${m}===Category:${line}")
|
||||
} else {
|
||||
val userBean = doGetUserInfo(msgBean.messageId!!, msgBean.receiverId!!)
|
||||
if (userBean != null) {
|
||||
userMap[msgBean.receiverId!!] = userBean
|
||||
//更新数据库
|
||||
val lId = SpUtils.getId()
|
||||
val msgId = msgBean.messageId!!
|
||||
val nickName = userBean.nickname //接收人
|
||||
val avatar = userBean.avatar //接收人
|
||||
val sNickName = SpUtils.getNickName()
|
||||
val sAvatar = SpUtils.getAvatar()
|
||||
val line = cDao.updateInByMsgId(nickName, avatar, msgId, lId)
|
||||
val m = msgDao.updateUserInfoByMessageId(
|
||||
sAvatar, sNickName, avatar, nickName, msgId, lId
|
||||
)
|
||||
Log.e("SocketService", "更新头像:网络获取MSG=${m}===Category:${line}")
|
||||
} else {
|
||||
val lId = SpUtils.getId()
|
||||
val msgId = msgBean.messageId!!
|
||||
val nickName = "" //接收人
|
||||
val avatar = "" //接收人
|
||||
val sNickName = SpUtils.getNickName()
|
||||
val sAvatar = SpUtils.getAvatar()
|
||||
val line = cDao.updateInByMsgId(nickName, avatar, msgId, lId)
|
||||
val m = msgDao.updateUserInfoByMessageId(
|
||||
sAvatar, sNickName, avatar, nickName, msgId, lId
|
||||
)
|
||||
Log.e("SocketService", "更新头像:网络中未获取到=${m}===Category:${line}")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -253,88 +272,71 @@ class SocketService : Service(), WsManager.MsgCallBack {
|
||||
}
|
||||
}
|
||||
|
||||
//收到单条消息
|
||||
private fun receiveMsgSingle(msgBean: String) {
|
||||
Log.e("SocketService", "单条信息:${msgBean}")
|
||||
mainScope.launch {
|
||||
val bean = ConvertBeanUtils.covertBean(msgBean)
|
||||
withContext(Dispatchers.IO) {
|
||||
when (bean) {
|
||||
//状态
|
||||
is CoverSealedBean.StateBean -> {
|
||||
val statusType =
|
||||
mGson.fromJson(bean.data.body, BodyContent::class.java).statusType!!
|
||||
val mId = bean.data.messageId
|
||||
val uId = SpUtils.getId()
|
||||
val line = msgDao.updateStatus(mId, statusType, uId)
|
||||
val id = cDao.updateStatByMessageId(
|
||||
statusType, mId, uId
|
||||
)
|
||||
sendStatusBroadcast(bean.data.messageId, statusType)
|
||||
}
|
||||
//消息
|
||||
is CoverSealedBean.Msg -> {
|
||||
val uId = SpUtils.getId()
|
||||
val rId = bean.msgBean.receiverId
|
||||
val sId = bean.msgBean.senderId
|
||||
val line = msgDao.insertMsg(bean.msgBean)
|
||||
val l = cDao.updateOrInsert(
|
||||
uId, rId!!, sId!!, bean.msgBean
|
||||
)
|
||||
Log.e(
|
||||
"SocketService",
|
||||
"receiveMsgSingle:登录人:$uId \n接收人:$rId\n发送人:$sId\n插入消息库:$line\n更新或者类型库:$l"
|
||||
)
|
||||
//发送接收成功消息
|
||||
sendSuccessMsg(bean.msgBean)
|
||||
//判断是否存在
|
||||
// val isExist = userMap.any { it.key == bean.msgBean.receiverId }
|
||||
// if (isExist) {
|
||||
// val userInfoBean = userMap[bean.msgBean.receiverId]
|
||||
// Log.e("SocketService", "已经存在${userInfoBean}")
|
||||
// withContext(Dispatchers.IO) {
|
||||
// //更新数据库
|
||||
// cDao.updateInByMsgId(
|
||||
// userInfoBean!!.nickname,
|
||||
// userInfoBean.avatar,
|
||||
// bean.msgBean.messageId!!,
|
||||
// SpUtils.getId()
|
||||
// )
|
||||
// msgDao.updateUserInfoByMessageId(
|
||||
// sAvatar = userInfoBean.avatar,
|
||||
// sNickName = userInfoBean.nickname,
|
||||
// rAvatar = SpUtils.getAvatar(),
|
||||
// rNickName = SpUtils.getNickName(),
|
||||
// userInfoBean.nickname,
|
||||
// userInfoBean.avatar,
|
||||
// bean.msgBean.messageId!!,
|
||||
// SpUtils.getId()
|
||||
// )
|
||||
// }
|
||||
// } else {
|
||||
// getUserInfo(
|
||||
// bean.msgBean.messageId!!,
|
||||
// bean.msgBean.receiverId!!,
|
||||
// 23,
|
||||
// ProjectConfig.MSG_SINGLE
|
||||
// )
|
||||
// }
|
||||
}
|
||||
}
|
||||
}
|
||||
sendRefresh()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//收到多条消息
|
||||
private fun receiveMsgMulti(msgList: ArrayList<String>) {
|
||||
Log.e("SocketService", "多条信息:${msgList}")
|
||||
msgList.forEach { str ->
|
||||
receiveMsgSingle(str)
|
||||
mainScope.launch {
|
||||
withContext(Dispatchers.IO) {
|
||||
//转化
|
||||
val temList = arrayListOf<CoverSealedBean>()
|
||||
for (item in msgList) {
|
||||
val bean = ConvertBeanUtils.covertBean(item)
|
||||
temList.add(bean)
|
||||
}
|
||||
//清空消息队列
|
||||
msgObserver.clear()
|
||||
disposeMsg(temList)
|
||||
sendRefresh()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//处理消息
|
||||
private suspend fun disposeMsg(list: ArrayList<CoverSealedBean>) {
|
||||
Log.e("SocketService", "处理消息${list}")
|
||||
for (bean in list) {
|
||||
Log.e("SocketService", "处理消息中:${bean}")
|
||||
when (bean) {
|
||||
is CoverSealedBean.StateBean -> {
|
||||
val statusType =
|
||||
mGson.fromJson(bean.data.body, BodyContent::class.java).statusType!!
|
||||
val mId = bean.data.messageId
|
||||
val uId = SpUtils.getId()
|
||||
val line = msgDao.updateStatus(mId, statusType, uId)
|
||||
val id = cDao.updateStatByMessageId(statusType, mId, uId)
|
||||
sendStatusBroadcast(bean.data.messageId, statusType)
|
||||
}
|
||||
|
||||
is CoverSealedBean.Msg -> {
|
||||
val uId = SpUtils.getId()
|
||||
val rId = bean.msgBean.receiverId
|
||||
val sId = bean.msgBean.senderId
|
||||
val line = msgDao.insertMsg(bean.msgBean)
|
||||
val l = cDao.updateOrInsert(uId, rId!!, sId!!, bean.msgBean)
|
||||
Log.e(
|
||||
"SocketService",
|
||||
"receiveMsgSingle:登录人:$uId \n接收人:$rId\n发送人:$sId\n插入消息库:$line\n更新或者类型库:$l"
|
||||
)
|
||||
//发送接收成功消息
|
||||
sendSuccessMsg(bean.msgBean)
|
||||
//处理用户信息
|
||||
disposeUserInfo(bean.msgBean)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//获取用户信息
|
||||
private suspend fun doGetUserInfo(msgId: String, userId: String): UserInfoBean? {
|
||||
try {
|
||||
val bean = retrofitClient.makeApiCall {
|
||||
baseApi.getUserInfo(userId)
|
||||
}
|
||||
return bean
|
||||
} catch (e: Exception) {
|
||||
return null
|
||||
}
|
||||
}
|
||||
|
||||
//发送消息状态
|
||||
private fun sendSuccessMsg(msgBean: MsgBean) {
|
||||
|
@ -46,7 +46,7 @@ class WsManager private constructor(val builder: Builder) : IWsManager {
|
||||
if (reconnectCount < 10) {
|
||||
//重新连接
|
||||
val intent = Intent()
|
||||
// intent.setAction(PathConfig.ACTION_SOCKET_RELINK)
|
||||
intent.setAction(ProjectConfig.A_S_RE_LOGIN)
|
||||
mContext.sendBroadcast(intent)
|
||||
}
|
||||
}
|
||||
@ -167,6 +167,7 @@ class WsManager private constructor(val builder: Builder) : IWsManager {
|
||||
}
|
||||
|
||||
private fun tryReconnect() {
|
||||
Log.e("WsManager", "tryReconnect:重新连接${isNeedReconnect} ${isManualClose}")
|
||||
if (!isNeedReconnect or isManualClose) {
|
||||
return
|
||||
}
|
||||
|
@ -20,7 +20,7 @@ import okhttp3.RequestBody.Companion.toRequestBody
|
||||
|
||||
|
||||
class LoginPageViewModel : BaseViewModel() {
|
||||
var userName: String = "zs"
|
||||
var userName: String = "yyy"
|
||||
var userPwd: String = "123456"
|
||||
val isLoginSuccess = MutableLiveData<Boolean>()
|
||||
private val gson = Gson()
|
||||
|
@ -69,7 +69,7 @@ object BindingUtils {
|
||||
} else {
|
||||
val requestOptions = RequestOptions.bitmapTransform(RoundedCornersTransformation(10, 0))
|
||||
.error(R.drawable.ic_user_default).placeholder(R.drawable.ic_user_default)
|
||||
.skipMemoryCache(false).diskCacheStrategy(DiskCacheStrategy.RESOURCE)
|
||||
.skipMemoryCache(true).diskCacheStrategy(DiskCacheStrategy.NONE)
|
||||
Glide.with(imageView.context).load(url).apply(requestOptions).into(imageView)
|
||||
}
|
||||
}
|
||||
@ -84,7 +84,7 @@ object BindingUtils {
|
||||
} else {
|
||||
val requestOptions = RequestOptions.bitmapTransform(RoundedCornersTransformation(10, 0))
|
||||
.error(R.drawable.ic_user_default).placeholder(R.drawable.ic_user_default)
|
||||
.skipMemoryCache(false).diskCacheStrategy(DiskCacheStrategy.RESOURCE)
|
||||
.skipMemoryCache(false).diskCacheStrategy(DiskCacheStrategy.NONE)
|
||||
val split = url.split(":")
|
||||
Glide.with(imageView.context).load(NetConfig.FILE_DOWNLOAD_URL + split[0])
|
||||
.apply(requestOptions).into(imageView)
|
||||
@ -123,7 +123,7 @@ object BindingUtils {
|
||||
} else {
|
||||
val requestOptions = RequestOptions.bitmapTransform(RoundedCornersTransformation(10, 0))
|
||||
.error(R.drawable.ic_user_default).placeholder(R.drawable.ic_user_default)
|
||||
.skipMemoryCache(false).diskCacheStrategy(DiskCacheStrategy.RESOURCE)
|
||||
.skipMemoryCache(true).diskCacheStrategy(DiskCacheStrategy.NONE)
|
||||
val split = bean.avatar?.split(":")
|
||||
if (split != null) {
|
||||
Glide.with(iv.context).load(NetConfig.FILE_DOWNLOAD_URL + (split[0]))
|
||||
@ -140,21 +140,25 @@ object BindingUtils {
|
||||
} else {
|
||||
val requestOptions = RequestOptions.bitmapTransform(RoundedCornersTransformation(10, 0))
|
||||
.error(R.drawable.ic_user_default).placeholder(R.drawable.ic_user_default)
|
||||
.skipMemoryCache(false).diskCacheStrategy(DiskCacheStrategy.RESOURCE)
|
||||
.skipMemoryCache(true).diskCacheStrategy(DiskCacheStrategy.NONE)
|
||||
when (bean.msgType) {
|
||||
MsgTypeStateEnum.MSG_TO_OTHER_TXT, MsgTypeStateEnum.MSG_TO_OTHER_MOVIE, MsgTypeStateEnum.MSG_TO_OTHER_IMG, MsgTypeStateEnum.MSG_TO_OTHER_FILE -> {
|
||||
val split = bean.senderAvatar?.split(":")
|
||||
if (split != null) {
|
||||
Glide.with(iv.context).load(NetConfig.FILE_DOWNLOAD_URL + (split[0]))
|
||||
.apply(requestOptions).into(iv)
|
||||
} else {
|
||||
iv.setImageResource(R.drawable.ic_user_default)
|
||||
}
|
||||
}
|
||||
|
||||
MsgTypeStateEnum.MSG_FROM_OTHER_TXT, MsgTypeStateEnum.MSG_FROM_OTHER_MOVIE, MsgTypeStateEnum.MSG_FROM_OTHER_IMG, MsgTypeStateEnum.MSG_FROM_OTHER_FILE -> {
|
||||
val split = bean.senderAvatar?.split(":")
|
||||
val split = bean.receiverAvatar?.split(":")
|
||||
if (split != null) {
|
||||
Glide.with(iv.context).load(NetConfig.FILE_DOWNLOAD_URL + split[0])
|
||||
.apply(requestOptions).into(iv)
|
||||
} else {
|
||||
iv.setImageResource(R.drawable.ic_user_default)
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -178,7 +182,6 @@ object BindingUtils {
|
||||
val suffix = fileDataBean.fileName!!.substring(
|
||||
fileDataBean.fileName!!.lastIndexOf("."), fileDataBean.fileName!!.length
|
||||
)
|
||||
Log.e("BindingUtils", "jsonConvertFileIcon: $suffix")
|
||||
var id = R.drawable.ic_audio
|
||||
when (suffix) {
|
||||
".zip", ".rar", ".7z", ".gz", ".xz" -> iv.setImageResource(R.drawable.ic_zip)
|
||||
@ -224,8 +227,8 @@ object BindingUtils {
|
||||
|
||||
val options = RequestOptions.bitmapTransform(RoundedCornersTransformation(10, 0))
|
||||
.error(com.tenlionsoft.baselib.R.drawable.ic_img_load_err)
|
||||
.placeholder(com.tenlionsoft.baselib.R.drawable.ic_loading).skipMemoryCache(false)
|
||||
.diskCacheStrategy(DiskCacheStrategy.RESOURCE)
|
||||
.placeholder(com.tenlionsoft.baselib.R.drawable.ic_loading).skipMemoryCache(true)
|
||||
.diskCacheStrategy(DiskCacheStrategy.NONE)
|
||||
val gson = Gson()
|
||||
val bodyContent = gson.fromJson<BodyContent>(str, BodyContent::class.java)
|
||||
|
||||
@ -264,7 +267,7 @@ object BindingUtils {
|
||||
val fileData = gson.fromJson(body.content, FileDataBean::class.java)
|
||||
val requestOptions = RequestOptions()
|
||||
.error(R.drawable.app_logo_small).placeholder(R.drawable.app_logo_small)
|
||||
.skipMemoryCache(false).diskCacheStrategy(DiskCacheStrategy.RESOURCE)
|
||||
.skipMemoryCache(true).diskCacheStrategy(DiskCacheStrategy.NONE)
|
||||
|
||||
Glide.with(view.context).load(NetConfig.MAIN_URL + fileData.fileUrl)
|
||||
.apply(requestOptions).into(view)
|
||||
|
@ -73,14 +73,14 @@
|
||||
<com.scwang.smart.refresh.layout.SmartRefreshLayout
|
||||
android:id="@+id/srl_content"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
android:layout_height="match_parent"
|
||||
android:background="@color/white">
|
||||
|
||||
<androidx.recyclerview.widget.RecyclerView
|
||||
android:id="@+id/rlv_content"
|
||||
setLinearLayoutAdapter="@{model.adapter}"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
tools:listitem="@layout/item_contact_search" />
|
||||
android:layout_height="match_parent" />
|
||||
</com.scwang.smart.refresh.layout.SmartRefreshLayout>
|
||||
|
||||
</LinearLayout>
|
||||
|
@ -1,6 +1,7 @@
|
||||
package com.tenlionsoft.baselib.utils
|
||||
|
||||
import android.content.Context
|
||||
import android.os.Environment
|
||||
import android.util.Log
|
||||
import java.io.File
|
||||
|
||||
@ -28,7 +29,7 @@ class StorageUtils {
|
||||
Log.w(
|
||||
"StorageUtils",
|
||||
"Can't define system cache directory! The app should be re-installed."
|
||||
)
|
||||
)
|
||||
}
|
||||
return appCacheDir
|
||||
}
|
||||
@ -43,7 +44,7 @@ class StorageUtils {
|
||||
Log.w(
|
||||
"StorageUtils",
|
||||
"Can't define system cache directory! The app should be re-installed."
|
||||
)
|
||||
)
|
||||
}
|
||||
return appCacheDir
|
||||
}
|
||||
@ -53,7 +54,9 @@ class StorageUtils {
|
||||
* apk下载路径为:SDCard/Android/data/com.winfo.update/cache/update_file/
|
||||
*/
|
||||
fun getExternalCacheCustomDir(context: Context): File? {
|
||||
val appCacheDir = File(context.externalCacheDir, "download_cache")
|
||||
val absolutePath =
|
||||
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).absolutePath
|
||||
val appCacheDir = File(absolutePath, "download_cache")
|
||||
return if (!appCacheDir.exists()) {
|
||||
if (appCacheDir.mkdirs()) {
|
||||
appCacheDir
|
||||
|
Loading…
Reference in New Issue
Block a user