Display skills

This commit is contained in:
Phillip Thelen 2015-11-25 18:47:56 +01:00
parent 116020171e
commit 2d2e8ad9ab
15 changed files with 378 additions and 13 deletions

View file

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.RecyclerView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbarSize="3dp"
android:scrollbarThumbVertical="@color/md_grey_500"
android:scrollbars="vertical" />

View file

@ -0,0 +1,38 @@
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="5dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="8dp">
<LinearLayout
android:orientation="vertical"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:id="@+id/skill_text" />
<TextView
android:id="@+id/skill_notes"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/price_button"
android:background="@color/brand_100"
android:textColor="@android:color/white" />
</LinearLayout>
</android.support.v7.widget.CardView>

View file

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="sidebar.tasks">Tasks</string>
<string name="sidebar.skills">Skills</string>
<string name="sidebar.section.social">Social</string>
<string name="sidebar.tavern">Tavern</string>
<string name="sidebar.party">Party</string>

View file

@ -177,4 +177,6 @@
<string name="filter">Filter</string>
<string name="profile_image">Profile Image</string>
<string name="mana_price_button" formatted="false">%d MP</string>
</resources>

View file

@ -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();

View file

@ -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<T extends Object> {
void GotObject(T obj);

View file

@ -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;
}

View file

@ -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<ContentResult>() {
@Override
public void success(ContentResult contentResult, Response response) {
}
@Override
public void failure(RetrofitError error) {
}
});
}
@Override

View file

@ -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;

View file

@ -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<SkillsRecyclerViewAdapter.SkillViewHolder> {
private List<Skill> skillList;
public void setSkillList(List<Skill> 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));
}
}
}

View file

@ -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<Skill> 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);
}
}

View file

@ -15,7 +15,8 @@ public class ContentResult {
public ContentGear gear;
public HashMap<String, QuestContent> quests;
public SkillList spells;
}

View file

@ -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;
}

View file

@ -0,0 +1,10 @@
package com.magicmicky.habitrpgwrapper.lib.models;
import java.util.HashMap;
/**
* Created by viirus on 25/11/15.
*/
public class SkillList {
}

View file

@ -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<SkillList> {
@Override
public SkillList deserialize(JsonElement json, Type type,
JsonDeserializationContext context) throws JsonParseException {
JsonObject object = json.getAsJsonObject();
List<Skill> skills = new ArrayList<Skill>();
for (Map.Entry<String,JsonElement> classEntry : object.entrySet()) {
String classname = classEntry.getKey();
JsonObject classObject = classEntry.getValue().getAsJsonObject();
if (classname.equals("special")) {
continue;
}
for (Map.Entry<String,JsonElement> 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;
}
}