From ba1cba9547c7ea8d87ba44c94fe89c127247e874 Mon Sep 17 00:00:00 2001 From: hogliux Date: Thu, 24 Aug 2017 17:28:26 +0100 Subject: [PATCH] IAP: Ensured that IAP can compile even on platforms that don't support IAP --- examples/InAppPurchase/Source/Main.cpp | 9 --- .../InAppPurchase/Source/VoicePurchases.h | 35 ++++++--- .../in_app_purchases/juce_InAppPurchases.cpp | 74 +++++++++++++++++-- .../in_app_purchases/juce_InAppPurchases.h | 2 + .../juce_product_unlocking.cpp | 13 ++-- .../juce_product_unlocking.h | 4 +- 6 files changed, 101 insertions(+), 36 deletions(-) diff --git a/examples/InAppPurchase/Source/Main.cpp b/examples/InAppPurchase/Source/Main.cpp index dbab1e67a6..d2dd5c3ba6 100644 --- a/examples/InAppPurchase/Source/Main.cpp +++ b/examples/InAppPurchase/Source/Main.cpp @@ -48,15 +48,6 @@ public: dm.initialiseWithDefaultDevices (0, 2); mainWindow = new MainWindow; - - Timer::callAfterDelay(1000, [] () - { - AlertWindow::showMessageBoxAsync (AlertWindow::WarningIcon, - "Your credit card will be charged!", - "You are running the sample code for JUCE In-App purchases." - "Although this is only sample code, it will still CHARGE YOUR CREDIT CARD!", - "Understood!"); - }); } void shutdown() override diff --git a/examples/InAppPurchase/Source/VoicePurchases.h b/examples/InAppPurchase/Source/VoicePurchases.h index a64d856bda..e3052eb628 100644 --- a/examples/InAppPurchase/Source/VoicePurchases.h +++ b/examples/InAppPurchase/Source/VoicePurchases.h @@ -97,7 +97,25 @@ private: //============================================================================== void productsInfoReturned (const Array& products) override { - if (products.size() != 0) + if (! inAppPurchases.isInAppPurchasesSupported()) + { + for (auto idx = 1; idx < voiceProducts.size(); ++idx) + { + auto& voiceProduct = voiceProducts.getReference (idx); + + voiceProduct.isPurchased = false; + voiceProduct.priceIsKnown = false; + voiceProduct.purchasePrice = "In-App purcahses unavailable"; + } + + AlertWindow::showMessageBoxAsync (AlertWindow::WarningIcon, + "In-app purchase is unavailable!", + "In-App purchases are not available. This either means you are trying " + "to use IAP on a platform that does not support IAP or you haven't setup " + "your app correctly to work with IAP.", + "OK"); + } + else { for (auto product : products) { @@ -111,17 +129,12 @@ private: voiceProduct.purchasePrice = product.price; } } - } - else if (! inAppPurchases.isInAppPurchasesSupported()) - { - for (auto idx = 1; idx < voiceProducts.size(); ++idx) - { - auto& voiceProduct = voiceProducts.getReference (idx); - voiceProduct.isPurchased = false; - voiceProduct.priceIsKnown = false; - voiceProduct.purchasePrice = "In-App purcahses unavailable"; - } + AlertWindow::showMessageBoxAsync (AlertWindow::WarningIcon, + "Your credit card will be charged!", + "You are running the sample code for JUCE In-App purchases. " + "Although this is only sample code, it will still CHARGE YOUR CREDIT CARD!", + "Understood!"); } guiUpdater.triggerAsyncUpdate(); diff --git a/modules/juce_product_unlocking/in_app_purchases/juce_InAppPurchases.cpp b/modules/juce_product_unlocking/in_app_purchases/juce_InAppPurchases.cpp index 3af1a701f0..341ba1a0ad 100644 --- a/modules/juce_product_unlocking/in_app_purchases/juce_InAppPurchases.cpp +++ b/modules/juce_product_unlocking/in_app_purchases/juce_InAppPurchases.cpp @@ -25,17 +25,33 @@ */ -InAppPurchases::InAppPurchases() : pimpl (new Pimpl (*this)) {} +InAppPurchases::InAppPurchases() + #if JUCE_ANDROID || JUCE_IOS + : pimpl (new Pimpl (*this)) + #endif +{} InAppPurchases::~InAppPurchases() {} bool InAppPurchases::isInAppPurchasesSupported() const { + #if JUCE_ANDROID || JUCE_IOS return pimpl->isInAppPurchasesSupported(); + #else + return false; + #endif } void InAppPurchases::getProductsInformation (const StringArray& productIdentifiers) { + #if JUCE_ANDROID || JUCE_IOS pimpl->getProductsInformation (productIdentifiers); + #else + Array products; + for (auto productId : productIdentifiers) + products.add (Product {productId}); + + listeners.call (&Listener::productsInfoReturned, products); + #endif } void InAppPurchases::purchaseProduct (const String& productIdentifier, @@ -43,24 +59,72 @@ void InAppPurchases::purchaseProduct (const String& productIdentifier, const StringArray& upgradeProductIdentifiers, bool creditForUnusedSubscription) { + #if JUCE_ANDROID || JUCE_IOS pimpl->purchaseProduct (productIdentifier, isSubscription, upgradeProductIdentifiers, creditForUnusedSubscription); + #else + Listener::PurchaseInfo purchaseInfo { Purchase {"", productIdentifier}, {} }; + + listeners.call (&Listener::productPurchaseFinished, purchaseInfo, false, "In-app purchases unavailable"); + ignoreUnused (isSubscription, upgradeProductIdentifiers, creditForUnusedSubscription); + #endif } void InAppPurchases::restoreProductsBoughtList (bool includeDownloadInfo, const String& subscriptionsSharedSecret) { + #if JUCE_ANDROID || JUCE_IOS pimpl->restoreProductsBoughtList (includeDownloadInfo, subscriptionsSharedSecret); + #else + listeners.call (&Listener::purchasesListRestored, Array(), false, "In-app purchases unavailable"); + ignoreUnused (includeDownloadInfo, subscriptionsSharedSecret); + #endif } void InAppPurchases::consumePurchase (const String& productIdentifier, const String& purchaseToken) { + #if JUCE_ANDROID || JUCE_IOS pimpl->consumePurchase (productIdentifier, purchaseToken); + #else + listeners.call (&Listener::productConsumed, productIdentifier, false, "In-app purchases unavailable"); + ignoreUnused (purchaseToken); + #endif } void InAppPurchases::addListener (Listener* l) { listeners.add (l); } void InAppPurchases::removeListener (Listener* l) { listeners.remove (l); } -void InAppPurchases::startDownloads (const Array& downloads) { pimpl->startDownloads (downloads); } -void InAppPurchases::pauseDownloads (const Array& downloads) { pimpl->pauseDownloads (downloads); } -void InAppPurchases::resumeDownloads (const Array& downloads) { pimpl->resumeDownloads (downloads); } -void InAppPurchases::cancelDownloads (const Array& downloads) { pimpl->cancelDownloads (downloads); } +void InAppPurchases::startDownloads (const Array& downloads) +{ + #if JUCE_ANDROID || JUCE_IOS + pimpl->startDownloads (downloads); + #else + ignoreUnused (downloads); + #endif +} + +void InAppPurchases::pauseDownloads (const Array& downloads) +{ + #if JUCE_ANDROID || JUCE_IOS + pimpl->pauseDownloads (downloads); + #else + ignoreUnused (downloads); + #endif +} + +void InAppPurchases::resumeDownloads (const Array& downloads) +{ + #if JUCE_ANDROID || JUCE_IOS + pimpl->resumeDownloads (downloads); + #else + ignoreUnused (downloads); + #endif +} + +void InAppPurchases::cancelDownloads (const Array& downloads) +{ + #if JUCE_ANDROID || JUCE_IOS + pimpl->cancelDownloads (downloads); + #else + ignoreUnused (downloads); + #endif +} diff --git a/modules/juce_product_unlocking/in_app_purchases/juce_InAppPurchases.h b/modules/juce_product_unlocking/in_app_purchases/juce_InAppPurchases.h index be49f7e2d4..45695d86a3 100644 --- a/modules/juce_product_unlocking/in_app_purchases/juce_InAppPurchases.h +++ b/modules/juce_product_unlocking/in_app_purchases/juce_InAppPurchases.h @@ -262,8 +262,10 @@ private: friend void juce_inAppPurchaseCompleted (void*); #endif + #if JUCE_ANDROID || JUCE_IOS struct Pimpl; friend struct Pimpl; ScopedPointer pimpl; + #endif }; diff --git a/modules/juce_product_unlocking/juce_product_unlocking.cpp b/modules/juce_product_unlocking/juce_product_unlocking.cpp index e0a54eb6b1..aa15069954 100644 --- a/modules/juce_product_unlocking/juce_product_unlocking.cpp +++ b/modules/juce_product_unlocking/juce_product_unlocking.cpp @@ -50,16 +50,13 @@ namespace juce { - #if JUCE_ANDROID || JUCE_IOS - #if JUCE_ANDROID - #include "native/juce_android_InAppPurchases.cpp" - #elif JUCE_IOS - #include "native/juce_ios_InAppPurchases.cpp" - #endif - - #include "in_app_purchases/juce_InAppPurchases.cpp" + #if JUCE_ANDROID + #include "native/juce_android_InAppPurchases.cpp" + #elif JUCE_IOS + #include "native/juce_ios_InAppPurchases.cpp" #endif + #include "in_app_purchases/juce_InAppPurchases.cpp" #include "marketplace/juce_OnlineUnlockStatus.cpp" #if JUCE_MODULE_AVAILABLE_juce_data_structures diff --git a/modules/juce_product_unlocking/juce_product_unlocking.h b/modules/juce_product_unlocking/juce_product_unlocking.h index 68ef5287c6..e715afbf16 100644 --- a/modules/juce_product_unlocking/juce_product_unlocking.h +++ b/modules/juce_product_unlocking/juce_product_unlocking.h @@ -79,9 +79,7 @@ namespace juce { - #if JUCE_ANDROID || JUCE_IOS - #include "in_app_purchases/juce_InAppPurchases.h" - #endif + #include "in_app_purchases/juce_InAppPurchases.h" #if JUCE_MODULE_AVAILABLE_juce_data_structures #include "marketplace/juce_OnlineUnlockStatus.h"