罗明文
18 小时以前 442124baa483f8d1c4aaca7ff81e15dd3f122363
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
package com.dollearn.student.ui.home
 
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.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") }
    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 {
            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(){
        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/%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))
            }
            view_pager.adapter = @SuppressLint("WrongConstant")
            object : FragmentPagerAdapter(supportFragmentManager,0) {
                override fun getItem(p0: Int): Fragment {
                    return fragments[p0]
                }
 
                override fun getCount(): Int {
                    return fragments.size
                }
 
                override fun destroyItem(container: ViewGroup, position: Int, `object`: Any) {
                }
            }
            view_pager.offscreenPageLimit = 8
            view_pager.addOnPageChangeListener(object :ViewPager.OnPageChangeListener{
                override fun onPageScrolled(
                    position: Int,
                    positionOffset: Float,
                    positionOffsetPixels: Int
                ) {
 
                }
 
                override fun onPageSelected(position: Int) {
                    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
        }
    }
 
    override fun onBackPressed() {
        val tipDialog = TipDialog()
        tipDialog.arguments = bundleOf("msg" to "未完成全部答题,确认退出吗?")
        tipDialog.setCallback(object :TipDialog.OnClickCallback{
            override fun onOk() {
                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() {
            }
        })
        tipDialog.show(supportFragmentManager,"exit")
    }
 
    override fun onDestroy() {
        super.onDestroy()
        handler?.removeMessages(0)
        handler = null
        EventBus.getDefault().post(EmptyEvent(Const.EventCode.STOP_TIMER))
    }
}