Skip to content

Commit 2631226

Browse files
committed
Use CarAppService for startActivity instead of CarContext
fixes #375 for startActivity and openUrl https://issuetracker.google.com/issues/372055514 Warning: You must update to androidx.car.app:1.7.0-alpha01 or later for the permissions dialog to show up on the phone screen when your app is used on a device running Android 14 or higher.
1 parent ff388a0 commit 2631226

File tree

9 files changed

+112
-42
lines changed

9 files changed

+112
-42
lines changed

app/src/main/java/net/vonforst/evmap/auto/CarAppService.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ class EVMapSession(val cas: CarAppService) : Session(), DefaultLifecycleObserver
166166
}
167167
if (!prefs.privacyAccepted) {
168168
screens.add(
169-
AcceptPrivacyScreen(carContext)
169+
AcceptPrivacyScreen(carContext, this)
170170
)
171171
}
172172
handleACRAIntent(intent)?.let {

app/src/main/java/net/vonforst/evmap/auto/ChargepriceScreen.kt

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,18 @@ package net.vonforst.evmap.auto
33
import androidx.car.app.CarContext
44
import androidx.car.app.CarToast
55
import androidx.car.app.Screen
6+
import androidx.car.app.annotations.ExperimentalCarApi
67
import androidx.car.app.constraints.ConstraintManager
78
import androidx.car.app.hardware.CarHardwareManager
89
import androidx.car.app.hardware.info.Model
9-
import androidx.car.app.model.*
10+
import androidx.car.app.model.Action
11+
import androidx.car.app.model.ActionStrip
12+
import androidx.car.app.model.CarIcon
13+
import androidx.car.app.model.ItemList
14+
import androidx.car.app.model.ListTemplate
15+
import androidx.car.app.model.Row
16+
import androidx.car.app.model.SectionedItemList
17+
import androidx.car.app.model.Template
1018
import androidx.core.content.ContextCompat
1119
import androidx.core.graphics.drawable.IconCompat
1220
import androidx.lifecycle.lifecycleScope
@@ -18,7 +26,16 @@ import kotlinx.coroutines.Dispatchers
1826
import kotlinx.coroutines.launch
1927
import kotlinx.coroutines.withContext
2028
import net.vonforst.evmap.R
21-
import net.vonforst.evmap.api.chargeprice.*
29+
import net.vonforst.evmap.api.chargeprice.ChargePrice
30+
import net.vonforst.evmap.api.chargeprice.ChargepriceApi
31+
import net.vonforst.evmap.api.chargeprice.ChargepriceCar
32+
import net.vonforst.evmap.api.chargeprice.ChargepriceChargepointMeta
33+
import net.vonforst.evmap.api.chargeprice.ChargepriceInclude
34+
import net.vonforst.evmap.api.chargeprice.ChargepriceMeta
35+
import net.vonforst.evmap.api.chargeprice.ChargepriceOptions
36+
import net.vonforst.evmap.api.chargeprice.ChargepriceRequest
37+
import net.vonforst.evmap.api.chargeprice.ChargepriceRequestTariffMeta
38+
import net.vonforst.evmap.api.chargeprice.ChargepriceStation
2239
import net.vonforst.evmap.api.equivalentPlugTypes
2340
import net.vonforst.evmap.api.nameForPlugType
2441
import net.vonforst.evmap.api.stringProvider
@@ -32,7 +49,9 @@ import retrofit2.HttpException
3249
import java.io.IOException
3350
import kotlin.math.roundToInt
3451

35-
class ChargepriceScreen(ctx: CarContext, val charger: ChargeLocation) : Screen(ctx) {
52+
@ExperimentalCarApi
53+
class ChargepriceScreen(ctx: CarContext, val session: EVMapSession, val charger: ChargeLocation) :
54+
Screen(ctx) {
3655
private val prefs = PreferenceDataSource(ctx)
3756
private val db = AppDatabase.getInstance(carContext)
3857
private val api by lazy {
@@ -130,7 +149,7 @@ class ChargepriceScreen(ctx: CarContext, val charger: ChargeLocation) : Screen(c
130149
)
131150
).build()
132151
).setOnClickListener {
133-
openUrl(carContext, ChargepriceApi.getPoiUrl(charger))
152+
openUrl(carContext, session.cas, ChargepriceApi.getPoiUrl(charger))
134153
}.build()
135154
).build()
136155
)

app/src/main/java/net/vonforst/evmap/auto/ChargerDetailScreen.kt

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import android.text.Spanned
1313
import androidx.car.app.CarContext
1414
import androidx.car.app.CarToast
1515
import androidx.car.app.Screen
16+
import androidx.car.app.annotations.ExperimentalCarApi
1617
import androidx.car.app.constraints.ConstraintManager
1718
import androidx.car.app.model.Action
1819
import androidx.car.app.model.ActionStrip
@@ -68,7 +69,11 @@ import java.time.format.FormatStyle
6869
import kotlin.math.floor
6970
import kotlin.math.roundToInt
7071

71-
class ChargerDetailScreen(ctx: CarContext, val chargerSparse: ChargeLocation) : Screen(ctx) {
72+
class ChargerDetailScreen(
73+
ctx: CarContext,
74+
val chargerSparse: ChargeLocation,
75+
val session: EVMapSession
76+
) : Screen(ctx) {
7277
var charger: ChargeLocation? = null
7378
var photo: Bitmap? = null
7479
private var availability: ChargeLocationStatus? = null
@@ -128,7 +133,7 @@ class ChargerDetailScreen(ctx: CarContext, val chargerSparse: ChargeLocation) :
128133
.setFlags(Action.FLAG_PRIMARY)
129134
.setBackgroundColor(CarColor.PRIMARY)
130135
.setOnClickListener {
131-
navigateToCharger(carContext, charger)
136+
navigateToCharger(carContext, session.cas, charger)
132137
}
133138
.build())
134139
if (ChargepriceApi.isChargerSupported(charger)) {
@@ -145,14 +150,20 @@ class ChargerDetailScreen(ctx: CarContext, val chargerSparse: ChargeLocation) :
145150
.setTitle(carContext.getString(R.string.auto_prices))
146151
.setOnClickListener {
147152
if (prefs.chargepriceNativeIntegration) {
148-
screenManager.push(ChargepriceScreen(carContext, charger))
153+
screenManager.push(
154+
ChargepriceScreen(
155+
carContext,
156+
session,
157+
charger
158+
)
159+
)
149160
} else {
150161
val intent = Intent(
151162
Intent.ACTION_VIEW,
152163
Uri.parse(ChargepriceApi.getPoiUrl(charger))
153164
)
154165
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
155-
carContext.startActivity(intent)
166+
session.cas.startActivity(intent)
156167
}
157168
}
158169
.build())
@@ -171,12 +182,12 @@ class ChargerDetailScreen(ctx: CarContext, val chargerSparse: ChargeLocation) :
171182
Action.Builder()
172183
.setTitle(carContext.getString(R.string.open_in_app))
173184
.setOnClickListener(ParkedOnlyOnClickListener.create {
174-
val intent = Intent(carContext, MapsActivity::class.java)
185+
val intent = Intent(session.cas, MapsActivity::class.java)
175186
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
176187
.putExtra(EXTRA_CHARGER_ID, chargerSparse.id)
177188
.putExtra(EXTRA_LAT, chargerSparse.coordinates.lat)
178189
.putExtra(EXTRA_LON, chargerSparse.coordinates.lng)
179-
carContext.startActivity(intent)
190+
session.cas.startActivity(intent)
180191
CarToast.makeText(
181192
carContext,
182193
R.string.opened_on_phone,

app/src/main/java/net/vonforst/evmap/auto/ChargerListFormatter.kt

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import android.text.SpannableString
55
import android.text.SpannableStringBuilder
66
import android.text.Spanned
77
import androidx.car.app.CarContext
8+
import androidx.car.app.annotations.ExperimentalCarApi
89
import androidx.car.app.hardware.info.EnergyLevel
910
import androidx.car.app.model.Action
1011
import androidx.car.app.model.CarColor
@@ -43,7 +44,12 @@ interface ChargerListDelegate : ItemList.OnItemVisibilityChangedListener {
4344
fun onChargerClick(charger: ChargeLocation)
4445
}
4546

46-
class ChargerListFormatter(val carContext: CarContext, val screen: ChargerListDelegate) {
47+
@ExperimentalCarApi
48+
class ChargerListFormatter(
49+
val carContext: CarContext,
50+
val screen: ChargerListDelegate,
51+
val cas: CarAppService
52+
) {
4753
private val iconGen = ChargerIconGenerator(carContext, null, height = 96)
4854
var favorites: Set<Long> = emptySet()
4955

@@ -235,7 +241,7 @@ class ChargerListFormatter(val carContext: CarContext, val screen: ChargerListDe
235241
setTitle(carContext.getString(R.string.navigate))
236242
setBackgroundColor(CarColor.PRIMARY)
237243
setOnClickListener {
238-
navigateToCharger(carContext, charger)
244+
navigateToCharger(carContext, cas, charger)
239245
}
240246
}.build())
241247
}.build()

app/src/main/java/net/vonforst/evmap/auto/LegacyMapScreen.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ class LegacyMapScreen(ctx: CarContext, val session: EVMapSession) :
126126

127127
private var searchLocation: LatLng? = null
128128

129-
private val formatter = ChargerListFormatter(ctx, this)
129+
private val formatter = ChargerListFormatter(ctx, this, session.cas)
130130

131131
init {
132132
lifecycle.addObserver(this)
@@ -260,7 +260,7 @@ class LegacyMapScreen(ctx: CarContext, val session: EVMapSession) :
260260
}
261261

262262
override fun onChargerClick(charger: ChargeLocation) {
263-
screenManager.push(ChargerDetailScreen(carContext, charger))
263+
screenManager.push(ChargerDetailScreen(carContext, charger, session))
264264
session.mapScreen = null
265265
}
266266

app/src/main/java/net/vonforst/evmap/auto/MapAttributionScreen.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package net.vonforst.evmap.auto
22

33
import androidx.car.app.CarContext
44
import androidx.car.app.Screen
5+
import androidx.car.app.annotations.ExperimentalCarApi
56
import androidx.car.app.model.Action
67
import androidx.car.app.model.Header
78
import androidx.car.app.model.ItemList
@@ -12,8 +13,10 @@ import androidx.car.app.model.Template
1213
import com.car2go.maps.AttributionClickListener
1314
import net.vonforst.evmap.R
1415

16+
@ExperimentalCarApi
1517
class MapAttributionScreen(
1618
ctx: CarContext,
19+
val session: EVMapSession,
1720
val attributions: List<AttributionClickListener.Attribution>
1821
) : Screen(ctx) {
1922
override fun onGetTemplate(): Template {
@@ -32,7 +35,7 @@ class MapAttributionScreen(
3235
.setBrowsable(true)
3336
.setOnClickListener(
3437
ParkedOnlyOnClickListener.create {
35-
openUrl(carContext, attr.url)
38+
openUrl(carContext, session.cas, attr.url)
3639
}).build()
3740
)
3841
}

app/src/main/java/net/vonforst/evmap/auto/MapScreen.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ class MapScreen(ctx: CarContext, val session: EVMapSession) :
140140
private var myLocationEnabled = false
141141
private var myLocationNeedsUpdate = false
142142

143-
private val formatter = ChargerListFormatter(ctx, this)
143+
private val formatter = ChargerListFormatter(ctx, this, session.cas)
144144
private val backPressedCallback = object : OnBackPressedCallback(false) {
145145
override fun handleOnBackPressed() {
146146
clearSelectedCharger()
@@ -188,7 +188,7 @@ class MapScreen(ctx: CarContext, val session: EVMapSession) :
188188
selectedCharger,
189189
availabilities.get(selectedCharger.id)?.second
190190
) {
191-
screenManager.push(ChargerDetailScreen(carContext, selectedCharger))
191+
screenManager.push(ChargerDetailScreen(carContext, selectedCharger, session))
192192
session.mapScreen = null
193193
}).apply {
194194
setHeader(Header.Builder().apply {
@@ -607,7 +607,7 @@ class MapScreen(ctx: CarContext, val session: EVMapSession) :
607607
map.setIndoorEnabled(false)
608608
map.uiSettings.setIndoorLevelPickerEnabled(false)
609609
map.setAttributionClickListener { attributions ->
610-
screenManager.push(MapAttributionScreen(carContext, attributions))
610+
screenManager.push(MapAttributionScreen(carContext, session, attributions))
611611
}
612612
map.setOnMapClickListener {
613613
clearSelectedCharger()

0 commit comments

Comments
 (0)