refactor: get rid of databinding in ServerSelectFragment

This commit is contained in:
jarnedemeulemeester 2023-07-31 17:34:01 +02:00
parent 16d54781b1
commit a4dc94b310
No known key found for this signature in database
GPG key ID: 1E5C6AFBD622E9F5
5 changed files with 88 additions and 82 deletions

View file

@ -7,13 +7,11 @@ import androidx.databinding.BindingAdapter
import androidx.recyclerview.widget.RecyclerView
import coil.load
import dev.jdtech.jellyfin.adapters.HomeEpisodeListAdapter
import dev.jdtech.jellyfin.adapters.ServerGridAdapter
import dev.jdtech.jellyfin.adapters.ViewItemListAdapter
import dev.jdtech.jellyfin.api.JellyfinApi
import dev.jdtech.jellyfin.models.FindroidEpisode
import dev.jdtech.jellyfin.models.FindroidItem
import dev.jdtech.jellyfin.models.FindroidMovie
import dev.jdtech.jellyfin.models.Server
import dev.jdtech.jellyfin.models.User
import org.jellyfin.sdk.model.api.BaseItemDto
import org.jellyfin.sdk.model.api.BaseItemKind
@ -22,12 +20,6 @@ import org.jellyfin.sdk.model.api.ImageType
import java.util.UUID
import dev.jdtech.jellyfin.core.R as CoreR
@BindingAdapter("servers")
fun bindServers(recyclerView: RecyclerView, data: List<Server>?) {
val adapter = recyclerView.adapter as ServerGridAdapter
adapter.submitList(data)
}
@BindingAdapter("items")
fun bindItems(recyclerView: RecyclerView, data: List<FindroidItem>?) {
val adapter = recyclerView.adapter as ViewItemListAdapter

View file

@ -16,6 +16,7 @@ import dev.jdtech.jellyfin.databinding.FragmentServerSelectBinding
import dev.jdtech.jellyfin.dialogs.DeleteServerDialogFragment
import dev.jdtech.jellyfin.viewmodels.ServerSelectViewModel
import kotlinx.coroutines.launch
import timber.log.Timber
@AndroidEntryPoint
class ServerSelectFragment : Fragment() {
@ -30,10 +31,6 @@ class ServerSelectFragment : Fragment() {
): View {
binding = FragmentServerSelectBinding.inflate(inflater)
binding.lifecycleOwner = viewLifecycleOwner
binding.viewModel = viewModel
binding.serversRecyclerView.adapter =
ServerGridAdapter(
ServerGridAdapter.OnClickListener { server ->
@ -54,9 +51,19 @@ class ServerSelectFragment : Fragment() {
viewLifecycleOwner.lifecycleScope.launch {
viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) {
launch {
viewModel.uiState.collect { uiState ->
Timber.d("$uiState")
when (uiState) {
is ServerSelectViewModel.UiState.Normal -> bindUiStateNormal(uiState)
is ServerSelectViewModel.UiState.Loading -> Unit
is ServerSelectViewModel.UiState.Error -> Unit
}
}
}
launch {
viewModel.navigateToMain.collect {
if (it) {
navigateToMainActivity()
if (it) navigateToMainActivity()
}
}
}
@ -65,6 +72,12 @@ class ServerSelectFragment : Fragment() {
return binding.root
}
private fun bindUiStateNormal(uiState: ServerSelectViewModel.UiState.Normal) {
uiState.apply {
(binding.serversRecyclerView.adapter as ServerGridAdapter).submitList(servers)
}
}
private fun navigateToAddServerFragment() {
findNavController().navigate(
ServerSelectFragmentDirections.actionServerSelectFragmentToAddServerFragment(),

View file

@ -1,16 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="viewModel"
type="dev.jdtech.jellyfin.viewmodels.ServerSelectViewModel" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".fragments.AddServerFragment">
@ -41,12 +32,12 @@
<TextView
android:id="@+id/text_add_server"
android:textAppearance="@style/TextAppearance.Material3.HeadlineMedium"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="12dp"
android:layout_marginBottom="32dp"
android:text="@string/select_server"
android:textAppearance="@style/TextAppearance.Material3.HeadlineMedium"
android:textColor="?android:textColorPrimary" />
<androidx.recyclerview.widget.RecyclerView
@ -55,7 +46,6 @@
android:layout_height="wrap_content"
android:orientation="vertical"
app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
app:servers="@{viewModel.servers}"
app:spanCount="@integer/server_columns"
tools:itemCount="4"
tools:listitem="@layout/server_item" />
@ -72,4 +62,3 @@
app:layout_constraintTop_toBottomOf="@+id/main_content" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>

View file

@ -9,7 +9,9 @@ import dev.jdtech.jellyfin.database.ServerDatabaseDao
import dev.jdtech.jellyfin.models.Server
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asSharedFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.launch
import javax.inject.Inject
@ -21,11 +23,25 @@ constructor(
private val database: ServerDatabaseDao,
private val appPreferences: AppPreferences,
) : ViewModel() {
val servers = database.getAllServers()
private val _uiState = MutableStateFlow<UiState>(UiState.Loading)
val uiState = _uiState.asStateFlow()
private val _navigateToMain = MutableSharedFlow<Boolean>()
val navigateToMain = _navigateToMain.asSharedFlow()
sealed class UiState {
data class Normal(val servers: List<Server>) : UiState()
data object Loading : UiState()
data class Error(val error: Exception) : UiState()
}
init {
viewModelScope.launch {
val servers = database.getAllServersSync()
_uiState.emit(UiState.Normal(servers))
}
}
/**
* Delete server from database
*

View file

@ -1,6 +1,5 @@
package dev.jdtech.jellyfin.database
import androidx.lifecycle.LiveData
import androidx.room.Dao
import androidx.room.Insert
import androidx.room.OnConflictStrategy
@ -59,9 +58,6 @@ abstract class ServerDatabaseDao {
@Query("DELETE FROM servers")
abstract fun clear()
@Query("SELECT * FROM servers")
abstract fun getAllServers(): LiveData<List<Server>>
@Query("SELECT * FROM servers")
abstract fun getAllServersSync(): List<Server>