From 6840009e934e077eb9e37930c674f05416d2696a Mon Sep 17 00:00:00 2001 From: Negue Date: Tue, 6 Sep 2016 21:33:17 +0200 Subject: [PATCH 001/497] first implementation of achievements as grid (auto break newline) --- Habitica/res/layout/activity_full_profile.xml | 34 ++++++++ .../res/layout/profile_achievement_group.xml | 24 ++++++ .../res/layout/profile_achievement_item.xml | 24 ++++++ Habitica/res/values/strings.profile.xml | 2 + .../ui/activities/FullProfileActivity.java | 79 +++++++++++++++++++ .../ui/adapter/social/AchievementAdapter.java | 79 +++++++++++++++++++ .../habitica/ui/controls/StaticGridView.java | 26 ++++++ .../habitrpgwrapper/lib/api/ApiService.java | 4 + .../lib/models/Achievement.java | 13 +++ 9 files changed, 285 insertions(+) create mode 100644 Habitica/res/layout/profile_achievement_group.xml create mode 100644 Habitica/res/layout/profile_achievement_item.xml create mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/AchievementAdapter.java create mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/ui/controls/StaticGridView.java create mode 100644 Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/Achievement.java 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; +} From 85d0ac004ddabd457d6760e7aaf23346dedc4dcc Mon Sep 17 00:00:00 2001 From: Negue Date: Thu, 8 Sep 2016 17:22:59 +0200 Subject: [PATCH 002/497] update to new api-result, list achievements in 3 columns, show achievement dialog --- Habitica/res/layout/activity_full_profile.xml | 10 +- .../res/layout/dialog_achievement_details.xml | 34 +++++ .../layout/profile_achievement_category.xml | 22 +++ .../res/layout/profile_achievement_group.xml | 24 --- .../res/layout/profile_achievement_item.xml | 21 +-- .../ui/activities/FullProfileActivity.java | 69 +++++---- .../ui/adapter/social/AchievementAdapter.java | 143 +++++++++++++----- .../habitrpgwrapper/lib/api/ApiService.java | 5 +- .../lib/models/Achievement.java | 1 + .../lib/models/AchievementGroup.java | 8 + .../lib/models/AchievementResult.java | 7 + 11 files changed, 229 insertions(+), 115 deletions(-) create mode 100644 Habitica/res/layout/dialog_achievement_details.xml create mode 100644 Habitica/res/layout/profile_achievement_category.xml delete mode 100644 Habitica/res/layout/profile_achievement_group.xml create mode 100644 Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/AchievementGroup.java create mode 100644 Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/AchievementResult.java diff --git a/Habitica/res/layout/activity_full_profile.xml b/Habitica/res/layout/activity_full_profile.xml index 512b81816..ea4f17614 100644 --- a/Habitica/res/layout/activity_full_profile.xml +++ b/Habitica/res/layout/activity_full_profile.xml @@ -377,11 +377,13 @@ android:layout_height="wrap_content" android:indeterminate="true" /> - + android:layout_height="match_parent" + android:scrollbarSize="3dp" + android:scrollbarThumbVertical="@color/md_grey_500" + android:scrollbars="vertical" /> diff --git a/Habitica/res/layout/dialog_achievement_details.xml b/Habitica/res/layout/dialog_achievement_details.xml new file mode 100644 index 000000000..a10015933 --- /dev/null +++ b/Habitica/res/layout/dialog_achievement_details.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/Habitica/res/layout/profile_achievement_category.xml b/Habitica/res/layout/profile_achievement_category.xml new file mode 100644 index 000000000..98e903996 --- /dev/null +++ b/Habitica/res/layout/profile_achievement_category.xml @@ -0,0 +1,22 @@ + + + + + +