diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/callbacks/TaskCreationCallback.java b/Habitica/src/main/java/com/habitrpg/android/habitica/callbacks/TaskCreationCallback.java deleted file mode 100644 index d138d07d0..000000000 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/callbacks/TaskCreationCallback.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.habitrpg.android.habitica.callbacks; - -import com.habitrpg.android.habitica.events.TaskCreatedEvent; -import com.magicmicky.habitrpgwrapper.lib.models.tasks.Task; - -import org.greenrobot.eventbus.EventBus; - -import rx.functions.Action1; - -/** - * Created by magicmicky on 02/04/15. - */ -public class TaskCreationCallback implements Action1 { - - @Override - public void call(Task task) { - task.save(); - EventBus.getDefault().post(new TaskCreatedEvent(task)); - } -} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/callbacks/TaskDeletionCallback.java b/Habitica/src/main/java/com/habitrpg/android/habitica/callbacks/TaskDeletionCallback.java deleted file mode 100644 index 830e114c9..000000000 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/callbacks/TaskDeletionCallback.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.habitrpg.android.habitica.callbacks; - -import com.magicmicky.habitrpgwrapper.lib.models.tasks.Task; - -import rx.functions.Action1; - - -/** - * Created by magicmicky on 02/04/15. - */ -public class TaskDeletionCallback implements Action1 { - private final OnTaskDeleted callback; - private final Task taskToDelete; - - public TaskDeletionCallback(OnTaskDeleted cb, Task taskToDelete) { - this.callback = cb; - this.taskToDelete = taskToDelete; - } - - @Override - public void call(Void aVoid) { - callback.onTaskDeleted(taskToDelete); - } - - - public interface OnTaskDeleted { - public void onTaskDeleted(Task deleted); - } -} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/TagRepository.java b/Habitica/src/main/java/com/habitrpg/android/habitica/data/TagRepository.java index 17928a88a..eb90cab07 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/TagRepository.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/TagRepository.java @@ -19,4 +19,6 @@ public interface TagRepository extends BaseRepository { Observable createTags(Collection tags); Observable updateTags(Collection tags); Observable> deleteTags(Collection tagIds); + + void removeOldTags(List onlineTags); } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/TaskRepository.java b/Habitica/src/main/java/com/habitrpg/android/habitica/data/TaskRepository.java index 4f2e85e92..2232011eb 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/TaskRepository.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/TaskRepository.java @@ -2,8 +2,11 @@ package com.habitrpg.android.habitica.data; import com.magicmicky.habitrpgwrapper.lib.models.TaskDirectionData; import com.magicmicky.habitrpgwrapper.lib.models.responses.HabitResponse; +import com.magicmicky.habitrpgwrapper.lib.models.tasks.ChecklistItem; +import com.magicmicky.habitrpgwrapper.lib.models.tasks.RemindersItem; import com.magicmicky.habitrpgwrapper.lib.models.tasks.Task; import com.magicmicky.habitrpgwrapper.lib.models.tasks.TaskList; +import com.magicmicky.habitrpgwrapper.lib.models.tasks.TaskTag; import com.magicmicky.habitrpgwrapper.lib.models.tasks.TasksOrder; import java.util.ArrayList; @@ -24,4 +27,9 @@ public interface TaskRepository extends BaseRepository { Observable updateTask(Task task); Observable deleteTask(String taskID); + + void removeOldTasks(String userID, List onlineTaskList); + void removeOldChecklists(List onlineChecklistItems); + void removeOldTaskTags(List onlineTaskTags); + void removeOldReminders(List onlineReminders); } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/TagRepositoryImpl.java b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/TagRepositoryImpl.java index 8fd0da8f6..470e91648 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/TagRepositoryImpl.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/TagRepositoryImpl.java @@ -56,4 +56,9 @@ public class TagRepositoryImpl extends BaseRepositoryImpl im .flatMap(this::deleteTag) .toList(); } + + @Override + public void removeOldTags(List onlineTags) { + localRepository.removeOldTags(onlineTags); + } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/TaskRepositoryImpl.java b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/TaskRepositoryImpl.java index ce7552a0b..19330c086 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/TaskRepositoryImpl.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/TaskRepositoryImpl.java @@ -3,12 +3,19 @@ package com.habitrpg.android.habitica.data.implementation; import com.habitrpg.android.habitica.data.ApiClient; import com.habitrpg.android.habitica.data.TaskRepository; import com.habitrpg.android.habitica.data.local.TaskLocalRepository; +import com.habitrpg.android.habitica.events.TaskCreatedEvent; +import com.habitrpg.android.habitica.events.TaskUpdatedEvent; import com.magicmicky.habitrpgwrapper.lib.models.TaskDirection; import com.magicmicky.habitrpgwrapper.lib.models.TaskDirectionData; +import com.magicmicky.habitrpgwrapper.lib.models.tasks.ChecklistItem; +import com.magicmicky.habitrpgwrapper.lib.models.tasks.RemindersItem; import com.magicmicky.habitrpgwrapper.lib.models.tasks.Task; import com.magicmicky.habitrpgwrapper.lib.models.tasks.TaskList; +import com.magicmicky.habitrpgwrapper.lib.models.tasks.TaskTag; import com.magicmicky.habitrpgwrapper.lib.models.tasks.TasksOrder; +import org.greenrobot.eventbus.EventBus; + import java.util.Date; import java.util.List; @@ -62,7 +69,11 @@ public class TaskRepositoryImpl extends BaseRepositoryImpl if (lastTaskAction > now-500) { return Observable.empty(); } - return apiClient.createItem(task); + return apiClient.createItem(task) + .doOnNext(task1 -> { + localRepository.saveTask(task1); + EventBus.getDefault().post(new TaskCreatedEvent(task1)); + }); } @Override @@ -71,11 +82,36 @@ public class TaskRepositoryImpl extends BaseRepositoryImpl if (lastTaskAction > now-500) { return Observable.empty(); } - return apiClient.updateTask(task.getId(), task); + return apiClient.updateTask(task.getId(), task) + .doOnNext(task1 -> { + localRepository.saveTask(task1); + EventBus.getDefault().post(new TaskUpdatedEvent(task1)); + }); } @Override public Observable deleteTask(String taskID) { - return apiClient.deleteTask(taskID); + return apiClient.deleteTask(taskID) + .doOnNext(aVoid -> localRepository.deleteTask(taskID)); + } + + @Override + public void removeOldTasks(String userID, List onlineTaskList) { + localRepository.removeOldTasks(userID, onlineTaskList); + } + + @Override + public void removeOldChecklists(List onlineChecklistItems) { + localRepository.removeOldChecklists(onlineChecklistItems); + } + + @Override + public void removeOldTaskTags(List onlineTaskTags) { + localRepository.removeOldTaskTags(onlineTaskTags); + } + + @Override + public void removeOldReminders(List onlineReminders) { + localRepository.removeOldReminders(onlineReminders); } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/UserRepositoryImpl.java b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/UserRepositoryImpl.java index 725146488..c77f50e99 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/UserRepositoryImpl.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/UserRepositoryImpl.java @@ -8,7 +8,6 @@ import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser; import java.util.Map; import rx.Observable; -import rx.android.schedulers.AndroidSchedulers; public class UserRepositoryImpl extends BaseRepositoryImpl implements UserRepository { @@ -30,7 +29,8 @@ public class UserRepositoryImpl extends BaseRepositoryImpl @Override public Observable retrieveUser(Boolean withTasks) { - return apiClient.retrieveUser(withTasks); + return apiClient.retrieveUser(withTasks) + .doOnNext(localRepository::saveUser); } @Override @@ -52,7 +52,7 @@ public class UserRepositoryImpl extends BaseRepositoryImpl oldUser.getStats().merge(newUser.getStats()); } - oldUser.async().save(); + localRepository.saveUser(oldUser); return oldUser; } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/TagLocalRepository.java b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/TagLocalRepository.java index cf397f51d..bb7451714 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/TagLocalRepository.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/TagLocalRepository.java @@ -8,4 +8,6 @@ import rx.Observable; public interface TagLocalRepository extends BaseLocalRepository { Observable> getTags(); + + void removeOldTags(List onlineTags); } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/TaskLocalRepository.java b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/TaskLocalRepository.java index 87d6e4a8f..4d9c1340c 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/TaskLocalRepository.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/TaskLocalRepository.java @@ -1,7 +1,10 @@ package com.habitrpg.android.habitica.data.local; +import com.magicmicky.habitrpgwrapper.lib.models.tasks.ChecklistItem; +import com.magicmicky.habitrpgwrapper.lib.models.tasks.RemindersItem; import com.magicmicky.habitrpgwrapper.lib.models.tasks.Task; import com.magicmicky.habitrpgwrapper.lib.models.tasks.TaskList; +import com.magicmicky.habitrpgwrapper.lib.models.tasks.TaskTag; import com.magicmicky.habitrpgwrapper.lib.models.tasks.TasksOrder; import java.util.ArrayList; @@ -16,4 +19,11 @@ public interface TaskLocalRepository extends BaseLocalRepository { void saveTasks(TasksOrder tasksOrder, TaskList tasks); void saveTask(Task task); + + void removeOldTasks(String userID, List onlineTaskList); + void removeOldChecklists(List onlineChecklistItems); + void removeOldTaskTags(List onlineTaskTags); + void removeOldReminders(List onlineReminders); + + void deleteTask(String taskID); } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/UserLocalRepository.java b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/UserLocalRepository.java index 40a6efb33..554ebc3d8 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/UserLocalRepository.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/UserLocalRepository.java @@ -8,4 +8,5 @@ public interface UserLocalRepository extends BaseLocalRepository { Observable getUser(String userID); + void saveUser(HabitRPGUser user); } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/DbFlowTagLocalRepository.java b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/DbFlowTagLocalRepository.java index 0007c1805..9e54aac65 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/DbFlowTagLocalRepository.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/DbFlowTagLocalRepository.java @@ -1,11 +1,17 @@ package com.habitrpg.android.habitica.data.local.implementation; +import android.database.sqlite.SQLiteDoneException; + import com.habitrpg.android.habitica.data.local.TagLocalRepository; import com.magicmicky.habitrpgwrapper.lib.models.Tag; +import com.raizlabs.android.dbflow.runtime.transaction.BaseTransaction; +import com.raizlabs.android.dbflow.runtime.transaction.TransactionListener; +import com.raizlabs.android.dbflow.sql.language.From; import com.raizlabs.android.dbflow.sql.language.OrderBy; import com.raizlabs.android.dbflow.sql.language.Select; +import java.util.ArrayList; import java.util.List; import rx.Observable; @@ -22,4 +28,50 @@ public class DbFlowTagLocalRepository implements TagLocalRepository { .orderBy(OrderBy.columns("position", "dateCreated").descending()) .queryList())); } + + @Override + public void removeOldTags(List onlineTags) { + final ArrayList onlineTaskTagItemIdList = new ArrayList<>(); + + for (Tag item : onlineTags) { + onlineTaskTagItemIdList.add(item.getId()); + } + + From query = new Select().from(Tag.class); + try { + if (query.count() != onlineTags.size()) { + + // Load Database Checklist items + query.async().queryList(new TransactionListener>() { + @Override + public void onResultReceived(List items) { + + ArrayList tagsToDelete = new ArrayList<>(); + + for (Tag tag : items) { + if (!onlineTaskTagItemIdList.contains(tag.getId())) { + tagsToDelete.add(tag); + } + } + + for (Tag tag : tagsToDelete) { + tag.async().delete(); + } + } + + @Override + public boolean onReady(BaseTransaction> baseTransaction) { + return false; + } + + @Override + public boolean hasResult(BaseTransaction> transaction, List result) { + return result != null && result.size() > 0; + } + }); + } + } catch (SQLiteDoneException ignored) { + //Ignored + } + } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/DbFlowTaskLocalRepository.java b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/DbFlowTaskLocalRepository.java index 862a9befe..e6ff82623 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/DbFlowTaskLocalRepository.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/DbFlowTaskLocalRepository.java @@ -1,15 +1,28 @@ package com.habitrpg.android.habitica.data.local.implementation; +import android.database.sqlite.SQLiteDoneException; + import com.habitrpg.android.habitica.data.local.TaskLocalRepository; +import com.habitrpg.android.habitica.events.TaskRemovedEvent; +import com.magicmicky.habitrpgwrapper.lib.models.tasks.ChecklistItem; +import com.magicmicky.habitrpgwrapper.lib.models.tasks.Days; +import com.magicmicky.habitrpgwrapper.lib.models.tasks.RemindersItem; import com.magicmicky.habitrpgwrapper.lib.models.tasks.Task; import com.magicmicky.habitrpgwrapper.lib.models.tasks.TaskList; +import com.magicmicky.habitrpgwrapper.lib.models.tasks.TaskTag; import com.magicmicky.habitrpgwrapper.lib.models.tasks.TasksOrder; +import com.raizlabs.android.dbflow.runtime.transaction.BaseTransaction; +import com.raizlabs.android.dbflow.runtime.transaction.TransactionListener; import com.raizlabs.android.dbflow.sql.builder.Condition; +import com.raizlabs.android.dbflow.sql.language.Delete; +import com.raizlabs.android.dbflow.sql.language.From; import com.raizlabs.android.dbflow.sql.language.OrderBy; import com.raizlabs.android.dbflow.sql.language.Select; +import com.raizlabs.android.dbflow.sql.language.Where; + +import org.greenrobot.eventbus.EventBus; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import rx.Observable; @@ -29,6 +42,12 @@ public class DbFlowTaskLocalRepository implements TaskLocalRepository { .queryList())); } + public Observable getTask(String taskID) { + return Observable.defer(() -> Observable.just(new Select().from(Task.class) + .where(Condition.column("id").eq(taskID)) + .querySingle())); + } + @Override public void saveTasks(TasksOrder tasksOrder, TaskList tasks) { sortTasks(tasks, tasksOrder.getHabits()); @@ -51,11 +70,211 @@ public class DbFlowTaskLocalRepository implements TaskLocalRepository { task.async().save(); } + @Override + public void removeOldTasks(String userID, List onlineTaskList) { + final ArrayList onlineTaskIdList = new ArrayList<>(); + + for (Task oTask : onlineTaskList) { + onlineTaskIdList.add(oTask.getId()); + } + + Where query = new Select().from(Task.class).where(Condition.column("user_id").eq(userID)); + try { + if (query.count() != onlineTaskList.size()) { + + // Load Database Tasks + query.async().queryList(new TransactionListener>() { + @Override + public void onResultReceived(List tasks) { + + ArrayList tasksToDelete = new ArrayList<>(); + + for (Task dbTask : tasks) { + if (!onlineTaskIdList.contains(dbTask.getId())) { + tasksToDelete.add(dbTask); + } + } + + for (Task delTask : tasksToDelete) { + // TaskTag + new Delete().from(TaskTag.class).where(Condition.column("task_id").eq(delTask.getId())).async().execute(); + + // ChecklistItem + new Delete().from(ChecklistItem.class).where(Condition.column("task_id").eq(delTask.getId())).async().execute(); + + // Days + new Delete().from(Days.class).where(Condition.column("task_id").eq(delTask.getId())).async().execute(); + + // TASK + delTask.async().delete(); + + EventBus.getDefault().post(new TaskRemovedEvent(delTask.getId())); + } + } + + @Override + public boolean onReady(BaseTransaction> baseTransaction) { + return false; + } + + @Override + public boolean hasResult(BaseTransaction> baseTransaction, List tasks) { + return tasks != null && tasks.size() > 0; + } + }); + } + } catch (SQLiteDoneException ignored) { + //Ignored + } + } + + @Override + public void removeOldChecklists(List onlineChecklistItems) { + final ArrayList onlineChecklistItemIdList = new ArrayList<>(); + + for (ChecklistItem item : onlineChecklistItems) { + onlineChecklistItemIdList.add(item.getId()); + } + + From query = new Select().from(ChecklistItem.class); + try { + if (query.count() != onlineChecklistItems.size()) { + + // Load Database Checklist items + query.async().queryList(new TransactionListener>() { + @Override + public void onResultReceived(List items) { + + ArrayList checkListItemsToDelete = new ArrayList<>(); + + for (ChecklistItem chItem : items) { + if (!onlineChecklistItemIdList.contains(chItem.getId())) { + checkListItemsToDelete.add(chItem); + } + } + + for (ChecklistItem chItem : checkListItemsToDelete) { + chItem.async().delete(); + } + } + + @Override + public boolean onReady(BaseTransaction> baseTransaction) { + return false; + } + + @Override + public boolean hasResult(BaseTransaction> baseTransaction, List items) { + return items != null && items.size() > 0; + } + }); + } + } catch (SQLiteDoneException ignored) { + //Ignored + } + } + + @Override + public void removeOldTaskTags(List onlineTaskTags) { + final ArrayList onlineTaskTagItemIdList = new ArrayList<>(); + + for (TaskTag item : onlineTaskTags) { + onlineTaskTagItemIdList.add(item.getId()); + } + + From query = new Select().from(TaskTag.class); + try { + if (query.count() != onlineTaskTags.size()) { + + // Load Database Checklist items + query.async().queryList(new TransactionListener>() { + @Override + public void onResultReceived(List items) { + + ArrayList checkListItemsToDelete = new ArrayList<>(); + + for (TaskTag ttag : items) { + if (!onlineTaskTagItemIdList.contains(ttag.getId())) { + checkListItemsToDelete.add(ttag); + } + } + + for (TaskTag ttag : checkListItemsToDelete) { + ttag.async().delete(); + } + } + + @Override + public boolean onReady(BaseTransaction> baseTransaction) { + return false; + } + + @Override + public boolean hasResult(BaseTransaction> baseTransaction, List items) { + return items != null && items.size() > 0; + } + }); + } + } catch (SQLiteDoneException ignored) { + //Ignored + } + } + + @Override + public void removeOldReminders(List onlineReminders) { + final ArrayList onlineReminderIds = new ArrayList<>(); + + for (RemindersItem item : onlineReminders) { + onlineReminderIds.add(item.getId()); + } + + From query = new Select().from(RemindersItem.class); + try { + if (query.count() != onlineReminders.size()) { + + // Load Database Checklist items + query.async().queryList(new TransactionListener>() { + @Override + public void onResultReceived(List items) { + + ArrayList remindersToDelete = new ArrayList<>(); + + for (RemindersItem reminder : items) { + if (!onlineReminderIds.contains(reminder.getId())) { + remindersToDelete.add(reminder); + } + } + + for (RemindersItem reminder : remindersToDelete) { + reminder.async().delete(); + } + } + + @Override + public boolean onReady(BaseTransaction> baseTransaction) { + return false; + } + + @Override + public boolean hasResult(BaseTransaction> baseTransaction, List items) { + return items != null && items.size() > 0; + } + }); + } + } catch (SQLiteDoneException ignored) { + //Ignored + } + } + + @Override + public void deleteTask(String taskID) { + getTask(taskID).subscribe(Task::delete, throwable -> {}); + } + private List sortTasks(TaskList taskList, List taskOrder) { List taskResult = new ArrayList<>(); int position = 0; - for (String taskId : taskOrder) { Task task = taskList.tasks.get(taskId); if (task != null) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/DbFlowUserLocalRepository.java b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/DbFlowUserLocalRepository.java index 4e23bd3c6..41fe5b8ff 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/DbFlowUserLocalRepository.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/DbFlowUserLocalRepository.java @@ -18,4 +18,9 @@ public class DbFlowUserLocalRepository implements UserLocalRepository { return Observable.defer(() -> Observable.just(new Select() .from(HabitRPGUser.class).where(Condition.column("id").eq(userID)).querySingle())); } + + @Override + public void saveUser(HabitRPGUser user) { + user.async().save(); + } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.java index b75ecdc03..ae82b62d0 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.java @@ -8,7 +8,6 @@ import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.content.res.Configuration; -import android.database.sqlite.SQLiteDoneException; import android.databinding.DataBindingUtil; import android.graphics.Bitmap; import android.graphics.Canvas; @@ -23,7 +22,6 @@ import android.support.v4.app.FragmentTransaction; import android.support.v4.content.ContextCompat; import android.support.v4.content.FileProvider; import android.support.v4.view.GravityCompat; -import android.support.v4.widget.DrawerLayout; import android.support.v7.app.AlertDialog; import android.support.v7.widget.Toolbar; import android.util.Log; @@ -41,12 +39,12 @@ import com.habitrpg.android.habitica.HostConfig; import com.habitrpg.android.habitica.R; import com.habitrpg.android.habitica.callbacks.HabitRPGUserCallback; import com.habitrpg.android.habitica.callbacks.ItemsCallback; -import com.habitrpg.android.habitica.callbacks.MergeUserCallback; -import com.habitrpg.android.habitica.callbacks.TaskCreationCallback; import com.habitrpg.android.habitica.callbacks.TaskScoringCallback; import com.habitrpg.android.habitica.callbacks.TaskUpdateCallback; import com.habitrpg.android.habitica.callbacks.UnlockCallback; import com.habitrpg.android.habitica.components.AppComponent; +import com.habitrpg.android.habitica.data.ApiClient; +import com.habitrpg.android.habitica.data.TagRepository; import com.habitrpg.android.habitica.data.TaskRepository; import com.habitrpg.android.habitica.data.UserRepository; import com.habitrpg.android.habitica.databinding.ValueBarBinding; @@ -103,14 +101,12 @@ import com.habitrpg.android.habitica.widget.AvatarStatsWidgetProvider; import com.habitrpg.android.habitica.widget.DailiesWidgetProvider; import com.habitrpg.android.habitica.widget.HabitButtonWidgetProvider; import com.habitrpg.android.habitica.widget.TodoListWidgetProvider; -import com.habitrpg.android.habitica.data.ApiClient; import com.magicmicky.habitrpgwrapper.lib.api.MaintenanceApiService; import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser; import com.magicmicky.habitrpgwrapper.lib.models.Preferences; import com.magicmicky.habitrpgwrapper.lib.models.Shop; import com.magicmicky.habitrpgwrapper.lib.models.SpecialItems; import com.magicmicky.habitrpgwrapper.lib.models.Stats; -import com.magicmicky.habitrpgwrapper.lib.models.Tag; import com.magicmicky.habitrpgwrapper.lib.models.TaskDirectionData; import com.magicmicky.habitrpgwrapper.lib.models.TutorialStep; import com.magicmicky.habitrpgwrapper.lib.models.inventory.Egg; @@ -121,7 +117,6 @@ import com.magicmicky.habitrpgwrapper.lib.models.inventory.Pet; import com.magicmicky.habitrpgwrapper.lib.models.inventory.QuestContent; import com.magicmicky.habitrpgwrapper.lib.models.responses.MaintenanceResponse; import com.magicmicky.habitrpgwrapper.lib.models.tasks.ChecklistItem; -import com.magicmicky.habitrpgwrapper.lib.models.tasks.Days; import com.magicmicky.habitrpgwrapper.lib.models.tasks.ItemData; import com.magicmicky.habitrpgwrapper.lib.models.tasks.RemindersItem; import com.magicmicky.habitrpgwrapper.lib.models.tasks.Task; @@ -133,15 +128,9 @@ import com.mikepenz.materialdrawer.model.PrimaryDrawerItem; import com.mikepenz.materialdrawer.model.interfaces.IDrawerItem; import com.mikepenz.materialdrawer.model.interfaces.IProfile; import com.raizlabs.android.dbflow.runtime.TransactionManager; -import com.raizlabs.android.dbflow.runtime.transaction.BaseTransaction; -import com.raizlabs.android.dbflow.runtime.transaction.TransactionListener; import com.raizlabs.android.dbflow.runtime.transaction.process.ProcessModelInfo; import com.raizlabs.android.dbflow.runtime.transaction.process.SaveModelTransaction; -import com.raizlabs.android.dbflow.sql.builder.Condition; -import com.raizlabs.android.dbflow.sql.language.Delete; -import com.raizlabs.android.dbflow.sql.language.From; import com.raizlabs.android.dbflow.sql.language.Select; -import com.raizlabs.android.dbflow.sql.language.Where; import com.raizlabs.android.dbflow.structure.BaseModel; import com.roughike.bottombar.BottomBar; @@ -235,6 +224,8 @@ public class MainActivity extends BaseActivity implements Action1, Ha TaskRepository taskRepository; @Inject UserRepository userRepository; + @Inject + TagRepository tagRepository; // endregion @@ -471,7 +462,7 @@ public class MainActivity extends BaseActivity implements Action1, Ha allTasks.addAll(user.getHabits()); allTasks.addAll(user.getRewards()); - loadAndRemoveOldTasks(user.getId(), allTasks); + taskRepository.removeOldTasks(user.getId(), allTasks); ArrayList allChecklistItems = new ArrayList<>(); for (Task t : allTasks) { @@ -479,7 +470,7 @@ public class MainActivity extends BaseActivity implements Action1, Ha allChecklistItems.addAll(t.checklist); } } - loadAndRemoveOldChecklists(allChecklistItems); + taskRepository.removeOldChecklists(allChecklistItems); ArrayList allTaskTags = new ArrayList<>(); for (Task t : allTasks) { @@ -487,7 +478,7 @@ public class MainActivity extends BaseActivity implements Action1, Ha allTaskTags.addAll(t.getTags()); } } - loadAndRemoveOldTaskTags(allTaskTags); + taskRepository.removeOldTaskTags(allTaskTags); ArrayList allReminders = new ArrayList<>(); for (Task t : allTasks) { @@ -495,9 +486,9 @@ public class MainActivity extends BaseActivity implements Action1, Ha allReminders.addAll(t.getReminders()); } } - loadAndRemoveOldReminders(allReminders); + taskRepository.removeOldReminders(allReminders); - loadAndRemoveOldTags(user.getTags()); + tagRepository.removeOldTags(user.getTags()); updateOwnedDataForUser(user); } @@ -506,63 +497,6 @@ public class MainActivity extends BaseActivity implements Action1, Ha } } - private void loadAndRemoveOldTasks(String userId, final List onlineEntries) { - final ArrayList onlineTaskIdList = new ArrayList<>(); - - for (Task oTask : onlineEntries) { - onlineTaskIdList.add(oTask.getId()); - } - - Where query = new Select().from(Task.class).where(Condition.column("user_id").eq(userId)); - try { - if (query.count() != onlineEntries.size()) { - - // Load Database Tasks - query.async().queryList(new TransactionListener>() { - @Override - public void onResultReceived(List tasks) { - - ArrayList tasksToDelete = new ArrayList<>(); - - for (Task dbTask : tasks) { - if (!onlineTaskIdList.contains(dbTask.getId())) { - tasksToDelete.add(dbTask); - } - } - - for (Task delTask : tasksToDelete) { - // TaskTag - new Delete().from(TaskTag.class).where(Condition.column("task_id").eq(delTask.getId())).async().execute(); - - // ChecklistItem - new Delete().from(ChecklistItem.class).where(Condition.column("task_id").eq(delTask.getId())).async().execute(); - - // Days - new Delete().from(Days.class).where(Condition.column("task_id").eq(delTask.getId())).async().execute(); - - // TASK - delTask.async().delete(); - - EventBus.getDefault().post(new TaskRemovedEvent(delTask.getId())); - } - } - - @Override - public boolean onReady(BaseTransaction> baseTransaction) { - return false; - } - - @Override - public boolean hasResult(BaseTransaction> baseTransaction, List tasks) { - return tasks != null && tasks.size() > 0; - } - }); - } - } catch (SQLiteDoneException ignored) { - //Ignored - } - } - private void displayNewInboxMessagesBadge() { Integer numberOfUnreadPms = this.user.getInbox().getNewMessages(); IDrawerItem newInboxItem; @@ -587,191 +521,6 @@ public class MainActivity extends BaseActivity implements Action1, Ha this.drawer.updateItemAtPosition(newInboxItem, this.drawer.getPosition(MainDrawerBuilder.SIDEBAR_INBOX)); } - - private void loadAndRemoveOldChecklists(final List onlineEntries) { - final ArrayList onlineChecklistItemIdList = new ArrayList<>(); - - for (ChecklistItem item : onlineEntries) { - onlineChecklistItemIdList.add(item.getId()); - } - - From query = new Select().from(ChecklistItem.class); - try { - if (query.count() != onlineEntries.size()) { - - // Load Database Checklist items - query.async().queryList(new TransactionListener>() { - @Override - public void onResultReceived(List items) { - - ArrayList checkListItemsToDelete = new ArrayList<>(); - - for (ChecklistItem chItem : items) { - if (!onlineChecklistItemIdList.contains(chItem.getId())) { - checkListItemsToDelete.add(chItem); - } - } - - for (ChecklistItem chItem : checkListItemsToDelete) { - chItem.async().delete(); - } - } - - @Override - public boolean onReady(BaseTransaction> baseTransaction) { - return false; - } - - @Override - public boolean hasResult(BaseTransaction> baseTransaction, List items) { - return items != null && items.size() > 0; - } - }); - } - } catch (SQLiteDoneException ignored) { - //Ignored - } - - } - - private void loadAndRemoveOldTaskTags(final List onlineEntries) { - final ArrayList onlineTaskTagItemIdList = new ArrayList<>(); - - for (TaskTag item : onlineEntries) { - onlineTaskTagItemIdList.add(item.getId()); - } - - From query = new Select().from(TaskTag.class); - try { - if (query.count() != onlineEntries.size()) { - - // Load Database Checklist items - query.async().queryList(new TransactionListener>() { - @Override - public void onResultReceived(List items) { - - ArrayList checkListItemsToDelete = new ArrayList<>(); - - for (TaskTag ttag : items) { - if (!onlineTaskTagItemIdList.contains(ttag.getId())) { - checkListItemsToDelete.add(ttag); - } - } - - for (TaskTag ttag : checkListItemsToDelete) { - ttag.async().delete(); - } - } - - @Override - public boolean onReady(BaseTransaction> baseTransaction) { - return false; - } - - @Override - public boolean hasResult(BaseTransaction> baseTransaction, List items) { - return items != null && items.size() > 0; - } - }); - } - } catch (SQLiteDoneException ignored) { - //Ignored - } - - } - - private void loadAndRemoveOldReminders(final List onlineEntries) { - final ArrayList onlineTaskTagItemIdList = new ArrayList<>(); - - for (RemindersItem item : onlineEntries) { - onlineTaskTagItemIdList.add(item.getId()); - } - - From query = new Select().from(RemindersItem.class); - try { - if (query.count() != onlineEntries.size()) { - - // Load Database Checklist items - query.async().queryList(new TransactionListener>() { - @Override - public void onResultReceived(List items) { - - ArrayList remindersToDelete = new ArrayList<>(); - - for (RemindersItem reminder : items) { - if (!onlineTaskTagItemIdList.contains(reminder.getId())) { - remindersToDelete.add(reminder); - } - } - - for (RemindersItem reminder : remindersToDelete) { - reminder.async().delete(); - } - } - - @Override - public boolean onReady(BaseTransaction> baseTransaction) { - return false; - } - - @Override - public boolean hasResult(BaseTransaction> baseTransaction, List items) { - return items != null && items.size() > 0; - } - }); - } - } catch (SQLiteDoneException ignored) { - //Ignored - } - - } - - private void loadAndRemoveOldTags(final List onlineEntries) { - final ArrayList onlineTaskTagItemIdList = new ArrayList<>(); - - for (Tag item : onlineEntries) { - onlineTaskTagItemIdList.add(item.getId()); - } - - From query = new Select().from(Tag.class); - try { - if (query.count() != onlineEntries.size()) { - - // Load Database Checklist items - query.async().queryList(new TransactionListener>() { - @Override - public void onResultReceived(List items) { - - ArrayList tagsToDelete = new ArrayList<>(); - - for (Tag tag : items) { - if (!onlineTaskTagItemIdList.contains(tag.getId())) { - tagsToDelete.add(tag); - } - } - - for (Tag tag : tagsToDelete) { - tag.async().delete(); - } - } - - @Override - public boolean onReady(BaseTransaction> baseTransaction) { - return false; - } - - @Override - public boolean hasResult(BaseTransaction> transaction, List result) { - return result != null && result.size() > 0; - } - }); - } - } catch (SQLiteDoneException ignored) { - //Ignored - } - - } - private void updateOwnedDataForUser(HabitRPGUser user) { if (user == null || user.getItems() == null) { return; @@ -1001,7 +750,6 @@ public class MainActivity extends BaseActivity implements Action1, Ha observable = apiClient.purchaseItem(event.item.purchaseType, event.item.key); } observable - .doOnNext(aVoid -> showSnackbar(this, floatingMenuWrapper, getString(R.string.successful_purchase, event.item.text), SnackbarDisplayType.NORMAL)) .subscribe(buyResponse -> userRepository.retrieveUser(false) .subscribe(new HabitRPGUserCallback(this), throwable -> { @@ -1316,7 +1064,7 @@ public class MainActivity extends BaseActivity implements Action1, Ha protected void retrieveUser() { if (this.userRepository != null) { this.userRepository.retrieveUser(true) - .subscribe(new HabitRPGUserCallback(this), throwable -> { + .subscribe(this::onUserReceived, throwable -> { }); } } @@ -1436,12 +1184,9 @@ public class MainActivity extends BaseActivity implements Action1, Ha public void onEvent(final TaskSaveEvent event) { Task task = event.task; if (event.created) { - this.taskRepository.createTask(task).subscribe(new TaskCreationCallback(), throwable -> { - }); + this.taskRepository.createTask(task).subscribe(task1 -> {}, throwable -> {}); } else { - this.taskRepository.updateTask(task) - .subscribe(new TaskUpdateCallback(), throwable -> { - }); + this.taskRepository.updateTask(task).subscribe(task1 -> {}, throwable -> {}); } } @@ -1486,18 +1231,6 @@ public class MainActivity extends BaseActivity implements Action1, Ha } - public void unlockDrawer(int gravity) { - if (this.drawer != null) { - this.drawer.getDrawerLayout().setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED, gravity); - } - } - - public void lockDrawer(int gravity) { - if (this.drawer != null) { - this.drawer.getDrawerLayout().setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, gravity); - } - } - @Subscribe public void onEvent(OpenFullProfileCommand cmd) { if (cmd.MemberId.equals("system")) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TasksFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TasksFragment.java index c8ef0b2a9..07e772fbd 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TasksFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TasksFragment.java @@ -100,10 +100,6 @@ public class TasksFragment extends BaseMainFragment { reward_fab.setOnClickListener(v1 -> openNewTaskActivity(Task.TYPE_REWARD)); floatingMenu.setOnMenuButtonLongClickListener(this::onFloatingMenuLongClicked); - if (this.activity != null) { - this.activity.unlockDrawer(GravityCompat.END); - } - loadTaskLists(); if (bottomNavigation != null) {