implement favorite view

This commit is contained in:
Carlos Martinez
2020-02-06 11:32:39 -03:00
parent 1fa3f8c43d
commit f2c9082598
16 changed files with 108 additions and 16 deletions

View File

@@ -4,18 +4,21 @@ import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.navigation.findNavController
import androidx.navigation.ui.NavigationUI.setupActionBarWithNavController
import com.hako.base.extensions.observeNonNull
import com.hako.base.extensions.*
import com.hako.base.navigation.NavigationRouter
import com.hako.base.navigation.ShowFabButton
import com.hako.friendlists.BuildConfig
import com.hako.friendlists.R
import com.hako.friendlists.viewmodel.NavigationViewmodel
import com.squareup.picasso.Picasso
import kotlinx.android.synthetic.main.activity_main.*
import org.koin.android.ext.android.inject
import org.koin.androidx.viewmodel.ext.android.viewModel
class MainActivity : AppCompatActivity() {
private val navController by lazy { findNavController(R.id.main_fragment_container) }
private val navHostFragment by lazy { findNavHostFragment(R.id.main_fragment_container) }
private val navRouter: NavigationRouter by inject()
private val picasso: Picasso by inject()
private val viewModel: NavigationViewmodel by viewModel()
@@ -39,6 +42,28 @@ class MainActivity : AppCompatActivity() {
}
setupActionBarWithNavController(this, navController)
navHostFragment.registerOnFragmentViewCreated { currentFragment ->
initializeViews()
when (currentFragment) {
is ShowFabButton -> fabButtonBehaviour(currentFragment)
}
}
}
private fun initializeViews() {
main_fragment_fab.hide()
}
private fun fabButtonBehaviour(currentFragment: ShowFabButton) {
main_fragment_fab.setOnClickListener {
currentFragment.fabButtonPressed().invoke()
}
if (currentFragment.shouldShowFabButton()) {
main_fragment_fab.show()
} else {
main_fragment_fab.hide()
}
}
private fun setupPicasso() {

View File

@@ -35,6 +35,9 @@ class NavigationViewmodel : ViewModel() {
putString(FRAGMENT_TITLE, event.userName)
})
)
is UserlistNavigation.ClickedOnFab -> navigate.postValue(
buildNavigation(R.id.action_userlistFragment_to_favoriteUserlistFragment)
)
}
}

View File

@@ -15,4 +15,14 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/main_fragment_fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end|bottom"
android:layout_margin="24dp"
android:src="@drawable/ic_heart"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -2,7 +2,7 @@
<resources>
<color name="colorPrimary">#37474F</color>
<color name="colorPrimaryDark">#324047</color>
<color name="colorAccent">#CBCFD1</color>
<color name="colorAccent">#D32F2F</color>
<color name="colorRed">#D32F2F</color>
<color name="colorDarkGray">#333333</color>
</resources>

View File

@@ -1,6 +1,32 @@
package com.hako.base.extensions
import android.os.Bundle
import android.view.View
import androidx.annotation.IdRes
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
import androidx.navigation.fragment.NavHostFragment
fun AppCompatActivity.findNavHostFragment(@IdRes id: Int) =
supportFragmentManager.findFragmentById(id) as NavHostFragment
fun NavHostFragment.registerOnFragmentViewCreated(
recursive: Boolean = true,
listener: (currentFragment: Fragment) -> Unit
) {
childFragmentManager
.registerFragmentLifecycleCallbacks(object : FragmentManager.FragmentLifecycleCallbacks() {
override fun onFragmentViewCreated(
fm: FragmentManager,
f: Fragment,
v: View,
savedInstanceState: Bundle?
) {
super.onFragmentViewCreated(fm, f, v, savedInstanceState)
listener(f)
}
}, recursive)
}
fun buildNavigation(@IdRes id: Int, bundle: Bundle = Bundle()) = Pair(id, bundle)

View File

@@ -1,3 +1,7 @@
package com.hako.base.navigation
interface ShowFabButton
interface ShowFabButton {
fun shouldShowFabButton(): Boolean
fun fabButtonPressed(): () -> Unit = {}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 778 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 457 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 890 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1023 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -1,15 +1,8 @@
package com.hako.userlist.domain.usecase
import com.hako.base.domain.database.dao.UserDao
import com.hako.base.extensions.wasUpdated
import com.hako.userlist.domain.datasource.UserlistRemoteApi
import com.hako.userlist.model.UserViewable
import com.hako.userlist.model.toUserEntity
import com.hako.userlist.model.toUserViewable
import io.reactivex.Single
import io.reactivex.schedulers.Schedulers
import org.koin.core.KoinComponent
import org.koin.core.get
class SetFavoriteStatus(private val dao: UserDao) {

View File

@@ -0,0 +1,9 @@
package com.hako.userlist.feature
class FavoriteUserlistFragment : UserlistFragment() {
override fun doRequest() {
viewModel.fetchFavoriteUsers()
}
override fun shouldShowFabButton() = false
}

View File

@@ -9,7 +9,6 @@ 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.toast
import com.hako.base.extensions.visible
import com.hako.base.navigation.NavigationRouter
import com.hako.base.navigation.ShowFabButton
@@ -23,11 +22,9 @@ import org.koin.android.ext.android.inject
import org.koin.androidx.viewmodel.ext.android.viewModel
import timber.log.Timber
const val ALBUMLIST_FRAGMENT_BUNDLE_FAVORITES = "ALBUMLIST_FRAGMENT_BUNDLE_FAVORITES"
open class UserlistFragment : Fragment(), ShowFabButton {
class UserlistFragment : Fragment(), ShowFabButton {
private val viewModel: UserlistViewmodel by viewModel()
val viewModel: UserlistViewmodel by viewModel()
private val listAdapter by lazy { UserlistAdapter() }
private val navigation: NavigationRouter by inject()
@@ -39,9 +36,19 @@ class UserlistFragment : Fragment(), ShowFabButton {
super.onViewCreated(view, savedInstanceState)
setRecycler()
setObservers()
doRequest()
}
open 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)

View File

@@ -4,4 +4,5 @@ import com.hako.base.navigation.NavigationEvent
sealed class UserlistNavigation : NavigationEvent {
data class ClickedOnUser(val userId: Int, val userName: String) : UserlistNavigation()
object ClickedOnFab : UserlistNavigation()
}

View File

@@ -9,6 +9,20 @@
android:id="@+id/userlistFragment"
android:name="com.hako.userlist.feature.UserlistFragment"
tools:layout="@layout/fragment_userlist"
android:label="Friendlist" />
android:label="Friendlist" >
<action
android:id="@+id/action_userlistFragment_to_favoriteUserlistFragment"
app:destination="@id/favoriteUserlistFragment"
app:enterAnim="@anim/slide_in_right"
app:exitAnim="@anim/slide_out_left"
app:popEnterAnim="@anim/slide_in_left"
app:popExitAnim="@anim/slide_out_right"/>
</fragment>
<fragment
android:id="@+id/favoriteUserlistFragment"
android:name="com.hako.userlist.feature.FavoriteUserlistFragment"
tools:layout="@layout/fragment_userlist"
android:label="Favoritos" />
</navigation>