diff --git a/Habitica/res/layout/fragment_gem_purchase.xml b/Habitica/res/layout/fragment_gem_purchase.xml
index 68318f8aa..ab25d1798 100644
--- a/Habitica/res/layout/fragment_gem_purchase.xml
+++ b/Habitica/res/layout/fragment_gem_purchase.xml
@@ -6,125 +6,135 @@
android:scrollbarSize="3dp"
android:scrollbarThumbVertical="@color/scrollbarThumb"
android:scrollbars="vertical">
-
-
+
+ android:padding="20dp">
+
-
-
-
-
-
-
-
+
+
+
+
+
+
-
+
-
+
+
+
+
+ android:orientation="horizontal"
+ android:dividerPadding="16dp"
+ android:showDividers="middle"
+ android:divider="@android:color/white">
+
+
+
-
-
-
-
+ android:layout_width="wrap_content"
+ android:paddingLeft="16dp"
+ android:paddingRight="16dp"
+ android:paddingBottom="20dp"
+ android:text="@string/gem_purchase_title"
+ android:layout_gravity="center_horizontal"
+ android:gravity="center"
+ android:textColor="@color/blue_10"
+ android:textSize="14sp"
+ android:lineSpacingExtra="4dp" />
-
+
\ No newline at end of file
diff --git a/Habitica/res/layout/promo_subscription_buy_gems.xml b/Habitica/res/layout/promo_subscription_buy_gems.xml
new file mode 100644
index 000000000..47617209e
--- /dev/null
+++ b/Habitica/res/layout/promo_subscription_buy_gems.xml
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Habitica/res/values/strings.xml b/Habitica/res/values/strings.xml
index fcc593cc3..4a49a4da9 100644
--- a/Habitica/res/values/strings.xml
+++ b/Habitica/res/values/strings.xml
@@ -845,4 +845,5 @@
Search
Search tasks
Party Activity
+ Want to buy gems with gold?
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/NotificationOpenHandler.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/NotificationOpenHandler.kt
index a08f67219..cc1ba8b5b 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/NotificationOpenHandler.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/NotificationOpenHandler.kt
@@ -27,7 +27,7 @@ class NotificationOpenHandler {
}
private fun openSubscriptionScreen() {
- MainNavigationController.navigate(R.id.gemPurchaseActivity)
+ MainNavigationController.navigate(R.id.gemPurchaseActivity, bundleOf(Pair("openSubscription", true)))
}
private fun openPrivateMessageScreen(userID: String?) {
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/User.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/User.kt
index ebdf3213e..9aa46045f 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/User.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/User.kt
@@ -219,4 +219,16 @@ open class User : RealmObject(), Avatar, VersionedObject {
fun hasParty(): Boolean {
return this.party?.id?.length ?: 0 > 0
}
+
+ val isSubscribed: Boolean
+ get() {
+ val plan = purchased?.plan
+ var isSubscribed = false
+ if (plan != null) {
+ if (plan.isActive) {
+ isSubscribed = true
+ }
+ }
+ return isSubscribed
+ }
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/AvatarWithBarsViewModel.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/AvatarWithBarsViewModel.kt
index bf3cfd6b8..8d7a3e915 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/AvatarWithBarsViewModel.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/AvatarWithBarsViewModel.kt
@@ -8,6 +8,7 @@ import android.os.Build
import android.view.View
import android.widget.ImageView
import android.widget.TextView
+import androidx.core.os.bundleOf
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.data.UserRepository
import com.habitrpg.android.habitica.events.BoughtGemsEvent
@@ -102,7 +103,7 @@ class AvatarWithBarsViewModel(private val context: Context, view: View, userRepo
}
currencyView.setOnClickListener {
- MainNavigationController.navigate(R.id.gemPurchaseActivity)
+ MainNavigationController.navigate(R.id.gemPurchaseActivity, bundleOf(Pair("openSubscription", false)))
}
avatarView.setOnClickListener {
MainNavigationController.navigate(R.id.avatarOverviewFragment)
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GemPurchaseActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GemPurchaseActivity.kt
index c5603b498..040b47c0b 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GemPurchaseActivity.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GemPurchaseActivity.kt
@@ -63,10 +63,17 @@ class GemPurchaseActivity : BaseActivity() {
supportActionBar?.setDisplayHomeAsUpEnabled(true)
supportActionBar?.setDisplayShowHomeEnabled(true)
supportActionBar?.setTitle(R.string.gem_purchase_toolbartitle)
-
- viewPager.currentItem = 0
-
+
setViewPagerAdapter()
+ viewPager.currentItem = if (intent.extras?.containsKey("openSubscription") == true) {
+ if (intent.extras?.getBoolean("openSubscription") == false) {
+ 1
+ } else {
+ 0
+ }
+ } else {
+ 0
+ }
}
override fun onStart() {
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/CustomizationRecyclerViewAdapter.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/CustomizationRecyclerViewAdapter.kt
index 88dda8057..791332733 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/CustomizationRecyclerViewAdapter.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/CustomizationRecyclerViewAdapter.kt
@@ -6,6 +6,7 @@ import android.view.View
import android.view.ViewGroup
import android.widget.*
import androidx.core.content.ContextCompat
+import androidx.core.os.bundleOf
import com.facebook.drawee.view.SimpleDraweeView
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.helpers.MainNavigationController
@@ -13,8 +14,8 @@ import com.habitrpg.android.habitica.models.inventory.Customization
import com.habitrpg.android.habitica.models.inventory.CustomizationSet
import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils
import com.habitrpg.android.habitica.ui.helpers.bindView
-import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog
import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper
+import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog
import io.reactivex.BackpressureStrategy
import io.reactivex.Flowable
import io.reactivex.subjects.PublishSubject
@@ -176,7 +177,7 @@ class CustomizationRecyclerViewAdapter : androidx.recyclerview.widget.RecyclerVi
val dialog = HabiticaAlertDialog(itemView.context)
dialog.addButton(R.string.purchase_button, true) { _, _ ->
if (customization?.price ?: 0 > gemBalance) {
- MainNavigationController.navigate(R.id.gemPurchaseActivity)
+ MainNavigationController.navigate(R.id.gemPurchaseActivity, bundleOf(Pair("openSubscription", false)))
return@addButton
}
@@ -232,7 +233,7 @@ class CustomizationRecyclerViewAdapter : androidx.recyclerview.widget.RecyclerVi
val dialog = HabiticaAlertDialog(context)
dialog.addButton(R.string.purchase_button, true) { _, _ ->
if (set?.price ?: 0 > gemBalance) {
- MainNavigationController.navigate(R.id.gemPurchaseActivity)
+ MainNavigationController.navigate(R.id.gemPurchaseActivity, bundleOf(Pair("openSubscription", false)))
return@addButton
}
set?.customizations = ArrayList()
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/GemsPurchaseFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/GemsPurchaseFragment.kt
index d872c7aca..b4e7d379f 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/GemsPurchaseFragment.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/GemsPurchaseFragment.kt
@@ -8,13 +8,17 @@ import android.view.ViewGroup
import android.widget.TextView
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.components.UserComponent
+import com.habitrpg.android.habitica.data.UserRepository
import com.habitrpg.android.habitica.extensions.inflate
import com.habitrpg.android.habitica.helpers.PurchaseTypes
+import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.proxy.CrashlyticsProxy
import com.habitrpg.android.habitica.ui.GemPurchaseOptionsView
import com.habitrpg.android.habitica.ui.activities.GemPurchaseActivity
import com.habitrpg.android.habitica.ui.helpers.bindView
import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper
+import com.habitrpg.android.habitica.ui.views.promo.SubscriptionBuyGemsPromoView
+import io.reactivex.functions.Consumer
import org.solovyev.android.checkout.BillingRequests
import org.solovyev.android.checkout.Inventory
import org.solovyev.android.checkout.ProductTypes
@@ -26,10 +30,13 @@ class GemsPurchaseFragment : BaseFragment(), GemPurchaseActivity.CheckoutFragmen
private val gems21View: GemPurchaseOptionsView? by bindView(R.id.gems_21_view)
private val gems42View: GemPurchaseOptionsView? by bindView(R.id.gems_42_view)
private val gems84View: GemPurchaseOptionsView? by bindView(R.id.gems_84_view)
+ private val subscriptionPromoView: SubscriptionBuyGemsPromoView? by bindView(R.id.subscription_promo)
private val supportTextView: TextView? by bindView(R.id.supportTextView)
@Inject
lateinit var crashlyticsProxy: CrashlyticsProxy
+ @Inject
+ lateinit var userRepository: UserRepository
private var listener: GemPurchaseActivity? = null
private var billingRequests: BillingRequests? = null
@@ -56,6 +63,10 @@ class GemsPurchaseFragment : BaseFragment(), GemPurchaseActivity.CheckoutFragmen
val heartDrawable = BitmapDrawable(resources, HabiticaIconsHelper.imageOfHeartLarge())
supportTextView?.setCompoundDrawables(null, heartDrawable, null, null)
+
+ compositeSubscription.add(userRepository.getUser().subscribe(Consumer {
+ subscriptionPromoView?.visibility = if (it.isSubscribed) View.GONE else View.VISIBLE
+ }, RxErrorHandler.handleEmptyError()))
}
override fun setupCheckout() {
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/SubscriptionFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/SubscriptionFragment.kt
index 273351486..4d1fb4a36 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/SubscriptionFragment.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/SubscriptionFragment.kt
@@ -241,13 +241,7 @@ class SubscriptionFragment : BaseFragment(), GemPurchaseActivity.CheckoutFragmen
private fun updateSubscriptionInfo() {
if (user != null) {
- val plan = user?.purchased?.plan
- var isSubscribed = false
- if (plan != null) {
- if (plan.isActive) {
- isSubscribed = true
- }
- }
+ val isSubscribed = user?.isSubscribed ?: false
if (this.subscriptionDetailsView == null) {
return
@@ -255,7 +249,7 @@ class SubscriptionFragment : BaseFragment(), GemPurchaseActivity.CheckoutFragmen
if (isSubscribed) {
this.subscriptionDetailsView?.visibility = View.VISIBLE
- plan?.let { this.subscriptionDetailsView?.setPlan(it) }
+ user?.purchased?.plan?.let { this.subscriptionDetailsView?.setPlan(it) }
this.subscribeBenefitsTitle?.setText(R.string.subscribe_prompt_thanks)
this.subscriptionOptions?.visibility = View.GONE
} else {
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/AuthenticationPreferenceFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/AuthenticationPreferenceFragment.kt
index 6b6fc4468..3e4c2e2fa 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/AuthenticationPreferenceFragment.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/AuthenticationPreferenceFragment.kt
@@ -8,6 +8,7 @@ import android.os.Bundle
import android.text.InputType
import android.widget.EditText
import android.widget.Toast
+import androidx.core.os.bundleOf
import androidx.preference.Preference
import com.google.android.material.textfield.TextInputLayout
import com.habitrpg.android.habitica.HabiticaBaseApplication
@@ -80,7 +81,7 @@ class AuthenticationPreferenceFragment: BasePreferencesFragment() {
showSubscriptionStatusDialog()
return super.onPreferenceTreeClick(preference)
}
- MainNavigationController.navigate(R.id.gemPurchaseActivity)
+ MainNavigationController.navigate(R.id.gemPurchaseActivity, bundleOf(Pair("openSubscription", true)))
}
"reset_account" -> showAccountResetConfirmation()
"delete_account" -> showAccountDeleteConfirmation()
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/insufficientCurrency/InsufficientGemsDialog.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/insufficientCurrency/InsufficientGemsDialog.kt
index 84f413542..eb96fc334 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/insufficientCurrency/InsufficientGemsDialog.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/insufficientCurrency/InsufficientGemsDialog.kt
@@ -1,6 +1,7 @@
package com.habitrpg.android.habitica.ui.views.insufficientCurrency
import android.content.Context
+import androidx.core.os.bundleOf
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.extensions.addCloseButton
import com.habitrpg.android.habitica.helpers.MainNavigationController
@@ -17,7 +18,7 @@ class InsufficientGemsDialog(context: Context) : InsufficientCurrencyDialog(cont
imageView.setImageResource(R.drawable.gems_84)
textView.setText(R.string.insufficientGems)
- addButton(R.string.purchase_gems, true) { _, _ -> MainNavigationController.navigate(R.id.gemPurchaseActivity) }
+ addButton(R.string.purchase_gems, true) { _, _ -> MainNavigationController.navigate(R.id.gemPurchaseActivity, bundleOf(Pair("openSubscription", true))) }
addCloseButton()
}
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/insufficientCurrency/InsufficientHourglassesDialog.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/insufficientCurrency/InsufficientHourglassesDialog.kt
index 85ff263f8..e158def69 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/insufficientCurrency/InsufficientHourglassesDialog.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/insufficientCurrency/InsufficientHourglassesDialog.kt
@@ -1,6 +1,7 @@
package com.habitrpg.android.habitica.ui.views.insufficientCurrency
import android.content.Context
+import androidx.core.os.bundleOf
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.extensions.addCloseButton
import com.habitrpg.android.habitica.helpers.MainNavigationController
@@ -11,7 +12,7 @@ class InsufficientHourglassesDialog(context: Context) : InsufficientCurrencyDial
imageView.setImageBitmap(HabiticaIconsHelper.imageOfHourglassShop())
textView.setText(R.string.insufficientHourglasses)
- addButton(R.string.get_hourglasses, true) { _, _ -> MainNavigationController.navigate(R.id.gemPurchaseActivity) }
+ addButton(R.string.get_hourglasses, true) { _, _ -> MainNavigationController.navigate(R.id.gemPurchaseActivity, bundleOf(Pair("openSubscription", true))) }
addCloseButton()
}
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/promo/SubscriptionBuyGemsPromoView.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/promo/SubscriptionBuyGemsPromoView.kt
new file mode 100644
index 000000000..83aaf8c71
--- /dev/null
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/promo/SubscriptionBuyGemsPromoView.kt
@@ -0,0 +1,93 @@
+package com.habitrpg.android.habitica.ui.views.promo
+
+import android.content.Context
+import android.graphics.drawable.BitmapDrawable
+import android.util.AttributeSet
+import android.widget.ImageView
+import android.widget.RelativeLayout
+import androidx.appcompat.widget.AppCompatImageView
+import androidx.core.content.ContextCompat
+import androidx.core.os.bundleOf
+import com.habitrpg.android.habitica.R
+import com.habitrpg.android.habitica.extensions.dpToPx
+import com.habitrpg.android.habitica.extensions.inflate
+import com.habitrpg.android.habitica.helpers.MainNavigationController
+import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper
+import kotlinx.android.synthetic.main.promo_subscription_buy_gems.view.*
+import java.util.*
+
+class SubscriptionBuyGemsPromoView @JvmOverloads constructor(
+ context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
+) : RelativeLayout(context, attrs, defStyleAttr) {
+ private var didLayoutGold: Boolean = false
+ private var goldViews = mutableListOf()
+ private val random: Random = Random()
+
+ private var iconSize = 30.dpToPx(context)
+
+ private val starParams: LayoutParams
+ get() {
+ val params = LayoutParams(iconSize, iconSize)
+ params.leftMargin = if (random.nextBoolean()) {
+ -20 + random.nextInt(contentWrapper.left)
+ } else {
+ contentWrapper.right + random.nextInt(width - contentWrapper.right)
+ }
+ params.topMargin = -20 + random.nextInt(height + 20)
+ return params
+ }
+
+ init {
+ inflate(R.layout.promo_subscription_buy_gems, true)
+ setBackgroundColor(ContextCompat.getColor(context, R.color.blue_50))
+ clipToPadding = false
+ clipChildren = false
+ clipToOutline = false
+ generateGold()
+
+ button.setOnClickListener { MainNavigationController.navigate(R.id.gemPurchaseActivity, bundleOf(Pair("openSubscription", true))) }
+ }
+
+ override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) {
+ super.onLayout(changed, l, t, r, b)
+ updateGoldLayoutParams()
+ }
+
+ private fun generateGold() {
+ removeGoldViews()
+ for (x in 0 until 8) {
+ generateGoldView()
+ }
+ requestLayout()
+ }
+
+ private fun removeGoldViews() {
+ if (goldViews.size > 0) {
+ goldViews.forEach { this.removeView(it) }
+ goldViews.clear()
+ }
+ }
+
+ private fun generateGoldView() {
+ val goldView = AppCompatImageView(context)
+ goldView.scaleType = ImageView.ScaleType.CENTER
+ goldView.setImageDrawable(BitmapDrawable(resources, HabiticaIconsHelper.imageOfGoldReward()))
+ goldView.rotation = random.nextFloat() * 360
+ goldViews.add(goldView)
+ if (width > 0 && height > 0) {
+ this.addView(goldView, 0, starParams)
+ } else {
+ this.addView(goldView, 0)
+ }
+ }
+
+ private fun updateGoldLayoutParams() {
+ if (width <= 0 || height <= 0 || didLayoutGold || goldViews.size == 0) {
+ return
+ }
+ for (view in goldViews) {
+ view.layoutParams = starParams
+ }
+ didLayoutGold = true
+ }
+}
\ No newline at end of file
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/promo/SubscriptionBuyGemsPromoViewHolder.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/promo/SubscriptionBuyGemsPromoViewHolder.kt
new file mode 100644
index 000000000..444f6f3d3
--- /dev/null
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/promo/SubscriptionBuyGemsPromoViewHolder.kt
@@ -0,0 +1,6 @@
+package com.habitrpg.android.habitica.ui.views.promo
+
+import android.view.View
+import androidx.recyclerview.widget.RecyclerView
+
+class SubscriptionBuyGemsPromoViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView)
\ No newline at end of file
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 41c71dbe4..f1a3f257e 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
@@ -8,6 +8,7 @@ import android.view.ViewGroup
import android.widget.Button
import android.widget.TextView
import androidx.core.content.ContextCompat
+import androidx.core.os.bundleOf
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.components.UserComponent
import com.habitrpg.android.habitica.data.InventoryRepository
@@ -263,7 +264,7 @@ class PurchaseDialog(context: Context, component: UserComponent?, val item: Shop
if (throwable.javaClass.isAssignableFrom(retrofit2.HttpException::class.java)) {
val error = throwable as retrofit2.HttpException
if (error.code() == 401 && shopItem.currency == "gems") {
- MainNavigationController.navigate(R.id.gemPurchaseActivity)
+ MainNavigationController.navigate(R.id.gemPurchaseActivity, bundleOf(Pair("openSubscription", false)))
}
}
}