Compare commits

...
2 Commits
Author SHA1 Message Date
Li ZongYing b782d1f841 fix some bug 2024-05-16 15:35:48 +08:00
Li ZongYing 7e57aa8c03 fix error in playing 2024-05-16 14:37:16 +08:00
15 changed files with 123 additions and 45 deletions
+6
View File
@@ -1,5 +1,11 @@
## 更新日志 ## 更新日志
### v2.0.0
* 解决卡顿问题
* 解决网格样式时,点击空白处不退出的问题
* 解决频道列表样式切换可能不生效的问题
### v1.9.8(通用) ### v1.9.8(通用)
* 优化在线升级 * 优化在线升级
+1 -1
View File
@@ -14,6 +14,6 @@ gen-version:
git describe --tags --always git describe --tags --always
git describe --tags --always | sed 's/v/ /g' | sed 's/\./ /g' | sed 's/-/ /g' | awk '{print ($$1*16777216)+($$2*65536)+($$3*256)+$$4}' git describe --tags --always | sed 's/v/ /g' | sed 's/\./ /g' | sed 's/-/ /g' | awk '{print ($$1*16777216)+($$2*65536)+($$3*256)+$$4}'
#make gen v=v1.1.3 #make gen v=v2.0.0
gen: gen:
echo $(v) | sed 's/v/ /g' | sed 's/\./ /g' | sed 's/-/ /g' | awk '{print "{\"version_code\": " ($$1*16777216)+($$2*65536)+($$3*256)+$$4 ", \"version_name\": \"" "$(v)" "\"}"}' > version.json echo $(v) | sed 's/v/ /g' | sed 's/\./ /g' | sed 's/-/ /g' | awk '{print "{\"version_code\": " ($$1*16777216)+($$2*65536)+($$3*256)+$$4 ", \"version_name\": \"" "$(v)" "\"}"}' > version.json
+2 -2
View File
@@ -26,7 +26,7 @@
## TODO ## TODO
* 音量不同 * 音量不同
* 大湾区卫视、广东4k超高清、广东珠江、三沙卫视 * 大湾区卫视、广东4k超高清、广东珠江、三沙卫视、翡翠
* CHC高清三个电影频道 * CHC高清三个电影频道
* 地方频道 * 地方频道
* 收藏夹 * 收藏夹
@@ -35,7 +35,7 @@
* 亮度调节 * 亮度调节
* 音量调节 * 音量调节
* 軟解 * 軟解
* 自動更新 * 网格空白处退出
## 版权说明 ## 版权说明
+8 -3
View File
@@ -77,10 +77,9 @@ static def VersionCode() {
def replace = [v: "", ".": " ", "-": " "] def replace = [v: "", ".": " ", "-": " "]
def arr = (process.text.trim().replace(replace) + " 0").split(" ") def arr = (process.text.trim().replace(replace) + " 0").split(" ")
def versionCode = arr[0].toInteger() * 16777216 + arr[1].toInteger() * 65536 + arr[2].toInteger() * 256 + arr[3].toInteger() def versionCode = arr[0].toInteger() * 16777216 + arr[1].toInteger() * 65536 + arr[2].toInteger() * 256 + arr[3].toInteger()
println("VersionCode $versionCode")
return versionCode return versionCode
} catch (ignored) { } catch (ignored) {
return 0 return 1
} }
} }
@@ -88,13 +87,19 @@ static def VersionName() {
try { try {
def process = "git describe --tags --always".execute() def process = "git describe --tags --always".execute()
process.waitFor() process.waitFor()
return process.text.trim() - "v" def versionName = process.text.trim() - "v"
if (versionName.isEmpty()) {
versionName = "1.0.0"
}
return versionName
} catch (ignored) { } catch (ignored) {
return "1.0.0" return "1.0.0"
} }
} }
dependencies { dependencies {
// minSdk17
def media3_version = "1.2.1" def media3_version = "1.2.1"
implementation "androidx.media3:media3-ui:$media3_version" implementation "androidx.media3:media3-ui:$media3_version"
@@ -25,7 +25,7 @@ import kotlinx.coroutines.async
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
class MainActivity : FragmentActivity(), Request.RequestListener { class MainActivity : FragmentActivity(), Request.RequestListener, OnSharedPreferenceChangeListener {
private var ready = 0 private var ready = 0
private val playerFragment = PlayerFragment() private val playerFragment = PlayerFragment()
@@ -122,6 +122,8 @@ class MainActivity : FragmentActivity(), Request.RequestListener {
// Log.i(TAG, "net ${Build.VERSION.SDK_INT}") // Log.i(TAG, "net ${Build.VERSION.SDK_INT}")
// ready++ // ready++
// } // }
SP.setOnSharedPreferenceChangeListener(this)
} }
fun showInfoFragment(tvViewModel: TVViewModel) { fun showInfoFragment(tvViewModel: TVViewModel) {
@@ -358,8 +360,6 @@ class MainActivity : FragmentActivity(), Request.RequestListener {
private val hideSetting = Runnable { private val hideSetting = Runnable {
if (settingFragment.isVisible) { if (settingFragment.isVisible) {
settingFragment.dismiss() settingFragment.dismiss()
showTime()
mainFragment.changeMenu()
} }
} }
@@ -499,7 +499,7 @@ class MainActivity : FragmentActivity(), Request.RequestListener {
} }
KeyEvent.KEYCODE_UNKNOWN -> { KeyEvent.KEYCODE_UNKNOWN -> {
showSetting() // showSetting()
return true return true
} }
@@ -612,4 +612,12 @@ class MainActivity : FragmentActivity(), Request.RequestListener {
private companion object { private companion object {
const val TAG = "MainActivity" const val TAG = "MainActivity"
} }
override fun onSharedPreferenceChanged(key: String) {
Log.i(TAG, "$key changed")
when (key) {
SP.KEY_GRID -> mainFragment.changeMenu()
SP.KEY_TIME -> showTime()
}
}
} }
@@ -2,8 +2,10 @@ package com.lizongying.mytv
import android.os.Bundle import android.os.Bundle
import android.util.Log import android.util.Log
import android.view.GestureDetector
import android.view.KeyEvent import android.view.KeyEvent
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.MotionEvent
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.Toast import android.widget.Toast
@@ -42,10 +44,13 @@ class MainFragment : Fragment(), CardAdapter.ItemListener {
private lateinit var application: MyTvApplication private lateinit var application: MyTvApplication
private lateinit var gestureDetector: GestureDetector
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?, inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle? savedInstanceState: Bundle?
): View { ): View {
var context = requireContext()
_binding = MenuBinding.inflate(inflater, container, false) _binding = MenuBinding.inflate(inflater, container, false)
application = requireActivity().applicationContext as MyTvApplication application = requireActivity().applicationContext as MyTvApplication
@@ -57,9 +62,19 @@ class MainFragment : Fragment(), CardAdapter.ItemListener {
hideSelf() hideSelf()
} }
gestureDetector = GestureDetector(context, GestureListener())
return binding.root return binding.root
} }
private inner class GestureListener : GestureDetector.SimpleOnGestureListener() {
override fun onSingleTapConfirmed(e: MotionEvent): Boolean {
Log.i(TAG, "onSingleTapConfirmed")
hideSelf()
return true
}
}
private fun hideSelf() { private fun hideSelf() {
requireActivity().supportFragmentManager.beginTransaction() requireActivity().supportFragmentManager.beginTransaction()
.hide(this) .hide(this)
@@ -134,6 +149,21 @@ class MainFragment : Fragment(), CardAdapter.ItemListener {
hideSelf() hideSelf()
} }
itemBinding.items.addOnItemTouchListener(object : RecyclerView.OnItemTouchListener {
override fun onInterceptTouchEvent(rv: RecyclerView, e: MotionEvent): Boolean {
gestureDetector.onTouchEvent(e)
return false
}
override fun onTouchEvent(rv: RecyclerView, e: MotionEvent) {
TODO("Not yet implemented")
}
override fun onRequestDisallowInterceptTouchEvent(disallowIntercept: Boolean) {
TODO("Not yet implemented")
}
})
val layoutParamsHeader = val layoutParamsHeader =
itemBinding.header.layoutParams as ViewGroup.MarginLayoutParams itemBinding.header.layoutParams as ViewGroup.MarginLayoutParams
layoutParamsHeader.topMargin = application.px2Px(itemBinding.header.marginTop) layoutParamsHeader.topMargin = application.px2Px(itemBinding.header.marginTop)
@@ -0,0 +1,6 @@
package com.lizongying.mytv
interface OnSharedPreferenceChangeListener {
fun onSharedPreferenceChanged(key: String)
}
@@ -15,6 +15,7 @@ import androidx.media3.common.PlaybackException
import androidx.media3.common.Player import androidx.media3.common.Player
import androidx.media3.common.VideoSize import androidx.media3.common.VideoSize
import androidx.media3.common.util.UnstableApi import androidx.media3.common.util.UnstableApi
import androidx.media3.exoplayer.DefaultRenderersFactory
import androidx.media3.exoplayer.ExoPlayer import androidx.media3.exoplayer.ExoPlayer
import androidx.media3.ui.PlayerView import androidx.media3.ui.PlayerView
import com.google.android.exoplayer2.SimpleExoPlayer import com.google.android.exoplayer2.SimpleExoPlayer
@@ -52,10 +53,16 @@ class PlayerFragment : Fragment(), SurfaceHolder.Callback {
playerView?.viewTreeObserver?.addOnGlobalLayoutListener(object : playerView?.viewTreeObserver?.addOnGlobalLayoutListener(object :
ViewTreeObserver.OnGlobalLayoutListener { ViewTreeObserver.OnGlobalLayoutListener {
@OptIn(UnstableApi::class)
override fun onGlobalLayout() { override fun onGlobalLayout() {
playerView!!.viewTreeObserver.removeOnGlobalLayoutListener(this) playerView!!.viewTreeObserver.removeOnGlobalLayoutListener(this)
// val renderersFactory = context?.let { DefaultRenderersFactory(it) }
// renderersFactory?.setExtensionRendererMode(DefaultRenderersFactory.EXTENSION_RENDERER_MODE_ON)
playerView!!.player = activity?.let { playerView!!.player = activity?.let {
ExoPlayer.Builder(it) ExoPlayer.Builder(it)
// .setRenderersFactory(renderersFactory!!)
.build() .build()
} }
playerView!!.player?.playWhenReady = true playerView!!.player?.playWhenReady = true
+20 -4
View File
@@ -13,12 +13,12 @@ object SP {
// If use channel num to select channel or not // If use channel num to select channel or not
private const val KEY_CHANNEL_NUM = "channel_num" private const val KEY_CHANNEL_NUM = "channel_num"
private const val KEY_TIME = "time" const val KEY_TIME = "time"
// If start app on device boot or not // If start app on device boot or not
private const val KEY_BOOT_STARTUP = "boot_startup" private const val KEY_BOOT_STARTUP = "boot_startup"
private const val KEY_GRID = "grid" const val KEY_GRID = "grid"
// Position in list of the selected channel item // Position in list of the selected channel item
private const val KEY_POSITION = "position" private const val KEY_POSITION = "position"
@@ -28,6 +28,8 @@ object SP {
private lateinit var sp: SharedPreferences private lateinit var sp: SharedPreferences
private var listener: OnSharedPreferenceChangeListener? = null
/** /**
* The method must be invoked as early as possible(At least before using the keys) * The method must be invoked as early as possible(At least before using the keys)
*/ */
@@ -35,6 +37,10 @@ object SP {
sp = context.getSharedPreferences(SP_FILE_NAME, Context.MODE_PRIVATE) sp = context.getSharedPreferences(SP_FILE_NAME, Context.MODE_PRIVATE)
} }
fun setOnSharedPreferenceChangeListener(listener: OnSharedPreferenceChangeListener) {
this.listener = listener
}
var channelReversal: Boolean var channelReversal: Boolean
get() = sp.getBoolean(KEY_CHANNEL_REVERSAL, false) get() = sp.getBoolean(KEY_CHANNEL_REVERSAL, false)
set(value) = sp.edit().putBoolean(KEY_CHANNEL_REVERSAL, value).apply() set(value) = sp.edit().putBoolean(KEY_CHANNEL_REVERSAL, value).apply()
@@ -45,7 +51,12 @@ object SP {
var time: Boolean var time: Boolean
get() = sp.getBoolean(KEY_TIME, true) get() = sp.getBoolean(KEY_TIME, true)
set(value) = sp.edit().putBoolean(KEY_TIME, value).apply() set(value) {
if (value != this.time) {
sp.edit().putBoolean(KEY_TIME, value).apply()
listener?.onSharedPreferenceChanged(KEY_TIME)
}
}
var bootStartup: Boolean var bootStartup: Boolean
get() = sp.getBoolean(KEY_BOOT_STARTUP, false) get() = sp.getBoolean(KEY_BOOT_STARTUP, false)
@@ -53,7 +64,12 @@ object SP {
var grid: Boolean var grid: Boolean
get() = sp.getBoolean(KEY_GRID, false) get() = sp.getBoolean(KEY_GRID, false)
set(value) = sp.edit().putBoolean(KEY_GRID, value).apply() set(value) {
if (value != this.grid) {
sp.edit().putBoolean(KEY_GRID, value).apply()
listener?.onSharedPreferenceChanged(KEY_GRID)
}
}
var itemPosition: Int var itemPosition: Int
get() = sp.getInt(KEY_POSITION, 0) get() = sp.getInt(KEY_POSITION, 0)
@@ -161,6 +161,8 @@ class SettingFragment : DialogFragment() {
requireActivity().finishAffinity() requireActivity().finishAffinity()
} }
updateManager = UpdateManager(context, context.appVersionCode)
return binding.root return binding.root
} }
@@ -197,7 +199,7 @@ class SettingFragment : DialogFragment() {
PERMISSIONS_REQUEST_CODE PERMISSIONS_REQUEST_CODE
) )
} else { } else {
UpdateManager(context, context.appVersionCode).checkAndUpdate() updateManager.checkAndUpdate()
} }
} }
@@ -216,8 +218,7 @@ class SettingFragment : DialogFragment() {
} }
} }
if (allPermissionsGranted) { if (allPermissionsGranted) {
val context = requireContext() updateManager.checkAndUpdate()
UpdateManager(context, context.appVersionCode).checkAndUpdate()
} else { } else {
Toast.makeText(context, "权限授权失败", Toast.LENGTH_LONG).show() Toast.makeText(context, "权限授权失败", Toast.LENGTH_LONG).show()
} }
@@ -64,7 +64,6 @@ class UpdateManager(
private fun startDownload(release: ReleaseResponse) { private fun startDownload(release: ReleaseResponse) {
val apkName = "my-tv" val apkName = "my-tv"
val apkFileName = "$apkName-${release.version_name}.apk" val apkFileName = "$apkName-${release.version_name}.apk"
Log.i(TAG, "apkFileName $apkFileName")
val downloadManager = val downloadManager =
context.getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager context.getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager
val request = val request =
@@ -1,17 +1,17 @@
package com.lizongying.mytv.api package com.lizongying.mytv.api
data class KvcollectRequest( data class KvcollectRequest(
val BossId: Int = 2727, val BossId: Int = 99150,
val Pwd: Int = 1424084450, val Pwd: Int = 1999332929,
val cdn: String = "waibao", val cdn: String = "waibao",
val cmd: Int = 263, val cmd: Int = 263,
val defn: String = "fhd", val defn: String = "fhd",
val downspeed: Double = 10.0, val downspeed: Int = 10,
val durl: String = "", // val durl: String = "", //
val errcode: String = "", val errcode: String = "",
val fact1: String = "ysp_pc_live_b", val fact1: String = "ysp_pc_live_b",
val firstreport: Int = 0, val firstreport: Int = 0,
val fplayerver: String = "100", val fplayerver: String = "180",
val ftime: String = "", // val ftime: String = "", //
val geturltime: Int = 0, val geturltime: Int = 0,
val guid: String = "", // val guid: String = "", //
@@ -39,17 +39,17 @@ data class KvcollectRequest(
data class KvcollectRequest2( data class KvcollectRequest2(
val BossId: Int = 2727, val BossId: Int = 99150,
val Pwd: Int = 1424084450, val Pwd: Int = 1999332929,
val cdn: String = "waibao", val cdn: String = "waibao",
val cmd: Int = 263, val cmd: Int = 263,
val defn: String = "fhd", val defn: String = "fhd",
val downspeed: String = "10", val downspeed: Int = 10,
val durl: String = "", // val durl: String = "", //
val errcode: String = "", val errcode: String = "",
val fact1: String = "ysp_pc_live_b", val fact1: String = "ysp_pc_live_b",
val firstreport: Int = 0, val firstreport: Int = 0,
val fplayerver: String = "100", val fplayerver: String = "180",
val ftime: String = "", // val ftime: String = "", //
val geturltime: Int = 0, val geturltime: Int = 0,
val guid: String = "", // val guid: String = "", //
@@ -68,9 +68,9 @@ data class KvcollectRequest2(
val sRef: String = "", val sRef: String = "",
val sUrl: String = "", // val sUrl: String = "", //
val sdtfrom: String = "ysp_pc_01", val sdtfrom: String = "ysp_pc_01",
val seq: Int = 9, // val seq: Int = 0, //
var signature: String = "", var signature: String = "",
val url: String = "", // val url: String = "", //
val viewid: String = "", // val viewid: String = "", //
val _dc: Double = 0.0, val _dc: String = "",
) )
@@ -87,8 +87,8 @@ interface YSPBtraceService {
"referer: https://www.yangshipin.cn/", "referer: https://www.yangshipin.cn/",
) )
fun kvcollect3( fun kvcollect3(
@Field("BossId") BossId: String = "9141", @Field("BossId") BossId: String = "9150",
@Field("Pwd") Pwd: String = "1137850982", @Field("Pwd") Pwd: String = "1999332929",
@Field("prog") prog: String = "", // @Field("prog") prog: String = "", //
@Field("playno") playno: String = "", // @Field("playno") playno: String = "", //
@Field("guid") guid: String = "", // @Field("guid") guid: String = "", //
@@ -102,7 +102,7 @@ interface YSPBtraceService {
@Field("firstreport") firstreport: String = "-", @Field("firstreport") firstreport: String = "-",
@Field("sUrl") sUrl: String = "", // @Field("sUrl") sUrl: String = "", //
@Field("sRef") sRef: String = "-", @Field("sRef") sRef: String = "-",
@Field("fplayerver") fplayerver: String = "100", @Field("fplayerver") fplayerver: String = "180",
@Field("livepid") livepid: String = "", @Field("livepid") livepid: String = "",
@Field("viewid") viewid: String = "", @Field("viewid") viewid: String = "",
@Field("seq") seq: String = "", @Field("seq") seq: String = "",
@@ -118,8 +118,8 @@ interface YSPBtraceService {
@Field("_dc") _dc: String = "", @Field("_dc") _dc: String = "",
@Field("live_type") live_type: String = "-", @Field("live_type") live_type: String = "-",
@Field("ftime") ftime: String = "", @Field("ftime") ftime: String = "",
@Field("url") url: String = "", // @Field("url") url: String = "",
@Field("rand_str") rand_str: String = "", // // @Field("rand_str") rand_str: String = "", //
@Field("signature") signature: String = "", // @Field("signature") signature: String = "",
): Call<Void> ): Call<Void>
} }
@@ -700,7 +700,7 @@ object Request {
seq = tvModel.seq, seq = tvModel.seq,
durl = url, durl = url,
url = url, url = url,
_dc = randomNumber, // _dc = "",
) )
val e = val e =
@@ -732,7 +732,7 @@ object Request {
val guid = YSP.getGuid() val guid = YSP.getGuid()
val pid = tvModel.getTV().pid val pid = tvModel.getTV().pid
val sid = tvModel.getTV().sid val sid = tvModel.getTV().sid
val randomNumber = Random.nextDouble() // val randomNumber = Random.nextDouble()
val url = tvModel.getTV().videoUrl.first() val url = tvModel.getTV().videoUrl.first()
val r = KvcollectRequest2( val r = KvcollectRequest2(
@@ -747,12 +747,12 @@ object Request {
seq = tvModel.seq, seq = tvModel.seq,
durl = url, durl = url,
url = url, url = url,
_dc = randomNumber, _dc = "",
) )
val e = // val e =
"BossId=${r.BossId}&Pwd=${r.Pwd}&_dc=${r._dc}&cdn=${r.cdn}&cmd=${r.cmd}&defn=${r.defn}&downspeed=${r.downspeed}&durl=${r.durl}&errcode=${r.errcode}&fact1=${r.fact1}&firstreport=${r.firstreport}&fplayerver=${r.fplayerver}&ftime=${r.ftime}&geturltime=${r.geturltime}&guid=${r.guid}&hc_openid=${r.hc_openid}&hh_ua=${r.hh_ua}&live_type=${r.live_type}&livepid=${r.livepid}&login_type=${r.login_type}&open_id=${r.open_id}&openid=${r.openid}&platform=${r.platform}&playno=${r.playno}&prd=${r.prd}&prog=${r.prog}&rand_str=${r.rand_str}&sRef=${r.sRef}&sUrl=${r.sUrl}&sdtfrom=${r.sdtfrom}&seq=${r.seq}&url=${r.url}&viewid=${r.viewid}" // "BossId=${r.BossId}&Pwd=${r.Pwd}&_dc=${r._dc}&cdn=${r.cdn}&cmd=${r.cmd}&defn=${r.defn}&downspeed=${r.downspeed}&durl=${r.durl}&errcode=${r.errcode}&fact1=${r.fact1}&firstreport=${r.firstreport}&fplayerver=${r.fplayerver}&ftime=${r.ftime}&geturltime=${r.geturltime}&guid=${r.guid}&hc_openid=${r.hc_openid}&hh_ua=${r.hh_ua}&live_type=${r.live_type}&livepid=${r.livepid}&login_type=${r.login_type}&open_id=${r.open_id}&openid=${r.openid}&platform=${r.platform}&playno=${r.playno}&prd=${r.prd}&prog=${r.prog}&rand_str=${r.rand_str}&sRef=${r.sRef}&sUrl=${r.sUrl}&sdtfrom=${r.sdtfrom}&seq=${r.seq}&url=${r.url}&viewid=${r.viewid}"
r.signature = YSP.getAuthSignature(e) // r.signature = YSP.getAuthSignature(e)
callBtracePage = yspBtraceService3.kvcollect3( callBtracePage = yspBtraceService3.kvcollect3(
guid = r.guid, guid = r.guid,
@@ -761,18 +761,18 @@ object Request {
livepid = r.livepid, livepid = r.livepid,
sUrl = r.sUrl, sUrl = r.sUrl,
playno = r.playno, playno = r.playno,
rand_str = r.rand_str, // rand_str = r.rand_str,
ftime = r.ftime, ftime = r.ftime,
seq = "${r.seq}", seq = "${r.seq}",
durl = r.durl, durl = r.durl,
url = r.url, // url = r.url,
_dc = "${r._dc}", _dc = "${r._dc}",
signature = r.signature // signature = r.signature
) )
callBtracePage?.enqueue(object : Callback<Void> { callBtracePage?.enqueue(object : Callback<Void> {
override fun onResponse(call: Call<Void>, response: Response<Void>) { override fun onResponse(call: Call<Void>, response: Response<Void>) {
if (response.isSuccessful) { if (response.isSuccessful) {
Log.d(TAG, "$title kvcollect success") Log.i(TAG, "$title kvcollect success")
} else { } else {
Log.e(TAG, "$title kvcollect status error") Log.e(TAG, "$title kvcollect status error")
} }
+1 -1
View File
@@ -1 +1 @@
{"version_code": 17369088, "version_name": "v1.9.8"} {"version_code": 33554432, "version_name": "v2.0.0"}