AvLogin.kt 13 KB

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