Skip to content

Commit f2c5e07

Browse files
committed
Conflicts resolved
2 parents 1173002 + cb9f207 commit f2c5e07

File tree

5 files changed

+365
-11
lines changed

5 files changed

+365
-11
lines changed

example/ios/Runner/Info.plist

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,5 +43,7 @@
4343
</array>
4444
<key>UIViewControllerBasedStatusBarAppearance</key>
4545
<false/>
46+
<key>CADisableMinimumFrameDurationOnPhone</key>
47+
<true/>
4648
</dict>
4749
</plist>
Lines changed: 332 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,332 @@
1+
/// **************************************************************************
2+
/// Copyright 2022, Optimizely, Inc. and contributors *
3+
/// *
4+
/// Licensed under the Apache License, Version 2.0 (the "License"); *
5+
/// you may not use this file except in compliance with the License. *
6+
/// You may obtain a copy of the License at *
7+
/// *
8+
/// http://www.apache.org/licenses/LICENSE-2.0 *
9+
/// *
10+
/// Unless required by applicable law or agreed to in writing, software *
11+
/// distributed under the License is distributed on an "AS IS" BASIS, *
12+
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
13+
/// See the License for the specific language governing permissions and *
14+
/// limitations under the License. *
15+
///**************************************************************************/
16+
17+
import 'package:optimizely_flutter_sdk/src/utils/constants.dart';
18+
19+
class OptimizelyConfig {
20+
Map<String, OptimizelyExperiment> experimentsMap = {};
21+
Map<String, OptimizelyFeature> featuresMap = {};
22+
List<OptimizelyAttribute> attributes = [];
23+
List<OptimizelyEvent> events = [];
24+
List<OptimizelyAudience> audiences = [];
25+
String? revision;
26+
String? sdkKey;
27+
String? environmentKey;
28+
String? datafile;
29+
30+
OptimizelyConfig(Map<String, dynamic> optimizelyConfig) {
31+
if (optimizelyConfig[Constants.experimentsMap] is Map<dynamic, dynamic>) {
32+
final experimentsMapDynamic =
33+
Map<String, dynamic>.from(optimizelyConfig[Constants.experimentsMap]);
34+
experimentsMapDynamic.forEach((k, v) => {
35+
if (v is Map<dynamic, dynamic>)
36+
{
37+
experimentsMap[k] =
38+
OptimizelyExperiment.fromJson(Map<String, dynamic>.from(v))
39+
}
40+
});
41+
}
42+
43+
if (optimizelyConfig[Constants.featuresMap] is Map<dynamic, dynamic>) {
44+
final featuresMapDynamic =
45+
Map<String, dynamic>.from(optimizelyConfig[Constants.featuresMap]);
46+
featuresMapDynamic.forEach((k, v) => {
47+
if (v is Map<dynamic, dynamic>)
48+
{
49+
featuresMap[k] =
50+
OptimizelyFeature.fromJson(Map<String, dynamic>.from(v))
51+
}
52+
});
53+
}
54+
55+
if (optimizelyConfig[Constants.attributes] is List<dynamic>) {
56+
var attributesDynamic = optimizelyConfig[Constants.attributes] as List;
57+
attributes = attributesDynamic
58+
.map((attribute) => OptimizelyAttribute.fromJson(
59+
Map<String, dynamic>.from(attribute)))
60+
.toList();
61+
}
62+
63+
if (optimizelyConfig[Constants.events] is List<dynamic>) {
64+
var eventsDynamic = optimizelyConfig[Constants.events] as List;
65+
events = eventsDynamic
66+
.map((event) =>
67+
OptimizelyEvent.fromJson(Map<String, dynamic>.from(event)))
68+
.toList();
69+
}
70+
71+
if (optimizelyConfig[Constants.audiences] is List<dynamic>) {
72+
var audiencesDynamic = optimizelyConfig[Constants.audiences] as List;
73+
audiences = audiencesDynamic
74+
.map((audience) =>
75+
OptimizelyAudience.fromJson(Map<String, dynamic>.from(audience)))
76+
.toList();
77+
}
78+
79+
if (optimizelyConfig[Constants.revision] is String) {
80+
revision = optimizelyConfig[Constants.revision] as String;
81+
}
82+
83+
if (optimizelyConfig[Constants.sdkKey] is String) {
84+
sdkKey = optimizelyConfig[Constants.sdkKey] as String;
85+
}
86+
87+
if (optimizelyConfig[Constants.environmentKey] is String) {
88+
environmentKey = optimizelyConfig[Constants.environmentKey] as String;
89+
}
90+
91+
if (optimizelyConfig[Constants.datafile] is String) {
92+
datafile = optimizelyConfig[Constants.datafile] as String;
93+
}
94+
}
95+
96+
Map<String, dynamic> toJson() {
97+
Map<String, dynamic> dynamicExpMap = {};
98+
experimentsMap.forEach((k, v) => {dynamicExpMap[k] = v.toJson()});
99+
Map<String, dynamic> dynamicFeaturesMap = {};
100+
featuresMap.forEach((k, v) => {dynamicFeaturesMap[k] = v.toJson()});
101+
var dynamicAttributes = [];
102+
attributes.forEach((v) => {dynamicAttributes.add(v.toJson())});
103+
var dynamicEvents = [];
104+
events.forEach((v) => {dynamicEvents.add(v.toJson())});
105+
var dynamicAudiences = [];
106+
audiences.forEach((v) => {dynamicAudiences.add(v.toJson())});
107+
108+
return {
109+
'experimentsMap': dynamicExpMap,
110+
'featuresMap': dynamicFeaturesMap,
111+
'attributes': dynamicAttributes,
112+
'events': dynamicEvents,
113+
'audiences': dynamicAudiences,
114+
'revision': revision,
115+
'sdkKey': sdkKey,
116+
'environmentKey': environmentKey,
117+
'datafile': datafile
118+
};
119+
}
120+
}
121+
122+
// Represents the Audiences list in {@link OptimizelyConfigResponse}
123+
class OptimizelyAudience {
124+
final String? id;
125+
final String? name;
126+
final String? conditions;
127+
OptimizelyAudience({this.id, this.name, this.conditions});
128+
129+
factory OptimizelyAudience.fromJson(Map<String, dynamic> parsedJson) {
130+
return OptimizelyAudience(
131+
id: parsedJson[Constants.id],
132+
name: parsedJson[Constants.name],
133+
conditions: parsedJson[Constants.conditions]);
134+
}
135+
136+
Map<String, dynamic> toJson() =>
137+
{'id': id, 'name': name, 'conditions': conditions};
138+
}
139+
140+
// Represents the Events's map in {@link OptimizelyConfigResponse}
141+
class OptimizelyEvent {
142+
final String? id;
143+
final String? key;
144+
final List<String> experimentIds;
145+
OptimizelyEvent({this.id, this.key, this.experimentIds = const []});
146+
147+
factory OptimizelyEvent.fromJson(Map<String, dynamic> parsedJson) {
148+
return OptimizelyEvent(
149+
id: parsedJson[Constants.id],
150+
key: parsedJson[Constants.key],
151+
experimentIds: List<String>.from(parsedJson[Constants.experimentIds]));
152+
}
153+
154+
Map<String, dynamic> toJson() =>
155+
{'id': id, 'key': key, 'experimentIds': experimentIds};
156+
}
157+
158+
// Represents the Attribute's map in {@link OptimizelyConfigResponse}
159+
class OptimizelyAttribute {
160+
final String? id;
161+
final String? key;
162+
163+
OptimizelyAttribute({this.id, this.key});
164+
165+
factory OptimizelyAttribute.fromJson(Map<String, dynamic> parsedJson) {
166+
return OptimizelyAttribute(
167+
id: parsedJson[Constants.id], key: parsedJson[Constants.key]);
168+
}
169+
Map<String, dynamic> toJson() => {'id': id, 'key': key};
170+
}
171+
172+
// Represents the feature's map in {@link OptimizelyConfigResponse}
173+
class OptimizelyFeature {
174+
final String? id;
175+
final String? key;
176+
final List<OptimizelyExperiment> deliveryRules;
177+
final List<OptimizelyExperiment> experimentRules;
178+
179+
OptimizelyFeature(
180+
{this.id,
181+
this.key,
182+
this.deliveryRules = const [],
183+
this.experimentRules = const []});
184+
185+
factory OptimizelyFeature.fromJson(Map<String, dynamic> parsedJson) {
186+
List<OptimizelyExperiment> tempDeliveryRules = [];
187+
List<OptimizelyExperiment> tempExperimentRules = [];
188+
if (parsedJson[Constants.deliveryRules] is List<dynamic>) {
189+
var deliveryRulesDynamic = parsedJson[Constants.deliveryRules] as List;
190+
tempDeliveryRules = deliveryRulesDynamic
191+
.map((experiment) => OptimizelyExperiment.fromJson(
192+
Map<String, dynamic>.from(experiment)))
193+
.toList();
194+
}
195+
if (parsedJson[Constants.experimentRules] is List<dynamic>) {
196+
var experimentRulesDynamic =
197+
parsedJson[Constants.experimentRules] as List;
198+
tempExperimentRules = experimentRulesDynamic
199+
.map((experiment) => OptimizelyExperiment.fromJson(
200+
Map<String, dynamic>.from(experiment)))
201+
.toList();
202+
}
203+
return OptimizelyFeature(
204+
id: parsedJson[Constants.id],
205+
key: parsedJson[Constants.key],
206+
deliveryRules: tempDeliveryRules,
207+
experimentRules: tempExperimentRules);
208+
}
209+
210+
Map<String, dynamic> toJson() {
211+
var dynamicDeliveryRules = [];
212+
deliveryRules.forEach((v) => {dynamicDeliveryRules.add(v.toJson())});
213+
214+
var dynamicExperimentRules = [];
215+
experimentRules.forEach((v) => {dynamicExperimentRules.add(v.toJson())});
216+
return {
217+
'id': id,
218+
'key': key,
219+
'deliveryRules': dynamicDeliveryRules,
220+
'experimentRules': dynamicExperimentRules
221+
};
222+
}
223+
}
224+
225+
// Represents the experiment's map in {@link OptimizelyConfigResponse}
226+
class OptimizelyExperiment {
227+
final String? id;
228+
final String? key;
229+
final String audiences;
230+
final Map<String, OptimizelyVariation> variationsMap;
231+
232+
OptimizelyExperiment(
233+
{this.id, this.key, this.audiences = "", this.variationsMap = const {}});
234+
factory OptimizelyExperiment.fromJson(Map<String, dynamic> parsedJson) {
235+
Map<String, OptimizelyVariation>? tempVariationsMap = {};
236+
if (parsedJson[Constants.variationsMap] is Map<dynamic, dynamic>) {
237+
final variationsMapDynamic =
238+
Map<String, dynamic>.from(parsedJson[Constants.variationsMap]);
239+
variationsMapDynamic.forEach((k, v) => {
240+
if (v is Map<dynamic, dynamic>)
241+
{
242+
tempVariationsMap[k] =
243+
OptimizelyVariation.fromJson(Map<String, dynamic>.from(v))
244+
}
245+
});
246+
}
247+
return OptimizelyExperiment(
248+
id: parsedJson[Constants.id],
249+
key: parsedJson[Constants.key],
250+
audiences: parsedJson[Constants.audiences],
251+
variationsMap: tempVariationsMap);
252+
}
253+
254+
Map<String, dynamic> toJson() {
255+
Map<String, dynamic> dynamicVariationsMap = {};
256+
variationsMap.forEach((k, v) => {dynamicVariationsMap[k] = v.toJson()});
257+
258+
return {
259+
'id': id,
260+
'key': key,
261+
'audiences': audiences,
262+
'variationsMap': dynamicVariationsMap
263+
};
264+
}
265+
}
266+
267+
// Details of variation in {@link OptimizelyExperiment}
268+
class OptimizelyVariation {
269+
final String? id;
270+
final String? key;
271+
final bool featureEnabled;
272+
final Map<String, OptimizelyVariable> variablesMap;
273+
274+
OptimizelyVariation(
275+
{this.id,
276+
this.key,
277+
this.featureEnabled = false,
278+
this.variablesMap = const {}});
279+
280+
factory OptimizelyVariation.fromJson(Map<String, dynamic> parsedJson) {
281+
Map<String, OptimizelyVariable>? tempVariablesMap = {};
282+
if (parsedJson[Constants.variablesMap] is Map<dynamic, dynamic>) {
283+
final variablesMapDynamic =
284+
Map<String, dynamic>.from(parsedJson[Constants.variablesMap]);
285+
variablesMapDynamic.forEach((k, v) => {
286+
if (v is Map<dynamic, dynamic>)
287+
{
288+
tempVariablesMap[k] =
289+
OptimizelyVariable.fromJson(Map<String, dynamic>.from(v))
290+
}
291+
});
292+
}
293+
return OptimizelyVariation(
294+
id: parsedJson[Constants.id],
295+
key: parsedJson[Constants.key],
296+
featureEnabled: parsedJson[Constants.featureEnabled],
297+
variablesMap: tempVariablesMap);
298+
}
299+
300+
Map<String, dynamic> toJson() {
301+
Map<String, dynamic> dynamicVariablesMap = {};
302+
variablesMap.forEach((k, v) => {dynamicVariablesMap[k] = v.toJson()});
303+
304+
return {
305+
'id': id,
306+
'key': key,
307+
'featureEnabled': featureEnabled,
308+
'variablesMap': dynamicVariablesMap
309+
};
310+
}
311+
}
312+
313+
// Details of feature variable in {@link OptimizelyVariation}
314+
class OptimizelyVariable {
315+
final String? id;
316+
final String? key;
317+
final String? type;
318+
final String? value;
319+
320+
OptimizelyVariable({this.id, this.key, this.type, this.value});
321+
322+
factory OptimizelyVariable.fromJson(Map<String, dynamic> parsedJson) {
323+
return OptimizelyVariable(
324+
id: parsedJson[Constants.id],
325+
key: parsedJson[Constants.key],
326+
type: parsedJson[Constants.type],
327+
value: parsedJson[Constants.value]);
328+
}
329+
330+
Map<String, dynamic> toJson() =>
331+
{'id': id, 'key': key, 'type': type, 'value': value};
332+
}

lib/src/data_objects/optimizely_config_response.dart

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,17 @@
1515
///**************************************************************************/
1616
1717
import 'package:optimizely_flutter_sdk/src/data_objects/base_response.dart';
18+
import 'package:optimizely_flutter_sdk/src/data_objects/optimizely_config.dart';
1819
import 'package:optimizely_flutter_sdk/src/utils/constants.dart';
1920

2021
class OptimizelyConfigResponse extends BaseResponse {
21-
Map<String, dynamic> optimizelyConfig = {};
22+
OptimizelyConfig? optimizelyConfig;
2223

2324
OptimizelyConfigResponse(Map<String, dynamic> json) : super(json) {
2425
if (json[Constants.responseResult] is Map<dynamic, dynamic>) {
25-
optimizelyConfig =
26+
var optlyConfigJSON =
2627
Map<String, dynamic>.from(json[Constants.responseResult]);
28+
optimizelyConfig = OptimizelyConfig(optlyConfigJSON);
2729
}
2830
}
2931
}

lib/src/utils/constants.dart

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,24 @@ class Constants {
8383
static const String configUpdateCallBackListener =
8484
"projectConfigUpdateCallBackListener";
8585

86+
// OptimizelyConfig Request params
87+
static const String audiences = "audiences";
88+
static const String conditions = "conditions";
89+
static const String datafile = "datafile";
90+
static const String deliveryRules = "deliveryRules";
91+
static const String events = "events";
92+
static const String experimentIds = "experimentIds";
93+
static const String experimentRules = "experimentRules";
94+
static const String experimentsMap = "experimentsMap";
95+
static const String environmentKey = "environmentKey";
96+
static const String featuresMap = "featuresMap";
97+
static const String featureEnabled = "featureEnabled";
98+
static const String key = "key";
99+
static const String name = "name";
100+
static const String revision = "revision";
101+
static const String variationsMap = "variationsMap";
102+
static const String variablesMap = "variablesMap";
103+
86104
// Response keys
87105
static const String responseSuccess = "success";
88106
static const String responseResult = "result";

0 commit comments

Comments
 (0)