Skip to content

Instantly share code, notes, and snippets.

@kozmi55
Created September 4, 2017 14:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kozmi55/ceafa0d629971e80c6a744d1608a742d to your computer and use it in GitHub Desktop.
Save kozmi55/ceafa0d629971e80c6a744d1608a742d to your computer and use it in GitHub Desktop.
class UserRepository(
private val userService: UserService,
private val userDao: UserDao,
private val connectionHelper: ConnectionHelper,
private val preferencesHelper: PreferencesHelper,
private val calendarWrapper: CalendarWrapper) {
private val LAST_UPDATE_KEY = "last_update_page_"
fun getUsers(page: Int, forced: Boolean): Single<UserListModel> {
return Single.create<UserListModel> { emitter: SingleEmitter<UserListModel> ->
if (shouldUpdate(page, forced)) {
loadUsersFromNetwork(page, emitter)
} else {
loadOfflineUsers(page, emitter)
}
}
}
private fun shouldUpdate(page: Int, forced: Boolean) = when {
forced -> true
!connectionHelper.isOnline() -> false
else -> {
val lastUpdate = preferencesHelper.loadLong(LAST_UPDATE_KEY + page)
val currentTime = calendarWrapper.getCurrentTimeInMillis()
lastUpdate + Constants.REFRESH_LIMIT < currentTime
}
}
private fun loadUsersFromNetwork(page: Int, emitter: SingleEmitter<UserListModel>) {
try {
val users = userService.getUsers(page).execute().body()
if (users != null) {
userDao.insertAll(users.items)
val currentTime = calendarWrapper.getCurrentTimeInMillis()
preferencesHelper.saveLong(LAST_UPDATE_KEY + page, currentTime)
emitter.onSuccess(users)
} else {
emitter.onError(Exception("No data received"))
}
} catch (exception: Exception) {
emitter.onError(exception)
}
}
private fun loadOfflineUsers(page: Int, emitter: SingleEmitter<UserListModel>) {
val users = userDao.getUsers(page)
if (!users.isEmpty()) {
emitter.onSuccess(UserListModel(users))
} else {
emitter.onError(Exception("Device is offline"))
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment