mirror of
https://github.com/imcarlost/Friendlists.git
synced 2026-04-10 02:46:54 -04:00
add navigation framework and implement it
This commit is contained in:
@@ -15,6 +15,7 @@
|
||||
|
||||
<activity
|
||||
android:name=".view.MainActivity"
|
||||
android:launchMode="singleTask"
|
||||
android:screenOrientation="portrait">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
|
||||
@@ -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() }
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
})
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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" />
|
||||
|
||||
|
||||
Reference in New Issue
Block a user