diff --git a/app/src/main/java/com/hako/friendlists/view/MainActivity.kt b/app/src/main/java/com/hako/friendlists/view/MainActivity.kt index 43a6891..14723a0 100644 --- a/app/src/main/java/com/hako/friendlists/view/MainActivity.kt +++ b/app/src/main/java/com/hako/friendlists/view/MainActivity.kt @@ -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() { diff --git a/app/src/main/java/com/hako/friendlists/viewmodel/NavigationViewmodel.kt b/app/src/main/java/com/hako/friendlists/viewmodel/NavigationViewmodel.kt index 4c8bb76..aa1db70 100644 --- a/app/src/main/java/com/hako/friendlists/viewmodel/NavigationViewmodel.kt +++ b/app/src/main/java/com/hako/friendlists/viewmodel/NavigationViewmodel.kt @@ -35,6 +35,9 @@ class NavigationViewmodel : ViewModel() { putString(FRAGMENT_TITLE, event.userName) }) ) + is UserlistNavigation.ClickedOnFab -> navigate.postValue( + buildNavigation(R.id.action_userlistFragment_to_favoriteUserlistFragment) + ) } } diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 626a29b..78e06e2 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -15,4 +15,14 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> + + diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index ecb305d..68bac2d 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -2,7 +2,7 @@ #37474F #324047 - #CBCFD1 + #D32F2F #D32F2F #333333 diff --git a/base/src/main/java/com/hako/base/extensions/NavigationExtensions.kt b/base/src/main/java/com/hako/base/extensions/NavigationExtensions.kt index 24eff13..7e0e618 100644 --- a/base/src/main/java/com/hako/base/extensions/NavigationExtensions.kt +++ b/base/src/main/java/com/hako/base/extensions/NavigationExtensions.kt @@ -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) diff --git a/base/src/main/java/com/hako/base/navigation/ShowFabButton.kt b/base/src/main/java/com/hako/base/navigation/ShowFabButton.kt index 20475f8..9685690 100644 --- a/base/src/main/java/com/hako/base/navigation/ShowFabButton.kt +++ b/base/src/main/java/com/hako/base/navigation/ShowFabButton.kt @@ -1,3 +1,7 @@ package com.hako.base.navigation -interface ShowFabButton \ No newline at end of file +interface ShowFabButton { + fun shouldShowFabButton(): Boolean + + fun fabButtonPressed(): () -> Unit = {} +} \ No newline at end of file diff --git a/base/src/main/res/drawable-hdpi/ic_heart.png b/base/src/main/res/drawable-hdpi/ic_heart.png new file mode 100644 index 0000000..4fd52b2 Binary files /dev/null and b/base/src/main/res/drawable-hdpi/ic_heart.png differ diff --git a/base/src/main/res/drawable-mdpi/ic_heart.png b/base/src/main/res/drawable-mdpi/ic_heart.png new file mode 100644 index 0000000..ba121c8 Binary files /dev/null and b/base/src/main/res/drawable-mdpi/ic_heart.png differ diff --git a/base/src/main/res/drawable-xhdpi/ic_heart.png b/base/src/main/res/drawable-xhdpi/ic_heart.png new file mode 100644 index 0000000..e974a8e Binary files /dev/null and b/base/src/main/res/drawable-xhdpi/ic_heart.png differ diff --git a/base/src/main/res/drawable-xxhdpi/ic_heart.png b/base/src/main/res/drawable-xxhdpi/ic_heart.png new file mode 100644 index 0000000..f3c77c1 Binary files /dev/null and b/base/src/main/res/drawable-xxhdpi/ic_heart.png differ diff --git a/base/src/main/res/drawable-xxxhdpi/ic_heart.png b/base/src/main/res/drawable-xxxhdpi/ic_heart.png new file mode 100644 index 0000000..ed2fc6f Binary files /dev/null and b/base/src/main/res/drawable-xxxhdpi/ic_heart.png differ diff --git a/userlist/src/main/java/com/hako/userlist/domain/usecase/SetFavoriteStatus.kt b/userlist/src/main/java/com/hako/userlist/domain/usecase/SetFavoriteStatus.kt index f067ead..6afdcac 100644 --- a/userlist/src/main/java/com/hako/userlist/domain/usecase/SetFavoriteStatus.kt +++ b/userlist/src/main/java/com/hako/userlist/domain/usecase/SetFavoriteStatus.kt @@ -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) { diff --git a/userlist/src/main/java/com/hako/userlist/feature/FavoriteUserlistFragment.kt b/userlist/src/main/java/com/hako/userlist/feature/FavoriteUserlistFragment.kt new file mode 100644 index 0000000..b32dfc8 --- /dev/null +++ b/userlist/src/main/java/com/hako/userlist/feature/FavoriteUserlistFragment.kt @@ -0,0 +1,9 @@ +package com.hako.userlist.feature + +class FavoriteUserlistFragment : UserlistFragment() { + 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 b837a41..db86a70 100644 --- a/userlist/src/main/java/com/hako/userlist/feature/UserlistFragment.kt +++ b/userlist/src/main/java/com/hako/userlist/feature/UserlistFragment.kt @@ -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) diff --git a/userlist/src/main/java/com/hako/userlist/navigation/UserlistNavigation.kt b/userlist/src/main/java/com/hako/userlist/navigation/UserlistNavigation.kt index 3fb87d5..3edb0c3 100644 --- a/userlist/src/main/java/com/hako/userlist/navigation/UserlistNavigation.kt +++ b/userlist/src/main/java/com/hako/userlist/navigation/UserlistNavigation.kt @@ -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() } diff --git a/userlist/src/main/res/navigation/userlist_navigation.xml b/userlist/src/main/res/navigation/userlist_navigation.xml index c680ef2..4424c70 100644 --- a/userlist/src/main/res/navigation/userlist_navigation.xml +++ b/userlist/src/main/res/navigation/userlist_navigation.xml @@ -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" > + + + + \ No newline at end of file