diff --git a/app/build.gradle.kts b/app/build.gradle.kts index e5048cdb..a37eb34c 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -26,8 +26,8 @@ android { applicationId = "dev.typetype.android" minSdk = 23 targetSdk = 37 - versionCode = 10806 - versionName = "1.8.0-beta.6" + versionCode = 10807 + versionName = "1.8.0-beta.7" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" resValue("string", "app_name", "TypeType") } diff --git a/app/src/main/java/dev/typetype/android/data/stream/StreamRepositoryImpl.kt b/app/src/main/java/dev/typetype/android/data/stream/StreamRepositoryImpl.kt index ac562193..1b890dd5 100644 --- a/app/src/main/java/dev/typetype/android/data/stream/StreamRepositoryImpl.kt +++ b/app/src/main/java/dev/typetype/android/data/stream/StreamRepositoryImpl.kt @@ -178,7 +178,9 @@ internal class StreamRepositoryImpl @Inject constructor( subtitles = subtitles.mapIndexedNotNull { index, subtitle -> subtitle.toClientSubtitleSource(index) }, - storyboard = previewFrames.firstNotNullOfOrNull { it.toDomainStoryboard() }, + storyboard = previewFrames + .mapNotNull { it.toDomainStoryboard() } + .maxByOrNull { it.frameWidth }, startPositionMillis = startPosition * 1000L, sponsorBlockSegments = sponsorBlockSegments.mapNotNull { it.toDomainSponsorBlockSegment(duration) diff --git a/app/src/main/java/dev/typetype/android/feature/player/PlayerDetails.kt b/app/src/main/java/dev/typetype/android/feature/player/PlayerDetails.kt index a039357b..f3b3fb37 100644 --- a/app/src/main/java/dev/typetype/android/feature/player/PlayerDetails.kt +++ b/app/src/main/java/dev/typetype/android/feature/player/PlayerDetails.kt @@ -55,6 +55,7 @@ internal fun PlayerDetails( title = branding.title, viewCount = stream.viewCount, likeCount = stream.likeCount, + releaseDateMillis = stream.uploadedAtMillis, description = stream.description, onTimestampClick = { player?.seekTo(it) }, ) diff --git a/app/src/main/java/dev/typetype/android/feature/player/components/DescriptionSection.kt b/app/src/main/java/dev/typetype/android/feature/player/components/DescriptionSection.kt index c60ced85..93c4f5ae 100644 --- a/app/src/main/java/dev/typetype/android/feature/player/components/DescriptionSection.kt +++ b/app/src/main/java/dev/typetype/android/feature/player/components/DescriptionSection.kt @@ -18,6 +18,7 @@ import androidx.compose.material.icons.filled.KeyboardArrowDown import androidx.compose.material.icons.filled.KeyboardArrowUp import androidx.compose.material.icons.outlined.ThumbUp import androidx.compose.material.icons.outlined.Visibility +import androidx.compose.material.icons.outlined.Event import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text @@ -30,18 +31,22 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalLocale import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.core.net.toUri import androidx.compose.ui.unit.sp +import java.text.DateFormat +import java.util.Date @Composable fun DescriptionSection( title: String, viewCount: Long, likeCount: Long, + releaseDateMillis: Long, description: String, onTimestampClick: (Long) -> Unit, modifier: Modifier = Modifier, @@ -49,6 +54,12 @@ fun DescriptionSection( var expanded by remember { mutableStateOf(false) } var pendingUrl by remember { mutableStateOf(null) } val context = LocalContext.current + val releaseDate = releaseDateMillis.takeIf { it > 0L }?.let { millis -> + DateFormat.getDateInstance( + DateFormat.MEDIUM, + LocalLocale.current.platformLocale, + ).format(Date(millis)) + } Column( modifier = modifier @@ -93,6 +104,17 @@ fun DescriptionSection( ), ) } + releaseDate?.let { + Spacer(Modifier.width(16.dp)) + VideoStat( + value = it, + icon = Icons.Outlined.Event, + contentDescription = stringResource( + dev.typetype.android.R.string.player_release_date, + it, + ), + ) + } Spacer(Modifier.weight(1f)) Icon( imageVector = if (expanded) Icons.Filled.KeyboardArrowUp else Icons.Filled.KeyboardArrowDown, diff --git a/app/src/main/java/dev/typetype/android/feature/player/components/PlayerTimeBar.kt b/app/src/main/java/dev/typetype/android/feature/player/components/PlayerTimeBar.kt index 822a6eb4..b1c5cd8f 100644 --- a/app/src/main/java/dev/typetype/android/feature/player/components/PlayerTimeBar.kt +++ b/app/src/main/java/dev/typetype/android/feature/player/components/PlayerTimeBar.kt @@ -158,7 +158,7 @@ fun PlayerTimeBar( if (classicScrubPositionMs != null) { Box( modifier = Modifier - .align(Alignment.BottomCenter) + .align(Alignment.TopStart) .offset(x = previewOffsetX, y = -CLASSIC_PREVIEW_LIFT), ) { SeekStoryboardPreview( diff --git a/app/src/main/java/dev/typetype/android/feature/player/components/SeekStoryboardPreview.kt b/app/src/main/java/dev/typetype/android/feature/player/components/SeekStoryboardPreview.kt index 879d4c96..f8903e82 100644 --- a/app/src/main/java/dev/typetype/android/feature/player/components/SeekStoryboardPreview.kt +++ b/app/src/main/java/dev/typetype/android/feature/player/components/SeekStoryboardPreview.kt @@ -7,6 +7,7 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.offset import androidx.compose.foundation.layout.requiredSize import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text @@ -33,7 +34,9 @@ internal fun SeekStoryboardPreview( ) { Column( horizontalAlignment = Alignment.CenterHorizontally, - modifier = modifier.testTag(PLAYER_SEEK_STORYBOARD_PREVIEW_TAG), + modifier = modifier + .width(PREVIEW_WIDTH) + .testTag(PLAYER_SEEK_STORYBOARD_PREVIEW_TAG), ) { frame?.let { StoryboardFrame(frame = it) } Text( diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 4827988b..e98116f3 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -76,6 +76,7 @@ Autoplay %1$s views %1$s likes + Release date: %1$s Resume playback Pause playback Playing