From a966f8502aab0507d40eeb3d20a2a7eb2d7a3b89 Mon Sep 17 00:00:00 2001 From: Zongle Wang Date: Fri, 6 Sep 2024 06:40:47 -0400 Subject: [PATCH] Mark stable classes and enable Compose Compiler reports (#2280) * Remove org.jetbrains.kotlinx:kotlinx-collections-immutable * Enable stabilityConfigurationFile and reportsDestination https://developer.android.com/develop/ui/compose/performance/stability/fix#configuration-file --- app/build.gradle.kts | 6 +++++- app/compose_compiler_config.conf | 7 +++++++ .../app/lawnchair/lawnicons/model/IconInfoModel.kt | 6 ++---- .../lawnchair/lawnicons/model/IconRequestModel.kt | 4 +--- .../lawnicons/repository/IconRepository.kt | 13 +++++-------- .../lawnicons/ui/components/home/IconPreviewGrid.kt | 3 +-- .../ui/components/home/search/SearchContents.kt | 5 ++--- .../lawnicons/ui/destination/Contributors.kt | 8 +++----- .../app/lawnchair/lawnicons/ui/destination/Home.kt | 3 +-- .../app/lawnchair/lawnicons/ui/util/PreviewUtils.kt | 3 +-- .../lawnicons/viewmodel/ContributorsViewModel.kt | 8 +++----- 11 files changed, 31 insertions(+), 35 deletions(-) create mode 100644 app/compose_compiler_config.conf diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 1fb5382ed6d..ca1b7c15666 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -131,6 +131,11 @@ tasks.withType().configureEach { dependsOn(projects.svgProcessor.dependencyProject.tasks.named("run")) } +composeCompiler { + stabilityConfigurationFile = layout.projectDirectory.file("compose_compiler_config.conf") + reportsDestination = layout.buildDirectory.dir("compose_build_reports") +} + licensee { allow("Apache-2.0") allow("MIT") @@ -153,7 +158,6 @@ dependencies { implementation("androidx.lifecycle:lifecycle-viewmodel-compose:2.8.5") implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.2") - implementation("org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.8") val hiltVersion = "2.52" implementation("com.google.dagger:hilt-android:$hiltVersion") diff --git a/app/compose_compiler_config.conf b/app/compose_compiler_config.conf new file mode 100644 index 00000000000..ac70d690a9f --- /dev/null +++ b/app/compose_compiler_config.conf @@ -0,0 +1,7 @@ +kotlin.collections.* +kotlin.time.Duration + +kotlinx.coroutines.CoroutineScope + +// All models should be stable. +app.lawnchair.lawnicons.model.* diff --git a/app/src/main/kotlin/app/lawnchair/lawnicons/model/IconInfoModel.kt b/app/src/main/kotlin/app/lawnchair/lawnicons/model/IconInfoModel.kt index 716402f815f..1d918d14b3b 100644 --- a/app/src/main/kotlin/app/lawnchair/lawnicons/model/IconInfoModel.kt +++ b/app/src/main/kotlin/app/lawnchair/lawnicons/model/IconInfoModel.kt @@ -1,7 +1,5 @@ package app.lawnchair.lawnicons.model -import kotlinx.collections.immutable.ImmutableList - /** * Data class to hold information about icons. * @@ -9,6 +7,6 @@ import kotlinx.collections.immutable.ImmutableList * @property iconCount The total number of icons. */ data class IconInfoModel( - val iconInfo: ImmutableList, - val iconCount: Int, + val iconInfo: List = emptyList(), + val iconCount: Int = 0, ) diff --git a/app/src/main/kotlin/app/lawnchair/lawnicons/model/IconRequestModel.kt b/app/src/main/kotlin/app/lawnchair/lawnicons/model/IconRequestModel.kt index d26f7f76115..4de30e1ef5b 100644 --- a/app/src/main/kotlin/app/lawnchair/lawnicons/model/IconRequestModel.kt +++ b/app/src/main/kotlin/app/lawnchair/lawnicons/model/IconRequestModel.kt @@ -1,13 +1,11 @@ package app.lawnchair.lawnicons.model -import kotlinx.collections.immutable.ImmutableList - data class IconRequest( val label: String, val componentName: String, ) data class IconRequestModel( - val list: ImmutableList, + val list: List, val iconCount: Int, ) diff --git a/app/src/main/kotlin/app/lawnchair/lawnicons/repository/IconRepository.kt b/app/src/main/kotlin/app/lawnchair/lawnicons/repository/IconRepository.kt index c03ddb1cf28..1de7e4e4ee8 100644 --- a/app/src/main/kotlin/app/lawnchair/lawnicons/repository/IconRepository.kt +++ b/app/src/main/kotlin/app/lawnchair/lawnicons/repository/IconRepository.kt @@ -12,9 +12,6 @@ import app.lawnchair.lawnicons.model.splitByComponentName import app.lawnchair.lawnicons.util.getIconInfo import app.lawnchair.lawnicons.util.getSystemIconInfoAppfilter import javax.inject.Inject -import kotlinx.collections.immutable.persistentListOf -import kotlinx.collections.immutable.toImmutableList -import kotlinx.collections.immutable.toPersistentList import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableStateFlow @@ -36,10 +33,10 @@ class IconRepositoryImpl @Inject constructor(application: Application) : IconRep private val coroutineScope = CoroutineScope(Dispatchers.IO) - private val _iconInfoModel = MutableStateFlow(IconInfoModel(persistentListOf(), 0)) + private val _iconInfoModel = MutableStateFlow(IconInfoModel()) override val iconInfoModel = _iconInfoModel.asStateFlow() - private val _searchedIconInfoModel = MutableStateFlow(IconInfoModel(persistentListOf(), 0)) + private val _searchedIconInfoModel = MutableStateFlow(IconInfoModel()) override val searchedIconInfoModel = _searchedIconInfoModel.asStateFlow() override val iconRequestList = MutableStateFlow(value = null) @@ -51,7 +48,7 @@ class IconRepositoryImpl @Inject constructor(application: Application) : IconRep val iconCount = groupedIcons.size _iconInfoModel.value = IconInfoModel( - iconInfo = iconList.toPersistentList(), + iconInfo = iconList, iconCount = iconCount, ) _searchedIconInfoModel.value = _iconInfoModel.value @@ -92,7 +89,7 @@ class IconRepositoryImpl @Inject constructor(application: Application) : IconRep ), ).map { searchInfo -> searchInfo.iconInfo - }.toPersistentList() + } _searchedIconInfoModel.value = IconInfoModel( iconCount = _searchedIconInfoModel.value.iconCount, @@ -127,7 +124,7 @@ class IconRepositoryImpl @Inject constructor(application: Application) : IconRep } iconRequestList.value = IconRequestModel( - list = commonItems.toImmutableList(), + list = commonItems, iconCount = commonItems.size, ) } diff --git a/app/src/main/kotlin/app/lawnchair/lawnicons/ui/components/home/IconPreviewGrid.kt b/app/src/main/kotlin/app/lawnchair/lawnicons/ui/components/home/IconPreviewGrid.kt index 98284cb58a6..3821e3e60fb 100644 --- a/app/src/main/kotlin/app/lawnchair/lawnicons/ui/components/home/IconPreviewGrid.kt +++ b/app/src/main/kotlin/app/lawnchair/lawnicons/ui/components/home/IconPreviewGrid.kt @@ -57,7 +57,6 @@ import app.lawnchair.lawnicons.ui.util.PreviewLawnicons import app.lawnchair.lawnicons.ui.util.SampleData import app.lawnchair.lawnicons.ui.util.toPaddingValues import app.lawnchair.lawnicons.util.appIcon -import kotlinx.collections.immutable.ImmutableList import my.nanihadesuka.compose.InternalLazyVerticalGridScrollbar import my.nanihadesuka.compose.ScrollbarSelectionMode import my.nanihadesuka.compose.ScrollbarSettings @@ -65,7 +64,7 @@ import my.nanihadesuka.compose.ScrollbarSettings @Composable @ExperimentalFoundationApi fun IconPreviewGrid( - iconInfo: ImmutableList, + iconInfo: List, isExpandedScreen: Boolean, onSendResult: (IconInfo) -> Unit, modifier: Modifier = Modifier, diff --git a/app/src/main/kotlin/app/lawnchair/lawnicons/ui/components/home/search/SearchContents.kt b/app/src/main/kotlin/app/lawnchair/lawnicons/ui/components/home/search/SearchContents.kt index bd919f75d08..62b18cf9e61 100644 --- a/app/src/main/kotlin/app/lawnchair/lawnicons/ui/components/home/search/SearchContents.kt +++ b/app/src/main/kotlin/app/lawnchair/lawnicons/ui/components/home/search/SearchContents.kt @@ -43,14 +43,13 @@ import app.lawnchair.lawnicons.model.SearchMode import app.lawnchair.lawnicons.model.getFirstLabelAndComponent import app.lawnchair.lawnicons.ui.components.home.IconInfoSheet import app.lawnchair.lawnicons.ui.components.home.IconPreview -import kotlinx.collections.immutable.ImmutableList @Composable fun SearchContents( searchTerm: String, searchMode: SearchMode, onModeChange: (SearchMode) -> Unit, - iconInfo: ImmutableList, + iconInfo: List, modifier: Modifier = Modifier, onSendResult: (IconInfo) -> Unit = {}, ) { @@ -167,7 +166,7 @@ fun SearchContents( } @Composable -private fun IconInfoListItem(iconInfo: ImmutableList) { +private fun IconInfoListItem(iconInfo: List) { Column( modifier = Modifier .fillMaxWidth() diff --git a/app/src/main/kotlin/app/lawnchair/lawnicons/ui/destination/Contributors.kt b/app/src/main/kotlin/app/lawnchair/lawnicons/ui/destination/Contributors.kt index 9d97ab59b16..124c0c8b5a1 100644 --- a/app/src/main/kotlin/app/lawnchair/lawnicons/ui/destination/Contributors.kt +++ b/app/src/main/kotlin/app/lawnchair/lawnicons/ui/destination/Contributors.kt @@ -33,8 +33,6 @@ import app.lawnchair.lawnicons.ui.util.Constants import app.lawnchair.lawnicons.ui.util.PreviewLawnicons import app.lawnchair.lawnicons.viewmodel.ContributorsUiState import app.lawnchair.lawnicons.viewmodel.ContributorsViewModel -import kotlinx.collections.immutable.ImmutableList -import kotlinx.collections.immutable.persistentListOf import kotlinx.serialization.Serializable @Serializable @@ -111,7 +109,7 @@ fun Contributors( @Composable private fun ContributorList( - contributors: ImmutableList, + contributors: List, modifier: Modifier = Modifier, contentPadding: PaddingValues = PaddingValues(), ) { @@ -185,7 +183,7 @@ private const val CONTRIBUTOR_URL = "${Constants.GITHUB}/graphs/contributors" @PreviewLawnicons @Composable private fun ContributorsScreenPreview() { - val contributors = persistentListOf( + val contributors = listOf( GitHubContributor( id = 1, login = "Example", @@ -219,7 +217,7 @@ private fun ContributorsScreenLoadingPreview() { @PreviewLawnicons @Composable private fun ContributorListPreview() { - val contributors = persistentListOf( + val contributors = listOf( GitHubContributor( id = 1, login = "Example", diff --git a/app/src/main/kotlin/app/lawnchair/lawnicons/ui/destination/Home.kt b/app/src/main/kotlin/app/lawnchair/lawnicons/ui/destination/Home.kt index e4af608c7db..a257463e19f 100644 --- a/app/src/main/kotlin/app/lawnchair/lawnicons/ui/destination/Home.kt +++ b/app/src/main/kotlin/app/lawnchair/lawnicons/ui/destination/Home.kt @@ -40,7 +40,6 @@ import app.lawnchair.lawnicons.ui.theme.LawniconsTheme import app.lawnchair.lawnicons.ui.util.PreviewLawnicons import app.lawnchair.lawnicons.ui.util.SampleData import app.lawnchair.lawnicons.viewmodel.LawniconsViewModel -import kotlinx.collections.immutable.toImmutableList import kotlinx.serialization.Serializable @Serializable @@ -196,7 +195,7 @@ private fun HomePreview() { }, ) IconPreviewGrid( - iconInfo = iconInfo.toImmutableList(), + iconInfo = iconInfo, isExpandedScreen = false, {}, Modifier, diff --git a/app/src/main/kotlin/app/lawnchair/lawnicons/ui/util/PreviewUtils.kt b/app/src/main/kotlin/app/lawnchair/lawnicons/ui/util/PreviewUtils.kt index 1e7543669b7..88f2c55b70b 100644 --- a/app/src/main/kotlin/app/lawnchair/lawnicons/ui/util/PreviewUtils.kt +++ b/app/src/main/kotlin/app/lawnchair/lawnicons/ui/util/PreviewUtils.kt @@ -5,7 +5,6 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Wallpapers import app.lawnchair.lawnicons.model.IconInfo import app.lawnchair.lawnicons.model.LabelAndComponent -import kotlinx.collections.immutable.persistentListOf @Preview( name = "Normal", @@ -39,7 +38,7 @@ object SampleData { ), id = 1, ) - val iconInfoList = persistentListOf( + val iconInfoList = listOf( IconInfo( drawableName = "@drawable/email", componentNames = listOf( diff --git a/app/src/main/kotlin/app/lawnchair/lawnicons/viewmodel/ContributorsViewModel.kt b/app/src/main/kotlin/app/lawnchair/lawnicons/viewmodel/ContributorsViewModel.kt index f5dd2d57a52..c17cc568c0b 100644 --- a/app/src/main/kotlin/app/lawnchair/lawnicons/viewmodel/ContributorsViewModel.kt +++ b/app/src/main/kotlin/app/lawnchair/lawnicons/viewmodel/ContributorsViewModel.kt @@ -7,8 +7,6 @@ import app.lawnchair.lawnicons.model.GitHubContributor import app.lawnchair.lawnicons.repository.GitHubContributorsRepository import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject -import kotlinx.collections.immutable.ImmutableList -import kotlinx.collections.immutable.toPersistentList import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.map @@ -19,7 +17,7 @@ import kotlinx.coroutines.launch sealed interface ContributorsUiState { data class Success( - val contributors: ImmutableList, + val contributors: List, ) : ContributorsUiState data object Loading : ContributorsUiState @@ -28,7 +26,7 @@ sealed interface ContributorsUiState { private data class ContributorsViewModelState( val isRefreshing: Boolean, - val contributors: ImmutableList? = null, + val contributors: List? = null, val hasError: Boolean = false, ) { fun toUiState(): ContributorsUiState = when { @@ -63,7 +61,7 @@ class ContributorsViewModel @Inject constructor( when { result.isSuccess -> it.copy( isRefreshing = false, - contributors = result.getOrThrow().toPersistentList(), + contributors = result.getOrThrow(), hasError = false, )