diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 17179c7a..a20263d4 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -232,6 +232,11 @@
android:exported="false"
android:label="@string/title_mobile_activity_following_user"
android:theme="@style/Theme.BVMobile" />
+
\ No newline at end of file
diff --git a/app/src/main/kotlin/dev/aaa1115910/bv/mobile/activities/HistoryActivity.kt b/app/src/main/kotlin/dev/aaa1115910/bv/mobile/activities/HistoryActivity.kt
new file mode 100644
index 00000000..53133292
--- /dev/null
+++ b/app/src/main/kotlin/dev/aaa1115910/bv/mobile/activities/HistoryActivity.kt
@@ -0,0 +1,24 @@
+package dev.aaa1115910.bv.mobile.activities
+
+import android.os.Bundle
+import androidx.activity.ComponentActivity
+import androidx.activity.compose.setContent
+import androidx.compose.material3.windowsizeclass.ExperimentalMaterial3WindowSizeClassApi
+import androidx.compose.material3.windowsizeclass.calculateWindowSizeClass
+import dev.aaa1115910.bv.mobile.screen.HistoryScreen
+import dev.aaa1115910.bv.mobile.theme.BVMobileTheme
+
+class HistoryActivity : ComponentActivity() {
+ @OptIn(ExperimentalMaterial3WindowSizeClassApi::class)
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContent {
+ val windowSize = calculateWindowSizeClass(this)
+ BVMobileTheme {
+ HistoryScreen(
+ windowSize = windowSize
+ )
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/kotlin/dev/aaa1115910/bv/mobile/screen/HistoryScreen.kt b/app/src/main/kotlin/dev/aaa1115910/bv/mobile/screen/HistoryScreen.kt
new file mode 100644
index 00000000..a6f0c35b
--- /dev/null
+++ b/app/src/main/kotlin/dev/aaa1115910/bv/mobile/screen/HistoryScreen.kt
@@ -0,0 +1,99 @@
+package dev.aaa1115910.bv.mobile.screen
+
+import android.app.Activity
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.PaddingValues
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.lazy.grid.GridCells
+import androidx.compose.foundation.lazy.grid.LazyVerticalGrid
+import androidx.compose.foundation.lazy.grid.items
+import androidx.compose.foundation.lazy.grid.rememberLazyGridState
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.automirrored.filled.ArrowBack
+import androidx.compose.material3.ExperimentalMaterial3Api
+import androidx.compose.material3.Icon
+import androidx.compose.material3.IconButton
+import androidx.compose.material3.LargeTopAppBar
+import androidx.compose.material3.Scaffold
+import androidx.compose.material3.Text
+import androidx.compose.material3.TopAppBarDefaults
+import androidx.compose.material3.rememberTopAppBarState
+import androidx.compose.material3.windowsizeclass.WindowSizeClass
+import androidx.compose.material3.windowsizeclass.WindowWidthSizeClass
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.input.nestedscroll.nestedScroll
+import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.unit.dp
+import dev.aaa1115910.bv.R
+import dev.aaa1115910.bv.mobile.activities.VideoPlayerActivity
+import dev.aaa1115910.bv.mobile.component.videocard.SmallVideoCard
+import dev.aaa1115910.bv.util.OnBottomReached
+import dev.aaa1115910.bv.util.fInfo
+import dev.aaa1115910.bv.viewmodel.user.HistoryViewModel
+import io.github.oshai.kotlinlogging.KotlinLogging
+import org.koin.androidx.compose.koinViewModel
+
+@OptIn(ExperimentalMaterial3Api::class)
+@Composable
+fun HistoryScreen(
+ modifier: Modifier = Modifier,
+ windowSize: WindowSizeClass,
+ historyViewModel: HistoryViewModel = koinViewModel()
+) {
+ val context = LocalContext.current
+ val logger = KotlinLogging.logger("HistoryScreen")
+ val listState = rememberLazyGridState()
+ val scrollBehavior =
+ TopAppBarDefaults.exitUntilCollapsedScrollBehavior(rememberTopAppBarState())
+
+ listState.OnBottomReached(
+ loading = historyViewModel.updating
+ ) {
+ logger.fInfo { "on reached rcmd page bottom" }
+ historyViewModel.update()
+ }
+
+ Scaffold(
+ modifier = modifier
+ .nestedScroll(scrollBehavior.nestedScrollConnection),
+ topBar = {
+ LargeTopAppBar(
+ title = { Text(text = stringResource(R.string.title_mobile_activity_history)) },
+ navigationIcon = {
+ IconButton(
+ onClick = { (context as Activity).finish() }
+ ) {
+ Icon(
+ imageVector = Icons.AutoMirrored.Default.ArrowBack,
+ contentDescription = null
+ )
+ }
+ },
+ scrollBehavior = scrollBehavior
+ )
+ }
+ ) { innerPadding ->
+ LazyVerticalGrid(
+ modifier = Modifier.padding(top = innerPadding.calculateTopPadding()),
+ columns = GridCells.Adaptive(if (windowSize.widthSizeClass == WindowWidthSizeClass.Compact) 180.dp else 220.dp),
+ state = listState,
+ horizontalArrangement = Arrangement.spacedBy(8.dp),
+ verticalArrangement = Arrangement.spacedBy(8.dp),
+ contentPadding = PaddingValues(8.dp)
+ ) {
+ items(historyViewModel.histories) { history ->
+ SmallVideoCard(
+ data = history,
+ onClick = {
+ VideoPlayerActivity.actionStart(
+ context = context,
+ aid = history.avid
+ )
+ }
+ )
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/kotlin/dev/aaa1115910/bv/mobile/screen/MobileMainScreen.kt b/app/src/main/kotlin/dev/aaa1115910/bv/mobile/screen/MobileMainScreen.kt
index 04e533bf..50e64757 100644
--- a/app/src/main/kotlin/dev/aaa1115910/bv/mobile/screen/MobileMainScreen.kt
+++ b/app/src/main/kotlin/dev/aaa1115910/bv/mobile/screen/MobileMainScreen.kt
@@ -85,6 +85,7 @@ import com.origeek.imageViewer.previewer.rememberPreviewerState
import dev.aaa1115910.biliapi.entity.Picture
import dev.aaa1115910.bv.component.DevelopingTipContent
import dev.aaa1115910.bv.mobile.activities.FollowingUserActivity
+import dev.aaa1115910.bv.mobile.activities.HistoryActivity
import dev.aaa1115910.bv.mobile.activities.LoginActivity
import dev.aaa1115910.bv.mobile.activities.SettingsActivity
import dev.aaa1115910.bv.mobile.component.home.UserDialog
@@ -304,7 +305,11 @@ fun MobileMainScreen(
Intent(context, FollowingUserActivity::class.java)
)
},
- onOpenHistory = {},
+ onOpenHistory = {
+ context.startActivity(
+ Intent(context, HistoryActivity::class.java)
+ )
+ },
onOpenFavorite = {},
onOpenFollowingPgc = {},
onOpenToView = {},
diff --git a/app/src/main/kotlin/dev/aaa1115910/bv/viewmodel/user/HistoryViewModel.kt b/app/src/main/kotlin/dev/aaa1115910/bv/viewmodel/user/HistoryViewModel.kt
index 9725bc2e..b40e38ba 100644
--- a/app/src/main/kotlin/dev/aaa1115910/bv/viewmodel/user/HistoryViewModel.kt
+++ b/app/src/main/kotlin/dev/aaa1115910/bv/viewmodel/user/HistoryViewModel.kt
@@ -37,7 +37,7 @@ class HistoryViewModel(
var noMore by mutableStateOf(false)
private var cursor = 0L
- private var updating = false
+ var updating by mutableStateOf(false)
fun update() {
viewModelScope.launch(Dispatchers.IO) {
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 128ddd08..7c11c0f3 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -256,6 +256,7 @@
视频播放
动态详情
我的关注
+ 历史记录
用户登录
设置
用户空间