/*
* Android SDK for Piwik
*
* @link https://github.com/piwik/piwik-android-sdk
* @license https://github.com/piwik/piwik-sdk-android/blob/master/LICENSE BSD-3 Clause
*/
package org.piwik.sdk;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import java.util.HashMap;
import java.util.Map;
/**
* This objects represents one query to Piwik.
* For each event send to Piwik a TrackMe gets created, either explicitly by you or implicitly by the Tracker.
*/
public class TrackMe {
private static final int DEFAULT_QUERY_CAPACITY = 14;
private final HashMap<String, String> mQueryParams = new HashMap<>(DEFAULT_QUERY_CAPACITY);
public TrackMe() { }
public TrackMe(TrackMe trackMe) {
mQueryParams.putAll(trackMe.mQueryParams);
}
/**
* Adds TrackMe to this TrackMe, overriding values if necessary.
*/
public TrackMe putAll(@NonNull TrackMe trackMe) {
mQueryParams.putAll(trackMe.toMap());
return this;
}
/**
* Consider using {@link QueryParams} instead of raw strings
*/
public synchronized TrackMe set(@NonNull String key, String value) {
if (value == null) mQueryParams.remove(key);
else if (value.length() > 0) mQueryParams.put(key, value);
return this;
}
/**
* Consider using {@link QueryParams} instead of raw strings
*/
@Nullable
public synchronized String get(@NonNull String queryParams) {
return mQueryParams.get(queryParams);
}
/**
* You can set any additional Tracking API Parameters within the SDK.
* This includes for example the local time (parameters h, m and s).
* <pre>
* set(QueryParams.HOURS, "10");
* set(QueryParams.MINUTES, "45");
* set(QueryParams.SECONDS, "30");
* </pre>
*
* @param key query params name
* @param value value
* @return tracker instance
*/
public synchronized TrackMe set(@NonNull QueryParams key, String value) {
set(key.toString(), value);
return this;
}
public synchronized TrackMe set(@NonNull QueryParams key, int value) {
set(key, Integer.toString(value));
return this;
}
public synchronized TrackMe set(@NonNull QueryParams key, float value) {
set(key, Float.toString(value));
return this;
}
public synchronized TrackMe set(@NonNull QueryParams key, long value) {
set(key, Long.toString(value));
return this;
}
public synchronized boolean has(@NonNull QueryParams queryParams) {
return mQueryParams.containsKey(queryParams.toString());
}
/**
* Only sets the value if it doesn't exist.
*
* @param key type
* @param value value
* @return this (for chaining)
*/
public synchronized TrackMe trySet(@NonNull QueryParams key, int value) {
return trySet(key, String.valueOf(value));
}
/**
* Only sets the value if it doesn't exist.
*
* @param key type
* @param value value
* @return this (for chaining)
*/
public synchronized TrackMe trySet(@NonNull QueryParams key, float value) {
return trySet(key, String.valueOf(value));
}
public synchronized TrackMe trySet(@NonNull QueryParams key, long value) {
return trySet(key, String.valueOf(value));
}
/**
* Only sets the value if it doesn't exist.
*
* @param key type
* @param value value
* @return this (for chaining)
*/
public synchronized TrackMe trySet(@NonNull QueryParams key, String value) {
if (!has(key)) set(key, value);
return this;
}
/**
* The tracker calls this to get the final data that will be transmitted
*
* @return the parameter map, but without the base URL
*/
public synchronized Map<String, String> toMap() {
return new HashMap<>(mQueryParams);
}
public synchronized String get(@NonNull QueryParams queryParams) {
return mQueryParams.get(queryParams.toString());
}
public synchronized boolean isEmpty() {
return mQueryParams.isEmpty();
}
}