lmw
2024-10-23 2f204867ad034d3a95ba9acc112d6507f296447b
app/src/main/java/com/sinata/xqmuse/ui/course/CourseDetailActivity.kt
@@ -1,125 +1,246 @@
package com.sinata.xqmuse.ui.course
import android.annotation.SuppressLint
import android.os.CountDownTimer
import android.util.TypedValue
import android.webkit.WebChromeClient
import android.webkit.WebSettings
import android.webkit.WebViewClient
import androidx.core.widget.NestedScrollView
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager
import cn.sinata.xldutils.gone
import cn.sinata.xldutils.utils.*
import cn.sinata.xldutils.utils.SpanBuilder
import cn.sinata.xldutils.utils.showAllowingStateLoss
import cn.sinata.xldutils.visible
import com.github.zackratos.ultimatebar.UltimateBar
import com.google.android.material.appbar.AppBarLayout
import com.sinata.xqmuse.R
import com.sinata.xqmuse.dialog.RiskDialog
import com.sinata.xqmuse.dialog.SendConfirmDialog
import com.sinata.xqmuse.dialog.ShareDialog
import com.sinata.xqmuse.network.HttpManager
import com.sinata.xqmuse.network.entity.Course
import com.sinata.xqmuse.network.entity.Chapter
import com.sinata.xqmuse.network.entity.CourseBean
import com.sinata.xqmuse.network.entity.CourseDetail
import com.sinata.xqmuse.network.entity.VideoBean
import com.sinata.xqmuse.network.request
import com.sinata.xqmuse.ui.TransparentStatusBarActivity
import com.sinata.xqmuse.ui.course.adapter.RecommendAdapter
import com.sinata.xqmuse.ui.course.adapter.VideoNameAdapter
import com.sinata.xqmuse.utils.extention.clickDelay
import com.sinata.xqmuse.ui.course.adapter.ChapterAdapter
import com.sinata.xqmuse.ui.course.adapter.CourseGridAdapter
import com.sinata.xqmuse.utils.AppBarStateChangeListener
import com.sinata.xqmuse.utils.interfaces.StringCallback
import kotlinx.android.synthetic.main.activity_buy_course.*
import kotlinx.android.synthetic.main.activity_course_deatil.*
import kotlinx.android.synthetic.main.activity_course_deatil.iv_cover
import kotlinx.android.synthetic.main.activity_course_deatil.tv_1
import kotlinx.android.synthetic.main.activity_course_deatil.tv_action
import kotlinx.android.synthetic.main.activity_course_deatil.tv_count
import kotlinx.android.synthetic.main.activity_course_deatil.tv_name
import kotlinx.android.synthetic.main.activity_course_deatil.tv_teacher
import org.jetbrains.anko.imageResource
import org.jetbrains.anko.startActivity
import org.jetbrains.anko.textColorResource
class CourseDetailActivity : TransparentStatusBarActivity() {
    override fun setContentView() = R.layout.activity_course_deatil
    private val id by lazy { intent.getStringExtra("id")?:"" }
    private val data by lazy { intent.getParcelableExtra<CourseDetail>("data") }
    private var course: CourseDetail? = null
    private val chapterList = arrayListOf<Chapter>()
    private val chapterAdapter = ChapterAdapter(chapterList)
    private val courseList = arrayListOf<CourseBean>()
    private val courseAdapter = CourseGridAdapter(courseList)
    private val videoList = arrayListOf<VideoBean>()
    private val videoAdapter = VideoNameAdapter(videoList)
    private val courseList = arrayListOf<Course>()
    private val courseAdapter = RecommendAdapter(courseList)
    var scrollByTab = false //true:点击tab滑动,不触发滑动回调,防止回环
    private val SCROLL_DURATION = 500 //滑动时长
    private var timer: CountDownTimer? = null
    override fun initClick() {
        iv_back.setOnClickListener { finish() }
        courseAdapter.setOnItemClickListener { view, position ->
            startActivity<CourseDetailActivity>("id" to courseList[position].id)
        tv_send.setOnClickListener {
            getData(true)
        }
        tv_action.setOnClickListener {
            startActivity<JoinCourseActivity>("id" to id)
            getData(false)
        }
        iv_collected.setOnClickListener {
            iv_collected.isEnabled = false
            HttpManager.collectCourse(id).request(this,success = {_,data->
                iv_collected.isEnabled = true
                course?.isCollect = if (course?.isCollect == "1") "0" else "1"
                iv_collected.imageResource = if (course?.isCollect == "1") R.mipmap.star_red else R.mipmap.star_empty
            }){_,_->
                iv_collected.isEnabled = true
        iv_collect.setOnClickListener {
            HttpManager.collectCourse(data?.id?:"").request(this){_,_->
                data?.recommend = if (data?.recommend == 1) 2 else 1
                iv_collect.setImageResource(if (data?.recommend == 1) R.mipmap.collected else R.mipmap.uncollect)
            }
        }
        tv_start.clickDelay {
            HttpManager.riskInfo().request(this){_,data->
                if (data?.state == 1){
                    RiskDialog.show(supportFragmentManager,data.riskInfo,object :StringCallback{
        iv_share.setOnClickListener {
            val shareDialog = ShareDialog()
            shareDialog.callback = object :StringCallback{
                        override fun onResult(rst: String) {
                            startVideo()
                        }
                    })
                }else
                    startVideo()
            }
            shareDialog.showAllowingStateLoss(supportFragmentManager,"share")
        }
        cb_intro.setOnClickListener {
            scroll2Position(0)
            checkTab(0)
        }
        cb_chapter.setOnClickListener {
            scroll2Position(1)
            checkTab(1)
        }
        cb_push.setOnClickListener {
            scroll2Position(2)
            checkTab(2)
        }
        scrollView.setOnScrollChangeListener { v: NestedScrollView?, scrollX: Int, scrollY: Int, oldScrollX: Int, oldScrollY: Int ->
            if (!scrollByTab)
                when {
                    scrollY>=tv_2.top -> checkTab(2)
                    scrollY>=tv_1.top -> checkTab(1)
                    else -> checkTab(0)
                }
        }
        chapterAdapter.setOnItemClickListener { view, position ->
            getData(false)
        }
    }
    override fun initView() {
        UltimateBar.with(this)
            .statusDark(false)
            .create().immersionBar() //沉浸状态栏
        titleBar.gone()
        rv_list.layoutManager = LinearLayoutManager(this)
        rv_list.adapter = videoAdapter
        rv_course.layoutManager = LinearLayoutManager(this)
        rv_course.adapter = courseAdapter
        getDetail()
    }
        val settings = webView.settings
        settings.javaScriptEnabled = true
        settings.javaScriptCanOpenWindowsAutomatically = true
        settings.defaultTextEncodingName = "utf-8"
        settings.domStorageEnabled = true
        settings.setSupportZoom(true)
//        settings.textZoom = 200
        settings.useWideViewPort = true
        settings.loadWithOverviewMode = true
        settings.layoutAlgorithm = WebSettings.LayoutAlgorithm.TEXT_AUTOSIZING
        webView.webChromeClient = object : WebChromeClient() {}
        webView.webViewClient = object : WebViewClient() {}
        rv_chapter.layoutManager = LinearLayoutManager(this)
        rv_chapter.adapter = chapterAdapter
        rv_push.layoutManager = GridLayoutManager(this,2)
        rv_push.adapter = courseAdapter
    private fun startVideo(){
        showDialog()
        HttpManager.startTrain(id).request(this){_,data->
            startActivity<PreLoadActivity>("course" to data)
//            startActivity<VideoDetailActivity>("course" to data)
        appbar.addOnOffsetChangedListener(object : AppBarStateChangeListener() {
            override fun onStateChanged(appBarLayout: AppBarLayout?, state: State?, ratio:Double) {
                bg.alpha = if(ratio<0.2) 0f else ((ratio-0.2)/0.8).toFloat()
                when (state) {
                    State.EXPANDED -> {
                        //展开状态
                        iv_back.imageResource = R.mipmap.icon_back_white
                        tvTitle.textColorResource = R.color.white
                    }
                    State.COLLAPSED -> {
                        //折叠状态
                        iv_back.imageResource = R.mipmap.back
                        tvTitle.textColorResource = R.color.textColor
        }
    }
            }
        })
    @SuppressLint("SetTextI18n")
    private fun getDetail() {
        HttpManager.queryCourseInfo(id)
            .request(this) { _, data ->
                course = data
                data?.apply {
                    banner.setImageURI(coverImg)
                    tv_name.text = courseName
                    iv_collected.imageResource = if (isCollect == "1") R.mipmap.star_red else R.mipmap.star_empty
                    tv_time.text = "${time}|H${difficulty}"
                    tv_type.text = typeName
                    tv_info.text = introduce
                    if (isFree == 1||isBuy == 1){
                        tv_start.visible()
                    }else{
                        tv_tip.visible()
                        tv_tip.text = "购买后“${typeName}”相关课程均可查看;\n长期有效,我们将持续为您更新。"
                        ll_bottom_1.visible()
                        tv_price.text = SpanBuilder("¥%.2f".format(price.toDouble())).size(0,1,18).build()
                    }
                    videoList.clear()
                    videoList.addAll(videos)
                    videoAdapter.notifyDataSetChanged()
                    courseList.clear()
                    courseList.addAll(recommendCourse)
            iv_collect.setImageResource(if (data?.recommend == 1) R.mipmap.collected else R.mipmap.uncollect)
            iv_cover.setImageURI(detailUrl)
            tv_name.text = courseTitle
            tv_teacher.text = "导师 ${tutor}"
            tv_count.text = "${count}人已加入学习"
            val sHead =
                "<html><head><meta name=\"viewport\" content=\"width=device-width, " + "initial-scale=1.0, minimum-scale=0.5, maximum-scale=2.0, user-scalable=yes\" />" + "<style>img{max-width:100% !important;height:auto !important;}</style>" + "<style>body{max-width:100% !important;}</style>" + "</head><body>"
            webView!!.loadDataWithBaseURL(
                null,
                sHead + briefIntroduction,
                "text/html",
                "utf-8",
                null
            )
            chapterList.addAll(list)
            chapterAdapter.notifyDataSetChanged()
            courseList.addAll(list2)
                    courseAdapter.notifyDataSetChanged()
                    if (courseList.isNullOrEmpty())
                        tv_2.gone()
            if (chargeType == 1||(courseType == 2&&isVip == 1)){
                tv_action.text = "立即学习"
            }else{
                val s = "¥ %s 立即购买".format(generalPrice)
                tv_action.text = SpanBuilder(s).size(0,1,12).size(2,generalPrice.length+2,21).build()
            }
        }
    }
    private fun scroll2Position(position:Int){
        scrollByTab = true
        timer?.cancel()
        when(position){
            0->{
                scrollView.smoothScrollTo(0,0,SCROLL_DURATION)
            }
            1->{
                scrollView.smoothScrollTo(0,tv_1.top,SCROLL_DURATION)
            }
            2->{
                scrollView.smoothScrollTo(0,tv_2.top,SCROLL_DURATION)
            }
        }
        timer = object :CountDownTimer(SCROLL_DURATION.toLong(),SCROLL_DURATION.toLong()){
            override fun onTick(p0: Long) {
            }
            override fun onFinish() {
                scrollByTab = false
            }
        }.start()
    }
    private fun checkTab(i: Int){
        when (i) {
            0 -> {
                cb_intro.textColorResource = R.color.textColor
                cb_intro.setTextSize(TypedValue.COMPLEX_UNIT_SP,21f)
                iv_tab_1.visible()
                cb_chapter.textColorResource = R.color.textColor99
                cb_chapter.setTextSize(TypedValue.COMPLEX_UNIT_SP,16f)
                iv_tab_2.gone()
                cb_push.textColorResource = R.color.textColor99
                cb_push.setTextSize(TypedValue.COMPLEX_UNIT_SP,16f)
                iv_tab_3.gone()
            }
            1 -> {
                cb_chapter.textColorResource = R.color.textColor
                cb_chapter.setTextSize(TypedValue.COMPLEX_UNIT_SP,21f)
                iv_tab_2.visible()
                cb_intro.textColorResource = R.color.textColor99
                cb_intro.setTextSize(TypedValue.COMPLEX_UNIT_SP,16f)
                iv_tab_1.gone()
                cb_push.textColorResource = R.color.textColor99
                cb_push.setTextSize(TypedValue.COMPLEX_UNIT_SP,16f)
                iv_tab_3.gone()
            }
            else -> {
                cb_push.textColorResource = R.color.textColor
                cb_push.setTextSize(TypedValue.COMPLEX_UNIT_SP,21f)
                iv_tab_3.visible()
                cb_intro.textColorResource = R.color.textColor99
                cb_intro.setTextSize(TypedValue.COMPLEX_UNIT_SP,16f)
                iv_tab_1.gone()
                cb_chapter.textColorResource = R.color.textColor99
                cb_chapter.setTextSize(TypedValue.COMPLEX_UNIT_SP,16f)
                iv_tab_2.gone()
                }
            }
    }
    private fun getData(isSend:Boolean) {
        HttpManager.confirmOrder(data?.id?:"").request(this){_,data->
            if (isSend){
                SendConfirmDialog.show(supportFragmentManager,data?.generalPrice?:"0.0",object :StringCallback{
                    override fun onResult(rst: String) {
                        startActivity<BuyCourseActivity>("isSend" to isSend,"data" to data)
                    }
                })
            }else
                startActivity<BuyCourseActivity>("isSend" to isSend,"data" to data)
        }
    }
}