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 ccceba103..1e708524a 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 @@ -35,7 +35,7 @@ public interface SocialRepository extends BaseRepository { Observable joinGroup(String id); - Observable updateGroup(Group group); + Observable updateGroup(Group group, String name, String description, String leader, String privacy); Observable> retrieveGroups(String type); Observable> getGroups(String type); @@ -54,4 +54,6 @@ public interface SocialRepository extends BaseRepository { Observable getMember(String userId); Observable markPrivateMessagesRead(User user); + + Observable> getUserGroups(); } 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 c2ea8c07a..ed873927b 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 @@ -97,14 +97,27 @@ public class SocialRepositoryImpl extends BaseRepositoryImpl updateGroup(Group group) { + public Observable updateGroup(Group group, String name, String description, String leader, String privacy) { + Group copiedGroup = localRepository.getUnmanagedCopy(group); + copiedGroup.name = name; + copiedGroup.description = description; + copiedGroup.leaderID = leader; + copiedGroup.privacy = privacy; + localRepository.saveGroup(copiedGroup); return apiClient.updateGroup(group.id, group); } @Override public Observable> retrieveGroups(String type) { return apiClient.listGroups(type) - .doOnNext(localRepository::saveGroups); + .doOnNext(groups -> { + if ("guilds".equals(type)) { + for (Group guild : groups) { + guild.isMember = true; + } + } + localRepository.saveGroups(groups); + }); } @Override @@ -155,4 +168,9 @@ public class SocialRepositoryImpl extends BaseRepositoryImpl localRepository.executeTransaction(realm -> user.getInbox().setNewMessages(0))); } + + @Override + public Observable> getUserGroups() { + return localRepository.getUserGroups(); + } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/SocialLocalRepository.java b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/SocialLocalRepository.java index e61e7f435..b658d9ffe 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/SocialLocalRepository.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/SocialLocalRepository.java @@ -18,4 +18,6 @@ public interface SocialLocalRepository extends BaseLocalRepository { void saveGroup(Group group); void saveGroups(List groups); + + Observable> getUserGroups(); } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmSocialLocalRepository.java b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmSocialLocalRepository.java index 4a15bd3b3..38f5642e1 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmSocialLocalRepository.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmSocialLocalRepository.java @@ -49,11 +49,25 @@ public class RealmSocialLocalRepository extends RealmBaseLocalRepository impleme @Override public void saveGroup(Group group) { - realm.executeTransactionAsync(realm1 -> realm1.insertOrUpdate(group)); + Group existingGroup = realm.where(Group.class).equalTo("id", group.id).findFirst(); + boolean isMember = existingGroup.isValid()&& existingGroup.isMember; + realm.executeTransactionAsync(realm1 -> { + group.isMember = isMember; + realm1.insertOrUpdate(group); + }); } @Override public void saveGroups(List groups) { realm.executeTransactionAsync(realm1 -> realm1.insertOrUpdate(groups)); } + + @Override + public Observable> getUserGroups() { + return realm.where(Group.class) + .equalTo("type", "guild") + .equalTo("isMember", true) + .findAllSorted("memberCount", Sort.DESCENDING) + .asObservable() + .filter(RealmResults::isLoaded); } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/GuildFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/GuildFragment.java index ab4f79579..4a33bdb3f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/GuildFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/GuildFragment.java @@ -219,31 +219,13 @@ public class GuildFragment extends BaseMainFragment implements Action1 { switch (requestCode) { case (GroupFormActivity.GROUP_FORM_ACTIVITY): { if (resultCode == Activity.RESULT_OK) { - boolean needsSaving = false; Bundle bundle = data.getExtras(); - if (this.guild.name != null && !this.guild.name.equals(bundle.getString("name"))) { - this.guild.name = bundle.getString("name"); - needsSaving = true; - } - if (this.guild.description != null && !this.guild.description.equals(bundle.getString("description"))) { - this.guild.description = bundle.getString("description"); - needsSaving = true; - } - if (this.guild.leaderID != null && !this.guild.leaderID.equals(bundle.getString("leader"))) { - this.guild.leaderID = bundle.getString("leader"); - needsSaving = true; - } - if (this.guild.privacy != null && !this.guild.privacy.equals(bundle.getString("privacy"))) { - this.guild.privacy = bundle.getString("privacy"); - needsSaving = true; - } - if (needsSaving) { - this.socialRepository.updateGroup(this.guild) - .subscribe(aVoid -> { - }, throwable -> { - }); - this.guildInformationFragment.setGroup(guild); - } + this.socialRepository.updateGroup(this.guild, + bundle.getString("name"), + bundle.getString("description"), + bundle.getString("leader"), + bundle.getString("privacy")) + .subscribe(aVoid -> {}, throwable -> {}); } break; } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/GuildsOverviewFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/GuildsOverviewFragment.java index 8e8706afd..2860270ab 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/GuildsOverviewFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/GuildsOverviewFragment.java @@ -14,6 +14,7 @@ import com.habitrpg.android.habitica.R; import com.habitrpg.android.habitica.components.AppComponent; import com.habitrpg.android.habitica.data.ChallengeRepository; import com.habitrpg.android.habitica.data.SocialRepository; +import com.habitrpg.android.habitica.helpers.RxErrorHandler; import com.habitrpg.android.habitica.models.social.Group; import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment; @@ -24,6 +25,7 @@ import javax.inject.Inject; import butterknife.BindView; import butterknife.ButterKnife; +import io.realm.RealmResults; public class GuildsOverviewFragment extends BaseMainFragment implements View.OnClickListener, SwipeRefreshLayout.OnRefreshListener { @@ -56,9 +58,7 @@ public class GuildsOverviewFragment extends BaseMainFragment implements View.OnC unbinder = ButterKnife.bind(this, v); swipeRefreshLayout.setOnRefreshListener(this); this.publicGuildsButton.setOnClickListener(this); - if (this.guilds != null) { - this.setGuildsOnListView(); - } + compositeSubscription.add(socialRepository.getUserGroups().subscribe(this::setGuilds, RxErrorHandler.handleEmptyError())); return v; } @@ -77,7 +77,6 @@ public class GuildsOverviewFragment extends BaseMainFragment implements View.OnC @Override public void onRefresh() { swipeRefreshLayout.setRefreshing(true); - fetchGuilds(); } @@ -85,8 +84,6 @@ public class GuildsOverviewFragment extends BaseMainFragment implements View.OnC if (this.socialRepository != null) { this.socialRepository.retrieveGroups("guilds") .subscribe(groups -> { - GuildsOverviewFragment.this.guilds = groups; - GuildsOverviewFragment.this.setGuildsOnListView(); if (swipeRefreshLayout != null) { swipeRefreshLayout.setRefreshing(false); } @@ -94,7 +91,8 @@ public class GuildsOverviewFragment extends BaseMainFragment implements View.OnC } } - private void setGuildsOnListView() { + private void setGuilds(RealmResults guilds) { + this.guilds = guilds; if (this.guildsListView == null) { return; } 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 de3148b83..605c21327 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 @@ -220,7 +220,7 @@ public class PartyFragment extends BaseMainFragment { needsSaving = true; } if (needsSaving) { - this.socialRepository.updateGroup(this.group) + this.socialRepository.updateGroup(this.group, bundle.getString("name"), bundle.getString("description"), bundle.getString("leader"), bundle.getString("privacy")) .subscribe(aVoid -> { }, throwable -> { });