m3 expressive theme and full screen loader

revert pre-loading non-main screens
This commit is contained in:
2025-06-20 21:55:17 +03:00
parent 5aa1f21183
commit 17b5c944ac
6 changed files with 28 additions and 19 deletions
@@ -3,12 +3,15 @@ package dev.meloda.fast.ui.components
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.navigationBarsPadding 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.runtime.Composable
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
@OptIn(ExperimentalMaterial3ExpressiveApi::class)
@Composable @Composable
fun FullScreenLoader(modifier: Modifier = Modifier) { fun FullScreenLoader(modifier: Modifier = Modifier) {
Box( Box(
@@ -17,7 +20,10 @@ fun FullScreenLoader(modifier: Modifier = Modifier) {
.navigationBarsPadding(), .navigationBarsPadding(),
contentAlignment = Alignment.Center contentAlignment = Alignment.Center
) { ) {
CircularProgressIndicator() ContainedLoadingIndicator(
containerColor = MaterialTheme.colorScheme.primary,
indicatorColor = MaterialTheme.colorScheme.primaryContainer
)
} }
} }
@@ -4,6 +4,8 @@ import android.app.Activity
import android.os.Build import android.os.Build
import androidx.compose.animation.animateColorAsState import androidx.compose.animation.animateColorAsState
import androidx.compose.material3.ColorScheme import androidx.compose.material3.ColorScheme
import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
import androidx.compose.material3.MaterialExpressiveTheme
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.darkColorScheme import androidx.compose.material3.darkColorScheme
import androidx.compose.material3.dynamicDarkColorScheme import androidx.compose.material3.dynamicDarkColorScheme
@@ -142,6 +144,7 @@ fun <T: NavController> ProvidableCompositionLocal<T?>.getOrThrow(): T {
return requireNotNull(current) return requireNotNull(current)
} }
@OptIn(ExperimentalMaterial3ExpressiveApi::class)
@Composable @Composable
fun AppTheme( fun AppTheme(
predefinedColorScheme: ColorScheme? = null, predefinedColorScheme: ColorScheme? = null,
@@ -213,7 +216,7 @@ fun AppTheme(
} }
} }
MaterialTheme( MaterialExpressiveTheme(
colorScheme = (predefinedColorScheme ?: colorScheme) colorScheme = (predefinedColorScheme ?: colorScheme)
.copy( .copy(
primary = colorPrimary, primary = colorPrimary,
@@ -36,10 +36,6 @@ fun NavGraphBuilder.conversationsGraph(
val conversationsViewModel: ConversationsViewModelImpl = with(activity) { val conversationsViewModel: ConversationsViewModelImpl = with(activity) {
getViewModel(qualifier = named(ConversationsFilter.ALL)) getViewModel(qualifier = named(ConversationsFilter.ALL))
} }
val archiveViewModel: ConversationsViewModelImpl = with(activity) {
getViewModel(qualifier = named(ConversationsFilter.ARCHIVE))
}
composable<Conversations> { composable<Conversations> {
val navController = LocalNavController.getOrThrow() val navController = LocalNavController.getOrThrow()
@@ -56,7 +52,11 @@ fun NavGraphBuilder.conversationsGraph(
val navController = LocalNavController.getOrThrow() val navController = LocalNavController.getOrThrow()
ConversationsRoute( ConversationsRoute(
viewModel = archiveViewModel, viewModel = with(activity) {
getViewModel<ConversationsViewModelImpl>(
qualifier = named(ConversationsFilter.ARCHIVE)
)
},
onBack = navController::navigateUp, onBack = navController::navigateUp,
onError = onError, onError = onError,
onNavigateToMessagesHistory = onNavigateToMessagesHistory, onNavigateToMessagesHistory = onNavigateToMessagesHistory,
@@ -25,6 +25,7 @@ import androidx.compose.material.icons.rounded.Refresh
import androidx.compose.material3.DropdownMenu import androidx.compose.material3.DropdownMenu
import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.DropdownMenuItem
import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
import androidx.compose.material3.FloatingActionButton import androidx.compose.material3.FloatingActionButton
import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.Icon 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.ExperimentalHazeMaterialsApi
import dev.chrisbanes.haze.materials.HazeMaterials import dev.chrisbanes.haze.materials.HazeMaterials
import dev.meloda.fast.conversations.model.ConversationsScreenState 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.conversations.navigation.ConversationsGraph
import dev.meloda.fast.model.BaseError import dev.meloda.fast.model.BaseError
import dev.meloda.fast.ui.components.FullScreenLoader 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 dev.meloda.fast.ui.util.isScrollingUp
import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.flow.debounce import kotlinx.coroutines.flow.debounce
import dev.meloda.fast.ui.R as UiR import dev.meloda.fast.ui.R as UiR
@OptIn( @OptIn(
ExperimentalMaterial3Api::class, ExperimentalMaterial3Api::class,
ExperimentalHazeMaterialsApi::class, ExperimentalHazeMaterialsApi::class, ExperimentalMaterial3ExpressiveApi::class,
) )
@Composable @Composable
fun ConversationsScreen( fun ConversationsScreen(
@@ -117,7 +116,7 @@ fun ConversationsScreen(
initialFirstVisibleItemScrollOffset = screenState.scrollOffset initialFirstVisibleItemScrollOffset = screenState.scrollOffset
) )
val currentTabReselected = LocalReselectedTab.current[ConversationsGraph] ?: false val currentTabReselected = LocalReselectedTab.current[ConversationsGraph] == true
LaunchedEffect(currentTabReselected) { LaunchedEffect(currentTabReselected) {
if (currentTabReselected) { if (currentTabReselected) {
if (screenState.isArchive) { if (screenState.isArchive) {
@@ -5,7 +5,6 @@ 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.FriendsViewModel
import dev.meloda.fast.friends.FriendsViewModelImpl 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
@@ -24,14 +23,11 @@ fun NavGraphBuilder.friendsScreen(
val friendsViewModel: FriendsViewModel = with(activity) { val friendsViewModel: FriendsViewModel = with(activity) {
getViewModel<FriendsViewModelImpl>() getViewModel<FriendsViewModelImpl>()
} }
val onlineFriendsViewModel: FriendsViewModel = with(activity) {
getViewModel<OnlineFriendsViewModelImpl>()
}
composable<Friends> { composable<Friends> {
FriendsRoute( FriendsRoute(
activity = activity,
friendsViewModel = friendsViewModel, friendsViewModel = friendsViewModel,
onlineFriendsViewModel = onlineFriendsViewModel,
onError = onError, onError = onError,
onPhotoClicked = onPhotoClicked, onPhotoClicked = onPhotoClicked,
onMessageClicked = onMessageClicked, onMessageClicked = onMessageClicked,
@@ -1,5 +1,6 @@
package dev.meloda.fast.friends.presentation package dev.meloda.fast.friends.presentation
import androidx.appcompat.app.AppCompatActivity
import androidx.compose.animation.animateColorAsState import androidx.compose.animation.animateColorAsState
import androidx.compose.animation.core.FastOutLinearInEasing import androidx.compose.animation.core.FastOutLinearInEasing
import androidx.compose.animation.core.animateFloatAsState 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.ExperimentalHazeMaterialsApi
import dev.chrisbanes.haze.materials.HazeMaterials import dev.chrisbanes.haze.materials.HazeMaterials
import dev.meloda.fast.friends.FriendsViewModel import dev.meloda.fast.friends.FriendsViewModel
import dev.meloda.fast.friends.OnlineFriendsViewModelImpl
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
@@ -51,13 +53,14 @@ import dev.meloda.fast.ui.theme.LocalHazeState
import dev.meloda.fast.ui.theme.LocalThemeConfig import dev.meloda.fast.ui.theme.LocalThemeConfig
import dev.meloda.fast.ui.util.ImmutableList import dev.meloda.fast.ui.util.ImmutableList
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import org.koin.androidx.viewmodel.ext.android.getViewModel
import dev.meloda.fast.ui.R as UiR import dev.meloda.fast.ui.R as UiR
@OptIn(ExperimentalMaterial3Api::class, ExperimentalHazeMaterialsApi::class) @OptIn(ExperimentalMaterial3Api::class, ExperimentalHazeMaterialsApi::class)
@Composable @Composable
fun FriendsRoute( fun FriendsRoute(
activity: AppCompatActivity,
friendsViewModel: FriendsViewModel, 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,
@@ -234,7 +237,9 @@ fun FriendsRoute(
modifier = Modifier.fillMaxSize(), modifier = Modifier.fillMaxSize(),
) { index -> ) { index ->
FriendsScreen( FriendsScreen(
viewModel = if (index == 0) friendsViewModel else onlineFriendsViewModel, viewModel = if (index == 0) friendsViewModel else with(activity) {
getViewModel<OnlineFriendsViewModelImpl>()
},
orderType = orderType, orderType = orderType,
padding = padding, padding = padding,
tabIndex = index, tabIndex = index,