Improve inbox loading

This commit is contained in:
Phillip Thelen 2017-09-15 12:59:15 +02:00
parent c9e376466d
commit 2dd1550518
15 changed files with 65 additions and 25 deletions

View file

@ -2,7 +2,7 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.habitrpg.android.habitica"
android:versionCode="1929"
android:versionCode="1930"
android:versionName="1.2"
android:screenOrientation="portrait"
android:installLocation="auto" >

View file

@ -179,7 +179,7 @@ public interface ApiService {
Observable<HabitResponse<User>> disableClasses();
@POST("user/mark-pms-read")
Observable<HabitResponse<List<Void>>> markPrivateMessagesRead();
Observable<Void> markPrivateMessagesRead();

View file

@ -127,7 +127,7 @@ public interface ApiClient {
Observable<User> disableClasses();
Observable<List<Void>> markPrivateMessagesRead();
Observable<Void> markPrivateMessagesRead();
/* Group API */

View file

@ -57,7 +57,7 @@ public interface SocialRepository extends BaseRepository {
Observable<Member> getMember(String userId);
Observable<List<Void>> markPrivateMessagesRead(User user);
Observable<Void> markPrivateMessagesRead(User user);
Observable<RealmResults<Group>> getUserGroups();

View file

@ -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<User> retrieveUser(Boolean withTasks);
Observable<User> retrieveUser(Boolean withTasks, Boolean forced);
Observable<RealmResults<ChatMessage>> getInboxMessages(String replyToUserID);
Observable<RealmResults<ChatMessage>> getInboxOverviewList();
Observable<User> revive(User user);
void resetTutorial(@Nullable User user);

View file

@ -636,8 +636,12 @@ public class ApiClientImpl implements Action1<Throwable>, ApiClient {
}
@Override
public Observable<List<Void>> markPrivateMessagesRead() {
return apiService.markPrivateMessagesRead().compose(configureApiCallObserver());
public Observable<Void> markPrivateMessagesRead() {
//This is necessary, because the API call returns weird data.
return apiService.markPrivateMessagesRead()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnError(this);
}
@Override

View file

@ -210,7 +210,7 @@ public class SocialRepositoryImpl extends BaseRepositoryImpl<SocialLocalReposito
}
@Override
public Observable<List<Void>> markPrivateMessagesRead(User user) {
public Observable<Void> markPrivateMessagesRead(User user) {
return apiClient.markPrivateMessagesRead()
.doOnNext(aVoid -> localRepository.executeTransaction(realm -> user.getInbox().setNewMessages(0)));
}

View file

@ -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<UserLocalRepository>
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<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
public Observable<User> revive(User user) {
return apiClient.revive().map(newUser -> mergeUser(user, newUser));

View file

@ -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<RealmResults<Skill>> getSkills(User user);
Observable<RealmResults<Skill>> getSpecialItems(User user);
Observable<RealmResults<ChatMessage>> getInboxMessages(String userId, String replyToUserID);
Observable<RealmResults<ChatMessage>> getInboxOverviewList(String userId);
}

View file

@ -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<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);
}
}

View file

@ -40,6 +40,8 @@ public class ChatMessage extends RealmObject {
public String groupId;
public boolean isInboxMessage;
public int getContributorColor() {
int rColor = android.R.color.black;

View file

@ -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

View file

@ -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

View file

@ -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());
}
}

View file

@ -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<User> {
}
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));