Skip to content

Instantly share code, notes, and snippets.

@vihuela
Created May 10, 2018 08:53
Show Gist options
  • Save vihuela/d60e603f1403062b31c3d31cefa7be45 to your computer and use it in GitHub Desktop.
Save vihuela/d60e603f1403062b31c3d31cefa7be45 to your computer and use it in GitHub Desktop.
fun getScheduleList(view: IView, success: (d: List<TreeNode<*>>) -> Unit, failure: () -> Unit) {
running = getBehavior(running)
Observable.just(source)
.doOnSubscribe {
source.clear()
}
.defPolicy(this)
.bindToBehavior(running!!)
.observeOn(Schedulers.io())
.flatMap {
//轮播图
ApiCacheProvider.IMPL.getSelectCourseBanner(Api.IMPL.getSelectCourseBanner("app_banner").compose(UoocTransformer()),
DynamicKey("app_banner"),
EvictDynamicKey(ApiUtils.isRxCacheEvict)
)
}
.flatMap {
val data = arrayListOf<AdvertisementItem>().apply {
it.data?.data?.app_banner?.forEach {
add(AdvertisementItem(it.activity1_title, it.activity1_app_h5_url, it.activity1_img_url))
if (it.type == "20") {
add(AdvertisementItem(it.activity2_title, it.activity2_app_h5_url, it.activity2_img_url))
}
}
}
if (data.isNotEmpty()) {
val typeBanner = TreeNode(Type8(data))
source.add(typeBanner)
}
//微专业
ApiCacheProvider.IMPL.profession(Api.IMPL.profession().compose(UoocTransformer()),
EvictProvider(ApiUtils.isRxCacheEvict))
}
.flatMap {
//微专业
if (it.data.code == 1) {
it.data?.data?.profession?.forEachIndexed { index, course ->
if (course.course_list != null && course.course_list.isNotEmpty()) {
if (index == 0) source.add(TreeNode(Type0(getString(R.string.ic_micro))))
val parentNode = TreeNode(Type2(course.name, course.app_desc_img))
course.course_list.forEachIndexed { indexSub, it ->
val item = ScheduleItem(
it.id,
it.cover_img,
it.parent_name,
"${it.uname}/${it.org_name}",
it.finished_task_cnt,
it.course_task_cnt,
it.online ?: "")
if (it.course_live == 1) {
item.livingItem = ScheduleItem.LivingItem(it.id)
}
parentNode.addChild(TreeNode(Type3(item)))
//正在直播
if (item.livingItem != null) {
parentNode.addChild(TreeNode(Type13(item.livingItem!!, false)))
}
}
source.add(parentNode)
source.add(TreeNode(Type12()))
}
}
}
//第二课堂
it.data?.data?.course?.forEachIndexed { index, course ->
if (index == 0) source.add(TreeNode(Type0(getString(R.string.main_schedule_job_courses))))
val item = ScheduleItem(
course.id,
course.cover_img,
course.parent_name,
"${course.uname}/${course.org_name}",
course.finished_task_cnt,
course.course_task_cnt,
course.online ?: "")
if (course.course_live == 1) {
item.livingItem = ScheduleItem.LivingItem(course.id)
}
source.add(TreeNode(Type7(item)))
//正在直播
if (item.livingItem != null) {
source.add(TreeNode(Type13(item.livingItem!!)))
}
}
//检查所有学分课
val r = it.data?.data?.profession?.isNotEmpty() == true || it.data?.data?.course?.isNotEmpty() == true
Observables.combineLatest(
//学分课
Observables.combineLatest(
ApiCacheProvider.IMPL.getSelectCourseList(//开课中学分课
Api.IMPL.getSelectCourseList("learn", 1).compose(UoocTransformer()),
DynamicKey("learn${1}"),
EvictDynamicKey(ApiUtils.isRxCacheEvict)),
ApiCacheProvider.IMPL.getSelectCourseList(//未开始学分课
Api.IMPL.getSelectCourseList("nostart", 1).compose(UoocTransformer()),
DynamicKey("nostart${1}"),
EvictDynamicKey(ApiUtils.isRxCacheEvict)),
ApiCacheProvider.IMPL.getSelectCourseList(//已结束学分课
Api.IMPL.getSelectCourseList("finish", 1).compose(UoocTransformer()),
DynamicKey("finish${1}"),
EvictDynamicKey(ApiUtils.isRxCacheEvict))),
//是否已存在微专业或第二课堂
Observable.just(r))
}
.flatMap {
val learnData = it.first.first.data?.data?.data
val noStartData = it.first.second.data?.data?.data
val finishData = it.first.third.data?.data?.data
currentCreditCourseMode = when {
learnData?.isNotEmpty() == true -> "learn"
noStartData?.isNotEmpty() == true -> "nostart"
finishData?.isNotEmpty() == true -> "finish"
else -> "learn"
}
val currentCreditData = when {
learnData?.isNotEmpty() == true -> learnData
noStartData?.isNotEmpty() == true -> noStartData
finishData?.isNotEmpty() == true -> finishData
else -> learnData
}
//获取到学分课数据
if (currentCreditData?.isNotEmpty() == true) {
source.add(TreeNode(Type9()))
source.add(TreeNode(Type1(getString(R.string.main_schedule_credit_courses), when (currentCreditCourseMode) {
"learn" -> getString(R.string.main_schedule_course_start)
"nostart" -> getString(R.string.main_schedule_course_wait)
"finish" -> getString(R.string.main_schedule_course_end)
else -> getString(R.string.main_schedule_course_start)
})))
val t = arrayListOf<ScheduleItem>()
setCreditCourseData(currentCreditData, currentCreditCourseMode, t)
t.forEach {
val element = TreeNode(when (currentCreditCourseMode) {
"learn" -> Type4(it)
"nostart" -> Type5(it)
"finish" -> Type6(it)
else -> Type4(it)
})
source.add(element)
//正在直播
if (it.livingItem != null) {
source.add(TreeNode(Type13(it.livingItem!!)))
}
}
} else {
when (it.second) {
false -> {
//不存在微专业或第二课堂
source.add(TreeNode(Type10()))
}
}
}
Observable.just(source)
}
.map {
expandAllItem(source)
source
}
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
{
currentLoadPage = 2
success.invoke(source)
}, {
failure.invoke()
//异常时可能存在轮播图
if (source.isNotEmpty()) {
currentLoadPage = 2
//未登陆
if (!AccountUtil.getAccount().isLogin) {
source.add(TreeNode(Type11()))
}
success.invoke(source)
} else {
it.parse({ error, message ->
when (error) {
Error.NetWork, Error.Server, Error.Internal, Error.UnKnow -> {
view.showMessageFromNet(error, message)
}
Error.Invalid -> {
when (message) {
"未登录" -> {
source.add(TreeNode(Type11()))
success.invoke(source)
}
else -> {
view.showMessage(message)
}
}
}
}
})
}
})
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment