Skip to content

Commit cde90b5

Browse files
committed
Add example for onClick
1 parent 7ea29d8 commit cde90b5

File tree

9 files changed

+184
-6
lines changed

9 files changed

+184
-6
lines changed

android-auto-app/build.gradle.kts

+4-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,10 @@ androidExtensions {
4646
dependencies {
4747
implementation(project(":extension-androidauto"))
4848
implementation(project(":sdk"))
49-
implementation(Dependencies.googleCarAppLibrary)
49+
50+
// Upgrade the google car library to demonstrate adopting new apis.
51+
implementation("androidx.car.app:app:1.3.0-beta01")
52+
5053
implementation(Dependencies.kotlin)
5154
implementation(Dependencies.androidxAppCompat)
5255
implementation(Dependencies.androidxCoreKtx)

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
tools:ignore="MetadataTagInsideApplicationTag" />
3636
<meta-data
3737
android:name="androidx.car.app.minCarApiLevel"
38-
android:value="1"
38+
android:value="5"
3939
tools:ignore="MetadataTagInsideApplicationTag" />
4040

4141
<service
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,29 @@
11
package com.mapbox.maps.testapp.auto.app
22

33
import android.os.Bundle
4+
import android.widget.Toast
45
import androidx.appcompat.app.AppCompatActivity
6+
import androidx.appcompat.widget.SwitchCompat
57
import com.mapbox.maps.testapp.auto.R
8+
import com.mapbox.maps.testapp.auto.service.CarAppPreferences
69

710
class MainActivity : AppCompatActivity() {
811
override fun onCreate(savedInstanceState: Bundle?) {
912
super.onCreate(savedInstanceState)
1013
setContentView(R.layout.activity_main)
14+
val switchButton: SwitchCompat = findViewById(R.id.switchButton)
15+
16+
val carAppPreferences = CarAppPreferences(applicationContext)
17+
switchButton.isChecked = carAppPreferences.isCustomCallbackEnabled()
18+
switchButton.setOnCheckedChangeListener { _, isChecked ->
19+
if (carAppPreferences.isCustomCallbackEnabled() != isChecked) {
20+
Toast.makeText(
21+
this,
22+
"Custom setting changed, reconnect Android Auto to ensure a restart",
23+
Toast.LENGTH_LONG
24+
).show()
25+
carAppPreferences.enableCustomCallback(isChecked)
26+
}
27+
}
1128
}
1229
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package com.mapbox.maps.testapp.auto.custom
2+
3+
import android.Manifest.permission.ACCESS_FINE_LOCATION
4+
import android.content.Intent
5+
import android.content.pm.PackageManager.PERMISSION_GRANTED
6+
import android.content.res.Configuration
7+
import androidx.car.app.AppManager
8+
import androidx.car.app.Screen
9+
import androidx.car.app.ScreenManager
10+
import androidx.car.app.Session
11+
import androidx.car.app.SurfaceCallback
12+
import androidx.lifecycle.DefaultLifecycleObserver
13+
import androidx.lifecycle.LifecycleOwner
14+
import com.mapbox.maps.MapInitOptions
15+
import com.mapbox.maps.MapboxExperimental
16+
import com.mapbox.maps.extension.androidauto.MapboxCarMap
17+
import com.mapbox.maps.logI
18+
import com.mapbox.maps.testapp.auto.car.CarAnimationThreadController
19+
import com.mapbox.maps.testapp.auto.car.CarMapShowcase
20+
import com.mapbox.maps.testapp.auto.car.CarMapWidgets
21+
import com.mapbox.maps.testapp.auto.car.MapScreen
22+
import com.mapbox.maps.testapp.auto.car.RequestPermissionScreen
23+
24+
/**
25+
* This session demonstrates an ability to upgrade the androidx.car.app:app: dependency to a new
26+
* version and use the [SurfaceCallback.onClick] function.
27+
*/
28+
@OptIn(MapboxExperimental::class)
29+
class CustomMapSession : Session() {
30+
31+
private val carAnimationThreadController = CarAnimationThreadController()
32+
private val carMapWidgets = CarMapWidgets()
33+
private val carMapShowcase = CarMapShowcase()
34+
private val mapboxCarMap = MapboxCarMap()
35+
36+
init {
37+
lifecycle.addObserver(object : DefaultLifecycleObserver {
38+
override fun onCreate(owner: LifecycleOwner) {
39+
val mapInitOptions = MapInitOptions(carContext)
40+
mapboxCarMap.registerObserver(carAnimationThreadController)
41+
mapboxCarMap.registerObserver(carMapWidgets)
42+
mapboxCarMap.registerObserver(carMapShowcase)
43+
44+
val handle = mapboxCarMap.setupWithCustomCallback(carContext, mapInitOptions)
45+
carContext.getCarService(AppManager::class.java)
46+
.setSurfaceCallback(object : CustomSurfaceCallback(handle) {
47+
override fun onClick(x: Float, y: Float) {
48+
super.onClick(x, y)
49+
onMapSurfaceClick(x, y)
50+
}
51+
})
52+
}
53+
54+
override fun onDestroy(owner: LifecycleOwner) {
55+
// Not sure this really would cause a memory leak, but to ensure the reference is removed.
56+
carContext.getCarService(AppManager::class.java).setSurfaceCallback(null)
57+
58+
mapboxCarMap.unregisterObserver(carMapShowcase)
59+
mapboxCarMap.unregisterObserver(carMapWidgets)
60+
mapboxCarMap.unregisterObserver(carAnimationThreadController)
61+
}
62+
})
63+
}
64+
65+
override fun onCreateScreen(intent: Intent): Screen {
66+
val mapScreen = MapScreen(mapboxCarMap)
67+
return if (carContext.checkSelfPermission(ACCESS_FINE_LOCATION) != PERMISSION_GRANTED) {
68+
carContext.getCarService(ScreenManager::class.java)
69+
.push(mapScreen)
70+
RequestPermissionScreen(carContext)
71+
} else mapScreen
72+
}
73+
74+
override fun onCarConfigurationChanged(newConfiguration: Configuration) {
75+
carMapShowcase.loadMapStyle(carContext)
76+
}
77+
78+
private fun onMapSurfaceClick(x: Float, y: Float) {
79+
logI("CustomMapSession", "onClick $x $y")
80+
}
81+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package com.mapbox.maps.testapp.auto.custom
2+
3+
import android.graphics.Rect
4+
import androidx.car.app.SurfaceCallback
5+
import androidx.car.app.SurfaceContainer
6+
import com.mapbox.maps.MapboxExperimental
7+
import com.mapbox.maps.extension.androidauto.CarMapSurfaceOwner
8+
9+
@OptIn(MapboxExperimental::class)
10+
abstract class CustomSurfaceCallback constructor(
11+
private val carMapSurfaceOwner: CarMapSurfaceOwner
12+
) : SurfaceCallback {
13+
14+
override fun onSurfaceAvailable(surfaceContainer: SurfaceContainer) =
15+
carMapSurfaceOwner.onSurfaceAvailable(surfaceContainer)
16+
17+
override fun onSurfaceDestroyed(surfaceContainer: SurfaceContainer) =
18+
carMapSurfaceOwner.onSurfaceDestroyed(surfaceContainer)
19+
20+
override fun onVisibleAreaChanged(visibleArea: Rect) =
21+
carMapSurfaceOwner.onVisibleAreaChanged(visibleArea)
22+
23+
override fun onStableAreaChanged(stableArea: Rect) =
24+
carMapSurfaceOwner.onStableAreaChanged(stableArea)
25+
26+
override fun onScale(focusX: Float, focusY: Float, scaleFactor: Float) =
27+
carMapSurfaceOwner.onScale(focusX, focusY, scaleFactor)
28+
29+
override fun onScroll(distanceX: Float, distanceY: Float) =
30+
carMapSurfaceOwner.onScroll(distanceX, distanceY)
31+
32+
override fun onFling(velocityX: Float, velocityY: Float) =
33+
carMapSurfaceOwner.onFling(velocityX, velocityY)
34+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.mapbox.maps.testapp.auto.service
2+
3+
import android.content.Context
4+
5+
/**
6+
* Class gives you the ability to modify the demo app shared preferences.
7+
*/
8+
class CarAppPreferences(context: Context) {
9+
10+
private val sharedPreferences by lazy {
11+
context.getSharedPreferences(SHARED_PREFERENCES_KEY, Context.MODE_PRIVATE)
12+
}
13+
14+
fun enableCustomCallback(enable: Boolean) {
15+
sharedPreferences.edit().putBoolean(BOOLEAN_KEY_ENABLE_CUSTOM_CALLBACK, enable).apply()
16+
}
17+
18+
fun isCustomCallbackEnabled() = sharedPreferences
19+
.getBoolean(BOOLEAN_KEY_ENABLE_CUSTOM_CALLBACK, false)
20+
21+
private companion object {
22+
private const val SHARED_PREFERENCES_KEY = "mapbox_maps_android_auto_app"
23+
24+
private const val BOOLEAN_KEY_ENABLE_CUSTOM_CALLBACK = "enable_custom_callback"
25+
}
26+
}

android-auto-app/src/main/java/com/mapbox/maps/testapp/auto/service/MapboxCarAppService.kt

+6-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import androidx.car.app.CarAppService
44
import androidx.car.app.Session
55
import androidx.car.app.validation.HostValidator
66
import com.mapbox.maps.testapp.auto.car.MapSession
7+
import com.mapbox.maps.testapp.auto.custom.CustomMapSession
78

89
/**
910
* Entry point for the templated app.
@@ -18,6 +19,10 @@ class MapboxCarAppService : CarAppService() {
1819
}
1920

2021
override fun onCreateSession(): Session {
21-
return MapSession()
22+
return if (CarAppPreferences(this).isCustomCallbackEnabled()) {
23+
CustomMapSession()
24+
} else {
25+
MapSession()
26+
}
2227
}
2328
}

android-auto-app/src/main/res/layout/activity_main.xml

+13-1
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,25 @@
77
tools:context=".app.MainActivity">
88

99
<TextView
10+
android:id="@+id/textView"
1011
android:layout_width="wrap_content"
1112
android:layout_height="wrap_content"
13+
android:text="Android Auto testing activity"
1214
app:layout_constraintBottom_toBottomOf="parent"
1315
app:layout_constraintEnd_toEndOf="parent"
1416
app:layout_constraintStart_toStartOf="parent"
1517
app:layout_constraintTop_toTopOf="parent"
16-
android:text="Android Auto testing activity"
1718
tools:ignore="HardcodedText" />
1819

20+
<androidx.appcompat.widget.SwitchCompat
21+
android:id="@+id/switchButton"
22+
android:layout_width="wrap_content"
23+
android:layout_height="wrap_content"
24+
android:text="Enable onClick"
25+
app:layout_constraintBottom_toBottomOf="parent"
26+
app:layout_constraintEnd_toEndOf="parent"
27+
app:layout_constraintStart_toStartOf="parent"
28+
app:layout_constraintTop_toBottomOf="@+id/textView"
29+
tools:ignore="HardcodedText"/>
30+
1931
</androidx.constraintlayout.widget.ConstraintLayout>

buildSrc/src/main/kotlin/Project.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ object AndroidVersions {
55
object AndroidAuto {
66
const val minSdkVersion = 23
77
const val targetSdkVersion = 30
8-
const val compileSdkVersion = 31
8+
const val compileSdkVersion = 33
99
}
1010
object Compose {
1111
const val minSdkVersion = 23
@@ -96,7 +96,7 @@ object Dependencies {
9696

9797
object Versions {
9898
const val pluginAndroidGradle = "7.0.4"
99-
const val pluginKotlin = "1.5.31"
99+
const val pluginKotlin = "1.7.10"
100100
const val pluginLicense = "0.8.80"
101101
const val pluginDokka = "1.5.31"
102102
const val pluginJacoco = "0.2"

0 commit comments

Comments
 (0)