From b6cde7e5352ce198a5965f141ea2529f47b427c4 Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Fri, 26 Apr 2019 12:57:44 +0200 Subject: [PATCH] Fix issues in shops --- .../extensions/Flowable-Extensions.kt | 10 +++ .../habitica/ui/activities/MainActivity.kt | 23 +++---- .../habitica/ui/fragments/BaseMainFragment.kt | 4 -- .../AvatarCustomizationFragment.kt | 29 +++++---- .../customization/AvatarOverviewFragment.kt | 64 +++++++++---------- .../fragments/inventory/shops/ShopFragment.kt | 4 +- .../inventory/shops/ShopsFragment.kt | 24 +++---- .../habitica/ui/views/shops/PurchaseDialog.kt | 6 +- 8 files changed, 80 insertions(+), 84 deletions(-) create mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/extensions/Flowable-Extensions.kt diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/Flowable-Extensions.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/Flowable-Extensions.kt new file mode 100644 index 000000000..cd47e6615 --- /dev/null +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/Flowable-Extensions.kt @@ -0,0 +1,10 @@ +package com.habitrpg.android.habitica.extensions + +import com.habitrpg.android.habitica.helpers.RxErrorHandler +import io.reactivex.Flowable +import io.reactivex.disposables.Disposable +import io.reactivex.functions.Consumer + +fun Flowable.subscribeWithErrorHandler(function: Consumer): Disposable { + return subscribe(function, RxErrorHandler.handleEmptyError()) +} \ No newline at end of file diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.kt index 35f4a40fa..ef82126e0 100755 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.kt @@ -13,22 +13,22 @@ import android.graphics.drawable.BitmapDrawable import android.os.Build import android.os.Bundle import android.preference.PreferenceManager -import com.google.android.material.appbar.AppBarLayout -import com.google.android.material.appbar.CollapsingToolbarLayout -import com.google.android.material.tabs.TabLayout -import androidx.core.content.ContextCompat -import androidx.core.content.FileProvider -import androidx.appcompat.app.ActionBarDrawerToggle -import androidx.appcompat.app.AlertDialog -import androidx.appcompat.widget.Toolbar import android.util.Log import android.util.TypedValue import android.view.* import android.widget.FrameLayout import android.widget.TextView +import androidx.appcompat.app.ActionBarDrawerToggle +import androidx.appcompat.app.AlertDialog +import androidx.appcompat.widget.Toolbar +import androidx.core.content.ContextCompat +import androidx.core.content.FileProvider import androidx.core.content.edit import androidx.navigation.findNavController import com.facebook.drawee.view.SimpleDraweeView +import com.google.android.material.appbar.AppBarLayout +import com.google.android.material.appbar.CollapsingToolbarLayout +import com.google.android.material.tabs.TabLayout import com.google.firebase.analytics.FirebaseAnalytics import com.google.firebase.perf.FirebasePerformance import com.habitrpg.android.habitica.HabiticaBaseApplication @@ -52,7 +52,6 @@ import com.habitrpg.android.habitica.proxy.CrashlyticsProxy import com.habitrpg.android.habitica.ui.AvatarView import com.habitrpg.android.habitica.ui.AvatarWithBarsViewModel import com.habitrpg.android.habitica.ui.TutorialView -import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment import com.habitrpg.android.habitica.ui.fragments.NavigationDrawerFragment import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils import com.habitrpg.android.habitica.ui.helpers.KeyboardUtil @@ -62,13 +61,13 @@ import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper import com.habitrpg.android.habitica.ui.views.HabiticaSnackbar import com.habitrpg.android.habitica.ui.views.HabiticaSnackbar.SnackbarDisplayType import com.habitrpg.android.habitica.ui.views.ValueBar +import com.habitrpg.android.habitica.ui.views.bottombar.BottomBar import com.habitrpg.android.habitica.ui.views.yesterdailies.YesterdailyDialog import com.habitrpg.android.habitica.userpicture.BitmapUtils import com.habitrpg.android.habitica.widget.AvatarStatsWidgetProvider import com.habitrpg.android.habitica.widget.DailiesWidgetProvider import com.habitrpg.android.habitica.widget.HabitButtonWidgetProvider import com.habitrpg.android.habitica.widget.TodoListWidgetProvider -import com.habitrpg.android.habitica.ui.views.bottombar.BottomBar import io.reactivex.Completable import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.functions.Action @@ -77,7 +76,6 @@ import io.reactivex.schedulers.Schedulers import io.realm.Realm import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.Subscribe -import java.lang.ref.WeakReference import java.util.* import javax.inject.Inject @@ -141,7 +139,6 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction { var user: User? = null - private var activeFragment: WeakReference? = null private var avatarInHeader: AvatarWithBarsViewModel? = null private var faintDialog: AlertDialog? = null private var sideAvatarView: AvatarView? = null @@ -354,7 +351,6 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction { preferences?.sound.notNull { soundManager.soundTheme = it } runOnUiThread { updateSidebar() - activeFragment?.get()?.updateUserData(user) } displayDeathDialogIfNeeded() @@ -425,7 +421,6 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction { super.onBackPressed() } catch (ignored: Exception) { } - this.activeFragment?.get()?.updateUserData(user) } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/BaseMainFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/BaseMainFragment.kt index 5b0ecfdfa..9dcc8f904 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/BaseMainFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/BaseMainFragment.kt @@ -36,10 +36,6 @@ abstract class BaseMainFragment : BaseFragment() { var usesBottomNavigation = false open var user: User? = null - open fun updateUserData(user: User?) { - this.user = user - } - override fun onAttach(context: Context) { super.onAttach(context) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/AvatarCustomizationFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/AvatarCustomizationFragment.kt index 5991e4a2a..7b7633924 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/AvatarCustomizationFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/AvatarCustomizationFragment.kt @@ -1,14 +1,15 @@ package com.habitrpg.android.habitica.ui.fragments.inventory.customization import android.os.Bundle -import androidx.recyclerview.widget.GridLayoutManager import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.recyclerview.widget.GridLayoutManager import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.components.AppComponent import com.habitrpg.android.habitica.data.CustomizationRepository import com.habitrpg.android.habitica.extensions.notNull +import com.habitrpg.android.habitica.extensions.subscribeWithErrorHandler import com.habitrpg.android.habitica.helpers.RxErrorHandler import com.habitrpg.android.habitica.models.inventory.Customization import com.habitrpg.android.habitica.models.responses.UnlockResponse @@ -100,12 +101,9 @@ class AvatarCustomizationFragment : BaseMainFragment() { recyclerView.itemAnimator = SafeDefaultItemAnimator() this.loadCustomizations() - this.updateActiveCustomization() - if (this.user != null) { - this.adapter.userSize = this.user?.preferences?.size - this.adapter.hairColor = this.user?.preferences?.hair?.color - this.adapter.gemBalance = user?.gemCount ?: 0 - } + compositeSubscription.add(userRepository.getUser().subscribeWithErrorHandler(Consumer { + updateUser(it) + })) } override fun onDestroy() { @@ -142,21 +140,23 @@ class AvatarCustomizationFragment : BaseMainFragment() { layoutManager.spanCount = spanCount } - override fun updateUserData(user: User?) { - super.updateUserData(user) - this.adapter.gemBalance = user?.gemCount ?: 0 - this.updateActiveCustomization() + fun updateUser(user: User) { + this.updateActiveCustomization(user) if (adapter.customizationList.size != 0) { val ownedCustomizations = ArrayList() - user?.purchased?.customizations?.filter { it.type == this.type }?.mapTo(ownedCustomizations) { it.id } + user.purchased?.customizations?.filter { it.type == this.type }?.mapTo(ownedCustomizations) { it.id } adapter.updateOwnership(ownedCustomizations) } else { this.loadCustomizations() } + this.adapter.userSize = this.user?.preferences?.size + this.adapter.hairColor = this.user?.preferences?.hair?.color + this.adapter.gemBalance = user.gemCount + adapter.notifyDataSetChanged() } - private fun updateActiveCustomization() { - if (this.type == null || user?.preferences == null) { + private fun updateActiveCustomization(user: User) { + if (this.type == null || user.preferences == null) { return } val prefs = this.user?.preferences @@ -181,3 +181,4 @@ class AvatarCustomizationFragment : BaseMainFragment() { } } } + diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/AvatarOverviewFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/AvatarOverviewFragment.kt index 1342699a5..50c61d420 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/AvatarOverviewFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/AvatarOverviewFragment.kt @@ -7,6 +7,7 @@ import android.view.ViewGroup import android.widget.AdapterView import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.components.AppComponent +import com.habitrpg.android.habitica.extensions.subscribeWithErrorHandler import com.habitrpg.android.habitica.helpers.MainNavigationController import com.habitrpg.android.habitica.helpers.RxErrorHandler import com.habitrpg.android.habitica.models.user.User @@ -24,11 +25,6 @@ class AvatarOverviewFragment : BaseMainFragment(), AdapterView.OnItemSelectedLis override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - if (this.user == null) { - return - } - - this.setSize(this.user?.preferences?.size) avatarSizeSpinner.onItemSelectedListener = this avatarShirtView.setOnClickListener { displayCustomizationFragment("shirt", null) } @@ -42,31 +38,9 @@ class AvatarOverviewFragment : BaseMainFragment(), AdapterView.OnItemSelectedLis avatarHairMustacheView.setOnClickListener { displayCustomizationFragment("hair", "mustache") } avatarBackgroundView.setOnClickListener { displayCustomizationFragment("background", null) } - setCustomizations() - } - - private fun setCustomizations() { - avatarShirtView.customizationIdentifier = user?.preferences?.size + "_shirt_" + user?.preferences?.shirt - avatarShirtView.equipmentName = user?.preferences?.shirt - avatarSkinView.customizationIdentifier = "skin_" + user?.preferences?.skin - avatarSkinView.equipmentName = user?.preferences?.skin - val chair = user?.preferences?.chair - avatarChairView.customizationIdentifier = if (chair?.startsWith("handleless") == true) "chair_$chair" else chair - avatarChairView.equipmentName = chair?.removePrefix("chair_") - avatarHairColorView.customizationIdentifier = if (user?.preferences?.hair?.color != null && user?.preferences?.hair?.color != "") "hair_bangs_1_" + user?.preferences?.hair?.color else "" - avatarHairColorView.equipmentName = user?.preferences?.hair?.color - avatarHairBangsView.customizationIdentifier = if (user?.preferences?.hair?.bangs != null && user?.preferences?.hair?.bangs != 0) "hair_bangs_" + user?.preferences?.hair?.bangs + "_" + user?.preferences?.hair?.color else "" - avatarHairBangsView.equipmentName = user?.preferences?.hair?.bangs.toString() - avatarHairBaseView.customizationIdentifier = if (user?.preferences?.hair?.base != null && user?.preferences?.hair?.base != 0) "hair_base_" + user?.preferences?.hair?.base + "_" + user?.preferences?.hair?.color else "" - avatarHairBaseView.equipmentName = user?.preferences?.hair?.base.toString() - avatarHairFlowerView.customizationIdentifier = if (user?.preferences?.hair?.flower != null && user?.preferences?.hair?.flower != 0) "hair_flower_" + user?.preferences?.hair?.flower else "" - avatarHairFlowerView.equipmentName = user?.preferences?.hair?.bangs.toString() - avatarHairBeardView.customizationIdentifier = if (user?.preferences?.hair?.beard != null && user?.preferences?.hair?.beard != 0) "hair_beard_" + user?.preferences?.hair?.beard + "_" + user?.preferences?.hair?.color else "" - avatarHairBeardView.equipmentName = user?.preferences?.hair?.beard.toString() - avatarHairMustacheView.customizationIdentifier = if (user?.preferences?.hair?.mustache != null && user?.preferences?.hair?.mustache != 0) "hair_mustache_" + user?.preferences?.hair?.mustache + "_" + user?.preferences?.hair?.color else "" - avatarHairMustacheView.equipmentName = user?.preferences?.hair?.mustache.toString() - avatarBackgroundView.customizationIdentifier = "background_" + user?.preferences?.background - avatarBackgroundView.equipmentName = user?.preferences?.background + compositeSubscription.add(userRepository.getUser().subscribeWithErrorHandler(Consumer { + updateUser(it) + })) } override fun injectFragment(component: AppComponent) { @@ -77,9 +51,33 @@ class AvatarOverviewFragment : BaseMainFragment(), AdapterView.OnItemSelectedLis MainNavigationController.navigate(AvatarOverviewFragmentDirections.openAvatarDetail(type, category ?: "")) } - override fun updateUserData(user: User?) { - super.updateUserData(user) - this.setSize(user?.preferences?.size) + fun updateUser(user: User) { + this.setSize(user.preferences?.size) + setCustomizations(user) + } + + private fun setCustomizations(user: User) { + avatarShirtView.customizationIdentifier = user.preferences?.size + "_shirt_" + user.preferences?.shirt + avatarShirtView.equipmentName = user.preferences?.shirt + avatarSkinView.customizationIdentifier = "skin_" + user.preferences?.skin + avatarSkinView.equipmentName = user.preferences?.skin + val chair = user.preferences?.chair + avatarChairView.customizationIdentifier = if (chair?.startsWith("handleless") == true) "chair_$chair" else chair + avatarChairView.equipmentName = chair?.removePrefix("chair_") + avatarHairColorView.customizationIdentifier = if (user.preferences?.hair?.color != null && user.preferences?.hair?.color != "") "hair_bangs_1_" + user.preferences?.hair?.color else "" + avatarHairColorView.equipmentName = user.preferences?.hair?.color + avatarHairBangsView.customizationIdentifier = if (user.preferences?.hair?.bangs != null && user.preferences?.hair?.bangs != 0) "hair_bangs_" + user.preferences?.hair?.bangs + "_" + user.preferences?.hair?.color else "" + avatarHairBangsView.equipmentName = user.preferences?.hair?.bangs.toString() + avatarHairBaseView.customizationIdentifier = if (user.preferences?.hair?.base != null && user.preferences?.hair?.base != 0) "hair_base_" + user.preferences?.hair?.base + "_" + user.preferences?.hair?.color else "" + avatarHairBaseView.equipmentName = user.preferences?.hair?.base.toString() + avatarHairFlowerView.customizationIdentifier = if (user.preferences?.hair?.flower != null && user.preferences?.hair?.flower != 0) "hair_flower_" + user.preferences?.hair?.flower else "" + avatarHairFlowerView.equipmentName = user.preferences?.hair?.bangs.toString() + avatarHairBeardView.customizationIdentifier = if (user.preferences?.hair?.beard != null && user.preferences?.hair?.beard != 0) "hair_beard_" + user.preferences?.hair?.beard + "_" + user.preferences?.hair?.color else "" + avatarHairBeardView.equipmentName = user.preferences?.hair?.beard.toString() + avatarHairMustacheView.customizationIdentifier = if (user.preferences?.hair?.mustache != null && user.preferences?.hair?.mustache != 0) "hair_mustache_" + user.preferences?.hair?.mustache + "_" + user.preferences?.hair?.color else "" + avatarHairMustacheView.equipmentName = user.preferences?.hair?.mustache.toString() + avatarBackgroundView.customizationIdentifier = "background_" + user.preferences?.background + avatarBackgroundView.equipmentName = user.preferences?.background } private fun setSize(size: String?) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/shops/ShopFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/shops/ShopFragment.kt index 8dafb523e..b637a3879 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/shops/ShopFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/shops/ShopFragment.kt @@ -1,10 +1,10 @@ package com.habitrpg.android.habitica.ui.fragments.inventory.shops import android.os.Bundle -import androidx.recyclerview.widget.GridLayoutManager import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.recyclerview.widget.GridLayoutManager import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.components.AppComponent import com.habitrpg.android.habitica.data.InventoryRepository @@ -234,6 +234,8 @@ class ShopFragment : BaseFragment() { fun onItemPurchased(event: GearPurchasedEvent) { if (Shop.MARKET == shopIdentifier) { loadMarketGear() + } else if (Shop.TIME_TRAVELERS_SHOP == shopIdentifier) { + loadShopInventory() } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/shops/ShopsFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/shops/ShopsFragment.kt index 360634d82..a7eca599b 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/shops/ShopsFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/shops/ShopsFragment.kt @@ -1,17 +1,19 @@ package com.habitrpg.android.habitica.ui.fragments.inventory.shops import android.os.Bundle -import androidx.fragment.app.FragmentPagerAdapter import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.fragment.app.FragmentPagerAdapter 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.helpers.RxErrorHandler import com.habitrpg.android.habitica.models.shops.Shop import com.habitrpg.android.habitica.models.user.User import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment import com.habitrpg.android.habitica.ui.views.CurrencyViews +import io.reactivex.functions.Consumer import kotlinx.android.synthetic.main.fragment_viewpager.* import javax.inject.Inject @@ -36,7 +38,8 @@ class ShopsFragment : BaseMainFragment() { viewPager.currentItem = 0 setViewPagerAdapter() toolbarAccessoryContainer?.addView(currencyView) - updateCurrencyView() + + compositeSubscription.add(userRepository.getUser().subscribe(Consumer { updateCurrencyView(it) }, RxErrorHandler.handleEmptyError())) } override fun onDestroyView() { @@ -92,18 +95,9 @@ class ShopsFragment : BaseMainFragment() { } } - - override fun updateUserData(user: User?) { - super.updateUserData(user) - updateCurrencyView() - } - - private fun updateCurrencyView() { - if (user == null) { - return - } - currencyView.gold = user?.stats?.gp ?: 0.0 - currencyView.gems = user?.gemCount?.toDouble() ?: 0.0 - currencyView.hourglasses = user?.hourglassCount?.toDouble() ?: 0.0 + private fun updateCurrencyView(user: User) { + currencyView.gold = user.stats?.gp ?: 0.0 + currencyView.gems = user.gemCount.toDouble() + currencyView.hourglasses = user.hourglassCount?.toDouble() ?: 0.0 } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialog.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialog.kt index c5cd47140..018ccb5b3 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialog.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialog.kt @@ -2,7 +2,6 @@ package com.habitrpg.android.habitica.ui.views.shops import android.app.AlertDialog import android.content.Context -import androidx.core.content.ContextCompat import android.util.DisplayMetrics import android.view.LayoutInflater import android.view.View @@ -10,21 +9,22 @@ import android.view.ViewGroup import android.widget.ImageButton import android.widget.ScrollView import android.widget.TextView +import androidx.core.content.ContextCompat 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.GearPurchasedEvent import com.habitrpg.android.habitica.events.ShowSnackbarEvent -import com.habitrpg.android.habitica.helpers.MainNavigationController -import com.habitrpg.android.habitica.ui.helpers.bindView import com.habitrpg.android.habitica.helpers.AppConfigManager +import com.habitrpg.android.habitica.helpers.MainNavigationController import com.habitrpg.android.habitica.helpers.RxErrorHandler import com.habitrpg.android.habitica.models.inventory.Equipment import com.habitrpg.android.habitica.models.inventory.QuestContent import com.habitrpg.android.habitica.models.shops.Shop import com.habitrpg.android.habitica.models.shops.ShopItem import com.habitrpg.android.habitica.models.user.User +import com.habitrpg.android.habitica.ui.helpers.bindView import com.habitrpg.android.habitica.ui.views.CurrencyView import com.habitrpg.android.habitica.ui.views.CurrencyViews import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper