Files
drone-controller-v5/sample/src/main/java/com/zklh/dronecontroller/MainActivity.kt
2026-07-09 10:11:25 +08:00

116 lines
4.3 KiB
Kotlin

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
}
}
}
}
}