diff --git a/README.md b/README.md index 3f5a6e01..1398b7e6 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,15 @@ ## 更新日志 +### v1.4.5(高版本专用) + +* 数字选台配置 + +### v1.4.4(通用版) + +* 优化图标显示 +* 增加换台反转 + ### v1.3.3 * 部分错误会提示用户 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f76b90f5..b38f4862 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -9,7 +9,7 @@ diff --git a/app/src/main/java/com/lizongying/mytv/ChannelFragment.kt b/app/src/main/java/com/lizongying/mytv/ChannelFragment.kt new file mode 100644 index 00000000..4e51b57d --- /dev/null +++ b/app/src/main/java/com/lizongying/mytv/ChannelFragment.kt @@ -0,0 +1,74 @@ +package com.lizongying.mytv + +import android.os.Bundle +import android.os.Handler +import android.util.Log +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import com.lizongying.mytv.databinding.ChannelBinding +import com.lizongying.mytv.models.TVViewModel + +class ChannelFragment : Fragment() { + private var _binding: ChannelBinding? = null + private val binding get() = _binding!! + + private val handler = Handler() + private val delay: Long = 3000 + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + _binding = ChannelBinding.inflate(inflater, container, false) + (activity as MainActivity).fragmentReady() + return binding.root + } + + fun show(tvViewModel: TVViewModel) { + binding.channelContent.text = tvViewModel.id.value.toString() + handler.removeCallbacks(removeRunnable) + view?.visibility = View.VISIBLE + handler.postDelayed(removeRunnable, delay) + } + + fun show(channel: String) { + if (binding.channelContent.text == "") { + binding.channelContent.text = channel + handler.removeCallbacks(removeRunnable) + view?.visibility = View.VISIBLE + handler.postDelayed(removeRunnable, delay) + } else { + val ch = "${binding.channelContent.text}$channel".toInt() + Log.i(TAG, "channel $ch") + (activity as MainActivity).play(ch) + binding.channelContent.text = "" + view?.visibility = View.GONE + } + } + + override fun onResume() { + super.onResume() + handler.postDelayed(removeRunnable, delay) + } + + override fun onPause() { + super.onPause() + handler.removeCallbacks(removeRunnable) + } + + private val removeRunnable = Runnable { + binding.channelContent.text = "" + view?.visibility = View.GONE + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } + + companion object { + private const val TAG = "ChannelFragment" + } +} \ 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 3674e1b0..37209ece 100644 --- a/app/src/main/java/com/lizongying/mytv/MainActivity.kt +++ b/app/src/main/java/com/lizongying/mytv/MainActivity.kt @@ -27,6 +27,7 @@ class MainActivity : FragmentActivity() { var playerFragment = PlayerFragment() private val mainFragment = MainFragment() private val infoFragment = InfoFragment() + private val channelFragment = ChannelFragment() private var doubleBackToExitPressedOnce = false @@ -34,9 +35,14 @@ class MainActivity : FragmentActivity() { private val handler = Handler() private val delay: Long = 4000 + private val delayHideHelp: Long = 10000 private lateinit var sharedPref: SharedPreferences private var channelReversal = false + private var channelNum = true + + private var versionName = "" + private lateinit var dialogFragment: MyDialogFragment override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -50,19 +56,28 @@ class MainActivity : FragmentActivity() { supportFragmentManager.beginTransaction() .add(R.id.main_browse_fragment, playerFragment) .add(R.id.main_browse_fragment, infoFragment) + .add(R.id.main_browse_fragment, channelFragment) .add(R.id.main_browse_fragment, mainFragment) .hide(infoFragment) + .hide(channelFragment) .commit() mainFragment.view?.requestFocus() } gestureDetector = GestureDetector(this, GestureListener()) sharedPref = getPreferences(Context.MODE_PRIVATE) - channelReversal = sharedPref.getBoolean(CHANNEL_REVERSAL, false) + channelReversal = sharedPref.getBoolean(CHANNEL_REVERSAL, channelReversal) + channelNum = sharedPref.getBoolean(CHANNEL_NUM, channelNum) + + versionName = getPackageInfo().versionName + dialogFragment = MyDialogFragment(versionName, channelReversal, channelNum) } fun showInfoFragment(tvViewModel: TVViewModel) { infoFragment.show(tvViewModel) + if (channelNum) { + channelFragment.show(tvViewModel) + } } fun play(tvViewModel: TVViewModel) { @@ -70,6 +85,10 @@ class MainActivity : FragmentActivity() { mainFragment.view?.requestFocus() } + fun play(itemPosition: Int) { + mainFragment.play(itemPosition) + } + fun prev() { mainFragment.prev() } @@ -79,11 +98,11 @@ class MainActivity : FragmentActivity() { } private fun prevSource() { - mainFragment.prevSource() +// mainFragment.prevSource() } private fun nextSource() { - mainFragment.nextSource() +// mainFragment.nextSource() } fun switchMainFragment() { @@ -182,14 +201,34 @@ class MainActivity : FragmentActivity() { this.channelReversal = channelReversal } + fun saveChannelNum(channelNum: Boolean) { + with(sharedPref.edit()) { + putBoolean(CHANNEL_NUM, channelNum) + apply() + } + this.channelNum = channelNum + } + private fun showHelp() { if (!mainFragment.isHidden) { return } - val versionName = getPackageInfo().versionName - val dialogFragment = MyDialogFragment(versionName, channelReversal) - dialogFragment.show(supportFragmentManager, "settings_dialog") + Log.i(TAG, "dialogFragment ${dialogFragment.isVisible}") + if (!dialogFragment.isVisible) { + dialogFragment.show(supportFragmentManager, "settings_dialog") + handler.removeCallbacks(hideHelp) + handler.postDelayed(hideHelp, delayHideHelp) + } else { + handler.removeCallbacks(hideHelp) + dialogFragment.dismiss() + } + } + + private val hideHelp = Runnable { + if (dialogFragment.isVisible) { + dialogFragment.dismiss() + } } private fun channelUp() { @@ -244,8 +283,72 @@ class MainActivity : FragmentActivity() { }, 2000) } + private fun showChannel(channel: String) { + if (!mainFragment.isHidden) { + return + } + + if (dialogFragment.isVisible) { + return + } + + if (channelNum) { + channelFragment.show(channel) + } + } + override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { when (keyCode) { + KeyEvent.KEYCODE_0 -> { + showChannel("0") + return true + } + + KeyEvent.KEYCODE_1 -> { + showChannel("1") + return true + } + + KeyEvent.KEYCODE_2 -> { + showChannel("2") + return true + } + + KeyEvent.KEYCODE_3 -> { + showChannel("3") + return true + } + + KeyEvent.KEYCODE_4 -> { + showChannel("4") + return true + } + + KeyEvent.KEYCODE_5 -> { + showChannel("5") + return true + } + + KeyEvent.KEYCODE_6 -> { + showChannel("6") + return true + } + + KeyEvent.KEYCODE_7 -> { + showChannel("7") + return true + } + + KeyEvent.KEYCODE_8 -> { + showChannel("8") + return true + } + + KeyEvent.KEYCODE_9 -> { + showChannel("9") + return true + } + KeyEvent.KEYCODE_ESCAPE -> { back() return true @@ -388,5 +491,6 @@ class MainActivity : FragmentActivity() { companion object { private const val TAG = "MainActivity" private const val CHANNEL_REVERSAL = "channel_reversal" + private const val CHANNEL_NUM = "channel_num" } } \ No newline at end of file diff --git a/app/src/main/java/com/lizongying/mytv/MainFragment.kt b/app/src/main/java/com/lizongying/mytv/MainFragment.kt index 566d70c9..64804bec 100644 --- a/app/src/main/java/com/lizongying/mytv/MainFragment.kt +++ b/app/src/main/java/com/lizongying/mytv/MainFragment.kt @@ -216,7 +216,7 @@ class MainFragment : BrowseSupportFragment() { fun fragmentReady() { ready++ Log.i(TAG, "ready $ready") - if (ready == 3) { + if (ready == 4) { // request.fetchPage() val tvViewModel = tvListViewModel.getTVViewModel(itemPosition) tvViewModel?.changed() @@ -225,6 +225,16 @@ class MainFragment : BrowseSupportFragment() { } } + fun play(itemPosition: Int) { + view?.post { + if (itemPosition < tvListViewModel.size()) { + this.itemPosition = itemPosition + tvListViewModel.setItemPosition(itemPosition) + tvListViewModel.getTVViewModel(itemPosition)?.changed() + } + } + } + fun prev() { view?.post { itemPosition-- @@ -232,9 +242,7 @@ class MainFragment : BrowseSupportFragment() { itemPosition = tvListViewModel.size() - 1 } tvListViewModel.setItemPosition(itemPosition) - - val tvViewModel = tvListViewModel.getTVViewModel(itemPosition) - tvViewModel?.changed() + tvListViewModel.getTVViewModel(itemPosition)?.changed() } } @@ -245,9 +253,7 @@ class MainFragment : BrowseSupportFragment() { itemPosition = 0 } tvListViewModel.setItemPosition(itemPosition) - - val tvViewModel = tvListViewModel.getTVViewModel(itemPosition) - tvViewModel?.changed() + tvListViewModel.getTVViewModel(itemPosition)?.changed() } } @@ -297,9 +303,7 @@ class MainFragment : BrowseSupportFragment() { if (itemPosition != item.id.value!!) { itemPosition = item.id.value!! tvListViewModel.setItemPosition(itemPosition) - - val tvViewModel = tvListViewModel.getTVViewModel(itemPosition) - tvViewModel?.changed() + tvListViewModel.getTVViewModel(itemPosition)?.changed() } (activity as? MainActivity)?.switchMainFragment() } diff --git a/app/src/main/java/com/lizongying/mytv/MyDialogFragment.kt b/app/src/main/java/com/lizongying/mytv/MyDialogFragment.kt index 71c328d9..2bf8413a 100644 --- a/app/src/main/java/com/lizongying/mytv/MyDialogFragment.kt +++ b/app/src/main/java/com/lizongying/mytv/MyDialogFragment.kt @@ -8,12 +8,20 @@ import androidx.fragment.app.DialogFragment import com.lizongying.mytv.databinding.DialogBinding -class MyDialogFragment(private val versionName: String, private val channelReversal: Boolean) : +class MyDialogFragment(private val versionName: String, + private val channelReversal: Boolean, + private val channelNum: Boolean, + ) : DialogFragment() { private var _binding: DialogBinding? = null private val binding get() = _binding!! + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setStyle(STYLE_NO_TITLE, 0) + } + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -23,12 +31,18 @@ class MyDialogFragment(private val versionName: String, private val channelRever _binding?.version?.text = "当前版本: $versionName\n获取最新: https://github.com/lizongying/my-tv/releases/" - val switchView = _binding?.switchView - switchView?.isChecked = channelReversal - switchView?.setOnCheckedChangeListener { _, isChecked -> + val switchChannelReversal = _binding?.switchChannelReversal + switchChannelReversal?.isChecked = channelReversal + switchChannelReversal?.setOnCheckedChangeListener { _, isChecked -> (activity as MainActivity).saveChannelReversal(isChecked) } + val switchChannelNum = _binding?.switchChannelNum + switchChannelNum?.isChecked = channelNum + switchChannelNum?.setOnCheckedChangeListener { _, isChecked -> + (activity as MainActivity).saveChannelNum(isChecked) + } + return binding.root } diff --git a/app/src/main/java/com/lizongying/mytv/PlayerFragment.kt b/app/src/main/java/com/lizongying/mytv/PlayerFragment.kt index 77b5557c..b3218455 100644 --- a/app/src/main/java/com/lizongying/mytv/PlayerFragment.kt +++ b/app/src/main/java/com/lizongying/mytv/PlayerFragment.kt @@ -103,6 +103,11 @@ class PlayerFragment : Fragment() { } } + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } + companion object { private const val TAG = "PlaybackVideoFragment" } diff --git a/app/src/main/res/layout/channel.xml b/app/src/main/res/layout/channel.xml new file mode 100644 index 00000000..47c664a8 --- /dev/null +++ b/app/src/main/res/layout/channel.xml @@ -0,0 +1,20 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog.xml b/app/src/main/res/layout/dialog.xml index 45bf1fc1..75c8c46f 100644 --- a/app/src/main/res/layout/dialog.xml +++ b/app/src/main/res/layout/dialog.xml @@ -26,12 +26,18 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" - android:layout_marginBottom="10dp" android:text="当前版本: $versionName\n获取最新: https://github.com/lizongying/my-tv/releases/" > + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d9b2b040..e74e266a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,4 +1,5 @@ 我的电视 - 频道反转 + 换台反转 + 数字选台 \ No newline at end of file