Skip to content

Commit 83a424a

Browse files
authored
Add custom readingOrder to EpubNavigatorFragment (#376)
1 parent af78d31 commit 83a424a

File tree

2 files changed

+18
-8
lines changed

2 files changed

+18
-8
lines changed

readium/navigator/src/main/java/org/readium/r2/navigator/epub/EpubNavigatorFactory.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
package org.readium.r2.navigator.epub
88

99
import org.readium.r2.shared.ExperimentalReadiumApi
10+
import org.readium.r2.shared.publication.Link
1011
import org.readium.r2.shared.publication.Locator
1112
import org.readium.r2.shared.publication.Publication
1213
import org.readium.r2.shared.publication.epub.EpubLayout
@@ -38,6 +39,7 @@ class EpubNavigatorFactory(
3839

3940
fun createFragmentFactory(
4041
initialLocator: Locator?,
42+
readingOrder: List<Link>? = null,
4143
initialPreferences: EpubPreferences = EpubPreferences(),
4244
listener: EpubNavigatorFragment.Listener? = null,
4345
paginationListener: EpubNavigatorFragment.PaginationListener? = null,
@@ -47,6 +49,7 @@ class EpubNavigatorFactory(
4749
publication = publication,
4850
baseUrl = null,
4951
initialLocator = initialLocator,
52+
readingOrder = readingOrder,
5053
initialPreferences = initialPreferences,
5154
listener = listener,
5255
paginationListener = paginationListener,

readium/navigator/src/main/java/org/readium/r2/navigator/epub/EpubNavigatorFragment.kt

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ class EpubNavigatorFragment internal constructor(
9191
override val publication: Publication,
9292
private val baseUrl: String?,
9393
private val initialLocator: Locator?,
94+
readingOrder: List<Link>?,
9495
private val initialPreferences: EpubPreferences,
9596
internal val listener: Listener?,
9697
internal val paginationListener: PaginationListener?,
@@ -274,7 +275,12 @@ class EpubNavigatorFragment internal constructor(
274275
)
275276
}
276277

277-
internal lateinit var positionsByReadingOrder: List<List<Locator>>
278+
private val readingOrder: List<Link> = readingOrder ?: publication.readingOrder
279+
280+
private val positionsByReadingOrder: List<List<Locator>> =
281+
if (readingOrder != null) emptyList()
282+
else runBlocking { publication.positionsByReadingOrder() }
283+
278284
internal lateinit var positions: List<Locator>
279285
lateinit var resourcePager: R2ViewPager
280286

@@ -306,13 +312,12 @@ class EpubNavigatorFragment internal constructor(
306312
_binding = ActivityR2ViewpagerBinding.inflate(inflater, container, false)
307313
val view = binding.root
308314

309-
positionsByReadingOrder = runBlocking { publication.positionsByReadingOrder() }
310315
positions = positionsByReadingOrder.flatten()
311316
publicationIdentifier = publication.metadata.identifier ?: publication.metadata.title
312317

313318
when (viewModel.layout) {
314319
EpubLayout.REFLOWABLE -> {
315-
resourcesSingle = publication.readingOrder.mapIndexed { index, link ->
320+
resourcesSingle = readingOrder.mapIndexed { index, link ->
316321
PageResource.EpubReflowable(
317322
link = link,
318323
url = viewModel.urlTo(link),
@@ -329,7 +334,7 @@ class EpubNavigatorFragment internal constructor(
329334
var doublePageLeft: Link? = null
330335
var doublePageRight: Link? = null
331336

332-
for ((index, link) in publication.readingOrder.withIndex()) {
337+
for ((index, link) in readingOrder.withIndex()) {
333338
val url = viewModel.urlTo(link)
334339
resourcesSingle.add(PageResource.EpubFxl(leftLink = link, leftUrl = url))
335340

@@ -881,7 +886,7 @@ class EpubNavigatorFragment internal constructor(
881886
locatorToResourceAtIndex(resourcePager.currentItem + 1)
882887

883888
private fun locatorToResourceAtIndex(index: Int): Locator? =
884-
publication.readingOrder.getOrNull(index)
889+
readingOrder.getOrNull(index)
885890
?.let { publication.locatorFromLink(it) }
886891

887892
private val r2PagerAdapter: R2PagerAdapter?
@@ -919,7 +924,7 @@ class EpubNavigatorFragment internal constructor(
919924
override val currentLocator: StateFlow<Locator> get() = _currentLocator
920925
private val _currentLocator = MutableStateFlow(
921926
initialLocator
922-
?: requireNotNull(publication.locatorFromLink(publication.readingOrder.first()))
927+
?: requireNotNull(publication.locatorFromLink(this.readingOrder.first()))
923928
)
924929

925930
/**
@@ -930,7 +935,7 @@ class EpubNavigatorFragment internal constructor(
930935
override suspend fun firstVisibleElementLocator(): Locator? {
931936
if (!::resourcePager.isInitialized) return null
932937

933-
val resource = publication.readingOrder[resourcePager.currentItem]
938+
val resource = readingOrder[resourcePager.currentItem]
934939
return currentReflowablePageFragment?.webView?.findFirstVisibleLocator()
935940
?.copy(
936941
href = resource.href,
@@ -1035,21 +1040,23 @@ class EpubNavigatorFragment internal constructor(
10351040
* if you use a local HTTP server.
10361041
* @param initialLocator The first location which should be visible when rendering the
10371042
* publication. Can be used to restore the last reading location.
1043+
* @param readingOrder custom reading order
10381044
* @param listener Optional listener to implement to observe events, such as user taps.
10391045
* @param config Additional configuration.
10401046
*/
10411047
fun createFactory(
10421048
publication: Publication,
10431049
baseUrl: String? = null,
10441050
initialLocator: Locator? = null,
1051+
readingOrder: List<Link>? = null,
10451052
listener: Listener? = null,
10461053
paginationListener: PaginationListener? = null,
10471054
config: Configuration = Configuration(),
10481055
initialPreferences: EpubPreferences = EpubPreferences()
10491056
): FragmentFactory =
10501057
createFragmentFactory {
10511058
EpubNavigatorFragment(
1052-
publication, baseUrl, initialLocator, initialPreferences,
1059+
publication, baseUrl, initialLocator, readingOrder, initialPreferences,
10531060
listener, paginationListener,
10541061
epubLayout = publication.metadata.presentation.layout ?: EpubLayout.REFLOWABLE,
10551062
defaults = EpubDefaults(),

0 commit comments

Comments
 (0)