Skip to content

Commit 13b2787

Browse files
JavierStarkCalinou
andauthored
Update Android IAP in C# project to Godot 4.3 (#1104)
Co-authored-by: Hugo Locurcio <[email protected]>
1 parent 6c635fe commit 13b2787

9 files changed

+77
-78
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
<Project Sdk="Godot.NET.Sdk/4.0.0-dev5">
1+
<Project Sdk="Godot.NET.Sdk/4.3.0">
22
<PropertyGroup>
3-
<TargetFramework>net472</TargetFramework>
3+
<TargetFramework>net6.0</TargetFramework>
44
<RootNamespace>AndroidIAP</RootNamespace>
55
</PropertyGroup>
66
</Project>

mono/android_iap/GodotGooglePlayBilling/BillingResult.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,8 @@ public BillingResult(Dictionary billingResult)
5151
try
5252
{
5353
Status = (int)billingResult["status"];
54-
ResponseCode = (billingResult.Contains("response_code") ? (BillingResponseCode?)billingResult["response_code"] : null);
55-
DebugMessage = (billingResult.Contains("debug_message") ? (string)billingResult["debug_message"] : null);
54+
ResponseCode = billingResult.ContainsKey("response_code") ? billingResult["response_code"].As<BillingResponseCode>() : null;
55+
DebugMessage = billingResult.ContainsKey("debug_message") ? billingResult["debug_message"].AsString() : null;
5656
}
5757
catch (System.Exception ex)
5858
{

mono/android_iap/GodotGooglePlayBilling/GooglePlayBilling.cs

+24-24
Original file line numberDiff line numberDiff line change
@@ -11,24 +11,24 @@ public enum PurchaseType
1111

1212
public partial class GooglePlayBilling : Node
1313
{
14-
[Signal] public delegate void Connected();
15-
[Signal] public delegate void Disconnected();
16-
[Signal] public delegate void ConnectError(int code, string message);
17-
[Signal] public delegate void SkuDetailsQueryCompleted(Array skuDetails);
18-
[Signal] public delegate void SkuDetailsQueryError(int code, string message, string[] querySkuDetails);
19-
[Signal] public delegate void PurchasesUpdated(Array purchases);
20-
[Signal] public delegate void PurchaseError(int code, string message);
21-
[Signal] public delegate void PurchaseAcknowledged(string purchaseToken);
22-
[Signal] public delegate void PurchaseAcknowledgementError(int code, string message);
23-
[Signal] public delegate void PurchaseConsumed(string purchaseToken);
24-
[Signal] public delegate void PurchaseConsumptionError(int code, string message, string purchaseToken);
14+
[Signal] public delegate void ConnectedEventHandler();
15+
[Signal] public delegate void DisconnectedEventHandler();
16+
[Signal] public delegate void ConnectErrorEventHandler(int code, string message);
17+
[Signal] public delegate void SkuDetailsQueryCompletedEventHandler(Array skuDetails);
18+
[Signal] public delegate void SkuDetailsQueryErrorEventHandler(int code, string message, string[] querySkuDetails);
19+
[Signal] public delegate void PurchasesUpdatedEventHandler(Array purchases);
20+
[Signal] public delegate void PurchaseErrorEventHandler(int code, string message);
21+
[Signal] public delegate void PurchaseAcknowledgedEventHandler(string purchaseToken);
22+
[Signal] public delegate void PurchaseAcknowledgementErrorEventHandler(int code, string message);
23+
[Signal] public delegate void PurchaseConsumedEventHandler(string purchaseToken);
24+
[Signal] public delegate void PurchaseConsumptionErrorEventHandler(int code, string message, string purchaseToken);
2525

2626
[Export] public bool AutoReconnect { get; set; }
2727
[Export] public bool AutoConnect { get; set; }
2828

2929
public bool IsAvailable { get; private set; }
3030

31-
private Object _payment;
31+
private GodotObject _payment;
3232

3333
public override void _Ready()
3434
{
@@ -38,17 +38,17 @@ public override void _Ready()
3838
_payment = Engine.GetSingleton("GodotGooglePlayBilling");
3939
// These are all signals supported by the API
4040
// You can drop some of these based on your needs
41-
_payment.Connect("connected", this, nameof(OnGodotGooglePlayBilling_connected)); // No params
42-
_payment.Connect("disconnected", this, nameof(OnGodotGooglePlayBilling_disconnected)); // No params
43-
_payment.Connect("connect_error", this, nameof(OnGodotGooglePlayBilling_connect_error)); // Response ID (int), Debug message (string)
44-
_payment.Connect("sku_details_query_completed", this, nameof(OnGodotGooglePlayBilling_sku_details_query_completed)); // SKUs (Array of Dictionary)
45-
_payment.Connect("sku_details_query_error", this, nameof(OnGodotGooglePlayBilling_sku_details_query_error)); // Response ID (int), Debug message (string), Queried SKUs (string[])
46-
_payment.Connect("purchases_updated", this, nameof(OnGodotGooglePlayBilling_purchases_updated)); // Purchases (Array of Dictionary)
47-
_payment.Connect("purchase_error", this, nameof(OnGodotGooglePlayBilling_purchase_error)); // Response ID (int), Debug message (string)
48-
_payment.Connect("purchase_acknowledged", this, nameof(OnGodotGooglePlayBilling_purchase_acknowledged)); // Purchase token (string)
49-
_payment.Connect("purchase_acknowledgement_error", this, nameof(OnGodotGooglePlayBilling_purchase_acknowledgement_error)); // Response ID (int), Debug message (string), Purchase token (string)
50-
_payment.Connect("purchase_consumed", this, nameof(OnGodotGooglePlayBilling_purchase_consumed)); // Purchase token (string)
51-
_payment.Connect("purchase_consumption_error", this, nameof(OnGodotGooglePlayBilling_purchase_consumption_error)); // Response ID (int), Debug message (string), Purchase token (string)
41+
_payment.Connect(SignalName.Connected, Callable.From(OnGodotGooglePlayBilling_connected)); // No params
42+
_payment.Connect(SignalName.Disconnected, Callable.From(OnGodotGooglePlayBilling_disconnected)); // No params
43+
_payment.Connect(SignalName.ConnectError, Callable.From<int, string>(OnGodotGooglePlayBilling_connect_error)); // Response ID (int), Debug message (string)
44+
_payment.Connect(SignalName.SkuDetailsQueryCompleted, Callable.From<Array>(OnGodotGooglePlayBilling_sku_details_query_completed)); // SKUs (Array of Dictionary)
45+
_payment.Connect(SignalName.SkuDetailsQueryError, Callable.From<int,string,string[]>(OnGodotGooglePlayBilling_sku_details_query_error)); // Response ID (int), Debug message (string), Queried SKUs (string[])
46+
_payment.Connect(SignalName.PurchasesUpdated, Callable.From<Array>(OnGodotGooglePlayBilling_purchases_updated)); // Purchases (Array of Dictionary)
47+
_payment.Connect(SignalName.PurchaseError, Callable.From<int,string>(OnGodotGooglePlayBilling_purchase_error)); // Response ID (int), Debug message (string)
48+
_payment.Connect(SignalName.PurchaseAcknowledged, Callable.From<string>(OnGodotGooglePlayBilling_purchase_acknowledged)); // Purchase token (string)
49+
_payment.Connect(SignalName.PurchaseAcknowledgementError, Callable.From<int,string>(OnGodotGooglePlayBilling_purchase_acknowledgement_error)); // Response ID (int), Debug message (string), Purchase token (string)
50+
_payment.Connect(SignalName.PurchaseConsumed, Callable.From<string>(OnGodotGooglePlayBilling_purchase_consumed)); // Purchase token (string)
51+
_payment.Connect(SignalName.PurchaseConsumptionError, Callable.From<int,string,string>(OnGodotGooglePlayBilling_purchase_consumption_error)); // Response ID (int), Debug message (string), Purchase token (string)
5252
}
5353
else
5454
{
@@ -64,7 +64,7 @@ public override void _Ready()
6464

6565
public void QuerySkuDetails(string[] querySkuDetails, PurchaseType type) => _payment?.Call("querySkuDetails", querySkuDetails, $"{type}".ToLower());
6666

67-
public bool IsReady() => (_payment?.Call("isReady") as bool?) ?? false;
67+
public bool IsReady() => _payment?.Call("isReady").AsBool() ?? false;
6868

6969
public void AcknowledgePurchase(string purchaseToken) => _payment?.Call("acknowledgePurchase", purchaseToken);
7070

mono/android_iap/GodotGooglePlayBilling/Purchase.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public Purchase(Dictionary purchase)
2222
{
2323
try
2424
{
25-
switch (key)
25+
switch (key.AsString())
2626
{
2727
case "order_id":
2828
OrderId = (string)purchase[key];
@@ -31,7 +31,7 @@ public Purchase(Dictionary purchase)
3131
PackageName = (string)purchase[key];
3232
break;
3333
case "purchase_state":
34-
PurchaseState = (PurchaseState)purchase[key];
34+
PurchaseState = purchase[key].As<PurchaseState>();
3535
break;
3636
case "purchase_time":
3737
PurchaseTime = Convert.ToInt64(purchase[key]);

mono/android_iap/GodotGooglePlayBilling/PurchasesResult.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ public PurchasesResult(Dictionary purchasesResult)
1111
{
1212
try
1313
{
14-
Purchases = (purchasesResult.Contains("purchases") ? GooglePlayBillingUtils.ConvertPurchaseDictionaryArray((Array)purchasesResult["purchases"]) : null);
14+
Purchases = (purchasesResult.ContainsKey("purchases") ? GooglePlayBillingUtils.ConvertPurchaseDictionaryArray(purchasesResult["purchases"].AsGodotArray()) : null);
1515
}
1616
catch (System.Exception ex)
1717
{

mono/android_iap/GodotGooglePlayBilling/SkuDetails.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public SkuDetails(Dictionary skuDetails)
1414
{
1515
try
1616
{
17-
switch (key)
17+
switch (key.AsString())
1818
{
1919
case "sku":
2020
Sku = (string)skuDetails[key];
@@ -62,7 +62,7 @@ public SkuDetails(Dictionary skuDetails)
6262
SubscriptionPeriod = (string)skuDetails[key];
6363
break;
6464
case "type":
65-
switch(skuDetails[key])
65+
switch(skuDetails[key].AsString())
6666
{
6767
case "inapp":
6868
Type = PurchaseType.InApp;

mono/android_iap/Main.cs

+26-14
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using Godot;
33
using System.Linq;
44
using System;
5+
using Array = Godot.Collections.Array;
56

67
namespace AndroidInAppPurchasesWithCSharp
78
{
@@ -27,27 +28,38 @@ public override void _Ready()
2728
_label.Text += $"\n\n\nTest item SKU: {TestItemSku}";
2829

2930
// No params.
30-
_payment.Connect(nameof(GooglePlayBilling.Connected), this, nameof(OnConnected));
31+
_payment.Connect(GooglePlayBilling.SignalName.Connected,
32+
Callable.From(OnConnected));
3133
// No params.
32-
_payment.Connect(nameof(GooglePlayBilling.Disconnected), this, nameof(OnDisconnected));
34+
_payment.Connect(GooglePlayBilling.SignalName.Disconnected,
35+
Callable.From(OnDisconnected));
3336
// Response ID (int), Debug message (string).
34-
_payment.Connect(nameof(GooglePlayBilling.ConnectError), this, nameof(OnConnectError));
37+
_payment.Connect(GooglePlayBilling.SignalName.ConnectError,
38+
Callable.From<int,string>(OnConnectError));
3539
// Purchases (Dictionary[]).
36-
_payment.Connect(nameof(GooglePlayBilling.PurchasesUpdated), this, nameof(OnPurchasesUpdated));
40+
_payment.Connect(GooglePlayBilling.SignalName.PurchasesUpdated,
41+
Callable.From<Array>(OnPurchasesUpdated));
3742
// Response ID (int), Debug message (string).
38-
_payment.Connect(nameof(GooglePlayBilling.PurchaseError), this, nameof(OnPurchaseError));
43+
_payment.Connect(GooglePlayBilling.SignalName.PurchaseError,
44+
Callable.From<int,string>(OnPurchaseError));
3945
// SKUs (Dictionary[]).
40-
_payment.Connect(nameof(GooglePlayBilling.SkuDetailsQueryCompleted), this, nameof(OnSkuDetailsQueryCompleted));
46+
_payment.Connect(GooglePlayBilling.SignalName.SkuDetailsQueryCompleted,
47+
Callable.From<Array>(OnSkuDetailsQueryCompleted));
4148
// Response ID (int), Debug message (string), Queried SKUs (string[]).
42-
_payment.Connect(nameof(GooglePlayBilling.SkuDetailsQueryError), this, nameof(OnSkuDetailsQueryError));
49+
_payment.Connect(GooglePlayBilling.SignalName.SkuDetailsQueryError,
50+
Callable.From<int,string, string[]>(OnSkuDetailsQueryError));
4351
// Purchase token (string).
44-
_payment.Connect(nameof(GooglePlayBilling.PurchaseAcknowledged), this, nameof(OnPurchaseAcknowledged));
45-
// Response ID (int), Debug message (string), Purchase token (string).
46-
_payment.Connect(nameof(GooglePlayBilling.PurchaseAcknowledgementError), this, nameof(OnPurchaseAcknowledgementError));
52+
_payment.Connect(GooglePlayBilling.SignalName.PurchaseAcknowledged,
53+
Callable.From<string>(OnPurchaseAcknowledged));
54+
// Response ID (int), Debug message (string).
55+
_payment.Connect(GooglePlayBilling.SignalName.PurchaseAcknowledgementError,
56+
Callable.From<int,string>(OnPurchaseAcknowledgementError));
4757
// Purchase token (string).
48-
_payment.Connect(nameof(GooglePlayBilling.PurchaseConsumed), this, nameof(OnPurchaseConsumed));
58+
_payment.Connect(GooglePlayBilling.SignalName.PurchaseConsumed,
59+
Callable.From<string>(OnPurchaseConsumed));
4960
// Response ID (int), Debug message (string), Purchase token (string).
50-
_payment.Connect(nameof(GooglePlayBilling.PurchaseConsumptionError), this, nameof(OnPurchaseConsumptionError));
61+
_payment.Connect(GooglePlayBilling.SignalName.PurchaseConsumptionError,
62+
Callable.From<int,string,string>(OnPurchaseConsumptionError));
5163
_payment.StartConnection();
5264
}
5365
else
@@ -100,7 +112,7 @@ private void OnConnectError(int code, string message)
100112

101113
private void OnPurchasesUpdated(Godot.Collections.Array arrPurchases)
102114
{
103-
GD.Print($"Purchases updated: {JSON.Print(arrPurchases)}");
115+
GD.Print($"Purchases updated: {Json.Stringify(arrPurchases)}");
104116

105117
// See OnConnected
106118
var purchases = GooglePlayBillingUtils.ConvertPurchaseDictionaryArray(arrPurchases);
@@ -127,7 +139,7 @@ private void OnPurchaseError(int code, string message)
127139

128140
private void OnSkuDetailsQueryCompleted(Godot.Collections.Array arrSkuDetails)
129141
{
130-
ShowAlert(JSON.Print(arrSkuDetails));
142+
ShowAlert(Json.Stringify(arrSkuDetails));
131143

132144
var skuDetails = GooglePlayBillingUtils.ConvertSkuDetailsDictionaryArray(arrSkuDetails);
133145
foreach (var skuDetail in skuDetails)

mono/android_iap/main.tscn

+13-30
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1-
[gd_scene load_steps=3 format=2]
1+
[gd_scene load_steps=3 format=3 uid="uid://ckuhu5rgquv8h"]
22

3-
[ext_resource path="res://Main.cs" type="Script" id=1]
4-
[ext_resource path="res://GodotGooglePlayBilling/GooglePlayBilling.cs" type="Script" id=2]
3+
[ext_resource type="Script" path="res://Main.cs" id="1"]
4+
[ext_resource type="Script" path="res://GodotGooglePlayBilling/GooglePlayBilling.cs" id="2"]
55

66
[node name="Main" type="Control"]
7+
layout_mode = 3
8+
anchors_preset = 8
79
anchor_left = 0.5
810
anchor_top = 0.5
911
anchor_right = 0.5
@@ -12,30 +14,17 @@ offset_left = -512.711
1214
offset_top = -300.0
1315
offset_right = 511.289
1416
offset_bottom = 300.0
17+
grow_horizontal = 2
18+
grow_vertical = 2
1519
size_flags_horizontal = 2
1620
size_flags_vertical = 2
17-
script = ExtResource( 1 )
18-
__meta__ = {
19-
"_edit_use_anchors_": false
20-
}
21+
script = ExtResource("1")
2122

2223
[node name="AlertDialog" type="AcceptDialog" parent="."]
23-
anchor_left = 0.5
24-
anchor_top = 0.5
25-
anchor_right = 0.5
26-
anchor_bottom = 0.5
27-
offset_left = 64.0
28-
offset_top = 64.0
29-
offset_right = -64.0
30-
offset_bottom = -64.0
31-
grow_horizontal = 2
32-
grow_vertical = 2
33-
rect_min_size = Vector2(400, 0)
34-
size_flags_vertical = 4
35-
popup_exclusive = true
3624
dialog_autowrap = true
3725

3826
[node name="Label" type="Label" parent="."]
27+
layout_mode = 0
3928
offset_left = 300.0
4029
offset_top = 40.0
4130
offset_right = 996.0
@@ -51,37 +40,31 @@ text = "To test in-app purchase on android device,
5140
4. Changes you make in the Play Console may take some time before taking effect"
5241

5342
[node name="QuerySkuDetailsButton" type="Button" parent="."]
43+
layout_mode = 0
5444
offset_left = 40.5697
5545
offset_top = 39.9347
5646
offset_right = 221.57
5747
offset_bottom = 91.9347
5848
text = "Query SKU details"
59-
__meta__ = {
60-
"_edit_use_anchors_": false
61-
}
6249

6350
[node name="PurchaseButton" type="Button" parent="."]
51+
layout_mode = 0
6452
offset_left = 40.5697
6553
offset_top = 101.203
6654
offset_right = 221.57
6755
offset_bottom = 153.203
6856
text = "Purchase"
69-
__meta__ = {
70-
"_edit_use_anchors_": false
71-
}
7257

7358
[node name="ConsumeButton" type="Button" parent="."]
59+
layout_mode = 0
7460
offset_left = 40.5697
7561
offset_top = 162.142
7662
offset_right = 221.57
7763
offset_bottom = 214.142
7864
text = "Consume"
79-
__meta__ = {
80-
"_edit_use_anchors_": false
81-
}
8265

8366
[node name="GooglePlayBilling" type="Node" parent="."]
84-
script = ExtResource( 2 )
67+
script = ExtResource("2")
8568

8669
[connection signal="pressed" from="QuerySkuDetailsButton" to="." method="OnQuerySkuDetailsButton_pressed"]
8770
[connection signal="pressed" from="PurchaseButton" to="." method="OnPurchaseButton_pressed"]

mono/android_iap/project.godot

+5-1
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,18 @@ config/description="This demo shows how to make in-app payments in Android in C#
1616
Note: Running the demo requires exporting and uploading the game to Google Play."
1717
config/tags=PackedStringArray("demo", "mobile", "official", "porting")
1818
run/main_scene="res://main.tscn"
19-
config/features=PackedStringArray("4.2")
19+
config/features=PackedStringArray("4.3", "C#")
2020
config/icon="res://icon.webp"
2121

2222
[display]
2323

2424
window/stretch/mode="canvas_items"
2525
window/stretch/aspect="expand"
2626

27+
[dotnet]
28+
29+
project/assembly_name="Android in-app purchases with C#"
30+
2731
[rendering]
2832

2933
renderer/rendering_method="gl_compatibility"

0 commit comments

Comments
 (0)