diff --git a/Habitica/res/drawable/layout_rounded_bg_gray_700.xml b/Habitica/res/drawable/layout_rounded_bg_gray_700.xml
new file mode 100644
index 000000000..a5b041924
--- /dev/null
+++ b/Habitica/res/drawable/layout_rounded_bg_gray_700.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Habitica/res/drawable/layout_rounded_bg_green.xml b/Habitica/res/drawable/layout_rounded_bg_green.xml
new file mode 100644
index 000000000..73102304d
--- /dev/null
+++ b/Habitica/res/drawable/layout_rounded_bg_green.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Habitica/res/drawable/layout_rounded_bg_red.xml b/Habitica/res/drawable/layout_rounded_bg_red.xml
new file mode 100644
index 000000000..b7761c5eb
--- /dev/null
+++ b/Habitica/res/drawable/layout_rounded_bg_red.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Habitica/res/drawable/layout_rounded_bg_yellow.xml b/Habitica/res/drawable/layout_rounded_bg_yellow.xml
new file mode 100644
index 000000000..4273d506d
--- /dev/null
+++ b/Habitica/res/drawable/layout_rounded_bg_yellow.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Habitica/res/drawable/vertical_divider.xml b/Habitica/res/drawable/vertical_divider.xml
new file mode 100644
index 000000000..bbf847fc5
--- /dev/null
+++ b/Habitica/res/drawable/vertical_divider.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Habitica/res/layout/fragment_chat.xml b/Habitica/res/layout/fragment_chat.xml
index 58daeb982..6182dfe28 100644
--- a/Habitica/res/layout/fragment_chat.xml
+++ b/Habitica/res/layout/fragment_chat.xml
@@ -1,4 +1,3 @@
-
-
-
-
-
-
-
-
-
diff --git a/Habitica/res/layout/fragment_party_detail.xml b/Habitica/res/layout/fragment_party_detail.xml
new file mode 100644
index 000000000..eacc04547
--- /dev/null
+++ b/Habitica/res/layout/fragment_party_detail.xml
@@ -0,0 +1,213 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Habitica/res/layout/fragment_quest_collect.xml b/Habitica/res/layout/fragment_quest_collect.xml
deleted file mode 100644
index bca77d4b8..000000000
--- a/Habitica/res/layout/fragment_quest_collect.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-
-
-
-
-
-
-
-
-
-
diff --git a/Habitica/res/layout/quest_collect.xml b/Habitica/res/layout/quest_collect.xml
new file mode 100644
index 000000000..6604d6b65
--- /dev/null
+++ b/Habitica/res/layout/quest_collect.xml
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/Habitica/res/layout/quest_progress.xml b/Habitica/res/layout/quest_progress.xml
new file mode 100644
index 000000000..127369879
--- /dev/null
+++ b/Habitica/res/layout/quest_progress.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Habitica/res/layout/tavern_chat_new_entry_item.xml b/Habitica/res/layout/tavern_chat_new_entry_item.xml
index 8eef21c97..7cc66e086 100644
--- a/Habitica/res/layout/tavern_chat_new_entry_item.xml
+++ b/Habitica/res/layout/tavern_chat_new_entry_item.xml
@@ -49,6 +49,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/read_community_guidelines"
- style="@style/Caption3" />
+ style="@style/Caption3"
+ android:textColor="@color/brand_300" />
\ No newline at end of file
diff --git a/Habitica/res/layout/value_bar.xml b/Habitica/res/layout/value_bar.xml
index 202519eaa..86c256700 100644
--- a/Habitica/res/layout/value_bar.xml
+++ b/Habitica/res/layout/value_bar.xml
@@ -15,7 +15,8 @@
android:layout_alignTop="@+id/bar_full"
android:layout_alignBottom="@id/bar_full"
android:scaleType="center"
- android:contentDescription="Bar Icon" />
+ android:contentDescription="Bar Icon"
+ android:visibility="gone"/>
#46A7D9
#2995cd
+
+ #34313a
+ #4e4a57
+ #686274
+ #878190
+ #a5a1ac
+ #c3c0c7
+ #e1e0e3
+ #edecee
+ #f9f9f9
+
#D9D9D9
#989898
@@ -63,14 +74,14 @@
#727272
- #dddddd
+ @color/gray_500
#66000000
- #ff8d8d8d
- #ff707070
- #ffb5b5b5
- #ff707070
- #ffe5e5e5
- #ffdedede
+ @color/gray_200
+ @color/gray_100
+ @color/gray_300
+ @color/gray_100
+ @color/gray_600
+ @color/gray_500
#000000
@@ -79,17 +90,15 @@
#ffb5b5b5
#FF000000
- #ff33b5e5
- #aaa
- #555555
- #ffffff
+ @color/gray_300
+ #ffffff
- #ffd8dcdd
+ @color/gray_500
- #c3c2c6
- #ededed
- #b7b7b7
+ @color/gray_400
+ @color/gray_600
+ @color/gray_400
#50ffffff
#c8ffffff
#23000000
diff --git a/Habitica/res/values/dimens.xml b/Habitica/res/values/dimens.xml
index a0b003656..d72b744ff 100644
--- a/Habitica/res/values/dimens.xml
+++ b/Habitica/res/values/dimens.xml
@@ -38,7 +38,7 @@
50dp
128dp
- 128dp
+ 200dp
20dp
@@ -105,4 +105,6 @@
126dp
40dp
56dp
+ 16dp
+ 6dp
diff --git a/Habitica/res/values/strings.xml b/Habitica/res/values/strings.xml
index 39fa017d8..5f5dd7d53 100644
--- a/Habitica/res/values/strings.xml
+++ b/Habitica/res/values/strings.xml
@@ -604,4 +604,10 @@
Ownership
Inn
System
+ Start a new Quest
+ Leave Party
+ Party Description
+ Are you sure you want to abort this mission? It will abort it for everyone in your party and all progress will be lost. The quest scroll will be returned to the quest owner.
+ Are you sure you want to leave the active quest? All your quest progress will be lost.
+ %1$d Participants
diff --git a/Habitica/res/values/styles.xml b/Habitica/res/values/styles.xml
index 95fcece14..d9716ca14 100644
--- a/Habitica/res/values/styles.xml
+++ b/Habitica/res/values/styles.xml
@@ -357,4 +357,39 @@
- @color/black_20_alpha
- @dimen/spacing_large
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/components/AppComponent.java b/Habitica/src/main/java/com/habitrpg/android/habitica/components/AppComponent.java
index 46282f9a1..607d39813 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/components/AppComponent.java
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/components/AppComponent.java
@@ -76,6 +76,7 @@ import com.habitrpg.android.habitica.ui.fragments.social.challenges.ChallengeDet
import com.habitrpg.android.habitica.ui.fragments.social.challenges.ChallengeListFragment;
import com.habitrpg.android.habitica.ui.fragments.social.challenges.ChallengeTasksRecyclerViewFragment;
import com.habitrpg.android.habitica.ui.fragments.social.challenges.ChallengesOverviewFragment;
+import com.habitrpg.android.habitica.ui.fragments.social.party.PartyDetailFragment;
import com.habitrpg.android.habitica.ui.fragments.social.party.PartyFragment;
import com.habitrpg.android.habitica.ui.fragments.social.party.PartyInviteFragment;
import com.habitrpg.android.habitica.ui.fragments.social.party.PartyMemberListFragment;
@@ -268,4 +269,6 @@ public interface AppComponent {
void inject(ChallengeDetailDialogHolder challengeDetailDialogHolder);
void inject(TavernDetailFragment tavernDetailFragment);
+
+ void inject(PartyDetailFragment partyDetailFragment);
}
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 41e69792a..7f2bb6c41 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
@@ -1,5 +1,6 @@
package com.habitrpg.android.habitica.data;
+import com.habitrpg.android.habitica.models.inventory.Quest;
import com.habitrpg.android.habitica.models.responses.PostChatMessageResult;
import com.habitrpg.android.habitica.models.social.Challenge;
import com.habitrpg.android.habitica.models.social.ChatMessage;
@@ -57,4 +58,17 @@ public interface SocialRepository extends BaseRepository {
Observable markPrivateMessagesRead(User user);
Observable> getUserGroups();
+
+ Observable acceptQuest(User user, String partyId);
+ Observable rejectQuest(User user, String partyId);
+
+ Observable leaveQuest(String partyId);
+
+ Observable cancelQuest(String partyId);
+
+ Observable abortQuest(String partyId);
+
+ Observable rejectGroupInvite(String groupId);
+
+ Observable forceStartQuest(Group party);
}
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 2da048df1..cf25e580a 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
@@ -4,6 +4,7 @@ import com.habitrpg.android.habitica.data.ApiClient;
import com.habitrpg.android.habitica.data.SocialRepository;
import com.habitrpg.android.habitica.data.local.SocialLocalRepository;
import com.habitrpg.android.habitica.helpers.RxErrorHandler;
+import com.habitrpg.android.habitica.models.inventory.Quest;
import com.habitrpg.android.habitica.models.responses.PostChatMessageResult;
import com.habitrpg.android.habitica.models.social.Challenge;
import com.habitrpg.android.habitica.models.social.ChatMessage;
@@ -195,4 +196,41 @@ public class SocialRepositoryImpl extends BaseRepositoryImpl> getUserGroups() {
return localRepository.getUserGroups();
}
+
+ @Override
+ public Observable acceptQuest(User user, String partyId) {
+ return apiClient.acceptQuest(partyId)
+ .doOnNext(aVoid -> localRepository.updateRSVPNeeded(user, false));
+ }
+
+ @Override
+ public Observable rejectQuest(User user, String partyId) {
+ return apiClient.rejectQuest(partyId)
+ .doOnNext(aVoid -> localRepository.updateRSVPNeeded(user, false));
+ }
+
+ @Override
+ public Observable leaveQuest(String partyId) {
+ return apiClient.leaveQuest(partyId);
+ }
+
+ @Override
+ public Observable cancelQuest(String partyId) {
+ return apiClient.cancelQuest(partyId);
+ }
+
+ @Override
+ public Observable abortQuest(String partyId) {
+ return apiClient.abortQuest(partyId);
+ }
+
+ @Override
+ public Observable rejectGroupInvite(String groupId) {
+ return apiClient.rejectQuest(groupId);
+ }
+
+ @Override
+ public Observable forceStartQuest(Group party) {
+ return apiClient.forceStartQuest(party.id, party);
+ }
}
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 778883d74..000b54605 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
@@ -24,4 +24,6 @@ public interface SocialLocalRepository extends BaseLocalRepository {
void deleteMessage(String id);
Observable> getGroupMembers(String partyId);
+
+ void updateRSVPNeeded(User user, boolean newValue);
}
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 4b7cd7d82..0caee1088 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
@@ -81,6 +81,13 @@ public class RealmSocialLocalRepository extends RealmBaseLocalRepository impleme
.filter(RealmResults::isLoaded);
}
+ @Override
+ public void updateRSVPNeeded(User user, boolean newValue) {
+ if (user != null && user.getParty() != null && user.getParty().getQuest() != null) {
+ realm.executeTransaction(realm1 -> user.getParty().getQuest().RSVPNeeded = newValue);
+ }
+ }
+
private Observable getMessage(String id) {
return realm.where(ChatMessage.class).equalTo("id", id)
.findAllAsync()
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmTagLocalRepository.java b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmTagLocalRepository.java
index f0346f7df..0b9d14de4 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmTagLocalRepository.java
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmTagLocalRepository.java
@@ -17,7 +17,7 @@ public class RealmTagLocalRepository extends RealmBaseLocalRepository implements
@Override
public Observable> getTags(String userId) {
- return realm.where(Tag.class).equalTo("user.id", userId).findAll().asObservable();
+ return realm.where(Tag.class).equalTo("userId", userId).findAll().asObservable();
}
@Override
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/Quest.java b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/Quest.java
index 624d9332d..7c8377aaa 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/Quest.java
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/Quest.java
@@ -2,19 +2,20 @@ package com.habitrpg.android.habitica.models.inventory;
import java.util.HashMap;
+import io.realm.RealmList;
import io.realm.RealmObject;
import io.realm.annotations.Ignore;
import io.realm.annotations.PrimaryKey;
public class Quest extends RealmObject {
@PrimaryKey
+ public String id;
public String key;
public boolean active;
public String leader;
public boolean RSVPNeeded;
- @Ignore
- public HashMap members;
+ public RealmList members;
private QuestProgress progress;
private Quest(String key, QuestProgress progress) {
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/QuestMember.java b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/QuestMember.java
new file mode 100644
index 000000000..8b9a1fa9d
--- /dev/null
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/QuestMember.java
@@ -0,0 +1,12 @@
+package com.habitrpg.android.habitica.models.inventory;
+
+import io.realm.RealmObject;
+import io.realm.annotations.PrimaryKey;
+
+public class QuestMember extends RealmObject {
+
+ @PrimaryKey
+ public String key;
+
+ public Boolean isParticipating;
+}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/social/UserParty.java b/Habitica/src/main/java/com/habitrpg/android/habitica/models/social/UserParty.java
index 55617be00..b9a54ae9a 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/social/UserParty.java
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/social/UserParty.java
@@ -8,6 +8,7 @@ import io.realm.annotations.PrimaryKey;
public class UserParty extends RealmObject {
@PrimaryKey
+ private String userId;
@SerializedName("_id")
public String id; //id
private Quest quest;
@@ -57,4 +58,12 @@ public class UserParty extends RealmObject {
public void setQuest(Quest quest) {
this.quest = quest;
}
+
+ public String getUserId() {
+ return userId;
+ }
+
+ public void setUserId(String userId) {
+ this.userId = userId;
+ }
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/Flags.java b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/Flags.java
index 5e4ba0338..5910c6ec3 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/Flags.java
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/Flags.java
@@ -15,7 +15,17 @@ public class Flags extends RealmObject {
User user;
RealmList tutorial;
- private boolean showTour, dropsEnabled, itemsEnabled, newStuff, classSelected, rebirthEnabled, welcomed, armoireEnabled, armoireOpened, armoireEmpty;
+ private boolean showTour;
+ private boolean dropsEnabled;
+ private boolean itemsEnabled;
+ private boolean newStuff;
+ private boolean classSelected;
+ private boolean rebirthEnabled;
+ private boolean welcomed;
+ private boolean armoireEnabled;
+ private boolean armoireOpened;
+ private boolean armoireEmpty;
+ private boolean communityGuidelinesAccepted;
public List getTutorial() {
return tutorial;
@@ -112,4 +122,12 @@ public class Flags extends RealmObject {
public void setUserId(String userId) {
this.userId = userId;
}
+
+ public boolean isCommunityGuidelinesAccepted() {
+ return communityGuidelinesAccepted;
+ }
+
+ public void setCommunityGuidelinesAccepted(boolean communityGuidelinesAccepted) {
+ this.communityGuidelinesAccepted = communityGuidelinesAccepted;
+ }
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/User.java b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/User.java
index 0f40adc8c..e65c921a4 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/User.java
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/User.java
@@ -158,6 +158,9 @@ public class User extends RealmObject {
public void setParty(UserParty party) {
this.party = party;
+ if (party != null && id != null && !party.isManaged()) {
+ party.setUserId(id);
+ }
}
public Items getItems() {
@@ -451,4 +454,8 @@ public class User extends RealmObject {
public void setChallenges(RealmList challenges) {
this.challenges = challenges;
}
+
+ public boolean hasParty() {
+ return party != null && party.id != null && party.id.length() > 0;
+ }
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/ItemRecyclerAdapter.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/ItemRecyclerAdapter.java
index c2c4a8156..a1197b532 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/ItemRecyclerAdapter.java
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/ItemRecyclerAdapter.java
@@ -73,22 +73,6 @@ public class ItemRecyclerAdapter extends RealmRecyclerViewAdapter- pets) {
ownedPets = pets;
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/QuestCollectRecyclerViewAdapter.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/QuestCollectRecyclerViewAdapter.java
deleted file mode 100644
index 82ee2cac7..000000000
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/QuestCollectRecyclerViewAdapter.java
+++ /dev/null
@@ -1,85 +0,0 @@
-package com.habitrpg.android.habitica.ui.adapter.social;
-
-import android.net.Uri;
-import android.support.v7.widget.RecyclerView;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.TextView;
-
-import com.facebook.drawee.view.SimpleDraweeView;
-import com.habitrpg.android.habitica.R;
-import com.habitrpg.android.habitica.models.inventory.QuestCollect;
-import com.habitrpg.android.habitica.models.inventory.QuestContent;
-import com.habitrpg.android.habitica.models.inventory.QuestProgress;
-import com.habitrpg.android.habitica.models.inventory.QuestProgressCollect;
-
-import java.util.ArrayList;
-
-import butterknife.BindView;
-import butterknife.ButterKnife;
-
-public class QuestCollectRecyclerViewAdapter extends RecyclerView.Adapter {
-
- private QuestProgress progress;
- private QuestContent quest;
-
- public void setQuestProgress(QuestProgress progress) {
- this.progress = progress;
- this.notifyDataSetChanged();
- }
-
- public void setQuestContent(QuestContent quest) {
- this.quest = quest;
- this.notifyDataSetChanged();
- }
-
- @Override
- public QuestCollectViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
-
- View view = LayoutInflater.from(parent.getContext())
- .inflate(R.layout.fragment_quest_collect, parent, false);
-
- return new QuestCollectViewHolder(view);
- }
-
- @Override
- public void onBindViewHolder(QuestCollectViewHolder holder, int position) {
- holder.bind(progress.collect.get(position));
- }
-
- @Override
- public int getItemCount() {
- return progress != null && progress.collect != null ? progress.collect.size() : 0;
- }
-
- class QuestCollectViewHolder extends RecyclerView.ViewHolder {
- @BindView(R.id.image)
- SimpleDraweeView image;
-
- @BindView(R.id.name)
- TextView name;
-
- @BindView(R.id.count)
- TextView count;
-
- View view;
-
- public QuestCollectViewHolder(View itemView) {
- super(itemView);
- ButterKnife.bind(this, itemView);
- this.view = itemView;
- }
-
- public void bind(QuestProgressCollect collectProgress) {
- image.setImageURI(Uri.parse("https://habitica-assets.s3.amazonaws.com/mobileApp/images/" + "quest_" + quest.getKey() + "_" + collectProgress.key + ".png"));
- if (quest != null) {
- QuestCollect collect = quest.getCollectWithKey(collectProgress.key);
- if (collect != null) {
- name.setText(collect.text);
- count.setText(collectProgress.count + " / " + collect.count);
- }
- }
- }
- }
-}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemRecyclerFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemRecyclerFragment.java
index 8b993f32e..32534822b 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemRecyclerFragment.java
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemRecyclerFragment.java
@@ -209,13 +209,4 @@ public class ItemRecyclerFragment extends BaseFragment {
command.identifier = MainDrawerBuilder.SIDEBAR_SHOPS;
EventBus.getDefault().post(command);
}
-
- @Subscribe
- public void openedMysteryItem(OpenedMysteryItemEvent event) {
- this.adapter.openedMysteryItem(event.numberLeft);
- inventoryRepository.getEquipment(event.mysteryItem.getKey()).subscribe(itemData -> {
- MainActivity activity = (MainActivity) getActivity();
- showSnackbar(activity, activity.floatingMenuWrapper, getString(R.string.notification_mystery_item, itemData.getText()), UiUtils.SnackbarDisplayType.NORMAL);
- });
- }
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PreferencesFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PreferencesFragment.java
index 1c12ad2ff..8bcde03d1 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PreferencesFragment.java
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PreferencesFragment.java
@@ -32,6 +32,8 @@ import java.util.Map;
import javax.inject.Inject;
+import rx.Subscription;
+
public class PreferencesFragment extends BasePreferencesFragment implements
SharedPreferences.OnSharedPreferenceChangeListener {
@@ -48,6 +50,7 @@ public class PreferencesFragment extends BasePreferencesFragment implements
private User user;
@Inject
PushNotificationManager pushNotificationManager;
+ private Subscription subscription;
@Override
public void onCreate(Bundle savedInstanceState) {
@@ -58,13 +61,14 @@ public class PreferencesFragment extends BasePreferencesFragment implements
String userID = getPreferenceManager().getSharedPreferences().getString(context.getString(R.string.SP_userID), null);
if (userID != null) {
- userRepository.getUser(userID).subscribe(PreferencesFragment.this::setUser, RxErrorHandler.handleEmptyError());
+ subscription = userRepository.getUser(userID).subscribe(PreferencesFragment.this::setUser, RxErrorHandler.handleEmptyError());
}
}
@Override
public void onDestroy() {
userRepository.close();
+ subscription.unsubscribe();
super.onDestroy();
}
@@ -209,9 +213,7 @@ public class PreferencesFragment extends BasePreferencesFragment implements
case "audioTheme": {
String newAudioTheme = sharedPreferences.getString(key, "off");
userRepository.updateUser(user, "preferences.sound", newAudioTheme)
- .subscribe(habitRPGUser -> {
- }, throwable -> {
- });
+ .subscribe(habitRPGUser -> {}, throwable -> {});
Preferences preferences = user.getPreferences();
preferences.setSound(newAudioTheme);
@@ -223,9 +225,7 @@ public class PreferencesFragment extends BasePreferencesFragment implements
}
case "dailyDueDefaultView":
userRepository.updateUser(user, "preferences.dailyDueDefaultView", sharedPreferences.getBoolean(key, false))
- .subscribe(habitRPGUser -> {
- }, throwable -> {
- });
+ .subscribe(habitRPGUser -> {}, throwable -> {});
break;
}
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/ChatListFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/ChatListFragment.java
index 7b896fca8..325129891 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/ChatListFragment.java
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/ChatListFragment.java
@@ -3,6 +3,8 @@ package com.habitrpg.android.habitica.ui.fragments.social;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.content.ContextCompat;
@@ -16,6 +18,7 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.ImageButton;
+import android.widget.TextView;
import com.habitrpg.android.habitica.R;
import com.habitrpg.android.habitica.components.AppComponent;
@@ -61,6 +64,8 @@ public class ChatListFragment extends BaseFragment implements SwipeRefreshLayout
EditText chatEditText;
@BindView(R.id.send_button)
ImageButton sendButton;
+ @BindView(R.id.community_guidelines_view)
+ TextView communityGuidelinesView;
LinearLayoutManager layoutManager;
private String groupId;
private User user;
@@ -101,8 +106,9 @@ public class ChatListFragment extends BaseFragment implements SwipeRefreshLayout
}
- if (view == null)
+ if (view == null) {
view = inflater.inflate(R.layout.fragment_chat, container, false);
+ }
return view;
}
@@ -142,6 +148,18 @@ public class ChatListFragment extends BaseFragment implements SwipeRefreshLayout
recyclerView.setAdapter(chatAdapter);
socialRepository.getGroupChat(groupId).first().subscribe(this::setChatMessages, throwable -> {});
+
+ if (user != null && user.getFlags() != null && user.getFlags().isCommunityGuidelinesAccepted()) {
+ communityGuidelinesView.setVisibility(View.GONE);
+ } else {
+ communityGuidelinesView.setOnClickListener(v -> {
+ Intent i = new Intent(Intent.ACTION_VIEW);
+ i.setData(Uri.parse("https://habitica.com/static/community-guidelines"));
+ getContext().startActivity(i);
+
+ userRepository.updateUser(user, "flags.communityGuidelinesAccepted", true).subscribe(user1 -> {}, RxErrorHandler.handleEmptyError());
+ });
+ }
onRefresh();
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/GroupInformationFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/GroupInformationFragment.java
index a1e5d77f7..52c6f17c9 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/GroupInformationFragment.java
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/GroupInformationFragment.java
@@ -1,14 +1,11 @@
package com.habitrpg.android.habitica.ui.fragments.social;
-import android.app.AlertDialog;
import android.content.Context;
import android.databinding.DataBindingUtil;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.content.ContextCompat;
import android.support.v7.widget.CardView;
-import android.support.v7.widget.LinearLayoutManager;
-import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -21,11 +18,9 @@ import com.habitrpg.android.habitica.data.ApiClient;
import com.habitrpg.android.habitica.data.UserRepository;
import com.habitrpg.android.habitica.databinding.FragmentGroupInfoBinding;
import com.habitrpg.android.habitica.helpers.QrCodeManager;
-import com.habitrpg.android.habitica.helpers.RxErrorHandler;
import com.habitrpg.android.habitica.models.inventory.QuestContent;
import com.habitrpg.android.habitica.models.social.Group;
import com.habitrpg.android.habitica.models.user.User;
-import com.habitrpg.android.habitica.ui.adapter.social.QuestCollectRecyclerViewAdapter;
import com.habitrpg.android.habitica.ui.fragments.BaseFragment;
import com.habitrpg.android.habitica.ui.views.ValueBar;
@@ -33,7 +28,6 @@ import javax.inject.Inject;
import butterknife.BindView;
import butterknife.ButterKnife;
-import butterknife.OnClick;
public class GroupInformationFragment extends BaseFragment {
@@ -45,12 +39,6 @@ public class GroupInformationFragment extends BaseFragment {
@Inject
UserRepository userRepository;
- @BindView(R.id.questMemberView)
- LinearLayout questMemberView;
-
- @BindView(R.id.collectionStats)
- RecyclerView collectionStats;
-
@BindView(R.id.qrLayout)
@Nullable
LinearLayout qrLayout;
@@ -68,8 +56,6 @@ public class GroupInformationFragment extends BaseFragment {
private ValueBar bossHpBar;
private ValueBar bossRageBar;
- private QuestCollectRecyclerViewAdapter questCollectViewAdapter;
-
public GroupInformationFragment() {
}
@@ -90,7 +76,6 @@ public class GroupInformationFragment extends BaseFragment {
if (view == null) {
view = inflater.inflate(R.layout.fragment_group_info, container, false);
}
- questCollectViewAdapter = new QuestCollectRecyclerViewAdapter();
viewBinding = DataBindingUtil.bind(view);
viewBinding.setHideParticipantCard(false);
@@ -105,8 +90,6 @@ public class GroupInformationFragment extends BaseFragment {
unbinder = ButterKnife.bind(this, view);
- collectionStats.setLayoutManager(new LinearLayoutManager(getContext()));
- collectionStats.setAdapter(questCollectViewAdapter);
bossHpBar = (ValueBar) view.findViewById(R.id.bossHpBar);
bossRageBar = (ValueBar) view.findViewById(R.id.bossRageBar);
@@ -147,10 +130,6 @@ public class GroupInformationFragment extends BaseFragment {
viewBinding.setGroup(group);
}
- if (questMemberView != null) {
- updateQuestMember(group);
- }
-
this.group = group;
if (isAdded()) {
@@ -175,12 +154,6 @@ public class GroupInformationFragment extends BaseFragment {
if (group == null || quest == null) {
return;
}
- if (questCollectViewAdapter != null) {
- questCollectViewAdapter.setQuestContent(quest);
- if (group.quest.getProgress() != null) {
- questCollectViewAdapter.setQuestProgress(group.quest.getProgress());
- }
- }
boolean showHpBar = (quest.boss != null && quest.boss.hp > 0);
bossHpBar.setVisibility(showHpBar ? View.VISIBLE : View.GONE);
@@ -197,181 +170,4 @@ public class GroupInformationFragment extends BaseFragment {
viewBinding.setHideParticipantCard(true);
}
}
-
- private void updateQuestMember(Group group) {
- questMemberView.removeAllViewsInLayout();
- if (group.quest == null || group.quest.key == null) return;
- Context context = getContext();
- if (context == null && group.quest.members != null) {
- viewBinding.setHideParticipantCard(true);
- return;
- }
- if (group.quest.members == null || group.members == null) {
- viewBinding.setHideParticipantCard(true);
- return;
- }
- viewBinding.setHideParticipantCard(false);
- LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- for (User member : group.members) {
- final LinearLayout itemView = (LinearLayout) layoutInflater.inflate(R.layout.party_member_quest, questMemberView, false);
- TextView questResponse = (TextView) itemView.findViewById(R.id.rsvpneeded);
- TextView userName = (TextView) itemView.findViewById(R.id.username);
- userName.setText(member.getProfile().getName());
-
- if (!group.quest.members.containsKey(member.getId()))
- continue;
- Boolean questresponse = group.quest.members.get(member.getId());
- if (group.quest.active) {
- questResponse.setText("");
- } else if (questresponse == null) {
- questResponse.setText(R.string.quest_pending);
- } else if (questresponse) {
- questResponse.setText(R.string.quest_accepted);
- questResponse.setTextColor(ContextCompat.getColor(context, R.color.good_10));
- } else {
- questResponse.setText(R.string.quest_rejected);
- questResponse.setTextColor(ContextCompat.getColor(context, R.color.worse_10));
- }
- questMemberView.post(() -> {
- if (questMemberView != null) {
- questMemberView.addView(itemView);
- }
- });
- }
- }
-
-
- @OnClick(R.id.btnQuestAccept)
- public void onQuestAccept() {
- if (group != null) {
- apiClient.acceptQuest(group.id)
- .subscribe(aVoid -> {
- if (user != null) {
- user.getParty().getQuest().RSVPNeeded = false;
- group.quest.members.put(user.getId(), true);
- }
- setGroup(group);
- viewBinding.setUser(user);
- }, throwable -> {
- });
- }
- }
-
-
- @OnClick(R.id.btnQuestReject)
- public void onQuestReject() {
- if (group != null) {
- apiClient.rejectQuest(group.id)
- .subscribe(aVoid -> {
- if (user != null) {
- user.getParty().getQuest().RSVPNeeded = false;
- group.quest.members.put(user.getId(), false);
- }
- setGroup(group);
- viewBinding.setUser(user);
- }, throwable -> {
- });
- }
- }
-
-
- @OnClick(R.id.btnQuestLeave)
- public void onQuestLeave() {
- AlertDialog.Builder builder = new AlertDialog.Builder(getActivity())
- .setMessage("Are you sure you want to leave the active quest? All your quest progress will be lost.")
- .setPositiveButton("Yes", (dialog, which) -> {
- if (group != null) {
- apiClient.leaveQuest(group.id)
- .subscribe(aVoid -> {
- if (user != null) {
- group.quest.members.remove(user.getId());
- }
- setGroup(group);
- }, throwable -> {
- });
- }
- }).setNegativeButton("No", (dialog, which) -> {
-
- });
- builder.show();
- }
-
- @OnClick(R.id.btnQuestBegin)
- public void onQuestBegin() {
-
- AlertDialog.Builder builder = new AlertDialog.Builder(getActivity())
- .setMessage(R.string.quest_begin_message)
- .setPositiveButton(R.string.yes, (dialog, which) -> {
- if (group != null) {
- apiClient.forceStartQuest(group.id, group)
- .subscribe(quest -> {
- group.quest = quest;
- setGroup(group);
- }, throwable -> {
- });
- }
- }).setNegativeButton(R.string.no, (dialog, which) -> {
-
- });
- builder.show();
- }
-
- @OnClick(R.id.btnQuestCancel)
- public void onQuestCancel() {
- AlertDialog.Builder builder = new AlertDialog.Builder(getActivity())
- .setMessage(R.string.quest_cancel_message)
- .setPositiveButton(R.string.yes, (dialog, which) -> {
- if (group != null) {
- apiClient.cancelQuest(group.id)
- .subscribe(aVoid -> {
- setGroup(group);
- setQuestContent(null);
- }, throwable -> {
- });
- }
- }).setNegativeButton(R.string.no, (dialog, which) -> {
-
- });
- builder.show();
- }
-
- @OnClick(R.id.btnQuestAbort)
- public void onQuestAbort() {
- AlertDialog.Builder builder = new AlertDialog.Builder(getActivity())
- .setMessage("Are you sure you want to abort this mission? It will abort it for everyone in your party and all progress will be lost. The quest scroll will be returned to the quest owner.")
- .setPositiveButton("Yes", (dialog, which) -> {
- if (group != null) {
- apiClient.abortQuest(group.id)
- .subscribe(quest -> {
- group.quest = quest;
- setGroup(group);
- setQuestContent(null);
- }, throwable -> {
- });
- }
- }).setNegativeButton("No", (dialog, which) -> {
-
- });
- builder.show();
- }
-
- @OnClick(R.id.btnPartyInviteAccept)
- public void onPartyInviteAccepted() {
- if (user != null) {
- apiClient.joinGroup(user.getInvitations().getParty().getId())
- .subscribe(group -> {
- setGroup(group);
- viewBinding.setInvitation(null);
- }, throwable -> {
- });
- }
- }
-
- @OnClick(R.id.btnPartyInviteReject)
- public void onPartyInviteRejected() {
- if (user != null) {
- apiClient.rejectGroupInvite(user.getInvitations().getParty().getId())
- .subscribe(aVoid -> viewBinding.setInvitation(null), RxErrorHandler.handleEmptyError());
- }
- }
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyDetailFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyDetailFragment.java
new file mode 100644
index 000000000..9b4c0150f
--- /dev/null
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyDetailFragment.java
@@ -0,0 +1,255 @@
+package com.habitrpg.android.habitica.ui.fragments.social.party;
+
+import android.app.AlertDialog;
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.support.v4.widget.SwipeRefreshLayout;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.TextView;
+
+import com.facebook.drawee.view.SimpleDraweeView;
+import com.habitrpg.android.habitica.R;
+import com.habitrpg.android.habitica.components.AppComponent;
+import com.habitrpg.android.habitica.data.InventoryRepository;
+import com.habitrpg.android.habitica.data.SocialRepository;
+import com.habitrpg.android.habitica.data.UserRepository;
+import com.habitrpg.android.habitica.helpers.RxErrorHandler;
+import com.habitrpg.android.habitica.models.inventory.Quest;
+import com.habitrpg.android.habitica.models.inventory.QuestContent;
+import com.habitrpg.android.habitica.models.social.Group;
+import com.habitrpg.android.habitica.models.user.User;
+import com.habitrpg.android.habitica.modules.AppModule;
+import com.habitrpg.android.habitica.ui.fragments.BaseFragment;
+import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils;
+import com.habitrpg.android.habitica.ui.views.social.QuestProgressView;
+
+import javax.inject.Inject;
+import javax.inject.Named;
+
+import butterknife.BindView;
+import butterknife.OnClick;
+
+
+public class PartyDetailFragment extends BaseFragment {
+
+ @Inject
+ SocialRepository socialRepository;
+ @Inject
+ UserRepository userRepository;
+ @Inject
+ InventoryRepository inventoryRepository;
+ @Inject
+ @Named(AppModule.NAMED_USER_ID)
+ String userId;
+
+ @BindView(R.id.refresh_layout)
+ SwipeRefreshLayout refreshLayout;
+
+ @BindView(R.id.party_invitation_wrapper)
+ ViewGroup partyInvitationWrapper;
+
+ @BindView(R.id.title_view)
+ TextView titleView;
+ @BindView(R.id.description_view)
+ TextView descriptionView;
+
+ @BindView(R.id.new_quest_button)
+ Button newQuestButton;
+ @BindView(R.id.quest_detail_button)
+ ViewGroup questDetailButton;
+ @BindView(R.id.quest_scroll_image_view)
+ SimpleDraweeView questScrollImageView;
+ @BindView(R.id.quest_title_view)
+ TextView questTitleView;
+ @BindView(R.id.quest_participation_view)
+ TextView questParticipationView;
+ @BindView(R.id.quest_image_wrapper)
+ ViewGroup questImageWrapper;
+ @BindView(R.id.quest_image_view)
+ SimpleDraweeView questImageView;
+ @BindView(R.id.quest_participant_response_wrapper)
+ ViewGroup questParticipantResponseWrapper;
+ @BindView(R.id.quest_leader_response_wrapper)
+ ViewGroup questLeaderResponseWrapper;
+ @BindView(R.id.quest_accept_button)
+ Button questAcceptButton;
+ @BindView(R.id.quest_reject_button)
+ Button questRejectButton;
+ @BindView(R.id.quest_begin_button)
+ Button questBeginButton;
+ @BindView(R.id.quest_cancel_button)
+ Button questCancelButton;
+ @BindView(R.id.quest_progress_view)
+ QuestProgressView questProgressView;
+
+
+ public String partyId;
+ private Group party;
+ private Quest quest;
+ private User user;
+
+ @Override
+ public void injectFragment(AppComponent component) {
+ component.inject(this);
+ }
+
+ @Nullable
+ @Override
+ public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+ super.onCreateView(inflater, container, savedInstanceState);
+ return inflater.inflate(R.layout.fragment_party_detail, container, false);
+ }
+
+ @Override
+ public void onDestroyView() {
+ socialRepository.close();
+ userRepository.close();
+ inventoryRepository.close();
+ super.onDestroyView();
+ }
+
+ @Override
+ public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
+
+ refreshLayout.setOnRefreshListener(this::refreshParty);
+
+ compositeSubscription.add(socialRepository.getGroup(partyId).subscribe(this::updateParty, RxErrorHandler.handleEmptyError()));
+ compositeSubscription.add(userRepository.getUser(userId).subscribe(this::updateUser, RxErrorHandler.handleEmptyError()));
+ }
+
+ private void refreshParty() {
+ socialRepository.retrieveGroup("party")
+ .flatMap(group1 -> socialRepository.retrieveGroupMembers(group1.id, true))
+ .subscribe(members -> refreshLayout.setRefreshing(false), throwable -> refreshLayout.setRefreshing(false));
+ }
+
+ private void updateParty(Group party) {
+ this.party = party;
+ this.quest = party.quest;
+ if (titleView == null) {
+ return;
+ }
+ if (party.quest != null && user != null && user.getId().equals(party.quest.leader)) {
+ questLeaderResponseWrapper.setVisibility(View.VISIBLE);
+ questParticipantResponseWrapper.setVisibility(View.GONE);
+ }
+ titleView.setText(party.name);
+ descriptionView.setText(party.description);
+
+ if (quest.key != null) {
+ newQuestButton.setVisibility(View.GONE);
+ questDetailButton.setVisibility(View.VISIBLE);
+ questImageWrapper.setVisibility(View.VISIBLE);
+
+ getActivity().runOnUiThread(() -> inventoryRepository.getQuestContent(quest.getKey())
+ .first()
+ .subscribe(this::updateQuestContent, RxErrorHandler.handleEmptyError()));
+ } else {
+ newQuestButton.setVisibility(View.VISIBLE);
+ questDetailButton.setVisibility(View.GONE);
+ questImageWrapper.setVisibility(View.GONE);
+ questLeaderResponseWrapper.setVisibility(View.GONE);
+ questParticipantResponseWrapper.setVisibility(View.GONE);
+ questProgressView.setVisibility(View.GONE);
+ }
+ }
+
+ private void updateUser(User user) {
+ if (user == null || user.getParty() == null || user.getParty().getQuest() == null) {
+ return;
+ }
+ this.user = user;
+
+ if (user.getInvitations() != null && user.getInvitations().getParty() != null && user.getInvitations().getParty().getId() != null) {
+ partyInvitationWrapper.setVisibility(View.VISIBLE);
+ } else {
+ partyInvitationWrapper.setVisibility(View.GONE);
+ }
+
+ if (isQuestActive() || !user.getParty().getQuest().RSVPNeeded) {
+ questLeaderResponseWrapper.setVisibility(View.GONE);
+ questParticipantResponseWrapper.setVisibility(View.GONE);
+ } else {
+ questLeaderResponseWrapper.setVisibility(View.GONE);
+ questParticipantResponseWrapper.setVisibility(View.VISIBLE);
+ }
+ }
+
+ private void updateQuestContent(QuestContent questContent) {
+ questTitleView.setText(questContent.getText());
+ DataBindingUtils.loadImage(questScrollImageView, "inventory_quest_scroll_"+questContent.getKey());
+ DataBindingUtils.loadImage(questImageView, "quest_"+questContent.getKey());
+ if (isQuestActive()) {
+ questProgressView.setVisibility(View.VISIBLE);
+ questProgressView.setData(questContent, quest.getProgress());
+
+ questParticipationView.setText(getString(R.string.number_participants, quest.members.size()));
+ } else {
+ questProgressView.setVisibility(View.GONE);
+ }
+ }
+
+ private boolean isQuestActive() {
+ return quest != null && quest.active;
+ }
+
+ @OnClick(R.id.new_quest_button)
+ public void inviteNewQuest() {
+
+ }
+
+ @OnClick(R.id.leave_button)
+ public void leaveParty() {
+
+ }
+
+ @OnClick(R.id.quest_accept_button)
+ public void onQuestAccept() {
+ socialRepository.acceptQuest(user, partyId).subscribe(aVoid -> {}, throwable -> {});
+ }
+
+
+ @OnClick(R.id.quest_reject_button)
+ public void onQuestReject() {
+ socialRepository.rejectQuest(user, partyId).subscribe(aVoid -> {}, throwable -> {});
+ }
+
+ @OnClick(R.id.quest_begin_button)
+ public void onQuestBegin() {
+ AlertDialog.Builder builder = new AlertDialog.Builder(getActivity())
+ .setMessage(R.string.quest_begin_message)
+ .setPositiveButton(R.string.yes, (dialog, which) -> socialRepository.forceStartQuest(party)
+ .subscribe(quest -> {}, throwable -> {}))
+ .setNegativeButton(R.string.no, (dialog, which) -> {});
+ builder.show();
+ }
+
+ @OnClick(R.id.quest_cancel_button)
+ public void onQuestCancel() {
+ AlertDialog.Builder builder = new AlertDialog.Builder(getActivity())
+ .setMessage(R.string.quest_cancel_message)
+ .setPositiveButton(R.string.yes, (dialog, which) -> socialRepository.cancelQuest(partyId)
+ .subscribe(aVoid -> {}, throwable -> {})).setNegativeButton(R.string.no, (dialog, which) -> {});
+ builder.show();
+ }
+
+ @OnClick(R.id.party_invite_accept_button)
+ public void onPartyInviteAccepted() {
+ if (user != null) {
+ socialRepository.joinGroup(user.getInvitations().getParty().getId())
+ .subscribe(group -> {}, throwable -> {});
+ }
+ }
+
+ @OnClick(R.id.party_invite_reject_button)
+ public void onPartyInviteRejected() {
+ if (user != null) {
+ socialRepository.rejectGroupInvite(user.getInvitations().getParty().getId())
+ .subscribe(aVoid -> {}, RxErrorHandler.handleEmptyError());
+ }
+ }
+}
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 55bff7da5..1ec029d88 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
@@ -48,7 +48,6 @@ public class PartyFragment extends BaseMainFragment {
@Nullable
private Group group;
private PartyMemberListFragment partyMemberListFragment;
- private GroupInformationFragment groupInformationFragment;
private ChatListFragment chatListFragment;
private FragmentPagerAdapter viewPagerAdapter;
@@ -126,10 +125,6 @@ public class PartyFragment extends BaseMainFragment {
partyMemberListFragment.setPartyId(group.id);
}
- if (groupInformationFragment != null) {
- groupInformationFragment.setGroup(group);
- }
-
if (chatListFragment != null && group != null) {
chatListFragment.seenGroupId = group.id;
}
@@ -137,14 +132,6 @@ public class PartyFragment extends BaseMainFragment {
if (this.activity != null) {
this.activity.supportInvalidateOptionsMenu();
}
-
- if (group != null && group.quest != null && group.quest.key != null && !group.quest.key.isEmpty()) {
- inventoryRepository.getQuestContent(group.quest.key).first().subscribe(content -> {
- if (groupInformationFragment != null) {
- groupInformationFragment.setQuestContent(content);
- }
- }, RxErrorHandler.handleEmptyError());
- }
}
@Override
@@ -231,10 +218,7 @@ public class PartyFragment extends BaseMainFragment {
}
if (needsSaving) {
this.socialRepository.updateGroup(this.group, bundle.getString("name"), bundle.getString("description"), bundle.getString("leader"), bundle.getString("privacy"))
- .subscribe(aVoid -> {
- }, throwable -> {
- });
- this.groupInformationFragment.setGroup(group);
+ .subscribe(aVoid -> {}, throwable -> {});
}
}
break;
@@ -291,7 +275,13 @@ public class PartyFragment extends BaseMainFragment {
switch (position) {
case 0: {
- fragment = groupInformationFragment = GroupInformationFragment.newInstance(group, user);
+ if (user.hasParty()) {
+ PartyDetailFragment detailFragment = new PartyDetailFragment();
+ detailFragment.partyId = user.getParty().id;
+ fragment = detailFragment;
+ } else {
+ fragment = GroupInformationFragment.newInstance(null, user);
+ }
break;
}
case 1: {
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 d84f6f191..efb316f4c 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
@@ -126,6 +126,9 @@ public class TasksFragment extends BaseMainFragment {
@Override
public void onDestroy() {
tagRepository.close();
+ if (bottomNavigation != null) {
+ bottomNavigation.removeOnTabSelectListener();
+ }
super.onDestroy();
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/DataBindingUtils.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/DataBindingUtils.java
index 4d454e543..1997d8702 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/DataBindingUtils.java
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/DataBindingUtils.java
@@ -14,6 +14,7 @@ import android.view.animation.Animation;
import android.view.animation.Transformation;
import android.widget.Button;
import android.widget.CheckBox;
+import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/ValueBar.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/ValueBar.java
index 9a71c6a40..1415e6511 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/ValueBar.java
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/ValueBar.java
@@ -54,6 +54,7 @@ public class ValueBar extends FrameLayout {
Drawable iconRes = attributes.getDrawable(R.styleable.ValueBar_barIconDrawable);
if (iconRes != null) {
iconView.setImageDrawable(iconRes);
+ iconView.setVisibility(View.VISIBLE);
}
descriptionTextView.setText(attributes.getString(R.styleable.ValueBar_description));
@@ -71,7 +72,7 @@ public class ValueBar extends FrameLayout {
public void setLightBackground(boolean lightBackground) {
int textColor;
if (lightBackground) {
- textColor = ContextCompat.getColor(getContext(), R.color.md_black_1000);
+ textColor = ContextCompat.getColor(getContext(), R.color.gray_10);
barBackground.setBackgroundResource(R.drawable.layout_rounded_bg_light_gray);
} else {
textColor = ContextCompat.getColor(getContext(), R.color.brand_500);
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/social/QuestProgressView.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/social/QuestProgressView.java
new file mode 100644
index 000000000..570f1df9b
--- /dev/null
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/social/QuestProgressView.java
@@ -0,0 +1,85 @@
+package com.habitrpg.android.habitica.ui.views.social;
+
+import android.content.Context;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.util.AttributeSet;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import com.facebook.drawee.view.SimpleDraweeView;
+import com.habitrpg.android.habitica.R;
+import com.habitrpg.android.habitica.models.inventory.QuestCollect;
+import com.habitrpg.android.habitica.models.inventory.QuestContent;
+import com.habitrpg.android.habitica.models.inventory.QuestProgress;
+import com.habitrpg.android.habitica.models.inventory.QuestProgressCollect;
+import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils;
+import com.habitrpg.android.habitica.ui.views.ValueBar;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+
+public class QuestProgressView extends LinearLayout {
+
+ @BindView(R.id.boss_name_view)
+ TextView bossNameView;
+ @BindView(R.id.boss_health_view)
+ ValueBar bossHealthView;
+ @BindView(R.id.collection_container)
+ ViewGroup collectionContainer;
+
+ public QuestProgressView(@NonNull Context context) {
+ super(context);
+ setupView(context);
+ }
+
+ public QuestProgressView(Context context, @Nullable AttributeSet attrs) {
+ super(context, attrs);
+ setupView(context);
+ }
+
+ private void setupView(Context context) {
+ LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+ inflater.inflate(R.layout.quest_progress, this);
+
+ ButterKnife.bind(this, this);
+ }
+
+ public void setData(QuestContent quest, QuestProgress progress) {
+ collectionContainer.removeAllViews();
+ if (quest.boss != null) {
+ bossNameView.setText(quest.boss.name);
+ if (progress != null) {
+ bossHealthView.set(progress.hp, quest.boss.hp);
+ }
+ bossNameView.setVisibility(View.VISIBLE);
+ bossHealthView.setVisibility(View.VISIBLE);
+ } else {
+ bossNameView.setVisibility(View.GONE);
+ bossHealthView.setVisibility(View.GONE);
+
+ if (progress != null) {
+ LayoutInflater inflater = LayoutInflater.from(getContext());
+ for (QuestProgressCollect collect : progress.collect) {
+ QuestCollect contentCollect = quest.getCollectWithKey(collect.key);
+ if (contentCollect == null) {
+ continue;
+ }
+ View view = inflater.inflate(R.layout.quest_collect, collectionContainer, false);
+ SimpleDraweeView iconView = (SimpleDraweeView) view.findViewById(R.id.icon_view);
+ TextView nameView = (TextView) view.findViewById(R.id.name_view);
+ ValueBar valueView = (ValueBar) view.findViewById(R.id.value_view);
+ DataBindingUtils.loadImage(iconView, "quest_" + quest.getKey() + "_" + collect.key);
+ nameView.setText(contentCollect.text);
+ valueView.set(collect.count, contentCollect.count);
+
+ collectionContainer.addView(view);
+ }
+ }
+ }
+ }
+
+}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/utils/GroupSerialization.java b/Habitica/src/main/java/com/habitrpg/android/habitica/utils/GroupSerialization.java
index ed5ede579..94e506114 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/utils/GroupSerialization.java
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/utils/GroupSerialization.java
@@ -73,6 +73,7 @@ public class GroupSerialization implements JsonDeserializer, JsonSerializ
if (obj.has("quest")) {
group.quest = context.deserialize(obj.get("quest"), new TypeToken() {
}.getType());
+ group.quest.id = group.id;
}
return group;
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/utils/QuestDeserializer.java b/Habitica/src/main/java/com/habitrpg/android/habitica/utils/QuestDeserializer.java
index b90d54589..80c6a20c9 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/utils/QuestDeserializer.java
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/utils/QuestDeserializer.java
@@ -6,6 +6,7 @@ import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
import com.habitrpg.android.habitica.models.inventory.Quest;
+import com.habitrpg.android.habitica.models.inventory.QuestMember;
import com.habitrpg.android.habitica.models.inventory.QuestProgress;
import com.habitrpg.android.habitica.models.inventory.QuestProgressCollect;
@@ -59,6 +60,22 @@ public class QuestDeserializer implements JsonDeserializer {
progress.collect.add(collect);
}
}
+ quest.setProgress(progress);
+ }
+
+ if (obj.has("members")) {
+ RealmList members = new RealmList<>();
+ for (Map.Entry entry : obj.get("members").getAsJsonObject().entrySet()) {
+ QuestMember member = new QuestMember();
+ member.key = entry.getKey();
+ if (entry.getValue().isJsonNull()) {
+ member.isParticipating = null;
+ } else {
+ member.isParticipating = entry.getValue().getAsBoolean();
+ }
+ members.add(member);
+ }
+ quest.members = members;
}
return quest;
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/utils/QuestListDeserializer.java b/Habitica/src/main/java/com/habitrpg/android/habitica/utils/QuestListDeserializer.java
index 1281fd74e..493c075ae 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/utils/QuestListDeserializer.java
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/utils/QuestListDeserializer.java
@@ -37,6 +37,9 @@ public class QuestListDeserializer implements JsonDeserializer
{
@@ -53,6 +55,16 @@ public class UserDeserializer implements JsonDeserializer {
}
if (obj.has("party")) {
user.setParty(context.deserialize(obj.get("party"), UserParty.class));
+ if (user.getParty() != null && user.getParty().getQuest() != null) {
+ user.getParty().getQuest().id = user.getId();
+ if (!obj.get("party").getAsJsonObject().get("quest").getAsJsonObject().has("RSVPNeeded")) {
+ Realm realm = Realm.getDefaultInstance();
+ Quest quest = realm.where(Quest.class).equalTo("id", user.getId()).findFirst();
+ if (quest != null && quest.isValid()) {
+ user.getParty().getQuest().RSVPNeeded = quest.RSVPNeeded;
+ }
+ }
+ }
}
if (obj.has("items")) {
user.setItems(context.deserialize(obj.get("items"), Items.class));