From 5b718bf309143226a2c1c3db074d040a92d335a6 Mon Sep 17 00:00:00 2001 From: Mohamad Jaara <9083456+MohamadJaara@users.noreply.github.com> Date: Thu, 4 Jun 2026 12:36:47 +0200 Subject: [PATCH 1/3] refactor: nuke hilt --- app/build.gradle.kts | 8 - .../com/wire/android/CustomTestRunner.kt | 2 +- .../kotlin/com/wire/android/HiltTestApp.kt | 23 -- .../com/wire/android/TestCoreLogicModule.kt | 29 +- .../com/wire/android/WireActivityTest.kt | 9 +- .../location/LocationPickerHelperFlavor.kt | 2 +- .../wire/android/GlobalObserversManager.kt | 7 +- .../com/wire/android/WireApplication.kt | 58 +-- ...izeRegistrationAnalyticsMetadataUseCase.kt | 2 +- .../RegistrationAnalyticsManagerUseCase.kt | 2 +- .../config/NomadProfilesFeatureConfig.kt | 2 +- .../android/config/ServerConfigProvider.kt | 7 +- .../wire/android/datastore/GlobalDataStore.kt | 9 +- .../datastore/UserDataStoreProvider.kt | 9 +- .../kotlin/com/wire/android/di/AppModule.kt | 31 +- .../wire/android/di/ClientScopeProvider.kt | 6 +- .../com/wire/android/di/CoreLogicModule.kt | 254 ++++++------ .../com/wire/android/di/CoroutineScope.kt | 19 +- .../com/wire/android/di/ImageLoadingModule.kt | 13 +- .../IsProfileQRCodeEnabledUseCaseProvider.kt | 6 +- .../wire/android/di/KaliumConfigsModule.kt | 9 +- .../com/wire/android/di/LogWriterModule.kt | 19 +- .../android/di/ManagedConfigurationsModule.kt | 23 +- ...fE2EIRequiredDuringLoginUseCaseProvider.kt | 6 +- ...creenshotCensoringConfigUseCaseProvider.kt | 6 +- .../di/ObserveSelfUserUseCaseProvider.kt | 6 +- .../di/ObserveSyncStateUseCaseProvider.kt | 6 +- .../android/di/UiCommonHiltBridgeModule.kt | 36 -- .../android/di/accountScoped/AppsModule.kt | 15 +- .../di/accountScoped/AuthenticationModule.kt | 12 +- .../android/di/accountScoped/BackupModule.kt | 37 +- .../android/di/accountScoped/CallsModule.kt | 90 ++--- .../android/di/accountScoped/CellsModule.kt | 46 +-- .../di/accountScoped/ChannelsModule.kt | 13 +- .../android/di/accountScoped/ClientModule.kt | 23 +- .../di/accountScoped/ConnectionModule.kt | 27 +- .../di/accountScoped/ConversationModule.kt | 112 ++---- .../android/di/accountScoped/DebugModule.kt | 52 +-- .../android/di/accountScoped/MessageModule.kt | 48 +-- .../android/di/accountScoped/SearchModule.kt | 15 +- .../di/accountScoped/ServicesModule.kt | 20 +- .../android/di/accountScoped/TeamModule.kt | 13 +- .../android/di/accountScoped/UserModule.kt | 51 +-- ....kt => AppAuthenticationViewModelGraph.kt} | 17 +- ...odel.kt => AppImageAssetViewModelGraph.kt} | 29 +- ...hBridge.kt => AppSessionViewModelGraph.kt} | 70 ++-- .../android/di/metro/WireApplicationGraph.kt | 139 +++++++ .../emm/ManagedConfigurationsReceiver.kt | 10 +- .../emm/ManagedConfigurationsReporter.kt | 9 +- .../android/feature/AccountSwitchUseCase.kt | 8 +- .../android/feature/DisableAppLockUseCase.kt | 5 +- .../feature/ObserveAppLockConfigUseCase.kt | 7 +- ...dStartPersistentWebSocketServiceUseCase.kt | 7 +- ...rtPersistentWebsocketIfNecessaryUseCase.kt | 7 +- .../initializer/InitializerEntryPoint.kt | 13 +- .../com/wire/android/mapper/ContactMapper.kt | 2 +- .../android/mapper/MessageContentMapper.kt | 2 +- .../com/wire/android/mapper/MessageMapper.kt | 2 +- .../wire/android/mapper/OtherAccountMapper.kt | 2 +- .../mapper/RegularMessageContentMapper.kt | 2 +- .../mapper/SystemMessageContentMapper.kt | 2 +- .../com/wire/android/mapper/UIAssetMapper.kt | 2 +- .../android/mapper/UICallParticipantMapper.kt | 2 +- .../android/mapper/UIParticipantMapper.kt | 2 +- .../com/wire/android/mapper/UserTypeMapper.kt | 2 +- .../com/wire/android/media/CallRinger.kt | 7 +- .../media/audiomessage/AudioFocusHelper.kt | 2 +- .../audiomessage/AudioMessageViewModel.kt | 1 - .../ConversationAudioMessagePlayer.kt | 18 +- .../audiomessage/RecordAudioMessagePlayer.kt | 5 +- .../android/navigation/LoginTypeSelector.kt | 12 +- .../notification/CallNotificationManager.kt | 9 +- .../MessageNotificationManager.kt | 7 +- .../notification/WireNotificationManager.kt | 7 +- .../DynamicReceiversManager.kt | 9 +- .../EndOngoingCallReceiver.kt | 6 +- .../IncomingCallActionReceiver.kt | 6 +- .../broadcastreceivers/NomadLogoutReceiver.kt | 10 +- .../NotificationReplyReceiver.kt | 10 +- .../PlayPauseAudioMessageReceiver.kt | 6 +- .../StopAudioMessageReceiver.kt | 6 +- .../com/wire/android/services/CallService.kt | 6 +- .../android/services/CallServiceManager.kt | 2 +- .../services/PersistentWebSocketService.kt | 6 +- .../services/PlayingAudioMessageService.kt | 6 +- .../wire/android/services/ServicesManager.kt | 7 +- .../com/wire/android/ui/AppLockActivity.kt | 10 +- .../wire/android/ui/CallFeedbackViewModel.kt | 29 +- .../wire/android/ui/MiscViewModelFactory.kt | 3 +- .../com/wire/android/ui/WireActivity.kt | 55 +-- .../wire/android/ui/WireActivityViewModel.kt | 71 ++-- .../com/wire/android/ui/WireTestActivity.kt | 2 - .../ui/analytics/AnalyticsUsageViewModel.kt | 15 +- .../analytics/IsAnalyticsAvailableUseCase.kt | 4 +- .../AuthenticationViewModelFactory.kt | 162 ++++---- .../create/code/CreateAccountCodeViewModel.kt | 2 +- .../details/CreateAccountDetailsViewModel.kt | 2 +- .../email/CreateAccountEmailViewModel.kt | 2 +- .../CreateAccountOverviewViewModel.kt | 2 +- .../summary/CreateAccountSummaryViewModel.kt | 2 +- .../CreateAccountUsernameViewModel.kt | 2 +- .../devices/common/ClearSessionViewModel.kt | 2 +- .../register/RegisterDeviceViewModel.kt | 2 +- .../devices/remove/RemoveDeviceViewModel.kt | 2 +- .../login/email/LoginEmailViewModel.kt | 8 +- .../login/sso/LoginSSOViewModel.kt | 8 +- .../welcome/WelcomeViewModel.kt | 2 +- .../wire/android/ui/calling/CallActivity.kt | 11 +- .../ui/calling/CallingViewModelFactory.kt | 3 +- .../ui/calling/StartingCallActivity.kt | 2 - .../calling/common/ProximitySensorManager.kt | 14 +- .../ui/calling/ongoing/OngoingCallActivity.kt | 4 +- .../ui/calling/usecase/HangUpCallUseCase.kt | 5 +- .../ui/common/CommonViewModelFactory.kt | 5 +- .../banner/SecurityClassificationViewModel.kt | 1 - .../ConversationOptionsMenuViewModel.kt | 1 - .../topappbar/CommonTopAppBarViewModel.kt | 11 +- .../ui/debug/DebugInfoViewModelFactory.kt | 4 +- .../ui/debug/ExportObfuscatedCopyViewModel.kt | 1 - .../android/ui/debug/StartServiceReceiver.kt | 6 +- .../com/wire/android/ui/home/HomeViewModel.kt | 3 +- .../android/ui/home/HomeViewModelFactory.kt | 3 +- .../ui/home/appLock/LockCodeTimeManager.kt | 7 +- .../forgot/ForgotLockScreenViewModel.kt | 2 +- .../appLock/set/SetLockScreenViewModel.kt | 2 +- .../AppUnlockWithBiometricsViewModel.kt | 2 +- .../unlock/EnterLockScreenViewModel.kt | 2 +- .../CompositeMessageViewModel.kt | 1 - .../ConversationCoreViewModelFactory.kt | 2 +- .../ConversationDetailsViewModelFactory.kt | 2 +- ...onversationSearchFolderViewModelFactory.kt | 2 +- .../home/conversations/MessageSharedState.kt | 2 +- .../ScopedMessageViewModelFactory.kt | 4 +- ...bserveConversationMembersByTypesUseCase.kt | 2 +- .../ObserveConversationRoleForUserUseCase.kt | 2 +- ...serveParticipantsForConversationUseCase.kt | 2 +- .../edit/MessageOptionsMenuViewModel.kt | 1 - .../folder/ConversationFoldersVM.kt | 1 - .../folder/MoveConversationToFolderVM.kt | 1 - .../ObserveReactionsForMessageUseCase.kt | 2 +- .../ObserveReceiptsForMessageUseCase.kt | 2 +- .../typing/TypingIndicatorViewModel.kt | 1 - ...GetAssetMessagesFromConversationUseCase.kt | 2 +- ...etConversationMessagesFromSearchUseCase.kt | 2 +- .../GetConversationsFromSearchUseCase.kt | 2 +- .../GetMessagesForConversationUseCase.kt | 2 +- .../GetQuoteMessageForConversationUseCase.kt | 2 +- .../usecase/GetUsersForMessageUseCase.kt | 2 +- .../usecase/HandleUriAssetUseCase.kt | 2 +- ...ageAssetMessagesFromConversationUseCase.kt | 2 +- .../ObserveMessageForConversationUseCase.kt | 2 +- ...serveQuoteMessageForConversationUseCase.kt | 2 +- ...ObserveUsersTypingInConversationUseCase.kt | 2 +- .../ui/home/drawer/HomeDrawerViewModel.kt | 3 +- .../SelfDeletingMessageActionViewModel.kt | 1 - .../IsFileSharingEnabledViewModel.kt | 1 - .../location/GeocoderHelper.kt | 2 +- .../location/LocationPickerHelper.kt | 4 +- .../recordaudio/AudioMediaRecorder.kt | 5 +- .../GenerateAudioFileWithEffectsUseCase.kt | 7 +- .../ui/home/settings/SettingsViewModel.kt | 2 +- .../home/settings/SettingsViewModelFactory.kt | 154 ++++---- .../settings/account/MyAccountViewModel.kt | 2 +- .../account/color/ChangeUserColorViewModel.kt | 2 +- .../deleteAccount/DeleteAccountViewModel.kt | 2 +- .../displayname/ChangeDisplayNameViewModel.kt | 2 +- .../email/updateEmail/ChangeEmailViewModel.kt | 2 +- .../email/verifyEmail/VerifyEmailViewModel.kt | 2 +- .../account/handle/ChangeHandleViewModel.kt | 2 +- .../appearance/CustomizationViewModel.kt | 2 +- .../NetworkSettingsViewModel.kt | 4 +- .../backup/BackupAndRestoreViewModel.kt | 2 +- .../privacy/PrivacySettingsViewModel.kt | 2 +- .../sync/FeatureFlagNotificationViewModel.kt | 37 +- .../LegalHoldDeactivatedViewModel.kt | 9 +- .../requested/LegalHoldRequestedViewModel.kt | 7 +- .../login/NewLoginViewModel.kt | 4 +- .../login/ValidateEmailOrSSOCodeUseCase.kt | 4 +- .../CreateAccountVerificationCodeViewModel.kt | 2 +- .../CreateAccountDataDetailViewModel.kt | 2 +- .../CreateAccountSelectorViewModel.kt | 2 +- .../devices/DeviceDetailsViewModel.kt | 2 +- .../settings/devices/SelfDevicesViewModel.kt | 2 +- .../avatarpicker/AvatarPickerViewModel.kt | 4 +- .../other/OtherUserProfileScreenViewModel.kt | 2 +- .../ui/userprofile/qr/SelfQRCodeViewModel.kt | 2 +- .../self/SelfUserProfileViewModel.kt | 2 +- .../service/ServiceDetailsViewModel.kt | 2 +- .../teammigration/TeamMigrationViewModel.kt | 2 +- .../wire/android/util/AvatarImageManager.kt | 2 +- .../wire/android/util/CurrentScreenManager.kt | 7 +- .../com/wire/android/util/FileManager.kt | 9 +- .../android/util/GetMediaMetadataUseCase.kt | 2 +- .../com/wire/android/util/NetworkUtil.kt | 2 +- .../wire/android/util/ScreenStateObserver.kt | 9 +- .../android/util/SwitchAccountObserver.kt | 7 +- .../wire/android/util/UserAgentProvider.kt | 9 +- .../util/deeplink/DeepLinkProcessor.kt | 7 +- .../util/lifecycle/AutomatedLoginManager.kt | 7 +- .../util/lifecycle/IntentsProcessor.kt | 7 +- .../NomadIntentSignatureValidator.kt | 7 +- .../util/lifecycle/SyncLifecycleManager.kt | 7 +- .../wire/android/util/time/ISOFormatter.kt | 2 +- .../android/util/time/TimeZoneProvider.kt | 2 +- .../wire/android/util/ui/CountdownTimer.kt | 2 +- .../wire/android/util/ui/UiTextResolver.kt | 4 +- .../android/workmanager/WireWorkerFactory.kt | 2 +- .../worker/AssetUploadObserverWorker.kt | 4 +- .../worker/DeleteConversationLocallyWorker.kt | 6 +- .../worker/NotificationFetchWorker.kt | 6 +- .../worker/PersistentWebsocketCheckWorker.kt | 6 +- app/src/main/startup-prof.txt | 374 +----------------- .../services/WireFirebaseMessagingService.kt | 13 +- .../location/LocationPickerHelperFlavor.kt | 2 +- .../emm/ManagedConfigurationsReceiverTest.kt | 2 +- .../ConversationAudioMessagePlayerTest.kt | 2 +- .../navigation/LoginTypeSelectorTest.kt | 2 +- .../android/ui/CallFeedbackViewModelTest.kt | 8 +- .../android/ui/WireActivityViewModelTest.kt | 32 +- .../analytics/AnalyticsUsageViewModelTest.kt | 4 +- .../topappbar/CommonTopAppBarViewModelTest.kt | 2 +- .../ConnectionActionButtonViewModelTest.kt | 28 +- .../wire/android/ui/home/HomeViewModelTest.kt | 2 +- .../ui/home/drawer/HomeDrawerViewModelTest.kt | 2 +- .../FeatureFlagNotificationViewModelTest.kt | 8 +- .../LegalHoldDeactivatedViewModelTest.kt | 2 +- .../LegalHoldRequestedViewModelTest.kt | 2 +- .../debug/DebugDataOptionsViewModelTest.kt | 40 +- build-logic/plugins/build.gradle.kts | 4 - .../src/main/kotlin/HiltConventionPlugin.kt | 39 -- .../src/main/kotlin/KoverConventionPlugin.kt | 4 - build.gradle.kts | 1 - core/di/build.gradle.kts | 2 - .../com/wire/android/di/KaliumCoreLogic.kt | 2 +- .../android/di/metro/MetroViewModelGraph.kt | 2 +- core/media/build.gradle.kts | 1 - .../com/wire/android/media/PingRinger.kt | 7 +- core/notification/build.gradle.kts | 1 - .../NotificationChannelsManager.kt | 7 +- features/cells/build.gradle.kts | 1 - .../feature/cells/ui/CellFileActionsMenu.kt | 2 +- .../cells/ui/CellFileLocalPathCache.kt | 7 +- .../feature/cells/ui/CellsViewModelFactory.kt | 2 +- .../cells/ui/OpenFileDownloadController.kt | 2 +- .../feature/cells/ui/edit/OnlineEditor.kt | 2 +- .../android/feature/cells/util/FileHelper.kt | 4 +- .../feature/cells/util/FileNameResolver.kt | 2 +- features/meetings/build.gradle.kts | 1 - .../meetings/ui/MeetingsViewModelFactory.kt | 2 +- .../meetings/ui/usecase/GetMeetingUseCase.kt | 5 +- .../ui/usecase/GetMeetingsPaginatedUseCase.kt | 5 +- features/sync/build.gradle.kts | 5 - .../wire/android/sync/InitialSyncWorker.kt | 6 +- .../android/sync/MonitorSyncWorkUseCase.kt | 4 +- gradle/libs.versions.toml | 17 +- kalium | 2 +- 256 files changed, 1277 insertions(+), 1988 deletions(-) delete mode 100644 app/src/androidTest/kotlin/com/wire/android/HiltTestApp.kt delete mode 100644 app/src/main/kotlin/com/wire/android/di/UiCommonHiltBridgeModule.kt rename app/src/main/kotlin/com/wire/android/di/metro/{AuthenticationViewModelGraphBridge.kt => AppAuthenticationViewModelGraph.kt} (69%) rename app/src/main/kotlin/com/wire/android/di/metro/{ImageAssetViewModelGraphBridgeViewModel.kt => AppImageAssetViewModelGraph.kt} (61%) rename app/src/main/kotlin/com/wire/android/di/metro/{WireActivityViewModelGraphBridge.kt => AppSessionViewModelGraph.kt} (65%) create mode 100644 app/src/main/kotlin/com/wire/android/di/metro/WireApplicationGraph.kt delete mode 100644 build-logic/plugins/src/main/kotlin/HiltConventionPlugin.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index f09ad8036c8..5dbb0b57d0f 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -26,7 +26,6 @@ plugins { // id(BuildPlugins.kotlinAndroidExtensions) id(BuildPlugins.kotlinParcelize) id(BuildPlugins.junit5) - id(libs.plugins.wire.hilt.get().pluginId) alias(libs.plugins.androidx.baselineprofile) alias(libs.plugins.kotlin.serialization) alias(libs.plugins.ksp) @@ -284,13 +283,8 @@ dependencies { // Emoji implementation(libs.androidx.emoji.picker) - // hilt - implementation(libs.hilt.navigationCompose) - implementation(libs.hilt.work) - // smaller view models implementation(libs.resaca.core) - implementation(libs.resaca.hilt) implementation(libs.bundlizer.core) allFlavors.forEach { flavor -> @@ -341,8 +335,6 @@ dependencies { androidTestImplementation(libs.androidx.espresso.intents) androidTestImplementation(libs.androidx.espresso.accessibility) androidTestImplementation(libs.hamcrest) - androidTestImplementation(libs.hilt.test) - kspAndroidTest(libs.hilt.compiler) androidTestImplementation(libs.androidx.test.extJunit) androidTestImplementation(libs.androidx.test.uiAutomator) diff --git a/app/src/androidTest/kotlin/com/wire/android/CustomTestRunner.kt b/app/src/androidTest/kotlin/com/wire/android/CustomTestRunner.kt index 67ab69e4b93..1d3dcecca95 100644 --- a/app/src/androidTest/kotlin/com/wire/android/CustomTestRunner.kt +++ b/app/src/androidTest/kotlin/com/wire/android/CustomTestRunner.kt @@ -23,6 +23,6 @@ import androidx.test.runner.AndroidJUnitRunner class CustomTestRunner : AndroidJUnitRunner() { override fun newApplication(cl: ClassLoader?, className: String?, context: Context?): Application { - return super.newApplication(cl, HiltTestApp_Application::class.java.name, context) + return super.newApplication(cl, WireApplication::class.java.name, context) } } diff --git a/app/src/androidTest/kotlin/com/wire/android/HiltTestApp.kt b/app/src/androidTest/kotlin/com/wire/android/HiltTestApp.kt deleted file mode 100644 index 1983d2b885d..00000000000 --- a/app/src/androidTest/kotlin/com/wire/android/HiltTestApp.kt +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Wire - * Copyright (C) 2024 Wire Swiss GmbH - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see http://www.gnu.org/licenses/. - */ -package com.wire.android - -import dagger.hilt.android.testing.CustomTestApplication - -@CustomTestApplication(BaseApp::class) -interface HiltTestApp diff --git a/app/src/androidTest/kotlin/com/wire/android/TestCoreLogicModule.kt b/app/src/androidTest/kotlin/com/wire/android/TestCoreLogicModule.kt index f8acaa6fd08..d4eea3859ca 100644 --- a/app/src/androidTest/kotlin/com/wire/android/TestCoreLogicModule.kt +++ b/app/src/androidTest/kotlin/com/wire/android/TestCoreLogicModule.kt @@ -20,7 +20,6 @@ package com.wire.android import android.content.Context import androidx.work.WorkManager -import com.wire.android.di.CoreLogicModule import com.wire.android.di.DefaultWebSocketEnabledByDefault import com.wire.android.di.KaliumCoreLogic import com.wire.android.di.NoSession @@ -39,22 +38,17 @@ import com.wire.kalium.mocks.requests.LoginRequests import com.wire.kalium.mocks.requests.NotificationRequests import com.wire.kalium.network.NetworkStateObserver import com.wire.kalium.network.utils.TestRequestHandler -import dagger.Module -import dagger.Provides -import dagger.hilt.android.qualifiers.ApplicationContext -import dagger.hilt.components.SingletonComponent -import dagger.hilt.testing.TestInstallIn -import javax.inject.Singleton - -@Module -@TestInstallIn( - components = [SingletonComponent::class], - replaces = [CoreLogicModule::class], -) +import dev.zacsweers.metro.BindingContainer +import dev.zacsweers.metro.Provides +import com.wire.android.di.ApplicationContext +import dev.zacsweers.metro.AppScope +import dev.zacsweers.metro.SingleIn + +@BindingContainer class TestCoreLogicModule { @KaliumCoreLogic - @Singleton + @SingleIn(AppScope::class) @Provides fun provideCoreLogic( @ApplicationContext context: Context, @@ -80,7 +74,7 @@ class TestCoreLogicModule { ) } - @Singleton + @SingleIn(AppScope::class) @Provides fun provideNetworkStateObserver(): NetworkStateObserver = TestNetworkStateObserver() @@ -109,11 +103,11 @@ class TestCoreLogicModule { coreLogic.getGlobalScope().serverConfigForAccounts @NoSession - @Singleton + @SingleIn(AppScope::class) @Provides fun provideNoSessionQualifiedIdMapper(): QualifiedIdMapper = QualifiedIdMapper(null) - @Singleton + @SingleIn(AppScope::class) @Provides fun provideWorkManager(@ApplicationContext applicationContext: Context) = WorkManager.getInstance(applicationContext) @@ -123,5 +117,6 @@ class TestCoreLogicModule { @DefaultWebSocketEnabledByDefault @Provides + @Suppress("FunctionOnlyReturningConstant") fun provideDefaultWebSocketEnabledByDefault(): Boolean = true } diff --git a/app/src/androidTest/kotlin/com/wire/android/WireActivityTest.kt b/app/src/androidTest/kotlin/com/wire/android/WireActivityTest.kt index c68cf09acd4..f36b31348e0 100644 --- a/app/src/androidTest/kotlin/com/wire/android/WireActivityTest.kt +++ b/app/src/androidTest/kotlin/com/wire/android/WireActivityTest.kt @@ -34,21 +34,15 @@ import com.wire.android.util.DataDogLogger import com.wire.kalium.logger.KaliumLogLevel import com.wire.kalium.logger.KaliumLogger import com.wire.kalium.common.logger.CoreLogger -import dagger.hilt.android.testing.HiltAndroidRule -import dagger.hilt.android.testing.HiltAndroidTest import kotlinx.coroutines.test.runTest import org.junit.Before import org.junit.Ignore import org.junit.Rule import org.junit.Test -@HiltAndroidTest class WireActivityTest { - @get:Rule(order = 0) - var hiltRule = HiltAndroidRule(this) - - @get:Rule(order = 1) + @get:Rule val composeTestRule: AndroidComposeTestRule, WireActivity> = createAndroidComposeRule() @@ -58,7 +52,6 @@ class WireActivityTest { context.deleteDatabase("global-db") // GLOBAL_DB_NAME in FileNameUtil WorkManagerTestInitHelper.initializeTestWorkManager(context) initializeApplicationLoggingFrameworks() - hiltRule.inject() } @Ignore // TODO add other api mocks to not have flaky test diff --git a/app/src/foss/kotlin/com/wire/android/ui/home/messagecomposer/location/LocationPickerHelperFlavor.kt b/app/src/foss/kotlin/com/wire/android/ui/home/messagecomposer/location/LocationPickerHelperFlavor.kt index 793acb075fe..c4ea362bbff 100644 --- a/app/src/foss/kotlin/com/wire/android/ui/home/messagecomposer/location/LocationPickerHelperFlavor.kt +++ b/app/src/foss/kotlin/com/wire/android/ui/home/messagecomposer/location/LocationPickerHelperFlavor.kt @@ -17,7 +17,7 @@ */ package com.wire.android.ui.home.messagecomposer.location -import javax.inject.Inject +import dev.zacsweers.metro.Inject class LocationPickerHelperFlavor @Inject constructor( private val locationPickerHelper: LocationPickerHelper, diff --git a/app/src/main/kotlin/com/wire/android/GlobalObserversManager.kt b/app/src/main/kotlin/com/wire/android/GlobalObserversManager.kt index f01f1c93c9d..0dfa1919d78 100644 --- a/app/src/main/kotlin/com/wire/android/GlobalObserversManager.kt +++ b/app/src/main/kotlin/com/wire/android/GlobalObserversManager.kt @@ -45,14 +45,15 @@ import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.map import kotlinx.coroutines.launch -import javax.inject.Inject -import javax.inject.Singleton +import dev.zacsweers.metro.Inject +import dev.zacsweers.metro.AppScope +import dev.zacsweers.metro.SingleIn /** * This is a helper class used to collect the necessary data and perform the actions required in order for the app to function properly, * such as notifications or persistent web socket. */ -@Singleton +@SingleIn(AppScope::class) class GlobalObserversManager @Inject constructor( dispatcherProvider: DispatcherProvider, @KaliumCoreLogic private val coreLogic: CoreLogic, diff --git a/app/src/main/kotlin/com/wire/android/WireApplication.kt b/app/src/main/kotlin/com/wire/android/WireApplication.kt index fd875b93207..99f3586a048 100644 --- a/app/src/main/kotlin/com/wire/android/WireApplication.kt +++ b/app/src/main/kotlin/com/wire/android/WireApplication.kt @@ -32,6 +32,8 @@ import com.wire.android.datastore.GlobalDataStore import com.wire.android.datastore.UserDataStoreProvider import com.wire.android.di.ApplicationScope import com.wire.android.di.KaliumCoreLogic +import com.wire.android.di.metro.WireApplicationGraph +import com.wire.android.di.metro.createWireApplicationGraph import com.wire.android.feature.analytics.AnonymousAnalyticsManager import com.wire.android.feature.analytics.AnonymousAnalyticsManagerImpl import com.wire.android.feature.analytics.AnonymousAnalyticsRecorderImpl @@ -52,8 +54,6 @@ import com.wire.kalium.logger.KaliumLogger import com.wire.kalium.logic.CoreLogic import com.wire.kalium.logic.feature.session.CurrentSessionResult import com.wire.kalium.logic.feature.session.GetAllSessionsResult -import dagger.Lazy -import dagger.hilt.android.HiltAndroidApp import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.combine @@ -65,13 +65,16 @@ import kotlinx.coroutines.flow.map import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import kotlinx.coroutines.withTimeout -import javax.inject.Inject +import dev.zacsweers.metro.Inject import kotlin.collections.filter @Suppress("TooManyFunctions") -@HiltAndroidApp class WireApplication : BaseApp() { + val appGraph: WireApplicationGraph by lazy { + createWireApplicationGraph(this) + } + @Inject @KaliumCoreLogic lateinit var coreLogic: Lazy @@ -109,11 +112,12 @@ class WireApplication : BaseApp() { override val workManagerConfiguration: Configuration get() = Configuration.Builder() - .setWorkerFactory(wireWorkerFactory.get()) + .setWorkerFactory(appGraph.wireWorkerFactory) .setMinimumLoggingLevel(android.util.Log.DEBUG) .build() override fun onCreate() { + appGraph.inject(this) super.onCreate() enableStrictMode() @@ -130,11 +134,11 @@ class WireApplication : BaseApp() { ProcessLifecycleOwner.get().lifecycle.addObserver(currentScreenManager) } launch { - syncLifecycleManager.get().observeAppLifecycle() + syncLifecycleManager.value.observeAppLifecycle() } appLogger.i("$TAG global observers") - globalObserversManager.get().observe() + globalObserversManager.value.observe() launch { observeAssetUploadState() } @@ -147,34 +151,34 @@ class WireApplication : BaseApp() { private suspend fun observeCallBackgroundState() { combine( currentScreenManager.isAppVisibleFlow(), - coreLogic.get().getGlobalScope().session.allSessionsFlow() + coreLogic.value.getGlobalScope().session.allSessionsFlow() .filterIsInstance() .map { it.sessions.filter { it.isValid() } }, ::Pair ).collect { (isAppVisible, validSessions) -> validSessions.forEach { - coreLogic.get().getSessionScope(it.userId).calls.setBackground(!isAppVisible) + coreLogic.value.getSessionScope(it.userId).calls.setBackground(!isAppVisible) } } } private suspend fun observeRecentlyEndedCall() { - coreLogic.get().getGlobalScope().session.currentSessionFlow().filterIsInstance(CurrentSessionResult.Success::class) + coreLogic.value.getGlobalScope().session.currentSessionFlow().filterIsInstance(CurrentSessionResult.Success::class) .filter { session -> session.accountInfo.isValid() } .flatMapLatest { session -> - coreLogic.get().getSessionScope(session.accountInfo.userId).calls.observeRecentlyEndedCallMetadata() + coreLogic.value.getSessionScope(session.accountInfo.userId).calls.observeRecentlyEndedCallMetadata() } .collect { metadata -> - analyticsManager.get().sendEvent(AnalyticsEvent.RecentlyEndedCallEvent(metadata)) + analyticsManager.value.sendEvent(AnalyticsEvent.RecentlyEndedCallEvent(metadata)) } } private suspend fun observeAssetUploadState() { - coreLogic.get().getGlobalScope().session.currentSessionFlow() + coreLogic.value.getGlobalScope().session.currentSessionFlow() .filterIsInstance() .map { it.accountInfo.userId } .flatMapLatest { - coreLogic.get().getSessionScope(it).messages.observeAssetUploadState() + coreLogic.value.getSessionScope(it).messages.observeAssetUploadState() } .collect { uploadInProgress -> if (uploadInProgress) { @@ -228,7 +232,7 @@ class WireApplication : BaseApp() { try { // Use a very short timeout to avoid delaying the crash withTimeout(CRASH_FLUSH_TIMEOUT_MS) { - logFileWriter.get().forceFlush() + logFileWriter.value.forceFlush() } appLogger.i("Logs flushed before crash") } catch (e: Exception) { @@ -304,7 +308,7 @@ class WireApplication : BaseApp() { // 1. Datadog should be initialized first ExternalLoggerManager.initDatadogLogger(applicationContext) // 2. Initialize our internal logging framework - val isLoggingEnabled = globalDataStore.get().isLoggingEnabled().first() + val isLoggingEnabled = globalDataStore.value.isLoggingEnabled().first() val config = if (isLoggingEnabled) { KaliumLogger.Config( KaliumLogLevel.VERBOSE, @@ -317,7 +321,7 @@ class WireApplication : BaseApp() { AppLogger.init(config) CoreLogger.init(config) // 3. Initialize our internal FILE logging framework - logFileWriter.get().start() + logFileWriter.value.start() // 4. Everything ready, now we can log device info appLogger.i("Logger enabled") logDeviceInformation() @@ -336,20 +340,20 @@ class WireApplication : BaseApp() { ) val analyticsResultFlow = ObserveCurrentSessionAnalyticsUseCase( - currentSessionFlow = coreLogic.get().getGlobalScope().session.currentSessionFlow(), + currentSessionFlow = coreLogic.value.getGlobalScope().session.currentSessionFlow(), getAnalyticsContactsData = { userId -> - coreLogic.get().getSessionScope(userId).getAnalyticsContactsData() + coreLogic.value.getSessionScope(userId).getAnalyticsContactsData() }, observeAnalyticsTrackingIdentifierStatusFlow = { userId -> - coreLogic.get().getSessionScope(userId).observeAnalyticsTrackingIdentifierStatus() + coreLogic.value.getSessionScope(userId).observeAnalyticsTrackingIdentifierStatus() }, analyticsIdentifierManagerProvider = { userId -> - coreLogic.get().getSessionScope(userId).analyticsIdentifierManager + coreLogic.value.getSessionScope(userId).analyticsIdentifierManager }, - userDataStoreProvider = userDataStoreProvider.get(), - globalDataStore = globalDataStore.get(), + userDataStoreProvider = userDataStoreProvider.value, + globalDataStore = globalDataStore.value, currentBackend = { userId -> - coreLogic.get().getSessionScope(userId).users.serverLinks() + coreLogic.value.getSessionScope(userId).users.serverLinks() } ).invoke() @@ -374,9 +378,9 @@ class WireApplication : BaseApp() { .isAppVisibleFlow() .filter { isVisible -> isVisible } .collect { - val currentSessionResult = coreLogic.get().getGlobalScope().session.currentSessionFlow().first() + val currentSessionResult = coreLogic.value.getGlobalScope().session.currentSessionFlow().first() val isTeamMember = if (currentSessionResult is CurrentSessionResult.Success) { - coreLogic.get().getSessionScope(currentSessionResult.accountInfo.userId).team.isSelfATeamMember() + coreLogic.value.getSessionScope(currentSessionResult.accountInfo.userId).team.isSelfATeamMember() } else { null } @@ -412,7 +416,7 @@ class WireApplication : BaseApp() { super.onLowMemory() appLogger.w("onLowMemory called - Stopping logging, buckling the seatbelt and hoping for the best!") globalAppScope.launch { - logFileWriter.get().stop() + logFileWriter.value.stop() } } diff --git a/app/src/main/kotlin/com/wire/android/analytics/FinalizeRegistrationAnalyticsMetadataUseCase.kt b/app/src/main/kotlin/com/wire/android/analytics/FinalizeRegistrationAnalyticsMetadataUseCase.kt index fdf3703eb10..f801a4521ae 100644 --- a/app/src/main/kotlin/com/wire/android/analytics/FinalizeRegistrationAnalyticsMetadataUseCase.kt +++ b/app/src/main/kotlin/com/wire/android/analytics/FinalizeRegistrationAnalyticsMetadataUseCase.kt @@ -23,7 +23,7 @@ import com.wire.android.di.KaliumCoreLogic import com.wire.kalium.logic.CoreLogic import com.wire.kalium.logic.data.user.UserId import kotlinx.coroutines.flow.firstOrNull -import javax.inject.Inject +import dev.zacsweers.metro.Inject /** * Finalize the registration process and analytics metadata in case there was enabled in the process. diff --git a/app/src/main/kotlin/com/wire/android/analytics/RegistrationAnalyticsManagerUseCase.kt b/app/src/main/kotlin/com/wire/android/analytics/RegistrationAnalyticsManagerUseCase.kt index e827c836253..c7c8bbc9ed9 100644 --- a/app/src/main/kotlin/com/wire/android/analytics/RegistrationAnalyticsManagerUseCase.kt +++ b/app/src/main/kotlin/com/wire/android/analytics/RegistrationAnalyticsManagerUseCase.kt @@ -21,7 +21,7 @@ import com.wire.android.datastore.GlobalDataStore import com.wire.android.feature.analytics.AnonymousAnalyticsManager import com.wire.android.feature.analytics.model.AnalyticsEvent import kotlinx.coroutines.flow.firstOrNull -import javax.inject.Inject +import dev.zacsweers.metro.Inject class RegistrationAnalyticsManagerUseCase @Inject constructor( private val globalDataStore: GlobalDataStore, diff --git a/app/src/main/kotlin/com/wire/android/config/NomadProfilesFeatureConfig.kt b/app/src/main/kotlin/com/wire/android/config/NomadProfilesFeatureConfig.kt index e40da13b75a..d77e8a38bfa 100644 --- a/app/src/main/kotlin/com/wire/android/config/NomadProfilesFeatureConfig.kt +++ b/app/src/main/kotlin/com/wire/android/config/NomadProfilesFeatureConfig.kt @@ -19,7 +19,7 @@ package com.wire.android.config import com.wire.android.BuildConfig -import javax.inject.Inject +import dev.zacsweers.metro.Inject class NomadProfilesFeatureConfig @Inject constructor() { fun isEnabled(): Boolean = BuildConfig.NOMAD_PROFILES_ENABLED diff --git a/app/src/main/kotlin/com/wire/android/config/ServerConfigProvider.kt b/app/src/main/kotlin/com/wire/android/config/ServerConfigProvider.kt index 53dd69a77ba..bc16943493c 100644 --- a/app/src/main/kotlin/com/wire/android/config/ServerConfigProvider.kt +++ b/app/src/main/kotlin/com/wire/android/config/ServerConfigProvider.kt @@ -20,10 +20,11 @@ package com.wire.android.config import com.wire.android.BuildConfig import com.wire.android.emm.ManagedServerConfig import com.wire.kalium.logic.configuration.server.ServerConfig -import javax.inject.Inject -import javax.inject.Singleton +import dev.zacsweers.metro.Inject +import dev.zacsweers.metro.AppScope +import dev.zacsweers.metro.SingleIn -@Singleton +@SingleIn(AppScope::class) class ServerConfigProvider @Inject constructor() { fun getDefaultServerConfig(managedServerConfig: ManagedServerConfig? = null): ServerConfig.Links { diff --git a/app/src/main/kotlin/com/wire/android/datastore/GlobalDataStore.kt b/app/src/main/kotlin/com/wire/android/datastore/GlobalDataStore.kt index b81e777bab6..d26a159736c 100644 --- a/app/src/main/kotlin/com/wire/android/datastore/GlobalDataStore.kt +++ b/app/src/main/kotlin/com/wire/android/datastore/GlobalDataStore.kt @@ -30,17 +30,18 @@ import com.wire.android.BuildConfig import com.wire.android.feature.AppLockSource import com.wire.android.ui.theme.ThemeOption import com.wire.android.util.sha256 -import dagger.hilt.android.qualifiers.ApplicationContext +import com.wire.android.di.ApplicationContext import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.flow.map import java.util.UUID -import javax.inject.Inject -import javax.inject.Singleton +import dev.zacsweers.metro.Inject +import dev.zacsweers.metro.AppScope +import dev.zacsweers.metro.SingleIn @Suppress("TooManyFunctions") -@Singleton +@SingleIn(AppScope::class) class GlobalDataStore @Inject constructor(@ApplicationContext private val context: Context) { companion object { diff --git a/app/src/main/kotlin/com/wire/android/datastore/UserDataStoreProvider.kt b/app/src/main/kotlin/com/wire/android/datastore/UserDataStoreProvider.kt index c9d85b4208a..f4feeb970af 100644 --- a/app/src/main/kotlin/com/wire/android/datastore/UserDataStoreProvider.kt +++ b/app/src/main/kotlin/com/wire/android/datastore/UserDataStoreProvider.kt @@ -20,13 +20,14 @@ package com.wire.android.datastore import android.content.Context import com.wire.kalium.logic.data.user.UserId -import dagger.hilt.android.qualifiers.ApplicationContext +import com.wire.android.di.ApplicationContext import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.ConcurrentMap -import javax.inject.Inject -import javax.inject.Singleton +import dev.zacsweers.metro.Inject +import dev.zacsweers.metro.AppScope +import dev.zacsweers.metro.SingleIn -@Singleton +@SingleIn(AppScope::class) class UserDataStoreProvider @Inject constructor(@ApplicationContext private val context: Context) { private val dataStoreMap: ConcurrentMap by lazy { ConcurrentHashMap() } diff --git a/app/src/main/kotlin/com/wire/android/di/AppModule.kt b/app/src/main/kotlin/com/wire/android/di/AppModule.kt index a9923829245..437677faaa6 100644 --- a/app/src/main/kotlin/com/wire/android/di/AppModule.kt +++ b/app/src/main/kotlin/com/wire/android/di/AppModule.kt @@ -39,21 +39,18 @@ import com.wire.android.util.dispatchers.DefaultDispatcherProvider import com.wire.android.util.dispatchers.DispatcherProvider import com.wire.android.util.ui.AndroidUiTextResolver import com.wire.android.util.ui.UiTextResolver -import dagger.Module -import dagger.Provides -import dagger.hilt.InstallIn -import dagger.hilt.android.qualifiers.ApplicationContext -import dagger.hilt.components.SingletonComponent -import javax.inject.Named -import javax.inject.Qualifier -import javax.inject.Singleton +import dev.zacsweers.metro.BindingContainer +import dev.zacsweers.metro.Provides +import dev.zacsweers.metro.Named +import dev.zacsweers.metro.Qualifier +import dev.zacsweers.metro.AppScope +import dev.zacsweers.metro.SingleIn @Qualifier @Retention(AnnotationRetention.BINARY) annotation class CurrentAppVersion -@Module -@InstallIn(SingletonComponent::class) +@BindingContainer @Suppress("TooManyFunctions") object AppModule { @@ -61,18 +58,18 @@ object AppModule { @Provides fun provideCurrentAppVersion(): Int = BuildConfig.VERSION_CODE - @Singleton + @SingleIn(AppScope::class) @Provides - fun providesApplicationContext(@ApplicationContext appContext: Context) = appContext + fun providesApplicationContext(@ApplicationContext appContext: Context): Context = appContext - @Singleton + @SingleIn(AppScope::class) @Provides fun provideDefaultDispatchers(): DispatcherProvider = DefaultDispatcherProvider() @Provides fun provideMessageResourceProvider(): MessageResourceProvider = MessageResourceProvider() - @Singleton + @SingleIn(AppScope::class) @Provides fun provideUiTextResolver(@ApplicationContext appContext: Context): UiTextResolver = AndroidUiTextResolver(appContext) @@ -97,7 +94,7 @@ object AppModule { } } - @Singleton + @SingleIn(AppScope::class) @Provides fun provideCurrentTimeProvider(): CurrentTimeProvider = CurrentTimeProvider.Default @@ -108,7 +105,7 @@ object AppModule { fun provideLocationPickerParameters(): LocationPickerParameters = LocationPickerParameters() @Provides - fun provideAnalyticsConfiguration() = + fun provideAnalyticsConfiguration(): AnalyticsConfiguration = if (BuildConfig.ANALYTICS_ENABLED) AnalyticsConfiguration.Enabled else AnalyticsConfiguration.Disabled @Provides @@ -123,7 +120,7 @@ object AppModule { fun provideUseNewLoginForDefaultBackend(): Boolean = BuildConfig.USE_NEW_LOGIN_FOR_DEFAULT_BACKEND @Provides - @Singleton + @SingleIn(AppScope::class) fun provideMessageSharedState(): MessageSharedState = MessageSharedState() @Provides diff --git a/app/src/main/kotlin/com/wire/android/di/ClientScopeProvider.kt b/app/src/main/kotlin/com/wire/android/di/ClientScopeProvider.kt index c8f8db03e10..6ff07d8a76a 100644 --- a/app/src/main/kotlin/com/wire/android/di/ClientScopeProvider.kt +++ b/app/src/main/kotlin/com/wire/android/di/ClientScopeProvider.kt @@ -21,9 +21,9 @@ package com.wire.android.di import com.wire.kalium.logic.CoreLogic import com.wire.kalium.logic.feature.client.ClientScope import com.wire.kalium.logic.data.user.UserId -import dagger.assisted.Assisted -import dagger.assisted.AssistedFactory -import dagger.assisted.AssistedInject +import dev.zacsweers.metro.Assisted +import dev.zacsweers.metro.AssistedFactory +import dev.zacsweers.metro.AssistedInject class ClientScopeProvider @AssistedInject constructor( @KaliumCoreLogic private val coreLogic: CoreLogic, diff --git a/app/src/main/kotlin/com/wire/android/di/CoreLogicModule.kt b/app/src/main/kotlin/com/wire/android/di/CoreLogicModule.kt index 7a8550acec6..644bc74676e 100644 --- a/app/src/main/kotlin/com/wire/android/di/CoreLogicModule.kt +++ b/app/src/main/kotlin/com/wire/android/di/CoreLogicModule.kt @@ -20,6 +20,7 @@ package com.wire.android.di import android.content.Context import androidx.work.WorkManager +import com.wire.android.datastore.UserDataStore import com.wire.android.datastore.UserDataStoreProvider import com.wire.android.emm.ManagedConfigurationsManager import com.wire.android.util.ImageUtil @@ -31,50 +32,71 @@ import com.wire.kalium.logic.data.id.FederatedIdMapper import com.wire.kalium.logic.data.id.QualifiedIdMapper import com.wire.kalium.logic.data.user.UserId import com.wire.kalium.logic.feature.analytics.GetCurrentAnalyticsTrackingIdentifierUseCase +import com.wire.kalium.logic.feature.appVersioning.ObserveIfAppUpdateRequiredUseCase +import com.wire.kalium.logic.feature.applock.MarkTeamAppLockStatusAsNotifiedUseCase import com.wire.kalium.logic.feature.asset.AudioNormalizedLoudnessBuilder import com.wire.kalium.logic.feature.auth.AddAuthenticatedUserUseCase import com.wire.kalium.logic.feature.auth.LogoutUseCase +import com.wire.kalium.logic.feature.auth.ValidateEmailUseCase +import com.wire.kalium.logic.feature.auth.ValidatePasswordUseCase +import com.wire.kalium.logic.feature.auth.ValidateUserHandleUseCase import com.wire.kalium.logic.feature.auth.sso.ValidateSSOCodeUseCase +import com.wire.kalium.logic.feature.backup.CreateMPBackupUseCase +import com.wire.kalium.logic.feature.backup.RestoreMPBackupUseCase +import com.wire.kalium.logic.feature.client.ClearNewClientsForUserUseCase +import com.wire.kalium.logic.feature.client.ObserveNewClientsUseCase import com.wire.kalium.logic.feature.connection.BlockUserUseCase import com.wire.kalium.logic.feature.connection.UnblockUserUseCase import com.wire.kalium.logic.feature.conversation.ObserveOtherUserSecurityClassificationLabelUseCase import com.wire.kalium.logic.feature.conversation.ObserveSecurityClassificationLabelUseCase +import com.wire.kalium.logic.feature.e2ei.CheckCrlRevocationListUseCase import com.wire.kalium.logic.feature.e2ei.usecase.FetchConversationMLSVerificationStatusUseCase import com.wire.kalium.logic.feature.featureConfig.ObserveIsAppLockEditableUseCase +import com.wire.kalium.logic.feature.legalhold.ObserveLegalHoldRequestUseCase +import com.wire.kalium.logic.feature.legalhold.ObserveLegalHoldStateForSelfUserUseCase +import com.wire.kalium.logic.feature.legalhold.ObserveLegalHoldStateForUserUseCase import com.wire.kalium.logic.feature.selfDeletingMessages.ObserveSelfDeletionTimerSettingsForConversationUseCase import com.wire.kalium.logic.feature.selfDeletingMessages.ObserveTeamSettingsSelfDeletingStatusUseCase import com.wire.kalium.logic.feature.selfDeletingMessages.PersistNewSelfDeletionTimerUseCase +import com.wire.kalium.logic.feature.server.GetServerConfigUseCase import com.wire.kalium.logic.feature.server.ServerConfigForAccountUseCase +import com.wire.kalium.logic.feature.server.GetTeamUrlUseCase +import com.wire.kalium.logic.feature.session.CurrentSessionFlowUseCase import com.wire.kalium.logic.feature.session.CurrentSessionResult +import com.wire.kalium.logic.feature.session.CurrentSessionUseCase +import com.wire.kalium.logic.feature.session.DeleteSessionUseCase import com.wire.kalium.logic.feature.session.DoesValidNomadAccountExistUseCase import com.wire.kalium.logic.feature.session.DoesValidSessionExistUseCase import com.wire.kalium.logic.feature.session.GetSessionsUseCase import com.wire.kalium.logic.feature.session.ObserveSessionsUseCase import com.wire.kalium.logic.feature.session.UpdateCurrentSessionUseCase +import com.wire.kalium.logic.feature.user.GetDefaultProtocolUseCase +import com.wire.kalium.logic.feature.user.IsE2EIEnabledUseCase +import com.wire.kalium.logic.feature.user.IsFileSharingEnabledUseCase +import com.wire.kalium.logic.feature.user.IsMLSEnabledUseCase import com.wire.kalium.logic.feature.user.MarkFileSharingChangeAsNotifiedUseCase import com.wire.kalium.logic.feature.user.MarkSelfDeletionStatusAsNotifiedUseCase import com.wire.kalium.logic.feature.user.ObserveValidAccountsUseCase +import com.wire.kalium.logic.feature.user.ObserveFileSharingStatusUseCase +import com.wire.kalium.logic.feature.user.guestroomlink.MarkGuestLinkFeatureFlagAsNotChangedUseCase +import com.wire.kalium.logic.feature.user.guestroomlink.ObserveGuestRoomLinkFeatureFlagUseCase +import com.wire.kalium.logic.feature.user.migration.MigrateFromPersonalToTeamUseCase import com.wire.kalium.logic.feature.user.screenshotCensoring.ObserveScreenshotCensoringConfigUseCase import com.wire.kalium.logic.feature.user.screenshotCensoring.PersistScreenshotCensoringConfigUseCase +import com.wire.kalium.logic.feature.user.webSocketStatus.GetPersistentWebSocketStatus +import com.wire.kalium.logic.feature.user.webSocketStatus.ObservePersistentWebSocketConnectionStatusUseCase +import com.wire.kalium.logic.feature.user.webSocketStatus.PersistPersistentWebSocketConnectionStatusUseCase import com.wire.kalium.logic.featureFlags.KaliumConfigs +import com.wire.kalium.logic.sync.ObserveSyncStateUseCase +import com.wire.kalium.logic.sync.periodic.UpdateApiVersionsScheduler import com.wire.kalium.logic.util.RandomPassword import com.wire.kalium.network.NetworkStateObserver -import dagger.Module -import dagger.Provides -import dagger.hilt.InstallIn -import dagger.hilt.android.components.ServiceComponent -import dagger.hilt.android.components.ViewModelComponent -import dagger.hilt.android.qualifiers.ApplicationContext -import dagger.hilt.android.scopes.ServiceScoped -import dagger.hilt.android.scopes.ViewModelScoped -import dagger.hilt.components.SingletonComponent +import dev.zacsweers.metro.BindingContainer +import dev.zacsweers.metro.Provides import kotlinx.coroutines.runBlocking -import javax.inject.Qualifier -import javax.inject.Singleton - -@Qualifier -@Retention(AnnotationRetention.BINARY) -annotation class CurrentSessionFlowService +import dev.zacsweers.metro.Qualifier +import dev.zacsweers.metro.AppScope +import dev.zacsweers.metro.SingleIn @Qualifier @Retention(AnnotationRetention.BINARY) @@ -88,12 +110,11 @@ annotation class NoSession @Retention(AnnotationRetention.BINARY) annotation class DefaultWebSocketEnabledByDefault -@Module -@InstallIn(SingletonComponent::class) +@BindingContainer class CoreLogicModule { @KaliumCoreLogic - @Singleton + @SingleIn(AppScope::class) @Provides fun provideCoreLogic( @ApplicationContext context: Context, @@ -110,17 +131,17 @@ class CoreLogicModule { ) } - @Singleton + @SingleIn(AppScope::class) @Provides fun provideNetworkStateObserver(@KaliumCoreLogic coreLogic: CoreLogic): NetworkStateObserver = coreLogic.networkStateObserver @Provides - fun provideCurrentSessionUseCase(@KaliumCoreLogic coreLogic: CoreLogic) = + fun provideCurrentSessionUseCase(@KaliumCoreLogic coreLogic: CoreLogic): CurrentSessionUseCase = coreLogic.getGlobalScope().session.currentSession @Provides - fun deleteSessionUseCase(@KaliumCoreLogic coreLogic: CoreLogic) = + fun deleteSessionUseCase(@KaliumCoreLogic coreLogic: CoreLogic): DeleteSessionUseCase = coreLogic.getGlobalScope().deleteSession @Provides @@ -140,13 +161,13 @@ class CoreLogicModule { coreLogic.getGlobalScope().serverConfigForAccounts @NoSession - @Singleton + @SingleIn(AppScope::class) @Provides fun provideNoSessionQualifiedIdMapper(): QualifiedIdMapper = QualifiedIdMapper(null) - @Singleton + @SingleIn(AppScope::class) @Provides - fun provideWorkManager(@ApplicationContext applicationContext: Context) = WorkManager.getInstance(applicationContext) + fun provideWorkManager(@ApplicationContext applicationContext: Context): WorkManager = WorkManager.getInstance(applicationContext) @Provides fun provideAudioNormalizedLoudnessBuilder(@KaliumCoreLogic coreLogic: CoreLogic): AudioNormalizedLoudnessBuilder = @@ -163,12 +184,11 @@ class CoreLogicModule { ) } -@Module -@InstallIn(ViewModelComponent::class) +@BindingContainer class SessionModule { // TODO: can be improved by caching the current session in kalium or changing the scope to ActivityRetainedScoped + @CurrentAccount - @ViewModelScoped @Provides fun provideCurrentSession(@KaliumCoreLogic coreLogic: CoreLogic): UserId { return runBlocking { @@ -181,126 +201,121 @@ class SessionModule { } } - @ViewModelScoped @Provides - fun provideCurrentAccountUserDataStore(@CurrentAccount currentAccount: UserId, userDataStoreProvider: UserDataStoreProvider) = + fun provideCurrentAccountUserDataStore( + @CurrentAccount currentAccount: UserId, + userDataStoreProvider: UserDataStoreProvider + ): UserDataStore = userDataStoreProvider.getOrCreate(currentAccount) } -@Module -@InstallIn(ServiceComponent::class) -class ServiceModule { - @ServiceScoped - @Provides - @CurrentSessionFlowService - fun provideCurrentSessionFlowUseCase(@KaliumCoreLogic coreLogic: CoreLogic) = - coreLogic.getGlobalScope().session.currentSessionFlow -} - -@Module -@InstallIn(ViewModelComponent::class) +@BindingContainer @Suppress("TooManyFunctions", "LargeClass") class UseCaseModule { - @ViewModelScoped @Provides - fun provideObserveSyncStateUseCase(@KaliumCoreLogic coreLogic: CoreLogic, @CurrentAccount currentAccount: UserId) = + fun provideObserveSyncStateUseCase( + @KaliumCoreLogic coreLogic: CoreLogic, + @CurrentAccount currentAccount: UserId + ): ObserveSyncStateUseCase = coreLogic.getSessionScope(currentAccount).observeSyncState - @ViewModelScoped @Provides fun provideLogoutUseCase(@KaliumCoreLogic coreLogic: CoreLogic, @CurrentAccount currentAccount: UserId): LogoutUseCase = coreLogic.getSessionScope(currentAccount).logout @Provides - fun provideValidateEmailUseCase(@KaliumCoreLogic coreLogic: CoreLogic) = + fun provideValidateEmailUseCase(@KaliumCoreLogic coreLogic: CoreLogic): ValidateEmailUseCase = coreLogic.getGlobalScope().validateEmailUseCase @Provides fun provideValidateSSOCodeUseCase(@KaliumCoreLogic coreLogic: CoreLogic): ValidateSSOCodeUseCase = coreLogic.getGlobalScope().validateSSOCodeUseCase - @ViewModelScoped @Provides - fun provideValidatePasswordUseCase(@KaliumCoreLogic coreLogic: CoreLogic) = + fun provideValidatePasswordUseCase(@KaliumCoreLogic coreLogic: CoreLogic): ValidatePasswordUseCase = coreLogic.getGlobalScope().validatePasswordUseCase - @ViewModelScoped @Provides - fun provideValidateUserHandleUseCase(@KaliumCoreLogic coreLogic: CoreLogic) = + fun provideValidateUserHandleUseCase(@KaliumCoreLogic coreLogic: CoreLogic): ValidateUserHandleUseCase = coreLogic.getGlobalScope().validateUserHandleUseCase - @ViewModelScoped @Provides - fun provideGetServerConfigUserCase(@KaliumCoreLogic coreLogic: CoreLogic) = + fun provideGetServerConfigUserCase(@KaliumCoreLogic coreLogic: CoreLogic): GetServerConfigUseCase = coreLogic.getGlobalScope().fetchServerConfigFromDeepLink - @ViewModelScoped @Provides - fun provideCurrentSessionFlowUseCase(@KaliumCoreLogic coreLogic: CoreLogic) = + fun provideCurrentSessionFlowUseCase(@KaliumCoreLogic coreLogic: CoreLogic): CurrentSessionFlowUseCase = coreLogic.getGlobalScope().session.currentSessionFlow - @ViewModelScoped @Provides fun provideAddAuthenticatedUserUseCase(@KaliumCoreLogic coreLogic: CoreLogic): AddAuthenticatedUserUseCase = coreLogic.getGlobalScope().addAuthenticatedAccount - @ViewModelScoped @Provides fun provideObservePersistentWebSocketConnectionStatusUseCase( @KaliumCoreLogic coreLogic: CoreLogic - ) = coreLogic.getGlobalScope().observePersistentWebSocketConnectionStatus + ): ObservePersistentWebSocketConnectionStatusUseCase = coreLogic.getGlobalScope().observePersistentWebSocketConnectionStatus - @ViewModelScoped @Provides fun providePersistPersistentWebSocketConnectionStatusUseCase( @KaliumCoreLogic coreLogic: CoreLogic, @CurrentAccount currentAccount: UserId - ) = coreLogic.getSessionScope(currentAccount).persistPersistentWebSocketConnectionStatus + ): PersistPersistentWebSocketConnectionStatusUseCase = + coreLogic.getSessionScope(currentAccount).persistPersistentWebSocketConnectionStatus - @ViewModelScoped @Provides fun provideGetPersistentWebSocketStatusUseCase( @KaliumCoreLogic coreLogic: CoreLogic, @CurrentAccount currentAccount: UserId - ) = coreLogic.getSessionScope(currentAccount).getPersistentWebSocketStatus + ): GetPersistentWebSocketStatus = coreLogic.getSessionScope(currentAccount).getPersistentWebSocketStatus - @ViewModelScoped @Provides - fun provideCheckCrlRevocationListUseCase(@KaliumCoreLogic coreLogic: CoreLogic, @CurrentAccount currentAccount: UserId) = + fun provideCheckCrlRevocationListUseCase( + @KaliumCoreLogic coreLogic: CoreLogic, + @CurrentAccount currentAccount: UserId + ): CheckCrlRevocationListUseCase = coreLogic.getSessionScope(currentAccount).checkCrlRevocationList - @ViewModelScoped @Provides - fun provideIsMLSEnabledUseCase(@KaliumCoreLogic coreLogic: CoreLogic, @CurrentAccount currentAccount: UserId) = + fun provideIsMLSEnabledUseCase( + @KaliumCoreLogic coreLogic: CoreLogic, + @CurrentAccount currentAccount: UserId + ): IsMLSEnabledUseCase = coreLogic.getSessionScope(currentAccount).isMLSEnabled - @ViewModelScoped @Provides - fun provideGetDefaultProtocol(@KaliumCoreLogic coreLogic: CoreLogic, @CurrentAccount currentAccount: UserId) = + fun provideGetDefaultProtocol( + @KaliumCoreLogic coreLogic: CoreLogic, + @CurrentAccount currentAccount: UserId + ): GetDefaultProtocolUseCase = coreLogic.getSessionScope(currentAccount).getDefaultProtocol - @ViewModelScoped @Provides - fun provideIsE2EIEnabledUseCase(@KaliumCoreLogic coreLogic: CoreLogic, @CurrentAccount currentAccount: UserId) = + fun provideIsE2EIEnabledUseCase( + @KaliumCoreLogic coreLogic: CoreLogic, + @CurrentAccount currentAccount: UserId + ): IsE2EIEnabledUseCase = coreLogic.getSessionScope(currentAccount).isE2EIEnabled - @ViewModelScoped @Provides - fun provideIsFileSharingEnabledUseCase(@KaliumCoreLogic coreLogic: CoreLogic, @CurrentAccount currentAccount: UserId) = + fun provideIsFileSharingEnabledUseCase( + @KaliumCoreLogic coreLogic: CoreLogic, + @CurrentAccount currentAccount: UserId + ): IsFileSharingEnabledUseCase = coreLogic.getSessionScope(currentAccount).isFileSharingEnabled - @ViewModelScoped @Provides - fun provideFileSharingStatusFlowUseCase(@KaliumCoreLogic coreLogic: CoreLogic, @CurrentAccount currentAccount: UserId) = + fun provideFileSharingStatusFlowUseCase( + @KaliumCoreLogic coreLogic: CoreLogic, + @CurrentAccount currentAccount: UserId + ): ObserveFileSharingStatusUseCase = coreLogic.getSessionScope(currentAccount).observeFileSharingStatus - @ViewModelScoped @Provides fun fileSystemProvider(@KaliumCoreLogic coreLogic: CoreLogic, @CurrentAccount currentAccount: UserId): KaliumFileSystem = coreLogic.getSessionScope(currentAccount).kaliumFileSystem - @ViewModelScoped @Provides fun provideFederatedIdMapper( @KaliumCoreLogic coreLogic: CoreLogic, @@ -308,7 +323,6 @@ class UseCaseModule { ): FederatedIdMapper = coreLogic.getSessionScope(currentAccount).federatedIdMapper - @ViewModelScoped @Provides fun provideQualifiedIdMapper( @KaliumCoreLogic coreLogic: CoreLogic, @@ -316,36 +330,31 @@ class UseCaseModule { ): QualifiedIdMapper = coreLogic.getSessionScope(currentAccount).qualifiedIdMapper - @ViewModelScoped @Provides fun provideBlockUserUseCase( @KaliumCoreLogic coreLogic: CoreLogic, @CurrentAccount currentAccount: UserId ): BlockUserUseCase = coreLogic.getSessionScope(currentAccount).connection.blockUser - @ViewModelScoped @Provides fun provideUnblockUserUseCase( @KaliumCoreLogic coreLogic: CoreLogic, @CurrentAccount currentAccount: UserId - ): UnblockUserUseCase = coreLogic.getSessionScope(currentAccount).connection.unblockUser + ): UnblockUserUseCase = + coreLogic.getSessionScope(currentAccount).connection.unblockUser - @ViewModelScoped @Provides fun provideObserveValidAccountsUseCase(@KaliumCoreLogic coreLogic: CoreLogic): ObserveValidAccountsUseCase = coreLogic.getGlobalScope().observeValidAccounts - @ViewModelScoped @Provides fun provideDoesValidSessionExistsUseCase(@KaliumCoreLogic coreLogic: CoreLogic): DoesValidSessionExistUseCase = coreLogic.getGlobalScope().doesValidSessionExist - @ViewModelScoped @Provides fun provideDoesValidNomadAccountExistUseCase(@KaliumCoreLogic coreLogic: CoreLogic): DoesValidNomadAccountExistUseCase = coreLogic.getGlobalScope().doesValidNomadAccountExist - @ViewModelScoped @Provides fun observeSecurityClassificationLabelUseCase( @KaliumCoreLogic coreLogic: CoreLogic, @@ -353,81 +362,82 @@ class UseCaseModule { ): ObserveSecurityClassificationLabelUseCase = coreLogic.getSessionScope(currentAccount).observeSecurityClassificationLabel - @ViewModelScoped @Provides - fun provideCreateMpBackupUseCase(@KaliumCoreLogic coreLogic: CoreLogic, @CurrentAccount currentAccount: UserId) = + fun provideCreateMpBackupUseCase( + @KaliumCoreLogic coreLogic: CoreLogic, + @CurrentAccount currentAccount: UserId + ): CreateMPBackupUseCase = coreLogic.getSessionScope(currentAccount).multiPlatformBackup.create - @ViewModelScoped @Provides - fun provideRestoreMpBackupUseCase(@KaliumCoreLogic coreLogic: CoreLogic, @CurrentAccount currentAccount: UserId) = + fun provideRestoreMpBackupUseCase( + @KaliumCoreLogic coreLogic: CoreLogic, + @CurrentAccount currentAccount: UserId + ): RestoreMPBackupUseCase = coreLogic.getSessionScope(currentAccount).multiPlatformBackup.restore - @ViewModelScoped @Provides - fun provideUpdateApiVersionsScheduler(@KaliumCoreLogic coreLogic: CoreLogic) = + fun provideUpdateApiVersionsScheduler(@KaliumCoreLogic coreLogic: CoreLogic): UpdateApiVersionsScheduler = coreLogic.getGlobalScope().updateApiVersionsScheduler - @ViewModelScoped @Provides - fun provideObserveIfAppFreshEnoughUseCase(@KaliumCoreLogic coreLogic: CoreLogic) = + fun provideObserveIfAppFreshEnoughUseCase(@KaliumCoreLogic coreLogic: CoreLogic): ObserveIfAppUpdateRequiredUseCase = coreLogic.getGlobalScope().observeIfAppUpdateRequired - @ViewModelScoped @Provides fun provideMarkFileSharingStatusAsNotified( @KaliumCoreLogic coreLogic: CoreLogic, @CurrentAccount currentAccount: UserId ): MarkFileSharingChangeAsNotifiedUseCase = coreLogic.getSessionScope(currentAccount).markFileSharingStatusAsNotified - @ViewModelScoped @Provides fun provideMarkSelfDeletingMessagesAsNotified( @KaliumCoreLogic coreLogic: CoreLogic, @CurrentAccount currentAccount: UserId ): MarkSelfDeletionStatusAsNotifiedUseCase = coreLogic.getSessionScope(currentAccount).markSelfDeletingMessagesAsNotified - @ViewModelScoped @Provides fun provideObserveTeamSettingsSelfDeletionStatusFlagUseCase( @KaliumCoreLogic coreLogic: CoreLogic, @CurrentAccount currentAccount: UserId ): ObserveTeamSettingsSelfDeletingStatusUseCase = coreLogic.getSessionScope(currentAccount).observeTeamSettingsSelfDeletionStatus - @ViewModelScoped @Provides fun provideObserveSelfDeletionTimerSettingsForConversationUseCase( @KaliumCoreLogic coreLogic: CoreLogic, @CurrentAccount currentAccount: UserId ): ObserveSelfDeletionTimerSettingsForConversationUseCase = coreLogic.getSessionScope(currentAccount).observeSelfDeletingMessages - @ViewModelScoped @Provides fun providePersistNewSelfDeletingMessagesUseCase( @KaliumCoreLogic coreLogic: CoreLogic, @CurrentAccount currentAccount: UserId ): PersistNewSelfDeletionTimerUseCase = coreLogic.getSessionScope(currentAccount).persistNewSelfDeletionStatus - @ViewModelScoped @Provides fun provideImageUtil(): ImageUtil = ImageUtil - @ViewModelScoped @Provides - fun provideObserveGuestRoomLinkFeatureFlagUseCase(@KaliumCoreLogic coreLogic: CoreLogic, @CurrentAccount currentAccount: UserId) = + fun provideObserveGuestRoomLinkFeatureFlagUseCase( + @KaliumCoreLogic coreLogic: CoreLogic, + @CurrentAccount currentAccount: UserId + ): ObserveGuestRoomLinkFeatureFlagUseCase = coreLogic.getSessionScope(currentAccount).observeGuestRoomLinkFeatureFlag - @ViewModelScoped @Provides - fun provideMarkGuestLinkFeatureFlagAsNotChangedUseCase(@KaliumCoreLogic coreLogic: CoreLogic, @CurrentAccount currentAccount: UserId) = + fun provideMarkGuestLinkFeatureFlagAsNotChangedUseCase( + @KaliumCoreLogic coreLogic: CoreLogic, + @CurrentAccount currentAccount: UserId + ): MarkGuestLinkFeatureFlagAsNotChangedUseCase = coreLogic.getSessionScope(currentAccount).markGuestLinkFeatureFlagAsNotChanged - @ViewModelScoped @Provides - fun provideMarkTeamAppLockStatusAsNotifiedUseCase(@KaliumCoreLogic coreLogic: CoreLogic, @CurrentAccount currentAccount: UserId) = + fun provideMarkTeamAppLockStatusAsNotifiedUseCase( + @KaliumCoreLogic coreLogic: CoreLogic, + @CurrentAccount currentAccount: UserId + ): MarkTeamAppLockStatusAsNotifiedUseCase = coreLogic.getSessionScope(currentAccount).markTeamAppLockStatusAsNotified - @ViewModelScoped @Provides fun provideGetOtherUserSecurityClassificationLabelUseCase( @KaliumCoreLogic coreLogic: CoreLogic, @@ -435,80 +445,76 @@ class UseCaseModule { ): ObserveOtherUserSecurityClassificationLabelUseCase = coreLogic.getSessionScope(currentAccount).getOtherUserSecurityClassificationLabel - @ViewModelScoped @Provides - fun provideObserveNewClientsUseCaseUseCase(@KaliumCoreLogic coreLogic: CoreLogic) = + fun provideObserveNewClientsUseCaseUseCase(@KaliumCoreLogic coreLogic: CoreLogic): ObserveNewClientsUseCase = coreLogic.getGlobalScope().observeNewClientsUseCase - @ViewModelScoped @Provides - fun provideClearNewClientsForUser(@KaliumCoreLogic coreLogic: CoreLogic) = + fun provideClearNewClientsForUser(@KaliumCoreLogic coreLogic: CoreLogic): ClearNewClientsForUserUseCase = coreLogic.getGlobalScope().clearNewClientsForUser - @ViewModelScoped @Provides fun providePersistScreenshotCensoringConfigUseCase( @KaliumCoreLogic coreLogic: CoreLogic, @CurrentAccount currentAccount: UserId ): PersistScreenshotCensoringConfigUseCase = coreLogic.getSessionScope(currentAccount).persistScreenshotCensoringConfig - @ViewModelScoped @Provides fun provideObserveScreenshotCensoringConfigUseCase( @KaliumCoreLogic coreLogic: CoreLogic, @CurrentAccount currentAccount: UserId ): ObserveScreenshotCensoringConfigUseCase = coreLogic.getSessionScope(currentAccount).observeScreenshotCensoringConfig - @ViewModelScoped @Provides fun provideObserveIsAppLockEditableUseCase( @KaliumCoreLogic coreLogic: CoreLogic ): ObserveIsAppLockEditableUseCase = coreLogic.getGlobalScope().observeIsAppLockEditableUseCase - @ViewModelScoped @Provides - fun provideObserveLegalHoldRequestUseCase(@KaliumCoreLogic coreLogic: CoreLogic, @CurrentAccount currentAccount: UserId) = + fun provideObserveLegalHoldRequestUseCase( + @KaliumCoreLogic coreLogic: CoreLogic, + @CurrentAccount currentAccount: UserId + ): ObserveLegalHoldRequestUseCase = coreLogic.getSessionScope(currentAccount).observeLegalHoldRequest - @ViewModelScoped @Provides - fun provideObserveLegalHoldForSelfUserUseCase(@KaliumCoreLogic coreLogic: CoreLogic, @CurrentAccount currentAccount: UserId) = + fun provideObserveLegalHoldForSelfUserUseCase( + @KaliumCoreLogic coreLogic: CoreLogic, + @CurrentAccount currentAccount: UserId + ): ObserveLegalHoldStateForSelfUserUseCase = coreLogic.getSessionScope(currentAccount).observeLegalHoldForSelfUser - @ViewModelScoped @Provides - fun provideObserveLegalHoldForUserUseCase(@KaliumCoreLogic coreLogic: CoreLogic, @CurrentAccount currentAccount: UserId) = + fun provideObserveLegalHoldForUserUseCase( + @KaliumCoreLogic coreLogic: CoreLogic, + @CurrentAccount currentAccount: UserId + ): ObserveLegalHoldStateForUserUseCase = coreLogic.getSessionScope(currentAccount).observeLegalHoldStateForUser - @ViewModelScoped @Provides fun provideFetchConversationMLSVerificationStatusUseCase( @KaliumCoreLogic coreLogic: CoreLogic, @CurrentAccount currentAccount: UserId ): FetchConversationMLSVerificationStatusUseCase = coreLogic.getSessionScope(currentAccount).fetchConversationMLSVerificationStatus - @ViewModelScoped @Provides fun provideGetCurrentAnalyticsTrackingIdentifierUseCase( @KaliumCoreLogic coreLogic: CoreLogic, @CurrentAccount currentAccount: UserId ): GetCurrentAnalyticsTrackingIdentifierUseCase = coreLogic.getSessionScope(currentAccount).getCurrentAnalyticsTrackingIdentifier - @ViewModelScoped @Provides fun provideMigrateFromPersonalToTeamUseCase( @KaliumCoreLogic coreLogic: CoreLogic, @CurrentAccount currentAccount: UserId - ) = coreLogic.getSessionScope(currentAccount).migrateFromPersonalToTeam + ): MigrateFromPersonalToTeamUseCase = coreLogic.getSessionScope(currentAccount).migrateFromPersonalToTeam - @ViewModelScoped @Provides fun provideGetTeamUrlUseCase( @KaliumCoreLogic coreLogic: CoreLogic, @CurrentAccount currentAccount: UserId - ) = coreLogic.getSessionScope(currentAccount).getTeamUrlUseCase + ): GetTeamUrlUseCase = coreLogic.getSessionScope(currentAccount).getTeamUrlUseCase - @ViewModelScoped @Provides - fun provideGenerateRandomPasswordUseCase() = RandomPassword() + fun provideGenerateRandomPasswordUseCase(): RandomPassword = RandomPassword() } diff --git a/app/src/main/kotlin/com/wire/android/di/CoroutineScope.kt b/app/src/main/kotlin/com/wire/android/di/CoroutineScope.kt index 6e1f93790ee..c7773532632 100644 --- a/app/src/main/kotlin/com/wire/android/di/CoroutineScope.kt +++ b/app/src/main/kotlin/com/wire/android/di/CoroutineScope.kt @@ -18,16 +18,15 @@ package com.wire.android.di -import dagger.Module -import dagger.Provides -import dagger.hilt.InstallIn -import dagger.hilt.components.SingletonComponent +import dev.zacsweers.metro.BindingContainer +import dev.zacsweers.metro.Provides import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.SupervisorJob -import javax.inject.Qualifier -import javax.inject.Singleton +import dev.zacsweers.metro.Qualifier +import dev.zacsweers.metro.AppScope +import dev.zacsweers.metro.SingleIn @Retention(AnnotationRetention.RUNTIME) @Qualifier @@ -49,11 +48,10 @@ annotation class MainDispatcher @Qualifier annotation class MainImmediateDispatcher -@InstallIn(SingletonComponent::class) -@Module +@BindingContainer object CoroutinesScopesModule { - @Singleton + @SingleIn(AppScope::class) @ApplicationScope @Provides fun providesCoroutineScope( @@ -61,8 +59,7 @@ object CoroutinesScopesModule { ): CoroutineScope = CoroutineScope(SupervisorJob() + defaultDispatcher) } -@InstallIn(SingletonComponent::class) -@Module +@BindingContainer object CoroutinesDispatchersModule { @DefaultDispatcher diff --git a/app/src/main/kotlin/com/wire/android/di/ImageLoadingModule.kt b/app/src/main/kotlin/com/wire/android/di/ImageLoadingModule.kt index 6a0d5c6ba86..56c10033125 100644 --- a/app/src/main/kotlin/com/wire/android/di/ImageLoadingModule.kt +++ b/app/src/main/kotlin/com/wire/android/di/ImageLoadingModule.kt @@ -24,18 +24,14 @@ import com.wire.kalium.logic.feature.asset.DeleteAssetUseCase import com.wire.kalium.logic.feature.asset.GetAvatarAssetUseCase import com.wire.kalium.logic.feature.asset.GetMessageAssetUseCase import com.wire.kalium.network.NetworkStateObserver -import dagger.Module -import dagger.Provides -import dagger.hilt.InstallIn -import dagger.hilt.android.components.ViewModelComponent -import dagger.hilt.android.qualifiers.ApplicationContext +import dev.zacsweers.metro.BindingContainer +import dev.zacsweers.metro.Provides /** * Module that holds everything necessary to load images. * It's installed in [ViewModelComponent] as it is something that depends on the currently active user session */ -@Module -@InstallIn(ViewModelComponent::class) +@BindingContainer class ImageLoadingModule { @Provides @@ -55,5 +51,6 @@ class ImageLoadingModule { // For better performance/caching. We shouldn't create many of these ImageLoaders. @Provides - fun provideWireImageLoader(imageLoaderFactory: WireSessionImageLoader.Factory) = imageLoaderFactory.newImageLoader() + fun provideWireImageLoader(imageLoaderFactory: WireSessionImageLoader.Factory): WireSessionImageLoader = + imageLoaderFactory.newImageLoader() } diff --git a/app/src/main/kotlin/com/wire/android/di/IsProfileQRCodeEnabledUseCaseProvider.kt b/app/src/main/kotlin/com/wire/android/di/IsProfileQRCodeEnabledUseCaseProvider.kt index b873359c0a9..4c1aba62c35 100644 --- a/app/src/main/kotlin/com/wire/android/di/IsProfileQRCodeEnabledUseCaseProvider.kt +++ b/app/src/main/kotlin/com/wire/android/di/IsProfileQRCodeEnabledUseCaseProvider.kt @@ -20,9 +20,9 @@ package com.wire.android.di import com.wire.kalium.logic.CoreLogic import com.wire.kalium.logic.data.user.UserId import com.wire.kalium.logic.feature.client.IsProfileQRCodeEnabledUseCase -import dagger.assisted.Assisted -import dagger.assisted.AssistedFactory -import dagger.assisted.AssistedInject +import dev.zacsweers.metro.Assisted +import dev.zacsweers.metro.AssistedFactory +import dev.zacsweers.metro.AssistedInject class IsProfileQRCodeEnabledUseCaseProvider @AssistedInject constructor( @KaliumCoreLogic private val coreLogic: CoreLogic, diff --git a/app/src/main/kotlin/com/wire/android/di/KaliumConfigsModule.kt b/app/src/main/kotlin/com/wire/android/di/KaliumConfigsModule.kt index 10bba57fe7e..7e0788c1ed1 100644 --- a/app/src/main/kotlin/com/wire/android/di/KaliumConfigsModule.kt +++ b/app/src/main/kotlin/com/wire/android/di/KaliumConfigsModule.kt @@ -22,13 +22,10 @@ import android.os.Build import com.wire.android.BuildConfig import com.wire.kalium.logic.featureFlags.BuildFileRestrictionState import com.wire.kalium.logic.featureFlags.KaliumConfigs -import dagger.Module -import dagger.Provides -import dagger.hilt.InstallIn -import dagger.hilt.components.SingletonComponent +import dev.zacsweers.metro.BindingContainer +import dev.zacsweers.metro.Provides -@Module -@InstallIn(SingletonComponent::class) +@BindingContainer class KaliumConfigsModule { @Provides diff --git a/app/src/main/kotlin/com/wire/android/di/LogWriterModule.kt b/app/src/main/kotlin/com/wire/android/di/LogWriterModule.kt index f90c9093484..74e208577a8 100644 --- a/app/src/main/kotlin/com/wire/android/di/LogWriterModule.kt +++ b/app/src/main/kotlin/com/wire/android/di/LogWriterModule.kt @@ -20,21 +20,18 @@ package com.wire.android.di import android.content.Context import com.wire.android.BuildConfig -import com.wire.android.util.logging.LogFileWriterV1Impl - import com.wire.android.util.logging.LogFileWriter import com.wire.android.util.logging.LogFileWriterV2Impl -import dagger.Module -import dagger.Provides -import dagger.hilt.InstallIn -import dagger.hilt.android.qualifiers.ApplicationContext -import dagger.hilt.components.SingletonComponent -import javax.inject.Singleton +import com.wire.android.util.logging.LogFileWriter +import com.wire.android.util.logging.LogFileWriterV1Impl +import dev.zacsweers.metro.BindingContainer +import dev.zacsweers.metro.Provides +import dev.zacsweers.metro.AppScope +import dev.zacsweers.metro.SingleIn -@Module -@InstallIn(SingletonComponent::class) +@BindingContainer class LogWriterModule { - @Singleton + @SingleIn(AppScope::class) @Provides fun provideKaliumFileWriter(@ApplicationContext context: Context): LogFileWriter { if (BuildConfig.USE_ASYNC_FLUSH_LOGGING) { diff --git a/app/src/main/kotlin/com/wire/android/di/ManagedConfigurationsModule.kt b/app/src/main/kotlin/com/wire/android/di/ManagedConfigurationsModule.kt index ab1fd85f372..d1081d58c60 100644 --- a/app/src/main/kotlin/com/wire/android/di/ManagedConfigurationsModule.kt +++ b/app/src/main/kotlin/com/wire/android/di/ManagedConfigurationsModule.kt @@ -30,35 +30,32 @@ import com.wire.android.emm.ManagedConfigurationsManagerImpl import com.wire.android.util.EMPTY import com.wire.android.util.dispatchers.DispatcherProvider import com.wire.kalium.logic.configuration.server.ServerConfig -import dagger.Module -import dagger.Provides -import dagger.hilt.InstallIn -import dagger.hilt.android.qualifiers.ApplicationContext -import dagger.hilt.components.SingletonComponent -import javax.inject.Named -import javax.inject.Singleton +import dev.zacsweers.metro.BindingContainer +import dev.zacsweers.metro.Provides +import dev.zacsweers.metro.Named +import dev.zacsweers.metro.AppScope +import dev.zacsweers.metro.SingleIn -@Module -@InstallIn(SingletonComponent::class) +@BindingContainer class ManagedConfigurationsModule { @Provides - @Singleton + @SingleIn(AppScope::class) fun provideServerConfigProvider(): ServerConfigProvider = ServerConfigProvider() @Provides - @Singleton + @SingleIn(AppScope::class) fun provideAndroidUserContextProvider(): AndroidUserContextProvider = AndroidUserContextProviderImpl() @Provides - @Singleton + @SingleIn(AppScope::class) fun provideManagedConfigParser( userContextProvider: AndroidUserContextProvider ): ManagedConfigParser = ManagedConfigParserImpl(userContextProvider) @Provides - @Singleton + @SingleIn(AppScope::class) fun provideManagedConfigurationsRepository( @ApplicationContext context: Context, dispatcherProvider: DispatcherProvider, diff --git a/app/src/main/kotlin/com/wire/android/di/ObserveIfE2EIRequiredDuringLoginUseCaseProvider.kt b/app/src/main/kotlin/com/wire/android/di/ObserveIfE2EIRequiredDuringLoginUseCaseProvider.kt index f5e90784f39..a19c0a8c778 100644 --- a/app/src/main/kotlin/com/wire/android/di/ObserveIfE2EIRequiredDuringLoginUseCaseProvider.kt +++ b/app/src/main/kotlin/com/wire/android/di/ObserveIfE2EIRequiredDuringLoginUseCaseProvider.kt @@ -19,9 +19,9 @@ package com.wire.android.di import com.wire.kalium.logic.CoreLogic import com.wire.kalium.logic.data.user.UserId -import dagger.assisted.Assisted -import dagger.assisted.AssistedFactory -import dagger.assisted.AssistedInject +import dev.zacsweers.metro.Assisted +import dev.zacsweers.metro.AssistedFactory +import dev.zacsweers.metro.AssistedInject class ObserveIfE2EIRequiredDuringLoginUseCaseProvider @AssistedInject constructor( @KaliumCoreLogic private val coreLogic: CoreLogic, diff --git a/app/src/main/kotlin/com/wire/android/di/ObserveScreenshotCensoringConfigUseCaseProvider.kt b/app/src/main/kotlin/com/wire/android/di/ObserveScreenshotCensoringConfigUseCaseProvider.kt index 0ab6eab507d..bbc3f61d02b 100644 --- a/app/src/main/kotlin/com/wire/android/di/ObserveScreenshotCensoringConfigUseCaseProvider.kt +++ b/app/src/main/kotlin/com/wire/android/di/ObserveScreenshotCensoringConfigUseCaseProvider.kt @@ -20,9 +20,9 @@ package com.wire.android.di import com.wire.kalium.logic.CoreLogic import com.wire.kalium.logic.data.user.UserId import com.wire.kalium.logic.feature.user.screenshotCensoring.ObserveScreenshotCensoringConfigUseCase -import dagger.assisted.Assisted -import dagger.assisted.AssistedFactory -import dagger.assisted.AssistedInject +import dev.zacsweers.metro.Assisted +import dev.zacsweers.metro.AssistedFactory +import dev.zacsweers.metro.AssistedInject class ObserveScreenshotCensoringConfigUseCaseProvider @AssistedInject constructor( @KaliumCoreLogic private val coreLogic: CoreLogic, diff --git a/app/src/main/kotlin/com/wire/android/di/ObserveSelfUserUseCaseProvider.kt b/app/src/main/kotlin/com/wire/android/di/ObserveSelfUserUseCaseProvider.kt index d4fc399cf0e..6996b1ec4e4 100644 --- a/app/src/main/kotlin/com/wire/android/di/ObserveSelfUserUseCaseProvider.kt +++ b/app/src/main/kotlin/com/wire/android/di/ObserveSelfUserUseCaseProvider.kt @@ -21,9 +21,9 @@ package com.wire.android.di import com.wire.kalium.logic.CoreLogic import com.wire.kalium.logic.data.user.UserId import com.wire.kalium.logic.feature.user.ObserveSelfUserUseCase -import dagger.assisted.Assisted -import dagger.assisted.AssistedFactory -import dagger.assisted.AssistedInject +import dev.zacsweers.metro.Assisted +import dev.zacsweers.metro.AssistedFactory +import dev.zacsweers.metro.AssistedInject class ObserveSelfUserUseCaseProvider @AssistedInject constructor( @KaliumCoreLogic private val coreLogic: CoreLogic, diff --git a/app/src/main/kotlin/com/wire/android/di/ObserveSyncStateUseCaseProvider.kt b/app/src/main/kotlin/com/wire/android/di/ObserveSyncStateUseCaseProvider.kt index d153d4ff147..2c14b1db3d6 100644 --- a/app/src/main/kotlin/com/wire/android/di/ObserveSyncStateUseCaseProvider.kt +++ b/app/src/main/kotlin/com/wire/android/di/ObserveSyncStateUseCaseProvider.kt @@ -21,9 +21,9 @@ package com.wire.android.di import com.wire.kalium.logic.CoreLogic import com.wire.kalium.logic.data.user.UserId import com.wire.kalium.logic.sync.ObserveSyncStateUseCase -import dagger.assisted.Assisted -import dagger.assisted.AssistedFactory -import dagger.assisted.AssistedInject +import dev.zacsweers.metro.Assisted +import dev.zacsweers.metro.AssistedFactory +import dev.zacsweers.metro.AssistedInject class ObserveSyncStateUseCaseProvider @AssistedInject constructor( @KaliumCoreLogic private val coreLogic: CoreLogic, diff --git a/app/src/main/kotlin/com/wire/android/di/UiCommonHiltBridgeModule.kt b/app/src/main/kotlin/com/wire/android/di/UiCommonHiltBridgeModule.kt deleted file mode 100644 index 278fdab9641..00000000000 --- a/app/src/main/kotlin/com/wire/android/di/UiCommonHiltBridgeModule.kt +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Wire - * Copyright (C) 2026 Wire Swiss GmbH - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see http://www.gnu.org/licenses/. - */ -package com.wire.android.di - -import android.content.Context -import com.wire.android.util.FileSizeFormatter -import dagger.Module -import dagger.Provides -import dagger.hilt.InstallIn -import dagger.hilt.android.qualifiers.ApplicationContext -import dagger.hilt.components.SingletonComponent - -@Module -@InstallIn(SingletonComponent::class) -object UiCommonHiltBridgeModule { - - @Provides - fun provideFileSizeFormatter( - @ApplicationContext context: Context, - ): FileSizeFormatter = FileSizeFormatter(context) -} diff --git a/app/src/main/kotlin/com/wire/android/di/accountScoped/AppsModule.kt b/app/src/main/kotlin/com/wire/android/di/accountScoped/AppsModule.kt index 6eb57cd996a..db0fcab860c 100644 --- a/app/src/main/kotlin/com/wire/android/di/accountScoped/AppsModule.kt +++ b/app/src/main/kotlin/com/wire/android/di/accountScoped/AppsModule.kt @@ -26,39 +26,30 @@ import com.wire.kalium.logic.feature.app.GetAppByIdUseCase import com.wire.kalium.logic.feature.app.ObserveAllAppsUseCase import com.wire.kalium.logic.feature.app.ObserveIsAppMemberUseCase import com.wire.kalium.logic.feature.app.SearchAppsByNameUseCase -import dagger.Module -import dagger.Provides -import dagger.hilt.InstallIn -import dagger.hilt.android.components.ViewModelComponent -import dagger.hilt.android.scopes.ViewModelScoped +import dev.zacsweers.metro.BindingContainer +import dev.zacsweers.metro.Provides -@Module -@InstallIn(ViewModelComponent::class) +@BindingContainer class AppsModule { - @ViewModelScoped @Provides fun provideAppScope( @CurrentAccount currentAccount: UserId, @KaliumCoreLogic coreLogic: CoreLogic ): AppScope = coreLogic.getSessionScope(currentAccount).apps - @ViewModelScoped @Provides fun provideGetAppByIdUseCase(appScope: AppScope): GetAppByIdUseCase = appScope.getAppById - @ViewModelScoped @Provides fun provideObserveIsAppMemberUseCase(appScope: AppScope): ObserveIsAppMemberUseCase = appScope.observeIsAppMember - @ViewModelScoped @Provides fun provideSearchAppsByNameUseCase(appScope: AppScope): SearchAppsByNameUseCase = appScope.searchAppsByName - @ViewModelScoped @Provides fun provideObserveAllAppsUseCase(appScope: AppScope): ObserveAllAppsUseCase = appScope.observeAllApps diff --git a/app/src/main/kotlin/com/wire/android/di/accountScoped/AuthenticationModule.kt b/app/src/main/kotlin/com/wire/android/di/accountScoped/AuthenticationModule.kt index c60b6b2b105..abced1bcc3f 100644 --- a/app/src/main/kotlin/com/wire/android/di/accountScoped/AuthenticationModule.kt +++ b/app/src/main/kotlin/com/wire/android/di/accountScoped/AuthenticationModule.kt @@ -23,24 +23,18 @@ import com.wire.kalium.logic.CoreLogic import com.wire.kalium.logic.data.user.UserId import com.wire.kalium.logic.feature.auth.AuthenticationScope import com.wire.kalium.logic.feature.auth.verification.RequestSecondFactorVerificationCodeUseCase -import dagger.Module -import dagger.Provides -import dagger.hilt.InstallIn -import dagger.hilt.android.components.ViewModelComponent -import dagger.hilt.android.scopes.ViewModelScoped +import dev.zacsweers.metro.BindingContainer +import dev.zacsweers.metro.Provides -@Module -@InstallIn(ViewModelComponent::class) +@BindingContainer class AuthenticationModule { @Provides - @ViewModelScoped fun provideAuthenticationScope( @KaliumCoreLogic coreLogic: CoreLogic, @CurrentAccount currentAccount: UserId ): AuthenticationScope = coreLogic.getSessionScope(currentAccount).authenticationScope - @ViewModelScoped @Provides fun provideRequest2FACodeUseCase(authenticationScope: AuthenticationScope): RequestSecondFactorVerificationCodeUseCase = authenticationScope.requestSecondFactorVerificationCode diff --git a/app/src/main/kotlin/com/wire/android/di/accountScoped/BackupModule.kt b/app/src/main/kotlin/com/wire/android/di/accountScoped/BackupModule.kt index 134fcdc1e44..c0e827c42a6 100644 --- a/app/src/main/kotlin/com/wire/android/di/accountScoped/BackupModule.kt +++ b/app/src/main/kotlin/com/wire/android/di/accountScoped/BackupModule.kt @@ -23,58 +23,53 @@ import com.wire.android.di.KaliumCoreLogic import com.wire.android.ui.home.settings.backup.MPBackupSettings import com.wire.kalium.logic.CoreLogic import com.wire.kalium.logic.data.user.UserId +import com.wire.kalium.logic.feature.backup.BackupAndUploadCryptoStateUseCase import com.wire.kalium.logic.feature.backup.BackupScope +import com.wire.kalium.logic.feature.backup.CreateBackupUseCase +import com.wire.kalium.logic.feature.backup.CreateObfuscatedCopyUseCase +import com.wire.kalium.logic.feature.backup.RestoreBackupUseCase +import com.wire.kalium.logic.feature.backup.SetLastDeviceIdUseCase +import com.wire.kalium.logic.feature.backup.VerifyBackupUseCase import com.wire.kalium.util.DelicateKaliumApi -import dagger.Module -import dagger.Provides -import dagger.hilt.InstallIn -import dagger.hilt.android.components.ViewModelComponent -import dagger.hilt.android.scopes.ViewModelScoped +import dev.zacsweers.metro.BindingContainer +import dev.zacsweers.metro.Provides -@Module -@InstallIn(ViewModelComponent::class) +@BindingContainer class BackupModule { - @ViewModelScoped @Provides fun provideBackupScope(@KaliumCoreLogic coreLogic: CoreLogic, @CurrentAccount currentAccount: UserId): BackupScope = coreLogic.getSessionScope(currentAccount).backup - @ViewModelScoped @Provides - fun provideCreateBackupUseCase(backupScope: BackupScope) = + fun provideCreateBackupUseCase(backupScope: BackupScope): CreateBackupUseCase = backupScope.create - @ViewModelScoped @Provides - fun provideVerifyBackupUseCase(backupScope: BackupScope) = + fun provideVerifyBackupUseCase(backupScope: BackupScope): VerifyBackupUseCase = backupScope.verify - @ViewModelScoped @Provides - fun provideRestoreBackupUseCase(backupScope: BackupScope) = + fun provideRestoreBackupUseCase(backupScope: BackupScope): RestoreBackupUseCase = backupScope.restore @Provides - fun provideMpBackupSettings() = if (BuildConfig.ENABLE_CROSSPLATFORM_BACKUP) { + fun provideMpBackupSettings(): MPBackupSettings = if (BuildConfig.ENABLE_CROSSPLATFORM_BACKUP) { MPBackupSettings.Enabled } else { MPBackupSettings.Disabled } @OptIn(DelicateKaliumApi::class) - @ViewModelScoped @Provides - fun provideOnboardingBackupUseCase(backupScope: BackupScope) = + fun provideOnboardingBackupUseCase(backupScope: BackupScope): CreateObfuscatedCopyUseCase = backupScope.createUnEncryptedCopy - @ViewModelScoped @Provides - fun provideBackupAndUploadCryptoState(backupScope: BackupScope) = + fun provideBackupAndUploadCryptoState(backupScope: BackupScope): BackupAndUploadCryptoStateUseCase = backupScope.backupAndUploadCryptoState - @ViewModelScoped @Provides - fun provideSetLastDeviceIdUseCase(backupScope: BackupScope) = + fun provideSetLastDeviceIdUseCase(backupScope: BackupScope): SetLastDeviceIdUseCase = backupScope.setLastDeviceId } diff --git a/app/src/main/kotlin/com/wire/android/di/accountScoped/CallsModule.kt b/app/src/main/kotlin/com/wire/android/di/accountScoped/CallsModule.kt index e18515964e8..059930b2bcb 100644 --- a/app/src/main/kotlin/com/wire/android/di/accountScoped/CallsModule.kt +++ b/app/src/main/kotlin/com/wire/android/di/accountScoped/CallsModule.kt @@ -27,205 +27,187 @@ import com.wire.kalium.logic.feature.call.usecase.EndCallUseCase import com.wire.kalium.logic.feature.call.usecase.FlipToBackCameraUseCase import com.wire.kalium.logic.feature.call.usecase.FlipToFrontCameraUseCase import com.wire.kalium.logic.feature.call.usecase.GetIncomingCallsUseCase +import com.wire.kalium.logic.feature.call.usecase.IsCallRunningUseCase +import com.wire.kalium.logic.feature.call.usecase.IsEligibleToStartCallUseCase +import com.wire.kalium.logic.feature.call.usecase.IsLastCallClosedUseCase import com.wire.kalium.logic.feature.call.usecase.MuteCallUseCase +import com.wire.kalium.logic.feature.call.usecase.ObserveCallModerationActionsUseCase +import com.wire.kalium.logic.feature.call.usecase.ObserveCallQualityDataUseCase +import com.wire.kalium.logic.feature.call.usecase.ObserveConferenceCallingEnabledUseCase import com.wire.kalium.logic.feature.call.usecase.ObserveEstablishedCallsUseCase +import com.wire.kalium.logic.feature.call.usecase.ObserveEstablishedCallWithSortedParticipantsUseCase +import com.wire.kalium.logic.feature.call.usecase.ObserveInCallReactionsUseCase +import com.wire.kalium.logic.feature.call.usecase.ObserveLastActiveCallWithSortedParticipantsUseCase +import com.wire.kalium.logic.feature.call.usecase.ObserveOngoingCallsUseCase import com.wire.kalium.logic.feature.call.usecase.ObserveOutgoingCallUseCase import com.wire.kalium.logic.feature.call.usecase.ObserveSpeakerUseCase +import com.wire.kalium.logic.feature.call.usecase.RejectCallUseCase +import com.wire.kalium.logic.feature.call.usecase.RequestVideoStreamsUseCase import com.wire.kalium.logic.feature.call.usecase.SetUIRotationUseCase +import com.wire.kalium.logic.feature.call.usecase.SetCallQualityIntervalUseCase import com.wire.kalium.logic.feature.call.usecase.SetVideoPreviewUseCase import com.wire.kalium.logic.feature.call.usecase.StartCallUseCase import com.wire.kalium.logic.feature.call.usecase.TurnLoudSpeakerOffUseCase import com.wire.kalium.logic.feature.call.usecase.TurnLoudSpeakerOnUseCase import com.wire.kalium.logic.feature.call.usecase.UnMuteCallUseCase +import com.wire.kalium.logic.feature.call.usecase.AnswerCallUseCase import com.wire.kalium.logic.feature.call.usecase.video.SetVideoSendStateUseCase import com.wire.kalium.logic.feature.call.usecase.video.UpdateVideoStateUseCase -import dagger.Module -import dagger.Provides -import dagger.hilt.InstallIn -import dagger.hilt.android.components.ViewModelComponent -import dagger.hilt.android.scopes.ViewModelScoped - -@Module -@InstallIn(ViewModelComponent::class) +import dev.zacsweers.metro.BindingContainer +import dev.zacsweers.metro.Provides + +@BindingContainer @Suppress("TooManyFunctions") class CallsModule { - @ViewModelScoped @Provides fun providesCallsScope( @KaliumCoreLogic coreLogic: CoreLogic, @CurrentAccount currentAccount: UserId ): CallsScope = coreLogic.getSessionScope(currentAccount).calls - @ViewModelScoped @Provides fun provideGetIncomingCallsUseCase(callsScope: CallsScope): GetIncomingCallsUseCase = callsScope.getIncomingCalls - @ViewModelScoped @Provides - fun provideRequestVideoStreamsUseCase(callsScope: CallsScope) = + fun provideRequestVideoStreamsUseCase(callsScope: CallsScope): RequestVideoStreamsUseCase = callsScope.requestVideoStreams - @ViewModelScoped @Provides - fun provideIsLastCallClosedUseCase(callsScope: CallsScope) = + fun provideIsLastCallClosedUseCase(callsScope: CallsScope): IsLastCallClosedUseCase = callsScope.isLastCallClosed - @ViewModelScoped @Provides - fun provideObserveOngoingCallsUseCase(callsScope: CallsScope) = + fun provideObserveOngoingCallsUseCase(callsScope: CallsScope): ObserveOngoingCallsUseCase = callsScope.observeOngoingCalls - @ViewModelScoped @Provides - fun provideObserveEstablishedCallWithSortedParticipantsUseCase(callsScope: CallsScope) = + fun provideObserveEstablishedCallWithSortedParticipantsUseCase( + callsScope: CallsScope + ): ObserveEstablishedCallWithSortedParticipantsUseCase = callsScope.observeEstablishedCallWithSortedParticipants - @ViewModelScoped @Provides - fun provideObserveLastActiveCallWithSortedParticipantsUseCase(callsScope: CallsScope) = + fun provideObserveLastActiveCallWithSortedParticipantsUseCase( + callsScope: CallsScope + ): ObserveLastActiveCallWithSortedParticipantsUseCase = callsScope.observeLastActiveCallWithSortedParticipants - @ViewModelScoped @Provides - fun provideRejectCallUseCase(callsScope: CallsScope) = + fun provideRejectCallUseCase(callsScope: CallsScope): RejectCallUseCase = callsScope.rejectCall - @ViewModelScoped @Provides - fun provideAcceptCallUseCase(callsScope: CallsScope) = + fun provideAcceptCallUseCase(callsScope: CallsScope): AnswerCallUseCase = callsScope.answerCall - @ViewModelScoped @Provides fun provideOnGoingCallUseCase( callsScope: CallsScope ): ObserveEstablishedCallsUseCase = callsScope.establishedCall - @ViewModelScoped @Provides fun provideObserveOutgoingCallUseCase( callsScope: CallsScope ): ObserveOutgoingCallUseCase = callsScope.observeOutgoingCall - @ViewModelScoped @Provides fun provideStartCallUseCase(callsScope: CallsScope): StartCallUseCase = callsScope.startCall - @ViewModelScoped @Provides fun provideEndCallUseCase(callsScope: CallsScope): EndCallUseCase = callsScope.endCall - @ViewModelScoped @Provides fun provideEndCallOnConversationChangeUseCase( callsScope: CallsScope ): EndCallOnConversationChangeUseCase = callsScope.endCallOnConversationChange - @ViewModelScoped @Provides fun provideMuteCallUseCase(callsScope: CallsScope): MuteCallUseCase = callsScope.muteCall - @ViewModelScoped @Provides fun provideUnMuteCallUseCase(callsScope: CallsScope): UnMuteCallUseCase = callsScope.unMuteCall - @ViewModelScoped @Provides fun provideSetVideoPreviewUseCase( callsScope: CallsScope ): SetVideoPreviewUseCase = callsScope.setVideoPreview - @ViewModelScoped @Provides fun provideSetUIRotationUseCase( callsScope: CallsScope ): SetUIRotationUseCase = callsScope.setUIRotation - @ViewModelScoped @Provides fun provideFlipToBackCameraUseCase( callsScope: CallsScope ): FlipToBackCameraUseCase = callsScope.flipToBackCamera - @ViewModelScoped @Provides fun provideFlipToFrontCameraUseCase( callsScope: CallsScope ): FlipToFrontCameraUseCase = callsScope.flipToFrontCamera - @ViewModelScoped @Provides fun turnLoudSpeakerOffUseCaseProvider( callsScope: CallsScope ): TurnLoudSpeakerOffUseCase = callsScope.turnLoudSpeakerOff - @ViewModelScoped @Provides fun provideTurnLoudSpeakerOnUseCase( callsScope: CallsScope ): TurnLoudSpeakerOnUseCase = callsScope.turnLoudSpeakerOn - @ViewModelScoped @Provides fun provideObserveSpeakerUseCase( callsScope: CallsScope ): ObserveSpeakerUseCase = callsScope.observeSpeaker - @ViewModelScoped @Provides fun provideUpdateVideoStateUseCase( callsScope: CallsScope ): UpdateVideoStateUseCase = callsScope.updateVideoState - @ViewModelScoped @Provides fun provideSetVideoSendStateUseCase( callsScope: CallsScope ): SetVideoSendStateUseCase = callsScope.setVideoSendState - @ViewModelScoped @Provides - fun provideIsCallRunningUseCase(callsScope: CallsScope) = + fun provideIsCallRunningUseCase(callsScope: CallsScope): IsCallRunningUseCase = callsScope.isCallRunning - @ViewModelScoped @Provides - fun provideIsEligibleToStartCall(callsScope: CallsScope) = + fun provideIsEligibleToStartCall(callsScope: CallsScope): IsEligibleToStartCallUseCase = callsScope.isEligibleToStartCall - @ViewModelScoped @Provides - fun provideObserveConferenceCallingEnabledUseCase(callsScope: CallsScope) = + fun provideObserveConferenceCallingEnabledUseCase(callsScope: CallsScope): ObserveConferenceCallingEnabledUseCase = callsScope.observeConferenceCallingEnabled - @ViewModelScoped @Provides - fun provideObserveInCallReactionsUseCase(callsScope: CallsScope) = + fun provideObserveInCallReactionsUseCase(callsScope: CallsScope): ObserveInCallReactionsUseCase = callsScope.observeInCallReactions - @ViewModelScoped @Provides - fun provideObserveCallQualityDataUseCase(callsScope: CallsScope) = + fun provideObserveCallQualityDataUseCase(callsScope: CallsScope): ObserveCallQualityDataUseCase = callsScope.observeCallQualityData - @ViewModelScoped @Provides - fun provideSetCallQualityIntervalUseCase(callsScope: CallsScope) = + fun provideSetCallQualityIntervalUseCase(callsScope: CallsScope): SetCallQualityIntervalUseCase = callsScope.setCallQualityInterval - @ViewModelScoped @Provides - fun provideObserveCallModerationActionsUseCase(callsScope: CallsScope) = + fun provideObserveCallModerationActionsUseCase(callsScope: CallsScope): ObserveCallModerationActionsUseCase = callsScope.observeCallModerationActions } diff --git a/app/src/main/kotlin/com/wire/android/di/accountScoped/CellsModule.kt b/app/src/main/kotlin/com/wire/android/di/accountScoped/CellsModule.kt index 4c8e5772fcc..c516214cfaf 100644 --- a/app/src/main/kotlin/com/wire/android/di/accountScoped/CellsModule.kt +++ b/app/src/main/kotlin/com/wire/android/di/accountScoped/CellsModule.kt @@ -67,140 +67,106 @@ import com.wire.kalium.cells.paginatedFilesFlowUseCase import com.wire.kalium.logic.CoreLogic import com.wire.kalium.logic.data.user.UserId import com.wire.kalium.logic.featureFlags.KaliumConfigs -import dagger.Module -import dagger.Provides -import dagger.hilt.InstallIn -import dagger.hilt.android.components.ViewModelComponent -import dagger.hilt.android.scopes.ViewModelScoped +import dev.zacsweers.metro.BindingContainer +import dev.zacsweers.metro.Provides @Suppress("TooManyFunctions") -@Module -@InstallIn(ViewModelComponent::class) +@BindingContainer class CellsModule { - @ViewModelScoped @Provides fun provideCellsScope( @KaliumCoreLogic coreLogic: CoreLogic, @CurrentAccount accountId: UserId, ): CellsScope = coreLogic.getSessionScope(accountId).cells - @ViewModelScoped @Provides fun provideAddAttachmentUseCase(cellsScope: CellsScope): AddAttachmentDraftUseCase = cellsScope.addAttachment - @ViewModelScoped @Provides fun provideRemoveAttachmentUseCase(cellsScope: CellsScope): RemoveAttachmentDraftUseCase = cellsScope.removeAttachment - @ViewModelScoped @Provides fun provideRemoveAttachmentsUseCase(cellsScope: CellsScope): RemoveAttachmentDraftsUseCase = cellsScope.removeAttachments - @ViewModelScoped @Provides fun provideObserveAttachmentsUseCase(cellsScope: CellsScope): ObserveAttachmentDraftsUseCase = cellsScope.observeAttachments - @ViewModelScoped @Provides fun providePublishAttachmentsUseCase(cellsScope: CellsScope): PublishAttachmentsUseCase = cellsScope.publishAttachments - @ViewModelScoped @Provides fun provideCellUploadManager(cellsScope: CellsScope): CellUploadManager = cellsScope.uploadManager - @ViewModelScoped @Provides fun provideObserveFilesUseCase(cellsScope: CellsScope): GetPaginatedNodesUseCase = cellsScope.observeFiles - @ViewModelScoped @Provides fun provideObservePagedFilesUseCase(cellsScope: CellsScope): GetPaginatedFilesFlowUseCase = cellsScope.paginatedFilesFlowUseCase - @ViewModelScoped @Provides fun provideDownloadUseCase(cellsScope: CellsScope): DownloadCellFileUseCase = cellsScope.downloadCellFile - @ViewModelScoped @Provides fun provideRefreshAssetUseCase(cellsScope: CellsScope): RefreshCellAssetStateUseCase = cellsScope.refreshAsset - @ViewModelScoped @Provides fun provideDeleteCellAssetUseCase(cellsScope: CellsScope): DeleteCellAssetUseCase = cellsScope.deleteCellAssetUseCase - @ViewModelScoped @Provides fun provideCreatePublicUrlUseCase(cellsScope: CellsScope): CreatePublicLinkUseCase = cellsScope.createPublicLinkUseCase - @ViewModelScoped @Provides fun provideGetPublicUrlUseCase(cellsScope: CellsScope): GetPublicLinkUseCase = cellsScope.getPublicLinkUseCase - @ViewModelScoped @Provides fun provideDeletePublicUrlUseCase(cellsScope: CellsScope): DeletePublicLinkUseCase = cellsScope.deletePublicLinkUseCase - @ViewModelScoped @Provides fun provideRetryAttachmentUploadUseCase(cellsScope: CellsScope): RetryAttachmentUploadUseCase = cellsScope.retryAttachmentUpload - @ViewModelScoped @Provides fun provideCreateFolderUseCase(cellsScope: CellsScope): CreateFolderUseCase = cellsScope.createFolderUseCase - @ViewModelScoped @Provides fun provideCreateSpreadsheetFileUseCase(cellsScope: CellsScope): CreateSpreadsheetFileUseCase = cellsScope.createSpreadsheetFileUseCase - @ViewModelScoped @Provides fun provideCreateDocumentFileUseCase(cellsScope: CellsScope): CreateDocumentFileUseCase = cellsScope.createDocumentFileUseCase - @ViewModelScoped @Provides fun provideCreatePresentationFileUseCase(cellsScope: CellsScope): CreatePresentationFileUseCase = cellsScope.createPresentationFileUseCase - @ViewModelScoped @Provides fun provideMoveNodeUseCase(cellsScope: CellsScope): MoveNodeUseCase = cellsScope.moveNodeUseCase - @ViewModelScoped @Provides fun provideGetFoldersUseCase(cellsScope: CellsScope): GetFoldersUseCase = cellsScope.getFoldersUseCase - @ViewModelScoped @Provides fun provideRestoreNodeFromRecycleBinUseCase(cellsScope: CellsScope): RestoreNodeFromRecycleBinUseCase = cellsScope.restoreNodeFromRecycleBin - @ViewModelScoped @Provides fun provideRenameNodeUseCase(cellsScope: CellsScope): RenameNodeUseCase = cellsScope.renameNodeUseCase - @ViewModelScoped @Provides fun provideGetAllTagsUseCase(cellsScope: CellsScope): GetAllTagsUseCase = cellsScope.getAllTags - @ViewModelScoped @Provides fun provideUpdateNodeTagsUseCase(cellsScope: CellsScope): UpdateNodeTagsUseCase = cellsScope.updateNodeTagsUseCase - @ViewModelScoped @Provides fun provideRemoveNodeTagsUseCase(cellsScope: CellsScope): RemoveNodeTagsUseCase = cellsScope.removeNodeTagsUseCase - @ViewModelScoped @Provides fun provideCellAvailableUseCase(cellsScope: CellsScope): IsAtLeastOneCellAvailableUseCase = cellsScope.isCellAvailable - @ViewModelScoped @Provides fun provideGetAttachmentUseCase(cellsScope: CellsScope): GetMessageAttachmentUseCase = cellsScope.getMessageAttachmentUseCase - @ViewModelScoped @Provides fun provideGetOwnersUseCase(cellsScope: CellsScope): GetOwnersUseCase = cellsScope.getOwnersUseCase @@ -229,33 +195,27 @@ class CellsModule { @Provides fun provideEditorUrlUseCase(cellsScope: CellsScope): GetEditorUrlUseCase = cellsScope.getEditorUrl - @ViewModelScoped @Provides fun provideGetNodeVersionsUseCase(cellsScope: CellsScope): GetNodeVersionsUseCase = cellsScope.getNodeVersions - @ViewModelScoped @Provides fun provideRestoreNodeVersionUseCase(cellsScope: CellsScope): RestoreNodeVersionUseCase = cellsScope.restoreNodeVersion - @ViewModelScoped @Provides fun provideDownloadCellVersionUseCase(cellsScope: CellsScope): DownloadCellVersionUseCase = cellsScope.downloadCellVersion - @ViewModelScoped @Provides fun provideRefreshHelper(cellsScope: CellsScope, kaliumConfigs: KaliumConfigs): CellAssetRefreshHelper = CellAssetRefreshHelper( refreshAsset = cellsScope.refreshAsset, featureFlags = kaliumConfigs ) - @ViewModelScoped @Provides fun provideGetCellsConfigUseCase(cellsScope: CellsScope): GetWireCellConfigurationUseCase = cellsScope.getCellConfig - @ViewModelScoped @Provides fun provideGetPaginatedConversationsFlowUseCase(cellsScope: CellsScope): GetPaginatedCellConversationsFlowUseCase = cellsScope.paginatedConversationsFlowUseCase diff --git a/app/src/main/kotlin/com/wire/android/di/accountScoped/ChannelsModule.kt b/app/src/main/kotlin/com/wire/android/di/accountScoped/ChannelsModule.kt index 57829c186d6..d375eff04ee 100644 --- a/app/src/main/kotlin/com/wire/android/di/accountScoped/ChannelsModule.kt +++ b/app/src/main/kotlin/com/wire/android/di/accountScoped/ChannelsModule.kt @@ -24,29 +24,22 @@ import com.wire.kalium.logic.data.user.UserId import com.wire.kalium.logic.feature.channels.ChannelsScope import com.wire.kalium.logic.feature.channels.ObserveChannelsCreationPermissionUseCase import com.wire.kalium.logic.feature.conversation.channel.UpdateChannelAddPermissionUseCase -import dagger.Module -import dagger.Provides -import dagger.hilt.InstallIn -import dagger.hilt.android.components.ViewModelComponent -import dagger.hilt.android.scopes.ViewModelScoped +import dev.zacsweers.metro.BindingContainer +import dev.zacsweers.metro.Provides -@Module -@InstallIn(ViewModelComponent::class) +@BindingContainer class ChannelsModule { @Provides - @ViewModelScoped fun provideChannelsScope( @KaliumCoreLogic coreLogic: CoreLogic, @CurrentAccount currentAccount: UserId ): ChannelsScope = coreLogic.getSessionScope(currentAccount).channels - @ViewModelScoped @Provides fun provideUpdateChannelAddPermission(channelsScope: ChannelsScope): UpdateChannelAddPermissionUseCase = channelsScope.updateChannelAddPermission - @ViewModelScoped @Provides fun provideChannelCreationPermissionUseCase(channelsScope: ChannelsScope): ObserveChannelsCreationPermissionUseCase = channelsScope.observeChannelsCreationPermissionUseCase diff --git a/app/src/main/kotlin/com/wire/android/di/accountScoped/ClientModule.kt b/app/src/main/kotlin/com/wire/android/di/accountScoped/ClientModule.kt index 6d13001ac90..aa43dba1569 100644 --- a/app/src/main/kotlin/com/wire/android/di/accountScoped/ClientModule.kt +++ b/app/src/main/kotlin/com/wire/android/di/accountScoped/ClientModule.kt @@ -34,77 +34,60 @@ import com.wire.kalium.logic.feature.client.ObserveCurrentClientIdUseCase import com.wire.kalium.logic.feature.client.UpdateClientVerificationStatusUseCase import com.wire.kalium.logic.feature.keypackage.MLSKeyPackageCountUseCase import com.wire.kalium.logic.sync.slow.RestartSlowSyncProcessForRecoveryUseCase -import dagger.Module -import dagger.Provides -import dagger.hilt.InstallIn -import dagger.hilt.android.components.ViewModelComponent -import dagger.hilt.android.scopes.ViewModelScoped +import dev.zacsweers.metro.BindingContainer +import dev.zacsweers.metro.Provides -@Module -@InstallIn(ViewModelComponent::class) +@BindingContainer class ClientModule { - @ViewModelScoped @Provides fun provideClientScopeProvider( @KaliumCoreLogic coreLogic: CoreLogic, @CurrentAccount currentAccount: UserId ): ClientScope = coreLogic.getSessionScope(currentAccount).client - @ViewModelScoped @Provides fun provideMlsKeyPackageCountUseCase(clientScope: ClientScope): MLSKeyPackageCountUseCase = clientScope.mlsKeyPackageCountUseCase - @ViewModelScoped @Provides fun provideRestartSlowSyncProcessForRecoveryUseCase(clientScope: ClientScope): RestartSlowSyncProcessForRecoveryUseCase = clientScope.restartSlowSyncProcessForRecoveryUseCase - @ViewModelScoped @Provides fun provideDeleteClientUseCase(clientScope: ClientScope): DeleteClientUseCase = clientScope.deleteClient - @ViewModelScoped @Provides fun provideGetOrRegisterClientUseCase(clientScope: ClientScope): GetOrRegisterClientUseCase = clientScope.getOrRegister - @ViewModelScoped @Provides fun provideFetchUsersClientsFromRemoteUseCase(clientScope: ClientScope): FetchUsersClientsFromRemoteUseCase = clientScope.fetchUsersClients - @ViewModelScoped @Provides fun provideGetOtherUsersClients(clientScope: ClientScope): ObserveClientsByUserIdUseCase = clientScope.getOtherUserClients - @ViewModelScoped @Provides fun provideFetchSelfClientsFromRemoteUseCase(clientScope: ClientScope): FetchSelfClientsFromRemoteUseCase = clientScope.fetchSelfClients - @ViewModelScoped @Provides fun provideClientFingerPrintUseCase(clientScope: ClientScope): ClientFingerprintUseCase = clientScope.remoteClientFingerPrint - @ViewModelScoped @Provides fun provideUpdateClientVerificationStatusUseCase(clientScope: ClientScope): UpdateClientVerificationStatusUseCase = clientScope.updateClientVerificationStatus - @ViewModelScoped @Provides fun provideGetClientDetailsUseCase(clientScope: ClientScope): ObserveClientDetailsUseCase = clientScope.observeClientDetailsUseCase - @ViewModelScoped @Provides fun provideObserveCurrentClientUseCase(clientScope: ClientScope): ObserveCurrentClientIdUseCase = clientScope.observeCurrentClientId - @ViewModelScoped @Provides fun provideNeedsToRegisterClientUseCase(clientScope: ClientScope): NeedsToRegisterClientUseCase = clientScope.needsToRegisterClient diff --git a/app/src/main/kotlin/com/wire/android/di/accountScoped/ConnectionModule.kt b/app/src/main/kotlin/com/wire/android/di/accountScoped/ConnectionModule.kt index 513838404fc..90b448d5250 100644 --- a/app/src/main/kotlin/com/wire/android/di/accountScoped/ConnectionModule.kt +++ b/app/src/main/kotlin/com/wire/android/di/accountScoped/ConnectionModule.kt @@ -21,41 +21,36 @@ import com.wire.android.di.CurrentAccount import com.wire.android.di.KaliumCoreLogic import com.wire.kalium.logic.CoreLogic import com.wire.kalium.logic.data.user.UserId +import com.wire.kalium.logic.feature.connection.AcceptConnectionRequestUseCase +import com.wire.kalium.logic.feature.connection.CancelConnectionRequestUseCase import com.wire.kalium.logic.feature.connection.ConnectionScope -import dagger.Module -import dagger.Provides -import dagger.hilt.InstallIn -import dagger.hilt.android.components.ViewModelComponent -import dagger.hilt.android.scopes.ViewModelScoped +import com.wire.kalium.logic.feature.connection.IgnoreConnectionRequestUseCase +import com.wire.kalium.logic.feature.connection.SendConnectionRequestUseCase +import dev.zacsweers.metro.BindingContainer +import dev.zacsweers.metro.Provides -@Module -@InstallIn(ViewModelComponent::class) +@BindingContainer class ConnectionModule { - @ViewModelScoped @Provides fun provideConnectionScope( @CurrentAccount currentAccount: UserId, @KaliumCoreLogic coreLogic: CoreLogic ): ConnectionScope = coreLogic.getSessionScope(currentAccount).connection - @ViewModelScoped @Provides - fun provideSendConnectionRequestUseCase(connectionScope: ConnectionScope) = + fun provideSendConnectionRequestUseCase(connectionScope: ConnectionScope): SendConnectionRequestUseCase = connectionScope.sendConnectionRequest - @ViewModelScoped @Provides - fun provideCancelConnectionRequestUseCase(connectionScope: ConnectionScope) = + fun provideCancelConnectionRequestUseCase(connectionScope: ConnectionScope): CancelConnectionRequestUseCase = connectionScope.cancelConnectionRequest - @ViewModelScoped @Provides - fun provideIgnoreConnectionRequestUseCase(connectionScope: ConnectionScope) = + fun provideIgnoreConnectionRequestUseCase(connectionScope: ConnectionScope): IgnoreConnectionRequestUseCase = connectionScope.ignoreConnectionRequest - @ViewModelScoped @Provides - fun provideAcceptConnectionRequestUseCase(connectionScope: ConnectionScope) = + fun provideAcceptConnectionRequestUseCase(connectionScope: ConnectionScope): AcceptConnectionRequestUseCase = connectionScope.acceptConnectionRequest } diff --git a/app/src/main/kotlin/com/wire/android/di/accountScoped/ConversationModule.kt b/app/src/main/kotlin/com/wire/android/di/accountScoped/ConversationModule.kt index f0379b34b56..f37e88a640b 100644 --- a/app/src/main/kotlin/com/wire/android/di/accountScoped/ConversationModule.kt +++ b/app/src/main/kotlin/com/wire/android/di/accountScoped/ConversationModule.kt @@ -32,10 +32,12 @@ import com.wire.kalium.logic.feature.conversation.GetConversationProtocolInfoUse import com.wire.kalium.logic.feature.conversation.GetConversationUnreadEventsCountUseCase import com.wire.kalium.logic.feature.conversation.GetOneToOneConversationDetailsUseCase import com.wire.kalium.logic.feature.conversation.GetOrCreateOneToOneConversationUseCase +import com.wire.kalium.logic.feature.conversation.GetPaginatedFlowOfConversationDetailsWithEventsBySearchQueryUseCase import com.wire.kalium.logic.feature.conversation.IsOneToOneConversationCreatedUseCase import com.wire.kalium.logic.feature.conversation.JoinConversationViaCodeUseCase import com.wire.kalium.logic.feature.conversation.CheckConversationLeaveConditionsUseCase import com.wire.kalium.logic.feature.conversation.LeaveConversationUseCase +import com.wire.kalium.logic.feature.conversation.MembersToMentionUseCase import com.wire.kalium.logic.feature.conversation.ObserveEligibleMembersForConversationAdminRoleUseCase import com.wire.kalium.logic.feature.conversation.PromoteAdminAndLeaveConversationUseCase import com.wire.kalium.logic.feature.conversation.NotifyConversationIsOpenUseCase @@ -43,6 +45,7 @@ import com.wire.kalium.logic.feature.conversation.ObserveArchivedUnreadConversat import com.wire.kalium.logic.feature.conversation.ObserveConversationDetailsUseCase import com.wire.kalium.logic.feature.conversation.ObserveConversationInteractionAvailabilityUseCase import com.wire.kalium.logic.feature.conversation.ObserveConversationListDetailsUseCase +import com.wire.kalium.logic.feature.conversation.ObserveConversationListDetailsWithEventsUseCase import com.wire.kalium.logic.feature.conversation.ObserveConversationMembersUseCase import com.wire.kalium.logic.feature.conversation.ObserveConversationUnderLegalHoldNotifiedUseCase import com.wire.kalium.logic.feature.conversation.ObserveDegradedConversationNotifiedUseCase @@ -67,6 +70,14 @@ import com.wire.kalium.logic.feature.conversation.apps.ChangeAccessForAppsInConv import com.wire.kalium.logic.feature.conversation.createconversation.CreateChannelUseCase import com.wire.kalium.logic.feature.conversation.createconversation.CreateRegularGroupUseCase import com.wire.kalium.logic.feature.conversation.delete.MarkConversationAsDeletedLocallyUseCase +import com.wire.kalium.logic.feature.conversation.folder.AddConversationToFavoritesUseCase +import com.wire.kalium.logic.feature.conversation.folder.CreateConversationFolderUseCase +import com.wire.kalium.logic.feature.conversation.folder.GetFavoriteFolderUseCase +import com.wire.kalium.logic.feature.conversation.folder.MoveConversationToFolderUseCase +import com.wire.kalium.logic.feature.conversation.folder.ObserveConversationsFromFolderUseCase +import com.wire.kalium.logic.feature.conversation.folder.ObserveUserFoldersUseCase +import com.wire.kalium.logic.feature.conversation.folder.RemoveConversationFromFavoritesUseCase +import com.wire.kalium.logic.feature.conversation.folder.RemoveConversationFromFolderUseCase import com.wire.kalium.logic.feature.conversation.getPaginatedFlowOfConversationDetailsWithEventsBySearchQuery import com.wire.kalium.logic.feature.conversation.guestroomlink.CanCreatePasswordProtectedLinksUseCase import com.wire.kalium.logic.feature.conversation.guestroomlink.GenerateGuestRoomLinkUseCase @@ -74,346 +85,283 @@ import com.wire.kalium.logic.feature.conversation.guestroomlink.ObserveGuestRoom import com.wire.kalium.logic.feature.conversation.guestroomlink.RevokeGuestRoomLinkUseCase import com.wire.kalium.logic.feature.conversation.messagetimer.UpdateMessageTimerUseCase import com.wire.kalium.logic.feature.team.DeleteTeamConversationUseCase -import dagger.Module -import dagger.Provides -import dagger.hilt.InstallIn -import dagger.hilt.android.components.ViewModelComponent -import dagger.hilt.android.scopes.ViewModelScoped - -@Module -@InstallIn(ViewModelComponent::class) +import dev.zacsweers.metro.BindingContainer +import dev.zacsweers.metro.Provides + +@BindingContainer @Suppress("TooManyFunctions") class ConversationModule { @Provides - @ViewModelScoped fun provideConversationScope( @KaliumCoreLogic coreLogic: CoreLogic, @CurrentAccount currentAccount: UserId ): ConversationScope = coreLogic.getSessionScope(currentAccount).conversations - @ViewModelScoped @Provides fun provideObserveConversationListDetails(conversationScope: ConversationScope): ObserveConversationListDetailsUseCase = conversationScope.observeConversationListDetails - @ViewModelScoped @Provides - fun provideObserveConversationListDetailsWithEvents(conversationScope: ConversationScope) = + fun provideObserveConversationListDetailsWithEvents( + conversationScope: ConversationScope + ): ObserveConversationListDetailsWithEventsUseCase = conversationScope.observeConversationListDetailsWithEvents - @ViewModelScoped @Provides fun provideObserveConversationUseCase(conversationScope: ConversationScope): GetOneToOneConversationDetailsUseCase = conversationScope.getOneToOneConversation - @ViewModelScoped @Provides fun provideObserveConversationDetailsUseCase(conversationScope: ConversationScope): ObserveConversationDetailsUseCase = conversationScope.observeConversationDetails - @ViewModelScoped @Provides fun provideNotifyConversationIsOpenUseCase(conversationScope: ConversationScope): NotifyConversationIsOpenUseCase = conversationScope.notifyConversationIsOpen - @ViewModelScoped @Provides fun provideDeleteTeamConversationUseCase(conversationScope: ConversationScope): DeleteTeamConversationUseCase = conversationScope.deleteTeamConversation - @ViewModelScoped @Provides fun provideMarkConversationAsDeletedLocallyUseCase(conversationScope: ConversationScope): MarkConversationAsDeletedLocallyUseCase = conversationScope.markConversationAsDeletedLocallyUseCase - @ViewModelScoped @Provides fun provideObserveIsSelfConversationMemberUseCase(conversationScope: ConversationScope): ObserveIsSelfUserMemberUseCase = conversationScope.observeIsSelfUserMemberUseCase - @ViewModelScoped @Provides fun provideObserveConversationInteractionAvailability( conversationScope: ConversationScope ): ObserveConversationInteractionAvailabilityUseCase = conversationScope.observeConversationInteractionAvailabilityUseCase - @ViewModelScoped @Provides fun provideObserveConversationMembersUseCase(conversationScope: ConversationScope): ObserveConversationMembersUseCase = conversationScope.observeConversationMembers - @ViewModelScoped @Provides - fun provideMembersToMentionUseCase(conversationScope: ConversationScope) = + fun provideMembersToMentionUseCase(conversationScope: ConversationScope): MembersToMentionUseCase = conversationScope.getMembersToMention - @ViewModelScoped @Provides fun provideObserveUserListByIdUseCase(conversationScope: ConversationScope): ObserveUserListByIdUseCase = conversationScope.observeUserListById - @ViewModelScoped @Provides fun providesJoinConversationViaCodeUseCase(conversationScope: ConversationScope): JoinConversationViaCodeUseCase = conversationScope.joinConversationViaCode - @ViewModelScoped @Provides fun providesCanCreatePasswordProtectedLinksUseCase(conversationScope: ConversationScope): CanCreatePasswordProtectedLinksUseCase = conversationScope.canCreatePasswordProtectedLinks - @ViewModelScoped @Provides fun provideRefreshConversationsWithoutMetadataUseCase( conversationScope: ConversationScope ): RefreshConversationsWithoutMetadataUseCase = conversationScope.refreshConversationsWithoutMetadata - @ViewModelScoped @Provides fun provideGetConversationUnreadEventsCountUseCase(conversationScope: ConversationScope): GetConversationUnreadEventsCountUseCase = conversationScope.getConversationUnreadEventsCountUseCase - @ViewModelScoped @Provides fun provideUpdateMessageTimerUseCase(conversationScope: ConversationScope): UpdateMessageTimerUseCase = conversationScope.updateMessageTimer - @ViewModelScoped @Provides fun provideRenameConversation(conversationScope: ConversationScope): RenameConversationUseCase = conversationScope.renameConversation - @ViewModelScoped @Provides fun provideUpdateConversationReadDateUseCase(conversationScope: ConversationScope): UpdateConversationReadDateUseCase = conversationScope.updateConversationReadDateUseCase - @ViewModelScoped @Provides fun provideMarkConversationAsReadLocallyUseCase(conversationScope: ConversationScope): MarkConversationAsReadLocallyUseCase = conversationScope.markConversationAsReadLocally - @ViewModelScoped @Provides fun provideUpdateConversationAccessUseCase(conversationScope: ConversationScope): UpdateConversationAccessRoleUseCase = conversationScope.updateConversationAccess - @ViewModelScoped @Provides fun provideLeaveConversationUseCase(conversationScope: ConversationScope): LeaveConversationUseCase = conversationScope.leaveConversation - @ViewModelScoped @Provides fun providePromoteAdminAndLeaveConversationUseCase(conversationScope: ConversationScope): PromoteAdminAndLeaveConversationUseCase = conversationScope.promoteAdminAndLeaveConversation - @ViewModelScoped @Provides fun provideCheckConversationLeaveConditionsUseCase(conversationScope: ConversationScope): CheckConversationLeaveConditionsUseCase = conversationScope.checkConversationLeaveConditions - @ViewModelScoped @Provides fun provideObserveEligibleMembersForConversationAdminRoleUseCase( conversationScope: ConversationScope ): ObserveEligibleMembersForConversationAdminRoleUseCase = conversationScope.observeEligibleMembersForConversationAdminRole - @ViewModelScoped @Provides fun provideUpdateConversationMutedStatusUseCase(conversationScope: ConversationScope): UpdateConversationMutedStatusUseCase = conversationScope.updateConversationMutedStatus - @ViewModelScoped @Provides fun provideUpdateConversationReceiptModeUseCase(conversationScope: ConversationScope): UpdateConversationReceiptModeUseCase = conversationScope.updateConversationReceiptMode - @ViewModelScoped @Provides fun provideAddServiceToConversationUseCase(conversationScope: ConversationScope): AddServiceToConversationUseCase = conversationScope.addServiceToConversationUseCase - @ViewModelScoped @Provides fun provideRemoveMemberFromConversationUseCase(conversationScope: ConversationScope): RemoveMemberFromConversationUseCase = conversationScope.removeMemberFromConversation - @ViewModelScoped @Provides fun provideCreateRegularGroupUseCase(conversationScope: ConversationScope): CreateRegularGroupUseCase = conversationScope.createRegularGroup - @ViewModelScoped @Provides fun provideCreateChannelUseCase(conversationScope: ConversationScope): CreateChannelUseCase = conversationScope.createChannel - @ViewModelScoped @Provides fun provideAddMemberToConversationUseCase(conversationScope: ConversationScope): AddMemberToConversationUseCase = conversationScope.addMemberToConversationUseCase - @ViewModelScoped @Provides fun provideGetOrCreateOneToOneConversationUseCase(conversationScope: ConversationScope): GetOrCreateOneToOneConversationUseCase = conversationScope.getOrCreateOneToOneConversationUseCase - @ViewModelScoped @Provides fun provideGenerateGuestRoomLinkUseCase(conversationScope: ConversationScope): GenerateGuestRoomLinkUseCase = conversationScope.generateGuestRoomLink - @ViewModelScoped @Provides fun provideRevokeGuestRoomLinkUseCase(conversationScope: ConversationScope): RevokeGuestRoomLinkUseCase = conversationScope.revokeGuestRoomLink - @ViewModelScoped @Provides fun provideObserveGuestRoomLinkUseCase(conversationScope: ConversationScope): ObserveGuestRoomLinkUseCase = conversationScope.observeGuestRoomLink - @ViewModelScoped @Provides fun provideClearConversationContentUseCase(conversationScope: ConversationScope): ClearConversationContentUseCase = conversationScope.clearConversationContent - @ViewModelScoped @Provides fun provideUpdateConversationArchivedStatusUseCase(conversationScope: ConversationScope): UpdateConversationArchivedStatusUseCase = conversationScope.updateConversationArchivedStatus - @ViewModelScoped @Provides fun provideUpdateConversationMemberRoleUseCase(conversationScope: ConversationScope): UpdateConversationMemberRoleUseCase = conversationScope.updateConversationMemberRole - @ViewModelScoped @Provides fun provideObserveArchivedUnreadConversationsCountUseCase( conversationScope: ConversationScope ): ObserveArchivedUnreadConversationsCountUseCase = conversationScope.observeArchivedUnreadConversationsCount - @ViewModelScoped @Provides fun provideObserveUsersTypingUseCase(conversationScope: ConversationScope): ObserveUsersTypingUseCase = conversationScope.observeUsersTyping - @ViewModelScoped @Provides fun provideSendTypingEventUseCase(conversationScope: ConversationScope): SendTypingEventUseCase = conversationScope.sendTypingEvent - @ViewModelScoped @Provides fun provideClearTypingEventsUseCase(conversationScope: ConversationScope): ClearUsersTypingEventsUseCase = conversationScope.clearUsersTypingEvents - @ViewModelScoped @Provides fun provideSetUserInformedAboutVerificationBeforeMessagingUseCase( conversationScope: ConversationScope ): SetUserInformedAboutVerificationUseCase = conversationScope.setUserInformedAboutVerificationBeforeMessagingUseCase - @ViewModelScoped @Provides fun provideObserveInformAboutVerificationBeforeMessagingFlagUseCase( conversationScope: ConversationScope ): ObserveDegradedConversationNotifiedUseCase = conversationScope.observeInformAboutVerificationBeforeMessagingFlagUseCase - @ViewModelScoped @Provides fun provideSetUserNotifiedAboutConversationUnderLegalHoldUseCase( conversationScope: ConversationScope, ): SetNotifiedAboutConversationUnderLegalHoldUseCase = conversationScope.setNotifiedAboutConversationUnderLegalHold - @ViewModelScoped @Provides fun provideObserveLegalHoldWithChangeNotifiedForConversationUseCase( conversationScope: ConversationScope, ): ObserveConversationUnderLegalHoldNotifiedUseCase = conversationScope.observeConversationUnderLegalHoldNotified - @ViewModelScoped @Provides fun provideSyncConversationCodeUseCase(conversationScope: ConversationScope): SyncConversationCodeUseCase = conversationScope.syncConversationCode - @ViewModelScoped @Provides fun provideIsOneToOneConversationCreatedUseCase(conversationScope: ConversationScope): IsOneToOneConversationCreatedUseCase = conversationScope.isOneToOneConversationCreatedUseCase - @ViewModelScoped @Provides fun provideGetConversationProtocolInfoUseCase(conversationScope: ConversationScope): GetConversationProtocolInfoUseCase = conversationScope.getConversationProtocolInfo - @ViewModelScoped @Provides - fun provideGetPaginatedFlowOfConversationDetailsWithEventsBySearchQueryUseCase(conversationScope: ConversationScope) = + fun provideGetPaginatedFlowOfConversationDetailsWithEventsBySearchQueryUseCase( + conversationScope: ConversationScope + ): GetPaginatedFlowOfConversationDetailsWithEventsBySearchQueryUseCase = conversationScope.getPaginatedFlowOfConversationDetailsWithEventsBySearchQuery - @ViewModelScoped @Provides - fun provideObserveConversationsFromFolderUseCase(conversationScope: ConversationScope) = + fun provideObserveConversationsFromFolderUseCase(conversationScope: ConversationScope): ObserveConversationsFromFolderUseCase = conversationScope.observeConversationsFromFolder - @ViewModelScoped @Provides - fun provideGetFavoriteFolderUseCase(conversationScope: ConversationScope) = + fun provideGetFavoriteFolderUseCase(conversationScope: ConversationScope): GetFavoriteFolderUseCase = conversationScope.getFavoriteFolder - @ViewModelScoped @Provides - fun provideAddConversationToFavoritesUseCase(conversationScope: ConversationScope) = + fun provideAddConversationToFavoritesUseCase(conversationScope: ConversationScope): AddConversationToFavoritesUseCase = conversationScope.addConversationToFavorites - @ViewModelScoped @Provides - fun provideRemoveConversationFromFavoritesUseCase(conversationScope: ConversationScope) = + fun provideRemoveConversationFromFavoritesUseCase(conversationScope: ConversationScope): RemoveConversationFromFavoritesUseCase = conversationScope.removeConversationFromFavorites - @ViewModelScoped @Provides - fun provideObserveUserFoldersUseCase(conversationScope: ConversationScope) = + fun provideObserveUserFoldersUseCase(conversationScope: ConversationScope): ObserveUserFoldersUseCase = conversationScope.observeUserFolders - @ViewModelScoped @Provides - fun provideMoveConversationToFolderUseCase(conversationScope: ConversationScope) = + fun provideMoveConversationToFolderUseCase(conversationScope: ConversationScope): MoveConversationToFolderUseCase = conversationScope.moveConversationToFolder - @ViewModelScoped @Provides - fun provideRemoveConversationFromFolderUseCase(conversationScope: ConversationScope) = + fun provideRemoveConversationFromFolderUseCase(conversationScope: ConversationScope): RemoveConversationFromFolderUseCase = conversationScope.removeConversationFromFolder - @ViewModelScoped @Provides - fun provideCreateConversationFolderUseCase(conversationScope: ConversationScope) = + fun provideCreateConversationFolderUseCase(conversationScope: ConversationScope): CreateConversationFolderUseCase = conversationScope.createConversationFolder - @ViewModelScoped @Provides fun provideResetMlsConversationUseCase( @KaliumCoreLogic coreLogic: CoreLogic, @CurrentAccount currentAccount: UserId ): ResetMLSConversationUseCase = coreLogic.getSessionScope(currentAccount).resetMlsConversation - @ViewModelScoped @Provides fun provideFetchConversationUseCase( @KaliumCoreLogic coreLogic: CoreLogic, @CurrentAccount currentAccount: UserId ): FetchConversationUseCase = coreLogic.getSessionScope(currentAccount).fetchConversationUseCase - @ViewModelScoped @Provides fun provideChangeAccessForAppsInConversationUseCase( conversationScope: ConversationScope diff --git a/app/src/main/kotlin/com/wire/android/di/accountScoped/DebugModule.kt b/app/src/main/kotlin/com/wire/android/di/accountScoped/DebugModule.kt index 494e8fcfe5a..f02509d632b 100644 --- a/app/src/main/kotlin/com/wire/android/di/accountScoped/DebugModule.kt +++ b/app/src/main/kotlin/com/wire/android/di/accountScoped/DebugModule.kt @@ -22,110 +22,98 @@ import com.wire.android.di.KaliumCoreLogic import com.wire.kalium.logic.CoreLogic import com.wire.kalium.logic.data.user.UserId import com.wire.kalium.logic.feature.debug.BreakSessionUseCase +import com.wire.kalium.logic.feature.debug.ChangeProfilingUseCase import com.wire.kalium.logic.feature.debug.DebugScope +import com.wire.kalium.logic.feature.debug.DebugFeedConversationUseCase +import com.wire.kalium.logic.feature.debug.DisableEventProcessingUseCase import com.wire.kalium.logic.feature.debug.GetDebugE2EICertificateExpirationUseCase import com.wire.kalium.logic.feature.debug.GetFeatureConfigUseCase import com.wire.kalium.logic.feature.debug.GetConversationCryptoStatsUseCase import com.wire.kalium.logic.feature.debug.GetConversationEpochFromCCUseCase import com.wire.kalium.logic.feature.debug.ObserveDebugCRLExpirationAfterOneMinuteUseCase +import com.wire.kalium.logic.feature.debug.ObserveDatabaseLoggerStateUseCase +import com.wire.kalium.logic.feature.debug.ObserveIsConsumableNotificationsEnabledUseCase import com.wire.kalium.logic.feature.debug.RepairFaultyRemovalKeysUseCase import com.wire.kalium.logic.feature.debug.SetDebugCRLExpirationAfterOneMinuteUseCase import com.wire.kalium.logic.feature.debug.SetDebugE2EICertificateExpirationUseCase -import dagger.Module -import dagger.Provides -import dagger.hilt.InstallIn -import dagger.hilt.android.components.ViewModelComponent -import dagger.hilt.android.scopes.ViewModelScoped - -@Module -@InstallIn(ViewModelComponent::class) +import com.wire.kalium.logic.feature.debug.StartUsingAsyncNotificationsUseCase +import com.wire.kalium.logic.feature.notificationToken.SendFCMTokenUseCase +import dev.zacsweers.metro.BindingContainer +import dev.zacsweers.metro.Provides + +@BindingContainer @Suppress("TooManyFunctions") class DebugModule { - @ViewModelScoped @Provides fun providesDebugScope( @KaliumCoreLogic coreLogic: CoreLogic, @CurrentAccount currentAccount: UserId ): DebugScope = coreLogic.getSessionScope(currentAccount).debug - @ViewModelScoped @Provides - fun provideDisableEventProcessing(debugScope: DebugScope) = + fun provideDisableEventProcessing(debugScope: DebugScope): DisableEventProcessingUseCase = debugScope.disableEventProcessing - @ViewModelScoped @Provides fun provideBreakSessionUseCase(debugScope: DebugScope): BreakSessionUseCase = debugScope.breakSession - @ViewModelScoped @Provides - fun provideSendFCMTokenToAPIUseCase(debugScope: DebugScope) = + fun provideSendFCMTokenToAPIUseCase(debugScope: DebugScope): SendFCMTokenUseCase = debugScope.sendFCMTokenToServer - @ViewModelScoped @Provides - fun provideChangeProfilingUseCase(debugScope: DebugScope) = + fun provideChangeProfilingUseCase(debugScope: DebugScope): ChangeProfilingUseCase = debugScope.changeProfiling - @ViewModelScoped @Provides - fun provideObserveDatabaseLoggerState(debugScope: DebugScope) = + fun provideObserveDatabaseLoggerState(debugScope: DebugScope): ObserveDatabaseLoggerStateUseCase = debugScope.observeDatabaseLoggerState - @ViewModelScoped @Provides - fun provideObserveAsyncNotificationsEnabled(debugScope: DebugScope) = debugScope.observeIsConsumableNotificationsEnabled + fun provideObserveAsyncNotificationsEnabled(debugScope: DebugScope): ObserveIsConsumableNotificationsEnabledUseCase = + debugScope.observeIsConsumableNotificationsEnabled - @ViewModelScoped @Provides - fun provideStartUsingAsyncNotifications(debugScope: DebugScope) = debugScope.startUsingAsyncNotifications + fun provideStartUsingAsyncNotifications(debugScope: DebugScope): StartUsingAsyncNotificationsUseCase = + debugScope.startUsingAsyncNotifications - @ViewModelScoped @Provides fun provideFeatureConfigUseCase(debugScope: DebugScope): GetFeatureConfigUseCase = debugScope.getFeatureConfig - @ViewModelScoped @Provides fun provideGetDebugE2EICertificateExpirationUseCase(debugScope: DebugScope): GetDebugE2EICertificateExpirationUseCase = debugScope.getDebugE2EICertificateExpiration - @ViewModelScoped @Provides fun provideSetDebugE2EICertificateExpirationUseCase(debugScope: DebugScope): SetDebugE2EICertificateExpirationUseCase = debugScope.setDebugE2EICertificateExpiration - @ViewModelScoped @Provides fun provideObserveDebugCRLExpirationAfterOneMinuteUseCase( debugScope: DebugScope ): ObserveDebugCRLExpirationAfterOneMinuteUseCase = debugScope.observeDebugCRLExpirationAfterOneMinute - @ViewModelScoped @Provides fun provideSetDebugCRLExpirationAfterOneMinuteUseCase( debugScope: DebugScope ): SetDebugCRLExpirationAfterOneMinuteUseCase = debugScope.setDebugCRLExpirationAfterOneMinute - @ViewModelScoped @Provides fun provideGetConversationEpochFromCCUseCase(debugScope: DebugScope): GetConversationEpochFromCCUseCase = debugScope.getConversationEpochFromCC - @ViewModelScoped @Provides - fun provideDebugFeedConversationUseCase(debugScope: DebugScope) = + fun provideDebugFeedConversationUseCase(debugScope: DebugScope): DebugFeedConversationUseCase = debugScope.debugFeedConversationUseCase - @ViewModelScoped @Provides fun provideRepairFaultyRemovalKeysUseCase(debugScope: DebugScope): RepairFaultyRemovalKeysUseCase = debugScope.repairFaultyRemovalKeysUseCase - @ViewModelScoped @Provides fun provideGetConversationCryptoStatsUseCase(debugScope: DebugScope): GetConversationCryptoStatsUseCase = debugScope.getConversationCryptoStats diff --git a/app/src/main/kotlin/com/wire/android/di/accountScoped/MessageModule.kt b/app/src/main/kotlin/com/wire/android/di/accountScoped/MessageModule.kt index b0840f9b021..fba733984a9 100644 --- a/app/src/main/kotlin/com/wire/android/di/accountScoped/MessageModule.kt +++ b/app/src/main/kotlin/com/wire/android/di/accountScoped/MessageModule.kt @@ -62,200 +62,160 @@ import com.wire.kalium.logic.feature.message.getPaginatedFlowOfMessagesByConvers import com.wire.kalium.logic.feature.message.getPaginatedFlowOfMessagesBySearchQueryAndConversation import com.wire.kalium.logic.feature.message.observePaginatedImageAssetMessageByConversationId import com.wire.kalium.logic.feature.sessionreset.ResetSessionUseCase -import dagger.Module -import dagger.Provides -import dagger.hilt.InstallIn -import dagger.hilt.android.components.ViewModelComponent -import dagger.hilt.android.scopes.ViewModelScoped - -@Module -@InstallIn(ViewModelComponent::class) +import dev.zacsweers.metro.BindingContainer +import dev.zacsweers.metro.Provides + +@BindingContainer @Suppress("TooManyFunctions") class MessageModule { - @ViewModelScoped @Provides fun provideMessageScope( @CurrentAccount currentAccount: UserId, @KaliumCoreLogic coreLogic: CoreLogic ): MessageScope = coreLogic.getSessionScope(currentAccount).messages - @ViewModelScoped @Provides fun provideSendButtonActionMessageUseCase(messageScope: MessageScope): SendButtonActionMessageUseCase = messageScope.sendButtonActionMessage - @ViewModelScoped @Provides fun provideEnqueueMessageSelfDeletionUseCase(messageScope: MessageScope): EnqueueMessageSelfDeletionUseCase = messageScope.enqueueMessageSelfDeletion - @ViewModelScoped @Provides fun provideResetSessionUseCase(messageScope: MessageScope): ResetSessionUseCase = messageScope.resetSession - @ViewModelScoped @Provides fun provideDeleteMessageUseCase(messageScope: MessageScope): DeleteMessageUseCase = messageScope.deleteMessage - @ViewModelScoped @Provides fun provideMarkMessagesAsNotifiedUseCase(messageScope: MessageScope): MarkMessagesAsNotifiedUseCase = messageScope.markMessagesAsNotified - @ViewModelScoped @Provides fun provideUpdateAssetMessageTransferStatusUseCase(messageScope: MessageScope): UpdateAssetMessageTransferStatusUseCase = messageScope.updateAssetMessageTransferStatus - @ViewModelScoped @Provides fun provideSendTextMessageUseCase(messageScope: MessageScope): SendTextMessageUseCase = messageScope.sendTextMessage - @ViewModelScoped @Provides fun provideSendEditTextMessageUseCase(messageScope: MessageScope): SendEditTextMessageUseCase = messageScope.sendEditTextMessage - @ViewModelScoped @Provides fun provideSendEditMultipartMessageUseCase(messageScope: MessageScope): SendEditMultipartMessageUseCase = messageScope.sendEditMultipartMessage - @ViewModelScoped @Provides fun provideRetryFailedMessageUseCase(messageScope: MessageScope): RetryFailedMessageUseCase = messageScope.retryFailedMessage - @ViewModelScoped @Provides fun provideSendKnockUseCase(messageScope: MessageScope): SendKnockUseCase = messageScope.sendKnock - @ViewModelScoped @Provides fun provideToggleReactionUseCase(messageScope: MessageScope): ToggleReactionUseCase = messageScope.toggleReaction - @ViewModelScoped @Provides fun provideObserveMessageReactionsUseCase(messageScope: MessageScope): ObserveMessageReactionsUseCase = messageScope.observeMessageReactions - @ViewModelScoped @Provides fun provideObserveMessageReceiptsUseCase(messageScope: MessageScope): ObserveMessageReceiptsUseCase = messageScope.observeMessageReceipts - @ViewModelScoped @Provides fun providesSendAssetMessageUseCase(messageScope: MessageScope): ScheduleNewAssetMessageUseCase = messageScope.sendAssetMessage - @ViewModelScoped @Provides fun provideGetPrivateAssetUseCase(messageScope: MessageScope): GetMessageAssetUseCase = messageScope.getAssetMessage - @ViewModelScoped @Provides fun provideGetNotificationsUseCase(messageScope: MessageScope): GetNotificationsUseCase = messageScope.getNotifications - @ViewModelScoped @Provides fun provideGetMessageByIdUseCase(messageScope: MessageScope): GetMessageByIdUseCase = messageScope.getMessageById - @ViewModelScoped @Provides fun provideObserveMessageByIdUseCase(messageScope: MessageScope): ObserveMessageByIdUseCase = messageScope.observeMessageById - @ViewModelScoped @Provides fun provideGetPaginatedMessagesUseCase(messageScope: MessageScope): GetPaginatedFlowOfMessagesByConversationUseCase = messageScope.getPaginatedFlowOfMessagesByConversation - @ViewModelScoped @Provides fun provideFetchOlderMessagesUseCase(messageScope: MessageScope): FetchOlderNomadMessagesByConversationUseCase = messageScope.fetchOlderMessagesByConversationId - @ViewModelScoped @Provides fun provideGetImageAssetMessagesByConversationUseCase(messageScope: MessageScope): GetImageAssetMessagesForConversationUseCase = messageScope.getImageAssetMessagesByConversation - @ViewModelScoped @Provides fun provideGetPaginatedFlowOfAssetMessageByConversationId( messageScope: MessageScope ): GetPaginatedFlowOfAssetMessageByConversationIdUseCase = messageScope.getPaginatedFlowOfAssetMessageByConversationId - @ViewModelScoped @Provides fun provideGetPaginatedFlowOfImageAssetMessageByConversationId( messageScope: MessageScope ): ObservePaginatedAssetImageMessages = messageScope.observePaginatedImageAssetMessageByConversationId - @ViewModelScoped @Provides fun provideGetPaginatedFlowOfMessagesBySearchQueryAndConversation( messageScope: MessageScope ): GetPaginatedFlowOfMessagesBySearchQueryAndConversationIdUseCase = messageScope.getPaginatedFlowOfMessagesBySearchQueryAndConversation - @ViewModelScoped @Provides fun provideGetSearchedConversationMessagePositionUseCase(messageScope: MessageScope): GetSearchedConversationMessagePositionUseCase = messageScope.getSearchedConversationMessagePosition - @ViewModelScoped @Provides fun provideSendLocationUseCase(messageScope: MessageScope): SendLocationUseCase = messageScope.sendLocation - @ViewModelScoped @Provides fun provideObserveAssetStatusesUseCase(messageScope: MessageScope): ObserveAssetStatusesUseCase = messageScope.observeAssetStatuses - @ViewModelScoped @Provides fun provideSaveMessageDraftUseCase(messageScope: MessageScope): SaveMessageDraftUseCase = messageScope.saveMessageDraftUseCase - @ViewModelScoped @Provides fun provideGetMessageDraftUseCase(messageScope: MessageScope): GetMessageDraftUseCase = messageScope.getMessageDraftUseCase - @ViewModelScoped @Provides fun provideRemoveMessageDraftUseCase(messageScope: MessageScope): RemoveMessageDraftUseCase = messageScope.removeMessageDraftUseCase - @ViewModelScoped @Provides fun provideSendInCallReactionUseCase(messageScope: MessageScope): SendInCallReactionUseCase = messageScope.sendInCallReactionUseCase - @ViewModelScoped @Provides fun provideGetSenderNameByMessageIdUseCase(messageScope: MessageScope): GetSenderNameByMessageIdUseCase = messageScope.getSenderNameByMessageId - @ViewModelScoped @Provides fun provideSendMultipartMessageUseCase(messageScope: MessageScope): SendMultipartMessageUseCase = messageScope.sendMultipartMessage - @ViewModelScoped @Provides fun provideUpdateAudioMessageNormalizedLoudnessUseCase(messageScope: MessageScope): UpdateAudioMessageNormalizedLoudnessUseCase = messageScope.updateAudioMessageNormalizedLoudnessUseCase diff --git a/app/src/main/kotlin/com/wire/android/di/accountScoped/SearchModule.kt b/app/src/main/kotlin/com/wire/android/di/accountScoped/SearchModule.kt index e5bd7ef34a8..1cbda4379f1 100644 --- a/app/src/main/kotlin/com/wire/android/di/accountScoped/SearchModule.kt +++ b/app/src/main/kotlin/com/wire/android/di/accountScoped/SearchModule.kt @@ -26,36 +26,27 @@ import com.wire.kalium.logic.feature.search.IsFederationSearchAllowedUseCase import com.wire.kalium.logic.feature.search.SearchByHandleUseCase import com.wire.kalium.logic.feature.search.SearchScope import com.wire.kalium.logic.feature.search.SearchUsersUseCase -import dagger.Module -import dagger.Provides -import dagger.hilt.InstallIn -import dagger.hilt.android.components.ViewModelComponent -import dagger.hilt.android.scopes.ViewModelScoped +import dev.zacsweers.metro.BindingContainer +import dev.zacsweers.metro.Provides -@Module -@InstallIn(ViewModelComponent::class) +@BindingContainer class SearchModule { - @ViewModelScoped @Provides fun provideSearchScope( @CurrentAccount currentAccount: UserId, @KaliumCoreLogic coreLogic: CoreLogic ): SearchScope = coreLogic.getSessionScope(currentAccount).search - @ViewModelScoped @Provides fun provideSearchUsersUseCase(searchScope: SearchScope): SearchUsersUseCase = searchScope.searchUsers - @ViewModelScoped @Provides fun provideSearchByHandleUseCase(searchScope: SearchScope): SearchByHandleUseCase = searchScope.searchByHandle - @ViewModelScoped @Provides fun provideFederatedSearchParser(searchScope: SearchScope): FederatedSearchParser = searchScope.federatedSearchParser - @ViewModelScoped @Provides fun provideIsFederationSearchAllowedUseCase(searchScope: SearchScope): IsFederationSearchAllowedUseCase = searchScope.isFederationSearchAllowedUseCase diff --git a/app/src/main/kotlin/com/wire/android/di/accountScoped/ServicesModule.kt b/app/src/main/kotlin/com/wire/android/di/accountScoped/ServicesModule.kt index f3b7c07adae..2a6cebb6d76 100644 --- a/app/src/main/kotlin/com/wire/android/di/accountScoped/ServicesModule.kt +++ b/app/src/main/kotlin/com/wire/android/di/accountScoped/ServicesModule.kt @@ -21,56 +21,46 @@ import com.wire.android.di.CurrentAccount import com.wire.android.di.KaliumCoreLogic import com.wire.kalium.logic.CoreLogic import com.wire.kalium.logic.data.user.UserId +import com.wire.kalium.logic.feature.featureConfig.ObserveIsAppsAllowedForUsageUseCase import com.wire.kalium.logic.feature.service.GetServiceByIdUseCase import com.wire.kalium.logic.feature.service.ObserveAllServicesUseCase import com.wire.kalium.logic.feature.service.ObserveIsServiceMemberUseCase import com.wire.kalium.logic.feature.service.SearchServicesByNameUseCase import com.wire.kalium.logic.feature.service.ServiceScope import com.wire.kalium.logic.feature.service.SyncServicesUseCase -import dagger.Module -import dagger.Provides -import dagger.hilt.InstallIn -import dagger.hilt.android.components.ViewModelComponent -import dagger.hilt.android.scopes.ViewModelScoped +import dev.zacsweers.metro.BindingContainer +import dev.zacsweers.metro.Provides -@Module -@InstallIn(ViewModelComponent::class) +@BindingContainer class ServicesModule { - @ViewModelScoped @Provides fun provideServiceScope( @CurrentAccount currentAccount: UserId, @KaliumCoreLogic coreLogic: CoreLogic ): ServiceScope = coreLogic.getSessionScope(currentAccount).service - @ViewModelScoped @Provides fun provideObserveIsServiceMemberUseCase(serviceScope: ServiceScope): ObserveIsServiceMemberUseCase = serviceScope.observeIsServiceMember - @ViewModelScoped @Provides fun provideGetServiceByIdUseCase(serviceScope: ServiceScope): GetServiceByIdUseCase = serviceScope.getServiceById - @ViewModelScoped @Provides fun provideObserveAllServicesUseCase(serviceScope: ServiceScope): ObserveAllServicesUseCase = serviceScope.observeAllServices - @ViewModelScoped @Provides fun provideSyncServicesUseCase(serviceScope: ServiceScope): SyncServicesUseCase = serviceScope.syncServices - @ViewModelScoped @Provides fun provideSearchServicesByNameUseCase(serviceScope: ServiceScope): SearchServicesByNameUseCase = serviceScope.searchServicesByName - @ViewModelScoped @Provides - fun provideObserveIsAppsAllowedForUsage(serviceScope: ServiceScope) = + fun provideObserveIsAppsAllowedForUsage(serviceScope: ServiceScope): ObserveIsAppsAllowedForUsageUseCase = serviceScope.observeIsAppsAllowedForUsage } diff --git a/app/src/main/kotlin/com/wire/android/di/accountScoped/TeamModule.kt b/app/src/main/kotlin/com/wire/android/di/accountScoped/TeamModule.kt index af8ff4cf1db..160f364e1b0 100644 --- a/app/src/main/kotlin/com/wire/android/di/accountScoped/TeamModule.kt +++ b/app/src/main/kotlin/com/wire/android/di/accountScoped/TeamModule.kt @@ -24,29 +24,22 @@ import com.wire.kalium.logic.data.user.UserId import com.wire.kalium.logic.feature.team.SyncSelfTeamInfoUseCase import com.wire.kalium.logic.feature.team.TeamScope import com.wire.kalium.logic.feature.user.IsSelfATeamMemberUseCase -import dagger.Module -import dagger.Provides -import dagger.hilt.InstallIn -import dagger.hilt.android.components.ViewModelComponent -import dagger.hilt.android.scopes.ViewModelScoped +import dev.zacsweers.metro.BindingContainer +import dev.zacsweers.metro.Provides -@Module -@InstallIn(ViewModelComponent::class) +@BindingContainer class TeamModule { - @ViewModelScoped @Provides fun provideTeamScope( @CurrentAccount currentAccount: UserId, @KaliumCoreLogic coreLogic: CoreLogic ): TeamScope = coreLogic.getSessionScope(currentAccount).team - @ViewModelScoped @Provides fun provideSyncSelfTeamInfoUseCase(teamScope: TeamScope): SyncSelfTeamInfoUseCase = teamScope.syncSelfTeamInfoUseCase - @ViewModelScoped @Provides fun provideIsSelfATeamMemberUseCase(teamScope: TeamScope): IsSelfATeamMemberUseCase = teamScope.isSelfATeamMember diff --git a/app/src/main/kotlin/com/wire/android/di/accountScoped/UserModule.kt b/app/src/main/kotlin/com/wire/android/di/accountScoped/UserModule.kt index 15ab530d0ba..37a092eeb38 100644 --- a/app/src/main/kotlin/com/wire/android/di/accountScoped/UserModule.kt +++ b/app/src/main/kotlin/com/wire/android/di/accountScoped/UserModule.kt @@ -60,109 +60,89 @@ import com.wire.kalium.logic.feature.user.readReceipts.PersistReadReceiptsStatus import com.wire.kalium.logic.feature.user.typingIndicator.ObserveTypingIndicatorEnabledUseCase import com.wire.kalium.logic.feature.user.typingIndicator.PersistTypingIndicatorStatusConfigUseCase import com.wire.kalium.logic.sync.ForegroundActionsUseCase -import dagger.Module -import dagger.Provides -import dagger.hilt.InstallIn -import dagger.hilt.android.components.ViewModelComponent -import dagger.hilt.android.scopes.ViewModelScoped - -@Module -@InstallIn(ViewModelComponent::class) +import dev.zacsweers.metro.BindingContainer +import dev.zacsweers.metro.Provides + +@BindingContainer @Suppress("TooManyFunctions") class UserModule { @Provides - @ViewModelScoped fun provideUserScope( @KaliumCoreLogic coreLogic: CoreLogic, @CurrentAccount currentAccount: UserId ): UserScope = coreLogic.getSessionScope(currentAccount).users - @ViewModelScoped @Provides fun provideRefreshUsersWithoutMetadataUseCase( userScope: UserScope ): RefreshUsersWithoutMetadataUseCase = userScope.refreshUsersWithoutMetadata - @ViewModelScoped @Provides fun provideDeleteAccountUseCase( userScope: UserScope ): DeleteAccountUseCase = userScope.deleteAccount - @ViewModelScoped @Provides fun provideUpdateEmailUseCase( userScope: UserScope ): UpdateEmailUseCase = userScope.updateEmail - @ViewModelScoped @Provides fun provideUpdateDisplayNameUseCase( userScope: UserScope ): UpdateDisplayNameUseCase = userScope.updateDisplayName - @ViewModelScoped @Provides fun provideUpdateAccentColorUseCase( userScope: UserScope ): UpdateAccentColorUseCase = userScope.updateAccentColor - @ViewModelScoped @Provides fun provideGetAssetSizeLimitUseCase( userScope: UserScope ): GetAssetSizeLimitUseCase = userScope.getAssetSizeLimit - @ViewModelScoped @Provides fun provideObserveReadReceiptsEnabled(userScope: UserScope): ObserveReadReceiptsEnabledUseCase = userScope.observeReadReceiptsEnabled - @ViewModelScoped @Provides fun providePersistReadReceiptsStatusConfig(userScope: UserScope): PersistReadReceiptsStatusConfigUseCase = userScope.persistReadReceiptsStatusConfig - @ViewModelScoped @Provides fun provideFinalizeMLSClientAfterE2EIEnrollmentUseCase(userScope: UserScope): FinalizeMLSClientAfterE2EIEnrollmentUseCase = userScope.finalizeMLSClientAfterE2EIEnrollment - @ViewModelScoped @Provides fun provideObserveTypingIndicatorEnabled(userScope: UserScope): ObserveTypingIndicatorEnabledUseCase = userScope.observeTypingIndicatorEnabled - @ViewModelScoped @Provides fun providePersistTypingIndicatorStatusConfig(userScope: UserScope): PersistTypingIndicatorStatusConfigUseCase = userScope.persistTypingIndicatorStatusConfig - @ViewModelScoped @Provides fun provideSelfServerConfig( userScope: UserScope ): SelfServerConfigUseCase = userScope.serverLinks - @ViewModelScoped @Provides fun provideObserveUserInfoUseCase( userScope: UserScope ): ObserveUserInfoUseCase = userScope.observeUserInfo - @ViewModelScoped @Provides fun provideIsPasswordRequiredUseCase( userScope: UserScope ): IsPasswordRequiredUseCase = userScope.isPasswordRequired - @ViewModelScoped @Provides fun provideIsPreventAdminlessGroupsEnabledUseCase( @KaliumCoreLogic coreLogic: CoreLogic, @@ -170,122 +150,99 @@ class UserModule { ): IsPreventAdminlessGroupsEnabledUseCase = coreLogic.getSessionScope(currentAccount).isPreventAdminlessGroupsEnabled - @ViewModelScoped @Provides fun provideIsReadOnlyAccountUseCase( userScope: UserScope ): IsReadOnlyAccountUseCase = userScope.isReadOnlyAccount - @ViewModelScoped @Provides fun provideGetAllContactsNotInTheConversationUseCase( userScope: UserScope ): GetAllContactsNotInConversationUseCase = userScope.getAllContactsNotInConversation - @ViewModelScoped @Provides fun provideGetUserInfoUseCase(userScope: UserScope): GetUserInfoUseCase = userScope.getUserInfo - @ViewModelScoped @Provides fun provideUpdateSelfAvailabilityStatusUseCase(userScope: UserScope): UpdateSelfAvailabilityStatusUseCase = userScope.updateSelfAvailabilityStatus - @ViewModelScoped @Provides fun provideGetAllContactsUseCase( userScope: UserScope ): GetAllContactsUseCase = userScope.getAllKnownUsers - @ViewModelScoped @Provides fun provideGetKnownUserUseCase( userScope: UserScope ): GetKnownUserUseCase = userScope.getKnownUser - @ViewModelScoped @Provides fun provideGetSelfUseCase(userScope: UserScope): GetSelfUserUseCase = userScope.getSelfUser - @ViewModelScoped @Provides fun provideGetSelfTeamIdUseCase(userScope: UserScope): GetSelfTeamIdUseCase = userScope.getSelfTeamId - @ViewModelScoped @Provides fun provideObserveSelfUseCase(userScope: UserScope): ObserveSelfUserUseCase = userScope.observeSelfUser - @ViewModelScoped @Provides fun provideObserveSelfUserWithTeamUseCase(userScope: UserScope): ObserveSelfUserWithTeamUseCase = userScope.observeSelfUserWithTeam - @ViewModelScoped @Provides fun provideGetAvatarAssetUseCase(userScope: UserScope): GetAvatarAssetUseCase = userScope.getPublicAsset - @ViewModelScoped @Provides fun provideDeleteAssetUseCase(userScope: UserScope): DeleteAssetUseCase = userScope.deleteAsset - @ViewModelScoped @Provides fun provideUploadUserAvatarUseCase(userScope: UserScope): UploadUserAvatarUseCase = userScope.uploadUserAvatar - @ViewModelScoped @Provides fun provideSetUserHandleUseCase(userScope: UserScope): SetUserHandleUseCase = userScope.setUserHandle - @ViewModelScoped @Provides fun provideGetE2EICertificateUseCase(userScope: UserScope): GetMLSClientIdentityUseCase = userScope.getE2EICertificate - @ViewModelScoped @Provides fun provideGetUserE2eiCertificateStatusUseCase(userScope: UserScope): IsOtherUserE2EIVerifiedUseCase = userScope.getUserE2eiCertificateStatus - @ViewModelScoped @Provides fun provideGetMembersE2EICertificateStatusesUseCase(userScope: UserScope): GetMembersE2EICertificateStatusesUseCase = userScope.getMembersE2EICertificateStatuses - @ViewModelScoped @Provides fun provideGetUserMlsClientIdentities(userScope: UserScope): GetUserMlsClientIdentitiesUseCase = userScope.getUserMlsClientIdentities - @ViewModelScoped @Provides fun provideIsPersonalToTeamAccountSupportedByBackendUseCase(userScope: UserScope): CanMigrateFromPersonalToTeamUseCase = userScope.isPersonalToTeamAccountSupportedByBackend - @ViewModelScoped @Provides fun provideForegroundActionsUseCase(userScope: UserScope): ForegroundActionsUseCase = userScope.foregroundActions - @ViewModelScoped @Provides fun provideCellsConfigUseCase(userScope: UserScope): IsWireCellsEnabledUseCase = userScope.isWireCellsEnabled - @ViewModelScoped @Provides fun provideIsWireCellsEnabledForConversationUseCase(userScope: UserScope): IsWireCellsEnabledForConversationUseCase = userScope.isWireCellsEnabledForConversation - @ViewModelScoped @Provides fun provideProfileQRCodeConfigUseCase(userScope: UserScope): IsProfileQRCodeEnabledUseCase = userScope.isProfileQRCodeEnabled diff --git a/app/src/main/kotlin/com/wire/android/di/metro/AuthenticationViewModelGraphBridge.kt b/app/src/main/kotlin/com/wire/android/di/metro/AppAuthenticationViewModelGraph.kt similarity index 69% rename from app/src/main/kotlin/com/wire/android/di/metro/AuthenticationViewModelGraphBridge.kt rename to app/src/main/kotlin/com/wire/android/di/metro/AppAuthenticationViewModelGraph.kt index cc5fd4516c4..bc86ce9c9cc 100644 --- a/app/src/main/kotlin/com/wire/android/di/metro/AuthenticationViewModelGraphBridge.kt +++ b/app/src/main/kotlin/com/wire/android/di/metro/AppAuthenticationViewModelGraph.kt @@ -17,18 +17,15 @@ */ package com.wire.android.di.metro -import androidx.lifecycle.ViewModel import com.wire.android.ui.authentication.AuthenticationViewModelFactory import com.wire.android.ui.authentication.AuthenticationViewModelGraph -import dagger.hilt.android.lifecycle.HiltViewModel -import javax.inject.Inject -import javax.inject.Provider +import dev.zacsweers.metro.Inject + +class AppAuthenticationViewModelGraph @Inject constructor( + private val authenticationViewModelFactoryProvider: () -> AuthenticationViewModelFactory, +) : AuthenticationViewModelGraph { + override val viewModelScopeKey: String = "authentication" -@HiltViewModel -class AuthenticationViewModelGraphBridge @Inject constructor( - private val authenticationViewModelFactoryProvider: Provider, -) : ViewModel(), - AuthenticationViewModelGraph { override val authenticationViewModelFactory: AuthenticationViewModelFactory - get() = authenticationViewModelFactoryProvider.get() + get() = authenticationViewModelFactoryProvider() } diff --git a/app/src/main/kotlin/com/wire/android/di/metro/ImageAssetViewModelGraphBridgeViewModel.kt b/app/src/main/kotlin/com/wire/android/di/metro/AppImageAssetViewModelGraph.kt similarity index 61% rename from app/src/main/kotlin/com/wire/android/di/metro/ImageAssetViewModelGraphBridgeViewModel.kt rename to app/src/main/kotlin/com/wire/android/di/metro/AppImageAssetViewModelGraph.kt index 4fef17fa032..05b84705aed 100644 --- a/app/src/main/kotlin/com/wire/android/di/metro/ImageAssetViewModelGraphBridgeViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/di/metro/AppImageAssetViewModelGraph.kt @@ -17,7 +17,6 @@ */ package com.wire.android.di.metro -import androidx.lifecycle.ViewModel import com.wire.android.model.ImageAssetViewModelFactory import com.wire.android.model.ImageAssetViewModelGraph import com.wire.android.ui.calling.CallingViewModelFactory @@ -27,29 +26,23 @@ import com.wire.android.ui.common.CommonViewModelGraph import com.wire.android.ui.home.settings.SettingsViewModelFactory import com.wire.android.ui.home.settings.SettingsViewModelGraph import com.wire.android.util.ui.WireSessionImageLoader -import dagger.hilt.android.lifecycle.HiltViewModel -import javax.inject.Inject -import javax.inject.Provider +import dev.zacsweers.metro.Inject -/** - * Android-only bridge that exposes the image asset graph while ui-common is being decoupled from Hilt. - */ -@HiltViewModel -class ImageAssetViewModelGraphBridgeViewModel @Inject constructor( - imageLoader: Provider, - private val callingViewModelFactoryProvider: Provider, - private val settingsViewModelFactoryProvider: Provider, - private val commonViewModelFactoryProvider: Provider, -) : ViewModel(), ImageAssetViewModelGraph, CallingViewModelGraph, SettingsViewModelGraph, CommonViewModelGraph { +class AppImageAssetViewModelGraph @Inject constructor( + imageLoader: () -> WireSessionImageLoader, + private val callingViewModelFactoryProvider: () -> CallingViewModelFactory, + private val settingsViewModelFactoryProvider: () -> SettingsViewModelFactory, + private val commonViewModelFactoryProvider: () -> CommonViewModelFactory, +) : ImageAssetViewModelGraph, CallingViewModelGraph, SettingsViewModelGraph, CommonViewModelGraph { override val imageAssetViewModelFactory: ImageAssetViewModelFactory = - ImageAssetViewModelFactory(imageLoader = imageLoader::get) + ImageAssetViewModelFactory(imageLoader = imageLoader) override val callingViewModelFactory: CallingViewModelFactory - get() = callingViewModelFactoryProvider.get() + get() = callingViewModelFactoryProvider() override val settingsViewModelFactory: SettingsViewModelFactory - get() = settingsViewModelFactoryProvider.get() + get() = settingsViewModelFactoryProvider() override val commonViewModelFactory: CommonViewModelFactory - get() = commonViewModelFactoryProvider.get() + get() = commonViewModelFactoryProvider() } diff --git a/app/src/main/kotlin/com/wire/android/di/metro/WireActivityViewModelGraphBridge.kt b/app/src/main/kotlin/com/wire/android/di/metro/AppSessionViewModelGraph.kt similarity index 65% rename from app/src/main/kotlin/com/wire/android/di/metro/WireActivityViewModelGraphBridge.kt rename to app/src/main/kotlin/com/wire/android/di/metro/AppSessionViewModelGraph.kt index aaf1ceaab65..691a12cdeed 100644 --- a/app/src/main/kotlin/com/wire/android/di/metro/WireActivityViewModelGraphBridge.kt +++ b/app/src/main/kotlin/com/wire/android/di/metro/AppSessionViewModelGraph.kt @@ -17,7 +17,6 @@ */ package com.wire.android.di.metro -import androidx.lifecycle.ViewModel import com.wire.android.di.CurrentAccount import com.wire.android.feature.cells.ui.CellsViewModelFactory import com.wire.android.feature.cells.ui.CellsViewModelGraph @@ -49,33 +48,26 @@ import com.wire.android.ui.home.settings.SettingsViewModelFactory import com.wire.android.ui.home.settings.SettingsViewModelGraph import com.wire.android.util.ui.WireSessionImageLoader import com.wire.kalium.logic.data.user.UserId -import dagger.hilt.android.lifecycle.HiltViewModel -import javax.inject.Inject -import javax.inject.Provider +import dev.zacsweers.metro.Inject -/** - * Android-only bridge for feature ViewModel factories while feature UI is being decoupled from Hilt call sites. - */ @Suppress("LongParameterList") -@HiltViewModel -class WireActivityViewModelGraphBridge @Inject constructor( +class AppSessionViewModelGraph @Inject constructor( @CurrentAccount currentAccount: UserId, - imageLoader: Provider, - private val cellsViewModelFactoryProvider: Provider, - private val miscViewModelFactoryProvider: Provider, - private val authenticationViewModelFactoryProvider: Provider, - private val callingViewModelFactoryProvider: Provider, - private val debugInfoViewModelFactoryProvider: Provider, - private val homeViewModelFactoryProvider: Provider, - private val settingsViewModelFactoryProvider: Provider, - private val conversationCoreViewModelFactoryProvider: Provider, - private val conversationDetailsViewModelFactoryProvider: Provider, - private val conversationSearchFolderViewModelFactoryProvider: Provider, - private val meetingsViewModelFactoryProvider: Provider, - private val scopedMessageViewModelFactoryProvider: Provider, - private val commonViewModelFactoryProvider: Provider, -) : ViewModel(), - ImageAssetViewModelGraph, + imageLoader: () -> WireSessionImageLoader, + private val cellsViewModelFactoryProvider: () -> CellsViewModelFactory, + private val miscViewModelFactoryProvider: () -> MiscViewModelFactory, + private val authenticationViewModelFactoryProvider: () -> AuthenticationViewModelFactory, + private val callingViewModelFactoryProvider: () -> CallingViewModelFactory, + private val debugInfoViewModelFactoryProvider: () -> DebugInfoViewModelFactory, + private val homeViewModelFactoryProvider: () -> HomeViewModelFactory, + private val settingsViewModelFactoryProvider: () -> SettingsViewModelFactory, + private val conversationCoreViewModelFactoryProvider: () -> ConversationCoreViewModelFactory, + private val conversationDetailsViewModelFactoryProvider: () -> ConversationDetailsViewModelFactory, + private val conversationSearchFolderViewModelFactoryProvider: () -> ConversationSearchFolderViewModelFactory, + private val meetingsViewModelFactoryProvider: () -> MeetingsViewModelFactory, + private val scopedMessageViewModelFactoryProvider: () -> ScopedMessageViewModelFactory, + private val commonViewModelFactoryProvider: () -> CommonViewModelFactory, +) : ImageAssetViewModelGraph, CellsViewModelGraph, MiscViewModelGraph, AuthenticationViewModelGraph, @@ -92,44 +84,44 @@ class WireActivityViewModelGraphBridge @Inject constructor( override val viewModelScopeKey: String = currentAccount.toString() override val imageAssetViewModelFactory: ImageAssetViewModelFactory = - ImageAssetViewModelFactory(imageLoader = imageLoader::get) + ImageAssetViewModelFactory(imageLoader = imageLoader) override val cellsViewModelFactory: CellsViewModelFactory - get() = cellsViewModelFactoryProvider.get() + get() = cellsViewModelFactoryProvider() override val miscViewModelFactory: MiscViewModelFactory - get() = miscViewModelFactoryProvider.get() + get() = miscViewModelFactoryProvider() override val authenticationViewModelFactory: AuthenticationViewModelFactory - get() = authenticationViewModelFactoryProvider.get() + get() = authenticationViewModelFactoryProvider() override val callingViewModelFactory: CallingViewModelFactory - get() = callingViewModelFactoryProvider.get() + get() = callingViewModelFactoryProvider() override val debugInfoViewModelFactory: DebugInfoViewModelFactory - get() = debugInfoViewModelFactoryProvider.get() + get() = debugInfoViewModelFactoryProvider() override val homeViewModelFactory: HomeViewModelFactory - get() = homeViewModelFactoryProvider.get() + get() = homeViewModelFactoryProvider() override val settingsViewModelFactory: SettingsViewModelFactory - get() = settingsViewModelFactoryProvider.get() + get() = settingsViewModelFactoryProvider() override val conversationCoreViewModelFactory: ConversationCoreViewModelFactory - get() = conversationCoreViewModelFactoryProvider.get() + get() = conversationCoreViewModelFactoryProvider() override val conversationDetailsViewModelFactory: ConversationDetailsViewModelFactory - get() = conversationDetailsViewModelFactoryProvider.get() + get() = conversationDetailsViewModelFactoryProvider() override val conversationSearchFolderViewModelFactory: ConversationSearchFolderViewModelFactory - get() = conversationSearchFolderViewModelFactoryProvider.get() + get() = conversationSearchFolderViewModelFactoryProvider() override val meetingsViewModelFactory: MeetingsViewModelFactory - get() = meetingsViewModelFactoryProvider.get() + get() = meetingsViewModelFactoryProvider() override val scopedMessageViewModelFactory: ScopedMessageViewModelFactory - get() = scopedMessageViewModelFactoryProvider.get() + get() = scopedMessageViewModelFactoryProvider() override val commonViewModelFactory: CommonViewModelFactory - get() = commonViewModelFactoryProvider.get() + get() = commonViewModelFactoryProvider() } diff --git a/app/src/main/kotlin/com/wire/android/di/metro/WireApplicationGraph.kt b/app/src/main/kotlin/com/wire/android/di/metro/WireApplicationGraph.kt new file mode 100644 index 00000000000..f4dfaf6522a --- /dev/null +++ b/app/src/main/kotlin/com/wire/android/di/metro/WireApplicationGraph.kt @@ -0,0 +1,139 @@ +/* + * Wire + * Copyright (C) 2026 Wire Swiss GmbH + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see http://www.gnu.org/licenses/. + */ +package com.wire.android.di.metro + +import android.content.Context +import com.wire.android.WireApplication +import com.wire.android.di.KaliumCoreLogic +import com.wire.android.di.AppModule +import com.wire.android.di.CoreLogicModule +import com.wire.android.di.CoroutinesDispatchersModule +import com.wire.android.di.CoroutinesScopesModule +import com.wire.android.di.ImageLoadingModule +import com.wire.android.di.KaliumConfigsModule +import com.wire.android.di.LogWriterModule +import com.wire.android.di.ManagedConfigurationsModule +import com.wire.android.di.SessionModule +import com.wire.android.di.UseCaseModule +import com.wire.android.di.accountScoped.AppsModule +import com.wire.android.di.accountScoped.AuthenticationModule +import com.wire.android.di.accountScoped.BackupModule +import com.wire.android.di.accountScoped.CallsModule +import com.wire.android.di.accountScoped.CellsModule +import com.wire.android.di.accountScoped.ChannelsModule +import com.wire.android.di.accountScoped.ClientModule +import com.wire.android.di.accountScoped.ConnectionModule +import com.wire.android.di.accountScoped.ConversationModule +import com.wire.android.di.accountScoped.DebugModule +import com.wire.android.di.accountScoped.MessageModule +import com.wire.android.di.accountScoped.SearchModule +import com.wire.android.di.accountScoped.ServicesModule +import com.wire.android.di.accountScoped.TeamModule +import com.wire.android.di.accountScoped.UserModule +import com.wire.android.notification.broadcastreceivers.EndOngoingCallReceiver +import com.wire.android.notification.broadcastreceivers.IncomingCallActionReceiver +import com.wire.android.notification.broadcastreceivers.NomadLogoutReceiver +import com.wire.android.notification.broadcastreceivers.NotificationReplyReceiver +import com.wire.android.notification.broadcastreceivers.PlayPauseAudioMessageReceiver +import com.wire.android.notification.broadcastreceivers.StopAudioMessageReceiver +import com.wire.android.services.CallService +import com.wire.android.services.PersistentWebSocketService +import com.wire.android.services.PlayingAudioMessageService +import com.wire.android.ui.AppLockActivity +import com.wire.android.ui.WireActivity +import com.wire.android.ui.WireActivityViewModel +import com.wire.android.ui.debug.StartServiceReceiver +import com.wire.android.ui.calling.CallActivity +import com.wire.android.util.NetworkUtil +import com.wire.android.util.dispatchers.DispatcherProvider +import com.wire.android.workmanager.WireWorkerFactory +import com.wire.kalium.logic.CoreLogic +import dev.zacsweers.metro.AppScope +import dev.zacsweers.metro.DependencyGraph +import dev.zacsweers.metro.Provides +import dev.zacsweers.metro.createGraphFactory + +@DependencyGraph( + scope = AppScope::class, + bindingContainers = [ + AppModule::class, + CoreLogicModule::class, + SessionModule::class, + UseCaseModule::class, + ManagedConfigurationsModule::class, + KaliumConfigsModule::class, + LogWriterModule::class, + CoroutinesScopesModule::class, + CoroutinesDispatchersModule::class, + ImageLoadingModule::class, + AppsModule::class, + AuthenticationModule::class, + BackupModule::class, + CallsModule::class, + CellsModule::class, + ChannelsModule::class, + ClientModule::class, + ConnectionModule::class, + ConversationModule::class, + DebugModule::class, + MessageModule::class, + SearchModule::class, + ServicesModule::class, + TeamModule::class, + UserModule::class, + ] +) +@Suppress("TooManyFunctions") +interface WireApplicationGraph { + val wireWorkerFactory: WireWorkerFactory + val wireActivityViewModel: WireActivityViewModel + val authenticationViewModelGraph: AppAuthenticationViewModelGraph + val imageAssetViewModelGraph: AppImageAssetViewModelGraph + val sessionViewModelGraph: AppSessionViewModelGraph + + @get:KaliumCoreLogic + val coreLogic: CoreLogic + val networkUtil: NetworkUtil + val dispatcherProvider: DispatcherProvider + + fun inject(application: WireApplication) + fun inject(activity: WireActivity) + fun inject(activity: AppLockActivity) + fun inject(activity: CallActivity) + fun inject(service: PersistentWebSocketService) + fun inject(service: CallService) + fun inject(service: PlayingAudioMessageService) + fun inject(receiver: StartServiceReceiver) + fun inject(receiver: IncomingCallActionReceiver) + fun inject(receiver: NomadLogoutReceiver) + fun inject(receiver: EndOngoingCallReceiver) + fun inject(receiver: StopAudioMessageReceiver) + fun inject(receiver: NotificationReplyReceiver) + fun inject(receiver: PlayPauseAudioMessageReceiver) + + @DependencyGraph.Factory + interface Factory { + fun create(@Provides @com.wire.android.di.ApplicationContext context: Context): WireApplicationGraph + } +} + +fun createWireApplicationGraph(context: Context): WireApplicationGraph = + createGraphFactory().create(context.applicationContext) + +val Context.wireApplicationGraph: WireApplicationGraph + get() = (applicationContext as WireApplication).appGraph diff --git a/app/src/main/kotlin/com/wire/android/emm/ManagedConfigurationsReceiver.kt b/app/src/main/kotlin/com/wire/android/emm/ManagedConfigurationsReceiver.kt index 3ba18946254..33121093710 100644 --- a/app/src/main/kotlin/com/wire/android/emm/ManagedConfigurationsReceiver.kt +++ b/app/src/main/kotlin/com/wire/android/emm/ManagedConfigurationsReceiver.kt @@ -26,14 +26,14 @@ import com.wire.android.feature.StartPersistentWebsocketIfNecessaryUseCase import com.wire.android.util.EMPTY import com.wire.android.util.dispatchers.DispatcherProvider import com.wire.kalium.logic.CoreLogic -import dagger.Lazy import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.launch -import javax.inject.Inject -import javax.inject.Singleton +import dev.zacsweers.metro.Inject +import dev.zacsweers.metro.AppScope +import dev.zacsweers.metro.SingleIn -@Singleton +@SingleIn(AppScope::class) class ManagedConfigurationsReceiver @Inject constructor( private val managedConfigurationsManager: ManagedConfigurationsManager, private val managedConfigurationsReporter: ManagedConfigurationsReporter, @@ -116,7 +116,7 @@ class ManagedConfigurationsReceiver @Inject constructor( // Only bulk update when MDM enforcement turns ON if (!wasEnforced && isEnforced) { - coreLogic.get().getGlobalScope().setAllPersistentWebSocketEnabled(true) + coreLogic.value.getGlobalScope().setAllPersistentWebSocketEnabled(true) } // Trigger service start/stop based on current state diff --git a/app/src/main/kotlin/com/wire/android/emm/ManagedConfigurationsReporter.kt b/app/src/main/kotlin/com/wire/android/emm/ManagedConfigurationsReporter.kt index 1e117e52295..b6e21772c9b 100644 --- a/app/src/main/kotlin/com/wire/android/emm/ManagedConfigurationsReporter.kt +++ b/app/src/main/kotlin/com/wire/android/emm/ManagedConfigurationsReporter.kt @@ -20,11 +20,12 @@ package com.wire.android.emm import android.content.Context import androidx.enterprise.feedback.KeyedAppState import androidx.enterprise.feedback.KeyedAppStatesReporter -import dagger.hilt.android.qualifiers.ApplicationContext -import javax.inject.Inject -import javax.inject.Singleton +import com.wire.android.di.ApplicationContext +import dev.zacsweers.metro.Inject +import dev.zacsweers.metro.AppScope +import dev.zacsweers.metro.SingleIn -@Singleton +@SingleIn(AppScope::class) class ManagedConfigurationsReporter @Inject constructor( @ApplicationContext context: Context ) { diff --git a/app/src/main/kotlin/com/wire/android/feature/AccountSwitchUseCase.kt b/app/src/main/kotlin/com/wire/android/feature/AccountSwitchUseCase.kt index 86f7342076f..985a906dd3f 100644 --- a/app/src/main/kotlin/com/wire/android/feature/AccountSwitchUseCase.kt +++ b/app/src/main/kotlin/com/wire/android/feature/AccountSwitchUseCase.kt @@ -38,13 +38,13 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.async import kotlinx.coroutines.launch import kotlinx.coroutines.withTimeout -import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json -import javax.inject.Inject -import javax.inject.Singleton +import dev.zacsweers.metro.Inject +import dev.zacsweers.metro.AppScope +import dev.zacsweers.metro.SingleIn @Suppress("LongParameterList") -@Singleton +@SingleIn(AppScope::class) class AccountSwitchUseCase @Inject constructor( private val updateCurrentSession: UpdateCurrentSessionUseCase, private val getSessions: GetSessionsUseCase, diff --git a/app/src/main/kotlin/com/wire/android/feature/DisableAppLockUseCase.kt b/app/src/main/kotlin/com/wire/android/feature/DisableAppLockUseCase.kt index 8f19a13a68a..de32fe54dfe 100644 --- a/app/src/main/kotlin/com/wire/android/feature/DisableAppLockUseCase.kt +++ b/app/src/main/kotlin/com/wire/android/feature/DisableAppLockUseCase.kt @@ -19,11 +19,8 @@ package com.wire.android.feature import com.wire.android.datastore.GlobalDataStore import com.wire.kalium.logic.feature.featureConfig.ObserveIsAppLockEditableUseCase -import dagger.hilt.android.scopes.ViewModelScoped import kotlinx.coroutines.flow.firstOrNull -import javax.inject.Inject - -@ViewModelScoped +import dev.zacsweers.metro.Inject class DisableAppLockUseCase @Inject constructor( private val dataStore: GlobalDataStore, private val observeIsAppLockEditableUseCase: ObserveIsAppLockEditableUseCase diff --git a/app/src/main/kotlin/com/wire/android/feature/ObserveAppLockConfigUseCase.kt b/app/src/main/kotlin/com/wire/android/feature/ObserveAppLockConfigUseCase.kt index 19896940ebb..b7a89a5ede0 100644 --- a/app/src/main/kotlin/com/wire/android/feature/ObserveAppLockConfigUseCase.kt +++ b/app/src/main/kotlin/com/wire/android/feature/ObserveAppLockConfigUseCase.kt @@ -25,12 +25,13 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.channelFlow import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.combineTransform -import javax.inject.Inject -import javax.inject.Singleton +import dev.zacsweers.metro.Inject +import dev.zacsweers.metro.AppScope +import dev.zacsweers.metro.SingleIn import kotlin.time.Duration import kotlin.time.Duration.Companion.seconds -@Singleton +@SingleIn(AppScope::class) class ObserveAppLockConfigUseCase @Inject constructor( private val globalDataStore: GlobalDataStore, @KaliumCoreLogic private val coreLogic: CoreLogic diff --git a/app/src/main/kotlin/com/wire/android/feature/ShouldStartPersistentWebSocketServiceUseCase.kt b/app/src/main/kotlin/com/wire/android/feature/ShouldStartPersistentWebSocketServiceUseCase.kt index 5d6ebdd8ba3..40172281c87 100644 --- a/app/src/main/kotlin/com/wire/android/feature/ShouldStartPersistentWebSocketServiceUseCase.kt +++ b/app/src/main/kotlin/com/wire/android/feature/ShouldStartPersistentWebSocketServiceUseCase.kt @@ -23,10 +23,11 @@ import com.wire.kalium.logic.CoreLogic import com.wire.kalium.logic.feature.user.webSocketStatus.ObservePersistentWebSocketConnectionStatusUseCase import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.withTimeoutOrNull -import javax.inject.Inject -import javax.inject.Singleton +import dev.zacsweers.metro.Inject +import dev.zacsweers.metro.AppScope +import dev.zacsweers.metro.SingleIn -@Singleton +@SingleIn(AppScope::class) class ShouldStartPersistentWebSocketServiceUseCase @Inject constructor( @KaliumCoreLogic private val coreLogic: CoreLogic, private val managedConfigurationsManager: ManagedConfigurationsManager diff --git a/app/src/main/kotlin/com/wire/android/feature/StartPersistentWebsocketIfNecessaryUseCase.kt b/app/src/main/kotlin/com/wire/android/feature/StartPersistentWebsocketIfNecessaryUseCase.kt index c1604192e11..46f886aad1b 100644 --- a/app/src/main/kotlin/com/wire/android/feature/StartPersistentWebsocketIfNecessaryUseCase.kt +++ b/app/src/main/kotlin/com/wire/android/feature/StartPersistentWebsocketIfNecessaryUseCase.kt @@ -21,10 +21,11 @@ package com.wire.android.feature import com.wire.android.appLogger import com.wire.android.services.ServicesManager -import javax.inject.Inject -import javax.inject.Singleton +import dev.zacsweers.metro.Inject +import dev.zacsweers.metro.AppScope +import dev.zacsweers.metro.SingleIn -@Singleton +@SingleIn(AppScope::class) class StartPersistentWebsocketIfNecessaryUseCase @Inject constructor( private val servicesManager: ServicesManager, private val shouldStartPersistentWebSocketService: ShouldStartPersistentWebSocketServiceUseCase diff --git a/app/src/main/kotlin/com/wire/android/initializer/InitializerEntryPoint.kt b/app/src/main/kotlin/com/wire/android/initializer/InitializerEntryPoint.kt index 365ce3eac6b..6042f896bf6 100644 --- a/app/src/main/kotlin/com/wire/android/initializer/InitializerEntryPoint.kt +++ b/app/src/main/kotlin/com/wire/android/initializer/InitializerEntryPoint.kt @@ -18,20 +18,13 @@ package com.wire.android.initializer import android.content.Context -import dagger.hilt.EntryPoint -import dagger.hilt.InstallIn -import dagger.hilt.android.EntryPointAccessors -import dagger.hilt.components.SingletonComponent +import com.wire.android.di.metro.WireApplicationGraph +import com.wire.android.di.metro.wireApplicationGraph -@EntryPoint -@InstallIn(SingletonComponent::class) interface InitializerEntryPoint { companion object { // a helper method to resolve the InitializerEntryPoint from the context - fun resolve(context: Context): InitializerEntryPoint { - val appContext = context.applicationContext ?: throw IllegalStateException() - return EntryPointAccessors.fromApplication(appContext, InitializerEntryPoint::class.java) - } + fun resolve(context: Context): WireApplicationGraph = context.wireApplicationGraph } } diff --git a/app/src/main/kotlin/com/wire/android/mapper/ContactMapper.kt b/app/src/main/kotlin/com/wire/android/mapper/ContactMapper.kt index e76a47b9687..f4034012f62 100644 --- a/app/src/main/kotlin/com/wire/android/mapper/ContactMapper.kt +++ b/app/src/main/kotlin/com/wire/android/mapper/ContactMapper.kt @@ -30,7 +30,7 @@ import com.wire.kalium.logic.data.service.ServiceDetails import com.wire.kalium.logic.data.user.ConnectionState import com.wire.kalium.logic.data.user.OtherUser import com.wire.kalium.logic.data.user.type.isFederated -import javax.inject.Inject +import dev.zacsweers.metro.Inject class ContactMapper @Inject constructor( diff --git a/app/src/main/kotlin/com/wire/android/mapper/MessageContentMapper.kt b/app/src/main/kotlin/com/wire/android/mapper/MessageContentMapper.kt index d592ef0e43d..713d28097f9 100644 --- a/app/src/main/kotlin/com/wire/android/mapper/MessageContentMapper.kt +++ b/app/src/main/kotlin/com/wire/android/mapper/MessageContentMapper.kt @@ -22,7 +22,7 @@ import com.wire.android.ui.home.conversations.findUser import com.wire.android.ui.home.conversations.model.UIMessageContent import com.wire.kalium.logic.data.message.Message import com.wire.kalium.logic.data.user.User -import javax.inject.Inject +import dev.zacsweers.metro.Inject @Suppress("TooManyFunctions") class MessageContentMapper @Inject constructor( diff --git a/app/src/main/kotlin/com/wire/android/mapper/MessageMapper.kt b/app/src/main/kotlin/com/wire/android/mapper/MessageMapper.kt index dc5afd9738d..097a59955db 100644 --- a/app/src/main/kotlin/com/wire/android/mapper/MessageMapper.kt +++ b/app/src/main/kotlin/com/wire/android/mapper/MessageMapper.kt @@ -48,7 +48,7 @@ import com.wire.kalium.logic.data.user.User import com.wire.kalium.logic.data.user.UserAvailabilityStatus import com.wire.kalium.logic.data.user.UserId import com.wire.kalium.logic.data.user.type.UserTypeInfo -import javax.inject.Inject +import dev.zacsweers.metro.Inject class MessageMapper @Inject constructor( private val userTypeMapper: UserTypeMapper, diff --git a/app/src/main/kotlin/com/wire/android/mapper/OtherAccountMapper.kt b/app/src/main/kotlin/com/wire/android/mapper/OtherAccountMapper.kt index 1c4fdf946b9..9fe346515a8 100644 --- a/app/src/main/kotlin/com/wire/android/mapper/OtherAccountMapper.kt +++ b/app/src/main/kotlin/com/wire/android/mapper/OtherAccountMapper.kt @@ -21,7 +21,7 @@ package com.wire.android.mapper import com.wire.android.ui.home.conversations.avatar import com.wire.android.ui.userprofile.self.model.OtherAccount import com.wire.kalium.logic.data.user.SelfUser -import javax.inject.Inject +import dev.zacsweers.metro.Inject class OtherAccountMapper @Inject constructor() { fun toOtherAccount(selfUser: SelfUser): OtherAccount = OtherAccount( diff --git a/app/src/main/kotlin/com/wire/android/mapper/RegularMessageContentMapper.kt b/app/src/main/kotlin/com/wire/android/mapper/RegularMessageContentMapper.kt index 9724ed2d2f3..fcd0ae41797 100644 --- a/app/src/main/kotlin/com/wire/android/mapper/RegularMessageContentMapper.kt +++ b/app/src/main/kotlin/com/wire/android/mapper/RegularMessageContentMapper.kt @@ -48,7 +48,7 @@ import com.wire.kalium.logic.util.fileExtension import com.wire.kalium.logic.util.isGreaterThan import kotlinx.collections.immutable.toPersistentList import kotlinx.collections.immutable.toPersistentMap -import javax.inject.Inject +import dev.zacsweers.metro.Inject @Suppress("TooManyFunctions", "CyclomaticComplexMethod") class RegularMessageMapper @Inject constructor( diff --git a/app/src/main/kotlin/com/wire/android/mapper/SystemMessageContentMapper.kt b/app/src/main/kotlin/com/wire/android/mapper/SystemMessageContentMapper.kt index e942f2d0a03..5c372cfb77b 100644 --- a/app/src/main/kotlin/com/wire/android/mapper/SystemMessageContentMapper.kt +++ b/app/src/main/kotlin/com/wire/android/mapper/SystemMessageContentMapper.kt @@ -40,7 +40,7 @@ import com.wire.kalium.logic.data.user.UserId import com.wire.kalium.util.DateTimeUtil.toIsoDateTimeString import kotlinx.datetime.Instant import java.util.Locale -import javax.inject.Inject +import dev.zacsweers.metro.Inject import kotlin.time.Duration.Companion.milliseconds @Suppress("TooManyFunctions") diff --git a/app/src/main/kotlin/com/wire/android/mapper/UIAssetMapper.kt b/app/src/main/kotlin/com/wire/android/mapper/UIAssetMapper.kt index c49d6664b1b..4dc75df13cb 100644 --- a/app/src/main/kotlin/com/wire/android/mapper/UIAssetMapper.kt +++ b/app/src/main/kotlin/com/wire/android/mapper/UIAssetMapper.kt @@ -21,7 +21,7 @@ import com.wire.android.R import com.wire.android.ui.home.conversations.model.messagetypes.asset.UIAssetMessage import com.wire.android.util.ui.UIText import com.wire.kalium.logic.data.asset.AssetMessage -import javax.inject.Inject +import dev.zacsweers.metro.Inject class UIAssetMapper @Inject constructor() { diff --git a/app/src/main/kotlin/com/wire/android/mapper/UICallParticipantMapper.kt b/app/src/main/kotlin/com/wire/android/mapper/UICallParticipantMapper.kt index 78f0a45cc0a..68b8f2fce8e 100644 --- a/app/src/main/kotlin/com/wire/android/mapper/UICallParticipantMapper.kt +++ b/app/src/main/kotlin/com/wire/android/mapper/UICallParticipantMapper.kt @@ -22,7 +22,7 @@ import com.wire.android.model.ImageAsset import com.wire.android.ui.calling.model.UICallParticipant import com.wire.kalium.logic.data.call.Participant import com.wire.kalium.logic.data.conversation.ClientId -import javax.inject.Inject +import dev.zacsweers.metro.Inject class UICallParticipantMapper @Inject constructor( private val userTypeMapper: UserTypeMapper, diff --git a/app/src/main/kotlin/com/wire/android/mapper/UIParticipantMapper.kt b/app/src/main/kotlin/com/wire/android/mapper/UIParticipantMapper.kt index 5670ad7110d..97df47fd7e2 100644 --- a/app/src/main/kotlin/com/wire/android/mapper/UIParticipantMapper.kt +++ b/app/src/main/kotlin/com/wire/android/mapper/UIParticipantMapper.kt @@ -30,7 +30,7 @@ import com.wire.kalium.logic.data.user.User import com.wire.kalium.logic.data.user.type.UserType import com.wire.kalium.logic.data.user.type.UserTypeInfo import com.wire.kalium.logic.data.user.type.isAppOrBot -import javax.inject.Inject +import dev.zacsweers.metro.Inject class UIParticipantMapper @Inject constructor( private val userTypeMapper: UserTypeMapper, diff --git a/app/src/main/kotlin/com/wire/android/mapper/UserTypeMapper.kt b/app/src/main/kotlin/com/wire/android/mapper/UserTypeMapper.kt index d75a3588560..75c1d7bb2be 100644 --- a/app/src/main/kotlin/com/wire/android/mapper/UserTypeMapper.kt +++ b/app/src/main/kotlin/com/wire/android/mapper/UserTypeMapper.kt @@ -21,7 +21,7 @@ package com.wire.android.mapper import com.wire.android.ui.home.conversationslist.model.Membership import com.wire.kalium.logic.data.user.type.UserType import com.wire.kalium.logic.data.user.type.UserTypeInfo -import javax.inject.Inject +import dev.zacsweers.metro.Inject class UserTypeMapper @Inject constructor() { diff --git a/app/src/main/kotlin/com/wire/android/media/CallRinger.kt b/app/src/main/kotlin/com/wire/android/media/CallRinger.kt index 71fd620ce18..ba453801f2b 100644 --- a/app/src/main/kotlin/com/wire/android/media/CallRinger.kt +++ b/app/src/main/kotlin/com/wire/android/media/CallRinger.kt @@ -28,10 +28,11 @@ import android.os.VibrationEffect import android.os.Vibrator import android.os.VibratorManager import com.wire.android.appLogger -import javax.inject.Inject -import javax.inject.Singleton +import dev.zacsweers.metro.Inject +import dev.zacsweers.metro.AppScope +import dev.zacsweers.metro.SingleIn -@Singleton +@SingleIn(AppScope::class) class CallRinger @Inject constructor(private val context: Context) { private var mediaPlayer: MediaPlayer? = null diff --git a/app/src/main/kotlin/com/wire/android/media/audiomessage/AudioFocusHelper.kt b/app/src/main/kotlin/com/wire/android/media/audiomessage/AudioFocusHelper.kt index ae7fef58222..1dd3a624eb3 100644 --- a/app/src/main/kotlin/com/wire/android/media/audiomessage/AudioFocusHelper.kt +++ b/app/src/main/kotlin/com/wire/android/media/audiomessage/AudioFocusHelper.kt @@ -20,7 +20,7 @@ package com.wire.android.media.audiomessage import android.media.AudioFocusRequest import android.media.AudioManager import android.os.Build -import javax.inject.Inject +import dev.zacsweers.metro.Inject class AudioFocusHelper @Inject constructor(private val audioManager: AudioManager) { diff --git a/app/src/main/kotlin/com/wire/android/media/audiomessage/AudioMessageViewModel.kt b/app/src/main/kotlin/com/wire/android/media/audiomessage/AudioMessageViewModel.kt index 08774c73580..930ad5ad4a6 100644 --- a/app/src/main/kotlin/com/wire/android/media/audiomessage/AudioMessageViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/media/audiomessage/AudioMessageViewModel.kt @@ -37,7 +37,6 @@ import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.mapNotNull import kotlinx.coroutines.launch import kotlinx.serialization.Serializable - @ViewModelScopedPreview interface AudioMessageViewModel { val state: AudioMessageState get() = AudioMessageState() diff --git a/app/src/main/kotlin/com/wire/android/media/audiomessage/ConversationAudioMessagePlayer.kt b/app/src/main/kotlin/com/wire/android/media/audiomessage/ConversationAudioMessagePlayer.kt index b74e10133b7..f1fda724578 100644 --- a/app/src/main/kotlin/com/wire/android/media/audiomessage/ConversationAudioMessagePlayer.kt +++ b/app/src/main/kotlin/com/wire/android/media/audiomessage/ConversationAudioMessagePlayer.kt @@ -35,8 +35,7 @@ import com.wire.kalium.logic.feature.asset.MessageAssetResult import com.wire.kalium.logic.feature.message.GetNextAudioMessageInConversationUseCase import com.wire.kalium.logic.feature.message.GetSenderNameByMessageIdUseCase import com.wire.kalium.logic.feature.session.CurrentSessionResult -import dagger.Lazy -import dagger.hilt.android.qualifiers.ApplicationContext +import com.wire.android.di.ApplicationContext import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Deferred import kotlinx.coroutines.channels.BufferOverflow @@ -58,10 +57,11 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock import kotlinx.coroutines.withContext -import javax.inject.Inject -import javax.inject.Singleton +import dev.zacsweers.metro.Inject +import dev.zacsweers.metro.AppScope +import dev.zacsweers.metro.SingleIn -@Singleton +@SingleIn(AppScope::class) @Suppress("TooManyFunctions") class ConversationAudioMessagePlayer @Inject constructor( @@ -255,7 +255,7 @@ class ConversationAudioMessagePlayer suspend fun forceToStopCurrentAudioMessage() { stopCurrentAudioMessage() - servicesManager.get().stopPlayingAudioMessageService() + servicesManager.value.stopPlayingAudioMessageService() audioFocusHelper.abandon() } @@ -311,7 +311,7 @@ class ConversationAudioMessagePlayer ) ) - servicesManager.get().startPlayingAudioMessageService() + servicesManager.value.startPlayingAudioMessageService() audioMessageStateUpdate.emit( AudioMediaPlayerStateUpdate.TotalTimeUpdate(conversationId, messageId, audioMediaPlayer.duration) @@ -432,7 +432,7 @@ class ConversationAudioMessagePlayer audioMessageStateUpdate.emit( AudioMediaPlayerStateUpdate.AudioMediaPlayingStateUpdate(conversationId, messageId, AudioMediaPlayingState.Playing) ) - servicesManager.get().startPlayingAudioMessageService() + servicesManager.value.startPlayingAudioMessageService() } private suspend fun pause(conversationId: ConversationId, messageId: String) { @@ -507,7 +507,7 @@ class ConversationAudioMessagePlayer audioMediaPlayer.reset() currentAudioMessageId = null audioMessageStateHistory = emptyMap() - servicesManager.get().stopPlayingAudioMessageService() + servicesManager.value.stopPlayingAudioMessageService() } data class MessageIdWrapper(val conversationId: ConversationId, val messageId: String) diff --git a/app/src/main/kotlin/com/wire/android/media/audiomessage/RecordAudioMessagePlayer.kt b/app/src/main/kotlin/com/wire/android/media/audiomessage/RecordAudioMessagePlayer.kt index 0d924538e5a..ea381e59ff4 100644 --- a/app/src/main/kotlin/com/wire/android/media/audiomessage/RecordAudioMessagePlayer.kt +++ b/app/src/main/kotlin/com/wire/android/media/audiomessage/RecordAudioMessagePlayer.kt @@ -21,7 +21,6 @@ import android.content.Context import android.media.MediaPlayer import androidx.core.net.toUri import com.wire.android.di.ApplicationScope -import dagger.hilt.android.scopes.ViewModelScoped import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.channels.BufferOverflow import kotlinx.coroutines.delay @@ -34,9 +33,7 @@ import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.merge import kotlinx.coroutines.launch import java.io.File -import javax.inject.Inject - -@ViewModelScoped +import dev.zacsweers.metro.Inject class RecordAudioMessagePlayer @Inject constructor( private val context: Context, private val audioMediaPlayer: MediaPlayer, diff --git a/app/src/main/kotlin/com/wire/android/navigation/LoginTypeSelector.kt b/app/src/main/kotlin/com/wire/android/navigation/LoginTypeSelector.kt index b15a9b2b6a3..f89d53ca6ef 100644 --- a/app/src/main/kotlin/com/wire/android/navigation/LoginTypeSelector.kt +++ b/app/src/main/kotlin/com/wire/android/navigation/LoginTypeSelector.kt @@ -22,17 +22,17 @@ import com.wire.android.di.KaliumCoreLogic import com.wire.kalium.logic.CoreLogic import com.wire.kalium.logic.configuration.server.ServerConfig import com.wire.kalium.logic.feature.auth.LoginContext -import dagger.Lazy import kotlinx.coroutines.flow.first -import javax.inject.Inject -import javax.inject.Named -import javax.inject.Singleton +import dev.zacsweers.metro.Inject +import dev.zacsweers.metro.Named +import dev.zacsweers.metro.AppScope +import dev.zacsweers.metro.SingleIn /** * Selector for login type, used to determine if the new login flow should be used. If the [LoginContext] for the given * [ServerConfig.Links] is [LoginContext.EnterpriseLogin] then the new login flow can be used, otherwise fallback to the old login flow. */ -@Singleton +@SingleIn(AppScope::class) class LoginTypeSelector @Inject constructor( @KaliumCoreLogic private val coreLogic: Lazy, @Named("useNewLoginForDefaultBackend") private val useNewLoginForDefaultBackend: Boolean, @@ -42,7 +42,7 @@ class LoginTypeSelector @Inject constructor( * Observe the [LoginContext] for the given [ServerConfig.Links]. */ private suspend fun loginContextFlow(serverLinks: ServerConfig.Links) = - coreLogic.get().getGlobalScope().observeLoginContext(serverLinks) + coreLogic.value.getGlobalScope().observeLoginContext(serverLinks) /** * Determine if the new login flow can be used for the given [ServerConfig.Links]. diff --git a/app/src/main/kotlin/com/wire/android/notification/CallNotificationManager.kt b/app/src/main/kotlin/com/wire/android/notification/CallNotificationManager.kt index f3107d26db5..453db7dead6 100644 --- a/app/src/main/kotlin/com/wire/android/notification/CallNotificationManager.kt +++ b/app/src/main/kotlin/com/wire/android/notification/CallNotificationManager.kt @@ -56,10 +56,11 @@ import kotlinx.coroutines.flow.scan import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import org.jetbrains.annotations.VisibleForTesting -import javax.inject.Inject -import javax.inject.Singleton +import dev.zacsweers.metro.Inject +import dev.zacsweers.metro.AppScope +import dev.zacsweers.metro.SingleIn -@Singleton +@SingleIn(AppScope::class) @Suppress("TooManyFunctions") class CallNotificationManager @Inject constructor( context: Context, @@ -208,7 +209,7 @@ class CallNotificationManager @Inject constructor( } } -@Singleton +@SingleIn(AppScope::class) class CallNotificationBuilder @Inject constructor( private val context: Context, ) { diff --git a/app/src/main/kotlin/com/wire/android/notification/MessageNotificationManager.kt b/app/src/main/kotlin/com/wire/android/notification/MessageNotificationManager.kt index 24f8e64021a..f2bf4b1147e 100644 --- a/app/src/main/kotlin/com/wire/android/notification/MessageNotificationManager.kt +++ b/app/src/main/kotlin/com/wire/android/notification/MessageNotificationManager.kt @@ -41,11 +41,12 @@ import com.wire.kalium.logic.data.id.QualifiedID import com.wire.kalium.logic.data.notification.LocalNotification import com.wire.kalium.logic.data.notification.LocalNotificationUpdateMessageAction import kotlinx.coroutines.delay -import javax.inject.Inject -import javax.inject.Singleton +import dev.zacsweers.metro.Inject +import dev.zacsweers.metro.AppScope +import dev.zacsweers.metro.SingleIn @Suppress("TooManyFunctions") -@Singleton +@SingleIn(AppScope::class) class MessageNotificationManager @Inject constructor( private val context: Context, diff --git a/app/src/main/kotlin/com/wire/android/notification/WireNotificationManager.kt b/app/src/main/kotlin/com/wire/android/notification/WireNotificationManager.kt index 55651979b54..e75aa6010d6 100644 --- a/app/src/main/kotlin/com/wire/android/notification/WireNotificationManager.kt +++ b/app/src/main/kotlin/com/wire/android/notification/WireNotificationManager.kt @@ -68,14 +68,15 @@ import kotlinx.datetime.Instant import java.net.UnknownHostException import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.atomic.AtomicReference -import javax.inject.Inject -import javax.inject.Singleton +import dev.zacsweers.metro.Inject +import dev.zacsweers.metro.AppScope +import dev.zacsweers.metro.SingleIn import kotlin.time.Duration import kotlin.time.Duration.Companion.seconds @OptIn(ExperimentalCoroutinesApi::class) @Suppress("TooManyFunctions", "LongParameterList") -@Singleton +@SingleIn(AppScope::class) class WireNotificationManager @Inject constructor( @KaliumCoreLogic private val coreLogic: CoreLogic, private val currentScreenManager: CurrentScreenManager, diff --git a/app/src/main/kotlin/com/wire/android/notification/broadcastreceivers/DynamicReceiversManager.kt b/app/src/main/kotlin/com/wire/android/notification/broadcastreceivers/DynamicReceiversManager.kt index 455d3466d41..7c162f518ae 100644 --- a/app/src/main/kotlin/com/wire/android/notification/broadcastreceivers/DynamicReceiversManager.kt +++ b/app/src/main/kotlin/com/wire/android/notification/broadcastreceivers/DynamicReceiversManager.kt @@ -23,15 +23,16 @@ import android.content.IntentFilter import com.wire.android.BuildConfig.EMM_SUPPORT_ENABLED import com.wire.android.appLogger import com.wire.android.emm.ManagedConfigurationsReceiver -import dagger.hilt.android.qualifiers.ApplicationContext -import javax.inject.Inject -import javax.inject.Singleton +import com.wire.android.di.ApplicationContext +import dev.zacsweers.metro.Inject +import dev.zacsweers.metro.AppScope +import dev.zacsweers.metro.SingleIn /** * Manages dynamic registration and unregistration of broadcast receivers. * This are receivers that are active while the app is in foreground only. */ -@Singleton +@SingleIn(AppScope::class) class DynamicReceiversManager @Inject constructor( @ApplicationContext val context: Context, private val managedConfigurationsReceiver: ManagedConfigurationsReceiver diff --git a/app/src/main/kotlin/com/wire/android/notification/broadcastreceivers/EndOngoingCallReceiver.kt b/app/src/main/kotlin/com/wire/android/notification/broadcastreceivers/EndOngoingCallReceiver.kt index fda113e96ad..ccb62c57d77 100644 --- a/app/src/main/kotlin/com/wire/android/notification/broadcastreceivers/EndOngoingCallReceiver.kt +++ b/app/src/main/kotlin/com/wire/android/notification/broadcastreceivers/EndOngoingCallReceiver.kt @@ -25,18 +25,17 @@ import com.wire.android.appLogger import com.wire.android.di.ApplicationScope import com.wire.android.di.KaliumCoreLogic import com.wire.android.di.NoSession +import com.wire.android.di.metro.wireApplicationGraph import com.wire.android.util.dispatchers.DispatcherProvider import com.wire.kalium.logic.CoreLogic import com.wire.kalium.logic.data.id.QualifiedID import com.wire.kalium.logic.data.id.QualifiedIdMapper import com.wire.kalium.logic.data.id.toQualifiedID import com.wire.kalium.logic.feature.session.CurrentSessionResult -import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch -import javax.inject.Inject +import dev.zacsweers.metro.Inject -@AndroidEntryPoint class EndOngoingCallReceiver : BroadcastReceiver() { @Inject @@ -55,6 +54,7 @@ class EndOngoingCallReceiver : BroadcastReceiver() { lateinit var coroutineScope: CoroutineScope override fun onReceive(context: Context, intent: Intent) { + context.wireApplicationGraph.inject(this) val conversationId: String = intent.getStringExtra(EXTRA_CONVERSATION_ID) ?: return appLogger.i("EndOngoingCallReceiver: onReceive, conversationId: $conversationId") diff --git a/app/src/main/kotlin/com/wire/android/notification/broadcastreceivers/IncomingCallActionReceiver.kt b/app/src/main/kotlin/com/wire/android/notification/broadcastreceivers/IncomingCallActionReceiver.kt index 64c4f312b85..6e815fc60b5 100644 --- a/app/src/main/kotlin/com/wire/android/notification/broadcastreceivers/IncomingCallActionReceiver.kt +++ b/app/src/main/kotlin/com/wire/android/notification/broadcastreceivers/IncomingCallActionReceiver.kt @@ -25,6 +25,7 @@ import com.wire.android.appLogger import com.wire.android.di.ApplicationScope import com.wire.android.di.KaliumCoreLogic import com.wire.android.di.NoSession +import com.wire.android.di.metro.wireApplicationGraph import com.wire.android.notification.CallNotificationManager import com.wire.android.util.dispatchers.DispatcherProvider import com.wire.kalium.logger.obfuscateId @@ -32,13 +33,11 @@ import com.wire.kalium.logic.CoreLogic import com.wire.kalium.logic.data.id.QualifiedIdMapper import com.wire.kalium.logic.data.id.toQualifiedID import com.wire.kalium.logic.data.user.UserId -import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch -import javax.inject.Inject +import dev.zacsweers.metro.Inject -@AndroidEntryPoint class IncomingCallActionReceiver : BroadcastReceiver() { @Inject @@ -61,6 +60,7 @@ class IncomingCallActionReceiver : BroadcastReceiver() { @Suppress("ReturnCount") override fun onReceive(context: Context, intent: Intent) { + context.wireApplicationGraph.inject(this) val conversationIdString: String = intent.getStringExtra(EXTRA_CONVERSATION_ID) ?: run { appLogger.e("CallNotificationDismissReceiver: onReceive, conversation ID is missing") return diff --git a/app/src/main/kotlin/com/wire/android/notification/broadcastreceivers/NomadLogoutReceiver.kt b/app/src/main/kotlin/com/wire/android/notification/broadcastreceivers/NomadLogoutReceiver.kt index 766156851dc..c10ce07a0b1 100644 --- a/app/src/main/kotlin/com/wire/android/notification/broadcastreceivers/NomadLogoutReceiver.kt +++ b/app/src/main/kotlin/com/wire/android/notification/broadcastreceivers/NomadLogoutReceiver.kt @@ -22,6 +22,7 @@ import android.content.Intent import com.wire.android.appLogger import com.wire.android.config.NomadProfilesFeatureConfig import com.wire.android.di.KaliumCoreLogic +import com.wire.android.di.metro.wireApplicationGraph import com.wire.android.feature.AccountSwitchUseCase import com.wire.android.feature.SwitchAccountParam import com.wire.android.util.SwitchAccountObserver @@ -30,14 +31,12 @@ import com.wire.kalium.logic.CoreLogic import com.wire.kalium.logic.data.logout.LogoutReason import com.wire.kalium.logic.feature.session.CurrentSessionResult import com.wire.kalium.logic.feature.session.CurrentSessionUseCase -import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.CancellationException import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch -import javax.inject.Inject +import dev.zacsweers.metro.Inject -@AndroidEntryPoint class NomadLogoutReceiver : CoroutineReceiver() { @Inject @@ -56,6 +55,11 @@ class NomadLogoutReceiver : CoroutineReceiver() { @Inject lateinit var nomadProfilesFeatureConfig: NomadProfilesFeatureConfig + override fun onReceive(context: Context, intent: Intent?) { + context.wireApplicationGraph.inject(this) + super.onReceive(context, intent) + } + public override suspend fun receive(context: Context, intent: Intent) { when { intent.action != ACTION_LOGOUT -> { diff --git a/app/src/main/kotlin/com/wire/android/notification/broadcastreceivers/NotificationReplyReceiver.kt b/app/src/main/kotlin/com/wire/android/notification/broadcastreceivers/NotificationReplyReceiver.kt index 65d0a8dae26..0ab9ce93856 100644 --- a/app/src/main/kotlin/com/wire/android/notification/broadcastreceivers/NotificationReplyReceiver.kt +++ b/app/src/main/kotlin/com/wire/android/notification/broadcastreceivers/NotificationReplyReceiver.kt @@ -25,6 +25,7 @@ import androidx.core.app.RemoteInput import com.wire.android.R import com.wire.android.di.KaliumCoreLogic import com.wire.android.di.NoSession +import com.wire.android.di.metro.wireApplicationGraph import com.wire.android.notification.MessageNotificationManager import com.wire.android.notification.NotificationConstants import com.wire.android.util.dispatchers.DispatcherProvider @@ -32,11 +33,9 @@ import com.wire.kalium.common.functional.fold import com.wire.kalium.logic.CoreLogic import com.wire.kalium.logic.data.id.QualifiedID import com.wire.kalium.logic.data.id.QualifiedIdMapper -import dagger.hilt.android.AndroidEntryPoint import kotlinx.datetime.Clock -import javax.inject.Inject +import dev.zacsweers.metro.Inject -@AndroidEntryPoint class NotificationReplyReceiver : CoroutineReceiver() { // requires zero argument constructor @Inject @@ -50,6 +49,11 @@ class NotificationReplyReceiver : CoroutineReceiver() { // requires zero argumen @NoSession lateinit var qualifiedIdMapper: QualifiedIdMapper + override fun onReceive(context: Context, intent: Intent?) { + context.wireApplicationGraph.inject(this) + super.onReceive(context, intent) + } + override suspend fun receive(context: Context, intent: Intent) { val remoteInput = RemoteInput.getResultsFromIntent(intent) val conversationId: String? = intent.getStringExtra(EXTRA_CONVERSATION_ID) diff --git a/app/src/main/kotlin/com/wire/android/notification/broadcastreceivers/PlayPauseAudioMessageReceiver.kt b/app/src/main/kotlin/com/wire/android/notification/broadcastreceivers/PlayPauseAudioMessageReceiver.kt index 9cb6998f403..bf2bf19061f 100644 --- a/app/src/main/kotlin/com/wire/android/notification/broadcastreceivers/PlayPauseAudioMessageReceiver.kt +++ b/app/src/main/kotlin/com/wire/android/notification/broadcastreceivers/PlayPauseAudioMessageReceiver.kt @@ -23,13 +23,12 @@ import android.content.Context import android.content.Intent import com.wire.android.appLogger import com.wire.android.di.ApplicationScope +import com.wire.android.di.metro.wireApplicationGraph import com.wire.android.media.audiomessage.ConversationAudioMessagePlayer -import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch -import javax.inject.Inject +import dev.zacsweers.metro.Inject -@AndroidEntryPoint class PlayPauseAudioMessageReceiver : BroadcastReceiver() { @Inject @@ -40,6 +39,7 @@ class PlayPauseAudioMessageReceiver : BroadcastReceiver() { lateinit var coroutineScope: CoroutineScope override fun onReceive(context: Context, intent: Intent) { + context.wireApplicationGraph.inject(this) appLogger.i("PlayPauseAudioMessageReceiver: onReceive") coroutineScope.launch { diff --git a/app/src/main/kotlin/com/wire/android/notification/broadcastreceivers/StopAudioMessageReceiver.kt b/app/src/main/kotlin/com/wire/android/notification/broadcastreceivers/StopAudioMessageReceiver.kt index 8ffe59f64ea..3b5acf04cd8 100644 --- a/app/src/main/kotlin/com/wire/android/notification/broadcastreceivers/StopAudioMessageReceiver.kt +++ b/app/src/main/kotlin/com/wire/android/notification/broadcastreceivers/StopAudioMessageReceiver.kt @@ -23,13 +23,12 @@ import android.content.Context import android.content.Intent import com.wire.android.appLogger import com.wire.android.di.ApplicationScope +import com.wire.android.di.metro.wireApplicationGraph import com.wire.android.media.audiomessage.ConversationAudioMessagePlayer -import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch -import javax.inject.Inject +import dev.zacsweers.metro.Inject -@AndroidEntryPoint class StopAudioMessageReceiver : BroadcastReceiver() { @Inject @@ -40,6 +39,7 @@ class StopAudioMessageReceiver : BroadcastReceiver() { lateinit var coroutineScope: CoroutineScope override fun onReceive(context: Context, intent: Intent) { + context.wireApplicationGraph.inject(this) appLogger.i("StopAudioMessageReceiver: onReceive") coroutineScope.launch { audioMessagePlayer.forceToStopCurrentAudioMessage() diff --git a/app/src/main/kotlin/com/wire/android/services/CallService.kt b/app/src/main/kotlin/com/wire/android/services/CallService.kt index 95742811731..0830ee5a925 100644 --- a/app/src/main/kotlin/com/wire/android/services/CallService.kt +++ b/app/src/main/kotlin/com/wire/android/services/CallService.kt @@ -33,6 +33,7 @@ import com.wire.android.notification.CallNotificationData import com.wire.android.notification.CallNotificationManager import com.wire.android.notification.NotificationChannelsManager import com.wire.android.notification.NotificationIds +import com.wire.android.di.metro.wireApplicationGraph import com.wire.android.services.CallService.Action import com.wire.android.util.CurrentScreenManager import com.wire.android.util.dispatchers.DispatcherProvider @@ -40,7 +41,6 @@ import com.wire.kalium.common.functional.fold import com.wire.kalium.logic.data.call.CallStatus import com.wire.kalium.logic.data.id.ConversationId import com.wire.kalium.logic.data.user.UserId -import dagger.hilt.android.AndroidEntryPoint import dev.ahmedmourad.bundlizer.Bundlizer import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.SupervisorJob @@ -50,12 +50,11 @@ import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch import kotlinx.serialization.Serializable -import javax.inject.Inject +import dev.zacsweers.metro.Inject /** * Service that will be started when we have an outgoing/established call. */ -@AndroidEntryPoint class CallService : Service() { @Inject @@ -79,6 +78,7 @@ class CallService : Service() { } override fun onCreate() { + wireApplicationGraph.inject(this) _serviceState.value = ServiceState.STARTED super.onCreate() handleActions() diff --git a/app/src/main/kotlin/com/wire/android/services/CallServiceManager.kt b/app/src/main/kotlin/com/wire/android/services/CallServiceManager.kt index 2fb03813134..9edbdbfe3f6 100644 --- a/app/src/main/kotlin/com/wire/android/services/CallServiceManager.kt +++ b/app/src/main/kotlin/com/wire/android/services/CallServiceManager.kt @@ -44,7 +44,7 @@ import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.receiveAsFlow -import javax.inject.Inject +import dev.zacsweers.metro.Inject class CallServiceManager @Inject constructor(@KaliumCoreLogic val coreLogic: CoreLogic) { private val actions = Channel(capacity = Channel.BUFFERED, onBufferOverflow = BufferOverflow.DROP_OLDEST) diff --git a/app/src/main/kotlin/com/wire/android/services/PersistentWebSocketService.kt b/app/src/main/kotlin/com/wire/android/services/PersistentWebSocketService.kt index 02d055da302..bf0153934a7 100644 --- a/app/src/main/kotlin/com/wire/android/services/PersistentWebSocketService.kt +++ b/app/src/main/kotlin/com/wire/android/services/PersistentWebSocketService.kt @@ -31,6 +31,7 @@ import androidx.core.app.ServiceCompat import com.wire.android.R import com.wire.android.appLogger import com.wire.android.di.KaliumCoreLogic +import com.wire.android.di.metro.wireApplicationGraph import com.wire.android.notification.NotificationChannelsManager import com.wire.android.notification.NotificationConstants.WEB_SOCKET_CHANNEL_ID import com.wire.android.notification.NotificationConstants.WEB_SOCKET_CHANNEL_NAME @@ -41,7 +42,6 @@ import com.wire.android.util.dispatchers.DispatcherProvider import com.wire.kalium.logic.CoreLogic import com.wire.kalium.logic.data.user.UserId import com.wire.kalium.logic.feature.user.webSocketStatus.ObservePersistentWebSocketConnectionStatusUseCase -import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.awaitCancellation @@ -49,9 +49,8 @@ import kotlinx.coroutines.cancel import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch -import javax.inject.Inject +import dev.zacsweers.metro.Inject -@AndroidEntryPoint class PersistentWebSocketService : Service() { @Inject @@ -76,6 +75,7 @@ class PersistentWebSocketService : Service() { } override fun onCreate() { + wireApplicationGraph.inject(this) super.onCreate() isServiceStarted = true generateForegroundNotification() diff --git a/app/src/main/kotlin/com/wire/android/services/PlayingAudioMessageService.kt b/app/src/main/kotlin/com/wire/android/services/PlayingAudioMessageService.kt index 83312d2269e..c7732bdfbee 100644 --- a/app/src/main/kotlin/com/wire/android/services/PlayingAudioMessageService.kt +++ b/app/src/main/kotlin/com/wire/android/services/PlayingAudioMessageService.kt @@ -33,6 +33,7 @@ import androidx.core.app.NotificationCompat import androidx.core.app.ServiceCompat import com.wire.android.R import com.wire.android.appLogger +import com.wire.android.di.metro.wireApplicationGraph import com.wire.android.media.audiomessage.ConversationAudioMessagePlayer import com.wire.android.media.audiomessage.PlayingAudioMessage import com.wire.android.notification.NotificationConstants.PLAYING_AUDIO_CHANNEL_ID @@ -41,16 +42,14 @@ import com.wire.android.notification.openAppPendingIntent import com.wire.android.notification.playPauseAudioPendingIntent import com.wire.android.notification.stopAudioPendingIntent import com.wire.android.util.dispatchers.DispatcherProvider -import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.cancel import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.launch -import javax.inject.Inject +import dev.zacsweers.metro.Inject -@AndroidEntryPoint class PlayingAudioMessageService : Service() { @Inject @@ -68,6 +67,7 @@ class PlayingAudioMessageService : Service() { } override fun onCreate() { + wireApplicationGraph.inject(this) super.onCreate() appLogger.i("$TAG: starting foreground") isServiceStarted = true diff --git a/app/src/main/kotlin/com/wire/android/services/ServicesManager.kt b/app/src/main/kotlin/com/wire/android/services/ServicesManager.kt index 254b959b60a..a99d6b354d5 100644 --- a/app/src/main/kotlin/com/wire/android/services/ServicesManager.kt +++ b/app/src/main/kotlin/com/wire/android/services/ServicesManager.kt @@ -33,15 +33,16 @@ import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.debounce import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.launch -import javax.inject.Inject -import javax.inject.Singleton +import dev.zacsweers.metro.Inject +import dev.zacsweers.metro.AppScope +import dev.zacsweers.metro.SingleIn /** * This is helper class that should be used for starting/stopping any services. * The idea is that we don't want to inject, or provide any context into ViewModel, * but to have an ability start Service from it. */ -@Singleton +@SingleIn(AppScope::class) class ServicesManager @Inject constructor( private val context: Context, dispatcherProvider: DispatcherProvider, diff --git a/app/src/main/kotlin/com/wire/android/ui/AppLockActivity.kt b/app/src/main/kotlin/com/wire/android/ui/AppLockActivity.kt index 8d0218cfc74..1d168e79cdf 100644 --- a/app/src/main/kotlin/com/wire/android/ui/AppLockActivity.kt +++ b/app/src/main/kotlin/com/wire/android/ui/AppLockActivity.kt @@ -24,35 +24,33 @@ import androidx.biometric.BiometricManager import androidx.compose.material3.SnackbarHostState import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.remember -import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import com.ramcosta.composedestinations.generated.app.destinations.AppUnlockWithBiometricsScreenDestination import com.ramcosta.composedestinations.generated.app.destinations.EnterLockCodeScreenDestination import com.ramcosta.composedestinations.generated.app.destinations.SetLockCodeScreenDestination import com.wire.android.appLogger -import com.wire.android.di.metro.ImageAssetViewModelGraphBridgeViewModel import com.wire.android.di.metro.LocalMetroViewModelGraph +import com.wire.android.di.metro.wireApplicationGraph import com.wire.android.navigation.LoginTypeSelector import com.wire.android.navigation.MainNavHost import com.wire.android.navigation.rememberNavigator import com.wire.android.ui.common.setupOrientationForDevice import com.wire.android.ui.common.snackbar.LocalSnackbarHostState import com.wire.android.ui.theme.WireTheme -import dagger.hilt.android.AndroidEntryPoint -import javax.inject.Inject +import dev.zacsweers.metro.Inject -@AndroidEntryPoint class AppLockActivity : BaseActivity() { @Inject lateinit var loginTypeSelector: LoginTypeSelector override fun onCreate(savedInstanceState: Bundle?) { + wireApplicationGraph.inject(this) super.onCreate(savedInstanceState) setupOrientationForDevice() enableEdgeToEdge() setContent { val snackbarHostState = remember { SnackbarHostState() } - val imageAssetViewModelGraph = hiltViewModel() + val imageAssetViewModelGraph = remember { wireApplicationGraph.imageAssetViewModelGraph } CompositionLocalProvider( LocalSnackbarHostState provides snackbarHostState, LocalMetroViewModelGraph provides imageAssetViewModelGraph, diff --git a/app/src/main/kotlin/com/wire/android/ui/CallFeedbackViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/CallFeedbackViewModel.kt index d9053798291..061527a2840 100644 --- a/app/src/main/kotlin/com/wire/android/ui/CallFeedbackViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/CallFeedbackViewModel.kt @@ -31,7 +31,6 @@ import com.wire.kalium.logic.data.user.UserId import com.wire.kalium.logic.feature.session.CurrentSessionFlowUseCase import com.wire.kalium.logic.feature.session.CurrentSessionResult import com.wire.kalium.logic.feature.user.ShouldAskCallFeedbackUseCaseResult -import dagger.Lazy import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.distinctUntilChanged @@ -59,12 +58,12 @@ class CallFeedbackViewModel( } private suspend fun observeAskCallFeedback() { - currentSessionFlow.get().invoke() + currentSessionFlow.value.invoke() .distinctUntilChanged() .flatMapLatest { session -> if (session is CurrentSessionResult.Success && session.accountInfo.isValid()) { currentUserId = session.accountInfo.userId - coreLogic.get().getSessionScope(currentUserId!!).observeSyncState() + coreLogic.value.getSessionScope(currentUserId!!).observeSyncState() } else { currentUserId = null emptyFlow() @@ -72,10 +71,10 @@ class CallFeedbackViewModel( } .filter { it == SyncState.Live } .flatMapLatest { - coreLogic.get().getSessionScope(currentUserId!!).calls.observeAskCallFeedbackUseCase() + coreLogic.value.getSessionScope(currentUserId!!).calls.observeAskCallFeedbackUseCase() } .collectLatest { shouldAskFeedback -> - if (isAnalyticsAvailable.get().invoke(currentUserId!!)) { + if (isAnalyticsAvailable.value.invoke(currentUserId!!)) { when (shouldAskFeedback) { is ShouldAskCallFeedbackUseCaseResult.ShouldAskCallFeedback -> { showCallFeedbackFlow.emit(Unit) @@ -83,8 +82,8 @@ class CallFeedbackViewModel( is ShouldAskCallFeedbackUseCaseResult.ShouldNotAskCallFeedback.CallDurationIsLessThanOneMinute -> { val recentlyEndedCallMetadata = - coreLogic.get().getSessionScope(currentUserId!!).calls.observeRecentlyEndedCallMetadata().first() - analyticsManager.get().sendEvent( + coreLogic.value.getSessionScope(currentUserId!!).calls.observeRecentlyEndedCallMetadata().first() + analyticsManager.value.sendEvent( with(recentlyEndedCallMetadata) { AnalyticsEvent.CallQualityFeedback.TooShort( callDuration = shouldAskFeedback.callDurationInSeconds.toInt(), @@ -99,8 +98,8 @@ class CallFeedbackViewModel( is ShouldAskCallFeedbackUseCaseResult.ShouldNotAskCallFeedback.NextTimeForCallFeedbackIsNotReached -> { val recentlyEndedCallMetadata = - coreLogic.get().getSessionScope(currentUserId!!).calls.observeRecentlyEndedCallMetadata().first() - analyticsManager.get().sendEvent( + coreLogic.value.getSessionScope(currentUserId!!).calls.observeRecentlyEndedCallMetadata().first() + analyticsManager.value.sendEvent( with(recentlyEndedCallMetadata) { AnalyticsEvent.CallQualityFeedback.Muted( callDuration = shouldAskFeedback.callDurationInSeconds.toInt(), @@ -120,8 +119,8 @@ class CallFeedbackViewModel( fun rateCall(rate: Int, doNotAsk: Boolean) { currentUserId?.let { viewModelScope.launch { - val recentlyEndedCallMetadata = coreLogic.get().getSessionScope(it).calls.observeRecentlyEndedCallMetadata().first() - analyticsManager.get().sendEvent( + val recentlyEndedCallMetadata = coreLogic.value.getSessionScope(it).calls.observeRecentlyEndedCallMetadata().first() + analyticsManager.value.sendEvent( with(recentlyEndedCallMetadata) { AnalyticsEvent.CallQualityFeedback.Answered( score = rate, @@ -133,7 +132,7 @@ class CallFeedbackViewModel( ) } ) - coreLogic.get().getSessionScope(it).calls.updateNextTimeCallFeedback(doNotAsk) + coreLogic.value.getSessionScope(it).calls.updateNextTimeCallFeedback(doNotAsk) } } } @@ -141,9 +140,9 @@ class CallFeedbackViewModel( fun skipCallFeedback(doNotAsk: Boolean) { currentUserId?.let { viewModelScope.launch { - val recentlyEndedCallMetadata = coreLogic.get().getSessionScope(it).calls.observeRecentlyEndedCallMetadata().first() - coreLogic.get().getSessionScope(it).calls.updateNextTimeCallFeedback(doNotAsk) - analyticsManager.get().sendEvent( + val recentlyEndedCallMetadata = coreLogic.value.getSessionScope(it).calls.observeRecentlyEndedCallMetadata().first() + coreLogic.value.getSessionScope(it).calls.updateNextTimeCallFeedback(doNotAsk) + analyticsManager.value.sendEvent( with(recentlyEndedCallMetadata) { AnalyticsEvent.CallQualityFeedback.Dismissed( callDuration = callDetails.callDurationInSeconds.toInt(), diff --git a/app/src/main/kotlin/com/wire/android/ui/MiscViewModelFactory.kt b/app/src/main/kotlin/com/wire/android/ui/MiscViewModelFactory.kt index f9f91ca06e5..2501489bb50 100644 --- a/app/src/main/kotlin/com/wire/android/ui/MiscViewModelFactory.kt +++ b/app/src/main/kotlin/com/wire/android/ui/MiscViewModelFactory.kt @@ -48,8 +48,7 @@ import com.wire.kalium.logic.feature.user.GetSelfUserUseCase import com.wire.kalium.logic.feature.user.ObserveSelfUserUseCase import com.wire.kalium.logic.feature.user.SelfServerConfigUseCase import com.wire.kalium.logic.sync.ObserveSyncStateUseCase -import dagger.Lazy -import javax.inject.Inject +import dev.zacsweers.metro.Inject @Suppress("LongParameterList") class MiscViewModelFactory @Inject constructor( diff --git a/app/src/main/kotlin/com/wire/android/ui/WireActivity.kt b/app/src/main/kotlin/com/wire/android/ui/WireActivity.kt index a2d73ef1d96..85bba9d2306 100644 --- a/app/src/main/kotlin/com/wire/android/ui/WireActivity.kt +++ b/app/src/main/kotlin/com/wire/android/ui/WireActivity.kt @@ -50,7 +50,6 @@ import androidx.compose.ui.platform.LocalSoftwareKeyboardController import androidx.compose.ui.semantics.semantics import androidx.compose.ui.semantics.testTagsAsResourceId import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen -import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.Lifecycle import androidx.lifecycle.flowWithLifecycle import androidx.lifecycle.lifecycleScope @@ -80,10 +79,11 @@ import com.wire.android.appLogger import com.wire.android.config.CustomUiConfigurationProvider import com.wire.android.config.LocalCustomUiConfigurationProvider import com.wire.android.datastore.UserDataStore -import com.wire.android.di.metro.AuthenticationViewModelGraphBridge +import com.wire.android.di.metro.AppAuthenticationViewModelGraph +import com.wire.android.di.metro.AppSessionViewModelGraph import com.wire.android.di.metro.LocalMetroViewModelGraph import com.wire.android.di.metro.MetroViewModelGraph -import com.wire.android.di.metro.WireActivityViewModelGraphBridge +import com.wire.android.di.metro.wireApplicationGraph import com.wire.android.emm.ManagedConfigurationsManager import com.wire.android.feature.NavigationSwitchAccountActions import com.wire.android.navigation.BackStackMode @@ -135,8 +135,6 @@ import com.wire.android.util.SyncStateObserver import com.wire.android.util.debug.FeatureVisibilityFlags import com.wire.android.util.debug.LocalFeatureVisibilityFlags import com.wire.android.util.launchUpdateTheApp -import dagger.Lazy -import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.collectLatest @@ -144,10 +142,9 @@ import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -import javax.inject.Inject +import dev.zacsweers.metro.Inject @OptIn(ExperimentalComposeUiApi::class) -@AndroidEntryPoint @Suppress("TooManyFunctions", "LargeClass") class WireActivity : BaseActivity() { @@ -169,7 +166,13 @@ class WireActivity : BaseActivity() { @Inject lateinit var managedConfigurationsManager: ManagedConfigurationsManager - private val viewModel: WireActivityViewModel by viewModels() + private val viewModel: WireActivityViewModel by viewModels { + viewModelFactory { + initializer { + wireApplicationGraph.wireActivityViewModel + } + } + } private val newIntents = Channel>(Channel.UNLIMITED) // keep new intents until subscribed but do not replay them private lateinit var shakeDetector: ShakeDetector @@ -184,6 +187,7 @@ class WireActivity : BaseActivity() { // Otherwise a white screen is displayed. // It's an API limitation, at some point we may need to remove it val splashScreen = installSplashScreen() + wireApplicationGraph.inject(this) super.onCreate(savedInstanceState) splashScreen.setKeepOnScreenCondition { shouldKeepSplashOpen } @@ -254,13 +258,14 @@ class WireActivity : BaseActivity() { setContent { val snackbarHostState = remember { SnackbarHostState() } val currentUserId = viewModel.globalAppState.currentUserId - val wireActivityViewModelGraph = currentUserId?.let { - hiltViewModel( - key = "WireActivityViewModelGraphBridge:$it" - ) + val appGraph = LocalContext.current.wireApplicationGraph + val sessionViewModelGraph = remember(appGraph, currentUserId) { + currentUserId?.let { appGraph.sessionViewModelGraph } + } + val authenticationViewModelGraph = remember(appGraph) { + appGraph.authenticationViewModelGraph } - val authenticationViewModelGraph = hiltViewModel() - val activityViewModels = wireActivityViewModelGraph?.let { + val activityViewModels = sessionViewModelGraph?.let { wireActivityScopedViewModels(it) } @@ -303,7 +308,7 @@ class WireActivity : BaseActivity() { val metroViewModelGraph = rememberMetroViewModelGraph( currentBaseRoute = currentBaseRoute, startDestinationBaseRoute = startDestination.baseRoute, - wireActivityViewModelGraph = wireActivityViewModelGraph, + sessionViewModelGraph = sessionViewModelGraph, authenticationViewModelGraph = authenticationViewModelGraph ) val backgroundType by remember { @@ -353,25 +358,25 @@ class WireActivity : BaseActivity() { private fun rememberMetroViewModelGraph( currentBaseRoute: String?, startDestinationBaseRoute: String, - wireActivityViewModelGraph: WireActivityViewModelGraphBridge?, - authenticationViewModelGraph: AuthenticationViewModelGraphBridge, + sessionViewModelGraph: AppSessionViewModelGraph?, + authenticationViewModelGraph: AppAuthenticationViewModelGraph, ): MetroViewModelGraph? { val effectiveBaseRoute = currentBaseRoute ?: startDestinationBaseRoute val usesAuthenticationGraph = effectiveBaseRoute in authenticationGraphRoutes var useStandaloneAuthenticationGraph by remember { mutableStateOf(false) } - if (usesAuthenticationGraph && wireActivityViewModelGraph == null) { + if (usesAuthenticationGraph && sessionViewModelGraph == null) { useStandaloneAuthenticationGraph = true } - if (!usesAuthenticationGraph && wireActivityViewModelGraph != null) { + if (!usesAuthenticationGraph && sessionViewModelGraph != null) { useStandaloneAuthenticationGraph = false } return selectMetroViewModelGraph( currentBaseRoute = effectiveBaseRoute, usesAuthenticationGraph = usesAuthenticationGraph, useStandaloneAuthenticationGraph = useStandaloneAuthenticationGraph, - wireActivityViewModelGraph = wireActivityViewModelGraph, + sessionViewModelGraph = sessionViewModelGraph, authenticationViewModelGraph = authenticationViewModelGraph ) } @@ -380,17 +385,17 @@ class WireActivity : BaseActivity() { currentBaseRoute: String?, usesAuthenticationGraph: Boolean, useStandaloneAuthenticationGraph: Boolean, - wireActivityViewModelGraph: WireActivityViewModelGraphBridge?, - authenticationViewModelGraph: AuthenticationViewModelGraphBridge, + sessionViewModelGraph: AppSessionViewModelGraph?, + authenticationViewModelGraph: AppAuthenticationViewModelGraph, ): MetroViewModelGraph? = when { useStandaloneAuthenticationGraph && usesAuthenticationGraph -> authenticationViewModelGraph - wireActivityViewModelGraph != null -> wireActivityViewModelGraph + sessionViewModelGraph != null -> sessionViewModelGraph currentBaseRoute == null -> authenticationViewModelGraph else -> null } @Composable - private fun wireActivityScopedViewModels(graph: WireActivityViewModelGraphBridge): WireActivityScopedViewModels { + private fun wireActivityScopedViewModels(graph: AppSessionViewModelGraph): WireActivityScopedViewModels { val scopeKey = graph.viewModelScopeKey return WireActivityScopedViewModels( callFeedbackViewModel = viewModel( @@ -761,7 +766,7 @@ class WireActivity : BaseActivity() { shakeDetector.start() lifecycleScope.launch { - lockCodeTimeManager.get().observeAppLock() + lockCodeTimeManager.value.observeAppLock() // Listen to one flow in a lifecycle-aware manner using flowWithLifecycle .flowWithLifecycle(lifecycle, Lifecycle.State.STARTED) .first().let { diff --git a/app/src/main/kotlin/com/wire/android/ui/WireActivityViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/WireActivityViewModel.kt index 85db7b3a333..4bc4bff7e2b 100644 --- a/app/src/main/kotlin/com/wire/android/ui/WireActivityViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/WireActivityViewModel.kt @@ -91,8 +91,6 @@ import com.wire.kalium.logic.feature.session.ObserveSessionsUseCase import com.wire.kalium.logic.feature.user.screenshotCensoring.ObserveScreenshotCensoringConfigResult import com.wire.kalium.logic.feature.user.webSocketStatus.ObservePersistentWebSocketConnectionStatusUseCase import com.wire.kalium.util.DateTimeUtil.toIsoDateTimeString -import dagger.Lazy -import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharedFlow @@ -112,17 +110,16 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import java.io.InputStream import java.io.InputStreamReader -import javax.inject.Inject +import dev.zacsweers.metro.Inject private const val AUTOMATED_NOMAD_COOKIE_LABEL = "shared-device" @Suppress("LongParameterList", "TooManyFunctions") @OptIn(ExperimentalCoroutinesApi::class) -@HiltViewModel class WireActivityViewModel @Inject constructor( @KaliumCoreLogic private val coreLogic: Lazy, private val dispatchers: DispatcherProvider, - currentSessionFlow: Lazy, + private val currentSessionFlow: Lazy, private val doesValidSessionExist: Lazy, private val getServerConfigUseCase: Lazy, private val deepLinkProcessor: Lazy, @@ -157,7 +154,7 @@ class WireActivityViewModel @Inject constructor( private val _observeSyncFlowState: MutableStateFlow = MutableStateFlow(null) val observeSyncFlowState: StateFlow = _observeSyncFlowState - private val observeCurrentAccountInfo: SharedFlow = currentSessionFlow.get().invoke() + private val observeCurrentAccountInfo: SharedFlow = currentSessionFlow.value.invoke() .map { (it as? CurrentSessionResult.Success)?.accountInfo } .distinctUntilChanged() .flowOn(dispatchers.io()) @@ -192,7 +189,7 @@ class WireActivityViewModel @Inject constructor( private fun observeAppThemeState() { viewModelScope.launch(dispatchers.io()) { - globalDataStore.get().selectedThemeOptionFlow() + globalDataStore.value.selectedThemeOptionFlow() .distinctUntilChanged() .collect { globalAppState = globalAppState.copy(themeOption = it) @@ -259,7 +256,7 @@ class WireActivityViewModel @Inject constructor( private fun observeUpdateAppState() { viewModelScope.launch(dispatchers.io()) { - observeIfAppUpdateRequired.get().invoke(BuildConfig.VERSION_CODE) + observeIfAppUpdateRequired.value.invoke(BuildConfig.VERSION_CODE) .distinctUntilChanged() .collect { globalAppState = globalAppState.copy(updateAppDialog = it) @@ -269,10 +266,10 @@ class WireActivityViewModel @Inject constructor( private fun observeNewClientState() { viewModelScope.launch(dispatchers.io()) { - currentScreenManager.get().observeCurrentScreen(this) + currentScreenManager.value.observeCurrentScreen(this) .flatMapLatest { if (it.isGlobalDialogAllowed()) { - observeNewClients.get().invoke() + observeNewClients.value.invoke() } else { flowOf(NewClientResult.Empty) } @@ -302,7 +299,7 @@ class WireActivityViewModel @Inject constructor( } } - private suspend fun validSessionsFlow() = observeSessions.get().invoke() + private suspend fun validSessionsFlow() = observeSessions.value.invoke() .map { (it as? GetAllSessionsResult.Success)?.sessions ?: emptyList() } @VisibleForTesting @@ -351,11 +348,11 @@ class WireActivityViewModel @Inject constructor( data: InputStream ) { viewModelScope.launch(dispatchers.io()) { - when (val currentSession = coreLogic.get().getGlobalScope().session.currentSession()) { + when (val currentSession = coreLogic.value.getGlobalScope().session.currentSession()) { is CurrentSessionResult.Failure.Generic -> null CurrentSessionResult.Failure.SessionNotFound -> null is CurrentSessionResult.Success -> { - coreLogic.get().sessionScope(currentSession.accountInfo.userId) { + coreLogic.value.sessionScope(currentSession.accountInfo.userId) { when (val result = debug.synchronizeExternalData(InputStreamReader(data).readText())) { is SynchronizeExternalDataResult.Success -> { appLogger.d("Synchronized external data") @@ -374,7 +371,7 @@ class WireActivityViewModel @Inject constructor( @Suppress("ComplexMethod") fun handleDeepLink(intent: Intent?) { viewModelScope.launch(dispatchers.io()) { - when (val result = deepLinkProcessor.get().invoke(intent?.data, intent?.action)) { + when (val result = deepLinkProcessor.value.invoke(intent?.data, intent?.action)) { DeepLinkResult.AuthorizationNeeded -> sendAction(OnAuthorizationNeeded) is DeepLinkResult.SSOLogin -> sendAction(OnSSOLogin(result)) is DeepLinkResult.CustomServerConfig -> onCustomServerConfig(result.url, result.loginType) @@ -404,7 +401,7 @@ class WireActivityViewModel @Inject constructor( // Returns whether an intent was handled, or if there was nothing to do @Suppress("ReturnCount") suspend fun handleIntentsThatAreNotDeepLinks(intent: Intent?): Boolean { - val result = intentsProcessor.get().invoke(intent) + val result = intentsProcessor.value.invoke(intent) if (result != null) { if (!nomadProfilesFeatureConfig.isEnabled()) { appLogger.w("Nomad login ignored: local Nomad profiles flag is disabled") @@ -430,7 +427,7 @@ class WireActivityViewModel @Inject constructor( initValidSessionsFlowIfNeeded() if (validSessions.value.filterIsInstance().isNotEmpty()) { appLogger.w("Nomad login blocked: a non-nomad session already exists") - if (!doesValidNomadAccountExist.get().invoke()) { + if (!doesValidNomadAccountExist.value.invoke()) { sendAction(ShowToast(R.string.nomad_login_blocked_message)) } return@launch @@ -476,7 +473,7 @@ class WireActivityViewModel @Inject constructor( return false } - return when (val authScopeResult = coreLogic.get().versionedAuthenticationScope(serverLinks).invoke(null)) { + return when (val authScopeResult = coreLogic.value.versionedAuthenticationScope(serverLinks).invoke(null)) { is AutoVersionAuthScopeUseCase.Result.Failure -> { appLogger.w("Nomad login ignored: failed to create auth scope for backend ${serverLinks.api}") false @@ -527,16 +524,16 @@ class WireActivityViewModel @Inject constructor( switchAccountActions: SwitchAccountActions ) { viewModelScope.launch { - coreLogic.get().getGlobalScope().session.currentSession().takeIf { + coreLogic.value.getGlobalScope().session.currentSession().takeIf { it is CurrentSessionResult.Success }?.let { val currentUserId = (it as CurrentSessionResult.Success).accountInfo.userId - coreLogic.get().getSessionScope(currentUserId).logout(LogoutReason.SELF_HARD_LOGOUT) + coreLogic.value.getSessionScope(currentUserId).logout(LogoutReason.SELF_HARD_LOGOUT) clearUserData(currentUserId) } - accountSwitch.get().invoke(SwitchAccountParam.TryToSwitchToNextAccount).also { + accountSwitch.value.invoke(SwitchAccountParam.TryToSwitchToNextAccount).also { if (it == SwitchAccountResult.NoOtherAccountToSwitch) { - globalDataStore.get().clearAppLockPasscode() + globalDataStore.value.clearAppLockPasscode() } }.callAction(switchAccountActions) } @@ -545,9 +542,9 @@ class WireActivityViewModel @Inject constructor( fun dismissNewClientsDialog(userId: UserId) { globalAppState = globalAppState.copy(newClientDialog = null) viewModelScope.launch { - doesValidSessionExist.get().invoke(userId).let { + doesValidSessionExist.value.invoke(userId).let { if (it is DoesValidSessionExistResult.Success && it.doesValidSessionExist) { - clearNewClientsForUser.get().invoke(userId) + clearNewClientsForUser.value.invoke(userId) } } } @@ -555,7 +552,7 @@ class WireActivityViewModel @Inject constructor( fun switchAccount(userId: UserId, actions: SwitchAccountActions, onComplete: () -> Unit) { viewModelScope.launch { - accountSwitch.get().invoke(SwitchAccountParam.SwitchToAccount(userId)) + accountSwitch.value.invoke(SwitchAccountParam.SwitchToAccount(userId)) .callAction(actions) onComplete() } @@ -564,7 +561,7 @@ class WireActivityViewModel @Inject constructor( fun tryToSwitchAccount(actions: SwitchAccountActions) { viewModelScope.launch { globalAppState = globalAppState.copy(blockUserUI = null) - accountSwitch.get().invoke(SwitchAccountParam.TryToSwitchToNextAccount) + accountSwitch.value.invoke(SwitchAccountParam.TryToSwitchToNextAccount) .callAction(actions) } } @@ -583,7 +580,7 @@ class WireActivityViewModel @Inject constructor( } private suspend fun loadServerConfig(url: String): ServerConfig.Links? = - when (val result = getServerConfigUseCase.get().invoke(url)) { + when (val result = getServerConfigUseCase.value.invoke(url)) { is GetServerConfigResult.Success -> result.serverConfigLinks is GetServerConfigResult.Failure.Generic -> { appLogger.e("something went wrong during handling the custom server deep link: ${result.genericFailure}") @@ -617,11 +614,11 @@ class WireActivityViewModel @Inject constructor( key: String, domain: String?, onSuccess: (ConversationId) -> Unit - ) = when (val currentSession = coreLogic.get().getGlobalScope().session.currentSession()) { + ) = when (val currentSession = coreLogic.value.getGlobalScope().session.currentSession()) { is CurrentSessionResult.Failure.Generic -> null CurrentSessionResult.Failure.SessionNotFound -> null is CurrentSessionResult.Success -> { - coreLogic.get().sessionScope(currentSession.accountInfo.userId) { + coreLogic.value.sessionScope(currentSession.accountInfo.userId) { when (val result = conversations.checkIConversationInviteCode(code, key, domain)) { is CheckConversationInviteCodeUseCase.Result.Success -> { if (result.isSelfMember) { @@ -657,7 +654,7 @@ class WireActivityViewModel @Inject constructor( } private suspend fun currentValidUserId(): UserId? = - (coreLogic.get().getGlobalScope().session.currentSession() as? CurrentSessionResult.Success) + (coreLogic.value.getGlobalScope().session.currentSession() as? CurrentSessionResult.Success) ?.accountInfo ?.takeIf { it.isValid() } ?.userId @@ -671,14 +668,14 @@ class WireActivityViewModel @Inject constructor( val wasEnforced = managedConfigurationsManager.persistentWebSocketEnforcedByMDM.value val isEnforced = managedConfigurationsManager.refreshPersistentWebSocketConfig() if (!wasEnforced && isEnforced) { - coreLogic.get().getGlobalScope().setAllPersistentWebSocketEnabled(true) + coreLogic.value.getGlobalScope().setAllPersistentWebSocketEnabled(true) } } } fun observePersistentConnectionStatus() { viewModelScope.launch { - coreLogic.get().getGlobalScope().observePersistentWebSocketConnectionStatus() + coreLogic.value.getGlobalScope().observePersistentWebSocketConnectionStatus() .let { result -> when (result) { is ObservePersistentWebSocketConnectionStatusUseCase.Result.Failure -> { @@ -693,13 +690,13 @@ class WireActivityViewModel @Inject constructor( mdmEnforced || statuses.any { it.isPersistentWebSocketEnabled } }.collect { shouldBeRunning -> if (shouldBeRunning) { - if (!servicesManager.get().isPersistentWebSocketServiceRunning()) { - servicesManager.get().startPersistentWebSocketService() - workManager.get().enqueuePeriodicPersistentWebsocketCheckWorker() + if (!servicesManager.value.isPersistentWebSocketServiceRunning()) { + servicesManager.value.startPersistentWebSocketService() + workManager.value.enqueuePeriodicPersistentWebsocketCheckWorker() } } else { - servicesManager.get().stopPersistentWebSocketService() - workManager.get().cancelPeriodicPersistentWebsocketCheckWorker() + servicesManager.value.stopPersistentWebSocketService() + workManager.value.cancelPeriodicPersistentWebsocketCheckWorker() } } } @@ -722,7 +719,7 @@ class WireActivityViewModel @Inject constructor( * Reset any unfinished registration process analytics where the user aborted and enabled the registration analytics. */ private fun resetNewRegistrationAnalyticsState() = viewModelScope.launch { - globalDataStore.get().setAnonymousRegistrationEnabled(false) + globalDataStore.value.setAnonymousRegistrationEnabled(false) } private fun CurrentScreen.isGlobalDialogAllowed(): Boolean = when (this) { diff --git a/app/src/main/kotlin/com/wire/android/ui/WireTestActivity.kt b/app/src/main/kotlin/com/wire/android/ui/WireTestActivity.kt index 324a1c5c4b4..e8e43337da2 100644 --- a/app/src/main/kotlin/com/wire/android/ui/WireTestActivity.kt +++ b/app/src/main/kotlin/com/wire/android/ui/WireTestActivity.kt @@ -18,7 +18,5 @@ package com.wire.android.ui import androidx.activity.ComponentActivity -import dagger.hilt.android.AndroidEntryPoint -@AndroidEntryPoint class WireTestActivity : ComponentActivity() diff --git a/app/src/main/kotlin/com/wire/android/ui/analytics/AnalyticsUsageViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/analytics/AnalyticsUsageViewModel.kt index 68f051a4f96..90f9b4d546d 100644 --- a/app/src/main/kotlin/com/wire/android/ui/analytics/AnalyticsUsageViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/analytics/AnalyticsUsageViewModel.kt @@ -25,7 +25,6 @@ import androidx.lifecycle.viewModelScope import com.wire.android.datastore.UserDataStore import com.wire.kalium.logic.configuration.server.ServerConfig import com.wire.kalium.logic.feature.user.SelfServerConfigUseCase -import dagger.Lazy import kotlinx.coroutines.flow.first import kotlinx.coroutines.launch @@ -39,10 +38,10 @@ class AnalyticsUsageViewModel( init { viewModelScope.launch { - val isDialogSeen = dataStore.get().isAnalyticsDialogSeen().first() - val isAnalyticsUsageEnabled = dataStore.get().isAnonymousUsageDataEnabled().first() + val isDialogSeen = dataStore.value.isAnalyticsDialogSeen().first() + val isAnalyticsUsageEnabled = dataStore.value.isAnonymousUsageDataEnabled().first() val isAnalyticsConfigurationEnabled = analyticsEnabled is AnalyticsConfiguration.Enabled - val isValidBackend = when (val serverConfig = selfServerConfig.get().invoke()) { + val isValidBackend = when (val serverConfig = selfServerConfig.value.invoke()) { is SelfServerConfigUseCase.Result.Success -> serverConfig.serverLinks.links.api == ServerConfig.PRODUCTION.api || serverConfig.serverLinks.links.api == ServerConfig.STAGING.api @@ -59,8 +58,8 @@ class AnalyticsUsageViewModel( fun agreeAnalyticsUsage() { viewModelScope.launch { - dataStore.get().setIsAnonymousAnalyticsEnabled(enabled = true) - dataStore.get().setIsAnalyticsDialogSeen() + dataStore.value.setIsAnonymousAnalyticsEnabled(enabled = true) + dataStore.value.setIsAnalyticsDialogSeen() hideDialog() } @@ -68,8 +67,8 @@ class AnalyticsUsageViewModel( fun declineAnalyticsUsage() { viewModelScope.launch { - dataStore.get().setIsAnonymousAnalyticsEnabled(enabled = false) - dataStore.get().setIsAnalyticsDialogSeen() + dataStore.value.setIsAnonymousAnalyticsEnabled(enabled = false) + dataStore.value.setIsAnalyticsDialogSeen() hideDialog() } diff --git a/app/src/main/kotlin/com/wire/android/ui/analytics/IsAnalyticsAvailableUseCase.kt b/app/src/main/kotlin/com/wire/android/ui/analytics/IsAnalyticsAvailableUseCase.kt index 9844bcbae48..4c80eb5be80 100644 --- a/app/src/main/kotlin/com/wire/android/ui/analytics/IsAnalyticsAvailableUseCase.kt +++ b/app/src/main/kotlin/com/wire/android/ui/analytics/IsAnalyticsAvailableUseCase.kt @@ -23,15 +23,13 @@ import com.wire.kalium.logic.CoreLogic import com.wire.kalium.logic.configuration.server.ServerConfig import com.wire.kalium.logic.data.user.UserId import com.wire.kalium.logic.feature.user.SelfServerConfigUseCase -import dagger.hilt.android.scopes.ViewModelScoped import kotlinx.coroutines.flow.first -import javax.inject.Inject +import dev.zacsweers.metro.Inject /** * UseCase that determines if Analytics is available for current Build and specific [UserId]. * Use it for checking if Analytics UI (e.x. asking user for some feedback that will be sent to Analytics) should be shown to user or not. */ -@ViewModelScoped class IsAnalyticsAvailableUseCase @Inject constructor( @KaliumCoreLogic private val coreLogic: CoreLogic, private val analyticsEnabled: AnalyticsConfiguration, diff --git a/app/src/main/kotlin/com/wire/android/ui/authentication/AuthenticationViewModelFactory.kt b/app/src/main/kotlin/com/wire/android/ui/authentication/AuthenticationViewModelFactory.kt index 09249754bc1..57bf34ab8b7 100644 --- a/app/src/main/kotlin/com/wire/android/ui/authentication/AuthenticationViewModelFactory.kt +++ b/app/src/main/kotlin/com/wire/android/ui/authentication/AuthenticationViewModelFactory.kt @@ -69,9 +69,9 @@ import com.wire.kalium.logic.feature.session.GetSessionsUseCase import com.wire.kalium.logic.feature.user.GetSelfUserUseCase import com.wire.kalium.logic.feature.user.IsPasswordRequiredUseCase import com.wire.kalium.logic.feature.user.SetUserHandleUseCase -import javax.inject.Inject -import javax.inject.Named -import javax.inject.Provider +import dev.zacsweers.metro.Inject +import dev.zacsweers.metro.Named +import dev.zacsweers.metro.Provider @Suppress("LongParameterList", "TooManyFunctions") class AuthenticationViewModelFactory @Inject constructor( @@ -108,145 +108,145 @@ class AuthenticationViewModelFactory @Inject constructor( ) { fun welcomeViewModel(savedStateHandle: SavedStateHandle) = WelcomeViewModel( savedStateHandle = savedStateHandle, - getSessions = getSessions.get(), - doesValidNomadAccountExist = doesValidNomadAccountExist.get(), - defaultServerConfig = defaultServerConfig.get(), + getSessions = getSessions(), + doesValidNomadAccountExist = doesValidNomadAccountExist(), + defaultServerConfig = defaultServerConfig(), ) fun newLoginViewModel(savedStateHandle: SavedStateHandle) = NewLoginViewModel( - validateEmailOrSSOCode = validateEmailOrSSOCode.get(), - coreLogic = coreLogic.get(), + validateEmailOrSSOCode = validateEmailOrSSOCode(), + coreLogic = coreLogic(), savedStateHandle = savedStateHandle, - clientScopeProviderFactory = clientScopeProviderFactory.get(), - userDataStoreProvider = userDataStoreProvider.get(), - loginExtension = LoginViewModelExtension(clientScopeProviderFactory.get(), userDataStoreProvider.get()), + clientScopeProviderFactory = clientScopeProviderFactory(), + userDataStoreProvider = userDataStoreProvider(), + loginExtension = LoginViewModelExtension(clientScopeProviderFactory(), userDataStoreProvider()), ssoExtension = LoginSSOViewModelExtension( - addAuthenticatedUser = addAuthenticatedUser.get(), - coreLogic = coreLogic.get(), - defaultWebSocketEnabledByDefault = defaultWebSocketEnabledByDefault.get(), + addAuthenticatedUser = addAuthenticatedUser(), + coreLogic = coreLogic(), + defaultWebSocketEnabledByDefault = defaultWebSocketEnabledByDefault(), ), - dispatchers = dispatchers.get(), - defaultServerConfig = defaultServerConfig.get(), - defaultSSOCodeConfig = defaultSSOCodeConfig.get(), + dispatchers = dispatchers(), + defaultServerConfig = defaultServerConfig(), + defaultSSOCodeConfig = defaultSSOCodeConfig(), ) fun loginEmailViewModel(loginNavArgs: LoginNavArgs, savedStateHandle: SavedStateHandle) = LoginEmailViewModel( loginNavArgs = loginNavArgs, - addAuthenticatedUser = addAuthenticatedUser.get(), - clientScopeProviderFactory = clientScopeProviderFactory.get(), + addAuthenticatedUser = addAuthenticatedUser(), + clientScopeProviderFactory = clientScopeProviderFactory(), savedInputStore = loginSavedInputStore(savedStateHandle), - userDataStoreProvider = userDataStoreProvider.get(), - coreLogic = coreLogic.get(), - resendCodeTimer = countdownTimer.get(), - dispatchers = dispatchers.get(), - defaultServerConfig = defaultServerConfig.get(), - defaultWebSocketEnabledByDefault = defaultWebSocketEnabledByDefault.get(), + userDataStoreProvider = userDataStoreProvider(), + coreLogic = coreLogic(), + resendCodeTimer = countdownTimer(), + dispatchers = dispatchers(), + defaultServerConfig = defaultServerConfig(), + defaultWebSocketEnabledByDefault = defaultWebSocketEnabledByDefault(), ) fun loginSSOViewModel(loginNavArgs: LoginNavArgs, savedStateHandle: SavedStateHandle) = LoginSSOViewModel( loginNavArgs = loginNavArgs, savedInputStore = loginSavedInputStore(savedStateHandle), - addAuthenticatedUser = addAuthenticatedUser.get(), - validateEmailUseCase = validateEmail.get(), - coreLogic = coreLogic.get(), - clientScopeProviderFactory = clientScopeProviderFactory.get(), - userDataStoreProvider = userDataStoreProvider.get(), - serverConfig = defaultServerConfig.get(), + addAuthenticatedUser = addAuthenticatedUser(), + validateEmailUseCase = validateEmail(), + coreLogic = coreLogic(), + clientScopeProviderFactory = clientScopeProviderFactory(), + userDataStoreProvider = userDataStoreProvider(), + serverConfig = defaultServerConfig(), ssoExtension = LoginSSOViewModelExtension( - addAuthenticatedUser = addAuthenticatedUser.get(), - coreLogic = coreLogic.get(), - defaultWebSocketEnabledByDefault = defaultWebSocketEnabledByDefault.get(), + addAuthenticatedUser = addAuthenticatedUser(), + coreLogic = coreLogic(), + defaultWebSocketEnabledByDefault = defaultWebSocketEnabledByDefault(), ), - dispatchers = dispatchers.get(), + dispatchers = dispatchers(), ) fun registerDeviceViewModel() = RegisterDeviceViewModel( - registerClientUseCase = getOrRegisterClient.get(), - isPasswordRequired = isPasswordRequired.get(), - userDataStore = userDataStore.get(), - getSelfUser = getSelfUser.get(), - requestSecondFactorVerificationCodeUseCase = requestSecondFactorVerificationCode.get(), - resendCodeTimer = countdownTimer.get(), + registerClientUseCase = getOrRegisterClient(), + isPasswordRequired = isPasswordRequired(), + userDataStore = userDataStore(), + getSelfUser = getSelfUser(), + requestSecondFactorVerificationCodeUseCase = requestSecondFactorVerificationCode(), + resendCodeTimer = countdownTimer(), ) fun removeDeviceViewModel() = RemoveDeviceViewModel( - fetchSelfClientsFromRemote = fetchSelfClientsFromRemote.get(), - deleteClientUseCase = deleteClient.get(), - registerClientUseCase = getOrRegisterClient.get(), - isPasswordRequired = isPasswordRequired.get(), - userDataStore = userDataStore.get(), - getSelfUser = getSelfUser.get(), - requestSecondFactorVerificationCodeUseCase = requestSecondFactorVerificationCode.get(), + fetchSelfClientsFromRemote = fetchSelfClientsFromRemote(), + deleteClientUseCase = deleteClient(), + registerClientUseCase = getOrRegisterClient(), + isPasswordRequired = isPasswordRequired(), + userDataStore = userDataStore(), + getSelfUser = getSelfUser(), + requestSecondFactorVerificationCodeUseCase = requestSecondFactorVerificationCode(), ) fun clearSessionViewModel() = ClearSessionViewModel( - currentSession = currentSession.get(), - deleteSession = deleteSession.get(), - switchAccount = switchAccount.get(), - logout = logout.get(), + currentSession = currentSession(), + deleteSession = deleteSession(), + switchAccount = switchAccount(), + logout = logout(), ) fun createAccountUsernameViewModel() = CreateAccountUsernameViewModel( - validateUserHandleUseCase = validateUserHandle.get(), - setUserHandleUseCase = setUserHandle.get(), - finalizeRegistrationAnalyticsMetadata = finalizeRegistrationAnalyticsMetadata.get(), - registrationAnalyticsManager = registrationAnalyticsManager.get(), + validateUserHandleUseCase = validateUserHandle(), + setUserHandleUseCase = setUserHandle(), + finalizeRegistrationAnalyticsMetadata = finalizeRegistrationAnalyticsMetadata(), + registrationAnalyticsManager = registrationAnalyticsManager(), ) fun createAccountOverviewViewModel(savedStateHandle: SavedStateHandle) = CreateAccountOverviewViewModel( savedStateHandle = savedStateHandle, - defaultServerConfig = defaultServerConfig.get(), + defaultServerConfig = defaultServerConfig(), ) fun createAccountEmailViewModel(savedStateHandle: SavedStateHandle) = CreateAccountEmailViewModel( savedStateHandle = savedStateHandle, - validateEmail = validateEmail.get(), - coreLogic = coreLogic.get(), - defaultServerConfig = defaultServerConfig.get(), + validateEmail = validateEmail(), + coreLogic = coreLogic(), + defaultServerConfig = defaultServerConfig(), ) fun createAccountDetailsViewModel(savedStateHandle: SavedStateHandle) = CreateAccountDetailsViewModel( savedStateHandle = savedStateHandle, - validatePasswordUseCase = validatePassword.get(), - defaultServerConfig = defaultServerConfig.get(), + validatePasswordUseCase = validatePassword(), + defaultServerConfig = defaultServerConfig(), ) fun createAccountCodeViewModel(savedStateHandle: SavedStateHandle) = CreateAccountCodeViewModel( savedStateHandle = savedStateHandle, - coreLogic = coreLogic.get(), - addAuthenticatedUser = addAuthenticatedUser.get(), - clientScopeProviderFactory = clientScopeProviderFactory.get(), - defaultServerConfig = defaultServerConfig.get(), - defaultWebSocketEnabledByDefault = defaultWebSocketEnabledByDefault.get(), + coreLogic = coreLogic(), + addAuthenticatedUser = addAuthenticatedUser(), + clientScopeProviderFactory = clientScopeProviderFactory(), + defaultServerConfig = defaultServerConfig(), + defaultWebSocketEnabledByDefault = defaultWebSocketEnabledByDefault(), ) fun createAccountSummaryViewModel(savedStateHandle: SavedStateHandle) = CreateAccountSummaryViewModel(savedStateHandle = savedStateHandle) fun createAccountSelectorViewModel(savedStateHandle: SavedStateHandle) = CreateAccountSelectorViewModel( - globalDataStore = globalDataStore.get(), + globalDataStore = globalDataStore(), savedStateHandle = savedStateHandle, - defaultServerConfig = defaultServerConfig.get(), + defaultServerConfig = defaultServerConfig(), ) fun createAccountDataDetailViewModel(savedStateHandle: SavedStateHandle) = CreateAccountDataDetailViewModel( savedStateHandle = savedStateHandle, - validatePassword = validatePassword.get(), - validateEmail = validateEmail.get(), - globalDataStore = globalDataStore.get(), - registrationAnalyticsManager = registrationAnalyticsManager.get(), - coreLogic = coreLogic.get(), - defaultServerConfig = defaultServerConfig.get(), + validatePassword = validatePassword(), + validateEmail = validateEmail(), + globalDataStore = globalDataStore(), + registrationAnalyticsManager = registrationAnalyticsManager(), + coreLogic = coreLogic(), + defaultServerConfig = defaultServerConfig(), ) fun createAccountVerificationCodeViewModel(savedStateHandle: SavedStateHandle) = CreateAccountVerificationCodeViewModel( savedStateHandle = savedStateHandle, - coreLogic = coreLogic.get(), - addAuthenticatedUser = addAuthenticatedUser.get(), - registrationAnalyticsManager = registrationAnalyticsManager.get(), - clientScopeProviderFactory = clientScopeProviderFactory.get(), - defaultServerConfig = defaultServerConfig.get(), - defaultWebSocketEnabledByDefault = defaultWebSocketEnabledByDefault.get(), + coreLogic = coreLogic(), + addAuthenticatedUser = addAuthenticatedUser(), + registrationAnalyticsManager = registrationAnalyticsManager(), + clientScopeProviderFactory = clientScopeProviderFactory(), + defaultServerConfig = defaultServerConfig(), + defaultWebSocketEnabledByDefault = defaultWebSocketEnabledByDefault(), ) private fun loginSavedInputStore(savedStateHandle: SavedStateHandle): LoginSavedInputStore = diff --git a/app/src/main/kotlin/com/wire/android/ui/authentication/create/code/CreateAccountCodeViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/authentication/create/code/CreateAccountCodeViewModel.kt index 8fa40c6853f..8fceeb1a778 100644 --- a/app/src/main/kotlin/com/wire/android/ui/authentication/create/code/CreateAccountCodeViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/authentication/create/code/CreateAccountCodeViewModel.kt @@ -50,7 +50,7 @@ import com.wire.kalium.logic.feature.register.RegisterResult import com.wire.kalium.logic.feature.register.RequestActivationCodeResult import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch -import javax.inject.Inject +import dev.zacsweers.metro.Inject // TODO: Cover this viewModel with unit test class CreateAccountCodeViewModel @Inject constructor( diff --git a/app/src/main/kotlin/com/wire/android/ui/authentication/create/details/CreateAccountDetailsViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/authentication/create/details/CreateAccountDetailsViewModel.kt index 3e825caa375..f34463bf38e 100644 --- a/app/src/main/kotlin/com/wire/android/ui/authentication/create/details/CreateAccountDetailsViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/authentication/create/details/CreateAccountDetailsViewModel.kt @@ -32,7 +32,7 @@ import com.wire.kalium.logic.configuration.server.ServerConfig import com.wire.kalium.logic.feature.auth.ValidatePasswordUseCase import kotlinx.coroutines.flow.combine import kotlinx.coroutines.launch -import javax.inject.Inject +import dev.zacsweers.metro.Inject // TODO: Cover this viewModel with unit test class CreateAccountDetailsViewModel @Inject constructor( diff --git a/app/src/main/kotlin/com/wire/android/ui/authentication/create/email/CreateAccountEmailViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/authentication/create/email/CreateAccountEmailViewModel.kt index 2662a15fa4d..f3c5fb0fcb1 100644 --- a/app/src/main/kotlin/com/wire/android/ui/authentication/create/email/CreateAccountEmailViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/authentication/create/email/CreateAccountEmailViewModel.kt @@ -35,7 +35,7 @@ import com.wire.kalium.logic.feature.auth.autoVersioningAuth.AutoVersionAuthScop import com.wire.kalium.logic.feature.register.RequestActivationCodeResult import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch -import javax.inject.Inject +import dev.zacsweers.metro.Inject // TODO: Cover this viewModel with unit test class CreateAccountEmailViewModel @Inject constructor( diff --git a/app/src/main/kotlin/com/wire/android/ui/authentication/create/overview/CreateAccountOverviewViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/authentication/create/overview/CreateAccountOverviewViewModel.kt index 2ce1718f0d0..d2934f749a2 100644 --- a/app/src/main/kotlin/com/wire/android/ui/authentication/create/overview/CreateAccountOverviewViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/authentication/create/overview/CreateAccountOverviewViewModel.kt @@ -21,7 +21,7 @@ import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel import com.ramcosta.composedestinations.generated.app.navArgs import com.wire.kalium.logic.configuration.server.ServerConfig -import javax.inject.Inject +import dev.zacsweers.metro.Inject class CreateAccountOverviewViewModel @Inject constructor( savedStateHandle: SavedStateHandle, diff --git a/app/src/main/kotlin/com/wire/android/ui/authentication/create/summary/CreateAccountSummaryViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/authentication/create/summary/CreateAccountSummaryViewModel.kt index b02a45d8d3f..a1ba7ff4117 100644 --- a/app/src/main/kotlin/com/wire/android/ui/authentication/create/summary/CreateAccountSummaryViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/authentication/create/summary/CreateAccountSummaryViewModel.kt @@ -25,7 +25,7 @@ import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel import com.wire.android.ui.authentication.create.common.CreateAccountFlowType import com.ramcosta.composedestinations.generated.app.navArgs -import javax.inject.Inject +import dev.zacsweers.metro.Inject class CreateAccountSummaryViewModel @Inject constructor( savedStateHandle: SavedStateHandle diff --git a/app/src/main/kotlin/com/wire/android/ui/authentication/create/username/CreateAccountUsernameViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/authentication/create/username/CreateAccountUsernameViewModel.kt index b19ae16b883..7a85af60cba 100644 --- a/app/src/main/kotlin/com/wire/android/ui/authentication/create/username/CreateAccountUsernameViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/authentication/create/username/CreateAccountUsernameViewModel.kt @@ -36,7 +36,7 @@ import com.wire.kalium.logic.feature.user.SetUserHandleUseCase import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.dropWhile import kotlinx.coroutines.launch -import javax.inject.Inject +import dev.zacsweers.metro.Inject class CreateAccountUsernameViewModel @Inject constructor( private val validateUserHandleUseCase: ValidateUserHandleUseCase, diff --git a/app/src/main/kotlin/com/wire/android/ui/authentication/devices/common/ClearSessionViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/authentication/devices/common/ClearSessionViewModel.kt index 1160d727241..a7518f4c2ea 100644 --- a/app/src/main/kotlin/com/wire/android/ui/authentication/devices/common/ClearSessionViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/authentication/devices/common/ClearSessionViewModel.kt @@ -33,7 +33,7 @@ import com.wire.kalium.logic.feature.session.CurrentSessionResult import com.wire.kalium.logic.feature.session.CurrentSessionUseCase import com.wire.kalium.logic.feature.session.DeleteSessionUseCase import kotlinx.coroutines.launch -import javax.inject.Inject +import dev.zacsweers.metro.Inject class ClearSessionViewModel @Inject constructor( private val currentSession: CurrentSessionUseCase, diff --git a/app/src/main/kotlin/com/wire/android/ui/authentication/devices/register/RegisterDeviceViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/authentication/devices/register/RegisterDeviceViewModel.kt index e87b51a20b3..7585a0ab811 100644 --- a/app/src/main/kotlin/com/wire/android/ui/authentication/devices/register/RegisterDeviceViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/authentication/devices/register/RegisterDeviceViewModel.kt @@ -43,7 +43,7 @@ import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.first import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking -import javax.inject.Inject +import dev.zacsweers.metro.Inject class RegisterDeviceViewModel @Inject constructor( private val registerClientUseCase: GetOrRegisterClientUseCase, diff --git a/app/src/main/kotlin/com/wire/android/ui/authentication/devices/remove/RemoveDeviceViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/authentication/devices/remove/RemoveDeviceViewModel.kt index 77480906f34..9dc87a55aee 100644 --- a/app/src/main/kotlin/com/wire/android/ui/authentication/devices/remove/RemoveDeviceViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/authentication/devices/remove/RemoveDeviceViewModel.kt @@ -48,7 +48,7 @@ import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.first import kotlinx.coroutines.launch -import javax.inject.Inject +import dev.zacsweers.metro.Inject @Suppress("TooManyFunctions") class RemoveDeviceViewModel @Inject constructor( diff --git a/app/src/main/kotlin/com/wire/android/ui/authentication/login/email/LoginEmailViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/authentication/login/email/LoginEmailViewModel.kt index 48e572720f7..b088158b126 100644 --- a/app/src/main/kotlin/com/wire/android/ui/authentication/login/email/LoginEmailViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/authentication/login/email/LoginEmailViewModel.kt @@ -58,9 +58,9 @@ import com.wire.kalium.logic.feature.auth.autoVersioningAuth.AutoVersionAuthScop import com.wire.kalium.logic.feature.auth.verification.RequestSecondFactorVerificationCodeUseCase import com.wire.kalium.logic.feature.client.RegisterClientResult import com.wire.kalium.logic.feature.session.CurrentSessionResult -import dagger.assisted.Assisted -import dagger.assisted.AssistedFactory -import dagger.assisted.AssistedInject +import dev.zacsweers.metro.Assisted +import dev.zacsweers.metro.AssistedFactory +import dev.zacsweers.metro.AssistedInject import kotlinx.coroutines.Job import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.collectLatest @@ -108,7 +108,7 @@ class LoginEmailViewModel @AssistedInject constructor( @AssistedFactory interface Factory { - fun create(args: LoginNavArgs): LoginEmailViewModel + fun create(loginNavArgs: LoginNavArgs): LoginEmailViewModel } init { diff --git a/app/src/main/kotlin/com/wire/android/ui/authentication/login/sso/LoginSSOViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/authentication/login/sso/LoginSSOViewModel.kt index 02c2b95719e..fb6b75db5b7 100644 --- a/app/src/main/kotlin/com/wire/android/ui/authentication/login/sso/LoginSSOViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/authentication/login/sso/LoginSSOViewModel.kt @@ -58,9 +58,9 @@ import com.wire.kalium.logic.feature.auth.sso.SSOLoginSessionResult import com.wire.kalium.logic.feature.backup.RestoreCryptoStateResult import com.wire.kalium.logic.feature.client.RegisterClientResult import com.wire.kalium.logic.feature.session.DoesValidSessionExistResult -import dagger.assisted.Assisted -import dagger.assisted.AssistedFactory -import dagger.assisted.AssistedInject +import dev.zacsweers.metro.Assisted +import dev.zacsweers.metro.AssistedFactory +import dev.zacsweers.metro.AssistedInject import java.io.IOException import kotlinx.coroutines.CancellationException import kotlinx.coroutines.flow.MutableSharedFlow @@ -165,7 +165,7 @@ class LoginSSOViewModel : LoginViewModel { @AssistedFactory interface Factory { - fun create(args: LoginNavArgs): LoginSSOViewModel + fun create(loginNavArgs: LoginNavArgs): LoginSSOViewModel } private fun observeSSOCodeInput() { diff --git a/app/src/main/kotlin/com/wire/android/ui/authentication/welcome/WelcomeViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/authentication/welcome/WelcomeViewModel.kt index 57ce677c201..2b46161b1f5 100644 --- a/app/src/main/kotlin/com/wire/android/ui/authentication/welcome/WelcomeViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/authentication/welcome/WelcomeViewModel.kt @@ -32,7 +32,7 @@ import com.wire.kalium.logic.feature.session.DoesValidNomadAccountExistUseCase import com.wire.kalium.logic.feature.session.GetAllSessionsResult import com.wire.kalium.logic.feature.session.GetSessionsUseCase import kotlinx.coroutines.launch -import javax.inject.Inject +import dev.zacsweers.metro.Inject class WelcomeViewModel @Inject constructor( savedStateHandle: SavedStateHandle, diff --git a/app/src/main/kotlin/com/wire/android/ui/calling/CallActivity.kt b/app/src/main/kotlin/com/wire/android/ui/calling/CallActivity.kt index d6a20739994..a0683621aed 100644 --- a/app/src/main/kotlin/com/wire/android/ui/calling/CallActivity.kt +++ b/app/src/main/kotlin/com/wire/android/ui/calling/CallActivity.kt @@ -40,8 +40,8 @@ import androidx.lifecycle.lifecycleScope import androidx.lifecycle.viewmodel.initializer import androidx.lifecycle.viewmodel.viewModelFactory import com.wire.android.appLogger -import com.wire.android.di.metro.ImageAssetViewModelGraphBridgeViewModel import com.wire.android.di.metro.LocalMetroViewModelGraph +import com.wire.android.di.metro.wireApplicationGraph import com.wire.android.ui.AppLockActivity import com.wire.android.ui.BaseActivity import com.wire.android.ui.LocalActivity @@ -54,11 +54,11 @@ import com.wire.android.ui.common.topappbar.WireTopAppBar import com.wire.android.ui.theme.WireTheme import com.wire.android.util.SwitchAccountObserver import com.wire.kalium.logic.data.id.QualifiedIdMapper -import dagger.hilt.android.AndroidEntryPoint +import dev.zacsweers.metro.HasMemberInjections import kotlinx.coroutines.launch -import javax.inject.Inject +import dev.zacsweers.metro.Inject -@AndroidEntryPoint +@HasMemberInjections abstract class CallActivity : BaseActivity() { @Inject @@ -75,7 +75,7 @@ abstract class CallActivity : BaseActivity() { const val TAG = "CallActivity" } - private val imageAssetViewModelGraph: ImageAssetViewModelGraphBridgeViewModel by viewModels() + private val imageAssetViewModelGraph by lazy { wireApplicationGraph.imageAssetViewModelGraph } private val commonTopAppBarViewModel: CommonTopAppBarViewModel by viewModels { viewModelFactory { initializer { @@ -101,6 +101,7 @@ abstract class CallActivity : BaseActivity() { } override fun onCreate(savedInstanceState: Bundle?) { + wireApplicationGraph.inject(this) super.onCreate(savedInstanceState) setupOrientationForDevice() setUpScreenshotPreventionFlag() diff --git a/app/src/main/kotlin/com/wire/android/ui/calling/CallingViewModelFactory.kt b/app/src/main/kotlin/com/wire/android/ui/calling/CallingViewModelFactory.kt index 0621e84c972..cd89c72e0f9 100644 --- a/app/src/main/kotlin/com/wire/android/ui/calling/CallingViewModelFactory.kt +++ b/app/src/main/kotlin/com/wire/android/ui/calling/CallingViewModelFactory.kt @@ -81,8 +81,7 @@ import com.wire.kalium.logic.feature.session.CurrentSessionUseCase import com.wire.kalium.logic.feature.user.ObserveSelfUserUseCase import com.wire.kalium.logic.sync.ObserveSyncStateUseCase import com.wire.kalium.network.NetworkStateObserver -import dagger.Lazy -import javax.inject.Inject +import dev.zacsweers.metro.Inject @Suppress("LongParameterList") class CallingViewModelFactory @Inject constructor( diff --git a/app/src/main/kotlin/com/wire/android/ui/calling/StartingCallActivity.kt b/app/src/main/kotlin/com/wire/android/ui/calling/StartingCallActivity.kt index 327c1d70b17..1c947c4c602 100644 --- a/app/src/main/kotlin/com/wire/android/ui/calling/StartingCallActivity.kt +++ b/app/src/main/kotlin/com/wire/android/ui/calling/StartingCallActivity.kt @@ -37,7 +37,6 @@ import com.wire.android.ui.calling.CallActivity.Companion.EXTRA_USER_ID import com.wire.android.ui.calling.incoming.IncomingCallScreen import com.wire.android.ui.calling.ongoing.getOngoingCallIntent import com.wire.android.ui.calling.outgoing.OutgoingCallScreen -import dagger.hilt.android.AndroidEntryPoint /** * Activity that handles starting call screens, Incoming and Outgoing @@ -49,7 +48,6 @@ import dagger.hilt.android.AndroidEntryPoint * @see OutgoingCallScreen */ @OptIn(ExperimentalComposeUiApi::class) -@AndroidEntryPoint class StartingCallActivity : CallActivity() { private var conversationId: String? by mutableStateOf(null) private var userId: String? by mutableStateOf(null) diff --git a/app/src/main/kotlin/com/wire/android/ui/calling/common/ProximitySensorManager.kt b/app/src/main/kotlin/com/wire/android/ui/calling/common/ProximitySensorManager.kt index 5d28838d929..6399c0ac488 100644 --- a/app/src/main/kotlin/com/wire/android/ui/calling/common/ProximitySensorManager.kt +++ b/app/src/main/kotlin/com/wire/android/ui/calling/common/ProximitySensorManager.kt @@ -31,13 +31,13 @@ import com.wire.android.di.KaliumCoreLogic import com.wire.kalium.logic.CoreLogic import com.wire.kalium.logic.feature.session.CurrentSessionResult import com.wire.kalium.logic.feature.session.CurrentSessionUseCase -import dagger.Lazy import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch -import javax.inject.Inject -import javax.inject.Singleton +import dev.zacsweers.metro.Inject +import dev.zacsweers.metro.AppScope +import dev.zacsweers.metro.SingleIn -@Singleton +@SingleIn(AppScope::class) class ProximitySensorManager @Inject constructor( private val context: Context, private val currentSession: Lazy, @@ -73,12 +73,12 @@ class ProximitySensorManager @Inject constructor( override fun onSensorChanged(event: SensorEvent) { appCoroutineScope.launch { - coreLogic.get().globalScope { - val currentSession = currentSession.get().invoke() + coreLogic.value.globalScope { + val currentSession = currentSession.value.invoke() when { currentSession is CurrentSessionResult.Success && currentSession.accountInfo.isValid() -> { val userId = currentSession.accountInfo.userId - val isCallRunning = coreLogic.get().getSessionScope(userId).calls.isCallRunning() + val isCallRunning = coreLogic.value.getSessionScope(userId).calls.isCallRunning() val distance = event.values.first() val shouldTurnOffScreen = distance == NEAR_DISTANCE && isCallRunning appLogger.i( diff --git a/app/src/main/kotlin/com/wire/android/ui/calling/ongoing/OngoingCallActivity.kt b/app/src/main/kotlin/com/wire/android/ui/calling/ongoing/OngoingCallActivity.kt index 936a7265a58..7b5bcf73a48 100644 --- a/app/src/main/kotlin/com/wire/android/ui/calling/ongoing/OngoingCallActivity.kt +++ b/app/src/main/kotlin/com/wire/android/ui/calling/ongoing/OngoingCallActivity.kt @@ -48,8 +48,7 @@ import com.wire.android.ui.calling.CallActivity.Companion.EXTRA_USER_ID import com.wire.android.ui.calling.ongoing.OngoingCallActivity.Companion.TAG import com.wire.kalium.logic.data.id.ConversationId import com.wire.kalium.logic.data.user.UserId -import dagger.hilt.android.AndroidEntryPoint -import javax.inject.Inject +import dev.zacsweers.metro.Inject /** * Activity that handles ongoing call screen, Ongoing. @@ -60,7 +59,6 @@ import javax.inject.Inject * @see OngoingCallScreen */ @OptIn(ExperimentalComposeUiApi::class) -@AndroidEntryPoint class OngoingCallActivity : CallActivity() { @Inject lateinit var servicesManager: ServicesManager diff --git a/app/src/main/kotlin/com/wire/android/ui/calling/usecase/HangUpCallUseCase.kt b/app/src/main/kotlin/com/wire/android/ui/calling/usecase/HangUpCallUseCase.kt index b2b969c3a1b..72bb71b68c5 100644 --- a/app/src/main/kotlin/com/wire/android/ui/calling/usecase/HangUpCallUseCase.kt +++ b/app/src/main/kotlin/com/wire/android/ui/calling/usecase/HangUpCallUseCase.kt @@ -26,13 +26,10 @@ import com.wire.kalium.logic.feature.call.usecase.MuteCallUseCase import com.wire.kalium.logic.feature.call.usecase.ObserveEstablishedCallsUseCase import com.wire.kalium.logic.feature.call.usecase.ObserveSpeakerUseCase import com.wire.kalium.logic.feature.call.usecase.TurnLoudSpeakerOffUseCase -import dagger.hilt.android.scopes.ViewModelScoped import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.launch -import javax.inject.Inject - -@ViewModelScoped +import dev.zacsweers.metro.Inject class HangUpCallUseCase @Inject constructor( @ApplicationScope private val coroutineScope: CoroutineScope, private val observeEstablishedCalls: ObserveEstablishedCallsUseCase, diff --git a/app/src/main/kotlin/com/wire/android/ui/common/CommonViewModelFactory.kt b/app/src/main/kotlin/com/wire/android/ui/common/CommonViewModelFactory.kt index 0788ad9ebad..d2efc516cea 100644 --- a/app/src/main/kotlin/com/wire/android/ui/common/CommonViewModelFactory.kt +++ b/app/src/main/kotlin/com/wire/android/ui/common/CommonViewModelFactory.kt @@ -57,8 +57,7 @@ import com.wire.kalium.logic.feature.conversation.folder.RemoveConversationFromF import com.wire.kalium.logic.feature.team.DeleteTeamConversationUseCase import com.wire.kalium.logic.feature.user.IsPreventAdminlessGroupsEnabledUseCase import com.wire.kalium.logic.feature.user.ObserveSelfUserUseCase -import dagger.Lazy -import javax.inject.Inject +import dev.zacsweers.metro.Inject interface CommonViewModelGraph : MetroViewModelGraph { val commonViewModelFactory: CommonViewModelFactory @@ -131,7 +130,7 @@ class CommonViewModelFactory @Inject constructor( ) fun securityClassificationViewModel(args: SecurityClassificationArgs) = SecurityClassificationViewModelImpl( - coreLogic = coreLogic.get(), + coreLogic = coreLogic.value, args = args, ) diff --git a/app/src/main/kotlin/com/wire/android/ui/common/banner/SecurityClassificationViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/common/banner/SecurityClassificationViewModel.kt index 06ad9a11291..ef05467af01 100644 --- a/app/src/main/kotlin/com/wire/android/ui/common/banner/SecurityClassificationViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/common/banner/SecurityClassificationViewModel.kt @@ -33,7 +33,6 @@ import com.wire.kalium.logic.feature.session.CurrentSessionResult import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.launch - @ViewModelScopedPreview interface SecurityClassificationViewModel { fun state(): SecurityClassificationType = SecurityClassificationType.NONE diff --git a/app/src/main/kotlin/com/wire/android/ui/common/bottomsheet/conversation/ConversationOptionsMenuViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/common/bottomsheet/conversation/ConversationOptionsMenuViewModel.kt index 9c6c1fe9698..0b3107ade80 100644 --- a/app/src/main/kotlin/com/wire/android/ui/common/bottomsheet/conversation/ConversationOptionsMenuViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/common/bottomsheet/conversation/ConversationOptionsMenuViewModel.kt @@ -79,7 +79,6 @@ import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import java.util.concurrent.ConcurrentHashMap - @ViewModelScopedPreview interface ConversationOptionsMenuViewModel : ActionsManager { val leaveGroupDialogState: VisibilityState get() = VisibilityState() diff --git a/app/src/main/kotlin/com/wire/android/ui/common/topappbar/CommonTopAppBarViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/common/topappbar/CommonTopAppBarViewModel.kt index 88748c43e61..3a9e50ed5ee 100644 --- a/app/src/main/kotlin/com/wire/android/ui/common/topappbar/CommonTopAppBarViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/common/topappbar/CommonTopAppBarViewModel.kt @@ -36,7 +36,6 @@ import com.wire.kalium.logic.data.sync.SyncState.Waiting import com.wire.kalium.logic.data.user.UserId import com.wire.kalium.logic.feature.session.CurrentSessionResult import com.wire.kalium.network.NetworkState -import dagger.Lazy import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.combine @@ -60,8 +59,8 @@ class CommonTopAppBarViewModel( currentScreenManager.observeCurrentScreen(viewModelScope) private fun connectivityFlow(userId: UserId): Flow = - coreLogic.get().sessionScope(userId) { - combine(observeSyncState(), coreLogic.get().networkStateObserver.observeNetworkState()) { syncState, networkState -> + coreLogic.value.sessionScope(userId) { + combine(observeSyncState(), coreLogic.value.networkStateObserver.observeNetworkState()) { syncState, networkState -> when { // Waiting is a pure pre-initialization state: the sync worker has not been // scheduled yet. It carries no information about network health, so map it @@ -92,7 +91,7 @@ class CommonTopAppBarViewModel( @VisibleForTesting internal suspend fun activeCallsFlow(userId: UserId): Flow> = when { !params.showActiveCalls -> flowOf(emptyList()) // assume list is always empty to not show it on the bar - else -> coreLogic.get().sessionScope(userId) { // otherwise observe real calls to show them on the bar + else -> coreLogic.value.sessionScope(userId) { // otherwise observe real calls to show them on the bar combine( calls.establishedCall(), calls.getIncomingCalls(), @@ -105,7 +104,7 @@ class CommonTopAppBarViewModel( init { viewModelScope.launch { - coreLogic.get().globalScope { + coreLogic.value.globalScope { session.currentSessionFlow() .flatMapLatest { when (it) { @@ -144,7 +143,7 @@ class CommonTopAppBarViewModel( state = state.copy(connectivityState = connectivityUIState) } } - coreLogic.get().networkStateObserver.observeNetworkState().collectLatest { + coreLogic.value.networkStateObserver.observeNetworkState().collectLatest { state = state.copy(networkState = it) } } diff --git a/app/src/main/kotlin/com/wire/android/ui/debug/DebugInfoViewModelFactory.kt b/app/src/main/kotlin/com/wire/android/ui/debug/DebugInfoViewModelFactory.kt index 5916fe23b30..7182b7b46bf 100644 --- a/app/src/main/kotlin/com/wire/android/ui/debug/DebugInfoViewModelFactory.kt +++ b/app/src/main/kotlin/com/wire/android/ui/debug/DebugInfoViewModelFactory.kt @@ -58,8 +58,8 @@ import com.wire.kalium.logic.feature.user.GetDefaultProtocolUseCase import com.wire.kalium.logic.feature.user.SelfServerConfigUseCase import com.wire.kalium.logic.sync.periodic.UpdateApiVersionsScheduler import com.wire.kalium.logic.sync.slow.RestartSlowSyncProcessForRecoveryUseCase -import dagger.hilt.android.qualifiers.ApplicationContext -import javax.inject.Inject +import com.wire.android.di.ApplicationContext +import dev.zacsweers.metro.Inject @Suppress("LongParameterList") class DebugInfoViewModelFactory @Inject constructor( diff --git a/app/src/main/kotlin/com/wire/android/ui/debug/ExportObfuscatedCopyViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/debug/ExportObfuscatedCopyViewModel.kt index e749864e49c..4dc18fda169 100644 --- a/app/src/main/kotlin/com/wire/android/ui/debug/ExportObfuscatedCopyViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/debug/ExportObfuscatedCopyViewModel.kt @@ -40,7 +40,6 @@ import com.wire.kalium.logic.feature.backup.CreateObfuscatedCopyUseCase import com.wire.kalium.util.DelicateKaliumApi import kotlinx.coroutines.launch import kotlinx.coroutines.withContext - @ViewModelScopedPreview interface ExportObfuscatedCopyViewModel { diff --git a/app/src/main/kotlin/com/wire/android/ui/debug/StartServiceReceiver.kt b/app/src/main/kotlin/com/wire/android/ui/debug/StartServiceReceiver.kt index 93dd70ce2ce..5428eb08eae 100644 --- a/app/src/main/kotlin/com/wire/android/ui/debug/StartServiceReceiver.kt +++ b/app/src/main/kotlin/com/wire/android/ui/debug/StartServiceReceiver.kt @@ -22,18 +22,17 @@ import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import com.wire.android.appLogger +import com.wire.android.di.metro.wireApplicationGraph import com.wire.android.feature.StartPersistentWebsocketIfNecessaryUseCase import com.wire.android.util.dispatchers.DispatcherProvider -import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.launch -import javax.inject.Inject +import dev.zacsweers.metro.Inject /** * This BroadcastReceiver will restart the persistentWebSocket Service after restarting the device. */ -@AndroidEntryPoint class StartServiceReceiver : BroadcastReceiver() { @Inject lateinit var dispatcherProvider: DispatcherProvider @@ -46,6 +45,7 @@ class StartServiceReceiver : BroadcastReceiver() { } override fun onReceive(context: Context?, intent: Intent?) { + context?.wireApplicationGraph?.inject(this) appLogger.i("$TAG: onReceive called with action ${intent?.action}") scope.launch { startPersistentWebSocketService() } } diff --git a/app/src/main/kotlin/com/wire/android/ui/home/HomeViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/home/HomeViewModel.kt index 071d16d4b30..95d02c73bb9 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/HomeViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/HomeViewModel.kt @@ -38,7 +38,6 @@ import com.wire.kalium.logic.feature.personaltoteamaccount.CanMigrateFromPersona import com.wire.kalium.logic.feature.session.CurrentSessionFlowUseCase import com.wire.kalium.logic.feature.session.CurrentSessionResult import com.wire.kalium.logic.feature.user.ObserveSelfUserUseCase -import dagger.Lazy import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.first @@ -130,7 +129,7 @@ class HomeViewModel( } private suspend fun isLoggedOut(): Boolean { - val accountInfo = (currentSessionFlow.get().invoke().firstOrNull() as? CurrentSessionResult.Success)?.accountInfo + val accountInfo = (currentSessionFlow.value.invoke().firstOrNull() as? CurrentSessionResult.Success)?.accountInfo return accountInfo !is AccountInfo.Valid } } diff --git a/app/src/main/kotlin/com/wire/android/ui/home/HomeViewModelFactory.kt b/app/src/main/kotlin/com/wire/android/ui/home/HomeViewModelFactory.kt index 929cff95153..653eeb4f84b 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/HomeViewModelFactory.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/HomeViewModelFactory.kt @@ -56,8 +56,7 @@ import com.wire.kalium.logic.feature.user.GetSelfUserUseCase import com.wire.kalium.logic.feature.user.GetSelfTeamIdUseCase import com.wire.kalium.logic.feature.user.ObserveSelfUserUseCase import com.wire.kalium.logic.sync.ForegroundActionsUseCase -import dagger.Lazy -import javax.inject.Inject +import dev.zacsweers.metro.Inject @Suppress("LongParameterList") class HomeViewModelFactory @Inject constructor( diff --git a/app/src/main/kotlin/com/wire/android/ui/home/appLock/LockCodeTimeManager.kt b/app/src/main/kotlin/com/wire/android/ui/home/appLock/LockCodeTimeManager.kt index 542e59f8d88..c3b8aac7662 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/appLock/LockCodeTimeManager.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/appLock/LockCodeTimeManager.kt @@ -38,8 +38,9 @@ import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking -import javax.inject.Inject -import javax.inject.Singleton +import dev.zacsweers.metro.Inject +import dev.zacsweers.metro.AppScope +import dev.zacsweers.metro.SingleIn /** * AppLockManager provides a mechanism to determine if the app should be locked based on configuration and screen state. @@ -50,7 +51,7 @@ import javax.inject.Singleton * - false if brought back to the foreground before the delay. */ -@Singleton +@SingleIn(AppScope::class) class LockCodeTimeManager @Inject constructor( @ApplicationScope private val appCoroutineScope: CoroutineScope, currentScreenManager: CurrentScreenManager, diff --git a/app/src/main/kotlin/com/wire/android/ui/home/appLock/forgot/ForgotLockScreenViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/home/appLock/forgot/ForgotLockScreenViewModel.kt index 69dc2e6c9d1..9ce9a9b8502 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/appLock/forgot/ForgotLockScreenViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/appLock/forgot/ForgotLockScreenViewModel.kt @@ -39,7 +39,7 @@ import com.wire.kalium.logic.feature.session.GetSessionsUseCase import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.joinAll import kotlinx.coroutines.launch -import javax.inject.Inject +import dev.zacsweers.metro.Inject @Suppress("LongParameterList") class ForgotLockScreenViewModel @Inject constructor( diff --git a/app/src/main/kotlin/com/wire/android/ui/home/appLock/set/SetLockScreenViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/home/appLock/set/SetLockScreenViewModel.kt index 5e92c3448f9..06635c24982 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/appLock/set/SetLockScreenViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/appLock/set/SetLockScreenViewModel.kt @@ -35,7 +35,7 @@ import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.combine import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -import javax.inject.Inject +import dev.zacsweers.metro.Inject class SetLockScreenViewModel @Inject constructor( private val validatePassword: ValidatePasswordUseCase, diff --git a/app/src/main/kotlin/com/wire/android/ui/home/appLock/unlock/AppUnlockWithBiometricsViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/home/appLock/unlock/AppUnlockWithBiometricsViewModel.kt index 6f53b3c45be..5fb11677510 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/appLock/unlock/AppUnlockWithBiometricsViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/appLock/unlock/AppUnlockWithBiometricsViewModel.kt @@ -19,7 +19,7 @@ package com.wire.android.ui.home.appLock.unlock import androidx.lifecycle.ViewModel import com.wire.android.ui.home.appLock.LockCodeTimeManager -import javax.inject.Inject +import dev.zacsweers.metro.Inject class AppUnlockWithBiometricsViewModel @Inject constructor( private val lockCodeTimeManager: LockCodeTimeManager diff --git a/app/src/main/kotlin/com/wire/android/ui/home/appLock/unlock/EnterLockScreenViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/home/appLock/unlock/EnterLockScreenViewModel.kt index 7f39b0b83a1..93255aed26e 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/appLock/unlock/EnterLockScreenViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/appLock/unlock/EnterLockScreenViewModel.kt @@ -33,7 +33,7 @@ import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -import javax.inject.Inject +import dev.zacsweers.metro.Inject class EnterLockScreenViewModel @Inject constructor( private val validatePassword: ValidatePasswordUseCase, diff --git a/app/src/main/kotlin/com/wire/android/ui/home/conversations/CompositeMessageViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/home/conversations/CompositeMessageViewModel.kt index 28133679b48..c48664035a5 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/conversations/CompositeMessageViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/conversations/CompositeMessageViewModel.kt @@ -31,7 +31,6 @@ import com.wire.kalium.logic.data.id.MessageButtonId import com.wire.kalium.logic.data.id.QualifiedID import com.wire.kalium.logic.feature.message.composite.SendButtonActionMessageUseCase import kotlinx.coroutines.launch - @ViewModelScopedPreview interface CompositeMessageViewModel { val pendingButtonId: MessageButtonId? diff --git a/app/src/main/kotlin/com/wire/android/ui/home/conversations/ConversationCoreViewModelFactory.kt b/app/src/main/kotlin/com/wire/android/ui/home/conversations/ConversationCoreViewModelFactory.kt index 354b41216df..5041381034d 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/conversations/ConversationCoreViewModelFactory.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/conversations/ConversationCoreViewModelFactory.kt @@ -112,7 +112,7 @@ import com.wire.kalium.logic.feature.e2ei.usecase.FetchConversationMLSVerificati import com.wire.kalium.logic.feature.user.IsFileSharingEnabledUseCase import com.wire.kalium.logic.featureFlags.KaliumConfigs import com.wire.kalium.network.NetworkStateObserver -import javax.inject.Inject +import dev.zacsweers.metro.Inject @Suppress("LongParameterList", "TooManyFunctions") class ConversationCoreViewModelFactory @Inject constructor( diff --git a/app/src/main/kotlin/com/wire/android/ui/home/conversations/ConversationDetailsViewModelFactory.kt b/app/src/main/kotlin/com/wire/android/ui/home/conversations/ConversationDetailsViewModelFactory.kt index 2b82da4a037..5e62c3dd98a 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/conversations/ConversationDetailsViewModelFactory.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/conversations/ConversationDetailsViewModelFactory.kt @@ -53,7 +53,7 @@ import com.wire.kalium.logic.feature.user.ObserveSelfUserUseCase import com.wire.kalium.logic.feature.user.ObserveSelfUserWithTeamUseCase import com.wire.kalium.logic.feature.user.guestroomlink.ObserveGuestRoomLinkFeatureFlagUseCase import com.wire.kalium.logic.util.RandomPassword -import javax.inject.Inject +import dev.zacsweers.metro.Inject @Suppress("LongParameterList") class ConversationDetailsViewModelFactory @Inject constructor( diff --git a/app/src/main/kotlin/com/wire/android/ui/home/conversations/ConversationSearchFolderViewModelFactory.kt b/app/src/main/kotlin/com/wire/android/ui/home/conversations/ConversationSearchFolderViewModelFactory.kt index 529948f14da..836dbc6d573 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/conversations/ConversationSearchFolderViewModelFactory.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/conversations/ConversationSearchFolderViewModelFactory.kt @@ -50,7 +50,7 @@ import com.wire.kalium.logic.feature.service.ObserveAllServicesUseCase import com.wire.kalium.logic.feature.service.SearchServicesByNameUseCase import com.wire.kalium.logic.feature.service.SyncServicesUseCase import com.wire.kalium.logic.feature.user.ObserveSelfUserUseCase -import javax.inject.Inject +import dev.zacsweers.metro.Inject @Suppress("LongParameterList") class ConversationSearchFolderViewModelFactory @Inject constructor( diff --git a/app/src/main/kotlin/com/wire/android/ui/home/conversations/MessageSharedState.kt b/app/src/main/kotlin/com/wire/android/ui/home/conversations/MessageSharedState.kt index d03403f6c93..633b54568da 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/conversations/MessageSharedState.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/conversations/MessageSharedState.kt @@ -20,7 +20,7 @@ package com.wire.android.ui.home.conversations import com.wire.android.ui.home.conversations.model.AssetBundle import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableSharedFlow -import javax.inject.Inject +import dev.zacsweers.metro.Inject /** * WARNING: diff --git a/app/src/main/kotlin/com/wire/android/ui/home/conversations/ScopedMessageViewModelFactory.kt b/app/src/main/kotlin/com/wire/android/ui/home/conversations/ScopedMessageViewModelFactory.kt index 1f29beeb14c..2578de25199 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/conversations/ScopedMessageViewModelFactory.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/conversations/ScopedMessageViewModelFactory.kt @@ -51,8 +51,8 @@ import com.wire.kalium.logic.feature.message.ObserveMessageByIdUseCase import com.wire.kalium.logic.feature.message.composite.SendButtonActionMessageUseCase import com.wire.kalium.logic.feature.selfDeletingMessages.ObserveSelfDeletionTimerSettingsForConversationUseCase import com.wire.kalium.logic.feature.user.IsFileSharingEnabledUseCase -import dagger.hilt.android.qualifiers.ApplicationContext -import javax.inject.Inject +import com.wire.android.di.ApplicationContext +import dev.zacsweers.metro.Inject @Suppress("LongParameterList") class ScopedMessageViewModelFactory @Inject constructor( diff --git a/app/src/main/kotlin/com/wire/android/ui/home/conversations/banner/usecase/ObserveConversationMembersByTypesUseCase.kt b/app/src/main/kotlin/com/wire/android/ui/home/conversations/banner/usecase/ObserveConversationMembersByTypesUseCase.kt index 9d0f7d179bf..04258ae988d 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/conversations/banner/usecase/ObserveConversationMembersByTypesUseCase.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/conversations/banner/usecase/ObserveConversationMembersByTypesUseCase.kt @@ -26,7 +26,7 @@ import com.wire.kalium.logic.feature.conversation.ObserveConversationMembersUseC import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.map -import javax.inject.Inject +import dev.zacsweers.metro.Inject class ObserveConversationMembersByTypesUseCase @Inject constructor( private val observeConversationMembers: ObserveConversationMembersUseCase, diff --git a/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/participants/usecase/ObserveConversationRoleForUserUseCase.kt b/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/participants/usecase/ObserveConversationRoleForUserUseCase.kt index 6e572331e57..bee4652dd76 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/participants/usecase/ObserveConversationRoleForUserUseCase.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/participants/usecase/ObserveConversationRoleForUserUseCase.kt @@ -32,7 +32,7 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.filterIsInstance import kotlinx.coroutines.flow.map -import javax.inject.Inject +import dev.zacsweers.metro.Inject /** * TODO: Move to Kalium's logic or similar diff --git a/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/participants/usecase/ObserveParticipantsForConversationUseCase.kt b/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/participants/usecase/ObserveParticipantsForConversationUseCase.kt index 100ee28a4cd..f0fad1a2252 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/participants/usecase/ObserveParticipantsForConversationUseCase.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/participants/usecase/ObserveParticipantsForConversationUseCase.kt @@ -38,7 +38,7 @@ import kotlinx.coroutines.flow.drop import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.scan -import javax.inject.Inject +import dev.zacsweers.metro.Inject class ObserveParticipantsForConversationUseCase @Inject constructor( private val observeConversationMembers: ObserveConversationMembersUseCase, diff --git a/app/src/main/kotlin/com/wire/android/ui/home/conversations/edit/MessageOptionsMenuViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/home/conversations/edit/MessageOptionsMenuViewModel.kt index 1df67513cb1..771a23760b3 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/conversations/edit/MessageOptionsMenuViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/conversations/edit/MessageOptionsMenuViewModel.kt @@ -36,7 +36,6 @@ import kotlinx.coroutines.flow.onCompletion import kotlinx.coroutines.flow.stateIn import kotlinx.serialization.Serializable import java.util.concurrent.ConcurrentHashMap - @ViewModelScopedPreview interface MessageOptionsMenuViewModel { fun observeMessageStateFlow(messageId: String): StateFlow = diff --git a/app/src/main/kotlin/com/wire/android/ui/home/conversations/folder/ConversationFoldersVM.kt b/app/src/main/kotlin/com/wire/android/ui/home/conversations/folder/ConversationFoldersVM.kt index db6b4717d01..51a7b3bc84c 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/conversations/folder/ConversationFoldersVM.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/conversations/folder/ConversationFoldersVM.kt @@ -30,7 +30,6 @@ import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.toPersistentList import kotlinx.coroutines.launch import kotlinx.serialization.Serializable - @ViewModelScopedPreview interface ConversationFoldersVM { fun state(): ConversationFoldersState = ConversationFoldersState(persistentListOf()) diff --git a/app/src/main/kotlin/com/wire/android/ui/home/conversations/folder/MoveConversationToFolderVM.kt b/app/src/main/kotlin/com/wire/android/ui/home/conversations/folder/MoveConversationToFolderVM.kt index bc9ca01349b..7085745162f 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/conversations/folder/MoveConversationToFolderVM.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/conversations/folder/MoveConversationToFolderVM.kt @@ -35,7 +35,6 @@ import kotlinx.coroutines.flow.asSharedFlow import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import kotlinx.serialization.Serializable - @ViewModelScopedPreview interface MoveConversationToFolderVM { val infoMessage: SharedFlow diff --git a/app/src/main/kotlin/com/wire/android/ui/home/conversations/messagedetails/usecase/ObserveReactionsForMessageUseCase.kt b/app/src/main/kotlin/com/wire/android/ui/home/conversations/messagedetails/usecase/ObserveReactionsForMessageUseCase.kt index 7c366bff401..cb003c33ed5 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/conversations/messagedetails/usecase/ObserveReactionsForMessageUseCase.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/conversations/messagedetails/usecase/ObserveReactionsForMessageUseCase.kt @@ -27,7 +27,7 @@ import com.wire.kalium.logic.feature.message.ObserveMessageReactionsUseCase import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.map -import javax.inject.Inject +import dev.zacsweers.metro.Inject class ObserveReactionsForMessageUseCase @Inject constructor( private val observeMessageReactions: ObserveMessageReactionsUseCase, diff --git a/app/src/main/kotlin/com/wire/android/ui/home/conversations/messagedetails/usecase/ObserveReceiptsForMessageUseCase.kt b/app/src/main/kotlin/com/wire/android/ui/home/conversations/messagedetails/usecase/ObserveReceiptsForMessageUseCase.kt index b0465bbc21b..d4e16770f47 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/conversations/messagedetails/usecase/ObserveReceiptsForMessageUseCase.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/conversations/messagedetails/usecase/ObserveReceiptsForMessageUseCase.kt @@ -27,7 +27,7 @@ import com.wire.kalium.logic.feature.message.ObserveMessageReceiptsUseCase import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.map -import javax.inject.Inject +import dev.zacsweers.metro.Inject class ObserveReceiptsForMessageUseCase @Inject constructor( private val observeMessageReceipts: ObserveMessageReceiptsUseCase, diff --git a/app/src/main/kotlin/com/wire/android/ui/home/conversations/typing/TypingIndicatorViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/home/conversations/typing/TypingIndicatorViewModel.kt index 94ef1242f4f..a96b3e7297f 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/conversations/typing/TypingIndicatorViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/conversations/typing/TypingIndicatorViewModel.kt @@ -28,7 +28,6 @@ import com.wire.android.ui.home.conversations.usecase.ObserveUsersTypingInConver import com.wire.kalium.logic.data.id.QualifiedID import kotlinx.coroutines.launch import kotlinx.serialization.Serializable - @ViewModelScopedPreview interface TypingIndicatorViewModel { fun state(): UsersTypingViewState = UsersTypingViewState() diff --git a/app/src/main/kotlin/com/wire/android/ui/home/conversations/usecase/GetAssetMessagesFromConversationUseCase.kt b/app/src/main/kotlin/com/wire/android/ui/home/conversations/usecase/GetAssetMessagesFromConversationUseCase.kt index fab1e4ab1ab..686489b985d 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/conversations/usecase/GetAssetMessagesFromConversationUseCase.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/conversations/usecase/GetAssetMessagesFromConversationUseCase.kt @@ -33,7 +33,7 @@ import kotlinx.coroutines.flow.map import kotlinx.datetime.Instant import kotlinx.datetime.TimeZone import kotlinx.datetime.toLocalDateTime -import javax.inject.Inject +import dev.zacsweers.metro.Inject import kotlin.math.max class GetAssetMessagesFromConversationUseCase @Inject constructor( diff --git a/app/src/main/kotlin/com/wire/android/ui/home/conversations/usecase/GetConversationMessagesFromSearchUseCase.kt b/app/src/main/kotlin/com/wire/android/ui/home/conversations/usecase/GetConversationMessagesFromSearchUseCase.kt index cc40c6b6114..5bb1b8b4e73 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/conversations/usecase/GetConversationMessagesFromSearchUseCase.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/conversations/usecase/GetConversationMessagesFromSearchUseCase.kt @@ -29,7 +29,7 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.map -import javax.inject.Inject +import dev.zacsweers.metro.Inject import kotlin.math.max class GetConversationMessagesFromSearchUseCase @Inject constructor( diff --git a/app/src/main/kotlin/com/wire/android/ui/home/conversations/usecase/GetConversationsFromSearchUseCase.kt b/app/src/main/kotlin/com/wire/android/ui/home/conversations/usecase/GetConversationsFromSearchUseCase.kt index 3ec0a227421..8778a8f4452 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/conversations/usecase/GetConversationsFromSearchUseCase.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/conversations/usecase/GetConversationsFromSearchUseCase.kt @@ -42,7 +42,7 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.map -import javax.inject.Inject +import dev.zacsweers.metro.Inject class GetConversationsFromSearchUseCase @Inject constructor( private val useCase: GetPaginatedFlowOfConversationDetailsWithEventsBySearchQueryUseCase, diff --git a/app/src/main/kotlin/com/wire/android/ui/home/conversations/usecase/GetMessagesForConversationUseCase.kt b/app/src/main/kotlin/com/wire/android/ui/home/conversations/usecase/GetMessagesForConversationUseCase.kt index 12ea1ff312d..8c74c06f321 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/conversations/usecase/GetMessagesForConversationUseCase.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/conversations/usecase/GetMessagesForConversationUseCase.kt @@ -30,7 +30,7 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.map import java.lang.Integer.max -import javax.inject.Inject +import dev.zacsweers.metro.Inject class GetMessagesForConversationUseCase @Inject constructor( private val getMessages: GetPaginatedFlowOfMessagesByConversationUseCase, diff --git a/app/src/main/kotlin/com/wire/android/ui/home/conversations/usecase/GetQuoteMessageForConversationUseCase.kt b/app/src/main/kotlin/com/wire/android/ui/home/conversations/usecase/GetQuoteMessageForConversationUseCase.kt index b506dd50812..577e7454a1a 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/conversations/usecase/GetQuoteMessageForConversationUseCase.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/conversations/usecase/GetQuoteMessageForConversationUseCase.kt @@ -28,7 +28,7 @@ import com.wire.kalium.logic.data.id.ConversationId import com.wire.kalium.logic.data.message.Message import com.wire.kalium.logic.feature.message.GetMessageByIdUseCase import kotlinx.coroutines.withContext -import javax.inject.Inject +import dev.zacsweers.metro.Inject class GetQuoteMessageForConversationUseCase @Inject constructor( private val getMessageById: GetMessageByIdUseCase, diff --git a/app/src/main/kotlin/com/wire/android/ui/home/conversations/usecase/GetUsersForMessageUseCase.kt b/app/src/main/kotlin/com/wire/android/ui/home/conversations/usecase/GetUsersForMessageUseCase.kt index 5d7e24b047d..b71688f643e 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/conversations/usecase/GetUsersForMessageUseCase.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/conversations/usecase/GetUsersForMessageUseCase.kt @@ -25,7 +25,7 @@ import com.wire.kalium.logic.feature.conversation.ObserveUserListByIdUseCase import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.mapLatest -import javax.inject.Inject +import dev.zacsweers.metro.Inject class GetUsersForMessageUseCase @Inject constructor( private val observeMemberDetailsByIds: ObserveUserListByIdUseCase, diff --git a/app/src/main/kotlin/com/wire/android/ui/home/conversations/usecase/HandleUriAssetUseCase.kt b/app/src/main/kotlin/com/wire/android/ui/home/conversations/usecase/HandleUriAssetUseCase.kt index eb04dac45c4..3ddfa0cbd2c 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/conversations/usecase/HandleUriAssetUseCase.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/conversations/usecase/HandleUriAssetUseCase.kt @@ -26,7 +26,7 @@ import com.wire.kalium.logic.data.asset.KaliumFileSystem import com.wire.kalium.logic.feature.asset.GetAssetSizeLimitUseCase import kotlinx.coroutines.withContext import java.util.UUID -import javax.inject.Inject +import dev.zacsweers.metro.Inject class HandleUriAssetUseCase @Inject constructor( private val getAssetSizeLimit: GetAssetSizeLimitUseCase, diff --git a/app/src/main/kotlin/com/wire/android/ui/home/conversations/usecase/ObserveImageAssetMessagesFromConversationUseCase.kt b/app/src/main/kotlin/com/wire/android/ui/home/conversations/usecase/ObserveImageAssetMessagesFromConversationUseCase.kt index 3e4964c2229..55b85ce11cb 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/conversations/usecase/ObserveImageAssetMessagesFromConversationUseCase.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/conversations/usecase/ObserveImageAssetMessagesFromConversationUseCase.kt @@ -32,7 +32,7 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.map import kotlinx.datetime.toLocalDateTime -import javax.inject.Inject +import dev.zacsweers.metro.Inject import kotlin.math.max class ObserveImageAssetMessagesFromConversationUseCase @Inject constructor( diff --git a/app/src/main/kotlin/com/wire/android/ui/home/conversations/usecase/ObserveMessageForConversationUseCase.kt b/app/src/main/kotlin/com/wire/android/ui/home/conversations/usecase/ObserveMessageForConversationUseCase.kt index ac881359c94..43b111bfc1d 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/conversations/usecase/ObserveMessageForConversationUseCase.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/conversations/usecase/ObserveMessageForConversationUseCase.kt @@ -27,7 +27,7 @@ import com.wire.kalium.logic.feature.message.ObserveMessageByIdUseCase import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.map -import javax.inject.Inject +import dev.zacsweers.metro.Inject class ObserveMessageForConversationUseCase @Inject constructor( private val observeMessage: ObserveMessageByIdUseCase, diff --git a/app/src/main/kotlin/com/wire/android/ui/home/conversations/usecase/ObserveQuoteMessageForConversationUseCase.kt b/app/src/main/kotlin/com/wire/android/ui/home/conversations/usecase/ObserveQuoteMessageForConversationUseCase.kt index 0fcf55319aa..4f93b06096e 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/conversations/usecase/ObserveQuoteMessageForConversationUseCase.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/conversations/usecase/ObserveQuoteMessageForConversationUseCase.kt @@ -29,7 +29,7 @@ import com.wire.kalium.logic.data.message.Message import com.wire.kalium.logic.feature.message.ObserveMessageByIdUseCase import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.map -import javax.inject.Inject +import dev.zacsweers.metro.Inject class ObserveQuoteMessageForConversationUseCase @Inject constructor( private val observeMessageById: ObserveMessageByIdUseCase, diff --git a/app/src/main/kotlin/com/wire/android/ui/home/conversations/usecase/ObserveUsersTypingInConversationUseCase.kt b/app/src/main/kotlin/com/wire/android/ui/home/conversations/usecase/ObserveUsersTypingInConversationUseCase.kt index 67204e29bd8..455fe3302ed 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/conversations/usecase/ObserveUsersTypingInConversationUseCase.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/conversations/usecase/ObserveUsersTypingInConversationUseCase.kt @@ -23,7 +23,7 @@ import com.wire.kalium.logic.data.id.ConversationId import com.wire.kalium.logic.feature.conversation.ObserveUsersTypingUseCase import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map -import javax.inject.Inject +import dev.zacsweers.metro.Inject class ObserveUsersTypingInConversationUseCase @Inject constructor( private val observeUsersTyping: ObserveUsersTypingUseCase, diff --git a/app/src/main/kotlin/com/wire/android/ui/home/drawer/HomeDrawerViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/home/drawer/HomeDrawerViewModel.kt index 3c19028126e..295c131d4b0 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/drawer/HomeDrawerViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/drawer/HomeDrawerViewModel.kt @@ -32,7 +32,6 @@ import com.wire.kalium.logic.feature.client.IsWireCellsEnabledUseCase import com.wire.kalium.logic.feature.conversation.ObserveArchivedUnreadConversationsCountUseCase import com.wire.kalium.logic.feature.server.GetTeamUrlUseCase import com.wire.kalium.logic.feature.user.ObserveSelfUserUseCase -import dagger.Lazy import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.flowOf @@ -69,7 +68,7 @@ class HomeDrawerViewModel( viewModelScope.launch { combine( flowOf(isWireCellsEnabled()), - observeArchivedUnreadConversationsCount.get().invoke(), + observeArchivedUnreadConversationsCount.value.invoke(), observeTeamManagementUrlForUser() ) { wireCellsEnabled, unreadArchiveConversationsCount, teamManagementUrl -> buildList { diff --git a/app/src/main/kotlin/com/wire/android/ui/home/messagecomposer/actions/SelfDeletingMessageActionViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/home/messagecomposer/actions/SelfDeletingMessageActionViewModel.kt index 49b8654553c..f95c5903434 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/messagecomposer/actions/SelfDeletingMessageActionViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/messagecomposer/actions/SelfDeletingMessageActionViewModel.kt @@ -31,7 +31,6 @@ import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.launch import kotlinx.coroutines.withContext - @ViewModelScopedPreview interface SelfDeletingMessageActionViewModel { fun state(): SelfDeletionTimer = SelfDeletionTimer.Disabled diff --git a/app/src/main/kotlin/com/wire/android/ui/home/messagecomposer/attachments/IsFileSharingEnabledViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/home/messagecomposer/attachments/IsFileSharingEnabledViewModel.kt index 996d91ae9bb..5f9bf45ce98 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/messagecomposer/attachments/IsFileSharingEnabledViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/messagecomposer/attachments/IsFileSharingEnabledViewModel.kt @@ -27,7 +27,6 @@ import com.wire.android.di.ViewModelScopedPreview import com.wire.kalium.logic.configuration.FileSharingStatus import com.wire.kalium.logic.feature.user.IsFileSharingEnabledUseCase import kotlinx.coroutines.launch - @ViewModelScopedPreview interface IsFileSharingEnabledViewModel { fun isFileSharingEnabled(): Boolean = true diff --git a/app/src/main/kotlin/com/wire/android/ui/home/messagecomposer/location/GeocoderHelper.kt b/app/src/main/kotlin/com/wire/android/ui/home/messagecomposer/location/GeocoderHelper.kt index 78fe7939e2f..e51b1d5b004 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/messagecomposer/location/GeocoderHelper.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/messagecomposer/location/GeocoderHelper.kt @@ -19,7 +19,7 @@ package com.wire.android.ui.home.messagecomposer.location import android.location.Geocoder import android.location.Location -import javax.inject.Inject +import dev.zacsweers.metro.Inject class GeocoderHelper @Inject constructor(private val geocoder: Geocoder) { diff --git a/app/src/main/kotlin/com/wire/android/ui/home/messagecomposer/location/LocationPickerHelper.kt b/app/src/main/kotlin/com/wire/android/ui/home/messagecomposer/location/LocationPickerHelper.kt index 4a6496d2e97..0dcf4e1ac61 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/messagecomposer/location/LocationPickerHelper.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/messagecomposer/location/LocationPickerHelper.kt @@ -31,13 +31,13 @@ import com.wire.android.appLogger import com.wire.android.di.ApplicationScope import com.wire.android.util.CurrentTimeProvider import com.wire.kalium.logger.KaliumLogLevel -import dagger.hilt.android.qualifiers.ApplicationContext +import com.wire.android.di.ApplicationContext import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineStart import kotlinx.coroutines.delay import kotlinx.coroutines.launch import java.util.function.Consumer -import javax.inject.Inject +import dev.zacsweers.metro.Inject import kotlin.time.Duration import kotlin.time.Duration.Companion.minutes import kotlin.time.Duration.Companion.seconds diff --git a/app/src/main/kotlin/com/wire/android/ui/home/messagecomposer/recordaudio/AudioMediaRecorder.kt b/app/src/main/kotlin/com/wire/android/ui/home/messagecomposer/recordaudio/AudioMediaRecorder.kt index 57fafe30245..fd8ae031e80 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/messagecomposer/recordaudio/AudioMediaRecorder.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/messagecomposer/recordaudio/AudioMediaRecorder.kt @@ -33,7 +33,6 @@ import com.wire.android.util.fileDateTime import com.wire.kalium.logic.data.asset.KaliumFileSystem import com.wire.kalium.logic.feature.asset.GetAssetSizeLimitUseCase.AssetSizeLimits.ASSET_SIZE_DEFAULT_LIMIT_BYTES import com.wire.kalium.util.DateTimeUtil -import dagger.hilt.android.scopes.ViewModelScoped import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job @@ -54,9 +53,7 @@ import java.io.IOException import java.io.RandomAccessFile import java.nio.ByteBuffer import java.nio.ByteOrder -import javax.inject.Inject - -@ViewModelScoped +import dev.zacsweers.metro.Inject class AudioMediaRecorder @Inject constructor( private val kaliumFileSystem: KaliumFileSystem, private val dispatcherProvider: DispatcherProvider diff --git a/app/src/main/kotlin/com/wire/android/ui/home/messagecomposer/recordaudio/GenerateAudioFileWithEffectsUseCase.kt b/app/src/main/kotlin/com/wire/android/ui/home/messagecomposer/recordaudio/GenerateAudioFileWithEffectsUseCase.kt index 454c0e5c52a..4785b6d460a 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/messagecomposer/recordaudio/GenerateAudioFileWithEffectsUseCase.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/messagecomposer/recordaudio/GenerateAudioFileWithEffectsUseCase.kt @@ -22,10 +22,11 @@ import com.waz.audioeffect.AudioEffect import com.wire.android.appLogger import com.wire.android.util.dispatchers.DispatcherProvider import kotlinx.coroutines.withContext -import javax.inject.Inject -import javax.inject.Singleton +import dev.zacsweers.metro.Inject +import dev.zacsweers.metro.AppScope +import dev.zacsweers.metro.SingleIn -@Singleton +@SingleIn(AppScope::class) class GenerateAudioFileWithEffectsUseCase @Inject constructor( private val dispatchers: DispatcherProvider, ) { diff --git a/app/src/main/kotlin/com/wire/android/ui/home/settings/SettingsViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/home/settings/SettingsViewModel.kt index 56b4771e64b..cab68f7d2b5 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/settings/SettingsViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/settings/SettingsViewModel.kt @@ -30,7 +30,7 @@ import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.shareIn import kotlinx.coroutines.launch -import javax.inject.Inject +import dev.zacsweers.metro.Inject class SettingsViewModel @Inject constructor( private val globalDataStore: GlobalDataStore, private val observeIsAppLockEditable: ObserveIsAppLockEditableUseCase, diff --git a/app/src/main/kotlin/com/wire/android/ui/home/settings/SettingsViewModelFactory.kt b/app/src/main/kotlin/com/wire/android/ui/home/settings/SettingsViewModelFactory.kt index a1921edca71..3ab2d6d90f6 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/settings/SettingsViewModelFactory.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/settings/SettingsViewModelFactory.kt @@ -77,9 +77,9 @@ import com.wire.kalium.logic.feature.user.IsPasswordRequiredUseCase import com.wire.kalium.logic.feature.user.ObserveUserInfoUseCase import com.wire.kalium.logic.feature.user.SelfServerConfigUseCase import com.wire.kalium.logic.feature.user.UpdateEmailUseCase -import dagger.hilt.android.qualifiers.ApplicationContext -import javax.inject.Inject -import javax.inject.Provider +import com.wire.android.di.ApplicationContext +import dev.zacsweers.metro.Inject +import dev.zacsweers.metro.Provider @Suppress("LongParameterList", "TooManyFunctions") class SettingsViewModelFactory @Inject constructor( @@ -137,91 +137,93 @@ class SettingsViewModelFactory @Inject constructor( private val addMemberToConversation: Provider, private val getOrCreateOneToOneConversation: Provider, ) { - fun settingsViewModel() = settingsViewModel.get() - fun myAccountViewModel() = myAccountViewModel.get() - fun deleteAccountViewModel() = deleteAccountViewModel.get() - fun changeDisplayNameViewModel() = changeDisplayNameViewModel.get() - fun changeUserColorViewModel() = changeUserColorViewModel.get() - fun changeEmailViewModel() = changeEmailViewModel.get() - fun changeHandleViewModel() = changeHandleViewModel.get() - fun customizationViewModel() = customizationViewModel.get() - fun networkSettingsViewModel() = networkSettingsViewModel.get() - fun privacySettingsViewModel() = privacySettingsViewModel.get() - fun backupAndRestoreViewModel() = backupAndRestoreViewModel.get() - fun setLockScreenViewModel() = setLockScreenViewModel.get() - fun forgotLockScreenViewModel() = forgotLockScreenViewModel.get() - fun appUnlockWithBiometricsViewModel() = appUnlockWithBiometricsViewModel.get() - fun enterLockScreenViewModel() = enterLockScreenViewModel.get() - fun selfDevicesViewModel() = selfDevicesViewModel.get() - fun avatarPickerViewModel() = avatarPickerViewModel.get() - fun selfUserProfileViewModel() = selfUserProfileViewModel.get() - fun teamMigrationViewModel() = teamMigrationViewModel.get() + fun settingsViewModel(): SettingsViewModel = settingsViewModel.invoke() + fun myAccountViewModel(): MyAccountViewModel = myAccountViewModel.invoke() + fun deleteAccountViewModel(): DeleteAccountViewModel = deleteAccountViewModel.invoke() + fun changeDisplayNameViewModel(): ChangeDisplayNameViewModel = changeDisplayNameViewModel.invoke() + fun changeUserColorViewModel(): ChangeUserColorViewModel = changeUserColorViewModel.invoke() + fun changeEmailViewModel(): ChangeEmailViewModel = changeEmailViewModel.invoke() + fun changeHandleViewModel(): ChangeHandleViewModel = changeHandleViewModel.invoke() + fun customizationViewModel(): CustomizationViewModel = customizationViewModel.invoke() + fun networkSettingsViewModel(): NetworkSettingsViewModel = networkSettingsViewModel.invoke() + fun privacySettingsViewModel(): PrivacySettingsViewModel = privacySettingsViewModel.invoke() + fun backupAndRestoreViewModel(): BackupAndRestoreViewModel = backupAndRestoreViewModel.invoke() + fun setLockScreenViewModel(): SetLockScreenViewModel = setLockScreenViewModel.invoke() + fun forgotLockScreenViewModel(): ForgotLockScreenViewModel = forgotLockScreenViewModel.invoke() + fun appUnlockWithBiometricsViewModel(): AppUnlockWithBiometricsViewModel = appUnlockWithBiometricsViewModel.invoke() + fun enterLockScreenViewModel(): EnterLockScreenViewModel = enterLockScreenViewModel.invoke() + fun selfDevicesViewModel(): SelfDevicesViewModel = selfDevicesViewModel.invoke() + fun avatarPickerViewModel(): AvatarPickerViewModel = avatarPickerViewModel.invoke() + fun selfUserProfileViewModel(): SelfUserProfileViewModel = selfUserProfileViewModel.invoke() + fun teamMigrationViewModel(): TeamMigrationViewModel = teamMigrationViewModel.invoke() - fun verifyEmailViewModel(savedStateHandle: SavedStateHandle) = VerifyEmailViewModel( - updateEmail = updateEmail.get(), + fun verifyEmailViewModel(savedStateHandle: SavedStateHandle): VerifyEmailViewModel = VerifyEmailViewModel( + updateEmail = updateEmail(), savedStateHandle = savedStateHandle, ) - fun e2eiCertificateDetailsViewModel(savedStateHandle: SavedStateHandle) = E2eiCertificateDetailsViewModel( - savedStateHandle = savedStateHandle, - getSelfUser = getSelfUser.get(), - ) + fun e2eiCertificateDetailsViewModel(savedStateHandle: SavedStateHandle): E2eiCertificateDetailsViewModel = + E2eiCertificateDetailsViewModel( + savedStateHandle = savedStateHandle, + getSelfUser = getSelfUser(), + ) - fun deviceDetailsViewModel(savedStateHandle: SavedStateHandle) = DeviceDetailsViewModel( + fun deviceDetailsViewModel(savedStateHandle: SavedStateHandle): DeviceDetailsViewModel = DeviceDetailsViewModel( savedStateHandle = savedStateHandle, - currentUserId = currentUserId.get(), - deleteClient = deleteClient.get(), - observeClientDetails = observeClientDetails.get(), - isPasswordRequired = isPasswordRequired.get(), - fingerprintUseCase = fingerprintUseCase.get(), - updateClientVerificationStatus = updateClientVerificationStatus.get(), - observeUserInfo = observeUserInfo.get(), - mlsClientIdentity = mlsClientIdentity.get(), - breakSession = breakSession.get(), - isE2EIEnabledUseCase = isE2EIEnabledUseCase.get(), + currentUserId = currentUserId(), + deleteClient = deleteClient(), + observeClientDetails = observeClientDetails(), + isPasswordRequired = isPasswordRequired(), + fingerprintUseCase = fingerprintUseCase(), + updateClientVerificationStatus = updateClientVerificationStatus(), + observeUserInfo = observeUserInfo(), + mlsClientIdentity = mlsClientIdentity(), + breakSession = breakSession(), + isE2EIEnabledUseCase = isE2EIEnabledUseCase(), ) - fun selfQRCodeViewModel(savedStateHandle: SavedStateHandle) = SelfQRCodeViewModel( + fun selfQRCodeViewModel(savedStateHandle: SavedStateHandle): SelfQRCodeViewModel = SelfQRCodeViewModel( savedStateHandle = savedStateHandle, - context = context.get(), - selfUserId = currentUserId.get(), - selfServerLinks = selfServerLinks.get(), - kaliumFileSystem = kaliumFileSystem.get(), - dispatchers = dispatchers.get(), - analyticsManager = analyticsManager.get(), + context = context(), + selfUserId = currentUserId(), + selfServerLinks = selfServerLinks(), + kaliumFileSystem = kaliumFileSystem(), + dispatchers = dispatchers(), + analyticsManager = analyticsManager(), ) - fun otherUserProfileScreenViewModel(savedStateHandle: SavedStateHandle) = OtherUserProfileScreenViewModel( - dispatchers = dispatchers.get(), - observeUserInfo = observeUserInfo.get(), - userTypeMapper = userTypeMapper.get(), - observeConversationRoleForUser = observeConversationRoleForUser.get(), - removeMemberFromConversation = removeMemberFromConversation.get(), - updateMemberRole = updateMemberRole.get(), - observeClientList = observeClientList.get(), - fetchUsersClients = fetchUsersClients.get(), - getUserE2eiCertificateStatus = getUserE2eiCertificateStatus.get(), - isOneToOneConversationCreated = isOneToOneConversationCreated.get(), - mlsClientIdentity = mlsClientIdentity.get(), - isE2EIEnabled = isE2EIEnabledUseCase.get(), - savedStateHandle = savedStateHandle, - ) + fun otherUserProfileScreenViewModel(savedStateHandle: SavedStateHandle): OtherUserProfileScreenViewModel = + OtherUserProfileScreenViewModel( + dispatchers = dispatchers(), + observeUserInfo = observeUserInfo(), + userTypeMapper = userTypeMapper(), + observeConversationRoleForUser = observeConversationRoleForUser(), + removeMemberFromConversation = removeMemberFromConversation(), + updateMemberRole = updateMemberRole(), + observeClientList = observeClientList(), + fetchUsersClients = fetchUsersClients(), + getUserE2eiCertificateStatus = getUserE2eiCertificateStatus(), + isOneToOneConversationCreated = isOneToOneConversationCreated(), + mlsClientIdentity = mlsClientIdentity(), + isE2EIEnabled = isE2EIEnabledUseCase(), + savedStateHandle = savedStateHandle, + ) - fun serviceDetailsViewModel(savedStateHandle: SavedStateHandle) = ServiceDetailsViewModelImpl( - dispatchers = dispatchers.get(), - selfUserId = currentUserId.get(), - getServiceById = getServiceById.get(), - getAppById = getAppById.get(), - observeConversationDetails = observeConversationDetails.get(), - observeIsServiceMember = observeIsServiceMember.get(), - observeIsAppMember = observeIsAppMember.get(), - observeIsAppsAllowedForUsage = observeIsAppsAllowedForUsage.get(), - observeConversationRoleForUser = observeConversationRoleForUser.get(), - removeMemberFromConversation = removeMemberFromConversation.get(), - addServiceToConversation = addServiceToConversation.get(), - addMemberToConversation = addMemberToConversation.get(), - isOneToOneConversationCreated = isOneToOneConversationCreated.get(), - getOrCreateOneToOneConversation = getOrCreateOneToOneConversation.get(), + fun serviceDetailsViewModel(savedStateHandle: SavedStateHandle): ServiceDetailsViewModelImpl = ServiceDetailsViewModelImpl( + dispatchers = dispatchers(), + selfUserId = currentUserId(), + getServiceById = getServiceById(), + getAppById = getAppById(), + observeConversationDetails = observeConversationDetails(), + observeIsServiceMember = observeIsServiceMember(), + observeIsAppMember = observeIsAppMember(), + observeIsAppsAllowedForUsage = observeIsAppsAllowedForUsage(), + observeConversationRoleForUser = observeConversationRoleForUser(), + removeMemberFromConversation = removeMemberFromConversation(), + addServiceToConversation = addServiceToConversation(), + addMemberToConversation = addMemberToConversation(), + isOneToOneConversationCreated = isOneToOneConversationCreated(), + getOrCreateOneToOneConversation = getOrCreateOneToOneConversation(), savedStateHandle = savedStateHandle, ) } diff --git a/app/src/main/kotlin/com/wire/android/ui/home/settings/account/MyAccountViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/home/settings/account/MyAccountViewModel.kt index 72a7f71c29f..0d9b420d447 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/settings/account/MyAccountViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/settings/account/MyAccountViewModel.kt @@ -41,7 +41,7 @@ import kotlinx.coroutines.flow.shareIn import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking import kotlinx.coroutines.withContext -import javax.inject.Inject +import dev.zacsweers.metro.Inject import kotlin.properties.Delegates @Suppress("LongParameterList") class MyAccountViewModel @Inject constructor( diff --git a/app/src/main/kotlin/com/wire/android/ui/home/settings/account/color/ChangeUserColorViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/home/settings/account/color/ChangeUserColorViewModel.kt index 818402288ff..42db95e1bd6 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/settings/account/color/ChangeUserColorViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/settings/account/color/ChangeUserColorViewModel.kt @@ -26,7 +26,7 @@ import com.wire.kalium.logic.feature.user.GetSelfUserUseCase import com.wire.kalium.logic.feature.user.UpdateAccentColorResult import com.wire.kalium.logic.feature.user.UpdateAccentColorUseCase import kotlinx.coroutines.launch -import javax.inject.Inject +import dev.zacsweers.metro.Inject class ChangeUserColorViewModel @Inject constructor( private val getSelf: GetSelfUserUseCase, private val updateAccentColor: UpdateAccentColorUseCase, diff --git a/app/src/main/kotlin/com/wire/android/ui/home/settings/account/deleteAccount/DeleteAccountViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/home/settings/account/deleteAccount/DeleteAccountViewModel.kt index 7c5729afc2f..92f6ded3ee7 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/settings/account/deleteAccount/DeleteAccountViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/settings/account/deleteAccount/DeleteAccountViewModel.kt @@ -23,7 +23,7 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.wire.kalium.logic.feature.user.DeleteAccountUseCase import kotlinx.coroutines.launch -import javax.inject.Inject +import dev.zacsweers.metro.Inject class DeleteAccountViewModel @Inject constructor( private val deleteAccount: DeleteAccountUseCase, ) : ViewModel() { diff --git a/app/src/main/kotlin/com/wire/android/ui/home/settings/account/displayname/ChangeDisplayNameViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/home/settings/account/displayname/ChangeDisplayNameViewModel.kt index e6858a19c11..4a50721584b 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/settings/account/displayname/ChangeDisplayNameViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/settings/account/displayname/ChangeDisplayNameViewModel.kt @@ -30,7 +30,7 @@ import com.wire.kalium.logic.feature.user.GetSelfUserUseCase import com.wire.kalium.logic.feature.user.UpdateDisplayNameUseCase import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch -import javax.inject.Inject +import dev.zacsweers.metro.Inject class ChangeDisplayNameViewModel @Inject constructor( private val getSelf: GetSelfUserUseCase, private val updateDisplayName: UpdateDisplayNameUseCase, diff --git a/app/src/main/kotlin/com/wire/android/ui/home/settings/account/email/updateEmail/ChangeEmailViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/home/settings/account/email/updateEmail/ChangeEmailViewModel.kt index 1f0f0cc1355..1defa4c8b89 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/settings/account/email/updateEmail/ChangeEmailViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/settings/account/email/updateEmail/ChangeEmailViewModel.kt @@ -30,7 +30,7 @@ import com.wire.kalium.logic.feature.user.GetSelfUserUseCase import com.wire.kalium.logic.feature.user.UpdateEmailUseCase import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch -import javax.inject.Inject +import dev.zacsweers.metro.Inject class ChangeEmailViewModel @Inject constructor( private val updateEmail: UpdateEmailUseCase, private val getSelf: GetSelfUserUseCase, diff --git a/app/src/main/kotlin/com/wire/android/ui/home/settings/account/email/verifyEmail/VerifyEmailViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/home/settings/account/email/verifyEmail/VerifyEmailViewModel.kt index 81d1097bf2a..909e6b530c5 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/settings/account/email/verifyEmail/VerifyEmailViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/settings/account/email/verifyEmail/VerifyEmailViewModel.kt @@ -25,7 +25,7 @@ import androidx.lifecycle.viewModelScope import com.ramcosta.composedestinations.generated.app.navArgs import com.wire.kalium.logic.feature.user.UpdateEmailUseCase import kotlinx.coroutines.launch -import javax.inject.Inject +import dev.zacsweers.metro.Inject class VerifyEmailViewModel @Inject constructor( private val updateEmail: UpdateEmailUseCase, savedStateHandle: SavedStateHandle diff --git a/app/src/main/kotlin/com/wire/android/ui/home/settings/account/handle/ChangeHandleViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/home/settings/account/handle/ChangeHandleViewModel.kt index c56c63c66b5..ff479af6280 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/settings/account/handle/ChangeHandleViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/settings/account/handle/ChangeHandleViewModel.kt @@ -33,7 +33,7 @@ import com.wire.kalium.logic.feature.user.SetUserHandleResult import com.wire.kalium.logic.feature.user.SetUserHandleUseCase import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch -import javax.inject.Inject +import dev.zacsweers.metro.Inject class ChangeHandleViewModel @Inject constructor( private val updateHandle: SetUserHandleUseCase, private val validateHandle: ValidateUserHandleUseCase, diff --git a/app/src/main/kotlin/com/wire/android/ui/home/settings/appearance/CustomizationViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/home/settings/appearance/CustomizationViewModel.kt index 8e586a5ea15..ad764cfb0cf 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/settings/appearance/CustomizationViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/settings/appearance/CustomizationViewModel.kt @@ -24,7 +24,7 @@ import androidx.lifecycle.viewModelScope import com.wire.android.datastore.GlobalDataStore import com.wire.android.ui.theme.ThemeOption import kotlinx.coroutines.launch -import javax.inject.Inject +import dev.zacsweers.metro.Inject class CustomizationViewModel @Inject constructor( private val globalDataStore: GlobalDataStore, ) : ViewModel() { diff --git a/app/src/main/kotlin/com/wire/android/ui/home/settings/appsettings/networkSettings/NetworkSettingsViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/home/settings/appsettings/networkSettings/NetworkSettingsViewModel.kt index eaee6c42347..b4d1f105081 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/settings/appsettings/networkSettings/NetworkSettingsViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/settings/appsettings/networkSettings/NetworkSettingsViewModel.kt @@ -29,9 +29,9 @@ import com.wire.kalium.logic.feature.session.CurrentSessionResult import com.wire.kalium.logic.feature.session.CurrentSessionUseCase import com.wire.kalium.logic.feature.user.webSocketStatus.ObservePersistentWebSocketConnectionStatusUseCase import com.wire.kalium.logic.feature.user.webSocketStatus.PersistPersistentWebSocketConnectionStatusUseCase -import dagger.hilt.android.qualifiers.ApplicationContext +import com.wire.android.di.ApplicationContext import kotlinx.coroutines.launch -import javax.inject.Inject +import dev.zacsweers.metro.Inject class NetworkSettingsViewModel @Inject constructor( private val persistPersistentWebSocketConnectionStatus: PersistPersistentWebSocketConnectionStatusUseCase, diff --git a/app/src/main/kotlin/com/wire/android/ui/home/settings/backup/BackupAndRestoreViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/home/settings/backup/BackupAndRestoreViewModel.kt index 5d52875fa1d..9b9becab36e 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/settings/backup/BackupAndRestoreViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/settings/backup/BackupAndRestoreViewModel.kt @@ -56,7 +56,7 @@ import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import okio.Path -import javax.inject.Inject +import dev.zacsweers.metro.Inject @Suppress("LongParameterList", "TooManyFunctions") class BackupAndRestoreViewModel @Inject constructor( private val importBackup: RestoreBackupUseCase, diff --git a/app/src/main/kotlin/com/wire/android/ui/home/settings/privacy/PrivacySettingsViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/home/settings/privacy/PrivacySettingsViewModel.kt index 70bc1376c05..4a747e3b5b9 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/settings/privacy/PrivacySettingsViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/settings/privacy/PrivacySettingsViewModel.kt @@ -40,7 +40,7 @@ import com.wire.kalium.logic.feature.user.typingIndicator.TypingIndicatorConfigR import kotlinx.coroutines.flow.combine import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -import javax.inject.Inject +import dev.zacsweers.metro.Inject @Suppress("LongParameterList") class PrivacySettingsViewModel @Inject constructor( private val dispatchers: DispatcherProvider, diff --git a/app/src/main/kotlin/com/wire/android/ui/home/sync/FeatureFlagNotificationViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/home/sync/FeatureFlagNotificationViewModel.kt index 676bf88b3c5..cbf6f2f1446 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/sync/FeatureFlagNotificationViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/sync/FeatureFlagNotificationViewModel.kt @@ -39,7 +39,6 @@ import com.wire.kalium.logic.feature.e2ei.usecase.FinalizeEnrollmentResult import com.wire.kalium.logic.feature.session.CurrentSessionFlowUseCase import com.wire.kalium.logic.feature.session.CurrentSessionResult import com.wire.kalium.logic.feature.user.E2EIRequiredResult -import dagger.Lazy import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.combine @@ -76,7 +75,7 @@ class FeatureFlagNotificationViewModel( * state. */ private suspend fun initialSync() { - currentSessionFlow.get().invoke() + currentSessionFlow.value.invoke() .distinctUntilChanged() .collectLatest { currentSessionResult -> when { @@ -103,7 +102,7 @@ class FeatureFlagNotificationViewModel( coroutineScope { launch { setFileSharingState(userId) } launch { - coreLogic.get().getSessionScope(userId).observeSyncState() + coreLogic.value.getSessionScope(userId).observeSyncState() .firstOrNull { it == SyncState.Live }?.let { observeStatesAfterInitialSync(userId) } @@ -127,13 +126,13 @@ class FeatureFlagNotificationViewModel( } private suspend fun observeShouldNotifyForRevokedCertificate(userId: UserId) { - coreLogic.get().getSessionScope(userId).observeShouldNotifyForRevokedCertificate().collect { + coreLogic.value.getSessionScope(userId).observeShouldNotifyForRevokedCertificate().collect { featureFlagState = featureFlagState.copy(shouldShowE2eiCertificateRevokedDialog = it) } } private suspend fun setFileSharingState(userId: UserId) { - coreLogic.get().getSessionScope(userId).observeFileSharingStatus().collect { fileSharingStatus -> + coreLogic.value.getSessionScope(userId).observeFileSharingStatus().collect { fileSharingStatus -> val state: FeatureFlagState.FileSharingState = fileSharingStatus.state.toFeatureFlagState() featureFlagState = featureFlagState.copy( isFileSharingState = state, @@ -143,7 +142,7 @@ class FeatureFlagNotificationViewModel( } private suspend fun setGuestRoomLinkFeatureFlag(userId: UserId) { - coreLogic.get().getSessionScope(userId).observeGuestRoomLinkFeatureFlag() + coreLogic.value.getSessionScope(userId).observeGuestRoomLinkFeatureFlag() .collect { guestRoomLinkStatus -> guestRoomLinkStatus.isGuestRoomLinkEnabled?.let { featureFlagState = featureFlagState.copy(isGuestRoomLinkEnabled = it) @@ -156,8 +155,8 @@ class FeatureFlagNotificationViewModel( private suspend fun setTeamAppLockFeatureFlag(userId: UserId) { combine( - coreLogic.get().getSessionScope(userId).appLockTeamFeatureConfigObserver(), - globalDataStore.get().isAppLockPasscodeSetFlow(), + coreLogic.value.getSessionScope(userId).appLockTeamFeatureConfigObserver(), + globalDataStore.value.isAppLockPasscodeSetFlow(), ::Pair ).distinctUntilChanged() .collectLatest { (appLockConfig, isPasscodeSet) -> @@ -178,7 +177,7 @@ class FeatureFlagNotificationViewModel( } private suspend fun observeTeamSettingsSelfDeletionStatus(userId: UserId) { - coreLogic.get().getSessionScope(userId).observeTeamSettingsSelfDeletionStatus() + coreLogic.value.getSessionScope(userId).observeTeamSettingsSelfDeletionStatus() .collect { teamSettingsSelfDeletingStatus -> val areSelfDeletedMessagesEnabled = teamSettingsSelfDeletingStatus.enforcedSelfDeletionTimer !is TeamSelfDeleteTimer.Disabled @@ -202,7 +201,7 @@ class FeatureFlagNotificationViewModel( } private suspend fun setE2EIRequiredState(userId: UserId) { - coreLogic.get().getSessionScope(userId).observeE2EIRequired().collect { result -> + coreLogic.value.getSessionScope(userId).observeE2EIRequired().collect { result -> val state = when (result) { E2EIRequiredResult.NoGracePeriod.Create -> FeatureFlagState.E2EIRequired.NoGracePeriod.Create E2EIRequiredResult.NoGracePeriod.Renew -> FeatureFlagState.E2EIRequired.NoGracePeriod.Renew @@ -221,7 +220,7 @@ class FeatureFlagNotificationViewModel( } private suspend fun observeCallEndedBecauseOfConversationDegraded(userId: UserId) = - coreLogic.get().getSessionScope(userId).calls.observeEndCallDueToDegradationDialog().collect { + coreLogic.value.getSessionScope(userId).calls.observeEndCallDueToDegradationDialog().collect { featureFlagState = featureFlagState.copy(showCallEndedBecauseOfConversationDegraded = true) } @@ -229,7 +228,7 @@ class FeatureFlagNotificationViewModel( featureFlagState = featureFlagState.copy(shouldShowSelfDeletingMessagesDialog = false) viewModelScope.launch { currentUserId?.let { - coreLogic.get().getSessionScope(it).markSelfDeletingMessagesAsNotified() + coreLogic.value.getSessionScope(it).markSelfDeletingMessagesAsNotified() } } } @@ -238,7 +237,7 @@ class FeatureFlagNotificationViewModel( featureFlagState = featureFlagState.copy(shouldShowE2eiCertificateRevokedDialog = false) currentUserId?.let { viewModelScope.launch { - coreLogic.get().getSessionScope(it).markNotifyForRevokedCertificateAsNotified() + coreLogic.value.getSessionScope(it).markNotifyForRevokedCertificateAsNotified() } } } @@ -246,14 +245,14 @@ class FeatureFlagNotificationViewModel( fun dismissFileSharingDialog() { featureFlagState = featureFlagState.copy(showFileSharingDialog = false) viewModelScope.launch { - currentUserId?.let { coreLogic.get().getSessionScope(it).markFileSharingStatusAsNotified() } + currentUserId?.let { coreLogic.value.getSessionScope(it).markFileSharingStatusAsNotified() } } } fun dismissGuestRoomLinkDialog() { viewModelScope.launch { currentUserId?.let { - coreLogic.get().getSessionScope(it).markGuestLinkFeatureFlagAsNotChanged() + coreLogic.value.getSessionScope(it).markGuestLinkFeatureFlagAsNotChanged() } } featureFlagState = featureFlagState.copy(shouldShowGuestRoomLinkDialog = false) @@ -266,17 +265,17 @@ class FeatureFlagNotificationViewModel( fun markTeamAppLockStatusAsNot() { viewModelScope.launch { currentUserId?.let { - coreLogic.get().getSessionScope(it).markTeamAppLockStatusAsNotified() + coreLogic.value.getSessionScope(it).markTeamAppLockStatusAsNotified() } } } fun confirmAppLockNotEnforced() { viewModelScope.launch { - when (globalDataStore.get().getAppLockSource()) { + when (globalDataStore.value.getAppLockSource()) { AppLockSource.Manual -> {} - AppLockSource.TeamEnforced -> disableAppLockUseCase.get().invoke() + AppLockSource.TeamEnforced -> disableAppLockUseCase.value.invoke() } } } @@ -316,7 +315,7 @@ class FeatureFlagNotificationViewModel( ) currentUserId?.let { userId -> viewModelScope.launch { - coreLogic.get().getSessionScope(userId).markE2EIRequiredAsNotified(result.timeLeft) + coreLogic.value.getSessionScope(userId).markE2EIRequiredAsNotified(result.timeLeft) } } } diff --git a/app/src/main/kotlin/com/wire/android/ui/legalhold/dialog/deactivated/LegalHoldDeactivatedViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/legalhold/dialog/deactivated/LegalHoldDeactivatedViewModel.kt index a4ccdf7e31b..ef82e471c47 100644 --- a/app/src/main/kotlin/com/wire/android/ui/legalhold/dialog/deactivated/LegalHoldDeactivatedViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/legalhold/dialog/deactivated/LegalHoldDeactivatedViewModel.kt @@ -30,7 +30,6 @@ import com.wire.kalium.logic.feature.legalhold.LegalHoldState import com.wire.kalium.logic.feature.legalhold.MarkLegalHoldChangeAsNotifiedForSelfUseCase import com.wire.kalium.logic.feature.legalhold.ObserveLegalHoldChangeNotifiedForSelfUseCase import com.wire.kalium.logic.feature.session.CurrentSessionResult -import dagger.Lazy import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.flatMapLatest @@ -46,7 +45,7 @@ class LegalHoldDeactivatedViewModel( private set private fun currentSessionFlow(noSession: T, session: suspend UserSessionScope.(UserId) -> Flow): Flow = - coreLogic.get().getGlobalScope().session.currentSessionFlow() + coreLogic.value.getGlobalScope().session.currentSessionFlow() .flatMapLatest { currentSessionResult -> when (currentSessionResult) { is CurrentSessionResult.Failure.Generic -> { @@ -56,7 +55,7 @@ class LegalHoldDeactivatedViewModel( CurrentSessionResult.Failure.SessionNotFound -> flowOf(noSession) is CurrentSessionResult.Success -> - currentSessionResult.accountInfo.userId.let { coreLogic.get().getSessionScope(it).session(it) } + currentSessionResult.accountInfo.userId.let { coreLogic.value.getSessionScope(it).session(it) } } } @@ -75,7 +74,7 @@ class LegalHoldDeactivatedViewModel( when (it.legalHoldState) { is LegalHoldState.Disabled -> LegalHoldDeactivatedState.Visible(userId) is LegalHoldState.Enabled -> { // for enabled we don't show the dialog, just mark as already notified - coreLogic.get().getSessionScope(userId).markLegalHoldChangeAsNotifiedForSelf() + coreLogic.value.getSessionScope(userId).markLegalHoldChangeAsNotifiedForSelf() LegalHoldDeactivatedState.Hidden } } @@ -88,7 +87,7 @@ class LegalHoldDeactivatedViewModel( fun dismiss() { viewModelScope.launch { (state as? LegalHoldDeactivatedState.Visible)?.let { - coreLogic.get().getSessionScope(it.userId).markLegalHoldChangeAsNotifiedForSelf().let { + coreLogic.value.getSessionScope(it.userId).markLegalHoldChangeAsNotifiedForSelf().let { if (it is MarkLegalHoldChangeAsNotifiedForSelfUseCase.Result.Success) { state = LegalHoldDeactivatedState.Hidden } diff --git a/app/src/main/kotlin/com/wire/android/ui/legalhold/dialog/requested/LegalHoldRequestedViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/legalhold/dialog/requested/LegalHoldRequestedViewModel.kt index 5142a54cd8f..bf2eef12611 100644 --- a/app/src/main/kotlin/com/wire/android/ui/legalhold/dialog/requested/LegalHoldRequestedViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/legalhold/dialog/requested/LegalHoldRequestedViewModel.kt @@ -34,7 +34,6 @@ import com.wire.kalium.logic.feature.legalhold.ApproveLegalHoldRequestUseCase import com.wire.kalium.logic.feature.legalhold.ObserveLegalHoldRequestUseCase import com.wire.kalium.logic.feature.session.CurrentSessionResult import com.wire.kalium.logic.feature.user.IsPasswordRequiredUseCase -import dagger.Lazy import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.collectLatest @@ -88,7 +87,7 @@ class LegalHoldRequestedViewModel( }.stateIn(viewModelScope, SharingStarted.Eagerly, LegalHoldRequestData.None) private fun currentSessionFlow(noSession: T, session: UserSessionScope.(UserId) -> Flow): Flow = - coreLogic.get().getGlobalScope().session.currentSessionFlow() + coreLogic.value.getGlobalScope().session.currentSessionFlow() .flatMapLatest { currentSessionResult -> when (currentSessionResult) { is CurrentSessionResult.Failure.Generic -> { @@ -98,7 +97,7 @@ class LegalHoldRequestedViewModel( CurrentSessionResult.Failure.SessionNotFound -> flowOf(noSession) is CurrentSessionResult.Success -> - currentSessionResult.accountInfo.userId.let { coreLogic.get().getSessionScope(it).session(it) } + currentSessionResult.accountInfo.userId.let { coreLogic.value.getSessionScope(it).session(it) } } } @@ -151,7 +150,7 @@ class LegalHoldRequestedViewModel( } else { val password = if (it.requiresPassword) passwordTextState.text.toString() else null viewModelScope.launch { - coreLogic.get().sessionScope(it.userId) { + coreLogic.value.sessionScope(it.userId) { approveLegalHoldRequest(password).let { approveLegalHoldResult -> state = when (approveLegalHoldResult) { is ApproveLegalHoldRequestUseCase.Result.Success -> diff --git a/app/src/main/kotlin/com/wire/android/ui/newauthentication/login/NewLoginViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/newauthentication/login/NewLoginViewModel.kt index ee1791161a7..f5e19d1ec5c 100644 --- a/app/src/main/kotlin/com/wire/android/ui/newauthentication/login/NewLoginViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/newauthentication/login/NewLoginViewModel.kt @@ -71,8 +71,8 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import kotlinx.serialization.json.Json import java.io.IOException -import javax.inject.Inject -import javax.inject.Named +import dev.zacsweers.metro.Inject +import dev.zacsweers.metro.Named @Suppress("LongParameterList", "TooManyFunctions") class NewLoginViewModel( diff --git a/app/src/main/kotlin/com/wire/android/ui/newauthentication/login/ValidateEmailOrSSOCodeUseCase.kt b/app/src/main/kotlin/com/wire/android/ui/newauthentication/login/ValidateEmailOrSSOCodeUseCase.kt index 773b3372dc6..f893a7653f4 100644 --- a/app/src/main/kotlin/com/wire/android/ui/newauthentication/login/ValidateEmailOrSSOCodeUseCase.kt +++ b/app/src/main/kotlin/com/wire/android/ui/newauthentication/login/ValidateEmailOrSSOCodeUseCase.kt @@ -20,13 +20,11 @@ package com.wire.android.ui.newauthentication.login import com.wire.kalium.logic.feature.auth.ValidateEmailUseCase import com.wire.kalium.logic.feature.auth.sso.ValidateSSOCodeResult import com.wire.kalium.logic.feature.auth.sso.ValidateSSOCodeUseCase -import dagger.hilt.android.scopes.ViewModelScoped -import javax.inject.Inject +import dev.zacsweers.metro.Inject /** * Validates the input for a SSO code or an email address valid format. */ -@ViewModelScoped class ValidateEmailOrSSOCodeUseCase @Inject constructor( val validateEmail: ValidateEmailUseCase, val validateSSOCode: ValidateSSOCodeUseCase diff --git a/app/src/main/kotlin/com/wire/android/ui/registration/code/CreateAccountVerificationCodeViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/registration/code/CreateAccountVerificationCodeViewModel.kt index dc810f6671b..02ceec6b2dc 100644 --- a/app/src/main/kotlin/com/wire/android/ui/registration/code/CreateAccountVerificationCodeViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/registration/code/CreateAccountVerificationCodeViewModel.kt @@ -48,7 +48,7 @@ import com.wire.kalium.logic.feature.register.RegisterResult import com.wire.kalium.logic.feature.register.RequestActivationCodeResult import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch -import javax.inject.Inject +import dev.zacsweers.metro.Inject class CreateAccountVerificationCodeViewModel @Inject constructor( savedStateHandle: SavedStateHandle, diff --git a/app/src/main/kotlin/com/wire/android/ui/registration/details/CreateAccountDataDetailViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/registration/details/CreateAccountDataDetailViewModel.kt index fec1e2678b4..742d0c1d5e7 100644 --- a/app/src/main/kotlin/com/wire/android/ui/registration/details/CreateAccountDataDetailViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/registration/details/CreateAccountDataDetailViewModel.kt @@ -40,7 +40,7 @@ import com.wire.kalium.logic.feature.register.RequestActivationCodeResult import kotlinx.coroutines.delay import kotlinx.coroutines.flow.combine import kotlinx.coroutines.launch -import javax.inject.Inject +import dev.zacsweers.metro.Inject import kotlin.time.Duration.Companion.seconds class CreateAccountDataDetailViewModel @Inject constructor( diff --git a/app/src/main/kotlin/com/wire/android/ui/registration/selector/CreateAccountSelectorViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/registration/selector/CreateAccountSelectorViewModel.kt index a2219322915..1fd6fc5278f 100644 --- a/app/src/main/kotlin/com/wire/android/ui/registration/selector/CreateAccountSelectorViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/registration/selector/CreateAccountSelectorViewModel.kt @@ -24,7 +24,7 @@ import com.wire.android.datastore.GlobalDataStore import com.ramcosta.composedestinations.generated.app.navArgs import com.wire.kalium.logic.configuration.server.ServerConfig import kotlinx.coroutines.launch -import javax.inject.Inject +import dev.zacsweers.metro.Inject class CreateAccountSelectorViewModel @Inject constructor( private val globalDataStore: GlobalDataStore, diff --git a/app/src/main/kotlin/com/wire/android/ui/settings/devices/DeviceDetailsViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/settings/devices/DeviceDetailsViewModel.kt index 475b9b2a878..c11d437c61c 100644 --- a/app/src/main/kotlin/com/wire/android/ui/settings/devices/DeviceDetailsViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/settings/devices/DeviceDetailsViewModel.kt @@ -55,7 +55,7 @@ import com.wire.kalium.logic.feature.user.ObserveUserInfoUseCase import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.launch -import javax.inject.Inject +import dev.zacsweers.metro.Inject @Suppress("TooManyFunctions", "LongParameterList") class DeviceDetailsViewModel @Inject constructor( savedStateHandle: SavedStateHandle, diff --git a/app/src/main/kotlin/com/wire/android/ui/settings/devices/SelfDevicesViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/settings/devices/SelfDevicesViewModel.kt index bacb3587b2a..8aae14cb48c 100644 --- a/app/src/main/kotlin/com/wire/android/ui/settings/devices/SelfDevicesViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/settings/devices/SelfDevicesViewModel.kt @@ -35,7 +35,7 @@ import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.flow.map import kotlinx.coroutines.launch -import javax.inject.Inject +import dev.zacsweers.metro.Inject class SelfDevicesViewModel @Inject constructor( @CurrentAccount val currentAccountId: UserId, private val fetchSelfClientsFromRemote: FetchSelfClientsFromRemoteUseCase, diff --git a/app/src/main/kotlin/com/wire/android/ui/userprofile/avatarpicker/AvatarPickerViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/userprofile/avatarpicker/AvatarPickerViewModel.kt index 0d37e2f5216..b8e4dd6c5c7 100644 --- a/app/src/main/kotlin/com/wire/android/ui/userprofile/avatarpicker/AvatarPickerViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/userprofile/avatarpicker/AvatarPickerViewModel.kt @@ -42,14 +42,14 @@ import com.wire.kalium.logic.feature.asset.GetAvatarAssetUseCase import com.wire.kalium.logic.feature.asset.PublicAssetResult import com.wire.kalium.logic.feature.user.UploadAvatarResult import com.wire.kalium.logic.feature.user.UploadUserAvatarUseCase -import dagger.hilt.android.qualifiers.ApplicationContext +import com.wire.android.di.ApplicationContext import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.asSharedFlow import kotlinx.coroutines.flow.first import kotlinx.coroutines.launch import okio.Path import java.io.FileNotFoundException -import javax.inject.Inject +import dev.zacsweers.metro.Inject @Suppress("LongParameterList") class AvatarPickerViewModel @Inject constructor( private val dataStore: UserDataStore, diff --git a/app/src/main/kotlin/com/wire/android/ui/userprofile/other/OtherUserProfileScreenViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/userprofile/other/OtherUserProfileScreenViewModel.kt index 01e871bb3a3..36857678512 100644 --- a/app/src/main/kotlin/com/wire/android/ui/userprofile/other/OtherUserProfileScreenViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/userprofile/other/OtherUserProfileScreenViewModel.kt @@ -60,7 +60,7 @@ import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.map import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -import javax.inject.Inject +import dev.zacsweers.metro.Inject @Suppress("LongParameterList", "TooManyFunctions") class OtherUserProfileScreenViewModel @Inject constructor( private val dispatchers: DispatcherProvider, diff --git a/app/src/main/kotlin/com/wire/android/ui/userprofile/qr/SelfQRCodeViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/userprofile/qr/SelfQRCodeViewModel.kt index d168dd76cca..e700ddb17fa 100644 --- a/app/src/main/kotlin/com/wire/android/ui/userprofile/qr/SelfQRCodeViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/userprofile/qr/SelfQRCodeViewModel.kt @@ -41,7 +41,7 @@ import kotlinx.coroutines.withContext import okio.Path import okio.Path.Companion.toPath import java.io.FileOutputStream -import javax.inject.Inject +import dev.zacsweers.metro.Inject class SelfQRCodeViewModel @Inject constructor( savedStateHandle: SavedStateHandle, private val context: Context, diff --git a/app/src/main/kotlin/com/wire/android/ui/userprofile/self/SelfUserProfileViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/userprofile/self/SelfUserProfileViewModel.kt index 5f828bcadfc..d099841ad2b 100644 --- a/app/src/main/kotlin/com/wire/android/ui/userprofile/self/SelfUserProfileViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/userprofile/self/SelfUserProfileViewModel.kt @@ -71,7 +71,7 @@ import kotlinx.coroutines.flow.shareIn import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -import javax.inject.Inject +import dev.zacsweers.metro.Inject // TODO cover this class with unit test // Suppress for now after removing mockMethodForAvatar it should not complain @Suppress("TooManyFunctions", "LongParameterList") diff --git a/app/src/main/kotlin/com/wire/android/ui/userprofile/service/ServiceDetailsViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/userprofile/service/ServiceDetailsViewModel.kt index f07adc0cdce..2e1919005a3 100644 --- a/app/src/main/kotlin/com/wire/android/ui/userprofile/service/ServiceDetailsViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/userprofile/service/ServiceDetailsViewModel.kt @@ -60,7 +60,7 @@ import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.map import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -import javax.inject.Inject +import dev.zacsweers.metro.Inject @ViewModelScopedPreview interface ServiceDetailsViewModel : ActionsManager { fun serviceDetailsState(): ServiceDetailsState = ServiceDetailsState() diff --git a/app/src/main/kotlin/com/wire/android/ui/userprofile/teammigration/TeamMigrationViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/userprofile/teammigration/TeamMigrationViewModel.kt index 297d4da6bd5..3ed43b29a50 100644 --- a/app/src/main/kotlin/com/wire/android/ui/userprofile/teammigration/TeamMigrationViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/userprofile/teammigration/TeamMigrationViewModel.kt @@ -29,7 +29,7 @@ import com.wire.kalium.logic.feature.user.ObserveSelfUserUseCase import com.wire.kalium.logic.feature.user.migration.MigrateFromPersonalToTeamResult import com.wire.kalium.logic.feature.user.migration.MigrateFromPersonalToTeamUseCase import kotlinx.coroutines.launch -import javax.inject.Inject +import dev.zacsweers.metro.Inject class TeamMigrationViewModel @Inject constructor( private val anonymousAnalyticsManager: AnonymousAnalyticsManager, private val migrateFromPersonalToTeam: MigrateFromPersonalToTeamUseCase, diff --git a/app/src/main/kotlin/com/wire/android/util/AvatarImageManager.kt b/app/src/main/kotlin/com/wire/android/util/AvatarImageManager.kt index 27bff86691b..c8b203391e2 100644 --- a/app/src/main/kotlin/com/wire/android/util/AvatarImageManager.kt +++ b/app/src/main/kotlin/com/wire/android/util/AvatarImageManager.kt @@ -23,7 +23,7 @@ import android.net.Uri import androidx.core.content.FileProvider import androidx.core.net.toUri import okio.Path -import javax.inject.Inject +import dev.zacsweers.metro.Inject class AvatarImageManager @Inject constructor(val context: Context) { diff --git a/app/src/main/kotlin/com/wire/android/util/CurrentScreenManager.kt b/app/src/main/kotlin/com/wire/android/util/CurrentScreenManager.kt index 44ff191222d..5546569b169 100644 --- a/app/src/main/kotlin/com/wire/android/util/CurrentScreenManager.kt +++ b/app/src/main/kotlin/com/wire/android/util/CurrentScreenManager.kt @@ -69,11 +69,12 @@ import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.stateIn import java.util.concurrent.atomic.AtomicInteger -import javax.inject.Inject -import javax.inject.Singleton +import dev.zacsweers.metro.Inject +import dev.zacsweers.metro.AppScope +import dev.zacsweers.metro.SingleIn @OptIn(ExperimentalCoroutinesApi::class) -@Singleton +@SingleIn(AppScope::class) class CurrentScreenManager @Inject constructor( screenStateObserver: ScreenStateObserver ) : DefaultLifecycleObserver, diff --git a/app/src/main/kotlin/com/wire/android/util/FileManager.kt b/app/src/main/kotlin/com/wire/android/util/FileManager.kt index 46abf904a2e..4fe96d04049 100644 --- a/app/src/main/kotlin/com/wire/android/util/FileManager.kt +++ b/app/src/main/kotlin/com/wire/android/util/FileManager.kt @@ -25,16 +25,17 @@ import com.wire.android.ui.home.conversations.model.AssetBundle import com.wire.android.util.dispatchers.DefaultDispatcherProvider import com.wire.android.util.dispatchers.DispatcherProvider import com.wire.kalium.logic.data.asset.AttachmentType -import dagger.hilt.android.qualifiers.ApplicationContext +import com.wire.android.di.ApplicationContext import kotlinx.coroutines.withContext import okio.Path import okio.Path.Companion.toPath import java.io.IOException import java.util.UUID -import javax.inject.Inject -import javax.inject.Singleton +import dev.zacsweers.metro.Inject +import dev.zacsweers.metro.AppScope +import dev.zacsweers.metro.SingleIn -@Singleton +@SingleIn(AppScope::class) class FileManager @Inject constructor(@ApplicationContext private val context: Context) { suspend fun saveToExternalStorage( assetName: String, diff --git a/app/src/main/kotlin/com/wire/android/util/GetMediaMetadataUseCase.kt b/app/src/main/kotlin/com/wire/android/util/GetMediaMetadataUseCase.kt index 803f83429bd..9b983ba6272 100644 --- a/app/src/main/kotlin/com/wire/android/util/GetMediaMetadataUseCase.kt +++ b/app/src/main/kotlin/com/wire/android/util/GetMediaMetadataUseCase.kt @@ -19,7 +19,7 @@ package com.wire.android.util import com.wire.kalium.logic.data.message.AssetContent import okio.Path -import javax.inject.Inject +import dev.zacsweers.metro.Inject /** * Thin wrapper around [MediaMetadata.getMediaMetadata] that allows it to be injected diff --git a/app/src/main/kotlin/com/wire/android/util/NetworkUtil.kt b/app/src/main/kotlin/com/wire/android/util/NetworkUtil.kt index c8c8e91511d..d2ee3d93790 100644 --- a/app/src/main/kotlin/com/wire/android/util/NetworkUtil.kt +++ b/app/src/main/kotlin/com/wire/android/util/NetworkUtil.kt @@ -23,7 +23,7 @@ import android.content.Context import android.net.ConnectivityManager import android.net.NetworkCapabilities import android.os.Build -import javax.inject.Inject +import dev.zacsweers.metro.Inject class NetworkUtil @Inject constructor(private val context: Context) { diff --git a/app/src/main/kotlin/com/wire/android/util/ScreenStateObserver.kt b/app/src/main/kotlin/com/wire/android/util/ScreenStateObserver.kt index 309611539a8..d2c91febc75 100644 --- a/app/src/main/kotlin/com/wire/android/util/ScreenStateObserver.kt +++ b/app/src/main/kotlin/com/wire/android/util/ScreenStateObserver.kt @@ -23,13 +23,14 @@ import android.content.Context import android.content.Intent import android.content.IntentFilter import android.os.PowerManager -import dagger.hilt.android.qualifiers.ApplicationContext +import com.wire.android.di.ApplicationContext import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow -import javax.inject.Inject -import javax.inject.Singleton +import dev.zacsweers.metro.Inject +import dev.zacsweers.metro.AppScope +import dev.zacsweers.metro.SingleIn -@Singleton +@SingleIn(AppScope::class) class ScreenStateObserver @Inject constructor(@ApplicationContext val context: Context) : BroadcastReceiver() { private val _screenStateFlow = MutableStateFlow(true) diff --git a/app/src/main/kotlin/com/wire/android/util/SwitchAccountObserver.kt b/app/src/main/kotlin/com/wire/android/util/SwitchAccountObserver.kt index ad75b3a7eb4..091962b1dd0 100644 --- a/app/src/main/kotlin/com/wire/android/util/SwitchAccountObserver.kt +++ b/app/src/main/kotlin/com/wire/android/util/SwitchAccountObserver.kt @@ -18,10 +18,11 @@ package com.wire.android.util import com.wire.android.feature.SwitchAccountActions -import javax.inject.Inject -import javax.inject.Singleton +import dev.zacsweers.metro.Inject +import dev.zacsweers.metro.AppScope +import dev.zacsweers.metro.SingleIn -@Singleton +@SingleIn(AppScope::class) class SwitchAccountObserver @Inject constructor() : SwitchAccountActions { private val lock = Object() private val items = mutableListOf() diff --git a/app/src/main/kotlin/com/wire/android/util/UserAgentProvider.kt b/app/src/main/kotlin/com/wire/android/util/UserAgentProvider.kt index 93d4d7f5243..3eb602a73ef 100644 --- a/app/src/main/kotlin/com/wire/android/util/UserAgentProvider.kt +++ b/app/src/main/kotlin/com/wire/android/util/UserAgentProvider.kt @@ -19,11 +19,12 @@ package com.wire.android.util import android.content.Context import android.os.Build -import dagger.hilt.android.qualifiers.ApplicationContext -import javax.inject.Inject -import javax.inject.Singleton +import com.wire.android.di.ApplicationContext +import dev.zacsweers.metro.Inject +import dev.zacsweers.metro.AppScope +import dev.zacsweers.metro.SingleIn -@Singleton +@SingleIn(AppScope::class) class UserAgentProvider @Inject constructor(@ApplicationContext private val context: Context) { val defaultUserAgent = diff --git a/app/src/main/kotlin/com/wire/android/util/deeplink/DeepLinkProcessor.kt b/app/src/main/kotlin/com/wire/android/util/deeplink/DeepLinkProcessor.kt index 7f79d722ac5..11f83b9bac7 100644 --- a/app/src/main/kotlin/com/wire/android/util/deeplink/DeepLinkProcessor.kt +++ b/app/src/main/kotlin/com/wire/android/util/deeplink/DeepLinkProcessor.kt @@ -36,8 +36,9 @@ import com.wire.kalium.logic.feature.session.CurrentSessionResult import com.wire.kalium.logic.feature.session.CurrentSessionUseCase import kotlinx.coroutines.flow.first import kotlinx.serialization.Serializable -import javax.inject.Inject -import javax.inject.Singleton +import dev.zacsweers.metro.Inject +import dev.zacsweers.metro.AppScope +import dev.zacsweers.metro.SingleIn sealed class DeepLinkResult { data object Unknown : DeepLinkResult() @@ -78,7 +79,7 @@ sealed class DeepLinkResult { } } -@Singleton +@SingleIn(AppScope::class) class DeepLinkProcessor @Inject constructor( private val accountSwitch: AccountSwitchUseCase, private val currentSession: CurrentSessionUseCase, diff --git a/app/src/main/kotlin/com/wire/android/util/lifecycle/AutomatedLoginManager.kt b/app/src/main/kotlin/com/wire/android/util/lifecycle/AutomatedLoginManager.kt index 0582da5e606..2deb889b671 100644 --- a/app/src/main/kotlin/com/wire/android/util/lifecycle/AutomatedLoginManager.kt +++ b/app/src/main/kotlin/com/wire/android/util/lifecycle/AutomatedLoginManager.kt @@ -18,8 +18,9 @@ package com.wire.android.util.lifecycle import java.util.concurrent.atomic.AtomicBoolean -import javax.inject.Inject -import javax.inject.Singleton +import dev.zacsweers.metro.Inject +import dev.zacsweers.metro.AppScope +import dev.zacsweers.metro.SingleIn /** * Tracks whether the app was started via an automated login intent, @@ -29,7 +30,7 @@ import javax.inject.Singleton * resets naturally, preventing the app from unexpectedly backgrounding itself * on a future normal launch. */ -@Singleton +@SingleIn(AppScope::class) class AutomatedLoginManager @Inject constructor() { private val pendingMoveToBackgroundAfterSyncState = AtomicBoolean(false) diff --git a/app/src/main/kotlin/com/wire/android/util/lifecycle/IntentsProcessor.kt b/app/src/main/kotlin/com/wire/android/util/lifecycle/IntentsProcessor.kt index 22008cb68e3..ee01aa0411e 100644 --- a/app/src/main/kotlin/com/wire/android/util/lifecycle/IntentsProcessor.kt +++ b/app/src/main/kotlin/com/wire/android/util/lifecycle/IntentsProcessor.kt @@ -21,8 +21,9 @@ import android.content.Intent import kotlinx.serialization.Serializable import kotlinx.serialization.json.Json import java.net.URI -import javax.inject.Inject -import javax.inject.Singleton +import dev.zacsweers.metro.Inject +import dev.zacsweers.metro.AppScope +import dev.zacsweers.metro.SingleIn data class AutomatedLoginViaSSO( val backendConfig: String? = null, @@ -30,7 +31,7 @@ data class AutomatedLoginViaSSO( val nomadProfilesHost: String? = null, ) -@Singleton +@SingleIn(AppScope::class) class IntentsProcessor @Inject internal constructor( private val nomadIntentSignatureValidator: NomadIntentSignatureValidator ) { diff --git a/app/src/main/kotlin/com/wire/android/util/lifecycle/NomadIntentSignatureValidator.kt b/app/src/main/kotlin/com/wire/android/util/lifecycle/NomadIntentSignatureValidator.kt index 386d4a89adf..554fa4a6bbc 100644 --- a/app/src/main/kotlin/com/wire/android/util/lifecycle/NomadIntentSignatureValidator.kt +++ b/app/src/main/kotlin/com/wire/android/util/lifecycle/NomadIntentSignatureValidator.kt @@ -20,11 +20,12 @@ package com.wire.android.util.lifecycle import com.ionspin.kotlin.crypto.signature.Signature import com.wire.android.BuildConfig import com.wire.kalium.cryptography.LibsodiumInitializer -import javax.inject.Inject -import javax.inject.Singleton +import dev.zacsweers.metro.Inject +import dev.zacsweers.metro.AppScope +import dev.zacsweers.metro.SingleIn import kotlin.io.encoding.Base64 -@Singleton +@SingleIn(AppScope::class) class NomadIntentSignatureValidator internal constructor( private val configurationSignatureKeys: Map, private val isConfigurationSignatureEnforced: Boolean diff --git a/app/src/main/kotlin/com/wire/android/util/lifecycle/SyncLifecycleManager.kt b/app/src/main/kotlin/com/wire/android/util/lifecycle/SyncLifecycleManager.kt index ea3be07ed79..9009877f498 100644 --- a/app/src/main/kotlin/com/wire/android/util/lifecycle/SyncLifecycleManager.kt +++ b/app/src/main/kotlin/com/wire/android/util/lifecycle/SyncLifecycleManager.kt @@ -36,15 +36,16 @@ import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.map import kotlinx.coroutines.launch -import javax.inject.Inject -import javax.inject.Singleton +import dev.zacsweers.metro.Inject +import dev.zacsweers.metro.AppScope +import dev.zacsweers.metro.SingleIn import kotlin.time.Duration import kotlin.time.Duration.Companion.seconds /** * Provides tooling to simplify */ -@Singleton +@SingleIn(AppScope::class) class SyncLifecycleManager @Inject constructor( private val currentScreenManager: CurrentScreenManager, @KaliumCoreLogic private val coreLogic: CoreLogic, diff --git a/app/src/main/kotlin/com/wire/android/util/time/ISOFormatter.kt b/app/src/main/kotlin/com/wire/android/util/time/ISOFormatter.kt index b98d5f93d0a..92fa9fd03e6 100644 --- a/app/src/main/kotlin/com/wire/android/util/time/ISOFormatter.kt +++ b/app/src/main/kotlin/com/wire/android/util/time/ISOFormatter.kt @@ -22,7 +22,7 @@ import kotlinx.datetime.Instant import kotlinx.datetime.toJavaInstant import java.text.DateFormat import java.util.Date -import javax.inject.Inject +import dev.zacsweers.metro.Inject class ISOFormatter @Inject constructor() { diff --git a/app/src/main/kotlin/com/wire/android/util/time/TimeZoneProvider.kt b/app/src/main/kotlin/com/wire/android/util/time/TimeZoneProvider.kt index b425bc7715d..6a2de333106 100644 --- a/app/src/main/kotlin/com/wire/android/util/time/TimeZoneProvider.kt +++ b/app/src/main/kotlin/com/wire/android/util/time/TimeZoneProvider.kt @@ -18,7 +18,7 @@ package com.wire.android.util.time import kotlinx.datetime.TimeZone -import javax.inject.Inject +import dev.zacsweers.metro.Inject class TimeZoneProvider @Inject constructor() { fun currentSystemDefault(): TimeZone = TimeZone.currentSystemDefault() diff --git a/app/src/main/kotlin/com/wire/android/util/ui/CountdownTimer.kt b/app/src/main/kotlin/com/wire/android/util/ui/CountdownTimer.kt index fac4690d3c4..1f3f42a4af1 100644 --- a/app/src/main/kotlin/com/wire/android/util/ui/CountdownTimer.kt +++ b/app/src/main/kotlin/com/wire/android/util/ui/CountdownTimer.kt @@ -23,7 +23,7 @@ import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.delay import kotlinx.coroutines.isActive import kotlinx.coroutines.launch -import javax.inject.Inject +import dev.zacsweers.metro.Inject import kotlin.time.Duration.Companion.seconds class CountdownTimer @Inject constructor() { diff --git a/app/src/main/kotlin/com/wire/android/util/ui/UiTextResolver.kt b/app/src/main/kotlin/com/wire/android/util/ui/UiTextResolver.kt index bfd5f24beec..90a005f51b6 100644 --- a/app/src/main/kotlin/com/wire/android/util/ui/UiTextResolver.kt +++ b/app/src/main/kotlin/com/wire/android/util/ui/UiTextResolver.kt @@ -19,9 +19,9 @@ package com.wire.android.util.ui import android.content.Context -import dagger.hilt.android.qualifiers.ApplicationContext +import com.wire.android.di.ApplicationContext import java.util.Locale -import javax.inject.Inject +import dev.zacsweers.metro.Inject interface UiTextResolver { diff --git a/app/src/main/kotlin/com/wire/android/workmanager/WireWorkerFactory.kt b/app/src/main/kotlin/com/wire/android/workmanager/WireWorkerFactory.kt index 2694aab2483..4688e119b2f 100644 --- a/app/src/main/kotlin/com/wire/android/workmanager/WireWorkerFactory.kt +++ b/app/src/main/kotlin/com/wire/android/workmanager/WireWorkerFactory.kt @@ -34,7 +34,7 @@ import com.wire.android.workmanager.worker.AssetUploadObserverWorker import com.wire.kalium.logic.CoreLogic import com.wire.kalium.logic.sync.WrapperWorker import com.wire.kalium.logic.sync.WrapperWorkerFactory -import javax.inject.Inject +import dev.zacsweers.metro.Inject class WireWorkerFactory @Inject constructor( private val wireNotificationManager: WireNotificationManager, diff --git a/app/src/main/kotlin/com/wire/android/workmanager/worker/AssetUploadObserverWorker.kt b/app/src/main/kotlin/com/wire/android/workmanager/worker/AssetUploadObserverWorker.kt index 9ac5039da15..d2718a25727 100644 --- a/app/src/main/kotlin/com/wire/android/workmanager/worker/AssetUploadObserverWorker.kt +++ b/app/src/main/kotlin/com/wire/android/workmanager/worker/AssetUploadObserverWorker.kt @@ -34,8 +34,8 @@ import com.wire.android.notification.openAppPendingIntent import com.wire.kalium.logic.CoreLogic import com.wire.kalium.logic.data.user.UserId import com.wire.kalium.logic.feature.session.CurrentSessionResult -import dagger.assisted.Assisted -import dagger.assisted.AssistedInject +import dev.zacsweers.metro.Assisted +import dev.zacsweers.metro.AssistedInject import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.filterIsInstance import kotlinx.coroutines.flow.first diff --git a/app/src/main/kotlin/com/wire/android/workmanager/worker/DeleteConversationLocallyWorker.kt b/app/src/main/kotlin/com/wire/android/workmanager/worker/DeleteConversationLocallyWorker.kt index c0da71761e7..d6a72ee2d9f 100644 --- a/app/src/main/kotlin/com/wire/android/workmanager/worker/DeleteConversationLocallyWorker.kt +++ b/app/src/main/kotlin/com/wire/android/workmanager/worker/DeleteConversationLocallyWorker.kt @@ -19,7 +19,6 @@ package com.wire.android.workmanager.worker import android.content.Context import androidx.core.app.NotificationCompat -import androidx.hilt.work.HiltWorker import androidx.work.Constraints import androidx.work.CoroutineWorker import androidx.work.ExistingWorkPolicy @@ -42,8 +41,8 @@ import com.wire.kalium.logic.data.id.QualifiedIdMapper import com.wire.kalium.logic.data.user.UserId import com.wire.kalium.logic.feature.conversation.ClearConversationContentUseCase import com.wire.kalium.logic.feature.session.DoesValidSessionExistResult -import dagger.assisted.Assisted -import dagger.assisted.AssistedInject +import dev.zacsweers.metro.Assisted +import dev.zacsweers.metro.AssistedInject import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.mapNotNull @@ -60,7 +59,6 @@ import kotlinx.coroutines.flow.mapNotNull * @param coreLogic A utility object that handles core application logic, such as session and conversation management. * @param notificationChannelsManager Manages notification channels for the application. */ -@HiltWorker class DeleteConversationLocallyWorker @AssistedInject constructor( @Assisted appContext: Context, @Assisted workerParams: WorkerParameters, diff --git a/app/src/main/kotlin/com/wire/android/workmanager/worker/NotificationFetchWorker.kt b/app/src/main/kotlin/com/wire/android/workmanager/worker/NotificationFetchWorker.kt index 7f4065fd65c..cc24f543f83 100644 --- a/app/src/main/kotlin/com/wire/android/workmanager/worker/NotificationFetchWorker.kt +++ b/app/src/main/kotlin/com/wire/android/workmanager/worker/NotificationFetchWorker.kt @@ -20,7 +20,6 @@ package com.wire.android.workmanager.worker import android.content.Context import androidx.core.app.NotificationCompat -import androidx.hilt.work.HiltWorker import androidx.work.CoroutineWorker import androidx.work.ForegroundInfo import androidx.work.WorkerParameters @@ -29,10 +28,9 @@ import com.wire.android.notification.NotificationChannelsManager import com.wire.android.notification.NotificationConstants import com.wire.android.notification.NotificationIds import com.wire.android.notification.WireNotificationManager -import dagger.assisted.Assisted -import dagger.assisted.AssistedInject +import dev.zacsweers.metro.Assisted +import dev.zacsweers.metro.AssistedInject -@HiltWorker class NotificationFetchWorker @AssistedInject constructor( @Assisted appContext: Context, diff --git a/app/src/main/kotlin/com/wire/android/workmanager/worker/PersistentWebsocketCheckWorker.kt b/app/src/main/kotlin/com/wire/android/workmanager/worker/PersistentWebsocketCheckWorker.kt index c957eef1bfe..b82da0527ce 100644 --- a/app/src/main/kotlin/com/wire/android/workmanager/worker/PersistentWebsocketCheckWorker.kt +++ b/app/src/main/kotlin/com/wire/android/workmanager/worker/PersistentWebsocketCheckWorker.kt @@ -21,7 +21,6 @@ package com.wire.android.workmanager.worker import android.content.Context import androidx.core.app.NotificationCompat -import androidx.hilt.work.HiltWorker import androidx.work.CoroutineWorker import androidx.work.ExistingPeriodicWorkPolicy import androidx.work.ForegroundInfo @@ -38,13 +37,12 @@ import com.wire.android.notification.openAppPendingIntent import com.wire.android.workmanager.worker.PersistentWebsocketCheckWorker.Companion.NAME import com.wire.android.workmanager.worker.PersistentWebsocketCheckWorker.Companion.TAG import com.wire.android.workmanager.worker.PersistentWebsocketCheckWorker.Companion.WORK_INTERVAL -import dagger.assisted.Assisted -import dagger.assisted.AssistedInject +import dev.zacsweers.metro.Assisted +import dev.zacsweers.metro.AssistedInject import kotlinx.coroutines.coroutineScope import kotlin.time.Duration.Companion.hours import kotlin.time.toJavaDuration -@HiltWorker class PersistentWebsocketCheckWorker @AssistedInject constructor( @Assisted private val appContext: Context, diff --git a/app/src/main/startup-prof.txt b/app/src/main/startup-prof.txt index f2db624ab36..856822befd0 100644 --- a/app/src/main/startup-prof.txt +++ b/app/src/main/startup-prof.txt @@ -15999,10 +15999,6 @@ SPLandroidx/fragment/app/FragmentStore;->moveToExpectedState()V PLandroidx/fragment/app/FragmentStore;->saveActiveFragments()Ljava/util/ArrayList; SPLandroidx/fragment/app/FragmentStore;->setNonConfig(Landroidx/fragment/app/FragmentManagerViewModel;)V Landroidx/fragment/app/SpecialEffectsControllerFactory; -Landroidx/hilt/lifecycle/viewmodel/HiltViewModelFactory; -SPLandroidx/hilt/lifecycle/viewmodel/HiltViewModelFactory;->create(Landroid/content/Context;Landroidx/lifecycle/ViewModelProvider$Factory;)Landroidx/lifecycle/ViewModelProvider$Factory; -Landroidx/hilt/lifecycle/viewmodel/compose/HiltViewModelKt; -SPLandroidx/hilt/lifecycle/viewmodel/compose/HiltViewModelKt;->createHiltViewModelFactory(Landroidx/lifecycle/ViewModelStoreOwner;Landroidx/compose/runtime/Composer;I)Landroidx/lifecycle/ViewModelProvider$Factory; Landroidx/lifecycle/AtomicReference; SPLandroidx/lifecycle/AtomicReference;->(Ljava/lang/Object;)V SPLandroidx/lifecycle/AtomicReference;->compareAndSet(Ljava/lang/Object;Ljava/lang/Object;)Z @@ -24145,122 +24141,6 @@ Lcom/wire/android/BuildConfig$1; SPLcom/wire/android/BuildConfig$1;->()V Lcom/wire/android/BuildConfig$2; SPLcom/wire/android/BuildConfig$2;->()V -Lcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC; -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC;->builder()Lcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$Builder; -Lcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ActivityCBuilder; -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ActivityCBuilder;->(Lcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$SingletonCImpl;Lcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ActivityRetainedCImpl;)V -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ActivityCBuilder;->(Lcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$SingletonCImpl;Lcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ActivityRetainedCImpl;Lcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC-IA;)V -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ActivityCBuilder;->activity(Landroid/app/Activity;)Lcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ActivityCBuilder; -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ActivityCBuilder;->activity(Landroid/app/Activity;)Ldagger/hilt/android/internal/builders/ActivityComponentBuilder; -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ActivityCBuilder;->build()Lcom/wire/android/WireApplication_HiltComponents$ActivityC; -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ActivityCBuilder;->build()Ldagger/hilt/android/components/ActivityComponent; -Lcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ActivityCImpl; -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ActivityCImpl;->(Lcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$SingletonCImpl;Lcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ActivityRetainedCImpl;Landroid/app/Activity;)V -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ActivityCImpl;->getHiltInternalFactoryFactory()Ldagger/hilt/android/internal/lifecycle/DefaultViewModelFactories$InternalFactoryFactory; -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ActivityCImpl;->getViewModelComponentBuilder()Ldagger/hilt/android/internal/builders/ViewModelComponentBuilder; -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ActivityCImpl;->getViewModelKeys()Ljava/util/Map; -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ActivityCImpl;->injectWireActivity(Lcom/wire/android/ui/WireActivity;)V -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ActivityCImpl;->injectWireActivity2(Lcom/wire/android/ui/WireActivity;)Lcom/wire/android/ui/WireActivity; -Lcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ActivityRetainedCBuilder; -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ActivityRetainedCBuilder;->(Lcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$SingletonCImpl;)V -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ActivityRetainedCBuilder;->(Lcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$SingletonCImpl;Lcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC-IA;)V -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ActivityRetainedCBuilder;->build()Lcom/wire/android/WireApplication_HiltComponents$ActivityRetainedC; -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ActivityRetainedCBuilder;->build()Ldagger/hilt/android/components/ActivityRetainedComponent; -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ActivityRetainedCBuilder;->savedStateHandleHolder(Ldagger/hilt/android/internal/managers/SavedStateHandleHolder;)Lcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ActivityRetainedCBuilder; -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ActivityRetainedCBuilder;->savedStateHandleHolder(Ldagger/hilt/android/internal/managers/SavedStateHandleHolder;)Ldagger/hilt/android/internal/builders/ActivityRetainedComponentBuilder; -Lcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ActivityRetainedCImpl; -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ActivityRetainedCImpl;->(Lcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$SingletonCImpl;Ldagger/hilt/android/internal/managers/SavedStateHandleHolder;)V -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ActivityRetainedCImpl;->activityComponentBuilder()Ldagger/hilt/android/internal/builders/ActivityComponentBuilder; -PLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ActivityRetainedCImpl;->getActivityRetainedLifecycle()Ldagger/hilt/android/ActivityRetainedLifecycle; -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ActivityRetainedCImpl;->initialize(Ldagger/hilt/android/internal/managers/SavedStateHandleHolder;)V -Lcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ActivityRetainedCImpl$SwitchingProvider; -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ActivityRetainedCImpl$SwitchingProvider;->(Lcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$SingletonCImpl;Lcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ActivityRetainedCImpl;I)V -PLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ActivityRetainedCImpl$SwitchingProvider;->get()Ljava/lang/Object; -Lcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$Builder; -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$Builder;->()V -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$Builder;->(Lcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC-IA;)V -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$Builder;->applicationContextModule(Ldagger/hilt/android/internal/modules/ApplicationContextModule;)Lcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$Builder; -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$Builder;->build()Lcom/wire/android/WireApplication_HiltComponents$SingletonC; -Lcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ServiceCBuilder; -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ServiceCBuilder;->(Lcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$SingletonCImpl;)V -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ServiceCBuilder;->(Lcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$SingletonCImpl;Lcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC-IA;)V -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ServiceCBuilder;->build()Lcom/wire/android/WireApplication_HiltComponents$ServiceC; -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ServiceCBuilder;->build()Ldagger/hilt/android/components/ServiceComponent; -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ServiceCBuilder;->service(Landroid/app/Service;)Lcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ServiceCBuilder; -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ServiceCBuilder;->service(Landroid/app/Service;)Ldagger/hilt/android/internal/builders/ServiceComponentBuilder; -Lcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ServiceCImpl; -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ServiceCImpl;->(Lcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$SingletonCImpl;Landroid/app/Service;)V -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ServiceCImpl;->injectWireFirebaseMessagingService(Lcom/wire/android/services/WireFirebaseMessagingService;)V -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ServiceCImpl;->injectWireFirebaseMessagingService2(Lcom/wire/android/services/WireFirebaseMessagingService;)Lcom/wire/android/services/WireFirebaseMessagingService; -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ServiceCImpl;->networkUtil()Lcom/wire/android/util/NetworkUtil; -Lcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$SingletonCImpl; -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$SingletonCImpl;->-$$Nest$fgetapplicationContextModule(Lcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$SingletonCImpl;)Ldagger/hilt/android/internal/modules/ApplicationContextModule; -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$SingletonCImpl;->-$$Nest$fgetcoreLogicModule(Lcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$SingletonCImpl;)Lcom/wire/android/di/CoreLogicModule; -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$SingletonCImpl;->-$$Nest$fgetkaliumConfigsModule(Lcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$SingletonCImpl;)Lcom/wire/android/di/KaliumConfigsModule; -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$SingletonCImpl;->-$$Nest$fgetlogWriterModule(Lcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$SingletonCImpl;)Lcom/wire/android/di/LogWriterModule; -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$SingletonCImpl;->-$$Nest$fgetmanagedConfigurationsModule(Lcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$SingletonCImpl;)Lcom/wire/android/di/ManagedConfigurationsModule; -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$SingletonCImpl;->(Ldagger/hilt/android/internal/modules/ApplicationContextModule;Lcom/wire/android/di/CoreLogicModule;Lcom/wire/android/di/KaliumConfigsModule;Lcom/wire/android/di/LogWriterModule;Lcom/wire/android/di/ManagedConfigurationsModule;)V -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$SingletonCImpl;->initialize(Ldagger/hilt/android/internal/modules/ApplicationContextModule;Lcom/wire/android/di/CoreLogicModule;Lcom/wire/android/di/KaliumConfigsModule;Lcom/wire/android/di/LogWriterModule;Lcom/wire/android/di/ManagedConfigurationsModule;)V -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$SingletonCImpl;->initialize2(Ldagger/hilt/android/internal/modules/ApplicationContextModule;Lcom/wire/android/di/CoreLogicModule;Lcom/wire/android/di/KaliumConfigsModule;Lcom/wire/android/di/LogWriterModule;Lcom/wire/android/di/ManagedConfigurationsModule;)V -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$SingletonCImpl;->initialize3(Ldagger/hilt/android/internal/modules/ApplicationContextModule;Lcom/wire/android/di/CoreLogicModule;Lcom/wire/android/di/KaliumConfigsModule;Lcom/wire/android/di/LogWriterModule;Lcom/wire/android/di/ManagedConfigurationsModule;)V -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$SingletonCImpl;->injectStartServiceReceiver(Lcom/wire/android/ui/debug/StartServiceReceiver;)V -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$SingletonCImpl;->injectStartServiceReceiver2(Lcom/wire/android/ui/debug/StartServiceReceiver;)Lcom/wire/android/ui/debug/StartServiceReceiver; -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$SingletonCImpl;->injectWireApplication(Lcom/wire/android/WireApplication;)V -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$SingletonCImpl;->injectWireApplication2(Lcom/wire/android/WireApplication;)Lcom/wire/android/WireApplication; -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$SingletonCImpl;->notificationManager()Landroid/app/NotificationManager; -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$SingletonCImpl;->notificationManagerCompat()Landroidx/core/app/NotificationManagerCompat; -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$SingletonCImpl;->retainedComponentBuilder()Ldagger/hilt/android/internal/builders/ActivityRetainedComponentBuilder; -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$SingletonCImpl;->serviceComponentBuilder()Ldagger/hilt/android/internal/builders/ServiceComponentBuilder; -Lcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$SingletonCImpl$SwitchingProvider; -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$SingletonCImpl$SwitchingProvider;->(Lcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$SingletonCImpl;I)V -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$SingletonCImpl$SwitchingProvider;->get()Ljava/lang/Object; -Lcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ViewModelCBuilder; -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ViewModelCBuilder;->(Lcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$SingletonCImpl;Lcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ActivityRetainedCImpl;)V -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ViewModelCBuilder;->(Lcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$SingletonCImpl;Lcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ActivityRetainedCImpl;Lcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC-IA;)V -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ViewModelCBuilder;->build()Lcom/wire/android/WireApplication_HiltComponents$ViewModelC; -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ViewModelCBuilder;->build()Ldagger/hilt/android/components/ViewModelComponent; -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ViewModelCBuilder;->savedStateHandle(Landroidx/lifecycle/SavedStateHandle;)Lcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ViewModelCBuilder; -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ViewModelCBuilder;->savedStateHandle(Landroidx/lifecycle/SavedStateHandle;)Ldagger/hilt/android/internal/builders/ViewModelComponentBuilder; -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ViewModelCBuilder;->viewModelLifecycle(Ldagger/hilt/android/ViewModelLifecycle;)Lcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ViewModelCBuilder; -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ViewModelCBuilder;->viewModelLifecycle(Ldagger/hilt/android/ViewModelLifecycle;)Ldagger/hilt/android/internal/builders/ViewModelComponentBuilder; -Lcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ViewModelCImpl; -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ViewModelCImpl;->-$$Nest$fgetuseCaseModule(Lcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ViewModelCImpl;)Lcom/wire/android/di/UseCaseModule; -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ViewModelCImpl;->(Lcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$SingletonCImpl;Lcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ActivityRetainedCImpl;Lcom/wire/android/di/accountScoped/AppsModule;Lcom/wire/android/di/accountScoped/AuthenticationModule;Lcom/wire/android/di/accountScoped/BackupModule;Lcom/wire/android/di/accountScoped/CallsModule;Lcom/wire/android/di/accountScoped/CellsModule;Lcom/wire/android/di/accountScoped/ChannelsModule;Lcom/wire/android/di/accountScoped/ClientModule;Lcom/wire/android/di/accountScoped/ConnectionModule;Lcom/wire/android/di/accountScoped/ConversationModule;Lcom/wire/android/di/accountScoped/DebugModule;Lcom/wire/android/di/ImageLoadingModule;Lcom/wire/android/di/accountScoped/MessageModule;Lcom/wire/android/di/accountScoped/SearchModule;Lcom/wire/android/di/accountScoped/ServicesModule;Lcom/wire/android/di/SessionModule;Lcom/wire/android/di/accountScoped/TeamModule;Lcom/wire/android/di/UseCaseModule;Lcom/wire/android/di/accountScoped/UserModule;Landroidx/lifecycle/SavedStateHandle;Ldagger/hilt/android/ViewModelLifecycle;)V -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ViewModelCImpl;->getHiltViewModelAssistedMap()Ljava/util/Map; -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ViewModelCImpl;->getHiltViewModelMap()Ljava/util/Map; -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ViewModelCImpl;->initialize(Lcom/wire/android/di/accountScoped/AppsModule;Lcom/wire/android/di/accountScoped/AuthenticationModule;Lcom/wire/android/di/accountScoped/BackupModule;Lcom/wire/android/di/accountScoped/CallsModule;Lcom/wire/android/di/accountScoped/CellsModule;Lcom/wire/android/di/accountScoped/ChannelsModule;Lcom/wire/android/di/accountScoped/ClientModule;Lcom/wire/android/di/accountScoped/ConnectionModule;Lcom/wire/android/di/accountScoped/ConversationModule;Lcom/wire/android/di/accountScoped/DebugModule;Lcom/wire/android/di/ImageLoadingModule;Lcom/wire/android/di/accountScoped/MessageModule;Lcom/wire/android/di/accountScoped/SearchModule;Lcom/wire/android/di/accountScoped/ServicesModule;Lcom/wire/android/di/SessionModule;Lcom/wire/android/di/accountScoped/TeamModule;Lcom/wire/android/di/UseCaseModule;Lcom/wire/android/di/accountScoped/UserModule;Landroidx/lifecycle/SavedStateHandle;Ldagger/hilt/android/ViewModelLifecycle;)V -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ViewModelCImpl;->initialize10(Lcom/wire/android/di/accountScoped/AppsModule;Lcom/wire/android/di/accountScoped/AuthenticationModule;Lcom/wire/android/di/accountScoped/BackupModule;Lcom/wire/android/di/accountScoped/CallsModule;Lcom/wire/android/di/accountScoped/CellsModule;Lcom/wire/android/di/accountScoped/ChannelsModule;Lcom/wire/android/di/accountScoped/ClientModule;Lcom/wire/android/di/accountScoped/ConnectionModule;Lcom/wire/android/di/accountScoped/ConversationModule;Lcom/wire/android/di/accountScoped/DebugModule;Lcom/wire/android/di/ImageLoadingModule;Lcom/wire/android/di/accountScoped/MessageModule;Lcom/wire/android/di/accountScoped/SearchModule;Lcom/wire/android/di/accountScoped/ServicesModule;Lcom/wire/android/di/SessionModule;Lcom/wire/android/di/accountScoped/TeamModule;Lcom/wire/android/di/UseCaseModule;Lcom/wire/android/di/accountScoped/UserModule;Landroidx/lifecycle/SavedStateHandle;Ldagger/hilt/android/ViewModelLifecycle;)V -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ViewModelCImpl;->initialize11(Lcom/wire/android/di/accountScoped/AppsModule;Lcom/wire/android/di/accountScoped/AuthenticationModule;Lcom/wire/android/di/accountScoped/BackupModule;Lcom/wire/android/di/accountScoped/CallsModule;Lcom/wire/android/di/accountScoped/CellsModule;Lcom/wire/android/di/accountScoped/ChannelsModule;Lcom/wire/android/di/accountScoped/ClientModule;Lcom/wire/android/di/accountScoped/ConnectionModule;Lcom/wire/android/di/accountScoped/ConversationModule;Lcom/wire/android/di/accountScoped/DebugModule;Lcom/wire/android/di/ImageLoadingModule;Lcom/wire/android/di/accountScoped/MessageModule;Lcom/wire/android/di/accountScoped/SearchModule;Lcom/wire/android/di/accountScoped/ServicesModule;Lcom/wire/android/di/SessionModule;Lcom/wire/android/di/accountScoped/TeamModule;Lcom/wire/android/di/UseCaseModule;Lcom/wire/android/di/accountScoped/UserModule;Landroidx/lifecycle/SavedStateHandle;Ldagger/hilt/android/ViewModelLifecycle;)V -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ViewModelCImpl;->initialize12(Lcom/wire/android/di/accountScoped/AppsModule;Lcom/wire/android/di/accountScoped/AuthenticationModule;Lcom/wire/android/di/accountScoped/BackupModule;Lcom/wire/android/di/accountScoped/CallsModule;Lcom/wire/android/di/accountScoped/CellsModule;Lcom/wire/android/di/accountScoped/ChannelsModule;Lcom/wire/android/di/accountScoped/ClientModule;Lcom/wire/android/di/accountScoped/ConnectionModule;Lcom/wire/android/di/accountScoped/ConversationModule;Lcom/wire/android/di/accountScoped/DebugModule;Lcom/wire/android/di/ImageLoadingModule;Lcom/wire/android/di/accountScoped/MessageModule;Lcom/wire/android/di/accountScoped/SearchModule;Lcom/wire/android/di/accountScoped/ServicesModule;Lcom/wire/android/di/SessionModule;Lcom/wire/android/di/accountScoped/TeamModule;Lcom/wire/android/di/UseCaseModule;Lcom/wire/android/di/accountScoped/UserModule;Landroidx/lifecycle/SavedStateHandle;Ldagger/hilt/android/ViewModelLifecycle;)V -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ViewModelCImpl;->initialize13(Lcom/wire/android/di/accountScoped/AppsModule;Lcom/wire/android/di/accountScoped/AuthenticationModule;Lcom/wire/android/di/accountScoped/BackupModule;Lcom/wire/android/di/accountScoped/CallsModule;Lcom/wire/android/di/accountScoped/CellsModule;Lcom/wire/android/di/accountScoped/ChannelsModule;Lcom/wire/android/di/accountScoped/ClientModule;Lcom/wire/android/di/accountScoped/ConnectionModule;Lcom/wire/android/di/accountScoped/ConversationModule;Lcom/wire/android/di/accountScoped/DebugModule;Lcom/wire/android/di/ImageLoadingModule;Lcom/wire/android/di/accountScoped/MessageModule;Lcom/wire/android/di/accountScoped/SearchModule;Lcom/wire/android/di/accountScoped/ServicesModule;Lcom/wire/android/di/SessionModule;Lcom/wire/android/di/accountScoped/TeamModule;Lcom/wire/android/di/UseCaseModule;Lcom/wire/android/di/accountScoped/UserModule;Landroidx/lifecycle/SavedStateHandle;Ldagger/hilt/android/ViewModelLifecycle;)V -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ViewModelCImpl;->initialize14(Lcom/wire/android/di/accountScoped/AppsModule;Lcom/wire/android/di/accountScoped/AuthenticationModule;Lcom/wire/android/di/accountScoped/BackupModule;Lcom/wire/android/di/accountScoped/CallsModule;Lcom/wire/android/di/accountScoped/CellsModule;Lcom/wire/android/di/accountScoped/ChannelsModule;Lcom/wire/android/di/accountScoped/ClientModule;Lcom/wire/android/di/accountScoped/ConnectionModule;Lcom/wire/android/di/accountScoped/ConversationModule;Lcom/wire/android/di/accountScoped/DebugModule;Lcom/wire/android/di/ImageLoadingModule;Lcom/wire/android/di/accountScoped/MessageModule;Lcom/wire/android/di/accountScoped/SearchModule;Lcom/wire/android/di/accountScoped/ServicesModule;Lcom/wire/android/di/SessionModule;Lcom/wire/android/di/accountScoped/TeamModule;Lcom/wire/android/di/UseCaseModule;Lcom/wire/android/di/accountScoped/UserModule;Landroidx/lifecycle/SavedStateHandle;Ldagger/hilt/android/ViewModelLifecycle;)V -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ViewModelCImpl;->initialize2(Lcom/wire/android/di/accountScoped/AppsModule;Lcom/wire/android/di/accountScoped/AuthenticationModule;Lcom/wire/android/di/accountScoped/BackupModule;Lcom/wire/android/di/accountScoped/CallsModule;Lcom/wire/android/di/accountScoped/CellsModule;Lcom/wire/android/di/accountScoped/ChannelsModule;Lcom/wire/android/di/accountScoped/ClientModule;Lcom/wire/android/di/accountScoped/ConnectionModule;Lcom/wire/android/di/accountScoped/ConversationModule;Lcom/wire/android/di/accountScoped/DebugModule;Lcom/wire/android/di/ImageLoadingModule;Lcom/wire/android/di/accountScoped/MessageModule;Lcom/wire/android/di/accountScoped/SearchModule;Lcom/wire/android/di/accountScoped/ServicesModule;Lcom/wire/android/di/SessionModule;Lcom/wire/android/di/accountScoped/TeamModule;Lcom/wire/android/di/UseCaseModule;Lcom/wire/android/di/accountScoped/UserModule;Landroidx/lifecycle/SavedStateHandle;Ldagger/hilt/android/ViewModelLifecycle;)V -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ViewModelCImpl;->initialize3(Lcom/wire/android/di/accountScoped/AppsModule;Lcom/wire/android/di/accountScoped/AuthenticationModule;Lcom/wire/android/di/accountScoped/BackupModule;Lcom/wire/android/di/accountScoped/CallsModule;Lcom/wire/android/di/accountScoped/CellsModule;Lcom/wire/android/di/accountScoped/ChannelsModule;Lcom/wire/android/di/accountScoped/ClientModule;Lcom/wire/android/di/accountScoped/ConnectionModule;Lcom/wire/android/di/accountScoped/ConversationModule;Lcom/wire/android/di/accountScoped/DebugModule;Lcom/wire/android/di/ImageLoadingModule;Lcom/wire/android/di/accountScoped/MessageModule;Lcom/wire/android/di/accountScoped/SearchModule;Lcom/wire/android/di/accountScoped/ServicesModule;Lcom/wire/android/di/SessionModule;Lcom/wire/android/di/accountScoped/TeamModule;Lcom/wire/android/di/UseCaseModule;Lcom/wire/android/di/accountScoped/UserModule;Landroidx/lifecycle/SavedStateHandle;Ldagger/hilt/android/ViewModelLifecycle;)V -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ViewModelCImpl;->initialize4(Lcom/wire/android/di/accountScoped/AppsModule;Lcom/wire/android/di/accountScoped/AuthenticationModule;Lcom/wire/android/di/accountScoped/BackupModule;Lcom/wire/android/di/accountScoped/CallsModule;Lcom/wire/android/di/accountScoped/CellsModule;Lcom/wire/android/di/accountScoped/ChannelsModule;Lcom/wire/android/di/accountScoped/ClientModule;Lcom/wire/android/di/accountScoped/ConnectionModule;Lcom/wire/android/di/accountScoped/ConversationModule;Lcom/wire/android/di/accountScoped/DebugModule;Lcom/wire/android/di/ImageLoadingModule;Lcom/wire/android/di/accountScoped/MessageModule;Lcom/wire/android/di/accountScoped/SearchModule;Lcom/wire/android/di/accountScoped/ServicesModule;Lcom/wire/android/di/SessionModule;Lcom/wire/android/di/accountScoped/TeamModule;Lcom/wire/android/di/UseCaseModule;Lcom/wire/android/di/accountScoped/UserModule;Landroidx/lifecycle/SavedStateHandle;Ldagger/hilt/android/ViewModelLifecycle;)V -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ViewModelCImpl;->initialize5(Lcom/wire/android/di/accountScoped/AppsModule;Lcom/wire/android/di/accountScoped/AuthenticationModule;Lcom/wire/android/di/accountScoped/BackupModule;Lcom/wire/android/di/accountScoped/CallsModule;Lcom/wire/android/di/accountScoped/CellsModule;Lcom/wire/android/di/accountScoped/ChannelsModule;Lcom/wire/android/di/accountScoped/ClientModule;Lcom/wire/android/di/accountScoped/ConnectionModule;Lcom/wire/android/di/accountScoped/ConversationModule;Lcom/wire/android/di/accountScoped/DebugModule;Lcom/wire/android/di/ImageLoadingModule;Lcom/wire/android/di/accountScoped/MessageModule;Lcom/wire/android/di/accountScoped/SearchModule;Lcom/wire/android/di/accountScoped/ServicesModule;Lcom/wire/android/di/SessionModule;Lcom/wire/android/di/accountScoped/TeamModule;Lcom/wire/android/di/UseCaseModule;Lcom/wire/android/di/accountScoped/UserModule;Landroidx/lifecycle/SavedStateHandle;Ldagger/hilt/android/ViewModelLifecycle;)V -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ViewModelCImpl;->initialize6(Lcom/wire/android/di/accountScoped/AppsModule;Lcom/wire/android/di/accountScoped/AuthenticationModule;Lcom/wire/android/di/accountScoped/BackupModule;Lcom/wire/android/di/accountScoped/CallsModule;Lcom/wire/android/di/accountScoped/CellsModule;Lcom/wire/android/di/accountScoped/ChannelsModule;Lcom/wire/android/di/accountScoped/ClientModule;Lcom/wire/android/di/accountScoped/ConnectionModule;Lcom/wire/android/di/accountScoped/ConversationModule;Lcom/wire/android/di/accountScoped/DebugModule;Lcom/wire/android/di/ImageLoadingModule;Lcom/wire/android/di/accountScoped/MessageModule;Lcom/wire/android/di/accountScoped/SearchModule;Lcom/wire/android/di/accountScoped/ServicesModule;Lcom/wire/android/di/SessionModule;Lcom/wire/android/di/accountScoped/TeamModule;Lcom/wire/android/di/UseCaseModule;Lcom/wire/android/di/accountScoped/UserModule;Landroidx/lifecycle/SavedStateHandle;Ldagger/hilt/android/ViewModelLifecycle;)V -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ViewModelCImpl;->initialize7(Lcom/wire/android/di/accountScoped/AppsModule;Lcom/wire/android/di/accountScoped/AuthenticationModule;Lcom/wire/android/di/accountScoped/BackupModule;Lcom/wire/android/di/accountScoped/CallsModule;Lcom/wire/android/di/accountScoped/CellsModule;Lcom/wire/android/di/accountScoped/ChannelsModule;Lcom/wire/android/di/accountScoped/ClientModule;Lcom/wire/android/di/accountScoped/ConnectionModule;Lcom/wire/android/di/accountScoped/ConversationModule;Lcom/wire/android/di/accountScoped/DebugModule;Lcom/wire/android/di/ImageLoadingModule;Lcom/wire/android/di/accountScoped/MessageModule;Lcom/wire/android/di/accountScoped/SearchModule;Lcom/wire/android/di/accountScoped/ServicesModule;Lcom/wire/android/di/SessionModule;Lcom/wire/android/di/accountScoped/TeamModule;Lcom/wire/android/di/UseCaseModule;Lcom/wire/android/di/accountScoped/UserModule;Landroidx/lifecycle/SavedStateHandle;Ldagger/hilt/android/ViewModelLifecycle;)V -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ViewModelCImpl;->initialize8(Lcom/wire/android/di/accountScoped/AppsModule;Lcom/wire/android/di/accountScoped/AuthenticationModule;Lcom/wire/android/di/accountScoped/BackupModule;Lcom/wire/android/di/accountScoped/CallsModule;Lcom/wire/android/di/accountScoped/CellsModule;Lcom/wire/android/di/accountScoped/ChannelsModule;Lcom/wire/android/di/accountScoped/ClientModule;Lcom/wire/android/di/accountScoped/ConnectionModule;Lcom/wire/android/di/accountScoped/ConversationModule;Lcom/wire/android/di/accountScoped/DebugModule;Lcom/wire/android/di/ImageLoadingModule;Lcom/wire/android/di/accountScoped/MessageModule;Lcom/wire/android/di/accountScoped/SearchModule;Lcom/wire/android/di/accountScoped/ServicesModule;Lcom/wire/android/di/SessionModule;Lcom/wire/android/di/accountScoped/TeamModule;Lcom/wire/android/di/UseCaseModule;Lcom/wire/android/di/accountScoped/UserModule;Landroidx/lifecycle/SavedStateHandle;Ldagger/hilt/android/ViewModelLifecycle;)V -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ViewModelCImpl;->initialize9(Lcom/wire/android/di/accountScoped/AppsModule;Lcom/wire/android/di/accountScoped/AuthenticationModule;Lcom/wire/android/di/accountScoped/BackupModule;Lcom/wire/android/di/accountScoped/CallsModule;Lcom/wire/android/di/accountScoped/CellsModule;Lcom/wire/android/di/accountScoped/ChannelsModule;Lcom/wire/android/di/accountScoped/ClientModule;Lcom/wire/android/di/accountScoped/ConnectionModule;Lcom/wire/android/di/accountScoped/ConversationModule;Lcom/wire/android/di/accountScoped/DebugModule;Lcom/wire/android/di/ImageLoadingModule;Lcom/wire/android/di/accountScoped/MessageModule;Lcom/wire/android/di/accountScoped/SearchModule;Lcom/wire/android/di/accountScoped/ServicesModule;Lcom/wire/android/di/SessionModule;Lcom/wire/android/di/accountScoped/TeamModule;Lcom/wire/android/di/UseCaseModule;Lcom/wire/android/di/accountScoped/UserModule;Landroidx/lifecycle/SavedStateHandle;Ldagger/hilt/android/ViewModelLifecycle;)V -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ViewModelCImpl;->monitorSyncWorkUseCase()Lcom/wire/android/sync/MonitorSyncWorkUseCase; -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ViewModelCImpl;->validateSSOCodeUseCase()Lcom/wire/kalium/logic/feature/auth/sso/ValidateSSOCodeUseCase; -Lcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ViewModelCImpl$SwitchingProvider; -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ViewModelCImpl$SwitchingProvider;->(Lcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$SingletonCImpl;Lcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ActivityRetainedCImpl;Lcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ViewModelCImpl;I)V -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ViewModelCImpl$SwitchingProvider;->get()Ljava/lang/Object; -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ViewModelCImpl$SwitchingProvider;->get0()Ljava/lang/Object; -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ViewModelCImpl$SwitchingProvider;->get3()Ljava/lang/Object; -Lcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ViewModelCImpl$SwitchingProvider$1; -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ViewModelCImpl$SwitchingProvider$1;->(Lcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ViewModelCImpl$SwitchingProvider;)V -Lcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ViewModelCImpl$SwitchingProvider$2; -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ViewModelCImpl$SwitchingProvider$2;->(Lcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ViewModelCImpl$SwitchingProvider;)V -Lcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ViewModelCImpl$SwitchingProvider$3; -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ViewModelCImpl$SwitchingProvider$3;->(Lcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ViewModelCImpl$SwitchingProvider;)V -Lcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ViewModelCImpl$SwitchingProvider$4; -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ViewModelCImpl$SwitchingProvider$4;->(Lcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ViewModelCImpl$SwitchingProvider;)V -Lcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ViewModelCImpl$SwitchingProvider$5; -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ViewModelCImpl$SwitchingProvider$5;->(Lcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ViewModelCImpl$SwitchingProvider;)V -Lcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ViewModelCImpl$SwitchingProvider$6; -SPLcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ViewModelCImpl$SwitchingProvider$6;->(Lcom/wire/android/DaggerWireApplication_HiltComponents_SingletonC$ViewModelCImpl$SwitchingProvider;)V Lcom/wire/android/ExternalLoggerManager; SPLcom/wire/android/ExternalLoggerManager;->()V SPLcom/wire/android/ExternalLoggerManager;->()V @@ -24344,15 +24224,6 @@ SPLcom/wire/android/GlobalObserversManager$setUpNotifications$3;->create(Ljava/l SPLcom/wire/android/GlobalObserversManager$setUpNotifications$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; SPLcom/wire/android/GlobalObserversManager$setUpNotifications$3;->invoke(Ljava/util/List;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; SPLcom/wire/android/GlobalObserversManager$setUpNotifications$3;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; -Lcom/wire/android/Hilt_WireApplication; -SPLcom/wire/android/Hilt_WireApplication;->()V -SPLcom/wire/android/Hilt_WireApplication;->componentManager()Ldagger/hilt/android/internal/managers/ApplicationComponentManager; -SPLcom/wire/android/Hilt_WireApplication;->generatedComponent()Ljava/lang/Object; -SPLcom/wire/android/Hilt_WireApplication;->hiltInternalInject()V -SPLcom/wire/android/Hilt_WireApplication;->onCreate()V -Lcom/wire/android/Hilt_WireApplication$1; -SPLcom/wire/android/Hilt_WireApplication$1;->(Lcom/wire/android/Hilt_WireApplication;)V -SPLcom/wire/android/Hilt_WireApplication$1;->get()Ljava/lang/Object; Lcom/wire/android/R$drawable; Lcom/wire/android/R$string; Lcom/wire/android/WireApplication; @@ -24365,15 +24236,8 @@ SPLcom/wire/android/WireApplication;->access$observeCallBackgroundState$lambda$1 SPLcom/wire/android/WireApplication;->access$observeCallBackgroundState(Lcom/wire/android/WireApplication;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; SPLcom/wire/android/WireApplication;->access$observeRecentlyEndedCall(Lcom/wire/android/WireApplication;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; SPLcom/wire/android/WireApplication;->enableStrictMode()V -SPLcom/wire/android/WireApplication;->getCoreLogic()Ldagger/Lazy; SPLcom/wire/android/WireApplication;->getCurrentScreenManager()Lcom/wire/android/util/CurrentScreenManager; SPLcom/wire/android/WireApplication;->getGlobalAppScope()Lkotlinx/coroutines/CoroutineScope; -SPLcom/wire/android/WireApplication;->getGlobalDataStore()Ldagger/Lazy; -SPLcom/wire/android/WireApplication;->getGlobalObserversManager()Ldagger/Lazy; -SPLcom/wire/android/WireApplication;->getLogFileWriter()Ldagger/Lazy; -SPLcom/wire/android/WireApplication;->getSyncLifecycleManager()Ldagger/Lazy; -SPLcom/wire/android/WireApplication;->getUserDataStoreProvider()Ldagger/Lazy; -SPLcom/wire/android/WireApplication;->getWireWorkerFactory()Ldagger/Lazy; SPLcom/wire/android/WireApplication;->getWorkManagerConfiguration()Landroidx/work/Configuration; SPLcom/wire/android/WireApplication;->initializeAnonymousAnalytics()V SPLcom/wire/android/WireApplication;->initializeApplicationLoggingFrameworks(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; @@ -24543,31 +24407,9 @@ PLcom/wire/android/WireApplication$startActivityLifecycleCallback$1;->onActivity SPLcom/wire/android/WireApplication$startActivityLifecycleCallback$1;->onActivityStarted(Landroid/app/Activity;)V PLcom/wire/android/WireApplication$startActivityLifecycleCallback$1;->onActivityStopped(Landroid/app/Activity;)V Lcom/wire/android/WireApplication_GeneratedInjector; -Lcom/wire/android/WireApplication_HiltComponents$ActivityC; -SPLcom/wire/android/WireApplication_HiltComponents$ActivityC;->()V -Lcom/wire/android/WireApplication_HiltComponents$ActivityC$Builder; -Lcom/wire/android/WireApplication_HiltComponents$ActivityRetainedC; -SPLcom/wire/android/WireApplication_HiltComponents$ActivityRetainedC;->()V -Lcom/wire/android/WireApplication_HiltComponents$ActivityRetainedC$Builder; -Lcom/wire/android/WireApplication_HiltComponents$ServiceC; -SPLcom/wire/android/WireApplication_HiltComponents$ServiceC;->()V -Lcom/wire/android/WireApplication_HiltComponents$ServiceC$Builder; -Lcom/wire/android/WireApplication_HiltComponents$SingletonC; -SPLcom/wire/android/WireApplication_HiltComponents$SingletonC;->()V -Lcom/wire/android/WireApplication_HiltComponents$ViewModelC; -SPLcom/wire/android/WireApplication_HiltComponents$ViewModelC;->()V -Lcom/wire/android/WireApplication_HiltComponents$ViewModelC$Builder; Lcom/wire/android/WireApplication_MembersInjector; -SPLcom/wire/android/WireApplication_MembersInjector;->injectAnalyticsManager(Lcom/wire/android/WireApplication;Ldagger/Lazy;)V -SPLcom/wire/android/WireApplication_MembersInjector;->injectCoreLogic(Lcom/wire/android/WireApplication;Ldagger/Lazy;)V SPLcom/wire/android/WireApplication_MembersInjector;->injectCurrentScreenManager(Lcom/wire/android/WireApplication;Lcom/wire/android/util/CurrentScreenManager;)V SPLcom/wire/android/WireApplication_MembersInjector;->injectGlobalAppScope(Lcom/wire/android/WireApplication;Lkotlinx/coroutines/CoroutineScope;)V -SPLcom/wire/android/WireApplication_MembersInjector;->injectGlobalDataStore(Lcom/wire/android/WireApplication;Ldagger/Lazy;)V -SPLcom/wire/android/WireApplication_MembersInjector;->injectGlobalObserversManager(Lcom/wire/android/WireApplication;Ldagger/Lazy;)V -SPLcom/wire/android/WireApplication_MembersInjector;->injectLogFileWriter(Lcom/wire/android/WireApplication;Ldagger/Lazy;)V -SPLcom/wire/android/WireApplication_MembersInjector;->injectSyncLifecycleManager(Lcom/wire/android/WireApplication;Ldagger/Lazy;)V -SPLcom/wire/android/WireApplication_MembersInjector;->injectUserDataStoreProvider(Lcom/wire/android/WireApplication;Ldagger/Lazy;)V -SPLcom/wire/android/WireApplication_MembersInjector;->injectWireWorkerFactory(Lcom/wire/android/WireApplication;Ldagger/Lazy;)V SPLcom/wire/android/WireApplication_MembersInjector;->injectWorkManager(Lcom/wire/android/WireApplication;Landroidx/work/WorkManager;)V Lcom/wire/android/analytics/ObserveCurrentSessionAnalyticsUseCase; Lcom/wire/android/analytics/ObserveCurrentSessionAnalyticsUseCaseKt; @@ -24838,23 +24680,6 @@ SPLcom/wire/android/di/accountScoped/TeamModule;->()V Lcom/wire/android/di/accountScoped/UserModule; SPLcom/wire/android/di/accountScoped/UserModule;->()V SPLcom/wire/android/di/accountScoped/UserModule;->()V -Lcom/wire/android/di/metro/AuthenticationViewModelGraphBridge; -SPLcom/wire/android/di/metro/AuthenticationViewModelGraphBridge;->()V -SPLcom/wire/android/di/metro/AuthenticationViewModelGraphBridge;->(Ljavax/inject/Provider;)V -SPLcom/wire/android/di/metro/AuthenticationViewModelGraphBridge;->getAuthenticationViewModelFactory()Lcom/wire/android/ui/authentication/AuthenticationViewModelFactory; -SPLcom/wire/android/di/metro/AuthenticationViewModelGraphBridge;->getViewModelScopeKey()Ljava/lang/String; -Lcom/wire/android/di/metro/AuthenticationViewModelGraphBridge_HiltModules$KeyModule; -SPLcom/wire/android/di/metro/AuthenticationViewModelGraphBridge_HiltModules$KeyModule;->provide()Z -Lcom/wire/android/di/metro/AuthenticationViewModelGraphBridge_HiltModules_BindsModule_Binds_LazyMapKey; -SPLcom/wire/android/di/metro/AuthenticationViewModelGraphBridge_HiltModules_BindsModule_Binds_LazyMapKey;->()V -Lcom/wire/android/di/metro/AuthenticationViewModelGraphBridge_HiltModules_KeyModule_Provide_LazyMapKey; -SPLcom/wire/android/di/metro/AuthenticationViewModelGraphBridge_HiltModules_KeyModule_Provide_LazyMapKey;->()V -Lcom/wire/android/di/metro/ImageAssetViewModelGraphBridgeViewModel_HiltModules$KeyModule; -SPLcom/wire/android/di/metro/ImageAssetViewModelGraphBridgeViewModel_HiltModules$KeyModule;->provide()Z -Lcom/wire/android/di/metro/ImageAssetViewModelGraphBridgeViewModel_HiltModules_BindsModule_Binds_LazyMapKey; -SPLcom/wire/android/di/metro/ImageAssetViewModelGraphBridgeViewModel_HiltModules_BindsModule_Binds_LazyMapKey;->()V -Lcom/wire/android/di/metro/ImageAssetViewModelGraphBridgeViewModel_HiltModules_KeyModule_Provide_LazyMapKey; -SPLcom/wire/android/di/metro/ImageAssetViewModelGraphBridgeViewModel_HiltModules_KeyModule_Provide_LazyMapKey;->()V Lcom/wire/android/di/metro/MetroViewModelGraph; SPLcom/wire/android/di/metro/MetroViewModelGraph;->getViewModelScopeKey()Ljava/lang/String; Lcom/wire/android/di/metro/MetroViewModelGraphKt; @@ -24863,12 +24688,6 @@ SPLcom/wire/android/di/metro/MetroViewModelGraphKt;->getLocalMetroViewModelGraph SPLcom/wire/android/di/metro/MetroViewModelGraphKt;->scopedMetroViewModelKey(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; Lcom/wire/android/di/metro/MetroViewModelGraphKt$$ExternalSyntheticLambda0; SPLcom/wire/android/di/metro/MetroViewModelGraphKt$$ExternalSyntheticLambda0;->()V -Lcom/wire/android/di/metro/WireActivityViewModelGraphBridge_HiltModules$KeyModule; -SPLcom/wire/android/di/metro/WireActivityViewModelGraphBridge_HiltModules$KeyModule;->provide()Z -Lcom/wire/android/di/metro/WireActivityViewModelGraphBridge_HiltModules_BindsModule_Binds_LazyMapKey; -SPLcom/wire/android/di/metro/WireActivityViewModelGraphBridge_HiltModules_BindsModule_Binds_LazyMapKey;->()V -Lcom/wire/android/di/metro/WireActivityViewModelGraphBridge_HiltModules_KeyModule_Provide_LazyMapKey; -SPLcom/wire/android/di/metro/WireActivityViewModelGraphBridge_HiltModules_KeyModule_Provide_LazyMapKey;->()V Lcom/wire/android/emm/AndroidUserContextProvider; Lcom/wire/android/emm/AndroidUserContextProviderImpl; SPLcom/wire/android/emm/AndroidUserContextProviderImpl;->()V @@ -24955,7 +24774,6 @@ SPLcom/wire/android/emm/ManagedConfigurationsManagerImpl$refreshServerConfig$2;- SPLcom/wire/android/emm/ManagedConfigurationsManagerImpl$refreshServerConfig$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Lcom/wire/android/emm/ManagedConfigurationsReceiver; SPLcom/wire/android/emm/ManagedConfigurationsReceiver;->()V -SPLcom/wire/android/emm/ManagedConfigurationsReceiver;->(Lcom/wire/android/emm/ManagedConfigurationsManager;Lcom/wire/android/emm/ManagedConfigurationsReporter;Ldagger/Lazy;Lcom/wire/android/feature/StartPersistentWebsocketIfNecessaryUseCase;Lcom/wire/android/util/dispatchers/DispatcherProvider;)V Lcom/wire/android/emm/ManagedConfigurationsReceiver$$ExternalSyntheticLambda0; SPLcom/wire/android/emm/ManagedConfigurationsReceiver$$ExternalSyntheticLambda0;->(Lcom/wire/android/util/dispatchers/DispatcherProvider;)V Lcom/wire/android/emm/ManagedConfigurationsReceiver$Companion; @@ -25155,7 +24973,6 @@ SPLcom/wire/android/navigation/BackStackMode;->(Ljava/lang/String;I)V SPLcom/wire/android/navigation/BackStackMode;->values()[Lcom/wire/android/navigation/BackStackMode; Lcom/wire/android/navigation/LoginTypeSelector; SPLcom/wire/android/navigation/LoginTypeSelector;->()V -SPLcom/wire/android/navigation/LoginTypeSelector;->(Ldagger/Lazy;Z)V SPLcom/wire/android/navigation/LoginTypeSelector;->canUseNewLogin()Z Lcom/wire/android/navigation/MainNavHostKt; SPLcom/wire/android/navigation/MainNavHostKt;->$r8$lambda$UtMDtvSRMBQtWOueEVs-DoXq83M(Lcom/wire/android/navigation/Navigator;Lcom/ramcosta/composedestinations/spec/Direction;Lcom/ramcosta/composedestinations/spec/NavHostEngine;Lcom/wire/android/navigation/LoginTypeSelector;Landroidx/compose/runtime/Composer;I)Lkotlin/Unit; @@ -25474,15 +25291,6 @@ SPLcom/wire/android/services/CallService$ServiceState;->()V SPLcom/wire/android/services/CallService$ServiceState;->(Ljava/lang/String;I)V SPLcom/wire/android/services/CallService$ServiceState;->values()[Lcom/wire/android/services/CallService$ServiceState; Lcom/wire/android/services/CallService_GeneratedInjector; -Lcom/wire/android/services/Hilt_CallService; -Lcom/wire/android/services/Hilt_PersistentWebSocketService; -Lcom/wire/android/services/Hilt_WireFirebaseMessagingService; -SPLcom/wire/android/services/Hilt_WireFirebaseMessagingService;->()V -SPLcom/wire/android/services/Hilt_WireFirebaseMessagingService;->componentManager()Ldagger/hilt/android/internal/managers/ServiceComponentManager; -SPLcom/wire/android/services/Hilt_WireFirebaseMessagingService;->createComponentManager()Ldagger/hilt/android/internal/managers/ServiceComponentManager; -SPLcom/wire/android/services/Hilt_WireFirebaseMessagingService;->generatedComponent()Ljava/lang/Object; -SPLcom/wire/android/services/Hilt_WireFirebaseMessagingService;->inject()V -SPLcom/wire/android/services/Hilt_WireFirebaseMessagingService;->onCreate()V Lcom/wire/android/services/PersistentWebSocketService; SPLcom/wire/android/services/PersistentWebSocketService;->()V Lcom/wire/android/services/PersistentWebSocketService$Companion; @@ -25615,20 +25423,6 @@ SPLcom/wire/android/ui/GlobalAppState;->getScreenshotCensoringEnabled()Z SPLcom/wire/android/ui/GlobalAppState;->getThemeOption()Lcom/wire/android/ui/theme/ThemeOption; SPLcom/wire/android/ui/GlobalAppState;->getUpdateAppDialog()Z SPLcom/wire/android/ui/GlobalAppState;->getUserAccent()Lcom/wire/android/ui/theme/Accent; -Lcom/wire/android/ui/Hilt_WireActivity; -SPLcom/wire/android/ui/Hilt_WireActivity;->()V -SPLcom/wire/android/ui/Hilt_WireActivity;->_initHiltInternal()V -SPLcom/wire/android/ui/Hilt_WireActivity;->componentManager()Ldagger/hilt/android/internal/managers/ActivityComponentManager; -SPLcom/wire/android/ui/Hilt_WireActivity;->createComponentManager()Ldagger/hilt/android/internal/managers/ActivityComponentManager; -SPLcom/wire/android/ui/Hilt_WireActivity;->generatedComponent()Ljava/lang/Object; -SPLcom/wire/android/ui/Hilt_WireActivity;->getDefaultViewModelProviderFactory()Landroidx/lifecycle/ViewModelProvider$Factory; -SPLcom/wire/android/ui/Hilt_WireActivity;->initSavedStateHandleHolders()V -SPLcom/wire/android/ui/Hilt_WireActivity;->inject()V -SPLcom/wire/android/ui/Hilt_WireActivity;->onCreate(Landroid/os/Bundle;)V -PLcom/wire/android/ui/Hilt_WireActivity;->onDestroy()V -Lcom/wire/android/ui/Hilt_WireActivity$1; -SPLcom/wire/android/ui/Hilt_WireActivity$1;->(Lcom/wire/android/ui/Hilt_WireActivity;)V -SPLcom/wire/android/ui/Hilt_WireActivity$1;->onContextAvailable(Landroid/content/Context;)V Lcom/wire/android/ui/InitialAppState; SPLcom/wire/android/ui/InitialAppState;->$values()[Lcom/wire/android/ui/InitialAppState; SPLcom/wire/android/ui/InitialAppState;->()V @@ -25643,9 +25437,7 @@ SPLcom/wire/android/ui/NewClientsData$Companion;->fromUseCaseResul(Lcom/wire/kal Lcom/wire/android/ui/WireActivity; SPLcom/wire/android/ui/WireActivity;->$r8$lambda$Jriohp3hyV2ICZJTwjIAq4y4ScE(Landroidx/compose/runtime/State;Landroidx/navigation/NavController;Landroidx/navigation/NavDestination;Landroid/os/Bundle;)V SPLcom/wire/android/ui/WireActivity;->$r8$lambda$LRJ-cxygGiAOoRSsZ8mRuWxZjK4(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;)Lkotlin/Unit; -SPLcom/wire/android/ui/WireActivity;->$r8$lambda$MF3jCx_UNS8GMWwtqP2H05M1KV4(Lcom/wire/android/ui/WireActivityScopedViewModels;Lcom/wire/android/ui/WireActivity;Lcom/ramcosta/composedestinations/spec/Direction;Lcom/wire/android/di/metro/WireActivityViewModelGraphBridge;Lcom/wire/android/di/metro/AuthenticationViewModelGraphBridge;Landroidx/compose/runtime/Composer;I)Lkotlin/Unit; SPLcom/wire/android/ui/WireActivity;->$r8$lambda$MrhMqniB8HLPF4VQkD1ph1dUekY(Lcom/wire/android/ui/WireActivity;Lcom/wire/android/navigation/Navigator;Landroidx/compose/runtime/DisposableEffectScope;)Landroidx/compose/runtime/DisposableEffectResult; -SPLcom/wire/android/ui/WireActivity;->$r8$lambda$PMFFlwcNyxdYD7wxjwN8c7T3T9g(Lcom/wire/android/ui/WireActivity;Lcom/ramcosta/composedestinations/spec/Direction;Lcom/wire/android/di/metro/WireActivityViewModelGraphBridge;Lcom/wire/android/di/metro/AuthenticationViewModelGraphBridge;Lcom/wire/android/ui/WireActivityScopedViewModels;Landroidx/compose/runtime/Composer;I)Lkotlin/Unit; SPLcom/wire/android/ui/WireActivity;->$r8$lambda$_bhPTCOEwxuYhXYODJoqqvsvPkI(Lcom/wire/android/navigation/Navigator;Lcom/wire/android/navigation/NavigationCommand;)V SPLcom/wire/android/ui/WireActivity;->$r8$lambda$fnvXzGLcRJj4A6Xf6_ytqF97mUY(Landroidx/compose/runtime/State;)Lcom/wire/android/navigation/style/BackgroundType; SPLcom/wire/android/ui/WireActivity;->$r8$lambda$w9nK6J5zLMYrbl2i83OyPxTXS_Q(Lcom/wire/android/ui/WireActivity;Lcom/wire/android/navigation/NavigationCommand;)Z @@ -25673,7 +25465,6 @@ SPLcom/wire/android/ui/WireActivity;->access$setComposableContent(Lcom/wire/andr SPLcom/wire/android/ui/WireActivity;->access$setShouldKeepSplashOpen$p(Lcom/wire/android/ui/WireActivity;Z)V SPLcom/wire/android/ui/WireActivity;->getCurrentScreenManager()Lcom/wire/android/util/CurrentScreenManager; SPLcom/wire/android/ui/WireActivity;->getDynamicReceiversManager()Lcom/wire/android/notification/broadcastreceivers/DynamicReceiversManager; -SPLcom/wire/android/ui/WireActivity;->getLockCodeTimeManager()Ldagger/Lazy; SPLcom/wire/android/ui/WireActivity;->getLoginTypeSelector()Lcom/wire/android/navigation/LoginTypeSelector; SPLcom/wire/android/ui/WireActivity;->getManagedConfigurationsManager()Lcom/wire/android/emm/ManagedConfigurationsManager; SPLcom/wire/android/ui/WireActivity;->getOriginalIntent(Landroid/os/Bundle;)Landroid/content/Intent; @@ -25692,15 +25483,11 @@ SPLcom/wire/android/ui/WireActivity;->onStart()V PLcom/wire/android/ui/WireActivity;->onStop()V SPLcom/wire/android/ui/WireActivity;->rememberMetroViewModelGraph$lambda$1(Landroidx/compose/runtime/MutableState;)Z SPLcom/wire/android/ui/WireActivity;->rememberMetroViewModelGraph$lambda$2(Landroidx/compose/runtime/MutableState;Z)V -SPLcom/wire/android/ui/WireActivity;->rememberMetroViewModelGraph(Ljava/lang/String;Ljava/lang/String;Lcom/wire/android/di/metro/WireActivityViewModelGraphBridge;Lcom/wire/android/di/metro/AuthenticationViewModelGraphBridge;Landroidx/compose/runtime/Composer;I)Lcom/wire/android/di/metro/MetroViewModelGraph; -SPLcom/wire/android/ui/WireActivity;->selectMetroViewModelGraph(Ljava/lang/String;ZZLcom/wire/android/di/metro/WireActivityViewModelGraphBridge;Lcom/wire/android/di/metro/AuthenticationViewModelGraphBridge;)Lcom/wire/android/di/metro/MetroViewModelGraph; SPLcom/wire/android/ui/WireActivity;->setComposableContent$lambda$0$3$1$1$0(Lcom/wire/android/ui/WireActivity;Lcom/wire/android/navigation/NavigationCommand;)Z SPLcom/wire/android/ui/WireActivity;->setComposableContent$lambda$0$3$1$2$0(Landroidx/compose/runtime/State;)Lcom/wire/android/navigation/style/BackgroundType; SPLcom/wire/android/ui/WireActivity;->setComposableContent$lambda$0$3$1$3(Landroidx/compose/runtime/State;)Lcom/wire/android/navigation/style/BackgroundType; SPLcom/wire/android/ui/WireActivity;->setComposableContent$lambda$0$3$1$4$0$0$0(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;)Lkotlin/Unit; SPLcom/wire/android/ui/WireActivity;->setComposableContent$lambda$0$3$1$4$0(Lcom/wire/android/ui/WireActivityScopedViewModels;Lcom/wire/android/navigation/Navigator;Lcom/wire/android/ui/WireActivity;Lcom/ramcosta/composedestinations/spec/Direction;Landroidx/compose/runtime/State;Landroidx/compose/runtime/Composer;I)Lkotlin/Unit; -SPLcom/wire/android/ui/WireActivity;->setComposableContent$lambda$0$3$1(Lcom/wire/android/ui/WireActivity;Lcom/ramcosta/composedestinations/spec/Direction;Lcom/wire/android/di/metro/WireActivityViewModelGraphBridge;Lcom/wire/android/di/metro/AuthenticationViewModelGraphBridge;Lcom/wire/android/ui/WireActivityScopedViewModels;Landroidx/compose/runtime/Composer;I)Lkotlin/Unit; -SPLcom/wire/android/ui/WireActivity;->setComposableContent$lambda$0$3(Lcom/wire/android/ui/WireActivityScopedViewModels;Lcom/wire/android/ui/WireActivity;Lcom/ramcosta/composedestinations/spec/Direction;Lcom/wire/android/di/metro/WireActivityViewModelGraphBridge;Lcom/wire/android/di/metro/AuthenticationViewModelGraphBridge;Landroidx/compose/runtime/Composer;I)Lkotlin/Unit; SPLcom/wire/android/ui/WireActivity;->setComposableContent$lambda$0(Lcom/wire/android/ui/WireActivity;Lcom/ramcosta/composedestinations/spec/Direction;Landroidx/compose/runtime/Composer;I)Lkotlin/Unit; SPLcom/wire/android/ui/WireActivity;->setComposableContent(Lcom/ramcosta/composedestinations/spec/Direction;)V Lcom/wire/android/ui/WireActivity$$ExternalSyntheticLambda1; @@ -25726,7 +25513,6 @@ Lcom/wire/android/ui/WireActivity$$ExternalSyntheticLambda3; SPLcom/wire/android/ui/WireActivity$$ExternalSyntheticLambda3;->(Landroidx/compose/runtime/State;)V SPLcom/wire/android/ui/WireActivity$$ExternalSyntheticLambda3;->invoke()Ljava/lang/Object; Lcom/wire/android/ui/WireActivity$$ExternalSyntheticLambda33; -SPLcom/wire/android/ui/WireActivity$$ExternalSyntheticLambda33;->(Lcom/wire/android/ui/WireActivity;Lcom/ramcosta/composedestinations/spec/Direction;Lcom/wire/android/di/metro/WireActivityViewModelGraphBridge;Lcom/wire/android/di/metro/AuthenticationViewModelGraphBridge;Lcom/wire/android/ui/WireActivityScopedViewModels;)V SPLcom/wire/android/ui/WireActivity$$ExternalSyntheticLambda33;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Lcom/wire/android/ui/WireActivity$$ExternalSyntheticLambda36; SPLcom/wire/android/ui/WireActivity$$ExternalSyntheticLambda36;->(Lcom/wire/android/navigation/Navigator;Lcom/wire/android/ui/WireActivity;Landroidx/compose/runtime/State;)V @@ -25744,7 +25530,6 @@ Lcom/wire/android/ui/WireActivity$$ExternalSyntheticLambda41; SPLcom/wire/android/ui/WireActivity$$ExternalSyntheticLambda41;->(Landroidx/compose/runtime/State;)V SPLcom/wire/android/ui/WireActivity$$ExternalSyntheticLambda41;->onDestinationChanged(Landroidx/navigation/NavController;Landroidx/navigation/NavDestination;Landroid/os/Bundle;)V Lcom/wire/android/ui/WireActivity$$ExternalSyntheticLambda6; -SPLcom/wire/android/ui/WireActivity$$ExternalSyntheticLambda6;->(Lcom/wire/android/ui/WireActivityScopedViewModels;Lcom/wire/android/ui/WireActivity;Lcom/ramcosta/composedestinations/spec/Direction;Lcom/wire/android/di/metro/WireActivityViewModelGraphBridge;Lcom/wire/android/di/metro/AuthenticationViewModelGraphBridge;)V SPLcom/wire/android/ui/WireActivity$$ExternalSyntheticLambda6;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Lcom/wire/android/ui/WireActivity$$ExternalSyntheticLambda7; SPLcom/wire/android/ui/WireActivity$$ExternalSyntheticLambda7;->(Lcom/wire/android/ui/WireActivity;Lcom/ramcosta/composedestinations/spec/Direction;)V @@ -25858,20 +25643,12 @@ Lcom/wire/android/ui/WireActivityKt$$ExternalSyntheticLambda0; SPLcom/wire/android/ui/WireActivityKt$$ExternalSyntheticLambda0;->()V Lcom/wire/android/ui/WireActivityViewModel; SPLcom/wire/android/ui/WireActivityViewModel;->()V -SPLcom/wire/android/ui/WireActivityViewModel;->(Ldagger/Lazy;Lcom/wire/android/util/dispatchers/DispatcherProvider;Ldagger/Lazy;Ldagger/Lazy;Ldagger/Lazy;Ldagger/Lazy;Ldagger/Lazy;Ldagger/Lazy;Ldagger/Lazy;Ldagger/Lazy;Lcom/wire/android/di/ObserveSyncStateUseCaseProvider$Factory;Ldagger/Lazy;Ldagger/Lazy;Ldagger/Lazy;Ldagger/Lazy;Lcom/wire/android/di/ObserveScreenshotCensoringConfigUseCaseProvider$Factory;Ldagger/Lazy;Lcom/wire/android/di/ObserveIfE2EIRequiredDuringLoginUseCaseProvider$Factory;Ldagger/Lazy;Lcom/wire/android/di/IsProfileQRCodeEnabledUseCaseProvider$Factory;Lcom/wire/android/di/ObserveSelfUserUseCaseProvider$Factory;Lcom/wire/android/sync/MonitorSyncWorkUseCase;Lcom/wire/android/emm/ManagedConfigurationsManager;Lcom/wire/android/util/lifecycle/AutomatedLoginManager;Lcom/wire/android/config/NomadProfilesFeatureConfig;Lcom/wire/android/navigation/LoginTypeSelector;Ldagger/Lazy;)V SPLcom/wire/android/ui/WireActivityViewModel;->access$currentValidUserId(Lcom/wire/android/ui/WireActivityViewModel;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -SPLcom/wire/android/ui/WireActivityViewModel;->access$getCoreLogic$p(Lcom/wire/android/ui/WireActivityViewModel;)Ldagger/Lazy; -SPLcom/wire/android/ui/WireActivityViewModel;->access$getCurrentScreenManager$p(Lcom/wire/android/ui/WireActivityViewModel;)Ldagger/Lazy; SPLcom/wire/android/ui/WireActivityViewModel;->access$getDispatchers$p(Lcom/wire/android/ui/WireActivityViewModel;)Lcom/wire/android/util/dispatchers/DispatcherProvider; -SPLcom/wire/android/ui/WireActivityViewModel;->access$getGlobalDataStore$p(Lcom/wire/android/ui/WireActivityViewModel;)Ldagger/Lazy; SPLcom/wire/android/ui/WireActivityViewModel;->access$getManagedConfigurationsManager$p(Lcom/wire/android/ui/WireActivityViewModel;)Lcom/wire/android/emm/ManagedConfigurationsManager; SPLcom/wire/android/ui/WireActivityViewModel;->access$getMonitorSyncWorkUseCase$p(Lcom/wire/android/ui/WireActivityViewModel;)Lcom/wire/android/sync/MonitorSyncWorkUseCase; SPLcom/wire/android/ui/WireActivityViewModel;->access$getObserveCurrentAccountInfo$p(Lcom/wire/android/ui/WireActivityViewModel;)Lkotlinx/coroutines/flow/SharedFlow; SPLcom/wire/android/ui/WireActivityViewModel;->access$getObserveCurrentValidUserId$p(Lcom/wire/android/ui/WireActivityViewModel;)Lkotlinx/coroutines/flow/SharedFlow; -SPLcom/wire/android/ui/WireActivityViewModel;->access$getObserveIfAppUpdateRequired$p(Lcom/wire/android/ui/WireActivityViewModel;)Ldagger/Lazy; -SPLcom/wire/android/ui/WireActivityViewModel;->access$getObserveNewClients$p(Lcom/wire/android/ui/WireActivityViewModel;)Ldagger/Lazy; -SPLcom/wire/android/ui/WireActivityViewModel;->access$getServicesManager$p(Lcom/wire/android/ui/WireActivityViewModel;)Ldagger/Lazy; -SPLcom/wire/android/ui/WireActivityViewModel;->access$getWorkManager$p(Lcom/wire/android/ui/WireActivityViewModel;)Ldagger/Lazy; SPLcom/wire/android/ui/WireActivityViewModel;->access$get_observeSyncFlowState$p(Lcom/wire/android/ui/WireActivityViewModel;)Lkotlinx/coroutines/flow/MutableStateFlow; SPLcom/wire/android/ui/WireActivityViewModel;->access$isGlobalDialogAllowed(Lcom/wire/android/ui/WireActivityViewModel;Lcom/wire/android/util/CurrentScreen;)Z SPLcom/wire/android/ui/WireActivityViewModel;->access$setGlobalAppState(Lcom/wire/android/ui/WireActivityViewModel;Lcom/wire/android/ui/GlobalAppState;)V @@ -26050,17 +25827,10 @@ Lcom/wire/android/ui/WireActivityViewModel$validSessionsFlow$$inlined$map$1$2$1; SPLcom/wire/android/ui/WireActivityViewModel$validSessionsFlow$$inlined$map$1$2$1;->(Lcom/wire/android/ui/WireActivityViewModel$validSessionsFlow$$inlined$map$1$2;Lkotlin/coroutines/Continuation;)V Lcom/wire/android/ui/WireActivityViewModel$validSessionsFlow$1; SPLcom/wire/android/ui/WireActivityViewModel$validSessionsFlow$1;->(Lcom/wire/android/ui/WireActivityViewModel;Lkotlin/coroutines/Continuation;)V -Lcom/wire/android/ui/WireActivityViewModel_HiltModules$KeyModule; -SPLcom/wire/android/ui/WireActivityViewModel_HiltModules$KeyModule;->provide()Z -Lcom/wire/android/ui/WireActivityViewModel_HiltModules_BindsModule_Binds_LazyMapKey; -SPLcom/wire/android/ui/WireActivityViewModel_HiltModules_BindsModule_Binds_LazyMapKey;->()V -Lcom/wire/android/ui/WireActivityViewModel_HiltModules_KeyModule_Provide_LazyMapKey; -SPLcom/wire/android/ui/WireActivityViewModel_HiltModules_KeyModule_Provide_LazyMapKey;->()V Lcom/wire/android/ui/WireActivity_GeneratedInjector; Lcom/wire/android/ui/WireActivity_MembersInjector; SPLcom/wire/android/ui/WireActivity_MembersInjector;->injectCurrentScreenManager(Lcom/wire/android/ui/WireActivity;Lcom/wire/android/util/CurrentScreenManager;)V SPLcom/wire/android/ui/WireActivity_MembersInjector;->injectDynamicReceiversManager(Lcom/wire/android/ui/WireActivity;Lcom/wire/android/notification/broadcastreceivers/DynamicReceiversManager;)V -SPLcom/wire/android/ui/WireActivity_MembersInjector;->injectLockCodeTimeManager(Lcom/wire/android/ui/WireActivity;Ldagger/Lazy;)V SPLcom/wire/android/ui/WireActivity_MembersInjector;->injectLoginTypeSelector(Lcom/wire/android/ui/WireActivity;Lcom/wire/android/navigation/LoginTypeSelector;)V SPLcom/wire/android/ui/WireActivity_MembersInjector;->injectManagedConfigurationsManager(Lcom/wire/android/ui/WireActivity;Lcom/wire/android/emm/ManagedConfigurationsManager;)V SPLcom/wire/android/ui/WireActivity_MembersInjector;->injectSwitchAccountObserver(Lcom/wire/android/ui/WireActivity;Lcom/wire/android/util/SwitchAccountObserver;)V @@ -26527,10 +26297,6 @@ Lcom/wire/android/ui/common/topappbar/WireTopAppBarKt$$ExternalSyntheticLambda1; SPLcom/wire/android/ui/common/topappbar/WireTopAppBarKt$$ExternalSyntheticLambda1;->(Landroid/content/Context;)V Lcom/wire/android/ui/common/topappbar/WireTopAppBarKt$$ExternalSyntheticLambda2; SPLcom/wire/android/ui/common/topappbar/WireTopAppBarKt$$ExternalSyntheticLambda2;->(Landroid/content/Context;)V -Lcom/wire/android/ui/debug/Hilt_StartServiceReceiver; -SPLcom/wire/android/ui/debug/Hilt_StartServiceReceiver;->()V -SPLcom/wire/android/ui/debug/Hilt_StartServiceReceiver;->inject(Landroid/content/Context;)V -SPLcom/wire/android/ui/debug/Hilt_StartServiceReceiver;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V Lcom/wire/android/ui/debug/StartServiceReceiver; SPLcom/wire/android/ui/debug/StartServiceReceiver;->()V SPLcom/wire/android/ui/debug/StartServiceReceiver;->()V @@ -29246,144 +29012,6 @@ SPLcom/wire/kalium/util/PlatformDateTimeUtil;->fromInstantToIsoDateTimeString(Lk Lcom/wire/kalium/util/serialization/SerializationUtilsKt; SPLcom/wire/kalium/util/serialization/SerializationUtilsKt;->toJsonElement(Ljava/lang/Object;)Lkotlinx/serialization/json/JsonElement; SPLcom/wire/kalium/util/serialization/SerializationUtilsKt;->toJsonObject(Ljava/util/Map;)Lkotlinx/serialization/json/JsonObject; -Ldagger/Lazy; -Ldagger/MembersInjector; -Ldagger/hilt/EntryPoints; -SPLdagger/hilt/EntryPoints;->get(Ljava/lang/Object;Ljava/lang/Class;)Ljava/lang/Object; -Ldagger/hilt/android/ActivityRetainedLifecycle; -Ldagger/hilt/android/EntryPointAccessors; -SPLdagger/hilt/android/EntryPointAccessors;->()V -SPLdagger/hilt/android/EntryPointAccessors;->()V -SPLdagger/hilt/android/EntryPointAccessors;->fromApplication(Landroid/content/Context;Ljava/lang/Class;)Ljava/lang/Object; -Ldagger/hilt/android/ViewModelLifecycle; -Ldagger/hilt/android/components/ActivityComponent; -Ldagger/hilt/android/components/ActivityRetainedComponent; -Ldagger/hilt/android/components/ServiceComponent; -Ldagger/hilt/android/components/ViewModelComponent; -Ldagger/hilt/android/flags/FragmentGetContextFix$FragmentGetContextFixEntryPoint; -Ldagger/hilt/android/internal/Contexts; -SPLdagger/hilt/android/internal/Contexts;->getApplication(Landroid/content/Context;)Landroid/app/Application; -PLdagger/hilt/android/internal/ThreadUtil;->ensureMainThread()V -PLdagger/hilt/android/internal/ThreadUtil;->isMainThread()Z -Ldagger/hilt/android/internal/builders/ActivityComponentBuilder; -Ldagger/hilt/android/internal/builders/ActivityRetainedComponentBuilder; -Ldagger/hilt/android/internal/builders/ServiceComponentBuilder; -Ldagger/hilt/android/internal/builders/ViewModelComponentBuilder; -Ldagger/hilt/android/internal/lifecycle/DefaultViewModelFactories; -SPLdagger/hilt/android/internal/lifecycle/DefaultViewModelFactories;->getActivityFactory(Landroidx/activity/ComponentActivity;Landroidx/lifecycle/ViewModelProvider$Factory;)Landroidx/lifecycle/ViewModelProvider$Factory; -Ldagger/hilt/android/internal/lifecycle/DefaultViewModelFactories$ActivityEntryPoint; -Ldagger/hilt/android/internal/lifecycle/DefaultViewModelFactories$InternalFactoryFactory; -SPLdagger/hilt/android/internal/lifecycle/DefaultViewModelFactories$InternalFactoryFactory;->(Ljava/util/Map;Ldagger/hilt/android/internal/builders/ViewModelComponentBuilder;)V -SPLdagger/hilt/android/internal/lifecycle/DefaultViewModelFactories$InternalFactoryFactory;->fromActivity(Landroidx/activity/ComponentActivity;Landroidx/lifecycle/ViewModelProvider$Factory;)Landroidx/lifecycle/ViewModelProvider$Factory; -SPLdagger/hilt/android/internal/lifecycle/DefaultViewModelFactories$InternalFactoryFactory;->getHiltViewModelFactory(Landroidx/lifecycle/ViewModelProvider$Factory;)Landroidx/lifecycle/ViewModelProvider$Factory; -Ldagger/hilt/android/internal/lifecycle/DefaultViewModelFactories_InternalFactoryFactory_Factory; -SPLdagger/hilt/android/internal/lifecycle/DefaultViewModelFactories_InternalFactoryFactory_Factory;->newInstance(Ljava/util/Map;Ldagger/hilt/android/internal/builders/ViewModelComponentBuilder;)Ldagger/hilt/android/internal/lifecycle/DefaultViewModelFactories$InternalFactoryFactory; -Ldagger/hilt/android/internal/lifecycle/HiltViewModelFactory; -SPLdagger/hilt/android/internal/lifecycle/HiltViewModelFactory;->()V -SPLdagger/hilt/android/internal/lifecycle/HiltViewModelFactory;->(Ljava/util/Map;Landroidx/lifecycle/ViewModelProvider$Factory;Ldagger/hilt/android/internal/builders/ViewModelComponentBuilder;)V -SPLdagger/hilt/android/internal/lifecycle/HiltViewModelFactory;->create(Ljava/lang/Class;Landroidx/lifecycle/viewmodel/CreationExtras;)Landroidx/lifecycle/ViewModel; -SPLdagger/hilt/android/internal/lifecycle/HiltViewModelFactory;->createInternal(Landroid/app/Activity;Landroidx/lifecycle/ViewModelProvider$Factory;)Landroidx/lifecycle/ViewModelProvider$Factory; -Ldagger/hilt/android/internal/lifecycle/HiltViewModelFactory$1; -SPLdagger/hilt/android/internal/lifecycle/HiltViewModelFactory$1;->()V -Ldagger/hilt/android/internal/lifecycle/HiltViewModelFactory$2; -SPLdagger/hilt/android/internal/lifecycle/HiltViewModelFactory$2;->(Ldagger/hilt/android/internal/lifecycle/HiltViewModelFactory;Ldagger/hilt/android/internal/builders/ViewModelComponentBuilder;)V -SPLdagger/hilt/android/internal/lifecycle/HiltViewModelFactory$2;->create(Ljava/lang/Class;Landroidx/lifecycle/viewmodel/CreationExtras;)Landroidx/lifecycle/ViewModel; -SPLdagger/hilt/android/internal/lifecycle/HiltViewModelFactory$2;->createViewModel(Ldagger/hilt/android/components/ViewModelComponent;Ljava/lang/Class;Landroidx/lifecycle/viewmodel/CreationExtras;)Landroidx/lifecycle/ViewModel; -Ldagger/hilt/android/internal/lifecycle/HiltViewModelFactory$2$$ExternalSyntheticLambda0; -SPLdagger/hilt/android/internal/lifecycle/HiltViewModelFactory$2$$ExternalSyntheticLambda0;->(Ldagger/hilt/android/internal/lifecycle/RetainedLifecycleImpl;)V -PLdagger/hilt/android/internal/lifecycle/HiltViewModelFactory$2$$ExternalSyntheticLambda0;->close()V -Ldagger/hilt/android/internal/lifecycle/HiltViewModelFactory$ActivityCreatorEntryPoint; -Ldagger/hilt/android/internal/lifecycle/HiltViewModelFactory$ViewModelFactoriesEntryPoint; -Ldagger/hilt/android/internal/lifecycle/HiltWrapper_HiltViewModelFactory_ActivityCreatorEntryPoint; -Ldagger/hilt/android/internal/lifecycle/RetainedLifecycleImpl; -SPLdagger/hilt/android/internal/lifecycle/RetainedLifecycleImpl;->()V -PLdagger/hilt/android/internal/lifecycle/RetainedLifecycleImpl;->dispatchOnCleared()V -Ldagger/hilt/android/internal/managers/ActivityComponentManager; -SPLdagger/hilt/android/internal/managers/ActivityComponentManager;->(Landroid/app/Activity;)V -PLdagger/hilt/android/internal/managers/ActivityComponentManager;->clearSavedStateHandleHolders()V -SPLdagger/hilt/android/internal/managers/ActivityComponentManager;->createComponent()Ljava/lang/Object; -SPLdagger/hilt/android/internal/managers/ActivityComponentManager;->generatedComponent()Ljava/lang/Object; -SPLdagger/hilt/android/internal/managers/ActivityComponentManager;->initSavedStateHandleHolders()V -Ldagger/hilt/android/internal/managers/ActivityComponentManager$ActivityComponentBuilderEntryPoint; -Ldagger/hilt/android/internal/managers/ActivityRetainedComponentManager; -SPLdagger/hilt/android/internal/managers/ActivityRetainedComponentManager;->(Landroidx/activity/ComponentActivity;)V -SPLdagger/hilt/android/internal/managers/ActivityRetainedComponentManager;->createComponent()Ldagger/hilt/android/components/ActivityRetainedComponent; -SPLdagger/hilt/android/internal/managers/ActivityRetainedComponentManager;->generatedComponent()Ldagger/hilt/android/components/ActivityRetainedComponent; -SPLdagger/hilt/android/internal/managers/ActivityRetainedComponentManager;->generatedComponent()Ljava/lang/Object; -SPLdagger/hilt/android/internal/managers/ActivityRetainedComponentManager;->getSavedStateHandleHolder()Ldagger/hilt/android/internal/managers/SavedStateHandleHolder; -SPLdagger/hilt/android/internal/managers/ActivityRetainedComponentManager;->getViewModelProvider(Landroidx/lifecycle/ViewModelStoreOwner;Landroid/content/Context;)Landroidx/lifecycle/ViewModelProvider; -Ldagger/hilt/android/internal/managers/ActivityRetainedComponentManager$1; -SPLdagger/hilt/android/internal/managers/ActivityRetainedComponentManager$1;->(Ldagger/hilt/android/internal/managers/ActivityRetainedComponentManager;Landroid/content/Context;)V -SPLdagger/hilt/android/internal/managers/ActivityRetainedComponentManager$1;->create(Ljava/lang/Class;Landroidx/lifecycle/viewmodel/CreationExtras;)Landroidx/lifecycle/ViewModel; -Ldagger/hilt/android/internal/managers/ActivityRetainedComponentManager$ActivityRetainedComponentBuilderEntryPoint; -Ldagger/hilt/android/internal/managers/ActivityRetainedComponentManager$ActivityRetainedComponentViewModel; -SPLdagger/hilt/android/internal/managers/ActivityRetainedComponentManager$ActivityRetainedComponentViewModel;->(Ldagger/hilt/android/components/ActivityRetainedComponent;Ldagger/hilt/android/internal/managers/SavedStateHandleHolder;)V -SPLdagger/hilt/android/internal/managers/ActivityRetainedComponentManager$ActivityRetainedComponentViewModel;->getComponent()Ldagger/hilt/android/components/ActivityRetainedComponent; -SPLdagger/hilt/android/internal/managers/ActivityRetainedComponentManager$ActivityRetainedComponentViewModel;->getSavedStateHandleHolder()Ldagger/hilt/android/internal/managers/SavedStateHandleHolder; -PLdagger/hilt/android/internal/managers/ActivityRetainedComponentManager$ActivityRetainedComponentViewModel;->onCleared()V -Ldagger/hilt/android/internal/managers/ActivityRetainedComponentManager$ActivityRetainedLifecycleEntryPoint; -PLdagger/hilt/android/internal/managers/ActivityRetainedComponentManager$LifecycleModule;->provideActivityRetainedLifecycle()Ldagger/hilt/android/ActivityRetainedLifecycle; -PLdagger/hilt/android/internal/managers/ActivityRetainedComponentManager_LifecycleModule_ProvideActivityRetainedLifecycleFactory;->provideActivityRetainedLifecycle()Ldagger/hilt/android/ActivityRetainedLifecycle; -Ldagger/hilt/android/internal/managers/ApplicationComponentManager; -SPLdagger/hilt/android/internal/managers/ApplicationComponentManager;->(Ldagger/hilt/android/internal/managers/ComponentSupplier;)V -SPLdagger/hilt/android/internal/managers/ApplicationComponentManager;->generatedComponent()Ljava/lang/Object; -Ldagger/hilt/android/internal/managers/BroadcastReceiverComponentManager; -SPLdagger/hilt/android/internal/managers/BroadcastReceiverComponentManager;->generatedComponent(Landroid/content/Context;)Ljava/lang/Object; -Ldagger/hilt/android/internal/managers/ComponentSupplier; -Ldagger/hilt/android/internal/managers/FragmentComponentManager$FragmentComponentBuilderEntryPoint; -Ldagger/hilt/android/internal/managers/HiltWrapper_ActivityRetainedComponentManager_ActivityRetainedComponentBuilderEntryPoint; -Ldagger/hilt/android/internal/managers/HiltWrapper_ActivityRetainedComponentManager_ActivityRetainedLifecycleEntryPoint; -Ldagger/hilt/android/internal/managers/SavedStateHandleHolder; -SPLdagger/hilt/android/internal/managers/SavedStateHandleHolder;->(Landroidx/lifecycle/viewmodel/CreationExtras;)V -PLdagger/hilt/android/internal/managers/SavedStateHandleHolder;->clear()V -SPLdagger/hilt/android/internal/managers/SavedStateHandleHolder;->isInvalid()Z -Ldagger/hilt/android/internal/managers/ServiceComponentManager; -SPLdagger/hilt/android/internal/managers/ServiceComponentManager;->(Landroid/app/Service;)V -SPLdagger/hilt/android/internal/managers/ServiceComponentManager;->createComponent()Ljava/lang/Object; -SPLdagger/hilt/android/internal/managers/ServiceComponentManager;->generatedComponent()Ljava/lang/Object; -Ldagger/hilt/android/internal/managers/ServiceComponentManager$ServiceComponentBuilderEntryPoint; -Ldagger/hilt/android/internal/managers/ViewComponentManager$ViewComponentBuilderEntryPoint; -Ldagger/hilt/android/internal/modules/ApplicationContextModule; -SPLdagger/hilt/android/internal/modules/ApplicationContextModule;->(Landroid/content/Context;)V -SPLdagger/hilt/android/internal/modules/ApplicationContextModule;->provideContext()Landroid/content/Context; -Ldagger/hilt/android/internal/modules/ApplicationContextModule_ProvideContextFactory; -SPLdagger/hilt/android/internal/modules/ApplicationContextModule_ProvideContextFactory;->provideContext(Ldagger/hilt/android/internal/modules/ApplicationContextModule;)Landroid/content/Context; -Ldagger/hilt/android/lifecycle/RetainedLifecycle; -Ldagger/hilt/components/SingletonComponent; -Ldagger/hilt/internal/GeneratedComponent; -Ldagger/hilt/internal/GeneratedComponentManager; -Ldagger/hilt/internal/GeneratedComponentManagerHolder; -Ldagger/hilt/internal/Preconditions; -SPLdagger/hilt/internal/Preconditions;->checkArgument(ZLjava/lang/String;[Ljava/lang/Object;)V -SPLdagger/hilt/internal/Preconditions;->checkNotNull(Ljava/lang/Object;)Ljava/lang/Object; -SPLdagger/hilt/internal/Preconditions;->checkState(ZLjava/lang/String;[Ljava/lang/Object;)V -Ldagger/hilt/internal/TestSingletonComponent; -Ldagger/hilt/internal/UnsafeCasts; -SPLdagger/hilt/internal/UnsafeCasts;->unsafeCast(Ljava/lang/Object;)Ljava/lang/Object; -Ldagger/internal/DoubleCheck; -SPLdagger/internal/DoubleCheck;->()V -SPLdagger/internal/DoubleCheck;->(Ldagger/internal/Provider;)V -SPLdagger/internal/DoubleCheck;->get()Ljava/lang/Object; -SPLdagger/internal/DoubleCheck;->getSynchronized()Ljava/lang/Object; -SPLdagger/internal/DoubleCheck;->lazy(Ldagger/internal/Provider;)Ldagger/Lazy; -SPLdagger/internal/DoubleCheck;->provider(Ldagger/internal/Provider;)Ldagger/internal/Provider; -SPLdagger/internal/DoubleCheck;->reentrantCheck(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -Ldagger/internal/Factory; -Ldagger/internal/LazyClassKeyMap; -SPLdagger/internal/LazyClassKeyMap;->(Ljava/util/Map;)V -SPLdagger/internal/LazyClassKeyMap;->containsKey(Ljava/lang/Object;)Z -SPLdagger/internal/LazyClassKeyMap;->get(Ljava/lang/Object;)Ljava/lang/Object; -SPLdagger/internal/LazyClassKeyMap;->of(Ljava/util/Map;)Ljava/util/Map; -Ldagger/internal/Preconditions; -SPLdagger/internal/Preconditions;->checkBuilderRequirement(Ljava/lang/Object;Ljava/lang/Class;)V -SPLdagger/internal/Preconditions;->checkNotNull(Ljava/lang/Object;)Ljava/lang/Object; -SPLdagger/internal/Preconditions;->checkNotNullFromProvides(Ljava/lang/Object;)Ljava/lang/Object; -Ldagger/internal/Provider; -Ldagger/internal/SingleCheck; -SPLdagger/internal/SingleCheck;->()V -SPLdagger/internal/SingleCheck;->(Ldagger/internal/Provider;)V -SPLdagger/internal/SingleCheck;->get()Ljava/lang/Object; -SPLdagger/internal/SingleCheck;->provider(Ldagger/internal/Provider;)Ldagger/internal/Provider; Lio/ktor/client/HttpClient; SPLio/ktor/client/HttpClient;->()V SPLio/ktor/client/HttpClient;->(Lio/ktor/client/engine/HttpClientEngine;Lio/ktor/client/HttpClientConfig;)V @@ -38234,4 +37862,4 @@ SPLorg/slf4j/helpers/Util;->()V SPLorg/slf4j/helpers/Util;->safeGetBooleanSystemProperty(Ljava/lang/String;)Z SPLorg/slf4j/helpers/Util;->safeGetSystemProperty(Ljava/lang/String;)Ljava/lang/String; Lorg/slf4j/spi/MDCAdapter; -Lorg/slf4j/spi/SLF4JServiceProvider; \ No newline at end of file +Lorg/slf4j/spi/SLF4JServiceProvider; diff --git a/app/src/nonfree/kotlin/com/wire/android/services/WireFirebaseMessagingService.kt b/app/src/nonfree/kotlin/com/wire/android/services/WireFirebaseMessagingService.kt index 550ada2a96a..2546d74e020 100644 --- a/app/src/nonfree/kotlin/com/wire/android/services/WireFirebaseMessagingService.kt +++ b/app/src/nonfree/kotlin/com/wire/android/services/WireFirebaseMessagingService.kt @@ -30,20 +30,19 @@ import com.google.firebase.messaging.RemoteMessage import com.wire.android.BuildConfig import com.wire.android.appLogger import com.wire.android.di.KaliumCoreLogic +import com.wire.android.di.metro.wireApplicationGraph import com.wire.android.util.NetworkUtil import com.wire.android.util.dispatchers.DispatcherProvider import com.wire.android.workmanager.worker.NotificationFetchWorker import com.wire.kalium.logic.CoreLogic import com.wire.kalium.logic.feature.notificationToken.Result -import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.cancel import kotlinx.coroutines.launch import java.util.Locale -import javax.inject.Inject +import dev.zacsweers.metro.Inject -@AndroidEntryPoint class WireFirebaseMessagingService : FirebaseMessagingService() { @Inject @@ -61,6 +60,14 @@ class WireFirebaseMessagingService : FirebaseMessagingService() { CoroutineScope(SupervisorJob() + dispatcherProvider.default()) } + override fun onCreate() { + val graph = wireApplicationGraph + coreLogic = graph.coreLogic + networkUtil = graph.networkUtil + dispatcherProvider = graph.dispatcherProvider + super.onCreate() + } + override fun onMessageReceived(message: RemoteMessage) { super.onMessageReceived(message) appLogger.i( diff --git a/app/src/nonfree/kotlin/com/wire/android/ui/home/messagecomposer/location/LocationPickerHelperFlavor.kt b/app/src/nonfree/kotlin/com/wire/android/ui/home/messagecomposer/location/LocationPickerHelperFlavor.kt index 378b2a18fd7..b1ee97a835c 100644 --- a/app/src/nonfree/kotlin/com/wire/android/ui/home/messagecomposer/location/LocationPickerHelperFlavor.kt +++ b/app/src/nonfree/kotlin/com/wire/android/ui/home/messagecomposer/location/LocationPickerHelperFlavor.kt @@ -26,7 +26,7 @@ import com.wire.android.AppJsonStyledLogger import com.wire.android.util.extension.isGoogleServicesAvailable import com.wire.kalium.logger.KaliumLogLevel import kotlinx.coroutines.tasks.await -import javax.inject.Inject +import dev.zacsweers.metro.Inject class LocationPickerHelperFlavor @Inject constructor( private val context: Context, diff --git a/app/src/test/kotlin/com/wire/android/emm/ManagedConfigurationsReceiverTest.kt b/app/src/test/kotlin/com/wire/android/emm/ManagedConfigurationsReceiverTest.kt index fff120671bb..1a52bf73e39 100644 --- a/app/src/test/kotlin/com/wire/android/emm/ManagedConfigurationsReceiverTest.kt +++ b/app/src/test/kotlin/com/wire/android/emm/ManagedConfigurationsReceiverTest.kt @@ -278,7 +278,7 @@ class ManagedConfigurationsReceiverTest { fun arrange() = this to ManagedConfigurationsReceiver( managedConfigurationsManager = managedConfigurationsManager, managedConfigurationsReporter = managedConfigurationsReporter, - coreLogic = { coreLogic }, + coreLogic = lazyOf(coreLogic), startPersistentWebsocketIfNecessary = startPersistentWebsocketIfNecessary, dispatcher = dispatchers ) diff --git a/app/src/test/kotlin/com/wire/android/media/audiomessage/ConversationAudioMessagePlayerTest.kt b/app/src/test/kotlin/com/wire/android/media/audiomessage/ConversationAudioMessagePlayerTest.kt index 4c70fc17abf..a8b8f12becc 100644 --- a/app/src/test/kotlin/com/wire/android/media/audiomessage/ConversationAudioMessagePlayerTest.kt +++ b/app/src/test/kotlin/com/wire/android/media/audiomessage/ConversationAudioMessagePlayerTest.kt @@ -650,7 +650,7 @@ class Arrangement(private val tempDir: File) { ConversationAudioMessagePlayer( context = context, audioMediaPlayer = mediaPlayer, - servicesManager = { servicesManager }, + servicesManager = lazyOf(servicesManager), audioFocusHelper = audioFocusHelper, coreLogic = coreLogic, scope = testScope, diff --git a/app/src/test/kotlin/com/wire/android/navigation/LoginTypeSelectorTest.kt b/app/src/test/kotlin/com/wire/android/navigation/LoginTypeSelectorTest.kt index cf080df0292..1f590f7919a 100644 --- a/app/src/test/kotlin/com/wire/android/navigation/LoginTypeSelectorTest.kt +++ b/app/src/test/kotlin/com/wire/android/navigation/LoginTypeSelectorTest.kt @@ -103,7 +103,7 @@ class LoginTypeSelectorTest { } fun arrange(useNewLoginForDefaultBackend: Boolean) = this to LoginTypeSelector( - coreLogic = { coreLogic }, + coreLogic = lazyOf(coreLogic), useNewLoginForDefaultBackend = useNewLoginForDefaultBackend ) diff --git a/app/src/test/kotlin/com/wire/android/ui/CallFeedbackViewModelTest.kt b/app/src/test/kotlin/com/wire/android/ui/CallFeedbackViewModelTest.kt index 3ae45afc188..3d6ce8f029a 100644 --- a/app/src/test/kotlin/com/wire/android/ui/CallFeedbackViewModelTest.kt +++ b/app/src/test/kotlin/com/wire/android/ui/CallFeedbackViewModelTest.kt @@ -160,10 +160,10 @@ class CallFeedbackViewModelTest { val viewModel: CallFeedbackViewModel by lazy { CallFeedbackViewModel( - coreLogic = { coreLogic }, - currentSessionFlow = { currentSessionFlow }, - isAnalyticsAvailable = { isAnalyticsAvailable }, - analyticsManager = { analyticsManager }, + coreLogic = lazyOf(coreLogic), + currentSessionFlow = lazyOf(currentSessionFlow), + isAnalyticsAvailable = lazyOf(isAnalyticsAvailable), + analyticsManager = lazyOf(analyticsManager), ) } diff --git a/app/src/test/kotlin/com/wire/android/ui/WireActivityViewModelTest.kt b/app/src/test/kotlin/com/wire/android/ui/WireActivityViewModelTest.kt index ffde16dd0b7..dd225a13df8 100644 --- a/app/src/test/kotlin/com/wire/android/ui/WireActivityViewModelTest.kt +++ b/app/src/test/kotlin/com/wire/android/ui/WireActivityViewModelTest.kt @@ -1155,25 +1155,25 @@ class WireActivityViewModelTest { private val viewModel by lazy { WireActivityViewModel( - coreLogic = { coreLogic }, + coreLogic = lazyOf(coreLogic), dispatchers = TestDispatcherProvider(), - currentSessionFlow = { currentSessionFlow }, - doesValidSessionExist = { doesValidSessionExist }, - getServerConfigUseCase = { getServerConfigUseCase }, - deepLinkProcessor = { deepLinkProcessor }, - intentsProcessor = { intentsProcessor }, - observeSessions = { observeSessionsUseCase }, - accountSwitch = { switchAccount }, - servicesManager = { servicesManager }, + currentSessionFlow = lazyOf(currentSessionFlow), + doesValidSessionExist = lazyOf(doesValidSessionExist), + getServerConfigUseCase = lazyOf(getServerConfigUseCase), + deepLinkProcessor = lazyOf(deepLinkProcessor), + intentsProcessor = lazyOf(intentsProcessor), + observeSessions = lazyOf(observeSessionsUseCase), + accountSwitch = lazyOf(switchAccount), + servicesManager = lazyOf(servicesManager), observeSyncStateUseCaseProviderFactory = observeSyncStateUseCaseProviderFactory, - observeIfAppUpdateRequired = { observeIfAppUpdateRequired }, - observeNewClients = { observeNewClients }, - clearNewClientsForUser = { clearNewClientsForUser }, - currentScreenManager = { currentScreenManager }, + observeIfAppUpdateRequired = lazyOf(observeIfAppUpdateRequired), + observeNewClients = lazyOf(observeNewClients), + clearNewClientsForUser = lazyOf(clearNewClientsForUser), + currentScreenManager = lazyOf(currentScreenManager), observeScreenshotCensoringConfigUseCaseProviderFactory = observeScreenshotCensoringConfigUseCaseProviderFactory, - globalDataStore = { globalDataStore }, + globalDataStore = lazyOf(globalDataStore), observeIfE2EIRequiredDuringLoginUseCaseProviderFactory = observeIfE2EIRequiredDuringLoginUseCaseProviderFactory, - workManager = { workManager }, + workManager = lazyOf(workManager), isProfileQRCodeEnabledFactory = isProfileQRCodeEnabledFactory, observeSelfUserFactory = observeSelfUserFactory, monitorSyncWorkUseCase = monitorSyncWorkUseCase, @@ -1181,7 +1181,7 @@ class WireActivityViewModelTest { automatedLoginManager = automatedLoginManager, nomadProfilesFeatureConfig = nomadProfilesFeatureConfig, loginTypeSelector = loginTypeSelector, - doesValidNomadAccountExist = { doesValidNomadAccountExist }, + doesValidNomadAccountExist = lazyOf(doesValidNomadAccountExist), ) } diff --git a/app/src/test/kotlin/com/wire/android/ui/analytics/AnalyticsUsageViewModelTest.kt b/app/src/test/kotlin/com/wire/android/ui/analytics/AnalyticsUsageViewModelTest.kt index 532bff7c7ca..67f6f5c185e 100644 --- a/app/src/test/kotlin/com/wire/android/ui/analytics/AnalyticsUsageViewModelTest.kt +++ b/app/src/test/kotlin/com/wire/android/ui/analytics/AnalyticsUsageViewModelTest.kt @@ -124,8 +124,8 @@ class AnalyticsUsageViewModelTest { fun arrange(analyticsConfiguration: AnalyticsConfiguration) = this to AnalyticsUsageViewModel( analyticsEnabled = analyticsConfiguration, - dataStore = { dataStore }, - selfServerConfig = { selfServerConfig }, + dataStore = lazyOf(dataStore), + selfServerConfig = lazyOf(selfServerConfig), ) } diff --git a/app/src/test/kotlin/com/wire/android/ui/common/topappbar/CommonTopAppBarViewModelTest.kt b/app/src/test/kotlin/com/wire/android/ui/common/topappbar/CommonTopAppBarViewModelTest.kt index fa118e01cff..98f161adad8 100644 --- a/app/src/test/kotlin/com/wire/android/ui/common/topappbar/CommonTopAppBarViewModelTest.kt +++ b/app/src/test/kotlin/com/wire/android/ui/common/topappbar/CommonTopAppBarViewModelTest.kt @@ -416,7 +416,7 @@ class CommonTopAppBarViewModelTest { private val commonTopAppBarViewModel by lazy { CommonTopAppBarViewModel( currentScreenManager = currentScreenManager, - coreLogic = { coreLogic }, + coreLogic = lazyOf(coreLogic), params = params ) } diff --git a/app/src/test/kotlin/com/wire/android/ui/connection/ConnectionActionButtonViewModelTest.kt b/app/src/test/kotlin/com/wire/android/ui/connection/ConnectionActionButtonViewModelTest.kt index 30d01263514..ad4277dead5 100644 --- a/app/src/test/kotlin/com/wire/android/ui/connection/ConnectionActionButtonViewModelTest.kt +++ b/app/src/test/kotlin/com/wire/android/ui/connection/ConnectionActionButtonViewModelTest.kt @@ -58,7 +58,7 @@ class ConnectionActionButtonViewModelTest { @Test fun `given success, when sending a connection request, then emit success message`() = runTest { // given - val (arrangement, viewModel) = ConnectionActionButtonHiltArrangement() + val (arrangement, viewModel) = ConnectionActionButtonArrangement() .withSendConnectionRequest(SendConnectionRequestResult.Success) .arrange() @@ -77,7 +77,7 @@ class ConnectionActionButtonViewModelTest { @Test fun `given a failure, when sending a connection request, then emit failure message`() = runTest { // given - val (arrangement, viewModel) = ConnectionActionButtonHiltArrangement() + val (arrangement, viewModel) = ConnectionActionButtonArrangement() .withSendConnectionRequest(SendConnectionRequestResult.Failure.GenericFailure(failure)) .arrange() @@ -96,7 +96,7 @@ class ConnectionActionButtonViewModelTest { @Test fun `given a federation denied failure, when sending a connection request, then emit proper failure message`() = runTest { // given - val (arrangement, viewModel) = ConnectionActionButtonHiltArrangement() + val (arrangement, viewModel) = ConnectionActionButtonArrangement() .withSendConnectionRequest(SendConnectionRequestResult.Failure.FederationDenied) .arrange() @@ -115,7 +115,7 @@ class ConnectionActionButtonViewModelTest { @Test fun `given a legal hold failure, when sending a connection request, then edit the state properly`() = runTest { // given - val (arrangement, viewModel) = ConnectionActionButtonHiltArrangement() + val (arrangement, viewModel) = ConnectionActionButtonArrangement() .withSendConnectionRequest(SendConnectionRequestResult.Failure.MissingLegalHoldConsent) .arrange() @@ -135,7 +135,7 @@ class ConnectionActionButtonViewModelTest { fun `given success, when ignoring a connection request, then calls onIgnoreSuccess`() = runTest { // given - val (arrangement, viewModel) = ConnectionActionButtonHiltArrangement() + val (arrangement, viewModel) = ConnectionActionButtonArrangement() .withIgnoreConnectionRequest(IgnoreConnectionRequestUseCaseResult.Success) .arrange() @@ -157,7 +157,7 @@ class ConnectionActionButtonViewModelTest { fun `given failure, when ignoring a connection request, then emit error message`() = runTest { // given - val (arrangement, viewModel) = ConnectionActionButtonHiltArrangement() + val (arrangement, viewModel) = ConnectionActionButtonArrangement() .withIgnoreConnectionRequest(IgnoreConnectionRequestUseCaseResult.Failure(failure)) .arrange() @@ -177,7 +177,7 @@ class ConnectionActionButtonViewModelTest { fun `given success, when canceling a connection request, then emit success message`() = runTest { // given - val (arrangement, viewModel) = ConnectionActionButtonHiltArrangement() + val (arrangement, viewModel) = ConnectionActionButtonArrangement() .withCancelConnectionRequest(CancelConnectionRequestUseCaseResult.Success) .arrange() @@ -197,7 +197,7 @@ class ConnectionActionButtonViewModelTest { fun `given failure, when canceling a connection request, then emit failure message`() = runTest { // given - val (arrangement, viewModel) = ConnectionActionButtonHiltArrangement() + val (arrangement, viewModel) = ConnectionActionButtonArrangement() .withCancelConnectionRequest(CancelConnectionRequestUseCaseResult.Failure(failure)) .arrange() @@ -217,7 +217,7 @@ class ConnectionActionButtonViewModelTest { fun `given success, when accepting a connection request, then emit success message`() = runTest { // given - val (arrangement, viewModel) = ConnectionActionButtonHiltArrangement() + val (arrangement, viewModel) = ConnectionActionButtonArrangement() .withAcceptConnectionRequest(AcceptConnectionRequestUseCaseResult.Success) .arrange() @@ -237,7 +237,7 @@ class ConnectionActionButtonViewModelTest { fun `given failure, when accepting a connection request, then emit failure message`() = runTest { // given - val (arrangement, viewModel) = ConnectionActionButtonHiltArrangement() + val (arrangement, viewModel) = ConnectionActionButtonArrangement() .withAcceptConnectionRequest(AcceptConnectionRequestUseCaseResult.Failure(failure)) .arrange() @@ -257,7 +257,7 @@ class ConnectionActionButtonViewModelTest { fun `given a conversationId, when trying to open the conversation, then returns a Success result with the conversation`() = runTest { // given - val (arrangement, viewModel) = ConnectionActionButtonHiltArrangement() + val (arrangement, viewModel) = ConnectionActionButtonArrangement() .withGetOneToOneConversation(CreateConversationResult.Success(TestConversation.CONVERSATION)) .arrange() @@ -282,7 +282,7 @@ class ConnectionActionButtonViewModelTest { fun `given a conversationId, when trying to open the conversation and fails, then returns a Failure result and update error state`() = runTest { // given - val (arrangement, viewModel) = ConnectionActionButtonHiltArrangement() + val (arrangement, viewModel) = ConnectionActionButtonArrangement() .withGetOneToOneConversation(CreateConversationResult.Failure(failure)) .arrange() @@ -305,7 +305,7 @@ class ConnectionActionButtonViewModelTest { fun `given a conversationId, when trying to open the conversation and fails with MissingKeyPackages, then call MissingKeyPackage()`() = runTest { // given - val (arrangement, viewModel) = ConnectionActionButtonHiltArrangement() + val (arrangement, viewModel) = ConnectionActionButtonArrangement() .withGetOneToOneConversation(CreateConversationResult.Failure(CoreFailure.MissingKeyPackages(setOf()))) .arrange() @@ -332,7 +332,7 @@ class ConnectionActionButtonViewModelTest { } } -internal class ConnectionActionButtonHiltArrangement { +internal class ConnectionActionButtonArrangement { @MockK lateinit var getOrCreateOneToOneConversation: GetOrCreateOneToOneConversationUseCase diff --git a/app/src/test/kotlin/com/wire/android/ui/home/HomeViewModelTest.kt b/app/src/test/kotlin/com/wire/android/ui/home/HomeViewModelTest.kt index 0137b8a4a22..3d98ab19180 100644 --- a/app/src/test/kotlin/com/wire/android/ui/home/HomeViewModelTest.kt +++ b/app/src/test/kotlin/com/wire/android/ui/home/HomeViewModelTest.kt @@ -175,7 +175,7 @@ class HomeViewModelTest { needsToRegisterClient = needsToRegisterClient, observeLegalHoldStatusForSelfUser = observeLegalHoldStatusForSelfUser, canMigrateFromPersonalToTeam = canMigrateFromPersonalToTeam, - currentSessionFlow = { currentSessionFlow }, + currentSessionFlow = lazyOf(currentSessionFlow), ) } diff --git a/app/src/test/kotlin/com/wire/android/ui/home/drawer/HomeDrawerViewModelTest.kt b/app/src/test/kotlin/com/wire/android/ui/home/drawer/HomeDrawerViewModelTest.kt index 7292949cb97..c8769402ff7 100644 --- a/app/src/test/kotlin/com/wire/android/ui/home/drawer/HomeDrawerViewModelTest.kt +++ b/app/src/test/kotlin/com/wire/android/ui/home/drawer/HomeDrawerViewModelTest.kt @@ -125,7 +125,7 @@ class HomeDrawerViewModelTest { fun arrange() = this to HomeDrawerViewModel( savedStateHandle = savedStateHandle, - observeArchivedUnreadConversationsCount = { observeArchivedUnreadConversationsCount }, + observeArchivedUnreadConversationsCount = lazyOf(observeArchivedUnreadConversationsCount), observeSelfUser = observeSelfUserUseCase, getTeamUrl = getTeamUrlUseCase, isWireCellsEnabled = isWireCellsEnabled, diff --git a/app/src/test/kotlin/com/wire/android/ui/home/sync/FeatureFlagNotificationViewModelTest.kt b/app/src/test/kotlin/com/wire/android/ui/home/sync/FeatureFlagNotificationViewModelTest.kt index c4cb6f65492..c99d9f6a396 100644 --- a/app/src/test/kotlin/com/wire/android/ui/home/sync/FeatureFlagNotificationViewModelTest.kt +++ b/app/src/test/kotlin/com/wire/android/ui/home/sync/FeatureFlagNotificationViewModelTest.kt @@ -327,10 +327,10 @@ class FeatureFlagNotificationViewModelTest { val viewModel: FeatureFlagNotificationViewModel by lazy { FeatureFlagNotificationViewModel( - coreLogic = { coreLogic }, - currentSessionFlow = { currentSessionFlow }, - globalDataStore = { globalDataStore }, - disableAppLockUseCase = { disableAppLockUseCase }, + coreLogic = lazyOf(coreLogic), + currentSessionFlow = lazyOf(currentSessionFlow), + globalDataStore = lazyOf(globalDataStore), + disableAppLockUseCase = lazyOf(disableAppLockUseCase), ) } diff --git a/app/src/test/kotlin/com/wire/android/ui/legalhold/dialog/deactivated/LegalHoldDeactivatedViewModelTest.kt b/app/src/test/kotlin/com/wire/android/ui/legalhold/dialog/deactivated/LegalHoldDeactivatedViewModelTest.kt index a902a65e878..23272ced2d2 100644 --- a/app/src/test/kotlin/com/wire/android/ui/legalhold/dialog/deactivated/LegalHoldDeactivatedViewModelTest.kt +++ b/app/src/test/kotlin/com/wire/android/ui/legalhold/dialog/deactivated/LegalHoldDeactivatedViewModelTest.kt @@ -112,7 +112,7 @@ class LegalHoldDeactivatedViewModelTest { @MockK lateinit var coreLogic: CoreLogic - val viewModel by lazy { LegalHoldDeactivatedViewModel(coreLogic = { coreLogic }) } + val viewModel by lazy { LegalHoldDeactivatedViewModel(coreLogic = lazyOf(coreLogic)) } init { MockKAnnotations.init(this) } fun withNotCurrentSession() = apply { diff --git a/app/src/test/kotlin/com/wire/android/ui/legalhold/dialog/requested/LegalHoldRequestedViewModelTest.kt b/app/src/test/kotlin/com/wire/android/ui/legalhold/dialog/requested/LegalHoldRequestedViewModelTest.kt index 529e223fd39..38bf4e1bf82 100644 --- a/app/src/test/kotlin/com/wire/android/ui/legalhold/dialog/requested/LegalHoldRequestedViewModelTest.kt +++ b/app/src/test/kotlin/com/wire/android/ui/legalhold/dialog/requested/LegalHoldRequestedViewModelTest.kt @@ -309,7 +309,7 @@ class LegalHoldRequestedViewModelTest { val viewModel by lazy { LegalHoldRequestedViewModel( validatePassword = validatePassword, - coreLogic = { coreLogic }, + coreLogic = lazyOf(coreLogic), ) } diff --git a/app/src/test/kotlin/com/wire/android/ui/settings/debug/DebugDataOptionsViewModelTest.kt b/app/src/test/kotlin/com/wire/android/ui/settings/debug/DebugDataOptionsViewModelTest.kt index 8b05d9c2aa3..1334c87e8e7 100644 --- a/app/src/test/kotlin/com/wire/android/ui/settings/debug/DebugDataOptionsViewModelTest.kt +++ b/app/src/test/kotlin/com/wire/android/ui/settings/debug/DebugDataOptionsViewModelTest.kt @@ -81,7 +81,7 @@ class DebugDataOptionsViewModelTest { @Test fun `given token sending token will succeed, when sending FCM token, then info message should emmit success message`() = runTest { // given - val (_, viewModel) = DebugDataOptionsHiltArrangement() + val (_, viewModel) = DebugDataOptionsArrangement() .withSendFCMTokenSuccess() .arrange() @@ -98,7 +98,7 @@ class DebugDataOptionsViewModelTest { @Test fun `given there is not client ID, when sending FCM token,info message should emit error message`() = runTest { // given - val (_, viewModel) = DebugDataOptionsHiltArrangement() + val (_, viewModel) = DebugDataOptionsArrangement() .withSendFCMTokenClientIdFailure() .arrange() @@ -115,7 +115,7 @@ class DebugDataOptionsViewModelTest { @Test fun `given there is not notification token, when sending FCM token,info message should emit error message`() = runTest { // given - val (_, viewModel) = DebugDataOptionsHiltArrangement() + val (_, viewModel) = DebugDataOptionsArrangement() .withSendFCMTokenNotificationTokenFailure() .arrange() @@ -132,7 +132,7 @@ class DebugDataOptionsViewModelTest { @Test fun `given that there is API failure, when sending FCM token,info message should emit error message`() = runTest { // given - val (_, viewModel) = DebugDataOptionsHiltArrangement() + val (_, viewModel) = DebugDataOptionsArrangement() .withSendFCMTokenClientRepositoryRegisterTokenFailure() .arrange() @@ -149,7 +149,7 @@ class DebugDataOptionsViewModelTest { @Test fun `given that Proteus protocol is used, view state should have Proteus protocol name`() = runTest { // given - val (_, viewModel) = DebugDataOptionsHiltArrangement() + val (_, viewModel) = DebugDataOptionsArrangement() .withProteusProtocolSetup() .arrange() @@ -159,7 +159,7 @@ class DebugDataOptionsViewModelTest { @Test fun `given that Mls protocol is used, view state should have proteus Mls name`() = runTest { // given - val (_, viewModel) = DebugDataOptionsHiltArrangement() + val (_, viewModel) = DebugDataOptionsArrangement() .withMlsProtocolSetup() .arrange() @@ -169,7 +169,7 @@ class DebugDataOptionsViewModelTest { @Test fun `given that federation is disabled, view state should have federation value of false`() = runTest { // given - val (_, viewModel) = DebugDataOptionsHiltArrangement() + val (_, viewModel) = DebugDataOptionsArrangement() .withFederationDisabled() .arrange() @@ -179,7 +179,7 @@ class DebugDataOptionsViewModelTest { @Test fun `given that federation is enabled, view state should have federation value of true`() = runTest { // given - val (_, viewModel) = DebugDataOptionsHiltArrangement() + val (_, viewModel) = DebugDataOptionsArrangement() .withFederationEnabled() .arrange() @@ -189,7 +189,7 @@ class DebugDataOptionsViewModelTest { @Test fun `given that api version is unknown, view state should have api version unknown`() = runTest { // given - val (_, viewModel) = DebugDataOptionsHiltArrangement() + val (_, viewModel) = DebugDataOptionsArrangement() .withApiVersionUnknown() .arrange() @@ -199,7 +199,7 @@ class DebugDataOptionsViewModelTest { @Test fun `given that api version is set, view state should have api version set`() = runTest { // given - val (_, viewModel) = DebugDataOptionsHiltArrangement() + val (_, viewModel) = DebugDataOptionsArrangement() .withApiVersionSet(7) .arrange() @@ -209,7 +209,7 @@ class DebugDataOptionsViewModelTest { @Test fun `given server config failure, view state should have default values`() = runTest { // given - val (_, viewModel) = DebugDataOptionsHiltArrangement() + val (_, viewModel) = DebugDataOptionsArrangement() .withServerConfigError() .arrange() @@ -220,7 +220,7 @@ class DebugDataOptionsViewModelTest { @Test fun `given async notifications is not enabled, when enabling, then start using async notifications is called`() = runTest { // given - val (arrangement, viewModel) = DebugDataOptionsHiltArrangement() + val (arrangement, viewModel) = DebugDataOptionsArrangement() .withObserveIsConsumableNotificationsEnabled(false) .withStartUsingAsyncNotificationsResult() .arrange() @@ -236,7 +236,7 @@ class DebugDataOptionsViewModelTest { @Test fun `given async notifications is enabled, then start using async notifications is never called`() = runTest { // given - val (arrangement, viewModel) = DebugDataOptionsHiltArrangement() + val (arrangement, viewModel) = DebugDataOptionsArrangement() .withObserveIsConsumableNotificationsEnabled(true) .withStartUsingAsyncNotificationsResult() .arrange() @@ -251,7 +251,7 @@ class DebugDataOptionsViewModelTest { @Test fun `given e2ei expiration is loaded, view state should contain loaded value`() = runTest { - val (_, viewModel) = DebugDataOptionsHiltArrangement() + val (_, viewModel) = DebugDataOptionsArrangement() .withDebugE2EICertificateExpiration(999) .arrange() @@ -260,7 +260,7 @@ class DebugDataOptionsViewModelTest { @Test fun `given default e2ei expiration is loaded, then minimum debug value is applied`() = runTest { - val (arrangement, viewModel) = DebugDataOptionsHiltArrangement() + val (arrangement, viewModel) = DebugDataOptionsArrangement() .withDebugE2EICertificateExpiration(90.days.inWholeSeconds) .arrange() @@ -270,7 +270,7 @@ class DebugDataOptionsViewModelTest { @Test fun `given expiration below minimum, when updating e2ei expiration, then minimum value is used`() = runTest { - val (arrangement, viewModel) = DebugDataOptionsHiltArrangement().arrange() + val (arrangement, viewModel) = DebugDataOptionsArrangement().arrange() viewModel.updateE2EICertificateExpiration(120) @@ -280,7 +280,7 @@ class DebugDataOptionsViewModelTest { @Test fun `given valid expiration value, when updating e2ei expiration, then value is updated and use case is called`() = runTest { - val (arrangement, viewModel) = DebugDataOptionsHiltArrangement() + val (arrangement, viewModel) = DebugDataOptionsArrangement() .withDebugE2EICertificateExpiration(360) .arrange() @@ -292,7 +292,7 @@ class DebugDataOptionsViewModelTest { @Test fun `given CRL force expiration is observed, then view state contains loaded value`() = runTest { - val (_, viewModel) = DebugDataOptionsHiltArrangement() + val (_, viewModel) = DebugDataOptionsArrangement() .withDebugCRLExpirationAfterOneMinute(true) .arrange() @@ -301,7 +301,7 @@ class DebugDataOptionsViewModelTest { @Test fun `when forcing CRL expiration after one minute, then setting use case is called`() = runTest { - val (arrangement, viewModel) = DebugDataOptionsHiltArrangement().arrange() + val (arrangement, viewModel) = DebugDataOptionsArrangement().arrange() viewModel.forceCRLExpirationAfterOneMinute(true) @@ -310,7 +310,7 @@ class DebugDataOptionsViewModelTest { } } -internal class DebugDataOptionsHiltArrangement { +internal class DebugDataOptionsArrangement { @MockK(relaxed = true) lateinit var context: Context diff --git a/build-logic/plugins/build.gradle.kts b/build-logic/plugins/build.gradle.kts index 1e900a32ba6..1a4b06ede40 100644 --- a/build-logic/plugins/build.gradle.kts +++ b/build-logic/plugins/build.gradle.kts @@ -57,10 +57,6 @@ gradlePlugin { id = libs.plugins.wire.android.application.get().pluginId implementationClass = "AndroidApplicationConventionPlugin" } - register("wireHiltConventionPlugin") { - id = libs.plugins.wire.hilt.get().pluginId - implementationClass = "HiltConventionPlugin" - } register("wireKoverConventionPlugin") { id = libs.plugins.wire.kover.get().pluginId implementationClass = "KoverConventionPlugin" diff --git a/build-logic/plugins/src/main/kotlin/HiltConventionPlugin.kt b/build-logic/plugins/src/main/kotlin/HiltConventionPlugin.kt deleted file mode 100644 index 2d1ce6e1710..00000000000 --- a/build-logic/plugins/src/main/kotlin/HiltConventionPlugin.kt +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Wire - * Copyright (C) 2024 Wire Swiss GmbH - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see http://www.gnu.org/licenses/. - */ -import org.gradle.api.Plugin -import org.gradle.api.Project -import org.gradle.kotlin.dsl.dependencies - -class HiltConventionPlugin : Plugin { - override fun apply(target: Project): Unit = with(target) { - with(pluginManager) { - apply("dagger.hilt.android.plugin") - apply("com.google.devtools.ksp") - } - - dependencies { - add("implementation", findLibrary("hilt.android")) - add("androidTestImplementation", findLibrary("hilt.android")) - - add("ksp", findLibrary("hilt.compiler")) - add("kspAndroidTest", findLibrary("hilt.compiler")) - - add("androidTestImplementation", findLibrary("hilt.test")) - } - } -} diff --git a/build-logic/plugins/src/main/kotlin/KoverConventionPlugin.kt b/build-logic/plugins/src/main/kotlin/KoverConventionPlugin.kt index 0ed220d663a..253227611e5 100644 --- a/build-logic/plugins/src/main/kotlin/KoverConventionPlugin.kt +++ b/build-logic/plugins/src/main/kotlin/KoverConventionPlugin.kt @@ -43,13 +43,9 @@ class KoverConventionPlugin : Plugin { "**/*Test*.*", "*NavArgs*", "*ComposableSingletons*", - "*_HiltModules*", - "*Hilt_*", ) packages( - "hilt_aggregated_deps", "com.wire.android.di", - "dagger.hilt.internal.aggregatedroot.codegen", "com.wire.android.ui.home.conversations.mock", ) annotatedBy( diff --git a/build.gradle.kts b/build.gradle.kts index 43b1d429399..ef9acf81f96 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -24,7 +24,6 @@ buildscript { maven(url = "https://plugins.gradle.org/m2/") } dependencies { - classpath(libs.hilt.gradlePlugin) val fdroidBuild = (System.getenv("flavor") ?: System.getenv("FLAVOR") ?: System.getenv("CUSTOM_FLAVOR") diff --git a/core/di/build.gradle.kts b/core/di/build.gradle.kts index bb9af0a4861..70ac9777805 100644 --- a/core/di/build.gradle.kts +++ b/core/di/build.gradle.kts @@ -9,7 +9,5 @@ dependencies { implementation(libs.androidx.core) implementation(libs.compose.activity) implementation(libs.androidx.lifecycle.viewModelCompose) - implementation(libs.hilt.android) - implementation(libs.hilt.navigationCompose) implementation(libs.compose.material3) } diff --git a/core/di/src/main/kotlin/com/wire/android/di/KaliumCoreLogic.kt b/core/di/src/main/kotlin/com/wire/android/di/KaliumCoreLogic.kt index d92c02c9c2c..57a43bf8850 100644 --- a/core/di/src/main/kotlin/com/wire/android/di/KaliumCoreLogic.kt +++ b/core/di/src/main/kotlin/com/wire/android/di/KaliumCoreLogic.kt @@ -17,7 +17,7 @@ */ package com.wire.android.di -import javax.inject.Qualifier +import dev.zacsweers.metro.Qualifier @Qualifier @Retention(AnnotationRetention.BINARY) diff --git a/core/di/src/main/kotlin/com/wire/android/di/metro/MetroViewModelGraph.kt b/core/di/src/main/kotlin/com/wire/android/di/metro/MetroViewModelGraph.kt index 21b8134bc75..32794ff5348 100644 --- a/core/di/src/main/kotlin/com/wire/android/di/metro/MetroViewModelGraph.kt +++ b/core/di/src/main/kotlin/com/wire/android/di/metro/MetroViewModelGraph.kt @@ -35,7 +35,7 @@ interface MetroViewModelGraph { } /** - * Temporary Android Compose bridge used while moving ViewModel creation from Hilt to Metro. + * Temporary Android Compose bridge used while moving ViewModel creation to Metro. * * Reusable UI should not treat this as a general DI entry point. The target direction is to keep * common UI components UI-only and pass state, callbacks, or narrow models from screen/container diff --git a/core/media/build.gradle.kts b/core/media/build.gradle.kts index 36934b88d03..a88d98c1332 100644 --- a/core/media/build.gradle.kts +++ b/core/media/build.gradle.kts @@ -7,6 +7,5 @@ plugins { dependencies { implementation(libs.androidx.core) - implementation(libs.hilt.android) implementation(libs.compose.material3) } diff --git a/core/media/src/main/kotlin/com/wire/android/media/PingRinger.kt b/core/media/src/main/kotlin/com/wire/android/media/PingRinger.kt index 1a210db3af3..f79989641a6 100644 --- a/core/media/src/main/kotlin/com/wire/android/media/PingRinger.kt +++ b/core/media/src/main/kotlin/com/wire/android/media/PingRinger.kt @@ -28,10 +28,11 @@ import android.os.Build import android.os.VibrationEffect import android.os.Vibrator import android.os.VibratorManager -import javax.inject.Inject -import javax.inject.Singleton +import dev.zacsweers.metro.Inject +import dev.zacsweers.metro.AppScope +import dev.zacsweers.metro.SingleIn -@Singleton +@SingleIn(AppScope::class) class PingRinger @Inject constructor(private val context: Context) { private var vibrator: Vibrator? = null diff --git a/core/notification/build.gradle.kts b/core/notification/build.gradle.kts index d8719e817dd..6f26e4a8339 100644 --- a/core/notification/build.gradle.kts +++ b/core/notification/build.gradle.kts @@ -10,6 +10,5 @@ dependencies { implementation("com.wire.kalium:kalium-common") implementation("com.wire.kalium:kalium-data") implementation(libs.androidx.core) - implementation(libs.hilt.android) implementation(libs.compose.material3) } diff --git a/core/notification/src/main/kotlin/com/wire/android/notification/NotificationChannelsManager.kt b/core/notification/src/main/kotlin/com/wire/android/notification/NotificationChannelsManager.kt index f2c40eac608..9f8ea2ec048 100644 --- a/core/notification/src/main/kotlin/com/wire/android/notification/NotificationChannelsManager.kt +++ b/core/notification/src/main/kotlin/com/wire/android/notification/NotificationChannelsManager.kt @@ -30,10 +30,11 @@ import androidx.core.app.NotificationManagerCompat import com.wire.android.media.PingRinger import com.wire.kalium.logic.data.user.SelfUser import com.wire.kalium.logic.data.user.UserId -import javax.inject.Inject -import javax.inject.Singleton +import dev.zacsweers.metro.Inject +import dev.zacsweers.metro.AppScope +import dev.zacsweers.metro.SingleIn -@Singleton +@SingleIn(AppScope::class) class NotificationChannelsManager @Inject constructor( private val context: Context, private val notificationManagerCompat: NotificationManagerCompat diff --git a/features/cells/build.gradle.kts b/features/cells/build.gradle.kts index 63b0fa4772c..25bbf3ff427 100644 --- a/features/cells/build.gradle.kts +++ b/features/cells/build.gradle.kts @@ -1,7 +1,6 @@ plugins { id(libs.plugins.wire.android.library.get().pluginId) id(libs.plugins.wire.kover.get().pluginId) - id(libs.plugins.wire.hilt.get().pluginId) id(BuildPlugins.kotlinParcelize) id(BuildPlugins.junit5) alias(libs.plugins.ksp) diff --git a/features/cells/src/main/java/com/wire/android/feature/cells/ui/CellFileActionsMenu.kt b/features/cells/src/main/java/com/wire/android/feature/cells/ui/CellFileActionsMenu.kt index c39c850c915..e76d3cec35c 100644 --- a/features/cells/src/main/java/com/wire/android/feature/cells/ui/CellFileActionsMenu.kt +++ b/features/cells/src/main/java/com/wire/android/feature/cells/ui/CellFileActionsMenu.kt @@ -23,7 +23,7 @@ import com.wire.android.feature.cells.ui.model.OpenLoadState import com.wire.android.feature.cells.ui.model.isEditSupported import com.wire.android.feature.cells.ui.model.localFileAvailable import com.wire.kalium.logic.featureFlags.KaliumConfigs -import javax.inject.Inject +import dev.zacsweers.metro.Inject @Suppress("CyclomaticComplexMethod", "LongParameterList") class CellFileActionsMenu @Inject constructor( diff --git a/features/cells/src/main/java/com/wire/android/feature/cells/ui/CellFileLocalPathCache.kt b/features/cells/src/main/java/com/wire/android/feature/cells/ui/CellFileLocalPathCache.kt index 47bea39da4b..7f70c0dd7a1 100644 --- a/features/cells/src/main/java/com/wire/android/feature/cells/ui/CellFileLocalPathCache.kt +++ b/features/cells/src/main/java/com/wire/android/feature/cells/ui/CellFileLocalPathCache.kt @@ -26,8 +26,9 @@ import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.flow.update -import javax.inject.Inject -import javax.inject.Singleton +import dev.zacsweers.metro.Inject +import dev.zacsweers.metro.AppScope +import dev.zacsweers.metro.SingleIn /** * Singleton shared state for the Cells file-open feature. @@ -38,7 +39,7 @@ import javax.inject.Singleton * - [fileReadyEvents]: emitted when a slow download finishes so the UI can show a snackbar. * - [openLoadStates]: per-uuid Loading / Ready / Error state consumed by paging combines. */ -@Singleton +@SingleIn(AppScope::class) class CellFileLocalPathCache @Inject constructor() { private val _fileReadyChannel = Channel(Channel.BUFFERED) diff --git a/features/cells/src/main/java/com/wire/android/feature/cells/ui/CellsViewModelFactory.kt b/features/cells/src/main/java/com/wire/android/feature/cells/ui/CellsViewModelFactory.kt index 183c965b117..5bc5caff255 100644 --- a/features/cells/src/main/java/com/wire/android/feature/cells/ui/CellsViewModelFactory.kt +++ b/features/cells/src/main/java/com/wire/android/feature/cells/ui/CellsViewModelFactory.kt @@ -61,7 +61,7 @@ import com.wire.kalium.cells.domain.usecase.publiclink.UpdatePublicLinkPasswordU import com.wire.kalium.cells.domain.usecase.versioning.GetNodeVersionsUseCase import com.wire.kalium.cells.domain.usecase.versioning.RestoreNodeVersionUseCase import com.wire.kalium.logic.util.RandomPassword -import javax.inject.Inject +import dev.zacsweers.metro.Inject @Suppress("LongParameterList") class CellsViewModelFactory @Inject constructor( diff --git a/features/cells/src/main/java/com/wire/android/feature/cells/ui/OpenFileDownloadController.kt b/features/cells/src/main/java/com/wire/android/feature/cells/ui/OpenFileDownloadController.kt index 04b926590f0..c3328d81c14 100644 --- a/features/cells/src/main/java/com/wire/android/feature/cells/ui/OpenFileDownloadController.kt +++ b/features/cells/src/main/java/com/wire/android/feature/cells/ui/OpenFileDownloadController.kt @@ -30,7 +30,7 @@ import kotlinx.coroutines.delay import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.launch import okio.Path.Companion.toOkioPath -import javax.inject.Inject +import dev.zacsweers.metro.Inject /** * Controller responsible for managing the download and open flow for cell files. diff --git a/features/cells/src/main/java/com/wire/android/feature/cells/ui/edit/OnlineEditor.kt b/features/cells/src/main/java/com/wire/android/feature/cells/ui/edit/OnlineEditor.kt index 5ebc1edf1b1..f70ec9dd381 100644 --- a/features/cells/src/main/java/com/wire/android/feature/cells/ui/edit/OnlineEditor.kt +++ b/features/cells/src/main/java/com/wire/android/feature/cells/ui/edit/OnlineEditor.kt @@ -27,7 +27,7 @@ import androidx.browser.customtabs.CustomTabsIntent import androidx.browser.customtabs.CustomTabsIntent.COLOR_SCHEME_DARK import androidx.browser.customtabs.CustomTabsIntent.COLOR_SCHEME_LIGHT import androidx.browser.customtabs.CustomTabsIntent.COLOR_SCHEME_SYSTEM -import javax.inject.Inject +import dev.zacsweers.metro.Inject class OnlineEditor @Inject constructor( private val context: Context, diff --git a/features/cells/src/main/java/com/wire/android/feature/cells/util/FileHelper.kt b/features/cells/src/main/java/com/wire/android/feature/cells/util/FileHelper.kt index 8d6dfa14980..0bb471b3dc4 100644 --- a/features/cells/src/main/java/com/wire/android/feature/cells/util/FileHelper.kt +++ b/features/cells/src/main/java/com/wire/android/feature/cells/util/FileHelper.kt @@ -26,12 +26,12 @@ import android.os.Environment import android.provider.MediaStore import android.os.Build import androidx.core.content.FileProvider -import dagger.hilt.android.qualifiers.ApplicationContext +import com.wire.android.di.ApplicationContext import okio.Path import java.io.File import java.io.FileOutputStream import java.io.OutputStream -import javax.inject.Inject +import dev.zacsweers.metro.Inject class FileHelper @Inject constructor( @ApplicationContext private val context: Context diff --git a/features/cells/src/main/java/com/wire/android/feature/cells/util/FileNameResolver.kt b/features/cells/src/main/java/com/wire/android/feature/cells/util/FileNameResolver.kt index e4236641961..e4d62208ca4 100644 --- a/features/cells/src/main/java/com/wire/android/feature/cells/util/FileNameResolver.kt +++ b/features/cells/src/main/java/com/wire/android/feature/cells/util/FileNameResolver.kt @@ -18,7 +18,7 @@ package com.wire.android.feature.cells.util import java.io.File -import javax.inject.Inject +import dev.zacsweers.metro.Inject class FileNameResolver @Inject constructor() { /** diff --git a/features/meetings/build.gradle.kts b/features/meetings/build.gradle.kts index f539095b314..a4b8b8cfb2b 100644 --- a/features/meetings/build.gradle.kts +++ b/features/meetings/build.gradle.kts @@ -1,7 +1,6 @@ plugins { id(libs.plugins.wire.android.library.get().pluginId) id(libs.plugins.wire.kover.get().pluginId) - id(libs.plugins.wire.hilt.get().pluginId) id(BuildPlugins.kotlinParcelize) id(BuildPlugins.junit5) alias(libs.plugins.ksp) diff --git a/features/meetings/src/main/java/com/wire/android/feature/meetings/ui/MeetingsViewModelFactory.kt b/features/meetings/src/main/java/com/wire/android/feature/meetings/ui/MeetingsViewModelFactory.kt index 89b3dc99616..660b066e67f 100644 --- a/features/meetings/src/main/java/com/wire/android/feature/meetings/ui/MeetingsViewModelFactory.kt +++ b/features/meetings/src/main/java/com/wire/android/feature/meetings/ui/MeetingsViewModelFactory.kt @@ -23,7 +23,7 @@ import com.wire.android.feature.meetings.ui.usecase.GetMeetingUseCase import com.wire.android.feature.meetings.ui.usecase.GetMeetingsPaginatedUseCase import com.wire.android.util.CurrentTimeProvider import com.wire.android.util.dispatchers.DispatcherProvider -import javax.inject.Inject +import dev.zacsweers.metro.Inject class MeetingsViewModelFactory @Inject constructor( private val currentTimeProvider: CurrentTimeProvider, diff --git a/features/meetings/src/main/java/com/wire/android/feature/meetings/ui/usecase/GetMeetingUseCase.kt b/features/meetings/src/main/java/com/wire/android/feature/meetings/ui/usecase/GetMeetingUseCase.kt index d143675332a..4572743c7cf 100644 --- a/features/meetings/src/main/java/com/wire/android/feature/meetings/ui/usecase/GetMeetingUseCase.kt +++ b/features/meetings/src/main/java/com/wire/android/feature/meetings/ui/usecase/GetMeetingUseCase.kt @@ -19,10 +19,7 @@ package com.wire.android.feature.meetings.ui.usecase import com.wire.android.feature.meetings.model.MeetingItem import com.wire.android.feature.meetings.ui.mock.MeetingMocksProvider -import dagger.hilt.android.scopes.ViewModelScoped -import javax.inject.Inject - -@ViewModelScoped +import dev.zacsweers.metro.Inject class GetMeetingUseCase @Inject constructor() { private val meetingMocksProvider = MeetingMocksProvider.Default // TODO replace with real data source operator fun invoke(meetingId: String): MeetingItem? = meetingMocksProvider.getItem(meetingId) diff --git a/features/meetings/src/main/java/com/wire/android/feature/meetings/ui/usecase/GetMeetingsPaginatedUseCase.kt b/features/meetings/src/main/java/com/wire/android/feature/meetings/ui/usecase/GetMeetingsPaginatedUseCase.kt index 10d89d8ee74..1fa414c44f3 100644 --- a/features/meetings/src/main/java/com/wire/android/feature/meetings/ui/usecase/GetMeetingsPaginatedUseCase.kt +++ b/features/meetings/src/main/java/com/wire/android/feature/meetings/ui/usecase/GetMeetingsPaginatedUseCase.kt @@ -21,11 +21,8 @@ import androidx.paging.PagingData import com.wire.android.feature.meetings.ui.MeetingsTabItem import com.wire.android.feature.meetings.ui.mock.Meeting import com.wire.android.feature.meetings.ui.mock.MeetingMocksProvider -import dagger.hilt.android.scopes.ViewModelScoped import kotlinx.coroutines.flow.Flow -import javax.inject.Inject - -@ViewModelScoped +import dev.zacsweers.metro.Inject class GetMeetingsPaginatedUseCase @Inject constructor() { private val meetingMocksProvider = MeetingMocksProvider.Default // TODO replace with real data source operator fun invoke(showingAll: Boolean, type: MeetingsTabItem): Flow> = diff --git a/features/sync/build.gradle.kts b/features/sync/build.gradle.kts index d3585e8cd3c..a5fdfd6f5b5 100644 --- a/features/sync/build.gradle.kts +++ b/features/sync/build.gradle.kts @@ -1,7 +1,6 @@ plugins { id(libs.plugins.wire.android.library.get().pluginId) id(libs.plugins.wire.kover.get().pluginId) - id(libs.plugins.wire.hilt.get().pluginId) id(BuildPlugins.kotlinParcelize) id(BuildPlugins.junit5) alias(libs.plugins.ksp) @@ -20,14 +19,10 @@ dependencies { implementation(libs.androidx.core) implementation(libs.androidx.appcompat) - // hilt - implementation(libs.hilt.navigationCompose) - implementation(libs.hilt.work) implementation(libs.androidx.work) // smaller view models implementation(libs.resaca.core) - implementation(libs.resaca.hilt) implementation(libs.bundlizer.core) val composeBom = platform(libs.compose.bom) diff --git a/features/sync/src/main/kotlin/com/wire/android/sync/InitialSyncWorker.kt b/features/sync/src/main/kotlin/com/wire/android/sync/InitialSyncWorker.kt index f4590eb67f9..35f2e70503e 100644 --- a/features/sync/src/main/kotlin/com/wire/android/sync/InitialSyncWorker.kt +++ b/features/sync/src/main/kotlin/com/wire/android/sync/InitialSyncWorker.kt @@ -20,7 +20,6 @@ package com.wire.android.sync import android.content.Context import android.util.Log import androidx.core.app.NotificationCompat -import androidx.hilt.work.HiltWorker import androidx.work.CoroutineWorker import androidx.work.Data import androidx.work.ForegroundInfo @@ -34,15 +33,14 @@ import com.wire.kalium.logic.CoreLogic import com.wire.kalium.logic.feature.session.GetAllSessionsResult import com.wire.kalium.work.Work import com.wire.kalium.work.WorkId -import dagger.assisted.Assisted -import dagger.assisted.AssistedInject +import dev.zacsweers.metro.Assisted +import dev.zacsweers.metro.AssistedInject import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.takeWhile import kotlinx.coroutines.launch import com.wire.android.feature.notification.R as NR -@HiltWorker class InitialSyncWorker @AssistedInject constructor( @Assisted context: Context, @Assisted parameters: WorkerParameters, diff --git a/features/sync/src/main/kotlin/com/wire/android/sync/MonitorSyncWorkUseCase.kt b/features/sync/src/main/kotlin/com/wire/android/sync/MonitorSyncWorkUseCase.kt index 1af66e0a8c3..cc62e92dfa1 100644 --- a/features/sync/src/main/kotlin/com/wire/android/sync/MonitorSyncWorkUseCase.kt +++ b/features/sync/src/main/kotlin/com/wire/android/sync/MonitorSyncWorkUseCase.kt @@ -28,12 +28,12 @@ import com.wire.kalium.logic.feature.session.GetAllSessionsResult import com.wire.kalium.logic.feature.session.ObserveSessionsUseCase import com.wire.kalium.work.Work import com.wire.kalium.work.WorkId -import dagger.hilt.android.qualifiers.ApplicationContext +import com.wire.android.di.ApplicationContext import kotlinx.coroutines.flow.filterIsInstance import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.merge -import javax.inject.Inject +import dev.zacsweers.metro.Inject class MonitorSyncWorkUseCase @Inject constructor( @param:ApplicationContext private val context: Context, diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 174d83d1879..e689b4cf411 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -50,7 +50,7 @@ compose-qr = "1.0.1" enterprise-feedback = "1.1.0" # Compose -composeBom = "2026.01.01" +composeBom = "2026.05.00" compose-activity = "1.13.0" compose-constraint = "1.1.1" compose-navigation = "2.9.5" # aligned with compose-destinations 2.3.0 @@ -64,11 +64,6 @@ jetbrains-compose-material3 = "1.11.0-alpha07" # Compose Preview compose-edgetoedge-preview = "0.9.0" -# Hilt -hilt = "2.59.2" -hilt-composeNavigation = "1.3.0" -hilt-work = "1.3.0" - # Android UI accompanist = "0.32.0" material = "1.12.0" @@ -150,7 +145,6 @@ wire-android-test-library = { id = "com.wire.android.test.library" } wire-android-navigation = { id = "com.wire.android.navigation" } wire-compose-compiler = { id = "com.wire.android.compose.compiler" } wire-kmp-library = { id = "com.wire.android.kmp.library" } -wire-hilt = { id = "com.wire.android.hilt" } wire-kover = { id = "com.wire.android.kover" } wire-versionizer = { id = "com.wire.android.versionizer" } [bundles] @@ -164,7 +158,6 @@ kotlin-gradlePlugin = { group = "org.jetbrains.kotlin", name = "kotlin-gradle-pl android-gradlePlugin = { group = "com.android.tools.build", name = "gradle", version.ref = "android-gradlePlugin" } android-gradleApi = { group = "com.android.tools.build", name = "gradle-api", version.ref = "android-gradlePlugin" } compose-compiler-gradlePlugin = { group = "org.jetbrains.kotlin", name = "compose-compiler-gradle-plugin", version.ref = "kotlin" } -hilt-gradlePlugin = { module = "com.google.dagger:hilt-android-gradle-plugin", version.ref = "hilt" } googleGms-gradlePlugin = { module = "com.google.gms:google-services", version.ref = "google-gms" } googleGms-location = { module = "com.google.android.gms:play-services-location", version.ref = "gms-location" } aboutLibraries-gradlePlugin = { module = "com.mikepenz.aboutlibraries.plugin:aboutlibraries-plugin", version.ref = "aboutLibraries" } @@ -196,7 +189,6 @@ android-desugarJdkLibs = { module = "com.android.tools:desugar_jdk_libs", versio squareup-javapoet = { module = "com.squareup:javapoet", version.ref = "squareup-javapoet" } visibilityModifiers = { module = "io.github.esentsov:kotlin-visibility", version.ref = "visibilityModifiers" } resaca-core = { module = "io.github.sebaslogen:resaca", version.ref = "resaca" } -resaca-hilt = { module = "io.github.sebaslogen:resacahilt", version.ref = "resaca" } bundlizer-core = { module = "dev.ahmedmourad.bundlizer:bundlizer-core", version.ref = "bundlizer" } firebase-bom = { module = "com.google.firebase:firebase-bom", version.ref = "firebaseBOM" } firebase-fcm = { module = "com.google.firebase:firebase-messaging" } @@ -227,13 +219,6 @@ androidx-startup = { group = "androidx.startup", name = "startup-runtime", versi androidx-compose-runtime = { group = "androidx.compose.runtime", name = "runtime", version.ref = "androidx-compose-runtime" } enterprise-feedback = { group = "androidx.enterprise", name = "enterprise-feedback", version.ref = "enterprise-feedback" } -# Dependency Injection -hilt-android = { module = "com.google.dagger:hilt-android", version.ref = "hilt" } -hilt-compiler = { module = "com.google.dagger:hilt-compiler", version.ref = "hilt" } -hilt-navigationCompose = { module = "androidx.hilt:hilt-navigation-compose", version.ref = "hilt-composeNavigation" } -hilt-test = { module = "com.google.dagger:hilt-android-testing", version.ref = "hilt" } -hilt-work = { module = "androidx.hilt:hilt-work", version.ref = "hilt-work" } - # Compose BOM compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "composeBom" } compose-material3 = { module = "androidx.compose.material3:material3", version.ref = "material3" } diff --git a/kalium b/kalium index c86db860bb3..c4077eb7fc6 160000 --- a/kalium +++ b/kalium @@ -1 +1 @@ -Subproject commit c86db860bb35c8ba3011ce35852ae36fa6d1e21f +Subproject commit c4077eb7fc6e4c12e08626684f594f21ac6a581c From ff314c94a6c1719debaa3c114b8d08437c7c3024 Mon Sep 17 00:00:00 2001 From: Mohamad Jaara <9083456+MohamadJaara@users.noreply.github.com> Date: Thu, 4 Jun 2026 13:46:18 +0200 Subject: [PATCH 2/3] fix: metro graph handoff after logout --- .../com/wire/android/ui/WireActivity.kt | 22 +++++++++++++++++-- .../AuthenticationViewModelGraph.kt | 4 ++++ .../android/di/metro/MetroViewModelGraph.kt | 6 +++-- 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/app/src/main/kotlin/com/wire/android/ui/WireActivity.kt b/app/src/main/kotlin/com/wire/android/ui/WireActivity.kt index 85bba9d2306..34b126c2a8d 100644 --- a/app/src/main/kotlin/com/wire/android/ui/WireActivity.kt +++ b/app/src/main/kotlin/com/wire/android/ui/WireActivity.kt @@ -137,6 +137,7 @@ import com.wire.android.util.debug.LocalFeatureVisibilityFlags import com.wire.android.util.launchUpdateTheApp import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.channels.Channel +import kotlinx.coroutines.delay import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.receiveAsFlow @@ -259,13 +260,21 @@ class WireActivity : BaseActivity() { val snackbarHostState = remember { SnackbarHostState() } val currentUserId = viewModel.globalAppState.currentUserId val appGraph = LocalContext.current.wireApplicationGraph - val sessionViewModelGraph = remember(appGraph, currentUserId) { + val currentSessionViewModelGraph = remember(appGraph, currentUserId) { currentUserId?.let { appGraph.sessionViewModelGraph } } + var retainedSessionViewModelGraph by remember(appGraph) { + mutableStateOf(null) + } + LaunchedEffect(currentSessionViewModelGraph) { + currentSessionViewModelGraph?.let { + retainedSessionViewModelGraph = it + } + } val authenticationViewModelGraph = remember(appGraph) { appGraph.authenticationViewModelGraph } - val activityViewModels = sessionViewModelGraph?.let { + val activityViewModels = currentSessionViewModelGraph?.let { wireActivityScopedViewModels(it) } @@ -305,6 +314,14 @@ class WireActivity : BaseActivity() { ?.destination ?.route ?.getBaseRoute() + val effectiveBaseRoute = currentBaseRoute ?: startDestination.baseRoute + LaunchedEffect(currentUserId, effectiveBaseRoute) { + if (currentUserId == null && effectiveBaseRoute in authenticationGraphRoutes) { + delay(SESSION_GRAPH_RELEASE_DELAY_MILLIS) + retainedSessionViewModelGraph = null + } + } + val sessionViewModelGraph = currentSessionViewModelGraph ?: retainedSessionViewModelGraph val metroViewModelGraph = rememberMetroViewModelGraph( currentBaseRoute = currentBaseRoute, startDestinationBaseRoute = startDestination.baseRoute, @@ -879,6 +896,7 @@ class WireActivity : BaseActivity() { companion object { private const val HANDLED_DEEPLINK_FLAG = "deeplink_handled_flag_key" private const val ORIGINAL_SAVED_INTENT_FLAG = "original_saved_intent" + private const val SESSION_GRAPH_RELEASE_DELAY_MILLIS = 500L private const val TAG = "WireActivity" } } diff --git a/app/src/main/kotlin/com/wire/android/ui/authentication/AuthenticationViewModelGraph.kt b/app/src/main/kotlin/com/wire/android/ui/authentication/AuthenticationViewModelGraph.kt index 50bf9234843..f98db62193a 100644 --- a/app/src/main/kotlin/com/wire/android/ui/authentication/AuthenticationViewModelGraph.kt +++ b/app/src/main/kotlin/com/wire/android/ui/authentication/AuthenticationViewModelGraph.kt @@ -60,6 +60,7 @@ inline fun authenticationViewModel( metroViewModel( viewModelStoreOwner = viewModelStoreOwner, key = key, + scopeKeyOverride = AUTHENTICATION_VIEW_MODEL_SCOPE_KEY, ) { authenticationViewModelFactory.create() } @@ -75,10 +76,13 @@ inline fun authenticationSavedStateViewModel( metroSavedStateViewModel( viewModelStoreOwner = viewModelStoreOwner, key = key, + scopeKeyOverride = AUTHENTICATION_VIEW_MODEL_SCOPE_KEY, ) { savedStateHandle -> authenticationViewModelFactory.create(savedStateHandle) } +const val AUTHENTICATION_VIEW_MODEL_SCOPE_KEY = "authentication" + @Composable fun welcomeViewModel(): WelcomeViewModel = authenticationSavedStateViewModel { welcomeViewModel(it) } diff --git a/core/di/src/main/kotlin/com/wire/android/di/metro/MetroViewModelGraph.kt b/core/di/src/main/kotlin/com/wire/android/di/metro/MetroViewModelGraph.kt index 32794ff5348..22fc5286d75 100644 --- a/core/di/src/main/kotlin/com/wire/android/di/metro/MetroViewModelGraph.kt +++ b/core/di/src/main/kotlin/com/wire/android/di/metro/MetroViewModelGraph.kt @@ -51,6 +51,7 @@ inline fun metroViewModel( "No ViewModelStoreOwner was provided via LocalViewModelStoreOwner" }, key: String? = null, + scopeKeyOverride: String? = null, crossinline create: Graph.() -> VM, ): VM where Graph : MetroViewModelGraph, VM : ViewModel { val graph = checkNotNull(LocalMetroViewModelGraph.current as? Graph) { @@ -59,7 +60,7 @@ inline fun metroViewModel( val scopedKey = scopedMetroViewModelKey( defaultKey = VM::class.qualifiedName, key = key, - scopeKey = graph.viewModelScopeKey, + scopeKey = scopeKeyOverride ?: graph.viewModelScopeKey, ) val factory = remember(graph) { viewModelFactory { @@ -82,6 +83,7 @@ inline fun metroSavedStateViewModel( "No ViewModelStoreOwner was provided via LocalViewModelStoreOwner" }, key: String? = null, + scopeKeyOverride: String? = null, crossinline create: Graph.(SavedStateHandle) -> VM, ): VM where Graph : MetroViewModelGraph, VM : ViewModel { val graph = checkNotNull(LocalMetroViewModelGraph.current as? Graph) { @@ -90,7 +92,7 @@ inline fun metroSavedStateViewModel( val scopedKey = scopedMetroViewModelKey( defaultKey = VM::class.qualifiedName, key = key, - scopeKey = graph.viewModelScopeKey, + scopeKey = scopeKeyOverride ?: graph.viewModelScopeKey, ) val factory = remember(graph) { viewModelFactory { From 5c2842791ac5b4e7ab500c99cff8d50f9c529659 Mon Sep 17 00:00:00 2001 From: Mohamad Jaara <9083456+MohamadJaara@users.noreply.github.com> Date: Thu, 4 Jun 2026 17:54:31 +0200 Subject: [PATCH 3/3] revert compose bom update --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index e689b4cf411..9553688c803 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -50,7 +50,7 @@ compose-qr = "1.0.1" enterprise-feedback = "1.1.0" # Compose -composeBom = "2026.05.00" +composeBom = "2026.01.01" compose-activity = "1.13.0" compose-constraint = "1.1.1" compose-navigation = "2.9.5" # aligned with compose-destinations 2.3.0