From 74c13979876aea8d6a10a3de6f9314bc01ec3d1a Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Wed, 18 Sep 2019 13:23:06 +0200 Subject: [PATCH] Fix various realm errors --- .../android/habitica/data/TaskRepository.kt | 2 +- .../data/implementation/TaskRepositoryImpl.kt | 38 +++++++-------- .../data/local/BaseLocalRepository.kt | 2 + .../RealmBaseLocalRepository.kt | 12 +++++ .../RealmChallengeLocalRepository.kt | 10 ++-- .../RealmInventoryLocalRepository.kt | 10 ++-- .../RealmSocialLocalRepository.kt | 46 +++++++++---------- .../implementation/RealmTagLocalRepository.kt | 2 +- .../RealmTaskLocalRepository.kt | 19 ++++---- .../RealmTutorialLocalRepository.kt | 2 +- .../RealmUserLocalRepository.kt | 13 +++--- .../interactors/ScoreTaskLocallyInteractor.kt | 4 +- .../ui/viewmodels/NotificationsViewModel.kt | 2 +- .../views/yesterdailies/YesterdailyDialog.kt | 10 ++-- 14 files changed, 93 insertions(+), 79 deletions(-) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/TaskRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/TaskRepository.kt index cabb4db41..01026d5ac 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/TaskRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/TaskRepository.kt @@ -56,7 +56,7 @@ interface TaskRepository : BaseRepository { fun getTaskCopies(tasks: List): Flowable> - fun updateDailiesIsDue(date: Date): Flowable + fun retrieveDailiesFromDate(date: Date): Flowable fun retrieveCompletedTodos(userId: String): Flowable fun syncErroredTasks(): Single> } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/TaskRepositoryImpl.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/TaskRepositoryImpl.kt index c9bf87c2f..7aa6cdd62 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/TaskRepositoryImpl.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/TaskRepositoryImpl.kt @@ -117,34 +117,35 @@ class TaskRepositoryImpl(localRepository: TaskLocalRepository, apiClient: ApiCli } private fun handleTaskResponse(user: User, res: TaskDirectionData, task: Task, up: Boolean, localDelta: Float) { - val stats = user.stats - this.localRepository.executeTransaction { - if (!task.isValid) { - return@executeTransaction - } - if (task.type != "reward" && (task.value - localDelta) + res.delta != task.value) { - task.value = (task.value - localDelta) + res.delta - if (Task.TYPE_DAILY == task.type || Task.TYPE_TODO == task.type) { - task.completed = up - if (Task.TYPE_DAILY == task.type && up) { - task.streak = (task.streak ?: 0) + 1 + val userID = user.id + val taskID = task.id + this.localRepository.executeTransactionAsync { + val bgTask = it.where(Task::class.java).equalTo("id", taskID).findFirst() ?: return@executeTransactionAsync + val bgUser = it.where(User::class.java).equalTo("id", userID).findFirst() ?: return@executeTransactionAsync + if (bgTask.type != "reward" && (bgTask.value - localDelta) + res.delta != bgTask.value) { + bgTask.value = (bgTask.value - localDelta) + res.delta + if (Task.TYPE_DAILY == bgTask.type || Task.TYPE_TODO == bgTask.type) { + bgTask.completed = up + if (Task.TYPE_DAILY == bgTask.type && up) { + bgTask.streak = (bgTask.streak ?: 0) + 1 } - } else if (Task.TYPE_HABIT == task.type) { + } else if (Task.TYPE_HABIT == bgTask.type) { if (up) { - task.counterUp = (task.counterUp ?: 0) + 1 + bgTask.counterUp = (bgTask.counterUp ?: 0) + 1 } else { - task.counterDown = (task.counterDown ?: 0) + 1 + bgTask.counterDown = (bgTask.counterDown ?: 0) + 1 } } } + val stats = bgUser.stats stats?.hp = res.hp stats?.exp = res.exp stats?.mp = res.mp stats?.gp = res.gp - stats?.lvl = res.lvl - user.party?.quest?.progress?.up = (user.party?.quest?.progress?.up + stats?.lvl = res.lvl.toInt() + bgUser.party?.quest?.progress?.up = (bgUser.party?.quest?.progress?.up ?: 0F) + (res._tmp?.quest?.progressDelta?.toFloat() ?: 0F) - user.stats = stats + bgUser.stats = stats } } @@ -271,10 +272,9 @@ class TaskRepositoryImpl(localRepository: TaskLocalRepository, apiClient: ApiCli override fun getTaskCopies(tasks: List): Flowable> = Flowable.just(localRepository.getUnmanagedCopy(tasks)) - override fun updateDailiesIsDue(date: Date): Flowable { + override fun retrieveDailiesFromDate(date: Date): Flowable { val formatter = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZZZZZ", Locale.US) return apiClient.getTasks("dailys", formatter.format(date)) - .flatMapMaybe { localRepository.updateIsdue(it) } } override fun syncErroredTasks(): Single> { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/BaseLocalRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/BaseLocalRepository.kt index 19d5da096..daab2d4ee 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/BaseLocalRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/BaseLocalRepository.kt @@ -11,6 +11,8 @@ interface BaseLocalRepository { fun executeTransaction(transaction: (Realm) -> Unit) fun executeTransaction(transaction: Realm.Transaction) + fun executeTransactionAsync(transaction: (Realm) -> Unit) + fun executeTransactionAsync(transaction: Realm.Transaction) fun getUnmanagedCopy(managedObject: T): T fun getUnmanagedCopy(list: List): List diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmBaseLocalRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmBaseLocalRepository.kt index b414ec083..665d94f9f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmBaseLocalRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmBaseLocalRepository.kt @@ -26,6 +26,18 @@ abstract class RealmBaseLocalRepository internal constructor(protected var realm realm.executeTransaction(transaction) } + override fun executeTransactionAsync(transaction: (Realm) -> Unit) { + if (isClosed) { return } + realm.executeTransactionAsync { + transaction(it) + } + } + + override fun executeTransactionAsync(transaction: Realm.Transaction) { + if (isClosed) { return } + realm.executeTransactionAsync(transaction) + } + override fun getUnmanagedCopy(managedObject: T): T { return if (managedObject.isManaged && managedObject.isValid) { realm.copyFromRealm(managedObject) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmChallengeLocalRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmChallengeLocalRepository.kt index f93866746..f7e676126 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmChallengeLocalRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmChallengeLocalRepository.kt @@ -81,13 +81,11 @@ class RealmChallengeLocalRepository(realm: Realm) : RealmBaseLocalRepository(rea override fun setParticipating(userID: String, challengeID: String, isParticipating: Boolean) { if (isParticipating) { - realm.executeTransaction { - realm.insertOrUpdate(ChallengeMembership(userID, challengeID)) - } + save(ChallengeMembership(userID, challengeID)) } else { val membership = realm.where(ChallengeMembership::class.java).equalTo("userID", userID).equalTo("challengeID", challengeID).findFirst() if (membership != null) { - realm.executeTransaction { + executeTransaction { membership.deleteFromRealm() } } @@ -103,12 +101,12 @@ class RealmChallengeLocalRepository(realm: Realm) : RealmBaseLocalRepository(rea challengesToDelete.add(localTask) } } - realm.executeTransaction { + executeTransaction { for (localTask in challengesToDelete) { localTask.deleteFromRealm() } } } - realm.executeTransaction { realm1 -> realm1.insertOrUpdate(challenges) } + executeTransaction { realm1 -> realm1.insertOrUpdate(challenges) } } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmInventoryLocalRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmInventoryLocalRepository.kt index 6d53a8aa9..991d4f0c0 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmInventoryLocalRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmInventoryLocalRepository.kt @@ -82,7 +82,7 @@ class RealmInventoryLocalRepository(realm: Realm, private val context: Context) } override fun getItems(itemClass: Class, keys: Array, user: User?): Flowable> { - return realm.where(itemClass).`in`("key", keys).findAllAsync().asFlowable() + return realm.where(itemClass).`in`("key", keys).findAll().asFlowable() .filter { it.isLoaded } } @@ -175,7 +175,7 @@ class RealmInventoryLocalRepository(realm: Realm, private val context: Context) override fun changeOwnedCount(item: OwnedItem, amountToAdd: Int?) { amountToAdd?.let { amount -> - realm.executeTransaction { item.numberOwned = item.numberOwned + amount } + executeTransaction { item.numberOwned = item.numberOwned + amount } } } @@ -208,7 +208,7 @@ class RealmInventoryLocalRepository(realm: Realm, private val context: Context) return } val item = realm.where(OwnedItem::class.java).equalTo("combinedKey", "${user.id}specialinventory_present").findFirst() - realm.executeTransaction { + executeTransaction { if (item != null && item.isValid) { item.numberOwned = item.numberOwned - 1 } @@ -220,14 +220,14 @@ class RealmInventoryLocalRepository(realm: Realm, private val context: Context) override fun getInAppRewards(): Flowable> { return realm.where(ShopItem::class.java) - .findAllAsync() + .findAll() .asFlowable() .filter { it.isLoaded } } override fun saveInAppRewards(onlineItems: List) { val localItems = realm.where(ShopItem::class.java).findAll().createSnapshot() - realm.executeTransaction { + executeTransactionAsync { for (localItem in localItems) { if (!onlineItems.contains(localItem)) { localItem.deleteFromRealm() diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmSocialLocalRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmSocialLocalRepository.kt index 074805afa..6e76f8c7a 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmSocialLocalRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmSocialLocalRepository.kt @@ -36,13 +36,11 @@ class RealmSocialLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm) override fun updateMembership(userId: String, id: String, isMember: Boolean) { if (isMember) { - realm.executeTransaction { - realm.insertOrUpdate(GroupMembership(userId, id)) - } + save(GroupMembership(userId, id)) } else { val membership = realm.where(GroupMembership::class.java).equalTo("userID", userId).equalTo("groupID", id).findFirst() if (membership != null) { - realm.executeTransaction { + executeTransaction { membership.deleteFromRealm() } } @@ -51,7 +49,7 @@ class RealmSocialLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm) override fun saveInboxMessages(userID: String, recipientID: String, messages: List, page: Int) { messages.forEach { it.userID = userID } - realm.executeTransaction { realm.insertOrUpdate(messages) } + save(messages) if (page != 0) return val existingMessages = realm.where(ChatMessage::class.java).equalTo("isInboxMessage", true).equalTo("uuid", recipientID).findAll() val messagesToRemove = ArrayList() @@ -61,14 +59,14 @@ class RealmSocialLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm) messagesToRemove.add(existingMessage) } } - realm.executeTransaction { + executeTransaction { messagesToRemove.forEach { it.deleteFromRealm() } } } override fun saveInboxConversations(userID: String, conversations: List) { conversations.forEach { it.userID = userID } - realm.executeTransaction { realm.insertOrUpdate(conversations) } + save(conversations) val existingConversations = realm.where(InboxConversation::class.java).findAll() val conversationsToRemove = ArrayList() for (existingMessage in existingConversations) { @@ -77,13 +75,13 @@ class RealmSocialLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm) conversationsToRemove.add(existingMessage) } } - realm.executeTransaction { + executeTransaction { conversationsToRemove.forEach { it.deleteFromRealm() } } } override fun saveGroupMemberships(userID: String?, memberships: List) { - realm.executeTransaction { realm.insertOrUpdate(memberships) } + save(memberships) if (userID != null) { val existingMemberships = realm.where(GroupMembership::class.java).equalTo("userID", userID).findAll() val membersToRemove = ArrayList() @@ -93,7 +91,7 @@ class RealmSocialLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm) membersToRemove.add(existingMembership) } } - realm.executeTransaction { + executeTransaction { membersToRemove.forEach { it.deleteFromRealm() } } } @@ -131,7 +129,7 @@ class RealmSocialLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm) override fun getGroups(type: String): Flowable> { return realm.where(Group::class.java) .equalTo("type", type) - .findAllAsync() + .findAll() .asFlowable() .filter { it.isLoaded } } @@ -155,19 +153,19 @@ class RealmSocialLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm) } override fun deleteMessage(id: String) { - getMessage(id).firstElement().subscribe { chatMessage -> realm.executeTransaction { chatMessage.deleteFromRealm() } } + getMessage(id).firstElement().subscribe { chatMessage -> executeTransaction { chatMessage.deleteFromRealm() } } } override fun getGroupMembers(partyId: String): Flowable> { return realm.where(Member::class.java) .equalTo("party.id", partyId) - .findAllAsync() + .findAll() .asFlowable() .filter { it.isLoaded } } override fun updateRSVPNeeded(user: User?, newValue: Boolean) { - realm.executeTransaction { user?.party?.quest?.RSVPNeeded = newValue } + executeTransaction { user?.party?.quest?.RSVPNeeded = newValue } } override fun likeMessage(chatMessage: ChatMessage, userId: String, liked: Boolean) { @@ -175,14 +173,14 @@ class RealmSocialLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm) return } if (liked) { - realm.executeTransaction { chatMessage.likes?.add(ChatMessageLike(userId, chatMessage.id)) } + executeTransaction { chatMessage.likes?.add(ChatMessageLike(userId, chatMessage.id)) } } else { - chatMessage.likes?.filter { userId == it.id }?.forEach { like -> realm.executeTransaction { like.deleteFromRealm() } } + chatMessage.likes?.filter { userId == it.id }?.forEach { like -> executeTransaction { like.deleteFromRealm() } } } } override fun saveGroupMembers(groupId: String?, members: List) { - realm.executeTransaction { realm.insertOrUpdate(members) } + save(members) if (groupId != null) { val existingMembers = realm.where(Member::class.java).equalTo("party.id", groupId).findAll() val membersToRemove = ArrayList() @@ -192,7 +190,7 @@ class RealmSocialLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm) membersToRemove.add(existingMember) } } - realm.executeTransaction { + executeTransaction { membersToRemove.forEach { it.deleteFromRealm() } } } @@ -200,7 +198,7 @@ class RealmSocialLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm) override fun rejectGroupInvitation(userID: String, groupID: String) { val user = realm.where(User::class.java).equalTo("id", userID).findFirst() - realm.executeTransaction { + executeTransaction { user?.invitations?.removeInvitation(groupID) } } @@ -208,18 +206,18 @@ class RealmSocialLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm) override fun removeQuest(partyId: String) { val party = realm.where(Group::class.java).equalTo("id", partyId).findFirst() if (party != null) { - realm.executeTransaction { party.quest = null } + executeTransaction { party.quest = null } } } override fun setQuestActivity(party: Group?, active: Boolean) { - realm.executeTransaction { + executeTransaction { party?.quest?.active = active } } override fun saveChatMessages(groupId: String?, chatMessages: List) { - realm.executeTransaction { realm.insertOrUpdate(chatMessages) } + save(chatMessages) if (groupId != null) { val existingMessages = realm.where(ChatMessage::class.java).equalTo("groupId", groupId).findAll() val messagesToRemove = ArrayList() @@ -232,7 +230,7 @@ class RealmSocialLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm) val idsToRemove = messagesToRemove.map { it.id } val userStylestoRemove = realm.where(UserStyles::class.java).`in`("id", idsToRemove.toTypedArray()).findAll() val contributorToRemove = realm.where(ContributorInfo::class.java).`in`("userId", idsToRemove.toTypedArray()).findAll() - realm.executeTransaction { + executeTransaction { for (member in messagesToRemove) { member.deleteFromRealm() } @@ -245,7 +243,7 @@ class RealmSocialLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm) private fun getMessage(id: String): Flowable { return realm.where(ChatMessage::class.java).equalTo("id", id) - .findAllAsync() + .findAll() .asFlowable() .filter { messages -> messages.isLoaded && messages.isValid && !messages.isEmpty() } .map { messages -> messages.first() } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmTagLocalRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmTagLocalRepository.kt index fe95afe68..f0da06d7b 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmTagLocalRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmTagLocalRepository.kt @@ -10,7 +10,7 @@ import io.realm.RealmResults class RealmTagLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm), TagLocalRepository { override fun deleteTag(tagID: String) { val tag = realm.where(Tag::class.java).equalTo("id", tagID).findFirst() - realm.executeTransaction { tag?.deleteFromRealm() } + executeTransaction { tag?.deleteFromRealm() } } override fun getTags(userId: String): Flowable> { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmTaskLocalRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmTaskLocalRepository.kt index 66926f764..b68bc336a 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmTaskLocalRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmTaskLocalRepository.kt @@ -82,6 +82,7 @@ class RealmTaskLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm), } private fun removeOldTasks(userID: String, onlineTaskList: List) { + if (realm.isClosed) return val localTasks = realm.where(Task::class.java) .equalTo("userId", userID) .beginGroup() @@ -95,7 +96,7 @@ class RealmTaskLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm), .findAll() .createSnapshot() val tasksToDelete = localTasks.filterNot { onlineTaskList.contains(it) } - realm.executeTransaction { + executeTransaction { for (localTask in tasksToDelete) { localTask.checklist?.deleteAllFromRealm() localTask.reminders?.deleteAllFromRealm() @@ -112,7 +113,7 @@ class RealmTaskLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm), .findAll() .createSnapshot() val tasksToDelete = localTasks.filterNot { onlineTaskList.contains(it) } - realm.executeTransaction { + executeTransaction { for (localTask in tasksToDelete) { localTask.checklist?.deleteAllFromRealm() localTask.reminders?.deleteAllFromRealm() @@ -124,7 +125,7 @@ class RealmTaskLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm), private fun removeOldChecklists(onlineItems: List) { val localItems = realm.where(ChecklistItem::class.java).findAll().createSnapshot() val itemsToDelete = localItems.filterNot { onlineItems.contains(it) } - realm.executeTransaction { + executeTransaction { for (item in itemsToDelete) { item.deleteFromRealm() } @@ -134,7 +135,7 @@ class RealmTaskLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm), private fun removeOldReminders(onlineReminders: List) { val localReminders = realm.where(RemindersItem::class.java).findAll().createSnapshot() val itemsToDelete = localReminders.filterNot { onlineReminders.contains(it) } - realm.executeTransaction { + executeTransaction { for (item in itemsToDelete) { item.deleteFromRealm() } @@ -143,7 +144,7 @@ class RealmTaskLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm), override fun deleteTask(taskID: String) { val task = realm.where(Task::class.java).equalTo("id", taskID).findFirstAsync() - realm.executeTransaction { + executeTransaction { if (task.isManaged) { task.deleteFromRealm() } @@ -172,18 +173,18 @@ class RealmTaskLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm), override fun markTaskCompleted(taskId: String, isCompleted: Boolean) { val task = realm.where(Task::class.java).equalTo("id", taskId).findFirstAsync() - realm.executeTransaction { task.completed = true } + executeTransaction { task.completed = true } } override fun saveReminder(remindersItem: RemindersItem) { - realm.executeTransaction { it.insertOrUpdate(remindersItem) } + executeTransaction { it.insertOrUpdate(remindersItem) } } override fun swapTaskPosition(firstPosition: Int, secondPosition: Int) { val firstTask = realm.where(Task::class.java).equalTo("position", firstPosition).findFirst() val secondTask = realm.where(Task::class.java).equalTo("position", secondPosition).findFirst() if (firstTask != null && secondTask != null && firstTask.isValid && secondTask.isValid) { - realm.executeTransaction { + executeTransaction { firstTask.position = secondPosition secondTask.position = firstPosition } @@ -210,7 +211,7 @@ class RealmTaskLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm), override fun updateTaskPositions(taskOrder: List) { if (taskOrder.isNotEmpty()) { val tasks = realm.where(Task::class.java).`in`("id", taskOrder.toTypedArray()).findAll() - realm.executeTransaction { _ -> + executeTransaction { _ -> tasks.filter { taskOrder.contains(it.id) }.forEach { it.position = taskOrder.indexOf(it.id) } } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmTutorialLocalRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmTutorialLocalRepository.kt index 52fda4b89..e7a1f2883 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmTutorialLocalRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmTutorialLocalRepository.kt @@ -12,7 +12,7 @@ class RealmTutorialLocalRepository(realm: Realm) : RealmBaseLocalRepository(real override fun getTutorialStep(key: String): Flowable { if (realm.isClosed) return Flowable.empty() return realm.where(TutorialStep::class.java).equalTo("identifier", key) - .findAllAsync() + .findAll() .asFlowable() .filter { realmObject -> realmObject.isLoaded && realmObject.isValid && realmObject.isNotEmpty() } .map { steps -> 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 95a81895b..648f0e195 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 @@ -58,6 +58,7 @@ class RealmUserLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm), } override fun saveUser(user: User) { + if (realm.isClosed) return val oldUser = realm.where(User::class.java) .equalTo("id", user.id) .findFirst() @@ -72,7 +73,7 @@ class RealmUserLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm), } } } - realm.executeTransaction { realm1 -> realm1.insertOrUpdate(user) } + executeTransaction { realm1 -> realm1.insertOrUpdate(user) } removeOldTags(user.id ?: "", user.tags) if (user.challenges != null) { removeOldChallenges(user.id ?: "", user.challenges ?: emptyList()) @@ -82,7 +83,7 @@ class RealmUserLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm), } override fun saveMessages(messages: List) { - realm.executeTransaction { + executeTransaction { it.insertOrUpdate(messages) } } @@ -90,7 +91,7 @@ class RealmUserLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm), private fun removeOldTags(userId: String, onlineTags: List) { val tags = realm.where(Tag::class.java).equalTo("userId", userId).findAll().createSnapshot() val tagsToDelete = tags.filterNot { onlineTags.contains(it) } - realm.executeTransaction { + executeTransaction { for (tag in tagsToDelete) { tag.deleteFromRealm() } @@ -100,7 +101,7 @@ class RealmUserLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm), private fun removeOldChallenges(userID: String, onlineChallenges: List) { val memberships = realm.where(ChallengeMembership::class.java).equalTo("userID", userID).findAll().createSnapshot() val membershipsToDelete = memberships.filterNot { onlineChallenges.contains(it) } - realm.executeTransaction { + executeTransaction { membershipsToDelete.forEach { it.deleteFromRealm() } @@ -110,7 +111,7 @@ class RealmUserLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm), private fun removeOldPets(userID: String, onlinePets: List) { val pets = realm.where(OwnedPet::class.java).equalTo("userID", userID).findAll().createSnapshot() val petsToDelete = pets.filterNot { onlinePets.contains(it) } - realm.executeTransaction { + executeTransaction { petsToDelete.forEach { it.deleteFromRealm() } @@ -120,7 +121,7 @@ class RealmUserLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm), private fun removeOldMounts(userID: String, onlineMounts: List) { val mount = realm.where(OwnedMount::class.java).equalTo("userID", userID).findAll().createSnapshot() val mountsToDelete = mount.filterNot { onlineMounts.contains(it) } - realm.executeTransaction { + executeTransaction { mountsToDelete.forEach { it.deleteFromRealm() } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/interactors/ScoreTaskLocallyInteractor.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/interactors/ScoreTaskLocallyInteractor.kt index 03e215b5f..ee1853576 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/interactors/ScoreTaskLocallyInteractor.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/interactors/ScoreTaskLocallyInteractor.kt @@ -75,10 +75,10 @@ class ScoreTaskLocallyInteractor { } if (result.exp >= stats.toNextLevel?.toDouble() ?: 0.0) { result.exp = result.exp - (stats.toNextLevel?.toDouble() ?: 0.0) - result.lvl = user.stats?.lvl ?: 0 + 1 + result.lvl = (user.stats?.lvl ?: 0 + 1).toLong() result.hp = 50.0 } else { - result.lvl = user.stats?.lvl ?: 0 + result.lvl = (user.stats?.lvl ?: 0).toLong() } result diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/NotificationsViewModel.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/NotificationsViewModel.kt index e52e83cb8..35276b008 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/NotificationsViewModel.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/NotificationsViewModel.kt @@ -175,7 +175,7 @@ open class NotificationsViewModel : BaseViewModel() { } fun isPartyMessage(data: NewChatMessageData?): Boolean { - if (party == null || data?.group?.id == null) { + if (party?.isValid != true || data?.group?.id == null) { return false } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/yesterdailies/YesterdailyDialog.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/yesterdailies/YesterdailyDialog.kt index 736d1e280..46bf1431f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/yesterdailies/YesterdailyDialog.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/yesterdailies/YesterdailyDialog.kt @@ -156,11 +156,13 @@ class YesterdailyDialog private constructor(context: Context, private val userRe .flatMapMaybe { val cal = Calendar.getInstance() cal.add(Calendar.DATE, -1) - taskRepository.updateDailiesIsDue(cal.time).firstElement() + taskRepository.retrieveDailiesFromDate(cal.time).firstElement() + } + .map { + it.tasks.values.filter { task -> + return@filter task.type == Task.TYPE_DAILY && task.isDue == true && !task.completed && task.yesterDaily + } } - .flatMapMaybe { taskRepository.getTasks(Task.TYPE_DAILY, userId).firstElement() } - .map { tasks -> tasks.where().equalTo("isDue", true).notEqualTo("completed", true).notEqualTo("yesterDaily", false).findAll() } - .flatMapMaybe> { tasks -> taskRepository.getTaskCopies(tasks).firstElement() } .retry(1) .throttleFirst(2, TimeUnit.SECONDS) .subscribe(Consumer { tasks ->