Skip to content

Commit

Permalink
Trigger repaint after BitmapWidget is updated. (#1797)
Browse files Browse the repository at this point in the history
  • Loading branch information
pengdev committed Nov 4, 2022
1 parent 07c186a commit 5d0aae3
Show file tree
Hide file tree
Showing 8 changed files with 56 additions and 4 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@ Mapbox welcomes participation and contributions from everyone.

# main

# 10.10.0-rc.1
## Bug fixes 🐞
* Trigger repaint after `BitmapWidget` is updated. ([1797](https://github.com/mapbox/mapbox-maps-android/pull/1797))

# 10.10.0-beta.1 November 03, 2022
## Features ✨ and improvements 🏁
* Introduce view annotation `ViewAnnotationManager.annotations` API to access list of added view annotations. ([1751](https://github.com/mapbox/mapbox-maps-android/pull/1751))
Expand Down
3 changes: 3 additions & 0 deletions sdk/src/main/java/com/mapbox/maps/MapController.kt
Original file line number Diff line number Diff line change
Expand Up @@ -217,6 +217,9 @@ internal class MapController : MapPluginProviderDelegate, MapControllable {
}

override fun addWidget(widget: Widget) {
widget.setTriggerRepaintAction {
renderer.scheduleRepaint()
}
renderer.renderThread.addWidget(widget)
renderer.scheduleRepaint()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ internal abstract class MapboxRenderer : MapClient {
@UiThread
fun onDestroy() {
logI(TAG, "onDestroy")
widgetRenderer.cleanUpAllWidgets()
renderThread.destroy()
renderThread.fpsChangedListener = null
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -195,7 +195,18 @@ internal class MapboxWidgetRenderer(
widgets.add(widget)
}

fun removeWidget(widget: Widget) = widgets.remove(widget)
fun removeWidget(widget: Widget): Boolean {
val removed = widgets.remove(widget)
if (removed) {
widget.setTriggerRepaintAction(null)
}
return removed
}

fun cleanUpAllWidgets() {
widgets.forEach { it.setTriggerRepaintAction(null) }
widgets.clear()
}

private companion object {
private const val TAG: String = "MapboxWidgetRenderer"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -95,13 +95,15 @@ open class BitmapWidget @JvmOverloads constructor(
*/
fun updateBitmap(bitmap: Bitmap) {
renderer.updateBitmap(bitmap)
triggerRepaint()
}

/**
* Update the widget to the new position.
*/
override fun setPosition(widgetPosition: WidgetPosition) {
renderer.setPosition(widgetPosition)
triggerRepaint()
}

/**
Expand Down Expand Up @@ -136,6 +138,7 @@ open class BitmapWidget @JvmOverloads constructor(
*/
override fun setRotation(angleDegrees: Float) {
renderer.setRotation(angleDegrees = angleDegrees)
triggerRepaint()
}

/**
Expand Down
15 changes: 15 additions & 0 deletions sdk/src/main/java/com/mapbox/maps/renderer/widget/Widget.kt
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,16 @@ import com.mapbox.maps.MapboxExperimental
@MapboxExperimental
abstract class Widget internal constructor() {
internal abstract val renderer: WidgetRenderer
private var triggerRepaintAction: (() -> Unit)? = null

/**
* Triggers a repaint of the widget, as well as the map.
* It will do nothing if the widget has not been added to the map.
*/
@JvmSynthetic
internal fun triggerRepaint() {
triggerRepaintAction?.invoke()
}

/**
* Update the widget to the new position.
Expand Down Expand Up @@ -40,4 +50,9 @@ abstract class Widget internal constructor() {
* Get absolute rotation of widget in degrees.
*/
abstract fun getRotation(): Float

@JvmSynthetic
internal fun setTriggerRepaintAction(action: (() -> Unit)?) {
triggerRepaintAction = action
}
}
8 changes: 5 additions & 3 deletions sdk/src/test/java/com/mapbox/maps/MapControllerTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -411,12 +411,14 @@ class MapControllerTest {
@OptIn(MapboxExperimental::class)
@Test
fun addWidgetTest() {
val widget = createTestWidget()
val mockWidget = mockk<BitmapWidget>()
every { mockWidget.setTriggerRepaintAction(any()) } just runs
val mockRenderThread = mockk<MapboxRenderThread>(relaxed = true)
every { mockRenderer.renderThread } returns mockRenderThread
every { mockRenderer.scheduleRepaint() } just runs
testMapController.addWidget(widget)
verifyOnce { mockRenderThread.addWidget(widget) }
testMapController.addWidget(mockWidget)
verifyOnce { mockRenderThread.addWidget(mockWidget) }
verifyOnce { mockWidget.setTriggerRepaintAction(any()) }
verifyOnce { mockRenderer.scheduleRepaint() }
}

Expand Down
13 changes: 13 additions & 0 deletions sdk/src/test/java/com/mapbox/maps/renderer/MapboxRendererTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,14 @@ import android.os.HandlerThread
import android.os.Looper
import com.mapbox.maps.*
import com.mapbox.maps.renderer.gl.PixelReader
import com.mapbox.maps.renderer.widget.BitmapWidget
import com.mapbox.maps.renderer.widget.BitmapWidgetRenderer
import com.mapbox.maps.renderer.widget.WidgetPosition
import io.mockk.*
import org.junit.After
import org.junit.Assert
import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
Expand Down Expand Up @@ -291,10 +296,18 @@ internal abstract class MapboxRendererTest {

@Test
fun onDestroyTest() {
val mockWidget = mockk<BitmapWidget>()
val bitmapWidgetRenderer = BitmapWidgetRenderer(null, WidgetPosition { })
every { mockWidget.renderer } returns bitmapWidgetRenderer
every { mockWidget.setTriggerRepaintAction(any()) } just runs
val listener = OnFpsChangedListener { }
every { renderThread.fpsChangedListener } returns listener
mapboxRenderer.widgetRenderer.addWidget(mockWidget)
assertTrue(mapboxRenderer.widgetRenderer.hasWidgets())
mapboxRenderer.setOnFpsChangedListener(listener)
mapboxRenderer.onDestroy()
assertFalse(mapboxRenderer.widgetRenderer.hasWidgets())
verify { mockWidget.setTriggerRepaintAction(null) }
verify { renderThread.destroy() }
verify { renderThread.fpsChangedListener = null }
}
Expand Down

0 comments on commit 5d0aae3

Please sign in to comment.