Skip to content

Commit 7834c92

Browse files
committed
fix conflicts
2 parents dd47d8d + 57541f7 commit 7834c92

File tree

15 files changed

+381
-297
lines changed

15 files changed

+381
-297
lines changed

android-sdk/build.gradle

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,10 @@ dependencies {
7272
api project(':event-handler')
7373
api project(':user-profile')
7474
api project(':odp')
75-
api ("com.optimizely.ab:core-api:$java_core_ver") {
75+
// api ("com.optimizely.ab:core-api:$java_core_ver") {
76+
// exclude group: 'com.google.code.findbugs'
77+
// }
78+
api ("com.optimizely.ab:core-api:3.1.0-SNAPSHOT") {
7679
exclude group: 'com.google.code.findbugs'
7780
}
7881
implementation "org.slf4j:slf4j-api:$slf4j_ver"

android-sdk/src/androidTest/java/com/optimizely/ab/android/sdk/ODPIntegrationUpdateConfigTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ public void setup() throws Exception {
117117
notificationCenter,
118118
null,
119119
odpManager,
120+
null,
120121
"test-vuid",
121122
null,
122123
null);

android-sdk/src/androidTest/java/com/optimizely/ab/android/sdk/OptimizelyClientTest.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2249,7 +2249,9 @@ public void testDecide() {
22492249
assertEquals(decision.getVariables().toMap(), variablesExpected.toMap());
22502250
assertEquals(decision.getRuleKey(), FEATURE_MULTI_VARIATE_EXPERIMENT_KEY);
22512251
assertEquals(decision.getFlagKey(), flagKey);
2252-
assertEquals(decision.getUserContext(), userContext);
2252+
OptimizelyUserContext decisionUserContext = decision.getUserContext();
2253+
assertEquals(decisionUserContext.getUserId(), userContext.getUserId());
2254+
assertEquals(decisionUserContext.getAttributes(), userContext.getAttributes());
22532255
assertTrue(decision.getReasons().isEmpty());
22542256
}
22552257

android-sdk/src/androidTest/java/com/optimizely/ab/android/sdk/OptimizelyManagerTest.java

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ public void initializeSyncWithEnvironment() {
163163
EventHandler eventHandler = mock(DefaultEventHandler.class);
164164
EventProcessor eventProcessor = mock(EventProcessor.class);
165165
OptimizelyManager optimizelyManager = new OptimizelyManager(testProjectId, testSdkKey, null, logger, 3600L, datafileHandler, null, 3600L,
166-
eventHandler, eventProcessor, null, null, null, null, null, null, null);
166+
eventHandler, eventProcessor, null, null, null, null, null, null, null, null);
167167
/*
168168
* Scenario#1: when datafile is not Empty
169169
* Scenario#2: when datafile is Empty
@@ -222,7 +222,7 @@ public void initializeAsyncWithEnvironment() {
222222
EventHandler eventHandler = mock(DefaultEventHandler.class);
223223
EventProcessor eventProcessor = mock(EventProcessor.class);
224224
final OptimizelyManager optimizelyManager = new OptimizelyManager(testProjectId, testSdkKey, null, logger, 3600L, datafileHandler, null, 3600L,
225-
eventHandler, eventProcessor, null, null, null, null, null, null, null);
225+
eventHandler, eventProcessor, null, null, null, null, null, null, null, null);
226226

227227
/*
228228
* Scenario#1: when datafile is not Empty
@@ -494,7 +494,7 @@ public void initializeSyncWithUpdateOnNewDatafileDisabled() {
494494
Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
495495

496496
OptimizelyManager manager = new OptimizelyManager(testProjectId, testSdkKey, null, logger, pollingInterval, datafileHandler, null, 0,
497-
null, null, null, null, null, null, null, null, null);
497+
null, null, null, null, null, null, null, null, null, null);
498498

499499
ArgumentCaptor<Context> contextCaptor = ArgumentCaptor.forClass(Context.class);
500500
ArgumentCaptor<DatafileConfig> configCaptor = ArgumentCaptor.forClass(DatafileConfig.class);
@@ -533,7 +533,7 @@ public void initializeSyncWithUpdateOnNewDatafileEnabled() {
533533
Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
534534

535535
OptimizelyManager manager = new OptimizelyManager(testProjectId, testSdkKey, null, logger, pollingInterval, datafileHandler, null, 0,
536-
null, null, null, null, null, null, null, null, null);
536+
null, null, null, null, null, null, null, null, null, null);
537537

538538
ArgumentCaptor<Context> contextCaptor = ArgumentCaptor.forClass(Context.class);
539539
ArgumentCaptor<DatafileConfig> configCaptor = ArgumentCaptor.forClass(DatafileConfig.class);
@@ -572,7 +572,7 @@ public void initializeSyncWithDownloadToCacheDisabled() {
572572
Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
573573

574574
OptimizelyManager manager = new OptimizelyManager(testProjectId, testSdkKey, null, logger, pollingInterval, datafileHandler, null, 0,
575-
null, null, null, null, null, null, null, null, null);
575+
null, null, null, null, null, null, null, null, null, null);
576576

577577
ArgumentCaptor<Context> contextCaptor = ArgumentCaptor.forClass(Context.class);
578578
ArgumentCaptor<DatafileConfig> configCaptor = ArgumentCaptor.forClass(DatafileConfig.class);
@@ -611,7 +611,7 @@ public void initializeSyncWithUpdateOnNewDatafileDisabledWithPeriodicPollingEnab
611611
Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
612612

613613
OptimizelyManager manager = new OptimizelyManager(testProjectId, testSdkKey, null, logger, pollingInterval, datafileHandler, null, 0,
614-
null, null, null, null, null, null, null, null, null);
614+
null, null, null, null, null, null, null, null, null, null);
615615

616616
ArgumentCaptor<Context> contextCaptor = ArgumentCaptor.forClass(Context.class);
617617
ArgumentCaptor<DatafileConfig> configCaptor = ArgumentCaptor.forClass(DatafileConfig.class);
@@ -651,7 +651,7 @@ public void initializeSyncWithUpdateOnNewDatafileEnabledWithPeriodicPollingEnabl
651651
Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
652652

653653
OptimizelyManager manager = new OptimizelyManager(testProjectId, testSdkKey, null, logger, pollingInterval, datafileHandler, null, 0,
654-
null, null, null, null, null, null, null, null, null);
654+
null, null, null, null, null, null, null, null, null, null);
655655

656656
ArgumentCaptor<Context> contextCaptor = ArgumentCaptor.forClass(Context.class);
657657
ArgumentCaptor<DatafileConfig> configCaptor = ArgumentCaptor.forClass(DatafileConfig.class);
@@ -690,7 +690,7 @@ public void initializeSyncWithUpdateOnNewDatafileDisabledWithPeriodicPollingDisa
690690
Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
691691

692692
OptimizelyManager manager = new OptimizelyManager(testProjectId, testSdkKey, null, logger, pollingInterval, datafileHandler, null, 0,
693-
null, null, null, null, null, null, null, null, null);
693+
null, null, null, null, null, null, null, null, null, null);
694694

695695
ArgumentCaptor<Context> contextCaptor = ArgumentCaptor.forClass(Context.class);
696696
ArgumentCaptor<DatafileConfig> configCaptor = ArgumentCaptor.forClass(DatafileConfig.class);
@@ -706,7 +706,7 @@ public void initializeSyncWithUpdateOnNewDatafileDisabledWithPeriodicPollingDisa
706706

707707
return datafileHandler;
708708
}).when(manager.getDatafileHandler()).downloadDatafile(contextCaptor.capture(), configCaptor.capture(), listenerCaptor.capture());
709-
709+
710710
OptimizelyClient client = manager.initialize(context, defaultDatafile, downloadToCache, updateConfigOnNewDatafile);
711711

712712
try {
@@ -730,7 +730,7 @@ public void initializeSyncWithUpdateOnNewDatafileEnabledWithPeriodicPollingDisab
730730
Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
731731

732732
OptimizelyManager manager = new OptimizelyManager(testProjectId, testSdkKey, null, logger, pollingInterval, datafileHandler, null, 0,
733-
null, null, null, null, null, null, null, null, null);
733+
null, null, null, null, null, null, null, null, null, null);
734734

735735
ArgumentCaptor<Context> contextCaptor = ArgumentCaptor.forClass(Context.class);
736736
ArgumentCaptor<DatafileConfig> configCaptor = ArgumentCaptor.forClass(DatafileConfig.class);
@@ -769,7 +769,7 @@ public void initializeSyncWithResourceDatafileNoCache() {
769769
Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
770770

771771
OptimizelyManager manager = spy(new OptimizelyManager(testProjectId, testSdkKey, null, logger, pollingInterval, datafileHandler, null, 0,
772-
null, null, null, null, null, null, null, null, null));
772+
null, null, null, null, null, null, null, null, null, null));
773773

774774
datafileHandler.removeSavedDatafile(context, manager.getDatafileConfig());
775775
OptimizelyClient client = manager.initialize(context, R.raw.datafile, downloadToCache, updateConfigOnNewDatafile);
@@ -786,7 +786,7 @@ public void initializeSyncWithResourceDatafileNoCacheWithDefaultParams() {
786786
Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
787787

788788
OptimizelyManager manager = spy(new OptimizelyManager(testProjectId, testSdkKey, null, logger, pollingInterval, datafileHandler, null, 0,
789-
null, null, null, null, null, null, null, null, null));
789+
null, null, null, null, null, null, null, null, null, null));
790790

791791
datafileHandler.removeSavedDatafile(context, manager.getDatafileConfig());
792792
OptimizelyClient client = manager.initialize(context, R.raw.datafile);

android-sdk/src/main/java/com/optimizely/ab/android/sdk/OptimizelyManager.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,15 @@
3939
import com.optimizely.ab.android.event_handler.EventDispatcher;
4040
import com.optimizely.ab.android.odp.DefaultODPApiManager;
4141
import com.optimizely.ab.android.odp.VuidManager;
42+
import com.optimizely.ab.android.sdk.cmab.DefaultCmabClient;
43+
import com.optimizely.ab.android.shared.Client;
4244
import com.optimizely.ab.android.shared.DatafileConfig;
45+
import com.optimizely.ab.android.shared.OptlyStorage;
4346
import com.optimizely.ab.android.user_profile.DefaultUserProfileService;
4447
import com.optimizely.ab.bucketing.UserProfileService;
48+
import com.optimizely.ab.cmab.client.CmabClient;
49+
import com.optimizely.ab.cmab.service.CmabService;
50+
import com.optimizely.ab.cmab.service.DefaultCmabService;
4551
import com.optimizely.ab.config.ProjectConfig;
4652
import com.optimizely.ab.config.parser.ConfigParseException;
4753
import com.optimizely.ab.error.ErrorHandler;
@@ -786,7 +792,7 @@ public static class Builder {
786792
@Nullable private List<OptimizelyDecideOption> defaultDecideOptions = null;
787793
@Nullable private ODPEventManager odpEventManager;
788794
@Nullable private ODPSegmentManager odpSegmentManager;
789-
@Nullable private CMABClient cmabClient;
795+
@Nullable private CmabClient cmabClient;
790796

791797
private int odpSegmentCacheSize = 100;
792798
private int odpSegmentCacheTimeoutInSecs = 10*60;
@@ -1198,7 +1204,7 @@ public OptimizelyManager build(Context context) {
11981204

11991205
DefaultCmabService.Builder cmabBuilder = DefaultCmabService.builder();
12001206
if (cmabClient == null) {
1201-
cmabClient = new DefaultCmabClient();
1207+
cmabClient = new DefaultCmabClient(context);
12021208
}
12031209
cmabBuilder.withClient(cmabClient);
12041210
cmabBuilder.withCmabCacheSize(cmabCacheSize);

android-sdk/src/main/java/com/optimizely/ab/android/sdk/OptimizelyUserContextAndroid.java

Lines changed: 44 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
import com.optimizely.ab.OptimizelyUserContext;
2020
import com.optimizely.ab.optimizelydecision.OptimizelyDecideOption;
2121
import com.optimizely.ab.optimizelydecision.OptimizelyDecision;
22+
import com.optimizely.ab.optimizelydecision.OptimizelyDecisionCallback;;
23+
import com.optimizely.ab.optimizelydecision.OptimizelyDecisionsCallback;
2224

2325
import java.util.Collections;
2426
import java.util.List;
@@ -70,7 +72,7 @@ public OptimizelyUserContextAndroid(@NonNull Optimizely optimizely,
7072
@Override
7173
public OptimizelyDecision decide(@NonNull String key,
7274
@NonNull List<OptimizelyDecideOption> options) {
73-
return optimizely.decideSync(copy(), key, options);
75+
return decideSync(key, options);
7476
}
7577

7678
/**
@@ -105,7 +107,7 @@ public OptimizelyDecision decide(@NonNull String key) {
105107
@Override
106108
public Map<String, OptimizelyDecision> decideForKeys(@NonNull List<String> keys,
107109
@NonNull List<OptimizelyDecideOption> options) {
108-
return optimizely.decideForKeysSync(copy(), keys, options);
110+
return decideForKeysSync(keys, options);
109111
}
110112

111113
/**
@@ -135,7 +137,7 @@ public Map<String, OptimizelyDecision> decideForKeys(@NonNull List<String> keys)
135137
*/
136138
@Override
137139
public Map<String, OptimizelyDecision> decideAll(@NonNull List<OptimizelyDecideOption> options) {
138-
return optimizely.decideAllSync(copy(), options);
140+
return decideAllSync(options);
139141
}
140142

141143
/**
@@ -152,17 +154,21 @@ public Map<String, OptimizelyDecision> decideAll() {
152154
return decideAll(Collections.emptyList());
153155
}
154156

157+
// ===========================================
158+
// Async Methods (Android-specific)
159+
// ===========================================
160+
155161
/**
156162
* Returns a decision result asynchronously for a given flag key and a user context.
157163
*
158164
* @param key A flag key for which a decision will be made.
159165
* @param callback A callback to invoke when the decision is available.
160166
* @param options A list of options for decision-making.
161167
*/
162-
public void decideAsync(@Nonnull String key,
163-
@Nonnull OptimizelyDecisionCallback callback,
164-
@Nonnull List<OptimizelyDecideOption> options) {
165-
optimizely.decideAsync(copy(), key, callback, options);
168+
public void decideAsync(@NonNull String key,
169+
@NonNull List<OptimizelyDecideOption> options,
170+
@NonNull OptimizelyDecisionCallback callback) {
171+
super.decideAsync(key, options, callback);
166172
}
167173

168174
/**
@@ -171,8 +177,8 @@ public void decideAsync(@Nonnull String key,
171177
* @param key A flag key for which a decision will be made.
172178
* @param callback A callback to invoke when the decision is available.
173179
*/
174-
public void decideAsync(@Nonnull String key, @Nonnull OptimizelyDecisionCallback callback) {
175-
decideAsync(key, callback, Collections.emptyList());
180+
public void decideAsync(@NonNull String key, @NonNull OptimizelyDecisionCallback callback) {
181+
decideAsync(key, Collections.emptyList(), callback);
176182
}
177183

178184
/**
@@ -182,10 +188,10 @@ public void decideAsync(@Nonnull String key, @Nonnull OptimizelyDecisionCallback
182188
* @param callback A callback to invoke when decisions are available.
183189
* @param options A list of options for decision-making.
184190
*/
185-
public void decideForKeysAsync(@Nonnull List<String> keys,
186-
@Nonnull OptimizelyDecisionsCallback callback,
187-
@Nonnull List<OptimizelyDecideOption> options) {
188-
optimizely.decideForKeysAsync(copy(), keys, callback, options);
191+
public void decideForKeysAsync(@NonNull List<String> keys,
192+
@NonNull List<OptimizelyDecideOption> options,
193+
@NonNull OptimizelyDecisionsCallback callback) {
194+
super.decideForKeysAsync(keys, options, callback);
189195
}
190196

191197
/**
@@ -194,8 +200,8 @@ public void decideForKeysAsync(@Nonnull List<String> keys,
194200
* @param keys A list of flag keys for which decisions will be made.
195201
* @param callback A callback to invoke when decisions are available.
196202
*/
197-
public void decideForKeysAsync(@Nonnull List<String> keys, @Nonnull OptimizelyDecisionsCallback callback) {
198-
decideForKeysAsync(keys, callback, Collections.emptyList());
203+
public void decideForKeysAsync(@NonNull List<String> keys, @NonNull OptimizelyDecisionsCallback callback) {
204+
decideForKeysAsync(keys, Collections.emptyList(), callback);
199205
}
200206

201207
/**
@@ -204,18 +210,36 @@ public void decideForKeysAsync(@Nonnull List<String> keys, @Nonnull OptimizelyDe
204210
* @param callback A callback to invoke when decisions are available.
205211
* @param options A list of options for decision-making.
206212
*/
207-
public void decideAllAsync(@Nonnull OptimizelyDecisionsCallback callback,
208-
@Nonnull List<OptimizelyDecideOption> options) {
209-
optimizely.decideAllAsync(copy(), callback, options);
213+
public void decideAllAsync(@NonNull List<OptimizelyDecideOption> options,
214+
@NonNull OptimizelyDecisionsCallback callback) {
215+
super.decideAllAsync(options, callback);
210216
}
211217

212218
/**
213219
* Returns decision results asynchronously for all active flag keys.
214220
*
215221
* @param callback A callback to invoke when decisions are available.
216222
*/
217-
public void decideAllAsync(@Nonnull OptimizelyDecisionsCallback callback) {
218-
decideAllAsync(callback, Collections.emptyList());
223+
public void decideAllAsync(@NonNull OptimizelyDecisionsCallback callback) {
224+
decideAllAsync(Collections.emptyList(), callback);
225+
}
226+
227+
// ===========================================
228+
// Override methods for testability
229+
// These methods enable Mockito spies to intercept calls that would
230+
// otherwise go directly to super.method() and be unverifiable
231+
// ===========================================
232+
233+
public OptimizelyDecision decideSync(@NonNull String key, @NonNull List<OptimizelyDecideOption> options) {
234+
return super.decideSync(key, options);
235+
}
236+
237+
public Map<String, OptimizelyDecision> decideForKeysSync(@NonNull List<String> keys, @NonNull List<OptimizelyDecideOption> options) {
238+
return super.decideForKeysSync(keys, options);
239+
}
240+
241+
public Map<String, OptimizelyDecision> decideAllSync(@NonNull List<OptimizelyDecideOption> options) {
242+
return super.decideAllSync(options);
219243
}
220244

221245
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
// Copyright 2025, Optimizely, Inc. and contributors
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// https://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
package com.optimizely.ab.android.sdk.cmab
16+
17+
import com.optimizely.ab.cmab.client.CmabClientHelper
18+
19+
open class CmabClientHelperAndroid {
20+
21+
open val cmabPredictionEndpoint: String
22+
get() = CmabClientHelper.CMAB_PREDICTION_ENDPOINT
23+
24+
open val cmabFetchFailed: String
25+
get() = CmabClientHelper.CMAB_FETCH_FAILED
26+
27+
open val invalidCmabFetchResponse: String
28+
get() = CmabClientHelper.INVALID_CMAB_FETCH_RESPONSE
29+
30+
open fun buildRequestJson(
31+
userId: String?,
32+
ruleId: String?,
33+
attributes: Map<String?, Any?>?,
34+
cmabUuid: String?
35+
): String {
36+
return CmabClientHelper.buildRequestJson(userId, ruleId, attributes, cmabUuid)
37+
}
38+
39+
open fun parseVariationId(jsonResponse: String?): String? {
40+
return CmabClientHelper.parseVariationId(jsonResponse)
41+
}
42+
43+
open fun validateResponse(responseBody: String?): Boolean {
44+
return CmabClientHelper.validateResponse(responseBody)
45+
}
46+
47+
open fun isSuccessStatusCode(statusCode: Int): Boolean {
48+
return CmabClientHelper.isSuccessStatusCode(statusCode)
49+
}
50+
}

0 commit comments

Comments
 (0)