// NOTE: This currently only used on iOS, to present the availablility of getting PPSSPP Gold through IAP. #include "Common/System/System.h" #include "Common/System/Request.h" #include "Common/Data/Text/I18n.h" #include "Common/System/OSD.h" #include "Common/Render/DrawBuffer.h" #include "UI/IAPScreen.h" #include "UI/OnScreenDisplay.h" #include "UI/MiscViews.h" void IAPScreen::CreateViews() { using namespace UI; auto di = GetI18NCategory(I18NCat::DIALOG); auto mm = GetI18NCategory(I18NCat::MAINMENU); const bool portrait = GetDeviceOrientation() == DeviceOrientation::Portrait; root_ = new LinearLayout(portrait ? ORIENT_VERTICAL : ORIENT_HORIZONTAL, new LayoutParams(FILL_PARENT, FILL_PARENT)); if (portrait) { root_->Add(new TopBar(*screenManager()->getUIContext(), TopBarFlags::Default, di->T("PPSSPP Gold"))); root_->Add(new Spacer(20.0f)); } const bool bought = System_GetPropertyBool(SYSPROP_APP_GOLD); LinearLayout *leftColumnItems; if (portrait) { leftColumnItems = new LinearLayout(ORIENT_VERTICAL, new LinearLayoutParams(FILL_PARENT, WRAP_CONTENT, UI::Margins(12, 12))); root_->Add(leftColumnItems); } else { ViewGroup *leftColumnContainer = new AnchorLayout(new LinearLayoutParams(1.0f, UI::Gravity::G_HCENTER)); leftColumnItems = new LinearLayout(ORIENT_VERTICAL, new AnchorLayoutParams(600, WRAP_CONTENT, NONE, 105, NONE, 12)); leftColumnContainer->Add(leftColumnItems); root_->Add(leftColumnContainer); } ViewGroup *appTitle = new LinearLayout(ORIENT_HORIZONTAL, new LinearLayoutParams(FILL_PARENT, WRAP_CONTENT)); appTitle->Add(new ShinyIcon(ImageID("I_ICON_GOLD"), new LinearLayoutParams(64, 64))); appTitle->Add(new TextView("PPSSPP Gold", new LinearLayoutParams(1.0f, Gravity::G_VCENTER))); leftColumnItems->Add(appTitle); leftColumnItems->Add(new Spacer(30.0f)); if (!bought) { leftColumnItems->Add(new Spacer(20.0f)); leftColumnItems->Add(new TextView(di->T("GoldOverview1", "Buy PPSSPP Gold to support development!")))->SetAlign(FLAG_WRAP_TEXT); leftColumnItems->Add(new Spacer(10.0f)); leftColumnItems->Add(new TextView(di->T("GoldOverview2", "It helps sustain development!")))->SetAlign(FLAG_WRAP_TEXT); } else { leftColumnItems->Add(new TextView(di->T("GoldThankYou", "Thank you for supporting the PPSSPP project!")))->SetAlign(FLAG_WRAP_TEXT); } leftColumnItems->Add(new Spacer(20.0f)); leftColumnItems->Add(new TextView("Henrik RydgÄrd")); leftColumnItems->Add(new TextView("(hrydgard)")); float weight = 0.0f; if (portrait) weight = 1.0f; // hack to lift the buttons up. ViewGroup *rightColumnItems = new LinearLayout(ORIENT_VERTICAL, new LinearLayoutParams(350, WRAP_CONTENT, weight, UI::Margins(12, 12))); root_->Add(rightColumnItems); if (!bought) { ImageID image; #if 1 || PPSSPP_PLATFORM(ANDROID) image = ImageID("I_LOGO_PLAY_STORE"); #elif PPSSPP_PLATFORM(IOS) image = ImageID("I_LOGO_APP_STORE"); #endif Choice *buyButton = rightColumnItems->Add(new Choice(mm->T("Buy PPSSPP Gold"), image)); buyButton->SetIconRight(ImageID("I_ICON_GOLD"), 0.5f); buyButton->SetShine(true); const int requesterToken = GetRequesterToken(); buyButton->OnClick.Add([this, requesterToken](UI::EventParams &) { INFO_LOG(Log::System, "Showing purchase UI..."); if (useIAP_) { System_IAPMakePurchase(requesterToken, "org.ppsspp.gold", [this](const char *responseString, int intValue) { INFO_LOG(Log::System, "PPSSPP Gold purchase successful!"); auto di = GetI18NCategory(I18NCat::DIALOG); g_OSD.Show(OSDType::MESSAGE_SUCCESS, di->T("GoldThankYou", "Thank you for supporting the PPSSPP project!"), 3.0f); RecreateViews(); }, []() { WARN_LOG(Log::System, "Purchase failed or cancelled!"); }); } else { #if PPSSPP_PLATFORM(ANDROID) System_LaunchUrl(LaunchUrlType::BROWSER_URL, "market://details?id=org.ppsspp.ppssppgold"); #else System_LaunchUrl(LaunchUrlType::BROWSER_URL, "https://www.ppsspp.org/buygold"); #endif } }); } Choice *moreInfo = rightColumnItems->Add(new Choice(di->T("More info"), ImageID("I_LINK_OUT"))); moreInfo->OnClick.Add([](UI::EventParams &) { System_LaunchUrl(LaunchUrlType::BROWSER_URL, "https://www.ppsspp.org/buygold_ios"); }); if (!portrait) { Choice *backButton = rightColumnItems->Add(new Choice(di->T("Back"), ImageID("I_NAVIGATE_BACK"))); backButton->OnClick.Handle(this, &UIScreen::OnBack); } if (useIAP_) { // Put the restore purchases button in the bottom right corner in landscape. It's rarely useful, but needed. if (!portrait) { rightColumnItems->Add(new Spacer(new LinearLayoutParams(1.0f))); } Choice *restorePurchases = new Choice(di->T("Restore purchase")); const int requesterToken = GetRequesterToken(); restorePurchases->OnClick.Add([this, requesterToken, restorePurchases](UI::EventParams &) { restorePurchases->SetEnabled(false); INFO_LOG(Log::System, "Requesting purchase restore"); System_IAPRestorePurchases(requesterToken, [this](const char *responseString, int) { INFO_LOG(Log::System, "Successfully restored purchases!"); RecreateViews(); }, []() { WARN_LOG(Log::System, "Failed restoring purchases"); }); }); rightColumnItems->Add(restorePurchases); } }