Skip to content

Commit 67b521a

Browse files
committed
Fixed small thumbnails not being displayed in card style
1 parent 403133b commit 67b521a

File tree

4 files changed

+663
-8
lines changed

4 files changed

+663
-8
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
package com.nononsenseapps.feeder.ui.compose
2+
3+
import androidx.compose.ui.test.ExperimentalTestApi
4+
import androidx.compose.ui.test.assertIsDisplayed
5+
import androidx.compose.ui.test.hasTestTag
6+
import androidx.compose.ui.test.junit4.createAndroidComposeRule
7+
import androidx.compose.ui.test.onNodeWithTag
8+
import com.nononsenseapps.feeder.archmodel.FeedItemStyle
9+
import com.nononsenseapps.feeder.archmodel.Repository
10+
import com.nononsenseapps.feeder.archmodel.SyncFrequency
11+
import com.nononsenseapps.feeder.db.room.Feed
12+
import com.nononsenseapps.feeder.db.room.FeedItem
13+
import com.nononsenseapps.feeder.model.ImageFromHTML
14+
import com.nononsenseapps.feeder.ui.MainActivity
15+
import kotlinx.coroutines.runBlocking
16+
import org.junit.Rule
17+
import org.junit.Test
18+
import org.kodein.di.instance
19+
import java.net.URL
20+
import java.time.Instant
21+
import java.time.ZoneOffset
22+
import java.time.ZonedDateTime
23+
24+
class ThumbnailsAreDisplayedTest : BaseComposeTest {
25+
@get:Rule
26+
override val composeTestRule = createAndroidComposeRule<MainActivity>()
27+
28+
@OptIn(ExperimentalTestApi::class)
29+
@Test
30+
fun thumbnailsAreShown() {
31+
val repository by (composeTestRule.activity).di.instance<Repository>()
32+
33+
repository.setSyncFrequency(SyncFrequency.MANUAL)
34+
repository.setFeedItemStyle(FeedItemStyle.CARD)
35+
repository.setShowThumbnails(true)
36+
37+
// Ensure we have feeds and items
38+
runBlocking {
39+
val feedId =
40+
repository.saveFeed(
41+
Feed(
42+
title = "Ampersands are & the worst",
43+
url = URL("https://example.com/ampersands"),
44+
),
45+
)
46+
47+
repository.setCurrentFeedAndTag(feedId, "")
48+
49+
repository.upsertFeedItems(
50+
listOf(
51+
FeedItem(
52+
guid = "guid anime2you",
53+
plainTitle = "Item with image",
54+
plainSnippet = "Snippet with image",
55+
feedId = feedId,
56+
pubDate = ZonedDateTime.now(ZoneOffset.UTC),
57+
primarySortTime = Instant.now(),
58+
thumbnailImage =
59+
ImageFromHTML(
60+
url = "https://img.anime2you.de/2023/12/jujutsu-kaisen-6.jpg",
61+
width = 700,
62+
height = 350,
63+
),
64+
) to "",
65+
),
66+
) { _, _ -> }
67+
}
68+
69+
composeTestRule.waitUntilExactlyOneExists(
70+
hasTestTag("feed_list"),
71+
5_000L,
72+
)
73+
74+
composeTestRule.onNodeWithTag("card_image", useUnmergedTree = true)
75+
.assertIsDisplayed()
76+
}
77+
}

app/src/main/java/com/nononsenseapps/feeder/ui/compose/feed/FeedItemCard.kt

+7-8
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,7 @@ import androidx.compose.material3.MaterialTheme
2525
import androidx.compose.material3.Text
2626
import androidx.compose.runtime.Composable
2727
import androidx.compose.runtime.CompositionLocalProvider
28-
import androidx.compose.runtime.getValue
2928
import androidx.compose.runtime.remember
30-
import androidx.compose.runtime.setValue
3129
import androidx.compose.ui.Alignment
3230
import androidx.compose.ui.Modifier
3331
import androidx.compose.ui.draw.alpha
@@ -36,6 +34,7 @@ import androidx.compose.ui.platform.LocalContext
3634
import androidx.compose.ui.platform.LocalDensity
3735
import androidx.compose.ui.res.pluralStringResource
3836
import androidx.compose.ui.res.stringResource
37+
import androidx.compose.ui.semantics.testTag
3938
import androidx.compose.ui.text.buildAnnotatedString
4039
import androidx.compose.ui.text.style.TextOverflow
4140
import androidx.compose.ui.text.withStyle
@@ -50,6 +49,7 @@ import com.nononsenseapps.feeder.db.room.ID_UNSET
5049
import com.nononsenseapps.feeder.model.MediaImage
5150
import com.nononsenseapps.feeder.ui.compose.coil.RestrainedCropScaling
5251
import com.nononsenseapps.feeder.ui.compose.coil.rememberTintedVectorPainter
52+
import com.nononsenseapps.feeder.ui.compose.components.safeSemantics
5353
import com.nononsenseapps.feeder.ui.compose.feedarticle.wordsToReadTimeSecs
5454
import com.nononsenseapps.feeder.ui.compose.minimumTouchSize
5555
import com.nononsenseapps.feeder.ui.compose.text.WithBidiDeterminedLayoutDirection
@@ -92,11 +92,7 @@ fun FeedItemCard(
9292
if (showThumbnail) {
9393
item.image?.let { image ->
9494
// Don't render known super small images. Null is OK
95-
val width = image.width
96-
val height = image.height
97-
val badHeight = (height ?: 1000) < 360
98-
val badWidth = (width ?: 1000) < 640
99-
if (!badWidth && !badHeight) {
95+
if ((image.width ?: 1000) >= 10 && (image.height ?: 1000) >= 10) {
10096
val pixelDensity = LocalDensity.current.density
10197
val contentScale =
10298
remember(pixelDensity) {
@@ -138,7 +134,10 @@ fun FeedItemCard(
138134
.fillMaxWidth()
139135
.aspectRatio(16.0f / 9.0f)
140136
.background(MaterialTheme.colorScheme.surfaceVariant)
141-
.alpha(alpha),
137+
.alpha(alpha)
138+
.safeSemantics {
139+
testTag = "card_image"
140+
},
142141
)
143142
}
144143
}

app/src/test/java/com/nononsenseapps/feeder/model/FeedParserTest.kt

+29
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,35 @@ class FeedParserTest : DIAware {
5858
}
5959
}
6060

61+
@Test
62+
fun anime2youHasThumbnails() {
63+
runBlocking {
64+
readResource("rss_anime2you.xml") {
65+
val feed =
66+
feedParser.parseFeedResponse(
67+
URL("https://www.anime2you.de/feed/"),
68+
it,
69+
null,
70+
)
71+
72+
val item = feed.getOrNull()?.items!!.first()
73+
74+
val expected =
75+
ImageFromHTML(
76+
url = "https://img.anime2you.de/2023/12/jujutsu-kaisen-6.jpg",
77+
width = 700,
78+
height = 350,
79+
)
80+
81+
assertEquals(
82+
expected,
83+
item.image,
84+
"Thumbnail image was unexpected",
85+
)
86+
}
87+
}
88+
}
89+
6190
@Test
6291
fun dcCreatorEndsUpAsAuthor() =
6392
runBlocking {

0 commit comments

Comments
 (0)