123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142 |
- #if UNITY_ANDROID
- namespace GooglePlayGames.Android
- {
- using System;
- using System.Collections.Generic;
- using GooglePlayGames.BasicApi;
- using GooglePlayGames.BasicApi.Events;
- using GooglePlayGames.OurUtils;
- using UnityEngine;
- internal class AndroidEventsClient : IEventsClient
- {
- private volatile AndroidJavaObject mEventsClient;
- public AndroidEventsClient(AndroidJavaObject account)
- {
- using (var gamesClass = new AndroidJavaClass("com.google.android.gms.games.Games"))
- {
- mEventsClient = gamesClass.CallStatic<AndroidJavaObject>("getEventsClient",
- AndroidHelperFragment.GetActivity(), account);
- }
- }
- public void FetchAllEvents(DataSource source, Action<ResponseStatus, List<IEvent>> callback)
- {
- callback = ToOnGameThread(callback);
- using (var task =
- mEventsClient.Call<AndroidJavaObject>("load", source == DataSource.ReadNetworkOnly ? true : false))
- {
- AndroidTaskUtils.AddOnSuccessListener<AndroidJavaObject>(
- task,
- annotatedData =>
- {
- using (var buffer = annotatedData.Call<AndroidJavaObject>("get"))
- {
- int count = buffer.Call<int>("getCount");
- List<IEvent> result = new List<IEvent>();
- for (int i = 0; i < count; ++i)
- {
- using (var eventJava = buffer.Call<AndroidJavaObject>("get", i))
- {
- result.Add(CreateEvent(eventJava));
- }
- }
- buffer.Call("release");
- callback.Invoke(
- annotatedData.Call<bool>("isStale")
- ? ResponseStatus.SuccessWithStale
- : ResponseStatus.Success,
- result
- );
- }
- });
- AndroidTaskUtils.AddOnFailureListener(
- task,
- exception =>
- {
- Debug.Log("FetchAllEvents failed");
- callback.Invoke(ResponseStatus.InternalError, null);
- });
- }
- }
- public void FetchEvent(DataSource source, string eventId, Action<ResponseStatus, IEvent> callback)
- {
- callback = ToOnGameThread(callback);
- string[] ids = new string[1];
- ids[0] = eventId;
- using (var task = mEventsClient.Call<AndroidJavaObject>("loadByIds",
- source == DataSource.ReadNetworkOnly ? true : false, ids))
- {
- AndroidTaskUtils.AddOnSuccessListener<AndroidJavaObject>(
- task,
- annotatedData =>
- {
- using (var buffer = annotatedData.Call<AndroidJavaObject>("get"))
- {
- int count = buffer.Call<int>("getCount");
- if (count > 0)
- {
- using (var eventJava = buffer.Call<AndroidJavaObject>("get", 0))
- {
- callback.Invoke(
- annotatedData.Call<bool>("isStale")
- ? ResponseStatus.SuccessWithStale
- : ResponseStatus.Success,
- CreateEvent(eventJava)
- );
- }
- }
- else
- {
- callback.Invoke(
- annotatedData.Call<bool>("isStale")
- ? ResponseStatus.SuccessWithStale
- : ResponseStatus.Success,
- null
- );
- }
- buffer.Call("release");
- }
- });
- AndroidTaskUtils.AddOnFailureListener(
- task,
- exception =>
- {
- Debug.Log("FetchEvent failed");
- callback.Invoke(ResponseStatus.InternalError, null);
- });
- }
- }
- public void IncrementEvent(string eventId, uint stepsToIncrement)
- {
- mEventsClient.Call("increment", eventId, (int) stepsToIncrement);
- }
- private static Action<T1, T2> ToOnGameThread<T1, T2>(Action<T1, T2> toConvert)
- {
- return (val1, val2) => PlayGamesHelperObject.RunOnGameThread(() => toConvert(val1, val2));
- }
- private static BasicApi.Events.Event CreateEvent(AndroidJavaObject eventJava)
- {
- string id = eventJava.Call<string>("getEventId");
- string name = eventJava.Call<string>("getName");
- string description = eventJava.Call<string>("getDescription");
- string imageUrl = eventJava.Call<string>("getIconImageUrl");
- ulong currentCount = (ulong) eventJava.Call<long>("getValue");
- EventVisibility visibility = eventJava.Call<bool>("isVisible")
- ? EventVisibility.Revealed
- : EventVisibility.Hidden;
- return new BasicApi.Events.Event(id, name, description, imageUrl, currentCount, visibility);
- }
- }
- }
- #endif
|