diff --git a/library/src/main/java/com/billing/BillingService.kt b/library/src/main/java/com/billing/BillingService.kt index dd181d4..fd49e73 100644 --- a/library/src/main/java/com/billing/BillingService.kt +++ b/library/src/main/java/com/billing/BillingService.kt @@ -1,6 +1,8 @@ package com.billing import android.app.Activity +import android.os.Handler +import android.os.Looper import androidx.annotation.CallSuper abstract class BillingService { @@ -29,6 +31,12 @@ abstract class BillingService { * @param isRestore - a flag indicating whether it's a fresh purchase or restored product */ fun productOwned(sku: String?, isRestore: Boolean) { + findUiHandler().post { + productOwnedInternal(sku, isRestore) + } + } + + fun productOwnedInternal(sku: String?, isRestore: Boolean) { for (purchaseServiceListener in purchaseServiceListeners) { if (isRestore) { purchaseServiceListener.onProductRestored(sku) @@ -43,6 +51,12 @@ abstract class BillingService { * @param isRestore - a flag indicating whether it's a fresh purchase or restored subscription */ fun subscriptionOwned(sku: String, isRestore: Boolean) { + findUiHandler().post { + subscriptionOwnedInternal(sku, isRestore) + } + } + + fun subscriptionOwnedInternal(sku: String, isRestore: Boolean) { for (subscriptionServiceListener in subscriptionServiceListeners) { if (isRestore) { subscriptionServiceListener.onSubscriptionRestored(sku) @@ -53,6 +67,12 @@ abstract class BillingService { } fun updatePrices(iapkeyPrices: Map) { + findUiHandler().post { + updatePricesInternal(iapkeyPrices) + } + } + + fun updatePricesInternal(iapkeyPrices: Map) { for (billingServiceListener in purchaseServiceListeners) { billingServiceListener.onPricesUpdated(iapkeyPrices) } @@ -72,4 +92,8 @@ abstract class BillingService { subscriptionServiceListeners.clear() purchaseServiceListeners.clear() } +} + +fun findUiHandler(): Handler { + return Handler(Looper.getMainLooper()) } \ No newline at end of file diff --git a/library/src/test/java/com/eggheadgames/inapppayments/BillingTest.java b/library/src/test/java/com/eggheadgames/inapppayments/BillingTest.java index fa14237..1f802d4 100644 --- a/library/src/test/java/com/eggheadgames/inapppayments/BillingTest.java +++ b/library/src/test/java/com/eggheadgames/inapppayments/BillingTest.java @@ -31,7 +31,7 @@ public void onProductOwnedEvent_eachRegisteredListenerShouldBeTriggered() throws PurchaseServiceListener secondListener = Mockito.spy(PurchaseServiceListener.class); IAPManager.addPurchaseListener(secondListener); - IAPManager.getBillingService().productOwned(TestConstants.TEST_SKU, false); + IAPManager.getBillingService().productOwnedInternal(TestConstants.TEST_SKU, false); Mockito.verify(firstListener, Mockito.times(1)).onProductPurchased(TestConstants.TEST_SKU); Mockito.verify(secondListener, Mockito.times(1)).onProductPurchased(TestConstants.TEST_SKU); @@ -51,7 +51,7 @@ public void onProductDetailsFetched_eachRegisteredListenerShouldBeTriggered() { products.put(TestConstants.TEST_SKU, TestConstants.TEST_PRODUCT); products.put(TestConstants.TEST_SKU_1, TestConstants.TEST_PRODUCT); - IAPManager.getBillingService().updatePrices(products); + IAPManager.getBillingService().updatePricesInternal(products); Mockito.verify(firstListener, Mockito.times(1)).onPricesUpdated(products); Mockito.verify(secondListener, Mockito.times(1)).onPricesUpdated(products); @@ -69,7 +69,7 @@ public void onIapManagerInteraction_onlyRegisteredListenersShouldBeTriggered() { IAPManager.removePurchaseListener(firstListener); - IAPManager.getBillingService().productOwned(TestConstants.TEST_SKU, false); + IAPManager.getBillingService().productOwnedInternal(TestConstants.TEST_SKU, false); Mockito.verify(firstListener, Mockito.never()).onProductPurchased(Mockito.anyString()); Mockito.verify(secondListener, Mockito.times(1)).onProductPurchased(TestConstants.TEST_SKU); @@ -83,7 +83,7 @@ public void onProductPurchase_purchaseCallbackShouldBeTriggered() { PurchaseServiceListener listener = Mockito.spy(PurchaseServiceListener.class); IAPManager.addPurchaseListener(listener); - IAPManager.getBillingService().productOwned(TestConstants.TEST_SKU, false); + IAPManager.getBillingService().productOwnedInternal(TestConstants.TEST_SKU, false); Mockito.verify(listener, Mockito.times(1)).onProductPurchased(TestConstants.TEST_SKU); } @@ -95,7 +95,7 @@ public void onProductRestore_restoreCallbackShouldBeTriggered() { PurchaseServiceListener listener = Mockito.spy(PurchaseServiceListener.class); IAPManager.addPurchaseListener(listener); - IAPManager.getBillingService().productOwned(TestConstants.TEST_SKU, true); + IAPManager.getBillingService().productOwnedInternal(TestConstants.TEST_SKU, true); Mockito.verify(listener, Mockito.times(1)).onProductRestored(TestConstants.TEST_SKU); } @@ -107,7 +107,7 @@ public void onSubscriptionPurchase_purchaseCallbackShouldBeTriggered() { SubscriptionServiceListener listener = Mockito.spy(SubscriptionServiceListener.class); IAPManager.addSubscriptionListener(listener); - IAPManager.getBillingService().subscriptionOwned(TestConstants.TEST_SKU, false); + IAPManager.getBillingService().subscriptionOwnedInternal(TestConstants.TEST_SKU, false); Mockito.verify(listener, Mockito.times(1)).onSubscriptionPurchased(TestConstants.TEST_SKU); } @@ -119,7 +119,7 @@ public void onSubscriptionRestore_restoreCallbackShouldBeTriggered() { SubscriptionServiceListener listener = Mockito.spy(SubscriptionServiceListener.class); IAPManager.addSubscriptionListener(listener); - IAPManager.getBillingService().subscriptionOwned(TestConstants.TEST_SKU, true); + IAPManager.getBillingService().subscriptionOwnedInternal(TestConstants.TEST_SKU, true); Mockito.verify(listener, Mockito.times(1)).onSubscriptionRestored(TestConstants.TEST_SKU); }