Skip to content

Commit 5d98b9e

Browse files
ianthetechieclaude
andauthored
Replace Material Icons with custom drawable resources (#908)
* Android: Remove Compose Material Icons libraries (#907) Replace all androidx.compose.material.icons usages with manually-added vector drawables and drop the material-icons-extended dependency (which also transitively pulled material-icons-core). Per Google's guidance this cuts build times and bundle size; the project uses material3, which does not bundle the icons packages. Shared control icons (add, remove, navigation, route, volume mute/up, plus new close and keyboard_arrow_up) now live in the ui-shared module so both ui-compose and car-app consume a single copy; the six icons previously duplicated in car-app are moved there and InterfaceCarIcons now resolves them from ui-shared. The demo-app-only my_location icon stays in demo-app. Icons are rendered via painterResource + Icon(tint = ...), matching the existing ManeuverImage pattern. New drawables use Material Symbols to match the icons car-app already shipped. Note: paparazzi snapshots for NavigationUIButtonTest, NavigatingInnerGridViewTest and TripProgressViewTest (exit variant) must be re-recorded (just record-android-snapshots) since the rendered glyphs change. https://claude.ai/code/session_012TeDMkp8aF2XywjsNZR6H4 * Update snapshots --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent 7f96e60 commit 5d98b9e

30 files changed

Lines changed: 69 additions & 39 deletions

File tree

android/car-app/src/main/java/com/stadiamaps/ferrostar/car/app/template/icons/InterfaceCarIcons.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package com.stadiamaps.ferrostar.car.app.template.icons
33
import android.content.Context
44
import androidx.car.app.model.CarIcon
55
import androidx.core.graphics.drawable.IconCompat
6-
import com.stadiamaps.ferrostar.car.app.R
6+
import com.stadiamaps.ferrostar.ui.shared.R
77

88
class InterfaceCarIcons(context: Context) {
99
val add: CarIcon =

android/demo-app/build.gradle

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,6 @@ dependencies {
6363
implementation libs.androidx.compose.ui.graphics
6464
implementation libs.androidx.compose.ui.tooling
6565
implementation libs.androidx.compose.material3
66-
implementation libs.androidx.compose.material.icon.extended
6766

6867
implementation libs.androidx.car.app
6968

android/demo-app/src/main/java/com/stadiamaps/ferrostar/NotNavigatingOverlay.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@ import androidx.compose.foundation.layout.Box
44
import androidx.compose.foundation.layout.Column
55
import androidx.compose.foundation.layout.fillMaxSize
66
import androidx.compose.foundation.layout.padding
7-
import androidx.compose.material.icons.Icons
8-
import androidx.compose.material.icons.filled.MyLocation
97
import androidx.compose.material3.Button
108
import androidx.compose.material3.ExperimentalMaterial3Api
119
import androidx.compose.material3.Icon
@@ -20,6 +18,7 @@ import androidx.compose.ui.Modifier
2018
import androidx.compose.ui.graphics.Shadow
2119
import androidx.compose.ui.layout.boundsInRoot
2220
import androidx.compose.ui.layout.onGloballyPositioned
21+
import androidx.compose.ui.res.painterResource
2322
import androidx.compose.ui.res.stringResource
2423
import androidx.compose.ui.unit.DpSize
2524
import androidx.compose.ui.unit.dp
@@ -80,7 +79,7 @@ fun NotNavigatingOverlay(
8079
buttonSize = DpSize(48.dp, 48.dp),
8180
) {
8281
Icon(
83-
imageVector = Icons.Filled.MyLocation,
82+
painter = painterResource(R.drawable.my_location_24px),
8483
contentDescription = stringResource(R.string.center_on_my_location),
8584
)
8685
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<vector xmlns:android="http://schemas.android.com/apk/res/android"
2+
android:width="24dp"
3+
android:height="24dp"
4+
android:viewportWidth="960"
5+
android:viewportHeight="960"
6+
android:tint="?attr/colorControlNormal">
7+
<group android:translateY="960">
8+
<path
9+
android:fillColor="@android:color/white"
10+
android:pathData="M440-42v-80q-125-14-214.5-103.5T122-440H42v-80h80q14-125 103.5-214.5T440-838v-80h80v80q125 14 214.5 103.5T838-520h80v80h-80q-14 125-103.5 214.5T520-122v80h-80Zm40-158q116 0 198-82t82-198q0-116-82-198t-198-82q-116 0-198 82t-82 198q0 116 82 198t198 82Zm0-120q-66 0-113-47t-47-113q0-66 47-113t113-47q66 0 113 47t47 113q0 66-47 113t-113 47Zm0-80q33 0 56.5-23.5T560-480q0-33-23.5-56.5T480-560q-33 0-56.5 23.5T400-480q0 33 23.5 56.5T480-400Zm0-80Z"/>
11+
</group>
12+
</vector>

android/gradle/libs.versions.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@ androidx-compose-ui-graphics = { group = "androidx.compose.ui", name = "ui-graph
5050
androidx-compose-ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling" }
5151
androidx-compose-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview" }
5252
androidx-compose-material3 = { group = "androidx.compose.material3", name = "material3" }
53-
androidx-compose-material-icon-extended = { group = "androidx.compose.material", name = "material-icons-extended" }
5453
androidx-compose-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" }
5554
# Car App Library (for car-app module)
5655
androidx-car-app = { group = "androidx.car.app", name = "app", version.ref = "androidx-car-app" }

android/ui-compose/build.gradle

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@ dependencies {
4747
implementation libs.androidx.compose.ui.graphics
4848
implementation libs.androidx.compose.ui.tooling.preview
4949
implementation libs.androidx.compose.material3
50-
implementation libs.androidx.compose.material.icon.extended
5150

5251
implementation project(':core')
5352
implementation project(':ui-formatters')

android/ui-compose/src/main/java/com/stadiamaps/ferrostar/composeui/views/components/TripProgressView.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,6 @@ import androidx.compose.foundation.layout.padding
1111
import androidx.compose.foundation.layout.size
1212
import androidx.compose.foundation.shape.CircleShape
1313
import androidx.compose.foundation.shape.RoundedCornerShape
14-
import androidx.compose.material.icons.Icons
15-
import androidx.compose.material.icons.filled.Close
1614
import androidx.compose.material3.Button
1715
import androidx.compose.material3.ButtonDefaults
1816
import androidx.compose.material3.Icon
@@ -23,6 +21,7 @@ import androidx.compose.ui.Alignment
2321
import androidx.compose.ui.Modifier
2422
import androidx.compose.ui.draw.shadow
2523
import androidx.compose.ui.graphics.Color
24+
import androidx.compose.ui.res.painterResource
2625
import androidx.compose.ui.res.stringResource
2726
import androidx.compose.ui.text.TextStyle
2827
import androidx.compose.ui.text.font.FontWeight
@@ -39,6 +38,7 @@ import com.stadiamaps.ferrostar.ui.formatters.DurationFormatter
3938
import com.stadiamaps.ferrostar.ui.formatters.EstimatedArrivalDateTimeFormatter
4039
import com.stadiamaps.ferrostar.ui.formatters.LocalizedDistanceFormatter
4140
import com.stadiamaps.ferrostar.ui.formatters.LocalizedDurationFormatter
41+
import com.stadiamaps.ferrostar.ui.shared.R as SharedR
4242
import kotlin.time.Clock
4343
import kotlin.time.ExperimentalTime
4444
import kotlin.time.Instant
@@ -127,7 +127,7 @@ fun TripProgressView(
127127
contentPadding = PaddingValues(0.dp),
128128
) {
129129
Icon(
130-
imageVector = Icons.Filled.Close,
130+
painter = painterResource(SharedR.drawable.close_24px),
131131
contentDescription = stringResource(id = R.string.end_navigation),
132132
tint = theme.exitIconColor,
133133
)

android/ui-compose/src/main/java/com/stadiamaps/ferrostar/composeui/views/components/controls/NavigationUIButton.kt

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@ import androidx.compose.foundation.layout.Box
55
import androidx.compose.foundation.layout.padding
66
import androidx.compose.foundation.layout.size
77
import androidx.compose.foundation.shape.CircleShape
8-
import androidx.compose.material.icons.Icons
9-
import androidx.compose.material.icons.filled.Close
108
import androidx.compose.material3.FloatingActionButton
119
import androidx.compose.material3.FloatingActionButtonDefaults
1210
import androidx.compose.material3.Icon
@@ -15,11 +13,13 @@ import androidx.compose.runtime.Composable
1513
import androidx.compose.ui.Modifier
1614
import androidx.compose.ui.draw.shadow
1715
import androidx.compose.ui.graphics.Color
16+
import androidx.compose.ui.res.painterResource
1817
import androidx.compose.ui.res.stringResource
1918
import androidx.compose.ui.tooling.preview.Preview
2019
import androidx.compose.ui.unit.DpSize
2120
import androidx.compose.ui.unit.dp
2221
import com.stadiamaps.ferrostar.composeui.R
22+
import com.stadiamaps.ferrostar.ui.shared.R as SharedR
2323

2424
/**
2525
* A FloatingActionButton styled for use in the navigation UI.
@@ -53,7 +53,10 @@ fun NavigationUIButton(
5353
fun NavigationUIButtonPreview() {
5454
Box(Modifier.background(Color.LightGray).padding(16.dp)) {
5555
NavigationUIButton({}, DpSize(56.dp, 56.dp)) {
56-
Icon(Icons.Filled.Close, contentDescription = stringResource(id = R.string.end_navigation))
56+
Icon(
57+
painterResource(SharedR.drawable.close_24px),
58+
contentDescription = stringResource(id = R.string.end_navigation),
59+
)
5760
}
5861
}
5962
}

android/ui-compose/src/main/java/com/stadiamaps/ferrostar/composeui/views/components/controls/NavigationUIZoomButton.kt

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,6 @@ import androidx.compose.foundation.layout.padding
88
import androidx.compose.foundation.layout.size
99
import androidx.compose.foundation.layout.width
1010
import androidx.compose.foundation.shape.RoundedCornerShape
11-
import androidx.compose.material.icons.Icons
12-
import androidx.compose.material.icons.filled.Add
13-
import androidx.compose.material.icons.filled.Remove
1411
import androidx.compose.material3.FloatingActionButton
1512
import androidx.compose.material3.FloatingActionButtonDefaults
1613
import androidx.compose.material3.HorizontalDivider
@@ -21,11 +18,13 @@ import androidx.compose.runtime.Composable
2118
import androidx.compose.ui.Modifier
2219
import androidx.compose.ui.draw.shadow
2320
import androidx.compose.ui.graphics.Color
21+
import androidx.compose.ui.res.painterResource
2422
import androidx.compose.ui.res.stringResource
2523
import androidx.compose.ui.tooling.preview.Preview
2624
import androidx.compose.ui.unit.DpSize
2725
import androidx.compose.ui.unit.dp
2826
import com.stadiamaps.ferrostar.composeui.R
27+
import com.stadiamaps.ferrostar.ui.shared.R as SharedR
2928

3029
@Composable
3130
fun NavigationUIZoomButton(
@@ -48,7 +47,7 @@ fun NavigationUIZoomButton(
4847
elevation = elevation,
4948
) {
5049
Icon(
51-
imageVector = Icons.Filled.Add,
50+
painter = painterResource(SharedR.drawable.add_24px),
5251
contentDescription = stringResource(id = R.string.zoom_in),
5352
)
5453
}
@@ -66,7 +65,7 @@ fun NavigationUIZoomButton(
6665
elevation = elevation,
6766
) {
6867
Icon(
69-
imageVector = Icons.Filled.Remove,
68+
painter = painterResource(SharedR.drawable.remove_24px),
7069
contentDescription = stringResource(id = R.string.zoom_out),
7170
)
7271
}

android/ui-compose/src/main/java/com/stadiamaps/ferrostar/composeui/views/components/controls/PillDragHandle.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,20 @@ import androidx.compose.foundation.layout.fillMaxWidth
77
import androidx.compose.foundation.layout.height
88
import androidx.compose.foundation.layout.width
99
import androidx.compose.foundation.shape.RoundedCornerShape
10-
import androidx.compose.material.icons.Icons
11-
import androidx.compose.material.icons.rounded.KeyboardArrowUp
1210
import androidx.compose.material3.Icon
1311
import androidx.compose.material3.MaterialTheme
1412
import androidx.compose.runtime.Composable
1513
import androidx.compose.ui.Alignment
1614
import androidx.compose.ui.Modifier
1715
import androidx.compose.ui.graphics.Color
16+
import androidx.compose.ui.res.painterResource
1817
import androidx.compose.ui.semantics.Role
1918
import androidx.compose.ui.semantics.onClick
2019
import androidx.compose.ui.semantics.role
2120
import androidx.compose.ui.semantics.semantics
2221
import androidx.compose.ui.tooling.preview.Preview
2322
import androidx.compose.ui.unit.dp
23+
import com.stadiamaps.ferrostar.ui.shared.R as SharedR
2424

2525
@Composable
2626
fun PillDragHandle(
@@ -33,7 +33,7 @@ fun PillDragHandle(
3333
Box(modifier = modifier.fillMaxWidth().height(handleHeight).clickable(onClick = toggle)) {
3434
if (isExpanded) {
3535
Icon(
36-
Icons.Rounded.KeyboardArrowUp,
36+
painterResource(SharedR.drawable.keyboard_arrow_up_24px),
3737
modifier = Modifier.align(Alignment.Center),
3838
contentDescription = "Show upcoming maneuvers",
3939
tint = iconTintColor,

0 commit comments

Comments
 (0)