From 1060a0dfda3561d780cecbfea7d52131f27fa9bf Mon Sep 17 00:00:00 2001 From: Jae Kim Date: Tue, 5 May 2026 14:52:13 -0700 Subject: [PATCH 01/14] [FSSDK-12546] release android v5.2.0 --- CHANGELOG.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3aa26feb..1dcfead2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,21 @@ # Optimizely Android X SDK Changelog +## 5.2.0 +May 5, 2026 + +### New Features + +**Feature Rollout**: Added support for Feature Rollouts, a new experiment type +combining Targeted Delivery simplicity with A/B test measurement capabilities. +Feature Rollouts enable progressive rollouts with full impact analytics, metric tracking, +and confidence intervals. +See [Feature Rollout docs](https://support.optimizely.com/hc/en-us/articles/45552846481037-Run-Feature-Rollouts-in-Feature-Experimentation) for more information. + +- Add Feature Rollout support ([#524](https://github.com/optimizely/android-sdk/pull/524)) +- Remove source clear cron workflow ([#523](https://github.com/optimizely/android-sdk/pull/523)) +- Update cmab error handling ([#522](https://github.com/optimizely/android-sdk/pull/522)) +- Option to run local java-sdk lib ([#521](https://github.com/optimizely/android-sdk/pull/521)) + ## 5.1.1 January 20th, 2025 From e99480130de414837c7697d8a94a26fb688a28bf Mon Sep 17 00:00:00 2001 From: Jae Kim Date: Tue, 5 May 2026 14:52:45 -0700 Subject: [PATCH 02/14] [FSSDK-12546] bump version to 5.2.0 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 09a4ebe4..52569d6c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ # Maven local version (when android-sdk built for local maven repo) -version = 3.5.0-SNAPSHOT +version = 5.2.0 android.enableJetifier=true android.useAndroidX=true From 4360977fc91e0e790d83caac48f879af3c761a41 Mon Sep 17 00:00:00 2001 From: Jae Kim Date: Tue, 5 May 2026 15:07:04 -0700 Subject: [PATCH 03/14] [FSSDK-12546] update README version and java-core to 4.4.0 --- README.md | 2 +- build.gradle | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 435f7e0e..78ee9b48 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ repositories { } dependencies { - implementation 'com.optimizely.ab:android-sdk:5.1.0' + implementation 'com.optimizely.ab:android-sdk:5.2.0' } ``` diff --git a/build.gradle b/build.gradle index e40636d0..01b8c5ac 100644 --- a/build.gradle +++ b/build.gradle @@ -97,7 +97,7 @@ ext { build_tools_version = "35.0.0" min_sdk_version = 21 target_sdk_version = 35 - java_core_ver = "4.3.1" + java_core_ver = "4.4.0" android_logger_ver = "1.3.6" jacksonversion= "2.11.2" annotations_ver = "1.2.0" From 99fb082f852e9f36ed2acecbe34f74b7d23ef193 Mon Sep 17 00:00:00 2001 From: Jae Kim Date: Tue, 5 May 2026 15:45:54 -0700 Subject: [PATCH 04/14] clean up --- CHANGELOG.md | 8 +++++--- gradle.properties | 5 +++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1dcfead2..4e21204e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,10 +11,12 @@ Feature Rollouts enable progressive rollouts with full impact analytics, metric and confidence intervals. See [Feature Rollout docs](https://support.optimizely.com/hc/en-us/articles/45552846481037-Run-Feature-Rollouts-in-Feature-Experimentation) for more information. -- Add Feature Rollout support ([#524](https://github.com/optimizely/android-sdk/pull/524)) -- Remove source clear cron workflow ([#523](https://github.com/optimizely/android-sdk/pull/523)) +- Update to use the Optimizely [Java SDK 4.4.0](https://github.com/optimizely/java-sdk/releases/tag/4.4.0) + +### Fixes and Improvements + - Update cmab error handling ([#522](https://github.com/optimizely/android-sdk/pull/522)) -- Option to run local java-sdk lib ([#521](https://github.com/optimizely/android-sdk/pull/521)) + ## 5.1.1 January 20th, 2025 diff --git a/gradle.properties b/gradle.properties index 52569d6c..70250523 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,6 @@ -# Maven local version (when android-sdk built for local maven repo) -version = 5.2.0 +# Maven version +# - keep SNAPSHOT for fallback for local build version +version = 0.0.0-SNAPSHOT android.enableJetifier=true android.useAndroidX=true From 0772de734b8ce2e56e6db6b6a82d0c1695bb72a9 Mon Sep 17 00:00:00 2001 From: Jae Kim Date: Tue, 5 May 2026 15:57:29 -0700 Subject: [PATCH 05/14] clean up build size issue --- android-sdk/build.gradle | 3 +++ 1 file changed, 3 insertions(+) diff --git a/android-sdk/build.gradle b/android-sdk/build.gradle index 2cbb1dfd..c4e2a73d 100644 --- a/android-sdk/build.gradle +++ b/android-sdk/build.gradle @@ -27,6 +27,7 @@ android { targetSdkVersion target_sdk_version multiDexEnabled true testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner' + testInstrumentationRunnerArguments clearPackageData: 'true' buildConfigField "String", "CLIENT_VERSION", "\"$version_name\"" multiDexEnabled true @@ -38,6 +39,7 @@ android { buildConfig true } testOptions { + execution 'ANDROIDX_TEST_ORCHESTRATOR' unitTests.returnDefaultValues = true unitTests.all { jvmArgs = [ @@ -93,6 +95,7 @@ dependencies { testImplementation "com.noveogroup.android:android-logger:$android_logger_ver" androidTestImplementation "androidx.work:work-testing:$work_runtime" + androidTestUtil "androidx.test:orchestrator:1.5.1" androidTestImplementation "androidx.test.ext:junit:$androidx_test_junit" androidTestImplementation "androidx.test.espresso:espresso-core:$espresso_ver" // Set this dependency to use JUnit 4 rules From 7ec6bb516f5f8ceb6aee487e7090cfee5ddf02a6 Mon Sep 17 00:00:00 2001 From: Jae Kim Date: Tue, 5 May 2026 16:10:14 -0700 Subject: [PATCH 06/14] clean up --- android-sdk/build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/android-sdk/build.gradle b/android-sdk/build.gradle index c4e2a73d..93b28b74 100644 --- a/android-sdk/build.gradle +++ b/android-sdk/build.gradle @@ -96,6 +96,7 @@ dependencies { androidTestImplementation "androidx.work:work-testing:$work_runtime" androidTestUtil "androidx.test:orchestrator:1.5.1" + androidTestUtil "androidx.test.services:test-services:1.5.0" androidTestImplementation "androidx.test.ext:junit:$androidx_test_junit" androidTestImplementation "androidx.test.espresso:espresso-core:$espresso_ver" // Set this dependency to use JUnit 4 rules From d75922bdc90d351b53075f2ed8164d5e26ffad09 Mon Sep 17 00:00:00 2001 From: Jae Kim Date: Wed, 6 May 2026 13:33:24 -0700 Subject: [PATCH 07/14] work for temp min-skd-verion=30 --- .github/workflows/android.yml | 4 +- android-sdk/build.gradle | 8 +++- .../ab/android/sdk/ODPIntegrationTest.java | 3 +- .../ab/android/sdk/OptimizelyClientTest.java | 48 +++++++++---------- .../org.mockito.plugins.MockMaker | 1 + build.gradle | 4 +- datafile-handler/build.gradle | 8 +++- .../org.mockito.plugins.MockMaker | 1 + event-handler/build.gradle | 9 +++- .../org.mockito.plugins.MockMaker | 1 + odp/build.gradle | 8 +++- .../org.mockito.plugins.MockMaker | 1 + shared/build.gradle | 8 +++- .../org.mockito.plugins.MockMaker | 1 + user-profile/build.gradle | 8 +++- .../org.mockito.plugins.MockMaker | 1 + 16 files changed, 79 insertions(+), 35 deletions(-) create mode 100644 android-sdk/src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker create mode 100644 datafile-handler/src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker create mode 100644 event-handler/src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker create mode 100644 odp/src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker create mode 100644 shared/src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker create mode 100644 user-profile/src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml index 90669fe5..752416d8 100644 --- a/.github/workflows/android.yml +++ b/.github/workflows/android.yml @@ -82,7 +82,6 @@ jobs: fail-fast: false matrix: # 21 is too old (not properly supported by github) - # mockito version is not working in 30+ include: - api-level: 25 arch: x86 @@ -93,6 +92,9 @@ jobs: - api-level: 29 arch: x86_64 target: default + - api-level: 33 + arch: x86_64 + target: google_apis steps: - name: checkout uses: actions/checkout@v4 diff --git a/android-sdk/build.gradle b/android-sdk/build.gradle index 93b28b74..5ac54599 100644 --- a/android-sdk/build.gradle +++ b/android-sdk/build.gradle @@ -38,6 +38,11 @@ android { buildFeatures { buildConfig true } + packagingOptions { + resources { + pickFirsts += ['mockito-extensions/org.mockito.plugins.MockMaker'] + } + } testOptions { execution 'ANDROIDX_TEST_ORCHESTRATOR' unitTests.returnDefaultValues = true @@ -56,7 +61,7 @@ android { minifyEnabled false } debug { - testCoverageEnabled true + testCoverageEnabled false } } } @@ -106,6 +111,7 @@ dependencies { androidTestImplementation "org.mockito:mockito-core:$mockito_ver_sdk_module" androidTestImplementation "org.mockito:mockito-android:$mockito_ver_sdk_module" + androidTestImplementation "com.linkedin.dexmaker:dexmaker-mockito-inline:2.28.3" androidTestImplementation "com.noveogroup.android:android-logger:$android_logger_ver" androidTestImplementation "com.google.code.gson:gson:$gson_ver" androidTestImplementation "com.fasterxml.jackson.core:jackson-databind:$jacksonversion" diff --git a/android-sdk/src/androidTest/java/com/optimizely/ab/android/sdk/ODPIntegrationTest.java b/android-sdk/src/androidTest/java/com/optimizely/ab/android/sdk/ODPIntegrationTest.java index 9c3effda..b9c37f3c 100644 --- a/android-sdk/src/androidTest/java/com/optimizely/ab/android/sdk/ODPIntegrationTest.java +++ b/android-sdk/src/androidTest/java/com/optimizely/ab/android/sdk/ODPIntegrationTest.java @@ -25,7 +25,6 @@ import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.optimizely.ab.OptimizelyUserContext; -import com.optimizely.ab.android.odp.DefaultODPApiManager; import com.optimizely.ab.odp.ODPApiManager; import com.optimizely.ab.odp.ODPEventManager; import com.optimizely.ab.odp.ODPManager; @@ -92,7 +91,7 @@ public class ODPIntegrationTest { @Before public void setup() throws Exception { - odpApiManager = mock(DefaultODPApiManager.class); + odpApiManager = mock(ODPApiManager.class); when(odpApiManager.sendEvents(anyString(), anyString(), anyString())).thenReturn(200); // return success, otherwise retried 3 times. odpEventManager = new ODPEventManager(odpApiManager); diff --git a/android-sdk/src/androidTest/java/com/optimizely/ab/android/sdk/OptimizelyClientTest.java b/android-sdk/src/androidTest/java/com/optimizely/ab/android/sdk/OptimizelyClientTest.java index 4b1682c6..76957763 100644 --- a/android-sdk/src/androidTest/java/com/optimizely/ab/android/sdk/OptimizelyClientTest.java +++ b/android-sdk/src/androidTest/java/com/optimizely/ab/android/sdk/OptimizelyClientTest.java @@ -83,7 +83,7 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyZeroInteractions; +import static org.mockito.Mockito.verifyNoInteractions; import static org.mockito.Mockito.when; @RunWith(Parameterized.class) @@ -435,7 +435,7 @@ public void testGoodForcedTrack() { optimizelyClient.track("test_event", GENERIC_USER_ID); - verifyZeroInteractions(logger); + verifyNoInteractions(logger); ArgumentCaptor logEventArgumentCaptor = ArgumentCaptor.forClass(LogEvent.class); try { @@ -466,7 +466,7 @@ public void testGoodTrack() { OptimizelyClient optimizelyClient = new OptimizelyClient(optimizely, logger); optimizelyClient.track("test_event", GENERIC_USER_ID); - verifyZeroInteractions(logger); + verifyNoInteractions(logger); } @Test @@ -488,7 +488,7 @@ public void onTrack(@Nonnull String eventKey, @Nonnull String userId, @Nonnull M assertTrue(notificationId <= 0); assertFalse(optimizelyClient.getNotificationCenter().removeNotificationListener(notificationId)); assertEquals(false, numberOfCalls[0]); - verifyZeroInteractions(logger); + verifyNoInteractions(logger); } @@ -516,7 +516,7 @@ public void onTrack(@Nonnull String eventKey, @Nonnull String userId, @Nonnull M else { assertEquals(true, numberOfCalls[0]); } - verifyZeroInteractions(logger); + verifyNoInteractions(logger); } @@ -528,7 +528,7 @@ public void testGoodTrackBucketing() { Experiment experiment = optimizelyClient.getProjectConfig().getExperimentsForEventKey("test_event").get(0); attributes.put(BUCKETING_ATTRIBUTE, bucketingId); optimizelyClient.track("test_event", "userId", attributes); - verifyZeroInteractions(logger); + verifyNoInteractions(logger); } @Test @@ -573,7 +573,7 @@ public void testGoodForcedTrackAttribute() { optimizelyClient.track("test_event", GENERIC_USER_ID, attributes); - verifyZeroInteractions(logger); + verifyNoInteractions(logger); ArgumentCaptor logEventArgumentCaptor = ArgumentCaptor.forClass(LogEvent.class); @@ -615,7 +615,7 @@ public void testGoodTrackAttribute() { optimizelyClient.track("test_event", GENERIC_USER_ID, attributes); - verifyZeroInteractions(logger); + verifyNoInteractions(logger); Variation v = optimizelyClient.getForcedVariation(FEATURE_ANDROID_EXPERIMENT_KEY, GENERIC_USER_ID); assertEquals(v.getKey(), "var_2"); @@ -675,7 +675,7 @@ public void testGoodForcedTrackEventVal() { Collections.emptyMap(), Collections.singletonMap(ReservedEventKey.REVENUE.toString(), 1L)); - verifyZeroInteractions(logger); + verifyNoInteractions(logger); ArgumentCaptor logEventArgumentCaptor = ArgumentCaptor.forClass(LogEvent.class); @@ -709,7 +709,7 @@ public void testGoodTrackEventVal() { GENERIC_USER_ID, Collections.emptyMap(), Collections.singletonMap(ReservedEventKey.REVENUE.toString(), 1L)); - verifyZeroInteractions(logger); + verifyNoInteractions(logger); } @Test @@ -754,7 +754,7 @@ public void testGoodTrackAttributeEventVal() { final HashMap attributes = new HashMap<>(); optimizelyClient.track("test_event", GENERIC_USER_ID, attributes, Collections.singletonMap(ReservedEventKey.REVENUE.toString(), 1L)); - verifyZeroInteractions(logger); + verifyNoInteractions(logger); } @Test @@ -774,7 +774,7 @@ public void testGoodForcedTrackAttributeEventVal() { attributes, Collections.singletonMap(ReservedEventKey.REVENUE.toString(), 1L)); - verifyZeroInteractions(logger); + verifyNoInteractions(logger); ArgumentCaptor logEventArgumentCaptor = ArgumentCaptor.forClass(LogEvent.class); @@ -843,7 +843,7 @@ public void testTrackWithEventTags() { final HashMap eventTags = new HashMap<>(); eventTags.put("foo", 843); optimizelyClient.track("test_event", GENERIC_USER_ID, attributes, eventTags); - verifyZeroInteractions(logger); + verifyNoInteractions(logger); } @Test @@ -879,7 +879,7 @@ public void testForcedTrackWithEventTags() { // id of var_2 assertTrue(logEvent.getBody().contains("\"enrich_decisions\":true")); - verifyZeroInteractions(logger); + verifyNoInteractions(logger); Variation v = optimizelyClient.getForcedVariation(FEATURE_ANDROID_EXPERIMENT_KEY, GENERIC_USER_ID); assertEquals(v.getKey(), "var_2"); @@ -983,7 +983,7 @@ public void testGoodGetVariationAttribute() { logger); final HashMap attributes = new HashMap<>(); optimizelyClient.getVariation(FEATURE_ANDROID_EXPERIMENT_KEY, GENERIC_USER_ID, attributes); - verifyZeroInteractions(logger); + verifyNoInteractions(logger); } @Test @@ -1000,7 +1000,7 @@ public void testGoodForcedGetVariationAttribute() { v = optimizelyClient.getVariation(FEATURE_ANDROID_EXPERIMENT_KEY, GENERIC_USER_ID, attributes); - verifyZeroInteractions(logger); + verifyNoInteractions(logger); assertEquals(v.getKey(), "var_2"); @@ -1184,7 +1184,7 @@ public void testGoodIsFeatureEnabledWithAttribute() { Collections.singletonMap("house", "Gryffindor") )); - verifyZeroInteractions(logger); + verifyNoInteractions(logger); assertFalse(optimizelyClient.isFeatureEnabled( "InvalidFeatureKey", @@ -1305,7 +1305,7 @@ public void testIsFeatureEnabledWithFeatureEnabledTrue(){ Collections.singletonMap("house", "Gryffindor") )); - verifyZeroInteractions(logger); + verifyNoInteractions(logger); } @@ -1402,7 +1402,7 @@ public void testGoodGetFeatureVariableBooleanWithAttr() { GENERIC_USER_ID, Collections.singletonMap("key", "value") )); - verifyZeroInteractions(logger); + verifyNoInteractions(logger); } @@ -1509,7 +1509,7 @@ public void testGoodGetFeatureVariableDoubleWithAttr() { GENERIC_USER_ID, Collections.singletonMap("house", "Gryffindor") )); - verifyZeroInteractions(logger); + verifyNoInteractions(logger); } //FeatureVariableDouble Scenario#3 if feature not found @@ -1620,7 +1620,7 @@ public void testGoodGetFeatureVariableIntegerWithAttr() { GENERIC_USER_ID, Collections.singletonMap("house", "Gryffindor") )); - verifyZeroInteractions(logger); + verifyNoInteractions(logger); } //FeatureVariableInteger Scenario#3 if feature not found @@ -1727,7 +1727,7 @@ public void testGoodGetFeatureVariableStringWithAttr() { GENERIC_USER_ID, Collections.singletonMap("house", "Gryffindor") )); - verifyZeroInteractions(logger); + verifyNoInteractions(logger); } //FeatureVariableString Scenario#3 if feature not found @@ -1841,7 +1841,7 @@ public void testGetFeatureVariableJsonWithAttr() { ); assertTrue(compareJsonStrings(json.toString(), defaultValueOfStringVar)); - verifyZeroInteractions(logger); + verifyNoInteractions(logger); } //FeatureVariableJSON Scenario#3 if feature not found @@ -1953,7 +1953,7 @@ public void testGetAllFeatureVariablesWithAttr() { ); assertTrue(compareJsonStrings(json.toString(), defaultValueOfStringVar)); - verifyZeroInteractions(logger); + verifyNoInteractions(logger); } //GetAllFeatureVariables Scenario#3 if feature not found diff --git a/android-sdk/src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker b/android-sdk/src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker new file mode 100644 index 00000000..7d92259b --- /dev/null +++ b/android-sdk/src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker @@ -0,0 +1 @@ +com.android.dx.mockito.inline.InlineDexmakerMockMaker diff --git a/build.gradle b/build.gradle index 01b8c5ac..cf66450d 100644 --- a/build.gradle +++ b/build.gradle @@ -95,7 +95,7 @@ allprojects { ext { compile_sdk_version = 35 build_tools_version = "35.0.0" - min_sdk_version = 21 + min_sdk_version = 30 target_sdk_version = 35 java_core_ver = "4.4.0" android_logger_ver = "1.3.6" @@ -103,7 +103,7 @@ ext { annotations_ver = "1.2.0" junit_ver = "4.12" mockito_ver = "4.11.0" - mockito_ver_sdk_module = "2.28.2" + mockito_ver_sdk_module = "3.6.28" powermock_ver = "2.0.9" support_test_runner_ver = "0.5" dexmaker_ver = "1.4" diff --git a/datafile-handler/build.gradle b/datafile-handler/build.gradle index 43cfd62f..a3bc9b87 100644 --- a/datafile-handler/build.gradle +++ b/datafile-handler/build.gradle @@ -36,7 +36,12 @@ android { minifyEnabled false } debug { - testCoverageEnabled true + testCoverageEnabled false + } + } + packagingOptions { + resources { + pickFirsts += ['mockito-extensions/org.mockito.plugins.MockMaker'] } } } @@ -62,6 +67,7 @@ dependencies { androidTestImplementation "org.mockito:mockito-core:$mockito_ver_sdk_module" androidTestImplementation "org.mockito:mockito-android:$mockito_ver_sdk_module" + androidTestImplementation "com.linkedin.dexmaker:dexmaker-mockito-inline:2.28.3" androidTestImplementation "com.noveogroup.android:android-logger:$android_logger_ver" androidTestImplementation "com.fasterxml.jackson.core:jackson-databind:$jacksonversion" implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" diff --git a/datafile-handler/src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker b/datafile-handler/src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker new file mode 100644 index 00000000..7d92259b --- /dev/null +++ b/datafile-handler/src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker @@ -0,0 +1 @@ +com.android.dx.mockito.inline.InlineDexmakerMockMaker diff --git a/event-handler/build.gradle b/event-handler/build.gradle index 6a01bc6d..92626dba 100644 --- a/event-handler/build.gradle +++ b/event-handler/build.gradle @@ -41,11 +41,17 @@ android { minifyEnabled false } debug { - testCoverageEnabled true + testCoverageEnabled false } } buildToolsVersion build_tools_version + + packagingOptions { + resources { + pickFirsts += ['mockito-extensions/org.mockito.plugins.MockMaker'] + } + } } dependencies { @@ -70,6 +76,7 @@ dependencies { androidTestImplementation "org.mockito:mockito-core:$mockito_ver_sdk_module" androidTestImplementation "org.mockito:mockito-android:$mockito_ver_sdk_module" + androidTestImplementation "com.linkedin.dexmaker:dexmaker-mockito-inline:2.28.3" androidTestImplementation "com.noveogroup.android:android-logger:$android_logger_ver" androidTestImplementation "com.fasterxml.jackson.core:jackson-databind:$jacksonversion" implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" diff --git a/event-handler/src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker b/event-handler/src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker new file mode 100644 index 00000000..7d92259b --- /dev/null +++ b/event-handler/src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker @@ -0,0 +1 @@ +com.android.dx.mockito.inline.InlineDexmakerMockMaker diff --git a/odp/build.gradle b/odp/build.gradle index 98aba716..92c6fbd3 100644 --- a/odp/build.gradle +++ b/odp/build.gradle @@ -39,10 +39,15 @@ android { minifyEnabled false } debug { - testCoverageEnabled true + testCoverageEnabled false } } buildToolsVersion build_tools_version + packagingOptions { + resources { + pickFirsts += ['mockito-extensions/org.mockito.plugins.MockMaker'] + } + } } dependencies { @@ -69,5 +74,6 @@ dependencies { androidTestImplementation "org.mockito:mockito-core:$mockito_ver_sdk_module" androidTestImplementation "org.mockito:mockito-android:$mockito_ver_sdk_module" + androidTestImplementation "com.linkedin.dexmaker:dexmaker-mockito-inline:2.28.3" androidTestImplementation "org.slf4j:slf4j-api:$slf4j_ver" } diff --git a/odp/src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker b/odp/src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker new file mode 100644 index 00000000..7d92259b --- /dev/null +++ b/odp/src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker @@ -0,0 +1 @@ +com.android.dx.mockito.inline.InlineDexmakerMockMaker diff --git a/shared/build.gradle b/shared/build.gradle index fb48d149..a6a21ebf 100644 --- a/shared/build.gradle +++ b/shared/build.gradle @@ -38,10 +38,15 @@ android { minifyEnabled false } debug { - testCoverageEnabled true + testCoverageEnabled false } } buildToolsVersion build_tools_version + packagingOptions { + resources { + pickFirsts += ['mockito-extensions/org.mockito.plugins.MockMaker'] + } + } } dependencies { @@ -78,6 +83,7 @@ dependencies { androidTestImplementation "org.mockito:mockito-core:$mockito_ver_sdk_module" androidTestImplementation "org.mockito:mockito-android:$mockito_ver_sdk_module" + androidTestImplementation "com.linkedin.dexmaker:dexmaker-mockito-inline:2.28.3" androidTestImplementation "com.noveogroup.android:android-logger:$android_logger_ver" androidTestImplementation "com.fasterxml.jackson.core:jackson-databind:$jacksonversion" } diff --git a/shared/src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker b/shared/src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker new file mode 100644 index 00000000..7d92259b --- /dev/null +++ b/shared/src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker @@ -0,0 +1 @@ +com.android.dx.mockito.inline.InlineDexmakerMockMaker diff --git a/user-profile/build.gradle b/user-profile/build.gradle index d501c8ed..39dbda2a 100644 --- a/user-profile/build.gradle +++ b/user-profile/build.gradle @@ -36,7 +36,12 @@ android { minifyEnabled false } debug { - testCoverageEnabled true + testCoverageEnabled false + } + } + packagingOptions { + resources { + pickFirsts += ['mockito-extensions/org.mockito.plugins.MockMaker'] } } } @@ -63,6 +68,7 @@ dependencies { androidTestImplementation "org.mockito:mockito-core:$mockito_ver_sdk_module" androidTestImplementation "org.mockito:mockito-android:$mockito_ver_sdk_module" + androidTestImplementation "com.linkedin.dexmaker:dexmaker-mockito-inline:2.28.3" androidTestImplementation "com.noveogroup.android:android-logger:$android_logger_ver" androidTestImplementation "com.fasterxml.jackson.core:jackson-databind:$jacksonversion" } diff --git a/user-profile/src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker b/user-profile/src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker new file mode 100644 index 00000000..7d92259b --- /dev/null +++ b/user-profile/src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker @@ -0,0 +1 @@ +com.android.dx.mockito.inline.InlineDexmakerMockMaker From 4aa894ff415e0fca790058b792bffb13e57cbd61 Mon Sep 17 00:00:00 2001 From: Jae Kim Date: Wed, 6 May 2026 14:02:04 -0700 Subject: [PATCH 08/14] fix for min-sdk-verison back to 21 --- android-sdk/build.gradle | 8 ++++---- build.gradle | 2 +- datafile-handler/build.gradle | 7 ++++--- event-handler/build.gradle | 7 ++++--- odp/build.gradle | 7 ++++--- shared/build.gradle | 7 ++++--- user-profile/build.gradle | 7 ++++--- 7 files changed, 25 insertions(+), 20 deletions(-) diff --git a/android-sdk/build.gradle b/android-sdk/build.gradle index 5ac54599..acd0f228 100644 --- a/android-sdk/build.gradle +++ b/android-sdk/build.gradle @@ -27,7 +27,6 @@ android { targetSdkVersion target_sdk_version multiDexEnabled true testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner' - testInstrumentationRunnerArguments clearPackageData: 'true' buildConfigField "String", "CLIENT_VERSION", "\"$version_name\"" multiDexEnabled true @@ -109,9 +108,10 @@ dependencies { androidTestImplementation "androidx.test:core:$androidx_test_core" androidTestImplementation "androidx.test:core-ktx:$androidx_test_core" - androidTestImplementation "org.mockito:mockito-core:$mockito_ver_sdk_module" - androidTestImplementation "org.mockito:mockito-android:$mockito_ver_sdk_module" - androidTestImplementation "com.linkedin.dexmaker:dexmaker-mockito-inline:2.28.3" + androidTestImplementation("org.mockito:mockito-core:$mockito_ver_sdk_module") { exclude group: 'org.objenesis' } + androidTestImplementation("org.mockito:mockito-android:$mockito_ver_sdk_module") { exclude group: 'org.objenesis' } + androidTestImplementation("com.linkedin.dexmaker:dexmaker-mockito-inline:2.28.3") { exclude group: 'org.objenesis' } + androidTestImplementation "org.objenesis:objenesis:2.6" androidTestImplementation "com.noveogroup.android:android-logger:$android_logger_ver" androidTestImplementation "com.google.code.gson:gson:$gson_ver" androidTestImplementation "com.fasterxml.jackson.core:jackson-databind:$jacksonversion" diff --git a/build.gradle b/build.gradle index cf66450d..b8f8b720 100644 --- a/build.gradle +++ b/build.gradle @@ -95,7 +95,7 @@ allprojects { ext { compile_sdk_version = 35 build_tools_version = "35.0.0" - min_sdk_version = 30 + min_sdk_version = 21 target_sdk_version = 35 java_core_ver = "4.4.0" android_logger_ver = "1.3.6" diff --git a/datafile-handler/build.gradle b/datafile-handler/build.gradle index a3bc9b87..e1c0021e 100644 --- a/datafile-handler/build.gradle +++ b/datafile-handler/build.gradle @@ -65,9 +65,10 @@ dependencies { androidTestImplementation "androidx.test:core:$androidx_test_core" androidTestImplementation "androidx.test:core-ktx:$androidx_test_core" - androidTestImplementation "org.mockito:mockito-core:$mockito_ver_sdk_module" - androidTestImplementation "org.mockito:mockito-android:$mockito_ver_sdk_module" - androidTestImplementation "com.linkedin.dexmaker:dexmaker-mockito-inline:2.28.3" + androidTestImplementation("org.mockito:mockito-core:$mockito_ver_sdk_module") { exclude group: 'org.objenesis' } + androidTestImplementation("org.mockito:mockito-android:$mockito_ver_sdk_module") { exclude group: 'org.objenesis' } + androidTestImplementation("com.linkedin.dexmaker:dexmaker-mockito-inline:2.28.3") { exclude group: 'org.objenesis' } + androidTestImplementation "org.objenesis:objenesis:2.6" androidTestImplementation "com.noveogroup.android:android-logger:$android_logger_ver" androidTestImplementation "com.fasterxml.jackson.core:jackson-databind:$jacksonversion" implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" diff --git a/event-handler/build.gradle b/event-handler/build.gradle index 92626dba..79b8bbc5 100644 --- a/event-handler/build.gradle +++ b/event-handler/build.gradle @@ -74,9 +74,10 @@ dependencies { androidTestImplementation "androidx.test:core:$androidx_test_core" androidTestImplementation "androidx.test:core-ktx:$androidx_test_core" - androidTestImplementation "org.mockito:mockito-core:$mockito_ver_sdk_module" - androidTestImplementation "org.mockito:mockito-android:$mockito_ver_sdk_module" - androidTestImplementation "com.linkedin.dexmaker:dexmaker-mockito-inline:2.28.3" + androidTestImplementation("org.mockito:mockito-core:$mockito_ver_sdk_module") { exclude group: 'org.objenesis' } + androidTestImplementation("org.mockito:mockito-android:$mockito_ver_sdk_module") { exclude group: 'org.objenesis' } + androidTestImplementation("com.linkedin.dexmaker:dexmaker-mockito-inline:2.28.3") { exclude group: 'org.objenesis' } + androidTestImplementation "org.objenesis:objenesis:2.6" androidTestImplementation "com.noveogroup.android:android-logger:$android_logger_ver" androidTestImplementation "com.fasterxml.jackson.core:jackson-databind:$jacksonversion" implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" diff --git a/odp/build.gradle b/odp/build.gradle index 92c6fbd3..ffed0841 100644 --- a/odp/build.gradle +++ b/odp/build.gradle @@ -72,8 +72,9 @@ dependencies { androidTestImplementation "androidx.test:core:$androidx_test_core" androidTestImplementation "androidx.test:core-ktx:$androidx_test_core" - androidTestImplementation "org.mockito:mockito-core:$mockito_ver_sdk_module" - androidTestImplementation "org.mockito:mockito-android:$mockito_ver_sdk_module" - androidTestImplementation "com.linkedin.dexmaker:dexmaker-mockito-inline:2.28.3" + androidTestImplementation("org.mockito:mockito-core:$mockito_ver_sdk_module") { exclude group: 'org.objenesis' } + androidTestImplementation("org.mockito:mockito-android:$mockito_ver_sdk_module") { exclude group: 'org.objenesis' } + androidTestImplementation("com.linkedin.dexmaker:dexmaker-mockito-inline:2.28.3") { exclude group: 'org.objenesis' } + androidTestImplementation "org.objenesis:objenesis:2.6" androidTestImplementation "org.slf4j:slf4j-api:$slf4j_ver" } diff --git a/shared/build.gradle b/shared/build.gradle index a6a21ebf..813c6419 100644 --- a/shared/build.gradle +++ b/shared/build.gradle @@ -81,9 +81,10 @@ dependencies { androidTestImplementation "androidx.test:core:$androidx_test_core" androidTestImplementation "androidx.test:core-ktx:$androidx_test_core" - androidTestImplementation "org.mockito:mockito-core:$mockito_ver_sdk_module" - androidTestImplementation "org.mockito:mockito-android:$mockito_ver_sdk_module" - androidTestImplementation "com.linkedin.dexmaker:dexmaker-mockito-inline:2.28.3" + androidTestImplementation("org.mockito:mockito-core:$mockito_ver_sdk_module") { exclude group: 'org.objenesis' } + androidTestImplementation("org.mockito:mockito-android:$mockito_ver_sdk_module") { exclude group: 'org.objenesis' } + androidTestImplementation("com.linkedin.dexmaker:dexmaker-mockito-inline:2.28.3") { exclude group: 'org.objenesis' } + androidTestImplementation "org.objenesis:objenesis:2.6" androidTestImplementation "com.noveogroup.android:android-logger:$android_logger_ver" androidTestImplementation "com.fasterxml.jackson.core:jackson-databind:$jacksonversion" } diff --git a/user-profile/build.gradle b/user-profile/build.gradle index 39dbda2a..567830dc 100644 --- a/user-profile/build.gradle +++ b/user-profile/build.gradle @@ -66,9 +66,10 @@ dependencies { androidTestImplementation "androidx.test:core:$androidx_test_core" androidTestImplementation "androidx.test:core-ktx:$androidx_test_core" - androidTestImplementation "org.mockito:mockito-core:$mockito_ver_sdk_module" - androidTestImplementation "org.mockito:mockito-android:$mockito_ver_sdk_module" - androidTestImplementation "com.linkedin.dexmaker:dexmaker-mockito-inline:2.28.3" + androidTestImplementation("org.mockito:mockito-core:$mockito_ver_sdk_module") { exclude group: 'org.objenesis' } + androidTestImplementation("org.mockito:mockito-android:$mockito_ver_sdk_module") { exclude group: 'org.objenesis' } + androidTestImplementation("com.linkedin.dexmaker:dexmaker-mockito-inline:2.28.3") { exclude group: 'org.objenesis' } + androidTestImplementation "org.objenesis:objenesis:2.6" androidTestImplementation "com.noveogroup.android:android-logger:$android_logger_ver" androidTestImplementation "com.fasterxml.jackson.core:jackson-databind:$jacksonversion" } From b83336208c2c5c8dae6cd6c12b7807ddadcae29b Mon Sep 17 00:00:00 2001 From: Jae Kim Date: Wed, 6 May 2026 14:24:09 -0700 Subject: [PATCH 09/14] clean up --- CHANGELOG.md | 18 ------------------ README.md | 2 +- 2 files changed, 1 insertion(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4e21204e..3aa26feb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,23 +1,5 @@ # Optimizely Android X SDK Changelog -## 5.2.0 -May 5, 2026 - -### New Features - -**Feature Rollout**: Added support for Feature Rollouts, a new experiment type -combining Targeted Delivery simplicity with A/B test measurement capabilities. -Feature Rollouts enable progressive rollouts with full impact analytics, metric tracking, -and confidence intervals. -See [Feature Rollout docs](https://support.optimizely.com/hc/en-us/articles/45552846481037-Run-Feature-Rollouts-in-Feature-Experimentation) for more information. - -- Update to use the Optimizely [Java SDK 4.4.0](https://github.com/optimizely/java-sdk/releases/tag/4.4.0) - -### Fixes and Improvements - -- Update cmab error handling ([#522](https://github.com/optimizely/android-sdk/pull/522)) - - ## 5.1.1 January 20th, 2025 diff --git a/README.md b/README.md index 78ee9b48..435f7e0e 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ repositories { } dependencies { - implementation 'com.optimizely.ab:android-sdk:5.2.0' + implementation 'com.optimizely.ab:android-sdk:5.1.0' } ``` From 865251f3ea3990403dce0d474573d437fcbb7816 Mon Sep 17 00:00:00 2001 From: Jae Kim Date: Wed, 6 May 2026 15:56:33 -0700 Subject: [PATCH 10/14] fix AVD target versions --- .github/workflows/android.yml | 9 +++++---- android-sdk/build.gradle | 3 ++- .../optimizely/ab/android/sdk/OptimizelyManagerTest.java | 4 ++-- .../mockito-extensions/org.mockito.plugins.MockMaker | 2 +- datafile-handler/build.gradle | 3 ++- .../datafile_handler/BackgroundWatchersCacheTest.java | 2 +- .../mockito-extensions/org.mockito.plugins.MockMaker | 2 +- event-handler/build.gradle | 3 ++- .../mockito-extensions/org.mockito.plugins.MockMaker | 2 +- odp/build.gradle | 3 ++- .../mockito-extensions/org.mockito.plugins.MockMaker | 2 +- shared/build.gradle | 3 ++- .../mockito-extensions/org.mockito.plugins.MockMaker | 2 +- user-profile/build.gradle | 3 ++- .../mockito-extensions/org.mockito.plugins.MockMaker | 2 +- 15 files changed, 26 insertions(+), 19 deletions(-) diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml index 752416d8..f43b6805 100644 --- a/.github/workflows/android.yml +++ b/.github/workflows/android.yml @@ -81,11 +81,9 @@ jobs: strategy: fail-fast: false matrix: - # 21 is too old (not properly supported by github) + # API 21-26: not reliably supported by GitHub Actions (emulator boot failures observed on API 25) + # API 27 is the lowest level that boots consistently on GitHub-hosted runners include: - - api-level: 25 - arch: x86 - target: google_apis - api-level: 27 arch: x86 target: google_apis @@ -95,6 +93,9 @@ jobs: - api-level: 33 arch: x86_64 target: google_apis + - api-level: 36 + arch: x86_64 + target: google_apis steps: - name: checkout uses: actions/checkout@v4 diff --git a/android-sdk/build.gradle b/android-sdk/build.gradle index acd0f228..2e98595c 100644 --- a/android-sdk/build.gradle +++ b/android-sdk/build.gradle @@ -39,7 +39,7 @@ android { } packagingOptions { resources { - pickFirsts += ['mockito-extensions/org.mockito.plugins.MockMaker'] + pickFirsts += ['mockito-extensions/org.mockito.plugins.MockMaker', 'mockito-extensions/org.mockito.plugins.StackTraceCleanerProvider'] } } testOptions { @@ -111,6 +111,7 @@ dependencies { androidTestImplementation("org.mockito:mockito-core:$mockito_ver_sdk_module") { exclude group: 'org.objenesis' } androidTestImplementation("org.mockito:mockito-android:$mockito_ver_sdk_module") { exclude group: 'org.objenesis' } androidTestImplementation("com.linkedin.dexmaker:dexmaker-mockito-inline:2.28.3") { exclude group: 'org.objenesis' } + androidTestImplementation("com.linkedin.dexmaker:dexmaker-mockito:2.28.3") { exclude group: 'org.objenesis' } androidTestImplementation "org.objenesis:objenesis:2.6" androidTestImplementation "com.noveogroup.android:android-logger:$android_logger_ver" androidTestImplementation "com.google.code.gson:gson:$gson_ver" diff --git a/android-sdk/src/androidTest/java/com/optimizely/ab/android/sdk/OptimizelyManagerTest.java b/android-sdk/src/androidTest/java/com/optimizely/ab/android/sdk/OptimizelyManagerTest.java index 0478d959..f8d4f1f8 100644 --- a/android-sdk/src/androidTest/java/com/optimizely/ab/android/sdk/OptimizelyManagerTest.java +++ b/android-sdk/src/androidTest/java/com/optimizely/ab/android/sdk/OptimizelyManagerTest.java @@ -824,7 +824,7 @@ public void initializeAsyncCallbackInBackgroundThread() throws InterruptedExcept } ); - boolean completed = latch.await(1, TimeUnit.SECONDS); + boolean completed = latch.await(5, TimeUnit.SECONDS); if (!completed) { fail("OptimizelyStartListener thread checking failed"); } @@ -855,7 +855,7 @@ public void initializeAsyncCallbackInMainThread() throws InterruptedException { } ); - boolean completed = latch.await(1, TimeUnit.SECONDS); + boolean completed = latch.await(5, TimeUnit.SECONDS); if (!completed) { fail("OptimizelyStartListener thread checking failed"); } diff --git a/android-sdk/src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker b/android-sdk/src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker index 7d92259b..06a696bc 100644 --- a/android-sdk/src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker +++ b/android-sdk/src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker @@ -1 +1 @@ -com.android.dx.mockito.inline.InlineDexmakerMockMaker +com.android.dx.mockito.DexmakerMockMaker diff --git a/datafile-handler/build.gradle b/datafile-handler/build.gradle index e1c0021e..265ba7b7 100644 --- a/datafile-handler/build.gradle +++ b/datafile-handler/build.gradle @@ -41,7 +41,7 @@ android { } packagingOptions { resources { - pickFirsts += ['mockito-extensions/org.mockito.plugins.MockMaker'] + pickFirsts += ['mockito-extensions/org.mockito.plugins.MockMaker', 'mockito-extensions/org.mockito.plugins.StackTraceCleanerProvider'] } } } @@ -68,6 +68,7 @@ dependencies { androidTestImplementation("org.mockito:mockito-core:$mockito_ver_sdk_module") { exclude group: 'org.objenesis' } androidTestImplementation("org.mockito:mockito-android:$mockito_ver_sdk_module") { exclude group: 'org.objenesis' } androidTestImplementation("com.linkedin.dexmaker:dexmaker-mockito-inline:2.28.3") { exclude group: 'org.objenesis' } + androidTestImplementation("com.linkedin.dexmaker:dexmaker-mockito:2.28.3") { exclude group: 'org.objenesis' } androidTestImplementation "org.objenesis:objenesis:2.6" androidTestImplementation "com.noveogroup.android:android-logger:$android_logger_ver" androidTestImplementation "com.fasterxml.jackson.core:jackson-databind:$jacksonversion" diff --git a/datafile-handler/src/androidTest/java/com/optimizely/ab/android/datafile_handler/BackgroundWatchersCacheTest.java b/datafile-handler/src/androidTest/java/com/optimizely/ab/android/datafile_handler/BackgroundWatchersCacheTest.java index 9c51b8f5..0b95b058 100644 --- a/datafile-handler/src/androidTest/java/com/optimizely/ab/android/datafile_handler/BackgroundWatchersCacheTest.java +++ b/datafile-handler/src/androidTest/java/com/optimizely/ab/android/datafile_handler/BackgroundWatchersCacheTest.java @@ -59,7 +59,7 @@ public void setup() { @After public void tearDown() { - cache.delete(BackgroundWatchersCache.BACKGROUND_WATCHERS_FILE_NAME); + if (cache != null) cache.delete(BackgroundWatchersCache.BACKGROUND_WATCHERS_FILE_NAME); } @Test diff --git a/datafile-handler/src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker b/datafile-handler/src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker index 7d92259b..06a696bc 100644 --- a/datafile-handler/src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker +++ b/datafile-handler/src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker @@ -1 +1 @@ -com.android.dx.mockito.inline.InlineDexmakerMockMaker +com.android.dx.mockito.DexmakerMockMaker diff --git a/event-handler/build.gradle b/event-handler/build.gradle index 79b8bbc5..79ec00ee 100644 --- a/event-handler/build.gradle +++ b/event-handler/build.gradle @@ -49,7 +49,7 @@ android { packagingOptions { resources { - pickFirsts += ['mockito-extensions/org.mockito.plugins.MockMaker'] + pickFirsts += ['mockito-extensions/org.mockito.plugins.MockMaker', 'mockito-extensions/org.mockito.plugins.StackTraceCleanerProvider'] } } } @@ -77,6 +77,7 @@ dependencies { androidTestImplementation("org.mockito:mockito-core:$mockito_ver_sdk_module") { exclude group: 'org.objenesis' } androidTestImplementation("org.mockito:mockito-android:$mockito_ver_sdk_module") { exclude group: 'org.objenesis' } androidTestImplementation("com.linkedin.dexmaker:dexmaker-mockito-inline:2.28.3") { exclude group: 'org.objenesis' } + androidTestImplementation("com.linkedin.dexmaker:dexmaker-mockito:2.28.3") { exclude group: 'org.objenesis' } androidTestImplementation "org.objenesis:objenesis:2.6" androidTestImplementation "com.noveogroup.android:android-logger:$android_logger_ver" androidTestImplementation "com.fasterxml.jackson.core:jackson-databind:$jacksonversion" diff --git a/event-handler/src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker b/event-handler/src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker index 7d92259b..06a696bc 100644 --- a/event-handler/src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker +++ b/event-handler/src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker @@ -1 +1 @@ -com.android.dx.mockito.inline.InlineDexmakerMockMaker +com.android.dx.mockito.DexmakerMockMaker diff --git a/odp/build.gradle b/odp/build.gradle index ffed0841..0d8b715d 100644 --- a/odp/build.gradle +++ b/odp/build.gradle @@ -45,7 +45,7 @@ android { buildToolsVersion build_tools_version packagingOptions { resources { - pickFirsts += ['mockito-extensions/org.mockito.plugins.MockMaker'] + pickFirsts += ['mockito-extensions/org.mockito.plugins.MockMaker', 'mockito-extensions/org.mockito.plugins.StackTraceCleanerProvider'] } } } @@ -75,6 +75,7 @@ dependencies { androidTestImplementation("org.mockito:mockito-core:$mockito_ver_sdk_module") { exclude group: 'org.objenesis' } androidTestImplementation("org.mockito:mockito-android:$mockito_ver_sdk_module") { exclude group: 'org.objenesis' } androidTestImplementation("com.linkedin.dexmaker:dexmaker-mockito-inline:2.28.3") { exclude group: 'org.objenesis' } + androidTestImplementation("com.linkedin.dexmaker:dexmaker-mockito:2.28.3") { exclude group: 'org.objenesis' } androidTestImplementation "org.objenesis:objenesis:2.6" androidTestImplementation "org.slf4j:slf4j-api:$slf4j_ver" } diff --git a/odp/src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker b/odp/src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker index 7d92259b..06a696bc 100644 --- a/odp/src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker +++ b/odp/src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker @@ -1 +1 @@ -com.android.dx.mockito.inline.InlineDexmakerMockMaker +com.android.dx.mockito.DexmakerMockMaker diff --git a/shared/build.gradle b/shared/build.gradle index 813c6419..bc1fde92 100644 --- a/shared/build.gradle +++ b/shared/build.gradle @@ -44,7 +44,7 @@ android { buildToolsVersion build_tools_version packagingOptions { resources { - pickFirsts += ['mockito-extensions/org.mockito.plugins.MockMaker'] + pickFirsts += ['mockito-extensions/org.mockito.plugins.MockMaker', 'mockito-extensions/org.mockito.plugins.StackTraceCleanerProvider'] } } } @@ -84,6 +84,7 @@ dependencies { androidTestImplementation("org.mockito:mockito-core:$mockito_ver_sdk_module") { exclude group: 'org.objenesis' } androidTestImplementation("org.mockito:mockito-android:$mockito_ver_sdk_module") { exclude group: 'org.objenesis' } androidTestImplementation("com.linkedin.dexmaker:dexmaker-mockito-inline:2.28.3") { exclude group: 'org.objenesis' } + androidTestImplementation("com.linkedin.dexmaker:dexmaker-mockito:2.28.3") { exclude group: 'org.objenesis' } androidTestImplementation "org.objenesis:objenesis:2.6" androidTestImplementation "com.noveogroup.android:android-logger:$android_logger_ver" androidTestImplementation "com.fasterxml.jackson.core:jackson-databind:$jacksonversion" diff --git a/shared/src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker b/shared/src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker index 7d92259b..06a696bc 100644 --- a/shared/src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker +++ b/shared/src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker @@ -1 +1 @@ -com.android.dx.mockito.inline.InlineDexmakerMockMaker +com.android.dx.mockito.DexmakerMockMaker diff --git a/user-profile/build.gradle b/user-profile/build.gradle index 567830dc..7134749d 100644 --- a/user-profile/build.gradle +++ b/user-profile/build.gradle @@ -41,7 +41,7 @@ android { } packagingOptions { resources { - pickFirsts += ['mockito-extensions/org.mockito.plugins.MockMaker'] + pickFirsts += ['mockito-extensions/org.mockito.plugins.MockMaker', 'mockito-extensions/org.mockito.plugins.StackTraceCleanerProvider'] } } } @@ -69,6 +69,7 @@ dependencies { androidTestImplementation("org.mockito:mockito-core:$mockito_ver_sdk_module") { exclude group: 'org.objenesis' } androidTestImplementation("org.mockito:mockito-android:$mockito_ver_sdk_module") { exclude group: 'org.objenesis' } androidTestImplementation("com.linkedin.dexmaker:dexmaker-mockito-inline:2.28.3") { exclude group: 'org.objenesis' } + androidTestImplementation("com.linkedin.dexmaker:dexmaker-mockito:2.28.3") { exclude group: 'org.objenesis' } androidTestImplementation "org.objenesis:objenesis:2.6" androidTestImplementation "com.noveogroup.android:android-logger:$android_logger_ver" androidTestImplementation "com.fasterxml.jackson.core:jackson-databind:$jacksonversion" diff --git a/user-profile/src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker b/user-profile/src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker index 7d92259b..06a696bc 100644 --- a/user-profile/src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker +++ b/user-profile/src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker @@ -1 +1 @@ -com.android.dx.mockito.inline.InlineDexmakerMockMaker +com.android.dx.mockito.DexmakerMockMaker From c484a38b24c834ca357e7bed210e649203e4ee8e Mon Sep 17 00:00:00 2001 From: Jae Kim Date: Wed, 6 May 2026 16:23:26 -0700 Subject: [PATCH 11/14] clean up --- .github/workflows/android.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml index f43b6805..84ea7fac 100644 --- a/.github/workflows/android.yml +++ b/.github/workflows/android.yml @@ -82,14 +82,12 @@ jobs: fail-fast: false matrix: # API 21-26: not reliably supported by GitHub Actions (emulator boot failures observed on API 25) + # API 29: removed due to emulator hang issues on GitHub-hosted runners # API 27 is the lowest level that boots consistently on GitHub-hosted runners include: - api-level: 27 arch: x86 target: google_apis - - api-level: 29 - arch: x86_64 - target: default - api-level: 33 arch: x86_64 target: google_apis From d3a5dc9e8b77e486a97734d10186eacdd8be276a Mon Sep 17 00:00:00 2001 From: Jae Kim Date: Thu, 7 May 2026 11:32:45 -0700 Subject: [PATCH 12/14] fix per copilot review --- android-sdk/build.gradle | 2 +- .../resources/mockito-extensions/org.mockito.plugins.MockMaker | 2 +- .../resources/mockito-extensions/org.mockito.plugins.MockMaker | 2 +- .../resources/mockito-extensions/org.mockito.plugins.MockMaker | 2 +- .../resources/mockito-extensions/org.mockito.plugins.MockMaker | 2 +- .../resources/mockito-extensions/org.mockito.plugins.MockMaker | 2 +- .../resources/mockito-extensions/org.mockito.plugins.MockMaker | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/android-sdk/build.gradle b/android-sdk/build.gradle index 2e98595c..de91ece1 100644 --- a/android-sdk/build.gradle +++ b/android-sdk/build.gradle @@ -100,7 +100,7 @@ dependencies { androidTestImplementation "androidx.work:work-testing:$work_runtime" androidTestUtil "androidx.test:orchestrator:1.5.1" - androidTestUtil "androidx.test.services:test-services:1.5.0" + androidTestUtil "androidx.test.services:test-services:1.5.1" androidTestImplementation "androidx.test.ext:junit:$androidx_test_junit" androidTestImplementation "androidx.test.espresso:espresso-core:$espresso_ver" // Set this dependency to use JUnit 4 rules diff --git a/android-sdk/src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker b/android-sdk/src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker index 06a696bc..7d92259b 100644 --- a/android-sdk/src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker +++ b/android-sdk/src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker @@ -1 +1 @@ -com.android.dx.mockito.DexmakerMockMaker +com.android.dx.mockito.inline.InlineDexmakerMockMaker diff --git a/datafile-handler/src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker b/datafile-handler/src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker index 06a696bc..7d92259b 100644 --- a/datafile-handler/src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker +++ b/datafile-handler/src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker @@ -1 +1 @@ -com.android.dx.mockito.DexmakerMockMaker +com.android.dx.mockito.inline.InlineDexmakerMockMaker diff --git a/event-handler/src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker b/event-handler/src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker index 06a696bc..7d92259b 100644 --- a/event-handler/src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker +++ b/event-handler/src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker @@ -1 +1 @@ -com.android.dx.mockito.DexmakerMockMaker +com.android.dx.mockito.inline.InlineDexmakerMockMaker diff --git a/odp/src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker b/odp/src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker index 06a696bc..7d92259b 100644 --- a/odp/src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker +++ b/odp/src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker @@ -1 +1 @@ -com.android.dx.mockito.DexmakerMockMaker +com.android.dx.mockito.inline.InlineDexmakerMockMaker diff --git a/shared/src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker b/shared/src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker index 06a696bc..7d92259b 100644 --- a/shared/src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker +++ b/shared/src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker @@ -1 +1 @@ -com.android.dx.mockito.DexmakerMockMaker +com.android.dx.mockito.inline.InlineDexmakerMockMaker diff --git a/user-profile/src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker b/user-profile/src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker index 06a696bc..7d92259b 100644 --- a/user-profile/src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker +++ b/user-profile/src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker @@ -1 +1 @@ -com.android.dx.mockito.DexmakerMockMaker +com.android.dx.mockito.inline.InlineDexmakerMockMaker From d74d8c67c4631e3d240a398b91d5414197542547 Mon Sep 17 00:00:00 2001 From: Jae Kim Date: Thu, 7 May 2026 12:40:40 -0700 Subject: [PATCH 13/14] clean up --- android-sdk/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/android-sdk/build.gradle b/android-sdk/build.gradle index de91ece1..b7e5e533 100644 --- a/android-sdk/build.gradle +++ b/android-sdk/build.gradle @@ -99,8 +99,8 @@ dependencies { testImplementation "com.noveogroup.android:android-logger:$android_logger_ver" androidTestImplementation "androidx.work:work-testing:$work_runtime" - androidTestUtil "androidx.test:orchestrator:1.5.1" - androidTestUtil "androidx.test.services:test-services:1.5.1" + androidTestUtil "androidx.test:orchestrator:1.5.0" + androidTestUtil "androidx.test.services:test-services:1.5.0" androidTestImplementation "androidx.test.ext:junit:$androidx_test_junit" androidTestImplementation "androidx.test.espresso:espresso-core:$espresso_ver" // Set this dependency to use JUnit 4 rules From 45a34202b0211fa5fce583905c4c52d62302a91a Mon Sep 17 00:00:00 2001 From: Jae Kim Date: Thu, 7 May 2026 13:46:56 -0700 Subject: [PATCH 14/14] clean up --- .github/workflows/android.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml index 84ea7fac..16312c5a 100644 --- a/.github/workflows/android.yml +++ b/.github/workflows/android.yml @@ -83,9 +83,9 @@ jobs: matrix: # API 21-26: not reliably supported by GitHub Actions (emulator boot failures observed on API 25) # API 29: removed due to emulator hang issues on GitHub-hosted runners - # API 27 is the lowest level that boots consistently on GitHub-hosted runners + # API 28 is the lowest level that boots consistently on GitHub-hosted runners include: - - api-level: 27 + - api-level: 28 arch: x86 target: google_apis - api-level: 33