Skip to content

Commit

Permalink
Define routing interfaces for company flow, setup navigation through …
Browse files Browse the repository at this point in the history
…interfaces between main module and company flow
  • Loading branch information
PStrelchenko committed Aug 16, 2020
1 parent 2c9db88 commit 1fcecd0
Show file tree
Hide file tree
Showing 6 changed files with 68 additions and 16 deletions.
Expand Up @@ -5,8 +5,11 @@ import android.view.View
import androidx.fragment.app.Fragment
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.company.di.CompanyDI
import com.aaglobal.jnc_playground.company.routing.CompanyFragmentDetailsRouterSource
import com.aaglobal.jnc_playground.company.routing.CompanyFragmentRouterSource
import com.aaglobal.jnc_playground.core.utils.addFragmentLossIfNotExist
import com.aaglobal.jnc_playground.company.CompanyDetailsFragment
import com.aaglobal.jnc_playground.ui.vacancy.VacancyFragmentArgs
import com.aaglobal.jnc_playground.ui.vacancy_list.VacancyListFragment
import com.aaglobal.jnc_playground.ui.vacancy_list.VacancyListRouterSource
Expand All @@ -22,12 +25,15 @@ class SearchContainerFragment : Fragment(R.layout.fragment_search_container) {
// Read result from nested navigation flow
val companyFlowResult = findNavController().currentBackStackEntry
?.savedStateHandle
?.remove<Boolean>(CompanyDetailsFragment.COMPANY_FLOW_RESULT_FLAG)
?.remove<Boolean>(COMPANY_FLOW_RESULT_FLAG)
fragment_search_container__text__company_flow_result.text = getString(
R.string.fragment_search_container__company_flow_result, companyFlowResult?.toString()
)

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

Expand All @@ -53,4 +59,23 @@ class SearchContainerFragment : Fragment(R.layout.fragment_search_container) {
)
}


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

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

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


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

/**
* To return on screen that started this flow, we use `popBackStack` function.
*
* Such method allows us don't think about propagating "start" screen @id
*/

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

// At this line, "findNavController().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 androidx.navigation.fragment.findNavController
import com.aaglobal.jnc_playground.company.di.CompanyDI
import kotlinx.android.synthetic.main.fragment_company.*


Expand All @@ -12,8 +12,9 @@ class CompanyFragment : Fragment(R.layout.fragment_company) {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)

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

Expand Down
@@ -0,0 +1,18 @@
package com.aaglobal.jnc_playground.company.di

import com.aaglobal.jnc_playground.company.routing.CompanyFragmentDetailsRouterSource
import com.aaglobal.jnc_playground.company.routing.CompanyFragmentRouterSource


/**
* I need to init this object before I start navigating into Companies flow.
*
* In real app you may be use some DI-framework (e.g. Toothpick) and bind implementations of this interfaces to
* appropriate structures of this DI-framework.
*/
object CompanyDI {

var companyFragmentRouterSource: CompanyFragmentRouterSource? = null
var companyFragmentDetailsRouterSource: CompanyFragmentDetailsRouterSource? = null

}
@@ -0,0 +1,8 @@
package com.aaglobal.jnc_playground.company.routing


interface CompanyFragmentDetailsRouterSource {

fun finishCompanyFlow(flowResult: Boolean)

}
@@ -0,0 +1,8 @@
package com.aaglobal.jnc_playground.company.routing


interface CompanyFragmentRouterSource {

fun moveToCompanyDetails()

}

0 comments on commit 1fcecd0

Please sign in to comment.