From ac4cf3274648dc12526c4ba4b2cf683d848aac28 Mon Sep 17 00:00:00 2001 From: ponzischeme89 Date: Sat, 22 Aug 2026 06:29:31 +1200 Subject: [PATCH] 0.2.98 --- .../e76e2be01f9477bf3dae4d4f5582546f.finished | 1 + .../e76e2be01f9477bf3dae4d4f5582546f.lock | Bin 0 -> 1 bytes .../escalated/hsperfdata_Admin/25704 | Bin 0 -> 65536 bytes .../escalated/hsperfdata_Admin/4000 | Bin 0 -> 65536 bytes .../jna-63116079/jna4079305537621798898.dll | Bin 0 -> 246784 bytes .../jna-63116079/jna9392113226132068809.dll | Bin 0 -> 246784 bytes .../jna-63116079/jna9392113226132068809.dll.x | 0 ...ompiler-in-emby-14545020421804070614.alive | 0 ...tlin-daemon.2026-08-22.06-26-48-841.00.log | 12 + ...-daemon.2026-08-22.06-26-48-841.00.log.lck | 0 CHANGELOG.md | 70 +++ CLAUDE.md | 24 +- app/build.gradle.kts | 4 +- app/src/main/AndroidManifest.xml | 22 + .../com/ponzischeme89/memby/ServiceLocator.kt | 7 + .../memby/data/EmbyRepository.kt | 3 + .../data/analytics/PlaybackEntryPoint.kt | 1 + .../memby/tvhome/HomeChannelPublisher.kt | 26 + .../memby/tvhome/TvDeepLinkActivity.kt | 61 ++ .../ponzischeme89/memby/tvhome/TvDeepLinks.kt | 23 + .../memby/tvhome/TvHomeIntegrationService.kt | 141 +++++ .../memby/tvhome/TvHomeProgram.kt | 69 +++ .../memby/tvhome/WatchNextPublisher.kt | 150 +++++ .../ponzischeme89/memby/ui/HomeOverlays.kt | 2 +- .../com/ponzischeme89/memby/ui/HomeScreen.kt | 72 +++ .../memby/ui/ResumableMediaCard.kt | 4 +- .../components/media/ContinueWatchingCard.kt | 15 + .../ui/components/media/MediaResultCard.kt | 214 +++++++ .../ponzischeme89/memby/ui/home/HomeRow.kt | 131 ++++- .../memby/ui/home/HomeRowBrowse.kt | 59 ++ .../memby/ui/requests/RequestCards.kt | 190 +------ .../memby/ui/search/SearchScreen.kt | 525 +++--------------- .../memby/ui/search/SearchViewModel.kt | 14 +- .../ui/search/components/SearchGenres.kt | 117 ++++ .../ui/search/components/SearchResults.kt | 257 +++++++++ .../memby/tvhome/TvHomeProgramTest.kt | 95 ++++ .../memby/ui/HomeRowBrowseTest.kt | 61 ++ server/internal/buildinfo/VERSION | 2 +- 38 files changed, 1723 insertions(+), 649 deletions(-) create mode 100644 .tmp-gradle-run/escalated/gradle-run/e76e2be01f9477bf3dae4d4f5582546f.finished create mode 100644 .tmp-gradle-run/escalated/gradle-run/e76e2be01f9477bf3dae4d4f5582546f.lock create mode 100644 .tmp-gradle-run/escalated/hsperfdata_Admin/25704 create mode 100644 .tmp-gradle-run/escalated/hsperfdata_Admin/4000 create mode 100644 .tmp-gradle-run/escalated/jna-63116079/jna4079305537621798898.dll create mode 100644 .tmp-gradle-run/escalated/jna-63116079/jna9392113226132068809.dll create mode 100644 .tmp-gradle-run/escalated/jna-63116079/jna9392113226132068809.dll.x create mode 100644 .tmp-gradle-run/escalated/kotlin-compiler-in-emby-14545020421804070614.alive create mode 100644 .tmp-gradle-run/escalated/kotlin-daemon.2026-08-22.06-26-48-841.00.log create mode 100644 .tmp-gradle-run/escalated/kotlin-daemon.2026-08-22.06-26-48-841.00.log.lck create mode 100644 app/src/main/java/com/ponzischeme89/memby/tvhome/HomeChannelPublisher.kt create mode 100644 app/src/main/java/com/ponzischeme89/memby/tvhome/TvDeepLinkActivity.kt create mode 100644 app/src/main/java/com/ponzischeme89/memby/tvhome/TvDeepLinks.kt create mode 100644 app/src/main/java/com/ponzischeme89/memby/tvhome/TvHomeIntegrationService.kt create mode 100644 app/src/main/java/com/ponzischeme89/memby/tvhome/TvHomeProgram.kt create mode 100644 app/src/main/java/com/ponzischeme89/memby/tvhome/WatchNextPublisher.kt create mode 100644 app/src/main/java/com/ponzischeme89/memby/ui/components/media/MediaResultCard.kt create mode 100644 app/src/main/java/com/ponzischeme89/memby/ui/home/HomeRowBrowse.kt create mode 100644 app/src/main/java/com/ponzischeme89/memby/ui/search/components/SearchGenres.kt create mode 100644 app/src/main/java/com/ponzischeme89/memby/ui/search/components/SearchResults.kt create mode 100644 app/src/test/java/com/ponzischeme89/memby/tvhome/TvHomeProgramTest.kt create mode 100644 app/src/test/java/com/ponzischeme89/memby/ui/HomeRowBrowseTest.kt diff --git a/.tmp-gradle-run/escalated/gradle-run/e76e2be01f9477bf3dae4d4f5582546f.finished b/.tmp-gradle-run/escalated/gradle-run/e76e2be01f9477bf3dae4d4f5582546f.finished new file mode 100644 index 0000000..2805836 --- /dev/null +++ b/.tmp-gradle-run/escalated/gradle-run/e76e2be01f9477bf3dae4d4f5582546f.finished @@ -0,0 +1 @@ +e76e2be01f9477bf3dae4d4f5582546f diff --git a/.tmp-gradle-run/escalated/gradle-run/e76e2be01f9477bf3dae4d4f5582546f.lock b/.tmp-gradle-run/escalated/gradle-run/e76e2be01f9477bf3dae4d4f5582546f.lock new file mode 100644 index 0000000000000000000000000000000000000000..f76dd238ade08917e6712764a16a22005a50573d GIT binary patch literal 1 IcmZPo000310RR91 literal 0 HcmV?d00001 diff --git a/.tmp-gradle-run/escalated/hsperfdata_Admin/25704 b/.tmp-gradle-run/escalated/hsperfdata_Admin/25704 new file mode 100644 index 0000000000000000000000000000000000000000..92ddd7b5fe33141eb8f8b3c4b11ae5483f727669 GIT binary patch literal 65536 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 P0Vco%m;e(v8G-);^UAU} literal 0 HcmV?d00001 diff --git a/.tmp-gradle-run/escalated/hsperfdata_Admin/4000 b/.tmp-gradle-run/escalated/hsperfdata_Admin/4000 new file mode 100644 index 0000000000000000000000000000000000000000..8e7115adc02b0e439ce93be043d67849325a1b0b GIT binary patch literal 65536 zcmeHPYm6kAv4N=YIFxb8nq{d;aRbUwLI|SzCH-N0ZlwK2w)v39tW* zyMg-w+;m;gjxASF1|zrPhm~8wk!#-Cb-Ruc+MXN8I>+Vf0=ONa;7T#Bi88B?^eg(d zJvS7tC9I2{xxW>LVlWJ$`g>#iTzk)rLfa8HjD0a00=FFFs9jmTC-Qpt41XW>-@T}w z%U)=AZ8M?fSTSy8g3n8yd-gCi+%N*H6ylb$IMWwKD6S9Ah@R~}X%7TJp1JXhkNoCR zz8?y4XI(2nY1*}$b8!cQUDpnGJXfSJ?ca;^Ek*uv+c+>PVIO8%K_v(cKNMEnEbadI zjl%!Z(hBjf;2isa8us0BeWjmKpYRj)_k^(@*MCo3&edZXV&J*jyNdK^D_Q>!jIJ1Z zwi~uE4iYLJ_{<|DvoC$0Bk!(5I~>2>}FIdeB^N>w*VR82tFSFz>ys3PoyvC8$Jb` z39S*9UYoe*;IB>Bp6`$4vA?9vJ#!SIv5k+Olp#xLr?x!yORAqVGeVGc=`{)vk1Wl6;dKgkn|d z{#w83N<9nXDuHmin)Zo*{T)f-TpWgu-8~v>{JDoeEpbh}j{O7Ul;k8lNIO$ptWm@LQGFEPmS?$tA?Ab!qO*c3PrqyJ9Q0I*O>H@}1%$ zT0i~ApO<#dYNx7?aA`}QJNRfpJJtA>v@;uNUbyf|K|D}#LEN8N+8@>pAcVbD2wcu z?M`?TmXK>W)O{Rx*8b)k{9vLTFUxl10`n8T-zV4yfBtp1{mdriE{ z^zT&viulwk37?JE135%;cFf^ZmvjGH=d%{`sox==wY$V;t$@!r-UOeuF`wuLdEFVG zwYhxGj+3!pdX5|;WWZu^Qm-U&Qck+SHF0PBXiA)fKTpKTK9F~SpNKCvuNB~@_;JxV z_}Y83_=K(q|PIQineq&xAa`|zIPt&x9VA9#KXk59mBT2b6NR)FuxT+>B+V25W9O@TRnJm?`M z=_is%{*qZA#rD&pV62q%mZ6eC_XEr_hqK zf2G*|OSbFzd$fceFZhoW7*`W_s(%)K7x`}gz;GfFU%H>ri{KHV^U8sHNTT!oy;9&O z5`W&@_JR{bqe(r`DGvnMB>cJx`S7Z3|omzD%JVv*h&+hsdCM};r4{= zs`J7{TQRESn3D4a$)IadIq14rig9~V$|7bJuz4d?xKgsLRZUFFDs`yi<9eG9M=R%zSv_XZ}o5eMk7re5if%SLHfD_4nn1 zag2Do=L@-d5>{41($%t5k>$FskIo-?Vv}Tv(mwlSZk$&cdtne1cc~ zsc^m}<>UBYj4PTqX+yO|SuzQE@#zQT7P_jh2-o#R2B&GSJxl_cxYIZ>#sAL8FqMx{ z-?JE=?A;14A}N`TRMqeQx?H-e`U~U4xRcQ5xhRvjzYsrOPrXU}SbsK7Qrqcj;-1Z4 zfafZKnXt8Q4~OdFVIh1M@%zG`ht9DJ+ z@0mB?NkV)5S00oaRJ#Vjs_!~XG_c<%bB4c+k(~&J9Ob1Tkg@beL>q}SN=mT%VxE^0M`ly9ZJJ>@M?4d zX)(RK$u^JnrCSoN(eoMg_d~cTU-uZwu^-0?w?8l`Mhy~_G2tC#jF&$^*M zK6ue>{w*~*$Ny~nVdkXBm5cu%@d=M5$ePMyoPHnkNKapZ$i!PqRCWj|CnKu3&Fm z?)u6^*UyKaly>Ll@$oq|jNcea)@kE;PN}~Xoga$MaRJ~VHbiMO?Pq`dUDpYx)W^R4 z349jE2QTpB%J}TxJ{4^x&!~@+jkL=joi925k$<^L^3`@LaZ8$W2K(vWh)%FZS2FL; z!|l3A3ECDS)fg%T%)@PC62tk|G3Xawiu9`OO3y2TXYi1s{wTI{hMt6n6a>uQf2>GP z=A4_0>n)42LA+=ve=Ka4W=9~w)S_d*4`Iz}jqRUA z;z{^eBH{I9XJk7eHFnoOLvMH8;F2*!>Wv1uu$~A@F`M!b+;71&2m(~PM^2petPnVl5e5^ggaj>h@%GMk6K*53JpPV8; zJ}6z&vG~zJ_8#hyT|X4#=y+nWUDyVYXRKrBqh)<{b6sDn*UKGUU#~+Nar!uJlJ{QR zv+Ni|EyE=0Uf6k}w7yzCV}~UQD#9;azciLZXTM1fjfZJ=xt8Z^7eshQhO1Ig@he^h z_329bIpKxkL{5&iU$I1I)YE+72!t|;>*JN$LH?89e{_()t~fTrq<>Ty z8ew1CKGjCjvgaFv64C-9Xm7ce@7Y#TmRjM+vc2~0j^FOsh#m=Fl$4})Hc{s6qhBLT z_(j?q0N}cbo9w+GH_7=4l#9uc>|OB<(-Ea@&mVfxss?zvnz%{scj2DhpSIiew1Isn ztkM8e59-s^zyg8rODGAyiuVO}y%iEa2-0utUf#KKqt$MW-1Y?!M&xEc$5BfB@}^$P zd`558zS_ekm*46O$7yfSx7Px=eEX6ShHX4FSmLl94u);R?^WCK&oaF=KfE69>bdGT zo4R9!M*FH~AlJ}qyTd`-g@jvRW<+k$#GrQ#JCZZwtMaq9Td$Q5*H_!ffWgn(hmG}H z7%fASzOs-UD-VJLGd75PP`2v`C)M4$zS?e?zKtIowbf6vf7J`?)FmRJbqamS*R7b{ z_Kl7hknG7XB3m;IA0PrLI>tgMCbU|QM5THa<#vSM9zVIHquZgavID z84p9t!}D%f@CA;>V*H9)!B^+)@bOWnw0&{6;LA))HVVE5wrvh9$+Hp<&U?kilXu*X zyGa3L6@AcDoHFlawBnOa+wM7D$8cKM);4;g-Lu2~r~?YJilt#|ZBV`J0QjWw%gH0oxprq}B0 zIuL7JF+&v8lPFC2KGAgd%nm{e?wnX!uUcZgYZ!WM!&o({dd=!I#D?DK>YYuqYHV(H z^wnyuQ%fw3&~Kk{G8C149P~%lBr$SBuXQ&&X0_3+Z!}E3PL@`?)lR2VYnU7BVr^4z z)J3B{Hd2xDwi$~&IGyrp>y>rtblvQTO>?tm>NR6?RS2V2ty(qoc&B3s%jni|uj%zM zl`*^=!S8-YN6%sf-U$!vTCmGp7pr2;s&-ecPTgG9H{qFeQR}SNYV}6dG!r@}1l@H; z4`Wq_7*sfTfQKxMKfD!X{16ZPHZTturf!+_4WkaPtm|vl&PElUS?e~e#^#z3ddI38 z_4Q8T1cjm~YNYERTIbPvqhP&9>#4qnWBM3+>I^b{v8J7XJh_gEYFrE!7eQZx590jLCer5EZdb5)Do0V7VnAD9gHUF!6IUF^T-znbKEeaW+Ui;rjjibo_`^nZU0=n< zp0vJ#P5|U{eKL9tJxUuaBmg0?3 z=mq^zh!vf?3!iAo-{1tNHxOvjS_wt+S3R`Y%c-jHtk>pQ@69iJ{@>4f+G~gv6u~FsCjtI%G%m6dM3@`)C05iZ0Fayj0Gr$Zm1Iz$3zzi@0%m6dM3@`)C05iZ0 zFayj0Gr$Zm1Iz$3zzi@0%m6dM3@`)C05iZ0Fayj0Gr$Zm1Iz$3zzi@0%m6dM3@`)C z05iZ0Fayj0Gr$Zm1Iz$3zzi@0%m6dM3@`)C05iZ0Fayj0Gr$Zm1Iz$3zzi@0%m6dM z3@`)C05iZ0Fayj0Gr$Zm1Iz$3zzi@0%m6dM3@`)C05iZ0Fayj0Gr$Zm1Iz$3zzi@0 z%m6dM3@`)C05iZ0Fayj0Gr$Zm1Iz$3zzi@0%m6dM3@`)C05iZ0Fayj0Gr$Zm1Iz$3 zzzi@0%m6dM3@`)C05iZ0Fayj0Gr$Zm1Iz$3zzi@0%m6dM3@`)C05iZ0Fayj0Gr$Zm e1Iz$3zzi@0%m6dM3@`)C05iZ0Fa!S=82Dd=82{`5 literal 0 HcmV?d00001 diff --git a/.tmp-gradle-run/escalated/jna-63116079/jna4079305537621798898.dll b/.tmp-gradle-run/escalated/jna-63116079/jna4079305537621798898.dll new file mode 100644 index 0000000000000000000000000000000000000000..bcca391fcc417068a382de4946e5226adeebc5d7 GIT binary patch literal 246784 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Ð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Ð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 + + + + + + + + + + + = Build.VERSION_CODES.O + + fun eligibleRows(rows: List): List = rows.filter { row -> + row.items.isNotEmpty() && row.kind.lowercase() !in WATCH_NEXT_KINDS + } + + private companion object { + val WATCH_NEXT_KINDS = setOf("continue", "nextup", "next_up") + } +} diff --git a/app/src/main/java/com/ponzischeme89/memby/tvhome/TvDeepLinkActivity.kt b/app/src/main/java/com/ponzischeme89/memby/tvhome/TvDeepLinkActivity.kt new file mode 100644 index 0000000..98754fe --- /dev/null +++ b/app/src/main/java/com/ponzischeme89/memby/tvhome/TvDeepLinkActivity.kt @@ -0,0 +1,61 @@ +package com.ponzischeme89.memby.tvhome + +import android.os.Bundle +import androidx.activity.ComponentActivity +import androidx.lifecycle.lifecycleScope +import com.ponzischeme89.memby.ServiceLocator +import com.ponzischeme89.memby.data.analytics.PlaybackEntryPoint +import com.ponzischeme89.memby.ui.player.PlayerActivity +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.launch +import kotlinx.coroutines.withTimeoutOrNull + +/** Narrow exported trampoline for launcher-owned deep links; [PlayerActivity] stays private. */ +class TvDeepLinkActivity : ComponentActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + val itemId = TvDeepLinks.itemId(intent.data) + val requestedProfile = TvDeepLinks.profileKey(intent.data) + if (itemId == null || requestedProfile == null) { + finish() + return + } + + lifecycleScope.launch { + val current = withTimeoutOrNull(SETTINGS_TIMEOUT_MS) { + ServiceLocator.settings.settingsFlow.first() + } + val profile = current?.let(::tvHomeProfile) + if (profile?.key != requestedProfile) { + finish() + return@launch + } + + val item = runCatching { ServiceLocator.repository.getItemDetails(itemId) }.getOrNull() + if (item == null || item.userData?.played == true || (!item.isMovie && !item.isEpisode)) { + finish() + return@launch + } + val request = runCatching { ServiceLocator.repository.playbackRequest(item) }.getOrNull() + if (request == null) { + finish() + return@launch + } + startActivity( + PlayerActivity.intent( + context = this@TvDeepLinkActivity, + request = request, + posterUrl = ServiceLocator.repository.primaryUrl(item, maxWidth = 500), + backdropUrl = ServiceLocator.repository.backdropUrl(item, maxWidth = 1920) + ?: ServiceLocator.repository.primaryUrl(item, maxWidth = 1920), + journeySource = PlaybackEntryPoint.TV_HOME.id, + ), + ) + finish() + } + } + + private companion object { + const val SETTINGS_TIMEOUT_MS = 5_000L + } +} diff --git a/app/src/main/java/com/ponzischeme89/memby/tvhome/TvDeepLinks.kt b/app/src/main/java/com/ponzischeme89/memby/tvhome/TvDeepLinks.kt new file mode 100644 index 0000000..31882e7 --- /dev/null +++ b/app/src/main/java/com/ponzischeme89/memby/tvhome/TvDeepLinks.kt @@ -0,0 +1,23 @@ +package com.ponzischeme89.memby.tvhome + +import android.net.Uri + +internal object TvDeepLinks { + fun playback(itemId: String, profileKey: String): Uri = Uri.Builder() + .scheme("memby") + .authority("play") + .appendPath(itemId) + .appendQueryParameter("profile", profileKey) + .build() + + fun itemId(uri: Uri?): String? = uri + ?.takeIf { it.scheme == "memby" && it.host == "play" } + ?.pathSegments + ?.singleOrNull() + ?.takeIf(String::isNotBlank) + + fun profileKey(uri: Uri?): String? = uri + ?.takeIf { it.scheme == "memby" && it.host == "play" } + ?.getQueryParameter("profile") + ?.takeIf(String::isNotBlank) +} diff --git a/app/src/main/java/com/ponzischeme89/memby/tvhome/TvHomeIntegrationService.kt b/app/src/main/java/com/ponzischeme89/memby/tvhome/TvHomeIntegrationService.kt new file mode 100644 index 0000000..25b3cbd --- /dev/null +++ b/app/src/main/java/com/ponzischeme89/memby/tvhome/TvHomeIntegrationService.kt @@ -0,0 +1,141 @@ +package com.ponzischeme89.memby.tvhome + +import android.content.Context +import com.ponzischeme89.memby.data.EmbyRepository +import com.ponzischeme89.memby.data.PlaybackPosition +import com.ponzischeme89.memby.data.Settings +import com.ponzischeme89.memby.data.SettingsStore +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.flow.distinctUntilChanged +import kotlinx.coroutines.flow.map +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch +import kotlinx.coroutines.sync.Mutex +import kotlinx.coroutines.sync.withLock +import java.util.concurrent.ConcurrentHashMap + +/** + * Process-scoped bridge between Memby's repositories and Android TV's launcher provider. + * Every operation is best-effort: a missing provider, a launcher defect, or an offline + * server can cost a launcher card but can never delay or fail playback. + */ +class TvHomeIntegrationService internal constructor( + context: Context, + private val repository: EmbyRepository, + private val settings: SettingsStore, +) { + private val scope = CoroutineScope(SupervisorJob() + Dispatchers.IO) + private val publisher = WatchNextPublisher(context) + private val reconciliation = Mutex() + private val latestPositions = ConcurrentHashMap() + private val completedItems = ConcurrentHashMap.newKeySet() + + @Volatile + private var activeProfile: TvHomeProfile? = null + private var started = false + + fun start() { + if (started) return + started = true + + scope.launch { + settings.settingsFlow + .map(::tvHomeProfile) + .distinctUntilChanged() + .collectLatest { profile -> + latestPositions.clear() + completedItems.clear() + activeProfile = profile + if (profile == null) { + publisher.clear() + } else { + publisher.clearOtherProfiles(profile.key) + // A process may have been created by a launcher-card press. Keep the + // supplementary row refresh behind item lookup and stream negotiation. + delay(INITIAL_RECONCILE_DELAY_MS) + reconcile(profile) + } + } + } + scope.launch { + repository.playbackPositions.collect { position -> + activeProfile?.let { updateProgress(it, position) } + } + } + scope.launch { + repository.playbackStops.collect { + activeProfile?.let { profile -> reconcile(profile) } + } + } + } + + private suspend fun reconcile(profile: TvHomeProfile) { + reconciliation.withLock { + if (activeProfile != profile) return + val items = runCatching { repository.getContinueWatching(WATCH_NEXT_LIMIT) } + .getOrNull() + ?: return + if (activeProfile != profile) return + val serverIds = items.mapTo(mutableSetOf()) { it.id } + completedItems.retainAll(serverIds) + val now = System.currentTimeMillis() + val programmes = items.mapIndexedNotNull { index, item -> + if (item.id in completedItems) return@mapIndexedNotNull null + val local = latestPositions[item.id] + val localTicks = local?.positionMs?.times(10_000L) ?: 0L + val currentTicks = item.userData?.playbackPositionTicks ?: 0L + val currentItem = if (localTicks > currentTicks) { + item.copy( + userData = (item.userData ?: com.ponzischeme89.memby.data.model.UserItemData()) + .copy(playbackPositionTicks = localTicks), + ) + } else { + item + } + tvHomeProgram( + item = currentItem, + profileKey = profile.key, + artworkUrl = repository.backdropUrl(item, maxWidth = 1280) + ?: repository.primaryUrl(item, maxWidth = 780), + // Preserve the repository's recency order even where a Next Up item has + // no LastPlayedDate of its own. + nowMs = now - index, + ) + } + publisher.reconcile(programmes) + } + } + + private fun updateProgress(profile: TvHomeProfile, position: PlaybackPosition) { + latestPositions[position.itemId] = position + if (position.completed) completedItems += position.itemId else completedItems -= position.itemId + publisher.updateProgress( + profileKey = profile.key, + itemId = position.itemId, + positionMs = position.positionMs, + durationMs = position.durationMs, + completed = position.completed, + ) + } + + private companion object { + const val WATCH_NEXT_LIMIT = 40 + const val INITIAL_RECONCILE_DELAY_MS = 15_000L + } +} + +internal data class TvHomeProfile(val key: String) + +internal fun tvHomeProfile(settings: Settings): TvHomeProfile? { + if (!settings.isSignedIn) return null + return TvHomeProfile( + tvHomeProfileKey( + serverUrl = requireNotNull(settings.serverUrl), + userId = requireNotNull(settings.userId), + viewerId = settings.activeViewerId, + ), + ) +} diff --git a/app/src/main/java/com/ponzischeme89/memby/tvhome/TvHomeProgram.kt b/app/src/main/java/com/ponzischeme89/memby/tvhome/TvHomeProgram.kt new file mode 100644 index 0000000..2996098 --- /dev/null +++ b/app/src/main/java/com/ponzischeme89/memby/tvhome/TvHomeProgram.kt @@ -0,0 +1,69 @@ +package com.ponzischeme89.memby.tvhome + +import com.ponzischeme89.memby.data.model.BaseItem +import java.security.MessageDigest + +internal enum class TvHomeProgramKind { CONTINUE, NEXT } + +internal data class TvHomeProgram( + val providerId: String, + val itemId: String, + val profileKey: String, + val kind: TvHomeProgramKind, + val mediaType: String, + val title: String, + val episodeTitle: String? = null, + val description: String? = null, + val seasonNumber: Int? = null, + val episodeNumber: Int? = null, + val positionMs: Long = 0L, + val durationMs: Long = 0L, + val artworkUrl: String? = null, + val engagementTimeMs: Long, +) + +internal fun tvHomeProfileKey(serverUrl: String, userId: String, viewerId: String): String { + val identity = "${serverUrl.trimEnd('/')}|$userId|$viewerId" + return MessageDigest.getInstance("SHA-256") + .digest(identity.toByteArray(Charsets.UTF_8)) + .take(12) + .joinToString("") { "%02x".format(it) } +} + +internal fun tvHomeProgram( + item: BaseItem, + profileKey: String, + artworkUrl: String?, + nowMs: Long, +): TvHomeProgram? { + if (item.id.isBlank() || item.userData?.played == true) return null + if (!item.isMovie && !item.isEpisode) return null + + val positionMs = ((item.userData?.playbackPositionTicks ?: 0L) / 10_000L).coerceAtLeast(0L) + val durationMs = ((item.runTimeTicks ?: 0L) / 10_000L).coerceAtLeast(0L) + val kind = when { + positionMs > 0L -> TvHomeProgramKind.CONTINUE + item.isEpisode -> TvHomeProgramKind.NEXT + else -> return null + } + if (kind == TvHomeProgramKind.CONTINUE && durationMs > 0L && positionMs >= durationMs * 95 / 100) { + return null + } + + return TvHomeProgram( + providerId = "memby:$profileKey:${item.id}", + itemId = item.id, + profileKey = profileKey, + kind = kind, + mediaType = if (item.isMovie) "movie" else "episode", + title = if (item.isEpisode) item.seriesName?.takeIf(String::isNotBlank) ?: item.name else item.name, + episodeTitle = item.name.takeIf { item.isEpisode }, + description = item.overview, + seasonNumber = item.parentIndexNumber, + episodeNumber = item.indexNumber, + positionMs = positionMs, + durationMs = durationMs, + artworkUrl = artworkUrl, + engagementTimeMs = nowMs, + ) +} diff --git a/app/src/main/java/com/ponzischeme89/memby/tvhome/WatchNextPublisher.kt b/app/src/main/java/com/ponzischeme89/memby/tvhome/WatchNextPublisher.kt new file mode 100644 index 0000000..3fe64be --- /dev/null +++ b/app/src/main/java/com/ponzischeme89/memby/tvhome/WatchNextPublisher.kt @@ -0,0 +1,150 @@ +package com.ponzischeme89.memby.tvhome + +import android.content.ContentUris +import android.content.Context +import android.net.Uri +import android.os.Build +import android.provider.BaseColumns +import androidx.tvprovider.media.tv.TvContractCompat +import androidx.tvprovider.media.tv.WatchNextProgram + +internal class WatchNextPublisher(context: Context) { + private val resolver = context.applicationContext.contentResolver + + val supported: Boolean get() = Build.VERSION.SDK_INT >= Build.VERSION_CODES.O + + fun reconcile(programmes: List) { + if (!supported) return + runCatching { + val existing = existingProgrammes() + val desired = programmes.associateBy(TvHomeProgram::providerId) + + for ((providerId, rows) in existing) { + val programme = desired[providerId] + if (programme == null) { + rows.forEach(::delete) + } else { + val keeper = rows.first() + resolver.update(keeper.uri, programme.toWatchNext().toContentValues(), null, null) + rows.drop(1).forEach(::delete) + } + } + for ((providerId, programme) in desired) { + if (providerId !in existing) { + resolver.insert( + TvContractCompat.WatchNextPrograms.CONTENT_URI, + programme.toWatchNext().toContentValues(), + ) + } + } + } + } + + fun updateProgress(profileKey: String, itemId: String, positionMs: Long, durationMs: Long, completed: Boolean) { + if (!supported) return + runCatching { + val providerId = "memby:$profileKey:$itemId" + val rows = existingProgrammes()[providerId].orEmpty() + if (completed) { + rows.forEach(::delete) + return@runCatching + } + rows.firstOrNull()?.let { row -> + val values = android.content.ContentValues().apply { + put(TvContractCompat.WatchNextPrograms.COLUMN_LAST_PLAYBACK_POSITION_MILLIS, positionMs.toIntMillis()) + if (durationMs > 0L) { + put(TvContractCompat.WatchNextPrograms.COLUMN_DURATION_MILLIS, durationMs.toIntMillis()) + } + put(TvContractCompat.WatchNextPrograms.COLUMN_LAST_ENGAGEMENT_TIME_UTC_MILLIS, System.currentTimeMillis()) + } + resolver.update(row.uri, values, null, null) + rows.drop(1).forEach(::delete) + } + } + } + + fun clear() { + if (!supported) return + runCatching { existingProgrammes().values.flatten().forEach(::delete) } + } + + fun clearOtherProfiles(profileKey: String) { + if (!supported) return + val ownPrefix = "memby:$profileKey:" + runCatching { + existingProgrammes() + .filterKeys { !it.startsWith(ownPrefix) } + .values + .flatten() + .forEach(::delete) + } + } + + private fun existingProgrammes(): Map> { + val found = linkedMapOf>() + resolver.query( + TvContractCompat.WatchNextPrograms.CONTENT_URI, + arrayOf(BaseColumns._ID, TvContractCompat.WatchNextPrograms.COLUMN_INTERNAL_PROVIDER_ID), + null, + null, + null, + )?.use { cursor -> + val idColumn = cursor.getColumnIndexOrThrow(BaseColumns._ID) + val providerColumn = cursor.getColumnIndexOrThrow( + TvContractCompat.WatchNextPrograms.COLUMN_INTERNAL_PROVIDER_ID, + ) + while (cursor.moveToNext()) { + val providerId = cursor.getString(providerColumn) ?: continue + if (!providerId.startsWith("memby:")) continue + val uri = ContentUris.withAppendedId( + TvContractCompat.WatchNextPrograms.CONTENT_URI, + cursor.getLong(idColumn), + ) + found.getOrPut(providerId) { mutableListOf() } += ExistingProgramme(uri) + } + } + return found + } + + private fun delete(programme: ExistingProgramme) { + resolver.delete(programme.uri, null, null) + } + + private fun TvHomeProgram.toWatchNext(): WatchNextProgram { + val builder = WatchNextProgram.Builder() + builder.setType( + if (mediaType == "movie") { + TvContractCompat.PreviewPrograms.TYPE_MOVIE + } else { + TvContractCompat.PreviewPrograms.TYPE_TV_EPISODE + }, + ) + builder.setWatchNextType( + if (kind == TvHomeProgramKind.CONTINUE) { + TvContractCompat.WatchNextPrograms.WATCH_NEXT_TYPE_CONTINUE + } else { + TvContractCompat.WatchNextPrograms.WATCH_NEXT_TYPE_NEXT + }, + ) + builder.setTitle(title) + builder.setInternalProviderId(providerId) + builder.setContentId(itemId) + builder.setIntentUri(TvDeepLinks.playback(itemId, profileKey)) + builder.setLastEngagementTimeUtcMillis(engagementTimeMs) + + description?.takeIf(String::isNotBlank)?.let(builder::setDescription) + artworkUrl?.let(Uri::parse)?.let(builder::setPosterArtUri) + if (kind == TvHomeProgramKind.CONTINUE) { + builder.setLastPlaybackPositionMillis(positionMs.toIntMillis()) + builder.setDurationMillis(durationMs.toIntMillis()) + } + episodeTitle?.let(builder::setEpisodeTitle) + seasonNumber?.let(builder::setSeasonNumber) + episodeNumber?.let(builder::setEpisodeNumber) + return builder.build() + } + + private fun Long.toIntMillis(): Int = coerceIn(0L, Int.MAX_VALUE.toLong()).toInt() + + private data class ExistingProgramme(val uri: Uri) +} diff --git a/app/src/main/java/com/ponzischeme89/memby/ui/HomeOverlays.kt b/app/src/main/java/com/ponzischeme89/memby/ui/HomeOverlays.kt index a386093..eb02d11 100644 --- a/app/src/main/java/com/ponzischeme89/memby/ui/HomeOverlays.kt +++ b/app/src/main/java/com/ponzischeme89/memby/ui/HomeOverlays.kt @@ -854,7 +854,7 @@ internal fun ForYouNudgeBanner( } /** - * Turns Emby account-style usernames into a friendlier home-screen name. + * Turns Memby account-style usernames into a friendlier home-screen name. * * Household accounts commonly use a trailing capital as a disambiguating surname * initial (PeterC, PaulR). Only that clear camel-case shape is trimmed, so ordinary diff --git a/app/src/main/java/com/ponzischeme89/memby/ui/HomeScreen.kt b/app/src/main/java/com/ponzischeme89/memby/ui/HomeScreen.kt index 63c1789..b34970f 100644 --- a/app/src/main/java/com/ponzischeme89/memby/ui/HomeScreen.kt +++ b/app/src/main/java/com/ponzischeme89/memby/ui/HomeScreen.kt @@ -285,6 +285,9 @@ internal fun HomeScreen( var quickMenuTrailerAvailable by remember { mutableStateOf(false) } var quickMenuRowId by remember { mutableStateOf(null) } var focusedHomeRowId by remember { mutableStateOf(null) } + var rowBrowseTarget by remember { mutableStateOf(null) } + var rowBrowseOriginRowId by remember { mutableStateOf(null) } + var rowBrowseOriginItemId by remember { mutableStateOf(null) } var sectionHeroRows by remember(settings.userId) { mutableStateOf>>(emptyMap()) } @@ -843,6 +846,7 @@ internal fun HomeScreen( ) LaunchedEffect(selectedDestination) { focusedHomeRowId = null + rowBrowseTarget = null } LaunchedEffect(selectedDestination, settings.forYouMinutes) { if ( @@ -863,6 +867,7 @@ internal fun HomeScreen( showNotifications -> "notifications" userSwitcherVisible || showProfiles -> "profiles" detailsItem != null -> "details" + rowBrowseTarget != null -> "row_browse" selectedMyShow != null -> "my_show_details" else -> selectedDestination.name.lowercase() } @@ -935,6 +940,7 @@ internal fun HomeScreen( navigationExpanded = it }, onDestinationSelected = { destination -> + rowBrowseTarget = null homeViewModel.trackJourney( category = "navigation", action = "select", screen = journeyScreen, feature = destination.name.lowercase(), @@ -1050,6 +1056,53 @@ internal fun HomeScreen( return@BoxWithConstraints } + rowBrowseTarget?.let { browseTarget -> + GenreBrowseScreen( + itemType = browseTarget.itemType, + initialCategoryId = browseTarget.categoryId, + favouriteStates = favoriteChanges, + playedStates = playedChanges, + navigationFocusRequester = navigationFocusRequester, + contentFocusRequester = contentFocusRequester, + returnFocusItemId = returnItemId.takeIf { + returnRowId == ROW_BROWSE_RESULTS_ID + }, + returnFocusRequester = cardReturnFocusRequester, + onItemFocused = homeViewModel::focusItem, + onItemSelected = { item -> + returnRowId = ROW_BROWSE_RESULTS_ID + returnRowKind = null + returnItemId = item.id + homeViewModel.focusItem(item) + homeViewModel.trackJourney( + category = "content", action = "open", screen = "row_browse", + feature = "view_all", source = "row_browse_results", + target = "details", itemName = item.name, itemType = item.type, + ) + detailsAiringNotice = null + detailsItem = item + }, + onContentFocused = { navigationExpanded = false }, + onClose = { + rowBrowseTarget = null + returnRowId = rowBrowseOriginRowId + returnRowKind = rows.firstOrNull { + it.id == rowBrowseOriginRowId + }?.kind?.name + returnItemId = rowBrowseOriginItemId + scope.launch { + delay(16.milliseconds) + if (rowBrowseOriginItemId != null) { + runCatching { cardReturnFocusRequester.requestFocus() } + } else { + runCatching { contentFocusRequester.requestFocus() } + } + } + }, + ) + return@BoxWithConstraints + } + if (selectedDestination == BrowseDestination.SEARCH) { // Remembered, or this list is a fresh instance on every recomposition // and the screen re-derives its genre chips each time. @@ -1511,6 +1564,7 @@ internal fun HomeScreen( row.items.take(8).map { it.id }, ) } + val browseTarget = homeRowBrowseTarget(row) MediaRow( modifier = Modifier, row = row, @@ -1672,6 +1726,24 @@ internal fun HomeScreen( horizontalState = horizontalStates.getOrPut( "${selectedDestination.name}:${row.id}", ) { LazyListState() }, + viewAllLabel = browseTarget?.actionLabel, + onViewAll = browseTarget?.let { target -> + { + rowBrowseOriginRowId = row.id + rowBrowseOriginItemId = returnItemId.takeIf { + returnRowId == row.id + } ?: row.items.getOrNull( + rowFocusPositions[row.id] ?: 0, + )?.id + rowBrowseTarget = target + homeViewModel.trackJourney( + category = "navigation", action = "open", + screen = selectedDestination.name.lowercase(), + feature = "view_all", source = row.id, + target = "row_browse", + ) + } + }, ) } } diff --git a/app/src/main/java/com/ponzischeme89/memby/ui/ResumableMediaCard.kt b/app/src/main/java/com/ponzischeme89/memby/ui/ResumableMediaCard.kt index 3d3577e..ad4f2b8 100644 --- a/app/src/main/java/com/ponzischeme89/memby/ui/ResumableMediaCard.kt +++ b/app/src/main/java/com/ponzischeme89/memby/ui/ResumableMediaCard.kt @@ -141,7 +141,7 @@ internal fun expectedFinishEpochMillis( * A self-contained card for anything that can be resumed. * * The component owns the progress, episode identity and expected-finish presentation; - * callers own placement, artwork shape and actions. + * callers own placement, artwork shape, actions and optional content beneath the title. */ @Composable fun ResumableMediaCard( @@ -152,6 +152,7 @@ fun ResumableMediaCard( onFocused: () -> Unit, onClick: () -> Unit, onLongClick: (() -> Unit)? = null, + titleSupplement: (@Composable (focused: Boolean) -> Unit)? = null, ) { val context = LocalContext.current val artworkUrl = if (portraitArtwork) { @@ -299,6 +300,7 @@ fun ResumableMediaCard( overflow = TextOverflow.Ellipsis, modifier = Modifier.padding(top = 7.dp).fillMaxWidth(), ) + titleSupplement?.invoke(focused) model.episodeLabel?.let { label -> Text( text = label, diff --git a/app/src/main/java/com/ponzischeme89/memby/ui/components/media/ContinueWatchingCard.kt b/app/src/main/java/com/ponzischeme89/memby/ui/components/media/ContinueWatchingCard.kt index c06fe70..7439de6 100644 --- a/app/src/main/java/com/ponzischeme89/memby/ui/components/media/ContinueWatchingCard.kt +++ b/app/src/main/java/com/ponzischeme89/memby/ui/components/media/ContinueWatchingCard.kt @@ -1,5 +1,6 @@ package com.ponzischeme89.memby.ui.components.media +import androidx.compose.foundation.layout.padding import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.ui.Modifier @@ -7,6 +8,7 @@ import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import com.ponzischeme89.memby.ServiceLocator import com.ponzischeme89.memby.data.model.BaseItem +import com.ponzischeme89.memby.ui.ItemRatingsStrip import com.ponzischeme89.memby.ui.ResumableMediaCard import com.ponzischeme89.memby.ui.responsiveRowCardWidth import com.ponzischeme89.memby.ui.toResumableMediaCardModel @@ -55,5 +57,18 @@ fun ContinueWatchingCard( onClick = onClick, onLongClick = onLongClick, modifier = modifier, + titleSupplement = if (item.isMovie) { + { focused -> + ItemRatingsStrip( + item = item, + load = focused, + modifier = Modifier.padding(top = 2.dp), + reserveSpace = false, + compact = true, + ) + } + } else { + null + }, ) } diff --git a/app/src/main/java/com/ponzischeme89/memby/ui/components/media/MediaResultCard.kt b/app/src/main/java/com/ponzischeme89/memby/ui/components/media/MediaResultCard.kt new file mode 100644 index 0000000..070968f --- /dev/null +++ b/app/src/main/java/com/ponzischeme89/memby/ui/components/media/MediaResultCard.kt @@ -0,0 +1,214 @@ +package com.ponzischeme89.memby.ui.components.media + +import androidx.compose.foundation.background +import androidx.compose.foundation.border +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.RoundedCornerShape +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Brush +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.tv.material3.Text +import androidx.tv.material3.Icon +import coil.compose.AsyncImage +import com.ponzischeme89.memby.ui.FocusScaleContainer +import com.ponzischeme89.memby.ui.theme.MembyIcon +import com.ponzischeme89.memby.ui.theme.mark +import com.ponzischeme89.memby.ui.theme.MembyAccent +import com.ponzischeme89.memby.ui.theme.MembyCardCorner +import com.ponzischeme89.memby.ui.theme.MembySurface +import com.ponzischeme89.memby.ui.theme.MembySurfaceRaised + +/** + * The shared film/series result row used by Search and My Requests. + * + * This component owns the invariant 118dp row, 214dp artwork, typography, spacing and + * focus border. Feature-specific state belongs in the optional artwork, body and trailing + * slots: Requests supplies status and actions, while Search supplies library metadata. + */ +@Composable +internal fun MediaResultCard( + title: String, + subtitle: String, + detail: String, + artworkUrl: String?, + contentDescription: String, + onFocused: () -> Unit, + onClick: () -> Unit, + modifier: Modifier = Modifier, + detailColour: Color = MembyAccent, + artworkTopStartContent: (@Composable () -> Unit)? = null, + artworkBottomStartContent: (@Composable () -> Unit)? = null, + bodyContent: (@Composable () -> Unit)? = null, + trailingContent: (@Composable (focused: Boolean) -> Unit)? = null, +) { + val shape = RoundedCornerShape(MembyCardCorner) + FocusScaleContainer( + onFocused = onFocused, + onClick = onClick, + contentDescription = contentDescription, + modifier = modifier.fillMaxWidth(), + ) { focused -> + Row( + Modifier + .fillMaxWidth() + .height(118.dp) + .clip(shape) + .background(MembySurfaceRaised.copy(alpha = 0.72f)) + .border( + if (focused) 2.dp else 1.dp, + if (focused) Color.White else Color.White.copy(alpha = 0.07f), + shape, + ), + ) { + Box(Modifier.width(214.dp).fillMaxHeight().background(MembySurface)) { + Box( + Modifier.fillMaxSize().background( + Brush.linearGradient( + listOf(MembyAccent.copy(alpha = 0.30f), Color(0xFF102523), MembySurfaceRaised), + ), + ), + contentAlignment = Alignment.Center, + ) { + Text( + title.trim().firstOrNull()?.uppercase().orEmpty(), + color = Color.White.copy(alpha = 0.16f), + fontSize = 52.sp, + fontWeight = FontWeight.Black, + ) + } + if (!artworkUrl.isNullOrBlank()) { + AsyncImage( + model = artworkUrl, + contentDescription = null, + contentScale = ContentScale.Crop, + modifier = Modifier.fillMaxSize(), + ) + } + Box( + Modifier.fillMaxSize().background( + Brush.horizontalGradient( + listOf(Color.Transparent, MembySurfaceRaised.copy(alpha = 0.12f), MembySurfaceRaised), + ), + ), + ) + artworkTopStartContent?.let { content -> + Box(Modifier.align(Alignment.TopStart).padding(9.dp)) { content() } + } + artworkBottomStartContent?.let { content -> + Box(Modifier.align(Alignment.BottomStart).padding(9.dp)) { content() } + } + } + Column( + Modifier + .weight(1f) + .fillMaxHeight() + .padding(start = 14.dp, end = 14.dp, top = 11.dp, bottom = 10.dp), + verticalArrangement = Arrangement.Center, + ) { + Text( + title, + color = Color.White, + fontSize = 17.sp, + fontWeight = FontWeight.Bold, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + ) + if (subtitle.isNotBlank()) { + Spacer(Modifier.height(5.dp)) + Text( + subtitle, + color = Color.White.copy(alpha = 0.82f), + fontSize = 13.sp, + fontWeight = FontWeight.Medium, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + ) + } + bodyContent?.invoke() + Spacer(Modifier.height(4.dp)) + Text( + detail, + color = detailColour, + fontSize = 11.sp, + fontWeight = FontWeight.SemiBold, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + ) + } + trailingContent?.invoke(focused) + } + } +} + +/** Film/series mark shared by both result surfaces. */ +@Composable +internal fun MediaResultTypeGlyph(isSeries: Boolean, modifier: Modifier = Modifier) { + Box( + modifier + .size(24.dp) + .background(MembySurface.copy(alpha = 0.72f), RoundedCornerShape(6.dp)), + contentAlignment = Alignment.Center, + ) { + Icon( + if (isSeries) MembyIcon.Tv.mark else MembyIcon.Movie.mark, + contentDescription = if (isSeries) "Series" else "Film", + tint = Color.White.copy(alpha = 0.82f), + modifier = Modifier.size(13.dp), + ) + } +} + +/** Loading form of [MediaResultCard]; intentionally not focusable. */ +@Composable +internal fun MediaResultCardSkeleton(modifier: Modifier = Modifier) { + val shape = RoundedCornerShape(MembyCardCorner) + Row( + modifier + .fillMaxWidth() + .height(118.dp) + .clip(shape) + .background(MembySurfaceRaised.copy(alpha = 0.34f)) + .border(1.dp, Color.White.copy(alpha = 0.05f), shape), + ) { + Box(Modifier.width(214.dp).fillMaxHeight().background(MembySurface.copy(alpha = 0.55f))) + Column( + Modifier.weight(1f).fillMaxHeight().padding(horizontal = 14.dp), + verticalArrangement = Arrangement.Center, + ) { + SkeletonBar(widthFraction = 0.52f, height = 15.dp) + Spacer(Modifier.height(9.dp)) + SkeletonBar(widthFraction = 0.32f, height = 11.dp) + Spacer(Modifier.height(7.dp)) + SkeletonBar(widthFraction = 0.22f, height = 9.dp) + } + } +} + +@Composable +private fun SkeletonBar(widthFraction: Float, height: androidx.compose.ui.unit.Dp) { + Box( + Modifier + .fillMaxWidth(widthFraction) + .height(height) + .background(Color.White.copy(alpha = 0.06f), RoundedCornerShape(4.dp)), + ) +} diff --git a/app/src/main/java/com/ponzischeme89/memby/ui/home/HomeRow.kt b/app/src/main/java/com/ponzischeme89/memby/ui/home/HomeRow.kt index 178c3f7..21f6147 100644 --- a/app/src/main/java/com/ponzischeme89/memby/ui/home/HomeRow.kt +++ b/app/src/main/java/com/ponzischeme89/memby/ui/home/HomeRow.kt @@ -27,10 +27,12 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableIntStateOf +import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberUpdatedState -import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.ExperimentalComposeUiApi import androidx.compose.ui.Modifier @@ -53,11 +55,11 @@ import androidx.tv.material3.Icon import androidx.tv.material3.Text import com.ponzischeme89.memby.data.model.BaseItem import com.ponzischeme89.memby.ui.theme.MembyChipCorner +import com.ponzischeme89.memby.ui.theme.MembyAccent import com.ponzischeme89.memby.ui.theme.MembyOnSurface import com.ponzischeme89.memby.ui.theme.MembyQuietText import com.ponzischeme89.memby.ui.components.media.ContinueWatchingCard import kotlinx.coroutines.delay -import kotlinx.coroutines.launch import kotlin.time.Duration.Companion.milliseconds // No NEXT_UP: those episodes are part of CONTINUE, which is one row. @@ -173,11 +175,18 @@ internal fun MediaRow( density: String = "standard", artworkStyle: String = "automatic", horizontalState: LazyListState? = null, + viewAllLabel: String? = null, + onViewAll: (() -> Unit)? = null, ) { val savedRowState = rememberSaveable(row.id, saver = LazyListState.Saver) { LazyListState() } val rowState = horizontalState ?: savedRowState val verticalEntryFocusRequester = remember { FocusRequester() } - val scope = rememberCoroutineScope() + val previousPageFocusRequester = remember { FocusRequester() } + val nextPageFocusRequester = remember { FocusRequester() } + val viewAllFocusRequester = remember { FocusRequester() } + val pagedCardFocusRequester = remember { FocusRequester() } + var pagedCardIndex by remember(row.id) { mutableStateOf(null) } + var pageFocusRequestId by remember(row.id) { mutableIntStateOf(0) } val requestedEntryIndex = verticalFocusRequest ?.takeIf { it.rowId == row.id && row.items.isNotEmpty() } ?.itemIndex @@ -205,10 +214,22 @@ internal fun MediaRow( } currentOnVerticalFocusRequestConsumed(request.requestId) } + LaunchedEffect(pageFocusRequestId) { + val target = pagedCardIndex ?: return@LaunchedEffect + rowState.scrollToItem(target) + // The target can begin outside the composed LazyRow window. Give layout a frame to + // attach it, then keep the transfer bounded so a refreshed row can never trap focus. + repeat(6) { + delay(16.milliseconds) + if (runCatching { pagedCardFocusRequester.requestFocus() }.isSuccess) { + return@LaunchedEffect + } + } + } // firstVisibleItemIndex changes on every scroll frame; read it through derivedStateOf so // only the button's enabled/disabled flip recomposes the row header. val canScrollBack by remember(rowState) { - derivedStateOf { rowState.firstVisibleItemIndex > 0 } + derivedStateOf { rowState.canScrollBackward } } val canScrollForward by remember(rowState) { derivedStateOf { rowState.canScrollForward } @@ -232,22 +253,34 @@ internal fun MediaRow( ) Spacer(Modifier.weight(1f)) if (row.items.isNotEmpty()) { + if (viewAllLabel != null && onViewAll != null) { + ViewAllButton( + label = viewAllLabel, + focusRequester = viewAllFocusRequester, + onClick = onViewAll, + ) + Spacer(Modifier.width(8.dp)) + } GalleryJumpButton( forward = false, enabled = canScrollBack, + focusRequester = previousPageFocusRequester, onClick = { val target = (rowState.firstVisibleItemIndex - pageSize).coerceAtLeast(0) - scope.launch { rowState.scrollToItem(target) } + pagedCardIndex = target + pageFocusRequestId += 1 }, ) Spacer(Modifier.width(8.dp)) GalleryJumpButton( forward = true, enabled = canScrollForward, + focusRequester = nextPageFocusRequester, onClick = { val target = (rowState.firstVisibleItemIndex + pageSize) .coerceAtMost(row.items.lastIndex) - scope.launch { rowState.scrollToItem(target) } + pagedCardIndex = target + pageFocusRequestId += 1 }, ) } @@ -321,6 +354,9 @@ internal fun MediaRow( if (index == requestedEntryIndex) { cardModifier = cardModifier.focusRequester(verticalEntryFocusRequester) } + if (index == pagedCardIndex) { + cardModifier = cardModifier.focusRequester(pagedCardFocusRequester) + } cardModifier = cardModifier.onPreviewKeyEvent { event -> if (event.type != KeyEventType.KeyDown) { return@onPreviewKeyEvent false @@ -328,6 +364,29 @@ internal fun MediaRow( when (event.key) { Key.DirectionUp -> onMoveVertical(index, RowFocusDirection.UP) Key.DirectionDown -> onMoveVertical(index, RowFocusDirection.DOWN) + Key.DirectionLeft -> { + val firstVisible = rowState.layoutInfo.visibleItemsInfo + .firstOrNull()?.index + if (canScrollBack && index == firstVisible) { + runCatching { previousPageFocusRequester.requestFocus() } + .isSuccess + } else { + false + } + } + Key.DirectionRight -> { + val lastVisible = rowState.layoutInfo.visibleItemsInfo + .lastOrNull()?.index + if (index != lastVisible) { + false + } else if (viewAllLabel != null && onViewAll != null) { + runCatching { viewAllFocusRequester.requestFocus() }.isSuccess + } else if (canScrollForward) { + runCatching { nextPageFocusRequester.requestFocus() }.isSuccess + } else { + false + } + } else -> false } } @@ -374,6 +433,7 @@ internal fun MediaRow( private fun GalleryJumpButton( forward: Boolean, enabled: Boolean, + focusRequester: FocusRequester, onClick: () -> Unit, ) { FocusScaleContainer( @@ -381,12 +441,11 @@ private fun GalleryJumpButton( onClick = { if (enabled) onClick() }, onLongClick = null, contentDescription = if (forward) "Next page" else "Previous page", - // These mirror remote left/right paging for pointer users. Keeping them out of - // the focus graph prevents Up from a card landing in a tiny header control. modifier = Modifier .width(42.dp) .height(36.dp) - .focusProperties { canFocus = false }, + .focusRequester(focusRequester) + .focusProperties { canFocus = enabled }, ) { focused -> Box( Modifier @@ -394,10 +453,15 @@ private fun GalleryJumpButton( .clip(RoundedCornerShape(MembyChipCorner)) .background( when { - focused -> Color.White.copy(alpha = 0.16f) + focused -> MembyAccent.copy(alpha = 0.34f) enabled -> Color.White.copy(alpha = 0.08f) else -> Color.White.copy(alpha = 0.03f) }, + ) + .border( + width = if (focused) 2.dp else 1.dp, + color = if (focused) MembyAccent else Color.White.copy(alpha = 0.12f), + shape = RoundedCornerShape(MembyChipCorner), ), contentAlignment = Alignment.Center, ) { @@ -411,6 +475,53 @@ private fun GalleryJumpButton( } } +@Composable +private fun ViewAllButton( + label: String, + focusRequester: FocusRequester, + onClick: () -> Unit, +) { + FocusScaleContainer( + onFocused = {}, + onClick = onClick, + contentDescription = label, + modifier = Modifier + .height(36.dp) + .focusRequester(focusRequester), + ) { focused -> + Row( + modifier = Modifier + .height(36.dp) + .clip(RoundedCornerShape(MembyChipCorner)) + .background( + if (focused) MembyAccent.copy(alpha = 0.34f) + else Color.White.copy(alpha = 0.08f), + ) + .border( + width = if (focused) 2.dp else 1.dp, + color = if (focused) MembyAccent else Color.White.copy(alpha = 0.12f), + shape = RoundedCornerShape(MembyChipCorner), + ) + .padding(horizontal = 12.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(4.dp), + ) { + Text( + text = label, + color = Color.White, + fontSize = 13.sp, + fontWeight = FontWeight.SemiBold, + ) + Icon( + imageVector = MembyIcon.ChevronRight.mark, + contentDescription = null, + tint = Color.White, + modifier = Modifier.size(17.dp), + ) + } + } +} + private enum class MediaCardFormat { PORTRAIT, LANDSCAPE } private fun cardFormat( diff --git a/app/src/main/java/com/ponzischeme89/memby/ui/home/HomeRowBrowse.kt b/app/src/main/java/com/ponzischeme89/memby/ui/home/HomeRowBrowse.kt new file mode 100644 index 0000000..53ffed5 --- /dev/null +++ b/app/src/main/java/com/ponzischeme89/memby/ui/home/HomeRowBrowse.kt @@ -0,0 +1,59 @@ +package com.ponzischeme89.memby.ui + +import com.ponzischeme89.memby.ui.genre.ALL_MEDIA_CATEGORY_ID +import com.ponzischeme89.memby.ui.genre.genreCategoryTabs + +internal const val ROW_BROWSE_RESULTS_ID = "row-browse-results" + +/** The existing paged catalogue screen a home shelf can expand into. */ +internal data class HomeRowBrowseTarget( + val categoryId: String, + val itemType: String, + val actionLabel: String, +) + +/** + * Resolves only shelves whose complete catalogue query is known on both backend paths. + * + * Recommendation and studio shelves deliberately return null: the horizontal row is a + * ranked answer, while the catalogue browser can currently page only media types and + * genres. Labelling an unfiltered library as "all Pixar" would be worse than omitting the + * action until that filter exists. + */ +internal fun homeRowBrowseTarget(row: HomeBrowseRow): HomeRowBrowseTarget? { + if (row.id == "latest-movies") { + return HomeRowBrowseTarget( + categoryId = ALL_MEDIA_CATEGORY_ID, + itemType = "Movie", + actionLabel = "View All", + ) + } + + val itemType = when { + row.id.startsWith("curated:movies:genre:") -> "Movie" + row.id.startsWith("curated:shows:genre:") -> "Series" + row.id.startsWith("curated:") && row.id.endsWith("-shows") -> "Series" + else -> return null + } + val rowLabel = row.title + .removeSuffix(" TV Shows") + .removeSuffix(" Shows") + .removeSuffix(" Movies") + .trim() + val normalisedLabel = rowLabel.normalisedBrowseLabel() + val category = genreCategoryTabs(itemType).firstOrNull { candidate -> + candidate.id != ALL_MEDIA_CATEGORY_ID && ( + candidate.label.normalisedBrowseLabel() == normalisedLabel || + candidate.genres.any { it.normalisedBrowseLabel() == normalisedLabel } + ) + } ?: return null + + return HomeRowBrowseTarget( + categoryId = category.id, + itemType = itemType, + actionLabel = "View All ${category.label}", + ) +} + +private fun String.normalisedBrowseLabel(): String = + lowercase().filter(Char::isLetterOrDigit) diff --git a/app/src/main/java/com/ponzischeme89/memby/ui/requests/RequestCards.kt b/app/src/main/java/com/ponzischeme89/memby/ui/requests/RequestCards.kt index c5ce626..4a15ac6 100644 --- a/app/src/main/java/com/ponzischeme89/memby/ui/requests/RequestCards.kt +++ b/app/src/main/java/com/ponzischeme89/memby/ui/requests/RequestCards.kt @@ -35,6 +35,9 @@ import androidx.tv.material3.Icon import androidx.tv.material3.Text import coil.compose.AsyncImage import com.ponzischeme89.memby.ui.FocusScaleContainer +import com.ponzischeme89.memby.ui.components.media.MediaResultCard +import com.ponzischeme89.memby.ui.components.media.MediaResultCardSkeleton +import com.ponzischeme89.memby.ui.components.media.MediaResultTypeGlyph import com.ponzischeme89.memby.ui.theme.MembyAccent import com.ponzischeme89.memby.ui.theme.MembyAccentInk import com.ponzischeme89.memby.ui.theme.MembyCardCorner @@ -85,131 +88,40 @@ internal fun RequestCard( /** The trailing affordance, when pressing the card would do something. */ action: RequestCardAction? = null, ) { - val shape = RoundedCornerShape(MembyCardCorner) - FocusScaleContainer( + MediaResultCard( + title = title, + subtitle = subtitle, + detail = detail, + artworkUrl = artworkUrl, + detailColour = requestToneColour(status), onFocused = onFocused, onClick = onClick, contentDescription = listOf(title, requestStatusChipLabel(status, statusLabel, progress), detail) .filter(String::isNotBlank) .joinToString(", "), - modifier = modifier.fillMaxWidth(), - ) { focused -> - Row( - Modifier - .fillMaxWidth() - .height(118.dp) - .clip(shape) - .background(MembySurfaceRaised.copy(alpha = 0.72f)) - .border( - if (focused) 2.dp else 1.dp, - if (focused) Color.White else Color.White.copy(alpha = 0.07f), - shape, - ), - ) { - Box(Modifier.width(214.dp).fillMaxHeight().background(MembySurface)) { - // The monogram sits behind the artwork rather than instead of it, so nothing - // has to decide in advance whether a poster will arrive — the cast panel's - // rule. Radarr and Sonarr posters are remote URLs and often slow. - Box( - Modifier.fillMaxSize().background( - Brush.linearGradient( - listOf(MembyAccent.copy(alpha = 0.30f), Color(0xFF102523), MembySurfaceRaised), - ), - ), - contentAlignment = Alignment.Center, - ) { - Text( - title.trim().firstOrNull()?.uppercase().orEmpty(), - color = Color.White.copy(alpha = 0.16f), - fontSize = 52.sp, - fontWeight = FontWeight.Black, - ) - } - if (!artworkUrl.isNullOrBlank()) { - AsyncImage( - model = artworkUrl, - contentDescription = null, - contentScale = ContentScale.Crop, - modifier = Modifier.fillMaxSize(), - ) - } - Box( - Modifier.fillMaxSize().background( - Brush.horizontalGradient( - listOf(Color.Transparent, MembySurfaceRaised.copy(alpha = 0.12f), MembySurfaceRaised), - ), - ), - ) - // A requestable title wears no badge. The trailing affordance already says - // "Request" in the accent, and a second grey chip saying the same word is - // the one thing on the card that is not a *state* — badges here mean what - // has become of something, and this one has had nothing become of it yet. - if (status != RequestStatus.REQUESTABLE) { - RequestStatusBadge( - status = status, - label = requestStatusChipLabel(status, statusLabel, progress), - modifier = Modifier.align(Alignment.TopStart).padding(9.dp), - ) - } - MediaTypeGlyph( - mediaType = mediaType, - modifier = Modifier.align(Alignment.BottomStart).padding(9.dp), - ) - } - Column( - Modifier - .weight(1f) - .fillMaxHeight() - .padding(start = 14.dp, end = 14.dp, top = 11.dp, bottom = 10.dp), - verticalArrangement = Arrangement.Center, - ) { - Text( - title, - color = Color.White, - fontSize = 17.sp, - fontWeight = FontWeight.Bold, - maxLines = 1, - overflow = TextOverflow.Ellipsis, - ) - if (subtitle.isNotBlank()) { - Spacer(Modifier.height(5.dp)) - Text( - subtitle, - color = Color.White.copy(alpha = 0.82f), - fontSize = 13.sp, - fontWeight = FontWeight.Medium, - maxLines = 1, - overflow = TextOverflow.Ellipsis, - ) - } - // The bar sits above the sentence rather than under it, so the quiet line - // stays last on every card whether or not there is a bar — a card with no - // measurable download and one with a finished one must read as the same - // shape. requestProgressFraction is what decides there is one at all: only - // moving bytes have a denominator, and a bar standing somewhere arbitrary - // under a card that is merely being searched for would be the single most - // misleading thing on the page. - requestProgressFraction(status, progress)?.let { fraction -> - Spacer(Modifier.height(7.dp)) - RequestProgressBar(fraction = fraction, colour = requestToneColour(status)) - } - Spacer(Modifier.height(4.dp)) - Text( - detail, - color = requestToneColour(status), - fontSize = 11.sp, - fontWeight = FontWeight.SemiBold, - maxLines = 1, - overflow = TextOverflow.Ellipsis, - ) + modifier = modifier, + artworkTopStartContent = if (status != RequestStatus.REQUESTABLE) { + { RequestStatusBadge(status, requestStatusChipLabel(status, statusLabel, progress)) } + } else { + null + }, + artworkBottomStartContent = { + MediaResultTypeGlyph(isSeries = mediaType.equals("series", ignoreCase = true)) + }, + bodyContent = requestProgressFraction(status, progress)?.let { fraction -> + { + Spacer(Modifier.height(7.dp)) + RequestProgressBar(fraction = fraction, colour = requestToneColour(status)) } + }, + trailingContent = { focused -> if (busy) { RequestTrailing(icon = MembyIcon.Schedule.mark, label = "Asking", focused = focused) } else if (action != null) { RequestTrailing(icon = action.icon.mark, label = action.label, focused = focused) } - } - } + }, + ) } /** The trailing affordance on a card: what the centre button would do. */ @@ -337,24 +249,6 @@ internal fun requestToneColour(status: String): Color = when (requestStatusTone( * series takes weeks to arrive and a film does not — but it is not worth a second text * badge competing with the state. */ -@Composable -private fun MediaTypeGlyph(mediaType: String, modifier: Modifier = Modifier) { - val icon = if (mediaType == "series") MembyIcon.Tv.mark else MembyIcon.Movie.mark - Box( - modifier - .size(24.dp) - .background(MembySurface.copy(alpha = 0.72f), RoundedCornerShape(6.dp)), - contentAlignment = Alignment.Center, - ) { - Icon( - icon, - contentDescription = if (mediaType == "series") "Series" else "Film", - tint = Color.White.copy(alpha = 0.82f), - modifier = Modifier.size(13.dp), - ) - } -} - /** * The card's shape with nothing in it, shown while the first list is loading. * @@ -364,35 +258,5 @@ private fun MediaTypeGlyph(mediaType: String, modifier: Modifier = Modifier) { */ @Composable internal fun RequestCardSkeleton(modifier: Modifier = Modifier) { - val shape = RoundedCornerShape(MembyCardCorner) - Row( - modifier - .fillMaxWidth() - .height(118.dp) - .clip(shape) - .background(MembySurfaceRaised.copy(alpha = 0.34f)) - .border(1.dp, Color.White.copy(alpha = 0.05f), shape), - ) { - Box(Modifier.width(214.dp).fillMaxHeight().background(MembySurface.copy(alpha = 0.55f))) - Column( - Modifier.weight(1f).fillMaxHeight().padding(horizontal = 14.dp), - verticalArrangement = Arrangement.Center, - ) { - SkeletonBar(widthFraction = 0.52f, height = 15.dp) - Spacer(Modifier.height(9.dp)) - SkeletonBar(widthFraction = 0.32f, height = 11.dp) - Spacer(Modifier.height(7.dp)) - SkeletonBar(widthFraction = 0.22f, height = 9.dp) - } - } -} - -@Composable -private fun SkeletonBar(widthFraction: Float, height: androidx.compose.ui.unit.Dp) { - Box( - Modifier - .fillMaxWidth(widthFraction) - .height(height) - .background(Color.White.copy(alpha = 0.06f), RoundedCornerShape(4.dp)), - ) + MediaResultCardSkeleton(modifier) } diff --git a/app/src/main/java/com/ponzischeme89/memby/ui/search/SearchScreen.kt b/app/src/main/java/com/ponzischeme89/memby/ui/search/SearchScreen.kt index 34a0a1c..44282a8 100644 --- a/app/src/main/java/com/ponzischeme89/memby/ui/search/SearchScreen.kt +++ b/app/src/main/java/com/ponzischeme89/memby/ui/search/SearchScreen.kt @@ -37,11 +37,8 @@ import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyRow import androidx.compose.foundation.lazy.grid.GridCells -import androidx.compose.foundation.lazy.grid.GridItemSpan import androidx.compose.foundation.lazy.grid.LazyVerticalGrid import androidx.compose.foundation.lazy.grid.itemsIndexed -import androidx.compose.foundation.lazy.grid.rememberLazyGridState -import androidx.compose.foundation.lazy.itemsIndexed as rowItemsIndexed import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect @@ -69,7 +66,6 @@ import androidx.compose.ui.input.key.type import androidx.compose.ui.input.key.utf16CodePoint import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.semantics.contentDescription import androidx.compose.ui.semantics.semantics import androidx.compose.ui.text.font.FontWeight @@ -83,13 +79,13 @@ import androidx.tv.material3.Icon import androidx.tv.material3.Text import coil.compose.AsyncImage import coil.imageLoader -import coil.request.ImageRequest import com.ponzischeme89.memby.ServiceLocator import com.ponzischeme89.memby.data.model.BaseItem import com.ponzischeme89.memby.data.model.GatewayRequestCandidate import com.ponzischeme89.memby.ui.FocusScaleContainer import com.ponzischeme89.memby.ui.MembyChoiceChip -import com.ponzischeme89.memby.ui.PosterGridCard +import com.ponzischeme89.memby.ui.search.components.SearchGenres +import com.ponzischeme89.memby.ui.search.components.SearchResults import com.ponzischeme89.memby.ui.theme.MembyAccent import com.ponzischeme89.memby.ui.theme.MembyAccentInk import com.ponzischeme89.memby.ui.theme.MembyAccentMuted @@ -127,18 +123,6 @@ private val KeyboardRows = listOf( /** Left pane share of the width. Wide enough for six comfortable keys at TV distance. */ private const val KEYBOARD_PANE_FRACTION = 0.35f -/** Posters prefetched as soon as results land, so the first visible row is never blank. */ -private const val PREFETCHED_POSTERS = 8 - -/** - * How far from the end of a genre the next page is asked for, in rows. - * - * Two rows rather than one: a D-pad walks a row at a time and the request has to be in - * flight before the viewer arrives at the bottom, or the scroll stops dead and the shelf - * reads as having ended. - */ -private const val LOAD_MORE_ROWS_AHEAD = 2 - /** * Full-screen search: keyboard on the left, results on the right, updating as you type. * @@ -168,7 +152,8 @@ fun SearchScreen( LaunchedEffect(discoveryItems) { viewModel.setDiscoveryItems(discoveryItems) } - val resultsEntry = remember { FocusRequester() } + val genresEntry = remember { FocusRequester() } + val searchResultsEntry = remember { FocusRequester() } // The rail and the screen agree on one entry target: Search opens on the keyboard, // just as browse destinations open on their primary content action. val keyboardEntry = contentFocusRequester @@ -191,23 +176,21 @@ fun SearchScreen( } val hasResultsTarget = when { state.errorMessage != null && state.results.isEmpty() -> true - state.isDiscovery -> discoveryItems.isNotEmpty() || state.genreSuggestions.isNotEmpty() - else -> state.results.isNotEmpty() || state.requestCandidates.isNotEmpty() || + state.isDiscovery -> state.genreSuggestions.isNotEmpty() + else -> state.results.any { it.isMovie || it.isSeries } || state.requestCandidates.isNotEmpty() || (state.requestsAvailable && shouldSearch(state.query)) } LaunchedEffect(Unit) { runCatching { keyboardEntry.requestFocus() } } - // A genre chip unmounts the moment its shelf opens — the whole discovery pane goes with - // it — so the focus it was holding belongs to nothing unless something takes it. The - // grid claims it as soon as there is a card to land on, which is where the viewer is - // already looking; a genre that came back empty or failed hands the remote back to the - // keyboard rather than leaving a television with nothing focused at all. + // The genre strip remains above its shelf. Once a first result exists the list takes + // focus, which is where the viewer is already looking; an empty genre hands the remote + // back to the keyboard rather than leaving the television on a dead end. LaunchedEffect(state.genre, state.results.isEmpty(), state.isLoading, state.errorMessage) { if (state.genre == null) return@LaunchedEffect when { - state.results.isNotEmpty() || state.errorMessage != null -> - if (runCatching { resultsEntry.requestFocus() }.isSuccess) focusInResults = true + state.results.any { it.isMovie || it.isSeries } || state.errorMessage != null -> + if (runCatching { searchResultsEntry.requestFocus() }.isSuccess) focusInResults = true !state.isLoading -> runCatching { keyboardReturn.requestFocus() } // Still loading: the branch above takes it the moment the first page lands. else -> Unit @@ -216,10 +199,9 @@ fun SearchScreen( LaunchedEffect(state.genre, restoreGenreChipFocus) { if (state.genre == null && restoreGenreChipFocus) { - // clearGenre remounts discovery and its genre chips. Wait for the first chip's - // focus node before handing the remote back to where this level was opened. - kotlinx.coroutines.delay(16L) - if (runCatching { resultsEntry.requestFocus() }.isSuccess) focusInResults = true + // The strip stays mounted while a genre is open, so Back can restore its stable + // entry target as soon as the result list has left composition. + if (runCatching { genresEntry.requestFocus() }.isSuccess) focusInResults = true restoreGenreChipFocus = false } } @@ -267,7 +249,7 @@ fun SearchScreen( SearchPane( state = state, navigationFocusRequester = navigationFocusRequester, - resultsEntry = resultsEntry, + resultsEntry = if (state.genreSuggestions.isNotEmpty()) genresEntry else searchResultsEntry, keyboardEntry = keyboardEntry, keyboardReturn = keyboardReturn, lastKeyIndex = lastKeyIndex, @@ -285,27 +267,61 @@ fun SearchScreen( .fillMaxWidth(KEYBOARD_PANE_FRACTION) .fillMaxHeight(), ) - ResultsPane( - state = state, - resultsEntry = resultsEntry, - keyboardReturn = keyboardReturn, - returnFocusItemId = returnFocusItemId, - returnFocusRequester = returnFocusRequester, - discoveryItems = discoveryItems, - onItemFocused = { item -> - focusInResults = true - onContentFocused() - onItemFocused(item) - }, - onItemSelected = onItemSelected, - onRetry = viewModel::retry, - onRequest = viewModel::request, - onShowRequests = viewModel::showRequests, - onGenreSelected = viewModel::onGenreSelected, - onBackFromGenre = closeGenre, - onLoadMore = viewModel::loadMore, - modifier = Modifier.fillMaxHeight(), - ) + Column( + Modifier + .weight(1f) + .fillMaxHeight() + .padding(start = 28.dp, end = 32.dp, top = 24.dp, bottom = 12.dp), + ) { + SearchGenres( + genres = state.genreSuggestions, + entryFocusRequester = genresEntry, + keyboardReturnFocusRequester = keyboardReturn, + resultsFocusRequester = searchResultsEntry, + resultsHaveFocusTarget = state.results.any { it.isMovie || it.isSeries } || + (state.errorMessage != null && state.results.isEmpty()) || + (state.requestsAvailable && shouldSearch(state.query)), + onFocused = { + focusInResults = true + onContentFocused() + }, + onSelected = viewModel::onGenreSelected, + ) + Spacer(Modifier.height(14.dp)) + + if (state.requestMode) { + RequestOptions( + state = state, + resultsEntry = searchResultsEntry, + keyboardReturn = keyboardReturn, + onRequest = viewModel::request, + modifier = Modifier.weight(1f), + ) + } else { + SearchResults( + state = state, + entryFocusRequester = searchResultsEntry, + genresFocusRequester = genresEntry, + genresPresent = state.genreSuggestions.isNotEmpty(), + keyboardReturnFocusRequester = keyboardReturn, + returnFocusItemId = returnFocusItemId, + returnFocusRequester = returnFocusRequester, + artworkUrlFor = { item -> + repository.primaryUrl(item, 500) ?: repository.backdropUrl(item, 500) + }, + onItemFocused = { item -> + focusInResults = true + onContentFocused() + onItemFocused(item) + }, + onItemSelected = onItemSelected, + onRetry = viewModel::retry, + onShowRequests = viewModel::showRequests, + onLoadMore = viewModel::loadMore, + modifier = Modifier.weight(1f), + ) + } + } } } @@ -558,7 +574,7 @@ internal fun TvKeyboard( modifier = Modifier .weight(1f) // Explicit edges. Left of the first column is the navigation - // rail, right of the last is the results grid: focus can + // rail, right of the last enters Search's discovery/results pane: focus can // always get out of this pane, and never falls off it. .focusProperties { if (columnIndex == 0) left = navigationFocusRequester @@ -791,293 +807,6 @@ private fun LoadingDot() { ) } -@Composable -private fun ResultsPane( - state: SearchUiState, - resultsEntry: FocusRequester, - keyboardReturn: FocusRequester, - returnFocusItemId: String?, - returnFocusRequester: FocusRequester, - discoveryItems: List, - onItemFocused: (BaseItem) -> Unit, - onItemSelected: (BaseItem) -> Unit, - onRetry: () -> Unit, - onRequest: (GatewayRequestCandidate) -> Unit, - onShowRequests: () -> Unit, - onGenreSelected: (String) -> Unit, - onBackFromGenre: () -> Unit, - onLoadMore: () -> Unit, - modifier: Modifier = Modifier, -) { - BoxWithConstraints( - modifier = modifier - .fillMaxWidth() - .padding(start = 28.dp, end = 32.dp, top = 28.dp, bottom = 12.dp), - ) { - val columns = if (maxWidth > 760.dp) 5 else 4 - val cardWidth = ((maxWidth - CARD_SPACING * (columns - 1)) / columns) - .coerceIn(120.dp, 200.dp) - - // Discovery, results, error and "no matches" all share this pane. Only the - // heading and the item source change, so the grid never unmounts and remounts. - val showingDiscovery = state.isDiscovery - val items = if (showingDiscovery) discoveryItems else state.results - - Column(Modifier.fillMaxSize()) { - ResultsHeading( - state = state, - showingDiscovery = showingDiscovery, - onBackFromGenre = onBackFromGenre, - onShowRequests = onShowRequests, - requestFocusRequester = resultsEntry, - keyboardReturn = keyboardReturn, - ) - val genres = state.genreSuggestions - if (showingDiscovery && genres.isNotEmpty()) { - Spacer(Modifier.height(8.dp)) - GenreTiles( - genres = genres, - resultsEntry = resultsEntry, - keyboardReturn = keyboardReturn, - // A genre opens the shelf of titles that are in it: running its name - // through search matched a film called Drama and missed most of the - // drama. - onSelected = onGenreSelected, - ) - } - Spacer(Modifier.height(12.dp)) - - when { - state.errorMessage != null && state.results.isEmpty() -> SearchError( - message = state.errorMessage, - onRetry = onRetry, - resultsEntry = resultsEntry, - keyboardReturn = keyboardReturn, - ) - !showingDiscovery && state.requestMode -> - RequestOptions( - state = state, - resultsEntry = resultsEntry, - keyboardReturn = keyboardReturn, - onRequest = onRequest, - modifier = Modifier.weight(1f), - ) - items.isEmpty() -> SearchEmptyMessage(state = state, showingDiscovery = showingDiscovery) - else -> ResultsGrid( - items = items, - columns = columns, - cardWidth = cardWidth, - resultsEntry = resultsEntry, - keyboardReturn = keyboardReturn, - returnFocusItemId = returnFocusItemId, - returnFocusRequester = returnFocusRequester, - onItemFocused = onItemFocused, - onItemSelected = onItemSelected, - // Only a genre pages. A search is one response, and asking the grid to - // watch for the end of a list that has no more behind it is a scroll - // listener running for nothing. - paging = state.genre != null && (state.canLoadMore || state.isLoadingMore), - loadingMore = state.isLoadingMore, - pagingErrorMessage = state.pagingErrorMessage, - onRetryPage = onRetry, - onLoadMore = onLoadMore, - ) - } - } - } -} - -@Composable -private fun ResultsHeading( - state: SearchUiState, - showingDiscovery: Boolean, - onBackFromGenre: () -> Unit, - onShowRequests: () -> Unit, - requestFocusRequester: FocusRequester, - keyboardReturn: FocusRequester, -) { - val title = when { - showingDiscovery -> "Browse your library" - // A genre says what it is. It was never searched for, so calling it a search result - // would misdescribe both where the titles came from and how to get out of it. - state.genre != null -> state.genre - state.isEmptyResult -> "Search results — no matches" - else -> "Search results for “${state.query.trim()}”" - } - Row(verticalAlignment = Alignment.CenterVertically) { - if (state.genre != null) { - FocusScaleContainer( - onFocused = {}, - onClick = onBackFromGenre, - contentDescription = "Back to search", - modifier = Modifier.size(40.dp).clip(RoundedCornerShape(10.dp)), - ) { focused -> - Box( - modifier = Modifier - .fillMaxSize() - .background(if (focused) Color.White else KeyIdle), - contentAlignment = Alignment.Center, - ) { - Icon( - MembyIcon.ArrowBack.mark, - contentDescription = null, - tint = if (focused) KeyLabelFocused else Heading, - modifier = Modifier.size(21.dp), - ) - } - } - Spacer(Modifier.width(12.dp)) - } - Text( - title, - color = Heading, - fontSize = 22.sp, - fontWeight = FontWeight.SemiBold, - maxLines = 1, - overflow = TextOverflow.Ellipsis, - modifier = Modifier.weight(1f, fill = false), - ) - // The count belongs to a search, where it is the whole answer. On a genre it would - // be the number of cards fetched so far, which grows as the viewer scrolls and - // describes the paging rather than the library. - if (state.genre == null && !showingDiscovery && state.results.isNotEmpty()) { - Spacer(Modifier.width(10.dp)) - Text("${state.results.size}", color = Muted, fontSize = 16.sp) - } - if (state.requestsAvailable && state.genre == null && !showingDiscovery && !state.requestMode) { - Spacer(Modifier.width(14.dp)) - MembyChoiceChip( - label = "Request", - selected = false, - onClick = onShowRequests, - modifier = Modifier - .then(if (state.results.isEmpty()) Modifier.focusRequester(requestFocusRequester) else Modifier) - .focusProperties { left = keyboardReturn }, - ) - } - } -} - -@Composable -private fun ResultsGrid( - items: List, - columns: Int, - cardWidth: Dp, - resultsEntry: FocusRequester, - keyboardReturn: FocusRequester, - returnFocusItemId: String?, - returnFocusRequester: FocusRequester, - onItemFocused: (BaseItem) -> Unit, - onItemSelected: (BaseItem) -> Unit, - paging: Boolean = false, - loadingMore: Boolean = false, - pagingErrorMessage: String? = null, - onRetryPage: () -> Unit = {}, - onLoadMore: () -> Unit = {}, -) { - val context = LocalContext.current - val density = LocalDensity.current - val gridState = rememberLazyGridState() - val currentOnLoadMore by rememberUpdatedState(onLoadMore) - - // Infinite scroll. Read in a snapshotFlow rather than from the composable body: the - // last visible index changes on every frame of a scroll, and reading it up here would - // recompose the whole grid the entire way down a genre. The next page is asked for a - // row early — the request has to be in flight before the viewer arrives at the end, or - // the scroll stops dead while they wait for it. - if (paging) { - LaunchedEffect(gridState, items.size, columns) { - snapshotFlow { gridState.layoutInfo.visibleItemsInfo.lastOrNull()?.index ?: -1 } - .distinctUntilChanged() - .collect { last -> - if (last >= items.size - columns * LOAD_MORE_ROWS_AHEAD) currentOnLoadMore() - } - } - } - - // Warm the first screenful so the grid does not fill in card by card. Keyed on the - // ids rather than the list, so an unchanged result set never re-fetches. - val prefetchKey = remember(items) { items.take(PREFETCHED_POSTERS).joinToString("|") { it.id } } - LaunchedEffect(prefetchKey, cardWidth) { - val repo = ServiceLocator.repository - val widthPx = with(density) { cardWidth.roundToPx() }.coerceIn(180, 720) - items.take(PREFETCHED_POSTERS).forEach { item -> - val url = repo.primaryUrl(item, widthPx) ?: repo.backdropUrl(item, widthPx) - ?: return@forEach - context.imageLoader.execute( - ImageRequest.Builder(context) - .data(url) - .size(widthPx, (widthPx * 3f / 2f).toInt()) - .allowHardware(true) - .crossfade(false) - .build(), - ) - } - } - - LazyVerticalGrid( - columns = GridCells.Fixed(columns), - state = gridState, - horizontalArrangement = Arrangement.spacedBy(CARD_SPACING), - verticalArrangement = Arrangement.spacedBy(18.dp), - modifier = Modifier - .fillMaxSize(), - ) { - // itemsIndexed, not items + indexOf: BaseItem is a data class, so indexOf would - // run a deep equals per card per composition on the app's hottest new screen. - itemsIndexed(items, key = { _, item -> item.id }, contentType = { _, _ -> "search-result" }) { index, item -> - PosterGridCard( - item = item, - width = cardWidth, - onFocused = { onItemFocused(item) }, - onClick = { onItemSelected(item) }, - onLongClick = { onItemSelected(item) }, - modifier = Modifier - .then(if (index == 0) Modifier.focusRequester(resultsEntry) else Modifier) - .then( - if (item.id == returnFocusItemId) { - Modifier.focusRequester(returnFocusRequester) - } else { - Modifier - }, - ) - // Leftmost column goes back to the keyboard rather than nowhere. - .focusProperties { - if (index % columns == 0) left = keyboardReturn - }, - ) - } - if (loadingMore) { - // A full-width row rather than a card-shaped placeholder: a skeleton card is - // something a remote tries to focus, and there is nothing there to open. - item(span = { GridItemSpan(maxLineSpan) }, contentType = "search-paging") { - Row( - modifier = Modifier.fillMaxWidth().padding(vertical = 12.dp), - horizontalArrangement = Arrangement.Center, - verticalAlignment = Alignment.CenterVertically, - ) { - LoadingDot() - Spacer(Modifier.width(10.dp)) - Text("Loading more", color = Muted, fontSize = 13.sp) - } - } - } - if (pagingErrorMessage != null) { - item(span = { GridItemSpan(maxLineSpan) }, contentType = "search-paging-error") { - Row( - modifier = Modifier.fillMaxWidth().padding(vertical = 12.dp), - horizontalArrangement = Arrangement.Center, - verticalAlignment = Alignment.CenterVertically, - ) { - Text("Couldn’t load more titles.", color = Muted, fontSize = 13.sp) - Spacer(Modifier.width(10.dp)) - MembyChoiceChip(label = "Try again", selected = false, onClick = onRetryPage) - } - } - } - } -} - @Composable private fun RequestOptions( state: SearchUiState, @@ -1346,118 +1075,6 @@ internal fun RecommendationRequestPreview(previewArtwork: ImageBitmap? = null) { } } -private val GenreColors = listOf( - Color(0xFFB85C38), Color(0xFF5578C8), Color(0xFF7B5AB6), - Color(0xFF2F8F83), Color(0xFFD18A32), Color(0xFFB44E76), -) - -private fun genreIcon(label: String): ImageVector = when { - label.contains("comedy", true) -> MembyIcon.Drama.mark - label.contains("music", true) -> MembyIcon.LiveTv.mark - label.contains("children", true) || label.contains("family", true) -> MembyIcon.Happy.mark - label.contains("sport", true) -> MembyIcon.PlayCircle.mark - label.contains("document", true) -> MembyIcon.Movie.mark - else -> MembyIcon.Sparkle.mark -} - -@Composable -private fun GenreTiles( - genres: List, - resultsEntry: FocusRequester, - keyboardReturn: FocusRequester, - onSelected: (String) -> Unit, -) { - LazyRow(horizontalArrangement = Arrangement.spacedBy(8.dp)) { - rowItemsIndexed(genres.take(6), key = { _, item -> item }) { index, genre -> - val color = GenreColors[index % GenreColors.size] - FocusScaleContainer( - onFocused = {}, - onClick = { onSelected(genre) }, - contentDescription = "Search the $genre genre", - modifier = Modifier - .width(126.dp) - .height(72.dp) - .clip(RoundedCornerShape(10.dp)) - .then(if (index == 0) Modifier.focusRequester(resultsEntry) else Modifier) - .focusProperties { if (index == 0) left = keyboardReturn }, - ) { focused -> - Box( - Modifier - .fillMaxSize() - .background(if (focused) color.copy(alpha = 0.95f) else color), - ) { - Icon( - genreIcon(genre), - contentDescription = null, - tint = Color.White.copy(alpha = 0.9f), - modifier = Modifier - .align(Alignment.TopEnd) - .padding(10.dp) - .size(30.dp), - ) - Text( - genre, - color = Color.White, - fontSize = 14.sp, - fontWeight = FontWeight.Bold, - maxLines = 2, - overflow = TextOverflow.Ellipsis, - modifier = Modifier.align(Alignment.BottomStart).padding(10.dp), - ) - } - } - } - } -} - -@Composable -private fun SearchEmptyMessage(state: SearchUiState, showingDiscovery: Boolean) { - val message = when { - showingDiscovery -> "Type a couple of letters to search, or pick up where the home screen left off." - // A genre was never searched for, and saying so while a shelf opens is the one - // moment the difference is invisible on screen. - state.genre != null && state.isLoading -> "Loading ${state.genre}…" - state.genre != null -> "Nothing in this library is tagged ${state.genre}." - state.isLoading -> "Searching…" - state.requestLookupLoading -> "Nothing in the library. Checking available movies and shows…" - else -> "Nothing in this library matches that. Try fewer letters, or a different spelling." - } - Text(message, color = Muted, fontSize = 17.sp, modifier = Modifier.padding(top = 40.dp)) -} - -@Composable -private fun SearchError( - message: String, - onRetry: () -> Unit, - resultsEntry: FocusRequester, - keyboardReturn: FocusRequester, -) { - Column(Modifier.padding(top = 36.dp)) { - Text(message, color = Heading, fontSize = 18.sp) - Spacer(Modifier.height(14.dp)) - FocusScaleContainer( - onFocused = {}, - onClick = onRetry, - contentDescription = "Try the search again", - modifier = Modifier - .clip(RoundedCornerShape(10.dp)) - .focusRequester(resultsEntry) - .focusProperties { left = keyboardReturn }, - ) { focused -> - Text( - "Try again", - color = if (focused) KeyLabelFocused else KeyLabel, - fontSize = 16.sp, - fontWeight = FontWeight.SemiBold, - modifier = Modifier - .background(if (focused) KeyFocused else KeyIdle) - .padding(horizontal = 22.dp, vertical = 11.dp), - ) - } - } -} - -private val CARD_SPACING = 16.dp private const val KEYBOARD_COLUMNS = 6 private const val ACTION_ROW_INDEX = 36 diff --git a/app/src/main/java/com/ponzischeme89/memby/ui/search/SearchViewModel.kt b/app/src/main/java/com/ponzischeme89/memby/ui/search/SearchViewModel.kt index 5a0926c..852a820 100644 --- a/app/src/main/java/com/ponzischeme89/memby/ui/search/SearchViewModel.kt +++ b/app/src/main/java/com/ponzischeme89/memby/ui/search/SearchViewModel.kt @@ -36,13 +36,13 @@ data class SearchUiState( * clearing something the viewer never typed. */ val genre: String? = null, - /** A further page is on its way. The grid keeps what it has and adds a footer. */ + /** A further page is on its way. The result list keeps what it has and adds a footer. */ val isLoadingMore: Boolean = false, /** * How far into the genre the shelf has read, counted the way the *backend* counts it. * * Deliberately not `results.size`. A duplicate arriving across a page boundary is - * dropped on the way in — the grid is keyed by item id, so a repeat would be a crash + * dropped on the way in — the result list is keyed by item id, so a repeat would be a crash * rather than a doubled poster — and if the offset were then derived from the length * of the list, the next page would be requested from before where the last one ended * and would return the same cards again, for ever. @@ -216,8 +216,8 @@ class SearchViewModel(private val repository: EmbyRepository) : ViewModel() { } /** - * The grid is near the end of what it holds. Ignored unless there is a genre open, more - * of it to fetch and nothing already in flight — the grid asks on every scroll, and it + * The result list is near the end of what it holds. Ignored unless there is a genre open, + * more of it to fetch and nothing already in flight — the list asks on every scroll, and it * is cheaper to refuse here than to make the screen keep track. */ fun loadMore() { @@ -340,7 +340,7 @@ class SearchViewModel(private val repository: EmbyRepository) : ViewModel() { * Appending by [GenrePage.offset] rather than trusting the order of arrival is what * makes a slow page harmless: only a page that starts where the shelf currently ends is * taken, so a response for an offset the viewer has already scrolled past — or one from - * a genre they have left — is dropped rather than pasted into the middle of the grid. + * a genre they have left — is dropped rather than pasted into the middle of the list. */ private suspend fun loadGenrePage(genre: String, offset: Int) { runCatching { repository.browseGenre(genre, offset = offset, limit = GENRE_PAGE_SIZE) } @@ -350,7 +350,7 @@ class SearchViewModel(private val repository: EmbyRepository) : ViewModel() { // A paging boundary is the one place a backend realistically repeats a // card: the shelf is ordered by premiere date and sort name precisely // because two titles sharing a date could otherwise swap places between - // two requests. If one slips through anyway, the grid is keyed by item + // two requests. If one slips through anyway, the result list is keyed by item // id and a repeat is a crash, not a duplicate poster — so the page is // appended minus anything already on the shelf, and how far the shelf // has read is counted in what the backend sent rather than in what @@ -435,7 +435,7 @@ class SearchViewModel(private val repository: EmbyRepository) : ViewModel() { } // The gateway answers from the imported library and falls back to Emby // before the first import has finished, so one title reaching the pane by - // both routes is a shape this search genuinely has. The grid is keyed by + // both routes is a shape this search genuinely has. The result list is keyed by // item id, where that is a crash rather than a repeated poster. val items = found.distinctItems() // Gateway payloads carry the backend ranker's score. Preserve that diff --git a/app/src/main/java/com/ponzischeme89/memby/ui/search/components/SearchGenres.kt b/app/src/main/java/com/ponzischeme89/memby/ui/search/components/SearchGenres.kt new file mode 100644 index 0000000..cbecfd6 --- /dev/null +++ b/app/src/main/java/com/ponzischeme89/memby/ui/search/components/SearchGenres.kt @@ -0,0 +1,117 @@ +package com.ponzischeme89.memby.ui.search.components + +import androidx.compose.foundation.background +import androidx.compose.foundation.border +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.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.lazy.LazyRow +import androidx.compose.foundation.lazy.itemsIndexed +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.focus.FocusRequester +import androidx.compose.ui.focus.focusProperties +import androidx.compose.ui.focus.focusRequester +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.tv.material3.Text +import com.ponzischeme89.memby.ui.FocusScaleContainer +import com.ponzischeme89.memby.ui.theme.MembyOnSurface + +/** Search's compact discovery strip. Genre colours stay recognisable but sit near-black. */ +@Composable +internal fun SearchGenres( + genres: List, + entryFocusRequester: FocusRequester, + keyboardReturnFocusRequester: FocusRequester, + resultsFocusRequester: FocusRequester, + resultsHaveFocusTarget: Boolean, + onFocused: () -> Unit, + onSelected: (String) -> Unit, + modifier: Modifier = Modifier, +) { + if (genres.isEmpty()) return + + Column(modifier) { + Text( + "Genres ›", + color = MembyOnSurface, + fontSize = 20.sp, + fontWeight = FontWeight.SemiBold, + ) + LazyRow( + horizontalArrangement = Arrangement.spacedBy(8.dp), + modifier = Modifier.padding(top = 8.dp), + ) { + itemsIndexed(genres.take(6), key = { _, genre -> genre }) { index, genre -> + val colour = GenreColours[index % GenreColours.size] + FocusScaleContainer( + onFocused = onFocused, + onClick = { onSelected(genre) }, + contentDescription = "Browse the $genre genre", + modifier = Modifier + .width(126.dp) + .height(64.dp) + .clip(GenreShape) + .then(if (index == 0) Modifier.focusRequester(entryFocusRequester) else Modifier) + .focusProperties { + if (index == 0) left = keyboardReturnFocusRequester + if (resultsHaveFocusTarget) down = resultsFocusRequester + }, + ) { focused -> + Box( + Modifier + .fillMaxSize() + .background(if (focused) colour.copy(alpha = 0.98f) else colour) + .border( + if (focused) 2.dp else 1.dp, + if (focused) Color.White else Color.White.copy(alpha = 0.10f), + GenreShape, + ) + .padding(horizontal = 11.dp, vertical = 9.dp), + ) { + Text( + genre, + color = Color.White, + fontSize = 14.sp, + fontWeight = FontWeight.Bold, + maxLines = 2, + overflow = TextOverflow.Ellipsis, + modifier = Modifier.align(Alignment.CenterStart).padding(end = 18.dp), + ) + Text( + "›", + color = Color.White.copy(alpha = if (focused) 1f else 0.72f), + fontSize = 22.sp, + fontWeight = FontWeight.Medium, + modifier = Modifier.align(Alignment.CenterEnd), + ) + } + } + } + } + } +} + +private val GenreShape = RoundedCornerShape(10.dp) + +/** Dark, desaturated counterparts of Search's established genre palette. */ +private val GenreColours = listOf( + Color(0xFF4A332C), + Color(0xFF303B50), + Color(0xFF3D334B), + Color(0xFF263F3B), + Color(0xFF4A3A29), + Color(0xFF49303A), +) diff --git a/app/src/main/java/com/ponzischeme89/memby/ui/search/components/SearchResults.kt b/app/src/main/java/com/ponzischeme89/memby/ui/search/components/SearchResults.kt new file mode 100644 index 0000000..6995069 --- /dev/null +++ b/app/src/main/java/com/ponzischeme89/memby/ui/search/components/SearchResults.kt @@ -0,0 +1,257 @@ +package com.ponzischeme89.memby.ui.search.components + +import androidx.compose.foundation.layout.Arrangement +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.width +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.itemsIndexed +import androidx.compose.foundation.lazy.rememberLazyListState +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.rememberUpdatedState +import androidx.compose.runtime.snapshotFlow +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.focus.FocusRequester +import androidx.compose.ui.focus.focusProperties +import androidx.compose.ui.focus.focusRequester +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.tv.material3.Text +import com.ponzischeme89.memby.data.model.BaseItem +import com.ponzischeme89.memby.ui.MembyChoiceChip +import com.ponzischeme89.memby.ui.components.media.MediaResultCard +import com.ponzischeme89.memby.ui.components.media.MediaResultCardSkeleton +import com.ponzischeme89.memby.ui.components.media.MediaResultTypeGlyph +import com.ponzischeme89.memby.ui.search.SearchUiState +import com.ponzischeme89.memby.ui.search.shouldSearch +import com.ponzischeme89.memby.ui.theme.FactSeparator +import com.ponzischeme89.memby.ui.theme.MembyAccent +import com.ponzischeme89.memby.ui.theme.MembyMutedText +import com.ponzischeme89.memby.ui.theme.MembyOnSurface +import kotlinx.coroutines.flow.distinctUntilChanged + +/** Search-owned result state rendered through the same media row as My Requests. */ +@Composable +internal fun SearchResults( + state: SearchUiState, + entryFocusRequester: FocusRequester, + genresFocusRequester: FocusRequester, + genresPresent: Boolean, + keyboardReturnFocusRequester: FocusRequester, + returnFocusItemId: String?, + returnFocusRequester: FocusRequester, + artworkUrlFor: (BaseItem) -> String?, + onItemFocused: (BaseItem) -> Unit, + onItemSelected: (BaseItem) -> Unit, + onRetry: () -> Unit, + onShowRequests: () -> Unit, + onLoadMore: () -> Unit, + modifier: Modifier = Modifier, +) { + val items = state.results.filter { it.isMovie || it.isSeries } + val listState = rememberLazyListState() + val currentOnLoadMore by rememberUpdatedState(onLoadMore) + + if (state.genre != null && (state.canLoadMore || state.isLoadingMore)) { + LaunchedEffect(listState, items.size) { + snapshotFlow { listState.layoutInfo.visibleItemsInfo.lastOrNull()?.index ?: -1 } + .distinctUntilChanged() + .collect { last -> + if (last >= items.lastIndex - LOAD_MORE_ITEMS_AHEAD) currentOnLoadMore() + } + } + } + + Column(modifier) { + SearchResultsHeading( + state = state, + resultCount = items.size, + onShowRequests = onShowRequests, + requestFocusRequester = entryFocusRequester, + keyboardReturnFocusRequester = keyboardReturnFocusRequester, + ) + Spacer(Modifier.height(8.dp)) + + when { + state.isLoading && items.isEmpty() -> Column( + verticalArrangement = Arrangement.spacedBy(10.dp), + modifier = Modifier.fillMaxSize(), + ) { + repeat(3) { MediaResultCardSkeleton() } + } + + state.errorMessage != null && items.isEmpty() -> SearchResultMessage( + message = state.errorMessage, + action = "Try again", + onAction = onRetry, + actionFocusRequester = entryFocusRequester, + genresFocusRequester = genresFocusRequester.takeIf { genresPresent }, + keyboardReturnFocusRequester = keyboardReturnFocusRequester, + ) + + items.isEmpty() -> SearchResultMessage(message = emptyMessage(state)) + + else -> LazyColumn( + state = listState, + verticalArrangement = Arrangement.spacedBy(10.dp), + modifier = Modifier.fillMaxSize(), + ) { + itemsIndexed(items, key = { _, item -> item.id }) { index, item -> + MediaResultCard( + title = item.name, + subtitle = searchResultSubtitle(item), + detail = item.genres.firstOrNull().orEmpty().ifBlank { "In your library" }, + artworkUrl = artworkUrlFor(item), + contentDescription = listOf(item.name, searchResultSubtitle(item)) + .filter(String::isNotBlank) + .joinToString(", "), + onFocused = { onItemFocused(item) }, + onClick = { onItemSelected(item) }, + artworkBottomStartContent = { + MediaResultTypeGlyph(isSeries = item.isSeries) + }, + modifier = Modifier + .then(if (index == 0) Modifier.focusRequester(entryFocusRequester) else Modifier) + .then( + if (item.id == returnFocusItemId) { + Modifier.focusRequester(returnFocusRequester) + } else { + Modifier + }, + ) + .focusProperties { + left = keyboardReturnFocusRequester + if (index == 0 && genresPresent) up = genresFocusRequester + }, + ) + } + if (state.isLoadingMore) { + item(key = "search-loading-more") { + Text( + "Loading more", + color = MembyMutedText, + fontSize = 13.sp, + modifier = Modifier.fillMaxWidth().padding(vertical = 12.dp), + ) + } + } + state.pagingErrorMessage?.let { + item(key = "search-paging-error") { + Row( + modifier = Modifier.fillMaxWidth().padding(vertical = 8.dp), + verticalAlignment = Alignment.CenterVertically, + ) { + Text("Couldn’t load more titles.", color = MembyMutedText, fontSize = 13.sp) + Spacer(Modifier.width(10.dp)) + MembyChoiceChip(label = "Try again", selected = false, onClick = onRetry) + } + } + } + } + } + } +} + +@Composable +private fun SearchResultsHeading( + state: SearchUiState, + resultCount: Int, + onShowRequests: () -> Unit, + requestFocusRequester: FocusRequester, + keyboardReturnFocusRequester: FocusRequester, +) { + Row(verticalAlignment = Alignment.CenterVertically) { + Text( + when { + state.genre != null -> state.genre + shouldSearch(state.query) -> "Search results for “${state.query.trim()}”" + else -> "Search results" + }, + color = MembyOnSurface, + fontSize = 20.sp, + fontWeight = FontWeight.SemiBold, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + modifier = Modifier.weight(1f, fill = false), + ) + if (resultCount > 0 && !state.isLoading) { + Spacer(Modifier.width(9.dp)) + Text(resultCount.toString(), color = MembyMutedText, fontSize = 14.sp) + } + if (state.isLoading && resultCount > 0) { + Spacer(Modifier.width(9.dp)) + Text("Searching…", color = MembyAccent, fontSize = 12.sp) + } + if ( + state.requestsAvailable && state.genre == null && shouldSearch(state.query) && + !state.requestMode && state.errorMessage == null + ) { + Spacer(Modifier.width(12.dp)) + MembyChoiceChip( + label = "Request", + selected = false, + onClick = onShowRequests, + modifier = Modifier + .then(if (resultCount == 0) Modifier.focusRequester(requestFocusRequester) else Modifier) + .focusProperties { left = keyboardReturnFocusRequester }, + ) + } + } +} + +@Composable +private fun SearchResultMessage( + message: String, + action: String? = null, + onAction: () -> Unit = {}, + actionFocusRequester: FocusRequester? = null, + genresFocusRequester: FocusRequester? = null, + keyboardReturnFocusRequester: FocusRequester? = null, +) { + Column(Modifier.fillMaxSize().padding(top = 22.dp)) { + Text(message, color = MembyMutedText, fontSize = 15.sp) + if (action != null) { + Spacer(Modifier.height(12.dp)) + MembyChoiceChip( + label = action, + selected = false, + onClick = onAction, + modifier = Modifier + .then(actionFocusRequester?.let { Modifier.focusRequester(it) } ?: Modifier) + .focusProperties { + genresFocusRequester?.let { up = it } + keyboardReturnFocusRequester?.let { left = it } + }, + ) + } + } +} + +private fun emptyMessage(state: SearchUiState): String = when { + state.genre != null -> "Nothing in this library is tagged ${state.genre}." + shouldSearch(state.query) && state.hasSearched -> + "Nothing in this library matches that. Try fewer letters, or a different spelling." + else -> "Type a couple of letters to search movies and TV series." +} + +private fun searchResultSubtitle(item: BaseItem): String = listOfNotNull( + item.productionYear?.toString(), + when { + item.isSeries -> "Series" + item.isMovie -> "Film" + else -> null + }, +).joinToString(FactSeparator) + +private const val LOAD_MORE_ITEMS_AHEAD = 4 diff --git a/app/src/test/java/com/ponzischeme89/memby/tvhome/TvHomeProgramTest.kt b/app/src/test/java/com/ponzischeme89/memby/tvhome/TvHomeProgramTest.kt new file mode 100644 index 0000000..cfaec8f --- /dev/null +++ b/app/src/test/java/com/ponzischeme89/memby/tvhome/TvHomeProgramTest.kt @@ -0,0 +1,95 @@ +package com.ponzischeme89.memby.tvhome + +import com.ponzischeme89.memby.data.model.BaseItem +import com.ponzischeme89.memby.data.model.UserItemData +import org.junit.Assert.assertEquals +import org.junit.Assert.assertNotEquals +import org.junit.Assert.assertNull +import org.junit.Assert.assertTrue +import org.junit.Test + +class TvHomeProgramTest { + @Test + fun `partially watched movie becomes a continue programme`() { + val programme = tvHomeProgram( + item = BaseItem( + id = "movie-1", + name = "A Film", + type = "Movie", + runTimeTicks = 7_200_000_000L, + userData = UserItemData(playbackPositionTicks = 1_800_000_000L), + ), + profileKey = "viewer", + artworkUrl = "https://example.test/backdrop.jpg", + nowMs = 123L, + ) + + requireNotNull(programme) + assertEquals(TvHomeProgramKind.CONTINUE, programme.kind) + assertEquals(180_000L, programme.positionMs) + assertEquals(720_000L, programme.durationMs) + assertEquals("memby:viewer:movie-1", programme.providerId) + } + + @Test + fun `unwatched next episode carries series metadata`() { + val programme = tvHomeProgram( + item = BaseItem( + id = "episode-4", + name = "Fourth", + type = "Episode", + seriesName = "The Show", + parentIndexNumber = 2, + indexNumber = 4, + ), + profileKey = "viewer", + artworkUrl = null, + nowMs = 123L, + ) + + requireNotNull(programme) + assertEquals(TvHomeProgramKind.NEXT, programme.kind) + assertEquals("The Show", programme.title) + assertEquals("Fourth", programme.episodeTitle) + assertEquals(2, programme.seasonNumber) + assertEquals(4, programme.episodeNumber) + } + + @Test + fun `completed watched and unsupported items are omitted`() { + assertNull(tvHomeProgram(item("Movie", played = true), "p", null, 1L)) + assertNull( + tvHomeProgram( + item("Movie", positionTicks = 9_500_000L, runtimeTicks = 10_000_000L), + "p", + null, + 1L, + ), + ) + assertNull(tvHomeProgram(item("Series"), "p", null, 1L)) + } + + @Test + fun `profile key is stable without exposing account details`() { + val first = tvHomeProfileKey("https://emby.test/", "user-1", "viewer-1") + val same = tvHomeProfileKey("https://emby.test", "user-1", "viewer-1") + val other = tvHomeProfileKey("https://emby.test", "user-2", "viewer-1") + assertEquals(first, same) + assertNotEquals(first, other) + assertTrue("user-1" !in first) + assertTrue("emby" !in first) + } + + private fun item( + type: String, + played: Boolean = false, + positionTicks: Long = 0L, + runtimeTicks: Long? = null, + ) = BaseItem( + id = "id", + name = "Name", + type = type, + runTimeTicks = runtimeTicks, + userData = UserItemData(played = played, playbackPositionTicks = positionTicks), + ) +} diff --git a/app/src/test/java/com/ponzischeme89/memby/ui/HomeRowBrowseTest.kt b/app/src/test/java/com/ponzischeme89/memby/ui/HomeRowBrowseTest.kt new file mode 100644 index 0000000..0cf88d3 --- /dev/null +++ b/app/src/test/java/com/ponzischeme89/memby/ui/HomeRowBrowseTest.kt @@ -0,0 +1,61 @@ +package com.ponzischeme89.memby.ui + +import org.junit.Assert.assertEquals +import org.junit.Assert.assertNull +import org.junit.Test + +class HomeRowBrowseTest { + @Test + fun `recent releases opens the complete movie catalogue`() { + val target = homeRowBrowseTarget(row("latest-movies", "Recent New Releases", MediaRowKind.MOVIES)) + + assertEquals("all", target?.categoryId) + assertEquals("Movie", target?.itemType) + assertEquals("View All", target?.actionLabel) + } + + @Test + fun `movie and show genre rows open their matching paged catalogue`() { + val crime = homeRowBrowseTarget( + row("curated:movies:genre:crime", "Crime Movies", MediaRowKind.MOVIES), + ) + val drama = homeRowBrowseTarget( + row("curated:shows:genre:drama", "Drama Shows", MediaRowKind.SHOWS), + ) + + assertEquals("crime", crime?.categoryId) + assertEquals("Movie", crime?.itemType) + assertEquals("View All Crime", crime?.actionLabel) + assertEquals("drama", drama?.categoryId) + assertEquals("Series", drama?.itemType) + assertEquals("View All Drama", drama?.actionLabel) + } + + @Test + fun `legacy show genres remain browsable`() { + val target = homeRowBrowseTarget( + row("curated:comedy-shows", "Comedy TV Shows", MediaRowKind.SHOWS), + ) + + assertEquals("comedy", target?.categoryId) + assertEquals("Series", target?.itemType) + } + + @Test + fun `ranked and studio rows do not claim an unrelated complete catalogue`() { + assertNull(homeRowBrowseTarget(row("recommended", "Recommended", MediaRowKind.MOVIES))) + assertNull( + homeRowBrowseTarget( + row("curated:movies:studio:pixar", "More from Pixar", MediaRowKind.MOVIES), + ), + ) + } + + private fun row(id: String, title: String, kind: MediaRowKind) = HomeBrowseRow( + id = id, + title = title, + items = emptyList(), + kind = kind, + emptyMessage = "", + ) +} diff --git a/server/internal/buildinfo/VERSION b/server/internal/buildinfo/VERSION index abf5cfc..9810a3b 100644 --- a/server/internal/buildinfo/VERSION +++ b/server/internal/buildinfo/VERSION @@ -1 +1 @@ -0.1.63 +0.1.64