diff --git a/app/smartphone/build.gradle.kts b/app/smartphone/build.gradle.kts index 1b28f9ea..d90ffcc1 100644 --- a/app/smartphone/build.gradle.kts +++ b/app/smartphone/build.gradle.kts @@ -187,4 +187,5 @@ dependencies { implementation(libs.minabox) implementation(libs.net.mm2d.mmupnp.mmupnp) implementation(libs.haze) + implementation(libs.haze.materials) } diff --git a/app/smartphone/src/main/java/com/m3u/smartphone/ui/business/configuration/PlaylistConfigurationScreen.kt b/app/smartphone/src/main/java/com/m3u/smartphone/ui/business/configuration/PlaylistConfigurationScreen.kt index a70ca3d4..3c4eab20 100644 --- a/app/smartphone/src/main/java/com/m3u/smartphone/ui/business/configuration/PlaylistConfigurationScreen.kt +++ b/app/smartphone/src/main/java/com/m3u/smartphone/ui/business/configuration/PlaylistConfigurationScreen.kt @@ -27,7 +27,6 @@ import androidx.compose.material.icons.Icons import androidx.compose.material.icons.rounded.Save import androidx.compose.material3.FloatingActionButton import androidx.compose.material3.Icon -import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.runtime.derivedStateOf 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.repository.playlist.PlaylistRepository 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.EpgManifestGallery import com.m3u.smartphone.ui.business.configuration.components.SyncProgrammesButton import com.m3u.smartphone.ui.business.configuration.components.XtreamPanel import com.m3u.smartphone.ui.common.helper.LocalHelper import com.m3u.smartphone.ui.common.helper.Metadata -import dev.chrisbanes.haze.HazeStyle -import dev.chrisbanes.haze.haze +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 dev.chrisbanes.haze.hazeSource import kotlinx.datetime.LocalDateTime @Composable @@ -166,10 +164,7 @@ private fun PlaylistConfigurationScreen( verticalArrangement = Arrangement.spacedBy(spacing.small), contentPadding = contentPadding, modifier = Modifier - .haze( - LocalHazeState.current, - HazeStyle(MaterialTheme.colorScheme.surface) - ) + .hazeSource(LocalHazeState.current) .fillMaxSize() .padding(spacing.medium) ) { diff --git a/app/smartphone/src/main/java/com/m3u/smartphone/ui/business/favourite/FavouriteScreen.kt b/app/smartphone/src/main/java/com/m3u/smartphone/ui/business/favourite/FavouriteScreen.kt index 9e106eae..8130745c 100644 --- a/app/smartphone/src/main/java/com/m3u/smartphone/ui/business/favourite/FavouriteScreen.kt +++ b/app/smartphone/src/main/java/com/m3u/smartphone/ui/business/favourite/FavouriteScreen.kt @@ -6,7 +6,6 @@ import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.rounded.Sort -import androidx.compose.material3.MaterialTheme import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue @@ -28,25 +27,24 @@ import androidx.paging.compose.LazyPagingItems import androidx.paging.compose.collectAsLazyPagingItems import com.m3u.business.favorite.FavoriteViewModel 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.wrapper.Sort import com.m3u.data.database.model.Channel import com.m3u.data.database.model.isSeries import com.m3u.data.service.MediaCommand -import com.m3u.core.wrapper.Sort 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.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.MediaSheet import com.m3u.smartphone.ui.material.components.MediaSheetValue import com.m3u.smartphone.ui.material.components.SortBottomSheet -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 dev.chrisbanes.haze.HazeDefaults -import dev.chrisbanes.haze.haze +import com.m3u.smartphone.ui.material.ktx.interceptVolumeEvent +import com.m3u.smartphone.ui.material.model.LocalHazeState +import dev.chrisbanes.haze.hazeSource import kotlinx.coroutines.launch @Composable @@ -203,9 +201,6 @@ private fun FavoriteScreen( rowCount = actualRowCount, onClick = onClickChannel, onLongClick = onLongClickChannel, - modifier = modifier.haze( - LocalHazeState.current, - HazeDefaults.style(MaterialTheme.colorScheme.surface) - ) + modifier = modifier.hazeSource(LocalHazeState.current) ) } \ No newline at end of file diff --git a/app/smartphone/src/main/java/com/m3u/smartphone/ui/business/foryou/components/PlaylistGallery.kt b/app/smartphone/src/main/java/com/m3u/smartphone/ui/business/foryou/components/PlaylistGallery.kt index 3d47a91d..e46be2f9 100644 --- a/app/smartphone/src/main/java/com/m3u/smartphone/ui/business/foryou/components/PlaylistGallery.kt +++ b/app/smartphone/src/main/java/com/m3u/smartphone/ui/business/foryou/components/PlaylistGallery.kt @@ -31,14 +31,13 @@ import com.m3u.data.database.model.epgUrlsOrXtreamXmlUrl import com.m3u.data.database.model.fromLocal import com.m3u.data.database.model.type 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.Metadata import com.m3u.smartphone.ui.common.helper.useRailNav -import dev.chrisbanes.haze.HazeDefaults -import dev.chrisbanes.haze.haze +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 dev.chrisbanes.haze.hazeSource import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import kotlin.math.absoluteValue @@ -94,11 +93,7 @@ internal fun PlaylistGallery( contentPadding = PaddingValues(vertical = spacing.medium) + contentPadding, verticalArrangement = Arrangement.spacedBy(spacing.medium), horizontalArrangement = Arrangement.spacedBy(spacing.medium), - modifier = modifier - .haze( - LocalHazeState.current, - HazeDefaults.style(currentHazeColor) - ) + modifier = modifier.hazeSource(LocalHazeState.current) ) { if (header != null) { item(span = { GridItemSpan(rowCount) }) { diff --git a/app/smartphone/src/main/java/com/m3u/smartphone/ui/business/playlist/PlaylistScreen.kt b/app/smartphone/src/main/java/com/m3u/smartphone/ui/business/playlist/PlaylistScreen.kt index ab054056..0c88033b 100644 --- a/app/smartphone/src/main/java/com/m3u/smartphone/ui/business/playlist/PlaylistScreen.kt +++ b/app/smartphone/src/main/java/com/m3u/smartphone/ui/business/playlist/PlaylistScreen.kt @@ -78,8 +78,10 @@ import androidx.lifecycle.repeatOnLifecycle import com.google.accompanist.permissions.rememberPermissionState import com.m3u.business.playlist.PlaylistViewModel 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.wrapper.Event +import com.m3u.core.wrapper.Sort import com.m3u.core.wrapper.eventOf import com.m3u.data.database.model.Channel 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.type import com.m3u.data.service.MediaCommand -import com.m3u.core.wrapper.Sort 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.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.PlaylistTabRow 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.EpisodesBottomSheet import com.m3u.smartphone.ui.material.components.EventHandler import com.m3u.smartphone.ui.material.components.MediaSheet import com.m3u.smartphone.ui.material.components.MediaSheetValue import com.m3u.smartphone.ui.material.components.SortBottomSheet -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 dev.chrisbanes.haze.HazeDefaults -import dev.chrisbanes.haze.haze +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.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.flow.distinctUntilChanged import kotlinx.coroutines.flow.launchIn @@ -524,10 +523,7 @@ private fun PlaylistScreen( mediaSheetValue = MediaSheetValue.PlaylistScreen(it) }, getProgrammeCurrently = getProgrammeCurrently, - modifier = Modifier.haze( - LocalHazeState.current, - HazeDefaults.style(MaterialTheme.colorScheme.surface) - ) + modifier = Modifier.hazeSource(LocalHazeState.current) ) } Column( diff --git a/app/smartphone/src/main/java/com/m3u/smartphone/ui/business/playlist/components/PlaylistTabRow.kt b/app/smartphone/src/main/java/com/m3u/smartphone/ui/business/playlist/components/PlaylistTabRow.kt index c25659dd..e7ff84ab 100644 --- a/app/smartphone/src/main/java/com/m3u/smartphone/ui/business/playlist/components/PlaylistTabRow.kt +++ b/app/smartphone/src/main/java/com/m3u/smartphone/ui/business/playlist/components/PlaylistTabRow.kt @@ -29,6 +29,7 @@ import androidx.compose.material3.Card import androidx.compose.material3.CardDefaults import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton import androidx.compose.material3.LocalContentColor import androidx.compose.material3.MaterialTheme 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.text.font.FontWeight 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.BackStackHandler import com.m3u.smartphone.ui.material.ktx.Edge 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.LocalSpacing import com.m3u.smartphone.ui.material.shape.AbsoluteSmoothCornerShape -import dev.chrisbanes.haze.HazeDefaults -import dev.chrisbanes.haze.haze +import dev.chrisbanes.haze.hazeSource @Composable internal fun PlaylistTabRow( @@ -174,10 +173,7 @@ internal fun PlaylistTabRow( modifier = Modifier .fillMaxSize() .background(MaterialTheme.colorScheme.surface) - .haze( - LocalHazeState.current, - HazeDefaults.style(MaterialTheme.colorScheme.surface) - ), + .hazeSource(LocalHazeState.current), content = categoriesContent ) } else { diff --git a/app/smartphone/src/main/java/com/m3u/smartphone/ui/business/setting/SettingScreen.kt b/app/smartphone/src/main/java/com/m3u/smartphone/ui/business/setting/SettingScreen.kt index 6638cae7..aae17c69 100644 --- a/app/smartphone/src/main/java/com/m3u/smartphone/ui/business/setting/SettingScreen.kt +++ b/app/smartphone/src/main/java/com/m3u/smartphone/ui/business/setting/SettingScreen.kt @@ -8,7 +8,6 @@ import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.material.icons.Icons 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.ListDetailPaneScaffoldRole 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.Playlist 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.fragments.AppearanceFragment 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.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.Metadata import com.m3u.smartphone.ui.common.internal.Events -import dev.chrisbanes.haze.HazeDefaults -import dev.chrisbanes.haze.haze +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.material.model.LocalHazeState +import dev.chrisbanes.haze.hazeSource import kotlinx.coroutines.launch @Composable @@ -303,10 +301,7 @@ private fun SettingScreen( }, modifier = modifier .fillMaxSize() - .haze( - LocalHazeState.current, - HazeDefaults.style(MaterialTheme.colorScheme.surface) - ) + .hazeSource(LocalHazeState.current) .testTag("feature:setting") ) BackHandler(navigator.canNavigateBack()) { diff --git a/app/smartphone/src/main/java/com/m3u/smartphone/ui/common/Scaffold.kt b/app/smartphone/src/main/java/com/m3u/smartphone/ui/common/Scaffold.kt index e7094e37..86c1bae0 100644 --- a/app/smartphone/src/main/java/com/m3u/smartphone/ui/common/Scaffold.kt +++ b/app/smartphone/src/main/java/com/m3u/smartphone/ui/common/Scaffold.kt @@ -40,21 +40,22 @@ import androidx.compose.ui.unit.offset import androidx.compose.ui.util.fastForEach import androidx.compose.ui.util.fastMap 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.LocalHelper import com.m3u.smartphone.ui.common.helper.Metadata 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.HazeStyle -import dev.chrisbanes.haze.hazeChild +import dev.chrisbanes.haze.hazeEffect +import dev.chrisbanes.haze.materials.ExperimentalHazeMaterialsApi +import dev.chrisbanes.haze.materials.HazeMaterials @Composable @OptIn(InternalComposeApi::class) @@ -109,6 +110,7 @@ internal fun Items( } } +@OptIn(ExperimentalHazeMaterialsApi::class) @Composable internal fun MainContent( windowInsets: WindowInsets, @@ -190,7 +192,7 @@ internal fun MainContent( } }, modifier = Modifier - .hazeChild(hazeState, style = HazeStyle(blurRadius = 6.dp)) + .hazeEffect(hazeState, HazeMaterials.ultraThin()) .fillMaxWidth() ) }, diff --git a/app/smartphone/src/main/java/com/m3u/smartphone/ui/common/internal/SmartphoneScaffoldImpl.kt b/app/smartphone/src/main/java/com/m3u/smartphone/ui/common/internal/SmartphoneScaffoldImpl.kt index 7b81e20b..f5850220 100644 --- a/app/smartphone/src/main/java/com/m3u/smartphone/ui/common/internal/SmartphoneScaffoldImpl.kt +++ b/app/smartphone/src/main/java/com/m3u/smartphone/ui/common/internal/SmartphoneScaffoldImpl.kt @@ -14,20 +14,21 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.InternalComposeApi import androidx.compose.ui.Modifier 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.MainContent import com.m3u.smartphone.ui.common.NavigationItemLayout import com.m3u.smartphone.ui.common.ScaffoldLayout 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.Destination import com.m3u.smartphone.ui.material.ktx.plus import com.m3u.smartphone.ui.material.model.LocalHazeState -import com.m3u.smartphone.ui.material.components.Destination -import com.m3u.smartphone.ui.common.helper.Metadata -import dev.chrisbanes.haze.HazeStyle -import dev.chrisbanes.haze.hazeChild +import dev.chrisbanes.haze.hazeEffect +import dev.chrisbanes.haze.materials.ExperimentalHazeMaterialsApi +import dev.chrisbanes.haze.materials.HazeMaterials +@OptIn(ExperimentalHazeMaterialsApi::class) @Composable @InternalComposeApi fun SmartphoneScaffoldImpl( @@ -46,7 +47,7 @@ fun SmartphoneScaffoldImpl( containerColor = Color.Transparent, contentColor = MaterialTheme.colorScheme.onBackground, modifier = Modifier - .hazeChild(hazeState, style = HazeStyle(blurRadius = 6.dp, noiseFactor = 0.4f)) + .hazeEffect(hazeState, HazeMaterials.ultraThin()) .fillMaxWidth() ) { Items { currentRootDestination -> diff --git a/app/tv/build.gradle.kts b/app/tv/build.gradle.kts index b2f570f0..6cf1e495 100644 --- a/app/tv/build.gradle.kts +++ b/app/tv/build.gradle.kts @@ -125,4 +125,5 @@ dependencies { implementation(libs.minabox) implementation(libs.net.mm2d.mmupnp.mmupnp) implementation(libs.haze) + implementation(libs.haze.materials) } diff --git a/baselineprofile/smartphone/build.gradle.kts b/baselineprofile/smartphone/build.gradle.kts index 5c5cce3f..b49e024a 100644 --- a/baselineprofile/smartphone/build.gradle.kts +++ b/baselineprofile/smartphone/build.gradle.kts @@ -36,7 +36,7 @@ android { create("liteCodec") { dimension = "codec" } } - testOptions.managedDevices.devices { + testOptions.managedDevices.allDevices { create("Pixel5Api31") { device = "Pixel 5" apiLevel = 34 diff --git a/baselineprofile/tv/build.gradle.kts b/baselineprofile/tv/build.gradle.kts index b393cc79..d241a3bd 100644 --- a/baselineprofile/tv/build.gradle.kts +++ b/baselineprofile/tv/build.gradle.kts @@ -28,7 +28,7 @@ android { testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } - testOptions.managedDevices.devices { + testOptions.managedDevices.allDevices { create("tvApi34") { device = "Television (1080p)" apiLevel = 34 diff --git a/data/src/main/java/com/m3u/data/database/model/Channel.kt b/data/src/main/java/com/m3u/data/database/model/Channel.kt index 03ee411b..92c810b4 100644 --- a/data/src/main/java/com/m3u/data/database/model/Channel.kt +++ b/data/src/main/java/com/m3u/data/database/model/Channel.kt @@ -76,7 +76,7 @@ data class Channel( fun Channel.copyXtreamEpisode(episode: XtreamChannelInfo.Episode): Channel { val url = Url(url) val newUrl = URLBuilder(url) - .apply { path(*url.pathSegments.dropLast(1).toTypedArray()) } + .apply { path(*url.rawSegments.dropLast(1).toTypedArray()) } .appendPathSegments("${episode.id}.${episode.containerExtension}") .build() return copy( diff --git a/data/src/main/java/com/m3u/data/repository/playlist/PlaylistRepositoryImpl.kt b/data/src/main/java/com/m3u/data/repository/playlist/PlaylistRepositoryImpl.kt index 658abc61..3b5308af 100644 --- a/data/src/main/java/com/m3u/data/repository/playlist/PlaylistRepositoryImpl.kt +++ b/data/src/main/java/com/m3u/data/repository/playlist/PlaylistRepositoryImpl.kt @@ -60,7 +60,6 @@ import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock import kotlinx.coroutines.withContext -import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json import okhttp3.OkHttpClient import okhttp3.Request @@ -583,7 +582,7 @@ internal class PlaylistRepositoryImpl @Inject constructor( val playlist = checkNotNull(get(series.playlistUrl)) { "playlist is not exist" } val seriesInfo = xtreamParser.getSeriesInfoOrThrow( input = XtreamInput.decodeFromPlaylistUrl(playlist.url), - seriesId = Url(series.url).pathSegments.last().toInt() + seriesId = Url(series.url).rawSegments.last().toInt() ) // fixme: do not flatmap return seriesInfo.episodes.flatMap { it.value } diff --git a/data/src/main/java/com/m3u/data/tv/http/HttpServerImpl.kt b/data/src/main/java/com/m3u/data/tv/http/HttpServerImpl.kt index 96e74f40..fec7eae5 100644 --- a/data/src/main/java/com/m3u/data/tv/http/HttpServerImpl.kt +++ b/data/src/main/java/com/m3u/data/tv/http/HttpServerImpl.kt @@ -1,7 +1,7 @@ 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.Remotes import com.m3u.data.tv.http.endpoint.SayHellos import io.ktor.serialization.kotlinx.KotlinxWebsocketSerializationConverter 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.timeout import kotlinx.serialization.json.Json -import java.time.Duration import javax.inject.Inject +import kotlin.time.Duration.Companion.seconds internal class HttpServerImpl @Inject constructor( private val sayHellos: SayHellos, @@ -65,8 +65,8 @@ internal class HttpServerImpl @Inject constructor( prettyPrint = true } contentConverter = KotlinxWebsocketSerializationConverter(json) - pingPeriod = Duration.ofSeconds(15) - timeout = Duration.ofSeconds(15) + pingPeriod = 15.seconds + timeout = 15.seconds } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 368876de..1affacb6 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -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" } 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-compose = { group = "io.coil-kt", name = "coil-compose", version.ref = "io-coil" } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 37f853b1..e265e465 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,7 @@ +#Thu Apr 03 22:02:28 CST 2025 distributionBase=GRADLE_USER_HOME 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 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME