Skip to content

Commit

Permalink
Create a persisted tweak before it is declared (#501)
Browse files Browse the repository at this point in the history
  • Loading branch information
Sergio Alonso Fernández committed Oct 6, 2017
1 parent 9bf7800 commit d27c1d0
Show file tree
Hide file tree
Showing 2 changed files with 68 additions and 5 deletions.
59 changes: 58 additions & 1 deletion src/main/java/com/mixpanel/android/mpmetrics/Tweaks.java
Expand Up @@ -4,6 +4,9 @@

import com.mixpanel.android.util.MPLog;

import org.json.JSONException;
import org.json.JSONObject;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
Expand Down Expand Up @@ -230,12 +233,66 @@ public Number getMaximum() {
return maximum;
}

public Object getDefaultValue() {
return defaultValue;
}

public Object getValue() {
return value;
}

public final @TweakType int type;

public static TweakValue fromJson(JSONObject tweakDesc) {
try {
final String tweakName = tweakDesc.getString("name");
final String type = tweakDesc.getString("type");
Object value, defaultValue;
Number minimum = null, maximum = null;
@TweakType int tweakType;
if ("number".equals(type)) {
final String encoding = tweakDesc.getString("encoding");
if ("d".equals(encoding)) {
tweakType = DOUBLE_TYPE;
value = tweakDesc.getDouble("value");
defaultValue = tweakDesc.getDouble("default");
if (!tweakDesc.isNull("minimum")) {
minimum = tweakDesc.getDouble("minimum");
}
if (!tweakDesc.isNull("maximum")) {
maximum = tweakDesc.getDouble("maximum");
}
} else if ("l".equals(encoding)) {
value = tweakDesc.getLong("value");
tweakType = LONG_TYPE;
defaultValue = tweakDesc.getLong("default");
if (!tweakDesc.isNull("minimum")) {
minimum = tweakDesc.getLong("minimum");
}
if (!tweakDesc.isNull("maximum")) {
maximum = tweakDesc.getLong("maximum");
}
} else {
return null;
}
} else if ("boolean".equals(type)) {
tweakType = BOOLEAN_TYPE;
value = tweakDesc.getBoolean("value");
defaultValue = tweakDesc.getBoolean("default");
} else if ("string".equals(type)) {
tweakType = STRING_TYPE;
value = tweakDesc.getString("value");
defaultValue = tweakDesc.getString("default");
} else {
return null;
}

return new TweakValue(tweakType, defaultValue, minimum, maximum, value, tweakName);
} catch (JSONException e) {}

return null;
}

private final Object value;
private final Object defaultValue;
private final Number minimum;
Expand Down Expand Up @@ -404,7 +461,7 @@ private synchronized TweakValue getValue(String tweakName) {
return mTweakValues.get(tweakName);
}

private void declareTweak(String tweakName, Object defaultValue, Number minimumValue, Number maximumValue, @TweakType int tweakType) {
public void declareTweak(String tweakName, Object defaultValue, Number minimumValue, Number maximumValue, @TweakType int tweakType) {
if (mTweakValues.containsKey(tweakName)) {
MPLog.w(LOGTAG, "Attempt to define a tweak \"" + tweakName + "\" twice with the same name");
return;
Expand Down
14 changes: 10 additions & 4 deletions src/main/java/com/mixpanel/android/viewcrawler/ViewCrawler.java
Expand Up @@ -568,20 +568,24 @@ private void sendDeviceInfo() {
case Tweaks.BOOLEAN_TYPE:
j.name("type").value("boolean");
j.name("value").value(desc.getBooleanValue());
j.name("default").value((Boolean) desc.getDefaultValue());
break;
case Tweaks.DOUBLE_TYPE:
j.name("type").value("number");
j.name("encoding").value("d");
j.name("value").value(desc.getNumberValue().doubleValue());
j.name("default").value(((Number) desc.getDefaultValue()).doubleValue());
break;
case Tweaks.LONG_TYPE:
j.name("type").value("number");
j.name("encoding").value("l");
j.name("value").value(desc.getNumberValue().longValue());
j.name("default").value(((Number) desc.getDefaultValue()).longValue());
break;
case Tweaks.STRING_TYPE:
j.name("type").value("string");
j.name("value").value(desc.getStringValue());
j.name("default").value((String) desc.getDefaultValue());
break;
default:
MPLog.wtf(LOGTAG, "Unrecognized Tweak Type " + desc.type + " encountered.");
Expand Down Expand Up @@ -900,17 +904,19 @@ private void applyVariantsAndEventBindings() {
try {
final Pair<String, Object> tweakValue = mProtocol.readTweak(tweakInfo.tweak);

Map<String, Tweaks.TweakValue> tweaks = mTweaks.getAllValues();
Tweaks.TweakValue value = tweaks.get(tweakValue.first);
if (!mSeenExperiments.contains(tweakInfo.variantId)) {
toTrack.add(tweakInfo.variantId);
updatedTweaks.add(tweakValue.first);
} else if (mTweaks.isNewValue(tweakValue.first, tweakValue.second)) {
Map<String, Tweaks.TweakValue> tweaks2 = mTweaks.getAllValues();
Tweaks.TweakValue value2 = tweaks2.get(tweakValue.first);
updatedTweaks.add(tweakValue.first);
}

if (!mTweaks.getAllValues().containsKey(tweakValue.first)) {
Tweaks.TweakValue persistedTweak = Tweaks.TweakValue.fromJson(tweakInfo.tweak);
if (persistedTweak != null) {
mTweaks.declareTweak(tweakValue.first, persistedTweak.getDefaultValue(), persistedTweak.getMinimum(), persistedTweak.getMaximum(), persistedTweak.type);
}
}
mTweaks.set(tweakValue.first, tweakValue.second);
} catch (EditProtocol.BadInstructionsException e) {
MPLog.e(LOGTAG, "Bad editor tweak cannot be applied.", e);
Expand Down

0 comments on commit d27c1d0

Please sign in to comment.