diff --git a/source/com.android.billingclient/billing/Additions/Additions.cs b/source/com.android.billingclient/billing/Additions/Additions.cs index 0c13c4a69..1b2edb00d 100644 --- a/source/com.android.billingclient/billing/Additions/Additions.cs +++ b/source/com.android.billingclient/billing/Additions/Additions.cs @@ -33,12 +33,7 @@ public QueryProductDetailsResult() { } public BillingResult Result { get; set; } - [Obsolete ($"Use {nameof(ProductDetailsList)} instead")] - public IList ProductDetails - { - get => ProductDetailsList; - set { /* Obsolete property setter does nothing */ } - } + public IList ProductDetails { get; set; } } public class QueryPurchasesResult @@ -129,9 +124,14 @@ public Task QueryProductDetailsAsync(QueryProductDeta { var tcs = new TaskCompletionSource(); + // NOTE: this creates a new QueryProductDetailsResult to avoid ObjectDisposedException var listener = new InternalProductDetailsResponseListener { - ProductDetailsResponseHandler = (r, queryResult) => tcs.TrySetResult(queryResult) + ProductDetailsResponseHandler = (r, s) => tcs.TrySetResult(new QueryProductDetailsResult + { + Result = r, + ProductDetails = s + }) }; QueryProductDetails(productDetailsParams, listener); @@ -252,13 +252,11 @@ public void OnSkuDetailsResponse(BillingResult result, IList skuDeta internal class InternalProductDetailsResponseListener : Java.Lang.Object, IProductDetailsResponseListener { - public Action ProductDetailsResponseHandler { get; set; } + public Action> ProductDetailsResponseHandler { get; set; } public void OnProductDetailsResponse(BillingResult result, QueryProductDetailsResult queryResult) { - queryResult ??= new(); - queryResult.Result = result; - ProductDetailsResponseHandler?.Invoke(result, queryResult); + ProductDetailsResponseHandler?.Invoke(result, queryResult?.ProductDetailsList); } }