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" />
-
-
-
+ android:layout_height="wrap_content">
-
+
-
+
-
-
+
+
+
+
+
diff --git a/app/src/main/res/layout-television/tv_login_fragment.xml b/app/src/main/res/layout-television/tv_login_fragment.xml
index 1086fd3c..f8474f31 100644
--- a/app/src/main/res/layout-television/tv_login_fragment.xml
+++ b/app/src/main/res/layout-television/tv_login_fragment.xml
@@ -1,24 +1,14 @@
-
-
-
-
-
-
+ tools:context=".fragments.LoginFragment">
+ app:layout_constraintTop_toTopOf="parent" />
+ app:layout_constraintVertical_bias="0.36">
+ android:textColor="?android:textColorPrimary" />
+ android:inputType="text" />
+ app:passwordToggleEnabled="true" />
+ android:layout_height="wrap_content">
+ android:layout_height="wrap_content"
+ android:text="@string/button_login" />
+ android:visibility="invisible" />
diff --git a/app/src/main/res/layout-w600dp/activity_main_app.xml b/app/src/main/res/layout-w600dp/activity_main_app.xml
new file mode 100644
index 00000000..82714c02
--- /dev/null
+++ b/app/src/main/res/layout-w600dp/activity_main_app.xml
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout-w600dp/fragment_media_info.xml b/app/src/main/res/layout-w600dp/fragment_media_info.xml
new file mode 100644
index 00000000..a78dcf46
--- /dev/null
+++ b/app/src/main/res/layout-w600dp/fragment_media_info.xml
@@ -0,0 +1,487 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/fragment_add_server.xml b/app/src/main/res/layout/fragment_add_server.xml
index 255e6dc3..83e4260f 100644
--- a/app/src/main/res/layout/fragment_add_server.xml
+++ b/app/src/main/res/layout/fragment_add_server.xml
@@ -72,7 +72,6 @@
android:id="@+id/button_connect"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:drawableStart="@drawable/ic_launcher_foreground"
android:text="@string/button_connect" />
+ tools:layout="@layout/tv_add_server_fragment">
diff --git a/app/src/main/res/values-sw600dp/dimens.xml b/app/src/main/res/values-sw600dp/dimens.xml
index bb31a398..d34733e5 100644
--- a/app/src/main/res/values-sw600dp/dimens.xml
+++ b/app/src/main/res/values-sw600dp/dimens.xml
@@ -5,5 +5,4 @@
- 3
- 4
- 450
- 350dp
\ No newline at end of file
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
index 1f9090ec..9bc7c560 100644
--- a/app/src/main/res/values/dimens.xml
+++ b/app/src/main/res/values/dimens.xml
@@ -8,5 +8,4 @@
- 2
- 2
- 250
- @dimen/match_parent
\ No newline at end of file
diff --git a/app/src/staging/res/drawable/ic_banner_foreground.xml b/app/src/staging/res/drawable/ic_banner_foreground.xml
new file mode 100644
index 00000000..3af350a9
--- /dev/null
+++ b/app/src/staging/res/drawable/ic_banner_foreground.xml
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+