open links inside synth pwa
This commit is contained in:
+15
-5
@@ -26,6 +26,7 @@ import com.mikepenz.iconics.typeface.IIcon
|
|||||||
import com.mikepenz.iconics.typeface.library.community.material.CommunityMaterial
|
import com.mikepenz.iconics.typeface.library.community.material.CommunityMaterial
|
||||||
import com.mikepenz.iconics.utils.colorInt
|
import com.mikepenz.iconics.utils.colorInt
|
||||||
import com.mikepenz.iconics.utils.sizeDp
|
import com.mikepenz.iconics.utils.sizeDp
|
||||||
|
import eu.weblibre.flutter_mozilla_components.feature.PwaWindowFeature
|
||||||
import eu.weblibre.flutter_mozilla_components.widget.CustomTabToolbar
|
import eu.weblibre.flutter_mozilla_components.widget.CustomTabToolbar
|
||||||
import eu.weblibre.flutter_mozilla_components.widget.CustomTabToolbarFeature
|
import eu.weblibre.flutter_mozilla_components.widget.CustomTabToolbarFeature
|
||||||
import mozilla.components.feature.contextmenu.ContextMenuCandidate
|
import mozilla.components.feature.contextmenu.ContextMenuCandidate
|
||||||
@@ -39,6 +40,7 @@ import mozilla.components.feature.pwa.feature.WebAppActivityFeature
|
|||||||
import mozilla.components.feature.pwa.feature.WebAppContentFeature
|
import mozilla.components.feature.pwa.feature.WebAppContentFeature
|
||||||
import mozilla.components.feature.pwa.feature.WebAppHideToolbarFeature
|
import mozilla.components.feature.pwa.feature.WebAppHideToolbarFeature
|
||||||
import mozilla.components.feature.pwa.feature.WebAppSiteControlsFeature
|
import mozilla.components.feature.pwa.feature.WebAppSiteControlsFeature
|
||||||
|
import mozilla.components.support.base.feature.LifecycleAwareFeature
|
||||||
import mozilla.components.support.base.feature.UserInteractionHandler
|
import mozilla.components.support.base.feature.UserInteractionHandler
|
||||||
import mozilla.components.support.base.feature.ViewBoundFeatureWrapper
|
import mozilla.components.support.base.feature.ViewBoundFeatureWrapper
|
||||||
import mozilla.components.support.base.log.logger.Logger
|
import mozilla.components.support.base.log.logger.Logger
|
||||||
@@ -53,7 +55,7 @@ class ExternalAppBrowserFragment : BaseBrowserFragment(), UserInteractionHandler
|
|||||||
private val customTabsToolbarFeature = ViewBoundFeatureWrapper<CustomTabToolbarFeature>()
|
private val customTabsToolbarFeature = ViewBoundFeatureWrapper<CustomTabToolbarFeature>()
|
||||||
private val contextMenuFeature = ViewBoundFeatureWrapper<ContextMenuFeature>()
|
private val contextMenuFeature = ViewBoundFeatureWrapper<ContextMenuFeature>()
|
||||||
private val hideToolbarFeature = ViewBoundFeatureWrapper<WebAppHideToolbarFeature>()
|
private val hideToolbarFeature = ViewBoundFeatureWrapper<WebAppHideToolbarFeature>()
|
||||||
private val windowFeature = ViewBoundFeatureWrapper<CustomTabWindowFeature>()
|
private val windowFeature = ViewBoundFeatureWrapper<LifecycleAwareFeature>()
|
||||||
|
|
||||||
private var customTabToolbar: CustomTabToolbar? = null
|
private var customTabToolbar: CustomTabToolbar? = null
|
||||||
private var activePopup: PopupWindow? = null
|
private var activePopup: PopupWindow? = null
|
||||||
@@ -368,15 +370,23 @@ class ExternalAppBrowserFragment : BaseBrowserFragment(), UserInteractionHandler
|
|||||||
components.core.webAppManifestStorage.getManifestCache(url)
|
components.core.webAppManifestStorage.getManifestCache(url)
|
||||||
} ?: customTab.content.webAppManifest
|
} ?: customTab.content.webAppManifest
|
||||||
|
|
||||||
|
val isPwaOrTwa = customTab.config.externalAppType == ExternalAppType.PROGRESSIVE_WEB_APP ||
|
||||||
|
customTab.config.externalAppType == ExternalAppType.TRUSTED_WEB_ACTIVITY
|
||||||
|
|
||||||
windowFeature.set(
|
windowFeature.set(
|
||||||
feature = CustomTabWindowFeature(activity, store, sessionId),
|
feature = if (isPwaOrTwa) {
|
||||||
|
PwaWindowFeature(
|
||||||
|
store = store,
|
||||||
|
loadUrlUseCase = components.useCases.sessionUseCases.loadUrl,
|
||||||
|
sessionId = sessionId,
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
CustomTabWindowFeature(activity, store, sessionId)
|
||||||
|
},
|
||||||
owner = this,
|
owner = this,
|
||||||
view = view,
|
view = view,
|
||||||
)
|
)
|
||||||
|
|
||||||
val isPwaOrTwa = customTab.config.externalAppType == ExternalAppType.PROGRESSIVE_WEB_APP ||
|
|
||||||
customTab.config.externalAppType == ExternalAppType.TRUSTED_WEB_ACTIVITY
|
|
||||||
|
|
||||||
if (isPwaOrTwa) {
|
if (isPwaOrTwa) {
|
||||||
hideToolbarFeature.set(
|
hideToolbarFeature.set(
|
||||||
feature = WebAppHideToolbarFeature(
|
feature = WebAppHideToolbarFeature(
|
||||||
|
|||||||
+61
@@ -0,0 +1,61 @@
|
|||||||
|
/*
|
||||||
|
* 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 https://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package eu.weblibre.flutter_mozilla_components.feature
|
||||||
|
|
||||||
|
import kotlinx.coroutines.CoroutineDispatcher
|
||||||
|
import kotlinx.coroutines.CoroutineScope
|
||||||
|
import kotlinx.coroutines.Dispatchers
|
||||||
|
import kotlinx.coroutines.cancel
|
||||||
|
import kotlinx.coroutines.flow.distinctUntilChangedBy
|
||||||
|
import kotlinx.coroutines.flow.mapNotNull
|
||||||
|
import mozilla.components.browser.state.action.ContentAction
|
||||||
|
import mozilla.components.browser.state.selector.findCustomTab
|
||||||
|
import mozilla.components.browser.state.store.BrowserStore
|
||||||
|
import mozilla.components.concept.engine.EngineSession
|
||||||
|
import mozilla.components.concept.engine.window.WindowRequest
|
||||||
|
import mozilla.components.feature.session.SessionUseCases
|
||||||
|
import mozilla.components.lib.state.ext.flowScoped
|
||||||
|
import mozilla.components.support.base.feature.LifecycleAwareFeature
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handles popup/window requests inside a standalone PWA session.
|
||||||
|
*/
|
||||||
|
class PwaWindowFeature(
|
||||||
|
private val store: BrowserStore,
|
||||||
|
private val loadUrlUseCase: SessionUseCases.DefaultLoadUrlUseCase,
|
||||||
|
private val sessionId: String,
|
||||||
|
private val mainDispatcher: CoroutineDispatcher = Dispatchers.Main,
|
||||||
|
) : LifecycleAwareFeature {
|
||||||
|
|
||||||
|
private var scope: CoroutineScope? = null
|
||||||
|
|
||||||
|
override fun start() {
|
||||||
|
scope = store.flowScoped(dispatcher = mainDispatcher) { flow ->
|
||||||
|
flow.mapNotNull { state -> state.findCustomTab(sessionId) }
|
||||||
|
.distinctUntilChangedBy { it.content.windowRequest }
|
||||||
|
.collect { state ->
|
||||||
|
val windowRequest = state.content.windowRequest
|
||||||
|
if (windowRequest?.type == WindowRequest.Type.OPEN) {
|
||||||
|
if (windowRequest.url.isNotBlank()) {
|
||||||
|
loadUrlUseCase(
|
||||||
|
windowRequest.url,
|
||||||
|
sessionId,
|
||||||
|
EngineSession.LoadUrlFlags.external(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
store.dispatch(ContentAction.ConsumeWindowRequestAction(sessionId))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun stop() {
|
||||||
|
scope?.cancel()
|
||||||
|
scope = null
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user