From 868b2dfd0c202ea4605fb8bd9d590d01437e3372 Mon Sep 17 00:00:00 2001 From: Priveetee Date: Thu, 10 Sep 2026 12:42:53 +0200 Subject: [PATCH 1/3] feat: collapse expanded comments with show less --- .../feature/player/components/CommentBodyTest.kt | 3 ++- .../feature/player/components/CommentListItems.kt | 10 +++++++--- app/src/main/res/values/strings.xml | 1 + 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/app/src/androidTest/java/dev/typetype/android/feature/player/components/CommentBodyTest.kt b/app/src/androidTest/java/dev/typetype/android/feature/player/components/CommentBodyTest.kt index cf4872be..d1958adc 100644 --- a/app/src/androidTest/java/dev/typetype/android/feature/player/components/CommentBodyTest.kt +++ b/app/src/androidTest/java/dev/typetype/android/feature/player/components/CommentBodyTest.kt @@ -47,6 +47,7 @@ class CommentBodyTest { } composeRule.onNodeWithText("Read more").assertExists().performClick() - composeRule.onNodeWithText("Long comment starts here$suffix").assertExists() + composeRule.onNodeWithText("Show less").assertExists().performClick() + composeRule.onNodeWithText("Read more").assertExists() } } diff --git a/app/src/main/java/dev/typetype/android/feature/player/components/CommentListItems.kt b/app/src/main/java/dev/typetype/android/feature/player/components/CommentListItems.kt index ef11922d..f6ee514e 100644 --- a/app/src/main/java/dev/typetype/android/feature/player/components/CommentListItems.kt +++ b/app/src/main/java/dev/typetype/android/feature/player/components/CommentListItems.kt @@ -139,13 +139,17 @@ private fun ExpandableCommentText( maxLines = if (expanded) Int.MAX_VALUE else COMMENT_COLLAPSE_LINE_LIMIT, overflow = if (expanded) TextOverflow.Clip else TextOverflow.Ellipsis, ) - if (needsTruncation && !expanded) { + if (needsTruncation) { TextButton( - onClick = { expanded = true }, + onClick = { expanded = !expanded }, contentPadding = PaddingValues(horizontal = 4.dp), modifier = Modifier.padding(top = 2.dp), ) { - Text(stringResource(R.string.comments_read_more)) + Text( + stringResource( + if (expanded) R.string.comments_show_less else R.string.comments_read_more, + ) + ) } } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e98116f3..8cd0a910 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -497,6 +497,7 @@ Comments No comments Read more + Show less Likes: %1$s Couldn\'t load replies Couldn\'t load comments From 249cc4cb840f8316297081725302916984ac3b3e Mon Sep 17 00:00:00 2001 From: Priveetee Date: Thu, 10 Sep 2026 12:42:53 +0200 Subject: [PATCH 2/3] perf: select lightweight storyboard seek previews --- .../typetype/android/data/stream/StreamRepositoryImpl.kt | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) 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 1b890dd5..7d81fb1c 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 @@ -180,7 +180,7 @@ internal class StreamRepositoryImpl @Inject constructor( }, storyboard = previewFrames .mapNotNull { it.toDomainStoryboard() } - .maxByOrNull { it.frameWidth }, + .let(::selectStoryboard), startPositionMillis = startPosition * 1000L, sponsorBlockSegments = sponsorBlockSegments.mapNotNull { it.toDomainSponsorBlockSegment(duration) @@ -207,6 +207,11 @@ internal class StreamRepositoryImpl @Inject constructor( .maxByOrNull { it.height } ?.url + private fun selectStoryboard(storyboards: List): StreamStoryboard? = + storyboards.filter { it.frameWidth >= TARGET_STORYBOARD_FRAME_WIDTH } + .minByOrNull { it.frameWidth } + ?: storyboards.maxByOrNull { it.frameWidth } + private fun PreviewFrameItem.toDomainStoryboard(): StreamStoryboard? = StreamStoryboard( urls = urls.filter(String::isNotBlank), @@ -289,6 +294,7 @@ internal suspend fun cancellableStreamResult( } private const val SABR_DELIVERY_METHOD = "sabr" +private const val TARGET_STORYBOARD_FRAME_WIDTH = 160 private class SabrContractException : IllegalStateException("The server returned no playable SABR contract"), From 451470a371bf09448b1e484ce7b5a3447b2e4627 Mon Sep 17 00:00:00 2001 From: Priveetee Date: Thu, 10 Sep 2026 12:44:18 +0200 Subject: [PATCH 3/3] build: publish mobile beta 1.8.0-beta.8 --- app/build.gradle.kts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index a37eb34c..0b46ed74 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 = 10807 - versionName = "1.8.0-beta.7" + versionCode = 10808 + versionName = "1.8.0-beta.8" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" resValue("string", "app_name", "TypeType") }