diff --git a/Habitica/Habitica.iml b/Habitica/Habitica.iml
index 27c410bec..d02415d8c 100644
--- a/Habitica/Habitica.iml
+++ b/Habitica/Habitica.iml
@@ -111,8 +111,8 @@
-
+
@@ -129,11 +129,11 @@
-
+
-
+
diff --git a/Habitica/res/layout/activity_task_form.xml b/Habitica/res/layout/activity_task_form.xml
index cefe26349..81463559e 100644
--- a/Habitica/res/layout/activity_task_form.xml
+++ b/Habitica/res/layout/activity_task_form.xml
@@ -19,13 +19,6 @@
android:layout_marginTop="@dimen/abc_action_bar_content_inset_material"
android:layout_marginBottom="@dimen/abc_action_bar_content_inset_material">
-
-
-
+
+
-
-
-
-
-
-
-
-
-
+ android:layout_height="match_parent">
+
+ android:text='@{String.format("%.0f", reward.value)}'
+ app:backgroundColor="@{reward.getLightTaskColor}" />
+ android:visibility='@{reward.specialTag == "item" ? View.VISIBLE : View.GONE}'
+ bind:imageName='@{"shop_"+reward.id}'/>
+
+
+
+
+
+
+
+
-
+
-
\ No newline at end of file
diff --git a/Habitica/src/com/habitrpg/android/habitica/ContentCache.java b/Habitica/src/com/habitrpg/android/habitica/ContentCache.java
index 59bd15ad9..5b2c7a216 100644
--- a/Habitica/src/com/habitrpg/android/habitica/ContentCache.java
+++ b/Habitica/src/com/habitrpg/android/habitica/ContentCache.java
@@ -4,8 +4,14 @@ import com.magicmicky.habitrpgwrapper.lib.api.ApiService;
import com.magicmicky.habitrpgwrapper.lib.models.ContentResult;
import com.magicmicky.habitrpgwrapper.lib.models.QuestBoss;
import com.magicmicky.habitrpgwrapper.lib.models.QuestContent;
+import com.magicmicky.habitrpgwrapper.lib.models.tasks.ItemData;
import com.raizlabs.android.dbflow.sql.builder.Condition;
import com.raizlabs.android.dbflow.sql.language.Select;
+import com.raizlabs.android.dbflow.sql.language.Where;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
import retrofit.Callback;
import retrofit.RetrofitError;
@@ -15,58 +21,179 @@ import retrofit.client.Response;
* Created by Negue on 29.09.2015.
*/
public class ContentCache {
- public interface QuestContentCallback{
+ public interface GotContentEntryCallback {
+ void GotObject(T obj);
+ }
+
+ public interface QuestContentCallback {
void GotQuest(QuestContent content);
}
private ApiService apiService;
- public ContentCache(ApiService apiService){
+ public ContentCache(ApiService apiService) {
this.apiService = apiService;
}
- public void GetQuestContent(final String key, final QuestContentCallback cb){
+ public void GetQuestContent(final String key, final QuestContentCallback cb) {
final QuestContent quest = new Select().from(QuestContent.class).where(Condition.column("key").eq(key)).querySingle();
- if(quest != null){
+ if (quest != null) {
QuestBoss boss = new Select().from(QuestBoss.class).where(Condition.column("key").eq(key)).querySingle();
quest.boss = boss;
cb.GotQuest(quest);
- }
- else
- {
- // load from api and save to db
+ } else {
- apiService.getContent(new Callback() {
+ getContentAndSearchFor("quest", key, new GotContentEntryCallback() {
@Override
- public void success(ContentResult contentResult, Response response) {
-
- QuestContent searchedQuest = null;
-
- for (QuestContent quest : contentResult.quests.values()) {
- quest.save();
-
- if(quest.boss != null) {
- quest.boss.key = quest.key;
- quest.boss.save();
- }
-
- if(quest.key.equals(key)){
- searchedQuest = quest;
- }
- }
-
- cb.GotQuest(searchedQuest);
- }
-
- @Override
- public void failure(RetrofitError error) {
-
+ public void GotObject(QuestContent obj) {
+ cb.GotQuest(obj);
}
});
}
}
+
+ public void GetItemData(final String key, final GotContentEntryCallback gotEntry) {
+ final ItemData itemData = new Select().from(ItemData.class).where(Condition.column("key").eq(key)).querySingle();
+
+ if (itemData != null) {
+ gotEntry.GotObject(itemData);
+ } else {
+ getContentAndSearchFor("item", key, gotEntry);
+ }
+ }
+
+ public void GetItemDataList(final List keysToSearch, GotContentEntryCallback> gotEntries) {
+
+ Condition.In keyCondition = Condition.column("key").in("potion");
+
+ for (String item : keysToSearch) {
+ keyCondition = keyCondition.and(item);
+ }
+
+
+ Where query = new Select().from(ItemData.class).where(keyCondition);
+
+ String queryString = query.getQuery();
+ List items = query.queryList();
+
+
+ if (items != null && items.size() != 0) {
+ gotEntries.GotObject(items);
+ } else {
+ getContentAndSearchForList("item", keysToSearch, gotEntries);
+ }
+ }
+
+ private void getContentAndSearchFor(final String typeOfSearch, final String searchKey, final GotContentEntryCallback gotEntry) {
+ apiService.getContent(new Callback() {
+ @Override
+ public void success(ContentResult contentResult, Response response) {
+ switch (typeOfSearch) {
+ case "quest": {
+ Collection questList = contentResult.quests.values();
+
+ for (QuestContent quest : questList) {
+ if (quest.key == searchKey) {
+ gotEntry.GotObject((T) quest);
+ }
+ }
+
+ break;
+ }
+ case "item": {
+ T searchedItem = null;
+
+ if (searchKey == "potion") {
+ searchedItem = (T) contentResult.potion;
+ } else if (searchKey == "armoire") {
+ searchedItem = (T) contentResult.armoire;
+ } else {
+ Collection itemList = contentResult.gear.flat.values();
+
+ for (ItemData item : itemList) {
+ if (item.key == searchKey) {
+ searchedItem = (T) item;
+ }
+ }
+ }
+
+ gotEntry.GotObject((T) searchedItem);
+
+ break;
+ }
+ }
+
+ saveContentResultToDb(contentResult);
+ }
+
+
+ @Override
+ public void failure(RetrofitError error) {
+
+ }
+ });
+ }
+
+ private void getContentAndSearchForList(final String typeOfSearch, final List searchKeys, final GotContentEntryCallback> gotEntry) {
+ apiService.getContent(new Callback() {
+ @Override
+ public void success(ContentResult contentResult, Response response) {
+
+ switch (typeOfSearch) {
+ case "item": {
+ List resultList = new ArrayList();
+
+ List itemList = new ArrayList(contentResult.gear.flat.values());
+ itemList.add(contentResult.potion);
+ itemList.add(contentResult.armoire);
+
+ for (ItemData item : itemList) {
+ if (searchKeys.contains(item.key)) {
+ resultList.add((T) item);
+ }
+ }
+
+ gotEntry.GotObject(resultList);
+
+ break;
+ }
+ }
+
+ saveContentResultToDb(contentResult);
+ }
+
+
+ @Override
+ public void failure(RetrofitError error) {
+
+ }
+ });
+ }
+
+
+ private void saveContentResultToDb(ContentResult contentResult) {
+ Collection questList = contentResult.quests.values();
+
+ for (QuestContent quest : questList) {
+ quest.save();
+
+ if (quest.boss != null) {
+ quest.boss.key = quest.key;
+ quest.boss.save();
+ }
+ }
+
+ contentResult.armoire.save();
+ contentResult.potion.save();
+
+ Collection itemList = contentResult.gear.flat.values();
+
+ for (ItemData item : itemList) {
+ item.save();
+ }
+ }
}
diff --git a/Habitica/src/com/habitrpg/android/habitica/MainActivity.java b/Habitica/src/com/habitrpg/android/habitica/MainActivity.java
index 1d8fb5038..60dd087eb 100644
--- a/Habitica/src/com/habitrpg/android/habitica/MainActivity.java
+++ b/Habitica/src/com/habitrpg/android/habitica/MainActivity.java
@@ -4,7 +4,6 @@ import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.support.design.widget.Snackbar;
-import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentPagerAdapter;
import android.util.Log;
@@ -34,6 +33,7 @@ import com.habitrpg.android.habitica.prefs.PrefsActivity;
import com.habitrpg.android.habitica.ui.EditTextDrawer;
import com.habitrpg.android.habitica.ui.MainDrawerBuilder;
import com.habitrpg.android.habitica.ui.adapter.HabitItemRecyclerViewAdapter;
+import com.habitrpg.android.habitica.ui.adapter.IReceiveNewEntries;
import com.habitrpg.android.habitica.ui.fragments.TaskRecyclerViewFragment;
import com.habitrpg.android.habitica.ui.helpers.Debounce;
import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser;
@@ -48,7 +48,7 @@ import com.mikepenz.materialdrawer.DrawerBuilder;
import com.mikepenz.materialdrawer.model.SectionDrawerItem;
import com.mikepenz.materialdrawer.model.SwitchDrawerItem;
import com.mikepenz.materialdrawer.model.interfaces.IDrawerItem;
-import com.mikepenz.materialdrawer.interfaces.OnCheckedChangeListener ;
+import com.mikepenz.materialdrawer.interfaces.OnCheckedChangeListener;
import com.raizlabs.android.dbflow.runtime.FlowContentObserver;
import com.raizlabs.android.dbflow.runtime.transaction.BaseTransaction;
import com.raizlabs.android.dbflow.runtime.transaction.TransactionListener;
@@ -61,7 +61,6 @@ import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import java.util.Objects;
import butterknife.InjectView;
import butterknife.OnClick;
@@ -72,7 +71,7 @@ import retrofit.client.Response;
public class MainActivity extends AvatarActivityBase implements HabitRPGUserCallback.OnUserReceived,
TaskScoringCallback.OnTaskScored, FlowContentObserver.OnSpecificModelStateChangedListener,
- Callback>, OnCheckedChangeListener {
+ OnCheckedChangeListener {
static final int TASK_CREATED_RESULT = 1;
static final int TASK_UPDATED_RESULT = 2;
@@ -89,6 +88,9 @@ public class MainActivity extends AvatarActivityBase implements HabitRPGUserCall
FlowContentObserver observer;
private TagsHelper tagsHelper;
+
+ private ContentCache contentCache;
+
@Override
protected int getLayoutRes() {
return R.layout.activity_main;
@@ -133,6 +135,8 @@ public class MainActivity extends AvatarActivityBase implements HabitRPGUserCall
this.mAPIHelper = new APIHelper(this, hostConfig);
mAPIHelper.retrieveUser(new HabitRPGUserCallback(this));
+
+ contentCache = new ContentCache(mAPIHelper.apiService);
}
SetUserData();
}
@@ -259,10 +263,7 @@ public class MainActivity extends AvatarActivityBase implements HabitRPGUserCall
return;
}
- mAPIHelper.updateTaskDirection(rewardKey, TaskDirection.down, new TaskScoringCallback(this, rewardKey));
-
- /*
- if (event.Reward instanceof RewardItem) {
+ if (event.Reward.specialTag == "item") {
if (rewardKey.equals("potion")) {
int currentHp = User.getStats().getHp().intValue();
int maxHp = User.getStats().getMaxHealth();
@@ -274,9 +275,9 @@ public class MainActivity extends AvatarActivityBase implements HabitRPGUserCall
}
mAPIHelper.apiService.buyItem(event.Reward.getId(), new Callback() {
+
@Override
public void success(Void aVoid, Response response) {
-
switch (rewardKey) {
case "potion":
double newHp = Math.min(User.getStats().getMaxHealth(), User.getStats().getHp() + 15);
@@ -284,6 +285,11 @@ public class MainActivity extends AvatarActivityBase implements HabitRPGUserCall
updateHeader();
+ break;
+ default:
+
+ // TODO Add bought item to the avatar
+
break;
}
@@ -292,13 +298,14 @@ public class MainActivity extends AvatarActivityBase implements HabitRPGUserCall
@Override
public void failure(RetrofitError error) {
-
showSnackbar("Buy Reward Error " + event.Reward.getText(), true);
}
});
} else {
// User created Rewards
- }*/
+
+ mAPIHelper.updateTaskDirection(rewardKey, TaskDirection.down, new TaskScoringCallback(this, rewardKey));
+ }
}
public void onEvent(final TaskSaveEvent event) {
@@ -384,7 +391,59 @@ public class MainActivity extends AvatarActivityBase implements HabitRPGUserCall
break;
case 3:
layoutOfType = R.layout.reward_item_card;
- fragment = TaskRecyclerViewFragment.newInstance(new HabitItemRecyclerViewAdapter(Task.TYPE_REWARD, MainActivity.this.tagsHelper, layoutOfType, HabitItemRecyclerViewAdapter.RewardViewHolder.class, MainActivity.this), Task.TYPE_REWARD);
+ HabitItemRecyclerViewAdapter adapter = new HabitItemRecyclerViewAdapter(Task.TYPE_REWARD, MainActivity.this.tagsHelper,
+ layoutOfType, HabitItemRecyclerViewAdapter.RewardViewHolder.class, MainActivity.this,
+ new HabitItemRecyclerViewAdapter.IAdditionalEntries() {
+ @Override
+ public void GetAdditionalEntries(final IReceiveNewEntries callBack) {
+
+ // request buyable gear
+ mAPIHelper.apiService.getInventoryBuyableGear(new Callback>() {
+ @Override
+ public void success(List itemDatas, Response response) {
+
+ // get itemdata list
+ ArrayList itemKeys = new ArrayList();
+ for (ItemData item : itemDatas) {
+ itemKeys.add(item.key);
+ }
+
+ contentCache.GetItemDataList(itemKeys, new ContentCache.GotContentEntryCallback>() {
+ @Override
+ public void GotObject(List obj) {
+ ArrayList buyableItems = new ArrayList();
+
+ for (ItemData item : obj) {
+ Task reward = new Task();
+ reward.text = item.text;
+ reward.notes = item.notes;
+ reward.value = item.value;
+ reward.setType("reward");
+ reward.specialTag = "item";
+ reward.setId(item.key);
+
+ buyableItems.add(reward);
+ }
+
+ callBack.GotAdditionalItems(buyableItems);
+
+ }
+ });
+
+
+ }
+
+ @Override
+ public void failure(RetrofitError error) {
+
+ }
+ });
+
+ }
+ });
+
+
+ fragment = TaskRecyclerViewFragment.newInstance(adapter, Task.TYPE_REWARD);
break;
default:
layoutOfType = R.layout.todo_item_card;
@@ -481,47 +540,6 @@ public class MainActivity extends AvatarActivityBase implements HabitRPGUserCall
}
-
- @Override
- public void success(List items, Response response) {
-
- // TODO Order Rewards
- // TODO add Gear Images
-
- Condition.In keyCondition = Condition.column("key").in("potion");
-
- for (ItemData item : items) {
- keyCondition = keyCondition.and(item.key);
- }
-
-/*
- ConditionQueryBuilder queryBuilder = new ConditionQueryBuilder(ItemData.class,
- keyCondition);
-
- List itemsFromDb = new Select().from(ItemData.class).where(queryBuilder).queryList();
-
- ArrayList rewardList = new ArrayList<>();
-
- for (ItemData item : itemsFromDb) {
- RewardItem reward = new RewardItem();
- reward.text = item.text;
- reward.notes = item.notes;
- reward.value = item.value;
- reward.setId(item.key);
-
- rewardList.add(reward);
- }
-
- GearRewards.clear();
- GearRewards.addAll(rewardList);
- */
- }
-
- @Override
- public void failure(RetrofitError error) {
-
- }
-
@Override
public void onTaskDataReceived(TaskDirectionData data) {
notifyUser(data.getExp(), data.getHp(), data.getGp(), data.getLvl(), data.getDelta());
@@ -534,6 +552,10 @@ public class MainActivity extends AvatarActivityBase implements HabitRPGUserCall
@Override
public void onModelStateChanged(Class extends Model> aClass, BaseModel.Action action, String s, String s1) {
+ if(aClass != HabitRPGUser.class)
+ return;
+
+
new Select().from(HabitRPGUser.class).where(Condition.column("id").eq(hostConfig.getUser())).async().querySingle(userTransactionListener);
Log.d("db", "received notif");
// SetUserData();
@@ -576,6 +598,7 @@ public class MainActivity extends AvatarActivityBase implements HabitRPGUserCall
);
}
}
+
/*
Updates concerned tags.
*/
@@ -583,17 +606,16 @@ public class MainActivity extends AvatarActivityBase implements HabitRPGUserCall
Log.d("tags", "Updating tags");
List filters = filterDrawer.getDrawerItems();
for (IDrawerItem filter : filters) {
- if(filter instanceof SwitchDrawerItem) {
+ if (filter instanceof SwitchDrawerItem) {
SwitchDrawerItem currentfilter = (SwitchDrawerItem) filter;
Log.v("tags", "Tag " + currentfilter.getName());
String tagId = ((Tag) currentfilter.getTag()).getId();
- for(TaskTag tag : tags) {
+ for (TaskTag tag : tags) {
Tag currentTag = tag.getTag();
-
- if(tagId != null && currentTag!=null && tagId.equals(currentTag.getId())) {
- currentfilter.withDescription(""+(currentTag.getTasks().size()+1));
+ if (tagId != null && currentTag != null && tagId.equals(currentTag.getId())) {
+ currentfilter.withDescription("" + (currentTag.getTasks().size() + 1));
filterDrawer.updateItem(currentfilter);
}
}
@@ -639,10 +661,12 @@ public class MainActivity extends AvatarActivityBase implements HabitRPGUserCall
User = habitRPGUser;
SetUserData();
}
+
@Override
public boolean onReady(BaseTransaction baseTransaction) {
return true;
}
+
@Override
public boolean hasResult(BaseTransaction baseTransaction, HabitRPGUser habitRPGUser) {
return true;
diff --git a/Habitica/src/com/habitrpg/android/habitica/ui/adapter/HabitItemRecyclerViewAdapter.java b/Habitica/src/com/habitrpg/android/habitica/ui/adapter/HabitItemRecyclerViewAdapter.java
index da63974ed..8add8c7e3 100644
--- a/Habitica/src/com/habitrpg/android/habitica/ui/adapter/HabitItemRecyclerViewAdapter.java
+++ b/Habitica/src/com/habitrpg/android/habitica/ui/adapter/HabitItemRecyclerViewAdapter.java
@@ -4,7 +4,6 @@ import android.app.Activity;
import android.content.Context;
import android.databinding.DataBindingUtil;
import android.databinding.ObservableArrayList;
-import android.databinding.ObservableList;
import android.os.Handler;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
@@ -42,15 +41,23 @@ 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.Objects;
+import java.util.List;
import butterknife.ButterKnife;
import butterknife.InjectView;
import de.greenrobot.event.EventBus;
+
public class HabitItemRecyclerViewAdapter
extends RecyclerView.Adapter
- implements FlowContentObserver.OnModelStateChangedListener {
+ implements FlowContentObserver.OnModelStateChangedListener, IReceiveNewEntries {
+
+
+ public interface IAdditionalEntries
+ {
+ void GetAdditionalEntries(IReceiveNewEntries callBack);
+ }
+
int layoutResource;
private Class> viewHolderClass;
@@ -65,59 +72,24 @@ public class HabitItemRecyclerViewAdapter
static final int TYPE_CELL = 1;
private RecyclerView.Adapter parentAdapter;
private TagsHelper tagsHelper;
+ private IAdditionalEntries additionalEntries;
public HabitItemRecyclerViewAdapter(String taskType, TagsHelper tagsHelper, int layoutResource, Class> viewHolderClass, Context newContext) {
this(taskType, tagsHelper, layoutResource, viewHolderClass, newContext, null);
}
public HabitItemRecyclerViewAdapter(String taskType, TagsHelper tagsHelper, int layoutResource, Class> viewHolderClass,
- Context newContext, final ObservableArrayList content) {
+ Context newContext, final IAdditionalEntries additionalEntries) {
this.taskType = taskType;
this.context = newContext;
- observableContent = content;
this.tagsHelper = tagsHelper;
- if (content == null) {
- this.loadContent();
+ this.additionalEntries = additionalEntries;
- observer = new FlowContentObserver();
- observer.registerForContentChanges(this.context, Task.class);
- observer.addModelChangeListener(this);
- } else {
- this.filter();
- content.addOnListChangedCallback(new ObservableList.OnListChangedCallback() {
- @Override
- public void onChanged(ObservableList sender) {
- handler.removeCallbacks(reloadContentRunable);
- handler.postDelayed(reloadContentRunable, 200);
- }
+ this.loadContent();
- @Override
- public void onItemRangeChanged(ObservableList sender, int positionStart, int itemCount) {
- handler.removeCallbacks(reloadContentRunable);
- handler.postDelayed(reloadContentRunable, 200);
- }
-
- @Override
- public void onItemRangeInserted(ObservableList sender, int positionStart, int itemCount) {
- handler.removeCallbacks(reloadContentRunable);
- handler.postDelayed(reloadContentRunable, 200);
- }
-
- @Override
- public void onItemRangeMoved(ObservableList sender, int fromPosition, int toPosition, int itemCount) {
- handler.removeCallbacks(reloadContentRunable);
- handler.postDelayed(reloadContentRunable, 200);
- }
-
- @Override
- public void onItemRangeRemoved(ObservableList sender, int positionStart, int itemCount) {
- handler.removeCallbacks(reloadContentRunable);
- handler.postDelayed(reloadContentRunable, 200);
- }
- });
-
- loadContent();
- }
+ observer = new FlowContentObserver();
+ observer.registerForContentChanges(this.context, Task.class);
+ observer.addModelChangeListener(this);
this.layoutResource = layoutResource;
this.viewHolderClass = viewHolderClass;
@@ -251,6 +223,8 @@ public class HabitItemRecyclerViewAdapter
handler.postDelayed(reloadContentRunable, 200);
}
+ // region ViewHolders
+
public abstract class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener {
protected android.content.res.Resources resources;
@@ -515,6 +489,7 @@ public class HabitItemRecyclerViewAdapter
}
}
+ // endregion
public void loadContent() {
if (this.observableContent == null) {
@@ -525,6 +500,10 @@ public class HabitItemRecyclerViewAdapter
.where(Condition.column("type").eq(this.taskType))
.orderBy(OrderBy.columns("dateCreated").descending())
.queryList());
+
+ if(additionalEntries != null){
+ additionalEntries.GetAdditionalEntries(this);
+ }
}
if (parentAdapter != null) {
@@ -533,4 +512,16 @@ public class HabitItemRecyclerViewAdapter
notifyDataSetChanged();
}
}
+
+
+ @Override
+ public void GotAdditionalItems(List items) {
+ this.observableContent.addAll(items);
+
+ if (parentAdapter != null) {
+ parentAdapter.notifyDataSetChanged();
+ } else {
+ notifyDataSetChanged();
+ }
+ }
}
diff --git a/Habitica/src/com/habitrpg/android/habitica/ui/adapter/IReceiveNewEntries.java b/Habitica/src/com/habitrpg/android/habitica/ui/adapter/IReceiveNewEntries.java
new file mode 100644
index 000000000..b84f57942
--- /dev/null
+++ b/Habitica/src/com/habitrpg/android/habitica/ui/adapter/IReceiveNewEntries.java
@@ -0,0 +1,9 @@
+package com.habitrpg.android.habitica.ui.adapter;
+
+import com.magicmicky.habitrpgwrapper.lib.models.tasks.Task;
+
+import java.util.List;
+
+public interface IReceiveNewEntries{
+ void GotAdditionalItems(List items);
+}
diff --git a/Habitica/src/com/habitrpg/android/habitica/ui/helpers/DataBindingUtils.java b/Habitica/src/com/habitrpg/android/habitica/ui/helpers/DataBindingUtils.java
index 54c89b30e..d78f661ca 100644
--- a/Habitica/src/com/habitrpg/android/habitica/ui/helpers/DataBindingUtils.java
+++ b/Habitica/src/com/habitrpg/android/habitica/ui/helpers/DataBindingUtils.java
@@ -24,7 +24,11 @@ public class DataBindingUtils {
@BindingAdapter("bind:imageName")
public static void loadImage(ImageView view, String imageName) {
- Picasso.with(view.getContext()).load("https://habitica-assets.s3.amazonaws.com/mobileApp/images/"+ imageName +".png").into(view);
+ if(view.getVisibility() == View.VISIBLE) {
+ Picasso.with(view.getContext())
+ .load("https://habitica-assets.s3.amazonaws.com/mobileApp/images/" + imageName + ".png")
+ .into(view);
+ }
}
@BindingAdapter("bind:cardColor")
diff --git a/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/tasks/Task.java b/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/tasks/Task.java
index f0c668475..224b2ddb5 100644
--- a/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/tasks/Task.java
+++ b/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/tasks/Task.java
@@ -76,6 +76,8 @@ public class Task extends BaseModel {
@Column
public String date;
+ // used for buyable items
+ public String specialTag;
/**
* @return the id