package com.mixpanel.android.mpmetrics;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import com.mixpanel.android.util.MPLog;
/**
* BroadcastReceiver for automatically storing Google Play Store referrer information as Mixpanel Super Properties.
*
* <p>You can use InstallReferrerReceiver to capture and store referrer information,
* and use that information to track how users from different sources are using your app.
* To enable InstallReferrerReceiver, add a clause like the following
* to the <application> tag of your AndroidManifest.xml.</p>
*
* <pre>
* {@code
* <receiver android:name="com.mixpanel.android.mpmetrics.InstallReferrerReceiver"
* android:exported="true">
* <intent-filter>
* <action android:name="com.android.vending.INSTALL_REFERRER" />
* </intent-filter>
* </receiver>
* }
* </pre>
*
* <p>Once you've added the <receiver> tag to your manifest,
* all calls to {@link com.mixpanel.android.mpmetrics.MixpanelAPI#track(String, org.json.JSONObject)}
* will include the user's Google Play Referrer as metadata. In addition, if
* you include utm parameters in your link to Google Play, they will be parsed and
* provided as individual properties in your track calls.</p>
*
* <p>InstallReferrerReceiver looks for any of the following parameters. All are optional.</p>
* <ul>
* <li>utm_source: often represents the source of your traffic (for example, a search engine or an ad)</li>
* <li>utm_medium: indicates whether the link was sent via email, on facebook, or pay per click</li>
* <li>utm_term: indicates the keyword or search term associated with the link</li>
* <li>utm_content: indicates the particular content associated with the link (for example, which email message was sent)</li>
* <li>utm_campaign: the name of the marketing campaign associated with the link.</li>
* </ul>
*
* <p>Whether or not the utm parameters are present, the InstallReferrerReceiver will
* also create a "referrer" super property with the complete referrer string.</p>
*/
public class InstallReferrerReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
final Bundle extras = intent.getExtras();
if (null == extras) {
return;
}
final String referrer = extras.getString("referrer");
if (null == referrer) {
return;
}
final Map<String, String> newPrefs = new HashMap<String, String>();
newPrefs.put("referrer", referrer);
final Matcher sourceMatcher = UTM_SOURCE_PATTERN.matcher(referrer);
final String source = find(sourceMatcher);
if (null != source) {
newPrefs.put("utm_source", source);
}
final Matcher mediumMatcher = UTM_MEDIUM_PATTERN.matcher(referrer);
final String medium = find(mediumMatcher);
if (null != medium) {
newPrefs.put("utm_medium", medium);
}
final Matcher campaignMatcher = UTM_CAMPAIGN_PATTERN.matcher(referrer);
final String campaign = find(campaignMatcher);
if (null != campaign) {
newPrefs.put("utm_campaign", campaign);
}
final Matcher contentMatcher = UTM_CONTENT_PATTERN.matcher(referrer);
final String content = find(contentMatcher);
if (null != content) {
newPrefs.put("utm_content", content);
}
final Matcher termMatcher = UTM_TERM_PATTERN.matcher(referrer);
final String term = find(termMatcher);
if (null != term) {
newPrefs.put("utm_term", term);
}
PersistentIdentity.writeReferrerPrefs(context, MPConfig.REFERRER_PREFS_NAME, newPrefs);
}
private String find(Matcher matcher) {
if (matcher.find()) {
final String encoded = matcher.group(2);
if (null != encoded) {
try {
return URLDecoder.decode(encoded, "UTF-8");
} catch (final UnsupportedEncodingException e) {
MPLog.e(LOGTAG, "Could not decode a parameter into UTF-8");
}
}
}
return null;
}
private final Pattern UTM_SOURCE_PATTERN = Pattern.compile("(^|&)utm_source=([^=]*)([#&]|$)");
private final Pattern UTM_MEDIUM_PATTERN = Pattern.compile("(^|&)utm_medium=([^=]*)([#&]|$)");
private final Pattern UTM_CAMPAIGN_PATTERN = Pattern.compile("(^|&)utm_campaign=([^=]*)([#&]|$)");
private final Pattern UTM_CONTENT_PATTERN = Pattern.compile("(^|&)utm_content=([^=]*)([#&]|$)");
private final Pattern UTM_TERM_PATTERN = Pattern.compile("(^|&)utm_term=([^=]*)([#&]|$)");
private static final String LOGTAG = "MixpanelAPI.InstRfrRcvr";
}