From f2c9082598f82f9e1d77ead59cdee53b9f0839b6 Mon Sep 17 00:00:00 2001 From: Carlos Martinez Date: Thu, 6 Feb 2020 11:32:39 -0300 Subject: [PATCH] implement favorite view --- .../com/hako/friendlists/view/MainActivity.kt | 27 +++++++++++++++++- .../viewmodel/NavigationViewmodel.kt | 3 ++ app/src/main/res/layout/activity_main.xml | 10 +++++++ app/src/main/res/values/colors.xml | 2 +- .../base/extensions/NavigationExtensions.kt | 26 +++++++++++++++++ .../com/hako/base/navigation/ShowFabButton.kt | 6 +++- base/src/main/res/drawable-hdpi/ic_heart.png | Bin 0 -> 778 bytes base/src/main/res/drawable-mdpi/ic_heart.png | Bin 0 -> 457 bytes base/src/main/res/drawable-xhdpi/ic_heart.png | Bin 0 -> 890 bytes .../src/main/res/drawable-xxhdpi/ic_heart.png | Bin 0 -> 1023 bytes .../main/res/drawable-xxxhdpi/ic_heart.png | Bin 0 -> 1119 bytes .../domain/usecase/SetFavoriteStatus.kt | 7 ----- .../feature/FavoriteUserlistFragment.kt | 9 ++++++ .../hako/userlist/feature/UserlistFragment.kt | 17 +++++++---- .../userlist/navigation/UserlistNavigation.kt | 1 + .../res/navigation/userlist_navigation.xml | 16 ++++++++++- 16 files changed, 108 insertions(+), 16 deletions(-) create mode 100644 base/src/main/res/drawable-hdpi/ic_heart.png create mode 100644 base/src/main/res/drawable-mdpi/ic_heart.png create mode 100644 base/src/main/res/drawable-xhdpi/ic_heart.png create mode 100644 base/src/main/res/drawable-xxhdpi/ic_heart.png create mode 100644 base/src/main/res/drawable-xxxhdpi/ic_heart.png create mode 100644 userlist/src/main/java/com/hako/userlist/feature/FavoriteUserlistFragment.kt 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 0000000000000000000000000000000000000000..4fd52b2dec7076553a8d85261e8776b262d827dd GIT binary patch literal 778 zcmV+l1NHogP)y5w4%4vU?+vzCRwo@q@|HsZ2L+lS<Zz-6QEy4o5X6c1Dw=vrnSbBjf8B{_Br`#mG3I2pn9+cTm(Nr3j8X7t>2vi2f#sa zR-f4()~Dp_0@zFqPBBz@2|RH88!v*$J#Zb|(0jXx_4IXLzSqq^K5h9{skJ;9a+7gU z?0QSSdqE2Y9R=qVboK%amP+o?Go}U&Mf~jmgt(!GQ3`quVj&Pj4N*h6ArS&W)bPPj zP|bxv5H(m7^c~EGKoC#bH$#~-9s)t{!CMM?1g1hD=s9?3s0dDkK+s(lZ3@~AP6aF` zqk=p@L7iZKz+%Wg&_O{pU_F=wF9Q(t0*tG`*W@aG3%CrPsJ3J(v@`Vem?ZIy0mO?mg^~HaEu7fPeW=`tRj0H2JmssYxDN}m}omy^B7Yz z9#TT?Xfvn10eg9R{T{O!R~_Iq_)=h}_}y0xkzEUl7Y~9=jmiVyns#f}73{XM{3~!1 z?9r@mmh(cQL1|%BUEZAQSkEZWwDF`?;)cXjO6b*)Ii(i(lPdQyunjCO>(1m6#@e?W z+>(%}y1wR$?94x|aH>H&*eKf7Uqynv?~|3|v_?f?J)07*qo IM6N<$g6GU;=Kufz literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..ba121c8622af206e2647524cfe90f1e8ce7a4c28 GIT binary patch literal 457 zcmV;)0XF`LP)M*6vn45goe!xt_k@7gw6lYzz2{UC4a6dNiLMyB>4a+E>^^<4Gmd4X7)Rc=g~8@ zP0P;izGLfmGkf0WnfJWsJ!dTIzkWdwq`@3G1bOfU3g8qhf!>PPKCrC+3X08ZEj7|n z@jq%<^ zbkSg1uD^*#jrEMY->flM#Xxeicp23C|Z3JY(=fUiJ}kITM@j}%S#Kf`eOT{ z&{R=dyvAsnG;GrRPw{+m28NK7q+K^V!N3o!OJ?V6c4xntv8-zQRzsjby8&1O+u<%n*hWliSDj~o=kC$^++Z={lw1a(IS|~sh?1j^Loz0d(uAmJ= zaFROdC6A@cY*P<)3ie1}^^VUc`Du^yCreUh7AH&dm%Bh0X@tjS(`JHt*vF9Sx24@* z_n0zS<_U_K&f`RzN%m2mpH-qN0-U2^?Lo?VlG)Ia#2rUdu}W5UvE^LGXX7*lhQst9nDh79PqDhyx15g`G#&@+PqNExw7 zNPuSQ;}kFM@rO6cTfQlOW+v0V#}M{#fI)ZwCkoApjSnERvW?K8y`9q@se5A7!FxYg zD1e`9H?pkqm23|LuvOUryJSfPYKtvs)xtV>NYM&TGu3&e509t?7Qw=q7P$OeVi9jy zIN24t@>A?Xi2S82EgB!72Ii40fF}1H&iQP;os@C#7F-SjnTi8XaN;&qEC3~2+O|v6I*Z=?k literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..f3c77c1fb0dee0fe09d261d84362d1bb6b39969d GIT binary patch literal 1023 zcmV^cZGEJya_6P$X#h5Og7k3W-Vs!-A-w z+Z5%kX`GyK{-sO$(e~W_gM#iPiOS({mq=qz8%NWO}CV7(P*@WtYeL20E`hI z2m!yf?+zJcm&pcD5##ukq#l^R9b$K_WB9Ey;Jz`d?2S;b8VyJTN>f1e;c~JTbdhtc zmyCi>WCnym(Aqb_g)|gb~&N{CnNeoHM zlJ85HwLY7y<71snSnog=-<(_yT+NMcNYCv6Zkct=r8g^INTj6CN&^8m=8h& z(tx}NGz?y9K<U-QUIU5~khu=^10PHr z$fvH55Y)@Z*Iv;OE1>113XH%+g2_Dl)kv4dQ&J7eG$0KqbpaKTQqV!pv+Lv!2Ge1H(c2UN%o4V{~+q_Hz)_~#!w3X)+8>jf(6~P<| zC}@@aB-Cq5vX&)OkbU5RHDr{H!#Cm~IRq+Gv2H^H(tx}LRBElU=;rkj0;kq4WT?vm z%YbD&OE!YibS#zHNsa^j#=;qT*1<9y13NOYmP`ZEfV>4%Y(1i%0OnEtHwdRF5PbL> z;O85GWh>5x<(n;_FAX#H?Fr!5$U%{f>svLT1eztHlUEjsDQHR0C#ffJ+8SUuZLT#U z+gD3h;m`?BikM_G9!DUgJv9yuPNO=PmXm8h8j!buO1SMNTH*HFgL44+79FdbVhUW~ zz8vESSqVyV`3(+cvEC+j7-zD_8NCfy6W!b3Mo^zmuei{F;sj(C46kR+yyQrHwYp7^ z4_+iN#;cO0MP8S$FHA8_l-1xWFU=NjLBI7@gc2v;Hw{Pw@*GeR&cET+#qFR2G+FbP tiVE>1PGw}(63U!H-!vc%NVkIC{sOt$Cupv!!z=&*002ovPDHLkV1mu4$vpr7 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..ed2fc6f677cb2a2891b12c2f81a4af8f75f340bc GIT binary patch literal 1119 zcmV-l1fctgP)D<^Te_sqNto;%0ZdLLu2S%+_X9vd4QTfAEk1WBO=*ehHB z`h)>s1Q=3&=CN=IXciU&i9Gt65S9R2h0DMbr5{5|fAMGflyUD-@<~zv1yBG56q*3} zV3{x-s1-H>r-fTUzc2{+Kt}io^a@?T5n(f61~z*f771H`qss5^Rr--p`itY~SH^ux z$){Gyu`C|}DPcWuPWT243qKv=hyR96o3I;b1x_lT^BwnfSjp$CuntI300mG01;j}} z7`Tmjc$^3Bg%2nje+mR3-NIGi8qoch&${j_=5trcacMZC9K%zlPfd!=jN<|1%V?g& zp|2Sw$3|hH4FymD1yDf50uBIYl&|A{Oa@g*XtOx;jd{O~r>tvqFg$0NY};)pfC4Ch z0wNah5=b*BXQadZgfTp2!(os?Ipc%y#)bkYfC4CB>M+^9wegf?)GUK?Mi%p?01BW0 z3W!+1SKvE?a)w!w{$k^W2aRk77?d;2)bq6s1yBG5P(Z{29soTI${A0E`!=3(Y`cp= zIinMg;ZpzwPyhu)ET9EA#-N-XBr`X4w%Hf~D}h}M&eKn}f$|hRG$=F*1bcE(@O5r-IuZ-Jdu^OnJ%#vjkKmim$0TBu?wQc4D zt;!YGL8Z(=F$9i9{IJ5KnI+BxDqUC8HOtm(fj;H9d!Y-!dJpC*ZxgUAigLyjKmim$ z0TBwQ6smxI!U>>|Y7hBJe{no!jI)5G7l$StX$XGTX|}&Q@*hId9G;U?B<1V9oQb^zVI#Km0}AIE!6?- z0hD;mvzpg%IIFTT`?kx0DvylV`Ce){Q_}@q(a&k!u9|F002ovPDHLkV1m`!+ynps literal 0 HcmV?d00001 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