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$OnRecent { *; }
-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.material3.ExperimentalMaterial3Api
import androidx.compose.material3.LargeTopAppBar
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar
import androidx.compose.material3.TopAppBarDefaults
@@ -13,8 +12,6 @@ import androidx.compose.ui.Modifier
import ru.shadowsparky.ui.BaseScreen
import ru.shadowsparky.ui.LocalBlurState
import ru.shadowsparky.ui.applyBlurEffect
import ru.shadowsparky.ui.currentWindowType
import ru.shadowsparky.ui.isCompact
import ru.shadowsparky.ui.rememberBlurState
import ru.shadowsparky.ui.theme.ComponentDefaults
import ru.shadowsparky.vbox.shared.presentation.list.VideoContent
@@ -65,21 +62,12 @@ private fun MainScreenInternal(route: Route, child: Child, onNavigate: (Route) -
BaseMainScreen(
appBar = {
navList.findTitle(route)?.let { title ->
if (currentWindowType().isCompact) {
LargeTopAppBar(
title = { Text(title) },
scrollBehavior = scrollBehavior,
modifier = Modifier.applyBlurEffect(LocalBlurState.current),
colors = ComponentDefaults.topAppBarColors()
)
} else {
TopAppBar(
title = { Text(title) },
scrollBehavior = scrollBehavior,
modifier = Modifier.applyBlurEffect(LocalBlurState.current),
colors = ComponentDefaults.topAppBarColors()
)
}
TopAppBar(
title = { Text(title) },
scrollBehavior = scrollBehavior,
modifier = Modifier.applyBlurEffect(LocalBlurState.current),
colors = ComponentDefaults.topAppBarColors()
)
}
},
route = route,
@@ -1,6 +1,8 @@
package ru.shadowsparky.vbox.shared.presentation.offline
import com.arkivanov.decompose.ComponentContext
import kotlinx.coroutines.FlowPreview
import kotlinx.coroutines.flow.debounce
import kotlinx.coroutines.launch
import org.koin.core.annotation.Factory
import org.koin.core.annotation.Named
@@ -20,7 +22,8 @@ class OfflineVideoComponent(
private val showPlayer: (Route.Overview.Player) -> Unit,
val onBack: () -> Unit
) : ComponentContext by context {
val info = interactor.info
@OptIn(FlowPreview::class)
val info = interactor.info.debounce(300)
private val componentScope = createComponentScope()
fun play(item: OfflineVideo) {
@@ -56,7 +56,7 @@ fun SeasonOverviewScreen(component: SeasonOverviewComponent) {
title = {
Text(stringResource(Res.string.seasons_overview))
}, navigationIcon = {
BackButton { component.doBack }
BackButton { component.doBack() }
}, scrollBehavior = scrollBehavior,
colors = ComponentDefaults.topAppBarColors(),
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.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.user_tags
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.TopAppBar
import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.material3.rememberModalBottomSheetState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
@@ -33,12 +35,12 @@ import androidx.compose.ui.unit.dp
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import org.jetbrains.compose.resources.painterResource
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.theme.ComponentDefaults
import ru.shadowsparky.vbox.shared.domain.tag.TagInfo
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.nav.Route
@@ -46,20 +48,11 @@ import ru.shadowsparky.vbox.shared.presentation.nav.Route
@Composable
fun SavedMovieScreen(comp: SavedMovieScreenComponent, route: Route, onNavigate: (Route) -> Unit) {
val tags by comp.userTags.collectAsStateWithLifecycle(null)
val navList = createNavigationList()
var filterBottomSheetVisible by rememberSaveable { mutableStateOf(false) }
if (filterBottomSheetVisible) {
FilterBottomSheet(
comp.filterTag,
tags,
{ filterBottomSheetVisible = false },
onFilterBy = { comp.filterByTag(it) }
)
}
BaseMainScreen(
appBar = {
TopAppBar(
title = { navList.findTitle(route)?.let { Text(it) } },
title = { Text(stringResource(Res.string.saved_movies)) },
actions = {
IconButton(
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,
scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(),
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
) {
allTags ?: return
ModalBottomSheet(onDismissRequest = onDismiss) {
LazyColumn(modifier = Modifier.fillMaxWidth().padding(8.dp)) {
ModalBottomSheet(
onDismissRequest = onDismiss,
sheetState = rememberModalBottomSheetState(true)
) {
LazyColumn(modifier = Modifier.padding(8.dp)) {
item {
Text(
text = stringResource(Res.string.user_tags),
@@ -16,6 +16,7 @@ import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.ModalBottomSheet
import androidx.compose.material3.Text
import androidx.compose.material3.rememberModalBottomSheetState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
@@ -35,7 +36,10 @@ fun LinkTagBottomSheet(
requestTagsScreen: () -> Unit,
updateTag: (String, Boolean) -> Unit
) {
ModalBottomSheet(onDismissRequest = onDismiss) {
ModalBottomSheet(
onDismissRequest = onDismiss,
sheetState = rememberModalBottomSheetState(true)
) {
Column(
modifier = Modifier.fillMaxWidth().padding(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.Text
import androidx.compose.material3.TextField
import androidx.compose.material3.rememberModalBottomSheetState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
@@ -121,7 +122,10 @@ private fun AddTagBottomSheet(
keyboardController?.show()
}
ModalBottomSheet(onDismissRequest = onDismiss) {
ModalBottomSheet(
onDismissRequest = onDismiss,
sheetState = rememberModalBottomSheetState(true)
) {
Column(
modifier = Modifier.padding(8.dp),
verticalArrangement = Arrangement.spacedBy(6.dp)