Skip to content

Commit e2e765b

Browse files
authored
Revert "Revert "[FSSDK-9432] fix: fix to support arbitrary client nam… (#474)
1 parent 8bea0f1 commit e2e765b

File tree

10 files changed

+140
-45
lines changed

10 files changed

+140
-45
lines changed

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

+3-1
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,9 @@ public void setup() throws Exception {
117117
notificationCenter,
118118
null,
119119
odpManager,
120-
"test-vuid");
120+
"test-vuid",
121+
null,
122+
null);
121123
}
122124

123125
@Test

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

+4-4
Original file line numberDiff line numberDiff line change
@@ -35,20 +35,20 @@
3535
@RunWith(AndroidJUnit4.class)
3636
public class OptimizelyClientEngineTest {
3737
@Test
38-
public void testGetClientEngineFromContextAndroidTV() {
38+
public void testGetClientEngineNameFromContextAndroidTV() {
3939
Context context = mock(Context.class);
4040
UiModeManager uiModeManager = mock(UiModeManager.class);
4141
when(context.getSystemService(Context.UI_MODE_SERVICE)).thenReturn(uiModeManager);
4242
when(uiModeManager.getCurrentModeType()).thenReturn(Configuration.UI_MODE_TYPE_TELEVISION);
43-
assertEquals(EventBatch.ClientEngine.ANDROID_TV_SDK, OptimizelyClientEngine.getClientEngineFromContext(context));
43+
assertEquals("android-tv-sdk", OptimizelyClientEngine.getClientEngineNameFromContext(context));
4444
}
4545

4646
@Test
47-
public void testGetClientEngineFromContextAndroid() {
47+
public void testGetClientEngineNameFromContextAndroid() {
4848
Context context = mock(Context.class);
4949
UiModeManager uiModeManager = mock(UiModeManager.class);
5050
when(context.getSystemService(Context.UI_MODE_SERVICE)).thenReturn(uiModeManager);
5151
when(uiModeManager.getCurrentModeType()).thenReturn(Configuration.UI_MODE_TYPE_NORMAL);
52-
assertEquals(EventBatch.ClientEngine.ANDROID_SDK, OptimizelyClientEngine.getClientEngineFromContext(context));
52+
assertEquals("android-sdk", OptimizelyClientEngine.getClientEngineNameFromContext(context));
5353
}
5454
}

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

+21
Original file line numberDiff line numberDiff line change
@@ -65,4 +65,25 @@ public void eventClientNameAndVersion() throws Exception {
6565
assertEquals(argument.getValue().getEventBatch().getClientVersion(), BuildConfig.CLIENT_VERSION);
6666
}
6767

68+
@Test
69+
public void eventClientWithCustomNameAndVersion() throws Exception {
70+
EventHandler mockEventHandler = mock(EventHandler.class);
71+
72+
Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
73+
OptimizelyManager optimizelyManager = OptimizelyManager.builder()
74+
.withSDKKey("any-sdk-key")
75+
.withEventDispatchInterval(0, TimeUnit.SECONDS)
76+
.withEventHandler(mockEventHandler)
77+
.withClientInfo("test-sdk", "test-version")
78+
.build(context);
79+
80+
OptimizelyClient optimizelyClient = optimizelyManager.initialize(context, minDatafileWithEvent);
81+
optimizelyClient.track("test_event", "tester");
82+
83+
ArgumentCaptor<LogEvent> argument = ArgumentCaptor.forClass(LogEvent.class);
84+
verify(mockEventHandler, timeout(5000)).dispatchEvent(argument.capture());
85+
assertEquals(argument.getValue().getEventBatch().getClientName(), "test-sdk");
86+
assertEquals(argument.getValue().getEventBatch().getClientVersion(), "test-version");
87+
}
88+
6889
}

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

+11-11
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ public void initializeSyncWithEnvironment() {
167167
EventHandler eventHandler = mock(DefaultEventHandler.class);
168168
EventProcessor eventProcessor = mock(EventProcessor.class);
169169
OptimizelyManager optimizelyManager = new OptimizelyManager(testProjectId, testSdkKey, null, logger, 3600L, datafileHandler, null, 3600L,
170-
eventHandler, eventProcessor, null, null, null, null, null);
170+
eventHandler, eventProcessor, null, null, null, null, null, null, null);
171171
/*
172172
* Scenario#1: when datafile is not Empty
173173
* Scenario#2: when datafile is Empty
@@ -226,7 +226,7 @@ public void initializeAsyncWithEnvironment() {
226226
EventHandler eventHandler = mock(DefaultEventHandler.class);
227227
EventProcessor eventProcessor = mock(EventProcessor.class);
228228
final OptimizelyManager optimizelyManager = new OptimizelyManager(testProjectId, testSdkKey, null, logger, 3600L, datafileHandler, null, 3600L,
229-
eventHandler, eventProcessor, null, null, null, null, null);
229+
eventHandler, eventProcessor, null, null, null, null, null, null, null);
230230

231231
/*
232232
* Scenario#1: when datafile is not Empty
@@ -498,7 +498,7 @@ public void initializeSyncWithUpdateOnNewDatafileDisabled() {
498498
Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
499499

500500
OptimizelyManager manager = new OptimizelyManager(testProjectId, testSdkKey, null, logger, pollingInterval, datafileHandler, null, 0,
501-
null, null, null, null, null, null, null);
501+
null, null, null, null, null, null, null, null, null);
502502

503503
doAnswer(
504504
new Answer<Object>() {
@@ -531,7 +531,7 @@ public void initializeSyncWithUpdateOnNewDatafileEnabled() {
531531
Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
532532

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

536536
doAnswer(
537537
new Answer<Object>() {
@@ -564,7 +564,7 @@ public void initializeSyncWithDownloadToCacheDisabled() {
564564
Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
565565

566566
OptimizelyManager manager = new OptimizelyManager(testProjectId, testSdkKey, null, logger, pollingInterval, datafileHandler, null, 0,
567-
null, null, null, null, null, null, null);
567+
null, null, null, null, null, null, null, null, null);
568568

569569
doAnswer(
570570
new Answer<Object>() {
@@ -597,7 +597,7 @@ public void initializeSyncWithUpdateOnNewDatafileDisabledWithPeriodicPollingEnab
597597
Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
598598

599599
OptimizelyManager manager = new OptimizelyManager(testProjectId, testSdkKey, null, logger, pollingInterval, datafileHandler, null, 0,
600-
null, null, null, null, null, null, null);
600+
null, null, null, null, null, null, null, null, null);
601601

602602
doAnswer(
603603
(Answer<Object>) invocation -> {
@@ -629,7 +629,7 @@ public void initializeSyncWithUpdateOnNewDatafileEnabledWithPeriodicPollingEnabl
629629
Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
630630

631631
OptimizelyManager manager = new OptimizelyManager(testProjectId, testSdkKey, null, logger, pollingInterval, datafileHandler, null, 0,
632-
null, null, null, null, null, null, null);
632+
null, null, null, null, null, null, null, null, null);
633633

634634
doAnswer(
635635
new Answer<Object>() {
@@ -662,7 +662,7 @@ public void initializeSyncWithUpdateOnNewDatafileDisabledWithPeriodicPollingDisa
662662
Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
663663

664664
OptimizelyManager manager = new OptimizelyManager(testProjectId, testSdkKey, null, logger, pollingInterval, datafileHandler, null, 0,
665-
null, null, null, null, null, null, null);
665+
null, null, null, null, null, null, null, null, null);
666666

667667
doAnswer(
668668
new Answer<Object>() {
@@ -696,7 +696,7 @@ public void initializeSyncWithUpdateOnNewDatafileEnabledWithPeriodicPollingDisab
696696
Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
697697

698698
OptimizelyManager manager = new OptimizelyManager(testProjectId, testSdkKey, null, logger, pollingInterval, datafileHandler, null, 0,
699-
null, null, null, null, null, null, null);
699+
null, null, null, null, null, null, null, null, null);
700700

701701
doAnswer(
702702
new Answer<Object>() {
@@ -729,7 +729,7 @@ public void initializeSyncWithResourceDatafileNoCache() {
729729
Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
730730

731731
OptimizelyManager manager = spy(new OptimizelyManager(testProjectId, testSdkKey, null, logger, pollingInterval, datafileHandler, null, 0,
732-
null, null, null, null, null, null, null));
732+
null, null, null, null, null, null, null, null, null));
733733

734734
datafileHandler.removeSavedDatafile(context, manager.getDatafileConfig());
735735
OptimizelyClient client = manager.initialize(context, R.raw.datafile, downloadToCache, updateConfigOnNewDatafile);
@@ -746,7 +746,7 @@ public void initializeSyncWithResourceDatafileNoCacheWithDefaultParams() {
746746
Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
747747

748748
OptimizelyManager manager = spy(new OptimizelyManager(testProjectId, testSdkKey, null, logger, pollingInterval, datafileHandler, null, 0,
749-
null, null, null, null, null, null, null));
749+
null, null, null, null, null, null, null, null, null));
750750

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

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

+18
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,30 @@
2828
*/
2929
public class OptimizelyClientEngine {
3030

31+
/**
32+
* Get client engine name for current UI mode type
33+
*
34+
* @param context any valid Android {@link Context}
35+
* @return client engine name ("android-sdk" or "android-tv-sdk")
36+
*/
37+
public static String getClientEngineNameFromContext(@NonNull Context context) {
38+
UiModeManager uiModeManager = (UiModeManager) context.getSystemService(Context.UI_MODE_SERVICE);
39+
40+
if (uiModeManager != null && uiModeManager.getCurrentModeType() == Configuration.UI_MODE_TYPE_TELEVISION) {
41+
return "android-tv-sdk";
42+
}
43+
44+
return "android-sdk";
45+
}
46+
3147
/**
3248
* Get client engine value for current UI mode type
3349
*
3450
* @param context any valid Android {@link Context}
3551
* @return String value of client engine
52+
* @deprecated Consider using {@link #getClientEngineNameFromContext(Context)}
3653
*/
54+
@Deprecated
3755
public static EventBatch.ClientEngine getClientEngineFromContext(@NonNull Context context) {
3856
UiModeManager uiModeManager = (UiModeManager) context.getSystemService(Context.UI_MODE_SERVICE);
3957

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

+53-11
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,8 @@ public class OptimizelyManager {
100100
private boolean returnInMainThreadFromAsyncInit = true;
101101

102102
@Nullable private final List<OptimizelyDecideOption> defaultDecideOptions;
103-
private String sdkVersion = null;
103+
private String customSdkName = null;
104+
private String customSdkVersion = null;
104105

105106
OptimizelyManager(@Nullable String projectId,
106107
@Nullable String sdkKey,
@@ -116,7 +117,9 @@ public class OptimizelyManager {
116117
@NonNull NotificationCenter notificationCenter,
117118
@Nullable List<OptimizelyDecideOption> defaultDecideOptions,
118119
@Nullable ODPManager odpManager,
119-
@Nullable String vuid) {
120+
@Nullable String vuid,
121+
@Nullable String clientEngineName,
122+
@Nullable String clientVersion) {
120123

121124
if (projectId == null && sdkKey == null) {
122125
logger.error("projectId and sdkKey are both null!");
@@ -142,12 +145,8 @@ public class OptimizelyManager {
142145
this.notificationCenter = notificationCenter;
143146
this.defaultDecideOptions = defaultDecideOptions;
144147

145-
try {
146-
sdkVersion = BuildConfig.CLIENT_VERSION;
147-
logger.info("SDK Version: {}", sdkVersion);
148-
} catch (Exception e) {
149-
logger.warn("Error getting BuildConfig version");
150-
}
148+
this.customSdkName = clientEngineName;
149+
this.customSdkVersion = clientVersion;
151150
}
152151

153152
@VisibleForTesting
@@ -537,6 +536,29 @@ public DatafileHandler getDatafileHandler() {
537536
return datafileHandler;
538537
}
539538

539+
@NonNull
540+
public String getSdkName(Context context) {
541+
String sdkName = customSdkName;
542+
if (sdkName == null) {
543+
sdkName = OptimizelyClientEngine.getClientEngineNameFromContext(context);
544+
}
545+
return sdkName;
546+
}
547+
548+
@NonNull
549+
public String getSdkVersion() {
550+
String sdkVersion = customSdkVersion;
551+
if (sdkVersion == null) {
552+
try {
553+
sdkVersion = BuildConfig.CLIENT_VERSION;
554+
} catch (Exception e) {
555+
logger.warn("Error getting BuildConfig version");
556+
sdkVersion = "UNKNOWN";
557+
}
558+
}
559+
return sdkVersion;
560+
}
561+
540562
private boolean datafileDownloadEnabled() {
541563
return datafileDownloadInterval > 0;
542564
}
@@ -600,7 +622,8 @@ public void onStartComplete(UserProfileService userProfileService) {
600622
private OptimizelyClient buildOptimizely(@NonNull Context context, @NonNull String datafile) throws ConfigParseException {
601623
EventHandler eventHandler = getEventHandler(context);
602624

603-
EventBatch.ClientEngine clientEngine = OptimizelyClientEngine.getClientEngineFromContext(context);
625+
String sdkName = getSdkName(context);
626+
String sdkVersion = getSdkVersion();
604627

605628
Optimizely.Builder builder = Optimizely.builder();
606629

@@ -617,7 +640,8 @@ private OptimizelyClient buildOptimizely(@NonNull Context context, @NonNull Stri
617640
}
618641

619642
// override client sdk name/version to be included in events
620-
builder.withClientInfo(clientEngine, sdkVersion);
643+
builder.withClientInfo(sdkName, sdkVersion);
644+
logger.info("SDK name: {} and version: {}", sdkName, sdkVersion);
621645

622646
if (errorHandler != null) {
623647
builder.withErrorHandler(errorHandler);
@@ -770,6 +794,9 @@ public static class Builder {
770794
private boolean odpEnabled = true;
771795
private String vuid = null;
772796

797+
private String customSdkName = null;
798+
private String customSdkVersion = null;
799+
773800
@Deprecated
774801
/**
775802
* @deprecated use {@link #Builder()} instead and pass in an SDK Key with {@link #withSDKKey(String)}
@@ -1014,6 +1041,18 @@ public Builder withVuid(String vuid) {
10141041
return this;
10151042
}
10161043

1044+
/**
1045+
* Override the SDK name and version (for client SDKs like flutter-sdk wrapping the core android-sdk) to be included in events.
1046+
*
1047+
* @param clientEngineName the client engine name ("flutter/android-sdk", etc.).
1048+
* @param clientVersion the client SDK version.
1049+
* @return this {@link Builder} instance
1050+
*/
1051+
public Builder withClientInfo(@Nullable String clientEngineName, @Nullable String clientVersion) {
1052+
this.customSdkName = clientEngineName;
1053+
this.customSdkVersion = clientVersion;
1054+
return this;
1055+
}
10171056
/**
10181057
* Get a new {@link Builder} instance to create {@link OptimizelyManager} with.
10191058
* @param context the application context used to create default service if not provided.
@@ -1126,7 +1165,10 @@ public OptimizelyManager build(Context context) {
11261165
notificationCenter,
11271166
defaultDecideOptions,
11281167
odpManager,
1129-
vuid);
1168+
vuid,
1169+
customSdkName,
1170+
customSdkVersion
1171+
);
11301172
}
11311173
}
11321174
}

android-sdk/src/test/java/com/optimizely/ab/android/sdk/OptimizelyManagerBuilderTest.java

+13-13
Original file line numberDiff line numberDiff line change
@@ -216,18 +216,14 @@ public void testBuildWithDatafileDownloadInterval_workerCancelledWhenIntervalIsN
216216
}
217217

218218
@Test
219-
public void testBuildWithDatafileDownloadInterval_workerCancelledWhenNoIntervalProvided() throws Exception {
219+
public void testBuildWithCustomSdkNameAndVersion() throws Exception {
220220
OptimizelyManager manager = OptimizelyManager.builder()
221-
.withSDKKey(testSdkKey)
222-
.withDatafileHandler(mockDatafileHandler)
223-
.withVuid("any-to-avoid-generate")
224-
.build(mockContext);
225-
OptimizelyManager spyManager = spy(manager);
226-
when(spyManager.isAndroidVersionSupported()).thenReturn(true);
227-
spyManager.initialize(mockContext, "");
228-
229-
verify(mockDatafileHandler).stopBackgroundUpdates(any(), any());
230-
verify(mockDatafileHandler, never()).startBackgroundUpdates(any(), any(), any(), any());
221+
.withSDKKey(testSdkKey)
222+
.withClientInfo("test-sdk", "test-version")
223+
.withVuid("any-to-avoid-generate")
224+
.build(mockContext);
225+
assertEquals(manager.getSdkName(mockContext), "test-sdk");
226+
assertEquals(manager.getSdkVersion(), "test-version");
231227
}
232228

233229
@Test
@@ -254,7 +250,9 @@ public void testBuildWithDefaultODP_defaultEnabled() throws Exception {
254250
any(NotificationCenter.class),
255251
any(), // nullable (DefaultDecideOptions)
256252
any(ODPManager.class),
257-
eq("test-vuid"));
253+
eq("test-vuid"),
254+
any(),
255+
any());
258256
}
259257

260258
@Test
@@ -282,7 +280,9 @@ public void testBuildWithDefaultODP_disabled() throws Exception {
282280
any(NotificationCenter.class),
283281
any(), // nullable (DefaultDecideOptions)
284282
isNull(),
285-
eq("test-vuid"));
283+
eq("test-vuid"),
284+
any(),
285+
any());
286286
}
287287

288288
@Test

0 commit comments

Comments
 (0)