Skip to content

Commit ceca764

Browse files
dzinadgithub-actions[bot]
authored andcommitted
DRIVE3D-1931: improve camera behaviour in HD Lite
GitOrigin-RevId: eeb3448bbdf0899e8668667dacd6aad42b97b188
1 parent 2910e0a commit ceca764

File tree

2 files changed

+83
-0
lines changed

2 files changed

+83
-0
lines changed

ui-maps/src/main/java/com/mapbox/navigation/ui/maps/internal/camera/FollowingFramingModeHolder.kt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,26 @@ enum class FollowingFramingMode {
1111
@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
1212
class FollowingFramingModeHolder {
1313

14+
private val observers = mutableListOf<(FollowingFramingMode?) -> Unit>()
15+
1416
var prevMode: FollowingFramingMode = FollowingFramingMode.LOCATION_INDICATOR
1517
private set
1618

1719
var mode: FollowingFramingMode = FollowingFramingMode.LOCATION_INDICATOR
1820
set(value) {
1921
prevMode = field
2022
field = value
23+
if (prevMode != value) {
24+
observers.forEach { it(value) }
25+
}
2126
}
27+
28+
fun addObserver(observer: (FollowingFramingMode?) -> Unit) {
29+
observers.add(observer)
30+
observer(mode)
31+
}
32+
33+
fun removeObserver(observer: (FollowingFramingMode?) -> Unit) {
34+
observers.remove(observer)
35+
}
2236
}

ui-maps/src/test/java/com/mapbox/navigation/ui/maps/internal/camera/FollowingFramingModeHolderTest.kt

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
package com.mapbox.navigation.ui.maps.internal.camera
22

3+
import io.mockk.clearMocks
4+
import io.mockk.mockk
5+
import io.mockk.verify
6+
import io.mockk.verifyOrder
37
import org.junit.Assert.assertEquals
48
import org.junit.Before
59
import org.junit.Test
@@ -55,4 +59,69 @@ class FollowingFramingModeHolderTest {
5559
assertEquals(FollowingFramingMode.LOCATION_INDICATOR, holder.mode)
5660
assertEquals(FollowingFramingMode.MULTIPLE_POINTS, holder.prevMode)
5761
}
62+
63+
@Test
64+
fun `addObserver with custom initial mode invokes observer with that mode`() {
65+
holder.mode = FollowingFramingMode.MULTIPLE_POINTS
66+
val observer: (FollowingFramingMode?) -> Unit = mockk(relaxed = true)
67+
68+
holder.addObserver(observer)
69+
70+
verify(exactly = 1) { observer(FollowingFramingMode.MULTIPLE_POINTS) }
71+
}
72+
73+
@Test
74+
fun `observer is notified when mode changes to different value`() {
75+
val observer: (FollowingFramingMode?) -> Unit = mockk(relaxed = true)
76+
holder.addObserver(observer)
77+
78+
holder.mode = FollowingFramingMode.MULTIPLE_POINTS
79+
80+
verifyOrder {
81+
observer(FollowingFramingMode.LOCATION_INDICATOR) // initial call
82+
observer(FollowingFramingMode.MULTIPLE_POINTS) // mode change
83+
}
84+
}
85+
86+
@Test
87+
fun `observer is not notified when mode is set to same value`() {
88+
val observer: (FollowingFramingMode?) -> Unit = mockk(relaxed = true)
89+
holder.addObserver(observer)
90+
91+
clearMocks(observer, answers = false)
92+
93+
holder.mode = FollowingFramingMode.LOCATION_INDICATOR
94+
95+
verify(exactly = 0) { observer(any()) }
96+
}
97+
98+
@Test
99+
fun `multiple observers are all notified on mode change`() {
100+
val observer1: (FollowingFramingMode?) -> Unit = mockk(relaxed = true)
101+
val observer2: (FollowingFramingMode?) -> Unit = mockk(relaxed = true)
102+
val observer3: (FollowingFramingMode?) -> Unit = mockk(relaxed = true)
103+
104+
holder.addObserver(observer1)
105+
holder.addObserver(observer2)
106+
holder.addObserver(observer3)
107+
108+
holder.mode = FollowingFramingMode.MULTIPLE_POINTS
109+
110+
verify(exactly = 1) { observer1(FollowingFramingMode.MULTIPLE_POINTS) }
111+
verify(exactly = 1) { observer2(FollowingFramingMode.MULTIPLE_POINTS) }
112+
verify(exactly = 1) { observer3(FollowingFramingMode.MULTIPLE_POINTS) }
113+
}
114+
115+
@Test
116+
fun `removeObserver stops notifications to that observer`() {
117+
val observer: (FollowingFramingMode?) -> Unit = mockk(relaxed = true)
118+
holder.addObserver(observer)
119+
120+
holder.removeObserver(observer)
121+
holder.mode = FollowingFramingMode.MULTIPLE_POINTS
122+
123+
// Only the initial call from addObserver, no call after removal
124+
verify(exactly = 1) { observer(FollowingFramingMode.LOCATION_INDICATOR) }
125+
verify(exactly = 0) { observer(FollowingFramingMode.MULTIPLE_POINTS) }
126+
}
58127
}

0 commit comments

Comments
 (0)