123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710 |
- /*
- * Copyright (c) Contributors to the Open 3D Engine Project.
- * For complete copyright and license terms please see the LICENSE at the root of this distribution.
- *
- * SPDX-License-Identifier: Apache-2.0 OR MIT
- *
- */
- #include <time.h>
- #include <AzCore/RTTI/BehaviorContext.h>
- #include <AzCore/Serialization/SerializeContext.h>
- #include <AzCore/Serialization/EditContext.h>
- #include <AzCore/IO/FileIO.h>
- #include <AzCore/Outcome/Outcome.h>
- #include <AzCore/JSON/document.h>
- #include <AzCore/JSON/error/en.h>
- #include "InAppPurchases/InAppPurchasesResponseBus.h"
- #include "InAppPurchasesSystemComponent.h"
- namespace InAppPurchases
- {
- void SystemComponent::Init()
- {
- }
- void SystemComponent::Activate()
- {
- m_productInfoIndex = 0;
- m_purchasedProductInfoIndex = 0;
- InAppPurchasesRequestBus::Handler::BusConnect();
- InAppPurchasesResponseAccessorBus::Handler::BusConnect();
- }
- void SystemComponent::Deactivate()
- {
- // The instance is created on the first call to GetInstance()
- InAppPurchasesInterface::DestroyInstance();
- InAppPurchasesRequestBus::Handler::BusDisconnect();
- InAppPurchasesResponseAccessorBus::Handler::BusDisconnect();
- }
- void SystemComponent::Reflect(AZ::ReflectContext* context)
- {
- if (AZ::SerializeContext* serialize = azrtti_cast<AZ::SerializeContext*>(context))
- {
- serialize->Class<SystemComponent, AZ::Component>()
- ->Version(0)
- ;
- if (AZ::EditContext* ec = serialize->GetEditContext())
- {
- ec->Class<SystemComponent>("InAppPurchases", "Adds support for in app purchases on iOS and Android")
- ->ClassElement(AZ::Edit::ClassElements::EditorData, "")
- ->Attribute(AZ::Edit::Attributes::AutoExpand, true)
- ;
- }
- }
- if (AZ::BehaviorContext* behaviorContext = azrtti_cast<AZ::BehaviorContext*>(context))
- {
- behaviorContext->EBus<InAppPurchasesRequestBus>("InAppPurchasesRequestBus")
- ->Event("Initialize", &InAppPurchasesRequestBus::Events::Initialize)
- ->Event("QueryProductInfo", &InAppPurchasesRequestBus::Events::QueryProductInfo)
- ->Event("QueryProductInfoFromJson", &InAppPurchasesRequestBus::Events::QueryProductInfoFromJson)
- ->Event("PurchaseProductWithDeveloperPayload", &InAppPurchasesRequestBus::Events::PurchaseProductWithDeveloperPayload)
- ->Event("PurchaseProduct", &InAppPurchasesRequestBus::Events::PurchaseProduct)
- ->Event("QueryPurchasedProducts", &InAppPurchasesRequestBus::Events::QueryPurchasedProducts)
- ->Event("ConsumePurchase", &InAppPurchasesRequestBus::Events::ConsumePurchase)
- ->Event("FinishTransaction", &InAppPurchasesRequestBus::Events::FinishTransaction)
- ;
- behaviorContext->EBus<InAppPurchasesResponseAccessorBus>("InAppPurchasesResponseAccessorBus")
- ->Event("NextProduct", &InAppPurchasesResponseAccessorBus::Events::GetNextProduct)
- ->Event("PreviousProduct", &InAppPurchasesResponseAccessorBus::Events::GetPreviousProduct)
- ->Event("NextPurchasedProduct", &InAppPurchasesResponseAccessorBus::Events::GetNextPurchasedProduct)
- ->Event("PreviousPurchasedProduct", &InAppPurchasesResponseAccessorBus::Events::GetPreviousPurchasedProduct)
- ->Event("ProductId", &InAppPurchasesResponseAccessorBus::Events::GetProductId)
- ->Event("ProductTitle", &InAppPurchasesResponseAccessorBus::Events::GetProductTitle)
- ->Event("ProductDescription", &InAppPurchasesResponseAccessorBus::Events::GetProductDescription)
- ->Event("ProductPrice", &InAppPurchasesResponseAccessorBus::Events::GetProductPrice)
- ->Event("ProductCurrencyCode", &InAppPurchasesResponseAccessorBus::Events::GetProductCurrencyCode)
- ->Event("ProductPriceMicro", &InAppPurchasesResponseAccessorBus::Events::GetProductPriceMicro)
- ->Event("PurchasedProductId", &InAppPurchasesResponseAccessorBus::Events::GetPurchasedProductId)
- ->Event("PurchaseTime", &InAppPurchasesResponseAccessorBus::Events::GetPurchaseTime)
- ->Event("OrderId", &InAppPurchasesResponseAccessorBus::Events::GetOrderId)
- ->Event("DeveloperPayload", &InAppPurchasesResponseAccessorBus::Events::GetDeveloperPayload)
- ->Event("PurchaseSignature", &InAppPurchasesResponseAccessorBus::Events::GetPurchaseSignature)
- ->Event("PackageName", &InAppPurchasesResponseAccessorBus::Events::GetPackageName)
- ->Event("PurchaseToken", &InAppPurchasesResponseAccessorBus::Events::GetPurchaseToken)
- ->Event("IsAutoRenewing", &InAppPurchasesResponseAccessorBus::Events::IsAutoRenewing)
- ->Event("RestoredOrderId", &InAppPurchasesResponseAccessorBus::Events::GetRestoredOrderId)
- ->Event("SubscriptionExpirationTime", &InAppPurchasesResponseAccessorBus::Events::GetSubscriptionExpirationTime)
- ->Event("RestoredPurchaseTime", &InAppPurchasesResponseAccessorBus::Events::GetRestoredPurchaseTime)
- ->Event("HasDownloads", &InAppPurchasesResponseAccessorBus::Events::HasDownloads)
- ->Event("IsProductOwned", &InAppPurchasesResponseAccessorBus::Events::IsProductOwned)
- ->Event("ResetIndices", &InAppPurchasesResponseAccessorBus::Events::ResetIndices)
- ;
- }
- }
- void SystemComponent::GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided)
- {
- provided.push_back(AZ_CRC_CE("InAppPurchasesService"));
- }
- void SystemComponent::GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatible)
- {
- incompatible.push_back(AZ_CRC_CE("InAppPurchasesService"));
- }
- void SystemComponent::GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required)
- {
- (void)required;
- }
- void SystemComponent::GetDependentServices(AZ::ComponentDescriptor::DependencyArrayType& dependent)
- {
- (void)dependent;
- }
- void SystemComponent::Initialize()
- {
- if (InAppPurchasesInterface::GetInstance() != nullptr)
- {
- InAppPurchasesInterface::GetInstance()->Initialize();
- }
- }
- void SystemComponent::QueryProductInfoById(const AZStd::string& productId) const
- {
- AZStd::vector<AZStd::string> productIds;
- productIds.push_back(productId);
- SystemComponent::QueryProductInfoByIds(productIds);
- }
- void SystemComponent::QueryProductInfoByIds(AZStd::vector<AZStd::string>& productIds) const
- {
- if (InAppPurchasesInterface::GetInstance() != nullptr)
- {
- InAppPurchasesInterface::GetInstance()->QueryProductInfo(productIds);
- }
- }
- void SystemComponent::QueryProductInfo() const
- {
- if (InAppPurchasesInterface::GetInstance() != nullptr)
- {
- InAppPurchasesInterface::GetInstance()->QueryProductInfo();
- }
- }
- void SystemComponent::QueryProductInfoFromJson(const AZStd::string& jsonFilePath) const
- {
- if (InAppPurchasesInterface::GetInstance() != nullptr)
- {
- AZ::IO::FileIOBase* fileReader = AZ::IO::FileIOBase::GetInstance();
- AZStd::string fileBuffer;
- AZ::IO::HandleType fileHandle = AZ::IO::InvalidHandle;
- AZ::u64 fileSize = 0;
- if (!fileReader->Open(jsonFilePath.c_str(), AZ::IO::OpenMode::ModeRead | AZ::IO::OpenMode::ModeBinary, fileHandle))
- {
- AZ::Failure(AZStd::string::format("Failed to read %s - unable to open file", jsonFilePath.c_str()));
- return;
- }
- if ((!fileReader->Size(fileHandle, fileSize)) || (fileSize == 0))
- {
- fileReader->Close(fileHandle);
- AZ::Failure(AZStd::string::format("Failed to read %s - file truncated.", jsonFilePath.c_str()));
- return;
- }
- fileBuffer.resize(fileSize);
- if (!fileReader->Read(fileHandle, fileBuffer.data(), fileSize, true))
- {
- fileBuffer.resize(0);
- fileReader->Close(fileHandle);
- AZ::Failure(AZStd::string::format("Failed to read %s - file read failed.", jsonFilePath.c_str()));
- return;
- }
- fileReader->Close(fileHandle);
- rapidjson::Document doc;
- doc.Parse(fileBuffer.data());
- if (doc.HasParseError())
- {
- AZ_Warning("LumberyardInAppBilling", false, "Failed to parse product_ids: %s\n", rapidjson::GetParseError_En(doc.GetParseError()));
- return;
- }
- AZStd::vector<AZStd::string> productIdsVec;
- if (doc.HasMember("product_ids") && doc["product_ids"].GetType() == rapidjson::kArrayType)
- {
- rapidjson::Value& productIdsArray = doc["product_ids"];
- for (rapidjson::Value::ConstValueIterator itr = productIdsArray.Begin(); itr != productIdsArray.End(); itr++)
- {
- if ((*itr).HasMember("id"))
- {
- productIdsVec.push_back((*itr)["id"].GetString());
- }
- }
- InAppPurchasesInterface::GetInstance()->QueryProductInfo(productIdsVec);
- }
- else
- {
- AZ_Warning("O3DEInAppPurchases", false, "The JSON string provided does not contain an array named ProductIds!(Property *has* to be an array)");
- }
- }
- }
- const AZStd::vector<AZStd::unique_ptr<ProductDetails const> >* SystemComponent::GetCachedProductInfo() const
- {
- if (InAppPurchasesInterface::GetInstance() != nullptr)
- {
- return &InAppPurchasesInterface::GetInstance()->GetCache()->GetCachedProductDetails();
- }
- return nullptr;
- }
- const AZStd::vector<AZStd::unique_ptr<PurchasedProductDetails const> >* SystemComponent::GetCachedPurchasedProductInfo() const
- {
- if (InAppPurchasesInterface::GetInstance() != nullptr)
- {
- return &InAppPurchasesInterface::GetInstance()->GetCache()->GetCachedPurchasedProductDetails();
- }
- return nullptr;
- }
- void SystemComponent::PurchaseProductWithDeveloperPayload(const AZStd::string& productId, const AZStd::string& developerPayload) const
- {
- if (InAppPurchasesInterface::GetInstance() != nullptr)
- {
- InAppPurchasesInterface::GetInstance()->PurchaseProduct(productId, developerPayload);
- }
- }
- void SystemComponent::PurchaseProduct(const AZStd::string& productId) const
- {
- if (InAppPurchasesInterface::GetInstance() != nullptr)
- {
- InAppPurchasesInterface::GetInstance()->PurchaseProduct(productId);
- }
- }
- void SystemComponent::QueryPurchasedProducts() const
- {
- if (InAppPurchasesInterface::GetInstance() != nullptr)
- {
- InAppPurchasesInterface::GetInstance()->QueryPurchasedProducts();
- }
- }
- void SystemComponent::RestorePurchasedProducts() const
- {
- if (InAppPurchasesInterface::GetInstance() != nullptr)
- {
- InAppPurchasesInterface::GetInstance()->RestorePurchasedProducts();
- }
- }
- void SystemComponent::ConsumePurchase(const AZStd::string& purchaseToken) const
- {
- if (InAppPurchasesInterface::GetInstance() != nullptr)
- {
- InAppPurchasesInterface::GetInstance()->ConsumePurchase(purchaseToken);
- }
- }
- void SystemComponent::FinishTransaction(const AZStd::string& transactionId, bool downloadHostedContent) const
- {
- if (InAppPurchasesInterface::GetInstance() != nullptr)
- {
- InAppPurchasesInterface::GetInstance()->FinishTransaction(transactionId, downloadHostedContent);
- }
- }
- void SystemComponent::ClearCachedProductDetails()
- {
- if (InAppPurchasesInterface::GetInstance() != nullptr)
- {
- InAppPurchasesInterface::GetInstance()->GetCache()->ClearCachedProductDetails();
- }
- }
- void SystemComponent::ClearCachedPurchasedProductDetails()
- {
- if (InAppPurchasesInterface::GetInstance() != nullptr)
- {
- InAppPurchasesInterface::GetInstance()->GetCache()->ClearCachedPurchasedProductDetails();
- }
- }
- bool SystemComponent::GetNextProduct()
- {
- m_productInfoIndex++;
- const AZStd::vector<AZStd::unique_ptr<ProductDetails const> >* productDetails = nullptr;
- InAppPurchases::InAppPurchasesRequestBus::BroadcastResult(productDetails, &InAppPurchases::InAppPurchasesRequestBus::Events::GetCachedProductInfo);
- if (productDetails != nullptr)
- {
- if (m_productInfoIndex >= productDetails->size())
- {
- m_productInfoIndex = 0;
- }
- if (productDetails->size() > 0)
- {
- return true;
- }
- }
- return false;
- }
- bool SystemComponent::GetPreviousProduct()
- {
- m_productInfoIndex--;
- const AZStd::vector<AZStd::unique_ptr<ProductDetails const> >* productDetails = nullptr;
- InAppPurchases::InAppPurchasesRequestBus::BroadcastResult(
- productDetails, &InAppPurchases::InAppPurchasesRequestBus::Events::GetCachedProductInfo);
- if (productDetails != nullptr)
- {
- if (m_productInfoIndex < 0)
- {
- m_productInfoIndex = static_cast<int>(productDetails->size() - 1);
- }
- if (productDetails->size() > 0)
- {
- return true;
- }
- }
- return false;
- }
- bool SystemComponent::GetNextPurchasedProduct()
- {
- m_purchasedProductInfoIndex++;
- const AZStd::vector<AZStd::unique_ptr<PurchasedProductDetails const> >* purchasedProductDetails = nullptr;
- InAppPurchases::InAppPurchasesRequestBus::BroadcastResult(
- purchasedProductDetails, &InAppPurchases::InAppPurchasesRequestBus::Events::GetCachedPurchasedProductInfo);
- if (purchasedProductDetails != nullptr)
- {
- if (m_purchasedProductInfoIndex >= purchasedProductDetails->size())
- {
- m_purchasedProductInfoIndex = 0;
- }
- if (purchasedProductDetails->size() > 0)
- {
- return true;
- }
- }
- return false;
- }
- bool SystemComponent::GetPreviousPurchasedProduct()
- {
- m_purchasedProductInfoIndex--;
- const AZStd::vector<AZStd::unique_ptr<PurchasedProductDetails const> >* purchasedProductDetails = nullptr;
- InAppPurchases::InAppPurchasesRequestBus::BroadcastResult(
- purchasedProductDetails, &InAppPurchases::InAppPurchasesRequestBus::Events::GetCachedPurchasedProductInfo);
- if (purchasedProductDetails != nullptr)
- {
- if (m_purchasedProductInfoIndex < 0)
- {
- m_purchasedProductInfoIndex = static_cast<int>(purchasedProductDetails->size() - 1);
- }
- if (purchasedProductDetails->size() > 0)
- {
- return true;
- }
- }
- return false;
- }
- AZStd::string SystemComponent::GetProductId()
- {
- const AZStd::vector<AZStd::unique_ptr<ProductDetails const> >* productDetails = nullptr;
- InAppPurchases::InAppPurchasesRequestBus::BroadcastResult(
- productDetails, &InAppPurchases::InAppPurchasesRequestBus::Events::GetCachedProductInfo);
- if (productDetails != nullptr && m_productInfoIndex >= 0 && m_productInfoIndex < productDetails->size())
- {
- return productDetails->at(m_productInfoIndex)->GetProductId();
- }
- return "";
- }
- AZStd::string SystemComponent::GetProductTitle()
- {
- const AZStd::vector<AZStd::unique_ptr<ProductDetails const> >* productDetails = nullptr;
- InAppPurchases::InAppPurchasesRequestBus::BroadcastResult(
- productDetails, &InAppPurchases::InAppPurchasesRequestBus::Events::GetCachedProductInfo);
- if (productDetails != nullptr && m_productInfoIndex >= 0 && m_productInfoIndex < productDetails->size())
- {
- return productDetails->at(m_productInfoIndex)->GetProductTitle();
- }
- return "";
- }
- AZStd::string SystemComponent::GetProductDescription()
- {
- const AZStd::vector<AZStd::unique_ptr<ProductDetails const> >* productDetails = nullptr;
- InAppPurchases::InAppPurchasesRequestBus::BroadcastResult(
- productDetails, &InAppPurchases::InAppPurchasesRequestBus::Events::GetCachedProductInfo);
- if (productDetails != nullptr && m_productInfoIndex >= 0 && m_productInfoIndex < productDetails->size())
- {
- return productDetails->at(m_productInfoIndex)->GetProductDescription();
- }
- return "";
- }
- AZStd::string SystemComponent::GetProductPrice()
- {
- const AZStd::vector<AZStd::unique_ptr<ProductDetails const> >* productDetails = nullptr;
- InAppPurchases::InAppPurchasesRequestBus::BroadcastResult(
- productDetails, &InAppPurchases::InAppPurchasesRequestBus::Events::GetCachedProductInfo);
- if (productDetails != nullptr && m_productInfoIndex >= 0 && m_productInfoIndex < productDetails->size())
- {
- return productDetails->at(m_productInfoIndex)->GetProductPrice();
- }
- return "";
- }
- AZStd::string SystemComponent::GetProductCurrencyCode()
- {
- const AZStd::vector<AZStd::unique_ptr<ProductDetails const> >* productDetails = nullptr;
- InAppPurchases::InAppPurchasesRequestBus::BroadcastResult(
- productDetails, &InAppPurchases::InAppPurchasesRequestBus::Events::GetCachedProductInfo);
- if (productDetails != nullptr && m_productInfoIndex >= 0 && m_productInfoIndex < productDetails->size())
- {
- return productDetails->at(m_productInfoIndex)->GetProductCurrencyCode();
- }
- return "";
- }
- AZ::u64 SystemComponent::GetProductPriceMicro()
- {
- const AZStd::vector<AZStd::unique_ptr<ProductDetails const> >* productDetails = nullptr;
- InAppPurchases::InAppPurchasesRequestBus::BroadcastResult(
- productDetails, &InAppPurchases::InAppPurchasesRequestBus::Events::GetCachedProductInfo);
- if (productDetails != nullptr && m_productInfoIndex >= 0 && m_productInfoIndex < productDetails->size())
- {
- return productDetails->at(m_productInfoIndex)->GetProductPriceMicro();
- }
- return 0;
- }
- AZStd::string SystemComponent::GetPurchasedProductId()
- {
- const AZStd::vector<AZStd::unique_ptr<PurchasedProductDetails const> >* purchasedProductDetails = nullptr;
- InAppPurchases::InAppPurchasesRequestBus::BroadcastResult(
- purchasedProductDetails, &InAppPurchases::InAppPurchasesRequestBus::Events::GetCachedPurchasedProductInfo);
- if (purchasedProductDetails != nullptr && m_purchasedProductInfoIndex >= 0 && m_purchasedProductInfoIndex < purchasedProductDetails->size())
- {
- return purchasedProductDetails->at(m_purchasedProductInfoIndex)->GetProductId();
- }
- return "";
- }
- AZStd::string SystemComponent::GetOrderId()
- {
- const AZStd::vector<AZStd::unique_ptr<PurchasedProductDetails const> >* purchasedProductDetails = nullptr;
- InAppPurchases::InAppPurchasesRequestBus::BroadcastResult(
- purchasedProductDetails, &InAppPurchases::InAppPurchasesRequestBus::Events::GetCachedPurchasedProductInfo);
- if (purchasedProductDetails != nullptr && m_purchasedProductInfoIndex >= 0 && m_purchasedProductInfoIndex < purchasedProductDetails->size())
- {
- return purchasedProductDetails->at(m_purchasedProductInfoIndex)->GetOrderId();
- }
- return "";
- }
- AZStd::string SystemComponent::GetDeveloperPayload()
- {
- const AZStd::vector<AZStd::unique_ptr<PurchasedProductDetails const> >* purchasedProductDetails = nullptr;
- InAppPurchases::InAppPurchasesRequestBus::BroadcastResult(
- purchasedProductDetails, &InAppPurchases::InAppPurchasesRequestBus::Events::GetCachedPurchasedProductInfo);
- if (purchasedProductDetails != nullptr && m_purchasedProductInfoIndex >= 0 && m_purchasedProductInfoIndex < purchasedProductDetails->size())
- {
- return purchasedProductDetails->at(m_purchasedProductInfoIndex)->GetDeveloperPayload();
- }
- return "";
- }
- AZStd::string SystemComponent::GetPurchaseTime()
- {
- const AZStd::vector<AZStd::unique_ptr<PurchasedProductDetails const> >* purchasedProductDetails = nullptr;
- InAppPurchases::InAppPurchasesRequestBus::BroadcastResult(
- purchasedProductDetails, &InAppPurchases::InAppPurchasesRequestBus::Events::GetCachedPurchasedProductInfo);
- AZStd::string date;
- if (purchasedProductDetails != nullptr && m_purchasedProductInfoIndex >= 0 && m_purchasedProductInfoIndex < purchasedProductDetails->size())
- {
- AZ::u64 time = purchasedProductDetails->at(m_purchasedProductInfoIndex)->GetPurchaseTime();
- time_t t = static_cast<time_t>(time);
- tm local;
- azlocaltime(&t, &local);
- date.resize(24); // 3 (day) + 3 (month) + 2 (date) + 8 (time) + 4 (year) + 4 (spaces)
- strftime(date.data(), date.size(), "%a %b %d %H:%M:%S %Y", &local);
- }
- return date;
- }
- AZStd::string SystemComponent::GetPurchaseSignature()
- {
- const AZStd::vector<AZStd::unique_ptr<PurchasedProductDetails const> >* purchasedProductDetails = nullptr;
- InAppPurchases::InAppPurchasesRequestBus::BroadcastResult(
- purchasedProductDetails, &InAppPurchases::InAppPurchasesRequestBus::Events::GetCachedPurchasedProductInfo);
- if (purchasedProductDetails != nullptr && m_purchasedProductInfoIndex >= 0 && m_purchasedProductInfoIndex < purchasedProductDetails->size())
- {
- const PurchasedProductDetailsAndroid* purchasedProductsAndroid = azrtti_cast<const PurchasedProductDetailsAndroid*>(purchasedProductDetails->at(m_purchasedProductInfoIndex).get());
- if (purchasedProductsAndroid)
- {
- return purchasedProductsAndroid->GetPurchaseSignature();
- }
- }
- return "";
- }
- AZStd::string SystemComponent::GetPackageName()
- {
- const AZStd::vector<AZStd::unique_ptr<PurchasedProductDetails const> >* purchasedProductDetails = nullptr;
- InAppPurchases::InAppPurchasesRequestBus::BroadcastResult(
- purchasedProductDetails, &InAppPurchases::InAppPurchasesRequestBus::Events::GetCachedPurchasedProductInfo);
- if (purchasedProductDetails != nullptr && m_purchasedProductInfoIndex >= 0 && m_purchasedProductInfoIndex < purchasedProductDetails->size())
- {
- const PurchasedProductDetailsAndroid* purchasedProductsAndroid = azrtti_cast<const PurchasedProductDetailsAndroid*>(purchasedProductDetails->at(m_purchasedProductInfoIndex).get());
- if (purchasedProductsAndroid)
- {
- return purchasedProductsAndroid->GetPackageName();
- }
- }
- return "";
- }
- AZStd::string SystemComponent::GetPurchaseToken()
- {
- const AZStd::vector<AZStd::unique_ptr<PurchasedProductDetails const> >* purchasedProductDetails = nullptr;
- InAppPurchases::InAppPurchasesRequestBus::BroadcastResult(
- purchasedProductDetails, &InAppPurchases::InAppPurchasesRequestBus::Events::GetCachedPurchasedProductInfo);
- if (purchasedProductDetails != nullptr && m_purchasedProductInfoIndex >= 0 && m_purchasedProductInfoIndex < purchasedProductDetails->size())
- {
- const PurchasedProductDetailsAndroid* purchasedProductsAndroid = azrtti_cast<const PurchasedProductDetailsAndroid*>(purchasedProductDetails->at(m_purchasedProductInfoIndex).get());
- if (purchasedProductsAndroid)
- {
- return purchasedProductsAndroid->GetPurchaseToken();
- }
- }
- return "";
- }
- bool SystemComponent::IsAutoRenewing()
- {
- const AZStd::vector<AZStd::unique_ptr<PurchasedProductDetails const> >* purchasedProductDetails = nullptr;
- InAppPurchases::InAppPurchasesRequestBus::BroadcastResult(
- purchasedProductDetails, &InAppPurchases::InAppPurchasesRequestBus::Events::GetCachedPurchasedProductInfo);
- if (purchasedProductDetails != nullptr && m_purchasedProductInfoIndex >= 0 && m_purchasedProductInfoIndex < purchasedProductDetails->size())
- {
- const PurchasedProductDetailsAndroid* purchasedProductsAndroid = azrtti_cast<const PurchasedProductDetailsAndroid*>(purchasedProductDetails->at(m_purchasedProductInfoIndex).get());
- if (purchasedProductsAndroid)
- {
- return purchasedProductsAndroid->GetIsAutoRenewing();
- }
- }
- return false;
- }
- AZStd::string SystemComponent::GetRestoredOrderId()
- {
- const AZStd::vector<AZStd::unique_ptr<PurchasedProductDetails const> >* purchasedProductDetails = nullptr;
- InAppPurchases::InAppPurchasesRequestBus::BroadcastResult(
- purchasedProductDetails, &InAppPurchases::InAppPurchasesRequestBus::Events::GetCachedPurchasedProductInfo);
- if (purchasedProductDetails != nullptr && m_purchasedProductInfoIndex >= 0 && m_purchasedProductInfoIndex < purchasedProductDetails->size())
- {
- const PurchasedProductDetailsApple* purchasedProductsApple = azrtti_cast<const PurchasedProductDetailsApple*>(purchasedProductDetails->at(m_purchasedProductInfoIndex).get());
- if (purchasedProductsApple)
- {
- return purchasedProductsApple->GetRestoredOrderId();
- }
- }
- return "";
- }
- AZ::u64 SystemComponent::GetSubscriptionExpirationTime()
- {
- const AZStd::vector<AZStd::unique_ptr<PurchasedProductDetails const> >* purchasedProductDetails = nullptr;
- InAppPurchases::InAppPurchasesRequestBus::BroadcastResult(
- purchasedProductDetails, &InAppPurchases::InAppPurchasesRequestBus::Events::GetCachedPurchasedProductInfo);
- if (purchasedProductDetails != nullptr && m_purchasedProductInfoIndex >= 0 && m_purchasedProductInfoIndex < purchasedProductDetails->size())
- {
- const PurchasedProductDetailsApple* purchasedProductsApple = azrtti_cast<const PurchasedProductDetailsApple*>(purchasedProductDetails->at(m_purchasedProductInfoIndex).get());
- if (purchasedProductsApple)
- {
- return purchasedProductsApple->GetSubscriptionExpirationTime();
- }
- }
- return 0;
- }
- AZ::u64 SystemComponent::GetRestoredPurchaseTime()
- {
- const AZStd::vector<AZStd::unique_ptr<PurchasedProductDetails const> >* purchasedProductDetails = nullptr;
- InAppPurchases::InAppPurchasesRequestBus::BroadcastResult(
- purchasedProductDetails, &InAppPurchases::InAppPurchasesRequestBus::Events::GetCachedPurchasedProductInfo);
- if (purchasedProductDetails != nullptr && m_purchasedProductInfoIndex >= 0 && m_purchasedProductInfoIndex < purchasedProductDetails->size())
- {
- const PurchasedProductDetailsApple* purchasedProductsApple = azrtti_cast<const PurchasedProductDetailsApple*>(purchasedProductDetails->at(m_purchasedProductInfoIndex).get());
- if (purchasedProductsApple)
- {
- return purchasedProductsApple->GetRestoredPurchaseTime();
- }
- }
- return 0;
- }
- bool SystemComponent::HasDownloads()
- {
- const AZStd::vector<AZStd::unique_ptr<PurchasedProductDetails const> >* purchasedProductDetails = nullptr;
- InAppPurchases::InAppPurchasesRequestBus::BroadcastResult(
- purchasedProductDetails, &InAppPurchases::InAppPurchasesRequestBus::Events::GetCachedPurchasedProductInfo);
- if (purchasedProductDetails != nullptr && m_purchasedProductInfoIndex >= 0 && m_purchasedProductInfoIndex < purchasedProductDetails->size())
- {
- const PurchasedProductDetailsApple* purchasedProductsApple = azrtti_cast<const PurchasedProductDetailsApple*>(purchasedProductDetails->at(m_purchasedProductInfoIndex).get());
- if (purchasedProductsApple)
- {
- return purchasedProductsApple->GetHasDownloads();
- }
- }
- return false;
- }
- bool SystemComponent::IsProductOwned()
- {
- const AZStd::vector<AZStd::unique_ptr<PurchasedProductDetails const> >* purchasedProductDetails = nullptr;
- InAppPurchases::InAppPurchasesRequestBus::BroadcastResult(
- purchasedProductDetails, &InAppPurchases::InAppPurchasesRequestBus::Events::GetCachedPurchasedProductInfo);
- const AZStd::vector<AZStd::unique_ptr<ProductDetails const> >* productDetails = nullptr;
- InAppPurchases::InAppPurchasesRequestBus::BroadcastResult(
- productDetails, &InAppPurchases::InAppPurchasesRequestBus::Events::GetCachedProductInfo);
- if (purchasedProductDetails != nullptr && productDetails != nullptr)
- {
- if (m_productInfoIndex >= 0 && m_productInfoIndex < productDetails->size())
- {
- const AZStd::string& productId = productDetails->at(m_productInfoIndex)->GetProductId();
- for (int i = 0; i < purchasedProductDetails->size(); i++)
- {
- if (productId.compare(purchasedProductDetails->at(i)->GetProductId()) == 0)
- {
- return true;
- }
- }
- }
- }
- return false;
- }
- void SystemComponent::ResetIndices()
- {
- m_productInfoIndex = 0;
- m_purchasedProductInfoIndex = 0;
- }
- }
|