This commit is contained in:
ponzischeme89
2026-08-21 16:30:29 +12:00
parent 891d3dfedc
commit 57edfaa60b
7 changed files with 29 additions and 34 deletions
+1
View File
@@ -1,6 +1,7 @@
## 0.2.92 - 2026-08-21
- Improved: App design / layout tweaks.
- Improved: Many behind the scenes tweaks, bug fixes to make the app run smoother.
- Improved: Gateway updated to version 0.1.63.
## 0.2.84 - 2026-08-21
- Improved: Loading and performance of the continue watching row.
+1 -1
View File
@@ -64,7 +64,7 @@ val projectNoticeText =
// A release workflow can derive the app version from its Git tag without editing the
// source tree. Local builds keep using the checked-in default.
val defaultVersionName = "0.2.92"
val defaultVersionName = "0.2.93"
val membyVersionName: String =
(project.findProperty("memby.versionName") as String?)
?.trim()
@@ -83,6 +83,11 @@ import java.util.Date
import java.util.Calendar
import kotlin.time.Duration.Companion.milliseconds
// The focused metadata hero now owns year/runtime/certificate for browse destinations.
// Search and Genres keep their own card context through PosterGridCard instead.
private const val BROWSE_ROW_SECONDARY_METADATA = false
private const val CONTINUE_ROW_SECONDARY_METADATA = true
@Composable
internal fun PlaybackLaunchOverlay(item: BaseItem, modifier: Modifier = Modifier) {
val rotation by rememberInfiniteTransition(label = "playback-launch").animateFloat(
@@ -277,7 +282,6 @@ internal fun FocusedHomeBackdrop(homeViewModel: HomeViewModel) {
@Composable
internal fun FocusedHomeMetadata(
homeViewModel: HomeViewModel,
sectionLabel: String,
modifier: Modifier = Modifier,
) {
val focusedItem by homeViewModel.focusedItem.collectAsStateWithLifecycle()
@@ -288,7 +292,6 @@ internal fun FocusedHomeMetadata(
MetadataHero(
item = focusedItem,
loading = homeContent.loading.isNotEmpty(),
sectionLabel = sectionLabel,
modifier = modifier,
)
}
@@ -480,7 +483,10 @@ internal fun serverHomeRows(state: HomeUiState, settings: Settings): List<HomeBr
"movie-schedule" -> "No monitored movies have a digital release in the next 5 days"
else -> "Nothing to show here yet"
},
showSecondaryMetadata = settings.showHomeCardMetadata,
showSecondaryMetadata = when (row.kind) {
"continue" -> CONTINUE_ROW_SECONDARY_METADATA
else -> BROWSE_ROW_SECONDARY_METADATA
},
)
}
return applyHomeRowPreferences(mapped, settings)
@@ -558,7 +564,7 @@ internal fun homeRowsFor(
kind = MediaRowKind.CONTINUE,
loading = HomeSection.CONTINUE in state.loading,
emptyMessage = "Nothing in progress",
showSecondaryMetadata = settings.showHomeCardMetadata,
showSecondaryMetadata = CONTINUE_ROW_SECONDARY_METADATA,
)
val latestMovies = HomeBrowseRow(
id = "latest-movies",
@@ -567,7 +573,7 @@ internal fun homeRowsFor(
kind = MediaRowKind.MOVIES,
loading = HomeSection.LATEST in state.loading,
emptyMessage = "No recent movies found",
showSecondaryMetadata = settings.showHomeCardMetadata,
showSecondaryMetadata = BROWSE_ROW_SECONDARY_METADATA,
)
val favorites = HomeBrowseRow(
id = "favorites",
@@ -576,7 +582,7 @@ internal fun homeRowsFor(
kind = MediaRowKind.FAVORITES,
loading = HomeSection.FAVORITES in state.loading,
emptyMessage = "Your favourites will appear here",
showSecondaryMetadata = settings.showHomeCardMetadata,
showSecondaryMetadata = BROWSE_ROW_SECONDARY_METADATA,
)
val destinationRows = when (destination) {
// The gateway composes the home screen — including rows this app has no concept
@@ -609,6 +615,11 @@ internal fun homeRowsFor(
row.id.startsWith("curated:movies:")
}
.distinctBy(HomeBrowseRow::id) + listOf(
continueRow.copy(
id = "continue-movies",
title = "Continue Watching",
items = state.continueWatching.filter(BaseItem::isMovie),
),
favorites.copy(
id = "favourite-movies",
title = "Favourite Movies",
@@ -726,7 +737,7 @@ internal fun forYouBrowseRows(
kind = MediaRowKind.MOVIES,
loading = state.loading,
emptyMessage = state.error ?: "Watch and browse a little more to shape your picks",
showSecondaryMetadata = true,
showSecondaryMetadata = BROWSE_ROW_SECONDARY_METADATA,
),
)
}
@@ -738,8 +749,7 @@ internal fun forYouBrowseRows(
kind = MediaRowKind.MOVIES,
loading = state.loading && row.items.isEmpty(),
emptyMessage = state.error ?: "No picks fit this time window yet",
// Reasons are the primary secondary metadata in this destination.
showSecondaryMetadata = true,
showSecondaryMetadata = BROWSE_ROW_SECONDARY_METADATA,
)
}
}
@@ -739,7 +739,6 @@ internal fun HomeScreen(
forYouState,
selectedDestination,
settings.homeSections,
settings.showHomeCardMetadata,
settings.hideWatchedMovies,
) {
val destinationRows = if (selectedDestination == BrowseDestination.FOR_YOU) {
@@ -1377,7 +1376,6 @@ internal fun HomeScreen(
} else {
FocusedHomeMetadata(
homeViewModel = homeViewModel,
sectionLabel = selectedDestination.label,
modifier = Modifier
.height(metadataHeight)
// LazyColumn is drawn later as a sibling. Keep the hero
@@ -1393,7 +1391,7 @@ internal fun HomeScreen(
Text(
// The gateway's maintenance notice when it sent one, and the
// generic wording otherwise.
homeStatus.statusMessage ?: "Connection is slow — showing available content",
homeStatus.statusMessage ?: "Memby Server is updating/busy.... slow. Please wait.",
color = MembyMutedText,
fontSize = 14.sp,
modifier = Modifier.padding(
@@ -34,7 +34,6 @@ import com.ponzischeme89.memby.ui.theme.MembySurface
internal fun MetadataHero(
item: BaseItem?,
loading: Boolean,
sectionLabel: String,
modifier: Modifier = Modifier,
) {
Box(
@@ -70,7 +69,6 @@ internal fun MetadataHero(
MediaMetadataPanel(
item = item,
loading = loading,
sectionLabel = sectionLabel,
modifier = Modifier
.fillMaxSize()
.padding(
@@ -135,8 +135,8 @@ private val RailSurface: Color get() = MembySurface.copy(alpha = 0.95f)
private val MutedText: Color get() = MembyMutedText
private val QuietText: Color get() = MembyQuietText
private val BACKDROP_SETTLE_DELAY = 240.milliseconds
private val MetadataHeroLogoMaxWidth = 420.dp
private val MetadataHeroLogoMaxHeight = 92.dp
private val MetadataHeroLogoMaxWidth = 360.dp
private val MetadataHeroLogoMaxHeight = 72.dp
@Composable
fun BackdropLayer(item: BaseItem?, modifier: Modifier = Modifier) {
@@ -196,7 +196,6 @@ fun BackdropLayer(item: BaseItem?, modifier: Modifier = Modifier) {
fun MediaMetadataPanel(
item: BaseItem?,
loading: Boolean,
sectionLabel: String,
modifier: Modifier = Modifier,
) {
BoxWithConstraints(modifier) {
@@ -211,7 +210,6 @@ fun MediaMetadataPanel(
modifier = Modifier.width(contentWidth),
verticalArrangement = Arrangement.spacedBy(if (compactLayout) 7.dp else 10.dp),
) {
Text(sectionLabel, color = QuietText, fontSize = 12.sp, fontWeight = FontWeight.SemiBold)
Text(
"Your library",
color = Color.White,
@@ -221,7 +219,7 @@ fun MediaMetadataPanel(
Text("Choose something to watch.", color = MutedText, fontSize = 14.sp)
}
}
else -> MetadataContent(item, sectionLabel, contentWidth, compactLayout)
else -> MetadataContent(item, contentWidth, compactLayout)
}
}
}
@@ -262,12 +260,11 @@ private fun SkeletonBlock(width: Dp, height: Dp) {
@Composable
private fun MetadataContent(
item: BaseItem,
sectionLabel: String,
contentWidth: Dp,
compact: Boolean,
) {
if (item.isSchedule) {
ScheduleMetadataContent(item, sectionLabel, contentWidth, compact)
ScheduleMetadataContent(item, contentWidth, compact)
return
}
val repository = ServiceLocator.repository
@@ -285,7 +282,6 @@ private fun MetadataContent(
modifier = Modifier.width(contentWidth).fillMaxHeight(),
verticalArrangement = Arrangement.spacedBy(if (compact) 5.dp else 8.dp),
) {
Text(sectionLabel.uppercase(), color = EmbyGreen, fontSize = 11.sp, fontWeight = FontWeight.Bold, letterSpacing = 1.1.sp)
Box(
modifier = Modifier
.fillMaxWidth()
@@ -296,13 +292,13 @@ private fun MetadataContent(
Modifier.heightIn(max = MetadataHeroLogoMaxHeight)
},
),
contentAlignment = Alignment.BottomStart,
contentAlignment = Alignment.TopStart,
) {
if (logo != null) {
TitleLogoImage(
logoUrl = logo,
contentDescription = item.seriesName?.takeIf { item.isEpisode } ?: item.name,
alignment = Alignment.BottomStart,
alignment = Alignment.TopStart,
modifier = Modifier
.width(MetadataHeroLogoMaxWidth)
.height(MetadataHeroLogoMaxHeight),
@@ -383,7 +379,6 @@ private fun MetadataContent(
@Composable
private fun ScheduleMetadataContent(
item: BaseItem,
sectionLabel: String,
contentWidth: Dp,
compact: Boolean,
) {
@@ -391,13 +386,6 @@ private fun ScheduleMetadataContent(
modifier = Modifier.width(contentWidth).fillMaxHeight(),
verticalArrangement = Arrangement.spacedBy(if (compact) 5.dp else 8.dp),
) {
Text(
sectionLabel.uppercase(),
color = EmbyGreen,
fontSize = 11.sp,
fontWeight = FontWeight.Bold,
letterSpacing = 1.2.sp,
)
Text(
item.name,
color = Color.White,
+1 -1
View File
@@ -1 +1 @@
0.1.61
0.1.63