Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Trigger repaint after BitmapWidget is updated. #1797

Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
Mapbox welcomes participation and contributions from everyone.

# main
## Features ✨ and improvements 🏁
* Add `Widget.triggerRepaint` protected API and updated the `BitmapWidget` to trigger repaint after widget is updated.

# 10.10.0-beta.1 November 03, 2022
## Features ✨ and improvements 🏁
Expand Down
1 change: 1 addition & 0 deletions sdk/api/metalava.txt
Original file line number Diff line number Diff line change
Expand Up @@ -561,6 +561,7 @@ package com.mapbox.maps.renderer.widget {
method public abstract void setPosition(com.mapbox.maps.renderer.widget.WidgetPosition widgetPosition);
method public abstract void setRotation(float angleDegrees);
method @Deprecated public abstract void setTranslation(float translateX, float translateY);
method protected final void triggerRepaint();
}

@com.mapbox.maps.MapboxExperimental public final class WidgetPosition {
Expand Down
1 change: 1 addition & 0 deletions sdk/api/sdk.api
Original file line number Diff line number Diff line change
Expand Up @@ -561,6 +561,7 @@ public abstract class com/mapbox/maps/renderer/widget/Widget {
public abstract fun setPosition (Lcom/mapbox/maps/renderer/widget/WidgetPosition;)V
public abstract fun setRotation (F)V
public abstract fun setTranslation (FF)V
protected final fun triggerRepaint ()V
}

public final class com/mapbox/maps/renderer/widget/WidgetPosition {
Expand Down
6 changes: 6 additions & 0 deletions sdk/src/main/java/com/mapbox/maps/MapController.kt
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ import com.mapbox.maps.renderer.MapboxRenderer
import com.mapbox.maps.renderer.OnFpsChangedListener
import com.mapbox.maps.renderer.RendererSetupErrorListener
import com.mapbox.maps.renderer.widget.Widget
import java.lang.ref.WeakReference

internal class MapController : MapPluginProviderDelegate, MapControllable {

Expand Down Expand Up @@ -217,12 +218,17 @@ internal class MapController : MapPluginProviderDelegate, MapControllable {
}

override fun addWidget(widget: Widget) {
val weakThis = WeakReference(this)
pengdev marked this conversation as resolved.
Show resolved Hide resolved
widget.setRepaintTrigger {
weakThis.get()?.renderer?.scheduleRepaint()
pengdev marked this conversation as resolved.
Show resolved Hide resolved
}
renderer.renderThread.addWidget(widget)
renderer.scheduleRepaint()
}

override fun removeWidget(widget: Widget): Boolean {
val wasRemoved = renderer.renderThread.removeWidget(widget)
widget.setRepaintTrigger(null)
pengdev marked this conversation as resolved.
Show resolved Hide resolved
if (wasRemoved) {
renderer.scheduleRepaint()
}
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
14 changes: 14 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,15 @@ import com.mapbox.maps.MapboxExperimental
@MapboxExperimental
abstract class Widget internal constructor() {
internal abstract val renderer: WidgetRenderer
private var repaintTrigger: (() -> 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.
*/
protected fun triggerRepaint() {
pengdev marked this conversation as resolved.
Show resolved Hide resolved
repaintTrigger?.invoke()
}

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

@JvmSynthetic
internal fun setRepaintTrigger(trigger: (() -> Unit)?) {
repaintTrigger = trigger
}
}
18 changes: 11 additions & 7 deletions sdk/src/test/java/com/mapbox/maps/MapControllerTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -411,25 +411,29 @@ class MapControllerTest {
@OptIn(MapboxExperimental::class)
@Test
fun addWidgetTest() {
val widget = createTestWidget()
val mockWidget = mockk<BitmapWidget>()
every { mockWidget.setRepaintTrigger(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.setRepaintTrigger(any()) }
verifyOnce { mockRenderer.scheduleRepaint() }
}

@OptIn(MapboxExperimental::class)
@Test
fun removeWidgetTest() {
val widget = createTestWidget()
val mockWidget = mockk<BitmapWidget>()
every { mockWidget.setRepaintTrigger(any()) } just runs
val mockRenderThread = mockk<MapboxRenderThread>(relaxed = true)
every { mockRenderer.renderThread } returns mockRenderThread
every { mockRenderer.scheduleRepaint() } just runs
every { mockRenderThread.removeWidget(widget) } returns true
assertTrue(testMapController.removeWidget(widget))
verifyOnce { mockRenderThread.removeWidget(widget) }
every { mockRenderThread.removeWidget(mockWidget) } returns true
assertTrue(testMapController.removeWidget(mockWidget))
verifyOnce { mockWidget.setRepaintTrigger(null) }
verifyOnce { mockRenderThread.removeWidget(mockWidget) }
verifyOnce { mockRenderer.scheduleRepaint() }
}

Expand Down