From b63cc86e4889bd3c05be56bb2615bc54c8013329 Mon Sep 17 00:00:00 2001 From: Danil Nikolaev Date: Sun, 11 May 2025 22:36:41 +0300 Subject: [PATCH] pre-warm up the main screens when the application is launched --- .../meloda/fast/presentation/MainScreen.kt | 7 ++++- .../navigation/ConversationsNavigation.kt | 28 ++++++++----------- .../friends/navigation/FriendsNavigation.kt | 17 ++++++++++- .../friends/presentation/FriendsScreen.kt | 7 +---- .../friends/presentation/RootFriendsScreen.kt | 4 +++ .../fast/profile/navigation/ProfileRoute.kt | 12 ++++---- 6 files changed, 43 insertions(+), 32 deletions(-) diff --git a/app/src/main/kotlin/dev/meloda/fast/presentation/MainScreen.kt b/app/src/main/kotlin/dev/meloda/fast/presentation/MainScreen.kt index 243e8b59..77eabeae 100644 --- a/app/src/main/kotlin/dev/meloda/fast/presentation/MainScreen.kt +++ b/app/src/main/kotlin/dev/meloda/fast/presentation/MainScreen.kt @@ -1,6 +1,8 @@ package dev.meloda.fast.presentation import androidx.activity.compose.BackHandler +import androidx.activity.compose.LocalActivity +import androidx.appcompat.app.AppCompatActivity import androidx.compose.animation.core.tween import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut @@ -37,7 +39,6 @@ import dev.chrisbanes.haze.HazeState import dev.chrisbanes.haze.hazeEffect import dev.chrisbanes.haze.materials.ExperimentalHazeMaterialsApi import dev.chrisbanes.haze.materials.HazeMaterials -import dev.meloda.fast.conversations.navigation.Conversations import dev.meloda.fast.conversations.navigation.ConversationsGraph import dev.meloda.fast.conversations.navigation.conversationsGraph import dev.meloda.fast.friends.navigation.Friends @@ -65,6 +66,7 @@ fun MainScreen( onMessageClicked: (userid: Long) -> Unit = {}, onNavigateToCreateChat: () -> Unit = {} ) { + val activity = LocalActivity.current as? AppCompatActivity ?: return val theme = LocalThemeConfig.current val hazeState = remember { HazeState() } val navController = rememberNavController() @@ -194,6 +196,7 @@ fun MainScreen( exitTransition = { fadeOut(animationSpec = tween(200)) } ) { friendsScreen( + activity = activity, onError = onError, onPhotoClicked = onPhotoClicked, onMessageClicked = onMessageClicked, @@ -204,6 +207,7 @@ fun MainScreen( }, ) conversationsGraph( + activity = activity, onError = onError, onNavigateToMessagesHistory = onNavigateToMessagesHistory, onNavigateToCreateChat = onNavigateToCreateChat, @@ -214,6 +218,7 @@ fun MainScreen( } ) profileScreen( + activity = activity, onError = onError, onSettingsButtonClicked = onSettingsButtonClicked, onPhotoClicked = onPhotoClicked diff --git a/feature/conversations/src/main/kotlin/dev/meloda/fast/conversations/navigation/ConversationsNavigation.kt b/feature/conversations/src/main/kotlin/dev/meloda/fast/conversations/navigation/ConversationsNavigation.kt index 435eccc7..1e244481 100644 --- a/feature/conversations/src/main/kotlin/dev/meloda/fast/conversations/navigation/ConversationsNavigation.kt +++ b/feature/conversations/src/main/kotlin/dev/meloda/fast/conversations/navigation/ConversationsNavigation.kt @@ -1,8 +1,6 @@ package dev.meloda.fast.conversations.navigation -import androidx.activity.compose.LocalActivity import androidx.appcompat.app.AppCompatActivity -import androidx.compose.ui.platform.LocalContext import androidx.navigation.NavGraphBuilder import androidx.navigation.compose.composable import androidx.navigation.navigation @@ -13,7 +11,7 @@ import dev.meloda.fast.model.ConversationsFilter import dev.meloda.fast.ui.theme.LocalNavController import dev.meloda.fast.ui.theme.getOrThrow import kotlinx.serialization.Serializable -import org.koin.androidx.compose.koinViewModel +import org.koin.androidx.viewmodel.ext.android.getViewModel import org.koin.core.qualifier.named @Serializable @@ -26,6 +24,7 @@ object Conversations object Archive fun NavGraphBuilder.conversationsGraph( + activity: AppCompatActivity, onError: (BaseError) -> Unit, onNavigateToMessagesHistory: (id: Long) -> Unit, onNavigateToCreateChat: () -> Unit, @@ -34,17 +33,18 @@ fun NavGraphBuilder.conversationsGraph( navigation( startDestination = Conversations ) { + val conversationsViewModel: ConversationsViewModelImpl = with(activity) { + getViewModel(qualifier = named(ConversationsFilter.ALL)) + } + val archiveViewModel: ConversationsViewModelImpl = with(activity) { + getViewModel(qualifier = named(ConversationsFilter.ARCHIVE)) + } + composable { - val context = LocalContext.current val navController = LocalNavController.getOrThrow() - val viewModel: ConversationsViewModelImpl = koinViewModel( - qualifier = named(ConversationsFilter.ALL), - viewModelStoreOwner = context as AppCompatActivity - ) - ConversationsRoute( - viewModel = viewModel, + viewModel = conversationsViewModel, onError = onError, onNavigateToMessagesHistory = onNavigateToMessagesHistory, onNavigateToCreateChat = onNavigateToCreateChat, @@ -53,16 +53,10 @@ fun NavGraphBuilder.conversationsGraph( ) } composable { - val context = LocalContext.current val navController = LocalNavController.getOrThrow() - val viewModel: ConversationsViewModelImpl = koinViewModel( - qualifier = named(ConversationsFilter.ARCHIVE), - viewModelStoreOwner = context as AppCompatActivity - ) - ConversationsRoute( - viewModel = viewModel, + viewModel = archiveViewModel, onBack = navController::navigateUp, onError = onError, onNavigateToMessagesHistory = onNavigateToMessagesHistory, diff --git a/feature/friends/src/main/kotlin/dev/meloda/fast/friends/navigation/FriendsNavigation.kt b/feature/friends/src/main/kotlin/dev/meloda/fast/friends/navigation/FriendsNavigation.kt index 17158dfd..d8bd8585 100644 --- a/feature/friends/src/main/kotlin/dev/meloda/fast/friends/navigation/FriendsNavigation.kt +++ b/feature/friends/src/main/kotlin/dev/meloda/fast/friends/navigation/FriendsNavigation.kt @@ -1,22 +1,37 @@ package dev.meloda.fast.friends.navigation +import androidx.appcompat.app.AppCompatActivity import androidx.navigation.NavGraphBuilder import androidx.navigation.compose.composable +import dev.meloda.fast.friends.FriendsViewModel +import dev.meloda.fast.friends.FriendsViewModelImpl +import dev.meloda.fast.friends.OnlineFriendsViewModelImpl import dev.meloda.fast.friends.presentation.FriendsRoute import dev.meloda.fast.model.BaseError import kotlinx.serialization.Serializable +import org.koin.androidx.viewmodel.ext.android.getViewModel @Serializable object Friends fun NavGraphBuilder.friendsScreen( + activity: AppCompatActivity, onError: (BaseError) -> Unit, onPhotoClicked: (url: String) -> Unit, - onMessageClicked: (userid: Long) -> Unit, + onMessageClicked: (userId: Long) -> Unit, onScrolledToTop: () -> Unit ) { + val friendsViewModel: FriendsViewModel = with(activity) { + getViewModel() + } + val onlineFriendsViewModel: FriendsViewModel = with(activity) { + getViewModel() + } + composable { FriendsRoute( + friendsViewModel = friendsViewModel, + onlineFriendsViewModel = onlineFriendsViewModel, onError = onError, onPhotoClicked = onPhotoClicked, onMessageClicked = onMessageClicked, diff --git a/feature/friends/src/main/kotlin/dev/meloda/fast/friends/presentation/FriendsScreen.kt b/feature/friends/src/main/kotlin/dev/meloda/fast/friends/presentation/FriendsScreen.kt index 44da2f00..3055d765 100644 --- a/feature/friends/src/main/kotlin/dev/meloda/fast/friends/presentation/FriendsScreen.kt +++ b/feature/friends/src/main/kotlin/dev/meloda/fast/friends/presentation/FriendsScreen.kt @@ -46,6 +46,7 @@ import org.koin.androidx.compose.koinViewModel @OptIn(ExperimentalMaterial3Api::class) @Composable fun FriendsScreen( + viewModel: FriendsViewModel, modifier: Modifier = Modifier, orderType: String, padding: PaddingValues, @@ -57,12 +58,6 @@ fun FriendsScreen( onScrolledToTop: () -> Unit = {} ) { val context: Context = LocalContext.current - val viewModel: FriendsViewModel = - if (tabIndex == 0) { - koinViewModel(viewModelStoreOwner = context as AppCompatActivity) - } else { - koinViewModel(viewModelStoreOwner = context as AppCompatActivity) - } LaunchedEffect(orderType) { viewModel.onOrderTypeChanged(orderType) diff --git a/feature/friends/src/main/kotlin/dev/meloda/fast/friends/presentation/RootFriendsScreen.kt b/feature/friends/src/main/kotlin/dev/meloda/fast/friends/presentation/RootFriendsScreen.kt index 7ba8e209..817cc14d 100644 --- a/feature/friends/src/main/kotlin/dev/meloda/fast/friends/presentation/RootFriendsScreen.kt +++ b/feature/friends/src/main/kotlin/dev/meloda/fast/friends/presentation/RootFriendsScreen.kt @@ -40,6 +40,7 @@ import androidx.compose.ui.unit.dp import dev.chrisbanes.haze.hazeEffect import dev.chrisbanes.haze.materials.ExperimentalHazeMaterialsApi import dev.chrisbanes.haze.materials.HazeMaterials +import dev.meloda.fast.friends.FriendsViewModel import dev.meloda.fast.model.BaseError import dev.meloda.fast.ui.R import dev.meloda.fast.ui.components.ActionInvokeDismiss @@ -55,6 +56,8 @@ import dev.meloda.fast.ui.R as UiR @OptIn(ExperimentalMaterial3Api::class, ExperimentalHazeMaterialsApi::class) @Composable fun FriendsRoute( + friendsViewModel: FriendsViewModel, + onlineFriendsViewModel: FriendsViewModel, onError: (BaseError) -> Unit, onPhotoClicked: (url: String) -> Unit, onMessageClicked: (userid: Long) -> Unit, @@ -231,6 +234,7 @@ fun FriendsRoute( modifier = Modifier.fillMaxSize(), ) { index -> FriendsScreen( + viewModel = if (index == 0) friendsViewModel else onlineFriendsViewModel, orderType = orderType, padding = padding, tabIndex = index, diff --git a/feature/profile/src/main/kotlin/dev/meloda/fast/profile/navigation/ProfileRoute.kt b/feature/profile/src/main/kotlin/dev/meloda/fast/profile/navigation/ProfileRoute.kt index 0227a08f..06a481b2 100644 --- a/feature/profile/src/main/kotlin/dev/meloda/fast/profile/navigation/ProfileRoute.kt +++ b/feature/profile/src/main/kotlin/dev/meloda/fast/profile/navigation/ProfileRoute.kt @@ -1,7 +1,6 @@ package dev.meloda.fast.profile.navigation import androidx.appcompat.app.AppCompatActivity -import androidx.compose.ui.platform.LocalContext import androidx.navigation.NavGraphBuilder import androidx.navigation.compose.composable import dev.meloda.fast.model.BaseError @@ -9,22 +8,21 @@ import dev.meloda.fast.profile.ProfileViewModel import dev.meloda.fast.profile.ProfileViewModelImpl import dev.meloda.fast.profile.presentation.ProfileRoute import kotlinx.serialization.Serializable -import org.koin.androidx.compose.koinViewModel +import org.koin.androidx.viewmodel.ext.android.getViewModel @Serializable object Profile fun NavGraphBuilder.profileScreen( + activity: AppCompatActivity, onError: (BaseError) -> Unit, onSettingsButtonClicked: () -> Unit, onPhotoClicked: (url: String) -> Unit ) { + val viewModel: ProfileViewModel = with(activity) { + getViewModel() + } composable { - val context = LocalContext.current - val viewModel: ProfileViewModel = koinViewModel( - viewModelStoreOwner = context as AppCompatActivity - ) - ProfileRoute( onError = onError, onSettingsButtonClicked = onSettingsButtonClicked,