0.2.93
This commit is contained in:
@@ -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.
|
||||
|
||||
@@ -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 @@
|
||||
0.1.61
|
||||
0.1.63
|
||||
|
||||
Reference in New Issue
Block a user