From b86da05fee52e43598336da24ff203ccb1f3b7b5 Mon Sep 17 00:00:00 2001 From: StenFredd Date: Wed, 14 Oct 2026 10:50:40 +0300 Subject: [PATCH] TV UI foundation --- app/build.gradle.kts | 11 +- app/proguard-rules.pro | 17 ++ app/src/main/AndroidManifest.xml | 2 +- .../assets/licenses/JetBrainsMono-OFL.txt | 93 ++++++ app/src/main/assets/licenses/Onest-OFL.txt | 93 ++++++ .../ru/stenfredd/movies/MainActivity.kt | 159 +++++++--- .../kotlin/ru/stenfredd/movies/MoviesApp.kt | 21 +- .../ru/stenfredd/movies/ui/BrowseScreens.kt | 2 +- .../kotlin/ru/stenfredd/movies/ui/Library.kt | 22 ++ .../kotlin/ru/stenfredd/movies/ui/Screen.kt | 7 +- .../stenfredd/movies/ui/components/Buttons.kt | 121 ++++++++ .../ui/components/CardImageTransformation.kt | 70 +++++ .../stenfredd/movies/ui/components/Cards.kt | 243 ++++++++++++++++ .../movies/ui/components/FocusCard.kt | 136 +++++++++ .../ru/stenfredd/movies/ui/components/Glow.kt | 65 +++++ .../stenfredd/movies/ui/components/Icons.kt | 59 ++++ .../movies/ui/components/RemoteImage.kt | 50 ++++ .../movies/ui/components/Scrolling.kt | 88 ++++++ .../stenfredd/movies/ui/components/Section.kt | 46 +++ .../stenfredd/movies/ui/focus/ScreenFocus.kt | 62 ++++ .../ru/stenfredd/movies/ui/home/HomeScreen.kt | 100 +++++++ .../stenfredd/movies/ui/home/HomeViewModel.kt | 194 +++++++++++++ .../ru/stenfredd/movies/ui/shell/Shell.kt | 271 ++++++++++++++++++ .../ru/stenfredd/movies/ui/theme/Theme.kt | 15 + .../ru/stenfredd/movies/ui/theme/Tokens.kt | 117 ++++++++ app/src/main/res/drawable/banner.xml | 7 +- app/src/main/res/font/jetbrains_mono_400.ttf | Bin 0 -> 60192 bytes app/src/main/res/font/jetbrains_mono_500.ttf | Bin 0 -> 60176 bytes app/src/main/res/font/jetbrains_mono_600.ttf | Bin 0 -> 60108 bytes app/src/main/res/font/onest_400.ttf | Bin 0 -> 46336 bytes app/src/main/res/font/onest_500.ttf | Bin 0 -> 46432 bytes app/src/main/res/font/onest_600.ttf | Bin 0 -> 46444 bytes app/src/main/res/font/onest_700.ttf | Bin 0 -> 46420 bytes app/src/main/res/font/onest_800.ttf | Bin 0 -> 46432 bytes app/src/main/res/values/colors.xml | 4 + app/src/main/res/values/strings.xml | 3 +- app/src/main/res/values/themes.xml | 10 + gradle/libs.versions.toml | 6 + tools/tv/env.sh | 12 + tools/tv/framestats.py | 24 ++ 40 files changed, 2075 insertions(+), 55 deletions(-) create mode 100644 app/proguard-rules.pro create mode 100644 app/src/main/assets/licenses/JetBrainsMono-OFL.txt create mode 100644 app/src/main/assets/licenses/Onest-OFL.txt create mode 100644 app/src/main/kotlin/ru/stenfredd/movies/ui/components/Buttons.kt create mode 100644 app/src/main/kotlin/ru/stenfredd/movies/ui/components/CardImageTransformation.kt create mode 100644 app/src/main/kotlin/ru/stenfredd/movies/ui/components/Cards.kt create mode 100644 app/src/main/kotlin/ru/stenfredd/movies/ui/components/FocusCard.kt create mode 100644 app/src/main/kotlin/ru/stenfredd/movies/ui/components/Glow.kt create mode 100644 app/src/main/kotlin/ru/stenfredd/movies/ui/components/Icons.kt create mode 100644 app/src/main/kotlin/ru/stenfredd/movies/ui/components/RemoteImage.kt create mode 100644 app/src/main/kotlin/ru/stenfredd/movies/ui/components/Scrolling.kt create mode 100644 app/src/main/kotlin/ru/stenfredd/movies/ui/components/Section.kt create mode 100644 app/src/main/kotlin/ru/stenfredd/movies/ui/focus/ScreenFocus.kt create mode 100644 app/src/main/kotlin/ru/stenfredd/movies/ui/home/HomeScreen.kt create mode 100644 app/src/main/kotlin/ru/stenfredd/movies/ui/home/HomeViewModel.kt create mode 100644 app/src/main/kotlin/ru/stenfredd/movies/ui/shell/Shell.kt create mode 100644 app/src/main/kotlin/ru/stenfredd/movies/ui/theme/Theme.kt create mode 100644 app/src/main/kotlin/ru/stenfredd/movies/ui/theme/Tokens.kt create mode 100644 app/src/main/res/font/jetbrains_mono_400.ttf create mode 100644 app/src/main/res/font/jetbrains_mono_500.ttf create mode 100644 app/src/main/res/font/jetbrains_mono_600.ttf create mode 100644 app/src/main/res/font/onest_400.ttf create mode 100644 app/src/main/res/font/onest_500.ttf create mode 100644 app/src/main/res/font/onest_600.ttf create mode 100644 app/src/main/res/font/onest_700.ttf create mode 100644 app/src/main/res/font/onest_800.ttf create mode 100644 app/src/main/res/values/colors.xml create mode 100644 app/src/main/res/values/themes.xml create mode 100644 tools/tv/framestats.py diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 35cdaf8..66fe958 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -20,7 +20,12 @@ android { buildTypes { release { - isMinifyEnabled = false + // Скорость интерфейса проверяем только на этой сборке: R8 + baseline profile. + // Пока своего ключа нет, подписываем debug-ключом, чтобы ставилась на ТВ. + isMinifyEnabled = true + isShrinkResources = true + proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") + signingConfig = signingConfigs.getByName("debug") } } @@ -59,9 +64,13 @@ dependencies { implementation(libs.compose.ui.tooling.preview) debugImplementation(libs.compose.ui.tooling) implementation(libs.tv.material) + implementation(libs.navigation3.runtime) + implementation(libs.navigation3.ui) + implementation(libs.androidx.lifecycle.viewmodel.navigation3) implementation(libs.coil.compose) implementation(libs.coil.network.okhttp) implementation(libs.hilt.android) ksp(libs.hilt.compiler) implementation(libs.timber) + implementation(libs.androidx.profileinstaller) } diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..32fc1d8 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,17 @@ +# Правила R8 для release-сборки. + +# Обратные вызовы из нативного кода ищут классы, поля и методы по имени. +-keep class org.videolan.libvlc.** { *; } +-keep class androidx.media3.decoder.ffmpeg.** { *; } + +# ass-media (libass) читает поля MatroskaExtractor рефлексией (extractorOutput, subtitleSample), +# и у неё самой JNI. +-keep class io.github.peerless2012.ass.** { *; } +-keep class androidx.media3.extractor.mkv.MatroskaExtractor { *; } + +# Стек-трейсы в логах остаются читаемыми. +-keepattributes SourceFile,LineNumberTable + +# Open-source app: obfuscation gives nothing, and readable class names keep log tags +# (Timber uses the class name) and stack traces usable. R8 still shrinks and optimises. +-dontobfuscate diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 33c24ea..2d49b72 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,7 +15,7 @@ android:label="@string/app_name" android:supportsRtl="true" android:networkSecurityConfig="@xml/network_security_config" - android:theme="@android:style/Theme.DeviceDefault.NoActionBar"> + android:theme="@style/Theme.Movies"> () } - var ready by remember { mutableStateOf(false) } - LaunchedEffect(Unit) { - stack += if (session.restore()) Screen.Home else Screen.Login - if (stack.last() == Screen.Home) debugTarget()?.let(stack::addAll) - ready = true - } - fun open(screen: Screen) = stack.add(screen) - BackHandler(enabled = stack.size > 1) { stack.removeAt(stack.lastIndex) } - - if (!ready) { - Box(Modifier.fillMaxSize()) { Text("Загрузка…") } - return@Surface - } - when (val screen = stack.last()) { - Screen.Login -> LoginScreen(onLoggedIn = { - stack.clear() - stack += Screen.Home - }) - Screen.Home -> HomeScreen(onOpen = ::open, onLogout = { - stack.clear() - stack += Screen.Login - }) - is Screen.Items -> ItemsScreen(screen, onOpen = ::open) - is Screen.Detail -> DetailScreen(screen, onOpen = ::open) - is Screen.Player -> PlayerScreen(screen, onExit = { stack.removeAt(stack.lastIndex) }) - is Screen.Tour -> TourScreen(screen.startIndex, onExit = { stack.removeAt(stack.lastIndex) }) - } + AppTheme { + val stack = remember { mutableStateListOf() } + var ready by remember { mutableStateOf(false) } + LaunchedEffect(Unit) { + val loggedIn = session.restore() + stack += if (loggedIn) Screen.Root(Tab.Home) else Screen.Login + if (loggedIn) intentTarget()?.let(stack::addAll) + ready = true } + if (ready) Navigation(stack) } } } + @Composable + private fun Navigation(stack: MutableList) { + fun open(screen: Screen) { + stack.add(screen) + } + fun back() { + if (stack.size > 1) stack.removeAt(stack.lastIndex) else finish() + } + fun resetTo(screen: Screen) { + stack.clear() + stack.add(screen) + } + + NavDisplay( + backStack = stack, + onBack = { back() }, + entryDecorators = listOf( + rememberSaveableStateHolderNavEntryDecorator(), + rememberViewModelStoreNavEntryDecorator(), + ), + // No screen transitions: two screens composed at once is expensive on weak TVs. + transitionSpec = { EnterTransition.None togetherWith ExitTransition.None }, + popTransitionSpec = { EnterTransition.None togetherWith ExitTransition.None }, + predictivePopTransitionSpec = { EnterTransition.None togetherWith ExitTransition.None }, + entryProvider = { screen -> + NavEntry(screen) { + when (screen) { + Screen.Login -> Legacy { LoginScreen(onLoggedIn = { resetTo(Screen.Root(Tab.Home)) }) } + is Screen.Root -> Root(screen.tab, onTab = { resetTo(Screen.Root(it)) }, onOpen = ::open, onLogout = { resetTo(Screen.Login) }) + Screen.Prototype -> Legacy { PrototypeScreen(onOpen = ::open, onLogout = { resetTo(Screen.Login) }) } + is Screen.Items -> Legacy { ItemsScreen(screen, onOpen = ::open) } + is Screen.Detail -> Legacy { DetailScreen(screen, onOpen = ::open) } + is Screen.Player -> PlayerScreen(screen, onExit = ::back) + is Screen.Tour -> TourScreen(screen.startIndex, onExit = ::back) + } + } + }, + ) + } + + @Composable + private fun Root(tab: Tab, onTab: (Tab) -> Unit, onOpen: (Screen) -> Unit, onLogout: () -> Unit) { + val user by session.session.collectAsStateWithLifecycle() + Shell( + current = tab, + userName = user?.userName.orEmpty(), + onTab = onTab, + // Profile switching comes with the new login screens (stage 3); until then the prototype has "Выйти". + onProfile = { onOpen(Screen.Prototype) }, + ) { + when (tab) { + Tab.Home -> HomeScreen(onOpen = onOpen) + // Until stage 7 the library tab is the old prototype: libraries, text search, debug tour, logout. + Tab.Library -> Legacy { PrototypeScreen(onOpen = onOpen, onLogout = onLogout) } + Tab.Search, Tab.Favorites -> Placeholder("${tab.label}: скоро") + } + } + } + + /** Old prototype screens use tv-material components, which take their text colour from a Surface. */ + @Composable + private fun Legacy(content: @Composable () -> Unit) { + Surface(Modifier.fillMaxSize(), colors = SurfaceDefaults.colors(containerColor = Color.Transparent, contentColor = AppColors.Text)) { content() } + } + + @Composable + private fun Placeholder(text: String) { + Box(Modifier.fillMaxSize(), contentAlignment = Alignment.Center) { BasicText(text, style = AppType.Body) } + } + /** - * Debug-only shortcut for testing on a TV without typing: - * `adb shell am start -S -n ru.stenfredd.movies/.MainActivity --es item [--es engine exo|vlc] [--el start ] - * [--ei audio ] [--ei sub ]` (stream indexes as Jellyfin numbers them; with one given, the other is off), - * or `--ez tour true [--ei tour_file N]` for the debug tour (from file N). + * Opens an item from the launch intent: + * `adb shell am start -S -n ru.stenfredd.movies/.MainActivity --es item [--ez play true] [--el start ] + * [--ei audio ] [--ei sub ]` (stream indexes as Jellyfin numbers them; with one given, the other is off). + * Debug builds also take `--es engine exo|vlc` (implies play) and `--ez tour true [--ei tour_file N]` for the debug tour. */ - private fun debugTarget(): List? { - if (!BuildConfig.DEBUG) return null - if (intent.getBooleanExtra("tour", false)) return listOf(Screen.Tour(intent.getIntExtra("tour_file", 1) - 1)) + private fun intentTarget(): List? { + if (BuildConfig.DEBUG && intent.getBooleanExtra("tour", false)) return listOf(Screen.Tour(intent.getIntExtra("tour_file", 1) - 1)) val raw = intent.getStringExtra("item") ?: return null - val id = UUID.fromString(if ('-' in raw) raw else raw.replace(Regex("(.{8})(.{4})(.{4})(.{4})(.{12})"), "$1-$2-$3-$4-$5")) - val engine = intent.getStringExtra("engine")?.let(::EngineId) - val play = intent.hasExtra("engine") || intent.getBooleanExtra("play", false) + val id = runCatching { + UUID.fromString(if ('-' in raw) raw else raw.replace(Regex("(.{8})(.{4})(.{4})(.{4})(.{12})"), "$1-$2-$3-$4-$5")) + }.getOrNull() ?: return null + val engine = if (BuildConfig.DEBUG) intent.getStringExtra("engine")?.let(::EngineId) else null + val play = engine != null || intent.getBooleanExtra("play", false) val streams = if (intent.hasExtra("audio") || intent.hasExtra("sub")) { StreamSelection(intent.getIntExtra("audio", -1).takeIf { it >= 0 }, intent.getIntExtra("sub", -1).takeIf { it >= 0 }) } else { diff --git a/app/src/main/kotlin/ru/stenfredd/movies/MoviesApp.kt b/app/src/main/kotlin/ru/stenfredd/movies/MoviesApp.kt index 85ffc5c..d0933af 100644 --- a/app/src/main/kotlin/ru/stenfredd/movies/MoviesApp.kt +++ b/app/src/main/kotlin/ru/stenfredd/movies/MoviesApp.kt @@ -1,13 +1,32 @@ package ru.stenfredd.movies import android.app.Application +import coil3.ImageLoader +import coil3.PlatformContext +import coil3.SingletonImageLoader +import coil3.disk.DiskCache +import coil3.disk.directory +import coil3.memory.MemoryCache +import coil3.request.allowRgb565 +import coil3.request.crossfade import dagger.hilt.android.HiltAndroidApp import timber.log.Timber @HiltAndroidApp -class MoviesApp : Application() { +class MoviesApp : Application(), SingletonImageLoader.Factory { override fun onCreate() { super.onCreate() Timber.plant(Timber.DebugTree()) } + + /** + * Images: posters and stills are opaque, so RGB_565 halves their memory; the memory cache is capped + * well below the heap (the video buffer needs it); the disk cache keeps posters across launches. + */ + override fun newImageLoader(context: PlatformContext): ImageLoader = ImageLoader.Builder(context) + .memoryCache { MemoryCache.Builder().maxSizePercent(context, 0.15).build() } + .diskCache { DiskCache.Builder().directory(context.cacheDir.resolve("images")).maxSizeBytes(200L * 1024 * 1024).build() } + .allowRgb565(true) + .crossfade(false) + .build() } diff --git a/app/src/main/kotlin/ru/stenfredd/movies/ui/BrowseScreens.kt b/app/src/main/kotlin/ru/stenfredd/movies/ui/BrowseScreens.kt index 05b0cb0..7314d3e 100644 --- a/app/src/main/kotlin/ru/stenfredd/movies/ui/BrowseScreens.kt +++ b/app/src/main/kotlin/ru/stenfredd/movies/ui/BrowseScreens.kt @@ -48,7 +48,7 @@ class BrowseViewModel @Inject constructor(val library: Library, val session: Jel private fun BaseItemDto.target(): Screen = if (isPlayable) Screen.Detail(id) else Screen.Items(id, name.orEmpty()) @Composable -fun HomeScreen(onOpen: (Screen) -> Unit, onLogout: () -> Unit, vm: BrowseViewModel = hiltViewModel()) { +fun PrototypeScreen(onOpen: (Screen) -> Unit, onLogout: () -> Unit, vm: BrowseViewModel = hiltViewModel()) { var views by remember { mutableStateOf(emptyList()) } var resume by remember { mutableStateOf(emptyList()) } var results by remember { mutableStateOf(emptyList()) } diff --git a/app/src/main/kotlin/ru/stenfredd/movies/ui/Library.kt b/app/src/main/kotlin/ru/stenfredd/movies/ui/Library.kt index 0631c5c..13a2fd3 100644 --- a/app/src/main/kotlin/ru/stenfredd/movies/ui/Library.kt +++ b/app/src/main/kotlin/ru/stenfredd/movies/ui/Library.kt @@ -38,6 +38,28 @@ class Library @Inject constructor(private val session: JellyfinSession) { ).content.items } + suspend fun latest(parentId: UUID? = null, limit: Int = 20): List = session.call { + libraryApi.getLatestMedia(userId = userId, parentId = parentId, limit = limit, groupItems = true).content + } + + /** Newest movies and series of a library, with the total count. */ + suspend fun libraryItems(parentId: UUID, limit: Int = 20): Pair, Int> = session.call { + val r = libraryApi.getItems( + userId = userId, + parentId = parentId, + recursive = true, + includeItemTypes = listOf(BaseItemKind.MOVIE, BaseItemKind.SERIES), + sortBy = listOf(ItemSortBy.DATE_CREATED), + sortOrder = listOf(org.jellyfin.sdk.model.api.SortOrder.DESCENDING), + limit = limit, + ).content + r.items to r.totalRecordCount + } + + /** Image of exactly the displayed size (px), so the TV only decodes. */ + fun imageUrl(id: UUID, type: ImageType, tag: String, widthPx: Int, heightPx: Int): String = + api.imageApi.getItemImageUrl(id, type, fillWidth = widthPx, fillHeight = heightPx, quality = 90, tag = tag) + suspend fun item(id: UUID): BaseItemDto = session.call { libraryApi.getItem(id, userId).content } fun posterUrl(item: BaseItemDto): String? { diff --git a/app/src/main/kotlin/ru/stenfredd/movies/ui/Screen.kt b/app/src/main/kotlin/ru/stenfredd/movies/ui/Screen.kt index b26bc73..ce4aeb4 100644 --- a/app/src/main/kotlin/ru/stenfredd/movies/ui/Screen.kt +++ b/app/src/main/kotlin/ru/stenfredd/movies/ui/Screen.kt @@ -6,7 +6,12 @@ import java.util.UUID sealed interface Screen { data object Login : Screen - data object Home : Screen + + /** Root screens with the side rail. */ + data class Root(val tab: ru.stenfredd.movies.ui.shell.Tab) : Screen + + /** Old prototype home (libraries, text search, logout, debug tour) while the real screens are being built. */ + data object Prototype : Screen data class Items(val parentId: UUID, val title: String) : Screen data class Detail(val itemId: UUID) : Screen data class Player( diff --git a/app/src/main/kotlin/ru/stenfredd/movies/ui/components/Buttons.kt b/app/src/main/kotlin/ru/stenfredd/movies/ui/components/Buttons.kt new file mode 100644 index 0000000..598710e --- /dev/null +++ b/app/src/main/kotlin/ru/stenfredd/movies/ui/components/Buttons.kt @@ -0,0 +1,121 @@ +package ru.stenfredd.movies.ui.components + +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.text.BasicText +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.focus.onFocusChanged +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import ru.stenfredd.movies.ui.theme.AppColors +import ru.stenfredd.movies.ui.theme.AppType + +/** Main action: gradient pill "▶ Смотреть". */ +@Composable +fun PrimaryButton(label: String, onClick: () -> Unit, modifier: Modifier = Modifier, icon: AppIcon? = AppIcon.Play, trailing: String? = null) { + Row( + modifier + .focusCard(FocusStyle(scale = 1.04f, corner = 19.dp, glows = FocusStyle.ButtonGlows)) + .height(38.dp) + .background(AppColors.PrimaryGradient, RoundedCornerShape(19.dp)) + .clickable(interactionSource = null, indication = null, onClick = onClick) + .padding(start = 16.dp, end = 20.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(8.dp), + ) { + icon?.let { Icon(it, Color.White, Modifier.size(14.dp)) } + BasicText(label, style = AppType.Button.copy(fontSize = AppType.CardTitle.fontSize)) + trailing?.let { BasicText(it, style = AppType.Body.copy(color = Color(0xCCFFFFFF))) } + } +} + +/** Secondary pill ("С начала") and round icon buttons: dark, filled light when focused. */ +@Composable +fun SecondaryButton(label: String, onClick: () -> Unit, modifier: Modifier = Modifier) { + var focused by remember { mutableStateOf(false) } + Box( + modifier + .focusCard(FocusStyle(scale = 1.04f, corner = 19.dp, glows = FocusStyle.ButtonGlows)) + .height(38.dp) + .background(if (focused) AppColors.FocusFill else AppColors.SurfaceRaised, RoundedCornerShape(19.dp)) + .border(0.5.dp, if (focused) Color.Transparent else AppColors.Border, RoundedCornerShape(19.dp)) + .onFocusChanged { focused = it.isFocused } + .clickable(interactionSource = null, indication = null, onClick = onClick) + .padding(horizontal = 16.dp), + contentAlignment = Alignment.Center, + ) { + BasicText(label, style = AppType.Button.copy(fontSize = AppType.CardTitle.fontSize, color = if (focused) AppColors.OnFocusFill else AppColors.Text)) + } +} + +@Composable +fun CircleButton(icon: AppIcon, onClick: () -> Unit, modifier: Modifier = Modifier, tint: Color = AppColors.Text, size: Dp = 38.dp) { + var focused by remember { mutableStateOf(false) } + Box( + modifier + .focusCard(FocusStyle(scale = 1.06f, corner = size / 2, glows = FocusStyle.ButtonGlows)) + .size(size) + .background(if (focused) AppColors.FocusFill else AppColors.SurfaceRaised, CircleShape) + .border(0.5.dp, if (focused) Color.Transparent else AppColors.Border, CircleShape) + .onFocusChanged { focused = it.isFocused } + .clickable(interactionSource = null, indication = null, onClick = onClick), + contentAlignment = Alignment.Center, + ) { + Icon(icon, if (focused) AppColors.OnFocusFill else tint, Modifier.size(size * 0.42f)) + } +} + +/** Option chip: "Русский TrueHD Atmos 7.1"; selected = violet. */ +@Composable +fun Chip(label: String, selected: Boolean, onClick: () -> Unit, modifier: Modifier = Modifier, detail: String? = null) { + val shape = RoundedCornerShape(18.dp) + Row( + modifier + .focusCard(FocusStyle(scale = 1.04f, corner = 18.dp, glows = FocusStyle.ButtonGlows)) + .height(36.dp) + .background(if (selected) AppColors.Selected else AppColors.SurfaceRaised, shape) + .border(0.5.dp, if (selected) AppColors.SelectedBorder else AppColors.Border, shape) + .clickable(interactionSource = null, indication = null, onClick = onClick) + .padding(horizontal = 14.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(6.dp), + ) { + BasicText(label, style = AppType.Button.copy(fontSize = 12.sp, color = if (selected) AppColors.Text else AppColors.TextSecondary)) + detail?.let { BasicText(it, style = AppType.MonoCaption) } + } +} + +/** Format badge: "4K", "HDR10", "Atmos" with its colour. */ +@Composable +fun FormatBadge(text: String, modifier: Modifier = Modifier) { + val color = when (text) { + "4K" -> AppColors.Blue + "HDR10", "HDR10+", "DV", "HLG" -> AppColors.Yellow + "Atmos", "5.1", "7.1", "FLAC", "TrueHD", "DTS" -> AppColors.Pink + else -> AppColors.TextMuted + } + BasicText( + text, + modifier + .border(0.5.dp, color.copy(alpha = 0.6f), RoundedCornerShape(3.dp)) + .padding(horizontal = 4.dp, vertical = 1.5.dp), + style = AppType.MonoCaption.copy(color = color), + ) +} diff --git a/app/src/main/kotlin/ru/stenfredd/movies/ui/components/CardImageTransformation.kt b/app/src/main/kotlin/ru/stenfredd/movies/ui/components/CardImageTransformation.kt new file mode 100644 index 0000000..cf13e9d --- /dev/null +++ b/app/src/main/kotlin/ru/stenfredd/movies/ui/components/CardImageTransformation.kt @@ -0,0 +1,70 @@ +package ru.stenfredd.movies.ui.components + +import android.graphics.Bitmap +import android.graphics.BitmapShader +import android.graphics.Canvas +import android.graphics.LinearGradient +import android.graphics.Matrix +import android.graphics.Paint +import android.graphics.PorterDuff +import android.graphics.PorterDuffXfermode +import android.graphics.RectF +import android.graphics.Shader +import androidx.compose.runtime.Immutable +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.toArgb +import coil3.size.Dimension +import coil3.size.Size +import coil3.transform.Transformation + +/** + * Bottom shade under text over an image: [stops] go from the bottom edge (0) to the top of the shade (1), + * which covers the bottom [height] fraction of the image. + */ +@Immutable +data class ImageShade(val height: Float, val stops: List>) { + val cacheKey = "$height:" + stops.joinToString(",") { "${it.first}=${it.second.toArgb()}" } +} + +/** + * Rounded corners and the text shade baked into the bitmap once, on Coil's decode thread. + * The TV this was measured on redraws the whole screen every frame (no dirty-region rendering), and every + * translucent layer over an image costs GPU time on every frame; baked, the card is a single bitmap draw. + */ +class CardImageTransformation(private val radiusPx: Float, private val shade: ImageShade?) : Transformation() { + override val cacheKey = "card:$radiusPx:${shade?.cacheKey}" + + override suspend fun transform(input: Bitmap, size: Size): Bitmap { + // Crop to the card's own size first: when the server image has other proportions (posters aren't all 2:3), + // cropping it later at draw time would cut the baked corners off. + val w = (size.width as? Dimension.Pixels)?.px ?: input.width + val h = (size.height as? Dimension.Pixels)?.px ?: input.height + val output = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888) + val canvas = Canvas(output) + val paint = Paint(Paint.ANTI_ALIAS_FLAG or Paint.FILTER_BITMAP_FLAG) + val scale = maxOf(w.toFloat() / input.width, h.toFloat() / input.height) + paint.shader = BitmapShader(input, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP).apply { + setLocalMatrix( + Matrix().apply { + setScale(scale, scale) + postTranslate((w - input.width * scale) / 2f, (h - input.height * scale) / 2f) + }, + ) + } + canvas.drawRoundRect(RectF(0f, 0f, w.toFloat(), h.toFloat()), radiusPx, radiusPx, paint) + if (shade != null) { + val top = h * (1f - shade.height) + val gradient = Paint() + gradient.shader = LinearGradient( + 0f, h.toFloat(), 0f, top, + shade.stops.map { it.second.toArgb() }.toIntArray(), + shade.stops.map { it.first }.toFloatArray(), + Shader.TileMode.CLAMP, + ) + // Only over the image's own pixels, so the rounded corners stay transparent. + gradient.xfermode = PorterDuffXfermode(PorterDuff.Mode.SRC_ATOP) + canvas.drawRect(0f, top, w.toFloat(), h.toFloat(), gradient) + } + return output + } +} diff --git a/app/src/main/kotlin/ru/stenfredd/movies/ui/components/Cards.kt b/app/src/main/kotlin/ru/stenfredd/movies/ui/components/Cards.kt new file mode 100644 index 0000000..62db87c --- /dev/null +++ b/app/src/main/kotlin/ru/stenfredd/movies/ui/components/Cards.kt @@ -0,0 +1,243 @@ +package ru.stenfredd.movies.ui.components + +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.layout.widthIn +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.text.BasicText +import androidx.compose.runtime.Composable +import androidx.compose.runtime.Immutable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.drawWithCache +import androidx.compose.ui.geometry.CornerRadius +import androidx.compose.ui.geometry.Size +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import ru.stenfredd.movies.ui.theme.AppColors +import ru.stenfredd.movies.ui.theme.AppDimens +import ru.stenfredd.movies.ui.theme.AppType + +/** What a poster card shows. Built by view models from server data; composables never see SDK DTOs. */ +@Immutable +data class PosterModel( + val key: String, + val title: String, + val caption: String?, + val imageUrl: String?, + /** Format badge at the bottom left: "4K", "1080p". */ + val badge: String? = null, + /** Watch progress 0..1, or null. */ + val progress: Float? = null, + val isNew: Boolean = false, + val watched: Boolean = false, +) + +/** Episode still or backdrop with a title over it: "Continue watching" cards. */ +@Immutable +data class WideModel( + val key: String, + val title: String, + val subtitle: String, + val imageUrl: String?, + val progress: Float?, +) + +private val PosterCorner = 7.dp +private val WideCorner = 8.dp +private val FeaturedCorner = 11.dp + +private val WideShade = ImageShade(0.7f, listOf(0f to Color(0xF006070C), 0.75f to Color(0x4006070C), 1f to Color.Transparent)) +private val FeaturedShade = ImageShade(0.8f, listOf(0f to Color(0xF506070C), 0.6f to Color(0x9906070C), 1f to Color.Transparent)) + +@Composable +fun PosterCard(model: PosterModel, onClick: () -> Unit, modifier: Modifier = Modifier) { + Column(modifier.width(AppDimens.POSTER_W.dp)) { + Box( + Modifier + .focusCard(FocusStyle.Poster) + .size(AppDimens.POSTER_W.dp, AppDimens.POSTER_H.dp) + .clickable(interactionSource = null, indication = null, onClick = onClick), + ) { + RemoteImage(model.imageUrl, PosterCorner, Modifier.fillMaxSize()) + if (model.isNew) NewBadge(Modifier.align(Alignment.TopStart).padding(6.dp)) + if (model.watched) WatchedBadge(Modifier.align(Alignment.TopEnd).padding(6.dp)) + // The mockup's bottom shade under the badge costs a card-sized blend; a small dark plate does the same job. + model.badge?.let { + BasicText( + it, + Modifier + .align(Alignment.BottomStart) + .padding(6.dp) + .background(Color(0x9906070C), RoundedCornerShape(3.dp)) + .padding(horizontal = 4.dp, vertical = 1.dp), + style = AppType.MonoCaption.copy(color = Color(0xD9FFFFFF)), + ) + } + model.progress?.let { + ProgressLine( + it, + Modifier.align(Alignment.BottomStart).padding(horizontal = 6.dp, vertical = 5.dp).fillMaxWidth().height(2.5.dp), + ) + } + } + BasicText( + model.title, + Modifier.padding(top = 8.dp), + style = AppType.PosterTitle, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + ) + model.caption?.let { + BasicText(it, Modifier.padding(top = 3.dp), style = AppType.MonoCaption, maxLines = 1, overflow = TextOverflow.Ellipsis) + } + } +} + +@Composable +fun WideCard(model: WideModel, onClick: () -> Unit, modifier: Modifier = Modifier) { + Box( + modifier + .focusCard(FocusStyle.Wide) + .size(AppDimens.WIDE_W.dp, AppDimens.WIDE_H.dp) + .clickable(interactionSource = null, indication = null, onClick = onClick), + ) { + RemoteImage(model.imageUrl, WideCorner, Modifier.fillMaxSize(), shade = WideShade) + Column(Modifier.align(Alignment.BottomStart).padding(start = 10.dp, end = 10.dp, bottom = 11.dp)) { + BasicText(model.title, style = AppType.CardTitle, maxLines = 1, overflow = TextOverflow.Ellipsis) + BasicText( + model.subtitle, + Modifier.padding(top = 3.dp), + style = AppType.MonoMeta, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + ) + } + model.progress?.let { + ProgressLine(it, Modifier.align(Alignment.BottomStart).padding(horizontal = 8.dp, vertical = 5.dp).fillMaxWidth().height(3.dp)) + } + } +} + +/** The big first "Continue watching" card on the home screen. */ +@Immutable +data class FeaturedModel( + val key: String, + val label: String, + val title: String, + val subtitle: String, + val description: String?, + val imageUrl: String?, + val progress: Float, + val remaining: String?, +) + +@Composable +fun FeaturedCard(model: FeaturedModel, onClick: () -> Unit, modifier: Modifier = Modifier) { + Box( + modifier + .focusCard(FocusStyle.Featured) + .size(410.dp, 230.5.dp) + .clickable(interactionSource = null, indication = null, onClick = onClick), + ) { + RemoteImage(model.imageUrl, FeaturedCorner, Modifier.fillMaxSize(), shade = FeaturedShade) + Column(Modifier.align(Alignment.BottomStart).padding(start = 20.dp, end = 20.dp, bottom = 22.dp)) { + BasicText(model.label, style = AppType.MonoLabel) + BasicText( + model.title, + Modifier.padding(top = 5.dp), + style = AppType.Hero, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + ) + BasicText(model.subtitle, Modifier.padding(top = 4.dp), style = AppType.BodyLarge, maxLines = 1, overflow = TextOverflow.Ellipsis) + model.description?.let { + BasicText( + it, + Modifier.padding(top = 7.dp).widthIn(max = 350.dp), + style = AppType.Body, + maxLines = 2, + overflow = TextOverflow.Ellipsis, + ) + } + Row(Modifier.padding(top = 11.dp), verticalAlignment = Alignment.CenterVertically) { + PlayPill("Продолжить") + Spacer(Modifier.width(10.dp)) + ProgressLine(model.progress, Modifier.weight(1f).height(3.dp)) + model.remaining?.let { + Spacer(Modifier.width(10.dp)) + BasicText(it, style = AppType.MonoMeta.copy(fontSize = AppType.MonoCount.fontSize)) + } + } + } + } +} + +/** Non-focusable gradient "▶ label" pill, part of a larger focusable card. */ +@Composable +fun PlayPill(label: String, modifier: Modifier = Modifier) { + Row( + modifier + .height(28.dp) + .background(AppColors.PrimaryGradient, RoundedCornerShape(14.dp)) + .padding(start = 9.dp, end = 12.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(6.dp), + ) { + PlayIcon(Modifier.size(12.dp)) + BasicText(label, style = AppType.Button) + } +} + +/** Rounded track with a gradient fill, one draw call, no clipping. */ +@Composable +fun ProgressLine(fraction: Float, modifier: Modifier = Modifier) { + Spacer( + modifier.drawWithCache { + val r = CornerRadius(size.height / 2) + val fill = size.width * fraction.coerceIn(0f, 1f) + onDrawBehind { + drawRoundRect(AppColors.ProgressTrack, cornerRadius = r) + if (fill > 0f) drawRoundRect(AppColors.ProgressGradient, size = Size(fill, size.height), cornerRadius = r) + } + }, + ) +} + +@Composable +fun NewBadge(modifier: Modifier = Modifier) { + BasicText( + "НОВОЕ", + modifier + .background(AppColors.NewBadge, RoundedCornerShape(3.dp)) + .padding(horizontal = 4.5.dp, vertical = 2.dp), + style = AppType.MonoBadge.copy(color = Color.White), + ) +} + +@Composable +fun WatchedBadge(modifier: Modifier = Modifier) { + Box( + modifier + .size(18.dp) + .background(Color(0x2E7EE0A3), CircleShape) + .border(0.5.dp, AppColors.Green, CircleShape), + contentAlignment = Alignment.Center, + ) { + CheckIcon(Modifier.size(9.dp), AppColors.Green) + } +} diff --git a/app/src/main/kotlin/ru/stenfredd/movies/ui/components/FocusCard.kt b/app/src/main/kotlin/ru/stenfredd/movies/ui/components/FocusCard.kt new file mode 100644 index 0000000..40fd51a --- /dev/null +++ b/app/src/main/kotlin/ru/stenfredd/movies/ui/components/FocusCard.kt @@ -0,0 +1,136 @@ +package ru.stenfredd.movies.ui.components + +import androidx.compose.animation.core.Animatable +import androidx.compose.animation.core.tween +import androidx.compose.runtime.Immutable +import androidx.compose.ui.Modifier +import androidx.compose.ui.focus.FocusEventModifierNode +import androidx.compose.ui.focus.FocusState +import androidx.compose.ui.geometry.CornerRadius +import androidx.compose.ui.geometry.Offset +import androidx.compose.ui.geometry.Size +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.drawscope.ContentDrawScope +import androidx.compose.ui.graphics.drawscope.Stroke +import androidx.compose.ui.layout.Measurable +import androidx.compose.ui.layout.MeasureResult +import androidx.compose.ui.layout.MeasureScope +import androidx.compose.ui.node.DrawModifierNode +import androidx.compose.ui.node.LayoutModifierNode +import androidx.compose.ui.node.ModifierNodeElement +import androidx.compose.ui.node.invalidateDraw +import androidx.compose.ui.node.invalidatePlacement +import androidx.compose.ui.unit.Constraints +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.IntOffset +import androidx.compose.ui.unit.IntSize +import androidx.compose.ui.unit.dp +import kotlinx.coroutines.launch +import ru.stenfredd.movies.ui.theme.AppColors + +/** Focus look of a card: scale, outer ring and glow, as `style-focus` in the mockup (sizes in dp). */ +@Immutable +data class FocusStyle( + val scale: Float, + val corner: Dp, + val ring: Dp = 1.5.dp, + val ringColor: Color = AppColors.Accent, + val glows: List = CardGlows, +) { + @Immutable + data class Glow(val blur: Dp, val spread: Dp, val color: Color) + + companion object { + /** `0 0 32px 6px rgba(124,92,255,.55), 0 0 90px 14px rgba(70,120,255,.22)` */ + val CardGlows = listOf( + Glow(16.dp, 3.dp, Color(0x8C7C5CFF)), + Glow(45.dp, 7.dp, Color(0x384678FF)), + ) + + /** `0 0 30px 6px rgba(124,92,255,.5)` — buttons and chips. */ + val ButtonGlows = listOf(Glow(15.dp, 3.dp, Color(0x807C5CFF))) + + val Poster = FocusStyle(scale = 1.07f, corner = 7.dp) + val Wide = FocusStyle(scale = 1.05f, corner = 8.dp) + val Featured = FocusStyle(scale = 1.025f, corner = 11.dp) + val Tile = FocusStyle(scale = 1.03f, corner = 11.dp, ring = 1.dp) + } +} + +/** + * Focus decoration for a card: animates scale, ring and glow when the element (or a child) gets focus. + * Put it before `clip` and `clickable`/`focusable` so the glow isn't clipped and focus events reach it. + * + * Implemented as a modifier node: the animation only touches the layer and draw phases, + * a focus change never recomposes the card. + */ +fun Modifier.focusCard(style: FocusStyle): Modifier = this then FocusCardElement(style) + +private data class FocusCardElement(val style: FocusStyle) : ModifierNodeElement() { + override fun create() = FocusCardNode(style) + override fun update(node: FocusCardNode) { + node.style = style + node.invalidateDraw() + } +} + +private class FocusCardNode(var style: FocusStyle) : Modifier.Node(), FocusEventModifierNode, LayoutModifierNode, DrawModifierNode { + private val progress = Animatable(0f) + private var focused = false + + override fun onFocusEvent(focusState: FocusState) { + if (focusState.hasFocus == focused) return + focused = focusState.hasFocus + if (!isAttached) return + invalidatePlacement() + coroutineScope.launch { progress.animateTo(if (focused) 1f else 0f, tween(if (focused) 180 else 140)) } + } + + override fun MeasureScope.measure(measurable: Measurable, constraints: Constraints): MeasureResult { + val placeable = measurable.measure(constraints) + return layout(placeable.width, placeable.height) { + // Focused card on top so its scaled edge and glow aren't covered by neighbours. + placeable.placeWithLayer(IntOffset.Zero, zIndex = if (focused) 1f else 0f) { + val s = 1f + (style.scale - 1f) * progress.value + scaleX = s + scaleY = s + } + } + } + + override fun ContentDrawScope.draw() { + val p = progress.value + if (p > 0f) { + val corner = style.corner.toPx() + if (style.glows.isNotEmpty()) drawGlow(corner, p) + val ring = style.ring.toPx() + drawRoundRect( + color = style.ringColor, + topLeft = Offset(-ring / 2, -ring / 2), + size = Size(size.width + ring, size.height + ring), + cornerRadius = CornerRadius(corner + ring / 2), + style = Stroke(ring), + alpha = p, + ) + } + drawContent() + } + + private fun ContentDrawScope.drawGlow(corner: Float, p: Float) { + val glow = GlowCache.get( + size.width, + size.height, + corner, + style.glows.map { GlowLayer(it.blur.toPx(), it.spread.toPx(), it.color) }, + ) + drawImage( + image = glow.bitmap, + dstOffset = IntOffset(-glow.marginPx.toInt(), -glow.marginPx.toInt()), + dstSize = IntSize( + (size.width + 2 * glow.marginPx).toInt(), + (size.height + 2 * glow.marginPx).toInt(), + ), + alpha = p, + ) + } +} diff --git a/app/src/main/kotlin/ru/stenfredd/movies/ui/components/Glow.kt b/app/src/main/kotlin/ru/stenfredd/movies/ui/components/Glow.kt new file mode 100644 index 0000000..2031cfa --- /dev/null +++ b/app/src/main/kotlin/ru/stenfredd/movies/ui/components/Glow.kt @@ -0,0 +1,65 @@ +package ru.stenfredd.movies.ui.components + +import android.graphics.Bitmap +import android.graphics.BlurMaskFilter +import android.graphics.Canvas +import android.graphics.Paint +import android.graphics.RectF +import android.util.LruCache +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.ImageBitmap +import androidx.compose.ui.graphics.asImageBitmap +import androidx.compose.ui.graphics.toArgb +import kotlin.math.roundToInt + +/** + * One soft glow layer, CSS `box-shadow: 0 0 `, sizes in px. + */ +data class GlowLayer(val blurPx: Float, val spreadPx: Float, val color: Color) + +/** + * Pre-rendered focus glows. The mockup's glows are 30–120 px blurred shadows; blurring them every frame + * is too slow for weak TVs, so each (size, shape, layers) combination is rendered once into a bitmap + * at half resolution (a blur loses nothing when upscaled) and then drawn as a plain image. + * Only the focused element draws its glow, and focusable elements of one kind share a size, + * so the cache stays small. + */ +object GlowCache { + private const val SCALE = 0.5f + + class Glow(val bitmap: ImageBitmap, val marginPx: Float) + + private data class Key(val w: Int, val h: Int, val corner: Int, val layers: List) + + // Bytes of all cached bitmaps; ~4 MB is a few dozen glows. + private val cache = object : LruCache(4 * 1024 * 1024) { + override fun sizeOf(key: Key, value: Glow) = value.bitmap.width * value.bitmap.height * 4 + } + + fun get(widthPx: Float, heightPx: Float, cornerPx: Float, layers: List): Glow { + val key = Key(widthPx.roundToInt(), heightPx.roundToInt(), cornerPx.roundToInt(), layers) + return cache.get(key) ?: render(key).also { cache.put(key, it) } + } + + private fun render(key: Key): Glow { + // A blurred edge fades out at roughly 1× the CSS blur radius beyond the spread. + val margin = key.layers.maxOf { it.blurPx + it.spreadPx } + val w = ((key.w + 2 * margin) * SCALE).roundToInt().coerceAtLeast(1) + val h = ((key.h + 2 * margin) * SCALE).roundToInt().coerceAtLeast(1) + val bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888) + val canvas = Canvas(bitmap) + canvas.scale(SCALE, SCALE) + val paint = Paint(Paint.ANTI_ALIAS_FLAG) + for (layer in key.layers) { + // CSS blur radius B is a Gaussian with sigma B/2; BlurMaskFilter's radius r has sigma ≈ 0.57735·r + 0.5. + val radius = ((layer.blurPx / 2 - 0.5f) / 0.57735f).coerceAtLeast(0.5f) + paint.maskFilter = BlurMaskFilter(radius, BlurMaskFilter.Blur.NORMAL) + paint.color = layer.color.toArgb() + val s = layer.spreadPx + val rect = RectF(margin - s, margin - s, margin + key.w + s, margin + key.h + s) + val corner = key.corner + s + canvas.drawRoundRect(rect, corner, corner, paint) + } + return Glow(bitmap.asImageBitmap(), margin) + } +} diff --git a/app/src/main/kotlin/ru/stenfredd/movies/ui/components/Icons.kt b/app/src/main/kotlin/ru/stenfredd/movies/ui/components/Icons.kt new file mode 100644 index 0000000..60059cb --- /dev/null +++ b/app/src/main/kotlin/ru/stenfredd/movies/ui/components/Icons.kt @@ -0,0 +1,59 @@ +package ru.stenfredd.movies.ui.components + +import androidx.compose.foundation.layout.Spacer +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.drawWithCache +import androidx.compose.ui.geometry.Offset +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.ImageBitmap +import androidx.compose.ui.graphics.Path +import androidx.compose.ui.graphics.StrokeCap +import androidx.compose.ui.graphics.StrokeJoin +import androidx.compose.ui.graphics.drawscope.CanvasDrawScope +import androidx.compose.ui.graphics.drawscope.Fill +import androidx.compose.ui.graphics.drawscope.Stroke +import androidx.compose.ui.graphics.drawscope.scale +import androidx.compose.ui.graphics.vector.PathParser +import androidx.compose.ui.unit.IntSize +import androidx.compose.ui.unit.toSize +import kotlin.math.ceil + +/** + * Icons from the mockup's inline SVGs (24×24 viewBox). Paths are rasterised into a small bitmap once per + * size and colour, then drawn as an image: weak TV GPUs re-rasterise antialiased paths every frame. + */ +enum class AppIcon(val pathData: String, val stroked: Boolean = true) { + Search("M11 4a7 7 0 1 0 0 14a7 7 0 1 0 0-14zM20 20l-3.5-3.5"), + Home("M4 11l8-7 8 7v9h-5v-6H9v6H4z"), + Library("M5 5h14a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V7a2 2 0 0 1 2-2zM3 9h18M8 5v4M16 5v4"), + Heart("M12 20s-7.5-4.6-7.5-10A4.2 4.2 0 0 1 12 7.6 4.2 4.2 0 0 1 19.5 10c0 5.4-7.5 10-7.5 10z"), + Check("M5 12.5l4.5 4.5L19 7.5"), + Plus("M12 5v14M5 12h14"), + Play("M7 4.5v15l13-7.5z", stroked = false), + ; + + internal val path: Path by lazy { PathParser().parsePathString(pathData).toPath() } +} + +@Composable +fun Icon(icon: AppIcon, color: Color, modifier: Modifier = Modifier, strokeWidth: Float = 2f) { + Spacer( + modifier.drawWithCache { + val bitmapSize = IntSize(ceil(size.width).toInt().coerceAtLeast(1), ceil(size.height).toInt().coerceAtLeast(1)) + val bitmap = ImageBitmap(bitmapSize.width, bitmapSize.height) + val k = size.minDimension / 24f + val style = if (icon.stroked) Stroke(strokeWidth, cap = StrokeCap.Round, join = StrokeJoin.Round) else Fill + CanvasDrawScope().draw(this, layoutDirection, androidx.compose.ui.graphics.Canvas(bitmap), bitmapSize.toSize()) { + scale(k, k, pivot = Offset.Zero) { drawPath(icon.path, color, style = style) } + } + onDrawBehind { drawImage(bitmap) } + }, + ) +} + +@Composable +fun PlayIcon(modifier: Modifier = Modifier, color: Color = Color.White) = Icon(AppIcon.Play, color, modifier) + +@Composable +fun CheckIcon(modifier: Modifier = Modifier, color: Color) = Icon(AppIcon.Check, color, modifier, strokeWidth = 3f) diff --git a/app/src/main/kotlin/ru/stenfredd/movies/ui/components/RemoteImage.kt b/app/src/main/kotlin/ru/stenfredd/movies/ui/components/RemoteImage.kt new file mode 100644 index 0000000..f5c4fe8 --- /dev/null +++ b/app/src/main/kotlin/ru/stenfredd/movies/ui/components/RemoteImage.kt @@ -0,0 +1,50 @@ +package ru.stenfredd.movies.ui.components + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.unit.Dp +import coil3.compose.AsyncImage +import coil3.request.ImageRequest +import coil3.request.transformations +import ru.stenfredd.movies.ui.theme.AppColors + +/** + * Server image with rounded corners. + * + * Corners and the optional text [shade] are baked into the bitmap when it is decoded ([CardImageTransformation]), + * instead of clipping and blending every frame; the rounded placeholder is drawn only until the image arrives. + * The image size comes from the URL (the view model asks the server for exactly the displayed size), + * so Coil only decodes. No crossfade: it would redraw every visible card for its duration. + */ +@Composable +fun RemoteImage(url: String?, corner: Dp, modifier: Modifier = Modifier, shade: ImageShade? = null, contentScale: ContentScale = ContentScale.Crop) { + var loaded by remember(url) { mutableStateOf(false) } + val shape = remember(corner) { RoundedCornerShape(corner) } + Box(if (loaded) modifier else modifier.background(AppColors.SurfaceRaised, shape)) { + if (url != null) { + val context = LocalContext.current + val radius = with(LocalDensity.current) { corner.toPx() } + val request = remember(url, radius, shade) { + ImageRequest.Builder(context).data(url).transformations(CardImageTransformation(radius, shade)).build() + } + AsyncImage( + model = request, + contentDescription = null, + modifier = Modifier.fillMaxSize(), + contentScale = contentScale, + onSuccess = { loaded = true }, + ) + } + } +} diff --git a/app/src/main/kotlin/ru/stenfredd/movies/ui/components/Scrolling.kt b/app/src/main/kotlin/ru/stenfredd/movies/ui/components/Scrolling.kt new file mode 100644 index 0000000..add355f --- /dev/null +++ b/app/src/main/kotlin/ru/stenfredd/movies/ui/components/Scrolling.kt @@ -0,0 +1,88 @@ +package ru.stenfredd.movies.ui.components + +import androidx.compose.animation.core.FastOutSlowInEasing +import androidx.compose.animation.core.tween +import androidx.compose.foundation.ExperimentalFoundationApi +import androidx.compose.foundation.ScrollState +import androidx.compose.foundation.gestures.BringIntoViewSpec +import androidx.compose.foundation.gestures.LocalBringIntoViewSpec +import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.runtime.Stable +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.staticCompositionLocalOf +import androidx.compose.ui.Modifier +import androidx.compose.ui.focus.onFocusChanged +import androidx.compose.ui.layout.LayoutCoordinates +import androidx.compose.ui.layout.onPlaced +import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.unit.Dp +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Job +import kotlinx.coroutines.launch + +/** + * Vertical scrolling of a screen of rows, done by hand: Compose's own bring-into-view animation can't be + * slowed down (custom specs are no longer supported) and jumps too fast on a TV. + * + * When a row ([anchoredRow]) gets focus and isn't fully visible, the screen scrolls smoothly so the row's top + * sits [anchor] below the viewport top; a visible row doesn't scroll at all. Automatic vertical + * bring-into-view is switched off inside [content]; rows keep the platform horizontal behaviour, see [DefaultScrolling]. + */ +@Stable +class AnchoredScroll internal constructor(val scroll: ScrollState, private val scope: CoroutineScope, private val anchorPx: Float) { + internal var viewport: LayoutCoordinates? = null + private var job: Job? = null + + internal fun bring(row: LayoutCoordinates) { + val vp = viewport?.takeIf { it.isAttached } ?: return + if (!row.isAttached) return + val bounds = vp.localBoundingBoxOf(row, clipBounds = false) + if (bounds.top >= 0f && bounds.bottom <= vp.size.height) return + val target = (scroll.value + bounds.top - anchorPx).toInt().coerceIn(0, scroll.maxValue) + job?.cancel() + job = scope.launch { scroll.animateScrollTo(target, tween(ScrollMillis, easing = FastOutSlowInEasing)) } + } + + private companion object { + const val ScrollMillis = 450 + } +} + +@OptIn(ExperimentalFoundationApi::class) +@Composable +fun AnchoredScrolling(scroll: ScrollState, anchor: Dp, content: @Composable (AnchoredScroll) -> Unit) { + val default = LocalBringIntoViewSpec.current + val scope = rememberCoroutineScope() + val anchorPx = with(LocalDensity.current) { anchor.toPx() } + val state = remember(scroll, anchorPx) { AnchoredScroll(scroll, scope, anchorPx) } + CompositionLocalProvider(LocalBringIntoViewSpec provides NoScroll, LocalDefaultBringIntoViewSpec provides default) { + content(state) + } +} + +/** The scroll container's viewport: put it before `verticalScroll`. */ +fun Modifier.anchorViewport(state: AnchoredScroll): Modifier = onPlaced { state.viewport = it } + +/** A row of the screen: scrolled to the anchor when focus enters it. */ +fun Modifier.anchoredRow(state: AnchoredScroll): Modifier { + var coords: LayoutCoordinates? = null + return onPlaced { coords = it }.onFocusChanged { if (it.hasFocus) coords?.let(state::bring) } +} + +@OptIn(ExperimentalFoundationApi::class) +private val NoScroll = object : BringIntoViewSpec { + override fun calculateScrollDistance(offset: Float, size: Float, containerSize: Float) = 0f +} + +@OptIn(ExperimentalFoundationApi::class) +private val LocalDefaultBringIntoViewSpec = staticCompositionLocalOf { null } + +/** Restores the platform scrolling behaviour for nested (horizontal) lists inside [AnchoredScrolling]. */ +@OptIn(ExperimentalFoundationApi::class) +@Composable +fun DefaultScrolling(content: @Composable () -> Unit) { + val default = LocalDefaultBringIntoViewSpec.current + if (default == null) content() else CompositionLocalProvider(LocalBringIntoViewSpec provides default, content = content) +} diff --git a/app/src/main/kotlin/ru/stenfredd/movies/ui/components/Section.kt b/app/src/main/kotlin/ru/stenfredd/movies/ui/components/Section.kt new file mode 100644 index 0000000..763a928 --- /dev/null +++ b/app/src/main/kotlin/ru/stenfredd/movies/ui/components/Section.kt @@ -0,0 +1,46 @@ +package ru.stenfredd.movies.ui.components + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyListScope +import androidx.compose.foundation.lazy.LazyRow +import androidx.compose.foundation.lazy.rememberLazyListState +import androidx.compose.foundation.text.BasicText +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.focus.focusRestorer +import androidx.compose.ui.unit.dp +import ru.stenfredd.movies.ui.theme.AppDimens +import ru.stenfredd.movies.ui.theme.AppType + +/** "Недавно добавлено 12" */ +@Composable +fun SectionTitle(title: String, count: Int?, modifier: Modifier = Modifier) { + Row(modifier.padding(horizontal = AppDimens.CONTENT_START.dp), verticalAlignment = Alignment.Bottom, horizontalArrangement = Arrangement.spacedBy(8.dp)) { + BasicText(title, style = AppType.Section) + count?.let { BasicText(it.toString(), Modifier.padding(bottom = 1.dp), style = AppType.MonoCount) } + } +} + +/** + * A titled horizontal row. Returning to the row (↑/↓) focuses the card that was focused before, + * not the first visible one. + */ +@Composable +fun ContentRow(title: String, count: Int?, modifier: Modifier = Modifier, content: LazyListScope.() -> Unit) { + Column(modifier) { + SectionTitle(title, count) + DefaultScrolling { LazyRow( + state = rememberLazyListState(), + modifier = Modifier.focusRestorer(), + // Vertical padding leaves room for the focused card's scale and glow. + contentPadding = PaddingValues(horizontal = AppDimens.CONTENT_START.dp, vertical = 14.dp), + horizontalArrangement = Arrangement.spacedBy(AppDimens.ROW_GAP.dp), + content = content, + ) } + } +} diff --git a/app/src/main/kotlin/ru/stenfredd/movies/ui/focus/ScreenFocus.kt b/app/src/main/kotlin/ru/stenfredd/movies/ui/focus/ScreenFocus.kt new file mode 100644 index 0000000..2aa5578 --- /dev/null +++ b/app/src/main/kotlin/ru/stenfredd/movies/ui/focus/ScreenFocus.kt @@ -0,0 +1,62 @@ +package ru.stenfredd.movies.ui.focus + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.Stable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.saveable.Saver +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.runtime.setValue +import androidx.compose.runtime.withFrameNanos +import androidx.compose.ui.Modifier +import androidx.compose.ui.focus.FocusRequester +import androidx.compose.ui.focus.focusRequester +import androidx.compose.ui.focus.onFocusChanged + +/** + * Remembers which element of a screen had focus and puts focus back there when the user returns + * (Back from a details page): navigation disposes the screen, its state holder keeps [lastKey] + * and the lazy lists' scroll positions, and [Restore] focuses the same card again. + * + * Every focusable element of the screen gets a stable [key] via [Modifier.remembered]. + * Only the element whose key matches gets a [FocusRequester], so the cost per card is one focus callback. + */ +@Stable +class ScreenFocus(initialKey: String?) { + var lastKey: String? by mutableStateOf(initialKey) + internal set + internal val requester = FocusRequester() +} + +private val ScreenFocusSaver = Saver( + save = { it.lastKey.orEmpty() }, + restore = { ScreenFocus(it.ifEmpty { null }) }, +) + +@Composable +fun rememberScreenFocus(): ScreenFocus { + return rememberSaveable(saver = ScreenFocusSaver) { ScreenFocus(null) } +} + +/** + * Marks a focusable element with [key]. [isDefault] marks the element to focus on the first visit. + */ +fun Modifier.remembered(focus: ScreenFocus, key: String, isDefault: Boolean = false): Modifier { + val target = focus.lastKey ?: if (isDefault) key else null + return this + .then(if (target == key) Modifier.focusRequester(focus.requester) else Modifier) + .onFocusChanged { if (it.isFocused) focus.lastKey = key } +} + +/** + * Focuses the remembered (or default) element once [ready] becomes true, after the content is laid out. + */ +@Composable +fun ScreenFocus.Restore(ready: Boolean) { + LaunchedEffect(ready) { + if (!ready) return@LaunchedEffect + withFrameNanos { } + runCatching { requester.requestFocus() } + } +} diff --git a/app/src/main/kotlin/ru/stenfredd/movies/ui/home/HomeScreen.kt b/app/src/main/kotlin/ru/stenfredd/movies/ui/home/HomeScreen.kt new file mode 100644 index 0000000..03df86a --- /dev/null +++ b/app/src/main/kotlin/ru/stenfredd/movies/ui/home/HomeScreen.kt @@ -0,0 +1,100 @@ +package ru.stenfredd.movies.ui.home + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.text.BasicText +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.key +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.focus.focusRestorer +import androidx.compose.ui.unit.dp +import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import ru.stenfredd.movies.ui.Screen +import ru.stenfredd.movies.ui.components.AnchoredScrolling +import ru.stenfredd.movies.ui.components.anchorViewport +import ru.stenfredd.movies.ui.components.anchoredRow +import ru.stenfredd.movies.ui.components.ContentRow +import ru.stenfredd.movies.ui.components.FeaturedCard +import ru.stenfredd.movies.ui.components.PosterCard +import ru.stenfredd.movies.ui.components.SectionTitle +import ru.stenfredd.movies.ui.components.WideCard +import ru.stenfredd.movies.ui.focus.Restore +import ru.stenfredd.movies.ui.focus.rememberScreenFocus +import ru.stenfredd.movies.ui.focus.remembered +import ru.stenfredd.movies.ui.theme.AppDimens +import ru.stenfredd.movies.ui.theme.AppType + +@Composable +fun HomeScreen(onOpen: (Screen) -> Unit, vm: HomeViewModel = hiltViewModel()) { + val state by vm.state.collectAsStateWithLifecycle() + val focus = rememberScreenFocus() + val open = { key: String -> vm.target(key)?.let(onOpen) ?: Unit } + + when { + state.loading -> Message("Загрузка…") + state.error != null -> Message("Не удалось загрузить: ${state.error}") + // A plain scrolling column, not a LazyColumn: home has a handful of rows, and composing a row while it + // scrolls into view cost up to 50 ms frames on the test TV. All rows are composed once on load; + // the cards inside each row stay lazy. + else -> AnchoredScrolling(rememberScrollState(), anchor = AppDimens.CONTENT_TOP.dp) { anchored -> + Column( + Modifier + .fillMaxSize() + .anchorViewport(anchored) + .verticalScroll(anchored.scroll) + .padding(top = AppDimens.CONTENT_TOP.dp, bottom = 200.dp), + verticalArrangement = Arrangement.spacedBy(AppDimens.SECTION_GAP.dp - 14.dp), + ) { + state.featured?.let { featured -> + Column(Modifier.anchoredRow(anchored)) { + SectionTitle("Продолжить просмотр", state.continueCount) + Row( + Modifier.padding(start = AppDimens.CONTENT_START.dp, top = 13.dp, bottom = 14.dp).focusRestorer(), + horizontalArrangement = Arrangement.spacedBy(16.dp), + ) { + FeaturedCard(featured, { open(featured.key) }, Modifier.remembered(focus, featured.key, isDefault = true)) + ContinueGrid(state, focus, open) + } + } + } + for (row in state.rows) { + key(row.key) { + ContentRow(row.title, row.count, Modifier.anchoredRow(anchored)) { + items(row.items, key = { it.key }, contentType = { "poster" }) { p -> + PosterCard(p, { open(p.key) }, Modifier.remembered(focus, p.key, isDefault = state.featured == null && p === state.rows.first().items.first())) + } + } + } + } + } + } + } + focus.Restore(ready = !state.loading && state.error == null) +} + +@Composable +private fun ContinueGrid(state: HomeState, focus: ru.stenfredd.movies.ui.focus.ScreenFocus, open: (String) -> Unit) { + Column(verticalArrangement = Arrangement.spacedBy(12.dp)) { + state.continueItems.chunked(2).forEach { pair -> + Row(horizontalArrangement = Arrangement.spacedBy(12.dp)) { + pair.forEach { w -> WideCard(w, { open(w.key) }, Modifier.remembered(focus, w.key)) } + } + } + } +} + +@Composable +private fun Message(text: String) { + Box(Modifier.fillMaxSize(), contentAlignment = Alignment.Center) { BasicText(text, style = AppType.Body) } +} diff --git a/app/src/main/kotlin/ru/stenfredd/movies/ui/home/HomeViewModel.kt b/app/src/main/kotlin/ru/stenfredd/movies/ui/home/HomeViewModel.kt new file mode 100644 index 0000000..b0d0d5b --- /dev/null +++ b/app/src/main/kotlin/ru/stenfredd/movies/ui/home/HomeViewModel.kt @@ -0,0 +1,194 @@ +package ru.stenfredd.movies.ui.home + +import android.content.Context +import androidx.compose.runtime.Immutable +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import dagger.hilt.android.lifecycle.HiltViewModel +import dagger.hilt.android.qualifiers.ApplicationContext +import kotlinx.coroutines.async +import kotlinx.coroutines.awaitAll +import kotlinx.coroutines.coroutineScope +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch +import org.jellyfin.sdk.model.api.BaseItemDto +import org.jellyfin.sdk.model.api.BaseItemKind +import org.jellyfin.sdk.model.api.ImageType +import ru.stenfredd.movies.ui.Library +import ru.stenfredd.movies.ui.Screen +import ru.stenfredd.movies.ui.components.FeaturedModel +import ru.stenfredd.movies.ui.components.PosterModel +import ru.stenfredd.movies.ui.components.WideModel +import ru.stenfredd.movies.ui.theme.AppDimens +import timber.log.Timber +import java.time.LocalDateTime +import javax.inject.Inject +import kotlin.math.roundToInt + +@Immutable +data class HomeRow(val key: String, val title: String, val count: Int, val items: List) + +@Immutable +data class HomeState( + val loading: Boolean = true, + val error: String? = null, + val featured: FeaturedModel? = null, + val continueItems: List = emptyList(), + val continueCount: Int = 0, + val rows: List = emptyList(), +) + +/** + * Home screen data. Stage 1 version straight on top of [Library]; stage 2 moves loading into repositories. + */ +@HiltViewModel +class HomeViewModel @Inject constructor( + private val library: Library, + @ApplicationContext context: Context, +) : ViewModel() { + private val density = context.resources.displayMetrics.density + private val _state = MutableStateFlow(HomeState()) + val state: StateFlow = _state.asStateFlow() + + /** Card key → where it leads. */ + private val targets = HashMap() + + init { load() } + + fun target(key: String): Screen? = targets[key] + + private fun load() = viewModelScope.launch { + val started = System.nanoTime() + runCatching { + coroutineScope { + val resume = async { library.resume() } + val latest = async { library.latest() } + val views = library.views() + val perView = views.map { v -> async { v to library.libraryItems(v.id) } } + val resumeItems = resume.await() + val rows = buildList { + val l = latest.await() + if (l.isNotEmpty()) add(HomeRow("latest", "Недавно добавлено", l.size, l.map { poster(it, "latest") })) + perView.awaitAll().forEach { (v, r) -> + val (items, total) = r + if (items.isNotEmpty()) add(HomeRow("lib-${v.id}", v.name.orEmpty(), total, items.map { poster(it, "lib-${v.id}") })) + } + } + HomeState( + loading = false, + featured = resumeItems.firstOrNull()?.let(::featured), + continueItems = resumeItems.drop(1).take(4).map(::wide), + continueCount = resumeItems.size, + rows = rows, + ) + } + }.onSuccess { + _state.value = it + Timber.i("Home loaded in %d ms", (System.nanoTime() - started) / 1_000_000) + }.onFailure { + Timber.w(it, "Home load failed") + _state.value = HomeState(loading = false, error = it.message ?: it.toString()) + } + } + + private fun px(dp: Float) = (dp * density).roundToInt() + + private fun poster(item: BaseItemDto, row: String): PosterModel { + val key = "$row/${item.id}" + targets[key] = item.target() + // A single new episode comes as the episode itself: show it as its series, poster included. + val episode = item.type == BaseItemKind.EPISODE + val imageId = if (episode) item.seriesId else item.id + val tag = if (episode) item.seriesPrimaryImageTag else item.imageTags?.get(ImageType.PRIMARY) + return PosterModel( + key = key, + title = (if (episode) item.seriesName else null) ?: item.name.orEmpty(), + caption = if (episode) { + listOfNotNull(item.parentIndexNumber?.let { "S$it" }, item.indexNumber?.let { "E$it" }).joinToString(" · ").ifEmpty { null } + } else { + listOfNotNull(item.productionYear?.toString(), item.communityRating?.let { "★ %.1f".format(it) }).joinToString(" · ").ifEmpty { null } + }, + imageUrl = if (imageId != null && tag != null) library.imageUrl(imageId, ImageType.PRIMARY, tag, px(AppDimens.POSTER_W.toFloat()), px(AppDimens.POSTER_H.toFloat())) else null, + badge = item.formatBadge(), + progress = item.userData?.playedPercentage?.takeIf { it > 0 && item.type != BaseItemKind.SERIES }?.let { (it / 100).toFloat() }, + isNew = item.dateCreated?.isAfter(LocalDateTime.now().minusDays(NEW_DAYS)) == true, + watched = item.userData?.played == true, + ) + } + + private fun wide(item: BaseItemDto): WideModel { + val key = "continue/${item.id}" + targets[key] = Screen.Detail(item.id) + return WideModel( + key = key, + title = item.seriesName ?: item.name.orEmpty(), + subtitle = listOfNotNull(item.episodeLabel() ?: item.productionYear?.toString(), item.remaining()).joinToString(" · "), + imageUrl = item.landscapeImage(px(AppDimens.WIDE_W.toFloat()), px(AppDimens.WIDE_H.toFloat())), + progress = item.progress(), + ) + } + + private fun featured(item: BaseItemDto): FeaturedModel { + val key = "continue/${item.id}" + targets[key] = Screen.Detail(item.id) + val isEpisode = item.type == BaseItemKind.EPISODE + return FeaturedModel( + key = key, + label = if (isEpisode) "СЕРИАЛ" else "ФИЛЬМ", + title = item.seriesName ?: item.name.orEmpty(), + subtitle = if (isEpisode) { + item.episodeLabel().orEmpty() + } else { + listOfNotNull(item.productionYear?.toString(), item.genres?.take(2)?.joinToString(", ")?.ifEmpty { null }).joinToString(" · ") + }, + description = item.overview, + imageUrl = item.backdrop(px(410f), px(230.5f)) ?: item.landscapeImage(px(410f), px(230.5f)), + progress = item.progress() ?: 0f, + remaining = item.remaining(), + ) + } + + private fun BaseItemDto.progress() = userData?.playedPercentage?.let { (it / 100).toFloat() } + + private fun BaseItemDto.remaining(): String? { + val ticks = runTimeTicks ?: return null + val left = ticks * (1 - (progress() ?: 0f)) / 600_000_000 + return "осталось ${left.roundToInt()} мин" + } + + private fun BaseItemDto.episodeLabel(): String? = + if (type == BaseItemKind.EPISODE && parentIndexNumber != null && indexNumber != null) "S$parentIndexNumber · E$indexNumber · $name" else null + + private fun BaseItemDto.backdrop(w: Int, h: Int): String? { + backdropImageTags?.firstOrNull()?.let { return library.imageUrl(id, ImageType.BACKDROP, it, w, h) } + val parent = parentBackdropItemId ?: return null + return parentBackdropImageTags?.firstOrNull()?.let { library.imageUrl(parent, ImageType.BACKDROP, it, w, h) } + } + + /** Episode still, else the item's or series' backdrop. */ + private fun BaseItemDto.landscapeImage(w: Int, h: Int): String? { + if (type == BaseItemKind.EPISODE) imageTags?.get(ImageType.PRIMARY)?.let { return library.imageUrl(id, ImageType.PRIMARY, it, w, h) } + return backdrop(w, h) + } + + private fun BaseItemDto.formatBadge(): String? { + val w = width ?: return null + return when { + w >= 3200 -> "4K" + w >= 1800 -> "1080p" + w >= 1200 -> "720p" + else -> null + } + } + + private fun BaseItemDto.target(): Screen = when (type) { + BaseItemKind.SERIES, BaseItemKind.SEASON, BaseItemKind.BOX_SET, BaseItemKind.FOLDER, BaseItemKind.COLLECTION_FOLDER -> Screen.Items(id, name.orEmpty()) + else -> Screen.Detail(id) + } + + private companion object { + const val NEW_DAYS = 14L + } +} diff --git a/app/src/main/kotlin/ru/stenfredd/movies/ui/shell/Shell.kt b/app/src/main/kotlin/ru/stenfredd/movies/ui/shell/Shell.kt new file mode 100644 index 0000000..68502c1 --- /dev/null +++ b/app/src/main/kotlin/ru/stenfredd/movies/ui/shell/Shell.kt @@ -0,0 +1,271 @@ +package ru.stenfredd.movies.ui.shell + +import androidx.activity.compose.BackHandler +import androidx.compose.animation.core.animateFloatAsState +import androidx.compose.animation.core.tween +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.text.BasicText +import androidx.compose.runtime.Composable +import androidx.compose.runtime.State +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.drawBehind +import androidx.compose.ui.focus.FocusRequester +import androidx.compose.foundation.focusGroup +import androidx.compose.ui.focus.focusRequester +import androidx.compose.ui.focus.focusRestorer +import androidx.compose.ui.focus.onFocusChanged +import androidx.compose.ui.geometry.CornerRadius +import androidx.compose.ui.geometry.Offset +import androidx.compose.ui.geometry.Size +import androidx.compose.ui.graphics.Brush +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.lerp +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.util.lerp +import androidx.compose.ui.graphics.graphicsLayer +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import androidx.compose.ui.zIndex +import kotlinx.coroutines.delay +import ru.stenfredd.movies.ui.components.AppIcon +import ru.stenfredd.movies.ui.components.Icon +import ru.stenfredd.movies.ui.theme.AppColors +import ru.stenfredd.movies.ui.theme.AppDimens +import ru.stenfredd.movies.ui.theme.AppType +import java.time.LocalTime +import java.time.format.DateTimeFormatter + +enum class Tab(val label: String, val icon: AppIcon) { + Search("Поиск", AppIcon.Search), + Home("Главная", AppIcon.Home), + Library("Медиатека", AppIcon.Library), + Favorites("Избранное", AppIcon.Heart), +} + +/** + * Root screens (the tabs): side rail on the left, clock on the top right, content behind. + * The rail overlaps the content and widens over it when focused, so opening it never relays out the content. + * + * Back on a tab moves focus to the rail; Back on the rail leaves the app. + */ +@Composable +fun Shell( + current: Tab, + userName: String, + onTab: (Tab) -> Unit, + onProfile: () -> Unit, + content: @Composable () -> Unit, +) { + var railFocused by remember { mutableStateOf(false) } + val railEntry = remember { FocusRequester() } + BackHandler(enabled = !railFocused) { runCatching { railEntry.requestFocus() } } + + Box(Modifier.fillMaxSize()) { + Box(Modifier.fillMaxSize().padding(start = 32.dp).focusGroup()) { content() } + Rail( + current = current, + userName = userName, + entry = railEntry, + onFocusChange = { railFocused = it }, + onTab = onTab, + onProfile = onProfile, + modifier = Modifier.zIndex(1f), + ) + Clock(Modifier.align(Alignment.TopEnd).padding(top = 26.dp, end = AppDimens.CONTENT_START.dp)) + } +} + +/** + * The rail's layout width switches once when it opens or closes; the visible animation (panel width, item + * highlight, labels, edge shadow) runs in the draw phase only, so a frame of it re-records the rail and nothing else. + */ +@Composable +private fun Rail( + current: Tab, + userName: String, + entry: FocusRequester, + onFocusChange: (Boolean) -> Unit, + onTab: (Tab) -> Unit, + onProfile: () -> Unit, + modifier: Modifier = Modifier, +) { + var open by remember { mutableStateOf(false) } + val progress = animateFloatAsState(if (open) 1f else 0f, tween(200), label = "rail") + + Column( + modifier + .fillMaxHeight() + .width(if (open) AppDimens.RAIL_OPEN.dp else AppDimens.RAIL_COLLAPSED.dp) + .drawBehind { + val p = progress.value + val w = lerp(AppDimens.RAIL_COLLAPSED.dp.toPx(), AppDimens.RAIL_OPEN.dp.toPx(), p) + drawRect(lerp(AppColors.Rail, AppColors.RailOpen, p), size = Size(w, size.height)) + drawRect(AppColors.BorderSubtle, topLeft = Offset(w - 1f, 0f), size = Size(1f, size.height)) + // Edge shadow of the open rail over the content (`30px 0 80px rgba(0,0,0,.6)`), a narrow strip. + if (p > 0f) { + val shadow = 40.dp.toPx() + drawRect( + Brush.horizontalGradient(listOf(Color.Black.copy(alpha = 0.5f * p), Color.Transparent), startX = w, endX = w + shadow), + topLeft = Offset(w, 0f), + size = Size(shadow, size.height), + ) + } + } + .onFocusChanged { + open = it.hasFocus + onFocusChange(it.hasFocus) + } + .focusRestorer(entry) + .focusGroup() + .padding(horizontal = 9.dp, vertical = 28.dp), + verticalArrangement = Arrangement.spacedBy(5.dp), + ) { + Logo(progress, Modifier.padding(start = 13.dp, bottom = 20.dp)) + for (tab in Tab.entries) { + RailItem( + tab = tab, + selected = tab == current, + progress = progress, + onClick = { if (tab != current) onTab(tab) }, + modifier = if (tab == current) Modifier.focusRequester(entry) else Modifier, + ) + } + Spacer(Modifier.weight(1f)) + ProfileItem(userName, progress, onProfile) + } +} + +/** Neutral placeholder logo until the app has a name: a glowing dot and the working title. */ +@Composable +private fun Logo(progress: State, modifier: Modifier = Modifier) { + Row(modifier.height(32.dp), verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(10.dp)) { + Box( + Modifier + .size(11.dp) + .drawBehind { + drawCircle(AppColors.AccentStrong.copy(alpha = 0.35f), radius = size.minDimension) + drawCircle(AppColors.AccentStrong) + }, + ) + BasicText( + "movies", + Modifier.graphicsLayer { alpha = progress.value }, + style = AppType.Rail.copy(fontSize = AppType.Section.fontSize, fontWeight = FontWeight.Bold), + maxLines = 1, + softWrap = false, + ) + } +} + +/** Focused item fill, growing with the rail panel. */ +private fun Modifier.railHighlight(focused: Boolean, color: Color, progress: State) = drawBehind { + if (!focused) return@drawBehind + val collapsed = (AppDimens.RAIL_COLLAPSED - 18).dp.toPx() + val w = lerp(collapsed, size.width, progress.value) + drawRoundRect(color, size = Size(w, size.height), cornerRadius = CornerRadius(8.dp.toPx())) +} + +@Composable +private fun RailItem(tab: Tab, selected: Boolean, progress: State, onClick: () -> Unit, modifier: Modifier = Modifier) { + var focused by remember { mutableStateOf(false) } + val content = when { + focused -> AppColors.OnFocusFill + selected -> AppColors.Text + else -> AppColors.TextDim + } + Box(modifier.fillMaxWidth().height(36.dp)) { + // Selected tab marker on the rail's left edge, visible while the rail is closed. + if (selected) { + Box( + Modifier + .padding(top = 9.dp, bottom = 9.dp) + .width(2.dp) + .fillMaxHeight() + .graphicsLayer { + translationX = -9.dp.toPx() + alpha = 1f - progress.value + } + .background(AppColors.Accent, RoundedCornerShape(1.dp)), + ) + } + Row( + Modifier + .fillMaxSize() + .railHighlight(focused, AppColors.FocusFill, progress) + .onFocusChanged { focused = it.isFocused } + .clickable(interactionSource = null, indication = null, onClick = onClick) + .padding(horizontal = 11.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(11.dp), + ) { + Icon(tab.icon, content, Modifier.size(16.dp)) + BasicText( + tab.label, + Modifier.graphicsLayer { alpha = progress.value }, + style = AppType.Rail.copy(color = content), + maxLines = 1, + softWrap = false, + ) + } + } +} + +@Composable +private fun ProfileItem(userName: String, progress: State, onClick: () -> Unit) { + var focused by remember { mutableStateOf(false) } + Row( + Modifier + .fillMaxWidth() + .height(38.dp) + .railHighlight(focused, AppColors.SurfaceFocused, progress) + .onFocusChanged { focused = it.isFocused } + .clickable(interactionSource = null, indication = null, onClick = onClick) + .padding(horizontal = 7.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(9.dp), + ) { + Box(Modifier.size(24.dp).background(AppColors.SelectedBorder, CircleShape), contentAlignment = Alignment.Center) { + BasicText(userName.take(1).uppercase(), style = AppType.CardTitle.copy(fontSize = AppType.PosterTitle.fontSize)) + } + Column(Modifier.graphicsLayer { alpha = progress.value }) { + BasicText(userName, style = AppType.CardTitle.copy(fontSize = AppType.Rail.fontSize), maxLines = 1, overflow = TextOverflow.Ellipsis, softWrap = false) + BasicText("сменить профиль", style = AppType.MonoCaption.copy(fontSize = AppType.MonoBadge.fontSize), maxLines = 1, softWrap = false) + } + } +} + +/** HH:mm, recomposes once a minute and only itself. */ +@Composable +fun Clock(modifier: Modifier = Modifier) { + var now by remember { mutableStateOf(LocalTime.now()) } + LaunchedEffect(Unit) { + while (true) { + delay(60_000L - (System.currentTimeMillis() % 60_000L)) + now = LocalTime.now() + } + } + BasicText(now.format(ClockFormat), modifier, style = AppType.Clock) +} + +private val ClockFormat = DateTimeFormatter.ofPattern("HH:mm") diff --git a/app/src/main/kotlin/ru/stenfredd/movies/ui/theme/Theme.kt b/app/src/main/kotlin/ru/stenfredd/movies/ui/theme/Theme.kt new file mode 100644 index 0000000..257aa40 --- /dev/null +++ b/app/src/main/kotlin/ru/stenfredd/movies/ui/theme/Theme.kt @@ -0,0 +1,15 @@ +package ru.stenfredd.movies.ui.theme + +import androidx.compose.runtime.Composable +import androidx.tv.material3.MaterialTheme +import androidx.tv.material3.darkColorScheme + +/** + * The app background is the window background (`values/themes.xml`), drawn once + * per frame by the system; Compose screens don't paint a background of their own unless they need a different one. + * The tv-material theme is only for the old prototype screens; new screens use [AppColors]/[AppType]. + */ +@Composable +fun AppTheme(content: @Composable () -> Unit) { + MaterialTheme(colorScheme = darkColorScheme(), content = content) +} diff --git a/app/src/main/kotlin/ru/stenfredd/movies/ui/theme/Tokens.kt b/app/src/main/kotlin/ru/stenfredd/movies/ui/theme/Tokens.kt new file mode 100644 index 0000000..63b2673 --- /dev/null +++ b/app/src/main/kotlin/ru/stenfredd/movies/ui/theme/Tokens.kt @@ -0,0 +1,117 @@ +package ru.stenfredd.movies.ui.theme + +import androidx.compose.runtime.Immutable +import androidx.compose.ui.graphics.Brush +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.Font +import androidx.compose.ui.text.font.FontFamily +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.LineHeightStyle +import androidx.compose.ui.unit.em +import androidx.compose.ui.unit.sp +import ru.stenfredd.movies.R + +/** + * Design tokens from `design/…/Jellyfin TV.dc.html`. The mockup is drawn at 1920×1080 px, + * the TV UI is 960×540 dp, so every size here is the mockup's px / 2. + */ +object AppColors { + val Background = Color(0xFF0A0B10) + val BackgroundDeep = Color(0xFF050609) + val DotGrid = Color(0xFF1B1E2B) + + val Surface = Color(0xFF12141C) + val SurfaceRaised = Color(0xFF151824) + val SurfaceFocused = Color(0xFF1D2031) + val Rail = Color(0xB30A0B10) + val RailOpen = Color(0xFF0D0E16) + + val Border = Color(0xFF2A2E40) + val BorderSubtle = Color(0xFF1D2030) + val Hairline = Color(0x14FFFFFF) + + val Text = Color(0xFFECEEF6) + val TextSecondary = Color(0xFFC3C7DD) + val TextMuted = Color(0xFFA3A8C3) + val TextDim = Color(0xFF8B90AD) + val TextFaint = Color(0xFF5F6582) + + val Accent = Color(0xFFA594FF) + val AccentStrong = Color(0xFF8F6BFF) + val AccentGlow = Color(0xFF7C5CFF) + val FocusFill = Color(0xFFECE9FF) + val OnFocusFill = Color(0xFF0B0C12) + val Selected = Color(0xFF1D1A3D) + val SelectedBorder = Color(0xFF5F55E6) + + val Green = Color(0xFF7EE0A3) + val Pink = Color(0xFFFF9CF9) + val Yellow = Color(0xFFFFD166) + val Blue = Color(0xFF64B5F6) + val Orange = Color(0xFFFFB454) + val Red = Color(0xFFFF6E6E) + val NewBadge = Color(0xFF4D7CFF) + + val PrimaryGradient = Brush.linearGradient(listOf(Color(0xFF4D7CFF), Color(0xFF8A5CFF))) + val ProgressGradient = Brush.horizontalGradient(listOf(Color(0xFF4D8BFF), Color(0xFF9B6BFF))) + val ProgressTrack = Color(0x24FFFFFF) +} + +object AppFonts { + val Onest = FontFamily( + Font(R.font.onest_400, FontWeight.Normal), + Font(R.font.onest_500, FontWeight.Medium), + Font(R.font.onest_600, FontWeight.SemiBold), + Font(R.font.onest_700, FontWeight.Bold), + Font(R.font.onest_800, FontWeight.ExtraBold), + ) + val Mono = FontFamily( + Font(R.font.jetbrains_mono_400, FontWeight.Normal), + Font(R.font.jetbrains_mono_500, FontWeight.Medium), + Font(R.font.jetbrains_mono_600, FontWeight.SemiBold), + ) +} + +/** Text styles used by the mockup, named by role. */ +@Immutable +object AppType { + private val base = TextStyle( + fontFamily = AppFonts.Onest, + color = AppColors.Text, + lineHeightStyle = LineHeightStyle(LineHeightStyle.Alignment.Center, LineHeightStyle.Trim.Both), + ) + private val mono = base.copy(fontFamily = AppFonts.Mono) + + val Hero = base.copy(fontSize = 30.sp, fontWeight = FontWeight.ExtraBold, letterSpacing = (-0.02).em) + val Display = base.copy(fontSize = 40.sp, fontWeight = FontWeight.ExtraBold, letterSpacing = (-0.02).em) + val Section = base.copy(fontSize = 15.sp, fontWeight = FontWeight.SemiBold) + val CardTitle = base.copy(fontSize = 13.sp, fontWeight = FontWeight.Bold) + val PosterTitle = base.copy(fontSize = 11.5.sp, fontWeight = FontWeight.SemiBold) + val Body = base.copy(fontSize = 11.sp, lineHeight = 16.sp, color = AppColors.TextMuted) + val BodyLarge = base.copy(fontSize = 13.sp, color = Color(0xFFD9DCEC)) + val Button = base.copy(fontSize = 11.5.sp, fontWeight = FontWeight.SemiBold) + val Rail = base.copy(fontSize = 13.5.sp, fontWeight = FontWeight.SemiBold) + + val MonoCount = mono.copy(fontSize = 10.sp, color = AppColors.TextFaint) + val MonoCaption = mono.copy(fontSize = 9.sp, color = AppColors.TextDim) + val MonoMeta = mono.copy(fontSize = 9.5.sp, color = AppColors.TextSecondary) + val MonoLabel = mono.copy(fontSize = 10.sp, letterSpacing = 0.12.em, color = AppColors.Accent) + val MonoBadge = mono.copy(fontSize = 8.sp, fontWeight = FontWeight.SemiBold, letterSpacing = 0.06.em) + val Clock = mono.copy(fontSize = 13.sp, color = AppColors.TextMuted) +} + +/** Layout constants (dp), mockup px / 2. */ +object AppDimens { + const val RAIL_COLLAPSED = 56 + const val RAIL_OPEN = 190 + /** Content starts at 64 px + 120 px padding in the mockup. */ + const val CONTENT_START = 60 + const val CONTENT_TOP = 44 + const val ROW_GAP = 14 + const val SECTION_GAP = 22 + const val POSTER_W = 110 + const val POSTER_H = 165 + const val WIDE_W = 190 + const val WIDE_H = 107 +} diff --git a/app/src/main/res/drawable/banner.xml b/app/src/main/res/drawable/banner.xml index 6cd1f3b..41920ec 100644 --- a/app/src/main/res/drawable/banner.xml +++ b/app/src/main/res/drawable/banner.xml @@ -1,9 +1,12 @@ + - - + + + + diff --git a/app/src/main/res/font/jetbrains_mono_400.ttf b/app/src/main/res/font/jetbrains_mono_400.ttf new file mode 100644 index 0000000000000000000000000000000000000000..4e6ef0dfc553ee50efe5c357ddebab06c2dc243f GIT binary patch literal 60192 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ʦx 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/font/jetbrains_mono_600.ttf b/app/src/main/res/font/jetbrains_mono_600.ttf new file mode 100644 index 0000000000000000000000000000000000000000..b1fba5edc0f4e057365a45761b6be79bbd3333a8 GIT binary patch literal 60108 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 z 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/font/onest_400.ttf b/app/src/main/res/font/onest_400.ttf new file mode 100644 index 0000000000000000000000000000000000000000..d973d2b5c32dee1a17b70c480fcf90e5be58e128 GIT binary patch literal 46336 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 PTSbe1T2a~Na(Vp!5T8lc literal 0 HcmV?d00001 diff --git a/app/src/main/res/font/onest_700.ttf b/app/src/main/res/font/onest_700.ttf new file mode 100644 index 0000000000000000000000000000000000000000..7a14fcb7eb64c3e39a13fec4945941d6f2457565 GIT binary patch literal 46420 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/font/onest_800.ttf b/app/src/main/res/font/onest_800.ttf new file mode 100644 index 0000000000000000000000000000000000000000..1eb163863f9daeadc681473ec7f083372be1d733 GIT binary patch literal 46432 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 OM2mk$(S>%IJpMncglw_^ literal 0 HcmV?d00001 diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml new file mode 100644 index 0000000..9cbbd6f --- /dev/null +++ b/app/src/main/res/values/colors.xml @@ -0,0 +1,4 @@ + + + #0A0B10 + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7eb8492..5503312 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,4 +1,5 @@ - Movies (прототип) + + Movies diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml new file mode 100644 index 0000000..d3f9a2f --- /dev/null +++ b/app/src/main/res/values/themes.xml @@ -0,0 +1,10 @@ + + + + + diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index b9f4464..784070f 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -18,6 +18,8 @@ libvlc = "3.7.7" jellyfin-sdk = "1.9.2" coil = "3.6.3" timber = "5.0.1" +profileinstaller = "1.4.1" +navigation3 = "1.2.0" okhttp = "5.5.0" slf4j = "2.0.20" @@ -48,6 +50,10 @@ jellyfin-sdk = { module = "org.jellyfin.sdk:jellyfin-core", version.ref = "jelly coil-compose = { module = "io.coil-kt.coil3:coil-compose", version.ref = "coil" } coil-network-okhttp = { module = "io.coil-kt.coil3:coil-network-okhttp", version.ref = "coil" } okhttp = { module = "com.squareup.okhttp3:okhttp", version.ref = "okhttp" } +androidx-profileinstaller = { module = "androidx.profileinstaller:profileinstaller", version.ref = "profileinstaller" } +navigation3-runtime = { module = "androidx.navigation3:navigation3-runtime", version.ref = "navigation3" } +navigation3-ui = { module = "androidx.navigation3:navigation3-ui", version.ref = "navigation3" } +androidx-lifecycle-viewmodel-navigation3 = { module = "androidx.lifecycle:lifecycle-viewmodel-navigation3", version.ref = "lifecycle" } timber = { module = "com.jakewharton.timber:timber", version.ref = "timber" } slf4j-api = { module = "org.slf4j:slf4j-api", version.ref = "slf4j" } diff --git a/tools/tv/env.sh b/tools/tv/env.sh index 33a21f0..bb878db 100755 --- a/tools/tv/env.sh +++ b/tools/tv/env.sh @@ -29,3 +29,15 @@ for s in json.load(sys.stdin): aout() { $A shell dumpsys media.audio_flinger | grep -E "^Output thread|Total writes|Tracks of which"; } # Журнал локального прокси VLC (диапазоны, кэш, сколько скачано с сервера) vproxy() { $A logcat -d | grep "VLC proxy" | sed -E 's/^[0-9-]+ ([0-9:.]+).*VLC proxy/\1/' | cut -c1-170; } +# Замер плавности интерфейса (только на release-сборке!): ui_bench [right|down] [N] +# Листает ряд (или экран) вперёд и назад N раз и печатает перцентили кадра и GPU, затем разбивку по фазам. +ui_bench() { + local dir=${1:-right} n=${2:-8} back P=ru.stenfredd.movies + [ "$dir" = right ] && back=left || back=up + $A shell dumpsys gfxinfo $P reset >/dev/null + for i in $(seq 1 $n); do $A shell input keyevent DPAD_${dir^^}; sleep 0.35; done + for i in $(seq 1 $n); do $A shell input keyevent DPAD_${back^^}; sleep 0.35; done + $A shell dumpsys gfxinfo $P | grep -E 'Janky frames:|50th percentile|90th percentile|99th percentile|50th gpu|90th gpu' + $A shell dumpsys gfxinfo $P framestats | python3 tools/tv/framestats.py +} +install_release() { ./gradlew :app:assembleRelease -q && $A install -r app/build/outputs/apk/release/app-release.apk; } diff --git a/tools/tv/framestats.py b/tools/tv/framestats.py new file mode 100644 index 0000000..ef7a09f --- /dev/null +++ b/tools/tv/framestats.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python3 +# Разбивка времени кадра по фазам из `adb shell dumpsys gfxinfo <пакет> framestats` (stdin), см. ui_bench в env.sh. +import sys, statistics as st +lines=sys.stdin.read().splitlines() +hdr=None; rows=[] +for l in lines: + if l.startswith('Flags,'): hdr=l.strip().strip(',').split(','); continue + if hdr and l and l[0].isdigit(): + v=l.strip().strip(',').split(',') + if len(v)>=len(hdr): rows.append(dict(zip(hdr,map(int,v[:len(hdr)])))) + if l.startswith('---PROFILEDATA---') and rows: pass +rows=[r for r in rows if r['Flags']==0] +def ms(a,b): return [(r[b]-r[a])/1e6 for r in rows if r[a]>0 and r[b]>0] +def p(x): + x=sorted(x); return f"p50 {x[len(x)//2]:.1f} p90 {x[int(len(x)*.9)]:.1f} max {x[-1]:.1f}" if x else "-" +print("frames",len(rows)) +print("total ", p(ms('IntendedVsync','FrameCompleted'))) +print("input+anim ", p(ms('HandleInputStart','PerformTraversalsStart'))) +print("traversal ", p(ms('PerformTraversalsStart','DrawStart'))) +print("record draw", p(ms('DrawStart','SyncQueued'))) +print("sync ", p(ms('SyncStart','IssueDrawCommandsStart'))) +print("issue cmds ", p(ms('IssueDrawCommandsStart','SwapBuffers'))) +print("swap ", p(ms('SwapBuffers','FrameCompleted'))) +if 'GpuCompleted' in hdr: print("gpu ", p(ms('IssueDrawCommandsStart','GpuCompleted')))