package com.zklh.dronecontroller import android.Manifest import android.content.pm.PackageManager import android.os.Build import android.os.Bundle import android.view.View import android.view.WindowInsets import android.view.WindowInsetsController import android.view.WindowManager import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.core.content.ContextCompat import dji.sampleV5.aircraft.models.MSDKManagerVM import dji.sampleV5.aircraft.models.globalViewModels import dji.v5.common.register.DJISDKInitEvent import com.zklh.dronecontroller.core.msdk.DroneSdkManager import com.zklh.dronecontroller.ui.DroneControllerScreen import com.zklh.dronecontroller.ui.ZklhDroneTheme class MainActivity : ComponentActivity() { private val msdkManagerVM: MSDKManagerVM by globalViewModels() private val permissionLauncher = registerForActivityResult( ActivityResultContracts.RequestMultiplePermissions() ) { DroneSdkManager.initMobileSdk(application) } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) observeOfficialMsdkManager() enterImmersiveMode() requestRuntimePermissions() setContent { ZklhDroneTheme { DroneControllerScreen() } } } private fun observeOfficialMsdkManager() { msdkManagerVM.lvInitProcess.observe(this) { (event, totalProcess) -> DroneSdkManager.onOfficialInitProcess( eventName = event.name, totalProcess = totalProcess, initialized = event == DJISDKInitEvent.INITIALIZE_COMPLETE ) } msdkManagerVM.lvRegisterState.observe(this) { (success, error) -> DroneSdkManager.onOfficialRegisterState( success = success, errorMessage = error?.toString() ) } msdkManagerVM.lvProductConnectionState.observe(this) { (connected, productId) -> DroneSdkManager.onOfficialProductConnection(connected, productId) } msdkManagerVM.lvDBDownloadProgress.observe(this) { (current, total) -> DroneSdkManager.onOfficialDatabaseProgress(current, total) } } override fun onWindowFocusChanged(hasFocus: Boolean) { super.onWindowFocusChanged(hasFocus) if (hasFocus) { enterImmersiveMode() } } private fun requestRuntimePermissions() { val permissions = buildList { add(Manifest.permission.ACCESS_FINE_LOCATION) add(Manifest.permission.ACCESS_COARSE_LOCATION) add(Manifest.permission.RECORD_AUDIO) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { add(Manifest.permission.BLUETOOTH_CONNECT) } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { add(Manifest.permission.POST_NOTIFICATIONS) } }.filter { ContextCompat.checkSelfPermission(this, it) != PackageManager.PERMISSION_GRANTED } if (permissions.isNotEmpty()) { permissionLauncher.launch(permissions.toTypedArray()) } else { DroneSdkManager.initMobileSdk(application) } } private fun enterImmersiveMode() { window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) @Suppress("DEPRECATION") window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_FULLSCREEN or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_LAYOUT_STABLE if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { window.decorView.post { window.decorView.windowInsetsController?.let { controller -> controller.hide(WindowInsets.Type.statusBars() or WindowInsets.Type.navigationBars()) controller.systemBarsBehavior = WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE } } } } }