diff --git a/app/build.gradle b/app/build.gradle index 7b8b33b..29d718f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -113,4 +113,8 @@ dependencies { implementation 'com.github.bumptech.glide:glide:4.11.0' implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.6.2" 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' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5a058f9..43b8090 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -7,6 +7,7 @@ android:name="android.software.leanback" android:required="true" /> + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/lizongying/mytv/BootReceiver.kt b/app/src/main/java/com/lizongying/mytv/BootReceiver.kt new file mode 100644 index 0000000..773c3b6 --- /dev/null +++ b/app/src/main/java/com/lizongying/mytv/BootReceiver.kt @@ -0,0 +1,19 @@ +package com.lizongying.mytv + +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent + +class BootReceiver : BroadcastReceiver() { + + override fun onReceive(context: Context, intent: Intent) { + val sp = context.getSharedPreferences("MainActivity", Context.MODE_PRIVATE) + if (sp.getBoolean(MainActivity.BOOT_STARTUP, true)) { + context.startActivity( + Intent(context, MainActivity::class.java) + .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + ) + } + } + +} \ 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 270babf..c0c187c 100644 --- a/app/src/main/java/com/lizongying/mytv/MainActivity.kt +++ b/app/src/main/java/com/lizongying/mytv/MainActivity.kt @@ -47,6 +47,7 @@ class MainActivity : FragmentActivity() { lateinit var sharedPref: SharedPreferences private var channelReversal = false private var channelNum = true + private var bootStartup = true private var versionName = "" @@ -83,6 +84,7 @@ class MainActivity : FragmentActivity() { sharedPref = getPreferences(Context.MODE_PRIVATE) channelReversal = sharedPref.getBoolean(CHANNEL_REVERSAL, channelReversal) channelNum = sharedPref.getBoolean(CHANNEL_NUM, channelNum) + bootStartup = sharedPref.getBoolean(BOOT_STARTUP, bootStartup) val packageInfo = getPackageInfo() versionName = packageInfo.versionName @@ -91,7 +93,7 @@ class MainActivity : FragmentActivity() { } else { packageInfo.versionCode.toLong() } - settingFragment = SettingFragment(versionName, versionCode, channelReversal, channelNum) + settingFragment = SettingFragment(versionName, versionCode, channelReversal, channelNum, bootStartup) } fun showInfoFragment(tvViewModel: TVViewModel) { @@ -249,6 +251,14 @@ class MainActivity : FragmentActivity() { this.channelNum = channelNum } + fun saveBootStartup(bootStartup: Boolean) { + with(sharedPref.edit()) { + putBoolean(BOOT_STARTUP, bootStartup) + apply() + } + this.bootStartup = bootStartup + } + private fun showSetting() { if (!mainFragment.isHidden) { return @@ -537,5 +547,6 @@ class MainActivity : FragmentActivity() { private const val TAG = "MainActivity" private const val CHANNEL_REVERSAL = "channel_reversal" private const val CHANNEL_NUM = "channel_num" + const val BOOT_STARTUP = "boot_startup" } } \ No newline at end of file diff --git a/app/src/main/java/com/lizongying/mytv/PlayerFragment.kt b/app/src/main/java/com/lizongying/mytv/PlayerFragment.kt index d3031f3..81f7ccc 100644 --- a/app/src/main/java/com/lizongying/mytv/PlayerFragment.kt +++ b/app/src/main/java/com/lizongying/mytv/PlayerFragment.kt @@ -3,6 +3,8 @@ package com.lizongying.mytv import android.os.Bundle import android.util.Log import android.view.LayoutInflater +import android.view.SurfaceHolder +import android.view.SurfaceView import android.view.View import android.view.ViewGroup import android.view.ViewTreeObserver @@ -15,23 +17,39 @@ import androidx.media3.common.VideoSize import androidx.media3.common.util.UnstableApi import androidx.media3.exoplayer.ExoPlayer import androidx.media3.ui.PlayerView +import com.google.android.exoplayer2.SimpleExoPlayer import com.lizongying.mytv.databinding.PlayerBinding import com.lizongying.mytv.models.TVViewModel -class PlayerFragment : Fragment() { +class PlayerFragment : Fragment(), SurfaceHolder.Callback { private var _binding: PlayerBinding? = null private var playerView: PlayerView? = null private var tvViewModel: TVViewModel? = null private val aspectRatio = 16f / 9f + + private lateinit var surfaceView: SurfaceView + private lateinit var surfaceHolder: SurfaceHolder + private var exoPlayer: SimpleExoPlayer? = null + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { _binding = PlayerBinding.inflate(inflater, container, false) - playerView = _binding!!.playerView + + if (Utils.isTmallDevice()) { + _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 : ViewTreeObserver.OnGlobalLayoutListener { override fun onGlobalLayout() { @@ -78,6 +96,10 @@ class PlayerFragment : Fragment() { setMediaItem(MediaItem.fromUri(tvViewModel.getVideoUrlCurrent())) prepare() } + exoPlayer?.run { + setMediaItem(com.google.android.exoplayer2.MediaItem.fromUri(tvViewModel.getVideoUrlCurrent())) + prepare() + } } override fun onStart() { @@ -87,8 +109,11 @@ class PlayerFragment : Fragment() { Log.i(TAG, "replay") playerView!!.player?.prepare() playerView!!.player?.play() - } else { - Log.i(TAG, "playing") + } + if (exoPlayer?.isPlaying == false) { + Log.i(TAG, "replay") + exoPlayer?.prepare() + exoPlayer?.play() } } @@ -102,6 +127,9 @@ class PlayerFragment : Fragment() { if (playerView != null && playerView!!.player?.isPlaying == true) { playerView!!.player?.stop() } + if (exoPlayer?.isPlaying == true) { + exoPlayer?.stop() + } } override fun onDestroy() { @@ -109,6 +137,7 @@ class PlayerFragment : Fragment() { if (playerView != null) { playerView!!.player?.release() } + exoPlayer?.release() } override fun onDestroyView() { @@ -119,4 +148,16 @@ class PlayerFragment : Fragment() { companion object { private const val TAG = "PlaybackVideoFragment" } + + 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) { + } } \ No newline at end of file diff --git a/app/src/main/java/com/lizongying/mytv/SettingFragment.kt b/app/src/main/java/com/lizongying/mytv/SettingFragment.kt index f773d18..a9fa81e 100644 --- a/app/src/main/java/com/lizongying/mytv/SettingFragment.kt +++ b/app/src/main/java/com/lizongying/mytv/SettingFragment.kt @@ -15,6 +15,7 @@ class SettingFragment( private val versionCode: Long, private val channelReversal: Boolean, private val channelNum: Boolean, + private val bootStartup: Boolean, ) : DialogFragment() { @@ -49,6 +50,12 @@ class SettingFragment( (activity as MainActivity).saveChannelNum(isChecked) } + val switchBootStartup = _binding?.switchBootStartup + switchBootStartup?.isChecked = bootStartup + switchBootStartup?.setOnCheckedChangeListener { _, isChecked -> + (activity as MainActivity).saveBootStartup(isChecked) + } + updateManager = UpdateManager(context, this, versionCode) _binding?.checkVersion?.setOnClickListener(OnClickListenerCheckVersion(updateManager)) diff --git a/app/src/main/java/com/lizongying/mytv/Utils.kt b/app/src/main/java/com/lizongying/mytv/Utils.kt index f8c70b9..09cc2db 100644 --- a/app/src/main/java/com/lizongying/mytv/Utils.kt +++ b/app/src/main/java/com/lizongying/mytv/Utils.kt @@ -2,6 +2,7 @@ package com.lizongying.mytv import android.content.Context import android.content.res.Resources +import android.os.Build import android.util.TypedValue import com.google.gson.Gson import com.lizongying.mytv.api.TimeResponse @@ -74,6 +75,8 @@ object Utils { ).toInt() } + fun isTmallDevice() = Build.MANUFACTURER.equals("Tmall", ignoreCase = true) + /** * 获取可读写的目录 * diff --git a/app/src/main/java/com/lizongying/mytv/api/ApiClient.kt b/app/src/main/java/com/lizongying/mytv/api/ApiClient.kt index c3ef3ec..6ff511a 100644 --- a/app/src/main/java/com/lizongying/mytv/api/ApiClient.kt +++ b/app/src/main/java/com/lizongying/mytv/api/ApiClient.kt @@ -17,7 +17,6 @@ class ApiClient { private val protoUrl = "https://capi.yangshipin.cn/" private val traceUrl = "https://btrace.yangshipin.cn/" - private var okHttpClient = getUnsafeOkHttpClient() val yspApiService: YSPApiService by lazy { diff --git a/app/src/main/res/layout/dialog.xml b/app/src/main/res/layout/dialog.xml index 22c04d2..bb69502 100644 --- a/app/src/main/res/layout/dialog.xml +++ b/app/src/main/res/layout/dialog.xml @@ -64,6 +64,12 @@ android:layout_marginTop="10dp" android:layout_width="match_parent" android:layout_height="wrap_content" /> + + + 换台反转 数字选台 检查更新 + 开机自启 \ No newline at end of file