From 17b5c944acb30e0d010631212ccfc30a2fcddc25 Mon Sep 17 00:00:00 2001 From: Danil Nikolaev Date: Fri, 20 Jun 2025 21:55:17 +0300 Subject: [PATCH] m3 expressive theme and full screen loader revert pre-loading non-main screens --- .../dev/meloda/fast/ui/components/FullScreenLoader.kt | 10 ++++++++-- .../main/kotlin/dev/meloda/fast/ui/theme/AppTheme.kt | 5 ++++- .../navigation/ConversationsNavigation.kt | 10 +++++----- .../conversations/presentation/ConversationsScreen.kt | 7 +++---- .../fast/friends/navigation/FriendsNavigation.kt | 6 +----- .../fast/friends/presentation/RootFriendsScreen.kt | 9 +++++++-- 6 files changed, 28 insertions(+), 19 deletions(-) diff --git a/core/ui/src/main/kotlin/dev/meloda/fast/ui/components/FullScreenLoader.kt b/core/ui/src/main/kotlin/dev/meloda/fast/ui/components/FullScreenLoader.kt index 3ca765eb..b8b738f6 100644 --- a/core/ui/src/main/kotlin/dev/meloda/fast/ui/components/FullScreenLoader.kt +++ b/core/ui/src/main/kotlin/dev/meloda/fast/ui/components/FullScreenLoader.kt @@ -3,12 +3,15 @@ package dev.meloda.fast.ui.components import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.navigationBarsPadding -import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.ContainedLoadingIndicator +import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi +import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview +@OptIn(ExperimentalMaterial3ExpressiveApi::class) @Composable fun FullScreenLoader(modifier: Modifier = Modifier) { Box( @@ -17,7 +20,10 @@ fun FullScreenLoader(modifier: Modifier = Modifier) { .navigationBarsPadding(), contentAlignment = Alignment.Center ) { - CircularProgressIndicator() + ContainedLoadingIndicator( + containerColor = MaterialTheme.colorScheme.primary, + indicatorColor = MaterialTheme.colorScheme.primaryContainer + ) } } diff --git a/core/ui/src/main/kotlin/dev/meloda/fast/ui/theme/AppTheme.kt b/core/ui/src/main/kotlin/dev/meloda/fast/ui/theme/AppTheme.kt index 0a0bf276..0745c722 100644 --- a/core/ui/src/main/kotlin/dev/meloda/fast/ui/theme/AppTheme.kt +++ b/core/ui/src/main/kotlin/dev/meloda/fast/ui/theme/AppTheme.kt @@ -4,6 +4,8 @@ import android.app.Activity import android.os.Build import androidx.compose.animation.animateColorAsState import androidx.compose.material3.ColorScheme +import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi +import androidx.compose.material3.MaterialExpressiveTheme import androidx.compose.material3.MaterialTheme import androidx.compose.material3.darkColorScheme import androidx.compose.material3.dynamicDarkColorScheme @@ -142,6 +144,7 @@ fun ProvidableCompositionLocal.getOrThrow(): T { return requireNotNull(current) } +@OptIn(ExperimentalMaterial3ExpressiveApi::class) @Composable fun AppTheme( predefinedColorScheme: ColorScheme? = null, @@ -213,7 +216,7 @@ fun AppTheme( } } - MaterialTheme( + MaterialExpressiveTheme( colorScheme = (predefinedColorScheme ?: colorScheme) .copy( primary = colorPrimary, 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 1e244481..91ad0fd0 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 @@ -36,10 +36,6 @@ fun NavGraphBuilder.conversationsGraph( val conversationsViewModel: ConversationsViewModelImpl = with(activity) { getViewModel(qualifier = named(ConversationsFilter.ALL)) } - val archiveViewModel: ConversationsViewModelImpl = with(activity) { - getViewModel(qualifier = named(ConversationsFilter.ARCHIVE)) - } - composable { val navController = LocalNavController.getOrThrow() @@ -56,7 +52,11 @@ fun NavGraphBuilder.conversationsGraph( val navController = LocalNavController.getOrThrow() ConversationsRoute( - viewModel = archiveViewModel, + viewModel = with(activity) { + getViewModel( + qualifier = named(ConversationsFilter.ARCHIVE) + ) + }, onBack = navController::navigateUp, onError = onError, onNavigateToMessagesHistory = onNavigateToMessagesHistory, diff --git a/feature/conversations/src/main/kotlin/dev/meloda/fast/conversations/presentation/ConversationsScreen.kt b/feature/conversations/src/main/kotlin/dev/meloda/fast/conversations/presentation/ConversationsScreen.kt index 1db8488f..9dd3ef9f 100644 --- a/feature/conversations/src/main/kotlin/dev/meloda/fast/conversations/presentation/ConversationsScreen.kt +++ b/feature/conversations/src/main/kotlin/dev/meloda/fast/conversations/presentation/ConversationsScreen.kt @@ -25,6 +25,7 @@ import androidx.compose.material.icons.rounded.Refresh import androidx.compose.material3.DropdownMenu import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi import androidx.compose.material3.FloatingActionButton import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon @@ -62,7 +63,6 @@ import dev.chrisbanes.haze.hazeSource import dev.chrisbanes.haze.materials.ExperimentalHazeMaterialsApi import dev.chrisbanes.haze.materials.HazeMaterials import dev.meloda.fast.conversations.model.ConversationsScreenState -import dev.meloda.fast.conversations.navigation.Conversations import dev.meloda.fast.conversations.navigation.ConversationsGraph import dev.meloda.fast.model.BaseError import dev.meloda.fast.ui.components.FullScreenLoader @@ -79,12 +79,11 @@ import dev.meloda.fast.ui.util.emptyImmutableList import dev.meloda.fast.ui.util.isScrollingUp import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.debounce - import dev.meloda.fast.ui.R as UiR @OptIn( ExperimentalMaterial3Api::class, - ExperimentalHazeMaterialsApi::class, + ExperimentalHazeMaterialsApi::class, ExperimentalMaterial3ExpressiveApi::class, ) @Composable fun ConversationsScreen( @@ -117,7 +116,7 @@ fun ConversationsScreen( initialFirstVisibleItemScrollOffset = screenState.scrollOffset ) - val currentTabReselected = LocalReselectedTab.current[ConversationsGraph] ?: false + val currentTabReselected = LocalReselectedTab.current[ConversationsGraph] == true LaunchedEffect(currentTabReselected) { if (currentTabReselected) { if (screenState.isArchive) { 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 d8bd8585..bc36e2d1 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 @@ -5,7 +5,6 @@ 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 @@ -24,14 +23,11 @@ fun NavGraphBuilder.friendsScreen( val friendsViewModel: FriendsViewModel = with(activity) { getViewModel() } - val onlineFriendsViewModel: FriendsViewModel = with(activity) { - getViewModel() - } composable { FriendsRoute( + activity = activity, friendsViewModel = friendsViewModel, - onlineFriendsViewModel = onlineFriendsViewModel, onError = onError, onPhotoClicked = onPhotoClicked, onMessageClicked = onMessageClicked, 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 817cc14d..67b6c3eb 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 @@ -1,5 +1,6 @@ package dev.meloda.fast.friends.presentation +import androidx.appcompat.app.AppCompatActivity import androidx.compose.animation.animateColorAsState import androidx.compose.animation.core.FastOutLinearInEasing import androidx.compose.animation.core.animateFloatAsState @@ -41,6 +42,7 @@ 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.friends.OnlineFriendsViewModelImpl import dev.meloda.fast.model.BaseError import dev.meloda.fast.ui.R import dev.meloda.fast.ui.components.ActionInvokeDismiss @@ -51,13 +53,14 @@ import dev.meloda.fast.ui.theme.LocalHazeState import dev.meloda.fast.ui.theme.LocalThemeConfig import dev.meloda.fast.ui.util.ImmutableList import kotlinx.coroutines.launch +import org.koin.androidx.viewmodel.ext.android.getViewModel import dev.meloda.fast.ui.R as UiR @OptIn(ExperimentalMaterial3Api::class, ExperimentalHazeMaterialsApi::class) @Composable fun FriendsRoute( + activity: AppCompatActivity, friendsViewModel: FriendsViewModel, - onlineFriendsViewModel: FriendsViewModel, onError: (BaseError) -> Unit, onPhotoClicked: (url: String) -> Unit, onMessageClicked: (userid: Long) -> Unit, @@ -234,7 +237,9 @@ fun FriendsRoute( modifier = Modifier.fillMaxSize(), ) { index -> FriendsScreen( - viewModel = if (index == 0) friendsViewModel else onlineFriendsViewModel, + viewModel = if (index == 0) friendsViewModel else with(activity) { + getViewModel() + }, orderType = orderType, padding = padding, tabIndex = index,