Fix billing and choose plan UI

This commit is contained in:
max-klaus 2019-08-18 22:11:09 +03:00
parent 30056e5dea
commit 4353251067
4 changed files with 38 additions and 19 deletions

View file

@ -70,7 +70,7 @@
android:layout_gravity="center" android:layout_gravity="center"
android:layout_marginStart="@dimen/list_header_padding" android:layout_marginStart="@dimen/list_header_padding"
android:layout_marginLeft="@dimen/list_header_padding" android:layout_marginLeft="@dimen/list_header_padding"
android:src="@drawable/ic_action_singleselect" /> android:src="@drawable/img_feature_purchased" />
</LinearLayout> </LinearLayout>

View file

@ -353,7 +353,6 @@ public abstract class ChoosePlanDialogFragment extends BaseOsmAndDialogFragment
for (final InAppSubscription s : visibleSubscriptions) { for (final InAppSubscription s : visibleSubscriptions) {
InAppSubscriptionIntroductoryInfo introductoryInfo = s.getIntroductoryInfo(); InAppSubscriptionIntroductoryInfo introductoryInfo = s.getIntroductoryInfo();
boolean hasIntroductoryInfo = introductoryInfo != null; boolean hasIntroductoryInfo = introductoryInfo != null;
CharSequence priceTitle = hasIntroductoryInfo ? introductoryInfo.getFormattedDescription(ctx) : s.getPrice(ctx);
CharSequence descriptionText = hasIntroductoryInfo ? CharSequence descriptionText = hasIntroductoryInfo ?
introductoryInfo.getDescriptionTitle(ctx) : s.getDescription(ctx, purchaseHelper.getMonthlyLiveUpdates()); introductoryInfo.getDescriptionTitle(ctx) : s.getDescription(ctx, purchaseHelper.getMonthlyLiveUpdates());
if (s.isPurchased()) { if (s.isPurchased()) {
@ -366,8 +365,10 @@ public abstract class ChoosePlanDialogFragment extends BaseOsmAndDialogFragment
View buttonView = buttonPurchased.findViewById(R.id.button_view); View buttonView = buttonPurchased.findViewById(R.id.button_view);
View buttonCancelView = buttonPurchased.findViewById(R.id.button_cancel_view); View buttonCancelView = buttonPurchased.findViewById(R.id.button_cancel_view);
View div = buttonPurchased.findViewById(R.id.div); View div = buttonPurchased.findViewById(R.id.div);
AppCompatImageView rightImage = buttonPurchased.findViewById(R.id.right_image); AppCompatImageView rightImage = (AppCompatImageView) buttonPurchased.findViewById(R.id.right_image);
CharSequence priceTitle = hasIntroductoryInfo ?
introductoryInfo.getFormattedDescription(ctx, buttonTitle.getCurrentTextColor()) : s.getPrice(ctx);
title.setText(s.getTitle(ctx)); title.setText(s.getTitle(ctx));
description.setText(descriptionText); description.setText(descriptionText);
buttonTitle.setText(priceTitle); buttonTitle.setText(priceTitle);
@ -395,13 +396,13 @@ public abstract class ChoosePlanDialogFragment extends BaseOsmAndDialogFragment
buttonView = buttonCancel.findViewById(R.id.button_view); buttonView = buttonCancel.findViewById(R.id.button_view);
buttonCancelView = buttonCancel.findViewById(R.id.button_cancel_view); buttonCancelView = buttonCancel.findViewById(R.id.button_cancel_view);
div = buttonCancel.findViewById(R.id.div); div = buttonCancel.findViewById(R.id.div);
rightImage = buttonPurchased.findViewById(R.id.right_image); rightImage = (AppCompatImageView) buttonCancel.findViewById(R.id.right_image);
title.setText(getString(R.string.osm_live_payment_current_subscription)); title.setText(getString(R.string.osm_live_payment_current_subscription));
description.setText(s.getRenewDescription(ctx)); description.setText(s.getRenewDescription(ctx));
buttonView.setVisibility(View.GONE); buttonView.setVisibility(View.GONE);
buttonCancelView.setVisibility(View.VISIBLE); buttonCancelView.setVisibility(View.VISIBLE);
buttonCancel.setOnClickListener(new OnClickListener() { buttonCancelView.setOnClickListener(new OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
manageSubscription(ctx, s.getSku()); manageSubscription(ctx, s.getSku());
@ -426,9 +427,10 @@ public abstract class ChoosePlanDialogFragment extends BaseOsmAndDialogFragment
boolean showSolidButton = !anyPurchasedOrIntroducted || hasIntroductoryInfo; boolean showSolidButton = !anyPurchasedOrIntroducted || hasIntroductoryInfo;
buttonView.setVisibility(!showSolidButton ? View.VISIBLE : View.GONE); buttonView.setVisibility(!showSolidButton ? View.VISIBLE : View.GONE);
buttonExView.setVisibility(showSolidButton ? View.VISIBLE : View.GONE); buttonExView.setVisibility(showSolidButton ? View.VISIBLE : View.GONE);
View div = button.findViewById(R.id.div); View div = button.findViewById(R.id.div);
CharSequence priceTitle = hasIntroductoryInfo ?
introductoryInfo.getFormattedDescription(ctx, buttonExTitle.getCurrentTextColor()) : s.getPrice(ctx);
title.setText(s.getTitle(ctx)); title.setText(s.getTitle(ctx));
description.setText(descriptionText); description.setText(descriptionText);
buttonTitle.setText(priceTitle); buttonTitle.setText(priceTitle);

View file

@ -240,7 +240,7 @@ public class InAppPurchaseHelper {
} }
@Override @Override
public void onPurchasesUpdated(List<Purchase> purchases) { public void onPurchasesUpdated(final List<Purchase> purchases) {
// Have we been disposed of in the meantime? If so, quit. // Have we been disposed of in the meantime? If so, quit.
if (billingManager == null) { if (billingManager == null) {
@ -253,6 +253,9 @@ public class InAppPurchaseHelper {
for (InAppPurchase purchase : getInAppPurchases().getAllInAppPurchases(false)) { for (InAppPurchase purchase : getInAppPurchases().getAllInAppPurchases(false)) {
skuInApps.add(purchase.getSku()); skuInApps.add(purchase.getSku());
} }
for (Purchase p : purchases) {
skuInApps.add(p.getSku());
}
billingManager.querySkuDetailsAsync(SkuType.INAPP, skuInApps, new SkuDetailsResponseListener() { billingManager.querySkuDetailsAsync(SkuType.INAPP, skuInApps, new SkuDetailsResponseListener() {
@Override @Override
public void onSkuDetailsResponse(BillingResult billingResult, final List<SkuDetails> skuDetailsListInApps) { public void onSkuDetailsResponse(BillingResult billingResult, final List<SkuDetails> skuDetailsListInApps) {
@ -268,6 +271,9 @@ public class InAppPurchaseHelper {
for (InAppSubscription subscription : getInAppPurchases().getAllInAppSubscriptions()) { for (InAppSubscription subscription : getInAppPurchases().getAllInAppSubscriptions()) {
skuSubscriptions.add(subscription.getSku()); skuSubscriptions.add(subscription.getSku());
} }
for (Purchase p : purchases) {
skuSubscriptions.add(p.getSku());
}
// Have we been disposed of in the meantime? If so, quit. // Have we been disposed of in the meantime? If so, quit.
if (billingManager == null) { if (billingManager == null) {
@ -415,8 +421,7 @@ public class InAppPurchaseHelper {
private List<String> getAllOwnedSubscriptionSkus() { private List<String> getAllOwnedSubscriptionSkus() {
List<String> result = new ArrayList<>(); List<String> result = new ArrayList<>();
for (Purchase p : billingManager.getPurchases()) { for (Purchase p : billingManager.getPurchases()) {
InAppPurchase inAppPurchase = getInAppPurchases().getInAppPurchaseBySku(p.getSku()); if (getInAppPurchases().getInAppSubscriptionBySku(p.getSku()) != null) {
if (inAppPurchase instanceof InAppSubscription) {
result.add(p.getSku()); result.add(p.getSku());
} }
} }
@ -451,14 +456,14 @@ public class InAppPurchaseHelper {
*/ */
List<String> allOwnedSubscriptionSkus = getAllOwnedSubscriptionSkus(); List<String> allOwnedSubscriptionSkus = getAllOwnedSubscriptionSkus();
for (InAppPurchase p : getLiveUpdates().getAllSubscriptions()) { for (InAppSubscription s : getLiveUpdates().getAllSubscriptions()) {
if (hasDetails(p.getSku())) { if (hasDetails(s.getSku())) {
Purchase purchase = getPurchase(p.getSku()); Purchase purchase = getPurchase(s.getSku());
SkuDetails liveUpdatesDetails = getSkuDetails(p.getSku()); SkuDetails liveUpdatesDetails = getSkuDetails(s.getSku());
if (liveUpdatesDetails != null) { if (liveUpdatesDetails != null) {
fetchInAppPurchase(p, liveUpdatesDetails, purchase); fetchInAppPurchase(s, liveUpdatesDetails, purchase);
} }
allOwnedSubscriptionSkus.remove(p.getSku()); allOwnedSubscriptionSkus.remove(s.getSku());
} }
} }
for (String sku : allOwnedSubscriptionSkus) { for (String sku : allOwnedSubscriptionSkus) {

View file

@ -1,10 +1,11 @@
package net.osmand.plus.inapp; package net.osmand.plus.inapp;
import android.content.Context; import android.content.Context;
import android.graphics.Color;
import android.graphics.Typeface; import android.graphics.Typeface;
import android.support.annotation.ColorInt;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.support.v4.content.ContextCompat;
import android.text.Spannable; import android.text.Spannable;
import android.text.SpannableStringBuilder; import android.text.SpannableStringBuilder;
import android.text.style.ForegroundColorSpan; import android.text.style.ForegroundColorSpan;
@ -146,6 +147,16 @@ public class InAppPurchases {
return liveUpdates.getAllSubscriptions(); return liveUpdates.getAllSubscriptions();
} }
@Nullable
public InAppSubscription getInAppSubscriptionBySku(@NonNull String sku) {
for (InAppSubscription s : liveUpdates.getAllSubscriptions()) {
if (sku.startsWith(s.getSkuNoVersion())) {
return s;
}
}
return null;
}
public boolean isFullVersion(String sku) { public boolean isFullVersion(String sku) {
return FULL_VERSION.getSku().equals(sku); return FULL_VERSION.getSku().equals(sku);
} }
@ -570,7 +581,7 @@ public class InAppPurchases {
return ctx.getString(R.string.get_discount_title, totalPeriods, unitStr, discountPercent + "%"); return ctx.getString(R.string.get_discount_title, totalPeriods, unitStr, discountPercent + "%");
} }
public CharSequence getFormattedDescription(@NonNull Context ctx) { public CharSequence getFormattedDescription(@NonNull Context ctx, @ColorInt int textColor) {
long totalPeriods = getTotalPeriods(); long totalPeriods = getTotalPeriods();
String singleUnitStr = getUnitString(ctx).toLowerCase(); String singleUnitStr = getUnitString(ctx).toLowerCase();
String unitStr = getTotalUnitsString(ctx, false).toLowerCase(); String unitStr = getTotalUnitsString(ctx, false).toLowerCase();
@ -614,9 +625,10 @@ public class InAppPurchases {
SpannableStringBuilder thenPart = new SpannableStringBuilder(ctx.getString(R.string.get_discount_second_part, originalPricePeriod)); SpannableStringBuilder thenPart = new SpannableStringBuilder(ctx.getString(R.string.get_discount_second_part, originalPricePeriod));
Typeface typefaceRegular = FontCache.getRobotoRegular(ctx); Typeface typefaceRegular = FontCache.getRobotoRegular(ctx);
Typeface typefaceBold = FontCache.getRobotoMedium(ctx); Typeface typefaceBold = FontCache.getRobotoMedium(ctx);
mainPart.setSpan(new ForegroundColorSpan(textColor), 0, mainPart.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
mainPart.setSpan(new CustomTypefaceSpan(typefaceBold), 0, mainPart.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); mainPart.setSpan(new CustomTypefaceSpan(typefaceBold), 0, mainPart.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
int textColor = ContextCompat.getColor(ctx, R.color.white_50_transparent); int secondaryTextColor = Color.argb(128, Color.red(textColor), Color.green(textColor), Color.blue(textColor));
thenPart.setSpan(new ForegroundColorSpan(textColor), 0, thenPart.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); thenPart.setSpan(new ForegroundColorSpan(secondaryTextColor), 0, thenPart.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
thenPart.setSpan(new CustomTypefaceSpan(typefaceRegular), 0, thenPart.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); thenPart.setSpan(new CustomTypefaceSpan(typefaceRegular), 0, thenPart.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
return new SpannableStringBuilder(mainPart).append("\n").append(thenPart); return new SpannableStringBuilder(mainPart).append("\n").append(thenPart);