From e88566b241ffd3001022acf247109ad8b8a2ac08 Mon Sep 17 00:00:00 2001
From: Mohamed <mohamed.metwalli@sap.com>
Date: Thu, 6 May 2021 11:44:13 +0200
Subject: [PATCH] Navigation enhancements  (DEV) (#3047)

* Enhance navigation logic

* Renaming

* lint

* Revert onAcivityResult

* Update InformationFragment.kt

* Remove Home menu

* Fix merge conflicts

* Lint
---
 .../survey/consent/SurveyConsentFragment.kt   |  4 +-
 .../ui/details/TracingDetailsFragment.kt      |  7 +-
 .../ui/settings/SettingsTracingFragment.kt    | 63 ++++++-------
 .../information/InformationAboutFragment.kt   |  4 +-
 .../information/InformationContactFragment.kt | 12 ++-
 .../ui/information/InformationFragment.kt     |  8 +-
 .../information/InformationLegalFragment.kt   |  4 +-
 .../InformationTechnicalFragment.kt           |  4 +-
 .../information/InformationTermsFragment.kt   |  4 +-
 .../InteroperabilityConfigurationFragment.kt  |  4 +-
 .../rki/coronawarnapp/ui/main/MainActivity.kt |  7 --
 .../ui/main/home/HomeFragment.kt              | 14 +--
 .../coronawarnapp/ui/main/home/HomeMenu.kt    | 49 -----------
 .../ui/main/overview/MainOverviewFragment.kt  |  4 +-
 .../ui/main/share/MainShareFragment.kt        |  8 +-
 .../ui/onboarding/OnboardingFragment.kt       |  4 +-
 .../ui/settings/SettingsResetFragment.kt      |  4 +-
 .../SettingsBackgroundPriorityFragment.kt     |  3 +-
 .../NotificationSettingsFragment.kt           |  4 +-
 .../ui/settings/start/SettingsFragment.kt     |  4 +-
 .../fragment/SubmissionContactFragment.kt     |  8 +-
 .../submission/tan/SubmissionTanFragment.kt   |  6 +-
 .../SubmissionYourConsentFragment.kt          |  4 +-
 .../util/ExternalActionHelper.kt              | 88 ++++++-------------
 .../errors/RecoveryByResetDialogFactory.kt    |  4 +-
 .../main/res/layout/home_fragment_layout.xml  | 17 ++--
 .../src/main/res/menu/menu_main.xml           | 10 +--
 .../util/ExternalActionHelperTest.kt          | 47 +++++-----
 28 files changed, 143 insertions(+), 256 deletions(-)
 delete mode 100644 Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/home/HomeMenu.kt

diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/datadonation/survey/consent/SurveyConsentFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/datadonation/survey/consent/SurveyConsentFragment.kt
index 2042fb57b..9935ba7d6 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/datadonation/survey/consent/SurveyConsentFragment.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/datadonation/survey/consent/SurveyConsentFragment.kt
@@ -8,7 +8,7 @@ import androidx.navigation.fragment.navArgs
 import de.rki.coronawarnapp.R
 import de.rki.coronawarnapp.databinding.SurveyConsentFragmentBinding
 import de.rki.coronawarnapp.util.DialogHelper
-import de.rki.coronawarnapp.util.ExternalActionHelper
+import de.rki.coronawarnapp.util.ExternalActionHelper.openUrl
 import de.rki.coronawarnapp.util.di.AutoInject
 import de.rki.coronawarnapp.util.ui.doNavigate
 import de.rki.coronawarnapp.util.ui.observe2
@@ -48,7 +48,7 @@ class SurveyConsentFragment : Fragment(R.layout.survey_consent_fragment), AutoIn
                     activity?.onBackPressed()
 
                 is SurveyConsentNavigationEvents.NavigateWeb -> {
-                    ExternalActionHelper.openUrl(this, event.url)
+                    openUrl(event.url)
                     popBackStack()
                 }
                 is SurveyConsentNavigationEvents.NavigateToMoreInformationScreen -> {
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/tracing/ui/details/TracingDetailsFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/tracing/ui/details/TracingDetailsFragment.kt
index 283bcea25..94891a7dd 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/tracing/ui/details/TracingDetailsFragment.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/tracing/ui/details/TracingDetailsFragment.kt
@@ -9,7 +9,7 @@ import androidx.recyclerview.widget.DefaultItemAnimator
 import androidx.recyclerview.widget.LinearLayoutManager
 import de.rki.coronawarnapp.R
 import de.rki.coronawarnapp.databinding.TracingDetailsFragmentLayoutBinding
-import de.rki.coronawarnapp.util.ExternalActionHelper
+import de.rki.coronawarnapp.util.ExternalActionHelper.openUrl
 import de.rki.coronawarnapp.util.di.AutoInject
 import de.rki.coronawarnapp.util.getDrawableCompat
 import de.rki.coronawarnapp.util.lists.diffutil.update
@@ -58,10 +58,7 @@ class TracingDetailsFragment : Fragment(R.layout.tracing_details_fragment_layout
                 is TracingDetailsNavigationEvents.NavigateToSurveyConsentFragment -> doNavigate(
                     TracingDetailsFragmentDirections.actionRiskDetailsFragmentToSurveyConsentFragment(it.type)
                 )
-                is TracingDetailsNavigationEvents.NavigateToSurveyUrlInBrowser -> ExternalActionHelper.openUrl(
-                    this,
-                    it.url
-                )
+                is TracingDetailsNavigationEvents.NavigateToSurveyUrlInBrowser -> openUrl(it.url)
             }
         }
 
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/tracing/ui/settings/SettingsTracingFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/tracing/ui/settings/SettingsTracingFragment.kt
index 3c2da3aa5..e6c4f67d8 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/tracing/ui/settings/SettingsTracingFragment.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/tracing/ui/settings/SettingsTracingFragment.kt
@@ -12,7 +12,7 @@ import de.rki.coronawarnapp.nearby.InternalExposureNotificationClient
 import de.rki.coronawarnapp.tracing.ui.TracingConsentDialog
 import de.rki.coronawarnapp.tracing.ui.settings.SettingsTracingFragmentViewModel.Event
 import de.rki.coronawarnapp.util.DialogHelper
-import de.rki.coronawarnapp.util.ExternalActionHelper
+import de.rki.coronawarnapp.util.ExternalActionHelper.openDeviceSettings
 import de.rki.coronawarnapp.util.di.AutoInject
 import de.rki.coronawarnapp.util.ui.doNavigate
 import de.rki.coronawarnapp.util.ui.observe2
@@ -30,7 +30,7 @@ import javax.inject.Inject
 class SettingsTracingFragment : Fragment(R.layout.fragment_settings_tracing), AutoInject {
 
     @Inject lateinit var viewModelFactory: CWAViewModelFactoryProvider.Factory
-    private val vm: SettingsTracingFragmentViewModel by cwaViewModels(
+    private val viewModel: SettingsTracingFragmentViewModel by cwaViewModels(
         ownerProducer = { requireActivity().viewModelStore },
         factoryProducer = { viewModelFactory }
     )
@@ -40,10 +40,10 @@ class SettingsTracingFragment : Fragment(R.layout.fragment_settings_tracing), Au
     override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
         super.onViewCreated(view, savedInstanceState)
 
-        vm.loggingPeriod.observe2(this) {
+        viewModel.loggingPeriod.observe2(this) {
             binding.loggedPeriod = it
         }
-        vm.tracingSettingsState.observe2(this) { state ->
+        viewModel.tracingSettingsState.observe2(this) { state ->
             binding.settingsTracingState = state
 
             binding.switchRow.apply {
@@ -58,24 +58,22 @@ class SettingsTracingFragment : Fragment(R.layout.fragment_settings_tracing), Au
             }
         }
 
-        vm.events.observe2(this) {
+        viewModel.events.observe2(this) {
             when (it) {
                 is Event.RequestPermissions -> it.permissionRequest.invoke(requireActivity())
-                Event.ManualCheckingDialog -> showManualCheckingRequiredDialog()
-                is Event.TracingConsentDialog -> {
-                    TracingConsentDialog(requireContext()).show(
-                        onConsentGiven = { it.onConsentResult(true) },
-                        onConsentDeclined = { it.onConsentResult(false) }
-                    )
-                }
+                is Event.ManualCheckingDialog -> showManualCheckingRequiredDialog()
+                is Event.TracingConsentDialog -> TracingConsentDialog(requireContext()).show(
+                    onConsentGiven = { it.onConsentResult(true) },
+                    onConsentDeclined = { it.onConsentResult(false) }
+                )
             }
         }
 
-        vm.isTracingSwitchChecked.observe2(this) { checked ->
+        viewModel.isTracingSwitchChecked.observe2(this) { checked ->
             binding.switchRow.setChecked(checked)
         }
 
-        vm.ensErrorEvents.observe2(this) { error ->
+        viewModel.ensErrorEvents.observe2(this) { error ->
             error.toErrorDialogBuilder(requireContext()).show()
         }
 
@@ -88,42 +86,31 @@ class SettingsTracingFragment : Fragment(R.layout.fragment_settings_tracing), Au
     }
 
     override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
-        vm.handleActivityResult(requestCode, resultCode, data)
+        viewModel.handleActivityResult(requestCode, resultCode, data)
     }
 
-    private fun setButtonOnClickListener() {
-
-        binding.toolbar.setNavigationOnClickListener {
+    private fun setButtonOnClickListener() = with(binding) {
+        toolbar.setNavigationOnClickListener {
             popBackStack()
         }
 
-        val bluetooth = binding.settingsTracingStatusBluetooth.tracingStatusCardButton
-        bluetooth.setOnClickListener {
-            ExternalActionHelper.toMainSettings(requireContext())
+        settingsTracingStatusBluetooth.tracingStatusCardButton.setOnClickListener {
+            openDeviceSettings()
         }
 
-        val location = binding.settingsTracingStatusLocation.tracingStatusCardButton
-        location.setOnClickListener {
-            ExternalActionHelper.toMainSettings(requireContext())
+        settingsTracingStatusLocation.tracingStatusCardButton.setOnClickListener {
+            openDeviceSettings()
         }
 
-        val interoperability = binding.settingsInteroperabilityRow
-        interoperability.setOnClickListener {
-            navigateToInteroperability()
+        settingsInteroperabilityRow.setOnClickListener {
+            doNavigate(
+                SettingsTracingFragmentDirections.actionSettingsTracingFragmentToInteropCountryConfigurationFragment()
+            )
         }
     }
 
-    private fun onTracingToggled(isChecked: Boolean) {
-        if (isChecked)
-            vm.turnTracingOn()
-        else
-            vm.turnTracingOff()
-    }
-
-    private fun navigateToInteroperability() {
-        doNavigate(
-            SettingsTracingFragmentDirections.actionSettingsTracingFragmentToInteropCountryConfigurationFragment()
-        )
+    private fun onTracingToggled(isChecked: Boolean) = with(viewModel) {
+        if (isChecked) turnTracingOn() else turnTracingOff()
     }
 
     private fun showManualCheckingRequiredDialog() {
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationAboutFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationAboutFragment.kt
index 82aed69cd..60ef5d4f7 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationAboutFragment.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationAboutFragment.kt
@@ -8,7 +8,7 @@ import android.view.accessibility.AccessibilityEvent
 import androidx.fragment.app.Fragment
 import de.rki.coronawarnapp.R
 import de.rki.coronawarnapp.databinding.FragmentInformationAboutBinding
-import de.rki.coronawarnapp.ui.main.MainActivity
+import de.rki.coronawarnapp.util.ui.popBackStack
 import de.rki.coronawarnapp.util.ui.viewBindingLazy
 
 /**
@@ -42,7 +42,7 @@ class InformationAboutFragment : Fragment(R.layout.fragment_information_about) {
 
     private fun setButtonOnClickListener() {
         binding.informationAboutHeader.headerButtonBack.buttonIcon.setOnClickListener {
-            (activity as MainActivity).goBack()
+            popBackStack()
         }
     }
 }
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationContactFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationContactFragment.kt
index 34ca2c6cf..ad4112ba4 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationContactFragment.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationContactFragment.kt
@@ -6,9 +6,9 @@ import android.view.accessibility.AccessibilityEvent
 import androidx.fragment.app.Fragment
 import de.rki.coronawarnapp.R
 import de.rki.coronawarnapp.databinding.FragmentInformationContactBinding
-import de.rki.coronawarnapp.ui.main.MainActivity
-import de.rki.coronawarnapp.util.ExternalActionHelper
+import de.rki.coronawarnapp.util.ExternalActionHelper.callPhone
 import de.rki.coronawarnapp.util.linkifyPhoneNumbers
+import de.rki.coronawarnapp.util.ui.popBackStack
 import de.rki.coronawarnapp.util.ui.viewBindingLazy
 
 /**
@@ -32,15 +32,13 @@ class InformationContactFragment : Fragment(R.layout.fragment_information_contac
 
     private fun setButtonOnClickListener() {
         binding.informationContactHeader.headerButtonBack.buttonIcon.setOnClickListener {
-            (activity as MainActivity).goBack()
+            popBackStack()
         }
         binding.informationContactNavigationRowPhone.navigationRow.setOnClickListener {
-            val number = getString(R.string.information_contact_phone_call_number)
-            ExternalActionHelper.call(this, number)
+            callPhone(getString(R.string.information_contact_phone_call_number))
         }
         binding.informationContactNavigationRowInternationalPhone.navigationRow.setOnClickListener {
-            val number = getString(R.string.information_contact_button_international_phone)
-            ExternalActionHelper.call(this, number)
+            callPhone(getString(R.string.information_contact_button_international_phone))
         }
     }
 }
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationFragment.kt
index c18bdc0f6..0f9f90ed9 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationFragment.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationFragment.kt
@@ -9,11 +9,11 @@ import androidx.fragment.app.Fragment
 import com.google.android.gms.nearby.exposurenotification.ExposureNotificationClient
 import de.rki.coronawarnapp.R
 import de.rki.coronawarnapp.databinding.FragmentInformationBinding
-import de.rki.coronawarnapp.ui.main.MainActivity
-import de.rki.coronawarnapp.util.ExternalActionHelper
+import de.rki.coronawarnapp.util.ExternalActionHelper.openUrl
 import de.rki.coronawarnapp.util.di.AutoInject
 import de.rki.coronawarnapp.util.ui.doNavigate
 import de.rki.coronawarnapp.util.ui.observe2
+import de.rki.coronawarnapp.util.ui.popBackStack
 import de.rki.coronawarnapp.util.ui.setGone
 import de.rki.coronawarnapp.util.ui.viewBindingLazy
 import de.rki.coronawarnapp.util.viewmodel.CWAViewModelFactoryProvider
@@ -95,7 +95,7 @@ class InformationFragment : Fragment(R.layout.fragment_information), AutoInject
             )
         }
         binding.informationHelp.mainRow.setOnClickListener {
-            ExternalActionHelper.openUrl(this, requireContext().getString(R.string.main_about_link))
+            openUrl(getString(R.string.main_about_link))
         }
         binding.informationLegal.mainRow.setOnClickListener {
             doNavigate(
@@ -113,7 +113,7 @@ class InformationFragment : Fragment(R.layout.fragment_information), AutoInject
             )
         }
         binding.informationHeader.headerButtonBack.buttonIcon.setOnClickListener {
-            (activity as MainActivity).goBack()
+            popBackStack()
         }
         binding.informationRelease.mainRow.setOnClickListener {
             doNavigate(
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationLegalFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationLegalFragment.kt
index 560b64eb7..2bf010437 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationLegalFragment.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationLegalFragment.kt
@@ -7,8 +7,8 @@ import android.view.accessibility.AccessibilityEvent
 import androidx.fragment.app.Fragment
 import de.rki.coronawarnapp.R
 import de.rki.coronawarnapp.databinding.FragmentInformationLegalBinding
-import de.rki.coronawarnapp.ui.main.MainActivity
 import de.rki.coronawarnapp.util.convertToHyperlink
+import de.rki.coronawarnapp.util.ui.popBackStack
 import de.rki.coronawarnapp.util.ui.viewBindingLazy
 
 /**
@@ -41,7 +41,7 @@ class InformationLegalFragment : Fragment(R.layout.fragment_information_legal) {
 
     private fun setButtonOnClickListener() {
         binding.informationLegalHeader.headerButtonBack.buttonIcon.setOnClickListener {
-            (activity as MainActivity).goBack()
+            popBackStack()
         }
     }
 }
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationTechnicalFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationTechnicalFragment.kt
index 0a98ff88b..fe10de37f 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationTechnicalFragment.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationTechnicalFragment.kt
@@ -6,7 +6,7 @@ import android.view.accessibility.AccessibilityEvent
 import androidx.fragment.app.Fragment
 import de.rki.coronawarnapp.R
 import de.rki.coronawarnapp.databinding.FragmentInformationTechnicalBinding
-import de.rki.coronawarnapp.ui.main.MainActivity
+import de.rki.coronawarnapp.util.ui.popBackStack
 import de.rki.coronawarnapp.util.ui.viewBindingLazy
 
 /**
@@ -31,7 +31,7 @@ class InformationTechnicalFragment : Fragment(R.layout.fragment_information_tech
 
     private fun setButtonOnClickListener() {
         binding.informationTechnicalHeader.headerButtonBack.buttonIcon.setOnClickListener {
-            (activity as MainActivity).goBack()
+            popBackStack()
         }
     }
 }
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationTermsFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationTermsFragment.kt
index 5c0046ebe..63c99ca82 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationTermsFragment.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationTermsFragment.kt
@@ -6,7 +6,7 @@ import android.view.accessibility.AccessibilityEvent
 import androidx.fragment.app.Fragment
 import de.rki.coronawarnapp.R
 import de.rki.coronawarnapp.databinding.FragmentInformationTermsBinding
-import de.rki.coronawarnapp.ui.main.MainActivity
+import de.rki.coronawarnapp.util.ui.popBackStack
 import de.rki.coronawarnapp.util.ui.viewBindingLazy
 
 /**
@@ -28,7 +28,7 @@ class InformationTermsFragment : Fragment(R.layout.fragment_information_terms) {
 
     private fun setButtonOnClickListener() {
         binding.informationTermsHeader.headerButtonBack.buttonIcon.setOnClickListener {
-            (activity as MainActivity).goBack()
+            popBackStack()
         }
     }
 }
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/interoperability/InteroperabilityConfigurationFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/interoperability/InteroperabilityConfigurationFragment.kt
index 29b4061f3..28cd0f394 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/interoperability/InteroperabilityConfigurationFragment.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/interoperability/InteroperabilityConfigurationFragment.kt
@@ -9,10 +9,10 @@ import androidx.fragment.app.Fragment
 import de.rki.coronawarnapp.CoronaWarnApplication
 import de.rki.coronawarnapp.R
 import de.rki.coronawarnapp.databinding.FragmentInteroperabilityConfigurationBinding
-import de.rki.coronawarnapp.ui.main.MainActivity
 import de.rki.coronawarnapp.util.ConnectivityHelper
 import de.rki.coronawarnapp.util.di.AutoInject
 import de.rki.coronawarnapp.util.ui.observe2
+import de.rki.coronawarnapp.util.ui.popBackStack
 import de.rki.coronawarnapp.util.ui.viewBindingLazy
 import de.rki.coronawarnapp.util.viewmodel.CWAViewModelFactoryProvider
 import de.rki.coronawarnapp.util.viewmodel.cwaViewModels
@@ -56,7 +56,7 @@ class InteroperabilityConfigurationFragment :
 
         vm.navigateBack.observe2(this) {
             if (it) {
-                (requireActivity() as MainActivity).goBack()
+                popBackStack()
             }
         }
 
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/MainActivity.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/MainActivity.kt
index 4c29cfed0..159a0b9d5 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/MainActivity.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/MainActivity.kt
@@ -259,11 +259,4 @@ class MainActivity : AppCompatActivity(), HasAndroidInjector {
             data
         )
     }
-
-    /**
-     * Function is called from back buttons in fragments.
-     */
-    fun goBack() {
-        onBackPressed()
-    }
 }
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/home/HomeFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/home/HomeFragment.kt
index bda8566ff..1e3806426 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/home/HomeFragment.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/home/HomeFragment.kt
@@ -7,6 +7,7 @@ import android.view.accessibility.AccessibilityEvent
 import androidx.fragment.app.Fragment
 import androidx.navigation.NavGraph
 import androidx.navigation.fragment.findNavController
+import androidx.navigation.ui.onNavDestinationSelected
 import androidx.recyclerview.widget.DefaultItemAnimator
 import androidx.recyclerview.widget.LinearLayoutManager
 import de.rki.coronawarnapp.R
@@ -15,9 +16,10 @@ import de.rki.coronawarnapp.coronatest.type.CoronaTest
 import de.rki.coronawarnapp.databinding.HomeFragmentLayoutBinding
 import de.rki.coronawarnapp.tracing.ui.TracingExplanationDialog
 import de.rki.coronawarnapp.ui.main.home.popups.DeviceTimeIncorrectDialog
+import de.rki.coronawarnapp.util.CWADebug
 import de.rki.coronawarnapp.util.ContextExtensions.getColorCompat
 import de.rki.coronawarnapp.util.DialogHelper
-import de.rki.coronawarnapp.util.ExternalActionHelper
+import de.rki.coronawarnapp.util.ExternalActionHelper.openUrl
 import de.rki.coronawarnapp.util.di.AutoInject
 import de.rki.coronawarnapp.util.errors.RecoveryByResetDialogFactory
 import de.rki.coronawarnapp.util.lists.decorations.TopBottomPaddingDecorator
@@ -44,7 +46,6 @@ class HomeFragment : Fragment(R.layout.home_fragment_layout), AutoInject {
 
     val binding: HomeFragmentLayoutBinding by viewBindingLazy()
 
-    @Inject lateinit var homeMenu: HomeMenu
     @Inject lateinit var tracingExplanationDialog: TracingExplanationDialog
     @Inject lateinit var deviceTimeIncorrectDialog: DeviceTimeIncorrectDialog
 
@@ -53,7 +54,10 @@ class HomeFragment : Fragment(R.layout.home_fragment_layout), AutoInject {
     override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
         super.onViewCreated(view, savedInstanceState)
 
-        homeMenu.setupMenu(binding.toolbar)
+        with(binding.toolbar) {
+            menu.findItem(R.id.test_nav_graph).isVisible = CWADebug.isDeviceForTestersBuild
+            setOnMenuItemClickListener { it.onNavDestinationSelected(findNavController()) }
+        }
 
         viewModel.tracingHeaderState.observe2(this) {
             binding.tracingHeader = it
@@ -79,11 +83,11 @@ class HomeFragment : Fragment(R.layout.home_fragment_layout), AutoInject {
         }
 
         viewModel.openFAQUrlEvent.observe2(this) {
-            ExternalActionHelper.openUrl(this@HomeFragment, getString(R.string.main_about_link))
+            openUrl(getString(R.string.main_about_link))
         }
 
         viewModel.openIncompatibleEvent.observe2(this) {
-            ExternalActionHelper.openUrl(this@HomeFragment, getString(R.string.incompatible_link))
+            openUrl(getString(R.string.incompatible_link))
         }
 
         viewModel.openTraceLocationOrganizerFlow.observe2(this) {
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/home/HomeMenu.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/home/HomeMenu.kt
deleted file mode 100644
index 4189f6bd9..000000000
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/home/HomeMenu.kt
+++ /dev/null
@@ -1,49 +0,0 @@
-package de.rki.coronawarnapp.ui.main.home
-
-import android.view.MenuItem.SHOW_AS_ACTION_ALWAYS
-import androidx.appcompat.widget.Toolbar
-import androidx.navigation.NavController
-import androidx.navigation.fragment.findNavController
-import de.rki.coronawarnapp.R
-import de.rki.coronawarnapp.ui.doNavigate
-import de.rki.coronawarnapp.util.CWADebug
-import javax.inject.Inject
-
-class HomeMenu @Inject constructor(
-    private val homeFragment: HomeFragment
-) {
-
-    private val navController: NavController
-        get() = homeFragment.findNavController()
-
-    fun setupMenu(toolbar: Toolbar) = toolbar.apply {
-        inflateMenu(R.menu.menu_main)
-        menu.findItem(R.id.menu_test).isVisible = CWADebug.isDeviceForTestersBuild
-        menu.findItem(R.id.menu_share).setShowAsAction(SHOW_AS_ACTION_ALWAYS)
-        setOnMenuItemClickListener {
-            return@setOnMenuItemClickListener when (it.itemId) {
-                R.id.menu_share -> {
-                    navController.doNavigate(HomeFragmentDirections.actionMainFragmentToMainSharingFragment())
-                    true
-                }
-                R.id.menu_help -> {
-                    navController.doNavigate(HomeFragmentDirections.actionMainFragmentToMainOverviewFragment())
-                    true
-                }
-                R.id.menu_information -> {
-                    navController.doNavigate(HomeFragmentDirections.actionMainFragmentToInformationFragment())
-                    true
-                }
-                R.id.menu_settings -> {
-                    navController.doNavigate(HomeFragmentDirections.actionMainFragmentToSettingsFragment())
-                    true
-                }
-                R.id.menu_test -> {
-                    navController.doNavigate(HomeFragmentDirections.actionMainFragmentToTestNavGraph())
-                    true
-                }
-                else -> homeFragment.onOptionsItemSelected(it)
-            }
-        }
-    }
-}
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/overview/MainOverviewFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/overview/MainOverviewFragment.kt
index 0a4dce381..4696cb136 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/overview/MainOverviewFragment.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/overview/MainOverviewFragment.kt
@@ -6,7 +6,7 @@ import android.view.accessibility.AccessibilityEvent
 import androidx.fragment.app.Fragment
 import de.rki.coronawarnapp.R
 import de.rki.coronawarnapp.databinding.FragmentMainOverviewBinding
-import de.rki.coronawarnapp.ui.main.MainActivity
+import de.rki.coronawarnapp.util.ui.popBackStack
 import de.rki.coronawarnapp.util.ui.viewBindingLazy
 
 /**
@@ -32,7 +32,7 @@ class MainOverviewFragment : Fragment(R.layout.fragment_main_overview) {
 
     private fun setButtonOnClickListener() {
         binding.mainOverviewHeader.headerButtonBack.buttonIcon.setOnClickListener {
-            (activity as MainActivity).goBack()
+            popBackStack()
         }
     }
 }
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/share/MainShareFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/share/MainShareFragment.kt
index baf25b71c..0fb6b9eaf 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/share/MainShareFragment.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/share/MainShareFragment.kt
@@ -6,8 +6,8 @@ import android.view.accessibility.AccessibilityEvent
 import androidx.fragment.app.Fragment
 import de.rki.coronawarnapp.R
 import de.rki.coronawarnapp.databinding.FragmentMainShareBinding
-import de.rki.coronawarnapp.ui.main.MainActivity
-import de.rki.coronawarnapp.util.ExternalActionHelper
+import de.rki.coronawarnapp.util.ExternalActionHelper.shareText
+import de.rki.coronawarnapp.util.ui.popBackStack
 import de.rki.coronawarnapp.util.ui.viewBindingLazy
 
 /**
@@ -24,10 +24,10 @@ class MainShareFragment : Fragment(R.layout.fragment_main_share) {
 
     private fun setButtonOnClickListener() {
         binding.mainShareButton.setOnClickListener {
-            ExternalActionHelper.shareText(this, getString(R.string.main_share_message), null)
+            shareText(getString(R.string.main_share_message), null)
         }
         binding.mainShareHeader.headerButtonBack.buttonIcon.setOnClickListener {
-            (activity as MainActivity).goBack()
+            popBackStack()
         }
     }
 
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/onboarding/OnboardingFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/onboarding/OnboardingFragment.kt
index 38f0c37df..dc080acf5 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/onboarding/OnboardingFragment.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/onboarding/OnboardingFragment.kt
@@ -7,7 +7,7 @@ import androidx.annotation.VisibleForTesting
 import androidx.fragment.app.Fragment
 import de.rki.coronawarnapp.R
 import de.rki.coronawarnapp.databinding.FragmentOnboardingBinding
-import de.rki.coronawarnapp.util.ExternalActionHelper
+import de.rki.coronawarnapp.util.ExternalActionHelper.openUrl
 import de.rki.coronawarnapp.util.ui.doNavigate
 import de.rki.coronawarnapp.util.ui.viewBindingLazy
 import java.util.Locale
@@ -41,7 +41,7 @@ class OnboardingFragment : Fragment(R.layout.fragment_onboarding) {
     }
 
     private fun openEasyLanguageLink() {
-        ExternalActionHelper.openUrl(this, getString(R.string.onboarding_tracing_easy_language_explanation_url))
+        openUrl(getString(R.string.onboarding_tracing_easy_language_explanation_url))
     }
 
     override fun onResume() {
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/settings/SettingsResetFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/settings/SettingsResetFragment.kt
index c1af5db43..8cf49a835 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/settings/SettingsResetFragment.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/settings/SettingsResetFragment.kt
@@ -7,12 +7,12 @@ import android.view.accessibility.AccessibilityEvent
 import androidx.fragment.app.Fragment
 import de.rki.coronawarnapp.R
 import de.rki.coronawarnapp.databinding.FragmentSettingsResetBinding
-import de.rki.coronawarnapp.ui.main.MainActivity
 import de.rki.coronawarnapp.ui.onboarding.OnboardingActivity
 import de.rki.coronawarnapp.util.ContextExtensions.getColorCompat
 import de.rki.coronawarnapp.util.DialogHelper
 import de.rki.coronawarnapp.util.di.AutoInject
 import de.rki.coronawarnapp.util.ui.observe2
+import de.rki.coronawarnapp.util.ui.popBackStack
 import de.rki.coronawarnapp.util.ui.viewBindingLazy
 import de.rki.coronawarnapp.util.viewmodel.CWAViewModelFactoryProvider
 import de.rki.coronawarnapp.util.viewmodel.cwaViewModels
@@ -38,7 +38,7 @@ class SettingsResetFragment : Fragment(R.layout.fragment_settings_reset), AutoIn
         vm.clickEvent.observe2(this) {
             when (it) {
                 is SettingsEvents.ResetApp -> confirmReset()
-                is SettingsEvents.GoBack -> (activity as MainActivity).goBack()
+                is SettingsEvents.GoBack -> popBackStack()
                 is SettingsEvents.GoToOnboarding -> navigateToOnboarding()
             }
         }
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/settings/backgroundpriority/SettingsBackgroundPriorityFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/settings/backgroundpriority/SettingsBackgroundPriorityFragment.kt
index 4edfee1a4..e4ae1166f 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/settings/backgroundpriority/SettingsBackgroundPriorityFragment.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/settings/backgroundpriority/SettingsBackgroundPriorityFragment.kt
@@ -10,6 +10,7 @@ import de.rki.coronawarnapp.ui.base.startActivitySafely
 import de.rki.coronawarnapp.ui.main.MainActivity
 import de.rki.coronawarnapp.util.di.AutoInject
 import de.rki.coronawarnapp.util.ui.observe2
+import de.rki.coronawarnapp.util.ui.popBackStack
 import de.rki.coronawarnapp.util.ui.viewBindingLazy
 import de.rki.coronawarnapp.util.viewmodel.CWAViewModelFactoryProvider
 import de.rki.coronawarnapp.util.viewmodel.cwaViewModels
@@ -60,7 +61,7 @@ class SettingsBackgroundPriorityFragment : Fragment(R.layout.fragment_settings_b
 
         // back navigation
         binding.settingsBackgroundPriorityHeader.headerButtonBack.buttonIcon.setOnClickListener {
-            (activity as MainActivity).goBack()
+            popBackStack()
         }
     }
 }
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/settings/notifications/NotificationSettingsFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/settings/notifications/NotificationSettingsFragment.kt
index bd9eac9b2..f5f75de0b 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/settings/notifications/NotificationSettingsFragment.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/settings/notifications/NotificationSettingsFragment.kt
@@ -6,7 +6,7 @@ import android.view.accessibility.AccessibilityEvent
 import androidx.fragment.app.Fragment
 import de.rki.coronawarnapp.R
 import de.rki.coronawarnapp.databinding.FragmentSettingsNotificationsBinding
-import de.rki.coronawarnapp.util.ExternalActionHelper
+import de.rki.coronawarnapp.util.ExternalActionHelper.openAppNotificationSettings
 import de.rki.coronawarnapp.util.di.AutoInject
 import de.rki.coronawarnapp.util.ui.observe2
 import de.rki.coronawarnapp.util.ui.popBackStack
@@ -53,7 +53,7 @@ class NotificationSettingsFragment :
             popBackStack()
         }
         binding.settingsNotificationsCard.tracingStatusCardButton.setOnClickListener {
-            ExternalActionHelper.toNotifications(requireContext())
+            requireContext().openAppNotificationSettings()
         }
     }
 }
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/settings/start/SettingsFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/settings/start/SettingsFragment.kt
index 93995c103..e2c60ec83 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/settings/start/SettingsFragment.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/settings/start/SettingsFragment.kt
@@ -8,9 +8,9 @@ import androidx.navigation.fragment.findNavController
 import de.rki.coronawarnapp.R
 import de.rki.coronawarnapp.databinding.FragmentSettingsBinding
 import de.rki.coronawarnapp.ui.doNavigate
-import de.rki.coronawarnapp.ui.main.MainActivity
 import de.rki.coronawarnapp.util.di.AutoInject
 import de.rki.coronawarnapp.util.ui.observe2
+import de.rki.coronawarnapp.util.ui.popBackStack
 import de.rki.coronawarnapp.util.ui.viewBindingLazy
 import de.rki.coronawarnapp.util.viewmodel.CWAViewModelFactoryProvider
 import de.rki.coronawarnapp.util.viewmodel.cwaViewModels
@@ -87,7 +87,7 @@ class SettingsFragment : Fragment(R.layout.fragment_settings), AutoInject {
         }
 
         goBack.setOnClickListener {
-            (activity as MainActivity).goBack()
+            popBackStack()
         }
     }
 }
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/fragment/SubmissionContactFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/fragment/SubmissionContactFragment.kt
index 1cfcb3edc..7d6e8d04f 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/fragment/SubmissionContactFragment.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/fragment/SubmissionContactFragment.kt
@@ -9,7 +9,7 @@ import de.rki.coronawarnapp.R
 import de.rki.coronawarnapp.databinding.FragmentSubmissionContactBinding
 import de.rki.coronawarnapp.ui.submission.viewmodel.SubmissionContactViewModel
 import de.rki.coronawarnapp.ui.submission.viewmodel.SubmissionNavigationEvents
-import de.rki.coronawarnapp.util.ExternalActionHelper
+import de.rki.coronawarnapp.util.ExternalActionHelper.callPhone
 import de.rki.coronawarnapp.util.di.AutoInject
 import de.rki.coronawarnapp.util.linkifyPhoneNumbers
 import de.rki.coronawarnapp.util.ui.doNavigate
@@ -58,13 +58,11 @@ class SubmissionContactFragment : Fragment(R.layout.fragment_submission_contact)
         }
         binding.includeSubmissionContact.submissionContactNavigationRowPhone.navigationRow
             .setOnClickListener {
-                val number = getString(R.string.submission_contact_number_display)
-                ExternalActionHelper.call(this, number)
+                callPhone(getString(R.string.submission_contact_number_display))
             }
         binding.includeSubmissionContact.submissionContactNavigationRowInternationalPhone.navigationRow
             .setOnClickListener {
-                val number = getString(R.string.submission_contact_button_international_phone)
-                ExternalActionHelper.call(this, number)
+                callPhone(getString(R.string.submission_contact_button_international_phone))
             }
         binding.submissionContactButtonEnter.setOnClickListener {
             viewModel.onEnterTanPressed()
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/tan/SubmissionTanFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/tan/SubmissionTanFragment.kt
index 083d67a66..eaad5f6f9 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/tan/SubmissionTanFragment.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/tan/SubmissionTanFragment.kt
@@ -11,13 +11,13 @@ import de.rki.coronawarnapp.exception.http.BadRequestException
 import de.rki.coronawarnapp.exception.http.CwaClientError
 import de.rki.coronawarnapp.exception.http.CwaServerError
 import de.rki.coronawarnapp.exception.http.CwaWebException
-import de.rki.coronawarnapp.ui.main.MainActivity
 import de.rki.coronawarnapp.ui.submission.ApiRequestState
 import de.rki.coronawarnapp.ui.submission.viewmodel.SubmissionNavigationEvents
 import de.rki.coronawarnapp.util.DialogHelper
 import de.rki.coronawarnapp.util.di.AutoInject
 import de.rki.coronawarnapp.util.ui.doNavigate
 import de.rki.coronawarnapp.util.ui.observe2
+import de.rki.coronawarnapp.util.ui.popBackStack
 import de.rki.coronawarnapp.util.ui.setGone
 import de.rki.coronawarnapp.util.ui.viewBindingLazy
 import de.rki.coronawarnapp.util.viewmodel.CWAViewModelFactoryProvider
@@ -102,7 +102,9 @@ class SubmissionTanFragment : Fragment(R.layout.fragment_submission_tan), AutoIn
         binding.submissionTanRoot.sendAccessibilityEvent(AccessibilityEvent.TYPE_ANNOUNCEMENT)
     }
 
-    private fun goBack() = (activity as MainActivity).goBack()
+    private fun goBack() {
+        popBackStack()
+    }
 
     private fun buildErrorDialog(exception: CwaWebException): DialogHelper.DialogInstance {
         return when (exception) {
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/yourconsent/SubmissionYourConsentFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/yourconsent/SubmissionYourConsentFragment.kt
index 6fbff88ab..6c0ba694a 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/yourconsent/SubmissionYourConsentFragment.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/yourconsent/SubmissionYourConsentFragment.kt
@@ -8,10 +8,10 @@ import androidx.navigation.fragment.navArgs
 import de.rki.coronawarnapp.R
 import de.rki.coronawarnapp.bugreporting.ui.toErrorDialogBuilder
 import de.rki.coronawarnapp.databinding.FragmentSubmissionYourConsentBinding
-import de.rki.coronawarnapp.ui.main.MainActivity
 import de.rki.coronawarnapp.util.di.AutoInject
 import de.rki.coronawarnapp.util.ui.doNavigate
 import de.rki.coronawarnapp.util.ui.observe2
+import de.rki.coronawarnapp.util.ui.popBackStack
 import de.rki.coronawarnapp.util.ui.viewBindingLazy
 import de.rki.coronawarnapp.util.viewmodel.CWAViewModelFactoryProvider
 import de.rki.coronawarnapp.util.viewmodel.cwaViewModelsAssisted
@@ -56,7 +56,7 @@ class SubmissionYourConsentFragment : Fragment(R.layout.fragment_submission_your
 
         vm.clickEvent.observe2(this) {
             when (it) {
-                is SubmissionYourConsentEvents.GoBack -> (activity as MainActivity).goBack()
+                is SubmissionYourConsentEvents.GoBack -> popBackStack()
                 is SubmissionYourConsentEvents.GoLegal -> doNavigate(
                     SubmissionYourConsentFragmentDirections
                         .actionSubmissionYourConsentFragmentToInformationPrivacyFragment()
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/ExternalActionHelper.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/ExternalActionHelper.kt
index d9b1aa103..acc91f7c4 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/ExternalActionHelper.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/ExternalActionHelper.kt
@@ -15,18 +15,14 @@ import de.rki.coronawarnapp.exception.reporting.report
  *
  */
 object ExternalActionHelper {
-    private val TAG: String? = ExternalActionHelper::class.simpleName
-
     /**
      * Opens the share default overlay to provide the Corona-Warn-App installation link
-     *
-     * @param fragment
      * @param text
      * @param title
      */
-    fun shareText(fragment: Fragment, text: String, title: String?) {
+    fun Fragment.shareText(text: String, title: String?) {
         try {
-            fragment.startActivity(
+            startActivity(
                 Intent.createChooser(
                     Intent().apply {
                         action = Intent.ACTION_SEND
@@ -47,17 +43,12 @@ object ExternalActionHelper {
 
     /**
      * Opens the client default phone app and inserts a given number
-     *
-     * @param fragment
-     * @param uri
+     * @param phoneNumber
      */
-    fun call(fragment: Fragment, uri: String) {
+    fun Fragment.callPhone(phoneNumber: String) {
         try {
-            fragment.startActivity(
-                Intent(
-                    Intent.ACTION_DIAL,
-                    Uri.parse("tel:$uri")
-                )
+            startActivity(
+                Intent(Intent.ACTION_DIAL, Uri.parse("tel:$phoneNumber"))
             )
         } catch (exception: Exception) {
             // catch generic exception on call
@@ -70,17 +61,12 @@ object ExternalActionHelper {
 
     /**
      * Opens a given url in the client default browser
-     *
-     * @param fragment
      * @param url
      */
-    fun openUrl(fragment: Fragment, url: String) {
+    fun Fragment.openUrl(url: String) {
         try {
-            fragment.startActivity(
-                Intent(
-                    Intent.ACTION_VIEW,
-                    Uri.parse(url)
-                )
+            startActivity(
+                Intent(Intent.ACTION_VIEW, Uri.parse(url))
             )
         } catch (exception: Exception) {
             // catch generic exception on url navigation
@@ -92,47 +78,25 @@ object ExternalActionHelper {
         }
     }
 
-    /**
-     * Navigate the user to the os connection settings.
-     *
-     * @param context
-     */
-    fun toConnections(context: Context) {
-        try {
-            val intent = Intent(Settings.ACTION_WIRELESS_SETTINGS)
-            context.startActivity(intent)
-        } catch (exception: Exception) {
-            // catch generic exception on settings navigation
-            // most likely due to device / rom specific intent issue
-            ExternalActionException(exception).report(
-                ExceptionCategory.UI
-            )
-        }
-    }
-
     /**
      * Navigate the user to the os notification settings.
-     *
-     * @param context
      */
-    fun toNotifications(context: Context) {
+    fun Context.openAppNotificationSettings() {
         try {
-            val intent = Intent()
-            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
-                intent.action = Settings.ACTION_APP_NOTIFICATION_SETTINGS
-                intent.putExtra(
-                    Settings.EXTRA_APP_PACKAGE,
-                    context.packageName
-                )
-            } else {
-                intent.action = "android.settings.APP_NOTIFICATION_SETTINGS"
-                intent.putExtra(
-                    "app_package",
-                    context.packageName
-                )
-                intent.putExtra("app_uid", context.applicationInfo.uid)
+            val intent = Intent().apply {
+                when {
+                    Build.VERSION.SDK_INT >= Build.VERSION_CODES.O -> {
+                        action = Settings.ACTION_APP_NOTIFICATION_SETTINGS
+                        putExtra(Settings.EXTRA_APP_PACKAGE, packageName)
+                    }
+                    else -> {
+                        action = "android.settings.APP_NOTIFICATION_SETTINGS"
+                        putExtra("app_package", packageName)
+                        putExtra("app_uid", applicationInfo.uid)
+                    }
+                }
             }
-            context.startActivity(intent)
+            startActivity(intent)
         } catch (exception: Exception) {
             // catch generic exception on settings navigation
             // most likely due to device / rom specific intent issue
@@ -145,13 +109,11 @@ object ExternalActionHelper {
     /**
      * Navigate the user to the os settings as navigation to
      * bluetooth settings directly is not reliable for all devices
-     *
-     * @param context
      */
-    fun toMainSettings(context: Context) {
+    fun Fragment.openDeviceSettings() {
         try {
             val intent = Intent(Settings.ACTION_SETTINGS)
-            context.startActivity(intent)
+            startActivity(intent)
         } catch (exception: Exception) {
             // catch generic exception on settings navigation
             // most likely due to device / rom specific intent issue
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/errors/RecoveryByResetDialogFactory.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/errors/RecoveryByResetDialogFactory.kt
index c8804aaad..f94c31280 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/errors/RecoveryByResetDialogFactory.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/errors/RecoveryByResetDialogFactory.kt
@@ -5,7 +5,7 @@ import androidx.annotation.StringRes
 import androidx.appcompat.app.AlertDialog
 import androidx.fragment.app.Fragment
 import de.rki.coronawarnapp.R
-import de.rki.coronawarnapp.util.ExternalActionHelper
+import de.rki.coronawarnapp.util.ExternalActionHelper.openUrl
 
 class RecoveryByResetDialogFactory(private val fragment: Fragment) {
 
@@ -27,7 +27,7 @@ class RecoveryByResetDialogFactory(private val fragment: Fragment) {
             .create()
         dialog.show()
         dialog.getButton(AlertDialog.BUTTON_NEUTRAL)?.setOnClickListener {
-            ExternalActionHelper.openUrl(fragment, context.getString(detailsLink))
+            fragment.openUrl(context.getString(detailsLink))
         }
     }
 }
diff --git a/Corona-Warn-App/src/main/res/layout/home_fragment_layout.xml b/Corona-Warn-App/src/main/res/layout/home_fragment_layout.xml
index 79b703795..234652b85 100644
--- a/Corona-Warn-App/src/main/res/layout/home_fragment_layout.xml
+++ b/Corona-Warn-App/src/main/res/layout/home_fragment_layout.xml
@@ -20,9 +20,10 @@
 
         <com.google.android.material.appbar.MaterialToolbar
             android:id="@+id/toolbar"
+            style="@style/CWAToolbar"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            style="@style/CWAToolbar"
+            app:menu="@menu/menu_main"
             app:popupTheme="@style/CWAToolbar.Menu">
             <ImageView
                 android:id="@+id/main_header_logo"
@@ -42,16 +43,16 @@
 
             <com.google.android.material.appbar.AppBarLayout
                 android:layout_width="match_parent"
-                android:theme="@style/CWAToolbar"
-                android:layout_height="wrap_content">
+                android:layout_height="wrap_content"
+                android:theme="@style/CWAToolbar">
 
-                <Toolbar
+                <com.google.android.material.appbar.MaterialToolbar
+                    android:id="@+id/main_tracing"
+                    style="@style/CWAToolbar"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
-                    android:elevation="8dp"
-                    style="@style/CWAToolbar"
-                    android:id="@+id/main_tracing"
                     android:clickable="true"
+                    android:elevation="8dp"
                     android:focusable="true"
                     android:foreground="?selectableItemBackground"
                     app:layout_scrollFlags="scroll|snap|enterAlways">
@@ -78,7 +79,7 @@
                         app:animation="@{tracingHeader.getTracingAnimation(context)}"
                         app:animation_tint="@{tracingHeader.getTracingTint(context)}" />
 
-                </Toolbar>
+                </com.google.android.material.appbar.MaterialToolbar>
 
             </com.google.android.material.appbar.AppBarLayout>
 
diff --git a/Corona-Warn-App/src/main/res/menu/menu_main.xml b/Corona-Warn-App/src/main/res/menu/menu_main.xml
index 12e95ff6c..494829eb6 100644
--- a/Corona-Warn-App/src/main/res/menu/menu_main.xml
+++ b/Corona-Warn-App/src/main/res/menu/menu_main.xml
@@ -4,7 +4,7 @@
     tools:context=".MainActivity">
 
     <item
-        android:id="@+id/menu_share"
+        android:id="@+id/mainSharingFragment"
         android:contentDescription="@string/button_share"
         android:icon="@drawable/ic_main_share"
         android:title="@string/button_share"
@@ -12,16 +12,16 @@
         app:showAsAction="always" />
 
     <item
-        android:id="@+id/menu_help"
+        android:id="@+id/mainOverviewFragment"
         android:title="@string/menu_help" />
     <item
-        android:id="@+id/menu_information"
+        android:id="@+id/informationFragment"
         android:title="@string/menu_information" />
     <item
-        android:id="@+id/menu_settings"
+        android:id="@+id/settingsFragment"
         android:title="@string/menu_settings" />
     <item
-        android:id="@+id/menu_test"
+        android:id="@+id/test_nav_graph"
         android:title="Test Menu"
         android:visible="false"
         tools:ignore="HardcodedText" />
diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/ExternalActionHelperTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/ExternalActionHelperTest.kt
index 45c6063ee..2d35e3e1d 100644
--- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/ExternalActionHelperTest.kt
+++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/ExternalActionHelperTest.kt
@@ -4,6 +4,10 @@ import android.content.Context
 import android.content.pm.ApplicationInfo
 import androidx.fragment.app.Fragment
 import de.rki.coronawarnapp.CoronaWarnApplication
+import de.rki.coronawarnapp.util.ExternalActionHelper.callPhone
+import de.rki.coronawarnapp.util.ExternalActionHelper.openAppNotificationSettings
+import de.rki.coronawarnapp.util.ExternalActionHelper.openUrl
+import de.rki.coronawarnapp.util.ExternalActionHelper.shareText
 import io.mockk.MockKAnnotations
 import io.mockk.Runs
 import io.mockk.every
@@ -30,51 +34,40 @@ class ExternalActionHelperTest : BaseTest() {
         mockkObject(CoronaWarnApplication)
     }
 
-    @Test
-    fun toConnectionsTest() {
-        every { context.startActivity(any()) } just Runs
-        ExternalActionHelper.toConnections(context = context)
-        verify(exactly = 1) { context.startActivity(any()) }
-    }
-
     @Test
     fun toNotificationsTest() {
         every { context.startActivity(any()) } just Runs
         every { context.packageName } returns "package_name"
         every { context.applicationInfo } returns applicationInfo
 
-        ExternalActionHelper.toNotifications(context = context)
-        verify(exactly = 1) { context.startActivity(any()) }
-    }
-
-    @Test
-    fun toMainSettingsTest() {
-        every { context.startActivity(any()) } just Runs
-        ExternalActionHelper.toConnections(context = context)
+        context.openAppNotificationSettings()
         verify(exactly = 1) { context.startActivity(any()) }
     }
 
     @Test
     fun openUrlTest() {
-        val fragment = mockk<Fragment>()
-        every { fragment.startActivity(any()) } just Runs
-        ExternalActionHelper.openUrl(fragment = fragment, url = "url_path")
-        verify(exactly = 1) { fragment.startActivity(any()) }
+        mockk<Fragment>().apply {
+            every { startActivity(any()) } just Runs
+            openUrl(url = "url_path")
+            verify(exactly = 1) { startActivity(any()) }
+        }
     }
 
     @Test
     fun callTest() {
-        val fragment = mockk<Fragment>()
-        every { fragment.startActivity(any()) } just Runs
-        ExternalActionHelper.call(fragment = fragment, uri = "call_path")
-        verify(exactly = 1) { fragment.startActivity(any()) }
+        mockk<Fragment>().apply {
+            every { startActivity(any()) } just Runs
+            callPhone(phoneNumber = "01234343535")
+            verify(exactly = 1) { startActivity(any()) }
+        }
     }
 
     @Test
     fun shareTextTest() {
-        val fragment = mockk<Fragment>()
-        every { fragment.startActivity(any()) } just Runs
-        ExternalActionHelper.shareText(fragment = fragment, text = "text", title = "title")
-        verify(exactly = 1) { fragment.startActivity(any()) }
+        mockk<Fragment>().apply {
+            every { startActivity(any()) } just Runs
+            shareText(text = "text", title = "title")
+            verify(exactly = 1) { startActivity(any()) }
+        }
     }
 }
-- 
GitLab