From 2f204867ad034d3a95ba9acc112d6507f296447b Mon Sep 17 00:00:00 2001
From: lmw <125975490@qq.com>
Date: 星期三, 23 十月 2024 18:20:43 +0800
Subject: [PATCH] save

---
 app/src/main/java/com/sinata/xqmuse/ui/course/CourseDetailActivity.kt |  287 ++++++++++++++++++++++++++++++++++++++++----------------
 1 files changed, 204 insertions(+), 83 deletions(-)

diff --git a/app/src/main/java/com/sinata/xqmuse/ui/course/CourseDetailActivity.kt b/app/src/main/java/com/sinata/xqmuse/ui/course/CourseDetailActivity.kt
index 6a81b0f..49a60fb 100644
--- a/app/src/main/java/com/sinata/xqmuse/ui/course/CourseDetailActivity.kt
+++ b/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{
-                        override fun onResult(rst: String) {
-                            startVideo()
-                        }
-                    })
-                }else
-                    startVideo()
+        iv_share.setOnClickListener {
+            val shareDialog = ShareDialog()
+            shareDialog.callback = object :StringCallback{
+                override fun onResult(rst: String) {
+
+                }
             }
+            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
+
+        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
+                    }
+                }
+            }
+        })
+
+        data?.apply {
+            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 (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 startVideo(){
-        showDialog()
-        HttpManager.startTrain(id).request(this){_,data->
-            startActivity<PreLoadActivity>("course" to data)
-//            startActivity<VideoDetailActivity>("course" to data)
+    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()
+            }
         }
     }
 
-    @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()
+    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)
                     }
-                    videoList.clear()
-                    videoList.addAll(videos)
-                    videoAdapter.notifyDataSetChanged()
-
-                    courseList.clear()
-                    courseList.addAll(recommendCourse)
-                    courseAdapter.notifyDataSetChanged()
-                    if (courseList.isNullOrEmpty())
-                        tv_2.gone()
-                }
-            }
+                })
+            }else
+                startActivity<BuyCourseActivity>("isSend" to isSend,"data" to data)
+        }
     }
-
 }

--
Gitblit v1.7.1