mirror of
https://github.com/imcarlost/Friendlists.git
synced 2026-04-10 02:46:54 -04:00
implement favorite view
This commit is contained in:
@@ -4,18 +4,21 @@ import android.os.Bundle
|
|||||||
import androidx.appcompat.app.AppCompatActivity
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
import androidx.navigation.findNavController
|
import androidx.navigation.findNavController
|
||||||
import androidx.navigation.ui.NavigationUI.setupActionBarWithNavController
|
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.NavigationRouter
|
||||||
|
import com.hako.base.navigation.ShowFabButton
|
||||||
import com.hako.friendlists.BuildConfig
|
import com.hako.friendlists.BuildConfig
|
||||||
import com.hako.friendlists.R
|
import com.hako.friendlists.R
|
||||||
import com.hako.friendlists.viewmodel.NavigationViewmodel
|
import com.hako.friendlists.viewmodel.NavigationViewmodel
|
||||||
import com.squareup.picasso.Picasso
|
import com.squareup.picasso.Picasso
|
||||||
|
import kotlinx.android.synthetic.main.activity_main.*
|
||||||
import org.koin.android.ext.android.inject
|
import org.koin.android.ext.android.inject
|
||||||
import org.koin.androidx.viewmodel.ext.android.viewModel
|
import org.koin.androidx.viewmodel.ext.android.viewModel
|
||||||
|
|
||||||
class MainActivity : AppCompatActivity() {
|
class MainActivity : AppCompatActivity() {
|
||||||
|
|
||||||
private val navController by lazy { findNavController(R.id.main_fragment_container) }
|
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 navRouter: NavigationRouter by inject()
|
||||||
private val picasso: Picasso by inject()
|
private val picasso: Picasso by inject()
|
||||||
private val viewModel: NavigationViewmodel by viewModel()
|
private val viewModel: NavigationViewmodel by viewModel()
|
||||||
@@ -39,6 +42,28 @@ class MainActivity : AppCompatActivity() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
setupActionBarWithNavController(this, navController)
|
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() {
|
private fun setupPicasso() {
|
||||||
|
|||||||
@@ -35,6 +35,9 @@ class NavigationViewmodel : ViewModel() {
|
|||||||
putString(FRAGMENT_TITLE, event.userName)
|
putString(FRAGMENT_TITLE, event.userName)
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
|
is UserlistNavigation.ClickedOnFab -> navigate.postValue(
|
||||||
|
buildNavigation(R.id.action_userlistFragment_to_favoriteUserlistFragment)
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -15,4 +15,14 @@
|
|||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toTopOf="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>
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
<resources>
|
<resources>
|
||||||
<color name="colorPrimary">#37474F</color>
|
<color name="colorPrimary">#37474F</color>
|
||||||
<color name="colorPrimaryDark">#324047</color>
|
<color name="colorPrimaryDark">#324047</color>
|
||||||
<color name="colorAccent">#CBCFD1</color>
|
<color name="colorAccent">#D32F2F</color>
|
||||||
<color name="colorRed">#D32F2F</color>
|
<color name="colorRed">#D32F2F</color>
|
||||||
<color name="colorDarkGray">#333333</color>
|
<color name="colorDarkGray">#333333</color>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -1,6 +1,32 @@
|
|||||||
package com.hako.base.extensions
|
package com.hako.base.extensions
|
||||||
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
|
import android.view.View
|
||||||
import androidx.annotation.IdRes
|
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)
|
fun buildNavigation(@IdRes id: Int, bundle: Bundle = Bundle()) = Pair(id, bundle)
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
package com.hako.base.navigation
|
package com.hako.base.navigation
|
||||||
|
|
||||||
interface ShowFabButton
|
interface ShowFabButton {
|
||||||
|
fun shouldShowFabButton(): Boolean
|
||||||
|
|
||||||
|
fun fabButtonPressed(): () -> Unit = {}
|
||||||
|
}
|
||||||
BIN
base/src/main/res/drawable-hdpi/ic_heart.png
Normal file
BIN
base/src/main/res/drawable-hdpi/ic_heart.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 778 B |
BIN
base/src/main/res/drawable-mdpi/ic_heart.png
Normal file
BIN
base/src/main/res/drawable-mdpi/ic_heart.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 457 B |
BIN
base/src/main/res/drawable-xhdpi/ic_heart.png
Normal file
BIN
base/src/main/res/drawable-xhdpi/ic_heart.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 890 B |
BIN
base/src/main/res/drawable-xxhdpi/ic_heart.png
Normal file
BIN
base/src/main/res/drawable-xxhdpi/ic_heart.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1023 B |
BIN
base/src/main/res/drawable-xxxhdpi/ic_heart.png
Normal file
BIN
base/src/main/res/drawable-xxxhdpi/ic_heart.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.1 KiB |
@@ -1,15 +1,8 @@
|
|||||||
package com.hako.userlist.domain.usecase
|
package com.hako.userlist.domain.usecase
|
||||||
|
|
||||||
import com.hako.base.domain.database.dao.UserDao
|
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.Single
|
||||||
import io.reactivex.schedulers.Schedulers
|
import io.reactivex.schedulers.Schedulers
|
||||||
import org.koin.core.KoinComponent
|
|
||||||
import org.koin.core.get
|
|
||||||
|
|
||||||
class SetFavoriteStatus(private val dao: UserDao) {
|
class SetFavoriteStatus(private val dao: UserDao) {
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
package com.hako.userlist.feature
|
||||||
|
|
||||||
|
class FavoriteUserlistFragment : UserlistFragment() {
|
||||||
|
override fun doRequest() {
|
||||||
|
viewModel.fetchFavoriteUsers()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun shouldShowFabButton() = false
|
||||||
|
}
|
||||||
@@ -9,7 +9,6 @@ import androidx.recyclerview.widget.LinearLayoutManager
|
|||||||
import com.hako.base.domain.network.RequestStatus
|
import com.hako.base.domain.network.RequestStatus
|
||||||
import com.hako.base.extensions.gone
|
import com.hako.base.extensions.gone
|
||||||
import com.hako.base.extensions.observeNonNull
|
import com.hako.base.extensions.observeNonNull
|
||||||
import com.hako.base.extensions.toast
|
|
||||||
import com.hako.base.extensions.visible
|
import com.hako.base.extensions.visible
|
||||||
import com.hako.base.navigation.NavigationRouter
|
import com.hako.base.navigation.NavigationRouter
|
||||||
import com.hako.base.navigation.ShowFabButton
|
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 org.koin.androidx.viewmodel.ext.android.viewModel
|
||||||
import timber.log.Timber
|
import timber.log.Timber
|
||||||
|
|
||||||
const val ALBUMLIST_FRAGMENT_BUNDLE_FAVORITES = "ALBUMLIST_FRAGMENT_BUNDLE_FAVORITES"
|
open class UserlistFragment : Fragment(), ShowFabButton {
|
||||||
|
|
||||||
class UserlistFragment : Fragment(), ShowFabButton {
|
val viewModel: UserlistViewmodel by viewModel()
|
||||||
|
|
||||||
private val viewModel: UserlistViewmodel by viewModel()
|
|
||||||
private val listAdapter by lazy { UserlistAdapter() }
|
private val listAdapter by lazy { UserlistAdapter() }
|
||||||
private val navigation: NavigationRouter by inject()
|
private val navigation: NavigationRouter by inject()
|
||||||
|
|
||||||
@@ -39,9 +36,19 @@ class UserlistFragment : Fragment(), ShowFabButton {
|
|||||||
super.onViewCreated(view, savedInstanceState)
|
super.onViewCreated(view, savedInstanceState)
|
||||||
setRecycler()
|
setRecycler()
|
||||||
setObservers()
|
setObservers()
|
||||||
|
doRequest()
|
||||||
|
}
|
||||||
|
|
||||||
|
open fun doRequest() {
|
||||||
viewModel.fetchUsers()
|
viewModel.fetchUsers()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun shouldShowFabButton() = true
|
||||||
|
|
||||||
|
override fun fabButtonPressed(): () -> Unit = {
|
||||||
|
navigation.sendNavigation(UserlistNavigation.ClickedOnFab)
|
||||||
|
}
|
||||||
|
|
||||||
private fun setObservers() {
|
private fun setObservers() {
|
||||||
viewModel.userList.observeNonNull(this) {
|
viewModel.userList.observeNonNull(this) {
|
||||||
it.either(::handleFetchError, ::handleFetchSuccess)
|
it.either(::handleFetchError, ::handleFetchSuccess)
|
||||||
|
|||||||
@@ -4,4 +4,5 @@ import com.hako.base.navigation.NavigationEvent
|
|||||||
|
|
||||||
sealed class UserlistNavigation : NavigationEvent {
|
sealed class UserlistNavigation : NavigationEvent {
|
||||||
data class ClickedOnUser(val userId: Int, val userName: String) : UserlistNavigation()
|
data class ClickedOnUser(val userId: Int, val userName: String) : UserlistNavigation()
|
||||||
|
object ClickedOnFab : UserlistNavigation()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,6 +9,20 @@
|
|||||||
android:id="@+id/userlistFragment"
|
android:id="@+id/userlistFragment"
|
||||||
android:name="com.hako.userlist.feature.UserlistFragment"
|
android:name="com.hako.userlist.feature.UserlistFragment"
|
||||||
tools:layout="@layout/fragment_userlist"
|
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>
|
</navigation>
|
||||||
Reference in New Issue
Block a user