parent
1cf8a40059
commit
d1964d6536
|
@ -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)
|
||||||
|
|
|
@ -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.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) }
|
||||||
|
|
|
@ -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