parent
1cf8a40059
commit
d1964d6536
|
@ -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)
|
||||
|
|
|
@ -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 }
|
|
@ -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),
|
||||
if (pendingSessionDeletion?.deletionJob == null) {
|
||||
removeAllTabsWithUndo(
|
||||
sessionManager.sessionsOfType(private = action.private),
|
||||
action.private
|
||||
) else {
|
||||
)
|
||||
} 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) }
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue