From 25efbb6eab1beb66032cc5cb9e8026b69312518f Mon Sep 17 00:00:00 2001 From: Jarne Demeulemeester <32322857+jarnedemeulemeester@users.noreply.github.com> Date: Sat, 7 Jan 2023 00:52:39 +0100 Subject: [PATCH] Temporary remove all TV code (#229) * Remove all tv code * Remove banner --- app/build.gradle.kts | 1 - app/src/main/AndroidManifest.xml | 9 - .../java/dev/jdtech/jellyfin/MainActivity.kt | 68 ++--- .../dialogs/AddServerAddressDialog.kt | 12 +- .../jellyfin/fragments/AddServerFragment.kt | 38 +-- .../jellyfin/fragments/LibraryFragment.kt | 36 +-- .../jellyfin/fragments/LoginFragment.kt | 53 +--- .../fragments/ServerAddressesFragment.kt | 12 +- .../fragments/ServerSelectFragment.kt | 12 +- .../jellyfin/fragments/UsersFragment.kt | 12 +- .../jdtech/jellyfin/tv/TvPlayerActivity.kt | 161 ----------- .../dev/jdtech/jellyfin/tv/ui/HomeFragment.kt | 209 -------------- .../jellyfin/tv/ui/MediaDetailFragment.kt | 258 ------------------ .../jellyfin/tv/ui/MediaSectionPresenter.kt | 108 -------- .../jellyfin/tv/ui/TrackSelectorAdapter.kt | 62 ----- .../jellyfin/viewmodels/MainViewModel.kt | 1 - .../button_accent_background.xml | 16 -- .../button_setup_background.xml | 16 -- .../drawable-television/user_placeholder.xml | 15 - .../res/layout-television/activity_main.xml | 19 -- .../main/res/layout-television/base_item.xml | 80 ------ .../browse_support_fragment_title_view.xml | 34 --- .../res/layout-television/collection_item.xml | 49 ---- .../discovered_server_item.xml | 60 ---- .../exo_player_control_view.xml | 136 --------- .../layout-television/fragment_add_server.xml | 96 ------- .../layout-television/fragment_library.xml | 54 ---- .../res/layout-television/fragment_login.xml | 107 -------- .../fragment_server_addresses.xml | 29 -- .../fragment_server_select.xml | 40 --- .../res/layout-television/fragment_users.xml | 29 -- .../layout-television/home_episode_item.xml | 76 ------ .../layout-television/icon_header_item.xml | 25 -- .../media_detail_fragment.xml | 258 ------------------ .../res/layout-television/person_item.xml | 54 ---- .../res/layout-television/server_item.xml | 58 ---- .../main/res/layout-television/track_item.xml | 26 -- .../res/layout-television/track_selector.xml | 25 -- .../main/res/layout-television/user_item.xml | 53 ---- .../activity_main.xml | 19 -- .../main/res/layout/activity_player_tv.xml | 17 -- app/src/main/res/mipmap-anydpi/ic_banner.xml | 5 - .../main/res/navigation/app_navigation.xml | 86 ------ app/src/main/res/values-television/dimens.xml | 16 -- app/src/main/res/values-television/styles.xml | 9 - app/src/main/res/values-television/themes.xml | 17 -- 46 files changed, 54 insertions(+), 2522 deletions(-) delete mode 100644 app/src/main/java/dev/jdtech/jellyfin/tv/TvPlayerActivity.kt delete mode 100644 app/src/main/java/dev/jdtech/jellyfin/tv/ui/HomeFragment.kt delete mode 100644 app/src/main/java/dev/jdtech/jellyfin/tv/ui/MediaDetailFragment.kt delete mode 100644 app/src/main/java/dev/jdtech/jellyfin/tv/ui/MediaSectionPresenter.kt delete mode 100644 app/src/main/java/dev/jdtech/jellyfin/tv/ui/TrackSelectorAdapter.kt delete mode 100644 app/src/main/res/drawable-television/button_accent_background.xml delete mode 100644 app/src/main/res/drawable-television/button_setup_background.xml delete mode 100644 app/src/main/res/drawable-television/user_placeholder.xml delete mode 100644 app/src/main/res/layout-television/activity_main.xml delete mode 100644 app/src/main/res/layout-television/base_item.xml delete mode 100644 app/src/main/res/layout-television/browse_support_fragment_title_view.xml delete mode 100644 app/src/main/res/layout-television/collection_item.xml delete mode 100644 app/src/main/res/layout-television/discovered_server_item.xml delete mode 100644 app/src/main/res/layout-television/exo_player_control_view.xml delete mode 100644 app/src/main/res/layout-television/fragment_add_server.xml delete mode 100644 app/src/main/res/layout-television/fragment_library.xml delete mode 100644 app/src/main/res/layout-television/fragment_login.xml delete mode 100644 app/src/main/res/layout-television/fragment_server_addresses.xml delete mode 100644 app/src/main/res/layout-television/fragment_server_select.xml delete mode 100644 app/src/main/res/layout-television/fragment_users.xml delete mode 100644 app/src/main/res/layout-television/home_episode_item.xml delete mode 100644 app/src/main/res/layout-television/icon_header_item.xml delete mode 100644 app/src/main/res/layout-television/media_detail_fragment.xml delete mode 100644 app/src/main/res/layout-television/person_item.xml delete mode 100644 app/src/main/res/layout-television/server_item.xml delete mode 100644 app/src/main/res/layout-television/track_item.xml delete mode 100644 app/src/main/res/layout-television/track_selector.xml delete mode 100644 app/src/main/res/layout-television/user_item.xml delete mode 100644 app/src/main/res/layout-w600dp-television/activity_main.xml delete mode 100644 app/src/main/res/layout/activity_player_tv.xml delete mode 100644 app/src/main/res/mipmap-anydpi/ic_banner.xml delete mode 100644 app/src/main/res/values-television/dimens.xml delete mode 100644 app/src/main/res/values-television/styles.xml delete mode 100644 app/src/main/res/values-television/themes.xml 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, - private val viewModel: PlayerActivityViewModel, - private val trackType: TrackType, - private val dismissWindow: () -> Unit -) : RecyclerView.Adapter() { - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TrackSelectorViewHolder { - return TrackSelectorViewHolder( - LayoutInflater.from(parent.context).inflate(R.layout.track_item, parent, false) - ) - } - - override fun onBindViewHolder(holder: TrackSelectorViewHolder, position: Int) { - holder.bind(items[position], viewModel, trackType, dismissWindow) - } - - override fun getItemCount(): Int = items.size - - class TrackSelectorViewHolder(private val view: View) : RecyclerView.ViewHolder(view) { - - fun bind( - item: Track, - viewModel: PlayerActivityViewModel, - trackType: TrackType, - dismissWindow: () -> Unit - ) { - view.findViewById