diff --git a/Habitica/assets/migrations/Habitica/13.sql b/Habitica/assets/migrations/Habitica/13.sql
new file mode 100644
index 000000000..28c6ebbb0
--- /dev/null
+++ b/Habitica/assets/migrations/Habitica/13.sql
@@ -0,0 +1,3 @@
+DELETE FROM QuestContent;
+ALTER TABLE QuestProgress ADD COLUMN hp float;
+ALTER TABLE QuestProgress ADD COLUMN rage float;
\ No newline at end of file
diff --git a/Habitica/res/layout/fragment_group_info.xml b/Habitica/res/layout/fragment_group_info.xml
index 8b4a2d156..ec4d0d836 100644
--- a/Habitica/res/layout/fragment_group_info.xml
+++ b/Habitica/res/layout/fragment_group_info.xml
@@ -114,6 +114,40 @@
bind:questImageName='@{"quest_"+ quest.key}'
/>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Habitica/src/com/habitrpg/android/habitica/HabitDatabase.java b/Habitica/src/com/habitrpg/android/habitica/HabitDatabase.java
index 17ab712b7..f880ccc18 100644
--- a/Habitica/src/com/habitrpg/android/habitica/HabitDatabase.java
+++ b/Habitica/src/com/habitrpg/android/habitica/HabitDatabase.java
@@ -10,5 +10,5 @@ public class HabitDatabase {
public static final String NAME = "Habitica";
- public static final int VERSION = 12;
+ public static final int VERSION = 13;
}
diff --git a/Habitica/src/com/habitrpg/android/habitica/ui/adapter/social/QuestCollectRecyclerViewAdapter.java b/Habitica/src/com/habitrpg/android/habitica/ui/adapter/social/QuestCollectRecyclerViewAdapter.java
new file mode 100644
index 000000000..b15c57975
--- /dev/null
+++ b/Habitica/src/com/habitrpg/android/habitica/ui/adapter/social/QuestCollectRecyclerViewAdapter.java
@@ -0,0 +1,83 @@
+package com.habitrpg.android.habitica.ui.adapter.social;
+
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.habitrpg.android.habitica.R;
+import com.magicmicky.habitrpgwrapper.lib.models.QuestContent;
+import com.magicmicky.habitrpgwrapper.lib.models.QuestProgress;
+import com.squareup.picasso.Picasso;
+
+import java.util.ArrayList;
+
+import butterknife.Bind;
+import butterknife.ButterKnife;
+
+public class QuestCollectRecyclerViewAdapter extends RecyclerView.Adapter {
+
+ private ArrayList collect = new ArrayList<>();
+
+ private QuestProgress progress;
+ private QuestContent quest;
+
+ public void setQuestProgress(QuestProgress progress) {
+ this.progress = progress;
+ collect.clear();
+ collect.addAll(progress.collect.keySet());
+ 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(collect.get(position));
+ }
+
+ @Override
+ public int getItemCount() {
+ return collect == null ? 0 : collect.size();
+ }
+
+ class QuestCollectViewHolder extends RecyclerView.ViewHolder {
+ @Bind(R.id.image)
+ ImageView image;
+
+ @Bind(R.id.name)
+ TextView name;
+
+ @Bind(R.id.count)
+ TextView count;
+
+ View view;
+
+ public QuestCollectViewHolder(View itemView) {
+ super(itemView);
+ ButterKnife.bind(this, itemView);
+ this.view = itemView;
+ }
+
+ public void bind(String key) {
+ Picasso.with(view.getContext())
+ .load("https://habitica-assets.s3.amazonaws.com/mobileApp/images/" + "quest_" + quest.key + "_" + key + ".png")
+ .into(image);
+ name.setText(quest.getCollect().get(key).text);
+ count.setText(progress.collect.get(key) + " / " + quest.getCollect().get(key).count);
+ }
+ }
+}
diff --git a/Habitica/src/com/habitrpg/android/habitica/ui/fragments/social/GroupInformationFragment.java b/Habitica/src/com/habitrpg/android/habitica/ui/fragments/social/GroupInformationFragment.java
index 084bbd075..58b9b415e 100644
--- a/Habitica/src/com/habitrpg/android/habitica/ui/fragments/social/GroupInformationFragment.java
+++ b/Habitica/src/com/habitrpg/android/habitica/ui/fragments/social/GroupInformationFragment.java
@@ -8,6 +8,8 @@ import android.graphics.Color;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -17,6 +19,8 @@ import android.widget.TextView;
import com.habitrpg.android.habitica.APIHelper;
import com.habitrpg.android.habitica.R;
import com.habitrpg.android.habitica.databinding.FragmentGroupInfoBinding;
+import com.habitrpg.android.habitica.databinding.ValueBarBinding;
+import com.habitrpg.android.habitica.ui.adapter.social.QuestCollectRecyclerViewAdapter;
import com.magicmicky.habitrpgwrapper.lib.models.Group;
import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser;
import com.magicmicky.habitrpgwrapper.lib.models.QuestContent;
@@ -41,8 +45,16 @@ public class GroupInformationFragment extends Fragment {
APIHelper mAPIHelper;
@Bind(R.id.questMemberView)
LinearLayout questMemberView;
+ @Bind(R.id.collectionStats)
+ RecyclerView collectionStats;
private Group group;
private HabitRPGUser user;
+ private QuestContent quest;
+ private ValueBarBinding bossHpBar;
+ private ValueBarBinding bossRageBar;
+
+ private QuestCollectRecyclerViewAdapter questCollectViewAdapter;
+
public static GroupInformationFragment newInstance(Group group, HabitRPGUser user, APIHelper mAPIHelper) {
@@ -78,6 +90,12 @@ public class GroupInformationFragment extends Fragment {
ButterKnife.bind(this, view);
+ collectionStats.setLayoutManager(new LinearLayoutManager(getContext()));
+ questCollectViewAdapter = new QuestCollectRecyclerViewAdapter();
+ collectionStats.setAdapter(questCollectViewAdapter);
+ bossHpBar = DataBindingUtil.bind(view.findViewById(R.id.bossHpBar));
+ bossRageBar = DataBindingUtil.bind(view.findViewById(R.id.bossRageBar));
+
return view;
}
@@ -95,6 +113,8 @@ public class GroupInformationFragment extends Fragment {
updateQuestMember(group);
}
+ updateQuestProgress(group, quest);
+
this.group = group;
}
@@ -102,6 +122,20 @@ public class GroupInformationFragment extends Fragment {
if (viewBinding != null) {
viewBinding.setQuest(quest);
}
+
+ updateQuestProgress(group, quest);
+
+ this.quest = quest;
+ }
+
+ private void updateQuestProgress(Group group, QuestContent quest) {
+ if (group == null || quest == null) {
+ return;
+ }
+ questCollectViewAdapter.setQuestContent(quest);
+ questCollectViewAdapter.setQuestProgress(group.quest.getProgress());
+ bossHpBar.valueBarLayout.setVisibility((quest.boss != null && quest.boss.hp > 0) ? View.VISIBLE : View.GONE);
+ bossRageBar.valueBarLayout.setVisibility((quest.boss != null && quest.boss.rage_value > 0) ? View.VISIBLE : View.GONE);
}
private void updateQuestMember(Group group) {
diff --git a/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/QuestCollect.java b/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/QuestCollect.java
new file mode 100644
index 000000000..f4d7d8afc
--- /dev/null
+++ b/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/QuestCollect.java
@@ -0,0 +1,26 @@
+package com.magicmicky.habitrpgwrapper.lib.models;
+
+import com.habitrpg.android.habitica.HabitDatabase;
+import com.raizlabs.android.dbflow.annotation.Column;
+import com.raizlabs.android.dbflow.annotation.PrimaryKey;
+import com.raizlabs.android.dbflow.annotation.Table;
+import com.raizlabs.android.dbflow.structure.BaseModel;
+
+@Table(databaseName = HabitDatabase.NAME)
+public class QuestCollect extends BaseModel {
+ @Column
+ public String key;
+
+ @Column
+ public String quest_key;
+
+ @Column
+ @PrimaryKey(autoincrement = true)
+ long id;
+
+ @Column
+ public String text;
+
+ @Column
+ public int count;
+}
diff --git a/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/QuestContent.java b/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/QuestContent.java
index 089154720..ad8594c71 100644
--- a/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/QuestContent.java
+++ b/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/QuestContent.java
@@ -2,10 +2,18 @@ package com.magicmicky.habitrpgwrapper.lib.models;
import com.habitrpg.android.habitica.HabitDatabase;
import com.raizlabs.android.dbflow.annotation.Column;
+import com.raizlabs.android.dbflow.annotation.OneToMany;
import com.raizlabs.android.dbflow.annotation.PrimaryKey;
import com.raizlabs.android.dbflow.annotation.Table;
+import com.raizlabs.android.dbflow.sql.builder.Condition;
+import com.raizlabs.android.dbflow.sql.language.Select;
import com.raizlabs.android.dbflow.structure.BaseModel;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
/**
* Created by Negue on 29.09.2015.
*/
@@ -38,6 +46,41 @@ public class QuestContent extends BaseModel {
public QuestBoss boss;
+ HashMap collect;
+
+ @OneToMany(methods = {OneToMany.Method.SAVE, OneToMany.Method.DELETE}, variableName = "collect")
+ public Collection getCollectCollection() {
+ return getCollect().values();
+ }
+
+ public HashMap getCollect() {
+ if (collect == null) {
+ List collectList = new Select()
+ .from(QuestCollect.class)
+ .where(Condition.column("quest_key").eq(this.key))
+ .queryList();
+ collect = new HashMap<>();
+ for (QuestCollect c : collectList) {
+ collect.put(c.key, c);
+ }
+ }
+ return collect;
+ }
+
+ public void setCollect(HashMap collect) {
+ this.collect = collect;
+ }
+
+ public void save() {
+ if (collect != null) {
+ for (Map.Entry kv : collect.entrySet()) {
+ kv.getValue().quest_key = key;
+ kv.getValue().key = kv.getKey();
+ }
+ }
+ super.save();
+ }
+
// todo drops
}
diff --git a/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/QuestProgress.java b/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/QuestProgress.java
index ef9a2cc18..04fec54aa 100644
--- a/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/QuestProgress.java
+++ b/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/QuestProgress.java
@@ -6,6 +6,8 @@ import com.raizlabs.android.dbflow.annotation.PrimaryKey;
import com.raizlabs.android.dbflow.annotation.Table;
import com.raizlabs.android.dbflow.structure.BaseModel;
+import java.util.HashMap;
+
/**
* Created by viirus on 06/07/15.
*/
@@ -19,6 +21,11 @@ public class QuestProgress extends BaseModel {
@Column
private float down, up;
+ @Column
+ public double hp, rage;
+
+ public HashMap collect;
+
private QuestProgress(float down, float up) {
this.down = down;
this.up = up;
diff --git a/Habitica/src/com/magicmicky/habitrpgwrapper/lib/utils/GroupDeserializer.java b/Habitica/src/com/magicmicky/habitrpgwrapper/lib/utils/GroupDeserializer.java
index 802573086..ca809cf88 100644
--- a/Habitica/src/com/magicmicky/habitrpgwrapper/lib/utils/GroupDeserializer.java
+++ b/Habitica/src/com/magicmicky/habitrpgwrapper/lib/utils/GroupDeserializer.java
@@ -9,6 +9,7 @@ import com.google.gson.reflect.TypeToken;
import com.magicmicky.habitrpgwrapper.lib.models.ChatMessage;
import com.magicmicky.habitrpgwrapper.lib.models.Group;
import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser;
+import com.magicmicky.habitrpgwrapper.lib.models.Quest;
import java.lang.reflect.Type;
import java.util.List;
@@ -20,7 +21,9 @@ public class GroupDeserializer implements JsonDeserializer {
JsonObject obj = json.getAsJsonObject();
group.id = obj.get("_id").getAsString();
group.name = obj.get("name").getAsString();
- group.description = obj.get("description").getAsString();
+ if (obj.has("description")) {
+ group.description = obj.get("description").getAsString();
+ }
if (obj.has("memberCount")) {
group.memberCount = obj.get("memberCount").getAsInt();
@@ -48,6 +51,10 @@ public class GroupDeserializer implements JsonDeserializer {
group.leaderID = obj.get("leader").getAsJsonObject().get("_id").getAsString();
}
}
+ if (obj.has("quest")) {
+ group.quest = context.deserialize(obj.get("quest"), new TypeToken() {
+ }.getType());
+ }
return group;
}