学考乐离线App
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

LearnDialog.kt 18KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445
  1. package com.xkl.cdl.dialog
  2. import android.annotation.SuppressLint
  3. import android.os.Bundle
  4. import android.view.Gravity
  5. import android.view.View
  6. import androidx.core.content.ContextCompat
  7. import com.suliang.common.AppConfig
  8. import com.suliang.common.base.BaseDialogFragment
  9. import com.suliang.common.extension.click
  10. import com.suliang.common.util.os.ScreenUtil
  11. import com.xkl.cdl.R
  12. import com.xkl.cdl.data.AppConstants
  13. import com.xkl.cdl.data.bean.LearnDialogBean
  14. import com.xkl.cdl.databinding.DialogLessonLearnBinding
  15. import kotlin.random.Random
  16. /**
  17. * author suliang
  18. * create 2022/4/2 15:47
  19. * Describe: 学习的通用弹窗
  20. */
  21. class LearnDialog private constructor() : BaseDialogFragment<DialogLessonLearnBinding>() {
  22. companion object {
  23. fun newInstance(params : LearnDialogBean) : LearnDialog {
  24. val args = Bundle()
  25. args.putParcelable(AppConfig.INTENT_1, params)
  26. val fragment = LearnDialog()
  27. fragment.arguments = args
  28. return fragment
  29. }
  30. }
  31. /** 事件动作 */
  32. lateinit var onDialogListener : (action : Int, dialog : LearnDialog) -> Unit
  33. //参数
  34. private lateinit var learnDialogBean : LearnDialogBean
  35. override fun onCreate(savedInstanceState : Bundle?) {
  36. super.onCreate(savedInstanceState)
  37. //取值获参
  38. learnDialogBean = requireArguments().getParcelable(AppConfig.INTENT_1)!!
  39. }
  40. override fun initFragment() {
  41. when (learnDialogBean.dialogType) {
  42. //测试开始弹窗
  43. AppConstants.DIALOG_TYPE_EXAM_START -> when(learnDialogBean.examType){
  44. //课时学前测试开始弹窗
  45. AppConstants.TEST_TYPE_BEFORE -> initLessonBeforeTestStart()
  46. //课时最后一个课时测试结束的下一步弹出此弹窗:学后总测试开始的弹窗
  47. AppConstants.TEST_TYPE_AFTER_TOTAL -> initCourseAfterTestStart()
  48. }
  49. //测试结束弹窗
  50. AppConstants.DIALOG_TYPE_EXAM_OVER -> when (learnDialogBean.examType) {
  51. //学前总测结束弹窗
  52. AppConstants.TEST_TYPE_BEFORE_TOTAL -> initCourseBeforeTotalTestOver()
  53. //课时学前测试结束弹窗
  54. AppConstants.TEST_TYPE_BEFORE-> initLessonBeforeTestOver()
  55. //课时后测试结束
  56. AppConstants.TEST_TYPE_AFTER -> initLessonAfterTestOver()
  57. //学后总测试结束弹窗
  58. AppConstants.TEST_TYPE_AFTER_TOTAL -> initCourseAfterTestOver()
  59. //作文知识点测试结束
  60. AppConstants.TEST_TYPE_COMPOSITION -> initCompositionExamLessonTestOver()
  61. //备忘本测试 课程测试
  62. AppConstants.TEST_TYPE_SERVICE_CENTER,
  63. AppConstants.TEST_TYPE_MEMO -> initMemoTestOver()
  64. //词汇量测试结束
  65. }
  66. //学习结束弹窗
  67. AppConstants.DIALOG_TYPE_LEARNING_OVER -> initLessonLearningOver(false)
  68. /**课时列表点击课时完全完成*/
  69. AppConstants.DIALOG_TYPE_LESSON_ITEM_CLICK_ALL_OVER -> initLessonItemClickLessonOver()
  70. /** 课时列表item点击 */
  71. AppConstants.DIALOG_TYPE_LESSON_ITEM_CLICK_NOT_DOING_AFTER_TEST -> initLessonLearningOver(true)
  72. /** 作文课时item学习完成滴点击 */
  73. AppConstants.DIALOG_TYPE_LESSON_ITEM_CLICK_COMPOSITION_KNOWLEDGE_OVER -> initCompositionKnowledgeLearning(true)
  74. /** 作文课时学习中完成弹窗 */
  75. AppConstants.DIALOG_TYPE_LESSON_COMPOSITION_KNOWLEDGE_LEARNING_OVER -> initCompositionKnowledgeLearning(false)
  76. /** 复习完成 */
  77. AppConstants.DIALOG_TYPE_REVIEW_OVER -> initReviewOver()
  78. }
  79. }
  80. /** 初始化分数 */
  81. private fun initScore() {
  82. //插画
  83. when {
  84. learnDialogBean.score < AppConstants.TEST_SCORE_LEVEL_1 -> {
  85. binding.imgIv.setImageResource(R.mipmap.test_score_level_1)
  86. binding.tvScore.setTextColor(ContextCompat.getColor(requireContext(), R.color.gray_2))
  87. }
  88. learnDialogBean.score < AppConstants.TEST_SCORE_LEVEL_2 -> {
  89. binding.imgIv.setImageResource(R.mipmap.test_score_level_2)
  90. binding.tvScore.setTextColor(ContextCompat.getColor(requireContext(), R.color.red_2))
  91. }
  92. else -> {
  93. binding.imgIv.setImageResource(R.mipmap.test_score_level_3)
  94. binding.tvScore.setTextColor(ContextCompat.getColor(requireContext(), R.color.red_1))
  95. }
  96. }
  97. //分数
  98. binding.tvScore.text = "${learnDialogBean.score}分"
  99. }
  100. /** 设置成绩数量 */
  101. private fun initNumber() {
  102. binding.incStatisticsNumber.run {
  103. tvCorrectNumber.text = "${learnDialogBean.correctNumber}"
  104. tvErrorNumber.text = "${learnDialogBean.errorNumber}"
  105. }
  106. }
  107. /** 学前总测试 结束 */
  108. private fun initCourseBeforeTotalTestOver() {
  109. binding.run {
  110. tvScore.visibility = View.VISIBLE
  111. tvTip.visibility = View.VISIBLE
  112. tvTip1.visibility = View.VISIBLE
  113. tvTitle.visibility = View.VISIBLE
  114. incStatisticsNumber.root.visibility = View.VISIBLE
  115. tvTitle.text = "恭喜你,完成了学前总测试!"
  116. tvTip1.text = "学考乐已为您智能生成了个性化学习计划"
  117. tvRight.text = resources.getString(R.string.start_learn)
  118. tvRight.click {
  119. onDialogListener(AppConstants.ACTION_COURSE_TEST_START_LEARN, this@LearnDialog)
  120. }
  121. }
  122. initScore()
  123. initNumber()
  124. }
  125. /**
  126. * 课时学前测试开始开始前提示
  127. */
  128. private fun initLessonBeforeTestStart() {
  129. binding.run {
  130. ivClose.visibility = View.VISIBLE
  131. tvTitle.visibility = View.VISIBLE
  132. tvLessonName.visibility = View.VISIBLE
  133. tvCountTime.visibility = View.VISIBLE
  134. tvTitle.text = "课时学前测试"
  135. tvLessonName.text = learnDialogBean.chapter_lesson_name
  136. tvCountTime.text = learnDialogBean.showTimeCount
  137. tvRight.text = "开始测试"
  138. imgIv.setImageResource(if (Random.nextBoolean()) R.mipmap.boy_1 else R.mipmap.girl_1)
  139. //开始测试,进入课时学前测试界面
  140. binding.tvRight.click {
  141. onDialogListener(AppConstants.DIALOG_START_TEST, this@LearnDialog)
  142. }
  143. binding.ivClose.click { dismissAllowingStateLoss() }
  144. }
  145. }
  146. /**
  147. * 课时学前测试结束
  148. */
  149. private fun initLessonBeforeTestOver() {
  150. binding.run {
  151. imgIv.setImageResource(if (Random.nextBoolean()) R.mipmap.boy_2 else R.mipmap.girl_2)
  152. tvScore.visibility = View.VISIBLE
  153. tvTip.visibility = View.VISIBLE
  154. tvTitle.visibility = View.VISIBLE
  155. tvTip1.visibility = View.VISIBLE
  156. incStatisticsNumber.root.visibility = View.VISIBLE
  157. tvTitle.text = "恭喜你,完成了课时学前测试"
  158. tvTip1.setText(resources.getString(R.string.test_before_test_over_tip))
  159. tvRight.setText(resources.getString(R.string.start_learn))
  160. }
  161. initScore()
  162. initNumber()
  163. binding.tvRight.click {
  164. //开始学习
  165. onDialogListener(AppConstants.DIALOG_START_LEARN,this)
  166. }
  167. }
  168. /**
  169. * 课时学习中的学习完成
  170. * @param isShowCloseImg 是否需要显示关闭按钮
  171. */
  172. private fun initLessonLearningOver(isShowCloseImg:Boolean){
  173. initNumber()
  174. binding.run {
  175. imgIv.setImageResource(if (Random.nextBoolean()) R.mipmap.boy_2 else R.mipmap.girl_2)
  176. tvTitle.visibility = View.VISIBLE
  177. tvTitle.text = "恭喜你,本课时学习完成!"
  178. incStatisticsNumber.root.visibility = View.VISIBLE
  179. tvLearnOverTip.visibility = View.VISIBLE
  180. tvLearnOverForAfterCountTime.visibility = View.VISIBLE
  181. tvLearnOverForAfterCountTime.text = learnDialogBean.showTimeCount
  182. tvLeft.visibility = View.VISIBLE
  183. tvLeft.text = "重新学习"
  184. vSplit.visibility = View.VISIBLE
  185. tvRight.text = "开始测试"
  186. }
  187. binding.tvLeft.click { onDialogListener(AppConstants.DIALOG_LESSON_RELEARN, this) }
  188. binding.tvRight.click { onDialogListener(AppConstants.DIALOG_START_TEST, this) }
  189. if (isShowCloseImg){
  190. binding.ivClose.visibility = View.VISIBLE
  191. binding.ivClose.click { dismissAllowingStateLoss() }
  192. }
  193. }
  194. /**
  195. * 课时后测试结束
  196. */
  197. private fun initLessonAfterTestOver(){
  198. initNumber()
  199. initScore()
  200. binding.run {
  201. tvScore.visibility = View.VISIBLE
  202. tvTip.visibility = View.VISIBLE
  203. tvTitle.visibility = View.VISIBLE
  204. incStatisticsNumber.root.visibility = View.VISIBLE
  205. tvTop.visibility = View.VISIBLE
  206. tvLeft.visibility = View.VISIBLE
  207. vSplit.visibility = View.VISIBLE
  208. tvTitle.text = "恭喜你,完成了课时学后测试"
  209. tvTop.text = "重新学习"
  210. tvLeft.text = "再测一次"
  211. tvRight.text = "下一课时"
  212. // TODO: 2022/4/21 小游戏练习先搁置
  213. // tvTop1.visibility = View.VISIBLE
  214. // tvTop.text = "小游戏练习"
  215. }
  216. binding.tvTop.click {
  217. onDialogListener(AppConstants.DIALOG_LESSON_RELEARN, this)
  218. }
  219. binding.tvLeft.click {
  220. onDialogListener(AppConstants.DIALOG_LESSON_AFTER_TEST_AGAIN,this)
  221. }
  222. binding.tvRight.click {
  223. onDialogListener(AppConstants.DIALOG_LESSON_AFTER_TEST_NEXT,this)
  224. }
  225. }
  226. /**
  227. * 课程学后总测试开始前提示弹窗
  228. */
  229. private fun initCourseAfterTestStart() {
  230. binding.run {
  231. imgIv.setImageResource(if (Random.nextBoolean()) R.mipmap.boy_2 else R.mipmap.girl_2)
  232. tvLessonName.visibility = View.INVISIBLE //占布局,避免布局变形
  233. tvTitle.visibility = View.VISIBLE
  234. tvTitle.text = "恭喜你,本课程全部学习完成!"
  235. tvTip1.visibility = View.VISIBLE
  236. tvTip1.text = "我的学习效果是?快去学后总测试吧!"
  237. tvCountTime.visibility = View.VISIBLE
  238. tvCountTime.text = learnDialogBean.showTimeCount
  239. tvRight.text = "开始测试"
  240. //开始测试,进入课时学前测试界面
  241. binding.tvRight.click {
  242. onDialogListener(AppConstants.DIALOG_START_TEST, this@LearnDialog)
  243. }
  244. tvLeft.visibility = View.VISIBLE
  245. vSplit.visibility = View.VISIBLE
  246. tvLeft.text = "完成"
  247. binding.tvLeft.click {
  248. onDialogListener(AppConstants.DIALOG_OVER, this@LearnDialog)
  249. }
  250. }
  251. }
  252. /**
  253. * 课程学后总测试结束弹窗
  254. */
  255. private fun initCourseAfterTestOver(){
  256. initNumber()
  257. initScore()
  258. binding.run {
  259. tvScore.visibility = View.VISIBLE
  260. tvTip.visibility = View.VISIBLE
  261. tvTitle.visibility = View.VISIBLE
  262. tvTip1.visibility = View.VISIBLE
  263. incStatisticsNumber.root.visibility = View.VISIBLE
  264. tvTop.visibility = View.VISIBLE
  265. tvLeft.visibility = View.VISIBLE
  266. vSplit.visibility = View.VISIBLE
  267. tvTitle.text = "恭喜你,完成了学后总测试"
  268. tvTop.text = "继续学习"
  269. tvLeft.text = "再测一次"
  270. tvRight.text = "完成"
  271. }
  272. binding.tvTop.click {
  273. onDialogListener(AppConstants.DIALOG_OVER, this)
  274. }
  275. binding.tvLeft.click {
  276. onDialogListener(AppConstants.DIALOG_AFTER_TOTAL_TEST_AGAIN,this)
  277. }
  278. binding.tvRight.click {
  279. onDialogListener(AppConstants.DIALOG_OVER, this)
  280. }
  281. }
  282. /**
  283. * 课时列表item点击时课程已完全学习完成(学前测、学后测、学习都已完成)的提示弹窗
  284. * tv_title,inc_statistics_number,tv_learn_over_tip,tv_learn_over_for_after_count_time,tv_left,vSplit
  285. */
  286. private fun initLessonItemClickLessonOver(){
  287. initNumber()
  288. binding.run {
  289. imgIv.setImageResource(if (Random.nextBoolean()) R.mipmap.boy_2 else R.mipmap.girl_2)
  290. ivClose.visibility = View.VISIBLE
  291. tvTitle.visibility = View.VISIBLE
  292. tvTitle.text = "恭喜你,本课时学习完成!"
  293. incStatisticsNumber.root.visibility = View.VISIBLE
  294. tvLearnOverTip.visibility = View.VISIBLE
  295. tvLearnOverTip.text = "你可重新学习本课时,或重新进行课时学后测试"
  296. tvLearnOverForAfterCountTime.visibility = View.VISIBLE
  297. tvLearnOverForAfterCountTime.text = "(上次课时学后测试成绩:${learnDialogBean.score})"
  298. tvLeft.visibility = View.VISIBLE
  299. tvLeft.text = "重新学习"
  300. vSplit.visibility = View.VISIBLE
  301. tvRight.text = "课时学后测试"
  302. }
  303. binding.ivClose.click { dismissAllowingStateLoss() }
  304. binding.tvLeft.click { onDialogListener(AppConstants.DIALOG_LESSON_RELEARN, this) }
  305. binding.tvRight.click { onDialogListener(AppConstants.DIALOG_START_TEST, this) }
  306. }
  307. /**
  308. * 作文知识点课时学习完成
  309. * @param isShowCloseImg 是否需要显示关闭按钮
  310. */
  311. private fun initCompositionKnowledgeLearning(isShowCloseImg:Boolean){
  312. initNumber()
  313. binding.run {
  314. imgIv.setImageResource(if (Random.nextBoolean()) R.mipmap.boy_2 else R.mipmap.girl_2)
  315. tvTitle.visibility = View.VISIBLE
  316. tvTitle.text = "恭喜你,本课时学习完成!"
  317. incStatisticsNumber.root.visibility = View.VISIBLE
  318. tvLearnOverTip.visibility = View.VISIBLE
  319. tvLearnOverTip.text = "你可重新学习本课时,重新学习将清除原学习记录"
  320. tvLeft.visibility = View.VISIBLE
  321. tvLeft.text = "重新学习"
  322. vSplit.visibility = View.VISIBLE
  323. tvRight.text = "完成"
  324. }
  325. binding.tvLeft.click { onDialogListener(AppConstants.DIALOG_LESSON_RELEARN, this) }
  326. //学习中的完成,同时需要关闭学习页
  327. binding.tvRight.click { onDialogListener(AppConstants.DIALOG_OVER, this) }
  328. if (isShowCloseImg){
  329. binding.ivClose.visibility = View.VISIBLE
  330. binding.ivClose.click { dismissAllowingStateLoss() }
  331. }
  332. }
  333. /**
  334. * 作文知识点测试完成
  335. * tv_score,tv_tip,tv_title,inc_statistics_number,tv_left,vSplit
  336. */
  337. private fun initCompositionExamLessonTestOver() {
  338. initScore()
  339. initNumber()
  340. binding.run {
  341. imgIv.setImageResource(if (Random.nextBoolean()) R.mipmap.boy_2 else R.mipmap.girl_2)
  342. tvScore.visibility = View.VISIBLE
  343. tvTip.visibility = View.VISIBLE
  344. tvTitle.visibility = View.VISIBLE
  345. incStatisticsNumber.root.visibility = View.VISIBLE
  346. tvTitle.text = "恭喜你,完成了知识点测试!"
  347. tvLeft.visibility = View.VISIBLE
  348. tvLeft.text = "再测一次"
  349. tvRight.text = "完成"
  350. }
  351. binding.tvLeft.click { onDialogListener(AppConstants.DIALOG_START_TEST,this) }
  352. binding.tvRight.click { onDialogListener(AppConstants.DIALOG_OVER,this) }
  353. }
  354. /**
  355. * 复习完成 tv_title,tv_tip_1
  356. */
  357. private fun initReviewOver(){
  358. binding.run {
  359. imgIv.setImageResource(if (Random.nextBoolean()) R.mipmap.boy_2 else R.mipmap.girl_2)
  360. tvTitle.visibility = View.VISIBLE
  361. tvTitle.text = "智能复习已完成,太棒了!"
  362. tvTip1.visibility = View.VISIBLE
  363. tvTip1.text = when{
  364. learnDialogBean.errorNumber == 0 -> "我复习了${learnDialogBean.correctNumber}个词条"
  365. else -> "我复习了${learnDialogBean.correctNumber}个词条,词汇量增加了${learnDialogBean.errorNumber}"
  366. }
  367. tvRight.text = "完成"
  368. }
  369. binding.tvRight.click { onDialogListener(AppConstants.DIALOG_OVER,this) }
  370. }
  371. /**
  372. * 备忘本测试结束 tv_score,tv_tip,tv_title,tv_tip_1,inc_statistics_number,tv_left,tv_top
  373. */
  374. @SuppressLint("SetTextI18n")
  375. private fun initMemoTestOver() {
  376. binding.run {
  377. imgIv.setImageResource(if (Random.nextBoolean()) R.mipmap.boy_2 else R.mipmap.girl_2)
  378. tvScore.visibility = View.VISIBLE
  379. tvTip.visibility = View.VISIBLE
  380. tvTitle.visibility = View.VISIBLE
  381. tvTitle.text = if (learnDialogBean.examType == AppConstants.TEST_TYPE_MEMO) "恭喜你,完成备忘本测试!" else "恭喜你,完成课程测试"
  382. tvTip1.visibility = View.VISIBLE
  383. tvTip1.text = "《${learnDialogBean.showTimeCount}》" //课程题目
  384. incStatisticsNumber.root.visibility = View.VISIBLE
  385. tvTop.visibility = View.VISIBLE
  386. tvTop.text = "查看测试详情"
  387. tvRight.text = "完成"
  388. tvLeft.visibility = View.VISIBLE
  389. tvLeft.text = "再测一次"
  390. }
  391. initScore()
  392. initNumber()
  393. //完成
  394. binding.tvRight.click { onDialogListener(AppConstants.DIALOG_OVER,this) }
  395. //查看测试详情
  396. binding.tvTop.click { onDialogListener(AppConstants.DIALOG_MEMO_TEST_DETAIL,this) }
  397. //再测一次
  398. binding.tvLeft.click { onDialogListener(AppConstants.DIALOG_START_TEST,this) }
  399. }
  400. }