MainActivity.kt 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328
  1. package com.dlc.exam.ui
  2. import android.content.ComponentName
  3. import android.content.Intent
  4. import android.content.ServiceConnection
  5. import android.os.*
  6. import android.view.LayoutInflater
  7. import android.view.View
  8. import androidx.viewbinding.ViewBinding
  9. import com.dlc.exam.BuildConfig
  10. import com.dlc.exam.ExamApp
  11. import com.dlc.exam.common.CommonUtils
  12. import com.dlc.exam.common.ExamType
  13. import com.dlc.exam.databinding.ActivityMainBinding
  14. import com.dlc.exam.iflytek.VoiceItsManager
  15. import com.dlc.exam.mqtt.MqttService
  16. import com.dlc.exam.mqtt.event.UpdateEvent
  17. import com.dlc.exam.ui.certificate.CertificateManagementActivity
  18. import com.dlc.exam.ui.common.BaseCountDownActivity
  19. import com.dlc.exam.ui.exam.ExamActivity
  20. import com.dlc.exam.ui.exam.MockExamActivity
  21. import com.dlc.exam.ui.exam.SafetyExamHomeActivity
  22. import com.dlc.exam.ui.learn.SafetyLearnActivity
  23. import com.dlc.exam.ui.login.LoginActivity
  24. import com.dlc.exam.ui.login.ViolationHandlingDialog
  25. import com.dlc.exam.ui.me.PersonalCenterActivity
  26. import com.dlc.exam.ui.mock.SelectedMockTypeActivity
  27. import com.dlc.exam.ui.score.QueryScoreActivity
  28. import com.dlc.exam.ui.settings.PasswordDialog
  29. import com.dlc.exam.ui.settings.SettingsActivity
  30. import com.dlc.exam.ui.widget.TitleBar
  31. import com.rc.core.log.RcLog
  32. import com.rc.core.util.ApkUpdater
  33. import com.rc.core.util.DeviceUtils
  34. import com.rc.httpcore.HttpClient
  35. import com.rc.httpcore.client.ApiRepository
  36. import org.greenrobot.eventbus.EventBus
  37. import org.greenrobot.eventbus.Subscribe
  38. import org.greenrobot.eventbus.ThreadMode
  39. /**
  40. * 首页
  41. *
  42. * @author ReiChin_
  43. */
  44. class MainActivity : BaseCountDownActivity<ActivityMainBinding>(), TitleBar.TitleListener {
  45. private lateinit var runnable: Runnable
  46. private var handler: Handler = Handler(Looper.getMainLooper())
  47. override fun createViewBinding() = ActivityMainBinding.inflate(LayoutInflater.from(this))
  48. override fun onCreate(savedInstanceState: Bundle?) {
  49. super.onCreate(savedInstanceState)
  50. VoiceItsManager.initIts(this)
  51. VoiceItsManager.speakVoice("欢迎使用实验室安全学习与考试系统")
  52. EventBus.getDefault().register(this)
  53. bindService(Intent(this, MqttService::class.java), mConnection, BIND_AUTO_CREATE)
  54. // 创建定时任务
  55. runnable = object : Runnable {
  56. override fun run() {
  57. // 每隔一个小时执行一次操作
  58. // 这里可以添加你需要执行的代码
  59. subAddData()
  60. // 重新启动定时任务
  61. handler.postDelayed(this, 3600000) // 3600000 毫秒为一小时
  62. }
  63. }
  64. // 第一次启动定时任务
  65. handler.post(runnable)
  66. }
  67. private fun subAddData() {
  68. val androidId = CommonUtils.getAndroidId(this)
  69. val disposable = ApiRepository.monitor(androidId)
  70. .subscribe({ data ->
  71. }, { throwable ->
  72. showNetError(throwable)
  73. })
  74. addDisposable(disposable)
  75. }
  76. override fun onDestroy() {
  77. VoiceItsManager.release()
  78. EventBus.getDefault().unregister(this)
  79. unbindService(mConnection)
  80. try {
  81. handler.removeCallbacks(runnable)
  82. handler.removeCallbacksAndMessages(null)
  83. } catch (e: Exception) {
  84. }
  85. super.onDestroy()
  86. }
  87. private val mConnection: ServiceConnection = object : ServiceConnection {
  88. override fun onServiceConnected(name: ComponentName, service: IBinder) {
  89. service as MqttService.MqttBinder
  90. service.initMqtt()
  91. }
  92. override fun onServiceDisconnected(name: ComponentName) {
  93. }
  94. }
  95. override fun onResume() {
  96. if (null == ExamApp.sLearnLoginVo) {
  97. viewBinding.titleBar.showLogoutView(false)
  98. viewBinding.titleBar.setUsername("未登录")
  99. }
  100. super.onResume()
  101. }
  102. override fun initListener() {
  103. viewBinding.titleBar.setTitleListener(this)
  104. viewBinding.titleBar.setOnLongClickListener {
  105. PasswordDialog(this) {
  106. val intent = Intent(this, SettingsActivity::class.java)
  107. startActivity(intent)
  108. }.show()
  109. true
  110. }
  111. // 安全考试
  112. //viewBinding.safetyExam.setOnClickListener { dispatchMenuClicked(SafetyExamHomeActivity::class.java) }
  113. //安全考试
  114. viewBinding.safetyExam.setOnClickListener {
  115. if (isLogin()) {
  116. val intent = Intent(this, ExamActivity::class.java)
  117. intent.putExtra("exam_type", ExamType.SAFETY.type)
  118. startActivity(intent)
  119. }
  120. }
  121. // 证书管理
  122. // viewBinding.certificateManagement.setOnClickListener {
  123. // dispatchMenuClicked(
  124. // CertificateManagementActivity::class.java
  125. // )
  126. // }
  127. //修改成模拟考试了
  128. viewBinding.certificateManagement.setOnClickListener {
  129. dispatchMenuClicked(
  130. MockExamActivity::class.java
  131. )
  132. }
  133. // 安全学习
  134. viewBinding.safetyLearn.setOnClickListener { dispatchMenuClicked(SafetyLearnActivity::class.java) }
  135. // 模拟练习
  136. viewBinding.mockTest.setOnClickListener { dispatchMenuClicked(SelectedMockTypeActivity::class.java) }
  137. // 成绩查询
  138. viewBinding.examScore.setOnClickListener { dispatchMenuClicked(QueryScoreActivity::class.java) }
  139. }
  140. private fun dispatchMenuClicked(menuClass: Class<out BaseCountDownActivity<out ViewBinding>>) {
  141. mMenuClass = menuClass
  142. if (isLogin()) {
  143. val intent = Intent(this, mMenuClass)
  144. startActivity(intent)
  145. }
  146. }
  147. private fun isLogin(): Boolean {
  148. if (null != ExamApp.sLearnLoginVo) {
  149. return true
  150. }
  151. // showToast("请先登录")
  152. if (HttpClient.token == null) {
  153. // authLogin()
  154. startLoginActivity()
  155. }
  156. return false
  157. }
  158. // /*
  159. // * 登录获取token
  160. // */
  161. // private fun authLogin() {
  162. // showLoading("加载中...")
  163. // val disposable = ApiRepository.authOneLogin()
  164. // .subscribe({ success ->
  165. // dismissLoading()
  166. // if (success) {
  167. // startLoginActivity()
  168. // }
  169. // }, { throwable ->
  170. // dismissLoading()
  171. // showNetError(throwable)
  172. // })
  173. // addDisposable(disposable)
  174. // }
  175. private fun startLoginActivity() {
  176. val intent = Intent(this, LoginActivity::class.java)
  177. startActivityForResult(intent, 100)
  178. }
  179. private var mMenuClass: Class<out BaseCountDownActivity<out ViewBinding>>? = null
  180. override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
  181. super.onActivityResult(requestCode, resultCode, data)
  182. if (100 == requestCode) {
  183. if (RESULT_OK == resultCode) {
  184. // 登录成功
  185. queryTodoViolation()
  186. viewBinding.titleBar.showLogoutView(true)
  187. // viewBinding.titleBar.setUsername(ExamApp.sLearnLoginVo!!.nickName)
  188. viewBinding.titleBar.setUsername(ExamApp.sLearnLoginVo!!.userName)
  189. }
  190. }
  191. }
  192. private fun queryTodoViolation() {
  193. showLoading("查询中...")
  194. val disposable = ApiRepository.existTodoViolation()
  195. .subscribe({
  196. // 有待处理的违规,弹出提示框
  197. dismissLoading()
  198. if (it==false) {
  199. //正常
  200. mMenuClass?.let {
  201. startActivity(Intent(this, it))
  202. }
  203. } else {
  204. //有违规
  205. ViolationHandlingDialog(this) { hand ->
  206. if (hand) {
  207. // 处理
  208. startActivity(Intent(this, PersonalCenterActivity::class.java))
  209. } else {
  210. // 不处理
  211. mMenuClass?.let {
  212. startActivity(Intent(this, it))
  213. }
  214. }
  215. }.show()
  216. }
  217. }, {
  218. dismissLoading()
  219. // 没有待处理的违规
  220. mMenuClass?.let {
  221. startActivity(Intent(this, it))
  222. }
  223. })
  224. addDisposable(disposable)
  225. }
  226. @Subscribe(threadMode = ThreadMode.MAIN)
  227. fun onUpdateEventEvent(event: UpdateEvent) {
  228. if (CommonUtils.stringParseInt(event.data.version) > DeviceUtils.getVersionCode(this)) {
  229. // 显示版本更新
  230. downloadApk(event.data.apkUploadFile)
  231. }
  232. }
  233. private var apkDownloading = false
  234. private fun downloadApk(downloadUrl: String) {
  235. if (apkDownloading) return
  236. apkDownloading = true
  237. callApkUpdateApi("2")
  238. ApkUpdater(applicationContext, BuildConfig.APPLICATION_ID, callback = object :
  239. ApkUpdater.DownloadCallback {
  240. override fun onProgress(progress: Int) {
  241. }
  242. override fun onFailed(errMsg: String?) {
  243. apkDownloading = false
  244. callApkUpdateApi("0")
  245. }
  246. override fun onSuccess(apkFile: String) {
  247. apkDownloading = false
  248. callApkUpdateApi("1")
  249. }
  250. }).downloadApk(downloadUrl)
  251. }
  252. /*
  253. * state 0:升级失败; 1:升级成功; 2:升级中
  254. */
  255. private fun callApkUpdateApi(state: String) {
  256. val disposable = ApiRepository.onepcApkUpdate(CommonUtils.getAndroidId(this), state)
  257. .subscribe({ }, { })
  258. addDisposable(disposable)
  259. }
  260. override fun onHomeViewClicked(view: View) {
  261. }
  262. override fun onLogoutViewClicked(view: View) {
  263. callLogoutApi {
  264. showToast("已退出登录")
  265. ExamApp.sLearnLoginVo = null
  266. HttpClient.token = null
  267. viewBinding.titleBar.showLogoutView(false)
  268. viewBinding.titleBar.setUsername("未登录")
  269. }
  270. }
  271. override fun onBackViewClicked(view: View) {
  272. RcLog.info("HttpClient.token=====返回==" + HttpClient.token)
  273. }
  274. override fun onUserViewClicked(view: View) {
  275. mMenuClass = null
  276. if (isLogin()) {
  277. val intent = Intent(this, PersonalCenterActivity::class.java)
  278. startActivity(intent)
  279. }
  280. }
  281. }