Skip to content

Commit df636b8

Browse files
committed
将主界面侧滑栏改为对话框
1 parent 32282f2 commit df636b8

File tree

9 files changed

+691
-570
lines changed

9 files changed

+691
-570
lines changed

app/src/main/AndroidManifest.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,11 @@
227227
android:exported="false"
228228
android:label="@string/title_mobile_activity_dynamic_detail"
229229
android:theme="@style/Theme.BVMobile" />
230+
<activity
231+
android:name=".mobile.activities.FollowingUserActivity"
232+
android:exported="false"
233+
android:label="@string/title_mobile_activity_following_user"
234+
android:theme="@style/Theme.BVMobile" />
230235
</application>
231236

232237
</manifest>
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package dev.aaa1115910.bv.mobile.activities
2+
3+
import android.os.Bundle
4+
import androidx.activity.ComponentActivity
5+
import androidx.activity.compose.setContent
6+
import dev.aaa1115910.bv.mobile.screen.FollowingUserScreen
7+
import dev.aaa1115910.bv.mobile.theme.BVMobileTheme
8+
9+
class FollowingUserActivity : ComponentActivity() {
10+
override fun onCreate(savedInstanceState: Bundle?) {
11+
super.onCreate(savedInstanceState)
12+
setContent {
13+
BVMobileTheme {
14+
FollowingUserScreen()
15+
}
16+
}
17+
}
18+
}

app/src/main/kotlin/dev/aaa1115910/bv/mobile/component/home/UserDialog.kt

Lines changed: 551 additions & 0 deletions
Large diffs are not rendered by default.

app/src/main/kotlin/dev/aaa1115910/bv/mobile/screen/home/FollowingUserScreen.kt renamed to app/src/main/kotlin/dev/aaa1115910/bv/mobile/screen/FollowingUserScreen.kt

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package dev.aaa1115910.bv.mobile.screen.home
1+
package dev.aaa1115910.bv.mobile.screen
22

33
import android.app.Activity
44
import androidx.compose.foundation.background
@@ -19,7 +19,7 @@ import androidx.compose.foundation.lazy.grid.items
1919
import androidx.compose.foundation.lazy.items
2020
import androidx.compose.foundation.shape.CircleShape
2121
import androidx.compose.material.icons.Icons
22-
import androidx.compose.material.icons.filled.ArrowBack
22+
import androidx.compose.material.icons.automirrored.filled.ArrowBack
2323
import androidx.compose.material3.ExperimentalMaterial3Api
2424
import androidx.compose.material3.Icon
2525
import androidx.compose.material3.IconButton
@@ -42,11 +42,13 @@ import androidx.compose.ui.graphics.Color
4242
import androidx.compose.ui.input.nestedscroll.nestedScroll
4343
import androidx.compose.ui.layout.ContentScale
4444
import androidx.compose.ui.platform.LocalContext
45+
import androidx.compose.ui.res.stringResource
4546
import androidx.compose.ui.text.style.TextOverflow
4647
import androidx.compose.ui.tooling.preview.Preview
4748
import androidx.compose.ui.unit.dp
4849
import coil.compose.AsyncImage
4950
import dev.aaa1115910.biliapi.entity.user.FollowedUser
51+
import dev.aaa1115910.bv.R
5052
import dev.aaa1115910.bv.mobile.activities.UserSpaceActivity
5153
import dev.aaa1115910.bv.mobile.theme.BVMobileTheme
5254
import dev.aaa1115910.bv.viewmodel.user.FollowViewModel
@@ -57,7 +59,6 @@ import org.koin.androidx.compose.koinViewModel
5759
fun FollowingUserScreen(
5860
modifier: Modifier = Modifier,
5961
followViewModel: FollowViewModel = koinViewModel(),
60-
onBack: () -> Unit = {}
6162
) {
6263
val context = LocalContext.current
6364
val windowSizeClass = calculateWindowSizeClass(context as Activity)
@@ -79,10 +80,13 @@ fun FollowingUserScreen(
7980
.nestedScroll(scrollBehavior.nestedScrollConnection),
8081
topBar = {
8182
LargeTopAppBar(
82-
title = { Text(text = "我推的 UP") },
83+
title = { Text(text = stringResource(R.string.title_mobile_activity_following_user)) },
8384
navigationIcon = {
84-
IconButton(onClick = onBack) {
85-
Icon(imageVector = Icons.Default.ArrowBack, contentDescription = null)
85+
IconButton(onClick = { context.finish() }) {
86+
Icon(
87+
imageVector = Icons.AutoMirrored.Default.ArrowBack,
88+
contentDescription = null
89+
)
8690
}
8791
},
8892
scrollBehavior = scrollBehavior

app/src/main/kotlin/dev/aaa1115910/bv/mobile/screen/MobileMainScreen.kt

Lines changed: 69 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -14,25 +14,27 @@ import androidx.compose.animation.slideInHorizontally
1414
import androidx.compose.animation.slideInVertically
1515
import androidx.compose.animation.slideOutHorizontally
1616
import androidx.compose.animation.slideOutVertically
17+
import androidx.compose.foundation.background
18+
import androidx.compose.foundation.layout.Box
1719
import androidx.compose.foundation.layout.Spacer
1820
import androidx.compose.foundation.layout.fillMaxSize
21+
import androidx.compose.foundation.layout.size
1922
import androidx.compose.foundation.lazy.grid.LazyGridState
2023
import androidx.compose.foundation.lazy.grid.rememberLazyGridState
2124
import androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridState
2225
import androidx.compose.foundation.lazy.staggeredgrid.rememberLazyStaggeredGridState
26+
import androidx.compose.foundation.shape.CircleShape
2327
import androidx.compose.material.icons.Icons
2428
import androidx.compose.material.icons.automirrored.rounded.Segment
25-
import androidx.compose.material.icons.filled.Menu
2629
import androidx.compose.material.icons.rounded.FiberNew
2730
import androidx.compose.material.icons.rounded.Home
31+
import androidx.compose.material.icons.rounded.Person
2832
import androidx.compose.material.icons.rounded.Search
2933
import androidx.compose.material.icons.rounded.Settings
3034
import androidx.compose.material3.DrawerState
3135
import androidx.compose.material3.DrawerValue
3236
import androidx.compose.material3.Icon
33-
import androidx.compose.material3.IconButton
3437
import androidx.compose.material3.MaterialTheme
35-
import androidx.compose.material3.ModalNavigationDrawer
3638
import androidx.compose.material3.NavigationRail
3739
import androidx.compose.material3.NavigationRailItem
3840
import androidx.compose.material3.Text
@@ -56,8 +58,12 @@ import androidx.compose.runtime.remember
5658
import androidx.compose.runtime.rememberCoroutineScope
5759
import androidx.compose.runtime.setValue
5860
import androidx.compose.ui.Modifier
61+
import androidx.compose.ui.draw.clip
62+
import androidx.compose.ui.graphics.Color
5963
import androidx.compose.ui.graphics.vector.ImageVector
64+
import androidx.compose.ui.layout.ContentScale
6065
import androidx.compose.ui.platform.LocalContext
66+
import androidx.compose.ui.unit.dp
6167
import androidx.lifecycle.Lifecycle
6268
import androidx.lifecycle.LifecycleEventObserver
6369
import androidx.lifecycle.compose.LocalLifecycleOwner
@@ -69,6 +75,7 @@ import androidx.navigation.compose.NavHost
6975
import androidx.navigation.compose.composable
7076
import androidx.navigation.compose.currentBackStackEntryAsState
7177
import androidx.navigation.compose.rememberNavController
78+
import coil.compose.AsyncImage
7279
import coil.compose.rememberAsyncImagePainter
7380
import coil.request.ImageRequest
7481
import coil.size.Size
@@ -77,13 +84,13 @@ import com.origeek.imageViewer.previewer.VerticalDragType
7784
import com.origeek.imageViewer.previewer.rememberPreviewerState
7885
import dev.aaa1115910.biliapi.entity.Picture
7986
import dev.aaa1115910.bv.component.DevelopingTipContent
87+
import dev.aaa1115910.bv.mobile.activities.FollowingUserActivity
8088
import dev.aaa1115910.bv.mobile.activities.LoginActivity
8189
import dev.aaa1115910.bv.mobile.activities.SettingsActivity
90+
import dev.aaa1115910.bv.mobile.component.home.UserDialog
8291
import dev.aaa1115910.bv.mobile.screen.home.DynamicScreen
8392
import dev.aaa1115910.bv.mobile.screen.home.HomeScreen
84-
import dev.aaa1115910.bv.mobile.screen.home.UserSwitchDialog
8593
import dev.aaa1115910.bv.screen.user.UserSwitchViewModel
86-
import dev.aaa1115910.bv.util.Prefs
8794
import dev.aaa1115910.bv.util.fInfo
8895
import dev.aaa1115910.bv.util.swapList
8996
import dev.aaa1115910.bv.viewmodel.UserViewModel
@@ -94,6 +101,7 @@ import kotlinx.coroutines.Dispatchers
94101
import kotlinx.coroutines.launch
95102
import org.koin.androidx.compose.koinViewModel
96103

104+
@OptIn(ExperimentalMaterial3WindowSizeClassApi::class)
97105
@Composable
98106
fun 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

Comments
 (0)