This commit is contained in:
2026-06-22 18:53:42 +03:00
parent 420dc4e044
commit 66782f55ab
7 changed files with 49 additions and 38 deletions
+5
View File
@@ -39,3 +39,8 @@
-keep class ru.shadowsparky.vbox.shared.domain.RemoteEvent$OnSaved { *; } -keep class ru.shadowsparky.vbox.shared.domain.RemoteEvent$OnSaved { *; }
-keep class ru.shadowsparky.vbox.shared.domain.RemoteEvent$OnRecent { *; } -keep class ru.shadowsparky.vbox.shared.domain.RemoteEvent$OnRecent { *; }
-keep class ru.shadowsparky.vbox.shared.domain.RemoteEvent$OnSearch { *; } -keep class ru.shadowsparky.vbox.shared.domain.RemoteEvent$OnSearch { *; }
# Сохраняем все классы, реализующие Parcelable, и их обязательное поле CREATOR
-keepclassmembers class * implements android.os.Parcelable {
static ** CREATOR;
}
@@ -2,7 +2,6 @@ package ru.shadowsparky.vbox.shared.presentation
import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.LargeTopAppBar
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBar
import androidx.compose.material3.TopAppBarDefaults import androidx.compose.material3.TopAppBarDefaults
@@ -13,8 +12,6 @@ import androidx.compose.ui.Modifier
import ru.shadowsparky.ui.BaseScreen import ru.shadowsparky.ui.BaseScreen
import ru.shadowsparky.ui.LocalBlurState import ru.shadowsparky.ui.LocalBlurState
import ru.shadowsparky.ui.applyBlurEffect import ru.shadowsparky.ui.applyBlurEffect
import ru.shadowsparky.ui.currentWindowType
import ru.shadowsparky.ui.isCompact
import ru.shadowsparky.ui.rememberBlurState import ru.shadowsparky.ui.rememberBlurState
import ru.shadowsparky.ui.theme.ComponentDefaults import ru.shadowsparky.ui.theme.ComponentDefaults
import ru.shadowsparky.vbox.shared.presentation.list.VideoContent import ru.shadowsparky.vbox.shared.presentation.list.VideoContent
@@ -65,14 +62,6 @@ private fun MainScreenInternal(route: Route, child: Child, onNavigate: (Route) -
BaseMainScreen( BaseMainScreen(
appBar = { appBar = {
navList.findTitle(route)?.let { title -> navList.findTitle(route)?.let { title ->
if (currentWindowType().isCompact) {
LargeTopAppBar(
title = { Text(title) },
scrollBehavior = scrollBehavior,
modifier = Modifier.applyBlurEffect(LocalBlurState.current),
colors = ComponentDefaults.topAppBarColors()
)
} else {
TopAppBar( TopAppBar(
title = { Text(title) }, title = { Text(title) },
scrollBehavior = scrollBehavior, scrollBehavior = scrollBehavior,
@@ -80,7 +69,6 @@ private fun MainScreenInternal(route: Route, child: Child, onNavigate: (Route) -
colors = ComponentDefaults.topAppBarColors() colors = ComponentDefaults.topAppBarColors()
) )
} }
}
}, },
route = route, route = route,
scrollBehavior = scrollBehavior, scrollBehavior = scrollBehavior,
@@ -1,6 +1,8 @@
package ru.shadowsparky.vbox.shared.presentation.offline package ru.shadowsparky.vbox.shared.presentation.offline
import com.arkivanov.decompose.ComponentContext import com.arkivanov.decompose.ComponentContext
import kotlinx.coroutines.FlowPreview
import kotlinx.coroutines.flow.debounce
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import org.koin.core.annotation.Factory import org.koin.core.annotation.Factory
import org.koin.core.annotation.Named import org.koin.core.annotation.Named
@@ -20,7 +22,8 @@ class OfflineVideoComponent(
private val showPlayer: (Route.Overview.Player) -> Unit, private val showPlayer: (Route.Overview.Player) -> Unit,
val onBack: () -> Unit val onBack: () -> Unit
) : ComponentContext by context { ) : ComponentContext by context {
val info = interactor.info @OptIn(FlowPreview::class)
val info = interactor.info.debounce(300)
private val componentScope = createComponentScope() private val componentScope = createComponentScope()
fun play(item: OfflineVideo) { fun play(item: OfflineVideo) {
@@ -56,7 +56,7 @@ fun SeasonOverviewScreen(component: SeasonOverviewComponent) {
title = { title = {
Text(stringResource(Res.string.seasons_overview)) Text(stringResource(Res.string.seasons_overview))
}, navigationIcon = { }, navigationIcon = {
BackButton { component.doBack } BackButton { component.doBack() }
}, scrollBehavior = scrollBehavior, }, scrollBehavior = scrollBehavior,
colors = ComponentDefaults.topAppBarColors(), colors = ComponentDefaults.topAppBarColors(),
modifier = Modifier.applyBlurEffect(blurState) modifier = Modifier.applyBlurEffect(blurState)
@@ -2,6 +2,7 @@ package ru.shadowsparky.vbox.shared.presentation.saved
import androiddev.apps.vbox.client.shared.generated.resources.Res import androiddev.apps.vbox.client.shared.generated.resources.Res
import androiddev.apps.vbox.client.shared.generated.resources.filter_list import androiddev.apps.vbox.client.shared.generated.resources.filter_list
import androiddev.apps.vbox.client.shared.generated.resources.saved_movies
import androiddev.apps.vbox.client.shared.generated.resources.saved_movies_not_found import androiddev.apps.vbox.client.shared.generated.resources.saved_movies_not_found
import androiddev.apps.vbox.client.shared.generated.resources.user_tags import androiddev.apps.vbox.client.shared.generated.resources.user_tags
import androiddev.apps.vbox.client.shared.generated.resources.user_tags_filter_disable import androiddev.apps.vbox.client.shared.generated.resources.user_tags_filter_disable
@@ -22,6 +23,7 @@ import androidx.compose.material3.ModalBottomSheet
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBar
import androidx.compose.material3.TopAppBarDefaults import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.material3.rememberModalBottomSheetState
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
@@ -33,12 +35,12 @@ import androidx.compose.ui.unit.dp
import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.compose.collectAsStateWithLifecycle
import org.jetbrains.compose.resources.painterResource import org.jetbrains.compose.resources.painterResource
import org.jetbrains.compose.resources.stringResource import org.jetbrains.compose.resources.stringResource
import ru.shadowsparky.ui.LocalBlurState
import ru.shadowsparky.ui.applyBlurEffect
import ru.shadowsparky.ui.components.LazyColumn import ru.shadowsparky.ui.components.LazyColumn
import ru.shadowsparky.ui.theme.ComponentDefaults import ru.shadowsparky.ui.theme.ComponentDefaults
import ru.shadowsparky.vbox.shared.domain.tag.TagInfo import ru.shadowsparky.vbox.shared.domain.tag.TagInfo
import ru.shadowsparky.vbox.shared.presentation.BaseMainScreen import ru.shadowsparky.vbox.shared.presentation.BaseMainScreen
import ru.shadowsparky.vbox.shared.presentation.createNavigationList
import ru.shadowsparky.vbox.shared.presentation.findTitle
import ru.shadowsparky.vbox.shared.presentation.list.VideoScreenContent import ru.shadowsparky.vbox.shared.presentation.list.VideoScreenContent
import ru.shadowsparky.vbox.shared.presentation.nav.Route import ru.shadowsparky.vbox.shared.presentation.nav.Route
@@ -46,20 +48,11 @@ import ru.shadowsparky.vbox.shared.presentation.nav.Route
@Composable @Composable
fun SavedMovieScreen(comp: SavedMovieScreenComponent, route: Route, onNavigate: (Route) -> Unit) { fun SavedMovieScreen(comp: SavedMovieScreenComponent, route: Route, onNavigate: (Route) -> Unit) {
val tags by comp.userTags.collectAsStateWithLifecycle(null) val tags by comp.userTags.collectAsStateWithLifecycle(null)
val navList = createNavigationList()
var filterBottomSheetVisible by rememberSaveable { mutableStateOf(false) } var filterBottomSheetVisible by rememberSaveable { mutableStateOf(false) }
if (filterBottomSheetVisible) {
FilterBottomSheet(
comp.filterTag,
tags,
{ filterBottomSheetVisible = false },
onFilterBy = { comp.filterByTag(it) }
)
}
BaseMainScreen( BaseMainScreen(
appBar = { appBar = {
TopAppBar( TopAppBar(
title = { navList.findTitle(route)?.let { Text(it) } }, title = { Text(stringResource(Res.string.saved_movies)) },
actions = { actions = {
IconButton( IconButton(
onClick = { filterBottomSheetVisible = true } onClick = { filterBottomSheetVisible = true }
@@ -70,13 +63,24 @@ fun SavedMovieScreen(comp: SavedMovieScreenComponent, route: Route, onNavigate:
) )
} }
}, },
colors = ComponentDefaults.topAppBarColors() colors = ComponentDefaults.topAppBarColors(),
modifier = Modifier.applyBlurEffect(LocalBlurState.current)
) )
}, },
route = route, route = route,
scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(), scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(),
onNavigate = onNavigate, onNavigate = onNavigate,
content = { SavedMovieContent(comp, it) } content = {
if (filterBottomSheetVisible) {
FilterBottomSheet(
comp.filterTag,
tags,
{ filterBottomSheetVisible = false },
onFilterBy = { comp.filterByTag(it) }
)
}
SavedMovieContent(comp, it)
}
) )
} }
@@ -103,8 +107,11 @@ private fun FilterBottomSheet(
onFilterBy: (String?) -> Unit onFilterBy: (String?) -> Unit
) { ) {
allTags ?: return allTags ?: return
ModalBottomSheet(onDismissRequest = onDismiss) { ModalBottomSheet(
LazyColumn(modifier = Modifier.fillMaxWidth().padding(8.dp)) { onDismissRequest = onDismiss,
sheetState = rememberModalBottomSheetState(true)
) {
LazyColumn(modifier = Modifier.padding(8.dp)) {
item { item {
Text( Text(
text = stringResource(Res.string.user_tags), text = stringResource(Res.string.user_tags),
@@ -16,6 +16,7 @@ import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.ModalBottomSheet
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.material3.rememberModalBottomSheetState
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
@@ -35,7 +36,10 @@ fun LinkTagBottomSheet(
requestTagsScreen: () -> Unit, requestTagsScreen: () -> Unit,
updateTag: (String, Boolean) -> Unit updateTag: (String, Boolean) -> Unit
) { ) {
ModalBottomSheet(onDismissRequest = onDismiss) { ModalBottomSheet(
onDismissRequest = onDismiss,
sheetState = rememberModalBottomSheetState(true)
) {
Column( Column(
modifier = Modifier.fillMaxWidth().padding(8.dp), modifier = Modifier.fillMaxWidth().padding(8.dp),
verticalArrangement = Arrangement.spacedBy(8.dp) verticalArrangement = Arrangement.spacedBy(8.dp)
@@ -22,6 +22,7 @@ import androidx.compose.material3.ModalBottomSheet
import androidx.compose.material3.OutlinedButton import androidx.compose.material3.OutlinedButton
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.material3.TextField import androidx.compose.material3.TextField
import androidx.compose.material3.rememberModalBottomSheetState
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
@@ -121,7 +122,10 @@ private fun AddTagBottomSheet(
keyboardController?.show() keyboardController?.show()
} }
ModalBottomSheet(onDismissRequest = onDismiss) { ModalBottomSheet(
onDismissRequest = onDismiss,
sheetState = rememberModalBottomSheetState(true)
) {
Column( Column(
modifier = Modifier.padding(8.dp), modifier = Modifier.padding(8.dp),
verticalArrangement = Arrangement.spacedBy(6.dp) verticalArrangement = Arrangement.spacedBy(6.dp)