diff --git a/androidApp/src/main/java/fr/paug/androidmakers/MainActivity.kt b/androidApp/src/main/java/fr/paug/androidmakers/MainActivity.kt index a7414dd8..23fab6b7 100644 --- a/androidApp/src/main/java/fr/paug/androidmakers/MainActivity.kt +++ b/androidApp/src/main/java/fr/paug/androidmakers/MainActivity.kt @@ -18,7 +18,6 @@ import androidx.credentials.exceptions.GetCredentialException import androidx.lifecycle.lifecycleScope import com.androidmakers.ui.MainLayout import com.androidmakers.ui.common.SigninCallbacks -import com.androidmakers.ui.common.navigation.UserData import com.androidmakers.ui.theme.AndroidMakersTheme import com.google.android.libraries.identity.googleid.GetSignInWithGoogleOption import com.google.android.libraries.identity.googleid.GoogleIdTokenCredential @@ -27,10 +26,12 @@ import com.google.firebase.messaging.FirebaseMessaging import dev.gitlive.firebase.Firebase import dev.gitlive.firebase.auth.GoogleAuthProvider import dev.gitlive.firebase.auth.auth +import fr.androidmakers.domain.interactor.MergeBookmarksUseCase import kotlinx.coroutines.CancellationException import kotlinx.coroutines.NonCancellable import kotlinx.coroutines.launch import kotlinx.coroutines.tasks.await +import org.koin.android.ext.android.inject import org.koin.compose.KoinContext class MainActivity : ComponentActivity() { @@ -39,6 +40,8 @@ class MainActivity : ComponentActivity() { CredentialManager.create(this) } + private val mergeBookmarksUseCase: MergeBookmarksUseCase by inject(mode = LazyThreadSafetyMode.NONE) + override fun onCreate(savedInstanceState: Bundle?) { installSplashScreen() super.onCreate(savedInstanceState) @@ -129,10 +132,8 @@ class MainActivity : ComponentActivity() { val firebaseCredential = GoogleAuthProvider.credential(googleIdTokenCredential.idToken, null) val result = Firebase.auth.signInWithCredential(firebaseCredential) // Sign in success, update UI with the signed-in user's information - with(UserData()) { - result.user?.uid?.let { - mergeBookmarksUseCase(it) - } + result.user?.uid?.let { + mergeBookmarksUseCase(it) } Log.d(TAG, "user id=${result.user?.uid}") diff --git a/shared/di/src/androidMain/kotlin/fr/androidmakers/di/DomainModule.android.kt b/shared/di/src/androidMain/kotlin/fr/androidmakers/di/DomainModule.android.kt index 481b05e6..4cf999f1 100644 --- a/shared/di/src/androidMain/kotlin/fr/androidmakers/di/DomainModule.android.kt +++ b/shared/di/src/androidMain/kotlin/fr/androidmakers/di/DomainModule.android.kt @@ -3,14 +3,13 @@ package fr.androidmakers.di import fr.androidmakers.domain.interactor.OpenMapUseCase import fr.androidmakers.domain.interactor.ShareSessionUseCase import fr.androidmakers.domain.utils.UrlOpener +import org.koin.core.module.dsl.factoryOf +import org.koin.core.module.dsl.singleOf import org.koin.dsl.module actual val domainPlatformModule = module { - single { - UrlOpener() - } + singleOf(::UrlOpener) - factory { OpenMapUseCase(get()) } - - factory { ShareSessionUseCase() } + factoryOf(::OpenMapUseCase) + factoryOf(::ShareSessionUseCase) } diff --git a/shared/di/src/commonMain/kotlin/fr/androidmakers/di/DomainModule.kt b/shared/di/src/commonMain/kotlin/fr/androidmakers/di/DomainModule.kt index 210cda86..1b9d6f23 100644 --- a/shared/di/src/commonMain/kotlin/fr/androidmakers/di/DomainModule.kt +++ b/shared/di/src/commonMain/kotlin/fr/androidmakers/di/DomainModule.kt @@ -7,35 +7,36 @@ import fr.androidmakers.domain.interactor.GetConferenceVenueUseCase import fr.androidmakers.domain.interactor.GetFavoriteSessionsUseCase import fr.androidmakers.domain.interactor.GetPartnersUseCase import fr.androidmakers.domain.interactor.MergeBookmarksUseCase +import fr.androidmakers.domain.interactor.OpenBlueskyAccountUseCase import fr.androidmakers.domain.interactor.OpenCocUseCase import fr.androidmakers.domain.interactor.OpenFaqUseCase import fr.androidmakers.domain.interactor.OpenLinkUseCase import fr.androidmakers.domain.interactor.OpenPartnerLinkUseCase import fr.androidmakers.domain.interactor.OpenXAccountUseCase import fr.androidmakers.domain.interactor.OpenXHashtagUseCase -import fr.androidmakers.domain.interactor.OpenBlueskyAccountUseCase import fr.androidmakers.domain.interactor.OpenYoutubeUseCase import fr.androidmakers.domain.interactor.SetSessionBookmarkUseCase import org.koin.core.module.Module +import org.koin.core.module.dsl.factoryOf import org.koin.dsl.module expect val domainPlatformModule: Module val domainModule = module { - factory { GetAgendaUseCase(get(), get(), get()) } - factory { GetConferenceVenueUseCase(get()) } - factory { GetAfterpartyVenueUseCase(get()) } - factory { MergeBookmarksUseCase(get(), get()) } - factory { OpenFaqUseCase(get()) } - factory { OpenCocUseCase(get()) } - factory { OpenYoutubeUseCase(get()) } - factory { OpenXHashtagUseCase(get()) } - factory { OpenBlueskyAccountUseCase(get()) } - factory { OpenXAccountUseCase(get()) } - factory { SetSessionBookmarkUseCase(get(), get(), get(), get()) } - factory { GetPartnersUseCase(get()) } - factory { GetFavoriteSessionsUseCase(get()) } - factory { OpenPartnerLinkUseCase(get()) } - factory { OpenLinkUseCase(get()) } - factory { ApplyForAppClinicUseCase(get()) } + factoryOf(::GetAgendaUseCase) + factoryOf(::GetConferenceVenueUseCase) + factoryOf(::GetAfterpartyVenueUseCase) + factoryOf(::MergeBookmarksUseCase) + factoryOf(::OpenFaqUseCase) + factoryOf(::OpenCocUseCase) + factoryOf(::OpenYoutubeUseCase) + factoryOf(::OpenXHashtagUseCase) + factoryOf(::OpenBlueskyAccountUseCase) + factoryOf(::OpenXAccountUseCase) + factoryOf(::SetSessionBookmarkUseCase) + factoryOf(::GetPartnersUseCase) + factoryOf(::GetFavoriteSessionsUseCase) + factoryOf(::OpenPartnerLinkUseCase) + factoryOf(::OpenLinkUseCase) + factoryOf(::ApplyForAppClinicUseCase) } diff --git a/shared/di/src/iosMain/kotlin/fr/androidmakers/di/DomainModule.ios.kt b/shared/di/src/iosMain/kotlin/fr/androidmakers/di/DomainModule.ios.kt index ff8aa587..4cf999f1 100644 --- a/shared/di/src/iosMain/kotlin/fr/androidmakers/di/DomainModule.ios.kt +++ b/shared/di/src/iosMain/kotlin/fr/androidmakers/di/DomainModule.ios.kt @@ -3,13 +3,13 @@ package fr.androidmakers.di import fr.androidmakers.domain.interactor.OpenMapUseCase import fr.androidmakers.domain.interactor.ShareSessionUseCase import fr.androidmakers.domain.utils.UrlOpener +import org.koin.core.module.dsl.factoryOf +import org.koin.core.module.dsl.singleOf import org.koin.dsl.module actual val domainPlatformModule = module { - single { - UrlOpener() - } + singleOf(::UrlOpener) - factory { OpenMapUseCase() } - factory { ShareSessionUseCase() } + factoryOf(::OpenMapUseCase) + factoryOf(::ShareSessionUseCase) } diff --git a/shared/ui/src/commonMain/kotlin/com/androidmakers/di/ViewModelModule.kt b/shared/ui/src/commonMain/kotlin/com/androidmakers/di/ViewModelModule.kt index 6a4e164e..c3436704 100644 --- a/shared/ui/src/commonMain/kotlin/com/androidmakers/di/ViewModelModule.kt +++ b/shared/ui/src/commonMain/kotlin/com/androidmakers/di/ViewModelModule.kt @@ -7,14 +7,16 @@ import com.androidmakers.ui.speakers.SpeakerDetailsViewModel import com.androidmakers.ui.speakers.SpeakerListViewModel import com.androidmakers.ui.sponsors.SponsorsViewModel import com.androidmakers.ui.venue.VenueViewModel +import org.koin.core.module.dsl.viewModel +import org.koin.core.module.dsl.viewModelOf import org.koin.dsl.module val viewModelModule = module { - factory { SpeakerListViewModel(get()) } - factory { SponsorsViewModel(get(), get()) } - factory { VenueViewModel(get(), get(), get()) } - factory { (speakerId: String) -> SpeakerDetailsViewModel(speakerId, get(), get()) } - factory { AgendaViewModel(get(), get(), get(), get()) } - factory { (sessionId: String) -> SessionDetailViewModel(sessionId, get(), get(), get(), get(), get(), get(), get(), get()) } - factory { AboutViewModel(get(), get(), get(), get(), get(), get()) } + viewModelOf(::SpeakerListViewModel) + viewModelOf(::SponsorsViewModel) + viewModelOf(::VenueViewModel) + viewModel { (speakerId: String) -> SpeakerDetailsViewModel(speakerId, get(), get()) } + viewModelOf(::AgendaViewModel) + viewModel { (sessionId: String) -> SessionDetailViewModel(sessionId, get(), get(), get(), get(), get(), get(), get(), get()) } + viewModelOf(::AboutViewModel) } diff --git a/shared/ui/src/commonMain/kotlin/com/androidmakers/ui/common/navigation/AVALayout.kt b/shared/ui/src/commonMain/kotlin/com/androidmakers/ui/common/navigation/AVALayout.kt index dabe6049..311d51cd 100644 --- a/shared/ui/src/commonMain/kotlin/com/androidmakers/ui/common/navigation/AVALayout.kt +++ b/shared/ui/src/commonMain/kotlin/com/androidmakers/ui/common/navigation/AVALayout.kt @@ -33,7 +33,6 @@ import androidx.compose.material3.TopAppBarDefaults import androidx.compose.material3.rememberDrawerState import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue -import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -56,6 +55,7 @@ import com.androidmakers.ui.common.SigninCallbacks import com.androidmakers.ui.speakers.SpeakerScreen import com.androidmakers.ui.sponsors.SponsorsScreen import com.androidmakers.ui.venue.VenuePager +import fr.androidmakers.domain.repo.UserRepository import fr.paug.androidmakers.ui.Res import fr.paug.androidmakers.ui.about import fr.paug.androidmakers.ui.agenda @@ -68,6 +68,7 @@ import fr.paug.androidmakers.ui.venue import kotlinx.coroutines.launch import org.jetbrains.compose.resources.painterResource import org.jetbrains.compose.resources.stringResource +import org.koin.compose.koinInject import org.koin.compose.viewmodel.koinViewModel /** @@ -83,11 +84,11 @@ fun AVALayout( onSessionClick: (sessionId: String) -> Unit, navigateToSpeakerDetails: (String) -> Unit, signinCallbacks: SigninCallbacks, + userRepository: UserRepository = koinInject(), ) { val avaNavController = rememberNavController() val navBackStackEntry by avaNavController.currentBackStackEntryAsState() val currentRoute = navBackStackEntry?.destination?.route - val userRepository = remember { UserData().userRepository } val agendaFilterDrawerState = rememberDrawerState(DrawerValue.Closed) val scrollBehavior = TopAppBarDefaults.enterAlwaysScrollBehavior() diff --git a/shared/ui/src/commonMain/kotlin/com/androidmakers/ui/common/navigation/UserViewModel.kt b/shared/ui/src/commonMain/kotlin/com/androidmakers/ui/common/navigation/UserViewModel.kt deleted file mode 100644 index 563d0933..00000000 --- a/shared/ui/src/commonMain/kotlin/com/androidmakers/ui/common/navigation/UserViewModel.kt +++ /dev/null @@ -1,13 +0,0 @@ -package com.androidmakers.ui.common.navigation - -import fr.androidmakers.domain.interactor.MergeBookmarksUseCase -import fr.androidmakers.domain.repo.UserRepository -import org.koin.core.component.KoinComponent -import org.koin.core.component.inject - -class UserData: KoinComponent { - val userRepository: UserRepository by inject() - val mergeBookmarksUseCase: MergeBookmarksUseCase by inject() -} - - diff --git a/shared/ui/src/iosMain/kotlin/com/androidmakers/ui/MainLayoutViewController.kt b/shared/ui/src/iosMain/kotlin/com/androidmakers/ui/MainLayoutViewController.kt index aff2cba4..a1df4d4c 100644 --- a/shared/ui/src/iosMain/kotlin/com/androidmakers/ui/MainLayoutViewController.kt +++ b/shared/ui/src/iosMain/kotlin/com/androidmakers/ui/MainLayoutViewController.kt @@ -3,6 +3,7 @@ package com.androidmakers.ui import androidx.compose.ui.window.ComposeUIViewController import com.androidmakers.ui.common.SigninCallbacks import com.androidmakers.ui.theme.AndroidMakersTheme +import org.koin.compose.KoinContext import platform.Foundation.NSBundle import platform.UIKit.UIViewController @@ -12,14 +13,16 @@ fun MainLayoutViewController(): UIViewController = val versionName = NSBundle.mainBundle.objectForInfoDictionaryKey("CFBundleShortVersionString") val versionCode = NSBundle.mainBundle.objectForInfoDictionaryKey("CFBundleVersion") - AndroidMakersTheme { - MainLayout( - versionName = versionName.toString(), - versionCode = versionCode.toString(), - signinCallbacks = SigninCallbacks( - signin = {}, - signout = {} + KoinContext { + AndroidMakersTheme { + MainLayout( + versionName = versionName.toString(), + versionCode = versionCode.toString(), + signinCallbacks = SigninCallbacks( + signin = {}, + signout = {} + ) ) - ) + } } } diff --git a/wearApp/src/main/java/fr/paug/androidmakers/wear/di/DataModule.kt b/wearApp/src/main/java/fr/paug/androidmakers/wear/di/DataModule.kt index 82133329..f9749d67 100644 --- a/wearApp/src/main/java/fr/paug/androidmakers/wear/di/DataModule.kt +++ b/wearApp/src/main/java/fr/paug/androidmakers/wear/di/DataModule.kt @@ -1,8 +1,9 @@ package fr.paug.androidmakers.wear.di import fr.paug.androidmakers.wear.data.LocalPreferencesRepository +import org.koin.core.module.dsl.singleOf import org.koin.dsl.module val dataModule = module { - single { LocalPreferencesRepository(get()) } + singleOf(::LocalPreferencesRepository) } diff --git a/wearApp/src/main/java/fr/paug/androidmakers/wear/di/ViewModelModule.kt b/wearApp/src/main/java/fr/paug/androidmakers/wear/di/ViewModelModule.kt index 46ac3f67..d80ccd7c 100644 --- a/wearApp/src/main/java/fr/paug/androidmakers/wear/di/ViewModelModule.kt +++ b/wearApp/src/main/java/fr/paug/androidmakers/wear/di/ViewModelModule.kt @@ -4,12 +4,12 @@ import com.google.android.horologist.auth.ui.googlesignin.signin.GoogleSignInVie import fr.paug.androidmakers.wear.ui.main.MainViewModel import fr.paug.androidmakers.wear.ui.session.details.SessionDetailViewModel import fr.paug.androidmakers.wear.ui.settings.SettingsViewModel -import org.koin.core.module.dsl.viewModel +import org.koin.core.module.dsl.viewModelOf import org.koin.dsl.module val viewModelModule = module { - viewModel { MainViewModel(get(), get(), get(), get(), get(), get(), get()) } - viewModel { SettingsViewModel(get()) } - viewModel { SessionDetailViewModel(get(), get(), get(), get(), get(), get()) } - viewModel { GoogleSignInViewModel(get(), get()) } + viewModelOf(::MainViewModel) + viewModelOf(::SettingsViewModel) + viewModelOf(::SessionDetailViewModel) + viewModelOf(::GoogleSignInViewModel) }