1
0
Fork 0

Fixes #4771 - Add method for sessions of type (#4782)

Fixes share tabs to use the new method
master
Tiger Oakes 2019-08-27 16:04:03 -04:00 committed by Jeff Boek
parent 1cf8a40059
commit d1964d6536
4 changed files with 86 additions and 25 deletions

View File

@ -12,6 +12,7 @@ import mozilla.components.browser.session.Session
import mozilla.components.browser.session.SessionManager import mozilla.components.browser.session.SessionManager
import mozilla.components.concept.toolbar.Toolbar import mozilla.components.concept.toolbar.Toolbar
import org.mozilla.fenix.R import org.mozilla.fenix.R
import org.mozilla.fenix.ext.sessionsOfType
import java.lang.ref.WeakReference import java.lang.ref.WeakReference
/** /**
@ -41,7 +42,7 @@ class TabCounterToolbarButton(
addOnAttachStateChangeListener(object : View.OnAttachStateChangeListener { addOnAttachStateChangeListener(object : View.OnAttachStateChangeListener {
override fun onViewAttachedToWindow(v: View?) { override fun onViewAttachedToWindow(v: View?) {
setCount(count) setCount(sessionManager.sessionsOfType(private = isPrivate).count())
} }
override fun onViewDetachedFromWindow(v: View?) { /* no-op */ } override fun onViewDetachedFromWindow(v: View?) { /* no-op */ }
@ -62,9 +63,7 @@ class TabCounterToolbarButton(
override fun bind(view: View) = Unit override fun bind(view: View) = Unit
private fun updateCount() { private fun updateCount() {
val count = sessionManager.sessions.count { val count = sessionManager.sessionsOfType(private = isPrivate).count()
it.private == isPrivate
}
reference.get()?.let { reference.get()?.let {
it.contentDescription = getDescriptionForTabCount(it.context, count) it.contentDescription = getDescriptionForTabCount(it.context, count)

View File

@ -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 }

View File

@ -60,6 +60,7 @@ import org.mozilla.fenix.components.TabCollectionStorage
import org.mozilla.fenix.components.metrics.Event import org.mozilla.fenix.components.metrics.Event
import org.mozilla.fenix.ext.nav import org.mozilla.fenix.ext.nav
import org.mozilla.fenix.ext.requireComponents import org.mozilla.fenix.ext.requireComponents
import org.mozilla.fenix.ext.sessionsOfType
import org.mozilla.fenix.ext.toTab import org.mozilla.fenix.ext.toTab
import org.mozilla.fenix.home.sessioncontrol.CollectionAction import org.mozilla.fenix.home.sessioncontrol.CollectionAction
import org.mozilla.fenix.home.sessioncontrol.Mode import org.mozilla.fenix.home.sessioncontrol.Mode
@ -348,16 +349,21 @@ class HomeFragment : Fragment(), AccountObserver {
} }
} }
is TabAction.CloseAll -> { is TabAction.CloseAll -> {
if (pendingSessionDeletion?.deletionJob == null) removeAllTabsWithUndo( if (pendingSessionDeletion?.deletionJob == null) {
sessionManager.filteredSessions(action.private), removeAllTabsWithUndo(
action.private sessionManager.sessionsOfType(private = action.private),
) else { action.private
)
} else {
pendingSessionDeletion?.deletionJob?.let { pendingSessionDeletion?.deletionJob?.let {
viewLifecycleOwner.lifecycleScope.launch { viewLifecycleOwner.lifecycleScope.launch {
it.invoke() it.invoke()
}.invokeOnCompletion { }.invokeOnCompletion {
pendingSessionDeletion = null 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 -> { is TabAction.ShareTabs -> {
invokePendingDeleteJobs() invokePendingDeleteJobs()
val shareTabs = sessionManager.sessions.map { val shareTabs = sessionManager
ShareTab(it.url, it.title, it.id) .sessionsOfType(private = (activity as HomeActivity).browsingModeManager.mode.isPrivate)
} .map { ShareTab(it.url, it.title, it.id) }
.toList()
share(tabs = shareTabs) share(tabs = shareTabs)
} }
} }
@ -587,7 +594,7 @@ class HomeFragment : Fragment(), AccountObserver {
} }
} }
private fun removeAllTabsWithUndo(listOfSessionsToDelete: List<Session>, private: Boolean) { private fun removeAllTabsWithUndo(listOfSessionsToDelete: Sequence<Session>, private: Boolean) {
val sessionManager = requireComponents.core.sessionManager val sessionManager = requireComponents.core.sessionManager
getManagedEmitter<SessionControlChange>().onNext(SessionControlChange.TabsChange(listOf())) getManagedEmitter<SessionControlChange>().onNext(SessionControlChange.TabsChange(listOf()))
@ -651,9 +658,9 @@ class HomeFragment : Fragment(), AccountObserver {
} }
private fun getListOfSessions(): List<Session> { private fun getListOfSessions(): List<Session> {
val isPrivate = browsingModeManager.mode.isPrivate return sessionManager.sessionsOfType(private = browsingModeManager.mode.isPrivate)
val notPendingDeletion = { session: Session -> session.id != pendingSessionDeletion?.sessionId } .filter { session: Session -> session.id != pendingSessionDeletion?.sessionId }
return sessionManager.filteredSessions(isPrivate, notPendingDeletion) .toList()
} }
private fun showCollectionCreationFragment( private fun showCollectionCreationFragment(
@ -845,15 +852,6 @@ class HomeFragment : Fragment(), AccountObserver {
} }
} }
private fun SessionManager.filteredSessions(
private: Boolean,
sessionFilter: ((Session) -> Boolean)? = null
): List<Session> {
return this.sessions
.filter { private == it.private }
.filter { sessionFilter?.invoke(it) ?: true }
}
private fun List<Session>.toTabs(): List<Tab> { private fun List<Session>.toTabs(): List<Tab> {
val selected = sessionManager.selectedSession val selected = sessionManager.selectedSession
return this.map { it.toTab(requireContext(), it == selected) } return this.map { it.toTab(requireContext(), it == selected) }

View File

@ -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<Session>): SessionManager {
val sessionManager: SessionManager = mockk()
every { sessionManager.sessions } returns sessions
return sessionManager
}
}