1
0
Fork 0

Remove redundant super calls

master
Tiger Oakes 2019-07-23 17:15:46 -04:00 committed by Emily Kager
parent 88c05a5f43
commit 87d8f3b037
7 changed files with 160 additions and 238 deletions

View File

@ -219,59 +219,56 @@ open class HomeActivity : AppCompatActivity(), ShareFragment.TabsSharedCallback
if (sessionObserver == null) if (sessionObserver == null)
sessionObserver = subscribeToSessions() sessionObserver = subscribeToSessions()
if (navHost.navController.currentDestination?.id == R.id.browserFragment) return with(navHost.navController) {
@IdRes var fragmentId: Int? = null if (currentDestination?.id == R.id.browserFragment || popBackStack(R.id.browserFragment, false)) return
val directions = if (!navHost.navController.popBackStack(R.id.browserFragment, false)) {
when (from) {
BrowserDirection.FromGlobal ->
NavGraphDirections.actionGlobalBrowser(customTabSessionId)
BrowserDirection.FromHome -> {
fragmentId = R.id.homeFragment
HomeFragmentDirections.actionHomeFragmentToBrowserFragment(customTabSessionId)
}
BrowserDirection.FromSearch -> {
fragmentId = R.id.searchFragment
SearchFragmentDirections.actionSearchFragmentToBrowserFragment(
customTabSessionId
)
}
BrowserDirection.FromSettings -> {
fragmentId = R.id.settingsFragment
SettingsFragmentDirections.actionSettingsFragmentToBrowserFragment(
customTabSessionId
)
}
BrowserDirection.FromBookmarks -> {
fragmentId = R.id.bookmarkFragment
BookmarkFragmentDirections.actionBookmarkFragmentToBrowserFragment(
customTabSessionId
)
}
BrowserDirection.FromBookmarksFolderSelect -> {
fragmentId = R.id.bookmarkSelectFolderFragment
SelectBookmarkFolderFragmentDirections
.actionBookmarkSelectFolderFragmentToBrowserFragment(customTabSessionId)
}
BrowserDirection.FromHistory -> {
fragmentId = R.id.historyFragment
HistoryFragmentDirections.actionHistoryFragmentToBrowserFragment(
customTabSessionId
)
}
BrowserDirection.FromExceptions -> {
fragmentId = R.id.exceptionsFragment
ExceptionsFragmentDirections.actionExceptionsFragmentToBrowserFragment(
customTabSessionId
)
}
}
} else {
null
} }
directions?.let { @IdRes var fragmentId: Int? = null
navHost.navController.nav(fragmentId, it) val directions = when (from) {
BrowserDirection.FromGlobal ->
NavGraphDirections.actionGlobalBrowser(customTabSessionId)
BrowserDirection.FromHome -> {
fragmentId = R.id.homeFragment
HomeFragmentDirections.actionHomeFragmentToBrowserFragment(customTabSessionId)
}
BrowserDirection.FromSearch -> {
fragmentId = R.id.searchFragment
SearchFragmentDirections.actionSearchFragmentToBrowserFragment(
customTabSessionId
)
}
BrowserDirection.FromSettings -> {
fragmentId = R.id.settingsFragment
SettingsFragmentDirections.actionSettingsFragmentToBrowserFragment(
customTabSessionId
)
}
BrowserDirection.FromBookmarks -> {
fragmentId = R.id.bookmarkFragment
BookmarkFragmentDirections.actionBookmarkFragmentToBrowserFragment(
customTabSessionId
)
}
BrowserDirection.FromBookmarksFolderSelect -> {
fragmentId = R.id.bookmarkSelectFolderFragment
SelectBookmarkFolderFragmentDirections
.actionBookmarkSelectFolderFragmentToBrowserFragment(customTabSessionId)
}
BrowserDirection.FromHistory -> {
fragmentId = R.id.historyFragment
HistoryFragmentDirections.actionHistoryFragmentToBrowserFragment(
customTabSessionId
)
}
BrowserDirection.FromExceptions -> {
fragmentId = R.id.exceptionsFragment
ExceptionsFragmentDirections.actionExceptionsFragmentToBrowserFragment(
customTabSessionId
)
}
} }
navHost.navController.nav(fragmentId, directions)
} }
private fun load( private fun load(
@ -314,11 +311,11 @@ open class HomeActivity : AppCompatActivity(), ShareFragment.TabsSharedCallback
var urlLoading: String? = null var urlLoading: String? = null
override fun onLoadingStateChanged(session: Session, loading: Boolean) { override fun onLoadingStateChanged(session: Session, loading: Boolean) {
super.onLoadingStateChanged(session, loading) if (loading) {
urlLoading = session.url
if (loading) urlLoading = session.url } else if (urlLoading != null && !session.private) {
else if (urlLoading != null && !session.private)
components.analytics.metrics.track(Event.UriOpened) components.analytics.metrics.track(Event.UriOpened)
}
} }
} }
@ -360,24 +357,20 @@ open class HomeActivity : AppCompatActivity(), ShareFragment.TabsSharedCallback
return object : SessionManager.Observer { return object : SessionManager.Observer {
override fun onAllSessionsRemoved() { override fun onAllSessionsRemoved() {
super.onAllSessionsRemoved()
components.core.sessionManager.sessions.forEach { components.core.sessionManager.sessions.forEach {
it.unregister(singleSessionObserver) it.unregister(singleSessionObserver)
} }
} }
override fun onSessionAdded(session: Session) { override fun onSessionAdded(session: Session) {
super.onSessionAdded(session)
session.register(singleSessionObserver, this@HomeActivity) session.register(singleSessionObserver, this@HomeActivity)
} }
override fun onSessionRemoved(session: Session) { override fun onSessionRemoved(session: Session) {
super.onSessionRemoved(session)
session.unregister(singleSessionObserver) session.unregister(singleSessionObserver)
} }
override fun onSessionsRestored() { override fun onSessionsRestored() {
super.onSessionsRestored()
components.core.sessionManager.sessions.forEach { components.core.sessionManager.sessions.forEach {
it.register(singleSessionObserver, this@HomeActivity) it.register(singleSessionObserver, this@HomeActivity)
} }

View File

@ -4,9 +4,6 @@
package org.mozilla.fenix.browser package org.mozilla.fenix.browser
import android.content.ClipData
import android.content.ClipboardManager
import android.content.Context
import android.content.Intent import android.content.Intent
import android.content.pm.ActivityInfo import android.content.pm.ActivityInfo
import android.os.Bundle import android.os.Bundle
@ -19,7 +16,6 @@ import android.widget.RadioButton
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.coordinatorlayout.widget.CoordinatorLayout import androidx.coordinatorlayout.widget.CoordinatorLayout
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.core.content.getSystemService
import androidx.core.net.toUri import androidx.core.net.toUri
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.lifecycle.Observer import androidx.lifecycle.Observer
@ -55,6 +51,7 @@ import mozilla.components.feature.sitepermissions.SitePermissions
import mozilla.components.feature.sitepermissions.SitePermissionsFeature import mozilla.components.feature.sitepermissions.SitePermissionsFeature
import mozilla.components.feature.sitepermissions.SitePermissionsRules import mozilla.components.feature.sitepermissions.SitePermissionsRules
import mozilla.components.lib.state.ext.consumeFrom import mozilla.components.lib.state.ext.consumeFrom
import mozilla.components.feature.tab.collections.TabCollection
import mozilla.components.support.base.feature.BackHandler import mozilla.components.support.base.feature.BackHandler
import mozilla.components.support.base.feature.ViewBoundFeatureWrapper import mozilla.components.support.base.feature.ViewBoundFeatureWrapper
import mozilla.components.support.ktx.android.view.exitImmersiveModeIfNeeded import mozilla.components.support.ktx.android.view.exitImmersiveModeIfNeeded
@ -74,7 +71,6 @@ import org.mozilla.fenix.components.FindInPageIntegration
import org.mozilla.fenix.components.StoreProvider import org.mozilla.fenix.components.StoreProvider
import org.mozilla.fenix.components.TabCollectionStorage import org.mozilla.fenix.components.TabCollectionStorage
import org.mozilla.fenix.components.metrics.Event import org.mozilla.fenix.components.metrics.Event
import org.mozilla.fenix.components.metrics.Event.BrowserMenuItemTapped.Item
import org.mozilla.fenix.components.toolbar.SearchAction import org.mozilla.fenix.components.toolbar.SearchAction
import org.mozilla.fenix.components.toolbar.SearchState import org.mozilla.fenix.components.toolbar.SearchState
import org.mozilla.fenix.components.toolbar.ToolbarComponent import org.mozilla.fenix.components.toolbar.ToolbarComponent
@ -82,6 +78,7 @@ import org.mozilla.fenix.components.toolbar.ToolbarIntegration
import org.mozilla.fenix.components.toolbar.ToolbarMenu import org.mozilla.fenix.components.toolbar.ToolbarMenu
import org.mozilla.fenix.components.toolbar.ToolbarUIView import org.mozilla.fenix.components.toolbar.ToolbarUIView
import org.mozilla.fenix.components.toolbar.ToolbarViewModel import org.mozilla.fenix.components.toolbar.ToolbarViewModel
import org.mozilla.fenix.components.toolbar.trackToolbarItemInteraction
import org.mozilla.fenix.customtabs.CustomTabsIntegration import org.mozilla.fenix.customtabs.CustomTabsIntegration
import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.components
import org.mozilla.fenix.ext.enterToImmersiveMode import org.mozilla.fenix.ext.enterToImmersiveMode
@ -89,7 +86,6 @@ import org.mozilla.fenix.ext.nav
import org.mozilla.fenix.ext.requireComponents import org.mozilla.fenix.ext.requireComponents
import org.mozilla.fenix.ext.toTab import org.mozilla.fenix.ext.toTab
import org.mozilla.fenix.home.sessioncontrol.SessionControlChange import org.mozilla.fenix.home.sessioncontrol.SessionControlChange
import org.mozilla.fenix.home.sessioncontrol.TabCollection
import org.mozilla.fenix.lib.Do import org.mozilla.fenix.lib.Do
import org.mozilla.fenix.mvi.ActionBusFactory import org.mozilla.fenix.mvi.ActionBusFactory
import org.mozilla.fenix.mvi.getAutoDisposeObservable import org.mozilla.fenix.mvi.getAutoDisposeObservable
@ -131,15 +127,17 @@ class BrowserFragment : Fragment(), BackHandler {
var customTabSessionId: String? = null var customTabSessionId: String? = null
/*
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
// Disabled while awaiting a better solution to #3209 // Disabled while awaiting a better solution to #3209
// postponeEnterTransition() postponeEnterTransition()
// sharedElementEnterTransition = sharedElementEnterTransition =
// TransitionInflater.from(context).inflateTransition(android.R.transition.move).setDuration( TransitionInflater.from(context).inflateTransition(android.R.transition.move).setDuration(
// SHARED_TRANSITION_MS SHARED_TRANSITION_MS
// ) )
} }
*/
@SuppressWarnings("ComplexMethod") @SuppressWarnings("ComplexMethod")
override fun onCreateView( override fun onCreateView(
@ -502,7 +500,8 @@ class BrowserFragment : Fragment(), BackHandler {
) )
} }
is SearchAction.ToolbarMenuItemTapped -> { is SearchAction.ToolbarMenuItemTapped -> {
trackToolbarItemInteraction(it) val metrics = requireComponents.analytics.metrics
trackToolbarItemInteraction(metrics, it)
handleToolbarItemInteraction(it) handleToolbarItemInteraction(it)
} }
} }
@ -625,31 +624,6 @@ class BrowserFragment : Fragment(), BackHandler {
promptsFeature.withFeature { it.onActivityResult(requestCode, resultCode, data) } promptsFeature.withFeature { it.onActivityResult(requestCode, resultCode, data) }
} }
// This method triggers the complexity warning. However it's actually not that hard to understand.
@SuppressWarnings("ComplexMethod")
private fun trackToolbarItemInteraction(action: SearchAction.ToolbarMenuItemTapped) {
val item = when (action.item) {
ToolbarMenu.Item.Back -> Item.BACK
ToolbarMenu.Item.Forward -> Item.FORWARD
ToolbarMenu.Item.Reload -> Item.RELOAD
ToolbarMenu.Item.Stop -> Item.STOP
ToolbarMenu.Item.Settings -> Item.SETTINGS
ToolbarMenu.Item.Library -> Item.LIBRARY
is ToolbarMenu.Item.RequestDesktop ->
if (action.item.isChecked) Item.DESKTOP_VIEW_ON else Item.DESKTOP_VIEW_OFF
ToolbarMenu.Item.NewPrivateTab -> Item.NEW_PRIVATE_TAB
ToolbarMenu.Item.FindInPage -> Item.FIND_IN_PAGE
ToolbarMenu.Item.ReportIssue -> Item.REPORT_SITE_ISSUE
ToolbarMenu.Item.Help -> Item.HELP
ToolbarMenu.Item.NewTab -> Item.NEW_TAB
ToolbarMenu.Item.OpenInFenix -> Item.OPEN_IN_FENIX
ToolbarMenu.Item.Share -> Item.SHARE
ToolbarMenu.Item.SaveToCollection -> Item.SAVE_TO_COLLECTION
}
requireComponents.analytics.metrics.track(Event.BrowserMenuItemTapped(item))
}
// This method triggers the complexity warning. However it's actually not that hard to understand. // This method triggers the complexity warning. However it's actually not that hard to understand.
@SuppressWarnings("ComplexMethod") @SuppressWarnings("ComplexMethod")
private fun handleToolbarItemInteraction(action: SearchAction.ToolbarMenuItemTapped) { private fun handleToolbarItemInteraction(action: SearchAction.ToolbarMenuItemTapped) {
@ -790,60 +764,43 @@ class BrowserFragment : Fragment(), BackHandler {
} }
private fun getSessionById(): Session? { private fun getSessionById(): Session? {
val components = context?.components ?: return null val sessionManager = context?.components?.core?.sessionManager ?: return null
return if (customTabSessionId != null) { return if (customTabSessionId != null) {
components.core.sessionManager.findSessionById(customTabSessionId!!) sessionManager.findSessionById(customTabSessionId!!)
} else { } else {
components.core.sessionManager.selectedSession sessionManager.selectedSession
} }
} }
private fun getAppropriateLayoutGravity() = if (customTabSessionId != null) { private fun getAppropriateLayoutGravity() = if (customTabSessionId != null) Gravity.TOP else Gravity.BOTTOM
Gravity.TOP
} else {
Gravity.BOTTOM
}
private fun Session.copyUrl(context: Context) { private fun subscribeToTabCollections() =
context.getSystemService<ClipboardManager>()?.apply { Observer<List<TabCollection>> {
primaryClip = ClipData.newPlainText(url, url)
}
}
private fun subscribeToTabCollections(): Observer<List<TabCollection>> {
val observer = Observer<List<TabCollection>> {
requireComponents.core.tabCollectionStorage.cachedTabCollections = it requireComponents.core.tabCollectionStorage.cachedTabCollections = it
getManagedEmitter<SessionControlChange>().onNext(SessionControlChange.CollectionsChange(it)) getManagedEmitter<SessionControlChange>().onNext(SessionControlChange.CollectionsChange(it))
}.also { observer ->
requireComponents.core.tabCollectionStorage.getCollections().observe(this, observer)
} }
requireComponents.core.tabCollectionStorage.getCollections().observe(this, observer)
return observer
}
private fun subscribeToSession(): Session.Observer { private fun subscribeToSession(): Session.Observer {
val observer = object : Session.Observer { return object : Session.Observer {
override fun onLoadingStateChanged(session: Session, loading: Boolean) { override fun onLoadingStateChanged(session: Session, loading: Boolean) {
if (!loading) { if (!loading) {
updateBookmarkState(session) updateBookmarkState(session)
quickActionSheetStore.dispatch(QuickActionSheetAction.BounceNeededChange) quickActionSheetStore.dispatch(QuickActionSheetAction.BounceNeededChange)
} }
super.onLoadingStateChanged(session, loading)
} }
override fun onUrlChanged(session: Session, url: String) { override fun onUrlChanged(session: Session, url: String) {
super.onUrlChanged(session, url)
updateBookmarkState(session) updateBookmarkState(session)
updateAppLinksState(session) updateAppLinksState(session)
} }
} }.also { observer -> getSessionById()?.register(observer, this) }
getSessionById()?.register(observer, this)
return observer
} }
private fun subscribeToSessions(): SessionManager.Observer { private fun subscribeToSessions(): SessionManager.Observer {
return object : SessionManager.Observer { return object : SessionManager.Observer {
override fun onSessionSelected(session: Session) { override fun onSessionSelected(session: Session) {
super.onSessionSelected(session)
(activity as HomeActivity).updateThemeForSession(session) (activity as HomeActivity).updateThemeForSession(session)
updateBookmarkState(session) updateBookmarkState(session)
} }
@ -883,27 +840,20 @@ class BrowserFragment : Fragment(), BackHandler {
private val collectionStorageObserver = object : TabCollectionStorage.Observer { private val collectionStorageObserver = object : TabCollectionStorage.Observer {
override fun onCollectionCreated(title: String, sessions: List<Session>) { override fun onCollectionCreated(title: String, sessions: List<Session>) {
super.onCollectionCreated(title, sessions)
showTabSavedToCollectionSnackbar() showTabSavedToCollectionSnackbar()
} }
override fun onTabsAdded( override fun onTabsAdded(tabCollection: TabCollection, sessions: List<Session>) {
tabCollection: mozilla.components.feature.tab.collections.TabCollection,
sessions: List<Session>
) {
super.onTabsAdded(tabCollection, sessions)
showTabSavedToCollectionSnackbar() showTabSavedToCollectionSnackbar()
} }
} }
private fun showTabSavedToCollectionSnackbar() { private fun showTabSavedToCollectionSnackbar() {
context?.let { context: Context -> view?.let { view ->
view?.let { view: View -> FenixSnackbar.make(view, Snackbar.LENGTH_SHORT)
val string = context.getString(R.string.create_collection_tab_saved) .setText(view.context.getString(R.string.create_collection_tab_saved))
FenixSnackbar.make(view, Snackbar.LENGTH_SHORT).setText(string) .setAnchorView(toolbarComponent.uiView.view)
.setAnchorView(toolbarComponent.uiView.view) .show()
.show()
}
} }
} }

View File

@ -0,0 +1,36 @@
/* 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.components.toolbar
import org.mozilla.fenix.components.metrics.Event
import org.mozilla.fenix.components.metrics.MetricController
// This method triggers the complexity warning. However it's actually not that hard to understand.
@SuppressWarnings("ComplexMethod")
fun trackToolbarItemInteraction(metrics: MetricController, action: SearchAction.ToolbarMenuItemTapped) {
val item = when (action.item) {
ToolbarMenu.Item.Back -> Event.BrowserMenuItemTapped.Item.BACK
ToolbarMenu.Item.Forward -> Event.BrowserMenuItemTapped.Item.FORWARD
ToolbarMenu.Item.Reload -> Event.BrowserMenuItemTapped.Item.RELOAD
ToolbarMenu.Item.Stop -> Event.BrowserMenuItemTapped.Item.STOP
ToolbarMenu.Item.Settings -> Event.BrowserMenuItemTapped.Item.SETTINGS
ToolbarMenu.Item.Library -> Event.BrowserMenuItemTapped.Item.LIBRARY
is ToolbarMenu.Item.RequestDesktop -> if (action.item.isChecked) {
Event.BrowserMenuItemTapped.Item.DESKTOP_VIEW_ON
} else {
Event.BrowserMenuItemTapped.Item.DESKTOP_VIEW_OFF
}
ToolbarMenu.Item.NewPrivateTab -> Event.BrowserMenuItemTapped.Item.NEW_PRIVATE_TAB
ToolbarMenu.Item.FindInPage -> Event.BrowserMenuItemTapped.Item.FIND_IN_PAGE
ToolbarMenu.Item.ReportIssue -> Event.BrowserMenuItemTapped.Item.REPORT_SITE_ISSUE
ToolbarMenu.Item.Help -> Event.BrowserMenuItemTapped.Item.HELP
ToolbarMenu.Item.NewTab -> Event.BrowserMenuItemTapped.Item.NEW_TAB
ToolbarMenu.Item.OpenInFenix -> Event.BrowserMenuItemTapped.Item.OPEN_IN_FENIX
ToolbarMenu.Item.Share -> Event.BrowserMenuItemTapped.Item.SHARE
ToolbarMenu.Item.SaveToCollection -> Event.BrowserMenuItemTapped.Item.SAVE_TO_COLLECTION
}
metrics.track(Event.BrowserMenuItemTapped(item))
}

View File

@ -19,7 +19,10 @@ import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.constraintlayout.widget.ConstraintLayout.LayoutParams.PARENT_ID import androidx.constraintlayout.widget.ConstraintLayout.LayoutParams.PARENT_ID
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleObserver
import androidx.lifecycle.Observer import androidx.lifecycle.Observer
import androidx.lifecycle.OnLifecycleEvent
import androidx.lifecycle.ViewModelProviders import androidx.lifecycle.ViewModelProviders
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.navigation.fragment.NavHostFragment.findNavController import androidx.navigation.fragment.NavHostFragment.findNavController
@ -32,13 +35,14 @@ import kotlinx.android.synthetic.main.fragment_home.view.*
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.withContext
import mozilla.components.browser.menu.BrowserMenu import mozilla.components.browser.menu.BrowserMenu
import mozilla.components.browser.session.Session import mozilla.components.browser.session.Session
import mozilla.components.browser.session.SessionManager import mozilla.components.browser.session.SessionManager
import mozilla.components.concept.sync.AccountObserver import mozilla.components.concept.sync.AccountObserver
import mozilla.components.concept.sync.OAuthAccount import mozilla.components.concept.sync.OAuthAccount
import mozilla.components.concept.sync.Profile import mozilla.components.concept.sync.Profile
import mozilla.components.feature.tab.collections.TabCollection
import org.jetbrains.anko.constraint.layout.ConstraintSetBuilder.Side.BOTTOM import org.jetbrains.anko.constraint.layout.ConstraintSetBuilder.Side.BOTTOM
import org.jetbrains.anko.constraint.layout.ConstraintSetBuilder.Side.END import org.jetbrains.anko.constraint.layout.ConstraintSetBuilder.Side.END
import org.jetbrains.anko.constraint.layout.ConstraintSetBuilder.Side.START import org.jetbrains.anko.constraint.layout.ConstraintSetBuilder.Side.START
@ -69,7 +73,6 @@ import org.mozilla.fenix.home.sessioncontrol.SessionControlState
import org.mozilla.fenix.home.sessioncontrol.SessionControlViewModel import org.mozilla.fenix.home.sessioncontrol.SessionControlViewModel
import org.mozilla.fenix.home.sessioncontrol.Tab import org.mozilla.fenix.home.sessioncontrol.Tab
import org.mozilla.fenix.home.sessioncontrol.TabAction import org.mozilla.fenix.home.sessioncontrol.TabAction
import org.mozilla.fenix.home.sessioncontrol.TabCollection
import org.mozilla.fenix.home.sessioncontrol.viewholders.CollectionViewHolder import org.mozilla.fenix.home.sessioncontrol.viewholders.CollectionViewHolder
import org.mozilla.fenix.lib.Do import org.mozilla.fenix.lib.Do
import org.mozilla.fenix.mvi.ActionBusFactory import org.mozilla.fenix.mvi.ActionBusFactory
@ -84,37 +87,23 @@ import kotlin.math.roundToInt
@SuppressWarnings("TooManyFunctions", "LargeClass") @SuppressWarnings("TooManyFunctions", "LargeClass")
class HomeFragment : Fragment(), AccountObserver { class HomeFragment : Fragment(), AccountObserver {
private val bus = ActionBusFactory.get(this) private val bus = ActionBusFactory.get(this)
private var tabCollectionObserver: Observer<List<TabCollection>>? = null
private val singleSessionObserver = object : Session.Observer { private val singleSessionObserver = object : Session.Observer {
override fun onTitleChanged(session: Session, title: String) { override fun onTitleChanged(session: Session, title: String) {
super.onTitleChanged(session, title) if (deleteAllSessionsJob == null) emitSessionChanges()
if (deleteAllSessionsJob != null) return
emitSessionChanges()
} }
} }
private lateinit var sessionObserver: BrowserSessionsObserver
private val collectionStorageObserver = object : TabCollectionStorage.Observer { private val collectionStorageObserver = object : TabCollectionStorage.Observer {
override fun onCollectionCreated(title: String, sessions: List<Session>) { override fun onCollectionCreated(title: String, sessions: List<Session>) {
super.onCollectionCreated(title, sessions)
scrollAndAnimateCollection(sessions.size) scrollAndAnimateCollection(sessions.size)
} }
override fun onTabsAdded( override fun onTabsAdded(tabCollection: TabCollection, sessions: List<Session>) {
tabCollection: mozilla.components.feature.tab.collections.TabCollection,
sessions: List<Session>
) {
super.onTabsAdded(tabCollection, sessions)
scrollAndAnimateCollection(sessions.size, tabCollection) scrollAndAnimateCollection(sessions.size, tabCollection)
} }
override fun onCollectionRenamed( override fun onCollectionRenamed(tabCollection: TabCollection, title: String) {
tabCollection: mozilla.components.feature.tab.collections.TabCollection,
title: String
) {
super.onCollectionRenamed(tabCollection, title)
showRenamedSnackbar() showRenamedSnackbar()
} }
} }
@ -152,9 +141,10 @@ class HomeFragment : Fragment(), AccountObserver {
// sharedElementEnterTransition = TransitionInflater.from(context).inflateTransition(android.R.transition.move) // sharedElementEnterTransition = TransitionInflater.from(context).inflateTransition(android.R.transition.move)
// .setDuration(SHARED_TRANSITION_MS) // .setDuration(SHARED_TRANSITION_MS)
sessionObserver = BrowserSessionsObserver(sessionManager, singleSessionObserver) { val sessionObserver = BrowserSessionsObserver(sessionManager, singleSessionObserver) {
emitSessionChanges() emitSessionChanges()
} }
lifecycle.addObserver(sessionObserver)
if (!onboarding.userHasBeenOnboarded()) { if (!onboarding.userHasBeenOnboarded()) {
requireComponents.analytics.metrics.track(Event.OpenedAppFirstRun) requireComponents.analytics.metrics.track(Event.OpenedAppFirstRun)
@ -229,17 +219,14 @@ class HomeFragment : Fragment(), AccountObserver {
setupHomeMenu() setupHomeMenu()
viewLifecycleOwner.lifecycleScope.launch(Dispatchers.Default) { viewLifecycleOwner.lifecycleScope.launch(Dispatchers.IO) {
val iconSize = resources.getDimension(R.dimen.preference_icon_drawable_size).toInt() val iconSize = resources.getDimension(R.dimen.preference_icon_drawable_size).toInt()
val searchIcon = requireComponents.search.searchEngineManager.getDefaultSearchEngine( val searchEngine = requireComponents.search.searchEngineManager.getDefaultSearchEngine(requireContext())
requireContext() val searchIcon = BitmapDrawable(resources, searchEngine.icon)
).let {
BitmapDrawable(resources, it.icon)
}
searchIcon.setBounds(0, 0, iconSize, iconSize) searchIcon.setBounds(0, 0, iconSize, iconSize)
runBlocking(Dispatchers.Main) { withContext(Dispatchers.Main) {
search_engine_icon?.setImageDrawable(searchIcon) search_engine_icon?.setImageDrawable(searchIcon)
} }
} }
@ -250,9 +237,8 @@ class HomeFragment : Fragment(), AccountObserver {
orientation = BrowserMenu.Orientation.DOWN orientation = BrowserMenu.Orientation.DOWN
) )
} }
val roundToInt = view.toolbar.compoundDrawablePadding =
(toolbarPaddingDp * Resources.getSystem().displayMetrics.density).roundToInt() (toolbarPaddingDp * Resources.getSystem().displayMetrics.density).roundToInt()
view.toolbar.compoundDrawablePadding = roundToInt
view.toolbar.setOnClickListener { view.toolbar.setOnClickListener {
invokePendingDeleteJobs() invokePendingDeleteJobs()
onboarding.finish() onboarding.finish()
@ -328,22 +314,12 @@ class HomeFragment : Fragment(), AccountObserver {
override fun onStart() { override fun onStart() {
super.onStart() super.onStart()
sessionObserver.onStart() subscribeToTabCollections()
tabCollectionObserver = subscribeToTabCollections()
// We only want this observer live just before we navigate away to the collection creation screen // We only want this observer live just before we navigate away to the collection creation screen
requireComponents.core.tabCollectionStorage.unregister(collectionStorageObserver) requireComponents.core.tabCollectionStorage.unregister(collectionStorageObserver)
} }
override fun onStop() {
sessionObserver.onStop()
tabCollectionObserver?.let {
requireComponents.core.tabCollectionStorage.getCollections().removeObserver(it)
}
super.onStop()
}
private fun handleOnboardingAction(action: OnboardingAction) { private fun handleOnboardingAction(action: OnboardingAction) {
Do exhaustive when (action) { Do exhaustive when (action) {
is OnboardingAction.Finish -> { is OnboardingAction.Finish -> {
@ -616,12 +592,12 @@ class HomeFragment : Fragment(), AccountObserver {
} }
private fun subscribeToTabCollections(): Observer<List<TabCollection>> { private fun subscribeToTabCollections(): Observer<List<TabCollection>> {
val observer = Observer<List<TabCollection>> { return Observer<List<TabCollection>> {
requireComponents.core.tabCollectionStorage.cachedTabCollections = it requireComponents.core.tabCollectionStorage.cachedTabCollections = it
getManagedEmitter<SessionControlChange>().onNext(SessionControlChange.CollectionsChange(it)) getManagedEmitter<SessionControlChange>().onNext(SessionControlChange.CollectionsChange(it))
}.also { observer ->
requireComponents.core.tabCollectionStorage.getCollections().observe(this, observer)
} }
requireComponents.core.tabCollectionStorage.getCollections().observe(this, observer)
return observer
} }
private fun removeAllTabsWithUndo(listOfSessionsToDelete: List<Session>) { private fun removeAllTabsWithUndo(listOfSessionsToDelete: List<Session>) {
@ -687,11 +663,6 @@ class HomeFragment : Fragment(), AccountObserver {
return sessionManager.filteredSessions(isPrivate, notPendingDeletion) return sessionManager.filteredSessions(isPrivate, notPendingDeletion)
} }
private fun emitAccountChanges() {
val mode = currentMode()
getManagedEmitter<SessionControlChange>().onNext(SessionControlChange.ModeChange(mode))
}
private fun showCollectionCreationFragment( private fun showCollectionCreationFragment(
selectedTabId: String? = null, selectedTabId: String? = null,
selectedTabCollection: TabCollection? = null, selectedTabCollection: TabCollection? = null,
@ -746,21 +717,15 @@ class HomeFragment : Fragment(), AccountObserver {
Mode.Normal Mode.Normal
} }
override fun onAuthenticationProblems() { private fun emitAccountChanges() {
emitAccountChanges() val mode = currentMode()
getManagedEmitter<SessionControlChange>().onNext(SessionControlChange.ModeChange(mode))
} }
override fun onAuthenticated(account: OAuthAccount) { override fun onAuthenticationProblems() = emitAccountChanges()
emitAccountChanges() override fun onAuthenticated(account: OAuthAccount) = emitAccountChanges()
} override fun onLoggedOut() = emitAccountChanges()
override fun onProfileUpdated(profile: Profile) = emitAccountChanges()
override fun onLoggedOut() {
emitAccountChanges()
}
override fun onProfileUpdated(profile: Profile) {
emitAccountChanges()
}
private fun scrollAndAnimateCollection(tabsAddedToCollectionSize: Int, changedCollection: TabCollection? = null) { private fun scrollAndAnimateCollection(tabsAddedToCollectionSize: Int, changedCollection: TabCollection? = null) {
if (view != null) { if (view != null) {
@ -898,15 +863,12 @@ private class BrowserSessionsObserver(
private val manager: SessionManager, private val manager: SessionManager,
private val observer: Session.Observer, private val observer: Session.Observer,
private val onChanged: () -> Unit private val onChanged: () -> Unit
) { ) : LifecycleObserver {
// TODO This is workaround. Should be removed when [mozilla.components.support.base.observer.ObserverRegistry]
// will not allow to subscribe to single session more than once.
private val observedSessions = mutableSetOf<Session>()
/** /**
* Start observing * Start observing
*/ */
@OnLifecycleEvent(Lifecycle.Event.ON_START)
fun onStart() { fun onStart() {
manager.register(managerObserver) manager.register(managerObserver)
subscribeToAll() subscribeToAll()
@ -915,6 +877,7 @@ private class BrowserSessionsObserver(
/** /**
* Stop observing (will not receive updates till next [onStop] call) * Stop observing (will not receive updates till next [onStop] call)
*/ */
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
fun onStop() { fun onStop() {
manager.unregister(managerObserver) manager.unregister(managerObserver)
unsubscribeFromAll() unsubscribeFromAll()
@ -929,21 +892,14 @@ private class BrowserSessionsObserver(
} }
private fun subscribeTo(session: Session) { private fun subscribeTo(session: Session) {
if (!observedSessions.contains(session)) { session.register(observer)
session.register(observer)
observedSessions += session
}
} }
private fun unsubscribeFrom(session: Session) { private fun unsubscribeFrom(session: Session) {
if (observedSessions.contains(session)) { session.unregister(observer)
session.unregister(observer)
observedSessions -= session
}
} }
private val managerObserver = object : SessionManager.Observer { private val managerObserver = object : SessionManager.Observer {
override fun onSessionAdded(session: Session) { override fun onSessionAdded(session: Session) {
subscribeTo(session) subscribeTo(session)
onChanged() onChanged()

View File

@ -5,5 +5,14 @@
package org.mozilla.fenix.lib package org.mozilla.fenix.lib
object Do { object Do {
/**
* Indicates to the linter that the following when statement should be exhaustive.
*
* @sample Do exhaustive when (bool) {
* true -> Unit
* false -> Unit
* }
*/
inline infix fun <reified T> exhaustive(any: T?) = any inline infix fun <reified T> exhaustive(any: T?) = any
} }

View File

@ -40,30 +40,11 @@ class DeleteBrowsingDataFragment : Fragment() {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
sessionObserver = object : SessionManager.Observer { sessionObserver = object : SessionManager.Observer {
override fun onSessionAdded(session: Session) { override fun onSessionAdded(session: Session) = updateTabCount()
super.onSessionAdded(session) override fun onSessionRemoved(session: Session) = updateTabCount()
updateTabCount() override fun onSessionSelected(session: Session) = updateTabCount()
} override fun onSessionsRestored() = updateTabCount()
override fun onAllSessionsRemoved() = updateTabCount()
override fun onSessionRemoved(session: Session) {
super.onSessionRemoved(session)
updateTabCount()
}
override fun onSessionSelected(session: Session) {
super.onSessionSelected(session)
updateTabCount()
}
override fun onSessionsRestored() {
super.onSessionsRestored()
updateTabCount()
}
override fun onAllSessionsRemoved() {
super.onAllSessionsRemoved()
updateTabCount()
}
} }
requireComponents.core.sessionManager.register(sessionObserver, owner = this) requireComponents.core.sessionManager.register(sessionObserver, owner = this)

View File

@ -244,7 +244,6 @@ class QuickSettingsSheetDialogFragment : AppCompatDialogFragment() {
private val sessionObserver = object : Session.Observer { private val sessionObserver = object : Session.Observer {
override fun onUrlChanged(session: Session, url: String) { override fun onUrlChanged(session: Session, url: String) {
super.onUrlChanged(session, url)
lifecycleScope.launch(Dispatchers.IO) { lifecycleScope.launch(Dispatchers.IO) {
val host = session.url.toUri()?.host val host = session.url.toUri()?.host
val sitePermissions: SitePermissions? = host?.let { val sitePermissions: SitePermissions? = host?.let {
@ -265,7 +264,6 @@ class QuickSettingsSheetDialogFragment : AppCompatDialogFragment() {
} }
override fun onTrackerBlockingEnabledChanged(session: Session, blockingEnabled: Boolean) { override fun onTrackerBlockingEnabledChanged(session: Session, blockingEnabled: Boolean) {
super.onTrackerBlockingEnabledChanged(session, blockingEnabled)
getManagedEmitter<QuickSettingsChange>().onNext( getManagedEmitter<QuickSettingsChange>().onNext(
QuickSettingsChange.Change( QuickSettingsChange.Change(
session.url, session.url,
@ -277,7 +275,6 @@ class QuickSettingsSheetDialogFragment : AppCompatDialogFragment() {
} }
override fun onSecurityChanged(session: Session, securityInfo: Session.SecurityInfo) { override fun onSecurityChanged(session: Session, securityInfo: Session.SecurityInfo) {
super.onSecurityChanged(session, securityInfo)
getManagedEmitter<QuickSettingsChange>().onNext( getManagedEmitter<QuickSettingsChange>().onNext(
QuickSettingsChange.Change( QuickSettingsChange.Change(
session.url, session.url,