diff --git a/app/src/main/java/com/huanchengfly/tieba/post/MainActivityV2.kt b/app/src/main/java/com/huanchengfly/tieba/post/MainActivityV2.kt index 9d3928f4..c0050a83 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/MainActivityV2.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/MainActivityV2.kt @@ -24,6 +24,8 @@ import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.State +import androidx.compose.runtime.collectAsState import androidx.compose.runtime.staticCompositionLocalOf import androidx.compose.ui.Alignment import androidx.compose.ui.res.stringResource @@ -83,6 +85,8 @@ import kotlinx.coroutines.launch val LocalNotificationCountFlow = staticCompositionLocalOf> { throw IllegalStateException("not allowed here!") } +val LocalDevicePosture = + staticCompositionLocalOf> { throw IllegalStateException("not allowed here!") } @AndroidEntryPoint class MainActivityV2 : BaseComposeActivity() { @@ -219,7 +223,10 @@ class MainActivityV2 : BaseComposeActivity() { okSignAlertDialogState.show() } } - CompositionLocalProvider(LocalNotificationCountFlow provides notificationCountFlow) { + CompositionLocalProvider( + LocalNotificationCountFlow provides notificationCountFlow, + LocalDevicePosture provides devicePostureFlow.collectAsState(), + ) { Surface( color = ExtendedTheme.colors.background ) { @@ -274,7 +281,6 @@ class MainActivityV2 : BaseComposeActivity() { engine = engine, dependenciesContainerBuilder = { dependency(MainPageDestination) { this@MainActivityV2 } - dependency(devicePostureFlow) } ) } diff --git a/app/src/main/java/com/huanchengfly/tieba/post/ui/page/main/MainPage.kt b/app/src/main/java/com/huanchengfly/tieba/post/ui/page/main/MainPage.kt index 929b19b2..fdf61a60 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/ui/page/main/MainPage.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/ui/page/main/MainPage.kt @@ -19,7 +19,6 @@ import androidx.compose.material.icons.rounded.Inventory2 import androidx.compose.material.icons.rounded.Notifications import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope @@ -30,6 +29,7 @@ import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.vectorResource +import com.huanchengfly.tieba.post.LocalDevicePosture import com.huanchengfly.tieba.post.LocalNotificationCountFlow import com.huanchengfly.tieba.post.R import com.huanchengfly.tieba.post.arch.BaseComposeActivity.Companion.LocalWindowSizeClass @@ -50,8 +50,9 @@ import com.huanchengfly.tieba.post.utils.appPreferences import com.ramcosta.composedestinations.annotation.Destination import com.ramcosta.composedestinations.annotation.RootNavGraph import com.ramcosta.composedestinations.navigation.DestinationsNavigator +import kotlinx.collections.immutable.ImmutableList +import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.flow.MutableSharedFlow -import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.launch @Composable @@ -59,7 +60,7 @@ private fun NavigationWrapper( currentPosition: Int, onChangePosition: (position: Int) -> Unit, onReselected: (position: Int) -> Unit, - navigationItems: List, + navigationItems: ImmutableList, navigationType: MainNavigationType, navigationContentPosition: MainNavigationContentPosition, content: @Composable () -> Unit, @@ -97,7 +98,6 @@ private fun NavigationWrapper( @Composable fun MainPage( navigator: DestinationsNavigator, - devicePostureFlow: StateFlow, viewModel: MainViewModel = pageViewModel(emptyList()), ) { val messageCount by viewModel.uiState.collectPartialAsState( @@ -125,11 +125,12 @@ fun MainPage( val coroutineScope = rememberCoroutineScope() val themeColors = ExtendedTheme.colors val windowSizeClass = LocalWindowSizeClass.current - val foldingDevicePosture by devicePostureFlow.collectAsState() + val foldingDevicePosture by LocalDevicePosture.current val navigationItems = listOfNotNull( NavigationItem( + id = "home", icon = { if (it) Icons.Rounded.Inventory2 else Icons.Outlined.Inventory2 }, - title = stringResource(id = R.string.title_main), + title = { stringResource(id = R.string.title_main) }, content = { HomePage( eventFlow = eventFlows[0], @@ -143,19 +144,21 @@ fun MainPage( ), if (LocalContext.current.appPreferences.hideExplore) null else NavigationItem( + id = "explore", icon = { if (it) ImageVector.vectorResource(id = R.drawable.ic_round_toys) else ImageVector.vectorResource( id = R.drawable.ic_outline_toys ) }, - title = stringResource(id = R.string.title_explore), + title = { stringResource(id = R.string.title_explore) }, content = { ExplorePage(eventFlows[1]) } ), NavigationItem( + id = "notification", icon = { if (it) Icons.Rounded.Notifications else Icons.Outlined.Notifications }, - title = stringResource(id = R.string.title_notifications), + title = { stringResource(id = R.string.title_notifications) }, badge = messageCount > 0, badgeText = "$messageCount", onClick = { @@ -166,13 +169,14 @@ fun MainPage( } ), NavigationItem( + id = "user", icon = { if (it) Icons.Rounded.AccountCircle else Icons.Outlined.AccountCircle }, - title = stringResource(id = R.string.title_user), + title = { stringResource(id = R.string.title_user) }, content = { UserPage() } ), - ) + ).toImmutableList() val navigationType = when (windowSizeClass.widthSizeClass) { WindowWidthSizeClass.Compact -> { @@ -245,7 +249,7 @@ fun MainPage( contentPadding = paddingValues, pageCount = navigationItems.size, state = pagerState, - key = { navigationItems[it].title }, + key = { navigationItems[it].id }, modifier = Modifier.fillMaxSize(), verticalAlignment = Alignment.Top, userScrollEnabled = false diff --git a/app/src/main/java/com/huanchengfly/tieba/post/ui/page/main/NavigationComponents.kt b/app/src/main/java/com/huanchengfly/tieba/post/ui/page/main/NavigationComponents.kt index b2be6f5b..72b2b491 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/ui/page/main/NavigationComponents.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/ui/page/main/NavigationComponents.kt @@ -55,6 +55,7 @@ import com.huanchengfly.tieba.post.ui.widgets.compose.AccountNavIcon import com.huanchengfly.tieba.post.ui.widgets.compose.Avatar import com.huanchengfly.tieba.post.ui.widgets.compose.Sizes import com.huanchengfly.tieba.post.utils.AccountUtil.LocalAccount +import kotlinx.collections.immutable.ImmutableList enum class LayoutType { HEADER, CONTENT @@ -130,7 +131,7 @@ fun NavigationDrawerContent( currentPosition: Int, onChangePosition: (position: Int) -> Unit, onReselected: (position: Int) -> Unit, - navigationItems: List, + navigationItems: ImmutableList, navigationContentPosition: MainNavigationContentPosition ) { PositionLayout( @@ -199,12 +200,12 @@ fun NavigationDrawerContent( onChangePosition(index) } }, - label = { Text(text = navigationItem.title) }, + label = { Text(text = navigationItem.title(index == currentPosition)) }, icon = { Box { Icon( imageVector = navigationItem.icon(index == currentPosition), - contentDescription = navigationItem.title + contentDescription = navigationItem.title(index == currentPosition) ) if (navigationItem.badge) { Text( @@ -283,7 +284,7 @@ fun NavigationRail( currentPosition: Int, onChangePosition: (position: Int) -> Unit, onReselected: (position: Int) -> Unit, - navigationItems: List, + navigationItems: ImmutableList, navigationContentPosition: MainNavigationContentPosition ) { NavigationRail( @@ -315,7 +316,7 @@ fun NavigationRail( Box { Icon( imageVector = navigationItem.icon(index == currentPosition), - contentDescription = navigationItem.title + contentDescription = navigationItem.title(index == currentPosition) ) if (navigationItem.badge) { Text( @@ -360,7 +361,7 @@ fun BottomNavigation( currentPosition: Int, onChangePosition: (position: Int) -> Unit, onReselected: (position: Int) -> Unit, - navigationItems: List, + navigationItems: ImmutableList, themeColors: ExtendedColors = ExtendedTheme.colors ) { Column(modifier = Modifier.navigationBarsPadding()) { @@ -384,7 +385,7 @@ fun BottomNavigation( Box { Icon( imageVector = navigationItem.icon(index == currentPosition), - contentDescription = navigationItem.title + contentDescription = navigationItem.title(index == currentPosition) ) if (navigationItem.badge) { Text( @@ -414,8 +415,9 @@ fun BottomNavigation( } data class NavigationItem( + val id: String, val icon: @Composable (selected: Boolean) -> ImageVector, - val title: String, + val title: @Composable (selected: Boolean) -> String, val badge: Boolean = false, val badgeText: String? = null, val onClick: (() -> Unit)? = null,