Skip to content

Commit f9ec8be

Browse files
committed
Hoist carousel state, hide duplicate images in pages
1 parent 74a52e0 commit f9ec8be

File tree

4 files changed

+66
-44
lines changed

4 files changed

+66
-44
lines changed

app/src/main/java/org/nsh07/wikireader/ui/homeScreen/AppHomeScreen.kt

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ import androidx.compose.material3.ProgressIndicatorDefaults
5656
import androidx.compose.material3.Text
5757
import androidx.compose.material3.TooltipBox
5858
import androidx.compose.material3.TooltipDefaults
59+
import androidx.compose.material3.carousel.rememberCarouselState
5960
import androidx.compose.material3.pulltorefresh.PullToRefreshBox
6061
import androidx.compose.material3.pulltorefresh.PullToRefreshDefaults.LoadingIndicator
6162
import androidx.compose.material3.pulltorefresh.rememberPullToRefreshState
@@ -277,6 +278,14 @@ fun AppHomeScreen(
277278
rememberPagerState { feedState.mostReadArticles.size / 5 }
278279
else null
279280

281+
val newsCarouselState = if (feedState.news != null)
282+
rememberCarouselState(0) { feedState.news.size }
283+
else null
284+
285+
val otdCarouselState = if (feedState.onThisDay != null)
286+
rememberCarouselState(0) { feedState.onThisDay.size }
287+
else null
288+
280289
SharedTransitionLayout {
281290
val condition1 = homeScreenState.status != WRStatus.UNINITIALIZED &&
282291
homeScreenState.status != WRStatus.FEED_LOADED &&
@@ -386,8 +395,10 @@ fun AppHomeScreen(
386395
darkTheme = colorScheme.isDark(),
387396
dataSaver = preferencesState.dataSaver,
388397
background = preferencesState.imageBackground,
398+
checkFirstImage = true,
389399
onLinkClick = onLinkClick,
390-
onGalleryImageClick = onGalleryImageClick
400+
onGalleryImageClick = onGalleryImageClick,
401+
pageImageUri = homeScreenState.photo?.source
391402
)
392403
}
393404
}
@@ -452,6 +463,8 @@ fun AppHomeScreen(
452463
ArticleFeed(
453464
feedState = feedState,
454465
pagerState = pagerState,
466+
newsCarouselState = newsCarouselState,
467+
otdCarouselState = otdCarouselState,
455468
imageLoader = imageLoader,
456469
insets = insets,
457470
loadPage = onLinkClick,

app/src/main/java/org/nsh07/wikireader/ui/homeScreen/ArticleFeed.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,8 @@ import androidx.compose.material3.MaterialTheme.shapes
4343
import androidx.compose.material3.MaterialTheme.typography
4444
import androidx.compose.material3.OutlinedButton
4545
import androidx.compose.material3.Text
46+
import androidx.compose.material3.carousel.CarouselState
4647
import androidx.compose.material3.carousel.HorizontalMultiBrowseCarousel
47-
import androidx.compose.material3.carousel.rememberCarouselState
4848
import androidx.compose.material3.pulltorefresh.PullToRefreshBox
4949
import androidx.compose.material3.pulltorefresh.PullToRefreshDefaults.LoadingIndicator
5050
import androidx.compose.material3.pulltorefresh.rememberPullToRefreshState
@@ -93,6 +93,8 @@ import kotlin.math.min
9393
fun SharedTransitionScope.ArticleFeed(
9494
feedState: FeedState,
9595
pagerState: PagerState?,
96+
newsCarouselState: CarouselState?,
97+
otdCarouselState: CarouselState?,
9698
imageLoader: ImageLoader,
9799
insets: PaddingValues,
98100
listState: LazyListState,
@@ -530,7 +532,6 @@ fun SharedTransitionScope.ArticleFeed(
530532
}
531533
if (feedState.news != null) {
532534
item {
533-
val carouselState = rememberCarouselState(0) { feedState.news.size }
534535
Text(
535536
stringResource(R.string.inTheNews),
536537
style = typography.titleLarge,
@@ -539,7 +540,7 @@ fun SharedTransitionScope.ArticleFeed(
539540
.padding(top = 32.dp)
540541
)
541542
HorizontalMultiBrowseCarousel(
542-
state = carouselState,
543+
state = newsCarouselState!!,
543544
itemSpacing = 8.dp,
544545
modifier = if (!expanded)
545546
Modifier
@@ -636,7 +637,6 @@ fun SharedTransitionScope.ArticleFeed(
636637
}
637638
if (feedState.onThisDay != null) {
638639
item {
639-
val carouselState = rememberCarouselState(0) { feedState.onThisDay.size }
640640
Text(
641641
stringResource(R.string.onThisDay),
642642
style = typography.titleLarge,
@@ -645,7 +645,7 @@ fun SharedTransitionScope.ArticleFeed(
645645
.padding(top = 32.dp)
646646
)
647647
HorizontalMultiBrowseCarousel(
648-
state = carouselState,
648+
state = otdCarouselState!!,
649649
itemSpacing = 8.dp,
650650
modifier =
651651
if (!expanded)

app/src/main/java/org/nsh07/wikireader/ui/homeScreen/ImageWithCaption.kt

Lines changed: 41 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,12 @@ fun ImageWithCaption(
2828
fontSize: Int,
2929
darkTheme: Boolean,
3030
background: Boolean,
31+
checkFirstImage: Boolean,
3132
imageLoader: ImageLoader,
3233
onLinkClick: (String) -> Unit,
3334
onClick: (String, String) -> Unit,
34-
modifier: Modifier = Modifier
35+
modifier: Modifier = Modifier,
36+
pageImageUri: String? = null
3537
) {
3638
val uriLow = remember(text) {
3739
"https://commons.wikimedia.org/wiki/Special:FilePath/${
@@ -43,40 +45,43 @@ fun ImageWithCaption(
4345
text.substringAfter(':').substringBefore('|').substringBefore("]]")
4446
}"
4547
}
46-
val description = remember(text) { text.substringAfter('|', "").substringBefore('|') }
47-
val invert = remember { text.contains("|invert") }
4848

49-
FeedImage(
50-
source = uriLow,
51-
description = description,
52-
imageLoader = imageLoader,
53-
loadingIndicator = false,
54-
colorFilter = if (invert && darkTheme && !background) // Invert colors in dark theme
55-
ColorFilter.colorMatrix(ColorMatrix(colorMatrixInvert))
56-
else null,
57-
background = background,
58-
modifier = modifier
59-
.padding(horizontal = 16.dp)
60-
.padding(top = 8.dp)
61-
.clip(shapes.large)
62-
.animateContentSize()
63-
.widthIn(max = 512.dp)
64-
.clickable(onClick = { onClick(uriHigh, description) })
65-
)
66-
Text(
67-
description.toWikitextAnnotatedString(
68-
colorScheme = colorScheme,
69-
fontSize = fontSize - 2,
70-
loadPage = onLinkClick,
71-
typography = typography,
72-
showRef = {}
73-
),
74-
fontSize = (fontSize - 2).sp,
75-
lineHeight = (24 * ((fontSize - 2) / 16.0)).toInt().sp,
76-
textAlign = TextAlign.Center,
77-
color = colorScheme.onSurfaceVariant,
78-
modifier = Modifier
79-
.padding(horizontal = 16.dp)
80-
.padding(vertical = 8.dp)
81-
)
49+
if (!checkFirstImage || uriHigh == pageImageUri) {
50+
val description = remember(text) { text.substringAfter('|', "").substringBefore('|') }
51+
val invert = remember { text.contains("|invert") }
52+
53+
FeedImage(
54+
source = uriLow,
55+
description = description,
56+
imageLoader = imageLoader,
57+
loadingIndicator = false,
58+
colorFilter = if (invert && darkTheme && !background) // Invert colors in dark theme
59+
ColorFilter.colorMatrix(ColorMatrix(colorMatrixInvert))
60+
else null,
61+
background = background,
62+
modifier = modifier
63+
.padding(horizontal = 16.dp)
64+
.padding(top = 8.dp)
65+
.clip(shapes.large)
66+
.animateContentSize()
67+
.widthIn(max = 512.dp)
68+
.clickable(onClick = { onClick(uriHigh, description) })
69+
)
70+
Text(
71+
description.toWikitextAnnotatedString(
72+
colorScheme = colorScheme,
73+
fontSize = fontSize - 2,
74+
loadPage = onLinkClick,
75+
typography = typography,
76+
showRef = {}
77+
),
78+
fontSize = (fontSize - 2).sp,
79+
lineHeight = (24 * ((fontSize - 2) / 16.0)).toInt().sp,
80+
textAlign = TextAlign.Center,
81+
color = colorScheme.onSurfaceVariant,
82+
modifier = Modifier
83+
.padding(horizontal = 16.dp)
84+
.padding(vertical = 8.dp)
85+
)
86+
}
8287
}

app/src/main/java/org/nsh07/wikireader/ui/homeScreen/ParsedBodyText.kt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,9 @@ fun ParsedBodyText(
3232
dataSaver: Boolean,
3333
onLinkClick: (String) -> Unit,
3434
onGalleryImageClick: (String, String) -> Unit,
35-
modifier: Modifier = Modifier
35+
modifier: Modifier = Modifier,
36+
checkFirstImage: Boolean = false,
37+
pageImageUri: String? = null
3638
) {
3739
val context = LocalContext.current
3840
val dpi = LocalDensity.current.density
@@ -48,7 +50,9 @@ fun ParsedBodyText(
4850
onLinkClick = onLinkClick,
4951
onClick = onGalleryImageClick,
5052
darkTheme = darkTheme,
51-
background = background
53+
background = background,
54+
checkFirstImage = checkFirstImage,
55+
pageImageUri = pageImageUri
5256
)
5357
}
5458
} else if (it.startsWith("<gallery")) {

0 commit comments

Comments
 (0)