Compare commits

..
8 Commits
Author SHA1 Message Date
Li ZongYing bcfca9e28c fix gson crash 2024-05-27 14:13:34 +08:00
Li ZongYing 31ec13eed7 fix gson crash 2024-05-26 20:50:08 +08:00
Li ZongYing 5a78913407 fix gson crash 2024-05-26 20:49:01 +08:00
Li ZongYing bb38cf5033 fix gson crash 2024-05-26 20:20:42 +08:00
Li ZongYing 51d9c4c2a7 fix gson crash 2024-05-26 20:16:10 +08:00
Li ZongYing 70da1d8241 fix the settings options are not displayed 2024-05-26 09:36:24 +08:00
Li ZongYing ef17427f64 add reset 2024-05-21 09:55:15 +08:00
Li ZongYing c1143afb4e fix ysp 2024-05-20 22:23:16 +08:00
24 changed files with 136 additions and 138 deletions
+15
View File
@@ -1,8 +1,23 @@
## 更新日志 ## 更新日志
### v2.0.9
* 修复部分设备闪退的问题
* 修复设置页可能显示不全的问题
### v2.0.5
* 设置页增加恢复默认按钮,目前只用于同步系统时间
### v2.0.4
* 修复不能播放的问题
* 包含国际频道
### v2.0.3 ### v2.0.3
* 修复不能播放的问题 * 修复不能播放的问题
* 不包含国际频道
### v2.0.0 ### v2.0.0
+1 -1
View File
@@ -16,4 +16,4 @@ gen-version:
#make gen v=v2.0.0 #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$(v)" "\"}"}' > version.json
+18 -7
View File
@@ -89,7 +89,7 @@ static def VersionName() {
process.waitFor() process.waitFor()
def versionName = process.text.trim() - "v" def versionName = process.text.trim() - "v"
if (versionName.isEmpty()) { if (versionName.isEmpty()) {
versionName = "1.0.0" versionName = "1.0.0"
} }
return versionName return versionName
} catch (ignored) { } catch (ignored) {
@@ -105,7 +105,11 @@ dependencies {
implementation "androidx.media3:media3-ui:$media3_version" implementation "androidx.media3:media3-ui:$media3_version"
// For media playback using ExoPlayer // For media playback using ExoPlayer
implementation "androidx.media3:media3-exoplayer:$media3_version" implementation ("com.google.guava:guava:31.1-android")
implementation ("androidx.media3:media3-common:$media3_version") {
exclude group: 'com.google.common', module: 'guava'
}
implementation ("androidx.media3:media3-exoplayer:$media3_version")
// For HLS playback support with ExoPlayer // For HLS playback support with ExoPlayer
implementation "androidx.media3:media3-exoplayer-hls:$media3_version" implementation "androidx.media3:media3-exoplayer-hls:$media3_version"
@@ -114,7 +118,11 @@ dependencies {
def retrofit2_version = "2.6.4" def retrofit2_version = "2.6.4"
implementation 'com.google.protobuf:protobuf-kotlin:3.25.1' implementation 'com.google.protobuf:protobuf-kotlin:3.25.1'
implementation "com.squareup.retrofit2:converter-gson:$retrofit2_version" // Gson 2.10.1 and older: API level 19
implementation("com.google.code.gson:gson:2.10.1")
implementation("com.squareup.retrofit2:converter-gson:$retrofit2_version") {
exclude group: 'com.google.code.gson', module: 'gson'
}
implementation "com.squareup.retrofit2:converter-protobuf:$retrofit2_version" implementation "com.squareup.retrofit2:converter-protobuf:$retrofit2_version"
implementation "com.squareup.retrofit2:retrofit:$retrofit2_version" implementation "com.squareup.retrofit2:retrofit:$retrofit2_version"
@@ -129,9 +137,12 @@ dependencies {
implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.2" implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.2"
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.0-RC") implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.0-RC")
implementation 'com.google.android.exoplayer:exoplayer-ui:2.13.3'
implementation 'com.google.android.exoplayer:exoplayer-core:2.13.3'
implementation 'com.google.android.exoplayer:exoplayer-hls:2.13.3'
implementation 'javax.annotation:javax.annotation-api:1.3.2' implementation 'javax.annotation:javax.annotation-api:1.3.2'
}
configurations.configureEach {
resolutionStrategy {
force 'com.google.code.gson:gson:2.10.1'
force 'com.google.guava:guava:31.1-android'
}
} }
+1 -1
View File
@@ -15,7 +15,7 @@
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" /> <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<application <application
android:name=".MyTvApplication" android:name=".MyTVApplication"
android:allowBackup="true" android:allowBackup="true"
android:banner="@drawable/banner" android:banner="@drawable/banner"
android:icon="@drawable/logo" android:icon="@drawable/logo"
@@ -34,7 +34,7 @@ class CardAdapter(
val inflater = LayoutInflater.from(parent.context) val inflater = LayoutInflater.from(parent.context)
val binding = CardBinding.inflate(inflater, parent, false) val binding = CardBinding.inflate(inflater, parent, false)
val application = mainFragment.requireActivity().applicationContext as MyTvApplication val application = mainFragment.requireActivity().applicationContext as MyTVApplication
binding.card.layoutParams.width = application.px2Px(binding.card.layoutParams.width) binding.card.layoutParams.width = application.px2Px(binding.card.layoutParams.width)
binding.card.layoutParams.height = application.px2Px(binding.card.layoutParams.height) binding.card.layoutParams.height = application.px2Px(binding.card.layoutParams.height)
@@ -28,7 +28,7 @@ class ChannelFragment : Fragment() {
_binding = ChannelBinding.inflate(inflater, container, false) _binding = ChannelBinding.inflate(inflater, container, false)
_binding!!.root.visibility = View.GONE _binding!!.root.visibility = View.GONE
val application = requireActivity().applicationContext as MyTvApplication val application = requireActivity().applicationContext as MyTVApplication
binding.channel.layoutParams.width = application.px2Px(binding.channel.layoutParams.width) binding.channel.layoutParams.width = application.px2Px(binding.channel.layoutParams.width)
binding.channel.layoutParams.height = application.px2Px(binding.channel.layoutParams.height) binding.channel.layoutParams.height = application.px2Px(binding.channel.layoutParams.height)
@@ -19,7 +19,7 @@ class ErrorFragment : Fragment() {
): View { ): View {
_binding = ErrorBinding.inflate(inflater, container, false) _binding = ErrorBinding.inflate(inflater, container, false)
val application = requireActivity().applicationContext as MyTvApplication val application = requireActivity().applicationContext as MyTVApplication
binding.logo.layoutParams.width = application.px2Px(binding.logo.layoutParams.width) binding.logo.layoutParams.width = application.px2Px(binding.logo.layoutParams.width)
binding.logo.layoutParams.height = application.px2Px(binding.logo.layoutParams.height) binding.logo.layoutParams.height = application.px2Px(binding.logo.layoutParams.height)
@@ -29,7 +29,7 @@ class InfoFragment : Fragment() {
): View { ): View {
_binding = InfoBinding.inflate(inflater, container, false) _binding = InfoBinding.inflate(inflater, container, false)
val application = requireActivity().applicationContext as MyTvApplication val application = requireActivity().applicationContext as MyTVApplication
binding.info.layoutParams.width = application.px2Px(binding.info.layoutParams.width) binding.info.layoutParams.width = application.px2Px(binding.info.layoutParams.width)
binding.info.layoutParams.height = application.px2Px(binding.info.layoutParams.height) binding.info.layoutParams.height = application.px2Px(binding.info.layoutParams.height)
@@ -7,10 +7,10 @@ import androidx.recyclerview.widget.RecyclerView
class ItemDecoration(context: Context) : RecyclerView.ItemDecoration() { class ItemDecoration(context: Context) : RecyclerView.ItemDecoration() {
private var application: MyTvApplication private var application: MyTVApplication
init { init {
application = context.applicationContext as MyTvApplication application = context.applicationContext as MyTVApplication
} }
override fun getItemOffsets( override fun getItemOffsets(
@@ -17,7 +17,7 @@ class LoadingFragment : Fragment() {
): View { ): View {
_binding = LoadingBinding.inflate(inflater, container, false) _binding = LoadingBinding.inflate(inflater, container, false)
val application = requireActivity().applicationContext as MyTvApplication val application = requireActivity().applicationContext as MyTVApplication
binding.bar.layoutParams.width = application.px2Px(binding.bar.layoutParams.width) binding.bar.layoutParams.width = application.px2Px(binding.bar.layoutParams.width)
binding.bar.layoutParams.height = application.px2Px(binding.bar.layoutParams.height) binding.bar.layoutParams.height = application.px2Px(binding.bar.layoutParams.height)
@@ -8,6 +8,7 @@ import android.util.Log
import android.view.GestureDetector import android.view.GestureDetector
import android.view.KeyEvent import android.view.KeyEvent
import android.view.MotionEvent import android.view.MotionEvent
import android.view.View
import android.view.View.SYSTEM_UI_FLAG_FULLSCREEN import android.view.View.SYSTEM_UI_FLAG_FULLSCREEN
import android.view.View.SYSTEM_UI_FLAG_HIDE_NAVIGATION import android.view.View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
import android.view.View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN import android.view.View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
@@ -44,13 +45,13 @@ class MainActivity : FragmentActivity(), Request.RequestListener, OnSharedPrefer
private val handler = Handler() private val handler = Handler()
private val delayHideMain: Long = 10000 private val delayHideMain: Long = 10000
private val delayHideSetting: Long = 10000 private val delayHideSetting: Long = 15000
init { init {
Utils.setRequestListener(this) Utils.setRequestListener(this)
} }
private fun syncTime() { fun syncTime() {
lifecycleScope.launch(Dispatchers.IO) { lifecycleScope.launch(Dispatchers.IO) {
val utilsJob = async(start = CoroutineStart.LAZY) { Utils.init() } val utilsJob = async(start = CoroutineStart.LAZY) { Utils.init() }
utilsJob.start() utilsJob.start()
@@ -59,9 +60,6 @@ class MainActivity : FragmentActivity(), Request.RequestListener, OnSharedPrefer
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
Request.setRequestListener(this)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
val lp = window.attributes val lp = window.attributes
@@ -70,6 +68,17 @@ class MainActivity : FragmentActivity(), Request.RequestListener, OnSharedPrefer
window.setAttributes(lp) window.setAttributes(lp)
} }
window.decorView.apply {
systemUiVisibility =
SYSTEM_UI_FLAG_FULLSCREEN or
SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or
View.SYSTEM_UI_FLAG_LAYOUT_STABLE or
SYSTEM_UI_FLAG_HIDE_NAVIGATION or
SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or
View.SYSTEM_UI_FLAG_IMMERSIVE
}
window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN) window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN)
window.decorView.systemUiVisibility = window.decorView.systemUiVisibility =
@@ -82,6 +91,10 @@ class MainActivity : FragmentActivity(), Request.RequestListener, OnSharedPrefer
// window.navigationBarColor = Color.TRANSPARENT // window.navigationBarColor = Color.TRANSPARENT
// } // }
setContentView(R.layout.activity_main)
Request.setRequestListener(this)
if (savedInstanceState == null) { if (savedInstanceState == null) {
val transaction = supportFragmentManager.beginTransaction() val transaction = supportFragmentManager.beginTransaction()
.add(R.id.main_browse_fragment, playerFragment) .add(R.id.main_browse_fragment, playerFragment)
@@ -42,7 +42,7 @@ class MainFragment : Fragment(), CardAdapter.ItemListener {
private var lastVideoUrl = "" private var lastVideoUrl = ""
private lateinit var application: MyTvApplication private lateinit var application: MyTVApplication
private lateinit var gestureDetector: GestureDetector private lateinit var gestureDetector: GestureDetector
@@ -53,7 +53,7 @@ class MainFragment : Fragment(), CardAdapter.ItemListener {
val context = requireContext() val context = requireContext()
_binding = MenuBinding.inflate(inflater, container, false) _binding = MenuBinding.inflate(inflater, container, false)
application = requireActivity().applicationContext as MyTvApplication application = requireActivity().applicationContext as MyTVApplication
binding.menu.layoutParams.width = application.shouldWidthPx() binding.menu.layoutParams.width = application.shouldWidthPx()
binding.menu.layoutParams.height = application.shouldHeightPx() binding.menu.layoutParams.height = application.shouldHeightPx()
@@ -8,7 +8,7 @@ import android.view.WindowManager
import androidx.multidex.MultiDex import androidx.multidex.MultiDex
class MyTvApplication : Application() { class MyTVApplication : Application() {
private lateinit var displayMetrics: DisplayMetrics private lateinit var displayMetrics: DisplayMetrics
private lateinit var realDisplayMetrics: DisplayMetrics private lateinit var realDisplayMetrics: DisplayMetrics
@@ -3,8 +3,6 @@ package com.lizongying.mytv
import android.os.Bundle import android.os.Bundle
import android.util.Log import android.util.Log
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.SurfaceHolder
import android.view.SurfaceView
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.view.ViewTreeObserver import android.view.ViewTreeObserver
@@ -15,41 +13,26 @@ 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.lizongying.mytv.databinding.PlayerBinding import com.lizongying.mytv.databinding.PlayerBinding
import com.lizongying.mytv.models.TVViewModel import com.lizongying.mytv.models.TVViewModel
class PlayerFragment : Fragment(), SurfaceHolder.Callback { class PlayerFragment : Fragment() {
private var _binding: PlayerBinding? = null private var _binding: PlayerBinding? = null
private var playerView: PlayerView? = null private var playerView: PlayerView? = null
private var tvViewModel: TVViewModel? = null private var tvViewModel: TVViewModel? = null
private val aspectRatio = 16f / 9f private val aspectRatio = 16f / 9f
private lateinit var surfaceView: SurfaceView
private lateinit var surfaceHolder: SurfaceHolder
private var exoPlayer: SimpleExoPlayer? = null
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?, inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle? savedInstanceState: Bundle?
): View { ): View {
_binding = PlayerBinding.inflate(inflater, container, false) _binding = PlayerBinding.inflate(inflater, container, false)
if (Utils.isTmallDevice()) { playerView = _binding!!.playerView
_binding!!.playerView.visibility = View.GONE
surfaceView = _binding!!.surfaceView
surfaceHolder = surfaceView.holder
surfaceHolder.addCallback(this)
} else {
_binding!!.surfaceView.visibility = View.GONE
playerView = _binding!!.playerView
}
playerView?.viewTreeObserver?.addOnGlobalLayoutListener(object : playerView?.viewTreeObserver?.addOnGlobalLayoutListener(object :
ViewTreeObserver.OnGlobalLayoutListener { ViewTreeObserver.OnGlobalLayoutListener {
@@ -111,10 +94,6 @@ class PlayerFragment : Fragment(), SurfaceHolder.Callback {
setMediaItem(MediaItem.fromUri(tvViewModel.getVideoUrlCurrent())) setMediaItem(MediaItem.fromUri(tvViewModel.getVideoUrlCurrent()))
prepare() prepare()
} }
exoPlayer?.run {
setMediaItem(com.google.android.exoplayer2.MediaItem.fromUri(tvViewModel.getVideoUrlCurrent()))
prepare()
}
} }
override fun onStart() { override fun onStart() {
@@ -125,11 +104,6 @@ class PlayerFragment : Fragment(), SurfaceHolder.Callback {
playerView!!.player?.prepare() playerView!!.player?.prepare()
playerView!!.player?.play() playerView!!.player?.play()
} }
if (exoPlayer?.isPlaying == false) {
Log.i(TAG, "replay")
exoPlayer?.prepare()
exoPlayer?.play()
}
} }
override fun onResume() { override fun onResume() {
@@ -142,9 +116,6 @@ class PlayerFragment : Fragment(), SurfaceHolder.Callback {
if (playerView != null && playerView!!.player?.isPlaying == true) { if (playerView != null && playerView!!.player?.isPlaying == true) {
playerView!!.player?.stop() playerView!!.player?.stop()
} }
if (exoPlayer?.isPlaying == true) {
exoPlayer?.stop()
}
} }
override fun onDestroy() { override fun onDestroy() {
@@ -152,7 +123,6 @@ class PlayerFragment : Fragment(), SurfaceHolder.Callback {
if (playerView != null) { if (playerView != null) {
playerView!!.player?.release() playerView!!.player?.release()
} }
exoPlayer?.release()
} }
override fun onDestroyView() { override fun onDestroyView() {
@@ -163,16 +133,4 @@ class PlayerFragment : Fragment(), SurfaceHolder.Callback {
companion object { companion object {
private const val TAG = "PlayerFragment" private const val TAG = "PlayerFragment"
} }
override fun surfaceCreated(holder: SurfaceHolder) {
exoPlayer = SimpleExoPlayer.Builder(requireContext()).build()
exoPlayer?.setVideoSurfaceHolder(surfaceHolder)
exoPlayer?.playWhenReady = true
}
override fun surfaceChanged(holder: SurfaceHolder, format: Int, width: Int, height: Int) {
}
override fun surfaceDestroyed(holder: SurfaceHolder) {
}
} }
@@ -14,6 +14,7 @@ import androidx.core.content.ContextCompat
import androidx.core.view.marginEnd import androidx.core.view.marginEnd
import androidx.core.view.marginTop import androidx.core.view.marginTop
import androidx.fragment.app.DialogFragment import androidx.fragment.app.DialogFragment
import com.lizongying.mytv.api.YSP
import com.lizongying.mytv.databinding.SettingBinding import com.lizongying.mytv.databinding.SettingBinding
@@ -97,7 +98,14 @@ class SettingFragment : DialogFragment() {
requestInstallPermissions() requestInstallPermissions()
} }
val application = requireActivity().applicationContext as MyTvApplication binding.clear.setOnClickListener {
(requireActivity() as MainActivity).syncTime()
SP.guid = ""
YSP.getGuid()
}
val application = requireActivity().applicationContext as MyTVApplication
val textSize = application.px2PxFont(binding.switchChannelReversal.textSize)
binding.content.layoutParams.width = binding.content.layoutParams.width =
application.px2Px(binding.content.layoutParams.width) application.px2Px(binding.content.layoutParams.width)
@@ -108,51 +116,41 @@ class SettingFragment : DialogFragment() {
application.px2Px(binding.content.paddingBottom) application.px2Px(binding.content.paddingBottom)
) )
binding.name.textSize = application.px2PxFont(binding.name.textSize) binding.name.textSize = application.px2PxFont(binding.name.textSize)
binding.version.textSize = application.px2PxFont(binding.version.textSize) binding.version.textSize = textSize
val layoutParamsVersion = binding.version.layoutParams as ViewGroup.MarginLayoutParams val layoutParamsVersion = binding.version.layoutParams as ViewGroup.MarginLayoutParams
layoutParamsVersion.topMargin = application.px2Px(binding.version.marginTop) layoutParamsVersion.topMargin = application.px2Px(binding.version.marginTop)
binding.version.layoutParams = layoutParamsVersion binding.version.layoutParams = layoutParamsVersion
binding.checkVersion.textSize = application.px2PxFont(binding.checkVersion.textSize) binding.checkVersion.textSize = textSize
val layoutParamsCheckVersion = val layoutParamsCheckVersion =
binding.checkVersion.layoutParams as ViewGroup.MarginLayoutParams binding.checkVersion.layoutParams as ViewGroup.MarginLayoutParams
layoutParamsCheckVersion.marginEnd = application.px2Px(binding.checkVersion.marginEnd) layoutParamsCheckVersion.marginEnd = application.px2Px(binding.checkVersion.marginEnd)
binding.checkVersion.layoutParams = layoutParamsCheckVersion binding.checkVersion.layoutParams = layoutParamsCheckVersion
binding.versionName.textSize = application.px2PxFont(binding.versionName.textSize) binding.versionName.textSize = textSize
binding.exit.textSize = application.px2PxFont(binding.exit.textSize) binding.clear.textSize = textSize
binding.exit.textSize = textSize
binding.switchChannelReversal.textSize = val layoutParamsChannelSwitch =
application.px2PxFont(binding.switchChannelReversal.textSize)
val layoutParamsChannelReversal =
binding.switchChannelReversal.layoutParams as ViewGroup.MarginLayoutParams binding.switchChannelReversal.layoutParams as ViewGroup.MarginLayoutParams
layoutParamsChannelReversal.topMargin = layoutParamsChannelSwitch.topMargin =
application.px2Px(binding.switchChannelReversal.marginTop) application.px2Px(binding.switchChannelReversal.marginTop)
binding.switchChannelReversal.layoutParams = layoutParamsChannelReversal
binding.switchChannelNum.textSize = application.px2PxFont(binding.switchChannelNum.textSize) binding.switchChannelReversal.textSize = textSize
val layoutParamsChannelNum = binding.switchChannelReversal.layoutParams = layoutParamsChannelSwitch
binding.switchChannelNum.layoutParams as ViewGroup.MarginLayoutParams
layoutParamsChannelNum.topMargin = application.px2Px(binding.switchChannelNum.marginTop)
binding.switchChannelNum.layoutParams = layoutParamsChannelNum
binding.switchTime.textSize = application.px2PxFont(binding.switchTime.textSize) binding.switchChannelNum.textSize = textSize
val layoutParamsTime = binding.switchTime.layoutParams as ViewGroup.MarginLayoutParams binding.switchChannelNum.layoutParams = layoutParamsChannelSwitch
layoutParamsTime.topMargin = application.px2Px(binding.switchTime.marginTop)
binding.switchTime.layoutParams = layoutParamsTime
binding.switchBootStartup.textSize = binding.switchTime.textSize = textSize
application.px2PxFont(binding.switchBootStartup.textSize) binding.switchTime.layoutParams = layoutParamsChannelSwitch
val layoutParamsBootStartup =
binding.switchBootStartup.layoutParams as ViewGroup.MarginLayoutParams
layoutParamsBootStartup.topMargin = application.px2Px(binding.switchBootStartup.marginTop)
binding.switchBootStartup.layoutParams = layoutParamsBootStartup
binding.switchGrid.textSize = application.px2PxFont(binding.switchGrid.textSize) binding.switchBootStartup.textSize = textSize
val layoutParamsGrid = binding.switchGrid.layoutParams as ViewGroup.MarginLayoutParams binding.switchBootStartup.layoutParams = layoutParamsChannelSwitch
layoutParamsGrid.topMargin = application.px2Px(binding.switchGrid.marginTop)
binding.switchGrid.layoutParams = layoutParamsGrid binding.switchGrid.textSize = textSize
binding.switchGrid.layoutParams = layoutParamsChannelSwitch
binding.appreciate.layoutParams.width = binding.appreciate.layoutParams.width =
application.px2Px(binding.appreciate.layoutParams.width) application.px2Px(binding.appreciate.layoutParams.width)
@@ -24,7 +24,7 @@ class TimeFragment : Fragment() {
): View { ): View {
_binding = TimeBinding.inflate(inflater, container, false) _binding = TimeBinding.inflate(inflater, container, false)
val application = requireActivity().applicationContext as MyTvApplication val application = requireActivity().applicationContext as MyTVApplication
binding.time.layoutParams.width = application.px2Px(binding.time.layoutParams.width) binding.time.layoutParams.width = application.px2Px(binding.time.layoutParams.width)
binding.time.layoutParams.height = application.px2Px(binding.time.layoutParams.height) binding.time.layoutParams.height = application.px2Px(binding.time.layoutParams.height)
@@ -3,6 +3,7 @@ package com.lizongying.mytv.api
import android.os.Build import android.os.Build
import android.util.Log import android.util.Log
import com.google.gson.Gson
import com.lizongying.mytv.jce.JceConverterFactory import com.lizongying.mytv.jce.JceConverterFactory
import com.lizongying.mytv.requests.ReleaseService import com.lizongying.mytv.requests.ReleaseService
import okhttp3.ConnectionSpec import okhttp3.ConnectionSpec
@@ -11,8 +12,6 @@ import okhttp3.TlsVersion
import retrofit2.Retrofit import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory import retrofit2.converter.gson.GsonConverterFactory
import retrofit2.converter.protobuf.ProtoConverterFactory import retrofit2.converter.protobuf.ProtoConverterFactory
import java.net.InetSocketAddress
import java.net.Proxy
import javax.net.ssl.SSLContext import javax.net.ssl.SSLContext
import javax.net.ssl.TrustManager import javax.net.ssl.TrustManager
import javax.net.ssl.X509TrustManager import javax.net.ssl.X509TrustManager
@@ -30,12 +29,13 @@ class ApiClient {
private val fUrl = "https://m.fengshows.com/" private val fUrl = "https://m.fengshows.com/"
private var okHttpClient = getUnsafeOkHttpClient() private var okHttpClient = getUnsafeOkHttpClient()
private var gson = Gson()
val yspApiService: YSPApiService by lazy { val yspApiService: YSPApiService by lazy {
Retrofit.Builder() Retrofit.Builder()
.baseUrl(yspUrl) .baseUrl(yspUrl)
.client(okHttpClient) .client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create()) .addConverterFactory(GsonConverterFactory.create(gson))
.build().create(YSPApiService::class.java) .build().create(YSPApiService::class.java)
} }
@@ -43,7 +43,7 @@ class ApiClient {
Retrofit.Builder() Retrofit.Builder()
.baseUrl(myUrl) .baseUrl(myUrl)
.client(okHttpClient) .client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create()) .addConverterFactory(GsonConverterFactory.create(gson))
.build().create(YSPTokenService::class.java) .build().create(YSPTokenService::class.java)
} }
@@ -51,7 +51,7 @@ class ApiClient {
Retrofit.Builder() Retrofit.Builder()
.baseUrl(HOST) .baseUrl(HOST)
.client(okHttpClient) .client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create()) .addConverterFactory(GsonConverterFactory.create(gson))
.build().create(ReleaseService::class.java) .build().create(ReleaseService::class.java)
} }
@@ -67,7 +67,7 @@ class ApiClient {
Retrofit.Builder() Retrofit.Builder()
.baseUrl(traceUrl) .baseUrl(traceUrl)
.client(okHttpClient) .client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create()) .addConverterFactory(GsonConverterFactory.create(gson))
.build().create(YSPBtraceService::class.java) .build().create(YSPBtraceService::class.java)
} }
@@ -75,7 +75,7 @@ class ApiClient {
Retrofit.Builder() Retrofit.Builder()
.baseUrl(trace2Url) .baseUrl(trace2Url)
.client(okHttpClient) .client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create()) .addConverterFactory(GsonConverterFactory.create(gson))
.build().create(YSPBtraceService::class.java) .build().create(YSPBtraceService::class.java)
} }
@@ -83,7 +83,7 @@ class ApiClient {
Retrofit.Builder() Retrofit.Builder()
.baseUrl(tokenUrl) .baseUrl(tokenUrl)
.client(okHttpClient) .client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create()) .addConverterFactory(GsonConverterFactory.create(gson))
.build().create(YSPApiService::class.java) .build().create(YSPApiService::class.java)
} }
@@ -91,7 +91,7 @@ class ApiClient {
Retrofit.Builder() Retrofit.Builder()
.baseUrl(trace3Url) .baseUrl(trace3Url)
.client(okHttpClient) .client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create()) .addConverterFactory(GsonConverterFactory.create(gson))
.build().create(YSPBtraceService::class.java) .build().create(YSPBtraceService::class.java)
} }
@@ -107,7 +107,7 @@ class ApiClient {
Retrofit.Builder() Retrofit.Builder()
.baseUrl(fUrl) .baseUrl(fUrl)
.client(okHttpClient) .client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create()) .addConverterFactory(GsonConverterFactory.create(gson))
.build().create(FAuthService::class.java) .build().create(FAuthService::class.java)
} }
@@ -1,7 +1,6 @@
package com.lizongying.mytv.api package com.lizongying.mytv.api
import android.content.Context import android.content.Context
import android.util.Log
import com.lizongying.mytv.SP import com.lizongying.mytv.SP
import com.lizongying.mytv.Utils.getDateTimestamp import com.lizongying.mytv.Utils.getDateTimestamp
import com.lizongying.mytv.models.TVViewModel import com.lizongying.mytv.models.TVViewModel
@@ -103,18 +102,18 @@ object YSP {
cKey = cKey =
encryptor.encrypt(cnlid, timeStr, appVer, guid, platform) encryptor.encrypt(cnlid, timeStr, appVer, guid, platform)
Log.i(TAG,"yspsdkinput ${"""{"cnlid":"$cnlid","livepid":"$livepid","stream":"$stream","guid":"$guid","cKey":"$cKey","adjust":$adjust,"sphttps":"$sphttps","platform":"$platform","cmd":"$cmd","encryptVer":"$encryptVer","dtype":"$dtype","devid":"$devid","otype":"$otype","appVer":"$appVer","app_version":"$appVersion","channel":"$channel","defn":"$defn"}"""}" ) yspsdkinput =
md("adjust=$adjust&app_version=$appVersion&appVer=$appVer&channel=$channel&cKey=$cKey&cmd=$cmd&cnlid=$cnlid&defn=$defn&devid=$devid&dtype=$dtype&encryptVer=$encryptVer&guid=$guid&livepid=$livepid&otype=$otype&platform=$platform&sphttps=$sphttps&stream=$stream")
yspsdkinput = md("adjust=$adjust&app_version=$appVersion&appVer=$appVer&channel=$channel&cKey=$cKey&cmd=$cmd&cnlid=$cnlid&defn=$defn&devid=$devid&dtype=$dtype&encryptVer=$encryptVer&guid=$guid&livepid=$livepid&otype=$otype&platform=$platform&sphttps=$sphttps&stream=$stream")
nseqId++ nseqId++
nrequest_id = "999999" + getRand() + getTimeStr() nrequest_id = "999999" + getRand() + getTimeStr()
openapi_signature = md("yspappid:519748109;host:www.yangshipin.cn;protocol:https:;token:$token2;input:$yspsdkinput-$guid-$nseqId-$nrequest_id;") openapi_signature =
md("yspappid:519748109;host:www.yangshipin.cn;protocol:https:;token:$token2;input:$yspsdkinput-$guid-$nseqId-$nrequest_id;")
} }
fun md(str:String):String { fun md(str: String): String {
val md = MessageDigest.getInstance("MD5") val md = MessageDigest.getInstance("MD5")
md.update(str.toByteArray()) md.update(str.toByteArray())
val digest = md.digest() val digest = md.digest()
@@ -148,6 +147,7 @@ object YSP {
var guid = SP.guid var guid = SP.guid
if (guid.length < 18) { if (guid.length < 18) {
guid = generateGuid() guid = generateGuid()
this.guid = guid
SP.guid = guid SP.guid = guid
} }
return guid return guid
@@ -891,7 +891,7 @@ object TVList {
) )
val array = arrayOf("央视", "地方") val array = arrayOf("央视", "地方")
list = list.filterKeys { it in array } // list = list.filterKeys { it in array }
val listNew = mutableMapOf<String, List<TV>>() val listNew = mutableMapOf<String, List<TV>>()
var id = 0 var id = 0
@@ -15,7 +15,7 @@ class TVViewModel(private var tv: TV) : ViewModel() {
private var itemPosition: Int = 0 private var itemPosition: Int = 0
var retryTimes = 0 var retryTimes = 0
var retryMaxTimes = 1 var retryMaxTimes = 8
var authYSPRetryTimes = 0 var authYSPRetryTimes = 0
var authYSPRetryMaxTimes = 3 var authYSPRetryMaxTimes = 3
var tokenYSPRetryTimes = 0 var tokenYSPRetryTimes = 0
-9
View File
@@ -6,15 +6,6 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="@color/black" android:background="@color/black"
android:keepScreenOn="true"> android:keepScreenOn="true">
<SurfaceView
android:id="@+id/surface_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
app:resize_mode="fill"
app:use_controller="false" />
<androidx.media3.ui.PlayerView <androidx.media3.ui.PlayerView
android:id="@+id/player_view" android:id="@+id/player_view"
android:layout_width="match_parent" android:layout_width="match_parent"
+22 -11
View File
@@ -1,18 +1,22 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/setting" android:id="@+id/setting"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
> >
<LinearLayout <ScrollView
android:id="@+id/container"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content"> android:layout_height="match_parent"
android:fillViewport="true"
>
<LinearLayout <LinearLayout
android:id="@+id/content" android:id="@+id/content"
android:layout_width="300dp" android:layout_width="300dp"
android:layout_height="match_parent" android:layout_height="match_parent"
android:orientation="vertical" android:orientation="vertical"
android:paddingTop="20dp" android:paddingTop="20dp"
android:paddingBottom="20dp"
android:paddingLeft="10dp" android:paddingLeft="10dp"
android:paddingRight="10dp" android:paddingRight="10dp"
android:background="@drawable/rounded_dark_left" android:background="@drawable/rounded_dark_left"
@@ -55,6 +59,13 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" /> android:layout_height="wrap_content" />
</LinearLayout> </LinearLayout>
<Button
android:id="@+id/clear"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="14sp"
android:text="@string/clear"
/>
<Button <Button
android:id="@+id/exit" android:id="@+id/exit"
android:layout_width="wrap_content" android:layout_width="wrap_content"
@@ -98,11 +109,11 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" /> android:layout_height="wrap_content" />
</LinearLayout> </LinearLayout>
<ImageView </ScrollView>
android:id="@+id/appreciate" <ImageView
android:layout_width="300dp" android:id="@+id/appreciate"
android:layout_height="wrap_content" android:layout_width="300dp"
android:src="@drawable/appreciate" android:layout_height="wrap_content"
android:background="@drawable/rounded_white_right" /> android:src="@drawable/appreciate"
</LinearLayout> android:background="@drawable/rounded_white_right" />
</FrameLayout> </LinearLayout>
+1
View File
@@ -6,5 +6,6 @@
<string name="title_boot_startup">开机自启</string> <string name="title_boot_startup">开机自启</string>
<string name="title_grid">频道列表采用网格样式</string> <string name="title_grid">频道列表采用网格样式</string>
<string name="title_time">显示时间</string> <string name="title_time">显示时间</string>
<string name="clear">恢复默认</string>
<string name="exit">退出应用</string> <string name="exit">退出应用</string>
</resources> </resources>
+1 -1
View File
@@ -1 +1 @@
{"version_code": 33555200, "version_name": "v2.0.3"} {"version_code": 33556736, "version_name": "v2.0.9"}