AvMain.kt 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461
  1. package com.cr.cruav
  2. import android.annotation.SuppressLint
  3. import android.os.Bundle
  4. import android.view.View
  5. import androidx.activity.viewModels
  6. import androidx.fragment.app.commit
  7. import com.cr.data.CrConfig
  8. import com.cr.data.CrUtil
  9. import com.cr.event.EventFragmentBarAction
  10. import com.cr.map.EventMap
  11. import com.cr.map.MapAction
  12. import com.cr.pages.*
  13. import com.cr.viewmodel.*
  14. import com.squareup.otto.Subscribe
  15. import dji.v5.common.error.IDJIError
  16. import dji.v5.common.register.DJISDKInitEvent
  17. import dji.v5.manager.interfaces.SDKManagerCallback
  18. import dji.v5.utils.common.ToastUtils
  19. import kotlinx.android.synthetic.main.av_main.*
  20. import kotlinx.android.synthetic.main.tools_top.*
  21. class AvMain : CrActivity(), View.OnClickListener {
  22. // define: 2023/3/10 将App视图绑定到模型
  23. private val msdkRegisterVm: CrMSDKRegisterVM by viewModels()
  24. // define: 2023/3/10 将MSDK视图绑定到模型
  25. private val msdkInfoVm: CrMSDKInfoVM by viewModels()
  26. // define: 2023/3/10 将遥控器视图绑定到模型
  27. private val remoteControlVm: CrRemoteControlVM by viewModels()
  28. // define: 2023/3/10 将飞行器视图绑定到模型
  29. private val flightControlVm: CrFlightControlVM by viewModels()
  30. // define: 2023/3/14 将链路视图绑定到模型
  31. private val linkVm: CrLinkVM by viewModels()
  32. // define: 2023/3/13 顶部视图容器
  33. private var fragmentTopInfo: FragmentTopInfo? = null
  34. // define: 2023/3/13 图传容器
  35. private var fragmentFPV: FragmentFPV? = null
  36. // define: 2023/3/14 地图容器
  37. private var fragmentMap: FragmentMap? = null
  38. // define: 2023/3/14 图传窗口是不是小窗口
  39. private var isFpvSmallWindow: Boolean = true
  40. // define: 2023/4/11 初始化设置页面
  41. private var fragmentSet: FragmentSet? = null
  42. // define: 2023/4/14 图层控制页面
  43. private var fragmentLayerControl: FragmentLayerControl? = null
  44. // define: 2023/4/17 涂鸦页面
  45. private var fragmentDoodle: FragmentDoodle? = null
  46. // define: 2023/4/18 标志页面
  47. private var fragmentMark: FragmentMark? = null
  48. // define: 2023/4/21 工具页面
  49. private var fragmentTools:FragmentTools? = null
  50. // define: 2023/6/9 案件图斑编辑页面
  51. private var fragmentCaseTools:FragmentCaseTools?= null
  52. /**
  53. * 入口函数
  54. */
  55. override fun onCreate(savedInstanceState: Bundle?) {
  56. super.onCreate(savedInstanceState)
  57. setContentView(R.layout.av_main);
  58. // todo: 2023/4/11 挂载控件
  59. joinControls()
  60. // todo: 2023/4/11 初始化
  61. // init()
  62. // todo: 2023/4/3 订阅事件
  63. CrApplication.getEventBus().register(this)
  64. }
  65. /**
  66. * 挂载控件
  67. */
  68. override fun joinControls() {
  69. // todo: 2023/4/11 设置点击事件
  70. tools_set.setOnClickListener(this)
  71. tools_layer.setOnClickListener(this)
  72. tools_doodle.setOnClickListener(this)
  73. tools_mark.setOnClickListener(this)
  74. tools_wx.setOnClickListener(this)
  75. tools_tools.setOnClickListener(this)
  76. tools_case_tools.setOnClickListener(this)
  77. }
  78. /**
  79. * 初始化
  80. */
  81. private fun init() {
  82. // todo: 2023/3/11 注册App到DJI
  83. registerApp();
  84. // todo: 2023/3/11 初始化视图
  85. initView()
  86. // todo: 2023/4/10 初始化页面
  87. initPage()
  88. }
  89. /**
  90. * 初始化页面
  91. */
  92. private fun initPage() {
  93. // todo: 2023/4/10 显示登录账号
  94. av_main_lbl_user.text = CrConfig.user?.userName
  95. // todo: 2023/4/11 初始化设置页面
  96. fragmentSet = FragmentSet()
  97. fragmentSet?.let {
  98. addFragment(it, R.id.av_frm_right_panel)
  99. hideFragment(it)
  100. }
  101. // todo: 2023/4/14 初始化图层控制页面
  102. fragmentLayerControl = FragmentLayerControl()
  103. fragmentLayerControl?.let {
  104. addFragment(it, R.id.av_frm_right_panel)
  105. hideFragment(it)
  106. }
  107. // todo: 2023/4/17 初始化涂鸦操作页面
  108. fragmentDoodle = FragmentDoodle()
  109. fragmentDoodle?.setListener(doodleListener)
  110. fragmentDoodle?.let {
  111. addFragment(it, R.id.av_frm_left_panel)
  112. hideFragment(it)
  113. }
  114. // todo: 2023/4/18 初始化标志页面
  115. fragmentMark = FragmentMark()
  116. fragmentMark?.setListener(markListener)
  117. fragmentMark?.let {
  118. addFragment(it, R.id.av_frm_left_panel)
  119. hideFragment(it)
  120. }
  121. // todo: 2023/4/21 初始化工具页面
  122. fragmentTools = FragmentTools()
  123. fragmentTools?.let {
  124. it.setListener(toolsListener)
  125. addFragment(it,R.id.av_frm_left_panel)
  126. hideFragment(it)
  127. }
  128. // todo: 2023/6/9 初始化案件图斑编辑页面
  129. fragmentCaseTools = FragmentCaseTools()
  130. fragmentCaseTools?.let {
  131. it.setListener(caseToolsListener)
  132. addFragment(it,R.id.av_frm_left_panel)
  133. hideFragment(it)
  134. }
  135. }
  136. /**
  137. * 初始化视图
  138. */
  139. @SuppressLint("SuspiciousIndentation")
  140. private fun initView() {
  141. // todo: 2023/3/10 加入大疆顶部视图
  142. fragmentTopInfo = FragmentTopInfo()
  143. supportFragmentManager.commit {
  144. replace(R.id.av_fragment_top, fragmentTopInfo!!)
  145. }
  146. // todo: 2023/3/10 加入图传视图
  147. fragmentFPV = FragmentFPV()
  148. fragmentFPV?.listener = object : FragmentFPV.FPVListener {
  149. // todo: 2023/3/13 切换图传窗口
  150. override fun triggerWindow() {
  151. CrUtil.print("切换图传窗口")
  152. av_fragment_fpv.removeAllViews()
  153. av_fragment_map.removeAllViews()
  154. if (isFpvSmallWindow) {
  155. isFpvSmallWindow = false
  156. av_fragment_map.addView(fragmentFPV!!.view)
  157. av_fragment_fpv.addView(fragmentMap!!.view)
  158. } else {
  159. isFpvSmallWindow = true
  160. av_fragment_map.addView(fragmentMap!!.view)
  161. av_fragment_fpv.addView(fragmentFPV!!.view)
  162. }
  163. }
  164. }
  165. supportFragmentManager.commit {
  166. replace(R.id.av_fragment_fpv, fragmentFPV!!)
  167. }
  168. // todo: 2023/3/14 加入地图视图
  169. fragmentMap = FragmentMap()
  170. supportFragmentManager.commit {
  171. replace(R.id.av_fragment_map, fragmentMap!!)
  172. }
  173. }
  174. /**
  175. * 注册App SDK
  176. */
  177. private fun registerApp() {
  178. msdkRegisterVm.registerApp(this, object : SDKManagerCallback {
  179. // todo: 2023/3/13 App注册成功回调
  180. override fun onRegisterSuccess() {
  181. CrUtil.print("App注册成功")
  182. // todo: 2023/3/9 MSDK初始化监听
  183. msdkInfoVm.initListener()
  184. // todo: 2023/3/9 遥控器初始化监听
  185. remoteControlVm.initListener()
  186. // todo: 2023/3/9 初始化飞行器监听
  187. flightControlVm.initListener()
  188. // todo: 2023/3/14 初始化链路监听
  189. linkVm.initListener()
  190. }
  191. // todo: 2023/3/13 App注册失败回调
  192. override fun onRegisterFailure(error: IDJIError?) {
  193. CrUtil.print("App注册失败" + error.toString())
  194. }
  195. override fun onProductDisconnect(productId: Int) {
  196. ToastUtils.showToast("Not yet implemented")
  197. }
  198. override fun onProductConnect(productId: Int) {
  199. ToastUtils.showToast("Not yet implemented")
  200. }
  201. override fun onProductChanged(productId: Int) {
  202. ToastUtils.showToast("Not yet implemented")
  203. }
  204. override fun onInitProcess(event: DJISDKInitEvent?, totalProcess: Int) {
  205. ToastUtils.showToast("Not yet implemented")
  206. }
  207. override fun onDatabaseDownloadProgress(current: Long, total: Long) {
  208. ToastUtils.showToast("Not yet implemented")
  209. }
  210. })
  211. }
  212. /**
  213. * 视图点击事件
  214. * @param view View
  215. */
  216. override fun onClick(view: View?) {
  217. when (view?.id) {
  218. R.id.tools_set -> {
  219. showFragment(fragmentSet!!)
  220. }
  221. R.id.tools_layer -> {
  222. showFragment(fragmentLayerControl!!)
  223. fragmentLayerControl?.initPage()
  224. }
  225. R.id.tools_doodle -> {
  226. showFragment(fragmentDoodle!!)
  227. }
  228. R.id.tools_mark->{
  229. showFragment(fragmentMark!!)
  230. }
  231. R.id.tools_tools->{
  232. showFragment(fragmentTools!!)
  233. }
  234. R.id.tools_case_tools->{
  235. showFragment(fragmentCaseTools!!)
  236. }
  237. }
  238. }
  239. /**
  240. * 涂鸦页面操作监听
  241. */
  242. private val doodleListener = object : FragmentDoodle.OnOperationListener {
  243. // todo: 2023/4/17 开启绘制
  244. override fun onStartDraw() {
  245. CrApplication.getEventBus().post(EventMap(MapAction.MapTapDrawDoodle))
  246. }
  247. // todo: 2023/4/17 停止绘制
  248. override fun onStopDraw() {
  249. CrApplication.getEventBus().post(EventMap(MapAction.EventStopSketch))
  250. }
  251. // todo: 2023/4/17 开启选择
  252. override fun onSelect() {
  253. CrApplication.getEventBus().post(EventMap(MapAction.MapTapSelectDoodle))
  254. }
  255. // todo: 2023/4/17 关闭选择
  256. override fun onStopSelect() {
  257. CrApplication.getEventBus().post(EventMap(MapAction.EventStopTouch))
  258. }
  259. // todo: 2023/4/17 清除
  260. override fun onClear() {
  261. CrApplication.getEventBus().post(EventMap(MapAction.EventDoodleClear))
  262. }
  263. // todo: 2023/4/17 保存
  264. override fun onSave() {
  265. CrApplication.getEventBus().post(EventMap(MapAction.EventDoodleSave))
  266. }
  267. // todo: 2023/4/17 删除全部
  268. override fun onRemove() {
  269. CrApplication.getEventBus().post(EventMap(MapAction.EventDoodleRemove))
  270. }
  271. // todo: 2023/4/17 移除选择
  272. override fun onDelete() {
  273. CrApplication.getEventBus().post(EventMap(MapAction.EventDoodleDelete))
  274. }
  275. }
  276. /**
  277. * 标志页面操作监听
  278. */
  279. private val markListener = object : FragmentMark.OnOperationListener {
  280. // todo: 2023/4/17 开启绘制
  281. override fun onStartDraw() {
  282. CrApplication.getEventBus().post(EventMap(MapAction.MapTapAppendMark,fragmentMark))
  283. }
  284. // todo: 2023/4/17 停止绘制
  285. override fun onStopDraw() {
  286. CrApplication.getEventBus().post(EventMap(MapAction.EventStopSketch))
  287. }
  288. // todo: 2023/4/17 开启选择
  289. override fun onSelect() {
  290. CrApplication.getEventBus().post(EventMap(MapAction.MapTapSelectMark))
  291. }
  292. // todo: 2023/4/17 关闭选择
  293. override fun onStopSelect() {
  294. CrApplication.getEventBus().post(EventMap(MapAction.EventStopTouch))
  295. }
  296. // todo: 2023/4/17 清除
  297. override fun onClear() {
  298. CrApplication.getEventBus().post(EventMap(MapAction.EventMarkClear))
  299. }
  300. // todo: 2023/4/17 保存
  301. override fun onSave() {
  302. CrApplication.getEventBus().post(EventMap(MapAction.EventMarkSave))
  303. }
  304. // todo: 2023/4/17 删除全部
  305. override fun onRemove() {
  306. CrApplication.getEventBus().post(EventMap(MapAction.EventMarkRemove))
  307. }
  308. // todo: 2023/4/17 移除选择
  309. override fun onDelete() {
  310. CrApplication.getEventBus().post(EventMap(MapAction.EventMarkDelete))
  311. }
  312. }
  313. /**
  314. * 工具监听
  315. */
  316. private var toolsListener = object:FragmentTools.OnOperationListener{
  317. // todo: 2023/4/21 长度测量
  318. override fun onMeasureLength() {
  319. CrApplication.getEventBus().post(EventMap(MapAction.EventSurveyLength))
  320. }
  321. // todo: 2023/4/21 面积测量
  322. override fun onMeasureArea() {
  323. CrApplication.getEventBus().post(EventMap(MapAction.EventSurveyArea))
  324. }
  325. // todo: 2023/4/21 清除测量内容
  326. override fun onMeasureClear() {
  327. CrApplication.getEventBus().post(EventMap(MapAction.EventSurveyClear))
  328. }
  329. // todo: 2023/4/21 获取经纬度位置
  330. override fun onGetLocation() {
  331. CrApplication.getEventBus().post(EventMap(MapAction.MapTapGetLocation))
  332. }
  333. // todo: 2023/4/21 地图定位
  334. override fun onToLocation() {
  335. CrApplication.getEventBus().post(EventMap(MapAction.EventInputLocationToMap))
  336. }
  337. }
  338. /**
  339. * 案件图斑编辑工具页面监听
  340. */
  341. private val caseToolsListener = object:FragmentCaseTools.OnOperationListener{
  342. // todo: 2023/6/9 开启绘制案件图斑
  343. override fun onStartDraw() {
  344. CrApplication.getEventBus().post(EventMap(MapAction.EventCaseDrawPolygon))
  345. }
  346. // todo: 2023/6/9 结束绘制
  347. override fun onStopDraw() {
  348. }
  349. // todo: 2023/6/9 保存
  350. override fun onSave() {
  351. CrApplication.getEventBus().post(EventMap(MapAction.EventCaseSavePolygon))
  352. }
  353. // todo: 2023/6/9 删除
  354. override fun onRemove() {
  355. CrApplication.getEventBus().post(EventMap(MapAction.EventCaseRemovePolygon))
  356. }
  357. // todo: 2023/6/9 回退
  358. override fun onUndo() {
  359. CrApplication.getEventBus().post(EventMap(MapAction.EventCaseDrawUndo))
  360. }
  361. // todo: 2023/6/9 重置
  362. override fun onReset() {
  363. CrApplication.getEventBus().post(EventMap(MapAction.EventCaseDrawReset))
  364. }
  365. // todo: 2023/6/9 移动违建点
  366. override fun onMoveCasePoint() {
  367. }
  368. }
  369. /**
  370. * 销毁
  371. */
  372. override fun onDestroy() {
  373. CrApplication.getEventBus().unregister(this)
  374. super.onDestroy()
  375. }
  376. /**
  377. * App可见
  378. */
  379. override fun onResume() {
  380. super.onResume()
  381. init()
  382. }
  383. /**
  384. * 订阅Fragment管理事件
  385. * @param event EventFragmentBarAction
  386. */
  387. @Subscribe
  388. fun onFragmentBar(event: EventFragmentBarAction) {
  389. hideFragment(event.fragment!!)
  390. }
  391. }