AndroidPlacementContentOperations.cs 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. #if UNITY_ANDROID
  2. using System;
  3. using UnityEngine;
  4. using UnityEngine.Advertisements.Utilities;
  5. namespace UnityEngine.Monetization
  6. {
  7. public class AndroidPlacementContentOperations : IPlacementContentOperations
  8. {
  9. protected readonly AndroidJavaObject javaObject;
  10. public AndroidPlacementContentOperations(AndroidJavaObject javaObject)
  11. {
  12. this.javaObject = javaObject;
  13. }
  14. public bool ready => javaObject.Call<bool>("isReady");
  15. public PlacementContentState state => (PlacementContentState)JavaEnumUtilities.GetEnumOrdinal(javaObject.Call<AndroidJavaObject>("getState"));
  16. public void SendCustomEvent(CustomEvent customEvent)
  17. {
  18. using (var javaCustomEvent = CustomEventAndroidConverter.Convert(customEvent))
  19. {
  20. javaObject.Call("sendCustomEvent", javaCustomEvent);
  21. }
  22. }
  23. }
  24. class CustomEventAndroidConverter
  25. {
  26. private static readonly string CustomEventClass = "com.unity3d.services.monetization.placementcontent.core.CustomEvent";
  27. internal static AndroidJavaObject Convert(CustomEvent customEvent)
  28. {
  29. return new AndroidJavaObject(CustomEventClass, customEvent.category, customEvent.type, customEvent.data);
  30. }
  31. }
  32. public class AndroidRewardedOperations : AndroidPlacementContentOperations, IRewardedOperations
  33. {
  34. public AndroidRewardedOperations(AndroidJavaObject javaObject) : base(javaObject)
  35. {
  36. }
  37. public bool IsRewarded()
  38. {
  39. return javaObject.Call<bool>("isRewarded");
  40. }
  41. public string rewardId => javaObject.SafeStringCall("getRewardId");
  42. }
  43. internal class AndroidShowAdOperations : AndroidRewardedOperations, IShowAdOperations
  44. {
  45. private IUnityLifecycleManager callbackExecutor;
  46. public AndroidShowAdOperations(IUnityLifecycleManager callbackExecutor, AndroidJavaObject javaObject) : base(javaObject)
  47. {
  48. this.callbackExecutor = callbackExecutor;
  49. }
  50. class AndroidShowAdCallback : AndroidJavaProxy
  51. {
  52. private ShowAdCallbacks? callbacks;
  53. private IUnityLifecycleManager callbackExecutor;
  54. public AndroidShowAdCallback(IUnityLifecycleManager callbackExecutor, ShowAdCallbacks? callbacks) : base("com.unity3d.services.monetization.placementcontent.ads.IShowAdListener")
  55. {
  56. this.callbackExecutor = callbackExecutor;
  57. this.callbacks = callbacks;
  58. }
  59. void onAdFinished(string placementId, AndroidJavaObject withState)
  60. {
  61. callbackExecutor.Post(() =>
  62. {
  63. if (callbacks?.finishCallback != null)
  64. {
  65. var showResult = (ShowResult)withState.Call<int>("ordinal");
  66. callbacks?.finishCallback?.Invoke(showResult);
  67. }
  68. });
  69. }
  70. void onAdStarted(string placementId)
  71. {
  72. if (callbacks?.startCallback != null)
  73. {
  74. callbacks?.startCallback?.Invoke();
  75. }
  76. }
  77. }
  78. public void Show(ShowAdCallbacks? callbacks)
  79. {
  80. var unityPlayerClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
  81. AndroidJavaObject m_CurrentActivity = unityPlayerClass.GetStatic<AndroidJavaObject>("currentActivity");
  82. javaObject.Call("show", m_CurrentActivity, new AndroidShowAdCallback(callbackExecutor, callbacks));
  83. }
  84. }
  85. internal class AndroidPromoAdOperations : AndroidShowAdOperations, IPromoAdOperations
  86. {
  87. public AndroidPromoAdOperations(IUnityLifecycleManager callbackExecutor, AndroidJavaObject javaObject) : base(callbackExecutor, javaObject)
  88. {
  89. metadata = GetMetadataForJavaObject(javaObject.Call<AndroidJavaObject>("getMetadata"));
  90. nativeAdapter = new AndroidJavaObject("com.unity3d.services.monetization.placementcontent.purchasing.NativePromoAdapter", javaObject);
  91. }
  92. public PromoMetadata metadata { get; }
  93. internal AndroidJavaObject nativeAdapter { get; }
  94. private PromoMetadata GetMetadataForJavaObject(AndroidJavaObject metadataJavaObject)
  95. {
  96. var promoMetadata = new PromoMetadata
  97. {
  98. impressionDate = GetDateTimeFromJavaDate(metadataJavaObject.Call<AndroidJavaObject>("getImpressionDate")),
  99. offerDuration = TimeSpan.FromSeconds(metadataJavaObject.Call<long>("getOfferDuration")),
  100. costs = GetItemArrayFromJavaArray(metadataJavaObject.Call<AndroidJavaObject>("getCosts")),
  101. payouts = GetItemArrayFromJavaArray(metadataJavaObject.Call<AndroidJavaObject>("getPayouts")),
  102. premiumProduct = GetPremiumProductFromJavaObject(metadataJavaObject.Call<AndroidJavaObject>("getPremiumProduct"))
  103. };
  104. return promoMetadata;
  105. }
  106. private Product GetPremiumProductFromJavaObject(AndroidJavaObject productJavaObject)
  107. {
  108. if (productJavaObject == null)
  109. {
  110. return default(Product);
  111. }
  112. return new Product
  113. {
  114. productId = productJavaObject.SafeStringCall("getProductId"),
  115. localizedPrice = (decimal)productJavaObject.Call<double>("getLocalizedPrice"),
  116. isoCurrencyCode = productJavaObject.SafeStringCall("getIsoCurrencyCode"),
  117. localizedPriceString = productJavaObject.SafeStringCall("getLocalizedPriceString"),
  118. localizedTitle = productJavaObject.SafeStringCall("getLocalizedTitle"),
  119. localizedDescription = productJavaObject.SafeStringCall("getLocalizedDescription"),
  120. productType = productJavaObject.SafeStringCall("getProductType")
  121. };
  122. }
  123. private PromoItem[] GetItemArrayFromJavaArray(AndroidJavaObject javaArray)
  124. {
  125. if (javaArray == null)
  126. {
  127. return default(PromoItem[]);
  128. }
  129. var size = javaArray.Call<int>("size");
  130. var items = new PromoItem[size];
  131. for (var i = 0; i < size; i++)
  132. {
  133. items[i] = GetItemFromJavaObject(javaArray.Call<AndroidJavaObject>("get", i));
  134. }
  135. return items;
  136. }
  137. private PromoItem GetItemFromJavaObject(AndroidJavaObject itemJavaObject)
  138. {
  139. return new PromoItem
  140. {
  141. productId = itemJavaObject.SafeStringCall("getItemId"),
  142. itemType = itemJavaObject.SafeStringCall("getType"),
  143. quantity = itemJavaObject.Call<long>("getQuantity")
  144. };
  145. }
  146. private DateTime GetDateTimeFromJavaDate(AndroidJavaObject dateJavaObject)
  147. {
  148. if (dateJavaObject == null)
  149. {
  150. return default(DateTime);
  151. }
  152. var millisecs = dateJavaObject.Call<long>("getTime");
  153. var epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
  154. return epoch.AddMilliseconds(millisecs);
  155. }
  156. }
  157. }
  158. #endif