Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 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
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- Optimized `SpeedLimitWidget` memory usage.
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,9 @@ import android.Manifest
import androidx.test.filters.SmallTest
import androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner
import androidx.test.rule.GrantPermissionRule
import com.mapbox.androidauto.navigation.speedlimit.SpeedLimitWidget
import com.mapbox.androidauto.navigation.speedlimit.SpeedLimitBitmapProvider
import com.mapbox.androidauto.testing.BitmapTestUtil
import com.mapbox.navigation.base.speed.model.SpeedLimitSign
import org.junit.Rule
import org.junit.Test
import org.junit.rules.TestName
Expand All @@ -32,85 +33,133 @@ class SpeedLimitRendererTest {

@Test
fun speed_limit_120_speed_150_mutcd() {
val bitmap =
SpeedLimitWidget.drawMutcdSpeedLimitSign(speedLimit = 120, speed = 150, warn = true)
val bitmap = SpeedLimitBitmapProvider().getBitmap(
SpeedLimitSign.MUTCD,
speedLimit = 120,
speed = 150,
warn = true
)
bitmapUtils.assertBitmapsSimilar(testName, bitmap)
}

@Test
fun speed_limit_120_speed_90_mutcd() {
val bitmap =
SpeedLimitWidget.drawMutcdSpeedLimitSign(speedLimit = 120, speed = 90, warn = false)
val bitmap = SpeedLimitBitmapProvider().getBitmap(
SpeedLimitSign.MUTCD,
speedLimit = 120,
speed = 90,
warn = false
)
bitmapUtils.assertBitmapsSimilar(testName, bitmap)
}

@Test
fun speed_limit_65_speed_30_mutcd() {
val bitmap =
SpeedLimitWidget.drawMutcdSpeedLimitSign(speedLimit = 65, speed = 30, warn = false)
val bitmap = SpeedLimitBitmapProvider().getBitmap(
SpeedLimitSign.MUTCD,
speedLimit = 65,
speed = 30,
warn = false
)
bitmapUtils.assertBitmapsSimilar(testName, bitmap)
}

@Test
fun speed_limit_5_speed_30_mutcd() {
val bitmap =
SpeedLimitWidget.drawMutcdSpeedLimitSign(speedLimit = 5, speed = 30, warn = true)
val bitmap = SpeedLimitBitmapProvider().getBitmap(
SpeedLimitSign.MUTCD,
speedLimit = 5,
speed = 30,
warn = true
)
bitmapUtils.assertBitmapsSimilar(testName, bitmap)
}

@Test
fun speed_limit_5_speed_0_mutcd() {
val bitmap =
SpeedLimitWidget.drawMutcdSpeedLimitSign(speedLimit = 5, speed = 0, warn = false)
val bitmap = SpeedLimitBitmapProvider().getBitmap(
SpeedLimitSign.MUTCD,
speedLimit = 5,
speed = 0,
warn = false
)
bitmapUtils.assertBitmapsSimilar(testName, bitmap)
}

@Test
fun speed_limit_unknown_speed_5_mutcd() {
val bitmap =
SpeedLimitWidget.drawMutcdSpeedLimitSign(speedLimit = null, speed = 5, warn = false)
val bitmap = SpeedLimitBitmapProvider().getBitmap(
SpeedLimitSign.MUTCD,
speedLimit = null,
speed = 5,
warn = false
)
bitmapUtils.assertBitmapsSimilar(testName, bitmap)
}

@Test
fun speed_limit_120_speed_150_vienna() {
val bitmap =
SpeedLimitWidget.drawViennaSpeedLimitSign(speedLimit = 120, speed = 150, warn = true)
val bitmap = SpeedLimitBitmapProvider().getBitmap(
SpeedLimitSign.VIENNA,
speedLimit = 120,
speed = 150,
warn = true
)
bitmapUtils.assertBitmapsSimilar(testName, bitmap)
}

@Test
fun speed_limit_120_speed_90_vienna() {
val bitmap =
SpeedLimitWidget.drawViennaSpeedLimitSign(speedLimit = 120, speed = 90, warn = false)
val bitmap = SpeedLimitBitmapProvider().getBitmap(
SpeedLimitSign.VIENNA,
speedLimit = 120,
speed = 90,
warn = false
)
bitmapUtils.assertBitmapsSimilar(testName, bitmap)
}

@Test
fun speed_limit_65_speed_30_vienna() {
val bitmap =
SpeedLimitWidget.drawViennaSpeedLimitSign(speedLimit = 65, speed = 30, warn = false)
val bitmap = SpeedLimitBitmapProvider().getBitmap(
SpeedLimitSign.VIENNA,
speedLimit = 65,
speed = 30,
warn = false
)
bitmapUtils.assertBitmapsSimilar(testName, bitmap)
}

@Test
fun speed_limit_5_speed_30_vienna() {
val bitmap =
SpeedLimitWidget.drawViennaSpeedLimitSign(speedLimit = 5, speed = 30, warn = true)
val bitmap = SpeedLimitBitmapProvider().getBitmap(
SpeedLimitSign.VIENNA,
speedLimit = 5,
speed = 30,
warn = true
)
bitmapUtils.assertBitmapsSimilar(testName, bitmap)
}

@Test
fun speed_limit_5_speed_0_vienna() {
val bitmap =
SpeedLimitWidget.drawViennaSpeedLimitSign(speedLimit = 5, speed = 0, warn = false)
val bitmap = SpeedLimitBitmapProvider().getBitmap(
SpeedLimitSign.VIENNA,
speedLimit = 5,
speed = 0,
warn = false
)
bitmapUtils.assertBitmapsSimilar(testName, bitmap)
}

@Test
fun speed_limit_unknown_speed_5_vienna() {
val bitmap =
SpeedLimitWidget.drawViennaSpeedLimitSign(speedLimit = null, speed = 5, warn = false)
val bitmap = SpeedLimitBitmapProvider().getBitmap(
SpeedLimitSign.VIENNA,
speedLimit = null,
speed = 5,
warn = false
)
bitmapUtils.assertBitmapsSimilar(testName, bitmap)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package com.mapbox.androidauto.navigation.speedlimit

import android.graphics.Bitmap
import android.graphics.Canvas
import com.bumptech.glide.load.engine.bitmap_recycle.LruBitmapPool
import com.mapbox.navigation.base.speed.model.SpeedLimitSign

internal class SpeedLimitBitmapProvider {
Comment thread
kmadsen marked this conversation as resolved.
Outdated
private val mutcdDrawable: SpeedLimitDrawable = MutcdSpeedLimitDrawable()
private val viennaDrawable: SpeedLimitDrawable = ViennaSpeedLimitDrawable()
private val bitmapPool: LruBitmapPool = LruBitmapPool(
MutcdSpeedLimitDrawable.BITMAP_BYTE_SIZE + ViennaSpeedLimitDrawable.BITMAP_BYTE_SIZE
)

fun getBitmap(
signFormat: SpeedLimitSign,
speedLimit: Int? = null,
speed: Int = 0,
warn: Boolean = false,
): Bitmap {
val drawable = when (signFormat) {
SpeedLimitSign.MUTCD -> mutcdDrawable
SpeedLimitSign.VIENNA -> viennaDrawable
}
drawable.speedLimit = speedLimit
drawable.speed = speed
drawable.warn = warn

val bitmap = bitmapPool.get(signFormat)
drawable.draw(Canvas(bitmap))
bitmapPool.put(bitmap)
return bitmap
}

private fun LruBitmapPool.get(sign: SpeedLimitSign): Bitmap {
return when (sign) {
SpeedLimitSign.MUTCD -> get(
MutcdSpeedLimitDrawable.WIDTH,
MutcdSpeedLimitDrawable.HEIGHT,
Bitmap.Config.ARGB_8888
)
SpeedLimitSign.VIENNA -> get(
ViennaSpeedLimitDrawable.WIDTH,
ViennaSpeedLimitDrawable.HEIGHT,
Bitmap.Config.ARGB_8888
)
}
}
}
Loading