package com.sw.inbound.activity import android.content.Intent import android.net.Uri import android.os.Bundle import android.os.Handler import android.os.Looper import android.os.SystemClock import android.view.KeyEvent import android.view.animation.RotateAnimation import com.sw.inbound.GlobalData import com.sw.inbound.GlobalKey import com.sw.inbound.base.BaseActivity import com.sw.inbound.databinding.ActivityInitBinding import com.sw.inbound.utils.NetworkUtils import com.sw.inbound.utils.SPUtil /** * 初始化页面 Activity * 用于应用启动时的初始化流程 * - 显示 60 秒倒计时 * - 每 10 秒检测一次网络连接 * - 网络连接成功则跳转到 HomeActivity * - 60 秒后仍未连接则显示"连接网络"按钮 */ class InitActivity : BaseActivity() { private lateinit var binding: ActivityInitBinding private val handler = Handler(Looper.getMainLooper()) private var startTime = 0L // 倒计时开始时间 private var lastNetworkCheckTime = 0L // 上次检测网络的时间 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityInitBinding.inflate(layoutInflater) setContentView(binding.root) initViews() } /** * 初始化控件事件 */ private fun initViews() { // 连接网络按钮点击事件 binding.btnConnectNetwork.setOnClickListener { openNetworkSettings() } // 启动加载动画 - 持续旋转 startLoadingAnimation() } /** * 启动加载动画 - ImageView 持续旋转 */ private fun startLoadingAnimation() { val rotateAnimation = RotateAnimation( 0f, 360f, RotateAnimation.RELATIVE_TO_SELF, 0.5f, RotateAnimation.RELATIVE_TO_SELF, 0.5f ).apply { duration = 1200 // 旋转周期 1.2 秒 repeatCount = RotateAnimation.INFINITE // 无限循环 repeatMode = RotateAnimation.RESTART } binding.ivLoading.startAnimation(rotateAnimation) } override fun onResume() { super.onResume() if (NetworkUtils.isNetworkConnected(this)) { navigateToHome() return } startCountdown() } override fun onPause() { super.onPause() // 页面不可见时停止倒计时 handler.removeCallbacksAndMessages(null) } /** * 启动 60 秒倒计时 */ private fun startCountdown() { startTime = SystemClock.elapsedRealtime() lastNetworkCheckTime = 0 binding.llLoading.visibility = android.view.View.VISIBLE binding.llNetworkButton.visibility = android.view.View.GONE binding.tvCountdown.text = "60秒" scheduleCountdown() } /** * 定时更新倒计时 * 使用 SystemClock.elapsedRealtime() 确保精确计时 */ private fun scheduleCountdown() { handler.postDelayed({ val elapsedTime = SystemClock.elapsedRealtime() - startTime val remainingTime = 60 - (elapsedTime / 1000).toInt() val currentNetworkCheckTime = (elapsedTime / 1000).toInt() // 每 10 秒检测一次网络 if (currentNetworkCheckTime > 0 && currentNetworkCheckTime % 10 == 0 && currentNetworkCheckTime != lastNetworkCheckTime.toInt()) { lastNetworkCheckTime = currentNetworkCheckTime.toLong() checkNetworkConnection() } // 倒计时未结束,继续更新 UI if (remainingTime > 0) { binding.tvCountdown.text = "${remainingTime}秒" scheduleCountdown() } else { // 倒计时结束,最后检测一次网络 if (NetworkUtils.isNetworkConnected(this)) { navigateToHome() } else { // 网络未连接,显示"连接网络"按钮 showNetworkButton() } } }, 100) // 每 100ms 检查一次,确保精确性 } /** * 检测网络连接 */ private fun checkNetworkConnection() { if (NetworkUtils.isNetworkConnected(this)) { // 网络连接成功,停止倒计时并跳转到 HomeActivity handler.removeCallbacksAndMessages(null) navigateToHome() } } /** * 跳转到 HomeActivity */ private fun navigateToHome() { // 优先读取用户手动切换后持久化的 url val savedUrl = SPUtil.getInstance().get(GlobalKey.KEY_BASE_URL, "") if (!savedUrl.isNullOrEmpty()) { GlobalData.appBaseUrl = savedUrl } else { // 未保存过则使用默认逻辑:特定设备走测试环境,其余走 UAT GlobalData.appBaseUrl = GlobalData.PROD_BASE_URL val list = listOf( //"5a41a2cf-3cee-3731-911d-a28b10164f7a", "f0bcabbb-0d58-3b14-8bed-9863b7ec61ef" ) if (list.contains(GlobalData.deviceId)) { GlobalData.appBaseUrl = GlobalData.TEST_BASE_URL } } val intent = Intent(this, HomeActivity::class.java) startActivity(intent) finish() } /** * 显示"连接网络"按钮 */ private fun showNetworkButton() { binding.llLoading.visibility = android.view.View.GONE binding.llNetworkButton.visibility = android.view.View.VISIBLE } /** * 打开系统网络设置页面 */ private fun openNetworkSettings() { val intent = Intent(android.provider.Settings.ACTION_WIFI_SETTINGS) startActivity(intent) } /** * 禁用返回键 */ override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { return if (keyCode == KeyEvent.KEYCODE_BACK) { // 禁用返回键,不执行任何操作 true } else { super.onKeyDown(keyCode, event) } } }