Skip to content

Commit

Permalink
Add example for onClick
Browse files Browse the repository at this point in the history
  • Loading branch information
kmadsen committed Sep 22, 2022
1 parent 4f1eb41 commit 5f66310
Show file tree
Hide file tree
Showing 9 changed files with 184 additions and 6 deletions.
5 changes: 4 additions & 1 deletion android-auto-app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,10 @@ androidExtensions {
dependencies {
implementation(project(":extension-androidauto"))
implementation(project(":sdk"))
implementation(Dependencies.googleCarAppLibrary)

// Upgrade the google car library to demonstrate adopting new apis.
implementation("androidx.car.app:app:1.3.0-beta01")

implementation(Dependencies.kotlin)
implementation(Dependencies.androidxAppCompat)
implementation(Dependencies.androidxCoreKtx)
Expand Down
2 changes: 1 addition & 1 deletion android-auto-app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@
tools:ignore="MetadataTagInsideApplicationTag" />
<meta-data
android:name="androidx.car.app.minCarApiLevel"
android:value="1"
android:value="5"
tools:ignore="MetadataTagInsideApplicationTag" />

<service
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,29 @@
package com.mapbox.maps.testapp.auto.app

import android.os.Bundle
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.SwitchCompat
import com.mapbox.maps.testapp.auto.R
import com.mapbox.maps.testapp.auto.service.CarAppPreferences

class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val switchButton: SwitchCompat = findViewById(R.id.switchButton)

val carAppPreferences = CarAppPreferences(applicationContext)
switchButton.isChecked = carAppPreferences.isCustomCallbackEnabled()
switchButton.setOnCheckedChangeListener { _, isChecked ->
if (carAppPreferences.isCustomCallbackEnabled() != isChecked) {
Toast.makeText(
this,
"Custom setting changed, reconnect Android Auto to ensure a restart",
Toast.LENGTH_LONG
).show()
carAppPreferences.enableCustomCallback(isChecked)
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
package com.mapbox.maps.testapp.auto.custom

import android.Manifest.permission.ACCESS_FINE_LOCATION
import android.content.Intent
import android.content.pm.PackageManager.PERMISSION_GRANTED
import android.content.res.Configuration
import androidx.car.app.AppManager
import androidx.car.app.Screen
import androidx.car.app.ScreenManager
import androidx.car.app.Session
import androidx.car.app.SurfaceCallback
import androidx.lifecycle.DefaultLifecycleObserver
import androidx.lifecycle.LifecycleOwner
import com.mapbox.maps.MapInitOptions
import com.mapbox.maps.MapboxExperimental
import com.mapbox.maps.extension.androidauto.MapboxCarMap
import com.mapbox.maps.logI
import com.mapbox.maps.testapp.auto.car.CarAnimationThreadController
import com.mapbox.maps.testapp.auto.car.CarMapShowcase
import com.mapbox.maps.testapp.auto.car.CarMapWidgets
import com.mapbox.maps.testapp.auto.car.MapScreen
import com.mapbox.maps.testapp.auto.car.RequestPermissionScreen

/**
* This session demonstrates an ability to upgrade the androidx.car.app:app: dependency to a new
* version and use the [SurfaceCallback.onClick] function.
*/
@OptIn(MapboxExperimental::class)
class CustomMapSession : Session() {

private val carAnimationThreadController = CarAnimationThreadController()
private val carMapWidgets = CarMapWidgets()
private val carMapShowcase = CarMapShowcase()
private val mapboxCarMap = MapboxCarMap()

init {
lifecycle.addObserver(object : DefaultLifecycleObserver {
override fun onCreate(owner: LifecycleOwner) {
val mapInitOptions = MapInitOptions(carContext)
mapboxCarMap.registerObserver(carAnimationThreadController)
mapboxCarMap.registerObserver(carMapWidgets)
mapboxCarMap.registerObserver(carMapShowcase)

val surfaceCallback = mapboxCarMap.prepareSurfaceCallback(carContext, mapInitOptions)
carContext.getCarService(AppManager::class.java)
.setSurfaceCallback(object : SurfaceCallbackInterceptor(surfaceCallback) {
override fun onClick(x: Float, y: Float) {
super.onClick(x, y)
onMapSurfaceClick(x, y)
}
})
}

override fun onDestroy(owner: LifecycleOwner) {
// This may not be needed, but it will ensure the reference is removed.
carContext.getCarService(AppManager::class.java).setSurfaceCallback(null)

mapboxCarMap.unregisterObserver(carMapShowcase)
mapboxCarMap.unregisterObserver(carMapWidgets)
mapboxCarMap.unregisterObserver(carAnimationThreadController)
}
})
}

override fun onCreateScreen(intent: Intent): Screen {
val mapScreen = MapScreen(mapboxCarMap)
return if (carContext.checkSelfPermission(ACCESS_FINE_LOCATION) != PERMISSION_GRANTED) {
carContext.getCarService(ScreenManager::class.java)
.push(mapScreen)
RequestPermissionScreen(carContext)
} else mapScreen
}

override fun onCarConfigurationChanged(newConfiguration: Configuration) {
carMapShowcase.loadMapStyle(carContext)
}

private fun onMapSurfaceClick(x: Float, y: Float) {
logI("CustomMapSession", "onClick $x $y")
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package com.mapbox.maps.testapp.auto.custom

import android.graphics.Rect
import androidx.car.app.SurfaceCallback
import androidx.car.app.SurfaceContainer

abstract class SurfaceCallbackInterceptor constructor(
private val surfaceCallback: SurfaceCallback
) : SurfaceCallback {

override fun onSurfaceAvailable(surfaceContainer: SurfaceContainer) =
surfaceCallback.onSurfaceAvailable(surfaceContainer)

override fun onSurfaceDestroyed(surfaceContainer: SurfaceContainer) =
surfaceCallback.onSurfaceDestroyed(surfaceContainer)

override fun onVisibleAreaChanged(visibleArea: Rect) =
surfaceCallback.onVisibleAreaChanged(visibleArea)

override fun onStableAreaChanged(stableArea: Rect) =
surfaceCallback.onStableAreaChanged(stableArea)

override fun onScale(focusX: Float, focusY: Float, scaleFactor: Float) =
surfaceCallback.onScale(focusX, focusY, scaleFactor)

override fun onScroll(distanceX: Float, distanceY: Float) =
surfaceCallback.onScroll(distanceX, distanceY)

override fun onFling(velocityX: Float, velocityY: Float) =
surfaceCallback.onFling(velocityX, velocityY)

override fun onClick(x: Float, y: Float) =
surfaceCallback.onClick(x, y)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.mapbox.maps.testapp.auto.service

import android.content.Context

/**
* Class gives you the ability to modify the demo app shared preferences.
*/
class CarAppPreferences(context: Context) {

private val sharedPreferences by lazy {
context.getSharedPreferences(SHARED_PREFERENCES_KEY, Context.MODE_PRIVATE)
}

fun enableCustomCallback(enable: Boolean) {
sharedPreferences.edit().putBoolean(BOOLEAN_KEY_ENABLE_CUSTOM_CALLBACK, enable).apply()
}

fun isCustomCallbackEnabled() = sharedPreferences
.getBoolean(BOOLEAN_KEY_ENABLE_CUSTOM_CALLBACK, false)

private companion object {
private const val SHARED_PREFERENCES_KEY = "mapbox_maps_android_auto_app"

private const val BOOLEAN_KEY_ENABLE_CUSTOM_CALLBACK = "enable_custom_callback"
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import androidx.car.app.CarAppService
import androidx.car.app.Session
import androidx.car.app.validation.HostValidator
import com.mapbox.maps.testapp.auto.car.MapSession
import com.mapbox.maps.testapp.auto.custom.CustomMapSession

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

override fun onCreateSession(): Session {
return MapSession()
return if (CarAppPreferences(this).isCustomCallbackEnabled()) {
CustomMapSession()
} else {
MapSession()
}
}
}
14 changes: 13 additions & 1 deletion android-auto-app/src/main/res/layout/activity_main.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,25 @@
tools:context=".app.MainActivity">

<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Android Auto testing activity"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:text="Android Auto testing activity"
tools:ignore="HardcodedText" />

<androidx.appcompat.widget.SwitchCompat
android:id="@+id/switchButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Enable onClick"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView"
tools:ignore="HardcodedText"/>

</androidx.constraintlayout.widget.ConstraintLayout>
4 changes: 2 additions & 2 deletions buildSrc/src/main/kotlin/Project.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ object AndroidVersions {
object AndroidAuto {
const val minSdkVersion = 23
const val targetSdkVersion = 30
const val compileSdkVersion = 31
const val compileSdkVersion = 33
}
object Compose {
const val minSdkVersion = 23
Expand Down Expand Up @@ -96,7 +96,7 @@ object Dependencies {

object Versions {
const val pluginAndroidGradle = "7.0.4"
const val pluginKotlin = "1.5.31"
const val pluginKotlin = "1.7.10"
const val pluginLicense = "0.8.80"
const val pluginDokka = "1.5.31"
const val pluginJacoco = "0.2"
Expand Down

0 comments on commit 5f66310

Please sign in to comment.