package com.jdroid.android.google.analytics; import android.app.Activity; import com.google.android.gms.analytics.HitBuilders; import com.google.android.gms.analytics.HitBuilders.SocialBuilder; import com.jdroid.android.analytics.AnalyticsTracker; import com.jdroid.android.application.AbstractApplication; import com.jdroid.android.social.AccountType; import com.jdroid.android.social.SocialAction; import com.jdroid.android.usecase.AbstractUseCase; import com.jdroid.android.utils.DeviceUtils; import com.jdroid.java.utils.LoggerUtils; import org.slf4j.Logger; import java.util.List; import java.util.Map; public class GoogleAnalyticsTracker extends AbstractGoogleAnalyticsTracker implements AnalyticsTracker { private static final Logger LOGGER = LoggerUtils.getLogger(GoogleAnalyticsTracker.class); public static final String NOTIFICATION_CATEGORY = "notification"; private static final String FEEDBACK_CATEGORY = "feedback"; private static final String WIDGET_CATEGORY = "widget"; public static final String SOCIAL = "social"; private Boolean firstTrackingSent = false; public enum CustomDimension { LOGIN_SOURCE, IS_LOGGED, INSTALLATION_SOURCE, // User scope REFERRER, // Hit scope DEVICE_TYPE, // User scope DEVICE_YEAR_CLASS; // User scope } @Override public void onActivityStart(Class<? extends Activity> activityClass, String referrer, Object data) { synchronized (GoogleAnalyticsTracker.class) { HitBuilders.ScreenViewBuilder screenViewBuilder = new HitBuilders.ScreenViewBuilder(); initReferrerCustomDimension(referrer); if (!firstTrackingSent) { getGoogleAnalyticsHelper().addCustomDimension(screenViewBuilder, CustomDimension.DEVICE_YEAR_CLASS, DeviceUtils.getDeviceYearClass().toString()); getGoogleAnalyticsHelper().addCustomDimension(screenViewBuilder, CustomDimension.DEVICE_TYPE, DeviceUtils.getDeviceType()); String installationSource = AbstractApplication.get().getInstallationSource(); if (installationSource != null) { getGoogleAnalyticsHelper().addCustomDimension(screenViewBuilder, CustomDimension.INSTALLATION_SOURCE, installationSource); onAppLoadTrack(screenViewBuilder, data); firstTrackingSent = true; } } onActivityStartTrack(screenViewBuilder, data); getGoogleAnalyticsHelper().sendScreenView(screenViewBuilder, activityClass.getSimpleName()); } } @Override public void onActivityResume(Activity activity) { // Do nothing } @Override public void onActivityPause(Activity activity) { // Do nothing } @Override public void onActivityStop(Activity activity) { // Do nothing } @Override public void onActivityDestroy(Activity activity) { // Do nothing } protected void onAppLoadTrack(HitBuilders.ScreenViewBuilder screenViewBuilder, Object data) { // Do nothing } protected void onActivityStartTrack(HitBuilders.ScreenViewBuilder screenViewBuilder, Object data) { // Do nothing } private void initReferrerCustomDimension(String referrer) { if (referrer != null) { getGoogleAnalyticsHelper().addCommonCustomDimension(CustomDimension.REFERRER.name(), referrer); } else if (!getGoogleAnalyticsHelper().hasCommonCustomDimension(CustomDimension.REFERRER.name())) { getGoogleAnalyticsHelper().addCommonCustomDimension(CustomDimension.REFERRER.name(), "normal"); } } @Override public void onFragmentStart(String screenViewName) { synchronized (GoogleAnalyticsTracker.class) { HitBuilders.ScreenViewBuilder screenViewBuilder = new HitBuilders.ScreenViewBuilder(); getGoogleAnalyticsHelper().sendScreenView(screenViewBuilder, screenViewName); } } @Override public void trackNotificationDisplayed(String notificationName) { getGoogleAnalyticsHelper().sendEvent(NOTIFICATION_CATEGORY, "display", notificationName); } @Override public void trackNotificationOpened(String notificationName) { getGoogleAnalyticsHelper().sendEvent(NOTIFICATION_CATEGORY, "open", notificationName); } @Override public void trackEnjoyingApp(Boolean enjoying) { getGoogleAnalyticsHelper().sendEvent(FEEDBACK_CATEGORY, "enjoying", enjoying.toString()); } @Override public void trackRateOnGooglePlay(Boolean rate) { getGoogleAnalyticsHelper().sendEvent(FEEDBACK_CATEGORY, "rate", rate.toString()); } @Override public void trackGiveFeedback(Boolean feedback) { getGoogleAnalyticsHelper().sendEvent(FEEDBACK_CATEGORY, "giveFeedback", feedback.toString()); } @Override public void trackUseCaseTiming(Class<? extends AbstractUseCase> useCaseClass, long executionTime) { getGoogleAnalyticsHelper().trackTiming("UseCase", useCaseClass.getSimpleName(), useCaseClass.getSimpleName(), executionTime); } @Override public void trackServiceTiming(String trackingVariable, String trackingLabel, long executionTime) { getGoogleAnalyticsHelper().trackTiming("Service", trackingVariable, trackingLabel, executionTime); } @Override public void trackUriOpened(String screenName, String referrer) { initReferrerCustomDimension(referrer); getGoogleAnalyticsHelper().sendEvent("uri", "open", screenName); } // Widgets public void trackWidgetAdded(String widgetName) { getGoogleAnalyticsHelper().sendEvent(WIDGET_CATEGORY, "add", widgetName); } public void trackWidgetRemoved(String widgetName) { getGoogleAnalyticsHelper().sendEvent(WIDGET_CATEGORY, "remove", widgetName); } @Override public void trackSendAppInvitation(String invitationId) { getGoogleAnalyticsHelper().sendEvent(GoogleAnalyticsTracker.SOCIAL, "sendAppInvitation", invitationId); } @Override public void trackSocialInteraction(AccountType accountType, SocialAction socialAction, String socialTarget) { String category = SOCIAL; String network = "Undefined"; if (accountType != null) { category += accountType.getFriendlyName(); network = accountType.getFriendlyName(); } getGoogleAnalyticsHelper().sendEvent(category, socialAction.getName(), socialTarget); SocialBuilder socialBuilder = new SocialBuilder(); socialBuilder.setNetwork(network); socialBuilder.setAction(socialAction.getName()); socialBuilder.setTarget(socialTarget); getGoogleAnalyticsHelper().getTracker().send(socialBuilder.build()); LOGGER.debug("Social interaction sent. Network [" + network + "] Action [" + socialAction.getName() + "] Target [" + socialTarget + "]"); } @Override public void onInitExceptionHandler(Map<String, String> metadata) { // Do nothing } @Override public void trackFatalException(Throwable throwable, List<String> tags) { // Do nothing } @Override public void trackHandledException(Throwable throwable, List<String> tags) { // Do nothing } @Override public void trackErrorBreadcrumb(String message) { // Do nothing } public void sendSocialInteraction(AccountType accountType, SocialAction socialAction, String socialTarget) { SocialBuilder socialBuilder = new SocialBuilder(); socialBuilder.setNetwork(accountType.getFriendlyName()); socialBuilder.setAction(socialAction.getName()); socialBuilder.setTarget(socialTarget); getGoogleAnalyticsHelper().getTracker().send(socialBuilder.build()); LOGGER.debug("Social interaction sent. Network [" + accountType.getFriendlyName() + "] Action [" + socialAction.getName() + "] Target [" + socialTarget + "]"); } }