diff --git a/fenix/app/src/main/java/org/mozilla/fenix/HomeActivity.kt b/fenix/app/src/main/java/org/mozilla/fenix/HomeActivity.kt index ef9c7a2e1fbe..25fc67612b47 100644 --- a/fenix/app/src/main/java/org/mozilla/fenix/HomeActivity.kt +++ b/fenix/app/src/main/java/org/mozilla/fenix/HomeActivity.kt @@ -36,7 +36,6 @@ import androidx.core.app.NotificationManagerCompat import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen import androidx.lifecycle.lifecycleScope import androidx.navigation.NavDestination -import androidx.navigation.NavDirections import androidx.navigation.fragment.NavHostFragment import androidx.navigation.ui.AppBarConfiguration import androidx.navigation.ui.NavigationUI @@ -89,9 +88,6 @@ import org.mozilla.fenix.GleanMetrics.Events import org.mozilla.fenix.GleanMetrics.Metrics import org.mozilla.fenix.GleanMetrics.SplashScreen import org.mozilla.fenix.GleanMetrics.StartOnHome -import org.mozilla.fenix.addons.AddonDetailsFragmentDirections -import org.mozilla.fenix.addons.AddonPermissionsDetailsFragmentDirections -import org.mozilla.fenix.addons.AddonsManagementFragmentDirections import org.mozilla.fenix.addons.ExtensionsProcessDisabledController import org.mozilla.fenix.browser.browsingmode.BrowsingMode import org.mozilla.fenix.browser.browsingmode.BrowsingModeManager @@ -104,17 +100,16 @@ import org.mozilla.fenix.databinding.ActivityHomeBinding import org.mozilla.fenix.debugsettings.data.DefaultDebugSettingsRepository import org.mozilla.fenix.debugsettings.store.DebugDrawerStore import org.mozilla.fenix.debugsettings.ui.DebugOverlay -import org.mozilla.fenix.exceptions.trackingprotection.TrackingProtectionExceptionsFragmentDirections import org.mozilla.fenix.experiments.ResearchSurfaceDialogFragment import org.mozilla.fenix.ext.alreadyOnDestination import org.mozilla.fenix.ext.breadcrumb import org.mozilla.fenix.ext.components +import org.mozilla.fenix.ext.getNavDirections import org.mozilla.fenix.ext.hasTopDestination import org.mozilla.fenix.ext.nav import org.mozilla.fenix.ext.setNavigationIcon import org.mozilla.fenix.ext.settings import org.mozilla.fenix.extension.WebExtensionPromptFeature -import org.mozilla.fenix.home.HomeFragmentDirections import org.mozilla.fenix.home.intent.AssistIntentProcessor import org.mozilla.fenix.home.intent.CrashReporterIntentProcessor import org.mozilla.fenix.home.intent.HomeDeepLinkIntentProcessor @@ -124,11 +119,7 @@ import org.mozilla.fenix.home.intent.OpenSpecificTabIntentProcessor import org.mozilla.fenix.home.intent.ReEngagementIntentProcessor import org.mozilla.fenix.home.intent.SpeechProcessingIntentProcessor import org.mozilla.fenix.home.intent.StartSearchIntentProcessor -import org.mozilla.fenix.library.bookmarks.BookmarkFragmentDirections import org.mozilla.fenix.library.bookmarks.DesktopFolders -import org.mozilla.fenix.library.history.HistoryFragmentDirections -import org.mozilla.fenix.library.historymetadata.HistoryMetadataGroupFragmentDirections -import org.mozilla.fenix.library.recentlyclosed.RecentlyClosedFragmentDirections import org.mozilla.fenix.messaging.FenixMessageSurfaceId import org.mozilla.fenix.messaging.FenixNimbusMessagingController import org.mozilla.fenix.messaging.MessageNotificationWorker @@ -143,30 +134,14 @@ import org.mozilla.fenix.perf.ProfilerMarkers import org.mozilla.fenix.perf.StartupPathProvider import org.mozilla.fenix.perf.StartupTimeline import org.mozilla.fenix.perf.StartupTypeTelemetry -import org.mozilla.fenix.search.SearchDialogFragmentDirections import org.mozilla.fenix.session.PrivateNotificationService -import org.mozilla.fenix.settings.HttpsOnlyFragmentDirections -import org.mozilla.fenix.settings.SettingsFragmentDirections -import org.mozilla.fenix.settings.TrackingProtectionFragmentDirections -import org.mozilla.fenix.settings.about.AboutFragmentDirections -import org.mozilla.fenix.settings.logins.fragment.LoginDetailFragmentDirections -import org.mozilla.fenix.settings.logins.fragment.SavedLoginsAuthFragmentDirections -import org.mozilla.fenix.settings.search.SaveSearchEngineFragmentDirections -import org.mozilla.fenix.settings.search.SearchEngineFragmentDirections -import org.mozilla.fenix.settings.studies.StudiesFragmentDirections -import org.mozilla.fenix.settings.wallpaper.WallpaperSettingsFragmentDirections -import org.mozilla.fenix.share.AddNewDeviceFragmentDirections -import org.mozilla.fenix.shopping.ReviewQualityCheckFragmentDirections import org.mozilla.fenix.shortcut.NewTabShortcutIntentProcessor.Companion.ACTION_OPEN_PRIVATE_TAB import org.mozilla.fenix.tabhistory.TabHistoryDialogFragment import org.mozilla.fenix.tabstray.TabsTrayFragment -import org.mozilla.fenix.tabstray.TabsTrayFragmentDirections import org.mozilla.fenix.theme.DefaultThemeManager import org.mozilla.fenix.theme.FirefoxTheme import org.mozilla.fenix.theme.Theme import org.mozilla.fenix.theme.ThemeManager -import org.mozilla.fenix.trackingprotection.TrackingProtectionPanelDialogFragmentDirections -import org.mozilla.fenix.translations.TranslationsDialogFragmentDirections import org.mozilla.fenix.utils.Settings import java.lang.ref.WeakReference import java.util.Locale @@ -1038,69 +1013,6 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity { } } - protected open fun getNavDirections( - from: BrowserDirection, - customTabSessionId: String?, - ): NavDirections? = when (from) { - BrowserDirection.FromGlobal -> - NavGraphDirections.actionGlobalBrowser(customTabSessionId) - BrowserDirection.FromHome -> - HomeFragmentDirections.actionGlobalBrowser(customTabSessionId) - BrowserDirection.FromWallpaper -> - WallpaperSettingsFragmentDirections.actionGlobalBrowser(customTabSessionId) - BrowserDirection.FromSearchDialog -> - SearchDialogFragmentDirections.actionGlobalBrowser(customTabSessionId) - BrowserDirection.FromSettings -> - SettingsFragmentDirections.actionGlobalBrowser(customTabSessionId) - BrowserDirection.FromBookmarks -> - BookmarkFragmentDirections.actionGlobalBrowser(customTabSessionId) - BrowserDirection.FromHistory -> - HistoryFragmentDirections.actionGlobalBrowser(customTabSessionId) - BrowserDirection.FromHistoryMetadataGroup -> - HistoryMetadataGroupFragmentDirections.actionGlobalBrowser(customTabSessionId) - BrowserDirection.FromTrackingProtectionExceptions -> - TrackingProtectionExceptionsFragmentDirections.actionGlobalBrowser(customTabSessionId) - BrowserDirection.FromHttpsOnlyMode -> - HttpsOnlyFragmentDirections.actionGlobalBrowser(customTabSessionId) - BrowserDirection.FromAbout -> - AboutFragmentDirections.actionGlobalBrowser(customTabSessionId) - BrowserDirection.FromTrackingProtection -> - TrackingProtectionFragmentDirections.actionGlobalBrowser(customTabSessionId) - BrowserDirection.FromTrackingProtectionDialog -> - TrackingProtectionPanelDialogFragmentDirections.actionGlobalBrowser(customTabSessionId) - BrowserDirection.FromSavedLoginsFragment -> - SavedLoginsAuthFragmentDirections.actionGlobalBrowser(customTabSessionId) - BrowserDirection.FromAddNewDeviceFragment -> - AddNewDeviceFragmentDirections.actionGlobalBrowser(customTabSessionId) - BrowserDirection.FromSearchEngineFragment -> - SearchEngineFragmentDirections.actionGlobalBrowser(customTabSessionId) - BrowserDirection.FromSaveSearchEngineFragment -> - SaveSearchEngineFragmentDirections.actionGlobalBrowser(customTabSessionId) - BrowserDirection.FromAddonDetailsFragment -> - AddonDetailsFragmentDirections.actionGlobalBrowser(customTabSessionId) - BrowserDirection.FromAddonPermissionsDetailsFragment -> - AddonPermissionsDetailsFragmentDirections.actionGlobalBrowser(customTabSessionId) - BrowserDirection.FromLoginDetailFragment -> - LoginDetailFragmentDirections.actionGlobalBrowser(customTabSessionId) - BrowserDirection.FromTabsTray -> - TabsTrayFragmentDirections.actionGlobalBrowser(customTabSessionId) - BrowserDirection.FromRecentlyClosed -> - RecentlyClosedFragmentDirections.actionGlobalBrowser(customTabSessionId) - BrowserDirection.FromStudiesFragment -> StudiesFragmentDirections.actionGlobalBrowser( - customTabSessionId, - ) - BrowserDirection.FromReviewQualityCheck -> ReviewQualityCheckFragmentDirections.actionGlobalBrowser( - customTabSessionId, - ) - BrowserDirection.FromAddonsManagementFragment -> AddonsManagementFragmentDirections.actionGlobalBrowser( - customTabSessionId, - ) - - BrowserDirection.FromTranslationsDialogFragment -> TranslationsDialogFragmentDirections.actionGlobalBrowser( - customTabSessionId, - ) - } - /** * Loads a URL or performs a search (depending on the value of [searchTermOrURL]). * diff --git a/fenix/app/src/main/java/org/mozilla/fenix/customtabs/ExternalAppBrowserActivity.kt b/fenix/app/src/main/java/org/mozilla/fenix/customtabs/ExternalAppBrowserActivity.kt index 2b70d5551788..c7a4955cc8f0 100644 --- a/fenix/app/src/main/java/org/mozilla/fenix/customtabs/ExternalAppBrowserActivity.kt +++ b/fenix/app/src/main/java/org/mozilla/fenix/customtabs/ExternalAppBrowserActivity.kt @@ -11,18 +11,12 @@ import android.os.Build import androidx.annotation.RequiresApi import androidx.annotation.VisibleForTesting import androidx.navigation.NavDestination -import androidx.navigation.NavDirections import mozilla.components.browser.state.selector.findCustomTab import mozilla.components.browser.state.state.SessionState -import mozilla.components.concept.engine.manifest.WebAppManifestParser import mozilla.components.feature.intent.ext.getSessionId -import mozilla.components.feature.pwa.ext.getWebAppManifest import mozilla.components.support.utils.SafeIntent -import org.mozilla.fenix.BrowserDirection import org.mozilla.fenix.HomeActivity -import org.mozilla.fenix.NavGraphDirections import org.mozilla.fenix.ext.components -import java.security.InvalidParameterException const val EXTRA_IS_SANDBOX_CUSTOM_TAB = "org.mozilla.fenix.customtabs.EXTRA_IS_SANDBOX_CUSTOM_TAB" @@ -66,31 +60,6 @@ open class ExternalAppBrowserActivity : HomeActivity() { // No-op for external app } - override fun getNavDirections( - from: BrowserDirection, - customTabSessionId: String?, - ): NavDirections? { - if (customTabSessionId == null) { - finishAndRemoveTask() - return null - } - - val manifest = intent - .getWebAppManifest() - ?.let { WebAppManifestParser().serialize(it).toString() } - return when (from) { - BrowserDirection.FromGlobal -> - NavGraphDirections.actionGlobalExternalAppBrowser( - activeSessionId = customTabSessionId, - webAppManifest = manifest, - isSandboxCustomTab = intent.getBooleanExtra(EXTRA_IS_SANDBOX_CUSTOM_TAB, false), - ) - else -> throw InvalidParameterException( - "Tried to navigate to ExternalAppBrowserFragment from $from", - ) - } - } - override fun onDestroy() { super.onDestroy() diff --git a/fenix/app/src/main/java/org/mozilla/fenix/ext/Activity.kt b/fenix/app/src/main/java/org/mozilla/fenix/ext/Activity.kt index b78fad924a50..1dcf79edcbf6 100644 --- a/fenix/app/src/main/java/org/mozilla/fenix/ext/Activity.kt +++ b/fenix/app/src/main/java/org/mozilla/fenix/ext/Activity.kt @@ -15,12 +15,44 @@ import androidx.annotation.DrawableRes import androidx.annotation.RequiresApi import androidx.appcompat.app.AppCompatActivity import androidx.core.os.bundleOf +import androidx.navigation.NavDirections import mozilla.components.concept.base.crash.Breadcrumb import mozilla.components.concept.engine.EngineSession +import mozilla.components.concept.engine.manifest.WebAppManifestParser +import mozilla.components.feature.pwa.ext.getWebAppManifest import org.mozilla.fenix.BrowserDirection import org.mozilla.fenix.HomeActivity +import org.mozilla.fenix.NavGraphDirections import org.mozilla.fenix.R +import org.mozilla.fenix.addons.AddonDetailsFragmentDirections +import org.mozilla.fenix.addons.AddonPermissionsDetailsFragmentDirections +import org.mozilla.fenix.addons.AddonsManagementFragmentDirections +import org.mozilla.fenix.customtabs.EXTRA_IS_SANDBOX_CUSTOM_TAB +import org.mozilla.fenix.customtabs.ExternalAppBrowserActivity +import org.mozilla.fenix.exceptions.trackingprotection.TrackingProtectionExceptionsFragmentDirections +import org.mozilla.fenix.home.HomeFragmentDirections +import org.mozilla.fenix.library.bookmarks.BookmarkFragmentDirections +import org.mozilla.fenix.library.history.HistoryFragmentDirections +import org.mozilla.fenix.library.historymetadata.HistoryMetadataGroupFragmentDirections +import org.mozilla.fenix.library.recentlyclosed.RecentlyClosedFragmentDirections +import org.mozilla.fenix.search.SearchDialogFragmentDirections +import org.mozilla.fenix.settings.HttpsOnlyFragmentDirections +import org.mozilla.fenix.settings.SettingsFragmentDirections import org.mozilla.fenix.settings.SupportUtils +import org.mozilla.fenix.settings.TrackingProtectionFragmentDirections +import org.mozilla.fenix.settings.about.AboutFragmentDirections +import org.mozilla.fenix.settings.logins.fragment.LoginDetailFragmentDirections +import org.mozilla.fenix.settings.logins.fragment.SavedLoginsAuthFragmentDirections +import org.mozilla.fenix.settings.search.SaveSearchEngineFragmentDirections +import org.mozilla.fenix.settings.search.SearchEngineFragmentDirections +import org.mozilla.fenix.settings.studies.StudiesFragmentDirections +import org.mozilla.fenix.settings.wallpaper.WallpaperSettingsFragmentDirections +import org.mozilla.fenix.share.AddNewDeviceFragmentDirections +import org.mozilla.fenix.shopping.ReviewQualityCheckFragmentDirections +import org.mozilla.fenix.tabstray.TabsTrayFragmentDirections +import org.mozilla.fenix.trackingprotection.TrackingProtectionPanelDialogFragmentDirections +import org.mozilla.fenix.translations.TranslationsDialogFragmentDirections +import java.security.InvalidParameterException /** * Attempts to call immersive mode using the View to hide the status bar and navigation buttons. @@ -170,6 +202,112 @@ fun Activity.setNavigationIcon( } } +/** + * Delegate to the relevant 'get nav directions' function based on the given [Activity]. + * + * @param from The [BrowserDirection] to indicate which fragment the browser is being opened from. + * @param customTabSessionId Optional custom tab session ID if navigating from a custom tab. + * + * @return the [NavDirections] for the given [Activity]. + */ +fun Activity.getNavDirections( + from: BrowserDirection, + customTabSessionId: String? = null, +): NavDirections? = when (this) { + is ExternalAppBrowserActivity -> { + getExternalAppBrowserNavDirections(from, customTabSessionId) + } + + else -> { + getHomeNavDirections(from) + } +} + +private fun Activity.getExternalAppBrowserNavDirections( + from: BrowserDirection, + customTabSessionId: String?, +): NavDirections? { + if (customTabSessionId == null) { + finishAndRemoveTask() + return null + } + + val manifest = + intent.getWebAppManifest()?.let { WebAppManifestParser().serialize(it).toString() } + + return when (from) { + BrowserDirection.FromGlobal -> + NavGraphDirections.actionGlobalExternalAppBrowser( + activeSessionId = customTabSessionId, + webAppManifest = manifest, + isSandboxCustomTab = intent.getBooleanExtra(EXTRA_IS_SANDBOX_CUSTOM_TAB, false), + ) + + else -> throw InvalidParameterException( + "Tried to navigate to ExternalAppBrowserFragment from $from", + ) + } +} + +private fun getHomeNavDirections( + from: BrowserDirection, +): NavDirections = when (from) { + BrowserDirection.FromGlobal -> NavGraphDirections.actionGlobalBrowser() + + BrowserDirection.FromHome -> HomeFragmentDirections.actionGlobalBrowser() + + BrowserDirection.FromWallpaper -> WallpaperSettingsFragmentDirections.actionGlobalBrowser() + + BrowserDirection.FromSearchDialog -> SearchDialogFragmentDirections.actionGlobalBrowser() + + BrowserDirection.FromSettings -> SettingsFragmentDirections.actionGlobalBrowser() + + BrowserDirection.FromBookmarks -> BookmarkFragmentDirections.actionGlobalBrowser() + + BrowserDirection.FromHistory -> HistoryFragmentDirections.actionGlobalBrowser() + + BrowserDirection.FromHistoryMetadataGroup -> HistoryMetadataGroupFragmentDirections.actionGlobalBrowser() + + BrowserDirection.FromTrackingProtectionExceptions -> + TrackingProtectionExceptionsFragmentDirections.actionGlobalBrowser() + + BrowserDirection.FromHttpsOnlyMode -> HttpsOnlyFragmentDirections.actionGlobalBrowser() + + BrowserDirection.FromAbout -> AboutFragmentDirections.actionGlobalBrowser() + + BrowserDirection.FromTrackingProtection -> TrackingProtectionFragmentDirections.actionGlobalBrowser() + + BrowserDirection.FromTrackingProtectionDialog -> + TrackingProtectionPanelDialogFragmentDirections.actionGlobalBrowser() + + BrowserDirection.FromSavedLoginsFragment -> SavedLoginsAuthFragmentDirections.actionGlobalBrowser() + + BrowserDirection.FromAddNewDeviceFragment -> AddNewDeviceFragmentDirections.actionGlobalBrowser() + + BrowserDirection.FromSearchEngineFragment -> SearchEngineFragmentDirections.actionGlobalBrowser() + + BrowserDirection.FromSaveSearchEngineFragment -> SaveSearchEngineFragmentDirections.actionGlobalBrowser() + + BrowserDirection.FromAddonDetailsFragment -> AddonDetailsFragmentDirections.actionGlobalBrowser() + + BrowserDirection.FromAddonPermissionsDetailsFragment -> + AddonPermissionsDetailsFragmentDirections.actionGlobalBrowser() + + BrowserDirection.FromLoginDetailFragment -> LoginDetailFragmentDirections.actionGlobalBrowser() + + BrowserDirection.FromTabsTray -> TabsTrayFragmentDirections.actionGlobalBrowser() + + BrowserDirection.FromRecentlyClosed -> RecentlyClosedFragmentDirections.actionGlobalBrowser() + + BrowserDirection.FromStudiesFragment -> StudiesFragmentDirections.actionGlobalBrowser() + + BrowserDirection.FromReviewQualityCheck -> ReviewQualityCheckFragmentDirections.actionGlobalBrowser() + + BrowserDirection.FromAddonsManagementFragment -> AddonsManagementFragmentDirections.actionGlobalBrowser() + + BrowserDirection.FromTranslationsDialogFragment -> TranslationsDialogFragmentDirections.actionGlobalBrowser() +} + const val REQUEST_CODE_BROWSER_ROLE = 1 const val SETTINGS_SELECT_OPTION_KEY = ":settings:fragment_args_key" const val SETTINGS_SHOW_FRAGMENT_ARGS = ":settings:show_fragment_args" diff --git a/fenix/app/src/main/res/navigation/nav_graph.xml b/fenix/app/src/main/res/navigation/nav_graph.xml index 9474d16664bf..b8f89250a6ce 100644 --- a/fenix/app/src/main/res/navigation/nav_graph.xml +++ b/fenix/app/src/main/res/navigation/nav_graph.xml @@ -284,6 +284,7 @@ tools:layout="@layout/fragment_browser">