From 0fe35da8bae09c9bbc6a6def58f23190d7a11d68 Mon Sep 17 00:00:00 2001 From: Carlos Martinez Date: Sat, 8 Aug 2020 01:32:05 -0400 Subject: [PATCH] Change: fragment hieranchy --- .../userlist/feature/BaseUserlistFragment.kt | 105 +++++++++++++++++ .../feature/FavoriteUserlistFragment.kt | 8 +- .../hako/userlist/feature/UserlistFragment.kt | 108 +----------------- 3 files changed, 111 insertions(+), 110 deletions(-) create mode 100644 userlist/src/main/java/com/hako/userlist/feature/BaseUserlistFragment.kt diff --git a/userlist/src/main/java/com/hako/userlist/feature/BaseUserlistFragment.kt b/userlist/src/main/java/com/hako/userlist/feature/BaseUserlistFragment.kt new file mode 100644 index 0000000..fe714aa --- /dev/null +++ b/userlist/src/main/java/com/hako/userlist/feature/BaseUserlistFragment.kt @@ -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) { + 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) + } + } + } + } +} \ No newline at end of file diff --git a/userlist/src/main/java/com/hako/userlist/feature/FavoriteUserlistFragment.kt b/userlist/src/main/java/com/hako/userlist/feature/FavoriteUserlistFragment.kt index b32dfc8..3d2c758 100644 --- a/userlist/src/main/java/com/hako/userlist/feature/FavoriteUserlistFragment.kt +++ b/userlist/src/main/java/com/hako/userlist/feature/FavoriteUserlistFragment.kt @@ -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 -} \ No newline at end of file +} diff --git a/userlist/src/main/java/com/hako/userlist/feature/UserlistFragment.kt b/userlist/src/main/java/com/hako/userlist/feature/UserlistFragment.kt index 6b87640..f8b4196 100644 --- a/userlist/src/main/java/com/hako/userlist/feature/UserlistFragment.kt +++ b/userlist/src/main/java/com/hako/userlist/feature/UserlistFragment.kt @@ -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) { - 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) - } - } - } - } -} \ No newline at end of file +}