package com.xkl.cdl.dialog import android.os.Bundle import android.view.Gravity import android.view.View import androidx.core.content.ContextCompat import com.suliang.common.AppConfig import com.suliang.common.base.BaseDialogFragment import com.suliang.common.extension.click import com.suliang.common.util.os.ScreenUtil import com.xkl.cdl.R import com.xkl.cdl.data.AppConstants import com.xkl.cdl.data.bean.LearnDialogBean import com.xkl.cdl.databinding.DialogLessonLearnBinding import kotlin.random.Random /** * author suliang * create 2022/4/2 15:47 * Describe: 学习的通用弹窗 */ class LearnDialog private constructor() : BaseDialogFragment() { companion object { fun newInstance(params : LearnDialogBean) : LearnDialog { val args = Bundle() args.putParcelable(AppConfig.INTENT_1, params) val fragment = LearnDialog() fragment.arguments = args return fragment } } /** 事件动作 */ lateinit var onDialogListener : (action : Int, dialog : LearnDialog) -> Unit //参数 private lateinit var learnDialogBean : LearnDialogBean override fun onCreate(savedInstanceState : Bundle?) { super.onCreate(savedInstanceState) //取值获参 learnDialogBean = requireArguments().getParcelable(AppConfig.INTENT_1)!! } override fun initFragment() { when (learnDialogBean.dialogType) { //测试开始弹窗 AppConstants.DIALOG_TYPE_EXAM_START -> when(learnDialogBean.examType){ //课时学前测试开始弹窗 AppConstants.TEST_TYPE_BEFORE -> initLessonBeforeTestStart() //课时最后一个课时测试结束的下一步弹出此弹窗:学后总测试开始的弹窗 AppConstants.TEST_TYPE_AFTER_TOTAL -> initCourseAfterTestStart() } //测试结束弹窗 AppConstants.DIALOG_TYPE_EXAM_OVER -> when (learnDialogBean.examType) { //学前总测结束弹窗 AppConstants.TEST_TYPE_BEFORE_TOTAL -> initCourseBeforeTotalTestOver() //课时学前测试结束弹窗 AppConstants.TEST_TYPE_BEFORE-> initLessonBeforeTestOver() //课时后测试结束 AppConstants.TEST_TYPE_AFTER -> initLessonAfterTestOver() //学后总测试结束弹窗 AppConstants.TEST_TYPE_AFTER_TOTAL -> initCourseAfterTestOver() //作文知识点测试结束 AppConstants.TEST_TYPE_COMPOSITION -> initCompositionExamLessonTestOver() } //学习结束弹窗 AppConstants.DIALOG_TYPE_LEARNING_OVER -> initLessonLearningOver(false) /**课时列表点击课时完全完成*/ AppConstants.DIALOG_TYPE_LESSON_ITEM_CLICK_ALL_OVER -> initLessonItemClickLessonOver() /** 课时列表item点击 */ AppConstants.DIALOG_TYPE_LESSON_ITEM_CLICK_NOT_DOING_AFTER_TEST -> initLessonLearningOver(true) /** 作文课时item学习完成滴点击 */ AppConstants.DIALOG_TYPE_LESSON_ITEM_CLICK_COMPOSITION_KNOWLEDGE_OVER -> initCompositionKnowledgeLearning(true) /** 作文课时学习中完成弹窗 */ AppConstants.DIALOG_TYPE_LESSON_COMPOSITION_KNOWLEDGE_LEARNING_OVER -> initCompositionKnowledgeLearning(false) /** 复习完成 */ AppConstants.DIALOG_TYPE_REVIEW_OVER -> initReviewOver() } } override fun onStart() { super.onStart() //设置dialog位置 requireDialog().window?.let { it.attributes.run { y = ScreenUtil.getScreenHeight() / 5 it.attributes = this } it.setGravity(Gravity.TOP) } } /** 初始化分数 */ private fun initScore() { //插画 when { learnDialogBean.score < AppConstants.TEST_SCORE_LEVEL_1 -> { binding.imgIv.setImageResource(R.mipmap.test_score_level_1) binding.tvScore.setTextColor(ContextCompat.getColor(requireContext(), R.color.gray_2)) } learnDialogBean.score < AppConstants.TEST_SCORE_LEVEL_2 -> { binding.imgIv.setImageResource(R.mipmap.test_score_level_2) binding.tvScore.setTextColor(ContextCompat.getColor(requireContext(), R.color.red_2)) } else -> { binding.imgIv.setImageResource(R.mipmap.test_score_level_3) binding.tvScore.setTextColor(ContextCompat.getColor(requireContext(), R.color.red_1)) } } //分数 binding.tvScore.text = "${learnDialogBean.score}分" } /** 设置成绩数量 */ private fun initNumber() { binding.incStatisticsNumber.run { tvCorrectNumber.text = "${learnDialogBean.correctNumber}" tvErrorNumber.text = "${learnDialogBean.errorNumber}" } } /** 学前总测试 结束 */ private fun initCourseBeforeTotalTestOver() { binding.run { tvScore.visibility = View.VISIBLE tvTip.visibility = View.VISIBLE tvTip1.visibility = View.VISIBLE tvTitle.visibility = View.VISIBLE incStatisticsNumber.root.visibility = View.VISIBLE tvTitle.text = "恭喜你,完成了学前总测试!" tvTip1.text = "学考乐已为您智能生成了个性化学习计划" tvRight.text = resources.getString(R.string.start_learn) tvRight.click { onDialogListener(AppConstants.ACTION_COURSE_TEST_START_LEARN, this@LearnDialog) } } initScore() initNumber() } /** * 课时学前测试开始开始前提示 */ private fun initLessonBeforeTestStart() { binding.run { ivClose.visibility = View.VISIBLE tvTitle.visibility = View.VISIBLE tvLessonName.visibility = View.VISIBLE tvCountTime.visibility = View.VISIBLE tvTitle.text = "课时学前测试" tvLessonName.text = learnDialogBean.chapter_lesson_name tvCountTime.text = learnDialogBean.showTimeCount tvRight.text = "开始测试" imgIv.setImageResource(if (Random.nextBoolean()) R.mipmap.boy_1 else R.mipmap.girl_1) //开始测试,进入课时学前测试界面 binding.tvRight.click { onDialogListener(AppConstants.DIALOG_START_TEST, this@LearnDialog) } binding.ivClose.click { dismissAllowingStateLoss() } } } /** * 课时学前测试结束 */ private fun initLessonBeforeTestOver() { binding.run { imgIv.setImageResource(if (Random.nextBoolean()) R.mipmap.boy_2 else R.mipmap.girl_2) tvScore.visibility = View.VISIBLE tvTip.visibility = View.VISIBLE tvTitle.visibility = View.VISIBLE tvTip1.visibility = View.VISIBLE incStatisticsNumber.root.visibility = View.VISIBLE tvTitle.text = "恭喜你,完成了课时学前测试" tvTip1.setText(resources.getString(R.string.test_before_test_over_tip)) tvRight.setText(resources.getString(R.string.start_learn)) } initScore() initNumber() binding.tvRight.click { //开始学习 onDialogListener(AppConstants.DIALOG_START_LEARN,this) } } /** * 课时学习中的学习完成 * @param isShowCloseImg 是否需要显示关闭按钮 */ private fun initLessonLearningOver(isShowCloseImg:Boolean){ initNumber() binding.run { imgIv.setImageResource(if (Random.nextBoolean()) R.mipmap.boy_2 else R.mipmap.girl_2) tvTitle.visibility = View.VISIBLE tvTitle.text = "恭喜你,本课时学习完成!" incStatisticsNumber.root.visibility = View.VISIBLE tvLearnOverTip.visibility = View.VISIBLE tvLearnOverForAfterCountTime.visibility = View.VISIBLE tvLearnOverForAfterCountTime.text = learnDialogBean.showTimeCount tvLeft.visibility = View.VISIBLE tvLeft.text = "重新学习" vSplit.visibility = View.VISIBLE tvRight.text = "开始测试" } binding.tvLeft.click { onDialogListener(AppConstants.DIALOG_LESSON_RELEARN, this) } binding.tvRight.click { onDialogListener(AppConstants.DIALOG_START_TEST, this) } if (isShowCloseImg){ binding.ivClose.visibility = View.VISIBLE binding.ivClose.click { dismissAllowingStateLoss() } } } /** * 课时后测试结束 */ private fun initLessonAfterTestOver(){ initNumber() initScore() binding.run { tvScore.visibility = View.VISIBLE tvTip.visibility = View.VISIBLE tvTitle.visibility = View.VISIBLE incStatisticsNumber.root.visibility = View.VISIBLE tvTop.visibility = View.VISIBLE tvLeft.visibility = View.VISIBLE vSplit.visibility = View.VISIBLE tvTitle.text = "恭喜你,完成了课时学后测试" tvTop.text = "重新学习" tvLeft.text = "再测一次" tvRight.text = "下一课时" // TODO: 2022/4/21 小游戏练习先搁置 // tvTop1.visibility = View.VISIBLE // tvTop.text = "小游戏练习" } binding.tvTop.click { onDialogListener(AppConstants.DIALOG_LESSON_RELEARN, this) } binding.tvLeft.click { onDialogListener(AppConstants.DIALOG_LESSON_AFTER_TEST_AGAIN,this) } binding.tvRight.click { onDialogListener(AppConstants.DIALOG_LESSON_AFTER_TEST_NEXT,this) } } /** * 课程学后总测试开始前提示弹窗 */ private fun initCourseAfterTestStart() { binding.run { imgIv.setImageResource(if (Random.nextBoolean()) R.mipmap.boy_2 else R.mipmap.girl_2) tvLessonName.visibility = View.INVISIBLE //占布局,避免布局变形 tvTitle.visibility = View.VISIBLE tvTitle.text = "恭喜你,本课程全部学习完成!" tvTip1.visibility = View.VISIBLE tvTip1.text = "我的学习效果是?快去学后总测试吧!" tvCountTime.visibility = View.VISIBLE tvCountTime.text = learnDialogBean.showTimeCount tvRight.text = "开始测试" //开始测试,进入课时学前测试界面 binding.tvRight.click { onDialogListener(AppConstants.DIALOG_START_TEST, this@LearnDialog) } tvLeft.visibility = View.VISIBLE vSplit.visibility = View.VISIBLE tvLeft.text = "完成" binding.tvLeft.click { onDialogListener(AppConstants.DIALOG_OVER, this@LearnDialog) } } } /** * 课程学后总测试结束弹窗 */ private fun initCourseAfterTestOver(){ initNumber() initScore() binding.run { tvScore.visibility = View.VISIBLE tvTip.visibility = View.VISIBLE tvTitle.visibility = View.VISIBLE tvTip1.visibility = View.VISIBLE incStatisticsNumber.root.visibility = View.VISIBLE tvTop.visibility = View.VISIBLE tvLeft.visibility = View.VISIBLE vSplit.visibility = View.VISIBLE tvTitle.text = "恭喜你,完成了学后总测试" tvTop.text = "继续学习" tvLeft.text = "再测一次" tvRight.text = "完成" } binding.tvTop.click { onDialogListener(AppConstants.DIALOG_OVER, this) } binding.tvLeft.click { onDialogListener(AppConstants.DIALOG_AFTER_TOTAL_TEST_AGAIN,this) } binding.tvRight.click { onDialogListener(AppConstants.DIALOG_OVER, this) } } /** * 课时列表item点击时课程已完全学习完成(学前测、学后测、学习都已完成)的提示弹窗 * tv_title,inc_statistics_number,tv_learn_over_tip,tv_learn_over_for_after_count_time,tv_left,vSplit */ private fun initLessonItemClickLessonOver(){ initNumber() binding.run { imgIv.setImageResource(if (Random.nextBoolean()) R.mipmap.boy_2 else R.mipmap.girl_2) ivClose.visibility = View.VISIBLE tvTitle.visibility = View.VISIBLE tvTitle.text = "恭喜你,本课时学习完成!" incStatisticsNumber.root.visibility = View.VISIBLE tvLearnOverTip.visibility = View.VISIBLE tvLearnOverTip.text = "你可重新学习本课时,或重新进行课时学后测试" tvLearnOverForAfterCountTime.visibility = View.VISIBLE tvLearnOverForAfterCountTime.text = "(上次课时学后测试成绩:${learnDialogBean.score})" tvLeft.visibility = View.VISIBLE tvLeft.text = "重新学习" vSplit.visibility = View.VISIBLE tvRight.text = "课时学后测试" } binding.ivClose.click { dismissAllowingStateLoss() } binding.tvLeft.click { onDialogListener(AppConstants.DIALOG_LESSON_RELEARN, this) } binding.tvRight.click { onDialogListener(AppConstants.DIALOG_START_TEST, this) } } /** * 作文知识点课时学习完成 * @param isShowCloseImg 是否需要显示关闭按钮 */ private fun initCompositionKnowledgeLearning(isShowCloseImg:Boolean){ initNumber() binding.run { imgIv.setImageResource(if (Random.nextBoolean()) R.mipmap.boy_2 else R.mipmap.girl_2) tvTitle.visibility = View.VISIBLE tvTitle.text = "恭喜你,本课时学习完成!" incStatisticsNumber.root.visibility = View.VISIBLE tvLearnOverTip.visibility = View.VISIBLE tvLearnOverTip.text = "你可重新学习本课时,重新学习将清除原学习记录" tvLeft.visibility = View.VISIBLE tvLeft.text = "重新学习" vSplit.visibility = View.VISIBLE tvRight.text = "完成" } binding.tvLeft.click { onDialogListener(AppConstants.DIALOG_LESSON_RELEARN, this) } //学习中的完成,同时需要关闭学习页 binding.tvRight.click { onDialogListener(AppConstants.DIALOG_OVER, this) } if (isShowCloseImg){ binding.ivClose.visibility = View.VISIBLE binding.ivClose.click { dismissAllowingStateLoss() } } } /** * 作文知识点测试完成 * tv_score,tv_tip,tv_title,inc_statistics_number,tv_left,vSplit */ private fun initCompositionExamLessonTestOver() { initScore() initNumber() binding.run { imgIv.setImageResource(if (Random.nextBoolean()) R.mipmap.boy_2 else R.mipmap.girl_2) tvScore.visibility = View.VISIBLE tvTip.visibility = View.VISIBLE tvTitle.visibility = View.VISIBLE incStatisticsNumber.root.visibility = View.VISIBLE tvTitle.text = "恭喜你,完成了知识点测试!" tvLeft.visibility = View.VISIBLE tvLeft.text = "再测一次" tvRight.text = "完成" } binding.tvLeft.click { onDialogListener(AppConstants.DIALOG_START_TEST,this) } binding.tvRight.click { onDialogListener(AppConstants.DIALOG_OVER,this) } } /** * 复习完成 tv_title,tv_tip_1 */ private fun initReviewOver(){ binding.run { imgIv.setImageResource(if (Random.nextBoolean()) R.mipmap.boy_2 else R.mipmap.girl_2) tvTitle.visibility = View.VISIBLE tvTitle.text = "智能复习已完成,太棒了!" tvTip1.visibility = View.VISIBLE tvTip1.text = when{ learnDialogBean.errorNumber == 0 -> "我复习了${learnDialogBean.correctNumber}个词条" else -> "我复习了${learnDialogBean.correctNumber}个词条,词汇量增加了${learnDialogBean.errorNumber}" } tvRight.text = "完成" } binding.tvRight.click { onDialogListener(AppConstants.DIALOG_OVER,this) } } }