package org.mtransit.android.util;
import org.mtransit.android.R;
import org.mtransit.android.commons.MTLog;
import org.mtransit.android.commons.TaskUtils;
import android.content.Context;
import android.os.AsyncTask;
import android.text.TextUtils;
import com.google.android.gms.analytics.GoogleAnalytics;
import com.google.android.gms.analytics.HitBuilders;
import com.google.android.gms.analytics.Tracker;
public final class AnalyticsUtils implements MTLog.Loggable {
private static final String TAG = AnalyticsUtils.class.getSimpleName();
@Override
public String getLogTag() {
return TAG;
}
private static boolean ANALYTICS_ENABLED = true;
private static final boolean DEBUG = false;
private static boolean LOCAL_ONLY = false;
private static final boolean TRACKING_ADVERTISING_ID_COLLECTION = true;
private static final boolean TRACKING_EXCEPTION_REPORTING = true;
private static final int TRACKING_LOCAL_DISPATCH_PERIOD_IN_SEC = 30 * 60; // 30 minutes
private static AnalyticsUtils instance;
private AnalyticsUtils() {
}
public static AnalyticsUtils get() {
if (instance == null) {
instance = new AnalyticsUtils();
}
return instance;
}
private static Tracker tracker;
private synchronized static Tracker getTracker(Context context) {
if (!ANALYTICS_ENABLED) {
return null;
}
if (tracker == null) {
tracker = GoogleAnalytics.getInstance(context).newTracker(context.getString(R.string.google_analytics_id));
tracker.enableAdvertisingIdCollection(TRACKING_ADVERTISING_ID_COLLECTION);
tracker.enableExceptionReporting(TRACKING_EXCEPTION_REPORTING);
GoogleAnalytics.getInstance(context).setLocalDispatchPeriod(TRACKING_LOCAL_DISPATCH_PERIOD_IN_SEC);
if (DEBUG) {
// adb shell setprop log.tag.GAv4 DEBUG
// adb logcat -v time -s GAv4
if (LOCAL_ONLY) {
GoogleAnalytics.getInstance(context).setDryRun(true);
}
}
}
return tracker;
}
public static void trackEvent(Context context, final String category, final String action, final String label, final int value) {
if (!ANALYTICS_ENABLED) {
return;
}
new AsyncTask<Context, Void, Void>() {
@Override
protected Void doInBackground(Context... params) {
try {
Tracker gaTracker = getTracker(params[0]);
if (gaTracker != null) {
gaTracker.send(new HitBuilders.EventBuilder().setCategory(category).setAction(action).setLabel(label).setValue(value).build());
}
} catch (Exception e) {
MTLog.w(TAG, e, "Error while tracing event (%s,%s,%s)!", action, label, value);
}
return null;
}
}.executeOnExecutor(TaskUtils.THREAD_POOL_EXECUTOR, context);
}
public static void trackScreenView(Context context, Trackable page) {
if (!ANALYTICS_ENABLED) {
return;
}
new AsyncTask<Object, Void, Void>() {
@Override
protected Void doInBackground(Object... params) {
try {
Context context = (Context) params[0];
String pageScreenName = (String) params[1];
if (!TextUtils.isEmpty(pageScreenName)) {
Tracker gaTracker = getTracker(context);
if (gaTracker != null) {
gaTracker.setScreenName(pageScreenName);
gaTracker.send(new HitBuilders.ScreenViewBuilder().build());
}
}
} catch (Exception e) {
MTLog.w(TAG, e, "Error while tracing screen view! (%s)", params);
}
return null;
}
}.executeOnExecutor(TaskUtils.THREAD_POOL_EXECUTOR, context, page.getScreenName());
}
public static void dispatch(Context context) {
if (!ANALYTICS_ENABLED) {
return;
}
try {
GoogleAnalytics.getInstance(context).dispatchLocalHits();
} catch (Exception e) {
MTLog.w(TAG, e, "Error while dispatching analytics data.");
}
}
public interface Trackable {
public String getScreenName();
}
}