From ec6366508b944cb2f162c0b24e85a68aa35f3046 Mon Sep 17 00:00:00 2001 From: Jarne Demeulemeester <32322857+jarnedemeulemeester@users.noreply.github.com> Date: Fri, 22 Jul 2022 16:29:25 +0200 Subject: [PATCH] Layout improvements for larger screens (#134) * Use NavigationRail on tablets Width 600dp+ * Add next up item next to the description on tablets Width 600dp+ * Add tv banners for debug and staging * Clean up tv add server fragment * Clean up tv login fragment --- .../res/drawable/ic_banner_foreground.xml | 60 +++ .../java/dev/jdtech/jellyfin/MainActivity.kt | 3 +- .../jellyfin/fragments/LoginFragment.kt | 1 - .../jellyfin/tv/ui/TvAddServerFragment.kt | 28 +- .../jdtech/jellyfin/tv/ui/TvLoginFragment.kt | 32 +- .../tv_add_server_fragment.xml | 78 ++- .../layout-television/tv_login_fragment.xml | 49 +- .../res/layout-w600dp/activity_main_app.xml | 47 ++ .../res/layout-w600dp/fragment_media_info.xml | 487 ++++++++++++++++++ .../main/res/layout/fragment_add_server.xml | 1 - .../main/res/layout/fragment_media_info.xml | 2 +- app/src/main/res/navigation/tv_navigation.xml | 2 +- app/src/main/res/values-sw600dp/dimens.xml | 1 - app/src/main/res/values/dimens.xml | 1 - .../res/drawable/ic_banner_foreground.xml | 60 +++ 15 files changed, 747 insertions(+), 105 deletions(-) create mode 100644 app/src/debug/res/drawable/ic_banner_foreground.xml create mode 100644 app/src/main/res/layout-w600dp/activity_main_app.xml create mode 100644 app/src/main/res/layout-w600dp/fragment_media_info.xml create mode 100644 app/src/staging/res/drawable/ic_banner_foreground.xml diff --git a/app/src/debug/res/drawable/ic_banner_foreground.xml b/app/src/debug/res/drawable/ic_banner_foreground.xml new file mode 100644 index 00000000..1a1c4a4e --- /dev/null +++ b/app/src/debug/res/drawable/ic_banner_foreground.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/dev/jdtech/jellyfin/MainActivity.kt b/app/src/main/java/dev/jdtech/jellyfin/MainActivity.kt index 7d3e158a..43873ba8 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/MainActivity.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/MainActivity.kt @@ -13,6 +13,7 @@ import androidx.navigation.ui.AppBarConfiguration import androidx.navigation.ui.NavigationUI import androidx.navigation.ui.setupActionBarWithNavController import com.google.android.material.bottomnavigation.BottomNavigationView +import com.google.android.material.navigation.NavigationBarView import dagger.hilt.android.AndroidEntryPoint import dev.jdtech.jellyfin.databinding.ActivityMainAppBinding import dev.jdtech.jellyfin.fragments.HomeFragmentDirections @@ -34,7 +35,7 @@ class MainActivity : AppCompatActivity() { setContentView(binding.root) - val navView: BottomNavigationView = binding.navView + val navView: NavigationBarView = binding.navView as NavigationBarView val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment_activity_main) as NavHostFragment 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 6691efd1..04a2689f 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/fragments/LoginFragment.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/fragments/LoginFragment.kt @@ -86,7 +86,6 @@ class LoginFragment : Fragment() { private fun login() { val username = binding.editTextUsername.text.toString() val password = binding.editTextPassword.text.toString() - binding.progressCircular.visibility = View.VISIBLE viewModel.login(username, password) } diff --git a/app/src/main/java/dev/jdtech/jellyfin/tv/ui/TvAddServerFragment.kt b/app/src/main/java/dev/jdtech/jellyfin/tv/ui/TvAddServerFragment.kt index 833222ea..ff73cdff 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/tv/ui/TvAddServerFragment.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/tv/ui/TvAddServerFragment.kt @@ -4,6 +4,7 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.view.inputmethod.EditorInfo import androidx.core.view.isVisible import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels @@ -29,12 +30,19 @@ internal class TvAddServerFragment : Fragment() { savedInstanceState: Bundle? ): View { binding = TvAddServerFragmentBinding.inflate(inflater) - binding.lifecycleOwner = viewLifecycleOwner - binding.viewModel = viewModel + + binding.editTextServerAddress.setOnEditorActionListener { _, actionId, _ -> + return@setOnEditorActionListener when (actionId) { + EditorInfo.IME_ACTION_GO -> { + connectToServer() + true + } + else -> false + } + } binding.buttonConnect.setOnClickListener { - val serverAddress = binding.serverAddress.text.toString() - viewModel.checkServer(serverAddress) + connectToServer() } viewLifecycleOwner.lifecycleScope.launch { @@ -60,17 +68,25 @@ internal class TvAddServerFragment : Fragment() { } private fun bindUiStateNormal() { + binding.buttonConnect.isEnabled = true binding.progressCircular.isVisible = false } private fun bindUiStateError(uiState: AddServerViewModel.UiState.Error) { + binding.buttonConnect.isEnabled = true binding.progressCircular.isVisible = false - binding.serverAddress.error = uiState.message + binding.editTextServerAddress.error = uiState.message } private fun bindUiStateLoading() { + binding.buttonConnect.isEnabled = false binding.progressCircular.isVisible = true - binding.serverAddress.error = null + binding.editTextServerAddress.error = null + } + + private fun connectToServer() { + val serverAddress = binding.editTextServerAddress.text.toString() + viewModel.checkServer(serverAddress.removeSuffix("/")) } private fun navigateToLoginFragment() { diff --git a/app/src/main/java/dev/jdtech/jellyfin/tv/ui/TvLoginFragment.kt b/app/src/main/java/dev/jdtech/jellyfin/tv/ui/TvLoginFragment.kt index 38233d37..b25e1714 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/tv/ui/TvLoginFragment.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/tv/ui/TvLoginFragment.kt @@ -4,6 +4,7 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.view.inputmethod.EditorInfo import androidx.core.view.isVisible import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels @@ -28,15 +29,19 @@ class TvLoginFragment : Fragment() { savedInstanceState: Bundle? ): View { binding = TvLoginFragmentBinding.inflate(inflater) - binding.lifecycleOwner = viewLifecycleOwner - binding.viewModel = viewModel + + binding.editTextPassword.setOnEditorActionListener { _, actionId, _ -> + return@setOnEditorActionListener when (actionId) { + EditorInfo.IME_ACTION_GO -> { + login() + true + } + else -> false + } + } binding.buttonLogin.setOnClickListener { - val username = binding.username.text.toString() - val password = binding.password.text.toString() - - binding.progressCircular.visibility = View.VISIBLE - viewModel.login(username, password) + login() } viewLifecycleOwner.lifecycleScope.launch { @@ -62,17 +67,26 @@ class TvLoginFragment : Fragment() { } private fun bindUiStateNormal() { + binding.buttonLogin.isEnabled = true binding.progressCircular.isVisible = false } private fun bindUiStateError(uiState: LoginViewModel.UiState.Error) { + binding.buttonLogin.isEnabled = true binding.progressCircular.isVisible = false - binding.username.error = uiState.message + binding.editTextUsername.error = uiState.message } private fun bindUiStateLoading() { + binding.buttonLogin.isEnabled = false binding.progressCircular.isVisible = true - binding.username.error = null + binding.editTextUsername.error = null + } + + private fun login() { + val username = binding.editTextUsername.text.toString() + val password = binding.editTextPassword.text.toString() + viewModel.login(username, password) } private fun navigateToMainActivity() { diff --git a/app/src/main/res/layout-television/tv_add_server_fragment.xml b/app/src/main/res/layout-television/tv_add_server_fragment.xml index 721a5fae..b4863eeb 100644 --- a/app/src/main/res/layout-television/tv_add_server_fragment.xml +++ b/app/src/main/res/layout-television/tv_add_server_fragment.xml @@ -1,24 +1,14 @@ - - - - - - + android:layout_height="match_parent"> + app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintVertical_bias="0.36"> + android:textColor="?android:textColorPrimary" /> + android:imeOptions="actionGo" + android:inputType="textUri" /> - - -