From 0285f1b3b17b4977c213edc27f0e0f0cbe2f95c8 Mon Sep 17 00:00:00 2001 From: Li ZongYing Date: Wed, 20 Dec 2023 14:55:39 +0800 Subject: [PATCH] remove left headers --- app/src/main/cpp/arm64-v8a/libnative.so | Bin 38904 -> 38304 bytes app/src/main/cpp/armeabi-v7a/libnative.so | Bin 34764 -> 34192 bytes .../java/com/lizongying/mytv/CardPresenter.kt | 32 +- .../com/lizongying/mytv/ExoPlayerAdapter.kt | 23 +- app/src/main/java/com/lizongying/mytv/Info.kt | 9 - .../java/com/lizongying/mytv/MainActivity.kt | 36 ++- .../java/com/lizongying/mytv/MainFragment.kt | 275 +++++++++--------- .../lizongying/mytv/PlaybackControlGlue.kt | 4 +- .../com/lizongying/mytv/PlaybackFragment.kt | 27 +- .../main/java/com/lizongying/mytv/Request.kt | 10 +- .../main/java/com/lizongying/mytv/TVList.kt | 17 +- .../main/java/com/lizongying/mytv/api/YSP.kt | 4 +- .../lizongying/mytv/models/TVListViewModel.kt | 66 +++-- .../com/lizongying/mytv/models/TVViewModel.kt | 71 ++++- app/src/main/res/values/themes.xml | 5 +- 15 files changed, 341 insertions(+), 238 deletions(-) delete mode 100644 app/src/main/java/com/lizongying/mytv/Info.kt diff --git a/app/src/main/cpp/arm64-v8a/libnative.so b/app/src/main/cpp/arm64-v8a/libnative.so index 10ddfa6b0cec5a158247a83037ed10bd0daadc87..88d9f87605e9b7208d0dce9a5c0725ef7545c4ab 100755 GIT binary patch literal 38304 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 literal 38904 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 diff --git a/app/src/main/cpp/armeabi-v7a/libnative.so b/app/src/main/cpp/armeabi-v7a/libnative.so index 748fe66602d5027853848ec640e033a2581ceeb6..21148dfe0ecb523446fe759ac6f6359fa25c9916 100755 GIT binary patch literal 34192 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 literal 34764 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 Yqg~}NL8Vi?!qaZS_0XSVR9CzI2?&vf&j0`b diff --git a/app/src/main/java/com/lizongying/mytv/CardPresenter.kt b/app/src/main/java/com/lizongying/mytv/CardPresenter.kt index aac0880..843d816 100644 --- a/app/src/main/java/com/lizongying/mytv/CardPresenter.kt +++ b/app/src/main/java/com/lizongying/mytv/CardPresenter.kt @@ -49,12 +49,12 @@ class CardPresenter( } override fun onBindViewHolder(viewHolder: ViewHolder, item: Any) { - val tv = item as TV + val tvViewModel = item as TVViewModel val cardView = viewHolder.view as ImageCardView - cardView.titleText = tv.title + cardView.titleText = tvViewModel.title.value cardView.setMainImageDimensions(CARD_WIDTH, CARD_HEIGHT) - cardView.tag = tv.videoUrl + cardView.tag = tvViewModel.videoUrl.value // lifecycleScope.launch(Dispatchers.IO) { // val videoThumbnail = tv.videoUrl?.let { getVideoThumbnail(it) } @@ -83,17 +83,17 @@ class CardPresenter( private fun updateCardBackgroundColor(view: ImageCardView) { val currentTag = view.tag - lifecycleScope.launch(Dispatchers.IO) { - delay(1000) - if (view.isSelected && view.tag != null && currentTag == view.tag) { - val videoThumbnail = view.tag.toString().let { getVideoThumbnail(it) } - withContext(Dispatchers.Main) { - if (view.isSelected && currentTag == view.tag) { - view.mainImageView.setImageBitmap(videoThumbnail) - } - } - } - } +// lifecycleScope.launch(Dispatchers.IO) { +// delay(1000) +// if (view.isSelected && view.tag != null && currentTag == view.tag) { +// val videoThumbnail = view.tag.toString().let { getVideoThumbnail(it) } +// withContext(Dispatchers.Main) { +// if (view.isSelected && currentTag == view.tag) { +// view.mainImageView.setImageBitmap(videoThumbnail) +// } +// } +// } +// } } private fun getVideoThumbnail(url: String): Bitmap? { @@ -112,7 +112,7 @@ class CardPresenter( companion object { private const val TAG = "CardPresenter" - private const val CARD_WIDTH = 313 - private const val CARD_HEIGHT = 176 + private const val CARD_WIDTH = 300 + private const val CARD_HEIGHT = 169 } } \ No newline at end of file diff --git a/app/src/main/java/com/lizongying/mytv/ExoPlayerAdapter.kt b/app/src/main/java/com/lizongying/mytv/ExoPlayerAdapter.kt index 1df9bfb..efbca9e 100644 --- a/app/src/main/java/com/lizongying/mytv/ExoPlayerAdapter.kt +++ b/app/src/main/java/com/lizongying/mytv/ExoPlayerAdapter.kt @@ -10,6 +10,8 @@ import androidx.leanback.media.PlaybackGlueHost import androidx.leanback.media.PlayerAdapter import androidx.leanback.media.SurfaceHolderGlueHost import androidx.media3.common.MediaItem +import androidx.media3.common.PlaybackException +import androidx.media3.common.Player import androidx.media3.common.util.UnstableApi import androidx.media3.datasource.DefaultHttpDataSource import androidx.media3.exoplayer.ExoPlayer @@ -176,6 +178,14 @@ open class ExoPlayerAdapter(private var mContext: Context?) : PlayerAdapter() { return mBufferedProgress } + private var mPlayerErrorListener: PlayerErrorListener? = null + + private inner class PlayerErrorListener : Player.Listener { + override fun onPlayerError(error: PlaybackException) { + callback.onError(this@ExoPlayerAdapter, error.errorCode, error.message) + } + } + /** * Sets the media source of the player witha given URI. * @@ -189,6 +199,13 @@ open class ExoPlayerAdapter(private var mContext: Context?) : PlayerAdapter() { } mMediaSourceUri = uri prepareMediaForPlaying() + + mPlayer?.playWhenReady = true + + if (mPlayerErrorListener == null) { + mPlayerErrorListener = PlayerErrorListener() + mPlayer?.addListener(mPlayerErrorListener!!) + } return true } @@ -221,7 +238,7 @@ open class ExoPlayerAdapter(private var mContext: Context?) : PlayerAdapter() { throw RuntimeException(e) } mPlayer?.prepare() - mPlayer?.playWhenReady = true + callback.onPlayStateChanged(this@ExoPlayerAdapter) } @@ -232,6 +249,10 @@ open class ExoPlayerAdapter(private var mContext: Context?) : PlayerAdapter() { override fun isPrepared(): Boolean { return mInitialized && (mSurfaceHolderGlueHost == null || mHasDisplay) } + + companion object { + private const val TAG = "ExoPlayerAdapter" + } } internal class VideoPlayerSurfaceHolderCallback(private val playerAdapter: ExoPlayerAdapter) : diff --git a/app/src/main/java/com/lizongying/mytv/Info.kt b/app/src/main/java/com/lizongying/mytv/Info.kt deleted file mode 100644 index d7855a5..0000000 --- a/app/src/main/java/com/lizongying/mytv/Info.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.lizongying.mytv - -import java.io.Serializable - -data class Info( - var rowPosition: Int = 0, - var itemPosition: Int = 0, - var item: TV, -) : Serializable \ No newline at end of file diff --git a/app/src/main/java/com/lizongying/mytv/MainActivity.kt b/app/src/main/java/com/lizongying/mytv/MainActivity.kt index a2ba521..0684c1a 100644 --- a/app/src/main/java/com/lizongying/mytv/MainActivity.kt +++ b/app/src/main/java/com/lizongying/mytv/MainActivity.kt @@ -18,6 +18,7 @@ import android.widget.TextView import android.widget.Toast import androidx.core.content.ContextCompat import androidx.fragment.app.FragmentActivity +import com.lizongying.mytv.models.TVViewModel import java.security.MessageDigest @@ -43,8 +44,6 @@ class MainActivity : FragmentActivity() { .hide(infoFragment) .commit() } - - Log.i(TAG, "Signature ${getAppSignature()}") } fun switchInfoFragment(tv: TV) { @@ -68,9 +67,9 @@ class MainActivity : FragmentActivity() { .commit() } - fun play(tv: TV) { - Log.i(TAG, "play: $tv") - playbackFragment.play(tv) + fun play(tvViewModel: TVViewModel) { + Log.i(TAG, "play: ${tvViewModel.getTV()}") + playbackFragment.play(tvViewModel) } fun prev() { @@ -173,30 +172,57 @@ class MainActivity : FragmentActivity() { } KeyEvent.KEYCODE_DPAD_CENTER -> { + Log.i(TAG, "KEYCODE_DPAD_CENTER") switchMainFragment() } KeyEvent.KEYCODE_DPAD_UP -> { if (mainFragment.isHidden) { prev() + } else { + if (mainFragment.selectedPosition == 0) { + mainFragment.setSelectedPosition( + mainFragment.tvListViewModel.maxNum.size - 1, + false + ) + } } } KeyEvent.KEYCODE_DPAD_DOWN -> { if (mainFragment.isHidden) { next() + } else { + if (mainFragment.selectedPosition == mainFragment.tvListViewModel.maxNum.size - 1) { +// mainFragment.setSelectedPosition(0, false) + hideMainFragment() + return false + } } } KeyEvent.KEYCODE_DPAD_LEFT -> { if (mainFragment.isHidden) { prevSource() + } else { + if (mainFragment.tvListViewModel.getTVViewModelCurrent() + ?.getItemPosition() == 0 + ) { +// mainFragment.toLastPosition() + hideMainFragment() + } } } KeyEvent.KEYCODE_DPAD_RIGHT -> { if (mainFragment.isHidden) { nextSource() + } else { + if (mainFragment.tvListViewModel.getTVViewModelCurrent() + ?.getItemPosition() == mainFragment.tvListViewModel.maxNum[mainFragment.selectedPosition] - 1 + ) { + mainFragment.toFirstPosition() + } } } } diff --git a/app/src/main/java/com/lizongying/mytv/MainFragment.kt b/app/src/main/java/com/lizongying/mytv/MainFragment.kt index 5bb1e60..17c3f64 100644 --- a/app/src/main/java/com/lizongying/mytv/MainFragment.kt +++ b/app/src/main/java/com/lizongying/mytv/MainFragment.kt @@ -19,32 +19,25 @@ import androidx.leanback.widget.Row import androidx.leanback.widget.RowPresenter import androidx.lifecycle.lifecycleScope import com.lizongying.mytv.models.TVListViewModel +import com.lizongying.mytv.models.TVViewModel import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch + class MainFragment : BrowseSupportFragment() { - var itemPosition: Int = 0 - private val list2: MutableList = mutableListOf() - private var request: Request? = null private var rowsAdapter: ArrayObjectAdapter? = null - private var tvListViewModel = TVListViewModel() + var tvListViewModel = TVListViewModel() private var sharedPref: SharedPreferences? = null - -// override fun onCreateView( -// inflater: LayoutInflater, -// container: ViewGroup?, -// savedInstanceState: Bundle? -// ): View? { -// super.onCreate() -// // 使用自定义的布局文件 -// return inflater.inflate(R.layout.custom_browse_fragment, container, false) -// } + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + headersState = HEADERS_DISABLED + } override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) @@ -60,59 +53,109 @@ class MainFragment : BrowseSupportFragment() { // request?.fetchPage() } - tvListViewModel.getListLiveData().value?.forEach { tvViewModel -> - tvViewModel.videoIndex.observe(viewLifecycleOwner) { videoIndex -> - if (tvViewModel.getIsFirstTime()) { - tvViewModel.isFirstTime(false) - } else { - val tv = tvViewModel.getTV() + tvListViewModel.getTVListViewModel().value?.forEach { tvViewModel -> + tvViewModel.ready.observe(viewLifecycleOwner) { _ -> + if (tvViewModel.ready.value != null) { + Log.i(TAG, "ready ${tvViewModel.title.value}") if (tvViewModel.id.value == itemPosition) { - (activity as? MainActivity)?.play(tv) + (activity as? MainActivity)?.play(tvViewModel) // (activity as? MainActivity)?.switchInfoFragment(tv) } } } + tvViewModel.change.observe(viewLifecycleOwner) { _ -> + if (tvViewModel.change.value != null) { + Log.i(TAG, "switch to ${tvViewModel.title.value}") + if (tvViewModel.ysp() != null) { + Log.i(TAG, "${tvViewModel.title.value} to get ysp") + lifecycleScope.launch(Dispatchers.IO) { + tvViewModel.let { request?.fetchData(it) } + } + } else { + (activity as? MainActivity)?.play(tvViewModel) +// (activity as? MainActivity)?.switchInfoFragment(item) + } + setSelectedPosition( + tvViewModel.getRowPosition(), true, + SelectItemViewHolderTask(tvViewModel.getItemPosition()) + ) + Toast.makeText( + activity, + tvViewModel.title.value, + Toast.LENGTH_SHORT + ).show() + } + } } } + fun toLastPosition() { + setSelectedPosition( + selectedPosition, false, + SelectItemViewHolderTask(tvListViewModel.maxNum[selectedPosition] - 1) + ) + } + + fun toFirstPosition() { + setSelectedPosition( + selectedPosition, false, + SelectItemViewHolderTask(0) + ) + } + + override fun startHeadersTransition(withHeaders: Boolean) { +// check(mCanShowHeaders) { "Cannot start headers transition" } +// if (isInHeadersTransition || mShowingHeaders == withHeaders) { +// return +// } +// startHeadersTransitionInternal(withHeaders) + } + private fun setupUIElements() { brandColor = ContextCompat.getColor(context!!, R.color.fastlane_background) +// var headers = headersSupportFragment +// headers.setMenuVisibility(false) +// Log.i(TAG, "headers $headers") + +// setHeadersState(HEADERS_DISABLED); +// +// setHeaderPresenterSelector(object : PresenterSelector() { +// override fun getPresenter(o: Any): Presenter { +// return IconHeaderItemPresenter() +// } +// }) +// showHeaders(true) } - private fun updateRows(tv: TV) { -// 获取适配器中的数据 - val dataList = rowsAdapter?.replace(tv.id, tv) -// -//// 修改数据 -//// 这里假设 dataList 是一个可变的列表 -// dataList[position] = updatedData -// -//// 刷新适配器 -// rowsAdapter.notifyItemChanged(position) -// rowsAdapter.notifyItemRangeChanged() - } +// private fun updateRows(tv: TV) { +//// 获取适配器中的数据 +// val dataList = rowsAdapter?.replace(tv.id, tv) +//// +////// 修改数据 +////// 这里假设 dataList 是一个可变的列表 +//// dataList[position] = updatedData +//// +////// 刷新适配器 +//// rowsAdapter.notifyItemChanged(position) +//// rowsAdapter.notifyItemRangeChanged() +// } private fun loadRows() { - val list = TVList.list - rowsAdapter = ArrayObjectAdapter(ListRowPresenter()) val cardPresenter = CardPresenter(lifecycleScope) var idx: Long = 0 - for ((k, v) in list) { + for ((k, v) in TVList.list) { val listRowAdapter = ArrayObjectAdapter(cardPresenter) - var idx2 = 0 - for ((_, v1) in v) { - list2.add( - Info( - idx.toInt(), idx2, v1 - ) - ) - listRowAdapter.add(v1) - idx2++ - tvListViewModel.addTV(v1) + for ((idx2, v1) in v.withIndex()) { + val tvViewModel = TVViewModel(v1) + tvViewModel.setRowPosition(idx.toInt()) + tvViewModel.setItemPosition(idx2) + tvListViewModel.addTVViewModel(tvViewModel) + listRowAdapter.add(tvViewModel) } + tvListViewModel.maxNum.add(v.size) val header = HeaderItem(idx, k) rowsAdapter!!.add(ListRow(header, listRowAdapter)) idx++ @@ -126,23 +169,9 @@ class MainFragment : BrowseSupportFragment() { savePosition(0) } - val tv = list2[itemPosition].item + val tvViewModel = tvListViewModel.getTVViewModel(itemPosition) + tvViewModel?.changed() - val tvModel = tvListViewModel.getTVModel(itemPosition) - if (tvModel?.ysp() != null) { - lifecycleScope.launch(Dispatchers.IO) { - tvModel.let { request?.fetchData(it) } - } - } else { - (activity as? MainActivity)?.play(tv) -// (activity as? MainActivity)?.switchInfoFragment(tv) - } - - Toast.makeText( - activity, - tv.title, - Toast.LENGTH_SHORT - ).show() (activity as? MainActivity)?.switchMainFragment() } @@ -153,6 +182,7 @@ class MainFragment : BrowseSupportFragment() { } fun savePosition(position: Int) { + tvListViewModel.setItemPosition(position) with(sharedPref!!.edit()) { putInt("position", position) apply() @@ -163,97 +193,63 @@ class MainFragment : BrowseSupportFragment() { view?.post { itemPosition-- if (itemPosition == -1) { - itemPosition = list2.size - 1 + itemPosition = tvListViewModel.size() - 1 } savePosition(itemPosition) - val l = list2[itemPosition] - - val tvModel = tvListViewModel.getTVModel(itemPosition) - if (tvModel?.ysp() != null) { - Log.i(TAG, "${tvModel.title} to get ysp") - lifecycleScope.launch(Dispatchers.IO) { - tvModel.let { request?.fetchData(it) } - } - } else { - l.item.let { (activity as? MainActivity)?.play(it) } - } - - setSelectedPosition( - l.rowPosition, false, - SelectItemViewHolderTask(l.itemPosition) - ) - Toast.makeText( - activity, - l.item.title, - Toast.LENGTH_SHORT - ).show() + val tvViewModel = tvListViewModel.getTVViewModel(itemPosition) + tvViewModel?.changed() } } fun next() { view?.post { itemPosition++ - if (itemPosition == list2.size) { + if (itemPosition == tvListViewModel.size()) { itemPosition = 0 } savePosition(itemPosition) - val l = list2[itemPosition] - - val tvModel = tvListViewModel.getTVModel(itemPosition) - if (tvModel?.ysp() != null) { - Log.i(TAG, "${tvModel.title} to get ysp") - lifecycleScope.launch(Dispatchers.IO) { - tvModel.let { request?.fetchData(it) } - } - } else { - l.item.let { (activity as? MainActivity)?.play(it) } - } - - setSelectedPosition( - l.rowPosition, false, - SelectItemViewHolderTask(l.itemPosition) - ) - Toast.makeText( - activity, - l.item.title, - Toast.LENGTH_SHORT - ).show() + val tvViewModel = tvListViewModel.getTVViewModel(itemPosition) + tvViewModel?.changed() } } fun prevSource() { view?.post { - val tv = list2[itemPosition].item - if (tv.videoUrl.size > 1) { - tv.videoIndex-- - if (tv.videoIndex == -1) { - tv.videoIndex = tv.videoUrl.size - 1 + val tvViewModel = tvListViewModel.getTVViewModel(itemPosition) + if (tvViewModel != null) { + if (tvViewModel.videoUrl.value!!.size > 1) { + val videoIndex = tvViewModel.videoIndex.value?.minus(1) + if (videoIndex == -1) { + tvViewModel.setVideoIndex(tvViewModel.videoUrl.value!!.size - 1) + } + tvViewModel.changed() } - - (activity as? MainActivity)?.play(tv) -// (activity as? MainActivity)?.switchInfoFragment(tv) } } } fun nextSource() { view?.post { - val tv = list2[itemPosition].item - - if (tv.videoUrl.size > 1) { - tv.videoIndex++ - if (tv.videoIndex == tv.videoUrl.size) { - tv.videoIndex = 0 - } - - (activity as? MainActivity)?.play(tv) -// (activity as? MainActivity)?.switchInfoFragment(tv) + val tvViewModel = tvListViewModel.getTVViewModel(itemPosition) + if (tvViewModel != null) { + tvViewModel.changed() +// if (tvViewModel.videoUrl.value!!.size > 1) { +// val videoIndex = tvViewModel.videoIndex.value?.plus(1) +// if (videoIndex == tvViewModel.videoUrl.value!!.size) { +// tvViewModel.setVideoIndex(0) +// } +// tvViewModel.changed() +// } } } } + fun tvViewModel(): TVViewModel? { + return tvListViewModel.getTVViewModel(itemPosition) + } + private fun setupEventListeners() { onItemViewClickedListener = ItemViewClickedListener() onItemViewSelectedListener = ItemViewSelectedListener() @@ -266,20 +262,12 @@ class MainFragment : BrowseSupportFragment() { rowViewHolder: RowPresenter.ViewHolder, row: Row ) { - if (item is TV) { - itemPosition = item.id + if (item is TVViewModel) { + itemPosition = item.id.value!! savePosition(itemPosition) - val tvModel = tvListViewModel.getTVModel(itemPosition) - if (tvModel?.ysp() != null) { - Log.i(TAG, "${tvModel.title} to get ysp") - lifecycleScope.launch(Dispatchers.IO) { - tvModel.let { request?.fetchData(it) } - } - } else { - (activity as? MainActivity)?.play(item) -// (activity as? MainActivity)?.switchInfoFragment(item) - } + val tvViewModel = tvListViewModel.getTVViewModel(itemPosition) + tvViewModel?.changed() (activity as? MainActivity)?.switchMainFragment() } @@ -293,13 +281,18 @@ class MainFragment : BrowseSupportFragment() { ) { if (itemViewHolder == null) { view?.post { - val it = list2[itemPosition] - setSelectedPosition( - it.rowPosition, false, - SelectItemViewHolderTask(it.itemPosition) - ) + val tvViewModel = tvListViewModel.getTVViewModel(itemPosition) + if (tvViewModel != null) { + setSelectedPosition( + tvViewModel.getRowPosition(), false, + SelectItemViewHolderTask(tvViewModel.getItemPosition()) + ) + } } } + if (item is TVViewModel) { + tvListViewModel.setItemPositionCurrent(item.id.value!!) + } } } diff --git a/app/src/main/java/com/lizongying/mytv/PlaybackControlGlue.kt b/app/src/main/java/com/lizongying/mytv/PlaybackControlGlue.kt index b329d50..ba85436 100644 --- a/app/src/main/java/com/lizongying/mytv/PlaybackControlGlue.kt +++ b/app/src/main/java/com/lizongying/mytv/PlaybackControlGlue.kt @@ -1,6 +1,7 @@ package com.lizongying.mytv import android.content.Context +import android.util.Log import android.view.KeyEvent import android.view.View import androidx.leanback.media.MediaPlayerAdapter @@ -17,6 +18,7 @@ class PlaybackControlGlue( if (event!!.action == KeyEvent.ACTION_DOWN) { when (keyCode) { KeyEvent.KEYCODE_DPAD_CENTER -> { + Log.i(TAG, "KEYCODE_DPAD_CENTER") (context as? MainActivity)?.switchMainFragment() } @@ -50,6 +52,6 @@ class PlaybackControlGlue( } companion object { - private const val TAG = "CustomPlaybackControlGlue" + private const val TAG = "PlaybackControlGlue" } } diff --git a/app/src/main/java/com/lizongying/mytv/PlaybackFragment.kt b/app/src/main/java/com/lizongying/mytv/PlaybackFragment.kt index 97d1220..2f4b3ca 100644 --- a/app/src/main/java/com/lizongying/mytv/PlaybackFragment.kt +++ b/app/src/main/java/com/lizongying/mytv/PlaybackFragment.kt @@ -5,9 +5,10 @@ import android.os.Bundle import android.util.Log import androidx.leanback.app.VideoSupportFragment import androidx.leanback.app.VideoSupportFragmentGlueHost -import androidx.leanback.media.PlayerAdapter import androidx.leanback.media.PlaybackTransportControlGlue +import androidx.leanback.media.PlayerAdapter import androidx.leanback.widget.PlaybackControlsRow +import com.lizongying.mytv.models.TVViewModel import java.io.IOException class PlaybackFragment : VideoSupportFragment() { @@ -29,12 +30,10 @@ class PlaybackFragment : VideoSupportFragment() { override fun showControlsOverlay(runAnimation: Boolean) { } - fun play(tv: TV) { - val videoUrl = tv.videoUrl[tv.videoIndex] - - if (videoUrl == "") { - Log.e(TAG, "tv $tv") - Log.e(TAG, "videoUrl is empty") + fun play(tvModel: TVViewModel) { + val videoUrl = tvModel.videoIndex.value?.let { tvModel.videoUrl.value?.get(it) } + if (videoUrl == null || videoUrl == "") { + Log.e(TAG, "${tvModel.title.value} videoUrl is empty") return } @@ -45,21 +44,31 @@ class PlaybackFragment : VideoSupportFragment() { lastVideoUrl = videoUrl - playerAdapter?.reset() - val glueHost = VideoSupportFragmentGlueHost(this@PlaybackFragment) mTransportControlGlue = PlaybackControlGlue(activity, playerAdapter) mTransportControlGlue.host = glueHost mTransportControlGlue.playWhenPrepared() + playerAdapter?.callback = PlayerCallback(tvModel) try { playerAdapter?.setDataSource(Uri.parse(videoUrl)) } catch (e: IOException) { + Log.e(TAG, "error $e") return } hideControlsOverlay(false) } + private inner class PlayerCallback(private var tvModel: TVViewModel) : + PlayerAdapter.Callback() { + override fun onError(adapter: PlayerAdapter?, errorCode: Int, errorMessage: String?) { + Log.e(TAG, "on error: $errorMessage") + if (tvModel.ysp() != null && tvModel.videoIndex.value!! > 0 && errorMessage == "Source error") { + tvModel.changed() + } + } + } + companion object { private const val TAG = "PlaybackVideoFragment" } diff --git a/app/src/main/java/com/lizongying/mytv/Request.kt b/app/src/main/java/com/lizongying/mytv/Request.kt index 2680665..34a8fa5 100644 --- a/app/src/main/java/com/lizongying/mytv/Request.kt +++ b/app/src/main/java/com/lizongying/mytv/Request.kt @@ -82,7 +82,7 @@ class Request(var context: Context) { fun fetchData(tvModel: TVViewModel) { val data = ysp?.switch(tvModel) - val title = tvModel.getTV().title + val title = tvModel.title.value val request = data?.let { LiveInfoRequest(it) } request?.let { yspApiService?.getLiveInfo(it) } @@ -109,6 +109,7 @@ class Request(var context: Context) { ).uppercase() Log.i(TAG, "$title url $url") tvModel.addVideoUrl(url) + tvModel.allReady() } else { Log.e(TAG, "$title key error") tvModel.firstSource() @@ -124,7 +125,7 @@ class Request(var context: Context) { } override fun onFailure(call: Call, t: Throwable) { - Log.e(TAG, "${tvModel.getTV().title} request error") + Log.e(TAG, "$title request error") tvModel.firstSource() } }) @@ -155,7 +156,8 @@ class Request(var context: Context) { if (!mapping.containsKey(item.channelName)) { continue } - val tv = TVList.list[channelType]?.get(mapping[item.channelName]) + val tv = + TVList.list[channelType]?.find { it.title == mapping[item.channelName] } if (tv != null) { tv.logo = item.tvLogo tv.pid = item.pid @@ -187,7 +189,7 @@ class Request(var context: Context) { } private fun encryptTripleDES(key: ByteArray, iv: ByteArray): String { - var plaintext = + val plaintext = """{"mver":"1","subver":"1.2","host":"www.yangshipin.cn/#/tv/home?pid=","referer":"","canvas":"YSPANGLE(Apple,AppleM1Pro,OpenGL4.1)"}""" return try { val keySpec = SecretKeySpec(key, "DESede") diff --git a/app/src/main/java/com/lizongying/mytv/TVList.kt b/app/src/main/java/com/lizongying/mytv/TVList.kt index 0ba2fce..6dcbcd1 100644 --- a/app/src/main/java/com/lizongying/mytv/TVList.kt +++ b/app/src/main/java/com/lizongying/mytv/TVList.kt @@ -1,20 +1,20 @@ package com.lizongying.mytv object TVList { - val list: Map> by lazy { + val list: Map> by lazy { setupTV() } private var count: Int = 0 - private fun setupTV(): Map> { + private fun setupTV(): Map> { val tvs = """ 央视频道 CCTV4K,,https://resources.yangshipin.cn/assets/oms/image/202306/3e9d06fd7244d950df5838750f1c6ac3456e172b51caca2c16d2282125b111e8.png?imageMogr2/format/webp,600002264,2000266303 CCTV1 综合,http://tvpull.dxhmt.cn/tv/11481-4.m3u8,https://resources.yangshipin.cn/assets/oms/image/202306/d57905b93540bd15f0c48230dbbbff7ee0d645ff539e38866e2d15c8b9f7dfcd.png?imageMogr2/format/webp,600001859,2000210103 CCTV2 财经,http://dbiptv.sn.chinamobile.com/PLTV/88888890/224/3221226195/index.m3u8,https://resources.yangshipin.cn/assets/oms/image/202306/20115388de0207131af17eac86c33049b95d69eaff064e55653a1b941810a006.png?imageMogr2/format/webp,600001800,2000203603 CCTV3 综艺,http://dbiptv.sn.chinamobile.com/PLTV/88888890/224/3221226397/index.m3u8 -CCTV4 中文国际,http://39.134.24.161/dbiptv.sn.chinamobile.com/PLTV/88888890/224/3221226191/index.m3u8;http://hlsbkmgsplive.miguvideo.com/wd_r2/cctv/cctv4hd/1500/index.m3u8?&encrypt=,https://resources.yangshipin.cn/assets/oms/image/202306/f357e58fdbcc076a3d65e1f958c942b2e14f14342c60736ceed98b092d35356a.png?imageMogr2/format/webp,600001814,2000204803 +CCTV4 中文国际,http://39.134.24.161/dbiptv.sn.chinamobile.com/PLTV/88888890/224/3221226191/index.m3u8,https://resources.yangshipin.cn/assets/oms/image/202306/f357e58fdbcc076a3d65e1f958c942b2e14f14342c60736ceed98b092d35356a.png?imageMogr2/format/webp,600001814,2000204803 CCTV5 体育,http://dbiptv.sn.chinamobile.com/PLTV/88888890/224/3221226395/index.m3u8,https://resources.yangshipin.cn/assets/oms/image/202306/0a6a7138952675983a3d854df7688557b286d59aa06166edae51506f9204d655.png?imageMogr2/format/webp,600001818,2000205103 CCTV5+ 体育赛事,http://dbiptv.sn.chinamobile.com/PLTV/88888890/224/3221226221/index.m3u8,https://resources.yangshipin.cn/assets/oms/image/202306/649ad76a90bfef55b05db9fe52e006487280f619089099d5dc971e387fc6eff0.png?imageMogr2/format/webp,600001817,2000204503 CCTV6 电影,http://dbiptv.sn.chinamobile.com/PLTV/88888890/224/3221226393/index.m3u8 @@ -143,7 +143,6 @@ CETV4,http://dbiptv.sn.chinamobile.com/PLTV/88888890/224/3221226225/index.m3u8 兵团卫视,http://dbiptv.sn.chinamobile.com/PLTV/88888890/224/3221226214/index.m3u8 延边卫视,http://dbiptv.sn.chinamobile.com/PLTV/88888890/224/3221226220/index.m3u8 内蒙古卫视,http://dbiptv.sn.chinamobile.com/PLTV/88888890/224/3221225786/index.m3u8 -康巴卫视,http://dbiptv.sn.chinamobile.com/PLTV/88888890/224/3221226234/index.m3u8 电视指南,http://dbiptv.sn.chinamobile.com/PLTV/88888893/224/3221226987/index.m3u8 风云足球,http://dbiptv.sn.chinamobile.com/PLTV/88888893/224/3221226984/index.m3u8 风云剧场,http://dbiptv.sn.chinamobile.com/PLTV/88888893/224/3221226950/index.m3u8 @@ -206,7 +205,7 @@ CHC动作电影,http://dbiptv.sn.chinamobile.com/PLTV/88888890/224/3221226465/in 老故事,http://dbiptv.sn.chinamobile.com/PLTV/88888890/224/3221226236/index.m3u8 """.trimIndent() - val map: MutableMap> = mutableMapOf() + val map: MutableMap> = mutableMapOf() var channel = "" for (i in tvs.split("\n")) { @@ -218,14 +217,13 @@ CHC动作电影,http://dbiptv.sn.chinamobile.com/PLTV/88888890/224/3221226465/in continue } val p = i.split(",") - val titleMap = map[channel] ?: mutableMapOf() + val titleMap = map[channel] ?: mutableListOf() - val tv = titleMap[p[0]] ?: TV( + val tv = TV( count, p[0], p[1].split(";").map { it.trim() } ) - count++ if (p.size > 2) { tv.logo = p[2] @@ -237,8 +235,9 @@ CHC动作电影,http://dbiptv.sn.chinamobile.com/PLTV/88888890/224/3221226465/in tv.sid = p[4] } - titleMap[p[0]] = tv + titleMap.add(tv) map[channel] = titleMap + count++ } return map diff --git a/app/src/main/java/com/lizongying/mytv/api/YSP.kt b/app/src/main/java/com/lizongying/mytv/api/YSP.kt index 288e697..85a63e2 100644 --- a/app/src/main/java/com/lizongying/mytv/api/YSP.kt +++ b/app/src/main/java/com/lizongying/mytv/api/YSP.kt @@ -64,8 +64,8 @@ class YSP(var context: Context) { } fun switch(tvModel: TVViewModel): String { - livepid = tvModel.getTV().pid - cnlid = tvModel.getTV().sid + livepid = tvModel.pid.value!! + cnlid = tvModel.sid.value!! defn = "fhd" // guid = getGuid() diff --git a/app/src/main/java/com/lizongying/mytv/models/TVListViewModel.kt b/app/src/main/java/com/lizongying/mytv/models/TVListViewModel.kt index dff5038..5e1ab2c 100644 --- a/app/src/main/java/com/lizongying/mytv/models/TVListViewModel.kt +++ b/app/src/main/java/com/lizongying/mytv/models/TVListViewModel.kt @@ -1,47 +1,61 @@ package com.lizongying.mytv.models +import android.content.SharedPreferences +import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel -import com.lizongying.mytv.TV class TVListViewModel : ViewModel() { - private val tvListLiveData = MutableLiveData>() - private val tvModelListLiveData = MutableLiveData>() + var maxNum = mutableListOf() - fun getListLiveData(): MutableLiveData> { - return tvModelListLiveData + private var sharedPref: SharedPreferences? = null + + private val tvListViewModel = MutableLiveData>() + + private val _itemPosition = MutableLiveData() + val itemPosition: LiveData + get() = _itemPosition + + private val _itemPositionCurrent = MutableLiveData() + val itemPositionCurrent: LiveData + get() = _itemPositionCurrent + + fun getTVListViewModel(): MutableLiveData> { + return tvListViewModel } - fun addTV(tv: TV) { - val currentList = tvListLiveData.value ?: mutableListOf() - currentList.add(tv) - tvListLiveData.value = currentList - - val currentModelList = tvModelListLiveData.value ?: mutableListOf() - currentModelList.add(TVViewModel(tv)) - tvModelListLiveData.value = currentModelList + fun addTVViewModel(tvViewModel: TVViewModel) { + val currentTVModelList = tvListViewModel.value ?: mutableListOf() + currentTVModelList.add(tvViewModel) + tvListViewModel.value = currentTVModelList } - fun updateTV(tv: TV) { - val currentList = tvListLiveData.value ?: mutableListOf() - currentList[tv.id] = tv - tvListLiveData.value = currentList - - val currentModelList = tvModelListLiveData.value ?: mutableListOf() - currentModelList[tv.id].update(tv) - tvModelListLiveData.value = currentModelList + fun getTVViewModel(id: Int): TVViewModel? { + return tvListViewModel.value?.get(id) } - fun getTV(id: Int): TV? { - return tvListLiveData.value?.get(id) + fun getTVViewModelCurrent(): TVViewModel? { + return _itemPositionCurrent.value?.let { tvListViewModel.value?.get(it) } } - fun getTVModel(id: Int): TVViewModel? { - return tvModelListLiveData.value?.get(id) + fun setItemPosition(position: Int) { + _itemPosition.value = position + _itemPositionCurrent.value = position + } + + fun setItemPositionCurrent(position: Int) { + _itemPositionCurrent.value = position + } + + fun savePosition(position: Int) { + with(sharedPref!!.edit()) { + putInt("position", position) + apply() + } } fun size(): Int { - return tvListLiveData.value!!.size + return tvListViewModel.value!!.size } } \ No newline at end of file diff --git a/app/src/main/java/com/lizongying/mytv/models/TVViewModel.kt b/app/src/main/java/com/lizongying/mytv/models/TVViewModel.kt index 8b0a7dd..655f99c 100644 --- a/app/src/main/java/com/lizongying/mytv/models/TVViewModel.kt +++ b/app/src/main/java/com/lizongying/mytv/models/TVViewModel.kt @@ -56,6 +56,9 @@ class TVViewModel(private var tv: TV) : ViewModel() { private var isFirstTime = true + private var rowPosition: Int = 0 + private var itemPosition: Int = 0 + private val _id = MutableLiveData() val id: LiveData get() = _id @@ -72,6 +75,10 @@ class TVViewModel(private var tv: TV) : ViewModel() { val videoIndex: LiveData get() = _videoIndex + private val _logo = MutableLiveData() + val logo: LiveData + get() = _logo + private val _pid = MutableLiveData() val pid: LiveData get() = _pid @@ -80,34 +87,54 @@ class TVViewModel(private var tv: TV) : ViewModel() { val sid: LiveData get() = _sid - private val _backgroundImage = MutableLiveData() - val backgroundImage: LiveData - get() = _backgroundImage + private val _change = MutableLiveData() + val change: LiveData + get() = _change - fun getBackgroundImage(): String { - return tv.logo ?: "" - } - - fun updateBackgroundImage(url: String) { - _backgroundImage.value = url - } + private val _ready = MutableLiveData() + val ready: LiveData + get() = _ready fun addVideoUrl(url: String) { - tv.videoUrl = tv.videoUrl + listOf(url) + if (_videoUrl.value?.isNotEmpty() == true) { + if (_videoUrl.value!!.last().contains("cctv.cn")) { + tv.videoUrl = tv.videoUrl.subList(0, tv.videoUrl.lastIndex) + listOf(url) + } else { + tv.videoUrl = tv.videoUrl + listOf(url) + } + } else { + tv.videoUrl = tv.videoUrl + listOf(url) + } tv.videoIndex = tv.videoUrl.lastIndex _videoUrl.value = tv.videoUrl _videoIndex.value = tv.videoIndex } fun firstSource() { - if (tv.videoUrl.isNotEmpty()) { - tv.videoIndex = 0 - _videoIndex.value = 0 + if (_videoUrl.value!!.isNotEmpty()) { + setVideoIndex(0) + allReady() } else { Log.e(TAG, "no first") } } + fun changed() { + _change.value = true + } + + fun allReady() { + _ready.value = true + } + + fun setVideoIndex(videoIndex: Int) { + _videoIndex.value = videoIndex + } + + fun setLogo(url: String) { + _logo.value = url + } + init { _id.value = tv.id _title.value = tv.title @@ -125,6 +152,22 @@ class TVViewModel(private var tv: TV) : ViewModel() { isFirstTime = firstTime } + fun getRowPosition(): Int { + return rowPosition + } + + fun getItemPosition(): Int { + return itemPosition + } + + fun setRowPosition(position: Int) { + rowPosition = position + } + + fun setItemPosition(position: Int) { + itemPosition = position + } + fun update(t: TV) { tv = t } diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index eece25f..92f58ce 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -1,4 +1,7 @@ - + \ No newline at end of file