1717package com .google .firebase .remoteconfig ;
1818
1919import static com .google .common .base .Preconditions .checkNotNull ;
20+ import static java .util .stream .Collectors .toList ;
2021
2122import com .google .firebase .internal .NonNull ;
23+ import com .google .firebase .internal .Nullable ;
24+ import com .google .firebase .remoteconfig .internal .TemplateResponse .ExperimentValueResponse ;
25+ import com .google .firebase .remoteconfig .internal .TemplateResponse .ExperimentVariantValueResponse ;
2226import com .google .firebase .remoteconfig .internal .TemplateResponse .ParameterValueResponse ;
27+ import com .google .firebase .remoteconfig .internal .TemplateResponse .PersonalizationValueResponse ;
28+ import com .google .firebase .remoteconfig .internal .TemplateResponse .RolloutValueResponse ;
2329
30+ import java .util .ArrayList ;
31+ import java .util .List ;
2432import java .util .Objects ;
2533
2634/**
@@ -47,6 +55,40 @@ public static InAppDefault inAppDefault() {
4755 return new InAppDefault ();
4856 }
4957
58+ /**
59+ * Creates a new {@link ParameterValue.RolloutValue} instance.
60+ *
61+ * @param rolloutId The rollout ID.
62+ * @param value The value of the rollout.
63+ * @param percent The percentage of the rollout.
64+ * @return A {@link ParameterValue.RolloutValue} instance.
65+ */
66+ public static RolloutValue ofRollout (String rolloutId , String value , double percent ) {
67+ return new RolloutValue (rolloutId , value , percent );
68+ }
69+
70+ /**
71+ * Creates a new {@link ParameterValue.PersonalizationValue} instance.
72+ *
73+ * @param personalizationId The personalization ID.
74+ * @return A {@link ParameterValue.PersonalizationValue} instance.
75+ */
76+ public static PersonalizationValue ofPersonalization (String personalizationId ) {
77+ return new PersonalizationValue (personalizationId );
78+ }
79+
80+ /**
81+ * Creates a new {@link ParameterValue.ExperimentValue} instance.
82+ *
83+ * @param experimentId The experiment ID.
84+ * @param variantValues The list of experiment variant values.
85+ * @return A {@link ParameterValue.ExperimentValue} instance.
86+ */
87+ public static ExperimentValue ofExperiment (String experimentId ,
88+ List <ExperimentVariantValue > variantValues ) {
89+ return new ExperimentValue (experimentId , variantValues );
90+ }
91+
5092 abstract ParameterValueResponse toParameterValueResponse ();
5193
5294 static ParameterValue fromParameterValueResponse (
@@ -55,6 +97,30 @@ static ParameterValue fromParameterValueResponse(
5597 if (parameterValueResponse .isUseInAppDefault ()) {
5698 return ParameterValue .inAppDefault ();
5799 }
100+ if (parameterValueResponse .getRolloutValue () != null ) {
101+ RolloutValueResponse rv = parameterValueResponse .getRolloutValue ();
102+ // Protobuf serialization does not set values for fields on the wire when
103+ // they are equal to the default value for the field type. When deserializing,
104+ // can appear as the value not being set. Explicitly handle default value for
105+ // the percent field since 0 is a valid value.
106+ double percent = 0 ;
107+ if (rv .getPercent () != null ) {
108+ percent = rv .getPercent ();
109+ }
110+ return ParameterValue .ofRollout (rv .getRolloutId (), rv .getValue (), percent );
111+ }
112+ if (parameterValueResponse .getPersonalizationValue () != null ) {
113+ PersonalizationValueResponse pv = parameterValueResponse .getPersonalizationValue ();
114+ return ParameterValue .ofPersonalization (pv .getPersonalizationId ());
115+ }
116+ if (parameterValueResponse .getExperimentValue () != null ) {
117+ ExperimentValueResponse ev = parameterValueResponse .getExperimentValue ();
118+ List <ExperimentVariantValue > variantValues = ev .getExperimentVariantValues ().stream ()
119+ .map (evv -> new ExperimentVariantValue (
120+ evv .getVariantId (), evv .getValue (), evv .getNoChange ()))
121+ .collect (toList ());
122+ return ParameterValue .ofExperiment (ev .getExperimentId (), variantValues );
123+ }
58124 return ParameterValue .of (parameterValueResponse .getValue ());
59125 }
60126
@@ -124,4 +190,224 @@ public boolean equals(Object o) {
124190 return true ;
125191 }
126192 }
193+
194+ /**
195+ * Represents a Rollout value.
196+ */
197+ public static final class RolloutValue extends ParameterValue {
198+ private final String rolloutId ;
199+ private final String value ;
200+ private final double percent ;
201+
202+ private RolloutValue (String rolloutId , String value , double percent ) {
203+ this .rolloutId = rolloutId ;
204+ this .value = value ;
205+ this .percent = percent ;
206+ }
207+
208+ public String getRolloutId () {
209+ return rolloutId ;
210+ }
211+
212+ public String getValue () {
213+ return value ;
214+ }
215+
216+ public double getPercent () {
217+ return percent ;
218+ }
219+
220+ @ Override
221+ ParameterValueResponse toParameterValueResponse () {
222+ return new ParameterValueResponse ().setRolloutValue (
223+ new RolloutValueResponse ()
224+ .setRolloutId (this .rolloutId )
225+ .setValue (this .value )
226+ .setPercent (this .percent ));
227+ }
228+
229+ @ Override
230+ public boolean equals (Object o ) {
231+ if (this == o ) {
232+ return true ;
233+ }
234+ if (o == null || getClass () != o .getClass ()) {
235+ return false ;
236+ }
237+ RolloutValue that = (RolloutValue ) o ;
238+ return Double .compare (that .percent , percent ) == 0
239+ && Objects .equals (rolloutId , that .rolloutId )
240+ && Objects .equals (value , that .value );
241+ }
242+
243+ @ Override
244+ public int hashCode () {
245+ return Objects .hash (rolloutId , value , percent );
246+ }
247+ }
248+
249+ /**
250+ * Represents a Personalization value.
251+ */
252+ public static final class PersonalizationValue extends ParameterValue {
253+ private final String personalizationId ;
254+
255+ private PersonalizationValue (String personalizationId ) {
256+ this .personalizationId = personalizationId ;
257+ }
258+
259+ public String getPersonalizationId () {
260+ return personalizationId ;
261+ }
262+
263+ @ Override
264+ ParameterValueResponse toParameterValueResponse () {
265+ return new ParameterValueResponse ().setPersonalizationValue (
266+ new PersonalizationValueResponse ()
267+ .setPersonalizationId (this .personalizationId ));
268+ }
269+
270+ @ Override
271+ public boolean equals (Object o ) {
272+ if (this == o ) {
273+ return true ;
274+ }
275+ if (o == null || getClass () != o .getClass ()) {
276+ return false ;
277+ }
278+ PersonalizationValue that = (PersonalizationValue ) o ;
279+ return Objects .equals (personalizationId , that .personalizationId );
280+ }
281+
282+ @ Override
283+ public int hashCode () {
284+ return Objects .hash (personalizationId );
285+ }
286+ }
287+
288+ /**
289+ * Represents a specific variant within an Experiment.
290+ */
291+ public static final class ExperimentVariantValue {
292+ private final String variantId ;
293+ private final String value ;
294+ private final Boolean noChange ;
295+
296+ ExperimentVariantValue (String variantId , String value , Boolean noChange ) {
297+ this .variantId = variantId ;
298+ this .value = value ;
299+ this .noChange = noChange ;
300+ }
301+
302+ /**
303+ * Creates a new {@link ExperimentVariantValue} instance.
304+ *
305+ * @param variantId The variant ID.
306+ * @param value The value of the variant.
307+ * @return A {@link ExperimentVariantValue} instance.
308+ */
309+ public static ExperimentVariantValue of (String variantId , String value ) {
310+ return new ExperimentVariantValue (variantId , value , null );
311+ }
312+
313+ /**
314+ * Creates a new {@link ExperimentVariantValue} instance.
315+ *
316+ * @param variantId The variant ID.
317+ * @return A {@link ExperimentVariantValue} instance.
318+ */
319+ public static ExperimentVariantValue ofNoChange (String variantId ) {
320+ return new ExperimentVariantValue (variantId , null , true );
321+ }
322+
323+ public String getVariantId () {
324+ return variantId ;
325+ }
326+
327+ @ Nullable
328+ public String getValue () {
329+ return value ;
330+ }
331+
332+ @ Nullable
333+ Boolean getNoChange () {
334+ return noChange ;
335+ }
336+
337+ public boolean isNoChange () {
338+ return Boolean .TRUE .equals (noChange );
339+ }
340+
341+ @ Override
342+ public boolean equals (Object o ) {
343+ if (this == o ) {
344+ return true ;
345+ }
346+ if (o == null || getClass () != o .getClass ()) {
347+ return false ;
348+ }
349+ ExperimentVariantValue that = (ExperimentVariantValue ) o ;
350+ return noChange == that .noChange
351+ && Objects .equals (variantId , that .variantId )
352+ && Objects .equals (value , that .value );
353+ }
354+
355+ @ Override
356+ public int hashCode () {
357+ return Objects .hash (variantId , value , noChange );
358+ }
359+ }
360+
361+ /**
362+ * Represents an Experiment value.
363+ */
364+ public static final class ExperimentValue extends ParameterValue {
365+ private final String experimentId ;
366+ private final List <ExperimentVariantValue > variantValues ;
367+
368+ private ExperimentValue (String experimentId , List <ExperimentVariantValue > variantValues ) {
369+ this .experimentId = experimentId ;
370+ this .variantValues = variantValues ;
371+ }
372+
373+ public String getExperimentId () {
374+ return experimentId ;
375+ }
376+
377+ public List <ExperimentVariantValue > getExperimentVariantValues () {
378+ return variantValues ;
379+ }
380+
381+ @ Override
382+ ParameterValueResponse toParameterValueResponse () {
383+ List <ExperimentVariantValueResponse > variantValueResponses = variantValues .stream ()
384+ .map (variantValue -> new ExperimentVariantValueResponse ()
385+ .setVariantId (variantValue .getVariantId ())
386+ .setValue (variantValue .getValue ())
387+ .setNoChange (variantValue .getNoChange ()))
388+ .collect (toList ());
389+ return new ParameterValueResponse ().setExperimentValue (
390+ new ExperimentValueResponse ()
391+ .setExperimentId (this .experimentId )
392+ .setExperimentVariantValues (variantValueResponses ));
393+ }
394+
395+ @ Override
396+ public boolean equals (Object o ) {
397+ if (this == o ) {
398+ return true ;
399+ }
400+ if (o == null || getClass () != o .getClass ()) {
401+ return false ;
402+ }
403+ ExperimentValue that = (ExperimentValue ) o ;
404+ return Objects .equals (experimentId , that .experimentId )
405+ && Objects .equals (variantValues , that .variantValues );
406+ }
407+
408+ @ Override
409+ public int hashCode () {
410+ return Objects .hash (experimentId , variantValues );
411+ }
412+ }
127413}
0 commit comments