Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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: 1 addition & 1 deletion gradle/dependencies.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ ext {
println("Navigation Native version: " + mapboxNavigatorVersion)

version = [
mapboxMapSdk : '10.0.1',
mapboxMapSdk : '10.0.0',
mapboxSdkServices : '6.0.0',
mapboxEvents : '8.1.0',
mapboxCore : '5.0.0',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ internal class MapboxTripNotificationView(
*/
fun setEndNavigationButtonText(textResource: Int) {
expandedView?.setTextViewText(
R.id.endNavigationBtnText,
R.id.endNavigationBtn,
context.getString(textResource)
)
}
Expand Down Expand Up @@ -145,7 +145,7 @@ internal class MapboxTripNotificationView(
setTextViewText(R.id.notificationDistanceText, "")
setTextViewText(R.id.notificationArrivalText, "")
setTextViewText(R.id.notificationInstructionText, "")
setTextViewText(R.id.endNavigationBtnText, "")
setTextViewText(R.id.endNavigationBtn, "")
setViewVisibility(R.id.etaContent, View.GONE)
setViewVisibility(R.id.notificationInstructionText, View.GONE)
setViewVisibility(R.id.freeDriveText, View.GONE)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,13 @@ import android.graphics.Canvas
import android.graphics.Matrix
import android.graphics.drawable.Drawable
import android.os.Build
import android.text.SpannableString
import android.text.TextUtils
import android.text.format.DateFormat
import android.view.View.GONE
import android.view.View.VISIBLE
import androidx.core.app.NotificationCompat
import androidx.core.content.ContextCompat
import com.mapbox.annotation.module.MapboxModule
import com.mapbox.annotation.module.MapboxModuleType
import com.mapbox.api.directions.v5.models.BannerInstructions
Expand All @@ -39,7 +41,6 @@ import com.mapbox.navigation.utils.internal.NAVIGATION_NOTIFICATION_CHANNEL
import com.mapbox.navigation.utils.internal.NOTIFICATION_CHANNEL
import com.mapbox.navigation.utils.internal.NOTIFICATION_ID
import com.mapbox.navigation.utils.internal.ifChannelException
import com.mapbox.navigation.utils.internal.ifNonNull
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.channels.ClosedReceiveChannelException
import kotlinx.coroutines.channels.ClosedSendChannelException
Expand Down Expand Up @@ -74,9 +75,12 @@ class MapboxTripNotification constructor(
var currentManeuverModifier: String? = null
private set
private var currentRoundaboutAngle: Float? = null
private var currentManeuverImage: Bitmap? = null

private var currentInstructionText: String? = null
private var currentDistanceText: Double? = null
private var currentFormattedDistance: SpannableString? = null
private var currentFormattedTime: String? = null
private var pendingOpenIntent: PendingIntent? = null
private var pendingCloseIntent: PendingIntent? = null
private val etaFormat: String = applicationContext.getString(R.string.mapbox_eta_format)
Expand Down Expand Up @@ -205,6 +209,11 @@ class MapboxTripNotification constructor(
.setCustomBigContentView(notificationView.expandedView)
.setOngoing(true)

if (Build.VERSION.SDK_INT >= 31) {
val color = ContextCompat.getColor(applicationContext, R.color.mapbox_notification_blue)
builder.setColor(color).setColorized(true)
}

pendingOpenIntent?.let { pendingOpenIntent ->
builder.setContentIntent(pendingOpenIntent)
}
Expand Down Expand Up @@ -253,21 +262,10 @@ class MapboxTripNotification constructor(
when (state) {
is TripNotificationState.TripNotificationFreeState -> setFreeDriveMode(true)
is TripNotificationState.TripNotificationData -> {
if (isDistanceTextChanged(state.distanceRemaining)) {
updateDistanceText(state.distanceRemaining)
}
generateArrivalTime(state.durationRemaining)?.let { formattedTime ->
updateViewsWithArrival(formattedTime)
}
state.bannerInstructions?.let { bannerInstructions ->
val primary = bannerInstructions.primary().text()
if (isInstructionTextChanged(primary)) {
updateInstructionText(primary)
}
if (isManeuverStateChanged(bannerInstructions)) {
updateManeuverImage(state.drivingSide ?: ManeuverModifier.RIGHT)
}
}
updateDistanceText(state.distanceRemaining)
updateViewsWithArrival(state.durationRemaining)
updateInstructionText(state.bannerInstructions)
updateManeuverImage(state.bannerInstructions, state.drivingSide)
setFreeDriveMode(false)
}
}
Expand All @@ -291,11 +289,11 @@ class MapboxTripNotification constructor(
}

private fun updateDistanceText(distanceRemaining: Double?) {
val formattedDistance = distanceRemaining?.let {
distanceFormatter.formatDistance(distanceRemaining)
} ?: return
currentDistanceText = distanceRemaining
notificationView.updateDistanceText(formattedDistance)
if (isDistanceTextChanged(distanceRemaining) && distanceRemaining != null) {
currentDistanceText = distanceRemaining
currentFormattedDistance = distanceFormatter.formatDistance(distanceRemaining)
}
currentFormattedDistance?.let { notificationView.updateDistanceText(it) }
}

private fun generateArrivalTime(
Expand All @@ -314,17 +312,20 @@ class MapboxTripNotification constructor(
}
}

private fun updateViewsWithArrival(time: String) {
notificationView.updateArrivalTime(time)
private fun updateViewsWithArrival(durationRemaining: Double?) {
generateArrivalTime(durationRemaining)?.let { currentFormattedTime = it }
currentFormattedTime?.let { notificationView.updateArrivalTime(it) }
}

private fun isInstructionTextChanged(primaryText: String): Boolean {
return currentInstructionText.isNullOrEmpty() || currentInstructionText != primaryText
}

private fun updateInstructionText(primaryText: String) {
notificationView.updateInstructionText(primaryText)
currentInstructionText = primaryText
private fun updateInstructionText(bannerInstructions: BannerInstructions?) {
bannerInstructions?.primary()?.text()
?.takeIf { isInstructionTextChanged(it) }
?.let { currentInstructionText = it }
currentInstructionText?.let { notificationView.updateInstructionText(it) }
}

private fun isManeuverStateChanged(bannerInstruction: BannerInstructions): Boolean {
Expand All @@ -341,23 +342,21 @@ class MapboxTripNotification constructor(
currentRoundaboutAngle != previousRoundaboutAngle
}

private fun updateManeuverImage(drivingSide: String) {
val notificationTurnIcon = turnIconHelper.retrieveTurnIcon(
currentManeuverType,
currentRoundaboutAngle,
currentManeuverModifier,
drivingSide
)
ifNonNull(notificationTurnIcon) { turnIcon ->
ifNonNull(turnIcon.icon) { image ->
val originalDrawable = notificationView.getImageDrawable(image)
ifNonNull(originalDrawable) { drawable ->
ifNonNull(getManeuverBitmap(drawable, turnIcon.shouldFlipIcon)) { bitmap ->
notificationView.updateImage(bitmap)
}
}
private fun updateManeuverImage(bannerInstructions: BannerInstructions?, drivingSide: String?) {
if (bannerInstructions != null && isManeuverStateChanged(bannerInstructions)) {
turnIconHelper.retrieveTurnIcon(
currentManeuverType,
currentRoundaboutAngle,
currentManeuverModifier,
drivingSide = drivingSide ?: ManeuverModifier.RIGHT,
)?.let { turnIcon ->
turnIcon.icon
?.let { notificationView.getImageDrawable(it) }
?.let { getManeuverBitmap(it, turnIcon.shouldFlipIcon) }
?.let { currentManeuverImage = it }
}
}
currentManeuverImage?.let { notificationView.updateImage(it) }
}

private fun getManeuverBitmap(drawable: Drawable, shouldFlipIcon: Boolean): Bitmap? {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,9 @@
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/navigationCollapsedNotificationLayout"
android:layout_width="match_parent"
android:layout_height="64dp"
android:background="@color/mapbox_notification_blue">
android:layout_height="wrap_content"
android:background="@color/mapbox_notification_blue"
android:padding="@dimen/mapbox_notification_padding">

<ImageView
android:id="@+id/maneuverImage"
Expand All @@ -13,10 +14,8 @@
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:layout_marginStart="8dp"
android:layout_marginLeft="8dp"
android:layout_marginEnd="8dp"
android:layout_marginRight="8dp"
android:contentDescription="@null"
android:cropToPadding="true"
android:padding="8dp" />

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,33 +11,21 @@

<include layout="@layout/mapbox_notification_navigation_collapsed" />

<LinearLayout
<TextView
android:id="@+id/endNavigationBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="56dp"
android:layout_marginLeft="56dp"
android:layout_marginTop="8dp"
android:gravity="center_vertical"
android:orientation="horizontal"
android:padding="8dp">

<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginEnd="8dp"
android:layout_marginRight="8dp"
android:src="@drawable/mapbox_ic_close" />

<TextView
android:id="@+id/endNavigationBtnText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
tools:text="@string/mapbox_end_navigation"
android:textAllCaps="true"
android:textColor="@android:color/white" />

</LinearLayout>
android:paddingBottom="@dimen/mapbox_notification_padding"
android:paddingEnd="@dimen/mapbox_notification_padding"
android:paddingStart="@dimen/mapbox_notification_padding"
android:drawablePadding="8dp"
android:drawableStart="@drawable/mapbox_ic_close"
android:textAllCaps="true"
android:textColor="@android:color/white"
tools:text="@string/mapbox_end_navigation" />

</LinearLayout>
4 changes: 4 additions & 0 deletions libtrip-notification/src/main/res/values-v31/dimens.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="mapbox_notification_padding">0dp</dimen>
</resources>
1 change: 1 addition & 0 deletions libtrip-notification/src/main/res/values/dimens.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,5 @@
<resources>
<dimen name="mapbox_notification_maneuver_image_width">48dp</dimen>
<dimen name="mapbox_notification_maneuver_image_height">48dp</dimen>
<dimen name="mapbox_notification_padding">8dp</dimen>
</resources>
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import io.mockk.every
import io.mockk.mockk
import io.mockk.mockkObject
import io.mockk.verify
import junit.framework.Assert.assertNotNull
import org.junit.Assert.assertNotNull
import org.junit.Before
import org.junit.Test
import java.util.Locale
Expand Down Expand Up @@ -86,7 +86,7 @@ class MapboxTripNotificationViewTest {
it.setEndNavigationButtonText(R.string.mapbox_stop_session)
}

verify { view.expandedView!!.setTextViewText(R.id.endNavigationBtnText, STOP_SESSION) }
verify { view.expandedView!!.setTextViewText(R.id.endNavigationBtn, STOP_SESSION) }
}

@Test
Expand Down Expand Up @@ -206,7 +206,7 @@ class MapboxTripNotificationViewTest {
R.drawable.mapbox_ic_navigation
)
}
verify { view.expandedView!!.setTextViewText(R.id.endNavigationBtnText, STOP_SESSION) }
verify { view.expandedView!!.setTextViewText(R.id.endNavigationBtn, STOP_SESSION) }
}

@Test
Expand All @@ -228,7 +228,7 @@ class MapboxTripNotificationViewTest {
verify {
view.expandedView!!.setViewVisibility(R.id.notificationInstructionText, View.VISIBLE)
}
verify { view.expandedView!!.setTextViewText(R.id.endNavigationBtnText, END_NAVIGATION) }
verify { view.expandedView!!.setTextViewText(R.id.endNavigationBtn, END_NAVIGATION) }
}

private fun createContext(): Context {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ import android.widget.RemoteViews
import com.mapbox.api.directions.v5.models.BannerInstructions
import com.mapbox.api.directions.v5.models.BannerText
import com.mapbox.navigation.base.formatter.DistanceFormatter
import com.mapbox.navigation.base.internal.factory.TripNotificationStateFactory
import com.mapbox.navigation.base.internal.factory.TripNotificationStateFactory.buildTripNotificationState
import com.mapbox.navigation.base.internal.time.TimeFormatter
import com.mapbox.navigation.base.options.NavigationOptions
Expand All @@ -34,6 +33,7 @@ import io.mockk.mockkObject
import io.mockk.mockkStatic
import io.mockk.slot
import io.mockk.verify
import kotlinx.coroutines.ExperimentalCoroutinesApi
import org.junit.Assert.assertEquals
import org.junit.Assert.assertNotNull
import org.junit.Assert.assertNull
Expand Down Expand Up @@ -157,6 +157,7 @@ class MapboxTripNotificationTest {
verify(exactly = 1) { mockedContext.registerReceiver(any(), any()) }
}

@ExperimentalCoroutinesApi
@Test
fun whenTripStoppedThenCleanupIsDone() {
val notificationManager =
Expand Down Expand Up @@ -242,8 +243,8 @@ class MapboxTripNotificationTest {
mockUpdateNotificationAndroidInteractions()
val suffix = "this is nice formatting"
mockTimeFormatter(suffix)
val result = String.format(FORMAT_STRING, suffix + duration.toDouble().toString())
val state = TripNotificationStateFactory.buildTripNotificationState(
val result = String.format(FORMAT_STRING, suffix + duration.toString())
val state = buildTripNotificationState(
null,
distance,
duration,
Expand All @@ -257,7 +258,7 @@ class MapboxTripNotificationTest {
}

@Test
fun whenUpdateNotificationCalledTwiceWithSameDataThenRemoteViewAreNotUpdatedTwice() {
fun whenUpdateNotificationCalledTwiceWithSameDataThenRemoteViewUpdatedTwice() {
val state = mockk<TripNotificationState.TripNotificationData>(relaxed = true)
val primaryText = { "Primary Text" }
val bannerText = mockBannerText(state, primaryText)
Expand All @@ -272,8 +273,8 @@ class MapboxTripNotificationTest {
notification.updateNotification(state)

verify(exactly = 2) { bannerText.text() }
verify(exactly = 1) { collapsedViews.setTextViewText(any(), primaryText()) }
verify(exactly = 1) { expandedViews.setTextViewText(any(), primaryText()) }
verify(exactly = 2) { collapsedViews.setTextViewText(any(), primaryText()) }
verify(exactly = 2) { expandedViews.setTextViewText(any(), primaryText()) }
assertEquals(notification.currentManeuverType, MANEUVER_TYPE)
assertEquals(notification.currentManeuverModifier, MANEUVER_MODIFIER)
}
Expand Down Expand Up @@ -412,7 +413,7 @@ class MapboxTripNotificationTest {
expandedViews.setViewVisibility(R.id.freeDriveText, any())
}
verify(exactly = 2) {
expandedViews.setTextViewText(R.id.endNavigationBtnText, STOP_SESSION)
expandedViews.setTextViewText(R.id.endNavigationBtn, STOP_SESSION)
}
}

Expand Down