Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Organize navigation between modules through deep links
  • Loading branch information
PStrelchenko committed Aug 16, 2020
1 parent 407246c commit 1bcbb70
Show file tree
Hide file tree
Showing 15 changed files with 27 additions and 124 deletions.
44 changes: 0 additions & 44 deletions app/src/main/java/com/aaglobal/jnc_playground/di/GlobalDI.kt
@@ -1,18 +1,8 @@
package com.aaglobal.jnc_playground.di

import android.content.Context
import androidx.navigation.NavController
import androidx.navigation.fragment.findNavController
import com.aaglobal.jnc_playground.R
import com.aaglobal.jnc_playground.company.CompanyDetailsFragment
import com.aaglobal.jnc_playground.company.di.CompanyDI
import com.aaglobal.jnc_playground.company.routing.CompanyFragmentDetailsRouterSource
import com.aaglobal.jnc_playground.company.routing.CompanyFragmentRouterSource
import com.aaglobal.jnc_playground.domain.AuthRepository
import com.aaglobal.jnc_playground.ui.vacancy_list.VacancyListRouterSource
import com.aaglobal.jnc_playground.vacancy.VacancyFragmentDirections
import com.aaglobal.jnc_playground.vacancy.di.VacancyDI
import com.aaglobal.jnc_playground.vacancy.routing.VacancyRouterSource


/**
Expand Down Expand Up @@ -45,38 +35,4 @@ object GlobalDI {
vacancyListRouterSourcesMap.remove(vacancyListType)
}


fun initCompanyDI(navController: NavController) {
CompanyDI.companyFragmentRouterSource = object : CompanyFragmentRouterSource {
override fun moveToCompanyDetails() {
navController.navigate(R.id.action__CompanyFragment__to__CompanyDetailsFragment)
}
}
CompanyDI.companyFragmentDetailsRouterSource = object : CompanyFragmentDetailsRouterSource {
override fun finishCompanyFlow(flowResult: Boolean) {
// Here we are inside nested navigation flow
navController.popBackStack(R.id.company_flow__nav_graph, true)

// At this line, "navController.currentBackStackEntry" means screen that STARTED current nested flow.
// So we can send result!
navController.currentBackStackEntry?.savedStateHandle?.set(CompanyDetailsFragment.COMPANY_FLOW_RESULT_FLAG, true)
}
}
}

fun initVacancyDI(navController: NavController) {
VacancyDI.vacancyRouterSource = object : VacancyRouterSource {
override fun openNextVacancy(vacancyId: String) {
navController.navigate(
VacancyFragmentDirections.actionVacancyFragmentToVacancyFragment(vacancyId = vacancyId)
)
}

override fun openCompanyFlow() {
initCompanyDI(navController)
navController.navigate(R.id.action__VacancyFragment__to__CompanyFlow)
}
}
}

}
Expand Up @@ -6,7 +6,6 @@ import androidx.fragment.app.Fragment
import androidx.navigation.fragment.findNavController
import com.aaglobal.jnc_playground.R
import com.aaglobal.jnc_playground.core.utils.addFragmentLossIfNotExist
import com.aaglobal.jnc_playground.di.GlobalDI
import com.aaglobal.jnc_playground.ui.vacancy_list.VacancyListFragment
import com.aaglobal.jnc_playground.ui.vacancy_list.VacancyListRouterSource
import com.aaglobal.jnc_playground.ui.vacancy_list.adapter.VacancyItem
Expand Down Expand Up @@ -34,8 +33,6 @@ class FavoritesContainerFragment : Fragment(R.layout.fragment_favorites_containe
vacancyType = "favorites_container",
vacancyListRouterSource = object : VacancyListRouterSource {
override fun navigateToVacancyScreen(item: VacancyItem) {
GlobalDI.initVacancyDI(findNavController())

findNavController().navigate(
R.id.action__FavoritesContainerFragment__to__VacancyFragment,
VacancyFragmentArgs(vacancyId = "${item.name}|${item.id}").toBundle()
Expand Down
Expand Up @@ -7,7 +7,6 @@ import androidx.navigation.fragment.findNavController
import com.aaglobal.jnc_playground.R
import com.aaglobal.jnc_playground.company.CompanyDetailsFragment.Companion.COMPANY_FLOW_RESULT_FLAG
import com.aaglobal.jnc_playground.core.utils.addFragmentLossIfNotExist
import com.aaglobal.jnc_playground.di.GlobalDI
import com.aaglobal.jnc_playground.ui.vacancy_list.VacancyListFragment
import com.aaglobal.jnc_playground.ui.vacancy_list.VacancyListRouterSource
import com.aaglobal.jnc_playground.ui.vacancy_list.adapter.VacancyItem
Expand All @@ -29,9 +28,6 @@ class SearchContainerFragment : Fragment(R.layout.fragment_search_container) {
)

fragment_search_container__button__open_company_flow.setOnClickListener {
// We need to init interfaces for routing
GlobalDI.initCompanyDI(findNavController())
// And only after that we can go into module navigation
findNavController().navigate(R.id.action__SearchContainerFragment__to__CompanyFlow)
}

Expand All @@ -47,8 +43,6 @@ class SearchContainerFragment : Fragment(R.layout.fragment_search_container) {
vacancyType = "search_container",
vacancyListRouterSource = object : VacancyListRouterSource {
override fun navigateToVacancyScreen(item: VacancyItem) {
GlobalDI.initVacancyDI(findNavController())

findNavController().navigate(
R.id.action__SearchContainerFragment__to__VacancyFragment,
VacancyFragmentArgs(vacancyId = "${item.name}|${item.id}").toBundle()
Expand Down
2 changes: 1 addition & 1 deletion buildSrc/src/main/kotlin/Versions.kt
Expand Up @@ -8,7 +8,7 @@ object Versions {
}

object GradlePlugins {
private const val androidBuildToolsVersion = "4.1.0-beta05"
private const val androidBuildToolsVersion = "4.1.0-rc01"

const val kotlin = "org.jetbrains.kotlin:kotlin-gradle-plugin:${Versions.kotlin}"
const val androidBuildTools = "com.android.tools.build:gradle:$androidBuildToolsVersion"
Expand Down
Expand Up @@ -3,7 +3,7 @@ package com.aaglobal.jnc_playground.company
import android.os.Bundle
import android.view.View
import androidx.fragment.app.Fragment
import com.aaglobal.jnc_playground.company.di.CompanyDI
import androidx.navigation.fragment.findNavController
import kotlinx.android.synthetic.main.fragment_company_details.*


Expand All @@ -17,11 +17,14 @@ class CompanyDetailsFragment : Fragment(R.layout.fragment_company_details) {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)


// We use special interface for navigating from this module
// We use defined graph in feature-module
fragment_company_details__button.setOnClickListener {
CompanyDI.companyFragmentDetailsRouterSource?.finishCompanyFlow(flowResult = true)
// Here we are inside nested navigation flow
findNavController().popBackStack(R.id.company_flow__nav_graph, true)

// At this line, "navController.currentBackStackEntry" means screen that STARTED current nested flow.
// So we can send result!
findNavController().currentBackStackEntry?.savedStateHandle?.set(COMPANY_FLOW_RESULT_FLAG, true)
}
}

Expand Down
Expand Up @@ -3,7 +3,7 @@ package com.aaglobal.jnc_playground.company
import android.os.Bundle
import android.view.View
import androidx.fragment.app.Fragment
import com.aaglobal.jnc_playground.company.di.CompanyDI
import androidx.navigation.fragment.findNavController
import kotlinx.android.synthetic.main.fragment_company.*


Expand All @@ -14,7 +14,7 @@ class CompanyFragment : Fragment(R.layout.fragment_company) {

// We use special interface for navigating from this module
fragment_company__button.setOnClickListener {
CompanyDI.companyFragmentRouterSource?.moveToCompanyDetails()
findNavController().navigate(R.id.action__CompanyFragment__to__CompanyDetailsFragment)
}
}

Expand Down

This file was deleted.

This file was deleted.

This file was deleted.

Expand Up @@ -11,6 +11,9 @@
android:label="@string/fragment_company__title"
tools:layout="@layout/fragment_company">

<!-- Define deep link for other features -->
<deepLink app:uri="companyflow://company" />

<action
android:id="@+id/action__CompanyFragment__to__CompanyDetailsFragment"
app:destination="@id/CompanyDetailsFragment" />
Expand Down
1 change: 1 addition & 0 deletions features/vacancy/build.gradle.kts
Expand Up @@ -2,6 +2,7 @@ plugins {
id("com.android.library")
kotlin("android")
kotlin("android.extensions")
id("androidx.navigation.safeargs.kotlin")
}

repositories {
Expand Down
Expand Up @@ -3,8 +3,9 @@ package com.aaglobal.jnc_playground.vacancy
import android.os.Bundle
import android.util.Log
import android.view.View
import androidx.core.net.toUri
import androidx.fragment.app.Fragment
import com.aaglobal.jnc_playground.vacancy.di.VacancyDI
import androidx.navigation.fragment.findNavController
import kotlinx.android.synthetic.main.fragment_vacancy.*
import kotlin.random.Random

Expand All @@ -27,12 +28,17 @@ class VacancyFragment : Fragment(R.layout.fragment_vacancy) {
fragment_vacancy__text__title.text = getString(R.string.fragment_vacancy__title, vacancyId)

fragment_vacancy__button__next_vacancy.setOnClickListener {
// We lose possibility to use `*Directions` classes
VacancyDI.vacancyRouterSource?.openNextVacancy("${vacancyId}+${Random.nextInt(10)}")
// As we defined part of navigation graph for this screen, we can use actions and navigation controllers
val newVacancyId = "${vacancyId}+${Random.nextInt(10)}"
findNavController().navigate(
VacancyFragmentDirections.actionVacancyFragmentToVacancyFragment(newVacancyId)
)
}

fragment_vacancy__button__open_company_flow.setOnClickListener {
VacancyDI.vacancyRouterSource?.openCompanyFlow()
// Navigation through deep link
val companyFlowUri = "companyflow://company".toUri()
findNavController().navigate(companyFlowUri)
}
}

Expand Down

This file was deleted.

This file was deleted.

Expand Up @@ -16,16 +16,13 @@
app:argType="string"
app:nullable="false" />

<!-- Define deep links for navigation from other features -->
<deepLink app:uri="vacancyFlow://openScreen/{vacancyId}" />

<action
android:id="@+id/action__VacancyFragment__to__VacancyFragment"
app:destination="@id/VacancyFragment" />

<action
android:id="@+id/action__VacancyFragment__to__CompanyFlow"
app:destination="@id/company_flow__nav_graph" />

</fragment>

<include app:graph="@navigation/company_flow__nav_graph" />

</navigation>

0 comments on commit 1bcbb70

Please sign in to comment.