From 636f51b4e41f4957831f8ccb15e2192d9fd60529 Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Tue, 26 Nov 2019 10:58:14 +0100 Subject: [PATCH] Finalize subscription page tweaks --- Habitica/build.gradle | 2 +- Habitica/res/drawable/pill_bg_purple.xml | 2 +- Habitica/res/layout/fragment_subscription.xml | 15 ++-- .../res/layout/purchase_subscription_view.xml | 5 +- Habitica/res/layout/subscription_details.xml | 29 ++++++- Habitica/res/values/strings.xml | 14 ++- .../models/user/SubscriptionPlan.java | 13 +++ .../purchases/SubscriptionFragment.kt | 32 +++---- .../subscriptions/SubscriptionDetailsView.kt | 86 ++++++++++++++----- 9 files changed, 137 insertions(+), 61 deletions(-) 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") {