diff --git a/OsmAnd/res/layout/purchase_dialog_card_button_active_ex.xml b/OsmAnd/res/layout/purchase_dialog_card_button_active_ex.xml index 98db3af15f..4d1b662dc3 100644 --- a/OsmAnd/res/layout/purchase_dialog_card_button_active_ex.xml +++ b/OsmAnd/res/layout/purchase_dialog_card_button_active_ex.xml @@ -70,7 +70,7 @@ android:layout_gravity="center" android:layout_marginStart="@dimen/list_header_padding" android:layout_marginLeft="@dimen/list_header_padding" - android:src="@drawable/ic_action_singleselect" /> + android:src="@drawable/img_feature_purchased" /> diff --git a/OsmAnd/src/net/osmand/plus/chooseplan/ChoosePlanDialogFragment.java b/OsmAnd/src/net/osmand/plus/chooseplan/ChoosePlanDialogFragment.java index 144748dcd8..bdac006929 100644 --- a/OsmAnd/src/net/osmand/plus/chooseplan/ChoosePlanDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/chooseplan/ChoosePlanDialogFragment.java @@ -353,7 +353,6 @@ public abstract class ChoosePlanDialogFragment extends BaseOsmAndDialogFragment for (final InAppSubscription s : visibleSubscriptions) { InAppSubscriptionIntroductoryInfo introductoryInfo = s.getIntroductoryInfo(); boolean hasIntroductoryInfo = introductoryInfo != null; - CharSequence priceTitle = hasIntroductoryInfo ? introductoryInfo.getFormattedDescription(ctx) : s.getPrice(ctx); CharSequence descriptionText = hasIntroductoryInfo ? introductoryInfo.getDescriptionTitle(ctx) : s.getDescription(ctx, purchaseHelper.getMonthlyLiveUpdates()); if (s.isPurchased()) { @@ -366,8 +365,10 @@ public abstract class ChoosePlanDialogFragment extends BaseOsmAndDialogFragment View buttonView = buttonPurchased.findViewById(R.id.button_view); View buttonCancelView = buttonPurchased.findViewById(R.id.button_cancel_view); 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)); description.setText(descriptionText); buttonTitle.setText(priceTitle); @@ -395,13 +396,13 @@ public abstract class ChoosePlanDialogFragment extends BaseOsmAndDialogFragment buttonView = buttonCancel.findViewById(R.id.button_view); buttonCancelView = buttonCancel.findViewById(R.id.button_cancel_view); 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)); description.setText(s.getRenewDescription(ctx)); buttonView.setVisibility(View.GONE); buttonCancelView.setVisibility(View.VISIBLE); - buttonCancel.setOnClickListener(new OnClickListener() { + buttonCancelView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { manageSubscription(ctx, s.getSku()); @@ -426,9 +427,10 @@ public abstract class ChoosePlanDialogFragment extends BaseOsmAndDialogFragment boolean showSolidButton = !anyPurchasedOrIntroducted || hasIntroductoryInfo; buttonView.setVisibility(!showSolidButton ? View.VISIBLE : View.GONE); buttonExView.setVisibility(showSolidButton ? View.VISIBLE : View.GONE); - View div = button.findViewById(R.id.div); + CharSequence priceTitle = hasIntroductoryInfo ? + introductoryInfo.getFormattedDescription(ctx, buttonExTitle.getCurrentTextColor()) : s.getPrice(ctx); title.setText(s.getTitle(ctx)); description.setText(descriptionText); buttonTitle.setText(priceTitle); diff --git a/OsmAnd/src/net/osmand/plus/inapp/InAppPurchaseHelper.java b/OsmAnd/src/net/osmand/plus/inapp/InAppPurchaseHelper.java index 9b4b26afd0..cc575015f8 100644 --- a/OsmAnd/src/net/osmand/plus/inapp/InAppPurchaseHelper.java +++ b/OsmAnd/src/net/osmand/plus/inapp/InAppPurchaseHelper.java @@ -240,7 +240,7 @@ public class InAppPurchaseHelper { } @Override - public void onPurchasesUpdated(List purchases) { + public void onPurchasesUpdated(final List purchases) { // Have we been disposed of in the meantime? If so, quit. if (billingManager == null) { @@ -253,6 +253,9 @@ public class InAppPurchaseHelper { for (InAppPurchase purchase : getInAppPurchases().getAllInAppPurchases(false)) { skuInApps.add(purchase.getSku()); } + for (Purchase p : purchases) { + skuInApps.add(p.getSku()); + } billingManager.querySkuDetailsAsync(SkuType.INAPP, skuInApps, new SkuDetailsResponseListener() { @Override public void onSkuDetailsResponse(BillingResult billingResult, final List skuDetailsListInApps) { @@ -268,6 +271,9 @@ public class InAppPurchaseHelper { for (InAppSubscription subscription : getInAppPurchases().getAllInAppSubscriptions()) { skuSubscriptions.add(subscription.getSku()); } + for (Purchase p : purchases) { + skuSubscriptions.add(p.getSku()); + } // Have we been disposed of in the meantime? If so, quit. if (billingManager == null) { @@ -415,8 +421,7 @@ public class InAppPurchaseHelper { private List getAllOwnedSubscriptionSkus() { List result = new ArrayList<>(); for (Purchase p : billingManager.getPurchases()) { - InAppPurchase inAppPurchase = getInAppPurchases().getInAppPurchaseBySku(p.getSku()); - if (inAppPurchase instanceof InAppSubscription) { + if (getInAppPurchases().getInAppSubscriptionBySku(p.getSku()) != null) { result.add(p.getSku()); } } @@ -451,14 +456,14 @@ public class InAppPurchaseHelper { */ List allOwnedSubscriptionSkus = getAllOwnedSubscriptionSkus(); - for (InAppPurchase p : getLiveUpdates().getAllSubscriptions()) { - if (hasDetails(p.getSku())) { - Purchase purchase = getPurchase(p.getSku()); - SkuDetails liveUpdatesDetails = getSkuDetails(p.getSku()); + for (InAppSubscription s : getLiveUpdates().getAllSubscriptions()) { + if (hasDetails(s.getSku())) { + Purchase purchase = getPurchase(s.getSku()); + SkuDetails liveUpdatesDetails = getSkuDetails(s.getSku()); if (liveUpdatesDetails != null) { - fetchInAppPurchase(p, liveUpdatesDetails, purchase); + fetchInAppPurchase(s, liveUpdatesDetails, purchase); } - allOwnedSubscriptionSkus.remove(p.getSku()); + allOwnedSubscriptionSkus.remove(s.getSku()); } } for (String sku : allOwnedSubscriptionSkus) { diff --git a/OsmAnd/src/net/osmand/plus/inapp/InAppPurchases.java b/OsmAnd/src/net/osmand/plus/inapp/InAppPurchases.java index 90b73064d7..8aaa826658 100644 --- a/OsmAnd/src/net/osmand/plus/inapp/InAppPurchases.java +++ b/OsmAnd/src/net/osmand/plus/inapp/InAppPurchases.java @@ -1,10 +1,11 @@ package net.osmand.plus.inapp; import android.content.Context; +import android.graphics.Color; import android.graphics.Typeface; +import android.support.annotation.ColorInt; import android.support.annotation.NonNull; import android.support.annotation.Nullable; -import android.support.v4.content.ContextCompat; import android.text.Spannable; import android.text.SpannableStringBuilder; import android.text.style.ForegroundColorSpan; @@ -146,6 +147,16 @@ public class InAppPurchases { 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) { return FULL_VERSION.getSku().equals(sku); } @@ -570,7 +581,7 @@ public class InAppPurchases { 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(); String singleUnitStr = getUnitString(ctx).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)); Typeface typefaceRegular = FontCache.getRobotoRegular(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); - int textColor = ContextCompat.getColor(ctx, R.color.white_50_transparent); - thenPart.setSpan(new ForegroundColorSpan(textColor), 0, thenPart.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + int secondaryTextColor = Color.argb(128, Color.red(textColor), Color.green(textColor), Color.blue(textColor)); + thenPart.setSpan(new ForegroundColorSpan(secondaryTextColor), 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);