Files
Inbound20260114/app/src/main/java/com/sw/inbound/activity/HomeActivity.kt
T

179 lines
5.7 KiB
Kotlin
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package com.sw.inbound.activity
import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.view.KeyEvent
import androidx.activity.viewModels
import com.sw.inbound.base.BaseActivity
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
import com.sw.inbound.databinding.ActivityHomeBinding
import com.sw.inbound.dialog.EnvSwitchDialog
import com.sw.inbound.dialog.Loading
import com.sw.inbound.model.response.User
import com.sw.inbound.objbox.FoodModule
import com.sw.inbound.objbox.ObjectBox
import com.sw.inbound.sdk.SensorScaleUtils
import com.sw.inbound.utils.DateTimeUtils
import com.sw.inbound.utils.ThreadUtils
import com.sw.inbound.utils.ext.gone
import com.sw.inbound.utils.ext.startActivity
import com.sw.inbound.utils.ext.toast
import com.sw.inbound.utils.ext.visible
import com.sw.inbound.viewmodel.UserViewModel
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.launch
/**
* 首页 ActivityXML 版本)
* 对应原 HomeScreen.kt Compose 版本,原文件保留不动
* 功能:展示标题栏(含实时时间或用户信息)和两个功能入口(采购单入库、自采入库)
*/
@AndroidEntryPoint
class HomeActivity : BaseActivity() {
private lateinit var binding: ActivityHomeBinding
/** 用于获取用户信息的 ViewModel */
private val viewModel: UserViewModel by viewModels()
/** 每秒刷新当前时间的 Handler */
private val handler = Handler(Looper.getMainLooper())
/** 时间刷新任务,每 1 秒更新一次标题栏右侧时间文字 */
private val timeRunnable = object : Runnable {
override fun run() {
binding.tvTime.text = DateTimeUtils.getChineseDateString()
handler.postDelayed(this, 1000)
}
}
/** 用于检测双击返回键的时间戳 */
private var lastBackPressTime = 0L
private val backPressInterval = 2000L // 2 秒内连续按下返回键视为双击
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityHomeBinding.inflate(layoutInflater)
setContentView(binding.root)
initViews()
observeUser()
SensorScaleUtils.startScale(autoScale = true)
lifecycleScope.launch {
FoodModule.init(this@HomeActivity)
}
}
override fun onDestroy() {
SensorScaleUtils.closeScale()
ThreadUtils.release()
super.onDestroy()
}
/**
* 初始化各控件的点击事件
*/
private fun initViews() {
// 标题点击:跳转菜品采集页面
binding.tvTitle.setOnClickListener {
startActivity<FoodCollectionActivity>()
}
// 时间点击:打开环境切换弹窗
binding.tvTime.setOnClickListener { v ->
EnvSwitchDialog(context = this, onEnvChanged = {
Loading.show(this)
lifecycleScope.launch {
ObjectBox.removeAll()
FoodModule.init(this@HomeActivity)
v.postDelayed({
Loading.dismiss()
toast("服务重置完成")
}, 500)
}
}).show()
}
// 采购单入库入口
binding.ivOrderPurchase.setOnClickListener {
startActivity<PurchaseOrderActivity>()
}
// 自采入库入口,传入非采购单标志
binding.ivOrderSelfProcurement.setOnClickListener {
startActivity<SelfProcurementActivity> {
putExtra(GoodsListActivity.IS_RECEIPT_PAGE, false)
}
}
}
/**
* 观察用户登录状态,动态切换标题栏右侧显示内容:
* - 已登录:显示用户名 + 退出图标
* - 未登录:显示实时时间
*/
private fun observeUser() {
lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.STARTED) {
viewModel.user.collect { user ->
updateUserView(user)
}
}
}
}
/**
* 根据登录状态切换标题栏右侧 UI
* @param user 当前用户信息,为 null 表示未登录
*/
private fun updateUserView(user: User?) {
if (user != null) {
// 已登录:显示用户名和退出图标,隐藏时间
binding.tvTime.gone()
binding.llUserInfo.visible()
binding.tvUserName.text = user.name ?: "用户"
} else {
// 未登录:显示实时时间,隐藏用户信息
binding.llUserInfo.gone()
binding.tvTime.visible()
}
}
override fun onResume() {
super.onResume()
// 页面可见时启动时间刷新
handler.post(timeRunnable)
}
override fun onPause() {
super.onPause()
// 页面不可见时停止刷新,避免内存泄漏
handler.removeCallbacks(timeRunnable)
}
/**
* 处理返回键事件
* 双击返回键退出应用,单击返回键提示再次点击退出
*/
override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
return if (keyCode == KeyEvent.KEYCODE_BACK) {
val currentTime = System.currentTimeMillis()
if (currentTime - lastBackPressTime < backPressInterval) {
// 双击返回键,退出应用
finish()
true
} else {
// 单击返回键,显示提示
lastBackPressTime = currentTime
this.toast("再按一次返回键退出应用")
true
}
} else {
super.onKeyDown(keyCode, event)
}
}
}