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