Edge-to-edge ui

This commit is contained in:
Koitharu
2020-12-16 11:49:10 +02:00
parent b8d2fa69c4
commit 6463023736
51 changed files with 434 additions and 164 deletions

View File

@@ -2,7 +2,8 @@ package org.koitharu.kotatsu.tracker.ui
import android.os.Bundle
import android.view.*
import androidx.core.view.isVisible
import androidx.core.graphics.Insets
import androidx.core.view.updatePadding
import com.google.android.material.snackbar.Snackbar
import org.koin.android.ext.android.get
import org.koin.androidx.viewmodel.ext.android.viewModel
@@ -18,7 +19,6 @@ import org.koitharu.kotatsu.list.ui.model.ListModel
import org.koitharu.kotatsu.tracker.ui.adapter.FeedAdapter
import org.koitharu.kotatsu.tracker.work.TrackWorker
import org.koitharu.kotatsu.utils.ext.getDisplayMessage
import org.koitharu.kotatsu.utils.ext.hasItems
class FeedFragment : BaseFragment<FragmentFeedBinding>(), PaginationScrollListener.Callback,
OnListItemClickListener<Manga> {
@@ -52,9 +52,7 @@ class FeedFragment : BaseFragment<FragmentFeedBinding>(), PaginationScrollListen
}
viewModel.content.observe(viewLifecycleOwner, this::onListChanged)
viewModel.isLoading.observe(viewLifecycleOwner, this::onLoadingStateChanged)
viewModel.onError.observe(viewLifecycleOwner, this::onError)
viewModel.isEmptyState.observe(viewLifecycleOwner, this::onEmptyStateChanged)
}
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
@@ -80,41 +78,24 @@ class FeedFragment : BaseFragment<FragmentFeedBinding>(), PaginationScrollListen
super.onDestroyView()
}
override fun onWindowInsetsChanged(insets: Insets) {
binding.recyclerView.updatePadding(
left = insets.left,
right = insets.right,
bottom = insets.bottom
)
}
private fun onListChanged(list: List<ListModel>) {
feedAdapter?.items = list
}
private fun onError(e: Throwable) {
if (binding.recyclerView.hasItems) {
Snackbar.make(
binding.recyclerView,
e.getDisplayMessage(resources),
Snackbar.LENGTH_SHORT
).show()
} else {
with(binding.textViewHolder) {
text = e.getDisplayMessage(resources)
setCompoundDrawablesRelativeWithIntrinsicBounds(
0,
R.drawable.ic_error_large,
0,
0
)
isVisible = true
}
}
}
private fun onLoadingStateChanged(isLoading: Boolean) {
val hasItems = binding.recyclerView.hasItems
binding.progressBar.isVisible = isLoading && !hasItems
}
private fun onEmptyStateChanged(isEmpty: Boolean) {
if (isEmpty) {
setUpEmptyListHolder()
}
binding.layoutHolder.isVisible = isEmpty
Snackbar.make(
binding.recyclerView,
e.getDisplayMessage(resources),
Snackbar.LENGTH_SHORT
).show()
}
override fun onScrolledToEnd() {
@@ -125,13 +106,6 @@ class FeedFragment : BaseFragment<FragmentFeedBinding>(), PaginationScrollListen
startActivity(DetailsActivity.newIntent(context ?: return, item))
}
private fun setUpEmptyListHolder() {
with(binding.textViewHolder) {
setCompoundDrawablesRelativeWithIntrinsicBounds(null, null, null, null)
setText(R.string.text_feed_holder)
}
}
companion object {
fun newInstance() = FeedFragment()

View File

@@ -9,8 +9,10 @@ import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.filterNotNull
import kotlinx.coroutines.flow.flowOn
import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.base.ui.BaseViewModel
import org.koitharu.kotatsu.core.model.TrackingLogItem
import org.koitharu.kotatsu.list.ui.model.EmptyState
import org.koitharu.kotatsu.list.ui.model.LoadingFooter
import org.koitharu.kotatsu.list.ui.model.LoadingState
import org.koitharu.kotatsu.tracker.domain.TrackingRepository
@@ -34,7 +36,11 @@ class FeedViewModel(
},
hasNextPage
) { list, isHasNextPage ->
if (isHasNextPage && list.isNotEmpty()) list + LoadingFooter else list
when {
list.isEmpty() -> listOf(EmptyState(R.string.text_feed_holder))
isHasNextPage -> list + LoadingFooter
else -> list
}
}.flowOn(Dispatchers.Default).asLiveData(viewModelScope.coroutineContext, listOf(LoadingState))
init {