Fix billing and choose plan UI
This commit is contained in:
parent
30056e5dea
commit
4353251067
4 changed files with 38 additions and 19 deletions
|
@ -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>
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in a new issue