Skip to content

Commit 3eb6757

Browse files
committed
change channel info style
1 parent 72e893b commit 3eb6757

File tree

7 files changed

+93
-49
lines changed

7 files changed

+93
-49
lines changed

README.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,11 @@
1313

1414
## 更新日志
1515

16+
### v1.2.5
17+
18+
* 美化频道信息显示
19+
* 优化节目单获取
20+
1621
### v1.2.4
1722

1823
* 改变换台滑动方向,上一个频道下滑,下一个频道上滑

app/src/main/java/com/lizongying/mytv/InfoFragment.kt

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,17 @@ class InfoFragment : Fragment() {
3333
handler.postDelayed(removeRunnable, delay)
3434
}
3535

36-
fun show() {
36+
fun show(tvViewModel: TVViewModel) {
3737
Log.i("", "show")
38+
binding.textView.text = tvViewModel.title.value
39+
Glide.with(this)
40+
.load(tvViewModel.logo.value)
41+
.into(binding.infoLogo)
42+
val program = tvViewModel.getProgramOne()
43+
if (program != null) {
44+
binding.infoDesc.text = program.name
45+
}
46+
3847
handler.removeCallbacks(removeRunnable)
3948
view?.visibility = View.VISIBLE
4049
handler.postDelayed(removeRunnable, delay)
@@ -52,17 +61,6 @@ class InfoFragment : Fragment() {
5261
view?.visibility = View.GONE
5362
}
5463

55-
fun setInfo(tvViewModel: TVViewModel) {
56-
binding.textView.text = tvViewModel.title.value
57-
Glide.with(this)
58-
.load(tvViewModel.logo.value)
59-
.into(binding.infoLogo)
60-
val program = tvViewModel.getProgramOne()
61-
if (program != null) {
62-
binding.infoDesc.text = program.name
63-
}
64-
}
65-
6664
override fun onDestroyView() {
6765
super.onDestroyView()
6866
_binding = null

app/src/main/java/com/lizongying/mytv/MainActivity.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,8 @@ class MainActivity : FragmentActivity() {
4646
if (savedInstanceState == null) {
4747
supportFragmentManager.beginTransaction()
4848
.add(R.id.main_browse_fragment, playerFragment)
49-
.add(R.id.main_browse_fragment, mainFragment)
5049
.add(R.id.main_browse_fragment, infoFragment)
50+
.add(R.id.main_browse_fragment, mainFragment)
5151
.hide(infoFragment)
5252
.commit()
5353
mainFragment.view?.requestFocus()
@@ -56,8 +56,7 @@ class MainActivity : FragmentActivity() {
5656
}
5757

5858
fun showInfoFragment(tvViewModel: TVViewModel) {
59-
infoFragment.setInfo(tvViewModel)
60-
infoFragment.show()
59+
infoFragment.show(tvViewModel)
6160
}
6261

6362
fun play(tvViewModel: TVViewModel) {

app/src/main/java/com/lizongying/mytv/MainFragment.kt

Lines changed: 39 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ package com.lizongying.mytv
33
import android.content.Context
44
import android.content.SharedPreferences
55
import android.os.Bundle
6+
import android.os.Handler
7+
import android.os.Looper
68
import android.util.Log
79
import androidx.leanback.app.BrowseSupportFragment
810
import androidx.leanback.widget.ArrayObjectAdapter
@@ -16,6 +18,7 @@ import androidx.leanback.widget.Presenter
1618
import androidx.leanback.widget.Row
1719
import androidx.leanback.widget.RowPresenter
1820
import androidx.lifecycle.lifecycleScope
21+
import com.lizongying.mytv.Utils.getDateTimestamp
1922
import com.lizongying.mytv.models.TVListViewModel
2023
import com.lizongying.mytv.models.TVViewModel
2124
import kotlinx.coroutines.Dispatchers
@@ -35,6 +38,9 @@ class MainFragment : BrowseSupportFragment() {
3538

3639
private var lastVideoUrl: String = ""
3740

41+
private val handler = Handler(Looper.getMainLooper())
42+
private lateinit var mUpdateProgramRunnable: UpdateProgramRunnable
43+
3844
override fun onCreate(savedInstanceState: Bundle?) {
3945
super.onCreate(savedInstanceState)
4046
headersState = HEADERS_DISABLED
@@ -47,6 +53,9 @@ class MainFragment : BrowseSupportFragment() {
4753

4854
request = activity?.let { Request(it) }
4955
loadRows()
56+
mUpdateProgramRunnable = UpdateProgramRunnable()
57+
handler.post(mUpdateProgramRunnable)
58+
5059
setupEventListeners()
5160

5261
view?.post {
@@ -92,17 +101,41 @@ class MainFragment : BrowseSupportFragment() {
92101
}
93102
}
94103
}
95-
tvViewModel.program.observe(viewLifecycleOwner) { _ ->
96-
if (tvViewModel.program.value!!.isEmpty()) {
97-
if (tvViewModel.programId.value != null) {
98-
Log.i(TAG, "get program ${tvViewModel.title.value}")
99-
request?.fetchProgram(tvViewModel)
100-
}
104+
}
105+
}
106+
107+
override fun onDestroy() {
108+
super.onDestroy()
109+
handler.removeCallbacks(mUpdateProgramRunnable)
110+
}
111+
112+
fun updateProgram(tvViewModel: TVViewModel) {
113+
val timestamp = getDateTimestamp()
114+
if (timestamp - tvViewModel.programUpdateTime > 60) {
115+
if (tvViewModel.program.value!!.isEmpty()) {
116+
tvViewModel.programUpdateTime = timestamp
117+
request?.fetchProgram(tvViewModel)
118+
} else {
119+
if (timestamp - tvViewModel.program.value!!.last().et < 600) {
120+
tvViewModel.programUpdateTime = timestamp
121+
request?.fetchProgram(tvViewModel)
101122
}
102123
}
103124
}
104125
}
105126

127+
inner class UpdateProgramRunnable : Runnable {
128+
override fun run() {
129+
tvListViewModel.getTVListViewModel().value?.filter { it.programId.value != null }
130+
?.forEach { tvViewModel ->
131+
updateProgram(
132+
tvViewModel
133+
)
134+
}
135+
handler.postDelayed(this, 60000)
136+
}
137+
}
138+
106139
fun check(tvViewModel: TVViewModel): Boolean {
107140
val title = tvViewModel.title.value
108141
val videoUrl = tvViewModel.videoIndex.value?.let { tvViewModel.videoUrl.value?.get(it) }

app/src/main/java/com/lizongying/mytv/Request.kt

Lines changed: 10 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import android.os.Handler
55
import android.os.Looper
66
import android.util.Base64
77
import android.util.Log
8+
import com.lizongying.mytv.Utils.getDateFormat
89
import com.lizongying.mytv.api.ApiClient
910
import com.lizongying.mytv.api.BtraceClient
1011
import com.lizongying.mytv.api.LiveInfo
@@ -20,9 +21,6 @@ import com.lizongying.mytv.proto.Ysp.cn.yangshipin.omstv.common.proto.epgProgram
2021
import retrofit2.Call
2122
import retrofit2.Callback
2223
import retrofit2.Response
23-
import java.text.SimpleDateFormat
24-
import java.util.Date
25-
import java.util.Locale
2624
import javax.crypto.Cipher
2725
import javax.crypto.spec.IvParameterSpec
2826
import javax.crypto.spec.SecretKeySpec
@@ -34,6 +32,7 @@ class Request(var context: Context) {
3432
private var yspBtraceService: YSPBtraceService? = null
3533
private var yspProtoService: YSPProtoService? = null
3634

35+
// TODO onDestroy
3736
private val handler = Handler(Looper.getMainLooper())
3837
private lateinit var myRunnable: MyRunnable
3938

@@ -175,13 +174,13 @@ class Request(var context: Context) {
175174
livepid = pid,
176175
sUrl = "https://www.yangshipin.cn/#/tv/home?pid=$pid",
177176
playno = ysp?.getRand()!!,
178-
ftime = getCurrentDate2(),
177+
ftime = getDateFormat("yyyy-MM-dd HH:mm:ss"),
179178
seq = tvModel.seq.toString(),
180179
)
181180
?.enqueue(object : Callback<Void> {
182181
override fun onResponse(call: Call<Void>, response: Response<Void>) {
183182
if (response.isSuccessful) {
184-
// Log.i(TAG, "$title kvcollect success")
183+
Log.d(TAG, "$title kvcollect success")
185184
} else {
186185
Log.e(TAG, "$title kvcollect status error")
187186
tvModel.firstSource()
@@ -238,20 +237,9 @@ class Request(var context: Context) {
238237
})
239238
}
240239

241-
private fun getCurrentDate(): String {
242-
val currentDate = Date()
243-
val formatter = SimpleDateFormat("yyyyMMdd", Locale.CHINA)
244-
return formatter.format(currentDate)
245-
}
246-
247-
private fun getCurrentDate2(): String {
248-
val currentDate = Date()
249-
val formatter = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA)
250-
return formatter.format(currentDate)
251-
}
252-
253-
fun fetchProgram(tvModel: TVViewModel) {
254-
yspProtoService?.getProgram(tvModel.programId.value!!, getCurrentDate())
240+
fun fetchProgram(tvViewModel: TVViewModel) {
241+
val title = tvViewModel.title.value
242+
yspProtoService?.getProgram(tvViewModel.programId.value!!, getDateFormat("yyyyMMdd"))
255243
?.enqueue(object : Callback<epgProgramModel.Response> {
256244
override fun onResponse(
257245
call: Call<epgProgramModel.Response>,
@@ -260,13 +248,14 @@ class Request(var context: Context) {
260248
if (response.isSuccessful) {
261249
val program = response.body()
262250
if (program != null) {
263-
tvModel.addProgram(program.dataListList)
251+
tvViewModel.addProgram(program.dataListList)
252+
Log.i(TAG, "$title program ${program.dataListList.size}")
264253
}
265254
}
266255
}
267256

268257
override fun onFailure(call: Call<epgProgramModel.Response>, t: Throwable) {
269-
Log.e(TAG, "Program request failed", t)
258+
Log.e(TAG, "$title program request failed $t")
270259
}
271260
})
272261
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.lizongying.mytv
2+
3+
import java.text.SimpleDateFormat
4+
import java.util.Date
5+
import java.util.Locale
6+
7+
object Utils {
8+
fun getDateFormat(format: String): String {
9+
return SimpleDateFormat(format, Locale.CHINA).format(Date())
10+
}
11+
12+
fun getDateTimestamp(): Int {
13+
return (Date().time / 1000).toInt()
14+
}
15+
}

app/src/main/java/com/lizongying/mytv/models/TVViewModel.kt

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import androidx.media3.common.util.UnstableApi
1111
import androidx.media3.datasource.DefaultHttpDataSource
1212
import androidx.media3.exoplayer.hls.HlsMediaSource
1313
import com.lizongying.mytv.TV
14+
import com.lizongying.mytv.Utils.getDateTimestamp
1415
import com.lizongying.mytv.proto.Ysp.cn.yangshipin.omstv.common.proto.programModel.Program
1516
import java.util.Date
1617

@@ -231,6 +232,8 @@ class TVViewModel(private var tv: TV) : ViewModel() {
231232
private var rowPosition: Int = 0
232233
private var itemPosition: Int = 0
233234

235+
var programUpdateTime: Int = 0
236+
234237
private val _programId = MutableLiveData<String>()
235238
val programId: LiveData<String>
236239
get() = _programId
@@ -376,10 +379,10 @@ class TVViewModel(private var tv: TV) : ViewModel() {
376379
return mapping[tv.title]
377380
}
378381

379-
fun getProgram(): MutableList<Program>? {
380-
_program.value = (_program.value?.filter { it.et > (Date().time / 1000) })?.toMutableList()
381-
return _program.value?.subList(0, 2)
382-
}
382+
// fun getProgram(): MutableList<Program>? {
383+
// _program.value = (_program.value?.filter { it.et > (Date().time / 1000) })?.toMutableList()
384+
// return _program.value?.subList(0, 2)
385+
// }
383386

384387
fun getProgramOne(): Program? {
385388
val programNew = (_program.value?.filter { it.et > (Date().time / 1000) })?.toMutableList()
@@ -393,7 +396,10 @@ class TVViewModel(private var tv: TV) : ViewModel() {
393396
}
394397

395398
fun addProgram(p: MutableList<Program>) {
396-
val p1 = (p.filter { it.et > (Date().time / 1000) }).toMutableList()
399+
val timestamp = getDateTimestamp()
400+
401+
// after now & not empty & different
402+
val p1 = (p.filter { it.et > timestamp }).toMutableList()
397403
if (p1.isEmpty() || _program.value == p1) {
398404
return
399405
}
@@ -402,7 +408,7 @@ class TVViewModel(private var tv: TV) : ViewModel() {
402408
_program.value = p1
403409
} else {
404410
_program.value =
405-
((_program.value?.filter { it.et > (Date().time / 1000) && it.st < p1.first().st })?.plus(
411+
((_program.value?.filter { it.et > timestamp && it.st < p1.first().st })?.plus(
406412
p1
407413
))?.toMutableList()
408414
}
@@ -415,7 +421,6 @@ class TVViewModel(private var tv: TV) : ViewModel() {
415421
mHeaders = headers
416422
}
417423

418-
419424
fun setMinimumLoadableRetryCount(minimumLoadableRetryCount: Int) {
420425
mMinimumLoadableRetryCount = minimumLoadableRetryCount
421426
}

0 commit comments

Comments
 (0)