diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index cedda08f..d81e29d9 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -74,7 +74,6 @@ dependencies {
implementation(libs.androidx.appcompat)
implementation(libs.androidx.constraintlayout)
implementation(libs.androidx.core)
- implementation(libs.androidx.leanback)
implementation(libs.androidx.lifecycle.runtime)
implementation(libs.androidx.lifecycle.viewmodel)
implementation(libs.androidx.media3.exoplayer)
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index e99612e3..52c79592 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -3,14 +3,11 @@
-
-
-
-
-
-
diff --git a/app/src/main/java/dev/jdtech/jellyfin/MainActivity.kt b/app/src/main/java/dev/jdtech/jellyfin/MainActivity.kt
index 30a3d39b..0c6f9c44 100644
--- a/app/src/main/java/dev/jdtech/jellyfin/MainActivity.kt
+++ b/app/src/main/java/dev/jdtech/jellyfin/MainActivity.kt
@@ -1,7 +1,5 @@
package dev.jdtech.jellyfin
-import android.app.UiModeManager
-import android.content.res.Configuration
import android.os.Bundle
import android.view.View
import androidx.activity.viewModels
@@ -26,7 +24,6 @@ import javax.inject.Inject
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
- private lateinit var uiModeManager: UiModeManager
private val viewModel: MainViewModel by viewModels()
@@ -43,7 +40,6 @@ class MainActivity : AppCompatActivity() {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
- uiModeManager = getSystemService(UI_MODE_SERVICE) as UiModeManager
setContentView(binding.root)
@@ -53,52 +49,40 @@ class MainActivity : AppCompatActivity() {
val inflater = navController.navInflater
val graph = inflater.inflate(R.navigation.app_navigation)
- if (uiModeManager.currentModeType == Configuration.UI_MODE_TYPE_TELEVISION) {
- graph.setStartDestination(R.id.homeFragmentTv)
- checkServersEmpty(graph)
- checkUser(graph)
- if (!viewModel.startDestinationTvChanged) {
- viewModel.startDestinationTvChanged = true
- navController.setGraph(graph, intent.extras)
- }
- } else {
- checkServersEmpty(graph) {
- navController.setGraph(graph, intent.extras)
- }
- checkUser(graph) {
- navController.setGraph(graph, intent.extras)
- }
+ checkServersEmpty(graph) {
+ navController.setGraph(graph, intent.extras)
+ }
+ checkUser(graph) {
+ navController.setGraph(graph, intent.extras)
}
- if (uiModeManager.currentModeType != Configuration.UI_MODE_TYPE_TELEVISION) {
- val navView: NavigationBarView = binding.navView as NavigationBarView
+ val navView: NavigationBarView = binding.navView as NavigationBarView
- setSupportActionBar(binding.mainToolbar)
+ setSupportActionBar(binding.mainToolbar)
- // Passing each menu ID as a set of Ids because each
- // menu should be considered as top level destinations.
- val appBarConfiguration = AppBarConfiguration(
- setOf(
- R.id.homeFragment,
- R.id.mediaFragment,
- R.id.favoriteFragment,
- R.id.downloadFragment
- )
+ // Passing each menu ID as a set of Ids because each
+ // menu should be considered as top level destinations.
+ val appBarConfiguration = AppBarConfiguration(
+ setOf(
+ R.id.homeFragment,
+ R.id.mediaFragment,
+ R.id.favoriteFragment,
+ R.id.downloadFragment
)
+ )
- setupActionBarWithNavController(navController, appBarConfiguration)
- // navView.setupWithNavController(navController)
- // Don't save the state of other main navigation items, only this experimental function allows turning off this behavior
- NavigationUI.setupWithNavController(navView, navController, false)
+ setupActionBarWithNavController(navController, appBarConfiguration)
+ // navView.setupWithNavController(navController)
+ // Don't save the state of other main navigation items, only this experimental function allows turning off this behavior
+ NavigationUI.setupWithNavController(navView, navController, false)
- navController.addOnDestinationChangedListener { _, destination, _ ->
- binding.navView!!.visibility = when (destination.id) {
- R.id.twoPaneSettingsFragment, R.id.serverSelectFragment, R.id.addServerFragment, R.id.loginFragment, R.id.about_libraries_dest, R.id.usersFragment, R.id.serverAddressesFragment -> View.GONE
- else -> View.VISIBLE
- }
- if (destination.id == R.id.about_libraries_dest) binding.mainToolbar?.title =
- getString(R.string.app_info)
+ navController.addOnDestinationChangedListener { _, destination, _ ->
+ binding.navView.visibility = when (destination.id) {
+ R.id.twoPaneSettingsFragment, R.id.serverSelectFragment, R.id.addServerFragment, R.id.loginFragment, R.id.about_libraries_dest, R.id.usersFragment, R.id.serverAddressesFragment -> View.GONE
+ else -> View.VISIBLE
}
+ if (destination.id == R.id.about_libraries_dest) binding.mainToolbar.title =
+ getString(R.string.app_info)
}
loadDownloadLocation(applicationContext)
diff --git a/app/src/main/java/dev/jdtech/jellyfin/dialogs/AddServerAddressDialog.kt b/app/src/main/java/dev/jdtech/jellyfin/dialogs/AddServerAddressDialog.kt
index f1d0ece5..332f0e45 100644
--- a/app/src/main/java/dev/jdtech/jellyfin/dialogs/AddServerAddressDialog.kt
+++ b/app/src/main/java/dev/jdtech/jellyfin/dialogs/AddServerAddressDialog.kt
@@ -1,12 +1,8 @@
package dev.jdtech.jellyfin.dialogs
import android.app.Dialog
-import android.app.UiModeManager
-import android.content.res.Configuration
import android.os.Bundle
import android.widget.EditText
-import androidx.appcompat.app.AlertDialog
-import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.DialogFragment
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import dev.jdtech.jellyfin.R
@@ -17,16 +13,10 @@ class AddServerAddressDialog(
private val viewModel: ServerAddressesViewModel
) : DialogFragment() {
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
- val uiModeManager =
- requireContext().getSystemService(AppCompatActivity.UI_MODE_SERVICE) as UiModeManager
val editText = EditText(this.context)
editText.hint = "http://:8096"
return activity?.let { activity ->
- val builder = if (uiModeManager.currentModeType == Configuration.UI_MODE_TYPE_TELEVISION) {
- AlertDialog.Builder(activity)
- } else {
- MaterialAlertDialogBuilder(activity)
- }
+ val builder = MaterialAlertDialogBuilder(activity)
builder
.setTitle("Add server address")
.setView(editText)
diff --git a/app/src/main/java/dev/jdtech/jellyfin/fragments/AddServerFragment.kt b/app/src/main/java/dev/jdtech/jellyfin/fragments/AddServerFragment.kt
index 806d4ddf..127a2f06 100644
--- a/app/src/main/java/dev/jdtech/jellyfin/fragments/AddServerFragment.kt
+++ b/app/src/main/java/dev/jdtech/jellyfin/fragments/AddServerFragment.kt
@@ -1,13 +1,10 @@
package dev.jdtech.jellyfin.fragments
-import android.app.UiModeManager
-import android.content.res.Configuration
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.inputmethod.EditorInfo
-import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.AppCompatEditText
import androidx.core.view.isVisible
import androidx.fragment.app.Fragment
@@ -27,7 +24,6 @@ import timber.log.Timber
class AddServerFragment : Fragment() {
private lateinit var binding: FragmentAddServerBinding
- private lateinit var uiModeManager: UiModeManager
private val viewModel: AddServerViewModel by viewModels()
override fun onCreateView(
@@ -36,8 +32,6 @@ class AddServerFragment : Fragment() {
savedInstanceState: Bundle?
): View {
binding = FragmentAddServerBinding.inflate(inflater)
- uiModeManager =
- requireContext().getSystemService(AppCompatActivity.UI_MODE_SERVICE) as UiModeManager
(binding.editTextServerAddress as AppCompatEditText).setOnEditorActionListener { _, actionId, _ ->
return@setOnEditorActionListener when (actionId) {
@@ -98,42 +92,24 @@ class AddServerFragment : Fragment() {
private fun bindUiStateNormal() {
binding.buttonConnect.isEnabled = true
binding.progressCircular.isVisible = false
- if (uiModeManager.currentModeType == Configuration.UI_MODE_TYPE_TELEVISION) {
- (binding.editTextServerAddress as AppCompatEditText).isEnabled = true
- } else {
- binding.editTextServerAddressLayout!!.isEnabled = true
- }
+ binding.editTextServerAddressLayout.isEnabled = true
}
private fun bindUiStateError(uiState: AddServerViewModel.UiState.Error) {
binding.buttonConnect.isEnabled = true
binding.progressCircular.isVisible = false
- if (uiModeManager.currentModeType == Configuration.UI_MODE_TYPE_TELEVISION) {
- (binding.editTextServerAddress as AppCompatEditText).apply {
- error = uiState.message
- isEnabled = true
- }
- } else {
- binding.editTextServerAddressLayout!!.apply {
- error = uiState.message
- isEnabled = true
- }
+ binding.editTextServerAddressLayout.apply {
+ error = uiState.message
+ isEnabled = true
}
}
private fun bindUiStateLoading() {
binding.buttonConnect.isEnabled = false
binding.progressCircular.isVisible = true
- if (uiModeManager.currentModeType == Configuration.UI_MODE_TYPE_TELEVISION) {
- (binding.editTextServerAddress as AppCompatEditText).apply {
- error = null
- isEnabled = false
- }
- } else {
- binding.editTextServerAddressLayout!!.apply {
- error = null
- isEnabled = false
- }
+ binding.editTextServerAddressLayout.apply {
+ error = null
+ isEnabled = false
}
}
diff --git a/app/src/main/java/dev/jdtech/jellyfin/fragments/LibraryFragment.kt b/app/src/main/java/dev/jdtech/jellyfin/fragments/LibraryFragment.kt
index 3b666287..76c00f9d 100644
--- a/app/src/main/java/dev/jdtech/jellyfin/fragments/LibraryFragment.kt
+++ b/app/src/main/java/dev/jdtech/jellyfin/fragments/LibraryFragment.kt
@@ -1,8 +1,6 @@
package dev.jdtech.jellyfin.fragments
-import android.app.UiModeManager
import android.content.SharedPreferences
-import android.content.res.Configuration
import android.os.Bundle
import android.view.LayoutInflater
import android.view.Menu
@@ -10,7 +8,6 @@ import android.view.MenuInflater
import android.view.MenuItem
import android.view.View
import android.view.ViewGroup
-import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.MenuHost
import androidx.core.view.MenuProvider
import androidx.core.view.isVisible
@@ -22,7 +19,6 @@ import androidx.lifecycle.repeatOnLifecycle
import androidx.navigation.fragment.findNavController
import androidx.navigation.fragment.navArgs
import androidx.paging.LoadState
-import androidx.recyclerview.widget.LinearSnapHelper
import dagger.hilt.android.AndroidEntryPoint
import dev.jdtech.jellyfin.R
import dev.jdtech.jellyfin.adapters.ViewItemPagingAdapter
@@ -42,7 +38,6 @@ import org.jellyfin.sdk.model.api.SortOrder
class LibraryFragment : Fragment() {
private lateinit var binding: FragmentLibraryBinding
- private lateinit var uiModeManager: UiModeManager
private val viewModel: LibraryViewModel by viewModels()
private val args: LibraryFragmentArgs by navArgs()
@@ -57,8 +52,6 @@ class LibraryFragment : Fragment() {
savedInstanceState: Bundle?
): View {
binding = FragmentLibraryBinding.inflate(inflater, container, false)
- uiModeManager =
- requireContext().getSystemService(AppCompatActivity.UI_MODE_SERVICE) as UiModeManager
return binding.root
}
@@ -105,8 +98,6 @@ class LibraryFragment : Fragment() {
viewLifecycleOwner, Lifecycle.State.RESUMED
)
- binding.title?.text = args.libraryName
-
binding.errorLayout.errorRetryButton.setOnClickListener {
viewModel.loadItems(args.libraryId, args.libraryType)
}
@@ -118,11 +109,6 @@ class LibraryFragment : Fragment() {
)
}
- if (uiModeManager.currentModeType == Configuration.UI_MODE_TYPE_TELEVISION) {
- val snapHelper = LinearSnapHelper()
- snapHelper.attachToRecyclerView(binding.itemsRecyclerView)
- }
-
binding.itemsRecyclerView.adapter =
ViewItemPagingAdapter(
ViewItemPagingAdapter.OnClickListener { item ->
@@ -205,22 +191,12 @@ class LibraryFragment : Fragment() {
}
private fun navigateToMediaInfoFragment(item: BaseItemDto) {
- if (uiModeManager.currentModeType == Configuration.UI_MODE_TYPE_TELEVISION) {
- findNavController().navigate(
- LibraryFragmentDirections.actionLibraryFragmentToMediaDetailFragment(
- item.id,
- item.name,
- item.type
- )
+ findNavController().navigate(
+ LibraryFragmentDirections.actionLibraryFragmentToMediaInfoFragment(
+ item.id,
+ item.name,
+ item.type
)
- } else {
- findNavController().navigate(
- LibraryFragmentDirections.actionLibraryFragmentToMediaInfoFragment(
- item.id,
- item.name,
- item.type
- )
- )
- }
+ )
}
}
diff --git a/app/src/main/java/dev/jdtech/jellyfin/fragments/LoginFragment.kt b/app/src/main/java/dev/jdtech/jellyfin/fragments/LoginFragment.kt
index 4ee9436e..97dcca75 100644
--- a/app/src/main/java/dev/jdtech/jellyfin/fragments/LoginFragment.kt
+++ b/app/src/main/java/dev/jdtech/jellyfin/fragments/LoginFragment.kt
@@ -1,13 +1,10 @@
package dev.jdtech.jellyfin.fragments
-import android.app.UiModeManager
-import android.content.res.Configuration
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.inputmethod.EditorInfo
-import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.AppCompatEditText
import androidx.core.view.isVisible
import androidx.fragment.app.Fragment
@@ -31,7 +28,6 @@ import timber.log.Timber
class LoginFragment : Fragment() {
private lateinit var binding: FragmentLoginBinding
- private lateinit var uiModeManager: UiModeManager
private val viewModel: LoginViewModel by viewModels()
private val args: LoginFragmentArgs by navArgs()
@@ -47,8 +43,6 @@ class LoginFragment : Fragment() {
savedInstanceState: Bundle?
): View {
binding = FragmentLoginBinding.inflate(inflater)
- uiModeManager =
- requireContext().getSystemService(AppCompatActivity.UI_MODE_SERVICE) as UiModeManager
if (args.reLogin) {
appPreferences.currentServer?.let { currentServerId ->
@@ -117,49 +111,28 @@ class LoginFragment : Fragment() {
private fun bindUiStateNormal() {
binding.buttonLogin.isEnabled = true
binding.progressCircular.isVisible = false
- if (uiModeManager.currentModeType == Configuration.UI_MODE_TYPE_TELEVISION) {
- (binding.editTextUsername as AppCompatEditText).isEnabled = true
- (binding.editTextPassword as AppCompatEditText).isEnabled = true
- } else {
- binding.editTextUsernameLayout!!.isEnabled = true
- binding.editTextPasswordLayout!!.isEnabled = true
- }
+ binding.editTextUsernameLayout.isEnabled = true
+ binding.editTextPasswordLayout.isEnabled = true
}
private fun bindUiStateError(uiState: LoginViewModel.UiState.Error) {
binding.buttonLogin.isEnabled = true
binding.progressCircular.isVisible = false
- if (uiModeManager.currentModeType == Configuration.UI_MODE_TYPE_TELEVISION) {
- (binding.editTextUsername as AppCompatEditText).apply {
- error = uiState.message
- isEnabled = true
- }
- (binding.editTextPassword as AppCompatEditText).isEnabled = true
- } else {
- binding.editTextUsernameLayout!!.apply {
- error = uiState.message
- isEnabled = true
- }
- binding.editTextPasswordLayout!!.isEnabled = true
+ binding.editTextUsernameLayout.apply {
+ error = uiState.message
+ isEnabled = true
}
+ binding.editTextPasswordLayout.isEnabled = true
}
private fun bindUiStateLoading() {
binding.buttonLogin.isEnabled = false
binding.progressCircular.isVisible = true
- if (uiModeManager.currentModeType == Configuration.UI_MODE_TYPE_TELEVISION) {
- (binding.editTextUsername as AppCompatEditText).apply {
- error = null
- isEnabled = false
- }
- (binding.editTextPassword as AppCompatEditText).isEnabled = false
- } else {
- binding.editTextUsernameLayout!!.apply {
- error = null
- isEnabled = false
- }
- binding.editTextPasswordLayout!!.isEnabled = false
+ binding.editTextUsernameLayout.apply {
+ error = null
+ isEnabled = false
}
+ binding.editTextPasswordLayout.isEnabled = false
}
private fun bindUsersStateUsers(usersState: LoginViewModel.UsersState.Users) {
@@ -179,10 +152,6 @@ class LoginFragment : Fragment() {
}
private fun navigateToHomeFragment() {
- if (uiModeManager.currentModeType == Configuration.UI_MODE_TYPE_TELEVISION) {
- findNavController().navigate(LoginFragmentDirections.actionLoginFragmentToHomeFragmentTv())
- } else {
- findNavController().navigate(LoginFragmentDirections.actionLoginFragmentToHomeFragment())
- }
+ findNavController().navigate(LoginFragmentDirections.actionLoginFragmentToHomeFragment())
}
}
diff --git a/app/src/main/java/dev/jdtech/jellyfin/fragments/ServerAddressesFragment.kt b/app/src/main/java/dev/jdtech/jellyfin/fragments/ServerAddressesFragment.kt
index a79adc83..b3cca5ee 100644
--- a/app/src/main/java/dev/jdtech/jellyfin/fragments/ServerAddressesFragment.kt
+++ b/app/src/main/java/dev/jdtech/jellyfin/fragments/ServerAddressesFragment.kt
@@ -1,12 +1,9 @@
package dev.jdtech.jellyfin.fragments
-import android.app.UiModeManager
-import android.content.res.Configuration
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
-import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import androidx.lifecycle.Lifecycle
@@ -27,7 +24,6 @@ import timber.log.Timber
class ServerAddressesFragment : Fragment() {
private lateinit var binding: FragmentServerAddressesBinding
- private lateinit var uiModeManager: UiModeManager
private val viewModel: ServerAddressesViewModel by viewModels()
private val args: UsersFragmentArgs by navArgs()
@@ -37,8 +33,6 @@ class ServerAddressesFragment : Fragment() {
savedInstanceState: Bundle?
): View {
binding = FragmentServerAddressesBinding.inflate(inflater)
- uiModeManager =
- requireContext().getSystemService(AppCompatActivity.UI_MODE_SERVICE) as UiModeManager
binding.addressesRecyclerView.adapter =
ServerAddressAdapter(
@@ -98,10 +92,6 @@ class ServerAddressesFragment : Fragment() {
}
private fun navigateToMainActivity() {
- if (uiModeManager.currentModeType == Configuration.UI_MODE_TYPE_TELEVISION) {
- findNavController().navigate(UsersFragmentDirections.actionUsersFragmentToHomeFragmentTv())
- } else {
- findNavController().navigate(UsersFragmentDirections.actionUsersFragmentToHomeFragment())
- }
+ findNavController().navigate(UsersFragmentDirections.actionUsersFragmentToHomeFragment())
}
}
diff --git a/app/src/main/java/dev/jdtech/jellyfin/fragments/ServerSelectFragment.kt b/app/src/main/java/dev/jdtech/jellyfin/fragments/ServerSelectFragment.kt
index feda7262..63de875a 100644
--- a/app/src/main/java/dev/jdtech/jellyfin/fragments/ServerSelectFragment.kt
+++ b/app/src/main/java/dev/jdtech/jellyfin/fragments/ServerSelectFragment.kt
@@ -1,12 +1,9 @@
package dev.jdtech.jellyfin.fragments
-import android.app.UiModeManager
-import android.content.res.Configuration
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
-import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import androidx.lifecycle.Lifecycle
@@ -24,7 +21,6 @@ import kotlinx.coroutines.launch
class ServerSelectFragment : Fragment() {
private lateinit var binding: FragmentServerSelectBinding
- private lateinit var uiModeManager: UiModeManager
private val viewModel: ServerSelectViewModel by viewModels()
override fun onCreateView(
@@ -33,8 +29,6 @@ class ServerSelectFragment : Fragment() {
savedInstanceState: Bundle?
): View {
binding = FragmentServerSelectBinding.inflate(inflater)
- uiModeManager =
- requireContext().getSystemService(AppCompatActivity.UI_MODE_SERVICE) as UiModeManager
binding.lifecycleOwner = viewLifecycleOwner
@@ -78,10 +72,6 @@ class ServerSelectFragment : Fragment() {
}
private fun navigateToMainActivity() {
- if (uiModeManager.currentModeType == Configuration.UI_MODE_TYPE_TELEVISION) {
- findNavController().navigate(ServerSelectFragmentDirections.actionServerSelectFragmentToHomeFragmentTv())
- } else {
- findNavController().navigate(ServerSelectFragmentDirections.actionServerSelectFragmentToHomeFragment())
- }
+ findNavController().navigate(ServerSelectFragmentDirections.actionServerSelectFragmentToHomeFragment())
}
}
diff --git a/app/src/main/java/dev/jdtech/jellyfin/fragments/UsersFragment.kt b/app/src/main/java/dev/jdtech/jellyfin/fragments/UsersFragment.kt
index 18c74d33..93c724fb 100644
--- a/app/src/main/java/dev/jdtech/jellyfin/fragments/UsersFragment.kt
+++ b/app/src/main/java/dev/jdtech/jellyfin/fragments/UsersFragment.kt
@@ -1,12 +1,9 @@
package dev.jdtech.jellyfin.fragments
-import android.app.UiModeManager
-import android.content.res.Configuration
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
-import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import androidx.lifecycle.Lifecycle
@@ -27,7 +24,6 @@ import timber.log.Timber
class UsersFragment : Fragment() {
private lateinit var binding: FragmentUsersBinding
- private lateinit var uiModeManager: UiModeManager
private val viewModel: UsersViewModel by viewModels()
private val args: UsersFragmentArgs by navArgs()
@@ -37,8 +33,6 @@ class UsersFragment : Fragment() {
savedInstanceState: Bundle?
): View {
binding = FragmentUsersBinding.inflate(inflater)
- uiModeManager =
- requireContext().getSystemService(AppCompatActivity.UI_MODE_SERVICE) as UiModeManager
binding.usersRecyclerView.adapter =
UserListAdapter(
@@ -101,10 +95,6 @@ class UsersFragment : Fragment() {
}
private fun navigateToMainActivity() {
- if (uiModeManager.currentModeType == Configuration.UI_MODE_TYPE_TELEVISION) {
- findNavController().navigate(UsersFragmentDirections.actionUsersFragmentToHomeFragmentTv())
- } else {
- findNavController().navigate(UsersFragmentDirections.actionUsersFragmentToHomeFragment())
- }
+ findNavController().navigate(UsersFragmentDirections.actionUsersFragmentToHomeFragment())
}
}
diff --git a/app/src/main/java/dev/jdtech/jellyfin/tv/TvPlayerActivity.kt b/app/src/main/java/dev/jdtech/jellyfin/tv/TvPlayerActivity.kt
deleted file mode 100644
index edafe527..00000000
--- a/app/src/main/java/dev/jdtech/jellyfin/tv/TvPlayerActivity.kt
+++ /dev/null
@@ -1,161 +0,0 @@
-package dev.jdtech.jellyfin.tv
-
-import android.os.Bundle
-import android.view.Gravity
-import android.view.KeyEvent
-import android.view.LayoutInflater
-import android.view.View
-import android.view.WindowManager
-import android.widget.ImageButton
-import android.widget.PopupWindow
-import android.widget.TextView
-import androidx.activity.viewModels
-import androidx.core.content.res.ResourcesCompat
-import androidx.navigation.navArgs
-import androidx.recyclerview.widget.RecyclerView
-import dagger.hilt.android.AndroidEntryPoint
-import dev.jdtech.jellyfin.BasePlayerActivity
-import dev.jdtech.jellyfin.PlayerActivityArgs
-import dev.jdtech.jellyfin.R
-import dev.jdtech.jellyfin.databinding.ActivityPlayerTvBinding
-import dev.jdtech.jellyfin.mpv.MPVPlayer
-import dev.jdtech.jellyfin.mpv.TrackType
-import dev.jdtech.jellyfin.mpv.TrackType.AUDIO
-import dev.jdtech.jellyfin.mpv.TrackType.SUBTITLE
-import dev.jdtech.jellyfin.tv.ui.TrackSelectorAdapter
-import dev.jdtech.jellyfin.viewmodels.PlayerActivityViewModel
-import timber.log.Timber
-
-@AndroidEntryPoint
-internal class TvPlayerActivity : BasePlayerActivity() {
-
- private lateinit var binding: ActivityPlayerTvBinding
- override val viewModel: PlayerActivityViewModel by viewModels()
- private val args: PlayerActivityArgs by navArgs()
- private var displayedPopup: PopupWindow? = null
-
- override fun onCreate(savedInstanceState: Bundle?) {
- Timber.d("Player activity created.")
- super.onCreate(savedInstanceState)
-
- binding = ActivityPlayerTvBinding.inflate(layoutInflater)
- setContentView(binding.root)
- window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
-
- binding.playerView.player = viewModel.player
- val playerControls = binding.playerView.findViewById(R.id.player_controls)
- configureInsets(playerControls)
-
- bind()
- viewModel.initializePlayer(args.items)
- hideSystemUI()
- }
-
- override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
- return if (!binding.playerView.isControllerFullyVisible) {
- binding.playerView.showController()
- true
- } else {
- false
- }
- }
-
- private fun bind() = with(binding.playerView) {
- val videoNameTextView = findViewById(R.id.video_name)
- viewModel.currentItemTitle.observe(this@TvPlayerActivity) { title ->
- videoNameTextView.text = title
- }
-
- findViewById(R.id.exo_play_pause).apply {
- setOnClickListener {
- when {
- viewModel.player.isPlaying -> {
- viewModel.player.pause()
- setImageDrawable(
- ResourcesCompat.getDrawable(resources, R.drawable.ic_play, theme)
- )
- }
- viewModel.player.isLoading -> Unit
- else -> {
- viewModel.player.play()
- setImageDrawable(
- ResourcesCompat.getDrawable(resources, R.drawable.ic_play, theme)
- )
- }
- }
- }
- }
-
- findViewById(R.id.back_button).setOnClickListener {
- finish()
- }
-
- bindAudioControl()
- bindSubtitleControl()
- }
-
- private fun bindAudioControl() {
- val audioBtn = binding.playerView.findViewById(R.id.btn_audio_track)
-
- audioBtn.setOnFocusChangeListener { _, hasFocus ->
- displayedPopup = if (hasFocus) {
- val items = viewModel.currentAudioTracks.toUiTrack()
- audioBtn.showPopupWindowAbove(items, AUDIO)
- } else {
- displayedPopup?.dismiss()
- null
- }
- }
- }
-
- private fun bindSubtitleControl() {
- val subtitleBtn = binding.playerView.findViewById(R.id.btn_subtitle)
-
- subtitleBtn.setOnFocusChangeListener { v, hasFocus ->
- v.isFocusable = true
- displayedPopup = if (hasFocus) {
- val items = viewModel.currentSubtitleTracks.toUiTrack()
- subtitleBtn.showPopupWindowAbove(items, SUBTITLE)
- } else {
- displayedPopup?.dismiss()
- null
- }
- }
- }
-
- private fun List.toUiTrack() = map { track ->
- TrackSelectorAdapter.Track(
- title = track.title,
- language = track.lang,
- codec = track.codec,
- selected = track.selected,
- playerTrack = track
- )
- }
-
- private fun View.showPopupWindowAbove(
- items: List,
- type: TrackType
- ): PopupWindow {
- val popup = PopupWindow(this.context)
- popup.contentView = LayoutInflater.from(context).inflate(R.layout.track_selector, null)
- val recyclerView = popup.contentView.findViewById(R.id.track_selector)
-
- recyclerView.adapter = TrackSelectorAdapter(items, viewModel, type) { popup.dismiss() }
-
- val startViewCoords = IntArray(2)
- getLocationInWindow(startViewCoords)
-
- val itemHeight = resources.getDimension(R.dimen.track_selection_item_height).toInt()
- val totalHeight = items.size * itemHeight
-
- popup.showAsDropDown(
- binding.root,
- startViewCoords.first(),
- startViewCoords.last() - totalHeight,
- Gravity.TOP
- )
-
- return popup
- }
-}
diff --git a/app/src/main/java/dev/jdtech/jellyfin/tv/ui/HomeFragment.kt b/app/src/main/java/dev/jdtech/jellyfin/tv/ui/HomeFragment.kt
deleted file mode 100644
index d8eddf41..00000000
--- a/app/src/main/java/dev/jdtech/jellyfin/tv/ui/HomeFragment.kt
+++ /dev/null
@@ -1,209 +0,0 @@
-package dev.jdtech.jellyfin.tv.ui
-
-import android.app.UiModeManager
-import android.content.res.Configuration
-import android.os.Bundle
-import android.view.KeyEvent.KEYCODE_DPAD_DOWN
-import android.view.KeyEvent.KEYCODE_DPAD_DOWN_LEFT
-import android.view.View
-import android.widget.ImageButton
-import androidx.appcompat.app.AppCompatActivity
-import androidx.fragment.app.viewModels
-import androidx.leanback.app.BrowseSupportFragment
-import androidx.leanback.widget.ArrayObjectAdapter
-import androidx.leanback.widget.DiffCallback
-import androidx.leanback.widget.HeaderItem
-import androidx.leanback.widget.ListRow
-import androidx.leanback.widget.ListRowPresenter
-import androidx.lifecycle.Lifecycle
-import androidx.lifecycle.lifecycleScope
-import androidx.lifecycle.repeatOnLifecycle
-import androidx.navigation.fragment.findNavController
-import dagger.hilt.android.AndroidEntryPoint
-import dev.jdtech.jellyfin.R
-import dev.jdtech.jellyfin.adapters.HomeItem
-import dev.jdtech.jellyfin.fragments.HomeFragmentDirections
-import dev.jdtech.jellyfin.viewmodels.HomeViewModel
-import kotlinx.coroutines.launch
-import org.jellyfin.sdk.model.api.BaseItemDto
-import timber.log.Timber
-
-@AndroidEntryPoint
-internal class HomeFragment : BrowseSupportFragment() {
-
- private val viewModel: HomeViewModel by viewModels()
-
- private lateinit var rowsAdapter: ArrayObjectAdapter
- private lateinit var uiModeManager: UiModeManager
-
- private val adapterMap = mutableMapOf()
-
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
-
- uiModeManager =
- requireContext().getSystemService(AppCompatActivity.UI_MODE_SERVICE) as UiModeManager
-
- val rowPresenter = ListRowPresenter()
- rowPresenter.selectEffectEnabled = false
-
- headersState = HEADERS_ENABLED
- rowsAdapter = ArrayObjectAdapter(rowPresenter)
- adapter = rowsAdapter
- }
-
- override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
- super.onViewCreated(view, savedInstanceState)
-
- view.findViewById(R.id.settings).apply {
- setOnKeyListener { _, keyCode, _ ->
- if (keyCode == KEYCODE_DPAD_DOWN || keyCode == KEYCODE_DPAD_DOWN_LEFT) {
- headersSupportFragment.view?.requestFocus()
- true
- } else {
- false
- }
- }
- setOnClickListener { navigateToSettingsFragment() }
- }
-
- viewLifecycleOwner.lifecycleScope.launch {
- viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) {
- viewModel.uiState.collect { uiState ->
- Timber.d("$uiState")
- when (uiState) {
- is HomeViewModel.UiState.Normal -> bindUiStateNormal(uiState)
- is HomeViewModel.UiState.Loading -> bindUiStateLoading()
- is HomeViewModel.UiState.Error -> Unit
- }
- }
- }
- }
-
- viewLifecycleOwner.lifecycleScope.launch {
- viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) {
- viewModel.loadData(includeLibraries = true)
- }
- }
- }
-
- private val diffCallbackListRow = object : DiffCallback() {
- override fun areItemsTheSame(oldItem: ListRow, newItem: ListRow): Boolean {
- return oldItem.id == newItem.id
- }
-
- override fun areContentsTheSame(oldItem: ListRow, newItem: ListRow): Boolean {
- Timber.d((oldItem.adapter.size() == newItem.adapter.size()).toString())
- return oldItem.adapter.size() == newItem.adapter.size()
- }
- }
-
- private fun bindUiStateNormal(uiState: HomeViewModel.UiState.Normal) {
- progressBarManager.hide()
- uiState.apply {
- rowsAdapter.setItems(homeItems.map { homeItem -> homeItem.toListRow() }, diffCallbackListRow)
- }
- }
-
- private fun bindUiStateLoading() {
- progressBarManager.show()
- }
-
- private fun HomeItem.toListRow(): ListRow {
- return ListRow(
- toHeader(),
- toItems()
- )
- }
-
- private fun HomeItem.toHeader(): HeaderItem {
- return when (this) {
- is HomeItem.Libraries -> HeaderItem(section.name)
- is HomeItem.Section -> HeaderItem(homeSection.name)
- is HomeItem.ViewItem -> HeaderItem(
- String.format(
- resources.getString(R.string.latest_library),
- view.name
- )
- )
- }
- }
-
- val diffCallback = object : DiffCallback() {
- override fun areItemsTheSame(oldItem: BaseItemDto, newItem: BaseItemDto): Boolean {
- return oldItem.id == newItem.id
- }
-
- override fun areContentsTheSame(oldItem: BaseItemDto, newItem: BaseItemDto): Boolean {
- return oldItem == newItem
- }
- }
-
- private fun HomeItem.toItems(): ArrayObjectAdapter {
- val name = this.toHeader().name
- val items = when (this) {
- is HomeItem.Libraries -> section.items
- is HomeItem.Section -> homeSection.items
- is HomeItem.ViewItem -> view.items
- }
- if (name in adapterMap) {
- adapterMap[name]?.setItems(items, diffCallback)
- } else {
- adapterMap[name] = when (this) {
- is HomeItem.Libraries -> ArrayObjectAdapter(
- LibaryItemPresenter { item ->
- navigateToLibraryFragment(item)
- }
- ).apply { setItems(items, diffCallback) }
- is HomeItem.Section -> ArrayObjectAdapter(
- DynamicMediaItemPresenter { item ->
- navigateToMediaDetailFragment(item)
- }
- ).apply { setItems(items, diffCallback) }
- is HomeItem.ViewItem -> ArrayObjectAdapter(
- MediaItemPresenter { item ->
- navigateToMediaDetailFragment(item)
- }
- ).apply { setItems(items, diffCallback) }
- }
- }
-
- return adapterMap[name]!!
- }
-
- private fun navigateToLibraryFragment(library: BaseItemDto) {
- if (uiModeManager.currentModeType == Configuration.UI_MODE_TYPE_TELEVISION) {
- findNavController().navigate(
- dev.jdtech.jellyfin.tv.ui.HomeFragmentDirections.actionHomeFragmentToLibraryFragment(
- library.id,
- library.name,
- library.collectionType
- )
- )
- } else {
- findNavController().navigate(
- HomeFragmentDirections.actionNavigationHomeToLibraryFragment(
- library.id,
- library.name,
- library.collectionType
- )
- )
- }
- }
-
- private fun navigateToMediaDetailFragment(item: BaseItemDto) {
- findNavController().navigate(
- HomeFragmentDirections.actionHomeFragmentToMediaDetailFragment(
- item.id,
- item.seriesName ?: item.name,
- item.type
- )
- )
- }
-
- private fun navigateToSettingsFragment() {
- findNavController().navigate(
- HomeFragmentDirections.actionHomeFragmentToSettingsFragment()
- )
- }
-}
diff --git a/app/src/main/java/dev/jdtech/jellyfin/tv/ui/MediaDetailFragment.kt b/app/src/main/java/dev/jdtech/jellyfin/tv/ui/MediaDetailFragment.kt
deleted file mode 100644
index 0d38a918..00000000
--- a/app/src/main/java/dev/jdtech/jellyfin/tv/ui/MediaDetailFragment.kt
+++ /dev/null
@@ -1,258 +0,0 @@
-package dev.jdtech.jellyfin.tv.ui
-
-import android.content.Intent
-import android.content.res.ColorStateList
-import android.net.Uri
-import android.os.Bundle
-import android.util.TypedValue
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import android.widget.Toast
-import androidx.core.content.ContextCompat
-import androidx.core.view.isVisible
-import androidx.fragment.app.Fragment
-import androidx.fragment.app.viewModels
-import androidx.lifecycle.Lifecycle
-import androidx.lifecycle.lifecycleScope
-import androidx.lifecycle.repeatOnLifecycle
-import androidx.navigation.fragment.findNavController
-import androidx.navigation.fragment.navArgs
-import dagger.hilt.android.AndroidEntryPoint
-import dev.jdtech.jellyfin.R
-import dev.jdtech.jellyfin.adapters.PersonListAdapter
-import dev.jdtech.jellyfin.adapters.ViewItemListAdapter
-import dev.jdtech.jellyfin.bindBaseItemImage
-import dev.jdtech.jellyfin.databinding.MediaDetailFragmentBinding
-import dev.jdtech.jellyfin.dialogs.VideoVersionDialogFragment
-import dev.jdtech.jellyfin.models.PlayerItem
-import dev.jdtech.jellyfin.viewmodels.MediaInfoViewModel
-import dev.jdtech.jellyfin.viewmodels.PlayerViewModel
-import dev.jdtech.jellyfin.viewmodels.PlayerViewModel.PlayerItemError
-import dev.jdtech.jellyfin.viewmodels.PlayerViewModel.PlayerItems
-import kotlinx.coroutines.launch
-import timber.log.Timber
-
-@AndroidEntryPoint
-internal class MediaDetailFragment : Fragment() {
-
- private lateinit var binding: MediaDetailFragmentBinding
-
- private val viewModel: MediaInfoViewModel by viewModels()
- private val playerViewModel: PlayerViewModel by viewModels()
-
- private val args: MediaDetailFragmentArgs by navArgs()
-
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
-
- viewModel.loadData(args.itemId, args.itemType)
- }
-
- override fun onCreateView(
- inflater: LayoutInflater,
- container: ViewGroup?,
- savedInstanceState: Bundle?
- ): View {
- binding = MediaDetailFragmentBinding.inflate(inflater)
- return binding.root
- }
-
- override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
- super.onViewCreated(view, savedInstanceState)
-
- viewLifecycleOwner.lifecycleScope.launch {
- viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) {
- viewModel.uiState.collect { uiState ->
- Timber.d("$uiState")
- when (uiState) {
- is MediaInfoViewModel.UiState.Normal -> bindUiStateNormal(uiState)
- is MediaInfoViewModel.UiState.Loading -> Unit
- is MediaInfoViewModel.UiState.Error -> Unit
- }
- }
- }
- }
-
- val seasonsAdapter = ViewItemListAdapter(
- fixedWidth = true,
- onClickListener = ViewItemListAdapter.OnClickListener {}
- )
-
- binding.seasonsRow.gridView.adapter = seasonsAdapter
- binding.seasonsRow.gridView.verticalSpacing = 25
-
- val castAdapter = PersonListAdapter {
- Toast.makeText(requireContext(), "Not yet implemented", Toast.LENGTH_SHORT).show()
- }
-
- binding.castRow.gridView.adapter = castAdapter
- binding.castRow.gridView.verticalSpacing = 25
-
- playerViewModel.onPlaybackRequested(lifecycleScope) { playerItems ->
- when (playerItems) {
- is PlayerItemError -> bindPlayerItemsError(playerItems)
- is PlayerItems -> bindPlayerItems(playerItems)
- }
- }
-
- binding.playButton.setOnClickListener {
- binding.playButton.setImageResource(android.R.color.transparent)
- binding.progressCircular.isVisible = true
- viewModel.item?.let { item ->
- playerViewModel.loadPlayerItems(item) {
- VideoVersionDialogFragment(item, playerViewModel).show(
- parentFragmentManager,
- "videoversiondialog"
- )
- }
- }
- }
-
- binding.trailerButton.setOnClickListener {
- if (viewModel.item?.remoteTrailers.isNullOrEmpty()) return@setOnClickListener
- val intent = Intent(
- Intent.ACTION_VIEW,
- Uri.parse(viewModel.item?.remoteTrailers?.get(0)?.url)
- )
- startActivity(intent)
- }
-
- binding.checkButton.setOnClickListener {
- when (viewModel.played) {
- true -> {
- viewModel.markAsUnplayed(args.itemId)
- binding.checkButton.imageTintList = ColorStateList.valueOf(
- resources.getColor(
- R.color.white,
- requireActivity().theme
- )
- )
- }
- false -> {
- viewModel.markAsPlayed(args.itemId)
- binding.checkButton.imageTintList = ColorStateList.valueOf(
- resources.getColor(
- R.color.red,
- requireActivity().theme
- )
- )
- }
- }
- }
-
- binding.favoriteButton.setOnClickListener {
- when (viewModel.favorite) {
- true -> {
- viewModel.unmarkAsFavorite(args.itemId)
- binding.favoriteButton.setImageResource(R.drawable.ic_heart)
- binding.favoriteButton.imageTintList = ColorStateList.valueOf(
- resources.getColor(
- R.color.white,
- requireActivity().theme
- )
- )
- }
- false -> {
- viewModel.markAsFavorite(args.itemId)
- binding.favoriteButton.setImageResource(R.drawable.ic_heart_filled)
- binding.favoriteButton.imageTintList = ColorStateList.valueOf(
- resources.getColor(
- R.color.red,
- requireActivity().theme
- )
- )
- }
- }
- }
- }
-
- private fun bindUiStateNormal(uiState: MediaInfoViewModel.UiState.Normal) {
- uiState.apply {
- binding.seasonsLayout.isVisible = seasons.isNotEmpty()
- val seasonsAdapter = binding.seasonsRow.gridView.adapter as ViewItemListAdapter
- seasonsAdapter.submitList(seasons)
- binding.castLayout.isVisible = actors.isNotEmpty()
- val actorsAdapter = binding.castRow.gridView.adapter as PersonListAdapter
- actorsAdapter.submitList(actors)
-
- // Check icon
- when (played) {
- true -> {
- binding.checkButton.imageTintList = ColorStateList.valueOf(
- resources.getColor(
- R.color.red,
- requireActivity().theme
- )
- )
- }
- false -> {
- val typedValue = TypedValue()
- requireActivity().theme.resolveAttribute(R.attr.colorOnSecondaryContainer, typedValue, true)
- /*binding.checkButton.imageTintList = ColorStateList.valueOf(
- resources.getColor(
- typedValue.resourceId,
- requireActivity().theme
- )
- )*/
- }
- }
-
- // Favorite icon
- val favoriteDrawable = when (favorite) {
- true -> R.drawable.ic_heart_filled
- false -> R.drawable.ic_heart
- }
- binding.favoriteButton.setImageResource(favoriteDrawable)
- if (favorite) binding.favoriteButton.imageTintList = ColorStateList.valueOf(
- resources.getColor(
- R.color.red,
- requireActivity().theme
- )
- )
-
- binding.title.text = item.name
- binding.genres.text = genresString
- binding.year.text = dateString
- binding.playtime.text = runTime
- binding.officialRating.text = item.officialRating
- binding.communityRating.text = item.communityRating.toString()
- binding.description.text = item.overview
- bindBaseItemImage(binding.poster, item)
- }
- }
-
- private fun bindPlayerItems(items: PlayerItems) {
- navigateToPlayerActivity(items.items.toTypedArray())
- binding.playButton.setImageDrawable(
- ContextCompat.getDrawable(
- requireActivity(),
- R.drawable.ic_play
- )
- )
- binding.progressCircular.visibility = View.INVISIBLE
- }
-
- private fun bindPlayerItemsError(error: PlayerItemError) {
- Timber.e(error.error.message)
-
- binding.errorLayout.errorPanel.isVisible = true
- binding.playButton.setImageDrawable(
- ContextCompat.getDrawable(
- requireActivity(),
- R.drawable.ic_play
- )
- )
- binding.progressCircular.visibility = View.INVISIBLE
- }
-
- private fun navigateToPlayerActivity(
- playerItems: Array,
- ) {
- findNavController().navigate(
- MediaDetailFragmentDirections.actionMediaDetailFragmentToPlayerActivity(
- playerItems
- )
- )
- }
-}
diff --git a/app/src/main/java/dev/jdtech/jellyfin/tv/ui/MediaSectionPresenter.kt b/app/src/main/java/dev/jdtech/jellyfin/tv/ui/MediaSectionPresenter.kt
deleted file mode 100644
index 1a84f3ee..00000000
--- a/app/src/main/java/dev/jdtech/jellyfin/tv/ui/MediaSectionPresenter.kt
+++ /dev/null
@@ -1,108 +0,0 @@
-package dev.jdtech.jellyfin.tv.ui
-
-import android.util.TypedValue
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import androidx.core.view.isVisible
-import androidx.databinding.DataBindingUtil
-import androidx.leanback.widget.Presenter
-import dev.jdtech.jellyfin.R
-import dev.jdtech.jellyfin.databinding.BaseItemBinding
-import dev.jdtech.jellyfin.databinding.CollectionItemBinding
-import dev.jdtech.jellyfin.databinding.HomeEpisodeItemBinding
-import org.jellyfin.sdk.model.api.BaseItemDto
-import org.jellyfin.sdk.model.api.BaseItemKind
-
-class LibaryItemPresenter(private val onClick: (BaseItemDto) -> Unit) : Presenter() {
- override fun onCreateViewHolder(parent: ViewGroup): ViewHolder {
- return ViewHolder(
- CollectionItemBinding.inflate(
- LayoutInflater.from(parent.context),
- parent,
- false
- ).root
- )
- }
-
- override fun onBindViewHolder(viewHolder: ViewHolder, item: Any) {
- if (item is BaseItemDto) {
- DataBindingUtil.getBinding(viewHolder.view)?.apply {
- this.collection = item
- viewHolder.view.setOnClickListener { onClick(item) }
- }
- }
- }
-
- override fun onUnbindViewHolder(viewHolder: ViewHolder) = Unit
-}
-
-class MediaItemPresenter(private val onClick: (BaseItemDto) -> Unit) : Presenter() {
-
- override fun onCreateViewHolder(parent: ViewGroup): ViewHolder {
- return ViewHolder(
- BaseItemBinding.inflate(
- LayoutInflater.from(parent.context),
- parent,
- false
- ).root
- )
- }
-
- override fun onBindViewHolder(viewHolder: ViewHolder, item: Any) {
- if (item is BaseItemDto) {
- DataBindingUtil.getBinding(viewHolder.view)?.apply {
- this.item = item
- this.itemName.text =
- if (item.type == BaseItemKind.EPISODE) item.seriesName else item.name
- this.itemCount.visibility =
- if (item.userData?.unplayedItemCount != null && item.userData?.unplayedItemCount!! > 0) View.VISIBLE else View.GONE
- this.itemLayout.layoutParams.width =
- this.itemLayout.resources.getDimension(R.dimen.overview_media_width).toInt()
- (this.itemLayout.layoutParams as ViewGroup.MarginLayoutParams).bottomMargin = 0
- viewHolder.view.setOnClickListener { onClick(item) }
- }
- }
- }
-
- override fun onUnbindViewHolder(viewHolder: ViewHolder) = Unit
-}
-
-class DynamicMediaItemPresenter(private val onClick: (BaseItemDto) -> Unit) : Presenter() {
-
- override fun onCreateViewHolder(parent: ViewGroup): ViewHolder {
- return ViewHolder(
- HomeEpisodeItemBinding.inflate(
- LayoutInflater.from(parent.context),
- parent,
- false
- ).root
- )
- }
-
- override fun onBindViewHolder(viewHolder: ViewHolder, item: Any) {
- if (item is BaseItemDto) {
- DataBindingUtil.getBinding(viewHolder.view)?.apply {
- episode = item
- item.userData?.playedPercentage?.toInt()?.let {
- progressBar.layoutParams.width = TypedValue.applyDimension(
- TypedValue.COMPLEX_UNIT_DIP,
- (it.times(2.24)).toFloat(), progressBar.context.resources.displayMetrics
- ).toInt()
- progressBar.isVisible = true
- }
-
- if (item.type == BaseItemKind.MOVIE) {
- primaryName.text = item.name
- secondaryName.visibility = View.GONE
- } else if (item.type == BaseItemKind.EPISODE) {
- primaryName.text = item.seriesName
- }
-
- viewHolder.view.setOnClickListener { onClick(item) }
- }
- }
- }
-
- override fun onUnbindViewHolder(viewHolder: ViewHolder) = Unit
-}
diff --git a/app/src/main/java/dev/jdtech/jellyfin/tv/ui/TrackSelectorAdapter.kt b/app/src/main/java/dev/jdtech/jellyfin/tv/ui/TrackSelectorAdapter.kt
deleted file mode 100644
index 7bda1daf..00000000
--- a/app/src/main/java/dev/jdtech/jellyfin/tv/ui/TrackSelectorAdapter.kt
+++ /dev/null
@@ -1,62 +0,0 @@
-package dev.jdtech.jellyfin.tv.ui
-
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import android.widget.Button
-import androidx.recyclerview.widget.RecyclerView
-import dev.jdtech.jellyfin.R
-import dev.jdtech.jellyfin.mpv.MPVPlayer
-import dev.jdtech.jellyfin.mpv.TrackType
-import dev.jdtech.jellyfin.viewmodels.PlayerActivityViewModel
-
-class TrackSelectorAdapter(
- private val items: List