package com.sw.dualscreen.activity import android.app.Dialog import android.content.Context import android.os.Bundle import android.text.TextUtils import android.view.View import android.view.WindowManager import android.widget.TextView import androidx.activity.enableEdgeToEdge import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.lifecycleScope import androidx.viewbinding.ViewBinding import com.sw.dualscreen.R import com.sw.dualscreen.model.IActivityResult import com.sw.dualscreen.view.CustomDialog import com.sw.dualscreen.viewmodel.BaseViewModel import kotlinx.coroutines.launch import timber.log.Timber abstract class BaseActivity : AppCompatActivity() { protected lateinit var binding: VB protected lateinit var context: Context private var mDialogWaiting: CustomDialog? = null private lateinit var viewModel: BaseViewModel override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enableEdgeToEdge() context = this //保持亮屏 window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) binding = inflateViewBinding() setContentView(binding.root) viewModel = getViewModel() initialize() registerDataChange() } abstract fun getViewModel(): BaseViewModel protected abstract fun inflateViewBinding(): VB open fun initialize() { } open fun registerDataChange() { lifecycleScope.launch { viewModel.showLoading.collect { Timber.d("registerDataChange 用户 showLoading = $it") if (it) { showWaitingDialog("") } else { hideWaitingDialog() } } } } /** * 显示等待提示框 */ fun showWaitingDialog(tip: String?): Dialog? { hideWaitingDialog() val view = View.inflate(this, R.layout.dialog_waiting, null) if (!TextUtils.isEmpty(tip)) (view.findViewById(R.id.tvTip) as TextView).text = tip mDialogWaiting = CustomDialog(this, view, R.style.MyDialog) mDialogWaiting!!.show() mDialogWaiting!!.setCancelable(true) return mDialogWaiting } /** * 隐藏等待提示框 */ fun hideWaitingDialog() { mDialogWaiting?.dismiss() mDialogWaiting = null } private var launchPermissionCallback: IActivityResult.RequestPermissionCallback? = null fun requestSinglePermissionResult( permission: String, permissionCallback: IActivityResult.RequestPermissionCallback? ) { this.launchPermissionCallback = permissionCallback permissionLauncher.launch(permission) } private val permissionLauncher = registerForActivityResult( ActivityResultContracts.RequestPermission() ) { result: Boolean -> launchPermissionCallback?.callback(result) } }