pre-warm up the main screens when the application is launched

This commit is contained in:
2025-05-11 22:36:41 +03:00
parent 628b93e4ab
commit b63cc86e48
6 changed files with 43 additions and 32 deletions
@@ -1,6 +1,8 @@
package dev.meloda.fast.presentation package dev.meloda.fast.presentation
import androidx.activity.compose.BackHandler 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.core.tween
import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeIn
import androidx.compose.animation.fadeOut import androidx.compose.animation.fadeOut
@@ -37,7 +39,6 @@ import dev.chrisbanes.haze.HazeState
import dev.chrisbanes.haze.hazeEffect import dev.chrisbanes.haze.hazeEffect
import dev.chrisbanes.haze.materials.ExperimentalHazeMaterialsApi import dev.chrisbanes.haze.materials.ExperimentalHazeMaterialsApi
import dev.chrisbanes.haze.materials.HazeMaterials 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.conversations.navigation.conversationsGraph import dev.meloda.fast.conversations.navigation.conversationsGraph
import dev.meloda.fast.friends.navigation.Friends import dev.meloda.fast.friends.navigation.Friends
@@ -65,6 +66,7 @@ fun MainScreen(
onMessageClicked: (userid: Long) -> Unit = {}, onMessageClicked: (userid: Long) -> Unit = {},
onNavigateToCreateChat: () -> Unit = {} onNavigateToCreateChat: () -> Unit = {}
) { ) {
val activity = LocalActivity.current as? AppCompatActivity ?: return
val theme = LocalThemeConfig.current val theme = LocalThemeConfig.current
val hazeState = remember { HazeState() } val hazeState = remember { HazeState() }
val navController = rememberNavController() val navController = rememberNavController()
@@ -194,6 +196,7 @@ fun MainScreen(
exitTransition = { fadeOut(animationSpec = tween(200)) } exitTransition = { fadeOut(animationSpec = tween(200)) }
) { ) {
friendsScreen( friendsScreen(
activity = activity,
onError = onError, onError = onError,
onPhotoClicked = onPhotoClicked, onPhotoClicked = onPhotoClicked,
onMessageClicked = onMessageClicked, onMessageClicked = onMessageClicked,
@@ -204,6 +207,7 @@ fun MainScreen(
}, },
) )
conversationsGraph( conversationsGraph(
activity = activity,
onError = onError, onError = onError,
onNavigateToMessagesHistory = onNavigateToMessagesHistory, onNavigateToMessagesHistory = onNavigateToMessagesHistory,
onNavigateToCreateChat = onNavigateToCreateChat, onNavigateToCreateChat = onNavigateToCreateChat,
@@ -214,6 +218,7 @@ fun MainScreen(
} }
) )
profileScreen( profileScreen(
activity = activity,
onError = onError, onError = onError,
onSettingsButtonClicked = onSettingsButtonClicked, onSettingsButtonClicked = onSettingsButtonClicked,
onPhotoClicked = onPhotoClicked onPhotoClicked = onPhotoClicked
@@ -1,8 +1,6 @@
package dev.meloda.fast.conversations.navigation package dev.meloda.fast.conversations.navigation
import androidx.activity.compose.LocalActivity
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.compose.ui.platform.LocalContext
import androidx.navigation.NavGraphBuilder import androidx.navigation.NavGraphBuilder
import androidx.navigation.compose.composable import androidx.navigation.compose.composable
import androidx.navigation.navigation 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.LocalNavController
import dev.meloda.fast.ui.theme.getOrThrow import dev.meloda.fast.ui.theme.getOrThrow
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import org.koin.androidx.compose.koinViewModel import org.koin.androidx.viewmodel.ext.android.getViewModel
import org.koin.core.qualifier.named import org.koin.core.qualifier.named
@Serializable @Serializable
@@ -26,6 +24,7 @@ object Conversations
object Archive object Archive
fun NavGraphBuilder.conversationsGraph( fun NavGraphBuilder.conversationsGraph(
activity: AppCompatActivity,
onError: (BaseError) -> Unit, onError: (BaseError) -> Unit,
onNavigateToMessagesHistory: (id: Long) -> Unit, onNavigateToMessagesHistory: (id: Long) -> Unit,
onNavigateToCreateChat: () -> Unit, onNavigateToCreateChat: () -> Unit,
@@ -34,17 +33,18 @@ fun NavGraphBuilder.conversationsGraph(
navigation<ConversationsGraph>( navigation<ConversationsGraph>(
startDestination = Conversations startDestination = Conversations
) { ) {
val conversationsViewModel: ConversationsViewModelImpl = with(activity) {
getViewModel(qualifier = named(ConversationsFilter.ALL))
}
val archiveViewModel: ConversationsViewModelImpl = with(activity) {
getViewModel(qualifier = named(ConversationsFilter.ARCHIVE))
}
composable<Conversations> { composable<Conversations> {
val context = LocalContext.current
val navController = LocalNavController.getOrThrow() val navController = LocalNavController.getOrThrow()
val viewModel: ConversationsViewModelImpl = koinViewModel(
qualifier = named(ConversationsFilter.ALL),
viewModelStoreOwner = context as AppCompatActivity
)
ConversationsRoute( ConversationsRoute(
viewModel = viewModel, viewModel = conversationsViewModel,
onError = onError, onError = onError,
onNavigateToMessagesHistory = onNavigateToMessagesHistory, onNavigateToMessagesHistory = onNavigateToMessagesHistory,
onNavigateToCreateChat = onNavigateToCreateChat, onNavigateToCreateChat = onNavigateToCreateChat,
@@ -53,16 +53,10 @@ fun NavGraphBuilder.conversationsGraph(
) )
} }
composable<Archive> { composable<Archive> {
val context = LocalContext.current
val navController = LocalNavController.getOrThrow() val navController = LocalNavController.getOrThrow()
val viewModel: ConversationsViewModelImpl = koinViewModel(
qualifier = named(ConversationsFilter.ARCHIVE),
viewModelStoreOwner = context as AppCompatActivity
)
ConversationsRoute( ConversationsRoute(
viewModel = viewModel, viewModel = archiveViewModel,
onBack = navController::navigateUp, onBack = navController::navigateUp,
onError = onError, onError = onError,
onNavigateToMessagesHistory = onNavigateToMessagesHistory, onNavigateToMessagesHistory = onNavigateToMessagesHistory,
@@ -1,22 +1,37 @@
package dev.meloda.fast.friends.navigation package dev.meloda.fast.friends.navigation
import androidx.appcompat.app.AppCompatActivity
import androidx.navigation.NavGraphBuilder import androidx.navigation.NavGraphBuilder
import androidx.navigation.compose.composable 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.friends.presentation.FriendsRoute
import dev.meloda.fast.model.BaseError import dev.meloda.fast.model.BaseError
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import org.koin.androidx.viewmodel.ext.android.getViewModel
@Serializable @Serializable
object Friends object Friends
fun NavGraphBuilder.friendsScreen( fun NavGraphBuilder.friendsScreen(
activity: AppCompatActivity,
onError: (BaseError) -> Unit, onError: (BaseError) -> Unit,
onPhotoClicked: (url: String) -> Unit, onPhotoClicked: (url: String) -> Unit,
onMessageClicked: (userid: Long) -> Unit, onMessageClicked: (userId: Long) -> Unit,
onScrolledToTop: () -> Unit onScrolledToTop: () -> Unit
) { ) {
val friendsViewModel: FriendsViewModel = with(activity) {
getViewModel<FriendsViewModelImpl>()
}
val onlineFriendsViewModel: FriendsViewModel = with(activity) {
getViewModel<OnlineFriendsViewModelImpl>()
}
composable<Friends> { composable<Friends> {
FriendsRoute( FriendsRoute(
friendsViewModel = friendsViewModel,
onlineFriendsViewModel = onlineFriendsViewModel,
onError = onError, onError = onError,
onPhotoClicked = onPhotoClicked, onPhotoClicked = onPhotoClicked,
onMessageClicked = onMessageClicked, onMessageClicked = onMessageClicked,
@@ -46,6 +46,7 @@ import org.koin.androidx.compose.koinViewModel
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
fun FriendsScreen( fun FriendsScreen(
viewModel: FriendsViewModel,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
orderType: String, orderType: String,
padding: PaddingValues, padding: PaddingValues,
@@ -57,12 +58,6 @@ fun FriendsScreen(
onScrolledToTop: () -> Unit = {} onScrolledToTop: () -> Unit = {}
) { ) {
val context: Context = LocalContext.current val context: Context = LocalContext.current
val viewModel: FriendsViewModel =
if (tabIndex == 0) {
koinViewModel<FriendsViewModelImpl>(viewModelStoreOwner = context as AppCompatActivity)
} else {
koinViewModel<OnlineFriendsViewModelImpl>(viewModelStoreOwner = context as AppCompatActivity)
}
LaunchedEffect(orderType) { LaunchedEffect(orderType) {
viewModel.onOrderTypeChanged(orderType) viewModel.onOrderTypeChanged(orderType)
@@ -40,6 +40,7 @@ import androidx.compose.ui.unit.dp
import dev.chrisbanes.haze.hazeEffect import dev.chrisbanes.haze.hazeEffect
import dev.chrisbanes.haze.materials.ExperimentalHazeMaterialsApi import dev.chrisbanes.haze.materials.ExperimentalHazeMaterialsApi
import dev.chrisbanes.haze.materials.HazeMaterials import dev.chrisbanes.haze.materials.HazeMaterials
import dev.meloda.fast.friends.FriendsViewModel
import dev.meloda.fast.model.BaseError import dev.meloda.fast.model.BaseError
import dev.meloda.fast.ui.R import dev.meloda.fast.ui.R
import dev.meloda.fast.ui.components.ActionInvokeDismiss import dev.meloda.fast.ui.components.ActionInvokeDismiss
@@ -55,6 +56,8 @@ import dev.meloda.fast.ui.R as UiR
@OptIn(ExperimentalMaterial3Api::class, ExperimentalHazeMaterialsApi::class) @OptIn(ExperimentalMaterial3Api::class, ExperimentalHazeMaterialsApi::class)
@Composable @Composable
fun FriendsRoute( fun FriendsRoute(
friendsViewModel: FriendsViewModel,
onlineFriendsViewModel: FriendsViewModel,
onError: (BaseError) -> Unit, onError: (BaseError) -> Unit,
onPhotoClicked: (url: String) -> Unit, onPhotoClicked: (url: String) -> Unit,
onMessageClicked: (userid: Long) -> Unit, onMessageClicked: (userid: Long) -> Unit,
@@ -231,6 +234,7 @@ fun FriendsRoute(
modifier = Modifier.fillMaxSize(), modifier = Modifier.fillMaxSize(),
) { index -> ) { index ->
FriendsScreen( FriendsScreen(
viewModel = if (index == 0) friendsViewModel else onlineFriendsViewModel,
orderType = orderType, orderType = orderType,
padding = padding, padding = padding,
tabIndex = index, tabIndex = index,
@@ -1,7 +1,6 @@
package dev.meloda.fast.profile.navigation package dev.meloda.fast.profile.navigation
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.compose.ui.platform.LocalContext
import androidx.navigation.NavGraphBuilder import androidx.navigation.NavGraphBuilder
import androidx.navigation.compose.composable import androidx.navigation.compose.composable
import dev.meloda.fast.model.BaseError 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.ProfileViewModelImpl
import dev.meloda.fast.profile.presentation.ProfileRoute import dev.meloda.fast.profile.presentation.ProfileRoute
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import org.koin.androidx.compose.koinViewModel import org.koin.androidx.viewmodel.ext.android.getViewModel
@Serializable @Serializable
object Profile object Profile
fun NavGraphBuilder.profileScreen( fun NavGraphBuilder.profileScreen(
activity: AppCompatActivity,
onError: (BaseError) -> Unit, onError: (BaseError) -> Unit,
onSettingsButtonClicked: () -> Unit, onSettingsButtonClicked: () -> Unit,
onPhotoClicked: (url: String) -> Unit onPhotoClicked: (url: String) -> Unit
) { ) {
val viewModel: ProfileViewModel = with(activity) {
getViewModel<ProfileViewModelImpl>()
}
composable<Profile> { composable<Profile> {
val context = LocalContext.current
val viewModel: ProfileViewModel = koinViewModel<ProfileViewModelImpl>(
viewModelStoreOwner = context as AppCompatActivity
)
ProfileRoute( ProfileRoute(
onError = onError, onError = onError,
onSettingsButtonClicked = onSettingsButtonClicked, onSettingsButtonClicked = onSettingsButtonClicked,