fix: renovate conflict.

This commit is contained in:
oxy-macmini
2025-04-03 22:23:46 +08:00
parent 2d9a62e6eb
commit ad8f608de1
17 changed files with 80 additions and 102 deletions

View File

@ -187,4 +187,5 @@ dependencies {
implementation(libs.minabox) implementation(libs.minabox)
implementation(libs.net.mm2d.mmupnp.mmupnp) implementation(libs.net.mm2d.mmupnp.mmupnp)
implementation(libs.haze) implementation(libs.haze)
implementation(libs.haze.materials)
} }

View File

@ -27,7 +27,6 @@ import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.Save import androidx.compose.material.icons.rounded.Save
import androidx.compose.material3.FloatingActionButton import androidx.compose.material3.FloatingActionButton
import androidx.compose.material3.Icon import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
@ -54,19 +53,18 @@ import com.m3u.data.database.model.epgUrlsOrXtreamXmlUrl
import com.m3u.data.parser.xtream.XtreamInfo import com.m3u.data.parser.xtream.XtreamInfo
import com.m3u.data.repository.playlist.PlaylistRepository import com.m3u.data.repository.playlist.PlaylistRepository
import com.m3u.i18n.R.string import com.m3u.i18n.R.string
import com.m3u.smartphone.ui.material.components.Background
import com.m3u.smartphone.ui.material.components.PlaceholderField
import com.m3u.smartphone.ui.material.ktx.checkPermissionOrRationale
import com.m3u.smartphone.ui.material.model.LocalHazeState
import com.m3u.smartphone.ui.material.model.LocalSpacing
import com.m3u.smartphone.ui.business.configuration.components.AutoSyncProgrammesButton import com.m3u.smartphone.ui.business.configuration.components.AutoSyncProgrammesButton
import com.m3u.smartphone.ui.business.configuration.components.EpgManifestGallery import com.m3u.smartphone.ui.business.configuration.components.EpgManifestGallery
import com.m3u.smartphone.ui.business.configuration.components.SyncProgrammesButton import com.m3u.smartphone.ui.business.configuration.components.SyncProgrammesButton
import com.m3u.smartphone.ui.business.configuration.components.XtreamPanel import com.m3u.smartphone.ui.business.configuration.components.XtreamPanel
import com.m3u.smartphone.ui.common.helper.LocalHelper import com.m3u.smartphone.ui.common.helper.LocalHelper
import com.m3u.smartphone.ui.common.helper.Metadata import com.m3u.smartphone.ui.common.helper.Metadata
import dev.chrisbanes.haze.HazeStyle import com.m3u.smartphone.ui.material.components.Background
import dev.chrisbanes.haze.haze import com.m3u.smartphone.ui.material.components.PlaceholderField
import com.m3u.smartphone.ui.material.ktx.checkPermissionOrRationale
import com.m3u.smartphone.ui.material.model.LocalHazeState
import com.m3u.smartphone.ui.material.model.LocalSpacing
import dev.chrisbanes.haze.hazeSource
import kotlinx.datetime.LocalDateTime import kotlinx.datetime.LocalDateTime
@Composable @Composable
@ -166,10 +164,7 @@ private fun PlaylistConfigurationScreen(
verticalArrangement = Arrangement.spacedBy(spacing.small), verticalArrangement = Arrangement.spacedBy(spacing.small),
contentPadding = contentPadding, contentPadding = contentPadding,
modifier = Modifier modifier = Modifier
.haze( .hazeSource(LocalHazeState.current)
LocalHazeState.current,
HazeStyle(MaterialTheme.colorScheme.surface)
)
.fillMaxSize() .fillMaxSize()
.padding(spacing.medium) .padding(spacing.medium)
) { ) {

View File

@ -6,7 +6,6 @@ import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.rounded.Sort import androidx.compose.material.icons.automirrored.rounded.Sort
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.rememberModalBottomSheetState 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
@ -28,25 +27,24 @@ import androidx.paging.compose.LazyPagingItems
import androidx.paging.compose.collectAsLazyPagingItems import androidx.paging.compose.collectAsLazyPagingItems
import com.m3u.business.favorite.FavoriteViewModel import com.m3u.business.favorite.FavoriteViewModel
import com.m3u.core.architecture.preferences.hiltPreferences import com.m3u.core.architecture.preferences.hiltPreferences
import com.m3u.core.foundation.ui.thenIf
import com.m3u.core.util.basic.title import com.m3u.core.util.basic.title
import com.m3u.core.wrapper.Sort
import com.m3u.data.database.model.Channel import com.m3u.data.database.model.Channel
import com.m3u.data.database.model.isSeries import com.m3u.data.database.model.isSeries
import com.m3u.data.service.MediaCommand import com.m3u.data.service.MediaCommand
import com.m3u.core.wrapper.Sort
import com.m3u.i18n.R import com.m3u.i18n.R
import com.m3u.smartphone.ui.material.ktx.interceptVolumeEvent
import com.m3u.core.foundation.ui.thenIf
import com.m3u.smartphone.ui.material.model.LocalHazeState
import com.m3u.smartphone.ui.business.favourite.components.FavoriteGallery import com.m3u.smartphone.ui.business.favourite.components.FavoriteGallery
import com.m3u.smartphone.ui.common.helper.Action
import com.m3u.smartphone.ui.common.helper.LocalHelper
import com.m3u.smartphone.ui.common.helper.Metadata
import com.m3u.smartphone.ui.material.components.EpisodesBottomSheet import com.m3u.smartphone.ui.material.components.EpisodesBottomSheet
import com.m3u.smartphone.ui.material.components.MediaSheet import com.m3u.smartphone.ui.material.components.MediaSheet
import com.m3u.smartphone.ui.material.components.MediaSheetValue import com.m3u.smartphone.ui.material.components.MediaSheetValue
import com.m3u.smartphone.ui.material.components.SortBottomSheet import com.m3u.smartphone.ui.material.components.SortBottomSheet
import com.m3u.smartphone.ui.common.helper.Action import com.m3u.smartphone.ui.material.ktx.interceptVolumeEvent
import com.m3u.smartphone.ui.common.helper.LocalHelper import com.m3u.smartphone.ui.material.model.LocalHazeState
import com.m3u.smartphone.ui.common.helper.Metadata import dev.chrisbanes.haze.hazeSource
import dev.chrisbanes.haze.HazeDefaults
import dev.chrisbanes.haze.haze
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@Composable @Composable
@ -203,9 +201,6 @@ private fun FavoriteScreen(
rowCount = actualRowCount, rowCount = actualRowCount,
onClick = onClickChannel, onClick = onClickChannel,
onLongClick = onLongClickChannel, onLongClick = onLongClickChannel,
modifier = modifier.haze( modifier = modifier.hazeSource(LocalHazeState.current)
LocalHazeState.current,
HazeDefaults.style(MaterialTheme.colorScheme.surface)
)
) )
} }

View File

@ -31,14 +31,13 @@ import com.m3u.data.database.model.epgUrlsOrXtreamXmlUrl
import com.m3u.data.database.model.fromLocal import com.m3u.data.database.model.fromLocal
import com.m3u.data.database.model.type import com.m3u.data.database.model.type
import com.m3u.i18n.R.string import com.m3u.i18n.R.string
import com.m3u.smartphone.ui.material.ktx.plus
import com.m3u.smartphone.ui.material.model.LocalHazeState
import com.m3u.smartphone.ui.material.model.LocalSpacing
import com.m3u.smartphone.ui.common.helper.LocalHelper import com.m3u.smartphone.ui.common.helper.LocalHelper
import com.m3u.smartphone.ui.common.helper.Metadata import com.m3u.smartphone.ui.common.helper.Metadata
import com.m3u.smartphone.ui.common.helper.useRailNav import com.m3u.smartphone.ui.common.helper.useRailNav
import dev.chrisbanes.haze.HazeDefaults import com.m3u.smartphone.ui.material.ktx.plus
import dev.chrisbanes.haze.haze import com.m3u.smartphone.ui.material.model.LocalHazeState
import com.m3u.smartphone.ui.material.model.LocalSpacing
import dev.chrisbanes.haze.hazeSource
import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.onEach
import kotlin.math.absoluteValue import kotlin.math.absoluteValue
@ -94,11 +93,7 @@ internal fun PlaylistGallery(
contentPadding = PaddingValues(vertical = spacing.medium) + contentPadding, contentPadding = PaddingValues(vertical = spacing.medium) + contentPadding,
verticalArrangement = Arrangement.spacedBy(spacing.medium), verticalArrangement = Arrangement.spacedBy(spacing.medium),
horizontalArrangement = Arrangement.spacedBy(spacing.medium), horizontalArrangement = Arrangement.spacedBy(spacing.medium),
modifier = modifier modifier = modifier.hazeSource(LocalHazeState.current)
.haze(
LocalHazeState.current,
HazeDefaults.style(currentHazeColor)
)
) { ) {
if (header != null) { if (header != null) {
item(span = { GridItemSpan(rowCount) }) { item(span = { GridItemSpan(rowCount) }) {

View File

@ -78,8 +78,10 @@ import androidx.lifecycle.repeatOnLifecycle
import com.google.accompanist.permissions.rememberPermissionState import com.google.accompanist.permissions.rememberPermissionState
import com.m3u.business.playlist.PlaylistViewModel import com.m3u.business.playlist.PlaylistViewModel
import com.m3u.core.architecture.preferences.hiltPreferences import com.m3u.core.architecture.preferences.hiltPreferences
import com.m3u.core.foundation.ui.thenIf
import com.m3u.core.util.basic.title import com.m3u.core.util.basic.title
import com.m3u.core.wrapper.Event import com.m3u.core.wrapper.Event
import com.m3u.core.wrapper.Sort
import com.m3u.core.wrapper.eventOf import com.m3u.core.wrapper.eventOf
import com.m3u.data.database.model.Channel import com.m3u.data.database.model.Channel
import com.m3u.data.database.model.DataSource import com.m3u.data.database.model.DataSource
@ -88,34 +90,31 @@ import com.m3u.data.database.model.isSeries
import com.m3u.data.database.model.isVod import com.m3u.data.database.model.isVod
import com.m3u.data.database.model.type import com.m3u.data.database.model.type
import com.m3u.data.service.MediaCommand import com.m3u.data.service.MediaCommand
import com.m3u.core.wrapper.Sort
import com.m3u.i18n.R.string import com.m3u.i18n.R.string
import com.m3u.smartphone.ui.material.components.TextField
import com.m3u.smartphone.ui.material.ktx.checkPermissionOrRationale
import com.m3u.smartphone.ui.material.ktx.interceptVolumeEvent
import com.m3u.smartphone.ui.material.ktx.isAtTop
import com.m3u.smartphone.ui.material.ktx.only
import com.m3u.smartphone.ui.material.ktx.split
import com.m3u.core.foundation.ui.thenIf
import com.m3u.smartphone.ui.business.playlist.components.BackdropScaffold import com.m3u.smartphone.ui.business.playlist.components.BackdropScaffold
import com.m3u.smartphone.ui.business.playlist.components.BackdropValue import com.m3u.smartphone.ui.business.playlist.components.BackdropValue
import com.m3u.smartphone.ui.material.model.LocalHazeState
import com.m3u.smartphone.ui.material.model.LocalSpacing
import com.m3u.smartphone.ui.business.playlist.components.ChannelGallery import com.m3u.smartphone.ui.business.playlist.components.ChannelGallery
import com.m3u.smartphone.ui.business.playlist.components.PlaylistTabRow import com.m3u.smartphone.ui.business.playlist.components.PlaylistTabRow
import com.m3u.smartphone.ui.business.playlist.components.rememberBackdropScaffoldState import com.m3u.smartphone.ui.business.playlist.components.rememberBackdropScaffoldState
import com.m3u.smartphone.ui.common.helper.Action
import com.m3u.smartphone.ui.common.helper.Fob
import com.m3u.smartphone.ui.common.helper.LocalHelper
import com.m3u.smartphone.ui.common.helper.Metadata
import com.m3u.smartphone.ui.material.components.Destination import com.m3u.smartphone.ui.material.components.Destination
import com.m3u.smartphone.ui.material.components.EpisodesBottomSheet import com.m3u.smartphone.ui.material.components.EpisodesBottomSheet
import com.m3u.smartphone.ui.material.components.EventHandler import com.m3u.smartphone.ui.material.components.EventHandler
import com.m3u.smartphone.ui.material.components.MediaSheet import com.m3u.smartphone.ui.material.components.MediaSheet
import com.m3u.smartphone.ui.material.components.MediaSheetValue import com.m3u.smartphone.ui.material.components.MediaSheetValue
import com.m3u.smartphone.ui.material.components.SortBottomSheet import com.m3u.smartphone.ui.material.components.SortBottomSheet
import com.m3u.smartphone.ui.common.helper.Action import com.m3u.smartphone.ui.material.components.TextField
import com.m3u.smartphone.ui.common.helper.Fob import com.m3u.smartphone.ui.material.ktx.checkPermissionOrRationale
import com.m3u.smartphone.ui.common.helper.LocalHelper import com.m3u.smartphone.ui.material.ktx.interceptVolumeEvent
import com.m3u.smartphone.ui.common.helper.Metadata import com.m3u.smartphone.ui.material.ktx.isAtTop
import dev.chrisbanes.haze.HazeDefaults import com.m3u.smartphone.ui.material.ktx.only
import dev.chrisbanes.haze.haze import com.m3u.smartphone.ui.material.ktx.split
import com.m3u.smartphone.ui.material.model.LocalHazeState
import com.m3u.smartphone.ui.material.model.LocalSpacing
import dev.chrisbanes.haze.hazeSource
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.launchIn
@ -524,10 +523,7 @@ private fun PlaylistScreen(
mediaSheetValue = MediaSheetValue.PlaylistScreen(it) mediaSheetValue = MediaSheetValue.PlaylistScreen(it)
}, },
getProgrammeCurrently = getProgrammeCurrently, getProgrammeCurrently = getProgrammeCurrently,
modifier = Modifier.haze( modifier = Modifier.hazeSource(LocalHazeState.current)
LocalHazeState.current,
HazeDefaults.style(MaterialTheme.colorScheme.surface)
)
) )
} }
Column( Column(

View File

@ -29,6 +29,7 @@ import androidx.compose.material3.Card
import androidx.compose.material3.CardDefaults import androidx.compose.material3.CardDefaults
import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.Icon import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.LocalContentColor import androidx.compose.material3.LocalContentColor
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text import androidx.compose.material3.Text
@ -51,17 +52,15 @@ import androidx.compose.ui.platform.LocalHapticFeedback
import androidx.compose.ui.semantics.Role import androidx.compose.ui.semantics.Role
import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.material3.IconButton import com.m3u.core.foundation.ui.thenIf
import com.m3u.smartphone.ui.material.effects.BackStackEntry import com.m3u.smartphone.ui.material.effects.BackStackEntry
import com.m3u.smartphone.ui.material.effects.BackStackHandler import com.m3u.smartphone.ui.material.effects.BackStackHandler
import com.m3u.smartphone.ui.material.ktx.Edge import com.m3u.smartphone.ui.material.ktx.Edge
import com.m3u.smartphone.ui.material.ktx.blurEdge import com.m3u.smartphone.ui.material.ktx.blurEdge
import com.m3u.core.foundation.ui.thenIf
import com.m3u.smartphone.ui.material.model.LocalHazeState import com.m3u.smartphone.ui.material.model.LocalHazeState
import com.m3u.smartphone.ui.material.model.LocalSpacing import com.m3u.smartphone.ui.material.model.LocalSpacing
import com.m3u.smartphone.ui.material.shape.AbsoluteSmoothCornerShape import com.m3u.smartphone.ui.material.shape.AbsoluteSmoothCornerShape
import dev.chrisbanes.haze.HazeDefaults import dev.chrisbanes.haze.hazeSource
import dev.chrisbanes.haze.haze
@Composable @Composable
internal fun PlaylistTabRow( internal fun PlaylistTabRow(
@ -174,10 +173,7 @@ internal fun PlaylistTabRow(
modifier = Modifier modifier = Modifier
.fillMaxSize() .fillMaxSize()
.background(MaterialTheme.colorScheme.surface) .background(MaterialTheme.colorScheme.surface)
.haze( .hazeSource(LocalHazeState.current),
LocalHazeState.current,
HazeDefaults.style(MaterialTheme.colorScheme.surface)
),
content = categoriesContent content = categoriesContent
) )
} else { } else {

View File

@ -8,7 +8,6 @@ import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.ChangeCircle import androidx.compose.material.icons.rounded.ChangeCircle
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.adaptive.layout.ListDetailPaneScaffold import androidx.compose.material3.adaptive.layout.ListDetailPaneScaffold
import androidx.compose.material3.adaptive.layout.ListDetailPaneScaffoldRole import androidx.compose.material3.adaptive.layout.ListDetailPaneScaffoldRole
import androidx.compose.material3.adaptive.navigation.rememberListDetailPaneScaffoldNavigator import androidx.compose.material3.adaptive.navigation.rememberListDetailPaneScaffoldNavigator
@ -38,20 +37,19 @@ import com.m3u.data.database.model.ColorScheme
import com.m3u.data.database.model.DataSource import com.m3u.data.database.model.DataSource
import com.m3u.data.database.model.Playlist import com.m3u.data.database.model.Playlist
import com.m3u.i18n.R.string import com.m3u.i18n.R.string
import com.m3u.smartphone.ui.material.model.LocalHazeState
import com.m3u.smartphone.ui.business.setting.components.CanvasBottomSheet import com.m3u.smartphone.ui.business.setting.components.CanvasBottomSheet
import com.m3u.smartphone.ui.business.setting.fragments.AppearanceFragment import com.m3u.smartphone.ui.business.setting.fragments.AppearanceFragment
import com.m3u.smartphone.ui.business.setting.fragments.OptionalFragment import com.m3u.smartphone.ui.business.setting.fragments.OptionalFragment
import com.m3u.smartphone.ui.business.setting.fragments.SubscriptionsFragment import com.m3u.smartphone.ui.business.setting.fragments.SubscriptionsFragment
import com.m3u.smartphone.ui.business.setting.fragments.preferences.PreferencesFragment import com.m3u.smartphone.ui.business.setting.fragments.preferences.PreferencesFragment
import com.m3u.smartphone.ui.material.components.Destination
import com.m3u.smartphone.ui.material.components.EventHandler
import com.m3u.smartphone.ui.material.components.SettingDestination
import com.m3u.smartphone.ui.common.helper.Fob import com.m3u.smartphone.ui.common.helper.Fob
import com.m3u.smartphone.ui.common.helper.Metadata import com.m3u.smartphone.ui.common.helper.Metadata
import com.m3u.smartphone.ui.common.internal.Events import com.m3u.smartphone.ui.common.internal.Events
import dev.chrisbanes.haze.HazeDefaults import com.m3u.smartphone.ui.material.components.Destination
import dev.chrisbanes.haze.haze import com.m3u.smartphone.ui.material.components.EventHandler
import com.m3u.smartphone.ui.material.components.SettingDestination
import com.m3u.smartphone.ui.material.model.LocalHazeState
import dev.chrisbanes.haze.hazeSource
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@Composable @Composable
@ -303,10 +301,7 @@ private fun SettingScreen(
}, },
modifier = modifier modifier = modifier
.fillMaxSize() .fillMaxSize()
.haze( .hazeSource(LocalHazeState.current)
LocalHazeState.current,
HazeDefaults.style(MaterialTheme.colorScheme.surface)
)
.testTag("feature:setting") .testTag("feature:setting")
) )
BackHandler(navigator.canNavigateBack()) { BackHandler(navigator.canNavigateBack()) {

View File

@ -40,21 +40,22 @@ import androidx.compose.ui.unit.offset
import androidx.compose.ui.util.fastForEach import androidx.compose.ui.util.fastForEach
import androidx.compose.ui.util.fastMap import androidx.compose.ui.util.fastMap
import androidx.compose.ui.util.fastMaxOfOrNull import androidx.compose.ui.util.fastMaxOfOrNull
import com.m3u.smartphone.ui.material.components.Background
import com.m3u.smartphone.ui.material.effects.currentBackStackEntry
import com.m3u.smartphone.ui.material.model.LocalHazeState
import com.m3u.smartphone.ui.material.model.LocalSpacing
import com.m3u.smartphone.ui.common.internal.SmartphoneScaffoldImpl
import com.m3u.smartphone.ui.common.internal.TabletScaffoldImpl
import com.m3u.smartphone.ui.material.components.Destination
import com.m3u.smartphone.ui.material.components.FontFamilies
import com.m3u.smartphone.ui.common.helper.Fob import com.m3u.smartphone.ui.common.helper.Fob
import com.m3u.smartphone.ui.common.helper.LocalHelper import com.m3u.smartphone.ui.common.helper.LocalHelper
import com.m3u.smartphone.ui.common.helper.Metadata import com.m3u.smartphone.ui.common.helper.Metadata
import com.m3u.smartphone.ui.common.helper.useRailNav import com.m3u.smartphone.ui.common.helper.useRailNav
import com.m3u.smartphone.ui.common.internal.SmartphoneScaffoldImpl
import com.m3u.smartphone.ui.common.internal.TabletScaffoldImpl
import com.m3u.smartphone.ui.material.components.Background
import com.m3u.smartphone.ui.material.components.Destination
import com.m3u.smartphone.ui.material.components.FontFamilies
import com.m3u.smartphone.ui.material.effects.currentBackStackEntry
import com.m3u.smartphone.ui.material.model.LocalHazeState
import com.m3u.smartphone.ui.material.model.LocalSpacing
import dev.chrisbanes.haze.HazeState import dev.chrisbanes.haze.HazeState
import dev.chrisbanes.haze.HazeStyle import dev.chrisbanes.haze.hazeEffect
import dev.chrisbanes.haze.hazeChild import dev.chrisbanes.haze.materials.ExperimentalHazeMaterialsApi
import dev.chrisbanes.haze.materials.HazeMaterials
@Composable @Composable
@OptIn(InternalComposeApi::class) @OptIn(InternalComposeApi::class)
@ -109,6 +110,7 @@ internal fun Items(
} }
} }
@OptIn(ExperimentalHazeMaterialsApi::class)
@Composable @Composable
internal fun MainContent( internal fun MainContent(
windowInsets: WindowInsets, windowInsets: WindowInsets,
@ -190,7 +192,7 @@ internal fun MainContent(
} }
}, },
modifier = Modifier modifier = Modifier
.hazeChild(hazeState, style = HazeStyle(blurRadius = 6.dp)) .hazeEffect(hazeState, HazeMaterials.ultraThin())
.fillMaxWidth() .fillMaxWidth()
) )
}, },

View File

@ -14,20 +14,21 @@ import androidx.compose.runtime.Composable
import androidx.compose.runtime.InternalComposeApi import androidx.compose.runtime.InternalComposeApi
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp
import com.m3u.smartphone.ui.common.Items import com.m3u.smartphone.ui.common.Items
import com.m3u.smartphone.ui.common.MainContent import com.m3u.smartphone.ui.common.MainContent
import com.m3u.smartphone.ui.common.NavigationItemLayout import com.m3u.smartphone.ui.common.NavigationItemLayout
import com.m3u.smartphone.ui.common.ScaffoldLayout import com.m3u.smartphone.ui.common.ScaffoldLayout
import com.m3u.smartphone.ui.common.ScaffoldRole import com.m3u.smartphone.ui.common.ScaffoldRole
import com.m3u.smartphone.ui.common.helper.Metadata
import com.m3u.smartphone.ui.material.components.Background import com.m3u.smartphone.ui.material.components.Background
import com.m3u.smartphone.ui.material.components.Destination
import com.m3u.smartphone.ui.material.ktx.plus import com.m3u.smartphone.ui.material.ktx.plus
import com.m3u.smartphone.ui.material.model.LocalHazeState import com.m3u.smartphone.ui.material.model.LocalHazeState
import com.m3u.smartphone.ui.material.components.Destination import dev.chrisbanes.haze.hazeEffect
import com.m3u.smartphone.ui.common.helper.Metadata import dev.chrisbanes.haze.materials.ExperimentalHazeMaterialsApi
import dev.chrisbanes.haze.HazeStyle import dev.chrisbanes.haze.materials.HazeMaterials
import dev.chrisbanes.haze.hazeChild
@OptIn(ExperimentalHazeMaterialsApi::class)
@Composable @Composable
@InternalComposeApi @InternalComposeApi
fun SmartphoneScaffoldImpl( fun SmartphoneScaffoldImpl(
@ -46,7 +47,7 @@ fun SmartphoneScaffoldImpl(
containerColor = Color.Transparent, containerColor = Color.Transparent,
contentColor = MaterialTheme.colorScheme.onBackground, contentColor = MaterialTheme.colorScheme.onBackground,
modifier = Modifier modifier = Modifier
.hazeChild(hazeState, style = HazeStyle(blurRadius = 6.dp, noiseFactor = 0.4f)) .hazeEffect(hazeState, HazeMaterials.ultraThin())
.fillMaxWidth() .fillMaxWidth()
) { ) {
Items { currentRootDestination -> Items { currentRootDestination ->

View File

@ -125,4 +125,5 @@ dependencies {
implementation(libs.minabox) implementation(libs.minabox)
implementation(libs.net.mm2d.mmupnp.mmupnp) implementation(libs.net.mm2d.mmupnp.mmupnp)
implementation(libs.haze) implementation(libs.haze)
implementation(libs.haze.materials)
} }

View File

@ -36,7 +36,7 @@ android {
create("liteCodec") { dimension = "codec" } create("liteCodec") { dimension = "codec" }
} }
testOptions.managedDevices.devices { testOptions.managedDevices.allDevices {
create<ManagedVirtualDevice>("Pixel5Api31") { create<ManagedVirtualDevice>("Pixel5Api31") {
device = "Pixel 5" device = "Pixel 5"
apiLevel = 34 apiLevel = 34

View File

@ -28,7 +28,7 @@ android {
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
} }
testOptions.managedDevices.devices { testOptions.managedDevices.allDevices {
create<ManagedVirtualDevice>("tvApi34") { create<ManagedVirtualDevice>("tvApi34") {
device = "Television (1080p)" device = "Television (1080p)"
apiLevel = 34 apiLevel = 34

View File

@ -76,7 +76,7 @@ data class Channel(
fun Channel.copyXtreamEpisode(episode: XtreamChannelInfo.Episode): Channel { fun Channel.copyXtreamEpisode(episode: XtreamChannelInfo.Episode): Channel {
val url = Url(url) val url = Url(url)
val newUrl = URLBuilder(url) val newUrl = URLBuilder(url)
.apply { path(*url.pathSegments.dropLast(1).toTypedArray()) } .apply { path(*url.rawSegments.dropLast(1).toTypedArray()) }
.appendPathSegments("${episode.id}.${episode.containerExtension}") .appendPathSegments("${episode.id}.${episode.containerExtension}")
.build() .build()
return copy( return copy(

View File

@ -60,7 +60,6 @@ import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock import kotlinx.coroutines.sync.withLock
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json import kotlinx.serialization.json.Json
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.Request import okhttp3.Request
@ -583,7 +582,7 @@ internal class PlaylistRepositoryImpl @Inject constructor(
val playlist = checkNotNull(get(series.playlistUrl)) { "playlist is not exist" } val playlist = checkNotNull(get(series.playlistUrl)) { "playlist is not exist" }
val seriesInfo = xtreamParser.getSeriesInfoOrThrow( val seriesInfo = xtreamParser.getSeriesInfoOrThrow(
input = XtreamInput.decodeFromPlaylistUrl(playlist.url), input = XtreamInput.decodeFromPlaylistUrl(playlist.url),
seriesId = Url(series.url).pathSegments.last().toInt() seriesId = Url(series.url).rawSegments.last().toInt()
) )
// fixme: do not flatmap // fixme: do not flatmap
return seriesInfo.episodes.flatMap { it.value } return seriesInfo.episodes.flatMap { it.value }

View File

@ -1,7 +1,7 @@
package com.m3u.data.tv.http package com.m3u.data.tv.http
import com.m3u.data.tv.http.endpoint.Remotes
import com.m3u.data.tv.http.endpoint.Playlists import com.m3u.data.tv.http.endpoint.Playlists
import com.m3u.data.tv.http.endpoint.Remotes
import com.m3u.data.tv.http.endpoint.SayHellos import com.m3u.data.tv.http.endpoint.SayHellos
import io.ktor.serialization.kotlinx.KotlinxWebsocketSerializationConverter import io.ktor.serialization.kotlinx.KotlinxWebsocketSerializationConverter
import io.ktor.serialization.kotlinx.json.json import io.ktor.serialization.kotlinx.json.json
@ -17,8 +17,8 @@ import io.ktor.server.websocket.WebSockets
import io.ktor.server.websocket.pingPeriod import io.ktor.server.websocket.pingPeriod
import io.ktor.server.websocket.timeout import io.ktor.server.websocket.timeout
import kotlinx.serialization.json.Json import kotlinx.serialization.json.Json
import java.time.Duration
import javax.inject.Inject import javax.inject.Inject
import kotlin.time.Duration.Companion.seconds
internal class HttpServerImpl @Inject constructor( internal class HttpServerImpl @Inject constructor(
private val sayHellos: SayHellos, private val sayHellos: SayHellos,
@ -65,8 +65,8 @@ internal class HttpServerImpl @Inject constructor(
prettyPrint = true prettyPrint = true
} }
contentConverter = KotlinxWebsocketSerializationConverter(json) contentConverter = KotlinxWebsocketSerializationConverter(json)
pingPeriod = Duration.ofSeconds(15) pingPeriod = 15.seconds
timeout = Duration.ofSeconds(15) timeout = 15.seconds
} }
} }

View File

@ -149,6 +149,7 @@ kotlinx-serialization-coverter-retrofit = { group = "com.jakewharton.retrofit",
kotlinx-datetime = { group = "org.jetbrains.kotlinx", name = "kotlinx-datetime", version.ref = "kotlinx-datetime" } kotlinx-datetime = { group = "org.jetbrains.kotlinx", name = "kotlinx-datetime", version.ref = "kotlinx-datetime" }
haze = { module = "dev.chrisbanes.haze:haze", version.ref = "haze" } haze = { module = "dev.chrisbanes.haze:haze", version.ref = "haze" }
haze-materials = { module = "dev.chrisbanes.haze:haze-materials", version.ref = "haze" }
io-coil-kt = { group = "io.coil-kt", name = "coil", version.ref = "io-coil" } io-coil-kt = { group = "io.coil-kt", name = "coil", version.ref = "io-coil" }
io-coil-kt-compose = { group = "io.coil-kt", name = "coil-compose", version.ref = "io-coil" } io-coil-kt-compose = { group = "io.coil-kt", name = "coil-compose", version.ref = "io-coil" }

View File

@ -1,6 +1,7 @@
#Thu Apr 03 22:02:28 CST 2025
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip
networkTimeout=10000 networkTimeout=10000
validateDistributionUrl=true validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME