Tusky-App-Android/app/src/main/java/com/keylesspalace/tusky/components/domainblocks/DomainBlocksFragment.kt

97 lines
3.6 KiB
Kotlin
Raw Normal View History

package com.keylesspalace.tusky.components.domainblocks
import android.os.Bundle
import android.util.Log
import android.view.View
import androidx.fragment.app.Fragment
2023-07-04 19:30:57 +02:00
import androidx.fragment.app.viewModels
import androidx.lifecycle.lifecycleScope
2023-07-04 19:30:57 +02:00
import androidx.paging.LoadState
import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.LinearLayoutManager
import com.google.android.material.snackbar.Snackbar
import com.keylesspalace.tusky.R
import com.keylesspalace.tusky.databinding.FragmentDomainBlocksBinding
import com.keylesspalace.tusky.di.Injectable
2023-07-04 19:30:57 +02:00
import com.keylesspalace.tusky.di.ViewModelFactory
import com.keylesspalace.tusky.util.hide
import com.keylesspalace.tusky.util.show
import com.keylesspalace.tusky.util.viewBinding
2023-07-04 19:30:57 +02:00
import com.keylesspalace.tusky.util.visible
import javax.inject.Inject
2023-07-04 19:30:57 +02:00
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch
class DomainBlocksFragment : Fragment(R.layout.fragment_domain_blocks), Injectable {
@Inject
2023-07-04 19:30:57 +02:00
lateinit var viewModelFactory: ViewModelFactory
private val binding by viewBinding(FragmentDomainBlocksBinding::bind)
private val viewModel: DomainBlocksViewModel by viewModels { viewModelFactory }
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
val adapter = DomainBlocksAdapter(viewModel::unblock)
binding.recyclerView.setHasFixedSize(true)
binding.recyclerView.addItemDecoration(
DividerItemDecoration(view.context, DividerItemDecoration.VERTICAL)
)
binding.recyclerView.adapter = adapter
2023-07-04 19:30:57 +02:00
binding.recyclerView.layoutManager = LinearLayoutManager(view.context)
2023-07-04 19:30:57 +02:00
viewLifecycleOwner.lifecycleScope.launch {
viewModel.uiEvents.collect { event ->
showSnackbar(event)
}
}
2023-07-04 19:30:57 +02:00
lifecycleScope.launch {
2023-07-05 20:09:16 +02:00
viewModel.domainPager.collectLatest { pagingData ->
2023-07-04 19:30:57 +02:00
adapter.submitData(pagingData)
}
}
2023-07-04 19:30:57 +02:00
adapter.addLoadStateListener { loadState ->
binding.progressBar.visible(
loadState.refresh == LoadState.Loading && adapter.itemCount == 0
)
2023-07-04 19:30:57 +02:00
if (loadState.refresh is LoadState.Error) {
binding.recyclerView.hide()
binding.messageView.show()
val errorState = loadState.refresh as LoadState.Error
binding.messageView.setup(errorState.error) { adapter.retry() }
Log.w(TAG, "error loading blocked domains", errorState.error)
2023-07-04 19:30:57 +02:00
} else if (loadState.refresh is LoadState.NotLoading && adapter.itemCount == 0) {
binding.recyclerView.hide()
binding.messageView.show()
binding.messageView.setup(R.drawable.elephant_friend_empty, R.string.message_empty)
} else {
2023-07-04 19:30:57 +02:00
binding.recyclerView.show()
binding.messageView.hide()
}
}
}
private fun showSnackbar(event: SnackbarEvent) {
val message = if (event.throwable == null) {
getString(event.message, event.domain)
} else {
Log.w(TAG, event.throwable)
val error = event.throwable.localizedMessage ?: getString(R.string.ui_error_unknown)
getString(event.message, event.domain, error)
}
2023-07-04 19:30:57 +02:00
Snackbar.make(binding.recyclerView, message, Snackbar.LENGTH_LONG)
2023-07-05 20:11:12 +02:00
.setTextMaxLines(5)
.setAction(event.actionText, event.action)
2023-07-04 19:30:57 +02:00
.show()
}
companion object {
private const val TAG = "DomainBlocksFragment"
}
}