diff --git a/Habitica/res/layout/fragment_skills.xml b/Habitica/res/layout/fragment_skills.xml
new file mode 100644
index 000000000..53070fad9
--- /dev/null
+++ b/Habitica/res/layout/fragment_skills.xml
@@ -0,0 +1,10 @@
+
+
diff --git a/Habitica/res/layout/skill_list_item.xml b/Habitica/res/layout/skill_list_item.xml
new file mode 100644
index 000000000..f1ac42441
--- /dev/null
+++ b/Habitica/res/layout/skill_list_item.xml
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Habitica/res/values/strings.sidebar.xml b/Habitica/res/values/strings.sidebar.xml
index 9fe7add6d..7de63c092 100644
--- a/Habitica/res/values/strings.sidebar.xml
+++ b/Habitica/res/values/strings.sidebar.xml
@@ -1,6 +1,7 @@
Tasks
+ Skills
Social
Tavern
Party
diff --git a/Habitica/res/values/strings.xml b/Habitica/res/values/strings.xml
index df590c4c1..095745a42 100644
--- a/Habitica/res/values/strings.xml
+++ b/Habitica/res/values/strings.xml
@@ -177,4 +177,6 @@
Filter
Profile Image
+
+ %d MP
\ No newline at end of file
diff --git a/Habitica/src/com/habitrpg/android/habitica/APIHelper.java b/Habitica/src/com/habitrpg/android/habitica/APIHelper.java
index 3a06507e0..e2f72141f 100644
--- a/Habitica/src/com/habitrpg/android/habitica/APIHelper.java
+++ b/Habitica/src/com/habitrpg/android/habitica/APIHelper.java
@@ -4,7 +4,6 @@ import android.app.Activity;
import android.content.Context;
import android.content.DialogInterface;
import android.support.v7.app.AlertDialog;
-import android.util.Log;
import android.view.View;
import com.google.gson.ExclusionStrategy;
@@ -22,7 +21,7 @@ import com.habitrpg.android.habitica.callbacks.TaskScoringCallback;
import com.magicmicky.habitrpgwrapper.lib.api.ApiService;
import com.magicmicky.habitrpgwrapper.lib.api.Server;
import com.magicmicky.habitrpgwrapper.lib.api.TypeAdapter.TagsAdapter;
-import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser;
+import com.magicmicky.habitrpgwrapper.lib.models.SkillList;
import com.magicmicky.habitrpgwrapper.lib.models.TaskDirection;
import com.magicmicky.habitrpgwrapper.lib.models.UserAuth;
import com.magicmicky.habitrpgwrapper.lib.models.UserAuthResponse;
@@ -30,6 +29,7 @@ import com.magicmicky.habitrpgwrapper.lib.models.UserAuthSocial;
import com.magicmicky.habitrpgwrapper.lib.models.UserAuthSocialTokens;
import com.magicmicky.habitrpgwrapper.lib.models.tasks.Task;
import com.magicmicky.habitrpgwrapper.lib.models.tasks.TaskTag;
+import com.magicmicky.habitrpgwrapper.lib.utils.SkillDeserializer;
import com.raizlabs.android.dbflow.structure.ModelAdapter;
import java.io.IOException;
@@ -87,6 +87,7 @@ public class APIHelper implements ErrorHandler, Profiler {
.registerTypeAdapter(taskTagClassListType, new TagsAdapter())
.registerTypeAdapter(Boolean.class, booleanAsIntAdapter)
.registerTypeAdapter(boolean.class, booleanAsIntAdapter)
+ .registerTypeAdapter(SkillList.class, new SkillDeserializer())
.setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
.create();
diff --git a/Habitica/src/com/habitrpg/android/habitica/ContentCache.java b/Habitica/src/com/habitrpg/android/habitica/ContentCache.java
index 82f5b0b27..1deea9435 100644
--- a/Habitica/src/com/habitrpg/android/habitica/ContentCache.java
+++ b/Habitica/src/com/habitrpg/android/habitica/ContentCache.java
@@ -17,9 +17,7 @@ import retrofit.Callback;
import retrofit.RetrofitError;
import retrofit.client.Response;
-/**
- * Created by Negue on 29.09.2015.
- */
+
public class ContentCache {
public interface GotContentEntryCallback {
void GotObject(T obj);
diff --git a/Habitica/src/com/habitrpg/android/habitica/HabitDatabase.java b/Habitica/src/com/habitrpg/android/habitica/HabitDatabase.java
index 19b1af154..659c75708 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 = 2;
+ public static final int VERSION = 3;
}
diff --git a/Habitica/src/com/habitrpg/android/habitica/MainActivity.java b/Habitica/src/com/habitrpg/android/habitica/MainActivity.java
index 816ee0a51..28d8a0b3a 100644
--- a/Habitica/src/com/habitrpg/android/habitica/MainActivity.java
+++ b/Habitica/src/com/habitrpg/android/habitica/MainActivity.java
@@ -20,7 +20,10 @@ import com.habitrpg.android.habitica.ui.fragments.BaseFragment;
import com.habitrpg.android.habitica.userpicture.UserPicture;
import com.habitrpg.android.habitica.userpicture.UserPictureRunnable;
import com.instabug.wrapper.support.activity.InstabugAppCompatActivity;
+import com.magicmicky.habitrpgwrapper.lib.models.ContentResult;
import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser;
+import com.magicmicky.habitrpgwrapper.lib.models.QuestContent;
+import com.magicmicky.habitrpgwrapper.lib.models.tasks.ItemData;
import com.mikepenz.materialdrawer.AccountHeader;
import com.mikepenz.materialdrawer.Drawer;
import com.mikepenz.materialdrawer.model.interfaces.IProfile;
@@ -32,9 +35,14 @@ import com.raizlabs.android.dbflow.sql.language.Select;
import com.raizlabs.android.dbflow.structure.BaseModel;
import com.raizlabs.android.dbflow.structure.Model;
+import java.util.Collection;
+
import butterknife.ButterKnife;
import butterknife.InjectView;
import io.fabric.sdk.android.Fabric;
+import retrofit.Callback;
+import retrofit.RetrofitError;
+import retrofit.client.Response;
/**
* Created by admin on 18/11/15.
@@ -111,6 +119,19 @@ public class MainActivity extends InstabugAppCompatActivity implements HabitRPGU
.build();
drawer.setSelectionAtPosition(1);
+
+ mAPIHelper.apiService.getContent(new Callback() {
+ @Override
+ public void success(ContentResult contentResult, Response response) {
+
+ }
+
+
+ @Override
+ public void failure(RetrofitError error) {
+
+ }
+ });
}
@Override
diff --git a/Habitica/src/com/habitrpg/android/habitica/ui/MainDrawerBuilder.java b/Habitica/src/com/habitrpg/android/habitica/ui/MainDrawerBuilder.java
index 3da7ebb51..9ca90a33e 100644
--- a/Habitica/src/com/habitrpg/android/habitica/ui/MainDrawerBuilder.java
+++ b/Habitica/src/com/habitrpg/android/habitica/ui/MainDrawerBuilder.java
@@ -11,6 +11,7 @@ import com.habitrpg.android.habitica.MainActivity;
import com.habitrpg.android.habitica.ui.fragments.GemsPurchaseFragment;
import com.habitrpg.android.habitica.ui.fragments.PartyFragment;
import com.habitrpg.android.habitica.R;
+import com.habitrpg.android.habitica.ui.fragments.SkillsFragment;
import com.habitrpg.android.habitica.ui.fragments.TasksFragment;
import com.habitrpg.android.habitica.ui.fragments.TavernFragment;
import com.habitrpg.android.habitica.prefs.PrefsActivity;
@@ -33,11 +34,12 @@ public class MainDrawerBuilder {
// Change the identificationIDs to the position IDs so that its easier to set the selected entry
static final int SIDEBAR_TASKS = 0;
- static final int SIDEBAR_TAVERN = 2;
- static final int SIDEBAR_PARTY = 3;
- static final int SIDEBAR_PURCHASE = 4;
- static final int SIDEBAR_SETTINGS = 6;
- static final int SIDEBAR_ABOUT = 7;
+ static final int SIDEBAR_SKILLS = 1;
+ static final int SIDEBAR_TAVERN = 3;
+ static final int SIDEBAR_PARTY = 4;
+ static final int SIDEBAR_PURCHASE = 5;
+ static final int SIDEBAR_SETTINGS = 7;
+ static final int SIDEBAR_ABOUT = 8;
@@ -71,11 +73,11 @@ public class MainDrawerBuilder {
.withAccountHeader(accountHeader)
.addDrawerItems(
new PrimaryDrawerItem().withName(activity.getString(R.string.sidebar_tasks)).withIdentifier(SIDEBAR_TASKS),
+ new PrimaryDrawerItem().withName(activity.getString(R.string.sidebar_skills)).withIdentifier(SIDEBAR_SKILLS),
new SectionDrawerItem().withName(activity.getString(R.string.sidebar_section_social)),
new PrimaryDrawerItem().withName(activity.getString(R.string.sidebar_tavern)).withIdentifier(SIDEBAR_TAVERN),
new PrimaryDrawerItem().withName(activity.getString(R.string.sidebar_party)).withIdentifier(SIDEBAR_PARTY),
- new PrimaryDrawerItem().withName(activity.getString(R.string.sidebar_purchaseGems)).withIdentifier(SIDEBAR_PURCHASE),
/*new PrimaryDrawerItem().withName(activity.getString(R.string.sidebar_guilds)),
new PrimaryDrawerItem().withName(activity.getString(R.string.sidebar_challenges)),
@@ -83,6 +85,7 @@ public class MainDrawerBuilder {
new PrimaryDrawerItem().withName(activity.getString(R.string.sidebar_avatar)),
new PrimaryDrawerItem().withName(activity.getString(R.string.sidebar_equipment)),
new PrimaryDrawerItem().withName(activity.getString(R.string.sidebar_stable)),*/
+ new PrimaryDrawerItem().withName(activity.getString(R.string.sidebar_purchaseGems)).withIdentifier(SIDEBAR_PURCHASE),
new DividerDrawerItem(),
//new SecondaryDrawerItem().withName(activity.getString(R.string.sidebar_news)),
@@ -102,6 +105,10 @@ public class MainDrawerBuilder {
fragment = new TasksFragment();
break;
}
+ case SIDEBAR_SKILLS: {
+ fragment = new SkillsFragment();
+ break;
+ }
case SIDEBAR_PARTY: {
fragment = new PartyFragment();
break;
diff --git a/Habitica/src/com/habitrpg/android/habitica/ui/adapter/SkillsRecyclerViewAdapter.java b/Habitica/src/com/habitrpg/android/habitica/ui/adapter/SkillsRecyclerViewAdapter.java
new file mode 100644
index 000000000..80d1d341d
--- /dev/null
+++ b/Habitica/src/com/habitrpg/android/habitica/ui/adapter/SkillsRecyclerViewAdapter.java
@@ -0,0 +1,107 @@
+package com.habitrpg.android.habitica.ui.adapter;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.databinding.DataBindingUtil;
+import android.support.v7.widget.AppCompatEditText;
+import android.support.v7.widget.PopupMenu;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import com.habitrpg.android.habitica.R;
+import com.habitrpg.android.habitica.databinding.ValueBarBinding;
+import com.habitrpg.android.habitica.events.commands.CopyChatAsTodoCommand;
+import com.habitrpg.android.habitica.events.commands.DeleteChatMessageCommand;
+import com.habitrpg.android.habitica.events.commands.FlagChatMessageCommand;
+import com.habitrpg.android.habitica.events.commands.OpenNewPMActivityCommand;
+import com.habitrpg.android.habitica.events.commands.SendNewGroupMessageCommand;
+import com.habitrpg.android.habitica.events.commands.ToggleInnCommand;
+import com.habitrpg.android.habitica.events.commands.ToggleLikeMessageCommand;
+import com.habitrpg.android.habitica.ui.AvatarWithBarsViewModel;
+import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils;
+import com.habitrpg.android.habitica.ui.helpers.ViewHelper;
+import com.habitrpg.android.habitica.userpicture.UserPicture;
+import com.magicmicky.habitrpgwrapper.lib.models.ChatMessage;
+import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser;
+import com.magicmicky.habitrpgwrapper.lib.models.Skill;
+import com.mikepenz.fontawesome_typeface_library.FontAwesome;
+import com.mikepenz.iconics.Iconics;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import butterknife.ButterKnife;
+import butterknife.InjectView;
+import butterknife.Optional;
+import de.greenrobot.event.EventBus;
+
+/**
+ * Created by viirus on 25/11/15.
+ */
+public class SkillsRecyclerViewAdapter extends RecyclerView.Adapter {
+
+
+ private List skillList;
+
+ public void setSkillList(List skillList) {
+ this.skillList = skillList;
+ this.notifyDataSetChanged();
+ }
+
+
+ @Override
+ public SkillViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+
+ View view = LayoutInflater.from(parent.getContext())
+ .inflate(R.layout.skill_list_item, parent, false);
+
+ return new SkillViewHolder(view);
+ }
+
+ @Override
+ public void onBindViewHolder(SkillViewHolder holder, int position) {
+ holder.bind(skillList.get(position));
+ }
+
+ @Override
+ public int getItemCount() {
+ return skillList == null ? 0 : skillList.size();
+ }
+
+ class SkillViewHolder extends RecyclerView.ViewHolder {
+
+ @InjectView(R.id.skill_text)
+ TextView skillNameTextView;
+
+ @InjectView(R.id.skill_notes)
+ TextView skillNotesTextView;
+
+ @InjectView(R.id.price_button)
+ Button priceButton;
+
+ Resources resources;
+
+ public SkillViewHolder(View itemView) {
+ super(itemView);
+
+ ButterKnife.inject(this, itemView);
+
+ resources = itemView.getResources();
+ }
+
+ public void bind(Skill skill) {
+ skillNameTextView.setText(skill.text);
+ skillNotesTextView.setText(skill.notes);
+ priceButton.setText(String.format(resources.getString(R.string.mana_price_button), skill.mana));
+ }
+ }
+}
diff --git a/Habitica/src/com/habitrpg/android/habitica/ui/fragments/SkillsFragment.java b/Habitica/src/com/habitrpg/android/habitica/ui/fragments/SkillsFragment.java
new file mode 100644
index 000000000..cbf86833d
--- /dev/null
+++ b/Habitica/src/com/habitrpg/android/habitica/ui/fragments/SkillsFragment.java
@@ -0,0 +1,86 @@
+package com.habitrpg.android.habitica.ui.fragments;
+
+import android.content.Context;
+import android.graphics.Color;
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.support.design.widget.Snackbar;
+import android.support.v4.widget.SwipeRefreshLayout;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.habitrpg.android.habitica.APIHelper;
+import com.habitrpg.android.habitica.R;
+import com.habitrpg.android.habitica.events.ToggledInnStateEvent;
+import com.habitrpg.android.habitica.events.commands.DeleteChatMessageCommand;
+import com.habitrpg.android.habitica.events.commands.FlagChatMessageCommand;
+import com.habitrpg.android.habitica.events.commands.SendNewGroupMessageCommand;
+import com.habitrpg.android.habitica.events.commands.ToggleInnCommand;
+import com.habitrpg.android.habitica.events.commands.ToggleLikeMessageCommand;
+import com.habitrpg.android.habitica.ui.adapter.ChatRecyclerViewAdapter;
+import com.habitrpg.android.habitica.ui.adapter.SkillsRecyclerViewAdapter;
+import com.magicmicky.habitrpgwrapper.lib.models.ChatMessage;
+import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser;
+import com.magicmicky.habitrpgwrapper.lib.models.PostChatMessageResult;
+import com.magicmicky.habitrpgwrapper.lib.models.Skill;
+import com.raizlabs.android.dbflow.sql.builder.Condition;
+import com.raizlabs.android.dbflow.sql.language.Select;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import butterknife.ButterKnife;
+import butterknife.InjectView;
+import de.greenrobot.event.EventBus;
+import retrofit.Callback;
+import retrofit.RetrofitError;
+import retrofit.client.Response;
+
+/**
+ * Created by viirus on 25/11/15.
+ */
+public class SkillsFragment extends BaseFragment {
+
+ private View view;
+
+ @Nullable
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ if (view == null)
+ view = inflater.inflate(R.layout.fragment_skills, container, false);
+
+ adapter = new SkillsRecyclerViewAdapter();
+
+ loadSkills();
+
+ return view;
+ }
+
+ @InjectView(R.id.recyclerView)
+ RecyclerView mRecyclerView;
+
+ SkillsRecyclerViewAdapter adapter;
+
+ @Override
+ public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
+
+ ButterKnife.inject(this, view);
+
+ mRecyclerView.setLayoutManager(new LinearLayoutManager(activity));
+ mRecyclerView.setAdapter(adapter);
+ }
+
+ public void loadSkills() {
+ List skills = new Select()
+ .from(Skill.class)
+ .where(Condition.column("habitClass").eq(user.getStats().get_class()))
+ .and(Condition.column("lvl").lessThanOrEq(user.getStats().getLvl()))
+ .queryList();
+ adapter.setSkillList(skills);
+ }
+
+}
diff --git a/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/ContentResult.java b/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/ContentResult.java
index 9ea134919..b7cfa6d34 100644
--- a/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/ContentResult.java
+++ b/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/ContentResult.java
@@ -15,7 +15,8 @@ public class ContentResult {
public ContentGear gear;
-
public HashMap quests;
+
+ public SkillList spells;
}
diff --git a/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/Skill.java b/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/Skill.java
new file mode 100644
index 000000000..fe115630d
--- /dev/null
+++ b/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/Skill.java
@@ -0,0 +1,24 @@
+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, allFields = true)
+public class Skill extends BaseModel {
+
+ @Column
+ @PrimaryKey()
+ public String key;
+
+ @Column
+ public String text, notes, target, habitClass;
+
+ @Column
+ public Integer mana, lvl;
+
+
+}
diff --git a/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/SkillList.java b/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/SkillList.java
new file mode 100644
index 000000000..c8579687d
--- /dev/null
+++ b/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/SkillList.java
@@ -0,0 +1,10 @@
+package com.magicmicky.habitrpgwrapper.lib.models;
+
+import java.util.HashMap;
+
+/**
+ * Created by viirus on 25/11/15.
+ */
+public class SkillList {
+
+}
diff --git a/Habitica/src/com/magicmicky/habitrpgwrapper/lib/utils/SkillDeserializer.java b/Habitica/src/com/magicmicky/habitrpgwrapper/lib/utils/SkillDeserializer.java
new file mode 100644
index 000000000..2748451d1
--- /dev/null
+++ b/Habitica/src/com/magicmicky/habitrpgwrapper/lib/utils/SkillDeserializer.java
@@ -0,0 +1,59 @@
+package com.magicmicky.habitrpgwrapper.lib.utils;
+
+import com.google.gson.JsonDeserializationContext;
+import com.google.gson.JsonDeserializer;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParseException;
+import com.magicmicky.habitrpgwrapper.lib.models.ContentResult;
+import com.magicmicky.habitrpgwrapper.lib.models.Skill;
+import com.magicmicky.habitrpgwrapper.lib.models.SkillList;
+import com.raizlabs.android.dbflow.runtime.TransactionManager;
+import com.raizlabs.android.dbflow.runtime.transaction.process.ProcessModelInfo;
+import com.raizlabs.android.dbflow.runtime.transaction.process.SaveModelTransaction;
+
+import java.lang.reflect.Type;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Created by viirus on 25/11/15.
+ */
+public class SkillDeserializer
+ implements JsonDeserializer {
+
+ @Override
+ public SkillList deserialize(JsonElement json, Type type,
+ JsonDeserializationContext context) throws JsonParseException {
+
+ JsonObject object = json.getAsJsonObject();
+ List skills = new ArrayList();
+ for (Map.Entry classEntry : object.entrySet()) {
+ String classname = classEntry.getKey();
+ JsonObject classObject = classEntry.getValue().getAsJsonObject();
+ if (classname.equals("special")) {
+ continue;
+ }
+ for (Map.Entry skillEntry : classObject.entrySet()) {
+ JsonObject skillObject = skillEntry.getValue().getAsJsonObject();
+ Skill skill = new Skill();
+ skill.key = skillObject.get("key").getAsString();
+ skill.text = skillObject.get("text").getAsString();
+ skill.notes = skillObject.get("notes").getAsString();
+ skill.key = skillObject.get("key").getAsString();
+ skill.target = skillObject.get("target").getAsString();
+ skill.habitClass = classname;
+ skill.mana = skillObject.get("mana").getAsInt();
+ skill.lvl = skillObject.get("lvl").getAsInt();
+ skills.add(skill);
+ }
+ }
+
+ TransactionManager.getInstance().addTransaction(new SaveModelTransaction<>(ProcessModelInfo.withModels(skills)));
+
+ SkillList skillList = new SkillList();
+
+ return skillList;
+ }
+}
\ No newline at end of file