AvLogin.kt 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331
  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.event.EventFragmentBarAction
  25. import com.cr.models.UserModel
  26. import com.cr.network.NetManager
  27. import com.cr.network.TCPDataTask
  28. import com.cr.pages.FragmentSetIpAndCom
  29. import com.cr.widget.CrEditTextWidget
  30. import com.squareup.otto.Subscribe
  31. import kotlinx.android.synthetic.main.av_login.*
  32. import org.json.JSONArray
  33. class AvLogin : CrActivity(), OnClickListener {
  34. // define: 2023/3/31 权限列表
  35. val REQUIRED_PERMISSION_LIST = 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. var fragIpAndCom: FragmentSetIpAndCom? = null
  56. // define: 2023/4/6 初始化控件
  57. var lblVersion: TextView? = null
  58. var txtUserName: CrEditTextWidget? = null
  59. var txtPassword: CrEditTextWidget? = null
  60. 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/3/30 初始化页面
  71. fragIpAndCom = FragmentSetIpAndCom()
  72. fragIpAndCom?.let {
  73. addFragment(it, R.id.av_frm_left_panel)
  74. hideFragment(it)
  75. }
  76. // todo: 2023/4/6 初始化控件
  77. joinControls()
  78. // todo: 2023/3/30 注册事件
  79. registerListener();
  80. // todo: 2023/3/31 检测权限
  81. checkAndRequestPermissions()
  82. // var displayMetrics = DisplayMetrics()
  83. // var windowManager: WindowManager =
  84. // this.getSystemService(Context.WINDOW_SERVICE) as WindowManager
  85. // windowManager.defaultDisplay.getMetrics(displayMetrics)
  86. // var screenWidth = this.convertPixelsToDp(displayMetrics.widthPixels.toFloat())
  87. // var screenHeight = this.convertPixelsToDp(displayMetrics.heightPixels.toFloat())
  88. //
  89. // CrUtil.print("---w:$screenWidth---h:$screenHeight")
  90. // todo: 2023/4/3 订阅事件
  91. CrApplication.getEventBus().register(this)
  92. }
  93. fun Context.convertPixelsToDp(px: Float): Float {
  94. val resources = this.resources
  95. val metrics = resources.displayMetrics
  96. return px / (metrics.densityDpi.toFloat() / DisplayMetrics.DENSITY_DEFAULT)
  97. }
  98. /**
  99. * 重写挂载控件事件
  100. */
  101. override fun joinControls() {
  102. super.joinControls()
  103. // todo: 2023/4/6 初始化版本信息
  104. lblVersion = findViewById(R.id.login_version)
  105. lblVersion?.text = "{${CrUtil.getVersionName(this)}}"
  106. // todo: 2023/4/6 初始化账号密码
  107. txtUserName = findViewById(R.id.login_username)
  108. txtPassword = findViewById(R.id.login_password)
  109. txtPassword?.setIsPassword(true)
  110. switchSavePassword = findViewById(R.id.switch_password)
  111. }
  112. /**
  113. * 页面初始化
  114. */
  115. private fun initPage() {
  116. // todo: 2023/4/6 获取存储的用户并显示
  117. var user: UserModel = DataManager.getUser()
  118. txtUserName?.setContent(user.userId!!)
  119. txtPassword?.setContent(user.userPwd!!)
  120. }
  121. /**
  122. * 重写注册事件
  123. */
  124. override fun registerListener() {
  125. super.registerListener()
  126. // todo: 2023/3/30 挂在开关事件
  127. switch_password.setOnCheckedChangeListener { compoundButton, b ->
  128. Log.i(compoundButton.toString(), b.toString());
  129. switch_password.setSwitchTextAppearance(this, R.style.switch_text_on);
  130. }
  131. // todo: 2023/3/30 注册登录事件
  132. login_btn_login.setOnClickListener(this)
  133. // todo: 2023/3/30 注册设置事件
  134. login_btn_set.setOnClickListener(this)
  135. }
  136. /**
  137. * 覆写点击事件
  138. * @param p0 View
  139. */
  140. override fun onClick(p0: View?) {
  141. when (p0!!.id) {
  142. R.id.login_btn_login -> {
  143. var userName: String? = txtUserName?.checkBlank("请输入账号!") ?: return
  144. var passWord: String? = txtPassword?.checkBlank("请输入密码!") ?: return
  145. var isSave: Boolean? = switchSavePassword?.isChecked
  146. checkUserInfo(userName!!, passWord!!, isSave!!)
  147. }
  148. R.id.login_btn_set -> {
  149. fragIpAndCom?.let {
  150. showFragment(it)
  151. }
  152. }
  153. }
  154. }
  155. /**
  156. * 登录验证
  157. * @param userName String 账号
  158. * @param password String 密码
  159. * @param isSave Boolean 是否保存
  160. */
  161. private fun checkUserInfo(userName: String, password: String, isSave: Boolean) {
  162. if (isSave) {
  163. if (DataManager.saveUser(userName, password)) {
  164. // todo: 2023/4/10 登录系统
  165. login(userName, password)
  166. }
  167. } else {
  168. if (DataManager.deleteUser())
  169. // todo: 2023/4/10 登录系统
  170. login(userName, password)
  171. }
  172. }
  173. /**
  174. * 登录系统
  175. * @param userName String 账号Id
  176. * @param password String 密码
  177. */
  178. private fun login(userName: String, password: String) {
  179. var user = UserModel(userName, password)
  180. // todo: 2023/4/10 向服务器发起认证消息
  181. TCPDataTask.getInstance().sendJSON(
  182. NetManager.getServerUrl("appQueryUser"),
  183. user,
  184. object : TCPDataTask.OnChangeListener {
  185. // todo: 2023/4/10 成功
  186. override fun onSuccess(jsonArray: JSONArray) {
  187. CrConfig.user = UserModel.toModel(jsonArray.optString(0))
  188. context!!.onStart<AvMain>()
  189. }
  190. // todo: 2023/4/10 失败
  191. override fun onFailed(message: String) {
  192. showError(message)
  193. }
  194. },context,"认证中...")
  195. }
  196. /**
  197. * 检测权限
  198. */
  199. private fun checkAndRequestPermissions() {
  200. for (eachPermission in REQUIRED_PERMISSION_LIST) {
  201. if (ContextCompat.checkSelfPermission(
  202. this,
  203. eachPermission
  204. ) != PackageManager.PERMISSION_GRANTED
  205. ) {
  206. missingPermission.add(eachPermission)
  207. }
  208. }
  209. // TODO: 4/8/21 请求缺少的权限
  210. if (missingPermission.isEmpty()) {
  211. init()
  212. } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
  213. ActivityCompat.requestPermissions(
  214. (this as Activity?)!!,
  215. missingPermission.toTypedArray<String>(),
  216. REQUEST_PERMISSION_CODE
  217. )
  218. // todo: 2023/3/31 权限不足 重启App
  219. DialogNormal(this, "操作提示", "权限检测异常,请手动开启后重启App!", object : DialogNormalListener {
  220. override fun completion() {
  221. checkAndRequestPermissions()
  222. }
  223. override fun close() {
  224. }
  225. }).show()
  226. }
  227. }
  228. /**
  229. * 初始化
  230. */
  231. private fun init() {
  232. // todo: 2023/3/31 检查并创建工程文件夹
  233. if (!FileManager.isExists(CrUtil.PROJECT_PATH)) {
  234. if (!FileManager.createFolder(CrUtil.PROJECT_PATH)) {
  235. CrUtil.showMessage("工程文件夹创建失败,请检查权限!")
  236. }
  237. }
  238. // todo: 2023/3/31 检查并创建资源文件夹
  239. if (!FileManager.isExists(CrUtil.IMAGE_PATH)) {
  240. if (!FileManager.createFolder(CrUtil.IMAGE_PATH)) {
  241. CrUtil.showMessage("资源文件夹创建失败,请检查权限!")
  242. }
  243. }
  244. // todo: 2023/3/31 检查并创建缓存文件夹
  245. if (!FileManager.isExists(CrUtil.PROJECT_CACHE_PATH)) {
  246. if (!FileManager.createFolder(CrUtil.PROJECT_CACHE_PATH)) {
  247. CrUtil.showMessage("缓存文件夹创建失败,请检查权限!")
  248. }
  249. }
  250. // todo: 2023/3/31 检查并创建配置文件夹
  251. if (!FileManager.isExists(CrUtil.CONFIG_PATH)) {
  252. if (!FileManager.createFolder(CrUtil.CONFIG_PATH)) {
  253. CrUtil.showMessage("配置文件夹创建失败,请检查权限!")
  254. }
  255. }
  256. // todo: 2023/4/3 拷贝配置库
  257. FileManager.MoveDataBase(this)
  258. // todo: 2023/4/3 判断数据库是否存在 存在则启动
  259. var databaseIsOpen: Boolean = DatabaseManager.getInstance().openConfigDatabase()
  260. // todo: 2023/4/3 最终判断是否可以正常使用App
  261. if (FileManager.isExists(CrUtil.PROJECT_PATH) && FileManager.isExists(CrUtil.IMAGE_PATH) && FileManager.isExists(
  262. CrUtil.PROJECT_CACHE_PATH
  263. ) && FileManager.isExists(CrUtil.CONFIG_PATH) && FileManager.isExists(CrUtil.DATABASE_PATH) && databaseIsOpen
  264. ) {
  265. // todo: 2023/4/3 自检通过 可正常使用
  266. DialogNormal(this, "操作提示", "系统自检通过,可正常使用!").show()
  267. // todo: 2023/4/6 页面初始化显示
  268. initPage()
  269. } else {
  270. // todo: 2023/4/3 自检异常 重启App自检
  271. DialogNormal(this, "操作提示", "系统自检异常,请重启App!", object : DialogNormalListener {
  272. override fun completion() {
  273. init()
  274. }
  275. override fun close() {
  276. }
  277. }).show()
  278. }
  279. }
  280. /**
  281. * 订阅Fragment管理事件
  282. * @param event EventFragmentBarAction
  283. */
  284. @Subscribe
  285. fun onFragmentBar(event: EventFragmentBarAction) {
  286. hideFragment(fragIpAndCom!!)
  287. }
  288. // todo: 2023/4/3 生命周期相关方法
  289. /**
  290. * 销毁
  291. */
  292. override fun onDestroy() {
  293. CrApplication.getEventBus().unregister(this)
  294. super.onDestroy()
  295. }
  296. /**
  297. * 重新激活
  298. */
  299. override fun onResume() {
  300. super.onResume()
  301. }
  302. }