diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmTaskLocalRepository.java b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmTaskLocalRepository.java index 346731a84..d099f630e 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmTaskLocalRepository.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmTaskLocalRepository.java @@ -51,6 +51,22 @@ public class RealmTaskLocalRepository extends RealmBaseLocalRepository implement } if (userId != null) { removeOldTasks(realm1, userId, sortedTasks); + + List allChecklistItems = new ArrayList<>(); + for (Task t : sortedTasks) { + if (t.checklist != null) { + allChecklistItems.addAll(t.checklist); + } + } + removeOldChecklists(realm1, allChecklistItems); + + List allReminders = new ArrayList<>(); + for (Task t : sortedTasks) { + if (t.getReminders() != null) { + allReminders.addAll(t.getReminders()); + } + } + removeOldReminders(realm1, allReminders); } realm1.insertOrUpdate(sortedTasks); @@ -77,8 +93,8 @@ public class RealmTaskLocalRepository extends RealmBaseLocalRepository implement realm.executeTransaction(realm1 -> realm1.insertOrUpdate(task)); } - private void removeOldTasks(Realm realm1, String userID, List onlineTaskList) { - RealmResults localTasks = realm1.where(Task.class).equalTo("userId", userID).findAll(); + private void removeOldTasks(Realm realm, String userID, List onlineTaskList) { + RealmResults localTasks = realm.where(Task.class).equalTo("userId", userID).findAll(); for (Task localTask : localTasks) { if (!onlineTaskList.contains(localTask)) { for (ChecklistItem item : localTask.checklist) { @@ -92,7 +108,23 @@ public class RealmTaskLocalRepository extends RealmBaseLocalRepository implement } } + private void removeOldChecklists(Realm realm, List onlineItems) { + RealmResults localItems = realm.where(ChecklistItem.class).findAll(); + for (ChecklistItem localItem : localItems) { + if (!onlineItems.contains(localItem)) { + localItem.deleteFromRealm(); + } + } + } + private void removeOldReminders(Realm realm, List onlineReminders) { + RealmResults localReminders = realm.where(RemindersItem.class).findAll(); + for (RemindersItem localItem : localReminders) { + if (!onlineReminders.contains(localItem)) { + localItem.deleteFromRealm(); + } + } + } @Override public void deleteTask(String taskID) { Task task = realm.where(Task.class).equalTo("id", taskID).findFirstAsync(); @@ -100,7 +132,6 @@ public class RealmTaskLocalRepository extends RealmBaseLocalRepository implement } @Override - public Observable getTask(String taskId) { return realm.where(Task.class).equalTo("id", taskId).findFirstAsync().asObservable() .filter(realmObject -> realmObject.isLoaded()) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmUserLocalRepository.java b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmUserLocalRepository.java index 985f36792..24230c387 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmUserLocalRepository.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmUserLocalRepository.java @@ -2,6 +2,7 @@ package com.habitrpg.android.habitica.data.local.implementation; import com.habitrpg.android.habitica.data.local.UserLocalRepository; import com.habitrpg.android.habitica.models.Skill; +import com.habitrpg.android.habitica.models.Tag; import com.habitrpg.android.habitica.models.TutorialStep; import com.habitrpg.android.habitica.models.user.SpecialItems; import com.habitrpg.android.habitica.models.user.User; @@ -32,7 +33,23 @@ public class RealmUserLocalRepository extends RealmBaseLocalRepository implement @Override public void saveUser(User user) { - realm.executeTransaction(realm1 -> realm1.insertOrUpdate(user)); + realm.executeTransaction(realm1 -> { + realm1.insertOrUpdate(user); + + if (user.getTags() != null) { + removeOldTags(user.getId(), user.getTags()); + } + }); + } + + private void removeOldTags(String userId, List onlineTags) { + RealmResults tags = realm.where(Tag.class).equalTo("userId", userId).findAll(); + + for (Tag tag : tags) { + if (!onlineTags.contains(tag)) { + tag.deleteFromRealm(); + } + } } @Override diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/Tag.java b/Habitica/src/main/java/com/habitrpg/android/habitica/models/Tag.java index 618094a77..4e0c59e01 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/Tag.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/Tag.java @@ -19,7 +19,7 @@ public class Tag extends RealmObject { @PrimaryKey public String id; - public User user; + public String userId; public RealmList tasks; String name; boolean challenge; diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/tasks/ChecklistItem.java b/Habitica/src/main/java/com/habitrpg/android/habitica/models/tasks/ChecklistItem.java index c2593ea3f..0d80ef320 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/tasks/ChecklistItem.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/tasks/ChecklistItem.java @@ -78,4 +78,12 @@ public class ChecklistItem extends RealmObject { public void setTask(Task task) { this.task = task; } + + @Override + public boolean equals(Object obj) { + if (obj.getClass().equals(ChecklistItem.class)) { + return this.id.equals(((ChecklistItem)obj).id); + } + return super.equals(obj); + } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/tasks/RemindersItem.java b/Habitica/src/main/java/com/habitrpg/android/habitica/models/tasks/RemindersItem.java index 1e960a0e8..549383263 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/tasks/RemindersItem.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/tasks/RemindersItem.java @@ -66,4 +66,12 @@ public class RemindersItem extends RealmObject { public void setType(String type) { this.type = type; } + + @Override + public boolean equals(Object obj) { + if (obj.getClass().equals(RemindersItem.class)) { + return this.id.equals(((RemindersItem)obj).id); + } + return super.equals(obj); + } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyFragment.java index e90359ee3..931e276f7 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyFragment.java @@ -141,7 +141,6 @@ public class PartyFragment extends BaseMainFragment { } }, RxErrorHandler.handleEmptyError()); } - } @Override diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/utils/QuestDeserializer.java b/Habitica/src/main/java/com/habitrpg/android/habitica/utils/QuestDeserializer.java index 19a225e16..b90d54589 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/utils/QuestDeserializer.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/utils/QuestDeserializer.java @@ -20,7 +20,11 @@ public class QuestDeserializer implements JsonDeserializer { JsonObject obj = json.getAsJsonObject(); Quest quest = new Quest(); - quest.key = obj.get("key").getAsString(); + if (obj.has("key") && !obj.get("key").isJsonNull()) { + quest.key = obj.get("key").getAsString(); + } else { + return quest; + } if (obj.has("active")) { quest.active = obj.get("active").getAsBoolean(); } @@ -32,7 +36,7 @@ public class QuestDeserializer implements JsonDeserializer { } if (obj.has("progress")) { QuestProgress progress = new QuestProgress(); - progress.key = obj.get("key").getAsString(); + progress.key = quest.getKey(); JsonObject progressObj = obj.get("progress").getAsJsonObject(); if (progressObj.has("hp")) { progress.hp = progressObj.get("hp").getAsInt(); diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/utils/UserDeserializer.java b/Habitica/src/main/java/com/habitrpg/android/habitica/utils/UserDeserializer.java index c734fe82b..02c4800fd 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/utils/UserDeserializer.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/utils/UserDeserializer.java @@ -32,6 +32,10 @@ public class UserDeserializer implements JsonDeserializer { public User deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { User user = new User(); JsonObject obj = json.getAsJsonObject(); + if (obj.has("_id")) { + user.setId(obj.get("_id").getAsString()); + } + if (obj.has("balance")) { user.setBalance(obj.get("balance").getAsDouble()); } @@ -68,6 +72,9 @@ public class UserDeserializer implements JsonDeserializer { if (obj.has("tags")) { user.setTags(context.deserialize(obj.get("tags"), new TypeToken>() { }.getType())); + for (Tag tag : user.getTags()) { + tag.userId = user.getId(); + } } if (obj.has("tasksOrder")) { user.setTasksOrder(context.deserialize(obj.get("tasksOrder"), TasksOrder.class)); @@ -85,10 +92,6 @@ public class UserDeserializer implements JsonDeserializer { } } - if (obj.has("_id")) { - user.setId(obj.get("_id").getAsString()); - } - return user; } } \ No newline at end of file