Skip to content

Commit 61fa4ad

Browse files
authored
Add action to open Settings View from Automotive main screen (#6834)
1 parent b35fda6 commit 61fa4ad

4 files changed

Lines changed: 67 additions & 6 deletions

File tree

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package io.homeassistant.companion.android.util.vehicle
2+
3+
import android.app.ActivityOptions
4+
import android.content.Intent
5+
import android.os.Build
6+
import android.view.Display
7+
import androidx.car.app.CarContext
8+
import androidx.car.app.model.Action
9+
import androidx.car.app.model.CarColor
10+
import androidx.car.app.model.CarIcon
11+
import com.mikepenz.iconics.IconicsDrawable
12+
import com.mikepenz.iconics.typeface.library.community.material.CommunityMaterial
13+
import com.mikepenz.iconics.utils.sizeDp
14+
import com.mikepenz.iconics.utils.toAndroidIconCompat
15+
import io.homeassistant.companion.android.settings.SettingsActivity
16+
import timber.log.Timber
17+
18+
fun settingsAction(carContext: CarContext): Action {
19+
return Action.Builder()
20+
.setIcon(
21+
CarIcon.Builder(
22+
IconicsDrawable(carContext, CommunityMaterial.Icon.cmd_cog).apply {
23+
sizeDp = 64
24+
}.toAndroidIconCompat(),
25+
)
26+
.setTint(CarColor.DEFAULT)
27+
.build(),
28+
)
29+
.setOnClickListener {
30+
startSettingsActivity(carContext)
31+
}.build()
32+
}
33+
34+
private fun startSettingsActivity(carContext: CarContext) {
35+
Timber.d("Starting settings activity")
36+
// The app must indicate the default display to be used to avoid a SecurityException on newer
37+
// Android versions. See: https://developer.android.com/training/cars/platforms/releases#android-14
38+
val options = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
39+
ActivityOptions.makeBasic()
40+
.setLaunchDisplayId(Display.DEFAULT_DISPLAY)
41+
.toBundle()
42+
} else {
43+
null
44+
}
45+
carContext.startActivity(
46+
SettingsActivity.newInstance(carContext).apply {
47+
flags = Intent.FLAG_ACTIVITY_NEW_TASK
48+
},
49+
options,
50+
)
51+
}

app/src/main/kotlin/io/homeassistant/companion/android/vehicle/BaseVehicleScreen.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@ import timber.log.Timber
1212
abstract class BaseVehicleScreen(carContext: CarContext) : Screen(carContext) {
1313
private var car: Car? = null
1414
private var carRestrictionManager: CarUxRestrictionsManager? = null
15-
protected val isDrivingOptimized
15+
protected val isDrivingOptimized: Boolean
1616
get() = try {
17-
(car?.getCarManager(Car.CAR_UX_RESTRICTION_SERVICE) as? CarUxRestrictionsManager)
17+
carRestrictionManager
1818
?.currentCarUxRestrictions
1919
?.isRequiresDistractionOptimization
2020
?: false
@@ -32,6 +32,7 @@ abstract class BaseVehicleScreen(carContext: CarContext) : Screen(carContext) {
3232

3333
override fun onPause(owner: LifecycleOwner) {
3434
carRestrictionManager?.unregisterListener()
35+
carRestrictionManager = null
3536
car?.disconnect()
3637
car = null
3738
}
@@ -51,6 +52,7 @@ abstract class BaseVehicleScreen(carContext: CarContext) : Screen(carContext) {
5152
onDrivingOptimizedChanged(restrictions.isRequiresDistractionOptimization)
5253
}
5354
carRestrictionManager?.registerListener(listener)
55+
invalidate()
5456
}
5557
}
5658
}

app/src/main/kotlin/io/homeassistant/companion/android/vehicle/DomainListScreen.kt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import io.homeassistant.companion.android.util.vehicle.SUPPORTED_DOMAINS
1717
import io.homeassistant.companion.android.util.vehicle.getDomainList
1818
import io.homeassistant.companion.android.util.vehicle.getHeaderBuilder
1919
import io.homeassistant.companion.android.util.vehicle.nativeModeAction
20+
import io.homeassistant.companion.android.util.vehicle.settingsAction
2021
import kotlinx.coroutines.flow.Flow
2122
import kotlinx.coroutines.flow.StateFlow
2223
import kotlinx.coroutines.launch
@@ -71,8 +72,11 @@ class DomainListScreen(
7172

7273
return GridTemplate.Builder().apply {
7374
val headerBuilder = carContext.getHeaderBuilder(R.string.all_entities)
74-
if (isAutomotive && !isDrivingOptimized && BuildConfig.FLAVOR != "full") {
75-
headerBuilder.addEndHeaderAction(nativeModeAction(carContext))
75+
if (isAutomotive && !isDrivingOptimized) {
76+
if (BuildConfig.FLAVOR != "full") {
77+
headerBuilder.addEndHeaderAction(nativeModeAction(carContext))
78+
}
79+
headerBuilder.addEndHeaderAction(settingsAction(carContext))
7680
}
7781
setHeader(headerBuilder.build())
7882
val domainBuild = domainList.build()

app/src/main/kotlin/io/homeassistant/companion/android/vehicle/MainVehicleScreen.kt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import io.homeassistant.companion.android.util.vehicle.getDomainList
3232
import io.homeassistant.companion.android.util.vehicle.getHeaderBuilder
3333
import io.homeassistant.companion.android.util.vehicle.getNavigationGridItem
3434
import io.homeassistant.companion.android.util.vehicle.nativeModeAction
35+
import io.homeassistant.companion.android.util.vehicle.settingsAction
3536
import kotlinx.coroutines.CancellationException
3637
import kotlinx.coroutines.Job
3738
import kotlinx.coroutines.delay
@@ -217,8 +218,11 @@ class MainVehicleScreen(
217218
}.build()
218219

219220
val headerBuilder = carContext.getHeaderBuilder(commonR.string.app_name, Action.APP_ICON)
220-
if (isAutomotive && !isDrivingOptimized && BuildConfig.FLAVOR != "full") {
221-
headerBuilder.addEndHeaderAction(nativeModeAction(carContext))
221+
if (isAutomotive && !isDrivingOptimized) {
222+
if (BuildConfig.FLAVOR != "full") {
223+
headerBuilder.addEndHeaderAction(nativeModeAction(carContext))
224+
}
225+
headerBuilder.addEndHeaderAction(settingsAction(carContext))
222226
}
223227
headerBuilder.addEndHeaderAction(refreshAction)
224228

0 commit comments

Comments
 (0)