Skip to content

Commit 1fbc2c2

Browse files
[Jetcaster] Replace Material Icons with drawable resources (#1591)
This commit replaces all usages of `androidx.compose.material.icons` with equivalent drawable resources. This change is applied across the `mobile`, `wear`, and `tv` modules. The primary motivation for this change is to reduce the dependency on the `androidx.compose.material.icons` library and to provide more explicit control over the visual assets used in the application. Specific changes include: - Removing dependencies on `androidx.material.icons.core` and `androidx.compose.material.iconsExtended` from `build.gradle` files. - Replacing `ImageVector` instances (e.g., `Icons.Default.Check`, `Icons.AutoMirrored.Filled.PlaylistAdd`) with `painterResource(id = R.drawable.*)` calls in various Composable functions. - Adding new XML drawable resources for icons that were previously sourced from the Material Icons library. These include icons such as `ic_add.xml`, `ic_remove.xml`, `ic_play_arrow.xml`, `ic_pause.xml`, etc. - Updating `ButtonWithIcon` composable in the `tv` module to accept a `@DrawableRes iconId: Int` instead of an `ImageVector`. - Minor cleanup in `Jetcaster/mobile/src/main/res/drawable/genres.xml` by removing the `android:tint` attribute. - Minor cleanup in `Jetcaster/mobile/src/main/res/values/strings.xml` by removing an extra space.
2 parents 66f684e + 3ecd7a8 commit 1fbc2c2

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

53 files changed

+387
-112
lines changed

Jetcaster/mobile/build.gradle.kts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,6 @@ dependencies {
119119
// Compose
120120
implementation(libs.androidx.activity.compose)
121121
implementation(libs.androidx.compose.foundation)
122-
implementation(libs.androidx.compose.material.iconsExtended)
123122
implementation(libs.androidx.compose.material3)
124123
implementation(libs.androidx.compose.material3.adaptive)
125124
implementation(libs.androidx.compose.material3.adaptive.layout)

Jetcaster/mobile/src/main/java/com/example/jetcaster/ui/home/Home.kt

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,6 @@ import androidx.compose.foundation.layout.windowInsetsPadding
3838
import androidx.compose.foundation.lazy.grid.GridCells
3939
import androidx.compose.foundation.lazy.grid.LazyVerticalGrid
4040
import androidx.compose.foundation.pager.rememberPagerState
41-
import androidx.compose.material.icons.Icons
42-
import androidx.compose.material.icons.filled.AccountCircle
43-
import androidx.compose.material.icons.filled.LibraryMusic
44-
import androidx.compose.material.icons.filled.Search
4541
import androidx.compose.material3.Button
4642
import androidx.compose.material3.ButtonColors
4743
import androidx.compose.material3.ExperimentalMaterial3Api
@@ -338,13 +334,13 @@ private fun HomeAppBar(isExpanded: Boolean, modifier: Modifier = Modifier) {
338334
},
339335
leadingIcon = {
340336
Icon(
341-
imageVector = Icons.Default.Search,
337+
painterResource(id = R.drawable.ic_search),
342338
contentDescription = null,
343339
)
344340
},
345341
trailingIcon = {
346342
Icon(
347-
imageVector = Icons.Default.AccountCircle,
343+
painterResource(id = R.drawable.ic_account_circle),
348344
contentDescription = stringResource(R.string.cd_account),
349345
)
350346
},
@@ -492,7 +488,7 @@ fun PillToolbar(selectedHomeCategory: HomeCategory, onHomeAction: (HomeAction) -
492488
) {
493489
Row(Modifier) {
494490
Icon(
495-
Icons.Filled.LibraryMusic,
491+
painterResource(id = R.drawable.ic_library_music),
496492
modifier = Modifier.padding(end = 8.dp),
497493
contentDescription = stringResource(
498494
R.string.library_toolbar_content_description,

Jetcaster/mobile/src/main/java/com/example/jetcaster/ui/home/discover/Discover.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,6 @@ import androidx.compose.foundation.layout.padding
2424
import androidx.compose.foundation.lazy.LazyRow
2525
import androidx.compose.foundation.lazy.grid.LazyGridScope
2626
import androidx.compose.foundation.lazy.itemsIndexed
27-
import androidx.compose.material.icons.Icons
28-
import androidx.compose.material.icons.filled.Check
2927
import androidx.compose.material3.ExperimentalMaterial3Api
3028
import androidx.compose.material3.FilterChip
3129
import androidx.compose.material3.FilterChipDefaults
@@ -35,6 +33,7 @@ import androidx.compose.material3.Text
3533
import androidx.compose.runtime.Composable
3634
import androidx.compose.ui.Alignment
3735
import androidx.compose.ui.Modifier
36+
import androidx.compose.ui.res.painterResource
3837
import androidx.compose.ui.res.stringResource
3938
import androidx.compose.ui.unit.dp
4039
import com.example.jetcaster.R
@@ -122,7 +121,7 @@ private fun ChoiceChipContent(text: String, selected: Boolean, onClick: () -> Un
122121
leadingIcon = {
123122
if (selected) {
124123
Icon(
125-
imageVector = Icons.Default.Check,
124+
painter = painterResource(id = R.drawable.ic_check),
126125
contentDescription = stringResource(id = R.string.cd_selected_category),
127126
modifier = Modifier.height(18.dp),
128127
)

Jetcaster/mobile/src/main/java/com/example/jetcaster/ui/player/PlayerScreen.kt

Lines changed: 9 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -50,16 +50,6 @@ import androidx.compose.foundation.layout.wrapContentSize
5050
import androidx.compose.foundation.rememberScrollState
5151
import androidx.compose.foundation.shape.RoundedCornerShape
5252
import androidx.compose.foundation.verticalScroll
53-
import androidx.compose.material.icons.Icons
54-
import androidx.compose.material.icons.automirrored.filled.ArrowBack
55-
import androidx.compose.material.icons.automirrored.filled.PlaylistAdd
56-
import androidx.compose.material.icons.filled.MoreVert
57-
import androidx.compose.material.icons.rounded.Forward10
58-
import androidx.compose.material.icons.rounded.Pause
59-
import androidx.compose.material.icons.rounded.PlayArrow
60-
import androidx.compose.material.icons.rounded.Replay10
61-
import androidx.compose.material.icons.rounded.SkipNext
62-
import androidx.compose.material.icons.rounded.SkipPrevious
6353
import androidx.compose.material3.ButtonGroup
6454
import androidx.compose.material3.CircularProgressIndicator
6555
import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
@@ -87,6 +77,7 @@ import androidx.compose.ui.Alignment
8777
import androidx.compose.ui.Modifier
8878
import androidx.compose.ui.draw.clip
8979
import androidx.compose.ui.layout.ContentScale
80+
import androidx.compose.ui.res.painterResource
9081
import androidx.compose.ui.res.stringResource
9182
import androidx.compose.ui.text.TextStyle
9283
import androidx.compose.ui.text.style.TextOverflow
@@ -586,20 +577,20 @@ private fun TopAppBar(onBackPress: () -> Unit, onAddToQueue: () -> Unit) {
586577
Row(Modifier.fillMaxWidth()) {
587578
IconButton(onClick = onBackPress) {
588579
Icon(
589-
imageVector = Icons.AutoMirrored.Filled.ArrowBack,
580+
painterResource(id = R.drawable.ic_arrow_back),
590581
contentDescription = stringResource(R.string.cd_back),
591582
)
592583
}
593584
Spacer(Modifier.weight(1f))
594585
IconButton(onClick = onAddToQueue) {
595586
Icon(
596-
imageVector = Icons.AutoMirrored.Filled.PlaylistAdd,
587+
painterResource(id = R.drawable.ic_playlist_add),
597588
contentDescription = stringResource(R.string.cd_add),
598589
)
599590
}
600591
IconButton(onClick = { /* TODO */ }) {
601592
Icon(
602-
imageVector = Icons.Default.MoreVert,
593+
painterResource(id = R.drawable.ic_more_vert),
603594
contentDescription = stringResource(R.string.cd_more),
604595
)
605596
}
@@ -755,7 +746,7 @@ private fun PlayerButtons(
755746
.height(136.dp),
756747
) {
757748
Icon(
758-
imageVector = if (isPlaying) Icons.Rounded.Pause else Icons.Rounded.PlayArrow,
749+
painterResource(id = if (isPlaying) R.drawable.ic_pause else R.drawable.ic_play_arrow),
759750
modifier = Modifier.fillMaxSize(),
760751
contentDescription = null,
761752
)
@@ -788,7 +779,7 @@ private fun PlayerButtons(
788779
enabled = isPlaying,
789780
) {
790781
Icon(
791-
imageVector = Icons.Rounded.SkipPrevious,
782+
painterResource(id = R.drawable.ic_skip_previous),
792783
contentDescription = null,
793784
)
794785
}
@@ -812,7 +803,7 @@ private fun PlayerButtons(
812803
enabled = isPlaying,
813804
) {
814805
Icon(
815-
imageVector = Icons.Rounded.Replay10,
806+
painterResource(id = R.drawable.ic_replay_10),
816807
contentDescription = null,
817808
)
818809
}
@@ -836,7 +827,7 @@ private fun PlayerButtons(
836827
enabled = isPlaying,
837828
) {
838829
Icon(
839-
imageVector = Icons.Rounded.Forward10,
830+
painterResource(id = R.drawable.ic_forward_10),
840831
contentDescription = null,
841832
)
842833
}
@@ -860,7 +851,7 @@ private fun PlayerButtons(
860851
enabled = hasNext,
861852
) {
862853
Icon(
863-
imageVector = Icons.Rounded.SkipNext,
854+
painterResource(id = R.drawable.ic_skip_next),
864855
contentDescription = null,
865856
)
866857
}

Jetcaster/mobile/src/main/java/com/example/jetcaster/ui/podcast/PodcastDetailsScreen.kt

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,6 @@ import androidx.compose.foundation.lazy.grid.GridCells
3535
import androidx.compose.foundation.lazy.grid.LazyVerticalGrid
3636
import androidx.compose.foundation.lazy.grid.items
3737
import androidx.compose.foundation.shape.RoundedCornerShape
38-
import androidx.compose.material.icons.Icons
39-
import androidx.compose.material.icons.automirrored.filled.ArrowBack
40-
import androidx.compose.material.icons.filled.Add
41-
import androidx.compose.material.icons.filled.Check
42-
import androidx.compose.material.icons.filled.NotificationsActive
43-
import androidx.compose.material.icons.filled.NotificationsNone
4438
import androidx.compose.material3.ButtonGroup
4539
import androidx.compose.material3.ExperimentalMaterial3Api
4640
import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
@@ -64,6 +58,7 @@ import androidx.compose.runtime.setValue
6458
import androidx.compose.ui.Alignment
6559
import androidx.compose.ui.Modifier
6660
import androidx.compose.ui.draw.clip
61+
import androidx.compose.ui.res.painterResource
6762
import androidx.compose.ui.res.stringResource
6863
import androidx.compose.ui.semantics.semantics
6964
import androidx.compose.ui.text.font.FontWeight
@@ -323,10 +318,7 @@ fun PodcastDetailsHeaderItemButtons(isSubscribed: Boolean, onClick: () -> Unit,
323318
interactionSource = interactionSource1,
324319
) {
325320
Icon(
326-
imageVector = if (isSubscribed)
327-
Icons.Default.Check
328-
else
329-
Icons.Default.Add,
321+
painterResource(id = if (isSubscribed) R.drawable.ic_check else R.drawable.ic_add),
330322
contentDescription = null,
331323
)
332324
}
@@ -358,11 +350,7 @@ fun PodcastDetailsHeaderItemButtons(isSubscribed: Boolean, onClick: () -> Unit,
358350
.animateWidth(interactionSource = interactionSource2),
359351
) {
360352
Icon(
361-
imageVector = if (isNotificationOn) {
362-
Icons.Default.NotificationsActive
363-
} else {
364-
Icons.Default.NotificationsNone
365-
},
353+
painterResource(id = if (isNotificationOn) R.drawable.ic_notifications_active else R.drawable.ic_notifications),
366354
contentDescription = stringResource(R.string.cd_more),
367355
)
368356
}
@@ -384,7 +372,7 @@ fun PodcastDetailsTopAppBar(navigateBack: () -> Unit, modifier: Modifier = Modif
384372
navigationIcon = {
385373
IconButton(onClick = navigateBack) {
386374
Icon(
387-
imageVector = Icons.AutoMirrored.Filled.ArrowBack,
375+
painterResource(id = R.drawable.ic_arrow_back),
388376
contentDescription = stringResource(id = R.string.cd_back),
389377
)
390378
}

Jetcaster/mobile/src/main/java/com/example/jetcaster/ui/shared/EpisodeListItem.kt

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,6 @@ import androidx.compose.foundation.layout.fillMaxSize
2727
import androidx.compose.foundation.layout.fillMaxWidth
2828
import androidx.compose.foundation.layout.padding
2929
import androidx.compose.foundation.layout.size
30-
import androidx.compose.material.icons.Icons
31-
import androidx.compose.material.icons.automirrored.filled.PlaylistAdd
32-
import androidx.compose.material.icons.filled.Delete
33-
import androidx.compose.material.icons.filled.MoreVert
34-
import androidx.compose.material.icons.rounded.PlayCircleFilled
3530
import androidx.compose.material3.Icon
3631
import androidx.compose.material3.IconButton
3732
import androidx.compose.material3.MaterialTheme
@@ -48,6 +43,7 @@ import androidx.compose.ui.Modifier
4843
import androidx.compose.ui.draw.clip
4944
import androidx.compose.ui.graphics.ColorFilter
5045
import androidx.compose.ui.layout.ContentScale
46+
import androidx.compose.ui.res.painterResource
5147
import androidx.compose.ui.res.stringResource
5248
import androidx.compose.ui.semantics.Role
5349
import androidx.compose.ui.semantics.role
@@ -91,7 +87,7 @@ fun EpisodeListItem(
9187
.padding(end = 40.dp),
9288
) {
9389
Icon(
94-
imageVector = Icons.Default.Delete,
90+
painterResource(id = R.drawable.ic_delete),
9591
contentDescription = null,
9692
modifier = Modifier.align(Alignment.CenterEnd),
9793
)
@@ -156,7 +152,7 @@ private fun EpisodeListItemFooter(
156152
modifier = modifier,
157153
) {
158154
Image(
159-
imageVector = Icons.Rounded.PlayCircleFilled,
155+
painterResource(id = R.drawable.ic_play_circle),
160156
contentDescription = stringResource(R.string.cd_play),
161157
contentScale = ContentScale.Fit,
162158
colorFilter = ColorFilter.tint(MaterialTheme.colorScheme.primary),
@@ -204,7 +200,7 @@ private fun EpisodeListItemFooter(
204200
},
205201
) {
206202
Icon(
207-
imageVector = Icons.AutoMirrored.Filled.PlaylistAdd,
203+
painterResource(id = R.drawable.ic_playlist_add),
208204
contentDescription = stringResource(R.string.cd_add),
209205
tint = MaterialTheme.colorScheme.onSurfaceVariant,
210206
)
@@ -214,7 +210,7 @@ private fun EpisodeListItemFooter(
214210
onClick = { /* TODO */ },
215211
) {
216212
Icon(
217-
imageVector = Icons.Default.MoreVert,
213+
painterResource(id = R.drawable.ic_more_vert),
218214
contentDescription = stringResource(R.string.cd_more),
219215
tint = MaterialTheme.colorScheme.onSurfaceVariant,
220216
)

Jetcaster/mobile/src/main/java/com/example/jetcaster/util/Buttons.kt

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,6 @@ package com.example.jetcaster.util
1818

1919
import androidx.compose.foundation.shape.CircleShape
2020
import androidx.compose.foundation.shape.RoundedCornerShape
21-
import androidx.compose.material.icons.Icons
22-
import androidx.compose.material.icons.filled.Add
23-
import androidx.compose.material.icons.filled.Check
2421
import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
2522
import androidx.compose.material3.Icon
2623
import androidx.compose.material3.IconToggleButton
@@ -29,6 +26,7 @@ import androidx.compose.material3.IconToggleButtonShapes
2926
import androidx.compose.material3.MaterialTheme
3027
import androidx.compose.runtime.Composable
3128
import androidx.compose.ui.Modifier
29+
import androidx.compose.ui.res.painterResource
3230
import androidx.compose.ui.res.stringResource
3331
import androidx.compose.ui.unit.dp
3432
import com.example.jetcaster.R
@@ -56,9 +54,9 @@ fun ToggleFollowPodcastIconButton(isFollowed: Boolean, onClick: () -> Unit, modi
5654
) {
5755
Icon(
5856
// TODO: think about animating these icons
59-
imageVector = when {
60-
isFollowed -> Icons.Default.Check
61-
else -> Icons.Default.Add
57+
painter = when {
58+
isFollowed -> painterResource(id = R.drawable.ic_check)
59+
else -> painterResource(id = R.drawable.ic_add)
6260
},
6361
contentDescription = when {
6462
isFollowed -> stringResource(R.string.cd_following)

Jetcaster/mobile/src/main/res/drawable/genres.xml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@
22
android:width="24dp"
33
android:height="24dp"
44
android:viewportWidth="960"
5-
android:viewportHeight="960"
6-
android:tint="?attr/colorControlNormal">
5+
android:viewportHeight="960">
76
<path
87
android:fillColor="@android:color/white"
98
android:pathData="M400,720Q450,720 485,685Q520,650 520,600L520,320L640,320L640,240L460,240L460,496Q446,488 431,484Q416,480 400,480Q350,480 315,515Q280,550 280,600Q280,650 315,685Q350,720 400,720ZM480,880Q397,880 324,848.5Q251,817 197,763Q143,709 111.5,636Q80,563 80,480Q80,397 111.5,324Q143,251 197,197Q251,143 324,111.5Q397,80 480,80Q563,80 636,111.5Q709,143 763,197Q817,251 848.5,324Q880,397 880,480Q880,563 848.5,636Q817,709 763,763Q709,817 636,848.5Q563,880 480,880ZM480,800Q614,800 707,707Q800,614 800,480Q800,346 707,253Q614,160 480,160Q346,160 253,253Q160,346 160,480Q160,614 253,707Q346,800 480,800ZM480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Z"/>
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
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+
<path
7+
android:fillColor="@android:color/white"
8+
android:pathData="M234,684Q285,645 348,622.5Q411,600 480,600Q549,600 612,622.5Q675,645 726,684Q761,643 780.5,591Q800,539 800,480Q800,347 706.5,253.5Q613,160 480,160Q347,160 253.5,253.5Q160,347 160,480Q160,539 179.5,591Q199,643 234,684ZM480,520Q421,520 380.5,479.5Q340,439 340,380Q340,321 380.5,280.5Q421,240 480,240Q539,240 579.5,280.5Q620,321 620,380Q620,439 579.5,479.5Q539,520 480,520ZM480,880Q397,880 324,848.5Q251,817 197,763Q143,709 111.5,636Q80,563 80,480Q80,397 111.5,324Q143,251 197,197Q251,143 324,111.5Q397,80 480,80Q563,80 636,111.5Q709,143 763,197Q817,251 848.5,324Q880,397 880,480Q880,563 848.5,636Q817,709 763,763Q709,817 636,848.5Q563,880 480,880Z"/>
9+
</vector>
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
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+
<path
7+
android:fillColor="@android:color/white"
8+
android:pathData="M440,520L200,520L200,440L440,440L440,200L520,200L520,440L760,440L760,520L520,520L520,760L440,760L440,520Z"/>
9+
</vector>

0 commit comments

Comments
 (0)