lmw
1 天以前 9904e5f900ba751c1fe719cdf889f00e9f1418e8
app/src/main/java/com/dollearn/student/ui/home/ListenActivity.kt
@@ -2,51 +2,134 @@
import android.annotation.SuppressLint
import android.os.Handler
import android.os.Looper
import android.os.Message
import android.view.ViewGroup
import androidx.core.os.bundleOf
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentPagerAdapter
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.viewpager.widget.ViewPager
import cn.sinata.xldutils.gone
import cn.sinata.xldutils.visible
import com.dollearn.student.R
import com.dollearn.student.dialog.TipDialog
import com.dollearn.student.network.HttpManager
import com.dollearn.student.network.entity.SortBean
import com.dollearn.student.network.entity.SubjectBean
import com.dollearn.student.network.request
import com.dollearn.student.ui.TransparentStatusBarActivity
import com.dollearn.student.utils.AudioUtils
import com.dollearn.student.ui.home.adapter.IndexAdapter
import com.dollearn.student.utils.Const
import com.dollearn.student.utils.event.EmptyEvent
import kotlinx.android.synthetic.main.activity_listen.*
import org.greenrobot.eventbus.EventBus
class ListenActivity:TransparentStatusBarActivity() {
    override fun setContentView() = R.layout.activity_listen
    private val day by lazy {
        intent.getIntExtra("day",0)
    }
    private val week by lazy {
        intent.getIntExtra("week",0)
    }
    private val season by lazy {
        intent.getIntExtra("season",0)
    }
    val data by lazy { intent.getParcelableExtra<SubjectBean>("data") }
    private val fragments    = arrayListOf<Fragment>()
    val fragments    = arrayListOf<Fragment>()
    val viewPager by lazy { view_pager }
    var totalCount = 0 //总答题次数
    var rightCount = 0 //正确答题次数
    var time = 0 //学习秒数
    private var handler:Handler? = null
    val indexList = arrayListOf<SortBean>()
    private val indexAdapter = IndexAdapter(indexList)
    override fun initClick() {
        tv_last.setOnClickListener {
            (fragments[view_pager.currentItem-1] as ListenFragment).recover()
            view_pager.setCurrentItem(view_pager.currentItem-1,true)
            if (view_pager.currentItem == 0)
                tv_last.gone()
            val tipDialog = TipDialog()
            tipDialog.arguments = bundleOf("msg" to "是否重新开始答题?确认后将清空当前答题进度")
            tipDialog.setCallback(object :TipDialog.OnClickCallback{
                override fun onOk() {
                    showDialog()
                    HttpManager.restart(day,week,1).request(this@ListenActivity){_,_->
                        totalCount = 0 //总答题次数
                        rightCount = 0 //正确答题次数
                        time = 0 //学习秒数
                        data!!.list.forEach { it.status = 1 }
                        data!!.accuracy = 0.0
                        indexList.forEach { it.status = 1 }
                        indexAdapter.notifyDataSetChanged()
                        data?.accuracy = 0.0
                        (fragments[0] as ListenFragment).recover()
                        view_pager.setCurrentItem(0,false)
                    }
                }
                override fun onCancel() {
                }
            })
            tipDialog.show(supportFragmentManager,"restart")
        }
        tv_exit.setOnClickListener {
            onBackPressed()
        }
        indexAdapter.setOnItemClickListener { view, position ->
            val sortBean = indexList[position]
            if (position!=viewPager.currentItem/4&&(sortBean.status!=1||position == indexList.indexOf(indexList.first { it.status == 1 }))){
                (fragments[position*4] as ListenFragment).recover()
                view_pager.setCurrentItem(position*4,false)
            }
        }
    }
    fun next(){
        (fragments[view_pager.currentItem+1] as ListenFragment).recover()
        view_pager.setCurrentItem(view_pager.currentItem+1,true)
        tv_last.visible()
        val listenFragment = fragments[viewPager.currentItem] as ListenFragment
        val sortBean = data!!.list[viewPager.currentItem]
        sortBean.status = if (listenFragment.right) 2 else 3 //修改本地答题结果,并上传服务器
        HttpManager.answerQuestion(sortBean).request(this){_,data->
            //保存成功
        }
        indexList.clear()
        (data!!.subjectList.indices).forEach {
            val subList = data!!.list.subList(it * 4, it * 4 + 4)
            val status = if (subList.filter { it.status!=1 }.size != 4) 1 else if (subList.filter { it.status==2 }.size == 4) 2 else 3
            indexList.add(SortBean("",status))
        }
        val filter = indexList.filter { it.status != 1 }
        data?.accuracy = if (filter.isEmpty()) 0.0 else filter.filter { it.status == 2 }.size.toDouble() / filter.size
        if (view_pager.currentItem == fragments.lastIndex){
            handler?.removeMessages(0)
            ResultActivity.startResult(this,day,week,season,1,totalCount,rightCount,data!!.data.integral,time,data!!.data.id)
            finish()
        }else{
            val i = view_pager.currentItem + 1
            (fragments[i] as ListenFragment).recover()
            view_pager.setCurrentItem(i,i%4 == 0)
            tv_last.visible()
            indexAdapter.notifyDataSetChanged()
        }
    }
    override fun initView() {
        rv_index.layoutManager = LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL,false)
        rv_index.adapter = indexAdapter
        data?.apply {
            val flatMap = subjectList?.flatMap { it }
            tv_progress.text = "已完成:1/${flatMap.size}"
            tv_progress.text = "已完成:1/%d\n正确率:%.2f%s".format(subjectList.size,accuracy*100,"%")
            indexList.clear()
            (subjectList.indices).forEach {
                val subList = list.subList(it * 4, it * 4 + 4)
                val status = if (subList.filter { it.status!=1 }.size != 4) 1 else if (subList.filter { it.status==2 }.size == 4) 2 else 3
                indexList.add(SortBean("",status))
            }
            indexAdapter.notifyDataSetChanged()
            flatMap.forEachIndexed { index, subject ->
                fragments.add(ListenFragment.getInstance(index/4,index%4))
            }
@@ -74,12 +157,33 @@
                }
                override fun onPageSelected(position: Int) {
                    tv_progress.text = "已完成:${position+1}/${flatMap.size}"
                    tv_progress.text = "已完成:%d/%d\n正确率:%.2f%s".format(position/4+1,subjectList.size,accuracy*100,"%")
                }
                override fun onPageScrollStateChanged(state: Int) {
                }
            })
        }
        recover()
        handler= object :Handler(Looper.myLooper()!!){
            override fun handleMessage(msg: Message) {
                super.handleMessage(msg)
                if (msg.what == 0){
                    time++
                    handler?.sendEmptyMessageDelayed(0,1000L)
                }
            }
        }
        handler?.sendEmptyMessageDelayed(0,1000L)
    }
    private fun recover(){
        HttpManager.teamSchedule(day,week,1).request(this){_,data->
            view_pager.setCurrentItem((data?.schedule?:1)-1,false)
            if (view_pager.currentItem != 0)
                tv_last.visible()
            totalCount = data?.answerNumber?:0
            rightCount = data?.correctNumber?:0
        }
    }
@@ -88,7 +192,10 @@
        tipDialog.arguments = bundleOf("msg" to "未完成全部答题,确认退出吗?")
        tipDialog.setCallback(object :TipDialog.OnClickCallback{
            override fun onOk() {
//                HttpManager.exitLearning()
                val list = (data?.subjectList?: arrayListOf()).flatMap { it }.subList(0,view_pager.currentItem)
                HttpManager.exitLearning(view_pager.currentItem,season,time,totalCount,rightCount,day,week,1,data?.data?.id?:"", list.joinToString(",") { it.id }).request(this@ListenActivity){_,_->
                    finish()
                }
            }
            override fun onCancel() {
@@ -96,4 +203,11 @@
        })
        tipDialog.show(supportFragmentManager,"exit")
    }
    override fun onDestroy() {
        super.onDestroy()
        handler?.removeMessages(0)
        handler = null
        EventBus.getDefault().post(EmptyEvent(Const.EventCode.STOP_TIMER))
    }
}