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.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)

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.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<Session>, private: Boolean) {
private fun removeAllTabsWithUndo(listOfSessionsToDelete: Sequence<Session>, private: Boolean) {
val sessionManager = requireComponents.core.sessionManager
getManagedEmitter<SessionControlChange>().onNext(SessionControlChange.TabsChange(listOf()))
@ -651,9 +658,9 @@ class HomeFragment : Fragment(), AccountObserver {
}
private fun getListOfSessions(): List<Session> {
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<Session> {
return this.sessions
.filter { private == it.private }
.filter { sessionFilter?.invoke(it) ?: true }
}
private fun List<Session>.toTabs(): List<Tab> {
val selected = sessionManager.selectedSession
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
}
}