diff --git a/Habitica/res/layout/activity_full_profile.xml b/Habitica/res/layout/activity_full_profile.xml
index 250c0a537..512b81816 100644
--- a/Habitica/res/layout/activity_full_profile.xml
+++ b/Habitica/res/layout/activity_full_profile.xml
@@ -351,5 +351,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Habitica/res/layout/profile_achievement_group.xml b/Habitica/res/layout/profile_achievement_group.xml
new file mode 100644
index 000000000..9f047d16a
--- /dev/null
+++ b/Habitica/res/layout/profile_achievement_group.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Habitica/res/layout/profile_achievement_item.xml b/Habitica/res/layout/profile_achievement_item.xml
new file mode 100644
index 000000000..4b4b5ee31
--- /dev/null
+++ b/Habitica/res/layout/profile_achievement_item.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Habitica/res/values/strings.profile.xml b/Habitica/res/values/strings.profile.xml
index ad214c227..e68f9307c 100644
--- a/Habitica/res/values/strings.profile.xml
+++ b/Habitica/res/values/strings.profile.xml
@@ -11,4 +11,6 @@
Allocated:
Boosts:
Private Message
+ Achievements
+
\ No newline at end of file
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/FullProfileActivity.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/FullProfileActivity.java
index 5278d2c30..5add0ed56 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/FullProfileActivity.java
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/FullProfileActivity.java
@@ -1,5 +1,6 @@
package com.habitrpg.android.habitica.ui.activities;
+import android.content.Context;
import android.content.Intent;
import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
@@ -10,7 +11,12 @@ import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ArrayAdapter;
+import android.widget.BaseAdapter;
+import android.widget.GridView;
import android.widget.ImageView;
+import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.ScrollView;
import android.widget.TableLayout;
@@ -28,8 +34,10 @@ import com.habitrpg.android.habitica.R;
import com.habitrpg.android.habitica.components.AppComponent;
import com.habitrpg.android.habitica.ui.AvatarView;
import com.habitrpg.android.habitica.ui.AvatarWithBarsViewModel;
+import com.habitrpg.android.habitica.ui.adapter.social.AchievementAdapter;
import com.habitrpg.android.habitica.ui.helpers.MarkdownParser;
import com.habitrpg.android.habitica.ui.helpers.UiUtils;
+import com.magicmicky.habitrpgwrapper.lib.models.Achievement;
import com.magicmicky.habitrpgwrapper.lib.models.Buffs;
import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser;
import com.magicmicky.habitrpgwrapper.lib.models.Outfit;
@@ -39,8 +47,14 @@ import com.magicmicky.habitrpgwrapper.lib.models.tasks.ItemData;
import net.pherth.android.emoji_library.EmojiEditText;
+import org.w3c.dom.Text;
+
+import java.util.AbstractMap;
import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
import java.util.HashMap;
+import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
@@ -107,6 +121,15 @@ public class FullProfileActivity extends BaseActivity {
@BindView(R.id.profile_mount_count)
TextView mountCount;
+ @BindView(R.id.profile_achievements_card)
+ CardView achievementCard;
+
+ @BindView(R.id.avatar_achievements_progress)
+ ProgressBar achievementProgress;
+
+ @BindView(R.id.achievement_groupList)
+ LinearLayout achievementGroupList;
+
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -225,9 +248,61 @@ public class FullProfileActivity extends BaseActivity {
petCount.setText(countEntries(user.getItems().getPets()) + "");
mountCount.setText(countEntriesBool(user.getItems().getMounts()) + "");
+
+ // Load the members achievements now
+ apiHelper.apiService.GetMemberAchievements(this.userId)
+ .compose(apiHelper.configureApiCallObserver())
+ .subscribe(achievements -> fillAchievements(achievements),
+ throwable -> {
+ });
}
+
+ private void fillAchievements(HashMap achievements){
+ LinkedHashMap> orderedSortedList = new LinkedHashMap<>();
+
+ // Order by ID first
+ ArrayList achievementList = new ArrayList<>(achievements.values());
+ Collections.sort(achievementList, (achievement, t1) -> Double.compare(achievement.index, t1.index));
+
+ // Map to Category
+ for(Achievement achievement : achievementList){
+ if(orderedSortedList.containsKey(achievement.category)){
+ orderedSortedList.get(achievement.category).add(achievement);
+ } else {
+ ArrayList arrayList = new ArrayList<>();
+ arrayList.add(achievement);
+ orderedSortedList.put(achievement.category, arrayList);
+ }
+ }
+
+
+
+ for(Map.Entry> entry : orderedSortedList.entrySet())
+ {
+ LinearLayout groupRow = (LinearLayout) getLayoutInflater().inflate(R.layout.profile_achievement_group, null);
+
+ GridView groupGrid = (GridView) groupRow.findViewById(R.id.achievement_gridview);
+ TextView textView = (TextView) groupRow.findViewById(R.id.achievement_title);
+
+ textView.setText(entry.getKey());
+
+ AchievementAdapter adapter = new AchievementAdapter(this, entry.getValue());
+
+ groupGrid.setAdapter(adapter);
+
+ achievementGroupList.addView(groupRow);
+ }
+
+
+ stopAndHideProgress(achievementProgress);
+ }
+
+
private int countEntries(HashMap hashMap) {
+ if(hashMap == null)
+ return 0;
+
int _count = 0;
for (Map.Entry e : hashMap.entrySet()) {
@@ -241,6 +316,9 @@ public class FullProfileActivity extends BaseActivity {
}
private int countEntriesBool(HashMap hashMap) {
+ if(hashMap == null)
+ return 0;
+
int _count = 0;
for (Map.Entry e : hashMap.entrySet()) {
@@ -523,4 +601,5 @@ public class FullProfileActivity extends BaseActivity {
}
// endregion
+
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/AchievementAdapter.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/AchievementAdapter.java
new file mode 100644
index 000000000..23b9dca4b
--- /dev/null
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/AchievementAdapter.java
@@ -0,0 +1,79 @@
+package com.habitrpg.android.habitica.ui.adapter.social;
+
+import android.content.Context;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+import android.widget.TextView;
+
+import com.facebook.drawee.backends.pipeline.Fresco;
+import com.facebook.drawee.controller.BaseControllerListener;
+import com.facebook.drawee.view.SimpleDraweeView;
+import com.facebook.imagepipeline.image.ImageInfo;
+import com.habitrpg.android.habitica.R;
+import com.habitrpg.android.habitica.ui.AvatarView;
+import com.magicmicky.habitrpgwrapper.lib.models.Achievement;
+
+import java.util.Collection;
+
+public class AchievementAdapter extends BaseAdapter {
+ private Context context;
+ private Achievement[] achievements;
+
+ public AchievementAdapter(Context context, Collection achievements) {
+ this.context = context;
+ this.achievements =new Achievement[achievements.size()];
+ achievements.toArray(this.achievements);
+ }
+
+ public View getView(int position, View convertView, ViewGroup parent) {
+
+ LayoutInflater inflater = (LayoutInflater) context
+ .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+
+ View gridView;
+
+ gridView = inflater.inflate(R.layout.profile_achievement_item, null);
+
+
+ TextView counterText = (TextView) gridView.findViewById(R.id.achievement_text);
+ SimpleDraweeView draweeView = (SimpleDraweeView) gridView.findViewById(R.id.achievement_drawee);
+
+ Achievement achiev = achievements[position];
+
+ draweeView.setController(Fresco.newDraweeControllerBuilder()
+ .setUri(AvatarView.IMAGE_URI_ROOT + achiev.icon.toLowerCase() + ".png")
+ .setControllerListener(new BaseControllerListener() {
+ @Override
+ public void onFailure(String id, Throwable throwable) {
+ Log.e("Achievemnt", "Couldn't load "+achiev.icon.toLowerCase());
+ }
+ })
+ .build());
+
+
+ return gridView;
+ }
+
+ @Override
+ public int getCount() {
+ return achievements.length;
+ }
+
+ @Override
+ public Object getItem(int position) {
+ return null;
+ }
+
+ @Override
+ public long getItemId(int position) {
+ return 0;
+ }
+
+ static class ViewHolder {
+ TextView counterText;
+ SimpleDraweeView draweeView;
+ }
+}
\ No newline at end of file
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/controls/StaticGridView.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/controls/StaticGridView.java
new file mode 100644
index 000000000..eb8b6870e
--- /dev/null
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/controls/StaticGridView.java
@@ -0,0 +1,26 @@
+package com.habitrpg.android.habitica.ui.controls;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.widget.GridView;
+
+public class StaticGridView extends GridView {
+
+ public StaticGridView(Context context) {
+ super(context);
+ }
+
+ public StaticGridView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public StaticGridView(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ }
+
+ @Override
+ public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(MEASURED_SIZE_MASK, MeasureSpec.AT_MOST));
+ getLayoutParams().height = getMeasuredHeight();
+ }
+}
\ No newline at end of file
diff --git a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/api/ApiService.java b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/api/ApiService.java
index cac2d2383..7d8fbe887 100644
--- a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/api/ApiService.java
+++ b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/api/ApiService.java
@@ -1,5 +1,6 @@
package com.magicmicky.habitrpgwrapper.lib.api;
+import com.magicmicky.habitrpgwrapper.lib.models.Achievement;
import com.magicmicky.habitrpgwrapper.lib.models.ChatMessage;
import com.magicmicky.habitrpgwrapper.lib.models.ContentResult;
import com.magicmicky.habitrpgwrapper.lib.models.Group;
@@ -239,6 +240,9 @@ public interface ApiService {
@GET("members/{mid}")
Observable GetMember(@Path("mid") String memberId);
+ @GET("members/{mid}/achievements")
+ Observable> GetMemberAchievements(@Path("mid") String memberId);
+
@POST("members/send-private-message")
Observable postPrivateMessage(@Body HashMap messageDetails);
diff --git a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/Achievement.java b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/Achievement.java
new file mode 100644
index 000000000..d177c94bd
--- /dev/null
+++ b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/Achievement.java
@@ -0,0 +1,13 @@
+package com.magicmicky.habitrpgwrapper.lib.models;
+
+public class Achievement {
+ public String type;
+ public String title;
+ public String text;
+ public String icon;
+ public String category;
+ public String key;
+ public String value;
+ public boolean earned;
+ public int index;
+}