package com.appboy.unity; import android.util.Log; import com.appboy.Constants; import com.appboy.events.FeedUpdatedEvent; import com.appboy.events.IEventSubscriber; import com.appboy.events.InAppMessageEvent; import com.appboy.models.cards.Card; import com.appboy.support.AppboyLogger; import com.appboy.support.StringUtils; import com.appboy.unity.configuration.UnityConfigurationProvider; import com.appboy.unity.utils.MessagingUtils; import com.unity3d.player.UnityPlayer; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.util.List; public class EventSubscriberFactory { private static final String TAG = String.format("%s.%s", Constants.APPBOY_LOG_TAG_PREFIX, EventSubscriberFactory.class.getName()); public static IEventSubscriber<InAppMessageEvent> createInAppMessageEventSubscriber(final UnityConfigurationProvider unityConfigurationProvider) { return new IEventSubscriber<InAppMessageEvent>() { @Override public void trigger(InAppMessageEvent inAppMessageEvent) { String unityGameObjectName = unityConfigurationProvider.getInAppMessageListenerGameObjectName(); String unityCallbackFunctionName = unityConfigurationProvider.getInAppMessageListenerCallbackMethodName(); MessagingUtils.sendInAppMessageReceivedMessage(unityGameObjectName, unityCallbackFunctionName, inAppMessageEvent.getInAppMessage()); } }; } public static IEventSubscriber<FeedUpdatedEvent> createFeedUpdatedEventSubscriber(final UnityConfigurationProvider unityConfigurationProvider) { return new IEventSubscriber<FeedUpdatedEvent>() { @Override public void trigger(FeedUpdatedEvent feedUpdatedEvent) { String unityGameObjectName = unityConfigurationProvider.getFeedListenerGameObjectName(); if (StringUtils.isNullOrBlank(unityGameObjectName)) { Log.d(TAG, "There is no Unity GameObject registered in the appboy.xml configuration file to receive " + "feed updates. Not sending the message to the Unity Player."); return; } String unityCallbackFunctionName = unityConfigurationProvider.getFeedListenerCallbackMethodName(); if (StringUtils.isNullOrBlank(unityCallbackFunctionName)) { Log.d(TAG, "There is no Unity callback method name registered to receive feed updates in " + "the appboy.xml configuration file. Not sending the message to the Unity Player."); return; } JSONArray jsonArray = new JSONArray(); List<Card> cards = feedUpdatedEvent.getFeedCards(); for (Card card : cards) { jsonArray.put(card.forJsonPut()); } JSONObject object = new JSONObject(); try { object.put("mFeedCards", jsonArray); object.put("mFromOfflineStorage", feedUpdatedEvent.isFromOfflineStorage()); } catch (JSONException e) { AppboyLogger.e(TAG, "Caught exception creating feed updated event Json.", e); } UnityPlayer.UnitySendMessage(unityGameObjectName, unityCallbackFunctionName, object.toString()); } }; } }