116 lines
4.3 KiB
Kotlin
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
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|