From c350a5f3b97d373e8ee7bceb3538b59172e4b2c2 Mon Sep 17 00:00:00 2001 From: mcarare Date: Thu, 3 Sep 2020 15:11:11 +0300 Subject: [PATCH] For #9506: Add session observer to check conditions for displaying banner. --- .../mozilla/fenix/browser/BrowserFragment.kt | 14 ++++ .../browser/OpenInAppOnboardingObserver.kt | 64 +++++++++++++++++++ 2 files changed, 78 insertions(+) create mode 100644 app/src/main/java/org/mozilla/fenix/browser/OpenInAppOnboardingObserver.kt diff --git a/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt b/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt index 913abac35..22564c5e9 100644 --- a/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt @@ -157,6 +157,20 @@ class BrowserFragment : BaseBrowserFragment(), UserInteractionHandler { } session?.register(toolbarSessionObserver, viewLifecycleOwner, autoPause = true) + if (settings.shouldShowOpenInAppBanner) { + session?.register( + OpenInAppOnboardingObserver( + context = context, + navController = findNavController(), + settings = settings, + appLinksUseCases = context.components.useCases.appLinksUseCases, + container = browserToolbarView.view.parent as ViewGroup + ), + owner = this, + autoPause = true + ) + } + if (!settings.userKnowsAboutPwas) { session?.register( PwaOnboardingObserver( diff --git a/app/src/main/java/org/mozilla/fenix/browser/OpenInAppOnboardingObserver.kt b/app/src/main/java/org/mozilla/fenix/browser/OpenInAppOnboardingObserver.kt new file mode 100644 index 000000000..7b951c9b1 --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/browser/OpenInAppOnboardingObserver.kt @@ -0,0 +1,64 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.browser + +import android.content.Context +import android.view.ViewGroup +import androidx.navigation.NavController +import mozilla.components.browser.session.Session +import mozilla.components.feature.app.links.AppLinksUseCases +import mozilla.components.support.ktx.kotlin.tryGetHostFromUrl +import org.mozilla.fenix.R +import org.mozilla.fenix.ext.nav +import org.mozilla.fenix.utils.Settings + +/** + * Displays an [InfoBanner] when a user visits a website that can be opened in an installed native app. + */ +class OpenInAppOnboardingObserver( + private val context: Context, + private val navController: NavController, + private val settings: Settings, + private val appLinksUseCases: AppLinksUseCases, + private val container: ViewGroup +) : Session.Observer { + + private var sessionDomainForDisplayedBanner: String? = null + private var infoBanner: InfoBanner? = null + + override fun onUrlChanged(session: Session, url: String) { + sessionDomainForDisplayedBanner?.let { + if (url.tryGetHostFromUrl() != it) { + infoBanner?.dismiss() + } + } + } + + override fun onLoadingStateChanged(session: Session, loading: Boolean) { + val appLink = appLinksUseCases.appLinkRedirect + + if (!loading && + settings.shouldShowOpenInAppBanner && + appLink(session.url).hasExternalApp() + ) { + infoBanner = InfoBanner( + context = context, + message = context.getString(R.string.open_in_app_cfr_info_message), + dismissText = context.getString(R.string.open_in_app_cfr_negative_button_text), + actionText = context.getString(R.string.open_in_app_cfr_positive_button_text), + container = container + ) { + val directions = BrowserFragmentDirections.actionBrowserFragmentToSettingsFragment( + preferenceToScrollTo = context.getString(R.string.pref_key_open_links_in_external_app) + ) + navController.nav(R.id.browserFragment, directions) + } + + infoBanner?.showBanner() + sessionDomainForDisplayedBanner = session.url.tryGetHostFromUrl() + settings.shouldShowOpenInAppBanner = false + } + } +}