blob: 0893e1667550d75f2abc0f301ce5b41eb475c076 [file] [log] [blame]
/*
* Copyright 2019 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package androidx.paging
internal data class TransformablePage<T : Any>(
/**
* List of original (pre-transformation) page offsets the original page relative to initial = 0,
* that this [TransformablePage] depends on.
*
* This array is always sorted.
*/
val originalPageOffsets: IntArray,
/**
* Data to present (post-transformation)
*/
val data: List<T>,
/**
* Original (pre-transformation) page offset relative to initial = 0, that [hintOriginalIndices]
* are associated with.
*/
val hintOriginalPageOffset: Int,
/**
* Optional lookup table for page indices.
*
* If provided, this table provides a mapping from presentation index -> original,
* pre-transformation index.
*
* If null, the indices of [data] map directly to their original pre-transformation index.
*
* Note: [hintOriginalIndices] refers to indices of the original item which can be found in the
* loaded pages with pageOffset == [hintOriginalPageOffset].
*/
val hintOriginalIndices: List<Int>?
) {
/**
* Simple constructor for creating pre-transformation pages, which don't need an index lookup
* and only reference a single [originalPageOffset].
*/
constructor(
originalPageOffset: Int,
data: List<T>
) : this(intArrayOf(originalPageOffset), data, originalPageOffset, null)
init {
require(originalPageOffsets.isNotEmpty()) {
"originalPageOffsets cannot be empty when constructing TransformablePage"
}
require(hintOriginalIndices == null || hintOriginalIndices.size == data.size) {
"If originalIndices (size = ${hintOriginalIndices!!.size}) is provided," +
" it must be same length as data (size = ${data.size})"
}
}
fun viewportHintFor(
index: Int,
presentedItemsBefore: Int,
presentedItemsAfter: Int,
originalPageOffsetFirst: Int,
originalPageOffsetLast: Int
) = ViewportHint(
pageOffset = hintOriginalPageOffset,
indexInPage = when {
hintOriginalIndices?.indices?.contains(index) == true -> hintOriginalIndices[index]
else -> index
},
presentedItemsBefore = presentedItemsBefore,
presentedItemsAfter = presentedItemsAfter,
originalPageOffsetFirst = originalPageOffsetFirst,
originalPageOffsetLast = originalPageOffsetLast
)
// Do not edit. Implementation generated by Studio, since data class uses referential equality
// for IntArray.
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (javaClass != other?.javaClass) return false
other as TransformablePage<*>
if (!originalPageOffsets.contentEquals(other.originalPageOffsets)) return false
if (data != other.data) return false
if (hintOriginalPageOffset != other.hintOriginalPageOffset) return false
if (hintOriginalIndices != other.hintOriginalIndices) return false
return true
}
// Do not edit. Implementation generated by Studio, since data class uses referential equality
// for IntArray.
override fun hashCode(): Int {
var result = originalPageOffsets.contentHashCode()
result = 31 * result + data.hashCode()
result = 31 * result + hintOriginalPageOffset
result = 31 * result + (hintOriginalIndices?.hashCode() ?: 0)
return result
}
}