AvLogin.kt 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342
  1. package com.cr.cruav
  2. import android.Manifest
  3. import android.app.Activity
  4. import android.content.pm.PackageManager
  5. import android.os.Build
  6. import android.os.Bundle
  7. import android.util.Log
  8. import android.view.View
  9. import android.view.View.OnClickListener
  10. import android.widget.Switch
  11. import android.widget.TextView
  12. import androidx.core.app.ActivityCompat
  13. import androidx.core.content.ContextCompat
  14. import com.cr.common.DataManager
  15. import com.cr.common.CrFileManager
  16. import com.cr.common.CrUnitManager
  17. import com.cr.common.DatabaseBaseManager
  18. import com.cr.data.CrConfig
  19. import com.cr.data.CrUtil
  20. import com.cr.data.CrUtil.Companion.onStart
  21. import com.cr.dialog.DialogNormal
  22. import com.cr.dialog.DialogNormal.DialogNormalListener
  23. import com.cr.event.EventFragmentBarAction
  24. import com.cr.models.UserModel
  25. import com.cr.network.NetManager
  26. import com.cr.network.TCPDataTask
  27. import com.cr.pages.FragmentSetIpAndCom
  28. import com.cr.widget.CrEditTextWidget
  29. import com.squareup.otto.Subscribe
  30. import org.json.JSONArray
  31. import kotlinx.android.synthetic.main.av_login.*
  32. import kotlinx.coroutines.*
  33. class AvLogin : CrActivity(), OnClickListener {
  34. // define: 2023/3/31 权限列表
  35. private val REQUIRED_PERMISSION_LIST: Array<String> = arrayOf(
  36. Manifest.permission.VIBRATE, // VARIABLE: 4/8/21
  37. Manifest.permission.INTERNET, // VARIABLE: 4/8/21 网路权限
  38. Manifest.permission.ACCESS_WIFI_STATE, // VARIABLE: 4/8/21 监测WIFI状态权限
  39. Manifest.permission.ACCESS_COARSE_LOCATION, // Maps
  40. Manifest.permission.ACCESS_NETWORK_STATE, // VARIABLE: 4/8/21 检测网络状态权限
  41. Manifest.permission.ACCESS_FINE_LOCATION, // VARIABLE: 4/8/21 定位权限
  42. Manifest.permission.CHANGE_WIFI_STATE, // VARIABLE: 4/8/21 检测Wifi或USB的连接
  43. Manifest.permission.WRITE_EXTERNAL_STORAGE, // Log files
  44. Manifest.permission.BLUETOOTH, // VARIABLE: 4/8/21 蓝牙权限
  45. Manifest.permission.BLUETOOTH_ADMIN, // VARIABLE: 4/8/21 蓝牙权限
  46. Manifest.permission.READ_EXTERNAL_STORAGE, // Log files
  47. Manifest.permission.READ_PHONE_STATE, // VARIABLE: 4/8/21 读取手机状态权限
  48. Manifest.permission.RECORD_AUDIO // VARIABLE: 4/8/21 录音权限
  49. )
  50. // define: 2023/3/31 动态权限列表
  51. private val missingPermission = arrayListOf<String>()
  52. // define: 2023/3/31 权限检测返回码
  53. private val REQUEST_PERMISSION_CODE: Int = 12345
  54. // define: 2023/3/30 设置页面
  55. private var fragIpAndCom: FragmentSetIpAndCom? = null
  56. // define: 2023/4/6 初始化控件
  57. private var lblVersion: TextView? = null
  58. private var txtUserName: CrEditTextWidget? = null
  59. private var txtPassword: CrEditTextWidget? = null
  60. private var switchSavePassword: Switch? = null
  61. /**
  62. * 创建视图
  63. * @param savedInstanceState Bundle?
  64. */
  65. override fun onCreate(savedInstanceState: Bundle?) {
  66. super.onCreate(savedInstanceState)
  67. setContentView(R.layout.av_login)
  68. // todo: 2023/4/10 初始化上下文
  69. this.context = this
  70. // todo: 2023/4/6 初始化控件
  71. joinControls()
  72. // todo: 2023/3/30 注册事件
  73. registerListener();
  74. // todo: 2023/3/31 检测权限
  75. checkAndRequestPermissions()
  76. // todo: 2023/4/3 订阅事件
  77. CrApplication.getEventBus().register(this)
  78. }
  79. /**
  80. * 重写挂载控件事件
  81. */
  82. override fun joinControls() {
  83. super.joinControls()
  84. // todo: 2023/4/6 初始化版本信息
  85. lblVersion = findViewById(R.id.login_version)
  86. //lblVersion?.text = "{${CrUtil.getVersionName(this)}}"
  87. // todo: 2023/4/6 初始化账号密码
  88. txtUserName = findViewById(R.id.login_username)
  89. txtPassword = findViewById(R.id.login_password)
  90. txtPassword?.setIsPassword(true)
  91. switchSavePassword = findViewById(R.id.switch_password)
  92. }
  93. /**
  94. * 页面初始化
  95. */
  96. private fun initPage() {
  97. // todo: 2023/4/6 获取存储的用户并显示
  98. var user: UserModel = DataManager.getUser()
  99. txtUserName?.setContent(user.userId!!)
  100. txtPassword?.setContent(user.userPwd!!)
  101. }
  102. /**
  103. * 重写注册事件
  104. */
  105. override fun registerListener() {
  106. super.registerListener()
  107. // todo: 2023/3/30 挂在开关事件
  108. switch_password.setOnCheckedChangeListener { compoundButton, b ->
  109. Log.i(compoundButton.toString(), b.toString());
  110. switch_password.setSwitchTextAppearance(this, R.style.switch_text_on);
  111. }
  112. // todo: 2023/3/30 注册登录事件
  113. login_btn_login.setOnClickListener(this)
  114. // todo: 2023/3/30 注册设置事件
  115. login_btn_set.setOnClickListener(this)
  116. }
  117. /**
  118. * 覆写点击事件
  119. * @param p0 View
  120. */
  121. override fun onClick(p0: View?) {
  122. when (p0!!.id) {
  123. R.id.login_btn_login -> {
  124. // var userName: String? = txtUserName?.checkBlank("请输入账号!") ?: return
  125. // var passWord: String? = txtPassword?.checkBlank("请输入密码!") ?: return
  126. // var isSave: Boolean? = switchSavePassword?.isChecked
  127. // checkUserInfo(userName!!, passWord!!, isSave!!)
  128. this.finish()
  129. context!!.onStart<AvMain>()
  130. // showMessage(CrUnitManager.getDeviceDpi(this))
  131. }
  132. R.id.login_btn_set -> {
  133. // fragIpAndCom?.let {
  134. // it.setBarVisible(isVisible = true)
  135. // showFragment(it)
  136. // }
  137. // showMessage(CrUnitManager.getDeviceDpi(this))
  138. GlobalScope.launch {
  139. withContext(Dispatchers.IO){
  140. var one = one()
  141. var two = two(one)
  142. }
  143. }
  144. }
  145. }
  146. }
  147. private suspend fun one():String{
  148. delay(5000)
  149. CrUtil.print("函数一返回")
  150. return "函数一测试"
  151. }
  152. private suspend fun two(demo:String){
  153. delay(1000)
  154. CrUtil.print(demo)
  155. }
  156. /**
  157. * 登录验证
  158. * @param userName String 账号
  159. * @param password String 密码
  160. * @param isSave Boolean 是否保存
  161. */
  162. private fun checkUserInfo(userName: String, password: String, isSave: Boolean) {
  163. if (isSave) {
  164. if (DataManager.saveUser(userName, password)) {
  165. // todo: 2023/4/10 登录系统
  166. login(userName, password)
  167. }
  168. } else {
  169. if (DataManager.deleteUser())
  170. // todo: 2023/4/10 登录系统
  171. login(userName, password)
  172. }
  173. }
  174. /**
  175. * 登录系统
  176. * @param userName String 账号Id
  177. * @param password String 密码
  178. */
  179. private fun login(userName: String, password: String) {
  180. var user = UserModel(userName, password)
  181. // todo: 2023/4/10 向服务器发起认证消息
  182. TCPDataTask.getInstance().sendJSON(
  183. NetManager.getServerUrl("appQueryUser"),
  184. user,
  185. object : TCPDataTask.OnChangeListener {
  186. // todo: 2023/4/10 成功
  187. override fun onSuccess(jsonArray: JSONArray) {
  188. CrConfig.user = UserModel.toModel(jsonArray.optString(0))
  189. context!!.onStart<AvMain>()
  190. }
  191. // todo: 2023/4/10 失败
  192. override fun onFailed(message: String) {
  193. showError(message)
  194. }
  195. },context,"认证中...")
  196. }
  197. /**
  198. * 检测权限
  199. */
  200. private fun checkAndRequestPermissions() {
  201. for (eachPermission in REQUIRED_PERMISSION_LIST) {
  202. if (ContextCompat.checkSelfPermission(
  203. this,
  204. eachPermission
  205. ) != PackageManager.PERMISSION_GRANTED
  206. ) {
  207. missingPermission.add(eachPermission)
  208. }
  209. }
  210. // TODO: 4/8/21 请求缺少的权限
  211. if (missingPermission.isEmpty()) {
  212. init()
  213. } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
  214. ActivityCompat.requestPermissions(
  215. (this as Activity?)!!,
  216. missingPermission.toTypedArray<String>(),
  217. REQUEST_PERMISSION_CODE
  218. )
  219. // todo: 2023/3/31 权限不足 重启App
  220. DialogNormal(this, "操作提示", "权限检测异常,请手动开启后重启App!", object : DialogNormalListener {
  221. override fun completion() {
  222. checkAndRequestPermissions()
  223. }
  224. override fun close() {
  225. }
  226. }).show()
  227. }
  228. }
  229. /**
  230. * 初始化
  231. */
  232. private fun init() {
  233. // todo: 2023/3/31 检查并创建工程文件夹
  234. if (!CrFileManager.isExists(CrUtil.PROJECT_PATH)) {
  235. if (!CrFileManager.createFolder(CrUtil.PROJECT_PATH)) {
  236. CrUtil.showToast("工程文件夹创建失败,请检查权限!")
  237. }
  238. }
  239. // todo: 2023/3/31 检查并创建资源文件夹
  240. if (!CrFileManager.isExists(CrUtil.IMAGE_PATH)) {
  241. if (!CrFileManager.createFolder(CrUtil.IMAGE_PATH)) {
  242. CrUtil.showToast("资源文件夹创建失败,请检查权限!")
  243. }
  244. }
  245. // todo: 2023/3/31 检查并创建缓存文件夹
  246. if (!CrFileManager.isExists(CrUtil.PROJECT_CACHE_PATH)) {
  247. if (!CrFileManager.createFolder(CrUtil.PROJECT_CACHE_PATH)) {
  248. CrUtil.showToast("缓存文件夹创建失败,请检查权限!")
  249. }
  250. }
  251. // todo: 2023/3/31 检查并创建配置文件夹
  252. if (!CrFileManager.isExists(CrUtil.CONFIG_PATH)) {
  253. if (!CrFileManager.createFolder(CrUtil.CONFIG_PATH)) {
  254. CrUtil.showToast("配置文件夹创建失败,请检查权限!")
  255. }
  256. }
  257. // todo: 2023/4/3 拷贝配置库
  258. CrFileManager.moveDataBase(this)
  259. // todo: 2023/4/3 判断数据库是否存在 存在则启动
  260. var databaseIsOpen: Boolean = DatabaseBaseManager.getInstance().openConfigDatabase()
  261. // todo: 2023/4/3 最终判断是否可以正常使用App
  262. if (CrFileManager.isExists(CrUtil.PROJECT_PATH) && CrFileManager.isExists(CrUtil.IMAGE_PATH) && CrFileManager.isExists(
  263. CrUtil.PROJECT_CACHE_PATH
  264. ) && CrFileManager.isExists(CrUtil.CONFIG_PATH) && CrFileManager.isExists(CrUtil.DATABASE_PATH) && databaseIsOpen
  265. ) {
  266. // todo: 2023/4/3 自检通过 可正常使用
  267. DialogNormal(this, "操作提示", "系统自检通过,可正常使用!").show()
  268. // todo: 2023/4/13 启动配置库
  269. DatabaseBaseManager.getInstance().openConfigDatabase()
  270. // todo: 2023/6/19 启用Ip和COM配置页面
  271. fragIpAndCom = FragmentSetIpAndCom()
  272. fragIpAndCom?.let {
  273. addFragment(it, R.id.av_frm_left_big_panel)
  274. hideFragment(it)
  275. }
  276. // todo: 2023/4/13 启动无人机库
  277. // todo: 2023/4/6 页面初始化显示
  278. initPage()
  279. } else {
  280. // todo: 2023/4/3 自检异常 重启App自检
  281. DialogNormal(this, "操作提示", "系统自检异常,请重启App!", object : DialogNormalListener {
  282. override fun completion() {
  283. init()
  284. }
  285. override fun close() {
  286. }
  287. }).show()
  288. }
  289. }
  290. /**
  291. * 订阅Fragment管理事件
  292. * @param event EventFragmentBarAction
  293. */
  294. @Subscribe
  295. fun onFragmentBar(event: EventFragmentBarAction) {
  296. hideFragment(fragIpAndCom!!)
  297. }
  298. // todo: 2023/4/3 生命周期相关方法
  299. /**
  300. * 销毁
  301. */
  302. override fun onDestroy() {
  303. CrApplication.getEventBus().unregister(this)
  304. super.onDestroy()
  305. }
  306. /**
  307. * 重新激活
  308. */
  309. override fun onResume() {
  310. super.onResume()
  311. }
  312. }