根据id获取聊天对象的昵称和头像

This commit is contained in:
itgaojian163 2024-11-15 15:09:35 +08:00
parent 18ecb7a11d
commit 7a533c126c
14 changed files with 251 additions and 194 deletions

View File

@ -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>

View File

@ -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

View File

@ -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
}

View File

@ -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
/**
* 搜索聊天内容

View File

@ -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
?: "下载失败,请稍后重试"

View File

@ -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)
}

View File

@ -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()
}
}
})
}
}

View File

@ -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()
}

View File

@ -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) {

View File

@ -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
}

View File

@ -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()

View File

@ -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)

View File

@ -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>

View File

@ -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