AndroidEventsClient.cs 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. #if UNITY_ANDROID
  2. namespace GooglePlayGames.Android
  3. {
  4. using System;
  5. using System.Collections.Generic;
  6. using GooglePlayGames.BasicApi;
  7. using GooglePlayGames.BasicApi.Events;
  8. using GooglePlayGames.OurUtils;
  9. using UnityEngine;
  10. internal class AndroidEventsClient : IEventsClient
  11. {
  12. private volatile AndroidJavaObject mEventsClient;
  13. public AndroidEventsClient(AndroidJavaObject account)
  14. {
  15. using (var gamesClass = new AndroidJavaClass("com.google.android.gms.games.Games"))
  16. {
  17. mEventsClient = gamesClass.CallStatic<AndroidJavaObject>("getEventsClient",
  18. AndroidHelperFragment.GetActivity(), account);
  19. }
  20. }
  21. public void FetchAllEvents(DataSource source, Action<ResponseStatus, List<IEvent>> callback)
  22. {
  23. callback = ToOnGameThread(callback);
  24. using (var task =
  25. mEventsClient.Call<AndroidJavaObject>("load", source == DataSource.ReadNetworkOnly ? true : false))
  26. {
  27. AndroidTaskUtils.AddOnSuccessListener<AndroidJavaObject>(
  28. task,
  29. annotatedData =>
  30. {
  31. using (var buffer = annotatedData.Call<AndroidJavaObject>("get"))
  32. {
  33. int count = buffer.Call<int>("getCount");
  34. List<IEvent> result = new List<IEvent>();
  35. for (int i = 0; i < count; ++i)
  36. {
  37. using (var eventJava = buffer.Call<AndroidJavaObject>("get", i))
  38. {
  39. result.Add(CreateEvent(eventJava));
  40. }
  41. }
  42. buffer.Call("release");
  43. callback.Invoke(
  44. annotatedData.Call<bool>("isStale")
  45. ? ResponseStatus.SuccessWithStale
  46. : ResponseStatus.Success,
  47. result
  48. );
  49. }
  50. });
  51. AndroidTaskUtils.AddOnFailureListener(
  52. task,
  53. exception =>
  54. {
  55. Debug.Log("FetchAllEvents failed");
  56. callback.Invoke(ResponseStatus.InternalError, null);
  57. });
  58. }
  59. }
  60. public void FetchEvent(DataSource source, string eventId, Action<ResponseStatus, IEvent> callback)
  61. {
  62. callback = ToOnGameThread(callback);
  63. string[] ids = new string[1];
  64. ids[0] = eventId;
  65. using (var task = mEventsClient.Call<AndroidJavaObject>("loadByIds",
  66. source == DataSource.ReadNetworkOnly ? true : false, ids))
  67. {
  68. AndroidTaskUtils.AddOnSuccessListener<AndroidJavaObject>(
  69. task,
  70. annotatedData =>
  71. {
  72. using (var buffer = annotatedData.Call<AndroidJavaObject>("get"))
  73. {
  74. int count = buffer.Call<int>("getCount");
  75. if (count > 0)
  76. {
  77. using (var eventJava = buffer.Call<AndroidJavaObject>("get", 0))
  78. {
  79. callback.Invoke(
  80. annotatedData.Call<bool>("isStale")
  81. ? ResponseStatus.SuccessWithStale
  82. : ResponseStatus.Success,
  83. CreateEvent(eventJava)
  84. );
  85. }
  86. }
  87. else
  88. {
  89. callback.Invoke(
  90. annotatedData.Call<bool>("isStale")
  91. ? ResponseStatus.SuccessWithStale
  92. : ResponseStatus.Success,
  93. null
  94. );
  95. }
  96. buffer.Call("release");
  97. }
  98. });
  99. AndroidTaskUtils.AddOnFailureListener(
  100. task,
  101. exception =>
  102. {
  103. Debug.Log("FetchEvent failed");
  104. callback.Invoke(ResponseStatus.InternalError, null);
  105. });
  106. }
  107. }
  108. public void IncrementEvent(string eventId, uint stepsToIncrement)
  109. {
  110. mEventsClient.Call("increment", eventId, (int) stepsToIncrement);
  111. }
  112. private static Action<T1, T2> ToOnGameThread<T1, T2>(Action<T1, T2> toConvert)
  113. {
  114. return (val1, val2) => PlayGamesHelperObject.RunOnGameThread(() => toConvert(val1, val2));
  115. }
  116. private static BasicApi.Events.Event CreateEvent(AndroidJavaObject eventJava)
  117. {
  118. string id = eventJava.Call<string>("getEventId");
  119. string name = eventJava.Call<string>("getName");
  120. string description = eventJava.Call<string>("getDescription");
  121. string imageUrl = eventJava.Call<string>("getIconImageUrl");
  122. ulong currentCount = (ulong) eventJava.Call<long>("getValue");
  123. EventVisibility visibility = eventJava.Call<bool>("isVisible")
  124. ? EventVisibility.Revealed
  125. : EventVisibility.Hidden;
  126. return new BasicApi.Events.Event(id, name, description, imageUrl, currentCount, visibility);
  127. }
  128. }
  129. }
  130. #endif