From b275cdcb793d2ef65462ee0c9344484d13265c7a Mon Sep 17 00:00:00 2001 From: lihenggui Date: Fri, 14 Jun 2024 13:12:58 -0700 Subject: [PATCH] Fix compilation errors in the ui module --- .../samples/apps/nowinandroid/MainActivity.kt | 8 +++++- core/common/build.gradle.kts | 5 ++++ .../core/di/AndroidApplicationComponent.kt} | 17 +++++------- .../core/di/AndroidPlatformContextProvider.kt | 26 +++++++++++++++++++ .../core/di}/PlatformComponent.kt | 6 ++--- .../core/di/CoroutineScopeComponent.kt | 9 +++++-- .../core}/di/ImageLoaderComponent.kt | 7 ++--- .../core/di/PlatformContextProvider.kt | 23 ++++++++++++++++ .../core/di/JvmPlatformContextProvider.kt | 24 +++++++++++++++++ .../core/di/NativePlatformContextProvider.kt | 24 +++++++++++++++++ core/datastore-test/README.md | 3 --- core/network/build.gradle.kts | 4 --- .../nowinandroid/core/ui/NewsResourceCard.kt | 10 ++++--- .../core/ui/NewsResourceCardList.kt | 7 ++--- 14 files changed, 138 insertions(+), 35 deletions(-) rename core/{network/src/androidMain/kotlin/com/google/samples/apps/nowinandroid/core/network/ApplicationComponent.kt => common/src/androidMain/kotlin/com/google/samples/apps/nowinandroid/core/di/AndroidApplicationComponent.kt} (65%) create mode 100644 core/common/src/androidMain/kotlin/com/google/samples/apps/nowinandroid/core/di/AndroidPlatformContextProvider.kt rename core/{network/src/androidMain/kotlin/com/google/samples/apps/nowinandroid/core/network => common/src/androidMain/kotlin/com/google/samples/apps/nowinandroid/core/di}/PlatformComponent.kt (81%) rename core/{network/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/network => common/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core}/di/ImageLoaderComponent.kt (91%) create mode 100644 core/common/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/di/PlatformContextProvider.kt create mode 100644 core/common/src/jvmMain/kotlin/com/google/samples/apps/nowinandroid/core/di/JvmPlatformContextProvider.kt create mode 100644 core/common/src/nativeMain/kotlin/com/google/samples/apps/nowinandroid/core/di/NativePlatformContextProvider.kt delete mode 100644 core/datastore-test/README.md diff --git a/app/src/main/kotlin/com/google/samples/apps/nowinandroid/MainActivity.kt b/app/src/main/kotlin/com/google/samples/apps/nowinandroid/MainActivity.kt index 2f8572102..8488f8004 100644 --- a/app/src/main/kotlin/com/google/samples/apps/nowinandroid/MainActivity.kt +++ b/app/src/main/kotlin/com/google/samples/apps/nowinandroid/MainActivity.kt @@ -44,6 +44,8 @@ import com.google.samples.apps.nowinandroid.core.data.repository.UserNewsResourc import com.google.samples.apps.nowinandroid.core.data.util.NetworkMonitor import com.google.samples.apps.nowinandroid.core.data.util.TimeZoneMonitor import com.google.samples.apps.nowinandroid.core.designsystem.theme.NiaTheme +import com.google.samples.apps.nowinandroid.core.di.ApplicationComponent +import com.google.samples.apps.nowinandroid.core.di.ApplicationComponentProvider import com.google.samples.apps.nowinandroid.core.model.data.DarkThemeConfig import com.google.samples.apps.nowinandroid.core.model.data.ThemeBrand import com.google.samples.apps.nowinandroid.core.ui.LocalTimeZone @@ -58,7 +60,7 @@ import javax.inject.Inject private const val TAG = "MainActivity" @AndroidEntryPoint -class MainActivity : ComponentActivity() { +class MainActivity : ComponentActivity(), ApplicationComponentProvider { /** * Lazily inject [JankStats], which is used to track jank throughout the app. @@ -80,6 +82,10 @@ class MainActivity : ComponentActivity() { val viewModel: MainActivityViewModel by viewModels() + override val component by lazy(LazyThreadSafetyMode.NONE) { + ApplicationComponent::class.create(applicationContext) + } + override fun onCreate(savedInstanceState: Bundle?) { val splashScreen = installSplashScreen() super.onCreate(savedInstanceState) diff --git a/core/common/build.gradle.kts b/core/common/build.gradle.kts index 008fcc02c..5812abc74 100644 --- a/core/common/build.gradle.kts +++ b/core/common/build.gradle.kts @@ -27,6 +27,11 @@ kotlin { sourceSets { commonMain.dependencies { api(libs.logging) + api(libs.coil) + api(libs.coil.core) + api(libs.coil.svg) + api(libs.coil.network.ktor) + implementation(libs.kotlin.inject.runtime) implementation(libs.kotlinx.coroutines.core) } } diff --git a/core/network/src/androidMain/kotlin/com/google/samples/apps/nowinandroid/core/network/ApplicationComponent.kt b/core/common/src/androidMain/kotlin/com/google/samples/apps/nowinandroid/core/di/AndroidApplicationComponent.kt similarity index 65% rename from core/network/src/androidMain/kotlin/com/google/samples/apps/nowinandroid/core/network/ApplicationComponent.kt rename to core/common/src/androidMain/kotlin/com/google/samples/apps/nowinandroid/core/di/AndroidApplicationComponent.kt index 503118078..1d5b08309 100644 --- a/core/network/src/androidMain/kotlin/com/google/samples/apps/nowinandroid/core/network/ApplicationComponent.kt +++ b/core/common/src/androidMain/kotlin/com/google/samples/apps/nowinandroid/core/di/AndroidApplicationComponent.kt @@ -14,19 +14,14 @@ * limitations under the License. */ -package com.google.samples.apps.nowinandroid.core.network +package com.google.samples.apps.nowinandroid.core.di -import android.content.Context +import android.app.Application import me.tatarka.inject.annotations.Component import me.tatarka.inject.annotations.Provides @Component -abstract class ApplicationComponent( - @get:Provides val context: Context, -) : PlatformComponent - -interface ApplicationComponentProvider { - val component: ApplicationComponent -} - -val Context.applicationComponent get() = (applicationContext as ApplicationComponentProvider).component +@ApplicationScope +abstract class AndroidApplicationComponent( + @get:Provides val application: Application, +) diff --git a/core/common/src/androidMain/kotlin/com/google/samples/apps/nowinandroid/core/di/AndroidPlatformContextProvider.kt b/core/common/src/androidMain/kotlin/com/google/samples/apps/nowinandroid/core/di/AndroidPlatformContextProvider.kt new file mode 100644 index 000000000..e96aa74e7 --- /dev/null +++ b/core/common/src/androidMain/kotlin/com/google/samples/apps/nowinandroid/core/di/AndroidPlatformContextProvider.kt @@ -0,0 +1,26 @@ +/* + * Copyright 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.samples.apps.nowinandroid.core.di + +import android.content.Context +import coil3.PlatformContext +import me.tatarka.inject.annotations.Inject + +@Inject +class AndroidPlatformContextProvider(private val context: Context) : PlatformContextProvider { + override val platformContext: PlatformContext get() = context +} diff --git a/core/network/src/androidMain/kotlin/com/google/samples/apps/nowinandroid/core/network/PlatformComponent.kt b/core/common/src/androidMain/kotlin/com/google/samples/apps/nowinandroid/core/di/PlatformComponent.kt similarity index 81% rename from core/network/src/androidMain/kotlin/com/google/samples/apps/nowinandroid/core/network/PlatformComponent.kt rename to core/common/src/androidMain/kotlin/com/google/samples/apps/nowinandroid/core/di/PlatformComponent.kt index f22b84143..118d643c1 100644 --- a/core/network/src/androidMain/kotlin/com/google/samples/apps/nowinandroid/core/network/PlatformComponent.kt +++ b/core/common/src/androidMain/kotlin/com/google/samples/apps/nowinandroid/core/di/PlatformComponent.kt @@ -14,13 +14,13 @@ * limitations under the License. */ -package com.google.samples.apps.nowinandroid.core.network +package com.google.samples.apps.nowinandroid.core.di -import android.content.Context +import android.app.Application import coil3.PlatformContext import me.tatarka.inject.annotations.Provides interface PlatformComponent { @Provides - fun providePlatformContext(context: Context): PlatformContext = context + fun providePlatformContext(application: Application): PlatformContext = application } diff --git a/core/common/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/di/CoroutineScopeComponent.kt b/core/common/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/di/CoroutineScopeComponent.kt index c23890dd0..abe513134 100644 --- a/core/common/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/di/CoroutineScopeComponent.kt +++ b/core/common/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/di/CoroutineScopeComponent.kt @@ -20,13 +20,18 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.SupervisorJob import me.tatarka.inject.annotations.Component import me.tatarka.inject.annotations.Provides +import me.tatarka.inject.annotations.Scope -typealias ApplicationScope = CoroutineScope +/** + * The application-level scope. There will only be one instance of anything annotated with this. + */ +@Scope +annotation class ApplicationScope @Component abstract class CoroutineScopeComponent { @Provides fun providesCoroutineScope( dispatcher: DefaultDispatcher, - ): ApplicationScope = CoroutineScope(SupervisorJob() + dispatcher) + ): CoroutineScope = CoroutineScope(SupervisorJob() + dispatcher) } diff --git a/core/network/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/network/di/ImageLoaderComponent.kt b/core/common/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/di/ImageLoaderComponent.kt similarity index 91% rename from core/network/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/network/di/ImageLoaderComponent.kt rename to core/common/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/di/ImageLoaderComponent.kt index b0e194413..0888d567f 100644 --- a/core/network/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/network/di/ImageLoaderComponent.kt +++ b/core/common/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/di/ImageLoaderComponent.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.google.samples.apps.nowinandroid.core.network.di +package com.google.samples.apps.nowinandroid.core.di import coil3.ImageLoader import coil3.PlatformContext @@ -36,7 +36,6 @@ abstract class ImageLoaderComponent { @Provides fun provideImageLoader( context: PlatformContext, - debug: Boolean, ): ImageLoader { return ImageLoader.Builder(context) .memoryCache { @@ -49,9 +48,7 @@ abstract class ImageLoaderComponent { .crossfade(true) // Enable logging if this is a debug build. .apply { - if (debug) { - logger(DebugLogger()) - } + logger(DebugLogger()) } .build() } diff --git a/core/common/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/di/PlatformContextProvider.kt b/core/common/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/di/PlatformContextProvider.kt new file mode 100644 index 000000000..3a07c9c18 --- /dev/null +++ b/core/common/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/di/PlatformContextProvider.kt @@ -0,0 +1,23 @@ +/* + * Copyright 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.samples.apps.nowinandroid.core.di + +import coil3.PlatformContext + +interface PlatformContextProvider { + val platformContext: PlatformContext +} diff --git a/core/common/src/jvmMain/kotlin/com/google/samples/apps/nowinandroid/core/di/JvmPlatformContextProvider.kt b/core/common/src/jvmMain/kotlin/com/google/samples/apps/nowinandroid/core/di/JvmPlatformContextProvider.kt new file mode 100644 index 000000000..99850386c --- /dev/null +++ b/core/common/src/jvmMain/kotlin/com/google/samples/apps/nowinandroid/core/di/JvmPlatformContextProvider.kt @@ -0,0 +1,24 @@ +/* + * Copyright 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.samples.apps.nowinandroid.core.di + +import coil3.PlatformContext + +class JvmPlatformContextProvider : PlatformContextProvider { + override val platformContext: PlatformContext + get() = PlatformContext.INSTANCE +} diff --git a/core/common/src/nativeMain/kotlin/com/google/samples/apps/nowinandroid/core/di/NativePlatformContextProvider.kt b/core/common/src/nativeMain/kotlin/com/google/samples/apps/nowinandroid/core/di/NativePlatformContextProvider.kt new file mode 100644 index 000000000..925acb997 --- /dev/null +++ b/core/common/src/nativeMain/kotlin/com/google/samples/apps/nowinandroid/core/di/NativePlatformContextProvider.kt @@ -0,0 +1,24 @@ +/* + * Copyright 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.samples.apps.nowinandroid.core.di + +import coil3.PlatformContext + +class NativePlatformContextProvider : PlatformContextProvider { + override val platformContext: PlatformContext + get() = PlatformContext.INSTANCE +} diff --git a/core/datastore-test/README.md b/core/datastore-test/README.md deleted file mode 100644 index 99cf13f1f..000000000 --- a/core/datastore-test/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# :core:datastore-test module -## Dependency graph -![Dependency graph](../../docs/images/graphs/dep_graph_core_datastore_test.svg) diff --git a/core/network/build.gradle.kts b/core/network/build.gradle.kts index fd690441a..1995fee87 100644 --- a/core/network/build.gradle.kts +++ b/core/network/build.gradle.kts @@ -53,10 +53,6 @@ kotlin { api(libs.kotlinx.datetime) api(projects.core.common) api(projects.core.model) - implementation(libs.coil) - implementation(libs.coil.core) - implementation(libs.coil.svg) - implementation(libs.coil.network.ktor) implementation(libs.kotlinx.serialization.json) implementation(libs.ktor.client.core) implementation(libs.ktor.client.json) diff --git a/core/ui/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCard.kt b/core/ui/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCard.kt index 02e3f91d7..6671b0a2a 100644 --- a/core/ui/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCard.kt +++ b/core/ui/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCard.kt @@ -54,7 +54,9 @@ import androidx.compose.ui.semantics.contentDescription import androidx.compose.ui.semantics.onClick import androidx.compose.ui.semantics.semantics import androidx.compose.ui.unit.dp +import coil3.ImageLoader import coil3.compose.AsyncImagePainter +import coil3.compose.LocalPlatformContext import coil3.compose.rememberAsyncImagePainter import com.google.samples.apps.nowinandroid.core.designsystem.component.NiaIconToggleButton import com.google.samples.apps.nowinandroid.core.designsystem.component.NiaTopicTag @@ -104,7 +106,9 @@ fun NewsResourceCardExpanded( Column { if (!userNewsResource.headerImageUrl.isNullOrEmpty()) { Row { - NewsResourceHeaderImage(userNewsResource.headerImageUrl) + NewsResourceHeaderImage( + userNewsResource.headerImageUrl, + ) } } Box( @@ -156,7 +160,7 @@ fun NewsResourceHeaderImage( isLoading = state is AsyncImagePainter.State.Loading isError = state is AsyncImagePainter.State.Error }, - imageLoader = imageLoader, + imageLoader = ImageLoader(LocalPlatformContext.current), ) val isLocalInspection = LocalInspectionMode.current Box( @@ -182,7 +186,7 @@ fun NewsResourceHeaderImage( contentScale = ContentScale.Crop, painter = imagePainter, // if (isError.not() && !isLocalInspection) { -// imagePainter, +// imagePainter, // } else { // painterResource(drawable.core_designsystem_ic_placeholder_default) // }, diff --git a/core/ui/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCardList.kt b/core/ui/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCardList.kt index 2074499d2..34cb95534 100644 --- a/core/ui/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCardList.kt +++ b/core/ui/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCardList.kt @@ -21,6 +21,7 @@ import androidx.compose.foundation.lazy.items import androidx.compose.material3.MaterialTheme import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.toArgb +import coil3.compose.LocalPlatformContext import com.google.samples.apps.nowinandroid.core.analytics.LocalAnalyticsHelper import com.google.samples.apps.nowinandroid.core.model.data.UserNewsResource @@ -41,9 +42,9 @@ fun LazyListScope.userNewsResourceCardItems( items = items, key = { it.id }, itemContent = { userNewsResource -> - val resourceUrl = Uri.parse(userNewsResource.url) + val resourceUrl = userNewsResource.url val backgroundColor = MaterialTheme.colorScheme.background.toArgb() - val context = LocalContext.current + val context = LocalPlatformContext.current val analyticsHelper = LocalAnalyticsHelper.current NewsResourceCardExpanded( @@ -55,7 +56,7 @@ fun LazyListScope.userNewsResourceCardItems( analyticsHelper.logNewsResourceOpened( newsResourceId = userNewsResource.id, ) - launchCustomChromeTab(context, resourceUrl, backgroundColor) +// launchCustomChromeTab(context, resourceUrl, backgroundColor) onNewsResourceViewed(userNewsResource.id) }, onTopicClick = onTopicClick,