diff --git a/Habitica/AndroidManifest.xml b/Habitica/AndroidManifest.xml index d62013f06..6bdb90077 100644 --- a/Habitica/AndroidManifest.xml +++ b/Habitica/AndroidManifest.xml @@ -2,7 +2,7 @@ diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/api/ApiService.java b/Habitica/src/main/java/com/habitrpg/android/habitica/api/ApiService.java index 75ffa285c..4da6c2131 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/api/ApiService.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/api/ApiService.java @@ -179,7 +179,7 @@ public interface ApiService { Observable> disableClasses(); @POST("user/mark-pms-read") - Observable>> markPrivateMessagesRead(); + Observable markPrivateMessagesRead(); diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/ApiClient.java b/Habitica/src/main/java/com/habitrpg/android/habitica/data/ApiClient.java index a7c859538..af5a4d8b9 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/ApiClient.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/ApiClient.java @@ -127,7 +127,7 @@ public interface ApiClient { Observable disableClasses(); - Observable> markPrivateMessagesRead(); + Observable markPrivateMessagesRead(); /* Group API */ diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/SocialRepository.java b/Habitica/src/main/java/com/habitrpg/android/habitica/data/SocialRepository.java index b3c5eedcf..45498d9ec 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/SocialRepository.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/SocialRepository.java @@ -57,7 +57,7 @@ public interface SocialRepository extends BaseRepository { Observable getMember(String userId); - Observable> markPrivateMessagesRead(User user); + Observable markPrivateMessagesRead(User user); Observable> getUserGroups(); diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/UserRepository.java b/Habitica/src/main/java/com/habitrpg/android/habitica/data/UserRepository.java index 707b496d8..5f24dfcff 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/UserRepository.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/UserRepository.java @@ -7,6 +7,7 @@ import com.habitrpg.android.habitica.models.inventory.Customization; import com.habitrpg.android.habitica.models.inventory.CustomizationSet; import com.habitrpg.android.habitica.models.responses.SkillResponse; import com.habitrpg.android.habitica.models.responses.UnlockResponse; +import com.habitrpg.android.habitica.models.social.ChatMessage; import com.habitrpg.android.habitica.models.tasks.Task; import com.habitrpg.android.habitica.models.user.User; @@ -26,6 +27,9 @@ public interface UserRepository extends BaseRepository { Observable retrieveUser(Boolean withTasks); Observable retrieveUser(Boolean withTasks, Boolean forced); + Observable> getInboxMessages(String replyToUserID); + Observable> getInboxOverviewList(); + Observable revive(User user); void resetTutorial(@Nullable User user); diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.java b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.java index 176bd9651..274e67d61 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.java @@ -636,8 +636,12 @@ public class ApiClientImpl implements Action1, ApiClient { } @Override - public Observable> markPrivateMessagesRead() { - return apiService.markPrivateMessagesRead().compose(configureApiCallObserver()); + public Observable markPrivateMessagesRead() { + //This is necessary, because the API call returns weird data. + return apiService.markPrivateMessagesRead() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .doOnError(this); } @Override diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/SocialRepositoryImpl.java b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/SocialRepositoryImpl.java index 0334fee48..1a44b8afc 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/SocialRepositoryImpl.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/SocialRepositoryImpl.java @@ -210,7 +210,7 @@ public class SocialRepositoryImpl extends BaseRepositoryImpl> markPrivateMessagesRead(User user) { + public Observable markPrivateMessagesRead(User user) { return apiClient.markPrivateMessagesRead() .doOnNext(aVoid -> localRepository.executeTransaction(realm -> user.getInbox().setNewMessages(0))); } 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 651bee102..7866db35b 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 @@ -1,7 +1,5 @@ package com.habitrpg.android.habitica.data.implementation; -import android.content.Context; - import com.habitrpg.android.habitica.data.ApiClient; import com.habitrpg.android.habitica.data.TaskRepository; import com.habitrpg.android.habitica.data.UserRepository; @@ -14,6 +12,7 @@ import com.habitrpg.android.habitica.models.inventory.CustomizationSet; import com.habitrpg.android.habitica.models.responses.SkillResponse; import com.habitrpg.android.habitica.models.responses.TaskScoringResult; import com.habitrpg.android.habitica.models.responses.UnlockResponse; +import com.habitrpg.android.habitica.models.social.ChatMessage; import com.habitrpg.android.habitica.models.tasks.Task; import com.habitrpg.android.habitica.models.user.User; @@ -38,7 +37,7 @@ public class UserRepositoryImpl extends BaseRepositoryImpl private TaskRepository taskRepository; - public UserRepositoryImpl(UserLocalRepository localRepository, ApiClient apiClient, Context context, String userId, TaskRepository taskRepository) { + public UserRepositoryImpl(UserLocalRepository localRepository, ApiClient apiClient, String userId, TaskRepository taskRepository) { super(localRepository, apiClient); this.taskRepository = taskRepository; this.userId = userId; @@ -98,6 +97,16 @@ public class UserRepositoryImpl extends BaseRepositoryImpl } } + @Override + public Observable> getInboxMessages(String replyToUserID) { + return localRepository.getInboxMessages(userId, replyToUserID); + } + + @Override + public Observable> getInboxOverviewList() { + return localRepository.getInboxOverviewList(userId); + } + @Override public Observable revive(User user) { return apiClient.revive().map(newUser -> mergeUser(user, newUser)); 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 ba78224ee..0c5f9ceb7 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 @@ -2,6 +2,7 @@ package com.habitrpg.android.habitica.data.local; import com.habitrpg.android.habitica.models.Skill; import com.habitrpg.android.habitica.models.TutorialStep; +import com.habitrpg.android.habitica.models.social.ChatMessage; import com.habitrpg.android.habitica.models.user.User; import java.util.List; @@ -20,4 +21,8 @@ public interface UserLocalRepository extends BaseLocalRepository { Observable> getSkills(User user); Observable> getSpecialItems(User user); + + Observable> getInboxMessages(String userId, String replyToUserID); + + Observable> getInboxOverviewList(String userId); } 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 4b5cbe1da..ebb11b858 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 @@ -4,6 +4,7 @@ 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.social.ChatMessage; import com.habitrpg.android.habitica.models.user.SpecialItems; import com.habitrpg.android.habitica.models.user.User; @@ -12,8 +13,8 @@ import java.util.List; import io.realm.OrderedRealmCollectionSnapshot; import io.realm.Realm; -import io.realm.RealmList; import io.realm.RealmResults; +import io.realm.Sort; import rx.Observable; @@ -103,4 +104,24 @@ public class RealmUserLocalRepository extends RealmBaseLocalRepository implement .asObservable() .filter(RealmResults::isLoaded); } + + @Override + public Observable> getInboxMessages(String userId, String replyToUserID) { + return realm.where(ChatMessage.class) + .equalTo("isInboxMessage", true) + .equalTo("uuid", replyToUserID) + .findAllSorted("timestamp", Sort.DESCENDING) + .asObservable() + .filter(RealmResults::isLoaded); + } + + @Override + public Observable> getInboxOverviewList(String userId) { + return realm.where(ChatMessage.class) + .equalTo("isInboxMessage", true) + .distinct("uuid") + .sort("timestamp", Sort.DESCENDING) + .asObservable() + .filter(RealmResults::isLoaded); + } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/social/ChatMessage.java b/Habitica/src/main/java/com/habitrpg/android/habitica/models/social/ChatMessage.java index 88e9b5865..377de072e 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/social/ChatMessage.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/social/ChatMessage.java @@ -40,6 +40,8 @@ public class ChatMessage extends RealmObject { public String groupId; + public boolean isInboxMessage; + public int getContributorColor() { int rColor = android.R.color.black; diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/modules/RepositoryModule.java b/Habitica/src/main/java/com/habitrpg/android/habitica/modules/RepositoryModule.java index 357b846c2..5af9879a4 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/modules/RepositoryModule.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/modules/RepositoryModule.java @@ -101,8 +101,8 @@ public class RepositoryModule { } @Provides - UserRepository providesUserRepository(UserLocalRepository localRepository, ApiClient apiClient, Context context, @Named(AppModule.NAMED_USER_ID) String userId, TaskRepository taskRepository) { - return new UserRepositoryImpl(localRepository, apiClient, context, userId, taskRepository); + UserRepository providesUserRepository(UserLocalRepository localRepository, ApiClient apiClient, @Named(AppModule.NAMED_USER_ID) String userId, TaskRepository taskRepository) { + return new UserRepositoryImpl(localRepository, apiClient, userId, taskRepository); } @Provides diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxFragment.java index f4003b30b..bf9f8d726 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxFragment.java @@ -74,14 +74,9 @@ public class InboxFragment extends BaseMainFragment } private void loadMessages() { - if (user != null && user.isManaged()) { - user.getInbox().getMessages().where() - .distinct("uuid") - .sort("timestamp", Sort.DESCENDING) - .asObservable() + userRepository.getInboxOverviewList() .first() .subscribe(this::setInboxMessages, RxErrorHandler.handleEmptyError()); - } } @Override diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxMessageListFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxMessageListFragment.java index 9a3e29a80..a132fb5ec 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxMessageListFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxMessageListFragment.java @@ -100,13 +100,9 @@ public class InboxMessageListFragment extends BaseMainFragment private void loadMessages() { if (user != null && user.isManaged()) { - compositeSubscription.add(user.getInbox().getMessages().where() - .equalTo("uuid", replyToUserUUID) - .findAllSortedAsync("timestamp", Sort.DESCENDING) - .asObservable() - .filter(RealmResults::isLoaded) + userRepository.getInboxMessages(replyToUserUUID) .first() - .subscribe(chatMessages -> this.chatAdapter.updateData(chatMessages), RxErrorHandler.handleEmptyError())); + .subscribe(chatMessages -> this.chatAdapter.updateData(chatMessages), RxErrorHandler.handleEmptyError()); } } 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 5c1863bf9..d336b5553 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 @@ -11,6 +11,7 @@ import com.habitrpg.android.habitica.models.Tag; import com.habitrpg.android.habitica.models.inventory.Quest; import com.habitrpg.android.habitica.models.invitations.Invitations; import com.habitrpg.android.habitica.models.social.Challenge; +import com.habitrpg.android.habitica.models.social.ChatMessage; import com.habitrpg.android.habitica.models.social.UserParty; import com.habitrpg.android.habitica.models.tasks.TasksOrder; import com.habitrpg.android.habitica.models.user.Authentication; @@ -50,6 +51,9 @@ public class UserDeserializer implements JsonDeserializer { } if (obj.has("inbox")) { user.setInbox(context.deserialize(obj.get("inbox"), Inbox.class)); + for (ChatMessage message : user.getInbox().getMessages()) { + message.isInboxMessage = true; + } } if (obj.has("preferences")) { user.setPreferences(context.deserialize(obj.get("preferences"), Preferences.class));