diff --git a/Habitica/res/layout/dialog_purchase_content_quest.xml b/Habitica/res/layout/dialog_purchase_content_quest.xml index e4e8c48a3..1a2dd0579 100644 --- a/Habitica/res/layout/dialog_purchase_content_quest.xml +++ b/Habitica/res/layout/dialog_purchase_content_quest.xml @@ -118,7 +118,8 @@ android:layout_marginBottom="8dp"/> + android:layout_height="wrap_content" + android:gravity="center_vertical"> Unlock by inviting friends Not enough Gold You don\'t need to buy an health potion - %1$s successfully purchased + Purchased %1$s Confirm purchase Purchase %1$s for %2$s %3$s gem diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/InventoryRepository.java b/Habitica/src/main/java/com/habitrpg/android/habitica/data/InventoryRepository.java index 853021cef..ad408232f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/InventoryRepository.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/InventoryRepository.java @@ -13,6 +13,7 @@ import com.habitrpg.android.habitica.models.inventory.Quest; import com.habitrpg.android.habitica.models.inventory.QuestContent; import com.habitrpg.android.habitica.models.responses.BuyResponse; import com.habitrpg.android.habitica.models.responses.FeedResponse; +import com.habitrpg.android.habitica.models.shops.Shop; import com.habitrpg.android.habitica.models.user.Items; import com.habitrpg.android.habitica.models.user.User; @@ -71,4 +72,14 @@ public interface InventoryRepository extends ContentRepository { Observable inviteToQuest(QuestContent quest); Observable buyItem(User user, String id, double value); + + Observable fetchShopInventory(String identifier); + + Observable purchaseMysterySet(String categoryIdentifier); + + Observable purchaseHourglassItem(String purchaseType, String key); + + Observable purchaseQuest(String key); + + Observable purchaseItem(String purchaseType, String key); } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/InventoryRepositoryImpl.java b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/InventoryRepositoryImpl.java index cd1d9f36d..fe7be71c2 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/InventoryRepositoryImpl.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/InventoryRepositoryImpl.java @@ -14,6 +14,7 @@ import com.habitrpg.android.habitica.models.inventory.Quest; import com.habitrpg.android.habitica.models.inventory.QuestContent; import com.habitrpg.android.habitica.models.responses.BuyResponse; import com.habitrpg.android.habitica.models.responses.FeedResponse; +import com.habitrpg.android.habitica.models.shops.Shop; import com.habitrpg.android.habitica.models.user.Items; import com.habitrpg.android.habitica.models.user.Outfit; import com.habitrpg.android.habitica.models.user.Stats; @@ -243,4 +244,29 @@ public class InventoryRepositoryImpl extends ContentRepositoryImpl fetchShopInventory(String identifier) { + return apiClient.fetchShopInventory(identifier); + } + + @Override + public Observable purchaseMysterySet(String categoryIdentifier) { + return apiClient.purchaseMysterySet(categoryIdentifier); + } + + @Override + public Observable purchaseHourglassItem(String purchaseType, String key) { + return apiClient.purchaseHourglassItem(purchaseType, key); + } + + @Override + public Observable purchaseQuest(String key) { + return apiClient.purchaseQuest(key); + } + + @Override + public Observable purchaseItem(String purchaseType, String key) { + return apiClient.purchaseItem(purchaseType, key); + } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/shops/Shop.java b/Habitica/src/main/java/com/habitrpg/android/habitica/models/shops/Shop.java index e0057070e..2321e5603 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/shops/Shop.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/shops/Shop.java @@ -67,7 +67,7 @@ public class Shop { return R.string.questShop_owner; case "seasonalShop": return R.string.seasonalShop_owner; - case "timetravelersShop": + case "timeTravelersShop": return R.string.timetravelers_owner; default: return R.string.market_owner; 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 e8318b002..00d5b96d2 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 @@ -557,35 +557,6 @@ public class MainActivity extends BaseActivity implements TutorialView.OnTutoria } } - @Subscribe - public void onEvent(final BuyGemItemCommand event) { - if (event.item.canBuy(user) || !event.item.getCurrency().equals("gems")) { - Observable observable; - if (event.shopIdentifier.equals(Shop.TIME_TRAVELERS_SHOP)) { - if (event.item.purchaseType.equals("gear")) { - observable = apiClient.purchaseMysterySet(event.item.categoryIdentifier); - } else { - observable = apiClient.purchaseHourglassItem(event.item.purchaseType, event.item.key); - } - } else if (event.item.purchaseType.equals("quests") && event.item.getCurrency().equals("gold")) { - observable = apiClient.purchaseQuest(event.item.key); - } else { - observable = apiClient.purchaseItem(event.item.purchaseType, event.item.key); - } - observable - .doOnNext(aVoid -> showSnackbar(this, floatingMenuWrapper, getString(R.string.successful_purchase, event.item.text), SnackbarDisplayType.NORMAL)) - .flatMap(buyResponse -> userRepository.retrieveUser(false)) - .subscribe(buyResponse -> {}, throwable -> { - retrofit2.HttpException error = (retrofit2.HttpException) throwable; - if (error.code() == 401 && event.item.getCurrency().equals("gems")) { - openGemPurchaseFragment(null); - } - }); - } else { - openGemPurchaseFragment(null); - } - } - @Subscribe public void onEvent(final BuyRewardCommand event) { final String rewardKey = event.Reward.getId(); 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 633333a34..37f2503db 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 @@ -49,6 +49,9 @@ import java.util.List; import butterknife.BindView; import butterknife.ButterKnife; +import rx.Observable; +import rx.Subscription; +import rx.subjects.PublishSubject; public class ShopRecyclerAdapter extends RecyclerView.Adapter { @@ -169,13 +172,6 @@ public class ShopRecyclerAdapter extends RecyclerView.Adapter { if (shop1.identifier.equals(Shop.MARKET)) { if (user.getPurchased().getPlan().isActive()) { @@ -155,4 +174,5 @@ public class ShopFragment extends BaseFragment { layoutManager.setSpanCount(spanCount); layoutManager.requestLayout(); } + } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/shops/ShopsFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/shops/ShopsFragment.java index 71b96a33e..14f2c61ce 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/shops/ShopsFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/shops/ShopsFragment.java @@ -6,21 +6,33 @@ import android.support.v4.app.Fragment; import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.view.ViewPager; import android.view.LayoutInflater; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import com.habitrpg.android.habitica.R; import com.habitrpg.android.habitica.components.AppComponent; +import com.habitrpg.android.habitica.data.InventoryRepository; +import com.habitrpg.android.habitica.events.commands.BuyGemItemCommand; import com.habitrpg.android.habitica.models.shops.Shop; import com.habitrpg.android.habitica.models.user.User; +import com.habitrpg.android.habitica.ui.activities.MainActivity; import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment; import com.habitrpg.android.habitica.ui.views.CurrencyView; +import com.habitrpg.android.habitica.ui.views.HabiticaSnackbar; + +import org.greenrobot.eventbus.Subscribe; + +import javax.inject.Inject; + +import rx.Observable; + +import static com.habitrpg.android.habitica.ui.views.HabiticaSnackbar.showSnackbar; public class ShopsFragment extends BaseMainFragment { + @Inject + InventoryRepository inventoryRepository; + public ViewPager viewPager; private CurrencyView currencyView; @@ -59,6 +71,7 @@ public class ShopsFragment extends BaseMainFragment { } showToolbar(); enableToolbarScrolling(); + inventoryRepository.close(); super.onDestroyView(); } @@ -109,13 +122,13 @@ public class ShopsFragment extends BaseMainFragment { public CharSequence getPageTitle(int position) { switch (position) { case 0: - return activity.getString(R.string.market); + return getContext().getString(R.string.market); case 1: - return activity.getString(R.string.quests); + return getContext().getString(R.string.quests); case 2: - return activity.getString(R.string.timeTravelers); + return getContext().getString(R.string.timeTravelers); case 3: - return activity.getString(R.string.seasonalShop); + return getContext().getString(R.string.seasonalShop); } return ""; } @@ -150,4 +163,34 @@ public class ShopsFragment extends BaseMainFragment { currencyView.setGems(user.getGemCount()); currencyView.setHourglasses(user.getHourglassCount()); } + + @Subscribe + public void onEvent(final BuyGemItemCommand event) { + MainActivity activity = (MainActivity) getActivity(); + if (event.item.canBuy(user) || !event.item.getCurrency().equals("gems")) { + Observable observable; + if (event.shopIdentifier.equals(Shop.TIME_TRAVELERS_SHOP)) { + if (event.item.purchaseType.equals("gear")) { + observable = inventoryRepository.purchaseMysterySet(event.item.categoryIdentifier); + } else { + observable = inventoryRepository.purchaseHourglassItem(event.item.purchaseType, event.item.key); + } + } else if (event.item.purchaseType.equals("quests") && event.item.getCurrency().equals("gold")) { + observable = inventoryRepository.purchaseQuest(event.item.key); + } else { + observable = inventoryRepository.purchaseItem(event.item.purchaseType, event.item.key); + } + observable + .doOnNext(aVoid -> showSnackbar(getContext(), activity.floatingMenuWrapper, getString(R.string.successful_purchase, event.item.text), HabiticaSnackbar.SnackbarDisplayType.SUCCESS)) + .flatMap(buyResponse -> userRepository.retrieveUser(false)) + .subscribe(buyResponse -> {}, throwable -> { + retrofit2.HttpException error = (retrofit2.HttpException) throwable; + if (error.code() == 401 && event.item.getCurrency().equals("gems")) { + activity.openGemPurchaseFragment(null); + } + }); + } else { + activity.openGemPurchaseFragment(null); + } + } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/HabiticaSnackbar.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/HabiticaSnackbar.java index fe85161f3..b60dc04d8 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/HabiticaSnackbar.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/HabiticaSnackbar.java @@ -18,10 +18,6 @@ import com.habitrpg.android.habitica.R; import javax.annotation.Resource; -/** - * Created by phillip on 04.07.17. - */ - public class HabiticaSnackbar extends BaseTransientBottomBar { /** @@ -35,7 +31,7 @@ public class HabiticaSnackbar extends BaseTransientBottomBar { super(parent, content, callback); } - public static HabiticaSnackbar make(@NonNull ViewGroup parent, int duration) { + private static HabiticaSnackbar make(@NonNull ViewGroup parent, int duration) { final LayoutInflater inflater = LayoutInflater.from(parent.getContext()); final View content = inflater.inflate(R.layout.snackbar_view, parent, false); final ContentViewCallback viewCallback = new ContentViewCallback(content); @@ -70,7 +66,7 @@ public class HabiticaSnackbar extends BaseTransientBottomBar { return this; } - public HabiticaSnackbar setSpecialView(View specialView) { + private HabiticaSnackbar setSpecialView(View specialView) { if (specialView != null) { LinearLayout snackbarView = (LinearLayout) getView().findViewById(R.id.snackbar_view); snackbarView.addView(specialView); @@ -133,6 +129,7 @@ public class HabiticaSnackbar extends BaseTransientBottomBar { snackbar.setBackgroundResource(R.drawable.snackbar_background_blue); break; case NORMAL: + case SUCCESS: snackbar.setBackgroundResource(R.drawable.snackbar_background_green); break; } @@ -141,7 +138,7 @@ public class HabiticaSnackbar extends BaseTransientBottomBar { } public enum SnackbarDisplayType { - NORMAL, FAILURE, FAILURE_BLUE, DROP, BLUE + NORMAL, FAILURE, FAILURE_BLUE, DROP, SUCCESS, BLUE } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialog.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialog.java index 1841976c5..74433fcd8 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialog.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialog.java @@ -1,6 +1,5 @@ package com.habitrpg.android.habitica.ui.views.shops; -import android.app.Activity; import android.app.AlertDialog; import android.content.Context; import android.support.v4.content.ContextCompat; @@ -16,12 +15,14 @@ import com.habitrpg.android.habitica.R; import com.habitrpg.android.habitica.components.AppComponent; import com.habitrpg.android.habitica.data.InventoryRepository; import com.habitrpg.android.habitica.data.UserRepository; +import com.habitrpg.android.habitica.events.commands.BuyGemItemCommand; import com.habitrpg.android.habitica.helpers.RxErrorHandler; import com.habitrpg.android.habitica.models.shops.ShopItem; import com.habitrpg.android.habitica.models.user.User; -import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils; import com.habitrpg.android.habitica.ui.views.CurrencyView; +import org.greenrobot.eventbus.EventBus; + import java.util.Date; import javax.inject.Inject; @@ -55,9 +56,10 @@ public class PurchaseDialog extends AlertDialog { private ShopItem shopItem; - PurchaseDialogContent contentView; + private PurchaseDialogContent contentView; - CompositeSubscription compositeSubscription; + private CompositeSubscription compositeSubscription; + public String shopIdentifier; public PurchaseDialog(Context context, AppComponent component, ShopItem item) { super(context); @@ -184,6 +186,15 @@ public class PurchaseDialog extends AlertDialog { dismiss(); } + @OnClick(R.id.buyButton) + void onBuyButtonClicked() { + BuyGemItemCommand event = new BuyGemItemCommand(); + event.shopIdentifier = shopIdentifier; + event.item = shopItem; + EventBus.getDefault().post(event); + dismiss(); + } + public void setBuyButtonEnabled(boolean enabled) { if (enabled) { buyButton.setAlpha(0.5f);