mirror of
https://github.com/sudoxnym/habitica-android.git
synced 2026-07-13 17:51:57 +00:00
Improve inbox loading
This commit is contained in:
parent
c9e376466d
commit
2dd1550518
15 changed files with 65 additions and 25 deletions
|
|
@ -2,7 +2,7 @@
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
package="com.habitrpg.android.habitica"
|
package="com.habitrpg.android.habitica"
|
||||||
android:versionCode="1929"
|
android:versionCode="1930"
|
||||||
android:versionName="1.2"
|
android:versionName="1.2"
|
||||||
android:screenOrientation="portrait"
|
android:screenOrientation="portrait"
|
||||||
android:installLocation="auto" >
|
android:installLocation="auto" >
|
||||||
|
|
|
||||||
|
|
@ -179,7 +179,7 @@ public interface ApiService {
|
||||||
Observable<HabitResponse<User>> disableClasses();
|
Observable<HabitResponse<User>> disableClasses();
|
||||||
|
|
||||||
@POST("user/mark-pms-read")
|
@POST("user/mark-pms-read")
|
||||||
Observable<HabitResponse<List<Void>>> markPrivateMessagesRead();
|
Observable<Void> markPrivateMessagesRead();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -127,7 +127,7 @@ public interface ApiClient {
|
||||||
|
|
||||||
Observable<User> disableClasses();
|
Observable<User> disableClasses();
|
||||||
|
|
||||||
Observable<List<Void>> markPrivateMessagesRead();
|
Observable<Void> markPrivateMessagesRead();
|
||||||
|
|
||||||
/* Group API */
|
/* Group API */
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -57,7 +57,7 @@ public interface SocialRepository extends BaseRepository {
|
||||||
|
|
||||||
Observable<Member> getMember(String userId);
|
Observable<Member> getMember(String userId);
|
||||||
|
|
||||||
Observable<List<Void>> markPrivateMessagesRead(User user);
|
Observable<Void> markPrivateMessagesRead(User user);
|
||||||
|
|
||||||
Observable<RealmResults<Group>> getUserGroups();
|
Observable<RealmResults<Group>> getUserGroups();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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.inventory.CustomizationSet;
|
||||||
import com.habitrpg.android.habitica.models.responses.SkillResponse;
|
import com.habitrpg.android.habitica.models.responses.SkillResponse;
|
||||||
import com.habitrpg.android.habitica.models.responses.UnlockResponse;
|
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.tasks.Task;
|
||||||
import com.habitrpg.android.habitica.models.user.User;
|
import com.habitrpg.android.habitica.models.user.User;
|
||||||
|
|
||||||
|
|
@ -26,6 +27,9 @@ public interface UserRepository extends BaseRepository {
|
||||||
Observable<User> retrieveUser(Boolean withTasks);
|
Observable<User> retrieveUser(Boolean withTasks);
|
||||||
Observable<User> retrieveUser(Boolean withTasks, Boolean forced);
|
Observable<User> retrieveUser(Boolean withTasks, Boolean forced);
|
||||||
|
|
||||||
|
Observable<RealmResults<ChatMessage>> getInboxMessages(String replyToUserID);
|
||||||
|
Observable<RealmResults<ChatMessage>> getInboxOverviewList();
|
||||||
|
|
||||||
Observable<User> revive(User user);
|
Observable<User> revive(User user);
|
||||||
|
|
||||||
void resetTutorial(@Nullable User user);
|
void resetTutorial(@Nullable User user);
|
||||||
|
|
|
||||||
|
|
@ -636,8 +636,12 @@ public class ApiClientImpl implements Action1<Throwable>, ApiClient {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Observable<List<Void>> markPrivateMessagesRead() {
|
public Observable<Void> markPrivateMessagesRead() {
|
||||||
return apiService.markPrivateMessagesRead().compose(configureApiCallObserver());
|
//This is necessary, because the API call returns weird data.
|
||||||
|
return apiService.markPrivateMessagesRead()
|
||||||
|
.subscribeOn(Schedulers.io())
|
||||||
|
.observeOn(AndroidSchedulers.mainThread())
|
||||||
|
.doOnError(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
|
|
@ -210,7 +210,7 @@ public class SocialRepositoryImpl extends BaseRepositoryImpl<SocialLocalReposito
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Observable<List<Void>> markPrivateMessagesRead(User user) {
|
public Observable<Void> markPrivateMessagesRead(User user) {
|
||||||
return apiClient.markPrivateMessagesRead()
|
return apiClient.markPrivateMessagesRead()
|
||||||
.doOnNext(aVoid -> localRepository.executeTransaction(realm -> user.getInbox().setNewMessages(0)));
|
.doOnNext(aVoid -> localRepository.executeTransaction(realm -> user.getInbox().setNewMessages(0)));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,5 @@
|
||||||
package com.habitrpg.android.habitica.data.implementation;
|
package com.habitrpg.android.habitica.data.implementation;
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
|
|
||||||
import com.habitrpg.android.habitica.data.ApiClient;
|
import com.habitrpg.android.habitica.data.ApiClient;
|
||||||
import com.habitrpg.android.habitica.data.TaskRepository;
|
import com.habitrpg.android.habitica.data.TaskRepository;
|
||||||
import com.habitrpg.android.habitica.data.UserRepository;
|
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.SkillResponse;
|
||||||
import com.habitrpg.android.habitica.models.responses.TaskScoringResult;
|
import com.habitrpg.android.habitica.models.responses.TaskScoringResult;
|
||||||
import com.habitrpg.android.habitica.models.responses.UnlockResponse;
|
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.tasks.Task;
|
||||||
import com.habitrpg.android.habitica.models.user.User;
|
import com.habitrpg.android.habitica.models.user.User;
|
||||||
|
|
||||||
|
|
@ -38,7 +37,7 @@ public class UserRepositoryImpl extends BaseRepositoryImpl<UserLocalRepository>
|
||||||
|
|
||||||
private TaskRepository taskRepository;
|
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);
|
super(localRepository, apiClient);
|
||||||
this.taskRepository = taskRepository;
|
this.taskRepository = taskRepository;
|
||||||
this.userId = userId;
|
this.userId = userId;
|
||||||
|
|
@ -98,6 +97,16 @@ public class UserRepositoryImpl extends BaseRepositoryImpl<UserLocalRepository>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Observable<RealmResults<ChatMessage>> getInboxMessages(String replyToUserID) {
|
||||||
|
return localRepository.getInboxMessages(userId, replyToUserID);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Observable<RealmResults<ChatMessage>> getInboxOverviewList() {
|
||||||
|
return localRepository.getInboxOverviewList(userId);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Observable<User> revive(User user) {
|
public Observable<User> revive(User user) {
|
||||||
return apiClient.revive().map(newUser -> mergeUser(user, newUser));
|
return apiClient.revive().map(newUser -> mergeUser(user, newUser));
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@ package com.habitrpg.android.habitica.data.local;
|
||||||
|
|
||||||
import com.habitrpg.android.habitica.models.Skill;
|
import com.habitrpg.android.habitica.models.Skill;
|
||||||
import com.habitrpg.android.habitica.models.TutorialStep;
|
import com.habitrpg.android.habitica.models.TutorialStep;
|
||||||
|
import com.habitrpg.android.habitica.models.social.ChatMessage;
|
||||||
import com.habitrpg.android.habitica.models.user.User;
|
import com.habitrpg.android.habitica.models.user.User;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
@ -20,4 +21,8 @@ public interface UserLocalRepository extends BaseLocalRepository {
|
||||||
Observable<RealmResults<Skill>> getSkills(User user);
|
Observable<RealmResults<Skill>> getSkills(User user);
|
||||||
|
|
||||||
Observable<RealmResults<Skill>> getSpecialItems(User user);
|
Observable<RealmResults<Skill>> getSpecialItems(User user);
|
||||||
|
|
||||||
|
Observable<RealmResults<ChatMessage>> getInboxMessages(String userId, String replyToUserID);
|
||||||
|
|
||||||
|
Observable<RealmResults<ChatMessage>> getInboxOverviewList(String userId);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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.Skill;
|
||||||
import com.habitrpg.android.habitica.models.Tag;
|
import com.habitrpg.android.habitica.models.Tag;
|
||||||
import com.habitrpg.android.habitica.models.TutorialStep;
|
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.SpecialItems;
|
||||||
import com.habitrpg.android.habitica.models.user.User;
|
import com.habitrpg.android.habitica.models.user.User;
|
||||||
|
|
||||||
|
|
@ -12,8 +13,8 @@ import java.util.List;
|
||||||
|
|
||||||
import io.realm.OrderedRealmCollectionSnapshot;
|
import io.realm.OrderedRealmCollectionSnapshot;
|
||||||
import io.realm.Realm;
|
import io.realm.Realm;
|
||||||
import io.realm.RealmList;
|
|
||||||
import io.realm.RealmResults;
|
import io.realm.RealmResults;
|
||||||
|
import io.realm.Sort;
|
||||||
import rx.Observable;
|
import rx.Observable;
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -103,4 +104,24 @@ public class RealmUserLocalRepository extends RealmBaseLocalRepository implement
|
||||||
.asObservable()
|
.asObservable()
|
||||||
.filter(RealmResults::isLoaded);
|
.filter(RealmResults::isLoaded);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Observable<RealmResults<ChatMessage>> 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<RealmResults<ChatMessage>> getInboxOverviewList(String userId) {
|
||||||
|
return realm.where(ChatMessage.class)
|
||||||
|
.equalTo("isInboxMessage", true)
|
||||||
|
.distinct("uuid")
|
||||||
|
.sort("timestamp", Sort.DESCENDING)
|
||||||
|
.asObservable()
|
||||||
|
.filter(RealmResults::isLoaded);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -40,6 +40,8 @@ public class ChatMessage extends RealmObject {
|
||||||
|
|
||||||
public String groupId;
|
public String groupId;
|
||||||
|
|
||||||
|
public boolean isInboxMessage;
|
||||||
|
|
||||||
public int getContributorColor() {
|
public int getContributorColor() {
|
||||||
int rColor = android.R.color.black;
|
int rColor = android.R.color.black;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -101,8 +101,8 @@ public class RepositoryModule {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Provides
|
@Provides
|
||||||
UserRepository providesUserRepository(UserLocalRepository localRepository, ApiClient apiClient, Context context, @Named(AppModule.NAMED_USER_ID) String userId, TaskRepository taskRepository) {
|
UserRepository providesUserRepository(UserLocalRepository localRepository, ApiClient apiClient, @Named(AppModule.NAMED_USER_ID) String userId, TaskRepository taskRepository) {
|
||||||
return new UserRepositoryImpl(localRepository, apiClient, context, userId, taskRepository);
|
return new UserRepositoryImpl(localRepository, apiClient, userId, taskRepository);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Provides
|
@Provides
|
||||||
|
|
|
||||||
|
|
@ -74,14 +74,9 @@ public class InboxFragment extends BaseMainFragment
|
||||||
}
|
}
|
||||||
|
|
||||||
private void loadMessages() {
|
private void loadMessages() {
|
||||||
if (user != null && user.isManaged()) {
|
userRepository.getInboxOverviewList()
|
||||||
user.getInbox().getMessages().where()
|
|
||||||
.distinct("uuid")
|
|
||||||
.sort("timestamp", Sort.DESCENDING)
|
|
||||||
.asObservable()
|
|
||||||
.first()
|
.first()
|
||||||
.subscribe(this::setInboxMessages, RxErrorHandler.handleEmptyError());
|
.subscribe(this::setInboxMessages, RxErrorHandler.handleEmptyError());
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
|
|
@ -100,13 +100,9 @@ public class InboxMessageListFragment extends BaseMainFragment
|
||||||
|
|
||||||
private void loadMessages() {
|
private void loadMessages() {
|
||||||
if (user != null && user.isManaged()) {
|
if (user != null && user.isManaged()) {
|
||||||
compositeSubscription.add(user.getInbox().getMessages().where()
|
userRepository.getInboxMessages(replyToUserUUID)
|
||||||
.equalTo("uuid", replyToUserUUID)
|
|
||||||
.findAllSortedAsync("timestamp", Sort.DESCENDING)
|
|
||||||
.asObservable()
|
|
||||||
.filter(RealmResults::isLoaded)
|
|
||||||
.first()
|
.first()
|
||||||
.subscribe(chatMessages -> this.chatAdapter.updateData(chatMessages), RxErrorHandler.handleEmptyError()));
|
.subscribe(chatMessages -> this.chatAdapter.updateData(chatMessages), RxErrorHandler.handleEmptyError());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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.inventory.Quest;
|
||||||
import com.habitrpg.android.habitica.models.invitations.Invitations;
|
import com.habitrpg.android.habitica.models.invitations.Invitations;
|
||||||
import com.habitrpg.android.habitica.models.social.Challenge;
|
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.social.UserParty;
|
||||||
import com.habitrpg.android.habitica.models.tasks.TasksOrder;
|
import com.habitrpg.android.habitica.models.tasks.TasksOrder;
|
||||||
import com.habitrpg.android.habitica.models.user.Authentication;
|
import com.habitrpg.android.habitica.models.user.Authentication;
|
||||||
|
|
@ -50,6 +51,9 @@ public class UserDeserializer implements JsonDeserializer<User> {
|
||||||
}
|
}
|
||||||
if (obj.has("inbox")) {
|
if (obj.has("inbox")) {
|
||||||
user.setInbox(context.deserialize(obj.get("inbox"), Inbox.class));
|
user.setInbox(context.deserialize(obj.get("inbox"), Inbox.class));
|
||||||
|
for (ChatMessage message : user.getInbox().getMessages()) {
|
||||||
|
message.isInboxMessage = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (obj.has("preferences")) {
|
if (obj.has("preferences")) {
|
||||||
user.setPreferences(context.deserialize(obj.get("preferences"), Preferences.class));
|
user.setPreferences(context.deserialize(obj.get("preferences"), Preferences.class));
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue