diff --git a/Habitica/res/layout/row_shopitem.xml b/Habitica/res/layout/row_shopitem.xml
index 2310d9358..a23a3f264 100644
--- a/Habitica/res/layout/row_shopitem.xml
+++ b/Habitica/res/layout/row_shopitem.xml
@@ -48,4 +48,15 @@
android:background="@drawable/rounded_purple_square"
android:paddingLeft="6dp"
android:paddingStart="6dp" />
+
diff --git a/Habitica/res/values/strings.xml b/Habitica/res/values/strings.xml
index 8777d9893..390d4b3b9 100644
--- a/Habitica/res/values/strings.xml
+++ b/Habitica/res/values/strings.xml
@@ -352,4 +352,15 @@ To start, which parts of your life do you want to improve?
Time Travelers
Seasonal Shop
You don\'t have any Inbox messages. You can send a user a new message from their public chat messages!
+ Unlock by inviting friends
+ Not enough Gold
+ You don\'t need to buy an health potion
+ %1$s successfully purchased
+ Confirm purchase
+ Purchase %1$s for %2$s %3$s
+ gem
+ hourglass
+ hourglasses
+ gold
+ gold
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/ItemDetailDialog.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/ItemDetailDialog.java
index 265ebc3cc..2c1deed1c 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/ItemDetailDialog.java
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/ItemDetailDialog.java
@@ -8,6 +8,8 @@ import android.content.DialogInterface;
import android.support.annotation.NonNull;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AlertDialog;
+import android.text.Spannable;
+import android.text.Spanned;
import android.view.Gravity;
import android.view.View;
import android.widget.ImageView;
@@ -84,7 +86,7 @@ public class ItemDetailDialog extends AlertDialog {
});
}
- public void setDescription(String description) {
+ public void setDescription(CharSequence description) {
contentTextView.setText(description);
contentTextView.setVisibility(View.VISIBLE);
}
@@ -97,6 +99,9 @@ public class ItemDetailDialog extends AlertDialog {
case "gems":
currencyImageView.setImageDrawable(ContextCompat.getDrawable(getContext(), R.drawable.ic_header_gem));
break;
+ default:
+ currencyImageView.setImageDrawable(null);
+ break;
}
}
@@ -117,5 +122,4 @@ public class ItemDetailDialog extends AlertDialog {
public void setBuyListener(OnClickListener listener) {
this.setButton(BUTTON_POSITIVE, getContext().getText(R.string.reward_dialog_buy), listener);
}
-
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.java
index 9e7c0736a..7c685e246 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.java
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.java
@@ -880,6 +880,9 @@ public class MainActivity extends BaseActivity implements Action1, Ha
}
observable
.compose(apiHelper.configureApiCallObserver())
+ .doOnNext(aVoid -> {
+ showSnackbar(this, floatingMenuWrapper, getString(R.string.successful_purchase, event.item.text), SnackbarDisplayType.NORMAL);
+ })
.subscribe(buyResponse -> {
apiHelper.retrieveUser(false)
.compose(apiHelper.configureApiCallObserver())
@@ -892,7 +895,7 @@ public class MainActivity extends BaseActivity implements Action1, Ha
final String rewardKey = event.Reward.getId();
if (user.getStats().getGp() < event.Reward.getValue()) {
- showSnackbar(this, floatingMenuWrapper, "Not enough Gold", SnackbarDisplayType.FAILURE);
+ showSnackbar(this, floatingMenuWrapper, getString(R.string.no_gold), SnackbarDisplayType.FAILURE);
return;
}
@@ -901,7 +904,7 @@ public class MainActivity extends BaseActivity implements Action1, Ha
int maxHp = user.getStats().getMaxHealth();
if (currentHp == maxHp) {
- UiUtils.showSnackbar(this, floatingMenuWrapper, "You don't need to buy an health potion", SnackbarDisplayType.FAILURE_BLUE);
+ UiUtils.showSnackbar(this, floatingMenuWrapper, getString(R.string.no_potion), SnackbarDisplayType.FAILURE_BLUE);
return;
}
}
@@ -910,7 +913,7 @@ public class MainActivity extends BaseActivity implements Action1, Ha
apiHelper.apiService.buyItem(event.Reward.getId())
.compose(apiHelper.configureApiCallObserver())
.subscribe(buyResponse -> {
- String snackbarMessage = event.Reward.getText() + " successfully purchased!";
+ String snackbarMessage = getString(R.string.successful_purchase, event.Reward.getText());
if (event.Reward.getId().equals("armoire")) {
if (buyResponse.armoire.get("type").equals("gear")) {
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/ShopRecyclerAdapter.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/ShopRecyclerAdapter.java
index 445d690fd..559a5e7be 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/ShopRecyclerAdapter.java
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/ShopRecyclerAdapter.java
@@ -12,6 +12,8 @@ import com.magicmicky.habitrpgwrapper.lib.models.ShopItem;
import org.greenrobot.eventbus.EventBus;
import android.content.Context;
+import android.content.DialogInterface;
+import android.support.v7.app.AlertDialog;
import android.support.v7.widget.RecyclerView;
import android.text.Html;
import android.text.method.LinkMovementMethod;
@@ -112,6 +114,8 @@ public class ShopRecyclerAdapter extends RecyclerView.Adapter this.buyItem());
+ buyButton.setOnClickListener(view -> {
+ String currencyString = "";
+ if (item.getCurrency().equals("gems")) {
+ if (item.getValue() == 1) {
+ currencyString = context.getString(R.string.gem);
+ } else {
+ currencyString = context.getString(R.string.gems);
+ }
+ } else if (item.getCurrency().equals("gold")) {
+ if (item.getValue() == 1) {
+ currencyString = context.getString(R.string.gold_singular);
+ } else {
+ currencyString = context.getString(R.string.gems_plural);
+ }
+ } else if (item.getCurrency().equals("hourglasses")) {
+ if (item.getValue() == 1) {
+ currencyString = context.getString(R.string.hourglass);
+ } else {
+ currencyString = context.getString(R.string.hourglasses);
+ }
+ }
+ new AlertDialog.Builder(context)
+ .setTitle(R.string.purchase_confirmation_title)
+ .setMessage(context.getString(R.string.confirm_purchase_text, item.getText(), item.getValue().toString(), currencyString))
+ .setPositiveButton(android.R.string.yes, (dialog, which) -> this.buyItem())
+ .setNegativeButton(android.R.string.no, (dialog, which) -> dialog.dismiss())
+ .show();
+ });
}
private void buyItem() {
@@ -141,20 +172,27 @@ public class ShopRecyclerAdapter extends RecyclerView.Adapter this.buyItem());
+ if (item.getUnlockCondition() == null) {
+ dialog.setCurrency(item.getCurrency());
+ dialog.setValue(item.getValue());
+ dialog.setBuyListener((clickedDialog, which) -> this.buyItem());
+ }
dialog.show();
}
}
diff --git a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/ShopItem.java b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/ShopItem.java
index 3dbbb01cb..b7c1b47f1 100644
--- a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/ShopItem.java
+++ b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/ShopItem.java
@@ -13,6 +13,7 @@ public class ShopItem {
public String currency;
public String purchaseType;
public String categoryIdentifier;
+ public ShopItemUnlockCondition unlockCondition;
public String getKey() {
return key;
@@ -81,4 +82,12 @@ public class ShopItem {
public void setPurchaseType(String purchaseType) {
this.purchaseType = purchaseType;
}
+
+ public ShopItemUnlockCondition getUnlockCondition() {
+ return unlockCondition;
+ }
+
+ public void setUnlockCondition(ShopItemUnlockCondition unlockCondition) {
+ this.unlockCondition = unlockCondition;
+ }
}
diff --git a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/ShopItemUnlockCondition.java b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/ShopItemUnlockCondition.java
new file mode 100644
index 000000000..30aa83662
--- /dev/null
+++ b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/ShopItemUnlockCondition.java
@@ -0,0 +1,18 @@
+package com.magicmicky.habitrpgwrapper.lib.models;
+
+import com.habitrpg.android.habitica.R;
+
+public class ShopItemUnlockCondition {
+
+ String condition;
+
+ public int readableUnlockConditionId() {
+ switch (this.condition) {
+
+ case "party invite":
+ return R.string.party_invite;
+ default:
+ return 0;
+ }
+ }
+}