package com.automattic.simplenote.analytics; import android.content.Context; import android.content.SharedPreferences; import android.preference.PreferenceManager; import android.text.TextUtils; import com.automattic.android.tracks.TracksClient; import org.json.JSONObject; import java.util.Map; import java.util.UUID; public class AnalyticsTrackerNosara implements AnalyticsTracker.Tracker { private static final String TRACKS_ANON_ID = "nosara_tracks_anon_id"; private static final String EVENTS_PREFIX = "spandroid_"; private String mUserName = null; private String mAnonID = null; // do not access this variable directly. Use methods. private TracksClient mNosaraClient; private Context mContext; public AnalyticsTrackerNosara(Context context) { if (null == context) { mNosaraClient = null; return; } mContext = context; mNosaraClient = TracksClient.getClient(context); } private void clearAnonID() { mAnonID = null; SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(mContext); if (preferences.contains(TRACKS_ANON_ID)) { final SharedPreferences.Editor editor = preferences.edit(); editor.remove(TRACKS_ANON_ID); editor.apply(); } } private String getAnonID() { if (mAnonID == null) { SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(mContext); mAnonID = preferences.getString(TRACKS_ANON_ID, null); } return mAnonID; } private String generateNewAnonID() { String uuid = UUID.randomUUID().toString(); SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(mContext); final SharedPreferences.Editor editor = preferences.edit(); editor.putString(TRACKS_ANON_ID, uuid); editor.apply(); mAnonID = uuid; return uuid; } @Override public void track(AnalyticsTracker.Stat stat, String category, String label) { track(stat, category, label, null); } @Override public void track(AnalyticsTracker.Stat stat, String category, String label, Map<String, ?> properties) { if (mNosaraClient == null) { return; } String eventName = stat.name().toLowerCase(); final String user; final TracksClient.NosaraUserType userType; if (mUserName != null) { user = mUserName; userType = TracksClient.NosaraUserType.SIMPLENOTE; } else { // This is just a security checks since the anonID is already available here. // refresh metadata is called on login/logout/startup and it loads/generates the anonId when necessary. if (getAnonID() == null) { user = generateNewAnonID(); } else { user = getAnonID(); } userType = TracksClient.NosaraUserType.ANON; } if (properties != null) { JSONObject propertiesJson = new JSONObject(properties); mNosaraClient.track(EVENTS_PREFIX + eventName, propertiesJson, user, userType); } else { mNosaraClient.track(EVENTS_PREFIX + eventName, user, userType); } } @Override public void refreshMetadata(String username) { if (mNosaraClient == null) { return; } if (!TextUtils.isEmpty(username)) { mUserName = username; if (getAnonID() != null) { mNosaraClient.trackAliasUser(mUserName, getAnonID(), TracksClient.NosaraUserType.SIMPLENOTE); clearAnonID(); } } else { mUserName = null; if (getAnonID() == null) { generateNewAnonID(); } } } @Override public void flush() { if (mNosaraClient == null) { return; } mNosaraClient.flush(); } }