add navigation framework and implement it

This commit is contained in:
Carlos Martinez
2020-02-05 15:12:53 -03:00
parent 5877a4851e
commit 8130956484
23 changed files with 200 additions and 52 deletions

View File

@@ -15,6 +15,7 @@
<activity
android:name=".view.MainActivity"
android:launchMode="singleTask"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

View File

@@ -3,8 +3,11 @@ package com.hako.friendlists.di
import androidx.room.Room
import com.hako.base.domain.database.DatabaseClient
import com.hako.base.domain.network.RemoteClient
import com.hako.base.navigation.NavigationRouter
import com.hako.friendlists.BuildConfig
import com.hako.friendlists.viewmodel.NavigationViewmodel
import com.squareup.picasso.Picasso
import org.koin.androidx.viewmodel.dsl.viewModel
import org.koin.dsl.module
val appModules = module {
@@ -19,4 +22,8 @@ val appModules = module {
// Picasso
single { Picasso.get() }
// Navigation
single { NavigationRouter() }
viewModel { NavigationViewmodel() }
}

View File

@@ -3,20 +3,43 @@ package com.hako.friendlists.view
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.navigation.findNavController
import com.hako.base.extensions.observeNonNull
import com.hako.base.navigation.NavigationRouter
import com.hako.friendlists.BuildConfig
import com.hako.friendlists.R
import com.hako.friendlists.viewmodel.NavigationViewmodel
import com.squareup.picasso.Picasso
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 navRouter: NavigationRouter by inject()
private val picasso: Picasso by inject()
private val viewModel: NavigationViewmodel by viewModel()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
setupNavigation()
setupPicasso()
}
private fun setupNavigation() {
navController.setGraph(R.navigation.main_navigation)
navRouter.setOnNavigationEvent {
viewModel.onNavigationEvent(it)
}
viewModel.navigate.observeNonNull(this) { pair ->
// Pair.first is a Navigation Id
// Pair.second is a Bundle
navController.navigate(pair.first, pair.second)
}
}
private fun setupPicasso() {
// Show cache indicator on images just for debug builds
picasso.setIndicatorsEnabled(BuildConfig.DEBUG)
}
}

View File

@@ -0,0 +1,46 @@
package com.hako.friendlists.viewmodel
import android.os.Bundle
import androidx.annotation.IdRes
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import com.hako.albumlist.feature.ALBUMLIST_FRAGMENT_BUNDLE_USER_ID
import com.hako.albumlist.navigation.AlbumlistNavigation
import com.hako.base.extensions.buildNavigation
import com.hako.base.navigation.NavigationEvent
import com.hako.friendlists.R
import com.hako.photolist.feature.PHOTOLIST_FRAGMENT_BUNDLE_ALBUM_ID
import com.hako.userlist.navigation.UserlistNavigation
class NavigationViewmodel : ViewModel() {
val navigate = MutableLiveData<Pair<@IdRes Int, Bundle>>()
fun onNavigationEvent(event: NavigationEvent) {
when (event) {
is UserlistNavigation -> handleUserlistNavigation(event)
is AlbumlistNavigation -> handleAlbumlistNavigation(event)
else -> throw NoWhenBranchMatchedException("Undefined navigation event parent")
}
}
private fun handleUserlistNavigation(event: UserlistNavigation) {
when (event) {
is UserlistNavigation.ClickedOnUser -> navigate.postValue(
buildNavigation(R.id.action_userlistFragment_to_albumlistFragment, Bundle().apply {
putInt(ALBUMLIST_FRAGMENT_BUNDLE_USER_ID, event.userId)
})
)
}
}
private fun handleAlbumlistNavigation(event: AlbumlistNavigation) {
when (event) {
is AlbumlistNavigation.ClickedOnAlbum -> navigate.postValue(
buildNavigation(R.id.action_albumlistFragment_to_photolistFragment, Bundle().apply {
putInt(PHOTOLIST_FRAGMENT_BUNDLE_ALBUM_ID, event.albumId)
})
)
}
}
}

View File

@@ -2,11 +2,25 @@
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/main_navigation"
app:startDestination="@id/photolist_navigation">
app:startDestination="@id/userlist_navigation">
<include app:graph="@navigation/userlist_navigation" />
<action
android:id="@+id/action_userlistFragment_to_albumlistFragment"
app:destination="@id/albumlist_navigation"
app:enterAnim="@anim/slide_in_right"
app:exitAnim="@anim/slide_out_left"
app:popEnterAnim="@anim/slide_in_left"
app:popExitAnim="@anim/slide_out_right"/>
<include app:graph="@navigation/albumlist_navigation" />
<action
android:id="@+id/action_albumlistFragment_to_photolistFragment"
app:destination="@id/photolist_navigation"
app:enterAnim="@anim/slide_in_right"
app:exitAnim="@anim/slide_out_left"
app:popEnterAnim="@anim/slide_in_left"
app:popExitAnim="@anim/slide_out_right"/>
<include app:graph="@navigation/photolist_navigation" />