
3 changed files with 116 additions and 36 deletions
@ -0,0 +1,106 @@ |
|||
/* 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.addons |
|||
|
|||
import android.os.Bundle |
|||
import android.view.View |
|||
import androidx.fragment.app.Fragment |
|||
import androidx.navigation.fragment.NavHostFragment.findNavController |
|||
import androidx.navigation.fragment.findNavController |
|||
import mozilla.components.browser.state.action.ContentAction |
|||
import mozilla.components.browser.state.action.CustomTabListAction |
|||
import mozilla.components.browser.state.state.CustomTabSessionState |
|||
import mozilla.components.browser.state.state.EngineState |
|||
import mozilla.components.browser.state.state.SessionState |
|||
import mozilla.components.browser.state.state.createCustomTab |
|||
import mozilla.components.concept.engine.EngineSession |
|||
import mozilla.components.concept.engine.prompt.PromptRequest |
|||
import mozilla.components.concept.engine.window.WindowRequest |
|||
import mozilla.components.feature.prompts.PromptFeature |
|||
import mozilla.components.support.base.feature.ViewBoundFeatureWrapper |
|||
import org.mozilla.fenix.ext.requireComponents |
|||
|
|||
/** |
|||
* Provides shared functionality to our fragments for add-on settings and |
|||
* browser/page action popups. |
|||
*/ |
|||
abstract class AddonPopupBaseFragment : Fragment(), EngineSession.Observer { |
|||
private val promptsFeature = ViewBoundFeatureWrapper<PromptFeature>() |
|||
|
|||
protected var session: SessionState? = null |
|||
protected var engineSession: EngineSession? = null |
|||
|
|||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { |
|||
session?.let { |
|||
promptsFeature.set( |
|||
feature = PromptFeature( |
|||
fragment = this, |
|||
store = requireComponents.core.store, |
|||
customTabId = it.id, |
|||
fragmentManager = parentFragmentManager, |
|||
onNeedToRequestPermissions = { permissions -> |
|||
requestPermissions(permissions, REQUEST_CODE_PROMPT_PERMISSIONS) |
|||
}), |
|||
owner = this, |
|||
view = view |
|||
) |
|||
} |
|||
} |
|||
|
|||
override fun onDestroyView() { |
|||
engineSession?.close() |
|||
session?.let { |
|||
requireComponents.core.store.dispatch(CustomTabListAction.RemoveCustomTabAction(it.id)) |
|||
} |
|||
super.onDestroyView() |
|||
} |
|||
|
|||
override fun onStart() { |
|||
super.onStart() |
|||
engineSession?.register(this) |
|||
} |
|||
|
|||
override fun onStop() { |
|||
super.onStop() |
|||
engineSession?.unregister(this) |
|||
} |
|||
|
|||
override fun onPromptRequest(promptRequest: PromptRequest) { |
|||
session?.let { session -> |
|||
requireComponents.core.store.dispatch( |
|||
ContentAction.UpdatePromptRequestAction( |
|||
session.id, |
|||
promptRequest |
|||
) |
|||
) |
|||
} |
|||
} |
|||
|
|||
override fun onWindowRequest(windowRequest: WindowRequest) { |
|||
if (windowRequest.type == WindowRequest.Type.CLOSE) { |
|||
findNavController().popBackStack() |
|||
} |
|||
} |
|||
|
|||
protected fun initializeSession(fromEngineSession: EngineSession? = null) { |
|||
engineSession = fromEngineSession ?: requireComponents.core.engine.createSession() |
|||
session = createCustomTab("").copy(engineState = EngineState(engineSession)) |
|||
requireComponents.core.store.dispatch(CustomTabListAction.AddCustomTabAction(session as CustomTabSessionState)) |
|||
} |
|||
|
|||
final override fun onRequestPermissionsResult( |
|||
requestCode: Int, |
|||
permissions: Array<String>, |
|||
grantResults: IntArray |
|||
) { |
|||
when (requestCode) { |
|||
REQUEST_CODE_PROMPT_PERMISSIONS -> promptsFeature.get()?.onPermissionsResult(permissions, grantResults) |
|||
} |
|||
} |
|||
|
|||
companion object { |
|||
private const val REQUEST_CODE_PROMPT_PERMISSIONS = 1 |
|||
} |
|||
} |
Loading…
Reference in new issue