blob: d554721cb50ef6265b2c170e9cc3cf94acb463ec [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
/**
* LoadState of a PagedList load - associated with a [LoadType]
*
* [LoadState] of any [LoadType] may be observed for UI purposes by registering a listener via
* [androidx.paging.PagingDataAdapter.addLoadStateListener] or
* [androidx.paging.AsyncPagingDataDiffer.addLoadStateListener]
*
* @param endOfPaginationReached `false` if there is more data to load in the [LoadType] this
* [LoadState] is associated with, `true` otherwise. This parameter informs [Pager] if it
* should continue to make requests for additional data in this direction or if it should
* halt as the end of the dataset has been reached.
*
* Note: The [LoadType] [REFRESH][LoadType.REFRESH] always has [LoadState.endOfPaginationReached]
* set to `false`.
*
* @see LoadType
*/
public sealed class LoadState(
public val endOfPaginationReached: Boolean
) {
/**
* Indicates the [PagingData] is not currently loading, and no error currently observed.
*
* @param endOfPaginationReached `false` if there is more data to load in the [LoadType] this
* [LoadState] is associated with, `true` otherwise. This parameter informs [Pager] if it
* should continue to make requests for additional data in this direction or if it should
* halt as the end of the dataset has been reached.
*/
public class NotLoading(
endOfPaginationReached: Boolean
) : LoadState(endOfPaginationReached) {
override fun toString(): String {
return "NotLoading(endOfPaginationReached=$endOfPaginationReached)"
}
override fun equals(other: Any?): Boolean {
return other is NotLoading &&
endOfPaginationReached == other.endOfPaginationReached
}
override fun hashCode(): Int {
return endOfPaginationReached.hashCode()
}
internal companion object {
internal val Complete = NotLoading(endOfPaginationReached = true)
internal val Incomplete = NotLoading(endOfPaginationReached = false)
}
}
/**
* Loading is in progress.
*/
public object Loading : LoadState(false) {
override fun toString(): String {
return "Loading(endOfPaginationReached=$endOfPaginationReached)"
}
override fun equals(other: Any?): Boolean {
return other is Loading &&
endOfPaginationReached == other.endOfPaginationReached
}
override fun hashCode(): Int {
return endOfPaginationReached.hashCode()
}
}
/**
* Loading hit an error.
*
* @param error [Throwable] that caused the load operation to generate this error state.
*
* @see androidx.paging.PagedList.retry
*/
public class Error(
public val error: Throwable
) : LoadState(false) {
override fun equals(other: Any?): Boolean {
return other is Error &&
endOfPaginationReached == other.endOfPaginationReached &&
error == other.error
}
override fun hashCode(): Int {
return endOfPaginationReached.hashCode() + error.hashCode()
}
override fun toString(): String {
return "Error(endOfPaginationReached=$endOfPaginationReached, error=$error)"
}
}
}