diff --git a/app/src/main/java/org/mozilla/fenix/components/toolbar/TabCounterToolbarButton.kt b/app/src/main/java/org/mozilla/fenix/components/toolbar/TabCounterToolbarButton.kt index 2f69a54f7..baccd3ee0 100644 --- a/app/src/main/java/org/mozilla/fenix/components/toolbar/TabCounterToolbarButton.kt +++ b/app/src/main/java/org/mozilla/fenix/components/toolbar/TabCounterToolbarButton.kt @@ -12,6 +12,7 @@ import mozilla.components.browser.session.Session import mozilla.components.browser.session.SessionManager import mozilla.components.concept.toolbar.Toolbar import org.mozilla.fenix.R +import org.mozilla.fenix.ext.sessionsOfType import java.lang.ref.WeakReference /** @@ -41,7 +42,7 @@ class TabCounterToolbarButton( addOnAttachStateChangeListener(object : View.OnAttachStateChangeListener { override fun onViewAttachedToWindow(v: View?) { - setCount(count) + setCount(sessionManager.sessionsOfType(private = isPrivate).count()) } override fun onViewDetachedFromWindow(v: View?) { /* no-op */ } @@ -62,9 +63,7 @@ class TabCounterToolbarButton( override fun bind(view: View) = Unit private fun updateCount() { - val count = sessionManager.sessions.count { - it.private == isPrivate - } + val count = sessionManager.sessionsOfType(private = isPrivate).count() reference.get()?.let { it.contentDescription = getDescriptionForTabCount(it.context, count) diff --git a/app/src/main/java/org/mozilla/fenix/ext/SessionManager.kt b/app/src/main/java/org/mozilla/fenix/ext/SessionManager.kt new file mode 100644 index 000000000..67bfdec74 --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/ext/SessionManager.kt @@ -0,0 +1,13 @@ +/* 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.ext + +import mozilla.components.browser.session.SessionManager + +/** + * Returns only normal or only private sessions. + */ +fun SessionManager.sessionsOfType(private: Boolean) = + sessions.asSequence().filter { it.private == private } diff --git a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt index 9b85ff403..174d589e2 100644 --- a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt @@ -60,6 +60,7 @@ import org.mozilla.fenix.components.TabCollectionStorage import org.mozilla.fenix.components.metrics.Event import org.mozilla.fenix.ext.nav import org.mozilla.fenix.ext.requireComponents +import org.mozilla.fenix.ext.sessionsOfType import org.mozilla.fenix.ext.toTab import org.mozilla.fenix.home.sessioncontrol.CollectionAction import org.mozilla.fenix.home.sessioncontrol.Mode @@ -348,16 +349,21 @@ class HomeFragment : Fragment(), AccountObserver { } } is TabAction.CloseAll -> { - if (pendingSessionDeletion?.deletionJob == null) removeAllTabsWithUndo( - sessionManager.filteredSessions(action.private), - action.private - ) else { + if (pendingSessionDeletion?.deletionJob == null) { + removeAllTabsWithUndo( + sessionManager.sessionsOfType(private = action.private), + action.private + ) + } else { pendingSessionDeletion?.deletionJob?.let { viewLifecycleOwner.lifecycleScope.launch { it.invoke() }.invokeOnCompletion { pendingSessionDeletion = null - removeAllTabsWithUndo(sessionManager.filteredSessions(action.private), action.private) + removeAllTabsWithUndo( + sessionManager.sessionsOfType(private = action.private), + action.private + ) } } } @@ -377,9 +383,10 @@ class HomeFragment : Fragment(), AccountObserver { } is TabAction.ShareTabs -> { invokePendingDeleteJobs() - val shareTabs = sessionManager.sessions.map { - ShareTab(it.url, it.title, it.id) - } + val shareTabs = sessionManager + .sessionsOfType(private = (activity as HomeActivity).browsingModeManager.mode.isPrivate) + .map { ShareTab(it.url, it.title, it.id) } + .toList() share(tabs = shareTabs) } } @@ -587,7 +594,7 @@ class HomeFragment : Fragment(), AccountObserver { } } - private fun removeAllTabsWithUndo(listOfSessionsToDelete: List, private: Boolean) { + private fun removeAllTabsWithUndo(listOfSessionsToDelete: Sequence, private: Boolean) { val sessionManager = requireComponents.core.sessionManager getManagedEmitter().onNext(SessionControlChange.TabsChange(listOf())) @@ -651,9 +658,9 @@ class HomeFragment : Fragment(), AccountObserver { } private fun getListOfSessions(): List { - val isPrivate = browsingModeManager.mode.isPrivate - val notPendingDeletion = { session: Session -> session.id != pendingSessionDeletion?.sessionId } - return sessionManager.filteredSessions(isPrivate, notPendingDeletion) + return sessionManager.sessionsOfType(private = browsingModeManager.mode.isPrivate) + .filter { session: Session -> session.id != pendingSessionDeletion?.sessionId } + .toList() } private fun showCollectionCreationFragment( @@ -845,15 +852,6 @@ class HomeFragment : Fragment(), AccountObserver { } } - private fun SessionManager.filteredSessions( - private: Boolean, - sessionFilter: ((Session) -> Boolean)? = null - ): List { - return this.sessions - .filter { private == it.private } - .filter { sessionFilter?.invoke(it) ?: true } - } - private fun List.toTabs(): List { val selected = sessionManager.selectedSession return this.map { it.toTab(requireContext(), it == selected) } diff --git a/app/src/test/java/org/mozilla/fenix/ext/SessionManagerTest.kt b/app/src/test/java/org/mozilla/fenix/ext/SessionManagerTest.kt new file mode 100644 index 000000000..29b7f0416 --- /dev/null +++ b/app/src/test/java/org/mozilla/fenix/ext/SessionManagerTest.kt @@ -0,0 +1,51 @@ +/* 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.ext + +import io.mockk.every +import io.mockk.mockk +import mozilla.components.browser.session.Session +import mozilla.components.browser.session.SessionManager +import org.junit.Assert.assertEquals +import org.junit.Test + +class SessionManagerTest { + + @Test + fun `returns all normal sessions`() { + val sessions = listOf( + Session("https://example.com", private = false), + Session("https://mozilla.org", private = true), + Session("https://github.com", private = false) + ) + val sessionManager = mockSessionManager(sessions) + + assertEquals( + listOf(sessions[0], sessions[2]), + sessionManager.sessionsOfType(private = false).toList() + ) + } + + @Test + fun `returns all private sessions`() { + val sessions = listOf( + Session("https://example.com", private = false), + Session("https://mozilla.org", private = true), + Session("https://github.com", private = false) + ) + val sessionManager = mockSessionManager(sessions) + + assertEquals( + listOf(sessions[1]), + sessionManager.sessionsOfType(private = true).toList() + ) + } + + private fun mockSessionManager(sessions: List): SessionManager { + val sessionManager: SessionManager = mockk() + every { sessionManager.sessions } returns sessions + return sessionManager + } +}