All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.segment.analytics.android.integrations.adobeanalytics.AdobeIntegration Maven / Gradle / Ivy

package com.segment.analytics.android.integrations.adobeanalytics;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;

import com.segment.analytics.Properties;
import com.segment.analytics.ValueMap;
import com.segment.analytics.integrations.BasePayload;
import com.segment.analytics.integrations.GroupPayload;
import com.segment.analytics.integrations.IdentifyPayload;
import com.segment.analytics.integrations.Integration;
import com.segment.analytics.integrations.Logger;
import com.segment.analytics.integrations.ScreenPayload;
import com.segment.analytics.integrations.TrackPayload;

import java.util.HashMap;
import java.util.Map;

import static com.segment.analytics.internal.Utils.isNullOrEmpty;

/**
 * Adobe Analytics is an analytics tracking tool and dashboard that helps you understand your
 * customer segments via activity and video tracking.
 *
 * @see Adobe Analytics
 * @see Adobe Integration
 * @see Adobe
 *     Android SDK
 */
public class AdobeIntegration extends Integration {

  public static final Factory FACTORY =
      new Factory() {
        @Override
        public Integration create(ValueMap settings, com.segment.analytics.Analytics analytics) {
          Logger logger = analytics.logger(ADOBE_KEY);
          return new AdobeIntegration(settings, analytics, logger);
        }

        @Override
        public String key() {
          return ADOBE_KEY;
        }
      };

  private static final String ADOBE_KEY = "Adobe Analytics";

  private Logger logger;
  private AdobeAnalyticsClient adobeAnalytics;
  private VideoAnalytics video;
  private EcommerceAnalytics ecommerce;
  private Map eventsMapping;
  private ContextDataConfiguration contextDataConfiguration;

  AdobeIntegration(ValueMap settings, com.segment.analytics.Analytics analytics, Logger logger) {

    String serverUrl = settings.getString("heartbeatTrackingServerUrl");
    String productIdentifier = settings.getString("productIdentifier");
    boolean ssl = settings.getBoolean("ssl", false);

    eventsMapping = getSetting("eventsV2", settings);
    contextDataConfiguration = new ContextDataConfiguration(settings);

    this.logger = logger;

    video =
        new VideoAnalytics(
            analytics.getApplication(), serverUrl, contextDataConfiguration, ssl, logger);
    adobeAnalytics = new AdobeAnalyticsClient.DefaultClient();
    ecommerce =
        new EcommerceAnalytics(adobeAnalytics, productIdentifier, contextDataConfiguration, logger);

    if (logger.logLevel.equals(com.segment.analytics.Analytics.LogLevel.VERBOSE)) {
      logger.verbose("Enabled debugging");
      video.setDebugLogging(true);
      adobeAnalytics.setDebugLogging(true);
    }

    Context context = analytics.getApplication();
    // This is the same as adding it to onCreate in the main application class.
    adobeAnalytics.setContext(context);
    logger.verbose("Config.setContext();");
  }

  AdobeIntegration(
      ValueMap settings,
      com.segment.analytics.Analytics analytics,
      VideoAnalytics video,
      EcommerceAnalytics ecommerce,
      AdobeAnalyticsClient adobeAnalytics,
      Logger logger) {

    this.adobeAnalytics = adobeAnalytics;
    this.logger = logger;
    this.video = video;
    this.ecommerce = ecommerce;
    this.eventsMapping = getSetting("eventsV2", settings);
    contextDataConfiguration = new ContextDataConfiguration(settings);

    Context context = analytics.getApplication();
    // This is the same as adding it to onCreate in the main application class.
    this.adobeAnalytics.setContext(context);
    logger.verbose("Config.setContext();");
  }

  @Override
  public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
    super.onActivityCreated(activity, savedInstanceState);

    adobeAnalytics.setContext(activity.getApplicationContext());
    logger.verbose("Config.setContext();");
  }

  @Override
  public void onActivityPaused(Activity activity) {
    super.onActivityPaused(activity);

    adobeAnalytics.pauseCollectingLifecycleData();
    logger.verbose("Config.pauseCollectingLifecycleData();");
  }

  @Override
  public void onActivityResumed(Activity activity) {
    super.onActivityResumed(activity);

    adobeAnalytics.collectLifecycleData(activity);
    logger.verbose("Config.collectLifecycleData(%s);", activity);
  }

  @Override
  public void identify(IdentifyPayload identify) {
    super.identify(identify);

    String userId = identify.userId();
    if (isNullOrEmpty(userId)) {
      return;
    }
    adobeAnalytics.setUserIdentifier(userId);
    logger.verbose("Config.setUserIdentifier(%s);", userId);
  }

  @Override
  public void screen(ScreenPayload screen) {
    super.screen(screen);

    Properties properties = screen.properties();

    if (isNullOrEmpty(properties)) {
      adobeAnalytics.trackState(screen.name(), null);
      logger.verbose("Analytics.trackState(%s, %s);", screen.name(), null);
      return;
    }

    Map cdata = getContextData(screen);
    adobeAnalytics.trackState(screen.name(), cdata);
    logger.verbose("Analytics.trackState(%s, %s);", screen.name(), cdata);
  }

  @Override
  public void track(TrackPayload payload) {
    super.track(payload);

    String eventName = payload.event();

    if (VideoAnalytics.Event.isVideoEvent(eventName)) {
      video.track(payload);
      return;
    }

    if (EcommerceAnalytics.Event.isEcommerceEvent(eventName)) {
      if (eventsMapping != null && eventsMapping.containsKey(eventName)) {
        logger.verbose(
            "Segment currently does not support mapping specced ecommerce events to "
                + "custom Adobe events.");
        return;
      }

      ecommerce.track(payload);
      return;
    }

    if (eventsMapping == null
        || eventsMapping.size() == 0
        || !eventsMapping.containsKey(eventName)) {
      logger.verbose(
          "Event must be either configured in Adobe and in the Segment EventsV2 setting, "
              + "a reserved Adobe Ecommerce or Video event.");
      return;
    }

    String event = String.valueOf(eventsMapping.get(eventName));
    Map cdata = getContextData(payload);

    adobeAnalytics.trackAction(event, cdata);
    logger.verbose("Analytics.trackAction(%s, %s);", event, cdata);
  }

  private Map getContextData(BasePayload payload) {

    Properties extraProperties = new Properties();
    if (payload.containsKey("properties")) {
      extraProperties.putAll(payload.getValueMap("properties"));
    }

    // Remove products just in case
    extraProperties.remove("products");

    Map contextData = new HashMap<>();

    for (String field : contextDataConfiguration.getEventFieldNames()) {
      Object value = null;
      try {
        value = contextDataConfiguration.searchValue(field, payload);
      } catch (IllegalArgumentException e) {
        // Ignore.
      }

      if (value != null) {
        String variable = contextDataConfiguration.getVariableName(field);
        contextData.put(variable, value);
        extraProperties.remove(field);
      }
    }

    // Add all extra properties
    for (String extraProperty : extraProperties.keySet()) {
      String variable = contextDataConfiguration.getPrefix() + extraProperty;
      contextData.put(variable, extraProperties.get(extraProperty));
    }

    if (contextData.size() == 0) {
      return null;
    }

    return contextData;
  }

  /**
   * Retrieves the setting as a map of strings, or an empty map if it is not defined.
   *
   * @param name Setting name.
   * @return Strings map.
   */
  private static Map getSetting(String name, ValueMap settings) {
    ValueMap setting = settings.getValueMap(name);
    if (setting == null) {
      setting = new ValueMap();
    }

    return setting.toStringMap();
  }

  @Override
  public void group(GroupPayload group) {
    super.group(group);
  }

  @Override
  public void flush() {
    super.flush();

    adobeAnalytics.flushQueue();
    logger.verbose("Analytics.sendQueuedHits();");
  }

  @Override
  public void reset() {
    super.reset();

    adobeAnalytics.setUserIdentifier(null);
    logger.verbose("Config.setUserIdentifier(null);");
  }

  Map getEventsMapping() {
    return eventsMapping;
  }

  /**
   * Allows to redefine the events mapping. Only used for testing.
   *
   * @param eventsMapping Events mapping as {segment event, adobe analytics event}.
   */
  void setEventsMapping(Map eventsMapping) {
    this.eventsMapping = eventsMapping;
  }

  ContextDataConfiguration getContextDataConfiguration() {
    return contextDataConfiguration;
  }

  /**
   * Allows to redefine the context data configuration. Only used for testing.
   *
   * @param contextDataConfiguration New context data configuration.
   */
  void setContextDataConfiguration(ContextDataConfiguration contextDataConfiguration) {
    this.contextDataConfiguration = contextDataConfiguration;
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy