diff --git a/Habitica/build.gradle b/Habitica/build.gradle
index 04bf42e93..5ed4ce4a3 100644
--- a/Habitica/build.gradle
+++ b/Habitica/build.gradle
@@ -151,7 +151,7 @@ android {
multiDexEnabled true
resConfigs "en", "bg", "de", "en-rGB", "es", "fr", "hr-rHR", "in", "it", "iw", "ja", "ko", "lt", "nl", "pl", "pt-rBR", "pt-rPT", "ru", "tr", "zh", "zh-rTW"
- versionCode 2309
+ versionCode 2314
versionName "2.4"
}
diff --git a/Habitica/res/drawable/pill_bg_purple.xml b/Habitica/res/drawable/pill_bg_purple.xml
index 7a466382f..6d8163ecf 100644
--- a/Habitica/res/drawable/pill_bg_purple.xml
+++ b/Habitica/res/drawable/pill_bg_purple.xml
@@ -1,6 +1,6 @@
-
+
\ No newline at end of file
diff --git a/Habitica/res/layout/fragment_subscription.xml b/Habitica/res/layout/fragment_subscription.xml
index c0e4817b3..bf9bae60d 100644
--- a/Habitica/res/layout/fragment_subscription.xml
+++ b/Habitica/res/layout/fragment_subscription.xml
@@ -73,7 +73,7 @@
+ android:layout_gravity="center_horizontal"/>
+ android:layout_marginBottom="12dp"/>
+ android:orientation="vertical">
@@ -64,7 +64,6 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/descriptionTextView"
- android:textColor="@color/gray_50"
tools:text="recurring every month"
/>
diff --git a/Habitica/res/layout/subscription_details.xml b/Habitica/res/layout/subscription_details.xml
index 882a27c9c..af78981c1 100644
--- a/Habitica/res/layout/subscription_details.xml
+++ b/Habitica/res/layout/subscription_details.xml
@@ -74,6 +74,14 @@
android:id="@+id/subscriptionStatusCancelled"
android:layout_gravity="center_vertical"
android:visibility="gone"/>
+
+
+
+
+
+ style="@style/HabiticaButton.Purple"
+ android:layout_marginTop="@dimen/spacing_medium"/>
\ No newline at end of file
diff --git a/Habitica/res/values/strings.xml b/Habitica/res/values/strings.xml
index 6d8759410..df4bee747 100644
--- a/Habitica/res/values/strings.xml
+++ b/Habitica/res/values/strings.xml
@@ -361,7 +361,7 @@
Google play services could not be found.
Purchase
Buying gems supports the developers and helps keep Habitica running
- Gems allow you to buy fun extras for you account, including:
+ Gems allow you to buy fun extras for your account, including:
Cool costumes for your avatar
Awesome backgrounds
Quests that reward you with pet eggs
@@ -382,7 +382,7 @@
Has Reminder
Has Tag
Subscribing supports the developers and helps keep Habitica running
- Become a subscriber and you’ll get these useful benefits:
+ Become a subscriber to receive these exclusive benefits!
Gold for Gems
Mystic Hourglasses
Monthly Mystery Items
@@ -409,7 +409,7 @@
Due
Cancel Subscription
No longer want to subscribe? You can find the option to unsubscribe in the “My Apps” section of the Google Play Store.
- No longer want to subscribe? Due to your payment method, you can only unsubscribe through the website. Click the button below, to open the site in your browser!
+ No longer want to subscribe? Due to constraints on mobile payments, you\'ll need to cancel via our website. To do this, tap the button below, log in to your account, tap the User icon in the top right, then go to Subscription. We\'ll miss you!
Visit Habitica Website
Current Bonuses
Months subscribed
@@ -422,7 +422,7 @@
3 months
6 months
12 months
- For Subscribing you are receiving these useful benefits:
+ You get these benefits for being a Subscriber
Subscription Status
Leave Challenge
@@ -906,4 +906,10 @@
Want to continue your benefits? You can start a new subscription before this one runs out to keep your benefits active.
Gifted
Save 20%
+ Subscription Credit
+ Group Plan
+ "You have a free subscription because you are a member a Party or Guild that has a Group Plan. This will end if you leave or the Group Plan is cancelled by the owner. Any months of extra subscription credit you have will be applied at the end of the Group Plan. "
+ "You have a free subscription because you are an owner of a Party or Guild that has a Group Plan. This will end if you cancel the plan. Any months of extra subscription credit you have will be applied at the end of the Group Plan. You can cancel from the Habitica website. "
+ Owner
+ Member
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/SubscriptionPlan.java b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/SubscriptionPlan.java
index 827b7e48a..ee1df910c 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/SubscriptionPlan.java
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/SubscriptionPlan.java
@@ -2,6 +2,8 @@ package com.habitrpg.android.habitica.models.user;
import androidx.annotation.Nullable;
+import com.google.gson.annotations.SerializedName;
+
import java.util.Date;
import io.realm.RealmObject;
@@ -33,6 +35,16 @@ public class SubscriptionPlan extends RealmObject {
public SubscriptionPlanConsecutive consecutive;
public int mysteryItemCount;
+ @SerializedName("owner")
+ public String ownerID;
+
+ public boolean isGroupPlanSub() {
+ return customerId.equals("group-plan");
+ }
+
+ public boolean isGiftedSub() {
+ return customerId.equals("Gift");
+ }
public boolean isActive() {
Date today = new Date();
@@ -51,6 +63,7 @@ public class SubscriptionPlan extends RealmObject {
}
+
public void setCustomerId(String customerId) {
this.customerId = customerId;
if (consecutive != null && !consecutive.isManaged()) {
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/SubscriptionFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/SubscriptionFragment.kt
index d38874405..7045adaca 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/SubscriptionFragment.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/SubscriptionFragment.kt
@@ -1,7 +1,6 @@
package com.habitrpg.android.habitica.ui.fragments.purchases
import android.content.Intent
-import android.graphics.drawable.BitmapDrawable
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
@@ -26,11 +25,9 @@ import com.habitrpg.android.habitica.ui.activities.GiftSubscriptionActivity
import com.habitrpg.android.habitica.ui.fragments.BaseFragment
import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils
import com.habitrpg.android.habitica.ui.helpers.dismissKeyboard
-import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper
import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog
import com.habitrpg.android.habitica.ui.views.subscriptions.SubscriptionOptionView
import io.reactivex.functions.Consumer
-import kotlinx.android.synthetic.main.fragment_subscription.*
import org.greenrobot.eventbus.Subscribe
import org.solovyev.android.checkout.Inventory
import org.solovyev.android.checkout.Sku
@@ -58,25 +55,21 @@ class SubscriptionFragment : BaseFragment(), GemPurchaseActivity.CheckoutFragmen
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
-
super.onCreateView(inflater, container, savedInstanceState)
-
fetchUser(null)
-
binding = FragmentSubscriptionBinding.inflate(inflater, container, false)
-
return binding.root
}
@Subscribe
fun fetchUser(event: UserSubscribedEvent?) {
- compositeSubscription.add(userRepository.retrieveUser(false, true).subscribe(Consumer { this.setUser(it) }, RxErrorHandler.handleEmptyError()))
+ compositeSubscription.add(userRepository.retrieveUser(withTasks = false, forced = true).subscribe(Consumer { this.setUser(it) }, RxErrorHandler.handleEmptyError()))
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
- subscriptionOptions?.visibility = View.GONE
+ binding.subscriptionOptions.visibility = View.GONE
binding.subscriptionDetails.visibility = View.GONE
binding.subscriptionDetails.onShowSubscriptionOptions = { showSubscriptionOptions() }
@@ -88,10 +81,7 @@ class SubscriptionFragment : BaseFragment(), GemPurchaseActivity.CheckoutFragmen
binding.subscription6month.setOnPurchaseClickListener(View.OnClickListener { selectSubscription(PurchaseTypes.Subscription6Month) })
binding.subscription12month.setOnPurchaseClickListener(View.OnClickListener { selectSubscription(PurchaseTypes.Subscription12Month) })
- val heartDrawable = BitmapDrawable(resources, HabiticaIconsHelper.imageOfHeartLarge())
- supportTextView?.setCompoundDrawablesWithIntrinsicBounds(null, null, null, heartDrawable)
-
- subscribeButton.setOnClickListener { subscribeUser() }
+ binding.subscribeButton.setOnClickListener { subscribeUser() }
binding.giftSubscriptionContainer?.isVisible = appConfigManager.enableGiftOneGetOne()
@@ -192,25 +182,27 @@ class SubscriptionFragment : BaseFragment(), GemPurchaseActivity.CheckoutFragmen
if (isSubscribed) {
binding.headerImageView?.setImageResource(R.drawable.subscriber_header)
binding.subscriptionDetails.visibility = View.VISIBLE
+ binding.subscriptionDetails.currentUserID = user?.id
user?.purchased?.plan?.let { binding.subscriptionDetails.setPlan(it) }
- subscribeBenefitsTitle?.setText(R.string.subscribe_prompt_thanks)
- subscriptionOptions?.visibility = View.GONE
+ binding.subscribeBenefitsTitle.setText(R.string.subscribe_prompt_thanks)
+ binding.subscriptionOptions.visibility = View.GONE
} else {
binding.headerImageView.setImageResource(R.drawable.subscribe_header)
if (!hasLoadedSubscriptionOptions) {
return
}
- subscriptionOptions?.visibility = View.VISIBLE
+ binding.subscriptionOptions.visibility = View.VISIBLE
binding.subscriptionDetails.visibility = View.GONE
+ binding.subscribeBenefitsTitle.setText(R.string.subscribe_prompt)
}
- loadingIndicator?.visibility = View.GONE
+ binding.loadingIndicator.visibility = View.GONE
}
}
private fun showSubscriptionOptions() {
- subscriptionOptions?.visibility = View.VISIBLE
- subscriptionOptions?.postDelayed({
- binding.scrollView.smoothScrollTo(0, subscriptionOptions?.top ?: 0)
+ binding.subscriptionOptions.visibility = View.VISIBLE
+ binding.subscriptionOptions.postDelayed({
+ binding.scrollView.smoothScrollTo(0, binding.subscriptionOptions.top ?: 0)
}, 500)
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/subscriptions/SubscriptionDetailsView.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/subscriptions/SubscriptionDetailsView.kt
index 4f89ef0e6..21064fe46 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/subscriptions/SubscriptionDetailsView.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/subscriptions/SubscriptionDetailsView.kt
@@ -24,6 +24,8 @@ class SubscriptionDetailsView : LinearLayout {
var onShowSubscriptionOptions: (() -> Unit)? = null
+ var currentUserID: String? = null
+
constructor(context: Context, attributeSet: AttributeSet) : super(context, attributeSet) {
setupView()
}
@@ -41,26 +43,7 @@ class SubscriptionDetailsView : LinearLayout {
fun setPlan(plan: SubscriptionPlan) {
this.plan = plan
- if (plan.isActive) {
- if (plan.dateTerminated != null) {
- if (plan.customerId == "Gift") {
- binding.subscriptionStatusNotRecurring.visibility = View.VISIBLE
- binding.subscriptionStatusCancelled.visibility = View.GONE
- } else {
- binding.subscriptionStatusNotRecurring.visibility = View.GONE
- binding.subscriptionStatusCancelled.visibility = View.VISIBLE
- }
- binding.subscriptionStatusActive.visibility = View.GONE
- } else {
- binding.subscriptionStatusActive.visibility = View.VISIBLE
- binding.subscriptionStatusNotRecurring.visibility = View.GONE
- }
- binding.subscriptionStatusInactive.visibility = View.GONE
- } else {
- binding.subscriptionStatusActive.visibility = View.GONE
- binding.subscriptionStatusInactive.visibility = View.VISIBLE
- binding.subscriptionStatusNotRecurring.visibility = View.GONE
- }
+ updateSubscriptionStatusPill(plan)
var duration: String? = null
@@ -78,10 +61,27 @@ class SubscriptionDetailsView : LinearLayout {
if (duration != null) {
binding.subscriptionDurationTextView.text = resources.getString(R.string.subscription_duration, duration)
+ } else if (plan.isGroupPlanSub) {
+ if (plan.ownerID == currentUserID) {
+ binding.subscriptionDurationTextView.setText(R.string.owner)
+ } else {
+ binding.subscriptionDurationTextView.setText(R.string.member)
+ }
} else if (plan.dateTerminated != null) {
binding.subscriptionDurationTextView.text = resources.getString(R.string.ending_on, DateFormat.getDateInstance().format(plan.dateTerminated ?: Date()))
}
+ if (plan.extraMonths > 0) {
+ binding.subscriptionCreditWrapper.visibility = View.VISIBLE
+ if (plan.extraMonths == 1) {
+ binding.subscriptionCreditTextView.text = resources.getString(R.string.one_month)
+ } else {
+ binding.subscriptionCreditTextView.text = resources.getString(R.string.x_months, plan.extraMonths)
+ }
+ } else {
+ binding.subscriptionCreditWrapper.visibility = View.GONE
+ }
+
when (plan.paymentMethod) {
"Amazon Payments" -> binding.paymentProcessorImageView.setImageResource(R.drawable.payment_amazon)
"Apple" -> binding.paymentProcessorImageView.setImageResource(R.drawable.payment_apple)
@@ -89,7 +89,7 @@ class SubscriptionDetailsView : LinearLayout {
"PayPal" -> binding.paymentProcessorImageView.setImageResource(R.drawable.payment_paypal)
"Stripe" -> binding.paymentProcessorImageView.setImageResource(R.drawable.payment_stripe)
else -> {
- if (plan.customerId == "Gift") {
+ if (plan.isGiftedSub) {
binding.paymentProcessorImageView.setImageResource(R.drawable.payment_gift)
binding.subscriptionPaymentMethodTextview.text = context.getString(R.string.gifted)
} else {
@@ -106,13 +106,23 @@ class SubscriptionDetailsView : LinearLayout {
binding.gemCapTextView.text = plan.totalNumberOfGems().toString()
binding.currentHourglassesTextView.text = plan.consecutive?.trinkets.toString()
+ binding.changeSubscriptionButton.visibility = View.VISIBLE
if (plan.paymentMethod != null) {
binding.changeSubscriptionTitle.setText(R.string.cancel_subscription)
if (plan.paymentMethod == "Google") {
binding.changeSubscriptionDescription.setText(R.string.cancel_subscription_google_description)
binding.changeSubscriptionButton.setText(R.string.open_in_store)
} else {
- binding.changeSubscriptionDescription.setText(R.string.cancel_subscription_notgoogle_description)
+ if (plan.isGroupPlanSub) {
+ if (plan.ownerID == currentUserID) {
+ binding.changeSubscriptionDescription.setText(R.string.cancel_subscription_group_plan_owner)
+ } else {
+ binding.changeSubscriptionDescription.setText(R.string.cancel_subscription_group_plan)
+ binding.changeSubscriptionButton.visibility = View.GONE
+ }
+ } else {
+ binding.changeSubscriptionDescription.setText(R.string.cancel_subscription_notgoogle_description)
+ }
binding.changeSubscriptionButton.setText(R.string.visit_habitica_website)
}
}
@@ -123,6 +133,38 @@ class SubscriptionDetailsView : LinearLayout {
}
}
+ private fun updateSubscriptionStatusPill(plan: SubscriptionPlan) {
+ if (plan.isActive) {
+ if (plan.dateTerminated != null) {
+ if (plan.isGiftedSub) {
+ binding.subscriptionStatusNotRecurring.visibility = View.VISIBLE
+ binding.subscriptionStatusCancelled.visibility = View.GONE
+ } else {
+ binding.subscriptionStatusNotRecurring.visibility = View.GONE
+ binding.subscriptionStatusCancelled.visibility = View.VISIBLE
+ }
+ binding.subscriptionStatusActive.visibility = View.GONE
+ binding.subscriptionStatusGroupPlan.visibility = View.GONE
+ } else {
+ if (plan.isGroupPlanSub) {
+ binding.subscriptionStatusGroupPlan.visibility = View.VISIBLE
+ binding.subscriptionStatusActive.visibility = View.GONE
+ binding.subscriptionStatusNotRecurring.visibility = View.GONE
+ } else {
+ binding.subscriptionStatusActive.visibility = View.VISIBLE
+ binding.subscriptionStatusNotRecurring.visibility = View.GONE
+ binding.subscriptionStatusGroupPlan.visibility = View.GONE
+ }
+ }
+ binding.subscriptionStatusInactive.visibility = View.GONE
+ } else {
+ binding.subscriptionStatusActive.visibility = View.GONE
+ binding.subscriptionStatusInactive.visibility = View.VISIBLE
+ binding.subscriptionStatusNotRecurring.visibility = View.GONE
+ binding.subscriptionStatusGroupPlan.visibility = View.GONE
+ }
+ }
+
private fun changeSubscriptionButtonTapped() {
if (plan?.paymentMethod != null) {
val url = if (plan?.paymentMethod == "Google") {