diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/UserRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/UserRepository.kt index 72bdf161a..fe2af0369 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/UserRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/UserRepository.kt @@ -48,7 +48,7 @@ interface UserRepository : BaseRepository { fun unlockPath(user: User, customization: Customization): Observable fun unlockPath(user: User, set: CustomizationSet): Observable - fun runCron(tasks: List) + fun runCron(tasks: MutableList) fun runCron() fun readNotification(id: String): Observable> diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/UserRepositoryImpl.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/UserRepositoryImpl.kt index 2d9191173..8083a075e 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/UserRepositoryImpl.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/UserRepositoryImpl.kt @@ -182,8 +182,7 @@ class UserRepositoryImpl(localRepository: UserLocalRepository, apiClient: ApiCli } override fun resetAccount(): Observable { - return apiClient.resetAccount() - .flatMap { retrieveUser(true, true) } + return apiClient.resetAccount().flatMap { retrieveUser(true, true) } } override fun deleteAccount(password: String): Observable = @@ -243,15 +242,21 @@ class UserRepositoryImpl(localRepository: UserLocalRepository, apiClient: ApiCli } } - override fun runCron(tasks: List) { - val observable: Observable> = if (tasks.isNotEmpty()) { - Observable.from(tasks) - .flatMap { task -> taskRepository.taskChecked(null, task, true, true) } - .toList() - } else { - Observable.just(null) + override fun runCron(tasks: MutableList) { + var observable: Observable = localRepository.getUser(userId).first() + .filter { it.needsCron } + .map { user -> localRepository.executeTransaction { + user.needsCron = false + user.lastCron = Date() + } + user + } + if (tasks.isNotEmpty()) { + for (task in tasks) { + observable = observable.flatMap { taskRepository.taskChecked(null, task, true, true) } + } + observable.toList() } - localRepository.getUser(userId).first().subscribe(Action1 { user -> localRepository.executeTransaction { user.needsCron = false } }, RxErrorHandler.handleEmptyError()) observable.flatMap { apiClient.runCron() } .flatMap { this.retrieveUser(true, true) } .subscribe(Action1 { }, RxErrorHandler.handleEmptyError()) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmUserLocalRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmUserLocalRepository.kt index f4992a68d..65a9abc95 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmUserLocalRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmUserLocalRepository.kt @@ -1,6 +1,7 @@ package com.habitrpg.android.habitica.data.local.implementation import com.habitrpg.android.habitica.data.local.UserLocalRepository +import com.habitrpg.android.habitica.helpers.RxErrorHandler import com.habitrpg.android.habitica.models.Skill import com.habitrpg.android.habitica.models.Tag import com.habitrpg.android.habitica.models.TutorialStep @@ -10,6 +11,8 @@ import io.realm.Realm import io.realm.RealmResults import io.realm.Sort import rx.Observable +import rx.functions.Action0 +import rx.functions.Action1 class RealmUserLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm), UserLocalRepository { @@ -27,6 +30,16 @@ class RealmUserLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm), } override fun saveUser(user: User) { + val oldUser = realm.where(User::class.java) + .equalTo("id", user.id) + .findFirst() + if (oldUser != null && oldUser.isValid) { + if (user.needsCron && !oldUser.needsCron) { + if (user.lastCron.before(oldUser.lastCron)) { + user.needsCron = false + } + } + } realm.executeTransaction { realm1 -> realm1.insertOrUpdate(user) } if (user.tags != null) { removeOldTags(user.id, user.tags)