mirror of
https://github.com/oxyroid/M3UAndroid.git
synced 2025-05-21 05:16:31 +08:00
fix: renovate conflict.
This commit is contained in:
@ -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)
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
) {
|
) {
|
||||||
|
@ -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)
|
|
||||||
)
|
|
||||||
)
|
)
|
||||||
}
|
}
|
@ -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) }) {
|
||||||
|
@ -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(
|
||||||
|
@ -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 {
|
||||||
|
@ -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()) {
|
||||||
|
@ -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()
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
|
@ -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 ->
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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(
|
||||||
|
@ -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 }
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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" }
|
||||||
|
|
||||||
|
3
gradle/wrapper/gradle-wrapper.properties
vendored
3
gradle/wrapper/gradle-wrapper.properties
vendored
@ -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
|
||||||
|
Reference in New Issue
Block a user