package com.danielcwilson.plugins.analytics; import com.google.analytics.tracking.android.Fields; import com.google.analytics.tracking.android.GAServiceManager; import com.google.analytics.tracking.android.GoogleAnalytics; import com.google.analytics.tracking.android.Logger.LogLevel; import com.google.analytics.tracking.android.MapBuilder; import com.google.analytics.tracking.android.Tracker; import org.apache.cordova.CordovaPlugin; import org.apache.cordova.CallbackContext; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.util.HashMap; import java.util.Map.Entry; public class UniversalAnalyticsPlugin extends CordovaPlugin { public static final String START_TRACKER = "startTrackerWithId"; public static final String ADD_DIMENSION = "addCustomDimension"; public static final String TRACK_VIEW = "trackView"; public static final String TRACK_EVENT = "trackEvent"; public Boolean trackerStarted = false; public HashMap<String, String> customDimensions = new HashMap<String, String>(); @Override public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException { if (START_TRACKER.equals(action)) { String id = args.getString(0); this.startTracker(id, callbackContext); return true; } else if (ADD_DIMENSION.equals(action)) { String key = args.getString(0); String value = args.getString(1); this.addCustomDimension(key, value, callbackContext); return true; } else if (TRACK_VIEW.equals(action)) { String screen = args.getString(0); this.trackView(screen, callbackContext); return true; } else if (TRACK_EVENT.equals(action)) { int length = args.length(); if (length > 0) { this.trackEvent( args.getString(0), length > 1 ? args.getString(1) : "", length > 2 ? args.getString(2) : "", length > 3 ? args.getLong(3) : 0, callbackContext); } return true; } return false; } @SuppressWarnings("deprecation") private void startTracker(String id, CallbackContext callbackContext) { if (null != id && id.length() > 0) { GoogleAnalytics.getInstance(this.cordova.getActivity()).getTracker(id); callbackContext.success("tracker started"); trackerStarted = true; GAServiceManager.getInstance().setLocalDispatchPeriod(30); //deprecated but whatcha gonna do? set dispatch period to 30 sec // Set the log level to verbose. /*GoogleAnalytics.getInstance(this.cordova.getActivity()).getLogger() .setLogLevel(LogLevel.VERBOSE);*/ } else { callbackContext.error("tracker id is not valid"); } } private void addCustomDimension(String key, String value, CallbackContext callbackContext) { if (null != key && key.length() > 0 && null != value && value.length() > 0) { customDimensions.put(key, value); } else { callbackContext.error("Expected non-empty string arguments."); } } private void addCustomDimensionsToTracker(Tracker tracker) { for (Entry<String, String> entry : customDimensions.entrySet()) { String key = entry.getKey(); String value = entry.getValue(); //System.out.println("Setting tracker dimension slot " + key + ": <" + value+">"); tracker.set(Fields.customDimension(Integer.parseInt(key)), value); } } private void trackView(String screenname, CallbackContext callbackContext) { if (! trackerStarted ) { callbackContext.error("Tracker not started"); return; } Tracker tracker = GoogleAnalytics.getInstance(this.cordova.getActivity()).getDefaultTracker(); addCustomDimensionsToTracker(tracker); if (null != screenname && screenname.length() > 0) { tracker.set(Fields.SCREEN_NAME, screenname); tracker.send(MapBuilder .createAppView() .build() ); callbackContext.success("Track Screen: " + screenname); } else { callbackContext.error("Expected one non-empty string argument."); } } private void trackEvent(String category, String action, String label, long value, CallbackContext callbackContext) { if (! trackerStarted ) { callbackContext.error("Tracker not started"); return; } Tracker tracker = GoogleAnalytics.getInstance(this.cordova.getActivity()).getDefaultTracker(); addCustomDimensionsToTracker(tracker); if (null != category && category.length() > 0) { tracker.send(MapBuilder .createEvent(category, action, label, value) .build() ); callbackContext.success("Track Event: " + category); } else { callbackContext.error("Expected non-empty string arguments."); } } }