[fenix] Extract UriOpened observer from HomeActivity
parent
e823891c6b
commit
d603b06a5a
@ -0,0 +1,65 @@
|
||||
/* 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.browser
|
||||
|
||||
import androidx.annotation.VisibleForTesting
|
||||
import androidx.fragment.app.FragmentActivity
|
||||
import androidx.lifecycle.LifecycleOwner
|
||||
import mozilla.components.browser.session.Session
|
||||
import mozilla.components.browser.session.SessionManager
|
||||
import org.mozilla.fenix.components.metrics.Event
|
||||
import org.mozilla.fenix.components.metrics.MetricController
|
||||
import org.mozilla.fenix.ext.components
|
||||
import org.mozilla.fenix.ext.metrics
|
||||
|
||||
class UriOpenedObserver(
|
||||
private val owner: LifecycleOwner,
|
||||
private val sessionManager: SessionManager,
|
||||
private val metrics: MetricController
|
||||
) : SessionManager.Observer {
|
||||
|
||||
constructor(activity: FragmentActivity) : this(
|
||||
activity,
|
||||
activity.components.core.sessionManager,
|
||||
activity.metrics
|
||||
)
|
||||
|
||||
init {
|
||||
sessionManager.register(this, owner)
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
internal val singleSessionObserver = object : Session.Observer {
|
||||
private var urlLoading: String? = null
|
||||
|
||||
override fun onLoadingStateChanged(session: Session, loading: Boolean) {
|
||||
if (loading) {
|
||||
urlLoading = session.url
|
||||
} else if (urlLoading != null && !session.private) {
|
||||
metrics.track(Event.UriOpened)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun onAllSessionsRemoved() {
|
||||
sessionManager.sessions.forEach {
|
||||
it.unregister(singleSessionObserver)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onSessionAdded(session: Session) {
|
||||
session.register(singleSessionObserver, owner)
|
||||
}
|
||||
|
||||
override fun onSessionRemoved(session: Session) {
|
||||
session.unregister(singleSessionObserver)
|
||||
}
|
||||
|
||||
override fun onSessionsRestored() {
|
||||
sessionManager.sessions.forEach {
|
||||
it.register(singleSessionObserver, owner)
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,62 @@
|
||||
/* 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.browser
|
||||
|
||||
import androidx.lifecycle.LifecycleOwner
|
||||
import io.mockk.every
|
||||
import io.mockk.mockk
|
||||
import io.mockk.verify
|
||||
import mozilla.components.browser.session.Session
|
||||
import mozilla.components.browser.session.SessionManager
|
||||
import org.junit.Before
|
||||
import org.junit.Test
|
||||
import org.mozilla.fenix.components.metrics.Event
|
||||
import org.mozilla.fenix.components.metrics.MetricController
|
||||
|
||||
class UriOpenedObserverTest {
|
||||
|
||||
private lateinit var owner: LifecycleOwner
|
||||
private lateinit var sessionManager: SessionManager
|
||||
private lateinit var metrics: MetricController
|
||||
|
||||
@Before
|
||||
fun setup() {
|
||||
owner = mockk(relaxed = true)
|
||||
sessionManager = mockk(relaxed = true)
|
||||
metrics = mockk(relaxed = true)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `registers self as observer`() {
|
||||
val observer = UriOpenedObserver(owner, sessionManager, metrics)
|
||||
verify { sessionManager.register(observer, owner) }
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `registers single session observer`() {
|
||||
val observer = UriOpenedObserver(owner, sessionManager, metrics)
|
||||
val session: Session = mockk(relaxed = true)
|
||||
|
||||
observer.onSessionAdded(session)
|
||||
verify { session.register(observer.singleSessionObserver, owner) }
|
||||
|
||||
observer.onSessionRemoved(session)
|
||||
verify { session.unregister(observer.singleSessionObserver) }
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `tracks that a url was loaded`() {
|
||||
val observer = UriOpenedObserver(owner, sessionManager, metrics).singleSessionObserver
|
||||
val session: Session = mockk(relaxed = true)
|
||||
every { session.url } returns "https://mozilla.com"
|
||||
|
||||
observer.onLoadingStateChanged(session, loading = false)
|
||||
verify(exactly = 0) { metrics.track(Event.UriOpened) }
|
||||
|
||||
observer.onLoadingStateChanged(session, loading = true)
|
||||
observer.onLoadingStateChanged(session, loading = false)
|
||||
verify { metrics.track(Event.UriOpened) }
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue