package com.kickstarter.libs;
import android.content.Context;
import android.content.res.Configuration;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesUtil;
import com.kickstarter.R;
import com.kickstarter.libs.qualifiers.ApplicationContext;
import com.kickstarter.libs.utils.KoalaUtils;
import com.kickstarter.libs.utils.MapUtils;
import com.kickstarter.models.User;
import com.mixpanel.android.mpmetrics.MixpanelAPI;
import java.util.HashMap;
import java.util.Map;
import javax.inject.Inject;
public final class KoalaTrackingClient extends TrackingClientType {
@Inject CurrentUserType currentUser;
@Inject AndroidPayCapability androidPayCapability;
@Nullable private User loggedInUser;
private final @NonNull Context context;
private final @NonNull MixpanelAPI mixpanel;
// Cached values
private @Nullable Boolean isGooglePlayServicesAvailable;
public KoalaTrackingClient(
final @ApplicationContext @NonNull Context context,
final @NonNull CurrentUserType currentUser,
final @NonNull AndroidPayCapability androidPayCapability) {
this.context = context;
this.currentUser = currentUser;
this.androidPayCapability = androidPayCapability;
// Cache the most recent logged in user for default Koala properties.
this.currentUser.observable().subscribe(u -> loggedInUser = u);
mixpanel = MixpanelAPI.getInstance(context, "koala");
}
@Override
public void track(final @NonNull String eventName, final @NonNull Map<String, Object> properties) {
final Map<String, Object> newProperties = new HashMap<>(properties);
newProperties.putAll(defaultProperties());
mixpanel.trackMap(eventName, MapUtils.compact(newProperties));
}
@NonNull
@Override
public Map<String, Object> defaultProperties() {
return new HashMap<String, Object>() {
{
if (loggedInUser != null) {
putAll(KoalaUtils.userProperties(loggedInUser));
}
put("user_logged_in", loggedInUser != null);
put("client_type", "native");
put("android_play_services_available", isGooglePlayServicesAvailable());
put("client_platform", "android");
put("device_orientation", deviceOrientation());
put("device_format", deviceFormat());
put("device_fingerprint", mixpanel.getDistinctId());
put("android_uuid", mixpanel.getDistinctId());
put("android_pay_capable", androidPayCapability.isCapable());
}
};
}
/**
* Derives the device's orientation (portrait/landscape) from the `context`.
*/
private @NonNull String deviceOrientation() {
if (context.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
return "landscape";
}
return "portrait";
}
private @NonNull String deviceFormat() {
return context.getResources().getBoolean(R.bool.isTablet) ? "tablet" : "phone";
}
/**
* Derives the availability of google play services from the `context`.
*/
private boolean isGooglePlayServicesAvailable() {
if (isGooglePlayServicesAvailable == null) {
isGooglePlayServicesAvailable = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this.context.getApplicationContext()) != ConnectionResult.SUCCESS;
}
return isGooglePlayServicesAvailable;
}
}