@@ -14,25 +14,27 @@ import androidx.compose.animation.slideInHorizontally
1414import androidx.compose.animation.slideInVertically
1515import androidx.compose.animation.slideOutHorizontally
1616import androidx.compose.animation.slideOutVertically
17+ import androidx.compose.foundation.background
18+ import androidx.compose.foundation.layout.Box
1719import androidx.compose.foundation.layout.Spacer
1820import androidx.compose.foundation.layout.fillMaxSize
21+ import androidx.compose.foundation.layout.size
1922import androidx.compose.foundation.lazy.grid.LazyGridState
2023import androidx.compose.foundation.lazy.grid.rememberLazyGridState
2124import androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridState
2225import androidx.compose.foundation.lazy.staggeredgrid.rememberLazyStaggeredGridState
26+ import androidx.compose.foundation.shape.CircleShape
2327import androidx.compose.material.icons.Icons
2428import androidx.compose.material.icons.automirrored.rounded.Segment
25- import androidx.compose.material.icons.filled.Menu
2629import androidx.compose.material.icons.rounded.FiberNew
2730import androidx.compose.material.icons.rounded.Home
31+ import androidx.compose.material.icons.rounded.Person
2832import androidx.compose.material.icons.rounded.Search
2933import androidx.compose.material.icons.rounded.Settings
3034import androidx.compose.material3.DrawerState
3135import androidx.compose.material3.DrawerValue
3236import androidx.compose.material3.Icon
33- import androidx.compose.material3.IconButton
3437import androidx.compose.material3.MaterialTheme
35- import androidx.compose.material3.ModalNavigationDrawer
3638import androidx.compose.material3.NavigationRail
3739import androidx.compose.material3.NavigationRailItem
3840import androidx.compose.material3.Text
@@ -56,8 +58,12 @@ import androidx.compose.runtime.remember
5658import androidx.compose.runtime.rememberCoroutineScope
5759import androidx.compose.runtime.setValue
5860import androidx.compose.ui.Modifier
61+ import androidx.compose.ui.draw.clip
62+ import androidx.compose.ui.graphics.Color
5963import androidx.compose.ui.graphics.vector.ImageVector
64+ import androidx.compose.ui.layout.ContentScale
6065import androidx.compose.ui.platform.LocalContext
66+ import androidx.compose.ui.unit.dp
6167import androidx.lifecycle.Lifecycle
6268import androidx.lifecycle.LifecycleEventObserver
6369import androidx.lifecycle.compose.LocalLifecycleOwner
@@ -69,6 +75,7 @@ import androidx.navigation.compose.NavHost
6975import androidx.navigation.compose.composable
7076import androidx.navigation.compose.currentBackStackEntryAsState
7177import androidx.navigation.compose.rememberNavController
78+ import coil.compose.AsyncImage
7279import coil.compose.rememberAsyncImagePainter
7380import coil.request.ImageRequest
7481import coil.size.Size
@@ -77,13 +84,13 @@ import com.origeek.imageViewer.previewer.VerticalDragType
7784import com.origeek.imageViewer.previewer.rememberPreviewerState
7885import dev.aaa1115910.biliapi.entity.Picture
7986import dev.aaa1115910.bv.component.DevelopingTipContent
87+ import dev.aaa1115910.bv.mobile.activities.FollowingUserActivity
8088import dev.aaa1115910.bv.mobile.activities.LoginActivity
8189import dev.aaa1115910.bv.mobile.activities.SettingsActivity
90+ import dev.aaa1115910.bv.mobile.component.home.UserDialog
8291import dev.aaa1115910.bv.mobile.screen.home.DynamicScreen
8392import dev.aaa1115910.bv.mobile.screen.home.HomeScreen
84- import dev.aaa1115910.bv.mobile.screen.home.UserSwitchDialog
8593import dev.aaa1115910.bv.screen.user.UserSwitchViewModel
86- import dev.aaa1115910.bv.util.Prefs
8794import dev.aaa1115910.bv.util.fInfo
8895import dev.aaa1115910.bv.util.swapList
8996import dev.aaa1115910.bv.viewmodel.UserViewModel
@@ -94,6 +101,7 @@ import kotlinx.coroutines.Dispatchers
94101import kotlinx.coroutines.launch
95102import org.koin.androidx.compose.koinViewModel
96103
104+ @OptIn(ExperimentalMaterial3WindowSizeClassApi ::class )
97105@Composable
98106fun MobileMainScreen (
99107 modifier : Modifier = Modifier ,
@@ -109,6 +117,7 @@ fun MobileMainScreen(
109117 )
110118 val context = LocalContext .current
111119 val scope = rememberCoroutineScope()
120+ val windowSizeClass = calculateWindowSizeClass(context as Activity )
112121
113122 val navSuiteType =
114123 NavigationSuiteScaffoldDefaults .calculateFromAdaptiveInfo(currentWindowAdaptiveInfo())
@@ -202,36 +211,21 @@ fun MobileMainScreen(
202211 }
203212 }
204213
205- BackHandler (state.showUserSwitchDialog ) {
206- state.hideUserSwitch ()
214+ BackHandler (state.showUserDialog ) {
215+ state.hideUserDialog ()
207216 }
208217
209- ModalNavigationDrawer (
218+ Box (
210219 modifier = modifier,
211- drawerState = state.drawerState,
212- gesturesEnabled = ! state.activeSearch,
213- drawerContent = {
214- ModalNavDrawerContent (
215- avatar = userViewModel.face,
216- username = userViewModel.username,
217- isLogin = Prefs .isLogin,
218- onCloseDrawer = { scope.launch { state.drawerState.close() } },
219- onLogin = { context.startActivity(Intent (context, LoginActivity ::class .java)) },
220- onLogout = { },
221- onGoHome = { state.navigate(MobileMainScreenNav .Home ) },
222- onGoHistory = { },
223- onGoFavorite = { },
224- onGoSetting = { state.navigate(MobileMainScreenNav .Setting ) },
225- onGoMyFollowingUser = { },
226- )
227- }
228220 ) {
229221 NavigationSuiteScaffoldLayout (
230222 navigationSuite = {
231223 NavigationSuit (
232224 mobileMainScreenState = state,
233225 navigationSuiteType = navSuiteType,
234- onNavigate = state::navigate
226+ avatar = userViewModel.face,
227+ onNavigate = state::navigate,
228+ onShowUserDialog = state::showUserDialog
235229 )
236230 }
237231 ) {
@@ -243,11 +237,10 @@ fun MobileMainScreen(
243237 ) {
244238 composable(MobileMainScreenNav .Home .name) {
245239 HomeScreen (
246- drawerState = state.drawerState,
247240 rcmdGridState = state.rcmdGridState,
248241 popularGridState = state.popularGridState,
249242 windowSize = state.windowSizeClass.widthSizeClass,
250- onShowSwitchUser = state::showUserSwitch
243+ onShowUserDialog = state::showUserDialog
251244 )
252245 }
253246
@@ -289,10 +282,11 @@ fun MobileMainScreen(
289282 }
290283 )
291284
292- UserSwitchDialog (
293- show = state.showUserSwitchDialog,
294- onHideDialog = { state.showUserSwitchDialog = false },
295- currentUser = userSwitchViewModel.currentUser,
285+ UserDialog (
286+ show = state.showUserDialog,
287+ windowWidthSizeClass = windowSizeClass.widthSizeClass,
288+ onHideDialog = { state.showUserDialog = false },
289+ currentUser = userSwitchViewModel.currentUser.takeIf { it.id != - 1 },
296290 userList = userSwitchViewModel.userDbList,
297291 onSwitchUser = { user ->
298292 scope.launch(Dispatchers .IO ) {
@@ -304,7 +298,17 @@ fun MobileMainScreen(
304298 scope.launch(Dispatchers .IO ) {
305299 userSwitchViewModel.deleteUser(user)
306300 }
307- }
301+ },
302+ onOpenFollowingUser = {
303+ context.startActivity(
304+ Intent (context, FollowingUserActivity ::class .java)
305+ )
306+ },
307+ onOpenHistory = {},
308+ onOpenFavorite = {},
309+ onOpenFollowingPgc = {},
310+ onOpenToView = {},
311+ onOpenSettings = { context.startActivity(Intent (context, SettingsActivity ::class .java)) }
308312 )
309313}
310314
@@ -313,10 +317,10 @@ private fun NavigationSuit(
313317 modifier : Modifier = Modifier ,
314318 mobileMainScreenState : MobileMainScreenState ,
315319 navigationSuiteType : NavigationSuiteType ,
320+ avatar : String ,
316321 onNavigate : (MobileMainScreenNav ) -> Unit ,
322+ onShowUserDialog : () -> Unit ,
317323) {
318- val scope = rememberCoroutineScope()
319-
320324 when (navigationSuiteType) {
321325 NavigationSuiteType .NavigationBar -> {
322326 NavigationSuite (
@@ -343,11 +347,29 @@ private fun NavigationSuit(
343347 modifier = modifier,
344348 containerColor = MaterialTheme .colorScheme.surfaceContainer
345349 ) {
346- IconButton (onClick = {
347- scope.launch { mobileMainScreenState.drawerState.open() }
348- }) {
349- Icon (imageVector = Icons .Default .Menu , contentDescription = null )
350- }
350+ NavigationRailItem (
351+ icon = {
352+ if (avatar.isBlank()) {
353+ Icon (Icons .Rounded .Person , contentDescription = " User Avatar" )
354+ } else {
355+ Box (
356+ modifier = Modifier
357+ .clip(CircleShape )
358+ .background(Color .Gray )
359+ ) {
360+ AsyncImage (
361+ modifier = Modifier
362+ .size(36 .dp),
363+ model = avatar,
364+ contentDescription = null ,
365+ contentScale = ContentScale .Crop
366+ )
367+ }
368+ }
369+ },
370+ selected = false ,
371+ onClick = onShowUserDialog
372+ )
351373 Spacer (Modifier .weight(1f ))
352374 listOf (
353375 MobileMainScreenNav .Search ,
@@ -380,7 +402,7 @@ data class MobileMainScreenState(
380402 val context : Context ,
381403 val scope : CoroutineScope ,
382404 val windowSizeClass : WindowSizeClass ,
383- val drawerState : DrawerState ,
405+ // val drawerState: DrawerState,
384406 val rcmdGridState : LazyGridState ,
385407 val popularGridState : LazyGridState ,
386408 val dynamicGridState : LazyStaggeredGridState ,
@@ -397,7 +419,7 @@ data class MobileMainScreenState(
397419
398420 var activeSearch by mutableStateOf(false )
399421
400- var showUserSwitchDialog by mutableStateOf(false )
422+ var showUserDialog by mutableStateOf(false )
401423
402424 fun navigate (navItem : MobileMainScreenNav ) {
403425 logger.fInfo { " Navigate to ${navItem.name} " }
@@ -461,15 +483,15 @@ data class MobileMainScreenState(
461483 logger.fInfo { " Navigation Stack: > $breadcrumb " }
462484 }
463485
464- fun showUserSwitch () {
486+ fun showUserDialog () {
465487 scope.launch(Dispatchers .IO ) {
466488 userSwitchViewModel.updateUserDbList()
467- showUserSwitchDialog = true
489+ this @MobileMainScreenState.showUserDialog = true
468490 }
469491 }
470492
471- fun hideUserSwitch () {
472- showUserSwitchDialog = false
493+ fun hideUserDialog () {
494+ this @MobileMainScreenState.showUserDialog = false
473495 }
474496}
475497
@@ -544,7 +566,7 @@ fun rememberMobileMainScreenState(
544566 context,
545567 scope,
546568 windowSizeClass,
547- drawerState,
569+ // drawerState,
548570 rcmdGridState,
549571 popularGridState,
550572 dynamicGridState,
0 commit comments