Skip to content

Commit cd24728

Browse files
Support Remote Config managed value types (#1164)
Update Remote Config API to support managed value types Added support for Rollouts, Experiments, and Personalization value types in the Remote Config API. - Updated `ParameterValue` to include `RolloutValue`, `PersonalizationValue`, and `ExperimentValue` subclasses. - Added factory methods `ofRollout`, `ofPersonalization`, and `ofExperiment` to `ParameterValue`. - Updated `TemplateResponse` to parse `rolloutValue`, `personalizationValue`, and `experimentValue` fields from the backend response. - Added unit tests for the new value types. --------- Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>
1 parent 88d4b58 commit cd24728

File tree

5 files changed

+575
-0
lines changed

5 files changed

+575
-0
lines changed

src/main/java/com/google/firebase/remoteconfig/ParameterValue.java

Lines changed: 275 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,15 @@
1919
import static com.google.common.base.Preconditions.checkNotNull;
2020

2121
import com.google.firebase.internal.NonNull;
22+
import com.google.firebase.internal.Nullable;
23+
import com.google.firebase.remoteconfig.internal.TemplateResponse.ExperimentValueResponse;
24+
import com.google.firebase.remoteconfig.internal.TemplateResponse.ExperimentVariantValueResponse;
2225
import com.google.firebase.remoteconfig.internal.TemplateResponse.ParameterValueResponse;
26+
import com.google.firebase.remoteconfig.internal.TemplateResponse.PersonalizationValueResponse;
27+
import com.google.firebase.remoteconfig.internal.TemplateResponse.RolloutValueResponse;
2328

29+
import java.util.ArrayList;
30+
import java.util.List;
2431
import java.util.Objects;
2532

2633
/**
@@ -47,6 +54,40 @@ public static InAppDefault inAppDefault() {
4754
return new InAppDefault();
4855
}
4956

57+
/**
58+
* Creates a new {@link ParameterValue.RolloutValue} instance.
59+
*
60+
* @param rolloutId The rollout ID.
61+
* @param value The value of the rollout.
62+
* @param percent The percentage of the rollout.
63+
* @return A {@link ParameterValue.RolloutValue} instance.
64+
*/
65+
public static RolloutValue ofRollout(String rolloutId, String value, double percent) {
66+
return new RolloutValue(rolloutId, value, percent);
67+
}
68+
69+
/**
70+
* Creates a new {@link ParameterValue.PersonalizationValue} instance.
71+
*
72+
* @param personalizationId The personalization ID.
73+
* @return A {@link ParameterValue.PersonalizationValue} instance.
74+
*/
75+
public static PersonalizationValue ofPersonalization(String personalizationId) {
76+
return new PersonalizationValue(personalizationId);
77+
}
78+
79+
/**
80+
* Creates a new {@link ParameterValue.ExperimentValue} instance.
81+
*
82+
* @param experimentId The experiment ID.
83+
* @param variantValues The list of experiment variant values.
84+
* @return A {@link ParameterValue.ExperimentValue} instance.
85+
*/
86+
public static ExperimentValue ofExperiment(String experimentId,
87+
List<ExperimentVariantValue> variantValues) {
88+
return new ExperimentValue(experimentId, variantValues);
89+
}
90+
5091
abstract ParameterValueResponse toParameterValueResponse();
5192

5293
static ParameterValue fromParameterValueResponse(
@@ -55,6 +96,24 @@ static ParameterValue fromParameterValueResponse(
5596
if (parameterValueResponse.isUseInAppDefault()) {
5697
return ParameterValue.inAppDefault();
5798
}
99+
if (parameterValueResponse.getRolloutValue() != null) {
100+
RolloutValueResponse rv = parameterValueResponse.getRolloutValue();
101+
return ParameterValue.ofRollout(rv.getRolloutId(), rv.getValue(), rv.getPercent());
102+
}
103+
if (parameterValueResponse.getPersonalizationValue() != null) {
104+
PersonalizationValueResponse pv = parameterValueResponse.getPersonalizationValue();
105+
return ParameterValue.ofPersonalization(pv.getPersonalizationId());
106+
}
107+
if (parameterValueResponse.getExperimentValue() != null) {
108+
ExperimentValueResponse ev = parameterValueResponse.getExperimentValue();
109+
List<ExperimentVariantValue> variantValues = new ArrayList<>();
110+
for (ExperimentVariantValueResponse evv : ev.getExperimentVariantValues()) {
111+
variantValues.add(
112+
new ExperimentVariantValue(evv.getVariantId(), evv.getValue(),
113+
evv.getNoChange()));
114+
}
115+
return ParameterValue.ofExperiment(ev.getExperimentId(), variantValues);
116+
}
58117
return ParameterValue.of(parameterValueResponse.getValue());
59118
}
60119

@@ -124,4 +183,220 @@ public boolean equals(Object o) {
124183
return true;
125184
}
126185
}
186+
187+
/**
188+
* Represents a Rollout value.
189+
*/
190+
public static final class RolloutValue extends ParameterValue {
191+
private final String rolloutId;
192+
private final String value;
193+
private final double percent;
194+
195+
private RolloutValue(String rolloutId, String value, double percent) {
196+
this.rolloutId = rolloutId;
197+
this.value = value;
198+
this.percent = percent;
199+
}
200+
201+
public String getRolloutId() {
202+
return rolloutId;
203+
}
204+
205+
public String getValue() {
206+
return value;
207+
}
208+
209+
public double getPercent() {
210+
return percent;
211+
}
212+
213+
@Override
214+
ParameterValueResponse toParameterValueResponse() {
215+
return new ParameterValueResponse().setRolloutValue(
216+
new RolloutValueResponse()
217+
.setRolloutId(this.rolloutId)
218+
.setValue(this.value)
219+
.setPercent(this.percent));
220+
}
221+
222+
@Override
223+
public boolean equals(Object o) {
224+
if (this == o) {
225+
return true;
226+
}
227+
if (o == null || getClass() != o.getClass()) {
228+
return false;
229+
}
230+
RolloutValue that = (RolloutValue) o;
231+
return Double.compare(that.percent, percent) == 0
232+
&& Objects.equals(rolloutId, that.rolloutId)
233+
&& Objects.equals(value, that.value);
234+
}
235+
236+
@Override
237+
public int hashCode() {
238+
return Objects.hash(rolloutId, value, percent);
239+
}
240+
}
241+
242+
/**
243+
* Represents a Personalization value.
244+
*/
245+
public static final class PersonalizationValue extends ParameterValue {
246+
private final String personalizationId;
247+
248+
private PersonalizationValue(String personalizationId) {
249+
this.personalizationId = personalizationId;
250+
}
251+
252+
public String getPersonalizationId() {
253+
return personalizationId;
254+
}
255+
256+
@Override
257+
ParameterValueResponse toParameterValueResponse() {
258+
return new ParameterValueResponse().setPersonalizationValue(
259+
new PersonalizationValueResponse()
260+
.setPersonalizationId(this.personalizationId));
261+
}
262+
263+
@Override
264+
public boolean equals(Object o) {
265+
if (this == o) {
266+
return true;
267+
}
268+
if (o == null || getClass() != o.getClass()) {
269+
return false;
270+
}
271+
PersonalizationValue that = (PersonalizationValue) o;
272+
return Objects.equals(personalizationId, that.personalizationId);
273+
}
274+
275+
@Override
276+
public int hashCode() {
277+
return Objects.hash(personalizationId);
278+
}
279+
}
280+
281+
/**
282+
* Represents a specific variant within an Experiment.
283+
*/
284+
public static final class ExperimentVariantValue {
285+
private final String variantId;
286+
private final String value;
287+
private final boolean noChange;
288+
289+
ExperimentVariantValue(String variantId, String value, Boolean noChange) {
290+
this.variantId = variantId;
291+
this.value = value;
292+
this.noChange = Boolean.TRUE.equals(noChange);
293+
}
294+
295+
/**
296+
* Creates a new {@link ExperimentVariantValue} instance.
297+
*
298+
* @param variantId The variant ID.
299+
* @param value The value of the variant.
300+
* @return A {@link ExperimentVariantValue} instance.
301+
*/
302+
public static ExperimentVariantValue of(String variantId, String value) {
303+
return new ExperimentVariantValue(variantId, value, false);
304+
}
305+
306+
/**
307+
* Creates a new {@link ExperimentVariantValue} instance.
308+
*
309+
* @param variantId The variant ID.
310+
* @return A {@link ExperimentVariantValue} instance.
311+
*/
312+
public static ExperimentVariantValue ofNoChange(String variantId) {
313+
return new ExperimentVariantValue(variantId, null, true);
314+
}
315+
316+
public String getVariantId() {
317+
return variantId;
318+
}
319+
320+
@Nullable
321+
public String getValue() {
322+
return value;
323+
}
324+
325+
public boolean isNoChange() {
326+
return noChange;
327+
}
328+
329+
@Override
330+
public boolean equals(Object o) {
331+
if (this == o) {
332+
return true;
333+
}
334+
if (o == null || getClass() != o.getClass()) {
335+
return false;
336+
}
337+
ExperimentVariantValue that = (ExperimentVariantValue) o;
338+
return noChange == that.noChange
339+
&& Objects.equals(variantId, that.variantId)
340+
&& Objects.equals(value, that.value);
341+
}
342+
343+
@Override
344+
public int hashCode() {
345+
return Objects.hash(variantId, value, noChange);
346+
}
347+
}
348+
349+
/**
350+
* Represents an Experiment value.
351+
*/
352+
public static final class ExperimentValue extends ParameterValue {
353+
private final String experimentId;
354+
private final List<ExperimentVariantValue> variantValues;
355+
356+
private ExperimentValue(String experimentId, List<ExperimentVariantValue> variantValues) {
357+
this.experimentId = experimentId;
358+
this.variantValues = variantValues;
359+
}
360+
361+
public String getExperimentId() {
362+
return experimentId;
363+
}
364+
365+
public List<ExperimentVariantValue> getExperimentVariantValues() {
366+
return variantValues;
367+
}
368+
369+
@Override
370+
ParameterValueResponse toParameterValueResponse() {
371+
List<ExperimentVariantValueResponse> variantValueResponses = new ArrayList<>();
372+
for (ExperimentVariantValue variantValue : variantValues) {
373+
variantValueResponses.add(new ExperimentVariantValueResponse()
374+
.setVariantId(variantValue.getVariantId())
375+
.setValue(variantValue.getValue())
376+
.setNoChange(variantValue.isNoChange()));
377+
}
378+
return new ParameterValueResponse().setExperimentValue(
379+
new ExperimentValueResponse()
380+
.setExperimentId(this.experimentId)
381+
.setExperimentVariantValues(variantValueResponses));
382+
}
383+
384+
@Override
385+
public boolean equals(Object o) {
386+
if (this == o) {
387+
return true;
388+
}
389+
if (o == null || getClass() != o.getClass()) {
390+
return false;
391+
}
392+
ExperimentValue that = (ExperimentValue) o;
393+
return Objects.equals(experimentId, that.experimentId)
394+
&& Objects.equals(variantValues, that.variantValues);
395+
}
396+
397+
@Override
398+
public int hashCode() {
399+
return Objects.hash(experimentId, variantValues);
400+
}
401+
}
127402
}

0 commit comments

Comments
 (0)