@@ -14,25 +14,27 @@ import androidx.compose.animation.slideInHorizontally
14
14
import androidx.compose.animation.slideInVertically
15
15
import androidx.compose.animation.slideOutHorizontally
16
16
import androidx.compose.animation.slideOutVertically
17
+ import androidx.compose.foundation.background
18
+ import androidx.compose.foundation.layout.Box
17
19
import androidx.compose.foundation.layout.Spacer
18
20
import androidx.compose.foundation.layout.fillMaxSize
21
+ import androidx.compose.foundation.layout.size
19
22
import androidx.compose.foundation.lazy.grid.LazyGridState
20
23
import androidx.compose.foundation.lazy.grid.rememberLazyGridState
21
24
import androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridState
22
25
import androidx.compose.foundation.lazy.staggeredgrid.rememberLazyStaggeredGridState
26
+ import androidx.compose.foundation.shape.CircleShape
23
27
import androidx.compose.material.icons.Icons
24
28
import androidx.compose.material.icons.automirrored.rounded.Segment
25
- import androidx.compose.material.icons.filled.Menu
26
29
import androidx.compose.material.icons.rounded.FiberNew
27
30
import androidx.compose.material.icons.rounded.Home
31
+ import androidx.compose.material.icons.rounded.Person
28
32
import androidx.compose.material.icons.rounded.Search
29
33
import androidx.compose.material.icons.rounded.Settings
30
34
import androidx.compose.material3.DrawerState
31
35
import androidx.compose.material3.DrawerValue
32
36
import androidx.compose.material3.Icon
33
- import androidx.compose.material3.IconButton
34
37
import androidx.compose.material3.MaterialTheme
35
- import androidx.compose.material3.ModalNavigationDrawer
36
38
import androidx.compose.material3.NavigationRail
37
39
import androidx.compose.material3.NavigationRailItem
38
40
import androidx.compose.material3.Text
@@ -56,8 +58,12 @@ import androidx.compose.runtime.remember
56
58
import androidx.compose.runtime.rememberCoroutineScope
57
59
import androidx.compose.runtime.setValue
58
60
import androidx.compose.ui.Modifier
61
+ import androidx.compose.ui.draw.clip
62
+ import androidx.compose.ui.graphics.Color
59
63
import androidx.compose.ui.graphics.vector.ImageVector
64
+ import androidx.compose.ui.layout.ContentScale
60
65
import androidx.compose.ui.platform.LocalContext
66
+ import androidx.compose.ui.unit.dp
61
67
import androidx.lifecycle.Lifecycle
62
68
import androidx.lifecycle.LifecycleEventObserver
63
69
import androidx.lifecycle.compose.LocalLifecycleOwner
@@ -69,6 +75,7 @@ import androidx.navigation.compose.NavHost
69
75
import androidx.navigation.compose.composable
70
76
import androidx.navigation.compose.currentBackStackEntryAsState
71
77
import androidx.navigation.compose.rememberNavController
78
+ import coil.compose.AsyncImage
72
79
import coil.compose.rememberAsyncImagePainter
73
80
import coil.request.ImageRequest
74
81
import coil.size.Size
@@ -77,13 +84,13 @@ import com.origeek.imageViewer.previewer.VerticalDragType
77
84
import com.origeek.imageViewer.previewer.rememberPreviewerState
78
85
import dev.aaa1115910.biliapi.entity.Picture
79
86
import dev.aaa1115910.bv.component.DevelopingTipContent
87
+ import dev.aaa1115910.bv.mobile.activities.FollowingUserActivity
80
88
import dev.aaa1115910.bv.mobile.activities.LoginActivity
81
89
import dev.aaa1115910.bv.mobile.activities.SettingsActivity
90
+ import dev.aaa1115910.bv.mobile.component.home.UserDialog
82
91
import dev.aaa1115910.bv.mobile.screen.home.DynamicScreen
83
92
import dev.aaa1115910.bv.mobile.screen.home.HomeScreen
84
- import dev.aaa1115910.bv.mobile.screen.home.UserSwitchDialog
85
93
import dev.aaa1115910.bv.screen.user.UserSwitchViewModel
86
- import dev.aaa1115910.bv.util.Prefs
87
94
import dev.aaa1115910.bv.util.fInfo
88
95
import dev.aaa1115910.bv.util.swapList
89
96
import dev.aaa1115910.bv.viewmodel.UserViewModel
@@ -94,6 +101,7 @@ import kotlinx.coroutines.Dispatchers
94
101
import kotlinx.coroutines.launch
95
102
import org.koin.androidx.compose.koinViewModel
96
103
104
+ @OptIn(ExperimentalMaterial3WindowSizeClassApi ::class )
97
105
@Composable
98
106
fun MobileMainScreen (
99
107
modifier : Modifier = Modifier ,
@@ -109,6 +117,7 @@ fun MobileMainScreen(
109
117
)
110
118
val context = LocalContext .current
111
119
val scope = rememberCoroutineScope()
120
+ val windowSizeClass = calculateWindowSizeClass(context as Activity )
112
121
113
122
val navSuiteType =
114
123
NavigationSuiteScaffoldDefaults .calculateFromAdaptiveInfo(currentWindowAdaptiveInfo())
@@ -202,36 +211,21 @@ fun MobileMainScreen(
202
211
}
203
212
}
204
213
205
- BackHandler (state.showUserSwitchDialog ) {
206
- state.hideUserSwitch ()
214
+ BackHandler (state.showUserDialog ) {
215
+ state.hideUserDialog ()
207
216
}
208
217
209
- ModalNavigationDrawer (
218
+ Box (
210
219
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
- }
228
220
) {
229
221
NavigationSuiteScaffoldLayout (
230
222
navigationSuite = {
231
223
NavigationSuit (
232
224
mobileMainScreenState = state,
233
225
navigationSuiteType = navSuiteType,
234
- onNavigate = state::navigate
226
+ avatar = userViewModel.face,
227
+ onNavigate = state::navigate,
228
+ onShowUserDialog = state::showUserDialog
235
229
)
236
230
}
237
231
) {
@@ -243,11 +237,10 @@ fun MobileMainScreen(
243
237
) {
244
238
composable(MobileMainScreenNav .Home .name) {
245
239
HomeScreen (
246
- drawerState = state.drawerState,
247
240
rcmdGridState = state.rcmdGridState,
248
241
popularGridState = state.popularGridState,
249
242
windowSize = state.windowSizeClass.widthSizeClass,
250
- onShowSwitchUser = state::showUserSwitch
243
+ onShowUserDialog = state::showUserDialog
251
244
)
252
245
}
253
246
@@ -289,10 +282,11 @@ fun MobileMainScreen(
289
282
}
290
283
)
291
284
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 },
296
290
userList = userSwitchViewModel.userDbList,
297
291
onSwitchUser = { user ->
298
292
scope.launch(Dispatchers .IO ) {
@@ -304,7 +298,17 @@ fun MobileMainScreen(
304
298
scope.launch(Dispatchers .IO ) {
305
299
userSwitchViewModel.deleteUser(user)
306
300
}
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)) }
308
312
)
309
313
}
310
314
@@ -313,10 +317,10 @@ private fun NavigationSuit(
313
317
modifier : Modifier = Modifier ,
314
318
mobileMainScreenState : MobileMainScreenState ,
315
319
navigationSuiteType : NavigationSuiteType ,
320
+ avatar : String ,
316
321
onNavigate : (MobileMainScreenNav ) -> Unit ,
322
+ onShowUserDialog : () -> Unit ,
317
323
) {
318
- val scope = rememberCoroutineScope()
319
-
320
324
when (navigationSuiteType) {
321
325
NavigationSuiteType .NavigationBar -> {
322
326
NavigationSuite (
@@ -343,11 +347,29 @@ private fun NavigationSuit(
343
347
modifier = modifier,
344
348
containerColor = MaterialTheme .colorScheme.surfaceContainer
345
349
) {
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
+ )
351
373
Spacer (Modifier .weight(1f ))
352
374
listOf (
353
375
MobileMainScreenNav .Search ,
@@ -380,7 +402,7 @@ data class MobileMainScreenState(
380
402
val context : Context ,
381
403
val scope : CoroutineScope ,
382
404
val windowSizeClass : WindowSizeClass ,
383
- val drawerState : DrawerState ,
405
+ // val drawerState: DrawerState,
384
406
val rcmdGridState : LazyGridState ,
385
407
val popularGridState : LazyGridState ,
386
408
val dynamicGridState : LazyStaggeredGridState ,
@@ -397,7 +419,7 @@ data class MobileMainScreenState(
397
419
398
420
var activeSearch by mutableStateOf(false )
399
421
400
- var showUserSwitchDialog by mutableStateOf(false )
422
+ var showUserDialog by mutableStateOf(false )
401
423
402
424
fun navigate (navItem : MobileMainScreenNav ) {
403
425
logger.fInfo { " Navigate to ${navItem.name} " }
@@ -461,15 +483,15 @@ data class MobileMainScreenState(
461
483
logger.fInfo { " Navigation Stack: > $breadcrumb " }
462
484
}
463
485
464
- fun showUserSwitch () {
486
+ fun showUserDialog () {
465
487
scope.launch(Dispatchers .IO ) {
466
488
userSwitchViewModel.updateUserDbList()
467
- showUserSwitchDialog = true
489
+ this @MobileMainScreenState.showUserDialog = true
468
490
}
469
491
}
470
492
471
- fun hideUserSwitch () {
472
- showUserSwitchDialog = false
493
+ fun hideUserDialog () {
494
+ this @MobileMainScreenState.showUserDialog = false
473
495
}
474
496
}
475
497
@@ -544,7 +566,7 @@ fun rememberMobileMainScreenState(
544
566
context,
545
567
scope,
546
568
windowSizeClass,
547
- drawerState,
569
+ // drawerState,
548
570
rcmdGridState,
549
571
popularGridState,
550
572
dynamicGridState,
0 commit comments