Files
o3de/Gems/InAppPurchases/Code/Source/InAppPurchasesSystemComponent.cpp
T
Esteban Papp 1f9b284de2 Merge branch 'development' into cmake/SPEC-7179
Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com>

# Conflicts:
#	Code/Editor/Plugins/ComponentEntityEditorPlugin/ComponentEntityEditorPlugin_precompiled.h
#	Code/Editor/Plugins/EditorCommon/EditorCommon_precompiled.h
#	Code/Editor/Plugins/EditorCommon/stdafx.cpp
#	Code/Editor/Plugins/FFMPEGPlugin/FFMPEGPlugin_precompiled.h
#	Code/Editor/Plugins/PerforcePlugin/PerforcePlugin_precompiled.h
#	Code/Editor/Plugins/ProjectSettingsTool/ProjectSettingsTool_precompiled.h
#	Code/Framework/AzToolsFramework/AzToolsFramework/AzToolsFramework_precompiled.h
#	Code/Tools/AssetProcessor/native/precompiled.h
#	Code/Tools/Standalone/StandaloneTools_precompiled.h
#	Gems/AssetMemoryAnalyzer/Code/Source/AssetMemoryAnalyzer_precompiled.h
#	Gems/Atom/Asset/ImageProcessingAtom/Code/Source/ImageProcessing_precompiled.h
#	Gems/Atom/RHI/DX12/Code/Source/RHI/Atom_RHI_DX12_precompiled.h
#	Gems/Atom/RHI/Metal/Code/Include/Platform/Mac/Atom_RHI_Metal_precompiled_Platform.h
#	Gems/Atom/RHI/Metal/Code/Include/Platform/iOS/Atom_RHI_Metal_precompiled_Platform.h
#	Gems/Atom/RHI/Metal/Code/Source/Atom_RHI_Metal_precompiled.h
#	Gems/Atom/RHI/Metal/Code/atom_rhi_metal_common_files.cmake
#	Gems/Atom/RHI/Null/Code/Source/Atom_RHI_Null_precompiled.h
#	Gems/Atom/RHI/Null/Code/atom_rhi_null_common_files.cmake
#	Gems/Atom/RHI/Vulkan/Code/Include/Platform/Android/Atom_RHI_Vulkan_precompiled_Platform.h
#	Gems/Atom/RHI/Vulkan/Code/Include/Platform/Linux/Atom_RHI_Vulkan_precompiled_Platform.h
#	Gems/Atom/RHI/Vulkan/Code/Include/Platform/Mac/Atom_RHI_Vulkan_precompiled_Platform.h
#	Gems/Atom/RHI/Vulkan/Code/Include/Platform/Windows/Atom_RHI_Vulkan_precompiled_Platform.h
#	Gems/Atom/RHI/Vulkan/Code/Source/Atom_RHI_Vulkan_precompiled.h
#	Gems/Atom/RHI/Vulkan/Code/Source/RHI/SwapChain.cpp
#	Gems/Atom/RHI/Vulkan/Code/atom_rhi_vulkan_common_files.cmake
#	Gems/AtomLyIntegration/AtomFont/Code/Include/AtomLyIntegration/AtomFont/AtomFont_precompiled.h
#	Gems/Blast/Code/Source/StdAfx.cpp
#	Gems/Camera/Code/Source/Camera_precompiled.h
#	Gems/EMotionFX/Code/Source/EMotionFX_precompiled.h
#	Gems/FastNoise/Code/Source/FastNoise_precompiled.h
#	Gems/Gestures/Code/Source/Gestures_precompiled.h
#	Gems/GradientSignal/Code/Source/GradientSignal_precompiled.h
#	Gems/GraphCanvas/Code/precompiled.h
#	Gems/ImGui/Code/Source/ImGui_precompiled.h
#	Gems/InAppPurchases/Code/Source/InAppPurchases_precompiled.h
#	Gems/LmbrCentral/Code/Source/LmbrCentral_precompiled.h
#	Gems/LmbrCentral/Code/Tests/ShapeGeometryUtilTest.cpp
#	Gems/LyShine/Code/Editor/UiCanvasEditor_precompiled.h
#	Gems/LyShine/Code/Source/Animation/LyShine_precompiled.h
#	Gems/LyShine/Code/Source/LyShine_precompiled.h
#	Gems/LyShineExamples/Code/Source/LyShineExamples_precompiled.h
#	Gems/Maestro/Code/Source/Cinematics/Maestro_precompiled.h
#	Gems/Maestro/Code/Source/Maestro_precompiled.h
#	Gems/MessagePopup/Code/Source/MessagePopup_precompiled.h
#	Gems/Metastream/Code/Source/Metastream_precompiled.h
#	Gems/Microphone/Code/Source/Microphone_precompiled.h
#	Gems/Multiplayer/Code/Source/Multiplayer_precompiled.h
#	Gems/PhysX/Code/NumericalMethods/Source/NumericalMethods_precompiled.h
#	Gems/PhysX/Code/Source/PhysXUnsupported_precompiled.h
#	Gems/PhysX/Code/Source/PhysX_precompiled.h
#	Gems/PhysX/Code/physx_unsupported_files.cmake
#	Gems/PhysXDebug/Code/Source/PhysXDebugUnsupported_precompiled.h
#	Gems/PhysXDebug/Code/Source/PhysXDebug_precompiled.h
#	Gems/ScriptCanvas/Code/Editor/precompiled.h
#	Gems/ScriptCanvas/Code/Source/precompiled.h
#	Gems/ScriptCanvasDeveloper/Code/Source/precompiled.h
#	Gems/ScriptCanvasPhysics/Code/Source/ScriptCanvasPhysics_precompiled.h
#	Gems/ScriptEvents/Code/Source/precompiled.h
#	Gems/ScriptEvents/Code/Tests/Editor/EditorTests.cpp
#	Gems/ScriptedEntityTweener/Code/Source/ScriptedEntityTweener_precompiled.h
#	Gems/SliceFavorites/Code/Source/SliceFavorites_precompiled.h
#	Gems/StartingPointCamera/Code/Source/StartingPointCamera_precompiled.h
#	Gems/StartingPointInput/Code/Source/StartingPointInput_precompiled.h
#	Gems/StartingPointMovement/Code/Source/StartingPointMovement_precompiled.h
#	Gems/SurfaceData/Code/Source/SurfaceData_precompiled.h
#	Gems/TextureAtlas/Code/Source/TextureAtlas_precompiled.h
#	Gems/TickBusOrderViewer/Code/Source/TickBusOrderViewer_precompiled.h
#	Gems/Twitch/Code/Source/Twitch_precompiled.h
#	Gems/VirtualGamepad/Code/Source/VirtualGamepad_precompiled.h
#	Gems/WhiteBox/Code/Source/WhiteBoxUnsupported_precompiled.h
#	Gems/WhiteBox/Code/Source/WhiteBox_precompiled.h
2021-07-16 15:42:37 -07:00

686 lines
28 KiB
C++

/*
* 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 <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::AppearsInAddComponentMenu, AZ_CRC("System"))
->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("InAppPurchasesService"));
}
void SystemComponent::GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatible)
{
incompatible.push_back(AZ_CRC("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;
EBUS_EVENT_RESULT(productDetails, InAppPurchases::InAppPurchasesRequestBus, 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;
EBUS_EVENT_RESULT(productDetails, InAppPurchases::InAppPurchasesRequestBus, GetCachedProductInfo);
if (productDetails != nullptr)
{
if (m_productInfoIndex < 0)
{
m_productInfoIndex = 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;
EBUS_EVENT_RESULT(purchasedProductDetails, InAppPurchases::InAppPurchasesRequestBus, 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;
EBUS_EVENT_RESULT(purchasedProductDetails, InAppPurchases::InAppPurchasesRequestBus, GetCachedPurchasedProductInfo);
if (purchasedProductDetails != nullptr)
{
if (m_purchasedProductInfoIndex < 0)
{
m_purchasedProductInfoIndex = 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;
EBUS_EVENT_RESULT(productDetails, InAppPurchases::InAppPurchasesRequestBus, 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;
EBUS_EVENT_RESULT(productDetails, InAppPurchases::InAppPurchasesRequestBus, 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;
EBUS_EVENT_RESULT(productDetails, InAppPurchases::InAppPurchasesRequestBus, 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;
EBUS_EVENT_RESULT(productDetails, InAppPurchases::InAppPurchasesRequestBus, 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;
EBUS_EVENT_RESULT(productDetails, InAppPurchases::InAppPurchasesRequestBus, 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;
EBUS_EVENT_RESULT(productDetails, InAppPurchases::InAppPurchasesRequestBus, 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;
EBUS_EVENT_RESULT(purchasedProductDetails, InAppPurchases::InAppPurchasesRequestBus, 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;
EBUS_EVENT_RESULT(purchasedProductDetails, InAppPurchases::InAppPurchasesRequestBus, 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;
EBUS_EVENT_RESULT(purchasedProductDetails, InAppPurchases::InAppPurchasesRequestBus, 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;
EBUS_EVENT_RESULT(purchasedProductDetails, InAppPurchases::InAppPurchasesRequestBus, 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;
EBUS_EVENT_RESULT(purchasedProductDetails, InAppPurchases::InAppPurchasesRequestBus, 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;
EBUS_EVENT_RESULT(purchasedProductDetails, InAppPurchases::InAppPurchasesRequestBus, 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;
EBUS_EVENT_RESULT(purchasedProductDetails, InAppPurchases::InAppPurchasesRequestBus, 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;
EBUS_EVENT_RESULT(purchasedProductDetails, InAppPurchases::InAppPurchasesRequestBus, 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;
EBUS_EVENT_RESULT(purchasedProductDetails, InAppPurchases::InAppPurchasesRequestBus, 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;
EBUS_EVENT_RESULT(purchasedProductDetails, InAppPurchases::InAppPurchasesRequestBus, 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;
EBUS_EVENT_RESULT(purchasedProductDetails, InAppPurchases::InAppPurchasesRequestBus, 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;
EBUS_EVENT_RESULT(purchasedProductDetails, InAppPurchases::InAppPurchasesRequestBus, 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;
EBUS_EVENT_RESULT(purchasedProductDetails, InAppPurchases::InAppPurchasesRequestBus, GetCachedPurchasedProductInfo);
const AZStd::vector<AZStd::unique_ptr<ProductDetails const> >* productDetails = nullptr;
EBUS_EVENT_RESULT(productDetails, InAppPurchases::InAppPurchasesRequestBus, 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;
}
}