diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 5681bf6..a2e4782 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -23,7 +23,10 @@ android { buildTypes { release { isMinifyEnabled = false - proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) } } compileOptions { @@ -51,6 +54,7 @@ dependencies { implementation(project(":baselib")) implementation(project(":medialib")) + implementation(libs.androidx.core.ktx) implementation(libs.androidx.lifecycle.runtime.ktx) implementation(libs.androidx.activity.compose) diff --git a/app/src/main/java/com/tenlionsoft/aimz_k/model/MsgBean.kt b/app/src/main/java/com/tenlionsoft/aimz_k/model/MsgBean.kt index d449827..7965824 100644 --- a/app/src/main/java/com/tenlionsoft/aimz_k/model/MsgBean.kt +++ b/app/src/main/java/com/tenlionsoft/aimz_k/model/MsgBean.kt @@ -2,11 +2,12 @@ package com.tenlionsoft.aimz_k.model import androidx.room.ColumnInfo import androidx.room.Entity +import androidx.room.Index import androidx.room.PrimaryKey import java.io.Serializable -@Entity(tableName = "db_msg") +@Entity(tableName = "db_msg", indices = [Index(value = ["loginUserId", "timestamp"])]) data class MsgBean( @PrimaryKey(autoGenerate = true) var id: Long = 0, diff --git a/app/src/main/java/com/tenlionsoft/aimz_k/model/MsgCategoryBean.kt b/app/src/main/java/com/tenlionsoft/aimz_k/model/MsgCategoryBean.kt index c3bacc7..afa451d 100644 --- a/app/src/main/java/com/tenlionsoft/aimz_k/model/MsgCategoryBean.kt +++ b/app/src/main/java/com/tenlionsoft/aimz_k/model/MsgCategoryBean.kt @@ -2,10 +2,11 @@ package com.tenlionsoft.aimz_k.model import androidx.room.ColumnInfo import androidx.room.Entity +import androidx.room.Index import androidx.room.PrimaryKey import java.io.Serializable -@Entity(tableName = "db_category") +@Entity(tableName = "db_category", indices = [Index(value = ["loginUserId", "timestamp"])]) data class MsgCategoryBean( @PrimaryKey(autoGenerate = true) var id: Long = 0, diff --git a/app/src/main/java/com/tenlionsoft/aimz_k/page/activity/LoginActivity.kt b/app/src/main/java/com/tenlionsoft/aimz_k/page/activity/LoginActivity.kt index 700b860..df48b27 100644 --- a/app/src/main/java/com/tenlionsoft/aimz_k/page/activity/LoginActivity.kt +++ b/app/src/main/java/com/tenlionsoft/aimz_k/page/activity/LoginActivity.kt @@ -19,7 +19,7 @@ class LoginActivity : BaseActivity() { override fun bindView() { mBinding = DataBindingUtil.setContentView(this, R.layout.activity_login) - mBinding.loginModel = loginPageViewModel; + mBinding.loginModel = loginPageViewModel mBinding.lifecycleOwner = this loginPageViewModel.showLoadDialog.observe(this) { if (it) { @@ -30,12 +30,12 @@ class LoginActivity : BaseActivity() { .setMessage("登陆中...") .create() mLoading!!.show() - mBinding.btnLogin.isEnabled = false; + mBinding.btnLogin.isEnabled = false } else { //隐藏loading mLoading?.dismiss() mLoading = null - mBinding.btnLogin.isEnabled = true; + mBinding.btnLogin.isEnabled = true } } loginPageViewModel.isLoginSuccess.observe(this) { diff --git a/app/src/main/java/com/tenlionsoft/aimz_k/page/activity/MainActivity.kt b/app/src/main/java/com/tenlionsoft/aimz_k/page/activity/MainActivity.kt index 728048d..636bb70 100644 --- a/app/src/main/java/com/tenlionsoft/aimz_k/page/activity/MainActivity.kt +++ b/app/src/main/java/com/tenlionsoft/aimz_k/page/activity/MainActivity.kt @@ -29,6 +29,7 @@ import com.tenlionsoft.baselib.utils.LogUtils import com.tenlionsoft.baselib.utils.ToastUtils import com.tenlionsoft.baselib.widget.CenterProgressUpdateView import com.tenlionsoft.baselib.widget.FadePageTransformer +import pl.com.salsoft.sqlitestudioremote.SQLiteStudioService import java.io.File /** @@ -170,8 +171,6 @@ class MainActivity : BaseActivity() { } - - fun setOnSocketListener(onSocketConnectListener: OnSocketConnectListener) { this.onSocketConnectListener = onSocketConnectListener } diff --git a/app/src/main/java/com/tenlionsoft/aimz_k/page/activity/SplashActivity.kt b/app/src/main/java/com/tenlionsoft/aimz_k/page/activity/SplashActivity.kt index d4a8c40..5c6c962 100644 --- a/app/src/main/java/com/tenlionsoft/aimz_k/page/activity/SplashActivity.kt +++ b/app/src/main/java/com/tenlionsoft/aimz_k/page/activity/SplashActivity.kt @@ -9,6 +9,7 @@ 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.aimz_k.model.ReplyBean import com.tenlionsoft.baselib.base.BaseActivity import com.tenlionsoft.baselib.utils.SpUtils import com.tenlionsoft.baselib.utils.ToastUtils @@ -36,8 +37,31 @@ class SplashActivity : BaseActivity() { withContext(Dispatchers.IO) { val msgDao = DbManager.db.msgDao() val cDao = DbManager.db.categoryDao() + val rDao = DbManager.db.replayDao() + msgDao.queryContent("", SpUtils.getId()) cDao.getAllCategory() + if (rDao.getAllReply().size <= 0) { + val replayList = arrayListOf( + ReplyBean( + content = "您好,很高兴为您服务!请问有什么可以帮到您的呢?", + remark = "" + ), + ReplyBean( + content = "感谢您的咨询,希望我的回答对您有所帮助,祝您生活愉快!", + remark = "" + ), + ReplyBean( + content = "希望您每天都有好心情,拜拜!", + remark = "" + ), + ReplyBean( + content = "请参考操作手册.", + remark = "" + ) + ) + rDao.insertAll(replayList) + } } Timer().schedule(object : TimerTask() { override fun run() { @@ -52,7 +76,7 @@ class SplashActivity : BaseActivity() { }, 500) } } else { - ToastUtils.error("你为授权管理文件权限,无法使用软件") + ToastUtils.error("你未授权管理文件权限,无法使用软件") } } diff --git a/app/src/main/java/com/tenlionsoft/aimz_k/services/SocketService.kt b/app/src/main/java/com/tenlionsoft/aimz_k/services/SocketService.kt index e8fe213..4be3193 100644 --- a/app/src/main/java/com/tenlionsoft/aimz_k/services/SocketService.kt +++ b/app/src/main/java/com/tenlionsoft/aimz_k/services/SocketService.kt @@ -205,6 +205,7 @@ class SocketService : Service(), WsManager.MsgCallBack { private suspend fun disposeUserInfo(msgBean: MsgBean) { withContext(Dispatchers.IO) { val isExist = userMap.any { it.key == msgBean.receiverId } + // val isExist = userMap.contactsKey(msgBean.receiverId) if (isExist) { val userInfoBean = userMap[msgBean.receiverId] //更新数据库 @@ -253,6 +254,44 @@ class SocketService : Service(), WsManager.MsgCallBack { } } + private suspend fun disposeUser(msgBean: MsgBean){ + val lId = SpUtils.getId() // 登录人id + val msgId = msgBean.messageId!! + val sNickName = SpUtils.getNickName() + val sAvatar = SpUtils.getAvatar() + val userInfo = when { + userMap.containsKey(msgBean.receiverId) -> { + // 从缓存获取用户信息 + userMap[msgBean.receiverId] + } + else -> { + // 从网络获取用户信息并缓存 + val userBean = doGetUserInfo(msgId, msgBean.receiverId!!) + if (userBean != null) { + userMap[msgBean.receiverId!!] = userBean + } + userBean + } + } + + // 更新数据库 + val nickName = userInfo?.nickname ?: "" + val avatar = userInfo?.avatar ?: "" + + val categoryLine = cDao.updateInByMsgId(nickName, avatar, msgId, lId) + val msgLine = msgDao.updateUserInfoByMessageId( + sAvatar, sNickName, avatar, nickName, msgId, lId + ) + + val source = if (userInfo != null) { + if (userMap.containsKey(msgBean.receiverId)) "本地获取" else "网络获取" + } else { + "网络中未获取到" + } + + Log.e("SocketService", "更新头像:${source} MSG=${msgLine}===Category:${categoryLine}") + } + private fun sendRefresh() { Log.e("SocketService", "sendRefresh:通知页面刷新") val intent = Intent(ProjectConfig.A_S_UPDATE_INFO) diff --git a/app/src/main/java/com/tenlionsoft/aimz_k/viewmodel/LoginPageViewModel.kt b/app/src/main/java/com/tenlionsoft/aimz_k/viewmodel/LoginPageViewModel.kt index d00ecd6..7d0552f 100644 --- a/app/src/main/java/com/tenlionsoft/aimz_k/viewmodel/LoginPageViewModel.kt +++ b/app/src/main/java/com/tenlionsoft/aimz_k/viewmodel/LoginPageViewModel.kt @@ -20,15 +20,14 @@ import okhttp3.RequestBody.Companion.toRequestBody class LoginPageViewModel : BaseViewModel() { - var userName: String = "yyy" - var userPwd: String = "123456" + var userName: String = SpUtils.getUserName() + var userPwd: String = SpUtils.getPassword() val isLoginSuccess = MutableLiveData() private val gson = Gson() private val retrofitClient = RetrofitClient.getInstance(App.context) private val userApi = retrofitClient.create(BaseApi::class.java) - fun onUserNameChange(s: CharSequence, start: Int, before: Int, count: Int) { this.userName = s.toString(); } diff --git a/baselib/src/main/java/com/tenlionsoft/baselib/base/BaseActivity.kt b/baselib/src/main/java/com/tenlionsoft/baselib/base/BaseActivity.kt index d350920..9a8f094 100644 --- a/baselib/src/main/java/com/tenlionsoft/baselib/base/BaseActivity.kt +++ b/baselib/src/main/java/com/tenlionsoft/baselib/base/BaseActivity.kt @@ -2,6 +2,8 @@ package com.tenlionsoft.baselib.base import android.content.Context import android.content.Intent +import android.graphics.Color +import android.os.Build import android.view.View import android.view.WindowManager import android.view.inputmethod.InputMethodManager @@ -14,7 +16,7 @@ import kotlin.system.exitProcess abstract class BaseActivity : DataBindingActivity() { - fun reStartApp(){ + fun reStartApp() { SpUtils.removeAll() val broadcast = Intent() broadcast.setAction(ProjectConfig.A_S_LOGOUT) @@ -46,6 +48,50 @@ abstract class BaseActivity : DataBindingActivity() { }, 100) } + fun safeExitApp() { + try { + // Clear all user data + SpUtils.removeAll() + + // Send broadcast to stop services + val broadcast = Intent() + broadcast.action = ProjectConfig.A_S_LOGOUT + sendBroadcast(broadcast) + + // Finish all activities + finishAffinity() + + // Kill the process + android.os.Process.killProcess(android.os.Process.myPid()) + + // Exit the app + exitProcess(0) + } catch (e: Exception) { + e.printStackTrace() + // Fallback to force exit if safe exit fails + exitProcess(1) + } + } + + fun setStatusBarStyle(transparent: Boolean) { + val window = window + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + // Add flag to make status bar drawable + window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS) + if (transparent) { + // Set transparent status bar + window.statusBarColor = Color.TRANSPARENT + // Set dark status bar icons + window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR + } else { + // Set black status bar + window.statusBarColor = Color.BLACK + // Set light status bar icons + window.decorView.systemUiVisibility = 0 + } + } + } + fun setStatusBarColor(dark: Boolean) { val window = window if (dark) {