mirror of
https://github.com/imcarlost/Friendlists.git
synced 2026-04-09 18:38:36 -04:00
Change: fragment hieranchy
This commit is contained in:
@@ -0,0 +1,105 @@
|
||||
package com.hako.userlist.feature
|
||||
|
||||
import android.os.Bundle
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import androidx.fragment.app.Fragment
|
||||
import androidx.recyclerview.widget.LinearLayoutManager
|
||||
import com.hako.base.domain.network.RequestStatus
|
||||
import com.hako.base.extensions.gone
|
||||
import com.hako.base.extensions.observeNonNull
|
||||
import com.hako.base.extensions.visible
|
||||
import com.hako.base.navigation.NavigationRouter
|
||||
import com.hako.base.navigation.ShowFabButton
|
||||
import com.hako.userlist.model.User
|
||||
import com.hako.userlist.viewmodel.UserlistViewmodel
|
||||
import com.hako.userlist.widget.UserlistAdapter
|
||||
import com.hako.userlist.R
|
||||
import com.hako.userlist.navigation.UserlistNavigation
|
||||
import kotlinx.android.synthetic.main.fragment_userlist.*
|
||||
import org.koin.android.ext.android.inject
|
||||
import org.koin.androidx.viewmodel.ext.android.viewModel
|
||||
import timber.log.Timber
|
||||
|
||||
abstract class BaseUserlistFragment : Fragment(), ShowFabButton {
|
||||
|
||||
val viewModel: UserlistViewmodel by viewModel()
|
||||
private val listAdapter by lazy { UserlistAdapter() }
|
||||
private val navigation: NavigationRouter by inject()
|
||||
|
||||
override fun onCreateView(
|
||||
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
|
||||
): View = inflater.inflate(R.layout.fragment_userlist, container, false)
|
||||
|
||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||
super.onViewCreated(view, savedInstanceState)
|
||||
setRecycler()
|
||||
setObservers()
|
||||
doRequest()
|
||||
}
|
||||
|
||||
abstract fun doRequest()
|
||||
|
||||
override fun fabButtonPressed(): () -> Unit = {
|
||||
navigation.sendNavigation(UserlistNavigation.ClickedOnFab)
|
||||
}
|
||||
|
||||
private fun setObservers() {
|
||||
viewModel.userList.observeNonNull(this) {
|
||||
it.either(::handleFetchError, ::handleFetchSuccess)
|
||||
}
|
||||
|
||||
viewModel.requestStatus.observeNonNull(this) {
|
||||
when (it) {
|
||||
RequestStatus.Ready -> {
|
||||
fragment_userlist_error_overlay.gone()
|
||||
fragment_userlist_loading_overlay.gone()
|
||||
fragment_userlist_empty_overlay.gone()
|
||||
}
|
||||
RequestStatus.Loading -> {
|
||||
fragment_userlist_error_overlay.gone()
|
||||
fragment_userlist_loading_overlay.visible()
|
||||
fragment_userlist_empty_overlay.gone()
|
||||
}
|
||||
RequestStatus.Errored -> {
|
||||
fragment_userlist_error_overlay.visible()
|
||||
fragment_userlist_loading_overlay.gone()
|
||||
fragment_userlist_empty_overlay.gone()
|
||||
}
|
||||
RequestStatus.Empty -> {
|
||||
fragment_userlist_error_overlay.gone()
|
||||
fragment_userlist_loading_overlay.gone()
|
||||
fragment_userlist_empty_overlay.visible()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
viewModel.emptyMessage.observeNonNull(this) {
|
||||
fragment_userlist_empty_overlay.setLabel(it)
|
||||
}
|
||||
}
|
||||
|
||||
private fun handleFetchError(throwable: Throwable) {
|
||||
Timber.e(throwable)
|
||||
}
|
||||
|
||||
private fun handleFetchSuccess(users: List<User>) {
|
||||
listAdapter.addAll(users)
|
||||
}
|
||||
|
||||
private fun setRecycler() {
|
||||
fragment_userlist_recycler_container.apply {
|
||||
layoutManager = LinearLayoutManager(context)
|
||||
adapter = listAdapter.apply {
|
||||
onItemClick = {
|
||||
navigation.sendNavigation(UserlistNavigation.ClickedOnUser(it.id, it.realName))
|
||||
}
|
||||
|
||||
onFavoriteClick = {
|
||||
viewModel.updateUserFavoriteStatus(it.id, !it.isFavorite)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,9 +1,7 @@
|
||||
package com.hako.userlist.feature
|
||||
|
||||
class FavoriteUserlistFragment : UserlistFragment() {
|
||||
override fun doRequest() {
|
||||
viewModel.fetchFavoriteUsers()
|
||||
}
|
||||
class FavoriteUserlistFragment : BaseUserlistFragment() {
|
||||
override fun doRequest() = viewModel.fetchFavoriteUsers()
|
||||
|
||||
override fun shouldShowFabButton() = false
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,109 +1,7 @@
|
||||
package com.hako.userlist.feature
|
||||
|
||||
import android.os.Bundle
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import androidx.fragment.app.Fragment
|
||||
import androidx.recyclerview.widget.LinearLayoutManager
|
||||
import com.hako.base.domain.network.RequestStatus
|
||||
import com.hako.base.extensions.gone
|
||||
import com.hako.base.extensions.observeNonNull
|
||||
import com.hako.base.extensions.visible
|
||||
import com.hako.base.navigation.NavigationRouter
|
||||
import com.hako.base.navigation.ShowFabButton
|
||||
import com.hako.userlist.model.User
|
||||
import com.hako.userlist.viewmodel.UserlistViewmodel
|
||||
import com.hako.userlist.widget.UserlistAdapter
|
||||
import com.hako.userlist.R
|
||||
import com.hako.userlist.navigation.UserlistNavigation
|
||||
import kotlinx.android.synthetic.main.fragment_userlist.*
|
||||
import org.koin.android.ext.android.inject
|
||||
import org.koin.androidx.viewmodel.ext.android.viewModel
|
||||
import timber.log.Timber
|
||||
|
||||
open class UserlistFragment : Fragment(), ShowFabButton {
|
||||
|
||||
val viewModel: UserlistViewmodel by viewModel()
|
||||
private val listAdapter by lazy { UserlistAdapter() }
|
||||
private val navigation: NavigationRouter by inject()
|
||||
|
||||
override fun onCreateView(
|
||||
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
|
||||
): View = inflater.inflate(R.layout.fragment_userlist, container, false)
|
||||
|
||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||
super.onViewCreated(view, savedInstanceState)
|
||||
setRecycler()
|
||||
setObservers()
|
||||
doRequest()
|
||||
}
|
||||
|
||||
open fun doRequest() {
|
||||
viewModel.fetchUsers()
|
||||
}
|
||||
class UserlistFragment : BaseUserlistFragment() {
|
||||
override fun doRequest() = viewModel.fetchUsers()
|
||||
|
||||
override fun shouldShowFabButton() = true
|
||||
|
||||
override fun fabButtonPressed(): () -> Unit = {
|
||||
navigation.sendNavigation(UserlistNavigation.ClickedOnFab)
|
||||
}
|
||||
|
||||
private fun setObservers() {
|
||||
viewModel.userList.observeNonNull(this) {
|
||||
it.either(::handleFetchError, ::handleFetchSuccess)
|
||||
}
|
||||
|
||||
viewModel.requestStatus.observeNonNull(this) {
|
||||
when (it) {
|
||||
RequestStatus.Ready -> {
|
||||
fragment_userlist_error_overlay.gone()
|
||||
fragment_userlist_loading_overlay.gone()
|
||||
fragment_userlist_empty_overlay.gone()
|
||||
}
|
||||
RequestStatus.Loading -> {
|
||||
fragment_userlist_error_overlay.gone()
|
||||
fragment_userlist_loading_overlay.visible()
|
||||
fragment_userlist_empty_overlay.gone()
|
||||
}
|
||||
RequestStatus.Errored -> {
|
||||
fragment_userlist_error_overlay.visible()
|
||||
fragment_userlist_loading_overlay.gone()
|
||||
fragment_userlist_empty_overlay.gone()
|
||||
}
|
||||
RequestStatus.Empty -> {
|
||||
fragment_userlist_error_overlay.gone()
|
||||
fragment_userlist_loading_overlay.gone()
|
||||
fragment_userlist_empty_overlay.visible()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
viewModel.emptyMessage.observeNonNull(this) {
|
||||
fragment_userlist_empty_overlay.setLabel(it)
|
||||
}
|
||||
}
|
||||
|
||||
private fun handleFetchError(throwable: Throwable) {
|
||||
Timber.e(throwable)
|
||||
}
|
||||
|
||||
private fun handleFetchSuccess(users: List<User>) {
|
||||
listAdapter.addAll(users)
|
||||
}
|
||||
|
||||
private fun setRecycler() {
|
||||
fragment_userlist_recycler_container.apply {
|
||||
layoutManager = LinearLayoutManager(context)
|
||||
adapter = listAdapter.apply {
|
||||
onItemClick = {
|
||||
navigation.sendNavigation(UserlistNavigation.ClickedOnUser(it.id, it.realName))
|
||||
}
|
||||
|
||||
onFavoriteClick = {
|
||||
viewModel.updateUserFavoriteStatus(it.id, !it.isFavorite)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user