|
|
@ -15,7 +15,7 @@ import androidx.appcompat.app.AppCompatActivity
|
|
|
|
import androidx.coordinatorlayout.widget.CoordinatorLayout
|
|
|
|
import androidx.coordinatorlayout.widget.CoordinatorLayout
|
|
|
|
import androidx.core.net.toUri
|
|
|
|
import androidx.core.net.toUri
|
|
|
|
import androidx.fragment.app.Fragment
|
|
|
|
import androidx.fragment.app.Fragment
|
|
|
|
import androidx.lifecycle.ViewModelProvider
|
|
|
|
import androidx.fragment.app.activityViewModels
|
|
|
|
import androidx.lifecycle.lifecycleScope
|
|
|
|
import androidx.lifecycle.lifecycleScope
|
|
|
|
import androidx.navigation.fragment.findNavController
|
|
|
|
import androidx.navigation.fragment.findNavController
|
|
|
|
import com.google.android.material.bottomsheet.BottomSheetBehavior
|
|
|
|
import com.google.android.material.bottomsheet.BottomSheetBehavior
|
|
|
@ -25,9 +25,12 @@ import kotlinx.android.synthetic.main.fragment_browser.*
|
|
|
|
import kotlinx.android.synthetic.main.fragment_browser.view.*
|
|
|
|
import kotlinx.android.synthetic.main.fragment_browser.view.*
|
|
|
|
import kotlinx.coroutines.Dispatchers.IO
|
|
|
|
import kotlinx.coroutines.Dispatchers.IO
|
|
|
|
import kotlinx.coroutines.Dispatchers.Main
|
|
|
|
import kotlinx.coroutines.Dispatchers.Main
|
|
|
|
|
|
|
|
import kotlinx.coroutines.Job
|
|
|
|
|
|
|
|
import kotlinx.coroutines.MainScope
|
|
|
|
import kotlinx.coroutines.launch
|
|
|
|
import kotlinx.coroutines.launch
|
|
|
|
import kotlinx.coroutines.withContext
|
|
|
|
import kotlinx.coroutines.withContext
|
|
|
|
import mozilla.components.browser.session.Session
|
|
|
|
import mozilla.components.browser.session.Session
|
|
|
|
|
|
|
|
import mozilla.components.browser.session.SessionManager
|
|
|
|
import mozilla.components.browser.session.intent.EXTRA_SESSION_ID
|
|
|
|
import mozilla.components.browser.session.intent.EXTRA_SESSION_ID
|
|
|
|
import mozilla.components.feature.app.links.AppLinksFeature
|
|
|
|
import mozilla.components.feature.app.links.AppLinksFeature
|
|
|
|
import mozilla.components.feature.contextmenu.ContextMenuFeature
|
|
|
|
import mozilla.components.feature.contextmenu.ContextMenuFeature
|
|
|
@ -76,8 +79,8 @@ import org.mozilla.fenix.utils.Settings
|
|
|
|
* This class only contains shared code focused on the main browsing content.
|
|
|
|
* This class only contains shared code focused on the main browsing content.
|
|
|
|
* UI code specific to the app or to custom tabs can be found in the subclasses.
|
|
|
|
* UI code specific to the app or to custom tabs can be found in the subclasses.
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
@Suppress("TooManyFunctions")
|
|
|
|
@Suppress("TooManyFunctions", "LargeClass")
|
|
|
|
abstract class BaseBrowserFragment : Fragment(), BackHandler {
|
|
|
|
abstract class BaseBrowserFragment : Fragment(), BackHandler, SessionManager.Observer {
|
|
|
|
protected lateinit var browserStore: BrowserStore
|
|
|
|
protected lateinit var browserStore: BrowserStore
|
|
|
|
protected lateinit var browserInteractor: BrowserInteractor
|
|
|
|
protected lateinit var browserInteractor: BrowserInteractor
|
|
|
|
protected lateinit var browserToolbarView: BrowserToolbarView
|
|
|
|
protected lateinit var browserToolbarView: BrowserToolbarView
|
|
|
@ -95,6 +98,9 @@ abstract class BaseBrowserFragment : Fragment(), BackHandler {
|
|
|
|
|
|
|
|
|
|
|
|
var customTabSessionId: String? = null
|
|
|
|
var customTabSessionId: String? = null
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private var browserInitialized: Boolean = false
|
|
|
|
|
|
|
|
private var initUIJob: Job? = null
|
|
|
|
|
|
|
|
|
|
|
|
@CallSuper
|
|
|
|
@CallSuper
|
|
|
|
override fun onCreateView(
|
|
|
|
override fun onCreateView(
|
|
|
|
inflater: LayoutInflater,
|
|
|
|
inflater: LayoutInflater,
|
|
|
@ -127,17 +133,19 @@ abstract class BaseBrowserFragment : Fragment(), BackHandler {
|
|
|
|
return view
|
|
|
|
return view
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Suppress("ComplexMethod")
|
|
|
|
|
|
|
|
@CallSuper
|
|
|
|
@CallSuper
|
|
|
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
|
|
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
|
|
|
super.onViewCreated(view, savedInstanceState)
|
|
|
|
super.onViewCreated(view, savedInstanceState)
|
|
|
|
|
|
|
|
browserInitialized = initializeUI(view) != null
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Suppress("ComplexMethod")
|
|
|
|
|
|
|
|
@CallSuper
|
|
|
|
|
|
|
|
protected open fun initializeUI(view: View): Session? {
|
|
|
|
val sessionManager = requireComponents.core.sessionManager
|
|
|
|
val sessionManager = requireComponents.core.sessionManager
|
|
|
|
|
|
|
|
|
|
|
|
getSessionById()?.let { session ->
|
|
|
|
return getSessionById()?.also { session ->
|
|
|
|
val viewModel = activity!!.run {
|
|
|
|
val viewModel: CreateCollectionViewModel by activityViewModels()
|
|
|
|
ViewModelProvider(this).get(CreateCollectionViewModel::class.java)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
val browserToolbarController = DefaultBrowserToolbarController(
|
|
|
|
val browserToolbarController = DefaultBrowserToolbarController(
|
|
|
|
context!!,
|
|
|
|
context!!,
|
|
|
@ -185,7 +193,6 @@ abstract class BaseBrowserFragment : Fragment(), BackHandler {
|
|
|
|
browserToolbarView.view.setOnSiteSecurityClickedListener {
|
|
|
|
browserToolbarView.view.setOnSiteSecurityClickedListener {
|
|
|
|
showQuickSettingsDialog()
|
|
|
|
showQuickSettingsDialog()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
contextMenuFeature.set(
|
|
|
|
contextMenuFeature.set(
|
|
|
|
feature = ContextMenuFeature(
|
|
|
|
feature = ContextMenuFeature(
|
|
|
@ -313,6 +320,7 @@ abstract class BaseBrowserFragment : Fragment(), BackHandler {
|
|
|
|
view = view
|
|
|
|
view = view
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Suppress("ConstantConditionIf")
|
|
|
|
if (FeatureFlags.pullToRefreshEnabled) {
|
|
|
|
if (FeatureFlags.pullToRefreshEnabled) {
|
|
|
|
val primaryTextColor = ThemeManager.resolveAttribute(R.attr.primaryText, requireContext())
|
|
|
|
val primaryTextColor = ThemeManager.resolveAttribute(R.attr.primaryText, requireContext())
|
|
|
|
view.swipeRefresh.setColorSchemeColors(primaryTextColor)
|
|
|
|
view.swipeRefresh.setColorSchemeColors(primaryTextColor)
|
|
|
@ -330,12 +338,34 @@ abstract class BaseBrowserFragment : Fragment(), BackHandler {
|
|
|
|
// Disable pull to refresh
|
|
|
|
// Disable pull to refresh
|
|
|
|
view.swipeRefresh.setOnChildScrollUpCallback { _, _ -> true }
|
|
|
|
view.swipeRefresh.setOnChildScrollUpCallback { _, _ -> true }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
(activity as HomeActivity).updateThemeForSession(session)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@CallSuper
|
|
|
|
|
|
|
|
override fun onSessionSelected(session: Session) {
|
|
|
|
|
|
|
|
super.onSessionSelected(session)
|
|
|
|
|
|
|
|
if (!browserInitialized) {
|
|
|
|
|
|
|
|
// Initializing a new coroutineScope to avoid ConcurrentModificationException in ObserverRegistry
|
|
|
|
|
|
|
|
// This will be removed when ObserverRegistry is deprecated by browser-state.
|
|
|
|
|
|
|
|
initUIJob = MainScope().launch {
|
|
|
|
|
|
|
|
view?.let {
|
|
|
|
|
|
|
|
browserInitialized = initializeUI(it) != null
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@CallSuper
|
|
|
|
|
|
|
|
override fun onStart() {
|
|
|
|
|
|
|
|
super.onStart()
|
|
|
|
|
|
|
|
requireComponents.core.sessionManager.register(this, this, autoPause = true)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@CallSuper
|
|
|
|
@CallSuper
|
|
|
|
override fun onResume() {
|
|
|
|
override fun onResume() {
|
|
|
|
super.onResume()
|
|
|
|
super.onResume()
|
|
|
|
val session = getSessionById() ?: return
|
|
|
|
|
|
|
|
val components = requireComponents
|
|
|
|
val components = requireComponents
|
|
|
|
|
|
|
|
|
|
|
|
val preferredColorScheme = components.core.getPreferredColorScheme()
|
|
|
|
val preferredColorScheme = components.core.getPreferredColorScheme()
|
|
|
@ -343,20 +373,23 @@ abstract class BaseBrowserFragment : Fragment(), BackHandler {
|
|
|
|
components.core.engine.settings.preferredColorScheme = preferredColorScheme
|
|
|
|
components.core.engine.settings.preferredColorScheme = preferredColorScheme
|
|
|
|
components.useCases.sessionUseCases.reload()
|
|
|
|
components.useCases.sessionUseCases.reload()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
(activity as HomeActivity).updateThemeForSession(session)
|
|
|
|
|
|
|
|
(activity as AppCompatActivity).supportActionBar?.hide()
|
|
|
|
(activity as AppCompatActivity).supportActionBar?.hide()
|
|
|
|
|
|
|
|
|
|
|
|
assignSitePermissionsRules()
|
|
|
|
assignSitePermissionsRules()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
@CallSuper
|
|
|
|
* Exits full screen mode.
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
final override fun onPause() {
|
|
|
|
final override fun onPause() {
|
|
|
|
super.onPause()
|
|
|
|
super.onPause()
|
|
|
|
fullScreenFeature.onBackPressed()
|
|
|
|
fullScreenFeature.onBackPressed()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@CallSuper
|
|
|
|
|
|
|
|
override fun onStop() {
|
|
|
|
|
|
|
|
super.onStop()
|
|
|
|
|
|
|
|
initUIJob?.cancel()
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@CallSuper
|
|
|
|
@CallSuper
|
|
|
|
override fun onBackPressed(): Boolean {
|
|
|
|
override fun onBackPressed(): Boolean {
|
|
|
|
return findInPageIntegration.onBackPressed() ||
|
|
|
|
return findInPageIntegration.onBackPressed() ||
|
|
|
@ -480,8 +513,9 @@ abstract class BaseBrowserFragment : Fragment(), BackHandler {
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
protected fun getSessionById(): Session? {
|
|
|
|
protected fun getSessionById(): Session? {
|
|
|
|
val sessionManager = context?.components?.core?.sessionManager ?: return null
|
|
|
|
val sessionManager = context?.components?.core?.sessionManager ?: return null
|
|
|
|
return if (customTabSessionId != null) {
|
|
|
|
val localCustomTabId = customTabSessionId
|
|
|
|
sessionManager.findSessionById(customTabSessionId!!)
|
|
|
|
return if (localCustomTabId != null) {
|
|
|
|
|
|
|
|
sessionManager.findSessionById(localCustomTabId)
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
sessionManager.selectedSession
|
|
|
|
sessionManager.selectedSession
|
|
|
|
}
|
|
|
|
}
|
|
|
|