@@ -53,3 +53,4 @@ DialogFragment原理 | |||
BottomSheetDialog 固定高度和原理 | |||
BottomSheetDialog中使用TextView滑动的冲突? | |||
Behavior | |||
MMKV实现和保存原理 |
@@ -19,27 +19,38 @@ import com.xkl.cdl.module.m_center_learn.coursechildren.CourseMainFragmentViewMo | |||
* create 2022/3/29 16:43 | |||
* Describe: 课程课时列表适配器 | |||
*/ | |||
class AdapterLesson(vm: CourseMainFragmentViewModel) : BaseRVAdapterVM<Lesson, CourseMainFragmentViewModel>(vm) { | |||
class AdapterLesson(vm : CourseMainFragmentViewModel) : BaseRVAdapterVM<Lesson, CourseMainFragmentViewModel>(vm) { | |||
/** 选中item的位置 */ | |||
var selectPos = -1 | |||
override fun coverViewHolder(parent: ViewGroup, viewType: Int): BaseAdapterViewHolder { | |||
override fun coverViewHolder(parent : ViewGroup, viewType : Int) : BaseAdapterViewHolder { | |||
return BaseAdapterViewHolder(inflateBinding(parent, R.layout.item_course_lesson)) | |||
} | |||
override fun onBindVH(holder: BaseAdapterViewHolder, position: Int) { | |||
override fun onBindVH(holder : BaseAdapterViewHolder, position : Int) { | |||
val lesson = getItem(position) | |||
(holder.binding as ItemCourseLessonBinding).run { | |||
data = lesson | |||
//章节名称是否显示 | |||
if (position == 0 || lesson.chapterId != getItem(position - 1).chapterId) { //不为第一个个且与上一个章节id相同 | |||
tvChapterName.visibility = View.VISIBLE | |||
} else { | |||
tvChapterName.visibility = View.GONE | |||
} | |||
//章节名称是否显示 不为第一个个且与上一个章节id相同 | |||
tvChapterName.visibility = if (position == 0 || lesson.chapterId != getItem( | |||
position - 1).chapterId) View.VISIBLE else View.GONE | |||
//执行 | |||
executePendingBindings() | |||
//作文的每个课时的显示都不一样 | |||
when (lesson.courseType) { | |||
AppConstants.COURSE_TYPE_CHINESE_COMPOSITION -> when (lesson.lessonType) { | |||
// 作文视频、 作文章节测试、作文课堂练习、作文课外练习 不显示条目 | |||
AppConstants.LESSON_TYPE_COMPOSITION_VIDEO, | |||
AppConstants.LESSON_TYPE_COMPOSITION_EXAM, | |||
AppConstants.LESSON_TYPE_COMPOSITION_READING, | |||
AppConstants.LESSON_TYPE_COMPOSITION_TASK -> tvLessonNumber.visibility = View.GONE | |||
AppConstants.LESSON_TYPE_COMPOSITION_KNOWLEDGE -> tvLessonNumber.visibility = View.VISIBLE //作文知识点与 英语单词一致,需要显示条目 | |||
} | |||
} | |||
initColor(position, lesson) | |||
//事件 | |||
@@ -60,18 +71,18 @@ class AdapterLesson(vm: CourseMainFragmentViewModel) : BaseRVAdapterVM<Lesson, C | |||
private val normalColorNotLearnOver by lazy { | |||
ContextCompat.getColor(context, R.color.gray_2) //学习未完成未选中时的颜色 | |||
} | |||
private val normalColorLearnOver by lazy { ContextCompat.getColor(context, R.color.gray_1) } //学习已完成未选中时的颜色 | |||
private val mainTextColor by lazy {ContextCompat.getColor(context, R.color.main_text_color) } //选中颜色 | |||
private val translationColor by lazy {ContextCompat.getColor(context, R.color.translation) } //透明颜色 | |||
private val themeColor by lazy { ContextCompat.getColor(context,R.color.theme_color) } //主题颜色 | |||
private val normalColorLearnOver by lazy { ContextCompat.getColor(context, R.color.gray_1) } //学习已完成未选中时的颜色 | |||
private val mainTextColor by lazy { ContextCompat.getColor(context, R.color.main_text_color) } //选中颜色 | |||
private val translationColor by lazy { ContextCompat.getColor(context, R.color.translation) } //透明颜色 | |||
private val themeColor by lazy { ContextCompat.getColor(context, R.color.theme_color) } //主题颜色 | |||
/** | |||
* 处理颜色 选中色 未选中色(学习完成/学习未完成) | |||
* @receiver ItemCourseLessonBinding | |||
* @param position Int | |||
* @param lesson Lesson | |||
*/ | |||
private fun ItemCourseLessonBinding.initColor(position: Int, lesson: Lesson) { | |||
private fun ItemCourseLessonBinding.initColor(position : Int, lesson : Lesson) { | |||
//item的背景和状态设置 | |||
if (selectPos == position) { //选中,背景设置 | |||
layoutContent.setBackgroundColor(ContextCompat.getColor(context, R.color.gray_3)) //选中背景 | |||
@@ -89,13 +100,13 @@ class AdapterLesson(vm: CourseMainFragmentViewModel) : BaseRVAdapterVM<Lesson, C | |||
} else { //未选中:根据学习情况判断 | |||
layoutContent.setBackgroundColor(translationColor) //未选中背景透明 | |||
//根据课时类型判断当前课时是否完全完成 | |||
val lessonLearnOver = when(lesson.lessonType){ | |||
AppConstants.LESSON_TYPE_WORD -> lesson.learnIsOver && lesson.afterTestScore != AppConstants.NOT_DOING | |||
val lessonLearnOver = when (lesson.lessonType) { | |||
AppConstants.LESSON_TYPE_WORD -> lesson.learnIsOver && lesson.afterTestScore != AppConstants.NOT_DOING | |||
AppConstants.LESSON_TYPE_COMPOSITION_VIDEO -> lesson.learnIsOver // 作文视频 | |||
AppConstants.LESSON_TYPE_COMPOSITION_EXAM -> lesson.learnIsOver //作文章节测试 | |||
AppConstants.LESSON_TYPE_COMPOSITION_READING -> lesson.learnIsOver //作文课堂练习 | |||
AppConstants.LESSON_TYPE_COMPOSITION_TASK -> lesson.learnIsOver //作文课外练习 | |||
AppConstants.LESSON_TYPE_DIALOGUE -> lesson.learnIsOver //口语对话 | |||
AppConstants.LESSON_TYPE_DIALOGUE -> lesson.learnIsOver //口语对话 | |||
else -> false // 其他课时类型为布局的正常显示 | |||
} | |||
@@ -159,6 +159,10 @@ object AppConstants { | |||
const val DIALOG_TYPE_LESSON_ITEM_CLICK_ALL_OVER = 4 | |||
/**课时列表item点击: 课时未做学后测试*/ | |||
const val DIALOG_TYPE_LESSON_ITEM_CLICK_NOT_DOING_AFTER_TEST = 5 | |||
/** 作文知识点课时学习完成 : lesson的item点击提示使用 */ | |||
const val DIALOG_TYPE_LESSON_ITEM_CLICK_COMPOSITION_KNOWLEDGE_OVER = 6 | |||
/** 作文知识点课时学习界面学习完成 */ | |||
const val DIALOG_TYPE_LESSON_COMPOSITION_KNOWLEDGE_LEARNING_OVER = 7 | |||
/**--- 总线动作 --------------------------------- */ | |||
/**action key 改变界面 到目录页 */ | |||
@@ -195,6 +199,8 @@ object AppConstants { | |||
const val ACTION_COURSE_TEST_AFTER_TOTAL_OVER = 11 | |||
/**学后总测结束,传递数据*/ | |||
const val DATA_COURSE_AFTER_TEST_OVER = 12 | |||
/** 作文测试完成动作,再测一次*/ | |||
const val ACTION_LESSON_COMPOSITION_TEST_AGAIN = 13 | |||
/**--- 弹窗动作 --------------------------------- */ | |||
/** 学前总测结束弹窗: 开始学习 ,课时学前测试开始弹窗*/ |
@@ -20,7 +20,9 @@ class CourseDetail:Serializable{ | |||
var lesson_learn_point: HashMap<String, Long> = hashMapOf() //章节学习点 key=>{chapter_id}_{lesson_id} value=>{entity_id) | |||
var exam_w_r_list: HashMap<String, Boolean> = hashMapOf() //课程/课时学前测试正确错误列表 key=> {chapter_id}_{lesson_id}_{entity_id} value=>正确 true;错误 false | |||
var course_learn_point: String = "" //课程学习进度点 {chapter_id}_{lesson_id}_{entity_id} | |||
var vp: HashMap<Long, String> = hashMapOf() //视频播放点,记录最新的就行 时间点 key=>video_id value=>{时间点} | |||
var exercise_schedule: HashMap<Long, Double> = hashMapOf() //课程练习进度(仅作文有效) | |||
var rl: Int = 0 //课程重学次数;有值表示是重新学,默认不是重新学习,对应数值表示第几次重学 用于辨音,拼写判断是否解锁, | |||
var chapter_rl: HashMap<String, Long> = hashMapOf() //章节重学次数,key =>{chapter_id}_{lesson_id} value=> relearn times | |||
@@ -33,7 +35,6 @@ class CourseDetail:Serializable{ | |||
var current_week_total_durations: Long = 0 | |||
var last_e: Double = 0.0 //上周期学习效率 | |||
var temporary_words: HashMap<String, String> = hashMapOf() //课程错误本,重学会删除 key=>{chapter_id}_{lesson_id}_{entity_id} value=> first learn time | |||
var vp: HashMap<Long, String> = hashMapOf() //视频播放点,记录最新的就行 时间点 key=>video_id value=>{时间点} | |||
var exercise_schedule: HashMap<Long, Double> = hashMapOf() //课程练习进度(仅作文有效) | |||
} |
@@ -9,7 +9,6 @@ package com.xkl.cdl.data.event | |||
* @param actionFlag 动作id 动作(action开头) 或 传递数据(data开头) | |||
*/ | |||
class LearnEventData(val subjectId : Int, var courseId : Long, val actionFlag : Int) { | |||
//学前总测结束传递数据 | |||
var scoreValue = 0 //分数 | |||
@@ -20,4 +19,7 @@ class LearnEventData(val subjectId : Int, var courseId : Long, val actionFlag : | |||
//学习结束 newErrorMap 保存为所有的错误,包含学前和课程前的测试,主要用与后面进行小游戏的数据加载 | |||
//视频播放结束,数据传递的播放时间点 | |||
val videoPlayTime : String = "" | |||
} |
@@ -25,7 +25,6 @@ object CourseManager { | |||
val mSortInfoList = hashMapOf<Int, MutableList<AppApi.CourseSortedInfo.Builder>>() | |||
/** | |||
* 搜索项目下的课程包 | |||
* @param subjectId Int 项目id | |||
@@ -151,7 +150,7 @@ object CourseManager { | |||
AppConstants.TEST_TYPE_AFTER -> "课时学后测试" | |||
AppConstants.TEST_TYPE_AFTER_TOTAL -> "学后总测试" | |||
AppConstants.TEST_TYPE_MEMO -> "备忘本测试" | |||
AppConstants.TEST_TYPE_COMPOSITION -> "作文知识点测试" | |||
AppConstants.TEST_TYPE_COMPOSITION -> "知识点测试" | |||
AppConstants.TEST_TYPE_SERVICE_CENTER -> "课程测试" | |||
AppConstants.TEST_TYPE_NORMAL -> "词汇量测试" | |||
else -> "" | |||
@@ -183,17 +182,62 @@ object CourseManager { | |||
} | |||
/** | |||
* 作文课程进度计算 | |||
* 作文课程进度计算 : 章节平分进度, 课时平分章节进度,课时单独计算进度 | |||
* @param allLesson List<Lesson> 所有课时 | |||
* @param isRelearn Boolean 是否重学课时的计算 | |||
* @param relearnLessonPosition Int 需要重学的课时在集合中的位置 | |||
*/ | |||
fun calculateCompositionCourseProgess(allLesson : List<Lesson>, | |||
isRelearn : Boolean = false, | |||
relearnLessonPosition : Int = -1) : Double { | |||
// TODO: 2022/4/29 计算作文课程的进度 | |||
return 0.0 | |||
fun calculateCompositionCourseProgress(allLesson : List<Lesson>, | |||
isRelearn : Boolean = false, | |||
relearnLessonPosition : Int = -1) : Double { | |||
//课时总章节数 | |||
var chapterTotalSize = 0 | |||
//总进度 | |||
var totalProgress = 0.0 | |||
//标记上一章节id | |||
var previousChapterId = 0L | |||
//单章节的总进度 :章节进度之和 | |||
var chapterProgress = 0.0 | |||
//单章节的课时数 | |||
var chapterLessonSize = 0 | |||
//循环 | |||
allLesson.forEach { | |||
when { | |||
//新章节 | |||
it.chapterId != previousChapterId -> { | |||
//新章节需要将上一个章节的进度加入总进度 | |||
if (previousChapterId != 0L) { | |||
totalProgress += chapterProgress / chapterLessonSize | |||
} | |||
//设置上一章节的id | |||
previousChapterId = it.chapterId | |||
//当前章节课时数 | |||
chapterLessonSize = if (it.lessonType != AppConstants.LESSON_TYPE_COMPOSITION_TASK) { | |||
chapterTotalSize++ //章节总数添加 | |||
1 | |||
} else 0 | |||
} | |||
//同一章节 | |||
else -> { | |||
chapterLessonSize += if (it.lessonType != AppConstants.LESSON_TYPE_COMPOSITION_TASK) 1 else 0 //当前章节课时数+1 | |||
} | |||
} | |||
//单章节内的进度累加 | |||
if (it.lessonType != AppConstants.LESSON_TYPE_COMPOSITION_TASK) { | |||
//重学的时候跳过该课时的进度,即记录该课时进度为0 | |||
if (!isRelearn && it.lessonPositionInList != relearnLessonPosition) { | |||
//章节添加课时进度 | |||
chapterProgress += if (it.learnIsOver) 1.0 else if (it.lessonType == AppConstants.LESSON_TYPE_COMPOSITION_KNOWLEDGE) { | |||
//知识点的进度设置,设置该课时总进度为 1 | |||
if (it.learnedIndex == -1) 0.0 else (it.learnedIndex + 1.0) / it.wordIds.size | |||
} else 0.0 | |||
} | |||
} | |||
} | |||
//循环完成,再计算一下最后一个章节的总进度 | |||
totalProgress += chapterProgress / chapterLessonSize | |||
//计算总进度 | |||
return totalProgress / chapterTotalSize * 100 | |||
} | |||
/** | |||
@@ -205,7 +249,7 @@ object CourseManager { | |||
*/ | |||
fun calculateSpokenCourseProgress(allLesson : List<Lesson>, | |||
isRelearn : Boolean = false, | |||
relearnLessonPosition : Int = -1):Double{ | |||
relearnLessonPosition : Int = -1) : Double { | |||
// TODO: 2022/4/29 计算口语课程的进度 | |||
return 0.0 | |||
} | |||
@@ -237,7 +281,7 @@ object CourseManager { | |||
} | |||
mSortInfoList.put(subjectId, mutableListOf(newCourseSortedInfoBuilder)) | |||
} | |||
if (totalProgress == 0.0 ) return totalProgress | |||
if (totalProgress == 0.0) return totalProgress | |||
var totalCourseSize = 0 | |||
subjectWithCoursePackMap.get(subjectId)?.forEach { | |||
@@ -254,19 +298,19 @@ object CourseManager { | |||
* @param courseId Long 重学的课程 | |||
* @return Double 项目的总进度 | |||
*/ | |||
fun calculateSubjectProgressWithCourseRelearn(subjectId : Int,coursePackId:Long, courseId : Long) : Double { | |||
fun calculateSubjectProgressWithCourseRelearn(subjectId : Int, coursePackId : Long, courseId : Long) : Double { | |||
val totalProgress = mSortInfoList.get(subjectId)?.let { | |||
var tempProgress = 0.0 | |||
it.forEach { | |||
if (it.packId == coursePackId && it.courseId == courseId){ | |||
if (it.packId == coursePackId && it.courseId == courseId) { | |||
return@forEach | |||
} | |||
tempProgress += it.s | |||
} | |||
tempProgress | |||
}?: 0.0 | |||
} ?: 0.0 | |||
if (totalProgress == 0.0 ) return totalProgress | |||
if (totalProgress == 0.0) return totalProgress | |||
val totalCourseSize = getSubjectForCourseSize(subjectId) | |||
if (totalCourseSize == 0) return 0.0 | |||
@@ -280,23 +324,26 @@ object CourseManager { | |||
* @param courseProgress Double 被重学课时的课程进度 | |||
* @return Double 项目的总进度 | |||
*/ | |||
fun calculateSubjectProgressWithCourseLessonRelearn(subjectId : Int,coursePackId:Long, courseId : Long,courseProgress:Double) : Double { | |||
fun calculateSubjectProgressWithCourseLessonRelearn(subjectId : Int, | |||
coursePackId : Long, | |||
courseId : Long, | |||
courseProgress : Double) : Double { | |||
val totalProgress = mSortInfoList.get(subjectId)?.let { | |||
var tempProgress = 0.0 | |||
it.forEach { | |||
if (it.packId == coursePackId && it.courseId == courseId){ | |||
if (it.packId == coursePackId && it.courseId == courseId) { | |||
tempProgress += courseProgress | |||
return@forEach | |||
}else { | |||
} else { | |||
tempProgress += it.s | |||
} | |||
} | |||
tempProgress | |||
}?: 0.0 | |||
} ?: 0.0 | |||
if (totalProgress == 0.0 ) return totalProgress | |||
if (totalProgress == 0.0) return totalProgress | |||
val totalCourseSize = getSubjectForCourseSize(subjectId) | |||
val totalCourseSize = getSubjectForCourseSize(subjectId) | |||
if (totalCourseSize == 0) return 0.0 | |||
return totalProgress / totalCourseSize | |||
} | |||
@@ -306,7 +353,7 @@ object CourseManager { | |||
* @param subjectId Int 项目 | |||
* @return Int 课程数量 | |||
*/ | |||
private fun getSubjectForCourseSize(subjectId : Int) : Int { | |||
private fun getSubjectForCourseSize(subjectId : Int) : Int { | |||
return subjectWithCoursePackMap[subjectId]?.let { | |||
var count = 0 | |||
it.forEach { coursePack -> |
@@ -164,6 +164,9 @@ object DBCourseManager { | |||
else -> 0 | |||
} | |||
val sql = when (base.courseType) { | |||
//作文知识点测试 | |||
AppConstants.COURSE_TYPE_CHINESE_COMPOSITION -> "SELECT * FROM exam WHERE chapter_id = ${lesson!!.chapterId} AND exam_id in (${Joiner.on(",").join(lesson.wordIds)}) ORDER BY random()" | |||
AppConstants.COURSE_TYPE_ENGLISH_DISCERN, AppConstants.COURSE_TYPE_ENGLISH_VOICE, | |||
AppConstants.COURSE_TYPE_ENGLISH_SOUNDMARK, AppConstants.COURSE_TYPE_CHINESE_LITERACY, | |||
AppConstants.COURSE_TYPE_CHINESE_PINYIN, | |||
@@ -200,6 +203,22 @@ object DBCourseManager { | |||
mDataBase?.rawQuery(sql, null)?.run { | |||
when (base.courseType) { | |||
//作文知识点测试 | |||
AppConstants.COURSE_TYPE_CHINESE_COMPOSITION -> while (moveToNext()) { | |||
result.add(ExamBean().apply { | |||
id = getLong(3) | |||
word_id = getLong(2) | |||
word = getString(4) | |||
correct = getString(5) | |||
error1 = getString(6) | |||
error2 = getString(7) | |||
error3 = getString(8) | |||
type = AppConstants.TEST_QUEST_TYPE_CHOICE // 为1 | |||
chapterId = lesson!!.chapterId | |||
lessonId = lesson.lessonId | |||
}) | |||
} | |||
AppConstants.COURSE_TYPE_ENGLISH_DISCERN, AppConstants.COURSE_TYPE_ENGLISH_VOICE, | |||
AppConstants.COURSE_TYPE_CHINESE_LITERACY, | |||
AppConstants.COURSE_TYPE_CHINESE_PINYIN -> while (moveToNext()) { |
@@ -65,6 +65,8 @@ class LearnDialog private constructor() : BaseDialogFragment<DialogLessonLearnBi | |||
AppConstants.TEST_TYPE_AFTER -> initLessonAfterTestOver() | |||
//学后总测试结束弹窗 | |||
AppConstants.TEST_TYPE_AFTER_TOTAL -> initCourseAfterTestOver() | |||
//作文知识点测试结束 | |||
AppConstants.TEST_TYPE_COMPOSITION -> initCompositionExamLessonTestOver() | |||
} | |||
//学习结束弹窗 | |||
AppConstants.DIALOG_TYPE_LEARNING_OVER -> initLessonLearningOver(false) | |||
@@ -72,6 +74,10 @@ class LearnDialog private constructor() : BaseDialogFragment<DialogLessonLearnBi | |||
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) | |||
} | |||
} | |||
@@ -186,7 +192,6 @@ class LearnDialog private constructor() : BaseDialogFragment<DialogLessonLearnBi | |||
* @param isShowCloseImg 是否需要显示关闭按钮 | |||
*/ | |||
private fun initLessonLearningOver(isShowCloseImg:Boolean){ | |||
initNumber() | |||
binding.run { | |||
imgIv.setImageResource(if (Random.nextBoolean()) R.mipmap.boy_2 else R.mipmap.girl_2) | |||
@@ -339,4 +344,55 @@ class LearnDialog private constructor() : BaseDialogFragment<DialogLessonLearnBi | |||
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) } | |||
} | |||
} |
@@ -122,7 +122,8 @@ class LearnExamActivity : BaseActivityVM<ActivityLearnExamBinding, LearnExamView | |||
EMediaState.ERROR -> showToast("播放异常") | |||
EMediaState.COMPLETE -> if (wordChooseBinding.ivVoice.visibility == View.VISIBLE) { | |||
wordChooseBinding.ivVoice.postDelayed({ | |||
LogUtil.e("------开始重复播放----------------------------------------") | |||
LogUtil.e( | |||
"------开始重复播放----------------------------------------") | |||
wordChooseBinding.ivVoice.performClick() | |||
}, 700) | |||
} | |||
@@ -136,14 +137,10 @@ class LearnExamActivity : BaseActivityVM<ActivityLearnExamBinding, LearnExamView | |||
private fun initNewWordRead(it : ExamBean) { | |||
when (vm.intentData.courseType) { | |||
//拼写初始不发音,作文不发音, 音标课程测试不发音 | |||
AppConstants.COURSE_TYPE_ENGLISH_SOUNDMARK, | |||
AppConstants.COURSE_TYPE_ENGLISH_SPELL, AppConstants.COURSE_TYPE_CHINESE_COMPOSITION -> { | |||
AppConstants.COURSE_TYPE_ENGLISH_SOUNDMARK, AppConstants.COURSE_TYPE_ENGLISH_SPELL, AppConstants.COURSE_TYPE_CHINESE_COMPOSITION -> { | |||
} | |||
//英语认读,英语音标,英语口语,语文识字,语文拼音 出现即发音一次 | |||
AppConstants.COURSE_TYPE_ENGLISH_DISCERN, | |||
AppConstants.COURSE_TYPE_ENGLISH_SPOKEN, | |||
AppConstants.COURSE_TYPE_CHINESE_LITERACY, | |||
AppConstants.COURSE_TYPE_CHINESE_PINYIN, | |||
AppConstants.COURSE_TYPE_ENGLISH_DISCERN, AppConstants.COURSE_TYPE_ENGLISH_SPOKEN, AppConstants.COURSE_TYPE_CHINESE_LITERACY, AppConstants.COURSE_TYPE_CHINESE_PINYIN, | |||
// 英语辨音 重复播放 | |||
AppConstants.COURSE_TYPE_ENGLISH_VOICE -> { | |||
wordChooseBinding.ivVoice.performClick() | |||
@@ -265,8 +262,7 @@ class LearnExamActivity : BaseActivityVM<ActivityLearnExamBinding, LearnExamView | |||
* */ | |||
private fun initChooseQuestionListener() { | |||
when (vm.intentData.courseType) { | |||
AppConstants.COURSE_TYPE_ENGLISH_SOUNDMARK, | |||
AppConstants.COURSE_TYPE_ENGLISH_SPELL, AppConstants.COURSE_TYPE_CHINESE_COMPOSITION -> { | |||
AppConstants.COURSE_TYPE_ENGLISH_SOUNDMARK, AppConstants.COURSE_TYPE_ENGLISH_SPELL, AppConstants.COURSE_TYPE_CHINESE_COMPOSITION -> { | |||
} | |||
else -> { | |||
wordChooseBinding.incWord.tvWord.setOnClickListener(ivVoiceClick) | |||
@@ -537,7 +533,7 @@ class LearnExamActivity : BaseActivityVM<ActivityLearnExamBinding, LearnExamView | |||
//是否口语总测试 | |||
private fun isSpokenTotalTest() = | |||
vm.intentData.courseType == AppConstants.COURSE_TYPE_ENGLISH_SPOKEN && (vm.intentData.examType == AppConstants.TEST_TYPE_BEFORE_TOTAL || vm.intentData.examType == AppConstants.TEST_TYPE_AFTER_TOTAL) | |||
vm.intentData.courseType == AppConstants.COURSE_TYPE_ENGLISH_SPOKEN && (vm.intentData.examType == AppConstants.TEST_TYPE_BEFORE_TOTAL || vm.intentData.examType == AppConstants.TEST_TYPE_AFTER_TOTAL) | |||
/** | |||
* 拼写时的点击事件 | |||
@@ -547,25 +543,24 @@ class LearnExamActivity : BaseActivityVM<ActivityLearnExamBinding, LearnExamView | |||
* @param correctValue 正确的拼写值,但未选中的赋值了颜色 | |||
* @param errorSize 错误的个数,拼写完成后才会有这个值 | |||
*/ | |||
private val itemSpellingClick = | |||
{ selectedValue : SpannableStringBuilder, nextPosition : Int, isOver : Boolean, correctValue : SpannableStringBuilder, errorSize : Int -> | |||
when { | |||
isOver -> { //拼写结束 | |||
//设置正确的值 | |||
spellBinding.incWord.tvWord.setTextColor(ContextCompat.getColor(this, R.color.red_1)) | |||
spellBinding.incWord.tvWord.text = correctValue | |||
//拼写结束 | |||
vm.spellOver(selectedValue.toString(), errorSize) | |||
//执行当前的单词发音 延迟发音 | |||
spellBinding.incWord.tvWord.postDelayed({ ivVoiceClick(spellBinding.incWord.tvWord) }, 200) | |||
} | |||
else -> { | |||
//设置为选中的值 | |||
spellBinding.incWord.tvWord.text = selectedValue | |||
} | |||
private val itemSpellingClick = { selectedValue : SpannableStringBuilder, nextPosition : Int, isOver : Boolean, correctValue : SpannableStringBuilder, errorSize : Int -> | |||
when { | |||
isOver -> { //拼写结束 | |||
//设置正确的值 | |||
spellBinding.incWord.tvWord.setTextColor(ContextCompat.getColor(this, R.color.red_1)) | |||
spellBinding.incWord.tvWord.text = correctValue | |||
//拼写结束 | |||
vm.spellOver(selectedValue.toString(), errorSize) | |||
//执行当前的单词发音 延迟发音 | |||
spellBinding.incWord.tvWord.postDelayed({ ivVoiceClick(spellBinding.incWord.tvWord) }, 200) | |||
} | |||
else -> { | |||
//设置为选中的值 | |||
spellBinding.incWord.tvWord.text = selectedValue | |||
} | |||
spellBinding.spellRecyclerView.scrollToPosition(nextPosition) | |||
} | |||
spellBinding.spellRecyclerView.scrollToPosition(nextPosition) | |||
} | |||
override fun onBackPressed() { | |||
@@ -580,8 +575,7 @@ class LearnExamActivity : BaseActivityVM<ActivityLearnExamBinding, LearnExamView | |||
vm.showOrDismissBackDialogForTime(true) | |||
CommonDialog.newInstance(CommonDialogBean(titleText = R.string.dialog_test_not_over, | |||
contentText = R.string.dialog_test_not_over_tip, | |||
leftText = R.string.quit, | |||
rightText = R.string.cancel)).apply { | |||
leftText = R.string.quit, rightText = R.string.cancel)).apply { | |||
onCommonDialogButtonClickListener = { dialog, isRightClick -> | |||
dialog.dismissAllowingStateLoss() | |||
when { | |||
@@ -597,6 +591,7 @@ class LearnExamActivity : BaseActivityVM<ActivityLearnExamBinding, LearnExamView | |||
/** 测试完成 : 弹窗显示 */ | |||
private fun testOver() { | |||
// TODO: 2022/5/17 作文测试弹窗 | |||
//对话框信息实体 | |||
val learnDialogBean = LearnDialogBean(AppConstants.DIALOG_TYPE_EXAM_OVER).apply { | |||
examType = vm.intentData.examType | |||
@@ -612,9 +607,9 @@ class LearnExamActivity : BaseActivityVM<ActivityLearnExamBinding, LearnExamView | |||
AppConstants.DIALOG_START_LEARN -> { | |||
dialog.dismissAllowingStateLoss() | |||
//发送动作 : 继续学习 | |||
LiveEventBus.get<LearnEventData>(AppConstants.EVENT_CHANGE_PAGE).post(LearnEventData(vm.intentData.subjectId, | |||
vm.intentData.courseId, | |||
AppConstants.ACTION_COURSE_TEST_START_LEARN)) | |||
LiveEventBus.get<LearnEventData>(AppConstants.EVENT_CHANGE_PAGE) | |||
.post(LearnEventData(vm.intentData.subjectId, vm.intentData.courseId, | |||
AppConstants.ACTION_COURSE_TEST_START_LEARN)) | |||
finish() | |||
} | |||
} | |||
@@ -623,83 +618,95 @@ class LearnExamActivity : BaseActivityVM<ActivityLearnExamBinding, LearnExamView | |||
AppConstants.DIALOG_START_LEARN -> { | |||
dialog.dismissAllowingStateLoss() | |||
//发送动作 : 开始学习 | |||
LiveEventBus.get<LearnEventData>(AppConstants.EVENT_LESSON_ACTION).post( | |||
LearnEventData(vm.intentData.subjectId, | |||
vm.intentData.courseId, | |||
AppConstants.ACTION_LESSON_BEFORE_TEST_OVER_START_LEARN).apply { | |||
leesonPositionIndex = vm.intentData.lesson?.lessonPositionInList!! | |||
}) | |||
LiveEventBus.get<LearnEventData>(AppConstants.EVENT_LESSON_ACTION) | |||
.post(LearnEventData(vm.intentData.subjectId, vm.intentData.courseId, | |||
AppConstants.ACTION_LESSON_BEFORE_TEST_OVER_START_LEARN).apply { | |||
leesonPositionIndex = vm.intentData.lesson?.lessonPositionInList!! | |||
}) | |||
finish() | |||
} | |||
} | |||
//课时学后测试结束弹窗动作 | |||
AppConstants.TEST_TYPE_AFTER -> when(action){ | |||
AppConstants.TEST_TYPE_AFTER -> when (action) { | |||
//重新学习 | |||
AppConstants.DIALOG_LESSON_RELEARN -> { | |||
CommonDialog.newInstance(CommonDialogBean(titleText = R.string.lesson_relearn_title, | |||
contentText = R.string.lesson_relearn_content, | |||
leftText = R.string.cancel, | |||
rightText = R.string.sure)) | |||
.apply { | |||
onCommonDialogButtonClickListener = { relearnDialog, isRightClick -> | |||
relearnDialog.dismissAllowingStateLoss() | |||
if (isRightClick){ | |||
dialog.dismissAllowingStateLoss() | |||
//发送动作 : 重新学习 | |||
LiveEventBus.get<LearnEventData>(AppConstants.EVENT_LESSON_ACTION).post( | |||
LearnEventData(vm.intentData.subjectId, | |||
vm.intentData.courseId, | |||
AppConstants.ACTION_LESSON_AFTER_TEST_RELEARN).apply { | |||
leesonPositionIndex = vm.intentData.lesson?.lessonPositionInList!! | |||
}) | |||
finish() | |||
leftText = R.string.cancel, rightText = R.string.sure)) | |||
.apply { | |||
onCommonDialogButtonClickListener = { relearnDialog, isRightClick -> | |||
relearnDialog.dismissAllowingStateLoss() | |||
if (isRightClick) { | |||
dialog.dismissAllowingStateLoss() | |||
//发送动作 : 重新学习 | |||
LiveEventBus.get<LearnEventData>(AppConstants.EVENT_LESSON_ACTION) | |||
.post(LearnEventData(vm.intentData.subjectId, vm.intentData.courseId, | |||
AppConstants.ACTION_LESSON_AFTER_TEST_RELEARN).apply { | |||
leesonPositionIndex = vm.intentData.lesson?.lessonPositionInList!! | |||
}) | |||
finish() | |||
} | |||
} | |||
} | |||
}.show(childFragmentManager,"lesson_relearn_tip") | |||
.show(childFragmentManager, "lesson_relearn_tip") | |||
} | |||
//再测一次 | |||
AppConstants.DIALOG_LESSON_AFTER_TEST_AGAIN -> { | |||
//发送动作 : 再测一次 | |||
LiveEventBus.get<LearnEventData>(AppConstants.EVENT_LESSON_ACTION).post( | |||
LearnEventData(vm.intentData.subjectId, | |||
vm.intentData.courseId, | |||
AppConstants.ACTION_LESSON_AFTER_TEST_AGAIN).apply { | |||
leesonPositionIndex = vm.intentData.lesson?.lessonPositionInList!! | |||
}) | |||
LiveEventBus.get<LearnEventData>(AppConstants.EVENT_LESSON_ACTION) | |||
.post(LearnEventData(vm.intentData.subjectId, vm.intentData.courseId, | |||
AppConstants.ACTION_LESSON_AFTER_TEST_AGAIN).apply { | |||
leesonPositionIndex = vm.intentData.lesson?.lessonPositionInList!! | |||
}) | |||
finish() | |||
} | |||
//下一步 | |||
AppConstants.DIALOG_LESSON_AFTER_TEST_NEXT -> { | |||
//发送动作 : 下一步 | |||
LiveEventBus.get<LearnEventData>(AppConstants.EVENT_LESSON_ACTION).post( | |||
LearnEventData(vm.intentData.subjectId, | |||
vm.intentData.courseId, | |||
AppConstants.ACTION_LESSON_AFTER_TEST_NEXT).apply { | |||
leesonPositionIndex = vm.intentData.lesson?.lessonPositionInList!! | |||
}) | |||
LiveEventBus.get<LearnEventData>(AppConstants.EVENT_LESSON_ACTION) | |||
.post(LearnEventData(vm.intentData.subjectId, vm.intentData.courseId, | |||
AppConstants.ACTION_LESSON_AFTER_TEST_NEXT).apply { | |||
leesonPositionIndex = vm.intentData.lesson!!.lessonPositionInList!! | |||
}) | |||
finish() | |||
} | |||
} | |||
//学后总测试结束 | |||
AppConstants.TEST_TYPE_AFTER_TOTAL -> when(action){ | |||
AppConstants.TEST_TYPE_AFTER_TOTAL -> when (action) { | |||
//测试完成,切换到目录页 | |||
AppConstants.DIALOG_OVER -> { | |||
AppConstants.DIALOG_OVER -> { | |||
dialog.dismissAllowingStateLoss() | |||
//发送动作 : 继续学习 | |||
LiveEventBus.get<LearnEventData>(AppConstants.EVENT_CHANGE_PAGE).post( | |||
LearnEventData(vm.intentData.subjectId, | |||
vm.intentData.courseId, | |||
AppConstants.ACTION_COURSE_TEST_AFTER_TOTAL_OVER)) | |||
LiveEventBus.get<LearnEventData>(AppConstants.EVENT_CHANGE_PAGE) | |||
.post(LearnEventData(vm.intentData.subjectId, vm.intentData.courseId, | |||
AppConstants.ACTION_COURSE_TEST_AFTER_TOTAL_OVER)) | |||
finish() | |||
} | |||
//再测一次 | |||
AppConstants.DIALOG_AFTER_TOTAL_TEST_AGAIN -> { | |||
dialog.dismissAllowingStateLoss() | |||
//发送动作 : 再测一次 | |||
LiveEventBus.get<LearnEventData>(AppConstants.EVENT_CHANGE_PAGE).post( | |||
LearnEventData(vm.intentData.subjectId, | |||
vm.intentData.courseId, | |||
AppConstants.ACTION_COURSE_TEST_AFTER_TOTAL_AGAIN)) | |||
LiveEventBus.get<LearnEventData>(AppConstants.EVENT_CHANGE_PAGE) | |||
.post(LearnEventData(vm.intentData.subjectId, vm.intentData.courseId, | |||
AppConstants.ACTION_COURSE_TEST_AFTER_TOTAL_AGAIN)) | |||
finish() | |||
} | |||
} | |||
AppConstants.TEST_TYPE_COMPOSITION -> when (action) { | |||
//测试完成,关闭 | |||
AppConstants.DIALOG_OVER -> { | |||
dismissAllowingStateLoss() | |||
finish() | |||
} | |||
//再测一次 | |||
AppConstants.DIALOG_START_TEST -> { | |||
dismissAllowingStateLoss() | |||
//发送动作,再测一次 | |||
LiveEventBus.get<LearnEventData>(AppConstants.EVENT_LESSON_ACTION) | |||
.post(LearnEventData(vm.intentData.subjectId, vm.intentData.courseId, | |||
AppConstants.ACTION_LESSON_COMPOSITION_TEST_AGAIN).apply { | |||
leesonPositionIndex = vm.intentData.lesson!!.lessonPositionInList | |||
}) | |||
finish() | |||
} | |||
} |
@@ -263,7 +263,7 @@ class LearnExamViewModel : LearnBaseViewModel() { | |||
initChooseOption(nextExam) | |||
currentMaxTime = if (intentData.courseType == AppConstants.COURSE_TYPE_ENGLISH_VOICE) 0 else Math.max( | |||
AppConstants.TEST_MIN_TIME, | |||
(nextExam.word.length + nextExam.correct.length) * 200) | |||
(nextExam.word.length + nextExam.correct.length) * if (intentData.courseType == AppConstants.COURSE_TYPE_CHINESE_COMPOSITION) 400 else 200) | |||
// LogUtil.e("------currentMaxTime = $currentMaxTime") | |||
currentSuplusTime.value = currentMaxTime | |||
} | |||
@@ -382,8 +382,10 @@ class LearnExamViewModel : LearnBaseViewModel() { | |||
currentExamRecord!!.answerStatus = AppConstants.TEST_UN_ANSWER | |||
chooseResult = AppConstants.TEST_UN_ANSWER | |||
} | |||
//创建错误记录 | |||
createErrorRecord() | |||
//创建错误记录,作文知识点测试不创建错误记录 | |||
if (intentData.examType != AppConstants.TEST_TYPE_COMPOSITION) { | |||
createErrorRecord() | |||
} | |||
} | |||
currentChooseResultLiveData.value = chooseResult | |||
} | |||
@@ -594,9 +596,27 @@ class LearnExamViewModel : LearnBaseViewModel() { | |||
//最终上传数据 | |||
record.addExam(learnExam) //测试试卷 | |||
//时间 | |||
if (examType == AppConstants.TEST_TYPE_BEFORE_TOTAL || examType == AppConstants.TEST_TYPE_BEFORE || examType == AppConstants.TEST_TYPE_AFTER || examType == AppConstants.TEST_TYPE_AFTER_TOTAL) { | |||
//时间 学习中心的测试需要添加为学习时间 | |||
if (examType == AppConstants.TEST_TYPE_BEFORE_TOTAL | |||
|| examType == AppConstants.TEST_TYPE_BEFORE | |||
|| examType == AppConstants.TEST_TYPE_AFTER | |||
|| examType == AppConstants.TEST_TYPE_AFTER_TOTAL | |||
|| examType == AppConstants.TEST_TYPE_COMPOSITION) { | |||
record.addDuration(saveCurrentLearnDuration()) | |||
//作文知识点测试,添加一个单词,用以设置课程的进度点 | |||
if (examType == AppConstants.TEST_TYPE_COMPOSITION){ | |||
record.addEntity(LearnEntity.newBuilder().apply { | |||
projectId = intentData.subjectId.toLong() | |||
packId = intentData.coursePackId | |||
courseId = intentData.courseId | |||
chapterId = intentData.lesson!!.chapterId | |||
lessonId = intentData.lesson!!.lessonId | |||
entityId = intentData.testData!![0].id | |||
created = DateUtil.format(System.currentTimeMillis(), DateUtil.FORMAT_1) | |||
tag = "android" | |||
isOnlySavePoint = true | |||
}) | |||
} | |||
} | |||
if (mLearnEntities.size != 0) { | |||
record.addAllEntity(mLearnEntities) | |||
@@ -633,6 +653,10 @@ class LearnExamViewModel : LearnBaseViewModel() { | |||
DataRepository.saveRecord(record) | |||
// record 已经实例化并已经将数据保存 | |||
// LogUtil.e(JsonFormat.printToString(record.build())) | |||
//知识点测试,标记当前课时为完成 | |||
if (intentData.examType == AppConstants.TEST_TYPE_COMPOSITION){ | |||
intentData.lesson!!.learnIsOver = true | |||
} | |||
}.compose(diskIo2Main()).subscribe({ | |||
showHideLoading(false) | |||
@@ -686,6 +710,14 @@ class LearnExamViewModel : LearnBaseViewModel() { | |||
this.scoreValue = this@LearnExamViewModel.scoreValue | |||
}) | |||
} | |||
AppConstants.TEST_TYPE_COMPOSITION -> { //知识点测试结束发送数据,当做学习完成处理 | |||
LiveEventBus.get<LearnEventData>(AppConstants.EVENT_LESSON_DATA).post(LearnEventData( | |||
intentData.subjectId, | |||
intentData.courseId, | |||
AppConstants.DATA_LESSON_LEARN_OVER).apply { | |||
leesonPositionIndex = intentData.lesson!!.lessonPositionInList | |||
}) | |||
} | |||
} | |||
} | |||
@@ -2,12 +2,16 @@ package com.xkl.cdl.module.learn | |||
import android.annotation.SuppressLint | |||
import android.graphics.Color | |||
import android.opengl.Visibility | |||
import android.os.Bundle | |||
import android.text.SpannableStringBuilder | |||
import android.view.MotionEvent | |||
import android.view.View | |||
import android.view.ViewGroup | |||
import android.widget.TextView | |||
import androidx.constraintlayout.widget.ConstraintLayout | |||
import androidx.core.content.ContextCompat | |||
import androidx.fragment.app.FragmentManager | |||
import androidx.lifecycle.ViewModelProvider | |||
import androidx.recyclerview.widget.GridLayoutManager | |||
import androidx.recyclerview.widget.LinearLayoutManager | |||
@@ -24,6 +28,7 @@ import com.suliang.common.util.image.ImageLoader | |||
import com.suliang.common.util.media.EMediaState | |||
import com.suliang.common.util.media.IMPListener | |||
import com.suliang.common.util.media.MPManager | |||
import com.suliang.common.util.os.ScreenUtil | |||
import com.xkl.cdl.R | |||
import com.xkl.cdl.adapter.AdapterHistoricalRoute | |||
import com.xkl.cdl.adapter.AdapterSpell | |||
@@ -217,6 +222,12 @@ class LearnWordActivity : BaseActivityVM<ActivityLearnWordBinding, LearnWordView | |||
incWorcDetailBinding.root.visibility = it | |||
} | |||
} | |||
if (vm.learnData.lesson.courseType == AppConstants.COURSE_TYPE_CHINESE_COMPOSITION){ | |||
bindingWord.imgWord.visibility = View.GONE | |||
val layoutParams = bindingWord.incWord.root.layoutParams as ConstraintLayout.LayoutParams | |||
layoutParams.goneTopMargin = ScreenUtil.dp2px(12f).toInt() | |||
bindingWord.incWord.root.requestLayout() | |||
} | |||
} | |||
//初始化按钮 | |||
@@ -807,19 +818,20 @@ class LearnWordActivity : BaseActivityVM<ActivityLearnWordBinding, LearnWordView | |||
/** 学习完成 */ | |||
private fun showLearnOverDialog() { | |||
//自动播放完成弹窗 | |||
if (vm.learnData.isAutoPlay){ | |||
val drawable = DrawableUti.changeSvgSizeAndColor(resources, R.drawable.ic_right, R.color.theme_color,3) | |||
CommonDialog.newInstance(CommonDialogBean(titleText = R.string.quit_auto_play_title_over, | |||
rightText = R.string.sure),drawable).apply { | |||
onCommonDialogButtonClickListener = { dialog, isRightClick -> | |||
dialog.dismissAllowingStateLoss() | |||
finish() | |||
} | |||
}.show(supportFragmentManager, "auto_play_back_dialog") | |||
return | |||
when{ | |||
//自动播放完成弹窗 | |||
vm.learnData.isAutoPlay -> showAutoPlayOverDialog() | |||
//作文知识点完成 | |||
vm.learnData.lesson.courseType == AppConstants.COURSE_TYPE_CHINESE_COMPOSITION -> showCompositionKnowLeageLearningOver() | |||
//其他单词类,带学后测试的课时完成 | |||
else -> showLessonWordLearningOver() | |||
} | |||
} | |||
/** | |||
* 单词类学习完成 | |||
*/ | |||
private fun showLessonWordLearningOver() { | |||
vm.loadAfterTest().observe(this) { showTimeCount -> | |||
LearnDialog.newInstance(LearnDialogBean(AppConstants.DIALOG_TYPE_LEARNING_OVER).apply { | |||
correctNumber = vm.learnData.lesson.correctNumber | |||
@@ -829,34 +841,13 @@ class LearnWordActivity : BaseActivityVM<ActivityLearnWordBinding, LearnWordView | |||
onDialogListener = { action, dialog -> | |||
when (action) { | |||
//重学动作 | |||
AppConstants.DIALOG_LESSON_RELEARN -> CommonDialog.newInstance(CommonDialogBean(titleText = R.string.lesson_relearn_title, | |||
contentText = R.string.lesson_relearn_content, | |||
leftText = R.string.cancel, | |||
rightText = R.string.sure)) | |||
.apply { | |||
onCommonDialogButtonClickListener = { relearnDialog, isRightClick -> | |||
relearnDialog.dismissAllowingStateLoss() | |||
if (isRightClick){ | |||
dialog.dismissAllowingStateLoss() | |||
//发送动作 : 重新学习 | |||
LiveEventBus.get<LearnEventData>(AppConstants.EVENT_LESSON_ACTION).post( | |||
LearnEventData(vm.learnData.lesson.subjectId, | |||
vm.learnData.lesson.courseId, | |||
AppConstants.ACTION_LESSON_AFTER_TEST_RELEARN).apply { | |||
leesonPositionIndex = vm.learnData.lesson.lessonPositionInList | |||
}) | |||
finish() | |||
} | |||
} | |||
}.show(childFragmentManager,"lesson_relearn_tip") | |||
AppConstants.DIALOG_LESSON_RELEARN -> lessonRelearnDialog(dialog) | |||
// 开始学后测试 | |||
AppConstants.DIALOG_START_TEST -> { | |||
dialog.dismissAllowingStateLoss() | |||
//发送动作 : 学后测试 | |||
LiveEventBus.get<LearnEventData>(AppConstants.EVENT_LESSON_ACTION).post( | |||
LearnEventData(vm.learnData.lesson.subjectId, | |||
vm.learnData.lesson.courseId, | |||
AppConstants.ACTION_LESSON_AFTER_TEST_AGAIN).apply { | |||
LiveEventBus.get<LearnEventData>(AppConstants.EVENT_LESSON_ACTION) | |||
.post(LearnEventData(vm.learnData.lesson.subjectId, vm.learnData.lesson.courseId, AppConstants.ACTION_LESSON_AFTER_TEST_AGAIN).apply { | |||
leesonPositionIndex = vm.learnData.lesson.lessonPositionInList | |||
}) | |||
finish() | |||
@@ -867,5 +858,66 @@ class LearnWordActivity : BaseActivityVM<ActivityLearnWordBinding, LearnWordView | |||
} | |||
} | |||
/** | |||
* 自动播放完成弹窗 | |||
*/ | |||
private fun showAutoPlayOverDialog() { | |||
val drawable = DrawableUti.changeSvgSizeAndColor(resources, R.drawable.ic_right, R.color.theme_color,3) | |||
CommonDialog.newInstance(CommonDialogBean(titleText = R.string.quit_auto_play_title_over, | |||
rightText = R.string.sure),drawable).apply { | |||
onCommonDialogButtonClickListener = { dialog, _ -> | |||
dialog.dismissAllowingStateLoss() | |||
finish() | |||
} | |||
}.show(supportFragmentManager, "auto_play_back_dialog") | |||
} | |||
/** | |||
* 作文知识点学习完成弹窗 | |||
*/ | |||
private fun showCompositionKnowLeageLearningOver(){ | |||
LearnDialog.newInstance(LearnDialogBean(AppConstants.DIALOG_TYPE_LESSON_COMPOSITION_KNOWLEDGE_LEARNING_OVER).apply { | |||
correctNumber = vm.learnData.lesson.correctNumber | |||
errorNumber = vm.learnData.lesson.errorNumber | |||
}).apply { | |||
onDialogListener = { action, dialog -> | |||
when(action){ | |||
//重学,重学弹窗提示 | |||
AppConstants.DIALOG_LESSON_RELEARN -> lessonRelearnDialog(dialog) | |||
//完成 关闭,不处理 | |||
AppConstants.DIALOG_OVER -> { | |||
dialog.dismissAllowingStateLoss() | |||
finish() | |||
} | |||
} | |||
} | |||
}.show(supportFragmentManager,"composition_knowledge_learn_over") | |||
} | |||
/*** | |||
* 课时重学确认弹窗 | |||
* @param dialog LearnDialog 触发重学弹窗显示的弹窗 | |||
*/ | |||
private fun lessonRelearnDialog(dialog : LearnDialog) { | |||
CommonDialog.newInstance( | |||
CommonDialogBean(titleText = R.string.lesson_relearn_title, contentText = R.string.lesson_relearn_content, | |||
leftText = R.string.cancel, rightText = R.string.sure)).apply { | |||
onCommonDialogButtonClickListener = { relearnDialog, isRightClick -> | |||
relearnDialog.dismissAllowingStateLoss() | |||
if (isRightClick) { | |||
dialog.dismissAllowingStateLoss() | |||
//发送动作 : 重新学习 | |||
LiveEventBus.get<LearnEventData>(AppConstants.EVENT_LESSON_ACTION) | |||
.post(LearnEventData(vm.learnData.lesson.subjectId, vm.learnData.lesson.courseId, AppConstants.ACTION_LESSON_AFTER_TEST_RELEARN).apply { | |||
leesonPositionIndex = vm.learnData.lesson.lessonPositionInList | |||
}) | |||
finish() | |||
} | |||
} | |||
}.show(dialog.childFragmentManager, "lesson_relearn_tip") | |||
} | |||
} |
@@ -47,7 +47,10 @@ class LearnWordViewModel : LearnBaseViewModel() { | |||
//是否需要显示单词图片 | |||
var isNeedLoadPhoto = when (learnData.lesson.coursePackType) { | |||
AppConstants.COURSEPACK_TYPE_ENGLISH_WORD, AppConstants.COURSEPACK_TYPE_ENGLISH_SOUNDMARK, AppConstants.COURSEPACK_TYPE_CHINESE_LITERACY, AppConstants.COURSEPACK_TYPE_CHINESE_PINYIN -> true | |||
AppConstants.COURSEPACK_TYPE_ENGLISH_WORD, | |||
AppConstants.COURSEPACK_TYPE_ENGLISH_SOUNDMARK, | |||
AppConstants.COURSEPACK_TYPE_CHINESE_LITERACY, | |||
AppConstants.COURSEPACK_TYPE_CHINESE_PINYIN -> true | |||
else -> false | |||
} | |||
@@ -173,7 +173,7 @@ class CoursePackMainActivity : BaseActivityVM<ActivityCourseMainBinding, CourseP | |||
tabSpell.click { binding.viewPager2.currentItem = 1 } | |||
tabVoice.click { binding.viewPager2.currentItem = 2 } | |||
} | |||
//监听进度,设置进度 | |||
//监听进度,设置进度 进度为百分制,已经乘了100了 | |||
vm.currentCourseProgress.observe(this) { | |||
binding.includeCourseProgress.apply { | |||
//进度格式化 |
@@ -7,6 +7,7 @@ import androidx.recyclerview.widget.LinearLayoutManager | |||
import androidx.recyclerview.widget.RecyclerView | |||
import com.jeremyliao.liveeventbus.LiveEventBus | |||
import com.suliang.common.base.fragment.BaseFragmentVM | |||
import com.suliang.common.util.LogUtil | |||
import com.xkl.cdl.R | |||
import com.xkl.cdl.adapter.AdapterLesson | |||
import com.xkl.cdl.data.AppConstants | |||
@@ -90,35 +91,78 @@ class CourseLessonFragment : BaseFragmentVM<FragmentCourseLessonBinding, CourseM | |||
adapterLesson.notifyItemChanged(learnEventData.leesonPositionIndex) | |||
vm.allLesson[learnEventData.leesonPositionIndex].let { | |||
val key = "${it.chapterId}_${it.lessonId}" | |||
//更新错误数 | |||
vm.courseDetail.wrong.put(key, it.errorNumber) | |||
//更新正确数 | |||
vm.courseDetail.right.put(key, it.correctNumber) | |||
//添加到错误本中,现在主要用于小游戏取值 | |||
learnEventData.newErrorMap?.forEach { | |||
vm.courseDetail.temporary_words.put(it.key, "") | |||
when (it.lessonType) { | |||
//单词类 | |||
AppConstants.LESSON_TYPE_WORD ->{ | |||
vm.courseDetail.run { | |||
wrong[key] = it.errorNumber //更新错误数 | |||
right[key] = it.correctNumber //更新正确数 | |||
lesson_learn_point[key] = it.wordIds[it.learnedIndex] //更新课时学习点 | |||
course_learn_point = "${key}_${it.wordIds[it.learnedIndex]}" //更新课程学习点 | |||
} | |||
// TODO: 2022/5/17 如果不需要小游戏,则这个可以取消,存放的value为time,暂时感觉没必要,所以直接用空内容数据 | |||
//添加到错误本中,现在主要用于小游戏取值 | |||
learnEventData.newErrorMap?.forEach { | |||
vm.courseDetail.temporary_words[it.key] = "" | |||
} | |||
} | |||
AppConstants.LESSON_TYPE_SENTENCE -> { | |||
} | |||
AppConstants.LESSON_TYPE_DIALOGUE -> { | |||
} | |||
//视频 | |||
AppConstants.LESSON_TYPE_COMPOSITION_VIDEO -> vm.courseDetail.run { | |||
val relationId = it.wordIds[0] | |||
//更新视频播放点 | |||
vp[relationId] = learnEventData.videoPlayTime | |||
//更新课程学习点 | |||
lesson_learn_point[key] = relationId //更新课时学习点 | |||
course_learn_point = "${key}_${relationId}" //更新课程学习点 | |||
} | |||
//知识点 | |||
AppConstants.LESSON_TYPE_COMPOSITION_KNOWLEDGE -> vm.courseDetail.run { | |||
wrong[key] = it.errorNumber //更新错误数 | |||
right[key] = it.correctNumber //更新正确数 | |||
lesson_learn_point[key] = it.wordIds[it.learnedIndex] //更新课时学习点 | |||
course_learn_point = "${key}_${it.wordIds[it.learnedIndex]}" //更新课程学习点 | |||
} | |||
//测试 | |||
AppConstants.LESSON_TYPE_COMPOSITION_EXAM -> vm.courseDetail.run { | |||
course_learn_point = "${key}_0}" //更新课程学习点 | |||
} | |||
//课堂练习 | |||
AppConstants.LESSON_TYPE_COMPOSITION_READING -> vm.courseDetail.run { | |||
lesson_learn_point[key] = it.wordIds[it.learnedIndex] //更新课时学习点 | |||
course_learn_point = "${key}_${it.wordIds[it.learnedIndex]}" //更新课程学习点 | |||
} | |||
//课外练习 不操作,不计算 | |||
AppConstants.LESSON_TYPE_COMPOSITION_TASK -> { } | |||
else -> {} | |||
} | |||
//更新课时学习点 | |||
vm.courseDetail.lesson_learn_point.put("${it.chapterId}_${it.lessonId}", it.wordIds[it.learnedIndex]) | |||
//更新课程学习点 | |||
vm.courseDetail.course_learn_point = "${it.chapterId}_${it.lessonId}_${it.wordIds[it.learnedIndex]}" | |||
} | |||
//课程进度 | |||
val courseProgress = when (vm.course.coursePackType) { | |||
AppConstants.COURSEPACK_TYPE_CHINESE_COMPOSITION -> CourseManager.calculateCompositionCourseProgess( | |||
AppConstants.COURSEPACK_TYPE_CHINESE_COMPOSITION -> CourseManager.calculateCompositionCourseProgress( | |||
vm.allLesson) | |||
AppConstants.COURSEPACK_TYPE_ENGLISH_SPOKEN -> CourseManager.calculateSpokenCourseProgress(vm.allLesson) | |||
else -> CourseManager.calculateEnglishCourseProgress(vm.allLesson) | |||
} | |||
vm.courseDetail.courseLearnProgress = courseProgress | |||
vm.course.courseLearnProgress = courseProgress | |||
vm.coursePackMainActivityVM.currentCourseProgress.value = courseProgress | |||
//项目总进度 | |||
val subjectProgress = CourseManager.calculateSubjectProgress(vm.course.subjectId, vm.course.coursePackId, | |||
vm.course.courseId, courseProgress) | |||
//保存 | |||
vm.updateLearnSchedule(courseProgress, subjectProgress) | |||
//与本地进度不同,则需要保存修改 | |||
if (vm.courseDetail.courseLearnProgress != courseProgress) { | |||
LogUtil.i("修改保存课程与项目进度") | |||
vm.courseDetail.courseLearnProgress = courseProgress | |||
vm.course.courseLearnProgress = courseProgress | |||
vm.coursePackMainActivityVM.currentCourseProgress.value = courseProgress | |||
//项目总进度 | |||
val subjectProgress = CourseManager.calculateSubjectProgress(vm.course.subjectId, vm.course.coursePackId, | |||
vm.course.courseId, courseProgress) | |||
//保存 | |||
vm.updateLearnSchedule(courseProgress, subjectProgress) | |||
} | |||
} | |||
//学后测试结束传递数据回来更新数据 | |||
@@ -204,6 +248,23 @@ class CourseLessonFragment : BaseFragmentVM<FragmentCourseLessonBinding, CourseM | |||
} | |||
} | |||
} | |||
/*作文知识点测试的再测一次*/ | |||
AppConstants.ACTION_LESSON_COMPOSITION_TEST_AGAIN -> { | |||
// 滑动到指定课时,进行动态设置点击 | |||
val linearLayoutManager = binding.recyclerView.layoutManager as LinearLayoutManager | |||
val findFirstVisibleItemPosition = linearLayoutManager.findFirstVisibleItemPosition() //第一个可见位置 | |||
val findLastVisibleItemPosition = linearLayoutManager.findLastVisibleItemPosition() //最后一个可见位置 | |||
if (learnEventData.leesonPositionIndex in findFirstVisibleItemPosition .. findLastVisibleItemPosition) { | |||
linearLayoutManager.findViewByPosition(learnEventData.leesonPositionIndex) | |||
?.findViewById<ConstraintLayout>(R.id.layout_content) | |||
?.performClick() | |||
} else { | |||
recycleViewScrollListener.lessonPosition = learnEventData.leesonPositionIndex | |||
binding.recyclerView.addOnScrollListener(recycleViewScrollListener) | |||
binding.recyclerView.smoothScrollToPosition(learnEventData.leesonPositionIndex) | |||
} | |||
} | |||
} | |||
} | |||
} | |||
@@ -247,18 +308,41 @@ class CourseLessonFragment : BaseFragmentVM<FragmentCourseLessonBinding, CourseM | |||
AppConstants.LESSON_TYPE_DIALOGUE -> { | |||
} | |||
//视频 | |||
AppConstants.LESSON_TYPE_COMPOSITION_VIDEO -> { | |||
} | |||
AppConstants.LESSON_TYPE_COMPOSITION_KNOWLEDGE -> { | |||
//知识点 : 直接进入学习,没有学前学后测试 判断学习是否完成,完成的情况下需要弹窗提示 | |||
AppConstants.LESSON_TYPE_COMPOSITION_KNOWLEDGE -> when{ | |||
//学习完成,弹窗提示 | |||
entity.learnIsOver -> LearnDialog.newInstance(LearnDialogBean(AppConstants.DIALOG_TYPE_LESSON_ITEM_CLICK_COMPOSITION_KNOWLEDGE_OVER).apply { | |||
errorNumber = entity.errorNumber | |||
correctNumber = entity.correctNumber | |||
}).apply { | |||
onDialogListener = { action, dialog -> | |||
when(action){ | |||
//重学,重学弹窗提示 | |||
AppConstants.DIALOG_LESSON_RELEARN -> lessonRelearnDialog(dialog,entity) | |||
//完成 关闭,不处理 | |||
AppConstants.DIALOG_OVER -> dialog.dismissAllowingStateLoss() | |||
} | |||
} | |||
}.show(childFragmentManager,"composition_knowledge_learn_over") | |||
//未完成 | |||
else -> startLearn(entity) | |||
} | |||
AppConstants.LESSON_TYPE_COMPOSITION_EXAM -> { | |||
//测试: 直接进入测试,类型为作文知识点测试 | |||
AppConstants.LESSON_TYPE_COMPOSITION_EXAM -> { | |||
vm.loadTest(AppConstants.TEST_TYPE_COMPOSITION,entity).observe(this){ | |||
startLessonTest(entity,AppConstants.TEST_TYPE_COMPOSITION,it) | |||
} | |||
} | |||
//课堂练习 | |||
AppConstants.LESSON_TYPE_COMPOSITION_READING -> { | |||
} | |||
//课外练习 | |||
AppConstants.LESSON_TYPE_COMPOSITION_TASK -> { | |||
} | |||
@@ -302,16 +386,6 @@ class CourseLessonFragment : BaseFragmentVM<FragmentCourseLessonBinding, CourseM | |||
when (lesson.lessonType) { | |||
AppConstants.LESSON_TYPE_WORD -> { | |||
startLessonLearnForWord(lesson) | |||
/* if (entity.beforeTestScore == AppConstants.NOT_DOING){ //课时学前测试,没有做 | |||
//弹窗显示学前测试提示 | |||
showLessonBeforeTestStartDialog(entity) | |||
}else if (!entity.learnIsOver){ //当前课时未学完,直接开始学习 | |||
startLearn(entity) | |||
}else if (entity.afterTestScore != AppConstants.NOT_DOING){ | |||
loadLessonAfterTest(entity) | |||
}else{ //当前课时学习完成的弹窗 | |||
showLessonAllOverDialog(entity) | |||
}*/ | |||
} | |||
AppConstants.LESSON_TYPE_SENTENCE -> { | |||
@@ -324,7 +398,7 @@ class CourseLessonFragment : BaseFragmentVM<FragmentCourseLessonBinding, CourseM | |||
} | |||
AppConstants.LESSON_TYPE_COMPOSITION_KNOWLEDGE -> { | |||
startLessonLearnForWord(lesson) | |||
} | |||
AppConstants.LESSON_TYPE_COMPOSITION_EXAM -> { | |||
@@ -353,25 +427,7 @@ class CourseLessonFragment : BaseFragmentVM<FragmentCourseLessonBinding, CourseM | |||
onDialogListener = { action, dialog -> | |||
when (action) { | |||
//重学动作 | |||
AppConstants.DIALOG_LESSON_RELEARN -> CommonDialog.newInstance(CommonDialogBean(titleText = R.string.lesson_relearn_title, | |||
contentText = R.string.lesson_relearn_content, | |||
leftText = R.string.cancel, | |||
rightText = R.string.sure)) | |||
.apply { | |||
onCommonDialogButtonClickListener = { relearnDialog, isRightClick -> | |||
relearnDialog.dismissAllowingStateLoss() | |||
if (isRightClick){ | |||
dialog.dismissAllowingStateLoss() | |||
//发送动作 : 重新学习 | |||
LiveEventBus.get<LearnEventData>(AppConstants.EVENT_LESSON_ACTION).post( | |||
LearnEventData(lesson.subjectId, | |||
lesson.courseId, | |||
AppConstants.ACTION_LESSON_AFTER_TEST_RELEARN).apply { | |||
leesonPositionIndex = lesson.lessonPositionInList | |||
}) | |||
} | |||
} | |||
}.show(childFragmentManager,"lesson_relearn_tip") | |||
AppConstants.DIALOG_LESSON_RELEARN -> lessonRelearnDialog(dialog, lesson) | |||
// 开始学后测试 | |||
AppConstants.DIALOG_START_TEST -> { | |||
dialog.dismissAllowingStateLoss() | |||
@@ -421,23 +477,7 @@ class CourseLessonFragment : BaseFragmentVM<FragmentCourseLessonBinding, CourseM | |||
onDialogListener = { action, dialog -> | |||
when (action) { | |||
//重学动作 | |||
AppConstants.DIALOG_LESSON_RELEARN -> CommonDialog.newInstance( | |||
CommonDialogBean(titleText = R.string.lesson_relearn_title, | |||
contentText = R.string.lesson_relearn_content, leftText = R.string.cancel, | |||
rightText = R.string.sure)).apply { | |||
onCommonDialogButtonClickListener = { relearnDialog, isRightClick -> | |||
relearnDialog.dismissAllowingStateLoss() | |||
if (isRightClick) { | |||
dialog.dismissAllowingStateLoss() | |||
//发送动作 : 重新学习 | |||
LiveEventBus.get<LearnEventData>(AppConstants.EVENT_LESSON_ACTION).post( | |||
LearnEventData(lesson.subjectId, lesson.courseId, | |||
AppConstants.ACTION_LESSON_AFTER_TEST_RELEARN).apply { | |||
leesonPositionIndex = lesson.lessonPositionInList | |||
}) | |||
} | |||
} | |||
}.show(childFragmentManager, "lesson_relearn_tip") | |||
AppConstants.DIALOG_LESSON_RELEARN -> lessonRelearnDialog(dialog, lesson) | |||
// 开始学后测试 | |||
AppConstants.DIALOG_START_TEST -> { | |||
dialog.dismissAllowingStateLoss() | |||
@@ -452,6 +492,28 @@ class CourseLessonFragment : BaseFragmentVM<FragmentCourseLessonBinding, CourseM | |||
}.show(childFragmentManager, "learn_over_dialog") | |||
} | |||
/** 课时重学提示弹窗 | |||
* @param dialog LearnDialog 从其他弹窗点击提示的该弹窗 | |||
* @param lesson Lesson 需要重学的课时 | |||
*/ | |||
private fun lessonRelearnDialog(dialog : LearnDialog?, lesson : Lesson) { | |||
CommonDialog.newInstance( | |||
CommonDialogBean(titleText = R.string.lesson_relearn_title, contentText = R.string.lesson_relearn_content, | |||
leftText = R.string.cancel, rightText = R.string.sure)).apply { | |||
onCommonDialogButtonClickListener = { relearnDialog, isRightClick -> | |||
relearnDialog.dismissAllowingStateLoss() | |||
if (isRightClick) { | |||
dialog?.dismissAllowingStateLoss() | |||
//发送动作 : 重新学习 | |||
LiveEventBus.get<LearnEventData>(AppConstants.EVENT_LESSON_ACTION) | |||
.post(LearnEventData(lesson.subjectId, lesson.courseId, AppConstants.ACTION_LESSON_AFTER_TEST_RELEARN).apply { | |||
leesonPositionIndex = lesson.lessonPositionInList | |||
}) | |||
} | |||
} | |||
}.show(childFragmentManager, "lesson_relearn_tip") | |||
} | |||
/** | |||
* 显示课程学习完成的弹窗,在最后一个课时测试完成的下一步,相当于在课时目录页显示去学后总测试的弹窗 | |||
*/ |
@@ -27,8 +27,8 @@ class CourseMainFragment : BaseFragmentVM<FragmentCourseMainBinding, CourseMainF | |||
companion object { | |||
@JvmStatic | |||
fun newInstance(courseIndex : Int):CourseMainFragment { | |||
return CourseMainFragment().apply { | |||
fun newInstance(courseIndex : Int) : CourseMainFragment { | |||
return CourseMainFragment().apply { | |||
arguments = Bundle().apply { | |||
putInt(AppConfig.INTENT_1, courseIndex) | |||
} | |||
@@ -102,28 +102,39 @@ class CourseMainFragment : BaseFragmentVM<FragmentCourseMainBinding, CourseMainF | |||
override fun loadData() { | |||
vm.loadMain().observe(this) { | |||
changeChildrenFragment() | |||
when (vm.course.courseType) { | |||
//作文只有一个目录结构 | |||
AppConstants.COURSE_TYPE_CHINESE_COMPOSITION -> changeChildrenFragmentForComposition() | |||
else -> changeChildrenFragmentForWord() | |||
} | |||
} | |||
} | |||
/** | |||
* 改变加载的子Fragment | |||
* 改变加载的子Fragment 单词类 | |||
*/ | |||
private fun changeChildrenFragment() { | |||
private fun changeChildrenFragmentForWord() { | |||
// TODO: 2022/5/5 复习页面加载 | |||
vm.courseDetail.run { | |||
if (st_before == AppConstants.NOT_DOING) { //学前总测未做 | |||
currentFragment = CourseTotalTestFragment.newInstance(AppConstants.TEST_TYPE_BEFORE_TOTAL) | |||
replaceFragment(R.id.layout_root, currentFragment) | |||
} else if (courseLearnProgress != 100.0) { //学习未完成 | |||
currentFragment = CourseLessonFragment.newInstance() | |||
replaceFragment(R.id.layout_root, currentFragment) | |||
} else { //学习完成,学后总测试界面 | |||
currentFragment = CourseTotalTestFragment.newInstance(AppConstants.TEST_TYPE_AFTER_TOTAL) | |||
replaceFragment(R.id.layout_root,currentFragment) | |||
currentFragment = vm.courseDetail.let { | |||
when{ | |||
it.st_before == AppConstants.NOT_DOING -> CourseTotalTestFragment.newInstance(AppConstants.TEST_TYPE_BEFORE_TOTAL) //学前总测未做 | |||
it.courseLearnProgress != AppConstants.DOING_OVER -> CourseLessonFragment.newInstance() //学习未完成 | |||
else -> CourseTotalTestFragment.newInstance(AppConstants.TEST_TYPE_AFTER_TOTAL) //学习完成,学后总测试界面 | |||
} | |||
} | |||
replaceFragment(R.id.layout_root, currentFragment) | |||
} | |||
/** | |||
* 改变加载的子Fragment 作文 | |||
*/ | |||
private fun changeChildrenFragmentForComposition() { | |||
// TODO: 2022/5/5 复习页面加载 CourseReviewFragment.newInstance() | |||
currentFragment = vm.courseDetail.let { | |||
CourseLessonFragment.newInstance() | |||
} | |||
replaceFragment(R.id.layout_root, currentFragment) | |||
} | |||
/** | |||
@@ -134,7 +145,7 @@ class CourseMainFragment : BaseFragmentVM<FragmentCourseMainBinding, CourseMainF | |||
when (position) { | |||
1 -> { | |||
currentFragment = CourseLessonFragment.newInstance() | |||
replaceFragment(R.id.layout_root,currentFragment ) | |||
replaceFragment(R.id.layout_root, currentFragment) | |||
} | |||
2 -> { | |||
currentFragment = CourseTotalTestFragment.newInstance(AppConstants.TEST_TYPE_AFTER_TOTAL) | |||
@@ -153,7 +164,7 @@ class CourseMainFragment : BaseFragmentVM<FragmentCourseMainBinding, CourseMainF | |||
/** 课程重学方法 */ | |||
fun courseRelearn() { | |||
//调用重学,重学重新加载数据,重新加载界面 | |||
vm.relearnCourse().observe(this){ | |||
vm.relearnCourse().observe(this) { | |||
loadData() | |||
} | |||
} |
@@ -87,7 +87,10 @@ class CourseMainFragmentViewModel(val courseIndex : Int) : BaseViewModel() { | |||
/** 课程包主页上的更多按钮点击是否有效 */ | |||
fun showMoreIsEnable() : Boolean { | |||
return courseDetail.st_before != AppConstants.NOT_DOING | |||
return when(course.courseType){ | |||
AppConstants.COURSE_TYPE_CHINESE_COMPOSITION -> courseDetail.courseLearnProgress > 0 | |||
else -> courseDetail.st_before != AppConstants.NOT_DOING | |||
} | |||
} | |||
/** | |||
@@ -200,7 +203,11 @@ class CourseMainFragmentViewModel(val courseIndex : Int) : BaseViewModel() { | |||
fun relearnLesson(lessonPositionIndex : Int) : MutableLiveData<Boolean> { | |||
val result = MutableLiveData<Boolean>() | |||
//重学课时后课程的进度 | |||
val courseProgress = CourseManager.calculateEnglishCourseProgress(allLesson, true, lessonPositionIndex) | |||
val courseProgress = when(course.subjectId){ | |||
AppConstants.SUBJECT_ENGLISH -> CourseManager.calculateEnglishCourseProgress(allLesson, true, lessonPositionIndex) | |||
//作文的重学虚拟进度 | |||
else -> CourseManager.calculateCompositionCourseProgress(allLesson,true,lessonPositionIndex) | |||
} | |||
//重学课时后项目的总进度 | |||
val subjectProgress = CourseManager.calculateSubjectProgressWithCourseLessonRelearn(course.subjectId, course.coursePackId, | |||
course.courseId, courseProgress) |
@@ -297,6 +297,13 @@ | |||
app:constraint_referenced_ids="tv_score,tv_tip,tv_title,inc_statistics_number,tv_top,tv_left,vSplit" | |||
/>--> | |||
<!-- 作文测试结束绑定的布局组 --> | |||
<!-- <androidx.constraintlayout.widget.Group--> | |||
<!-- android:layout_width="wrap_content"--> | |||
<!-- android:layout_height="wrap_content"--> | |||
<!-- app:constraint_referenced_ids="tv_score,tv_tip,tv_title,inc_statistics_number,tv_left,vSplit"--> | |||
<!-- />--> | |||
</androidx.constraintlayout.widget.ConstraintLayout> |
@@ -18,8 +18,10 @@ | |||
android:paddingLeft="4dp" | |||
android:paddingRight="4dp" | |||
android:textSize="@dimen/smallerSize" | |||
android:maxLines="1" | |||
android:text="hello" | |||
android:lines="1" | |||
android:ellipsize="end" | |||
android:maxEms="10" | |||
tools:text="hello" | |||
tools:background="@drawable/shape_rounder_toplr_8_white"/> | |||
</LinearLayout> | |||
</layout> |