Skip to content

Commit 866a305

Browse files
committed
Update android auto
1 parent 6927169 commit 866a305

File tree

20 files changed

+173
-90
lines changed

20 files changed

+173
-90
lines changed

.circleci/config.yml

+4-4
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ version: 2.1
44
#---------- EXECUTORS ----------
55
#-------------------------------
66
executors:
7-
ndk-r21-latest-executor:
7+
default-executor:
88
docker:
9-
- image: mbgl/android-ndk-r21e:latest
9+
- image: mbgl/android-ndk-r22:latest
1010
working_directory: ~/code
1111

1212
#-------------------------------
@@ -82,7 +82,7 @@ commands:
8282

8383
jobs:
8484
prepare-and-assemble:
85-
executor: ndk-r21-latest-executor
85+
executor: default-executor
8686
steps:
8787
- checkout
8888
- restore-gradle-cache
@@ -91,7 +91,7 @@ jobs:
9191
- write-workspace
9292

9393
static-analysis:
94-
executor: ndk-r21-latest-executor
94+
executor: default-executor
9595
steps:
9696
- read-workspace
9797
- verify-codebase

android-auto-app/build.gradle

+4-5
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ apply from: "${rootDir}/gradle/script-git-version.gradle"
77
apply from: "${rootDir}/gradle/ktlint.gradle"
88

99
android {
10-
compileSdkVersion 30
10+
compileSdkVersion 31
1111

1212
compileOptions {
1313
sourceCompatibility JavaVersion.VERSION_1_8
@@ -57,15 +57,14 @@ android {
5757
}
5858

5959
dependencies {
60-
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.3.1'
61-
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1'
60+
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.4.0'
61+
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.0'
6262
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
6363
implementation("androidx.appcompat:appcompat:1.3.1")
6464
implementation "androidx.fragment:fragment-ktx:1.3.6"
6565

6666
// Android auto module
6767
implementation(project(":android-auto"))
68-
implementation "androidx.lifecycle:lifecycle-common-java8:2.3.1"
6968

70-
implementation("com.mapbox.search:mapbox-search-android-ui:1.0.0-beta.21")
69+
implementation("com.mapbox.search:mapbox-search-android-ui:1.0.0-beta.22")
7170
}

android-auto-app/src/main/AndroidManifest.xml

+3-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@
1010
android:roundIcon="@mipmap/ic_launcher_round"
1111
android:supportsRtl="true"
1212
android:theme="@style/Theme.MapboxNavigationExamples">
13-
<activity android:name=".MainActivity">
13+
<activity
14+
android:name=".MainActivity"
15+
android:exported="true">
1416
<intent-filter>
1517
<action android:name="android.intent.action.MAIN" />
1618

android-auto/build.gradle.kts

+11-11
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@ plugins {
66
}
77

88
android {
9-
compileSdkVersion(30)
9+
compileSdk = 31
1010

1111
defaultConfig {
12-
minSdkVersion(23)
12+
minSdk = 23
1313
missingDimensionStrategy("settings_visibility", "internal")
1414

1515
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
@@ -22,25 +22,25 @@ android {
2222

2323
dependencies {
2424
api("com.mapbox.navigation:android:2.1.0-beta.1")
25-
api("com.mapbox.search:mapbox-search-android:1.0.0-beta.21")
25+
api("com.mapbox.search:mapbox-search-android:1.0.0-beta.22")
2626
implementation("androidx.appcompat:appcompat:1.3.1")
2727
implementation("androidx.car.app:app:1.0.0")
28-
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.1")
29-
implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.4.0-rc01")
30-
implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.4.0-rc01")
28+
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.2")
29+
implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.4.0")
30+
implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.4.0")
3131
implementation("androidx.constraintlayout:constraintlayout:2.1.1")
3232
implementation("androidx.datastore:datastore-preferences:1.0.0")
3333
}
3434

3535
dependencies {
36-
testImplementation("org.robolectric:robolectric:4.3.1")
36+
testImplementation("org.robolectric:robolectric:4.6.1")
3737
testImplementation("androidx.test.ext:junit:1.1.3")
38-
testImplementation("io.mockk:mockk:1.11.0")
38+
testImplementation("io.mockk:mockk:1.12.0")
3939
testImplementation("org.junit.jupiter:junit-jupiter-api:5.5.2")
40-
testImplementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:1.5.1")
41-
testImplementation("androidx.lifecycle:lifecycle-runtime-testing:2.4.0-rc01")
40+
testImplementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:1.5.2")
41+
testImplementation("androidx.lifecycle:lifecycle-runtime-testing:2.4.0")
4242
testImplementation("androidx.arch.core:core-testing:2.1.0")
43-
testImplementation("org.jetbrains.kotlin:kotlin-reflect:1.5.21")
43+
testImplementation("org.jetbrains.kotlin:kotlin-reflect:1.5.31")
4444
}
4545

4646
dependencies {

android-auto/src/main/java/com/mapbox/androidauto/car/map/widgets/ImageOverlayHost.kt

+7-6
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
1-
package com.mapbox.maps.extension.androidauto
1+
package com.mapbox.androidauto.car.map.widgets
22

33
import android.graphics.Bitmap
44
import android.opengl.GLES20
55
import android.opengl.GLUtils
66
import android.opengl.Matrix
7-
import android.util.Log
8-
import com.mapbox.androidauto.car.map.widgets.WidgetPosition
7+
import com.mapbox.base.common.logger.model.Message
8+
import com.mapbox.base.common.logger.model.Tag
99
import com.mapbox.common.Logger
1010
import com.mapbox.maps.BuildConfig
1111
import com.mapbox.maps.CustomLayerHost
1212
import com.mapbox.maps.CustomLayerRenderParameters
13+
import com.mapbox.navigation.utils.internal.LoggerProvider
1314
import java.nio.ByteBuffer
1415
import java.nio.ByteOrder
1516
import java.nio.FloatBuffer
@@ -75,9 +76,9 @@ open class ImageOverlayHost(
7576
if (this.width == width && this.height == height) return
7677
this.width = width
7778
this.height = height
78-
Log.e(
79-
TAG,
80-
"onSizeChanged-> bitmap size: ${bitmap.width}, ${bitmap.height}; screen size: $width, $height"
79+
LoggerProvider.logger.e(
80+
Tag(TAG),
81+
Message("onSizeChanged-> bitmap size: ${bitmap.width}, ${bitmap.height}; screen size: $width, $height"),
8182
)
8283
heightOffset = when (position) {
8384
WidgetPosition.BOTTOM_LEFT -> height.toFloat() - bitmap.height.toFloat() / 2f - margins.marginBottom

android-auto/src/main/java/com/mapbox/androidauto/car/map/widgets/compass/CompassWidget.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ import android.content.Context
44
import android.graphics.BitmapFactory
55
import com.mapbox.androidauto.car.map.widgets.WidgetPosition
66
import com.mapbox.examples.androidauto.R
7-
import com.mapbox.maps.extension.androidauto.ImageOverlayHost
8-
import com.mapbox.maps.extension.androidauto.Margin
7+
import com.mapbox.androidauto.car.map.widgets.ImageOverlayHost
8+
import com.mapbox.androidauto.car.map.widgets.Margin
99

1010
/**
1111
* A widget to show the compass on the map.

android-auto/src/main/java/com/mapbox/androidauto/car/map/widgets/logo/LogoWidget.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ import android.content.Context
44
import android.graphics.BitmapFactory
55
import com.mapbox.androidauto.car.map.widgets.WidgetPosition
66
import com.mapbox.examples.androidauto.R
7-
import com.mapbox.maps.extension.androidauto.ImageOverlayHost
8-
import com.mapbox.maps.extension.androidauto.Margin
7+
import com.mapbox.androidauto.car.map.widgets.ImageOverlayHost
8+
import com.mapbox.androidauto.car.map.widgets.Margin
99

1010
/**
1111
* Logo widget displays the Mapbox logo on the map.

android-auto/src/main/java/com/mapbox/androidauto/car/navigation/speedlimit/SpeedLimitWidget.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ import com.mapbox.androidauto.car.map.widgets.WidgetPosition
1111
import com.mapbox.androidauto.logAndroidAuto
1212
import com.mapbox.bindgen.Expected
1313
import com.mapbox.common.Logger
14-
import com.mapbox.maps.extension.androidauto.ImageOverlayHost
15-
import com.mapbox.maps.extension.androidauto.Margin
14+
import com.mapbox.androidauto.car.map.widgets.ImageOverlayHost
15+
import com.mapbox.androidauto.car.map.widgets.Margin
1616
import com.mapbox.navigation.base.speed.model.SpeedLimitSign
1717
import com.mapbox.navigation.ui.speedlimit.model.UpdateSpeedLimitError
1818
import com.mapbox.navigation.ui.speedlimit.model.UpdateSpeedLimitValue

android-auto/src/main/java/com/mapbox/androidauto/navigation/audioguidance/impl/MapboxAudioGuidanceImpl.kt

+4-1
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,14 @@ import com.mapbox.api.directions.v5.models.VoiceInstructions
1313
import com.mapbox.navigation.core.MapboxNavigation
1414
import com.mapbox.navigation.ui.voice.model.SpeechAnnouncement
1515
import kotlinx.coroutines.ExperimentalCoroutinesApi
16+
import kotlinx.coroutines.FlowPreview
1617
import kotlinx.coroutines.Job
1718
import kotlinx.coroutines.flow.Flow
1819
import kotlinx.coroutines.flow.MutableStateFlow
1920
import kotlinx.coroutines.flow.StateFlow
2021
import kotlinx.coroutines.flow.collect
2122
import kotlinx.coroutines.flow.first
23+
import kotlinx.coroutines.flow.flatMapConcat
2224
import kotlinx.coroutines.flow.flatMapLatest
2325
import kotlinx.coroutines.flow.map
2426
import kotlinx.coroutines.flow.updateAndGet
@@ -124,9 +126,10 @@ class MapboxAudioGuidanceImpl(
124126
/**
125127
* The same as the [silentFlow] except that it will speak announcements.
126128
*/
129+
@OptIn(FlowPreview::class)
127130
private fun speechFlow(audioGuidance: MapboxAudioGuidanceVoice): Flow<MapboxAudioGuidance.State> {
128131
return audioGuidanceServices.mapboxVoiceInstructions().voiceInstructions()
129-
.flatMapLatest { voice ->
132+
.flatMapConcat { voice ->
130133
internalStateFlow.updateAndGet {
131134
MapboxAudioGuidanceState(
132135
isMuted = false,

android-auto/src/main/java/com/mapbox/examples/androidauto/car/MainCarSession.kt

+1
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ class MainCarSession : Session() {
4141
@OptIn(ExperimentalPreviewMapboxNavigationAPI::class)
4242
private fun startTripSession(mainCarContext: MainCarContext) {
4343
mainCarContext.apply {
44+
logAndroidAuto("MainCarSession startTripSession")
4445
if (mapboxNavigation.getTripSessionState() != TripSessionState.STARTED) {
4546
if (MapboxCarApp.options.replayEnabled) {
4647
val mapboxReplayer = mapboxNavigation.mapboxReplayer

android-auto/src/main/java/com/mapbox/examples/androidauto/car/preview/CarRouteLine.kt

+31-36
Original file line numberDiff line numberDiff line change
@@ -39,35 +39,10 @@ class CarRouteLine(
3939
.build()
4040
}
4141

42-
private val options: MapboxRouteLineOptions by lazy {
43-
MapboxRouteLineOptions.Builder(mainCarContext.carContext)
44-
.withRouteLineResources(routeLineResources)
45-
.withRouteLineBelowLayerId("road-label")
46-
.withVanishingRouteLineEnabled(true)
47-
.build()
48-
}
49-
50-
private val routeLineView by lazy {
51-
MapboxRouteLineView(options)
52-
}
53-
54-
private val routeLineApi: MapboxRouteLineApi by lazy {
55-
MapboxRouteLineApi(options)
56-
}
57-
58-
private val routeArrowApi: MapboxRouteArrowApi by lazy {
59-
MapboxRouteArrowApi()
60-
}
61-
62-
private val routeArrowOptions by lazy {
63-
RouteArrowOptions.Builder(mainCarContext.carContext)
64-
.withAboveLayerId(TOP_LEVEL_ROUTE_LINE_LAYER_ID)
65-
.build()
66-
}
67-
68-
private val routeArrowView: MapboxRouteArrowView by lazy {
69-
MapboxRouteArrowView(routeArrowOptions)
70-
}
42+
private lateinit var routeLineView: MapboxRouteLineView
43+
private lateinit var routeLineApi: MapboxRouteLineApi
44+
private lateinit var routeArrowApi: MapboxRouteArrowApi
45+
private lateinit var routeArrowView: MapboxRouteArrowView
7146

7247
private val onPositionChangedListener = OnIndicatorPositionChangedListener { point ->
7348
val result = routeLineApi.updateTraveledRouteLine(point)
@@ -107,12 +82,23 @@ class CarRouteLine(
10782
override fun loaded(mapboxCarMapSurface: MapboxCarMapSurface) {
10883
logAndroidAuto("CarRouteLine carMapSurface loaded $mapboxCarMapSurface")
10984
val locationPlugin = mapboxCarMapSurface.mapSurface.location
110-
routeLineView.initializeLayers(mapboxCarMapSurface.style)
85+
86+
val routeLineOptions = getMapboxRouteLineOptions(mapboxCarMapSurface)
87+
routeLineView = MapboxRouteLineView(routeLineOptions)
88+
routeLineApi = MapboxRouteLineApi(routeLineOptions).also {
89+
routeLineView.initializeLayers(mapboxCarMapSurface.style)
90+
}
91+
routeArrowApi = MapboxRouteArrowApi()
92+
routeArrowView = MapboxRouteArrowView(
93+
RouteArrowOptions.Builder(mainCarContext.carContext)
94+
.withAboveLayerId(TOP_LEVEL_ROUTE_LINE_LAYER_ID)
95+
.build()
96+
)
97+
11198
locationPlugin.addOnIndicatorPositionChangedListener(onPositionChangedListener)
11299
mainCarContext.mapboxNavigation.apply {
113100
registerRouteProgressObserver(routeProgressObserver)
114101
registerRoutesObserver(routesObserver)
115-
historyRecorder.startRecording()
116102
}
117103
}
118104

@@ -124,12 +110,21 @@ class CarRouteLine(
124110
unregisterRouteProgressObserver(routeProgressObserver)
125111
unregisterRoutesObserver(routesObserver)
126112
}
113+
}
127114

128-
mainCarContext.mapboxNavigation.historyRecorder.stopRecording {
129-
logAndroidAuto("CarRouteLine saved history $it")
130-
}
115+
private fun getMapboxRouteLineOptions(
116+
mapboxCarMapSurface: MapboxCarMapSurface
117+
): MapboxRouteLineOptions {
118+
return MapboxRouteLineOptions.Builder(mainCarContext.carContext)
119+
.withRouteLineResources(routeLineResources)
120+
.withRouteLineBelowLayerId(findRoadLabelsLayerId(mapboxCarMapSurface))
121+
.withVanishingRouteLineEnabled(true)
122+
.build()
123+
}
131124

132-
routeLineApi.cancel()
133-
routeLineView.cancel()
125+
private fun findRoadLabelsLayerId(mapboxCarMapSurface: MapboxCarMapSurface): String {
126+
return mapboxCarMapSurface.style.styleLayers.firstOrNull { layer ->
127+
layer.id.contains("road-label")
128+
}?.id ?: "road-label-navigation"
134129
}
135130
}

android-auto/src/main/java/com/mapbox/examples/androidauto/car/preview/CarRoutePreviewScreen.kt

+11-10
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.mapbox.examples.androidauto.car.preview
22

33
import android.text.SpannableString
4+
import androidx.activity.OnBackPressedCallback
45
import androidx.car.app.Screen
56
import androidx.car.app.model.Action
67
import androidx.car.app.model.DurationSpan
@@ -39,7 +40,6 @@ class CarRoutePreviewScreen(
3940
routePreviewCarContext.mapboxNavigation,
4041
CarNavigationCamera.CameraMode.OVERVIEW
4142
)
42-
private var routeSelected = false
4343

4444
override fun onGetTemplate(): Template {
4545
val listBuilder = ItemList.Builder()
@@ -88,18 +88,26 @@ class CarRoutePreviewScreen(
8888
Action.Builder()
8989
.setTitle(carContext.getString(R.string.car_action_preview_navigate_button))
9090
.setOnClickListener {
91-
routeSelected = true
9291
MapboxCarApp.updateCarAppState(ActiveGuidanceState)
9392
}
9493
.build())
9594
.build()
9695
}
9796

97+
private val backPressCallback = object : OnBackPressedCallback(true) {
98+
override fun handleOnBackPressed() {
99+
logAndroidAuto("CarRoutePreviewScreen OnBackPressedCallback")
100+
routePreviewCarContext.mapboxNavigation.setRoutes(listOf())
101+
screenManager.pop()
102+
}
103+
}
104+
98105
init {
99106
logAndroidAuto("CarRoutePreviewScreen constructor")
100107
lifecycle.addObserver(object : DefaultLifecycleObserver {
101108
override fun onResume(owner: LifecycleOwner) {
102109
logAndroidAuto("CarRoutePreviewScreen onResume")
110+
routePreviewCarContext.carContext.onBackPressedDispatcher.addCallback(backPressCallback)
103111
routePreviewCarContext.mapboxCarMap.registerObserver(carLocationRenderer)
104112
routePreviewCarContext.mapboxCarMap.registerObserver(carSpeedLimitRenderer)
105113
routePreviewCarContext.mapboxCarMap.registerObserver(carNavigationCamera)
@@ -108,14 +116,7 @@ class CarRoutePreviewScreen(
108116

109117
override fun onPause(owner: LifecycleOwner) {
110118
logAndroidAuto("CarRoutePreviewScreen onPause")
111-
// todo a better approach would be to listen for the header action but
112-
// there doesn't appear to be a way to do this. A feature request was
113-
// submitted to the Google Android Auto issue tracker:
114-
// https://issuetracker.google.com/u/0/issues/204353351
115-
if (!routeSelected) {
116-
routePreviewCarContext.mapboxNavigation.setRoutes(listOf())
117-
}
118-
119+
backPressCallback.remove()
119120
routePreviewCarContext.mapboxCarMap.unregisterObserver(carLocationRenderer)
120121
routePreviewCarContext.mapboxCarMap.unregisterObserver(carSpeedLimitRenderer)
121122
routePreviewCarContext.mapboxCarMap.unregisterObserver(carNavigationCamera)

0 commit comments

Comments
 (0)