feat(environment): 新增环境切换功能及相关优化
- 新增业务环境选择弹窗 EnvironmentSelectDialog,支持本地/测试/生产环境切换 - 实现连点三次屏幕触发环境切换弹窗功能,便于快速切换接口环境 - 切换环境时清空本地人脸库并重置增量同步状态,保证环境切换的完整生效 - 业务全局 BaseUrl 支持从持久化读取,首次无值时默认测试环境 - Retrofit Client 接口 BaseUrl 优化,自动规范尾部斜杠,保证 BaseUrl 合法 - 设备初始化界面增强,增加等待框触摸穿透,优化接口请求失败时的提示信息 - 提升人脸缓存拉取接口分页大小,默认请求 500 条数据 - 修正登录界面布局细节,隐藏密码切换按钮,调整控件顺序及样式细节
This commit is contained in:
@@ -1,17 +1,34 @@
|
||||
package com.sw.platecabinet.activity
|
||||
|
||||
import android.content.Intent
|
||||
import android.os.Handler
|
||||
import android.os.Looper
|
||||
import android.view.MotionEvent
|
||||
import android.view.WindowManager
|
||||
import androidx.lifecycle.lifecycleScope
|
||||
import com.sw.plate.utils.ToastUtils
|
||||
import com.sw.plate.utils.arcface.facedb.FaceDatabase
|
||||
import com.sw.platecabinet.Environment
|
||||
import com.sw.platecabinet.GlobalData
|
||||
import com.sw.platecabinet.dialog.EnvironmentSelectDialog
|
||||
import com.sw.platecabinet.member.databinding.ActivityDeviceInitBinding
|
||||
import com.sw.platecabinet.member.databinding.ItemTitleTimeBinding
|
||||
import com.sw.platecabinet.utils.SpTool
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.withContext
|
||||
import timber.log.Timber
|
||||
|
||||
/**
|
||||
* 设备初始化界面
|
||||
*/
|
||||
class DeviceInitActivity : BaseActivity<ActivityDeviceInitBinding>() {
|
||||
|
||||
// 连点切换环境的计数与复位
|
||||
private var tapCount = 0
|
||||
private val tapHandler = Handler(Looper.getMainLooper())
|
||||
private val resetTapRunnable = Runnable { tapCount = 0 }
|
||||
|
||||
override fun inflateViewBinding(): ActivityDeviceInitBinding {
|
||||
return ActivityDeviceInitBinding.inflate(layoutInflater)
|
||||
}
|
||||
@@ -21,7 +38,8 @@ class DeviceInitActivity : BaseActivity<ActivityDeviceInitBinding>() {
|
||||
}
|
||||
|
||||
override fun initialize() {
|
||||
showWaitingDialog("加载中……")
|
||||
// 等待框设为不拦截触摸,确保连点手势可达
|
||||
showWaitingDialog("加载中……")?.window?.addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE)
|
||||
// 首次启动先全量拉取人脸缓存,后续走增量同步
|
||||
if (SpTool.getFirstGetFace()) {
|
||||
netViewModelV2.getUserFaceCache { status, msg ->
|
||||
@@ -33,6 +51,50 @@ class DeviceInitActivity : BaseActivity<ActivityDeviceInitBinding>() {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 连续点击 3 次(500ms 内)触发环境切换弹窗
|
||||
*/
|
||||
override fun dispatchTouchEvent(ev: MotionEvent): Boolean {
|
||||
if (ev.action == MotionEvent.ACTION_DOWN) {
|
||||
tapCount++
|
||||
tapHandler.removeCallbacks(resetTapRunnable)
|
||||
tapHandler.postDelayed(resetTapRunnable, 500)
|
||||
if (tapCount >= 3) {
|
||||
tapCount = 0
|
||||
tapHandler.removeCallbacks(resetTapRunnable)
|
||||
showEnvironmentDialog()
|
||||
return true
|
||||
}
|
||||
}
|
||||
return super.dispatchTouchEvent(ev)
|
||||
}
|
||||
|
||||
/**
|
||||
* 弹出环境选择弹窗
|
||||
*/
|
||||
private fun showEnvironmentDialog() {
|
||||
EnvironmentSelectDialog(this) { env ->
|
||||
switchEnvironment(env)
|
||||
}.show()
|
||||
}
|
||||
|
||||
/**
|
||||
* 切换环境:持久化 + 清空本地人脸库 + 重置增量同步状态
|
||||
*/
|
||||
private fun switchEnvironment(env: Environment) {
|
||||
SpTool.setBaseUrl(env.url)
|
||||
lifecycleScope.launch(Dispatchers.IO) {
|
||||
val faceDao = FaceDatabase.getInstance(this@DeviceInitActivity).faceDao()
|
||||
faceDao.deleteAll()
|
||||
faceDao.resetId()
|
||||
SpTool.setLastFaceTimestamp(0L)
|
||||
SpTool.setFirstGetFace(true)
|
||||
withContext(Dispatchers.Main) {
|
||||
ToastUtils.showToast("已切换到${env.name},重启后生效")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取设备配置(V2),并初始化虹软 SDK 激活参数
|
||||
*/
|
||||
@@ -41,8 +103,8 @@ class DeviceInitActivity : BaseActivity<ActivityDeviceInitBinding>() {
|
||||
runOnUiThread {
|
||||
if (deviceConfig == null) {
|
||||
hideWaitingDialog()
|
||||
ToastUtils.showToast("获取设备配置数据失败")
|
||||
goLoginActivity()
|
||||
ToastUtils.showToast("获取设备配置失败,请连点屏幕3次切换环境")
|
||||
// goLoginActivity()
|
||||
return@runOnUiThread
|
||||
}
|
||||
GlobalData.appId = deviceConfig.arcsoftAppId ?: ""
|
||||
@@ -56,8 +118,9 @@ class DeviceInitActivity : BaseActivity<ActivityDeviceInitBinding>() {
|
||||
}, onFailure = { errMsg ->
|
||||
runOnUiThread {
|
||||
hideWaitingDialog()
|
||||
ToastUtils.showToast(errMsg ?: "接口异常")
|
||||
goLoginActivity()
|
||||
Timber.e("getDeviceConfig onFailure: $errMsg")
|
||||
ToastUtils.showToast("服务连接失败,请连点屏幕3次切换环境")
|
||||
// goLoginActivity()
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user