From 3b9aab1051034f466470e7c61f3cd0f4730b44a2 Mon Sep 17 00:00:00 2001 From: Jae Kim Date: Thu, 25 Mar 2021 10:46:18 -0700 Subject: [PATCH 01/20] remove multiDexEnabled from test-app for WorkManager NotFound error --- test-app/build.gradle | 1 - 1 file changed, 1 deletion(-) diff --git a/test-app/build.gradle b/test-app/build.gradle index 58241157..e928a5e3 100644 --- a/test-app/build.gradle +++ b/test-app/build.gradle @@ -16,7 +16,6 @@ android { versionCode 1 versionName "1.0" testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner' - multiDexEnabled true } testOptions { unitTests.returnDefaultValues = true From a456233190c5f2b0bac02388b33622088cb06d7c Mon Sep 17 00:00:00 2001 From: Jae Kim Date: Thu, 25 Mar 2021 13:23:12 -0700 Subject: [PATCH 02/20] cleanup test-app --- .../ab/android/test_app/MyApplication.kt | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/test-app/src/main/java/com/optimizely/ab/android/test_app/MyApplication.kt b/test-app/src/main/java/com/optimizely/ab/android/test_app/MyApplication.kt index b485d2b0..08ce7c2a 100644 --- a/test-app/src/main/java/com/optimizely/ab/android/test_app/MyApplication.kt +++ b/test-app/src/main/java/com/optimizely/ab/android/test_app/MyApplication.kt @@ -40,11 +40,8 @@ class MyApplication : Application() { attributes["semanticVersioning"] = "2.1.0" return attributes - }// comment this out to get a brand new user id every time this function is called. - // useful for incrementing results page count for QA purposes + } - // this is a convenience method that creates and persists an anonymous user id, - // which we need to pass into the activate and track calls val anonUserId: String get() { // this is a convenience method that creates and persists an anonymous user id, @@ -70,9 +67,9 @@ class MyApplication : Application() { // This app is built against a real Optimizely project with real experiments set. Automated // espresso tests are run against this project id. Changing it will make the Optimizely // must match the project id of the compiled in Optimizely data file in rest/raw/data_file.json. - val builder = OptimizelyManager.builder() - optimizelyManager = builder.withEventDispatchInterval(60L) - .withDatafileDownloadInterval(TimeUnit.MINUTES.toSeconds(15)) + optimizelyManager = OptimizelyManager.builder() + .withEventDispatchInterval(60L, TimeUnit.SECONDS) + .withDatafileDownloadInterval(15, TimeUnit.MINUTES) .withSDKKey("FCnSegiEkRry9rhVMroit4") .build(applicationContext) } @@ -90,10 +87,4 @@ class MyApplication : Application() { private val location: Any? private get() = null - companion object { - // Project ID owned by mobile-test@optimizely.com - // if you'd like to configure your own experiment please check out https://developers.optimizely.com/x/solutions/sdks/getting-started/index.html?language=android&platform=mobile - // to create your own project and experiment. Then just replace your project ID below. - const val PROJECT_ID = "10554895220" - } } \ No newline at end of file From 8993488483ea564b3f668b01a78db763b9ab7665 Mon Sep 17 00:00:00 2001 From: Jae Kim Date: Thu, 1 Apr 2021 10:43:01 -0700 Subject: [PATCH 03/20] add TLS for API19- devices --- .../datafile_handler/DatafileClient.java | 2 + .../ab/android/event_handler/EventClient.java | 4 +- .../optimizely/ab/android/shared/Client.java | 39 +++++++++++ .../ab/android/shared/TLSSocketFactory.java | 64 +++++++++++++++++++ test-app/build.gradle | 15 +++-- 5 files changed, 116 insertions(+), 8 deletions(-) create mode 100644 shared/src/main/java/com/optimizely/ab/android/shared/TLSSocketFactory.java diff --git a/datafile-handler/src/main/java/com/optimizely/ab/android/datafile_handler/DatafileClient.java b/datafile-handler/src/main/java/com/optimizely/ab/android/datafile_handler/DatafileClient.java index 5ddf8d9c..0719afb9 100644 --- a/datafile-handler/src/main/java/com/optimizely/ab/android/datafile_handler/DatafileClient.java +++ b/datafile-handler/src/main/java/com/optimizely/ab/android/datafile_handler/DatafileClient.java @@ -16,6 +16,8 @@ package com.optimizely.ab.android.datafile_handler; +import android.os.Build; + import androidx.annotation.NonNull; import androidx.annotation.Nullable; diff --git a/event-handler/src/main/java/com/optimizely/ab/android/event_handler/EventClient.java b/event-handler/src/main/java/com/optimizely/ab/android/event_handler/EventClient.java index 8812abe4..3f6472a9 100644 --- a/event-handler/src/main/java/com/optimizely/ab/android/event_handler/EventClient.java +++ b/event-handler/src/main/java/com/optimizely/ab/android/event_handler/EventClient.java @@ -74,11 +74,11 @@ public Boolean execute() { return Boolean.FALSE; } } catch (IOException e) { - logger.error("Unable to send event: {}", event, e); + logger.error("Unable to send event: " + event, e); return Boolean.FALSE; } catch (Exception e) { - logger.error("Unable to send event: {}", event, e); + logger.error("Unable to send event: " + event, e); return Boolean.FALSE; } finally { diff --git a/shared/src/main/java/com/optimizely/ab/android/shared/Client.java b/shared/src/main/java/com/optimizely/ab/android/shared/Client.java index 0b558f84..4510ffea 100644 --- a/shared/src/main/java/com/optimizely/ab/android/shared/Client.java +++ b/shared/src/main/java/com/optimizely/ab/android/shared/Client.java @@ -16,6 +16,8 @@ package com.optimizely.ab.android.shared; +import android.os.Build; + import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -26,9 +28,15 @@ import java.net.HttpURLConnection; import java.net.URL; import java.net.URLConnection; +import java.security.SecureRandom; import java.util.Scanner; import java.util.concurrent.TimeUnit; +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSocketFactory; +import javax.net.ssl.TrustManager; + /** * Functionality common to all clients using http connections */ @@ -57,8 +65,36 @@ public Client(@NonNull OptlyStorage optlyStorage, @NonNull Logger logger) { * @return an open {@link HttpURLConnection} */ @Nullable +// public HttpURLConnection openConnection(URL url) { +// try { +// HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); +// +// // API 21 (LOLLIPOP)+ supposed to use TLS1.2 as default, but some API-21 devices still fail, so include it here. +// if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.LOLLIPOP) { +// if (urlConnection instanceof HttpsURLConnection) { +// SSLContext sc = SSLContext.getInstance("TLSv1.2"); +// sc.init(null, null, null); +// SSLSocketFactory sslSocketFactory = new TLSSocketFactory(sc.getSocketFactory()); +// ((HttpsURLConnection) urlConnection).setSSLSocketFactory(sslSocketFactory); +// } +// } +// +// return urlConnection; +// } catch (Exception e) { +// logger.warn("Error making request to {}.", url); +// } +// return null; +// } public HttpURLConnection openConnection(URL url) { try { + // API 21 (LOLLIPOP)+ supposed to use TLS1.2 as default, but some API-21 devices still fail, so include it here. + if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.LOLLIPOP) { + SSLContext sslContext = SSLContext.getInstance("TLSv1.2"); + sslContext.init(null, null, null); + SSLSocketFactory sslSocketFactory = new TLSSocketFactory(sslContext.getSocketFactory()); + HttpsURLConnection.setDefaultSSLSocketFactory(sslSocketFactory); + } + return (HttpURLConnection) url.openConnection(); } catch (Exception e) { logger.warn("Error making request to {}.", url); @@ -66,6 +102,9 @@ public HttpURLConnection openConnection(URL url) { return null; } + + + /** * Adds a if-modified-since header to the open {@link URLConnection} if this value is * stored in {@link OptlyStorage}. diff --git a/shared/src/main/java/com/optimizely/ab/android/shared/TLSSocketFactory.java b/shared/src/main/java/com/optimizely/ab/android/shared/TLSSocketFactory.java new file mode 100644 index 00000000..cc3fbb8f --- /dev/null +++ b/shared/src/main/java/com/optimizely/ab/android/shared/TLSSocketFactory.java @@ -0,0 +1,64 @@ +package com.optimizely.ab.android.shared; + +import java.io.IOException; +import java.net.InetAddress; +import java.net.Socket; +import java.net.UnknownHostException; + +import javax.net.ssl.SSLSocket; +import javax.net.ssl.SSLSocketFactory; + +// Android uses TLS1.2 as a default for API 21+ +// This factory is to set TLS1.2 as default for older devices (datafile download and event uploading) + +public class TLSSocketFactory extends SSLSocketFactory { + private static final String[] TLS_V12_ONLY = {"TLSv1.2"}; + + final SSLSocketFactory delegate; + + public TLSSocketFactory(SSLSocketFactory base) { + this.delegate = base; + } + + @Override + public String[] getDefaultCipherSuites() { + return delegate.getDefaultCipherSuites(); + } + + @Override + public String[] getSupportedCipherSuites() { + return delegate.getSupportedCipherSuites(); + } + + @Override + public Socket createSocket(Socket s, String host, int port, boolean autoClose) throws IOException { + return patch(delegate.createSocket(s, host, port, autoClose)); + } + + @Override + public Socket createSocket(String host, int port) throws IOException, UnknownHostException { + return patch(delegate.createSocket(host, port)); + } + + @Override + public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException, UnknownHostException { + return patch(delegate.createSocket(host, port, localHost, localPort)); + } + + @Override + public Socket createSocket(InetAddress host, int port) throws IOException { + return patch(delegate.createSocket(host, port)); + } + + @Override + public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException { + return patch(delegate.createSocket(address, port, localAddress, localPort)); + } + + private Socket patch(Socket s) { + if (s instanceof SSLSocket) { + ((SSLSocket) s).setEnabledProtocols(TLS_V12_ONLY); + } + return s; + } +} \ No newline at end of file diff --git a/test-app/build.gradle b/test-app/build.gradle index e928a5e3..d5e954ac 100644 --- a/test-app/build.gradle +++ b/test-app/build.gradle @@ -43,18 +43,21 @@ dependencies { // Includes the Optimizely X Full Stack Java SDK, event handler, and user profile implementation (project(':android-sdk')) { exclude group: 'com.google.code.gson', module:'gson' - // exclude group: 'com.noveogroup.android', module:'android-logger' + // exclude group: 'com.noveogroup.android', module:'android-logger' } implementation "com.noveogroup.android:android-logger:$android_logger_ver" - // implementation 'com.optimizely.ab:android-sdk:1.0.0' - implementation 'androidx.appcompat:appcompat:1.2.0' - implementation 'com.google.android.material:material:1.2.1' + // implementation "com.optimizely.ab:android-sdk:1.0.0" + implementation "androidx.appcompat:appcompat:1.2.0" + implementation "com.google.android.material:material:1.2.1" // EXAMPLE REPLACE noveogroup android-looger with slf4j-android logger // https://mvnrepository.com/artifact/org.slf4j/slf4j-android - //implementation group: 'org.slf4j', name: 'slf4j-android', version: '1.7.25' + //implementation "org.slf4j:slf4j-android:1.7.25" // EXAMPLE REPLACE gson json parsing with jackson-databind json parsing. - implementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: "$jacksonversion" + implementation "com.fasterxml.jackson.core:jackson-databind:$jacksonversion" + + //implementation "com.google.code.gson:gson:$gson_ver" + //implementation 'com.google.code.findbugs:annotations:3.0.0' testImplementation "junit:junit:$junit_ver" testImplementation "org.mockito:mockito-core:$mockito_ver" From 1547e03c73b38a8318eed6462fa6cbe5daf2a5d9 Mon Sep 17 00:00:00 2001 From: Jae Kim Date: Thu, 1 Apr 2021 17:44:11 -0700 Subject: [PATCH 04/20] clean up TLSSocketFactory --- .../optimizely/ab/android/shared/Client.java | 25 +----------- .../ab/android/shared/TLSSocketFactory.java | 40 +++++++++++-------- 2 files changed, 25 insertions(+), 40 deletions(-) diff --git a/shared/src/main/java/com/optimizely/ab/android/shared/Client.java b/shared/src/main/java/com/optimizely/ab/android/shared/Client.java index 4510ffea..dbb91526 100644 --- a/shared/src/main/java/com/optimizely/ab/android/shared/Client.java +++ b/shared/src/main/java/com/optimizely/ab/android/shared/Client.java @@ -65,33 +65,13 @@ public Client(@NonNull OptlyStorage optlyStorage, @NonNull Logger logger) { * @return an open {@link HttpURLConnection} */ @Nullable -// public HttpURLConnection openConnection(URL url) { -// try { -// HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); -// -// // API 21 (LOLLIPOP)+ supposed to use TLS1.2 as default, but some API-21 devices still fail, so include it here. -// if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.LOLLIPOP) { -// if (urlConnection instanceof HttpsURLConnection) { -// SSLContext sc = SSLContext.getInstance("TLSv1.2"); -// sc.init(null, null, null); -// SSLSocketFactory sslSocketFactory = new TLSSocketFactory(sc.getSocketFactory()); -// ((HttpsURLConnection) urlConnection).setSSLSocketFactory(sslSocketFactory); -// } -// } -// -// return urlConnection; -// } catch (Exception e) { -// logger.warn("Error making request to {}.", url); -// } -// return null; -// } public HttpURLConnection openConnection(URL url) { try { // API 21 (LOLLIPOP)+ supposed to use TLS1.2 as default, but some API-21 devices still fail, so include it here. if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.LOLLIPOP) { SSLContext sslContext = SSLContext.getInstance("TLSv1.2"); sslContext.init(null, null, null); - SSLSocketFactory sslSocketFactory = new TLSSocketFactory(sslContext.getSocketFactory()); + SSLSocketFactory sslSocketFactory = new TLSSocketFactory(); HttpsURLConnection.setDefaultSSLSocketFactory(sslSocketFactory); } @@ -102,9 +82,6 @@ public HttpURLConnection openConnection(URL url) { return null; } - - - /** * Adds a if-modified-since header to the open {@link URLConnection} if this value is * stored in {@link OptlyStorage}. diff --git a/shared/src/main/java/com/optimizely/ab/android/shared/TLSSocketFactory.java b/shared/src/main/java/com/optimizely/ab/android/shared/TLSSocketFactory.java index cc3fbb8f..3543a2ab 100644 --- a/shared/src/main/java/com/optimizely/ab/android/shared/TLSSocketFactory.java +++ b/shared/src/main/java/com/optimizely/ab/android/shared/TLSSocketFactory.java @@ -4,7 +4,10 @@ import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; +import java.security.KeyManagementException; +import java.security.NoSuchAlgorithmException; +import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSocket; import javax.net.ssl.SSLSocketFactory; @@ -12,53 +15,58 @@ // This factory is to set TLS1.2 as default for older devices (datafile download and event uploading) public class TLSSocketFactory extends SSLSocketFactory { - private static final String[] TLS_V12_ONLY = {"TLSv1.2"}; + private SSLSocketFactory internalSSLSocketFactory; - final SSLSocketFactory delegate; - - public TLSSocketFactory(SSLSocketFactory base) { - this.delegate = base; + public TLSSocketFactory() throws KeyManagementException, NoSuchAlgorithmException { + SSLContext context = SSLContext.getInstance("TLS"); + context.init(null, null, null); + internalSSLSocketFactory = context.getSocketFactory(); } @Override public String[] getDefaultCipherSuites() { - return delegate.getDefaultCipherSuites(); + return internalSSLSocketFactory.getDefaultCipherSuites(); } @Override public String[] getSupportedCipherSuites() { - return delegate.getSupportedCipherSuites(); + return internalSSLSocketFactory.getSupportedCipherSuites(); + } + + @Override + public Socket createSocket() throws IOException { + return enableTLSOnSocket(internalSSLSocketFactory.createSocket()); } @Override public Socket createSocket(Socket s, String host, int port, boolean autoClose) throws IOException { - return patch(delegate.createSocket(s, host, port, autoClose)); + return enableTLSOnSocket(internalSSLSocketFactory.createSocket(s, host, port, autoClose)); } @Override public Socket createSocket(String host, int port) throws IOException, UnknownHostException { - return patch(delegate.createSocket(host, port)); + return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port)); } @Override public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException, UnknownHostException { - return patch(delegate.createSocket(host, port, localHost, localPort)); + return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port, localHost, localPort)); } @Override public Socket createSocket(InetAddress host, int port) throws IOException { - return patch(delegate.createSocket(host, port)); + return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port)); } @Override public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException { - return patch(delegate.createSocket(address, port, localAddress, localPort)); + return enableTLSOnSocket(internalSSLSocketFactory.createSocket(address, port, localAddress, localPort)); } - private Socket patch(Socket s) { - if (s instanceof SSLSocket) { - ((SSLSocket) s).setEnabledProtocols(TLS_V12_ONLY); + private Socket enableTLSOnSocket(Socket socket) { + if(socket != null && (socket instanceof SSLSocket)) { + ((SSLSocket)socket).setEnabledProtocols(new String[] {"TLSv1.2"}); } - return s; + return socket; } } \ No newline at end of file From 1a92c9e45862fe88e678ae26a6d3aa9d6047f8ee Mon Sep 17 00:00:00 2001 From: Jae Kim Date: Tue, 4 May 2021 14:49:23 -0700 Subject: [PATCH 05/20] add javax.annotation and gson dependency for api-16 --- test-app/build.gradle | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/test-app/build.gradle b/test-app/build.gradle index d5e954ac..fec2f50c 100644 --- a/test-app/build.gradle +++ b/test-app/build.gradle @@ -56,8 +56,9 @@ dependencies { // EXAMPLE REPLACE gson json parsing with jackson-databind json parsing. implementation "com.fasterxml.jackson.core:jackson-databind:$jacksonversion" - //implementation "com.google.code.gson:gson:$gson_ver" - //implementation 'com.google.code.findbugs:annotations:3.0.0' + // required by API-16 + implementation "com.google.code.gson:gson:$gson_ver" + implementation 'com.google.code.findbugs:annotations:3.0.0' testImplementation "junit:junit:$junit_ver" testImplementation "org.mockito:mockito-core:$mockito_ver" From b2c4fcb037f25eb463a550f769448f5915e405e2 Mon Sep 17 00:00:00 2001 From: Jae Kim Date: Tue, 4 May 2021 15:00:06 -0700 Subject: [PATCH 06/20] clean up --- .../ab/android/event_handler/EventClient.java | 4 ++-- .../ab/android/shared/TLSSocketFactory.java | 22 +++++++++---------- .../ab/android/test_app/MyApplication.kt | 2 +- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/event-handler/src/main/java/com/optimizely/ab/android/event_handler/EventClient.java b/event-handler/src/main/java/com/optimizely/ab/android/event_handler/EventClient.java index 3f6472a9..8812abe4 100644 --- a/event-handler/src/main/java/com/optimizely/ab/android/event_handler/EventClient.java +++ b/event-handler/src/main/java/com/optimizely/ab/android/event_handler/EventClient.java @@ -74,11 +74,11 @@ public Boolean execute() { return Boolean.FALSE; } } catch (IOException e) { - logger.error("Unable to send event: " + event, e); + logger.error("Unable to send event: {}", event, e); return Boolean.FALSE; } catch (Exception e) { - logger.error("Unable to send event: " + event, e); + logger.error("Unable to send event: {}", event, e); return Boolean.FALSE; } finally { diff --git a/shared/src/main/java/com/optimizely/ab/android/shared/TLSSocketFactory.java b/shared/src/main/java/com/optimizely/ab/android/shared/TLSSocketFactory.java index 3543a2ab..db3513df 100644 --- a/shared/src/main/java/com/optimizely/ab/android/shared/TLSSocketFactory.java +++ b/shared/src/main/java/com/optimizely/ab/android/shared/TLSSocketFactory.java @@ -15,52 +15,52 @@ // This factory is to set TLS1.2 as default for older devices (datafile download and event uploading) public class TLSSocketFactory extends SSLSocketFactory { - private SSLSocketFactory internalSSLSocketFactory; + private SSLSocketFactory sslSocketFactory; public TLSSocketFactory() throws KeyManagementException, NoSuchAlgorithmException { SSLContext context = SSLContext.getInstance("TLS"); context.init(null, null, null); - internalSSLSocketFactory = context.getSocketFactory(); + sslSocketFactory = context.getSocketFactory(); } @Override public String[] getDefaultCipherSuites() { - return internalSSLSocketFactory.getDefaultCipherSuites(); + return sslSocketFactory.getDefaultCipherSuites(); } @Override public String[] getSupportedCipherSuites() { - return internalSSLSocketFactory.getSupportedCipherSuites(); + return sslSocketFactory.getSupportedCipherSuites(); } @Override public Socket createSocket() throws IOException { - return enableTLSOnSocket(internalSSLSocketFactory.createSocket()); + return enableTLSOnSocket(sslSocketFactory.createSocket()); } @Override public Socket createSocket(Socket s, String host, int port, boolean autoClose) throws IOException { - return enableTLSOnSocket(internalSSLSocketFactory.createSocket(s, host, port, autoClose)); + return enableTLSOnSocket(sslSocketFactory.createSocket(s, host, port, autoClose)); } @Override public Socket createSocket(String host, int port) throws IOException, UnknownHostException { - return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port)); + return enableTLSOnSocket(sslSocketFactory.createSocket(host, port)); } @Override public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException, UnknownHostException { - return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port, localHost, localPort)); + return enableTLSOnSocket(sslSocketFactory.createSocket(host, port, localHost, localPort)); } @Override public Socket createSocket(InetAddress host, int port) throws IOException { - return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port)); + return enableTLSOnSocket(sslSocketFactory.createSocket(host, port)); } @Override public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException { - return enableTLSOnSocket(internalSSLSocketFactory.createSocket(address, port, localAddress, localPort)); + return enableTLSOnSocket(sslSocketFactory.createSocket(address, port, localAddress, localPort)); } private Socket enableTLSOnSocket(Socket socket) { @@ -69,4 +69,4 @@ private Socket enableTLSOnSocket(Socket socket) { } return socket; } -} \ No newline at end of file +} diff --git a/test-app/src/main/java/com/optimizely/ab/android/test_app/MyApplication.kt b/test-app/src/main/java/com/optimizely/ab/android/test_app/MyApplication.kt index 08ce7c2a..10ef68e8 100644 --- a/test-app/src/main/java/com/optimizely/ab/android/test_app/MyApplication.kt +++ b/test-app/src/main/java/com/optimizely/ab/android/test_app/MyApplication.kt @@ -87,4 +87,4 @@ class MyApplication : Application() { private val location: Any? private get() = null -} \ No newline at end of file +} From 3e4cde5f5ba3bd490ca53688f0ed638e22f91c05 Mon Sep 17 00:00:00 2001 From: Jae Kim Date: Tue, 4 May 2021 15:23:23 -0700 Subject: [PATCH 07/20] remove HONEYCOMB requirements --- .../android/sdk/OptimizelyClientEngineTest.java | 2 -- .../ab/android/sdk/OptimizelyManagerTest.java | 4 ---- .../ab/android/sdk/OptimizelyManager.java | 2 -- ...elyManagerDatafileServiceConnectionTest.java | 2 -- build.gradle | 17 +++++++---------- .../datafile_handler/DatafileLoaderTest.java | 1 - .../DatafileReschedulerTest.java | 1 - .../datafile_handler/DatafileServiceTest.java | 10 +--------- .../datafile_handler/DatafileLoader.java | 1 - .../datafile_handler/DatafileService.java | 2 -- .../DatafileServiceConnection.java | 1 - .../ab/android/event_handler/EventDAOTest.java | 1 - .../event_handler/EventDispatcherTest.java | 1 - .../EventSQLiteOpenHelperTest.java | 1 - .../ab/android/event_handler/EventDAO.java | 1 - .../event_handler/EventIntentService.java | 1 - .../event_handler/EventSQLiteOpenHelper.java | 1 - .../event_handler/EventReschedulerTest.java | 1 - .../user_profile/DefaultUserProfileService.java | 1 - .../android/user_profile/UserProfileCache.java | 2 -- 20 files changed, 8 insertions(+), 45 deletions(-) diff --git a/android-sdk/src/androidTest/java/com/optimizely/ab/android/sdk/OptimizelyClientEngineTest.java b/android-sdk/src/androidTest/java/com/optimizely/ab/android/sdk/OptimizelyClientEngineTest.java index e19e26a2..94782c5f 100644 --- a/android-sdk/src/androidTest/java/com/optimizely/ab/android/sdk/OptimizelyClientEngineTest.java +++ b/android-sdk/src/androidTest/java/com/optimizely/ab/android/sdk/OptimizelyClientEngineTest.java @@ -34,7 +34,6 @@ @RunWith(AndroidJUnit4.class) public class OptimizelyClientEngineTest { - @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB_MR2) @Test public void testGetClientEngineFromContextAndroidTV() { Context context = mock(Context.class); @@ -44,7 +43,6 @@ public void testGetClientEngineFromContextAndroidTV() { assertEquals(EventBatch.ClientEngine.ANDROID_TV_SDK, OptimizelyClientEngine.getClientEngineFromContext(context)); } - @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB_MR2) @Test public void testGetClientEngineFromContextAndroid() { Context context = mock(Context.class); 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 cc3d6c5a..c4149683 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 @@ -356,7 +356,6 @@ public void stop() { assertNull(optimizelyManager.getOptimizelyStartListener()); } - @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) @Test public void injectOptimizely() { Context context = mock(Context.class); @@ -377,7 +376,6 @@ public void injectOptimizely() { } - @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) @Test public void injectOptimizelyWithDatafileLisener() { Context context = mock(Context.class); @@ -442,7 +440,6 @@ public void injectOptimizelyNullListener() { assertEquals(optimizelyManager.getDatafileConfig().toJSONString(), intent2.getStringExtra(DatafileService.EXTRA_DATAFILE_CONFIG)); } - @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) @Test public void injectOptimizelyHandlesInvalidDatafile() { Context context = mock(Context.class); @@ -472,7 +469,6 @@ public void injectOptimizelyHandlesInvalidDatafile() { assertFalse(optimizelyManager.getOptimizely().isValid()); } - @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) @Test public void injectOptimizelyDoesNotDuplicateCallback() { Context context = mock(Context.class); diff --git a/android-sdk/src/main/java/com/optimizely/ab/android/sdk/OptimizelyManager.java b/android-sdk/src/main/java/com/optimizely/ab/android/sdk/OptimizelyManager.java index f4278e21..45149a3f 100644 --- a/android-sdk/src/main/java/com/optimizely/ab/android/sdk/OptimizelyManager.java +++ b/android-sdk/src/main/java/com/optimizely/ab/android/sdk/OptimizelyManager.java @@ -398,7 +398,6 @@ private String safeLoadResource(Context context, @RawRes final Integer datafileR DatafileLoadedListener getDatafileLoadedListener(final Context context, @RawRes final Integer datafileRes) { return new DatafileLoadedListener() { - @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) @Override public void onDatafileLoaded(@Nullable String datafile) { if (datafile != null && !datafile.isEmpty()) { @@ -516,7 +515,6 @@ private void startDatafileHandler(Context context) { }); } - @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) void injectOptimizely(@NonNull final Context context, final @NonNull UserProfileService userProfileService, @NonNull final String datafile) { diff --git a/android-sdk/src/test/java/com/optimizely/ab/android/sdk/OptimizelyManagerDatafileServiceConnectionTest.java b/android-sdk/src/test/java/com/optimizely/ab/android/sdk/OptimizelyManagerDatafileServiceConnectionTest.java index ca5df932..efc88d40 100644 --- a/android-sdk/src/test/java/com/optimizely/ab/android/sdk/OptimizelyManagerDatafileServiceConnectionTest.java +++ b/android-sdk/src/test/java/com/optimizely/ab/android/sdk/OptimizelyManagerDatafileServiceConnectionTest.java @@ -55,7 +55,6 @@ public void setup() { datafileServiceConnection = new DatafileServiceConnection(optimizelyManager.getDatafileConfig(), context, optimizelyManager.getDatafileLoadedListener(context,null)); } - @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) @Test public void onServiceConnected() { DatafileService.LocalBinder binder = mock(DatafileService.LocalBinder.class); @@ -72,7 +71,6 @@ public void onServiceConnected() { verify(service).getDatafile(eq(sameString), any(DatafileLoader.class), any(DatafileLoadedListener.class)); } - @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) @Test public void onServiceConnectedNullServiceFromBinder() { DatafileService.LocalBinder binder = mock(DatafileService.LocalBinder.class); diff --git a/build.gradle b/build.gradle index 8018fd4e..584c0ab0 100644 --- a/build.gradle +++ b/build.gradle @@ -75,26 +75,23 @@ task clean(type: Delete) { task cleanAllModules () { logger.info("Running clean for all modules") + dependsOn(':android-sdk:clean', ':event-handler:clean', + ':user-profile:clean', ':shared:clean', ':datafile-handler:clean') } -cleanAllModules.dependsOn(':android-sdk:clean', ':event-handler:clean', - ':user-profile:clean', ':shared:clean', ':datafile-handler:clean') - task testAllModules () { logger.info("Running android tests for all modules") + dependsOn('testAllModulesTravis', ':test-app:connectedAndroidTest') } task testAllModulesTravis () { logger.info("Running android tests for Travis") + dependsOn(':android-sdk:connectedAndroidTest', ':android-sdk:test', + ':event-handler:connectedAndroidTest', ':event-handler:test', + ':datafile-handler:connectedAndroidTest', ':datafile-handler:test', + ':user-profile:connectedAndroidTest', ':shared:connectedAndroidTest') } -testAllModulesTravis.dependsOn(':android-sdk:connectedAndroidTest', ':android-sdk:test', - ':event-handler:connectedAndroidTest', ':event-handler:test', - ':datafile-handler:connectedAndroidTest', ':datafile-handler:test', - ':user-profile:connectedAndroidTest', ':shared:connectedAndroidTest') - -testAllModules.dependsOn('testAllModulesTravis', ':test-app:connectedAndroidTest') - // Publish to MavenCentral task ship() { diff --git a/datafile-handler/src/androidTest/java/com/optimizely/ab/android/datafile_handler/DatafileLoaderTest.java b/datafile-handler/src/androidTest/java/com/optimizely/ab/android/datafile_handler/DatafileLoaderTest.java index a1bb9390..9e6af4e9 100644 --- a/datafile-handler/src/androidTest/java/com/optimizely/ab/android/datafile_handler/DatafileLoaderTest.java +++ b/datafile-handler/src/androidTest/java/com/optimizely/ab/android/datafile_handler/DatafileLoaderTest.java @@ -57,7 +57,6 @@ /** * Tests for {@link DatafileLoader} */ -@RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) @RunWith(AndroidJUnit4.class) public class DatafileLoaderTest { diff --git a/datafile-handler/src/androidTest/java/com/optimizely/ab/android/datafile_handler/DatafileReschedulerTest.java b/datafile-handler/src/androidTest/java/com/optimizely/ab/android/datafile_handler/DatafileReschedulerTest.java index e43a98a0..ee79d0f1 100644 --- a/datafile-handler/src/androidTest/java/com/optimizely/ab/android/datafile_handler/DatafileReschedulerTest.java +++ b/datafile-handler/src/androidTest/java/com/optimizely/ab/android/datafile_handler/DatafileReschedulerTest.java @@ -81,7 +81,6 @@ public void receivedActionBootCompleted() { verify(logger).info("Received intent with action {}", Intent.ACTION_BOOT_COMPLETED); } - @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR1) @Test public void receivedActionMyPackageReplaced() { Context context = InstrumentationRegistry.getInstrumentation().getTargetContext(); diff --git a/datafile-handler/src/androidTest/java/com/optimizely/ab/android/datafile_handler/DatafileServiceTest.java b/datafile-handler/src/androidTest/java/com/optimizely/ab/android/datafile_handler/DatafileServiceTest.java index 70daf6db..03ab0349 100644 --- a/datafile-handler/src/androidTest/java/com/optimizely/ab/android/datafile_handler/DatafileServiceTest.java +++ b/datafile-handler/src/androidTest/java/com/optimizely/ab/android/datafile_handler/DatafileServiceTest.java @@ -71,7 +71,6 @@ public void setup() { executor = Executors.newSingleThreadExecutor(); } - @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) @Test @Ignore public void testBinding() throws TimeoutException { @@ -99,7 +98,6 @@ public void testBinding() throws TimeoutException { assertTrue(datafileService.isBound()); } - @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) @Test public void testValidStart() throws TimeoutException { Context context = InstrumentationRegistry.getInstrumentation().getTargetContext(); @@ -119,7 +117,6 @@ public void testValidStart() throws TimeoutException { assertEquals(val, START_FLAG_REDELIVERY); } - @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) @Test @Ignore public void testNullIntentStart() throws TimeoutException { @@ -139,7 +136,6 @@ public void testNullIntentStart() throws TimeoutException { verify(logger).warn("Data file service received a null intent"); } - @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) @Test @Ignore public void testNoProjectIdIntentStart() throws TimeoutException { @@ -159,7 +155,6 @@ public void testNoProjectIdIntentStart() throws TimeoutException { verify(logger).warn("Data file service received an intent with no project id extra"); } - @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) @Test @Ignore public void testUnbind() throws TimeoutException { @@ -180,7 +175,6 @@ public void testUnbind() throws TimeoutException { verify(logger).info("All clients are unbound from data file service"); } - @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) @Test @Ignore public void testIntentExtraData(){ @@ -209,7 +203,6 @@ public void testIntentExtraData(){ assertTrue(intent2.getComponent().getShortClassName().contains("DatafileService")); } - @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) @Test public void testGetDatafileUrl(){ // HARD-CODING link here to make sure we don't unintentionally mess up the datafile version @@ -218,8 +211,7 @@ public void testGetDatafileUrl(){ String datafileUrl = new DatafileConfig("1", null).getUrl(); assertEquals("https://cdn.optimizely.com/json/1.json", datafileUrl); } - @ - RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) + @Test public void testGetDatafileEnvironmentUrl(){ // HARD-CODING link here to make sure we don't unintentionally mess up the datafile version diff --git a/datafile-handler/src/main/java/com/optimizely/ab/android/datafile_handler/DatafileLoader.java b/datafile-handler/src/main/java/com/optimizely/ab/android/datafile_handler/DatafileLoader.java index 4c39dcb8..9dd6ffb4 100644 --- a/datafile-handler/src/main/java/com/optimizely/ab/android/datafile_handler/DatafileLoader.java +++ b/datafile-handler/src/main/java/com/optimizely/ab/android/datafile_handler/DatafileLoader.java @@ -80,7 +80,6 @@ private void saveDownloadTime(String url) { storage.saveLong(url + datafileDownloadTime, time); } - @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) public void getDatafile(@NonNull String datafileUrl, @Nullable DatafileLoadedListener datafileLoadedListener) { if (!allowDownload(datafileUrl, datafileLoadedListener)) { return; diff --git a/datafile-handler/src/main/java/com/optimizely/ab/android/datafile_handler/DatafileService.java b/datafile-handler/src/main/java/com/optimizely/ab/android/datafile_handler/DatafileService.java index 4fdf2583..1b3f5476 100644 --- a/datafile-handler/src/main/java/com/optimizely/ab/android/datafile_handler/DatafileService.java +++ b/datafile-handler/src/main/java/com/optimizely/ab/android/datafile_handler/DatafileService.java @@ -54,7 +54,6 @@ public class DatafileService extends Service { * @hide * @see Service#onStartCommand(Intent, int, int) */ - @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) @Override public int onStartCommand(Intent intent, int flags, int startId) { if (intent != null) { @@ -111,7 +110,6 @@ public void stop() { stopSelf(); } - @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) public void getDatafile(String datafileUrl, DatafileLoader datafileLoader, DatafileLoadedListener loadedListener) { datafileLoader.getDatafile(datafileUrl, loadedListener); } diff --git a/datafile-handler/src/main/java/com/optimizely/ab/android/datafile_handler/DatafileServiceConnection.java b/datafile-handler/src/main/java/com/optimizely/ab/android/datafile_handler/DatafileServiceConnection.java index a110b3b0..b21db403 100644 --- a/datafile-handler/src/main/java/com/optimizely/ab/android/datafile_handler/DatafileServiceConnection.java +++ b/datafile-handler/src/main/java/com/optimizely/ab/android/datafile_handler/DatafileServiceConnection.java @@ -62,7 +62,6 @@ public DatafileServiceConnection(@NonNull DatafileConfig datafileConfig, @NonNul * * @see ServiceConnection#onServiceConnected(ComponentName, IBinder) */ - @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) @Override public void onServiceConnected(ComponentName className, IBinder service) { diff --git a/event-handler/src/androidTest/java/com/optimizely/ab/android/event_handler/EventDAOTest.java b/event-handler/src/androidTest/java/com/optimizely/ab/android/event_handler/EventDAOTest.java index 31282024..e61d8219 100644 --- a/event-handler/src/androidTest/java/com/optimizely/ab/android/event_handler/EventDAOTest.java +++ b/event-handler/src/androidTest/java/com/optimizely/ab/android/event_handler/EventDAOTest.java @@ -49,7 +49,6 @@ public class EventDAOTest { private Logger logger; private Context context; - @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) @Before public void setupEventDAO() { logger = mock(Logger.class); diff --git a/event-handler/src/androidTest/java/com/optimizely/ab/android/event_handler/EventDispatcherTest.java b/event-handler/src/androidTest/java/com/optimizely/ab/android/event_handler/EventDispatcherTest.java index df129349..b9525dc7 100644 --- a/event-handler/src/androidTest/java/com/optimizely/ab/android/event_handler/EventDispatcherTest.java +++ b/event-handler/src/androidTest/java/com/optimizely/ab/android/event_handler/EventDispatcherTest.java @@ -62,7 +62,6 @@ public class EventDispatcherTest { private Context context; private Client client; - @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) @Before public void setup() { context = InstrumentationRegistry.getInstrumentation().getTargetContext(); diff --git a/event-handler/src/androidTest/java/com/optimizely/ab/android/event_handler/EventSQLiteOpenHelperTest.java b/event-handler/src/androidTest/java/com/optimizely/ab/android/event_handler/EventSQLiteOpenHelperTest.java index 40acd045..665804b1 100644 --- a/event-handler/src/androidTest/java/com/optimizely/ab/android/event_handler/EventSQLiteOpenHelperTest.java +++ b/event-handler/src/androidTest/java/com/optimizely/ab/android/event_handler/EventSQLiteOpenHelperTest.java @@ -54,7 +54,6 @@ public void teardown() { context.deleteDatabase(String.format(EventSQLiteOpenHelper.DB_NAME, "1")); } - @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) @Test public void onCreateMakesTables() { EventSQLiteOpenHelper eventSQLiteOpenHelper = diff --git a/event-handler/src/main/java/com/optimizely/ab/android/event_handler/EventDAO.java b/event-handler/src/main/java/com/optimizely/ab/android/event_handler/EventDAO.java index 17a8897f..9c2030a0 100644 --- a/event-handler/src/main/java/com/optimizely/ab/android/event_handler/EventDAO.java +++ b/event-handler/src/main/java/com/optimizely/ab/android/event_handler/EventDAO.java @@ -60,7 +60,6 @@ private EventDAO(@NonNull EventSQLiteOpenHelper dbHelper, @NonNull Logger logger * @param logger where to log errors and warnings. * @return a new instance of EventDAO. */ - @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) static EventDAO getInstance(@NonNull Context context, @NonNull String projectId, @NonNull Logger logger) { EventSQLiteOpenHelper sqLiteOpenHelper = new EventSQLiteOpenHelper(context, projectId, null, EventSQLiteOpenHelper.VERSION, LoggerFactory.getLogger(EventSQLiteOpenHelper.class)); return new EventDAO(sqLiteOpenHelper, logger); diff --git a/event-handler/src/main/java/com/optimizely/ab/android/event_handler/EventIntentService.java b/event-handler/src/main/java/com/optimizely/ab/android/event_handler/EventIntentService.java index 6f469ebf..7ae534f1 100644 --- a/event-handler/src/main/java/com/optimizely/ab/android/event_handler/EventIntentService.java +++ b/event-handler/src/main/java/com/optimizely/ab/android/event_handler/EventIntentService.java @@ -57,7 +57,6 @@ public EventIntentService() { * Create the event dispatcher {@link EventDispatcher} * @see IntentService#onCreate() */ - @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) @Override public void onCreate() { super.onCreate(); diff --git a/event-handler/src/main/java/com/optimizely/ab/android/event_handler/EventSQLiteOpenHelper.java b/event-handler/src/main/java/com/optimizely/ab/android/event_handler/EventSQLiteOpenHelper.java index c709261e..1ae662e2 100644 --- a/event-handler/src/main/java/com/optimizely/ab/android/event_handler/EventSQLiteOpenHelper.java +++ b/event-handler/src/main/java/com/optimizely/ab/android/event_handler/EventSQLiteOpenHelper.java @@ -48,7 +48,6 @@ class EventSQLiteOpenHelper extends SQLiteOpenHelper { @NonNull private final String projectId; @NonNull private final Context context; - @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) EventSQLiteOpenHelper(@NonNull Context context, @NonNull String projectId, @Nullable SQLiteDatabase.CursorFactory factory, int version, @NonNull Logger logger) { super(context, String.format(DB_NAME, projectId), factory, version); this.logger = logger; diff --git a/event-handler/src/test/java/com/optimizely/ab/android/event_handler/EventReschedulerTest.java b/event-handler/src/test/java/com/optimizely/ab/android/event_handler/EventReschedulerTest.java index 9ba31449..9fc02c8d 100644 --- a/event-handler/src/test/java/com/optimizely/ab/android/event_handler/EventReschedulerTest.java +++ b/event-handler/src/test/java/com/optimizely/ab/android/event_handler/EventReschedulerTest.java @@ -82,7 +82,6 @@ public void onReceiveValidBootComplete() { verify(logger).info("Rescheduling event flushing if necessary"); } - @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB_MR1) @Test public void onReceiveValidPackageReplaced() { when(intent.getAction()).thenReturn(Intent.ACTION_MY_PACKAGE_REPLACED); diff --git a/user-profile/src/main/java/com/optimizely/ab/android/user_profile/DefaultUserProfileService.java b/user-profile/src/main/java/com/optimizely/ab/android/user_profile/DefaultUserProfileService.java index ed3bfa0a..a5f05958 100644 --- a/user-profile/src/main/java/com/optimizely/ab/android/user_profile/DefaultUserProfileService.java +++ b/user-profile/src/main/java/com/optimizely/ab/android/user_profile/DefaultUserProfileService.java @@ -79,7 +79,6 @@ public interface StartCallback { void onStartComplete(UserProfileService userProfileService); } - @TargetApi(Build.VERSION_CODES.HONEYCOMB) public void startInBackground(final StartCallback callback) { final DefaultUserProfileService userProfileService = this; diff --git a/user-profile/src/main/java/com/optimizely/ab/android/user_profile/UserProfileCache.java b/user-profile/src/main/java/com/optimizely/ab/android/user_profile/UserProfileCache.java index 5ba321eb..bc52ce75 100644 --- a/user-profile/src/main/java/com/optimizely/ab/android/user_profile/UserProfileCache.java +++ b/user-profile/src/main/java/com/optimizely/ab/android/user_profile/UserProfileCache.java @@ -270,7 +270,6 @@ JSONObject load() throws JSONException { /** * Save the in-memory cache to disk in a background thread. */ - @TargetApi(Build.VERSION_CODES.HONEYCOMB) void save(final Map> userProfilesMap) { AsyncTask task = new AsyncTask() { @Override @@ -347,7 +346,6 @@ JSONObject load() { /** * Delete the legacy user profile cache from disk in a background thread. */ - @TargetApi(Build.VERSION_CODES.HONEYCOMB) void delete() { AsyncTask task = new AsyncTask() { @Override From 8e33a635b1ed76dc3c5c44c10b279e1b98e94589 Mon Sep 17 00:00:00 2001 From: Jae Kim Date: Tue, 4 May 2021 17:59:14 -0700 Subject: [PATCH 08/20] clean up RequiresAPI --- .travis.yml | 3 ++- .../com/optimizely/ab/android/sdk/OptimizelyManagerTest.java | 4 ++-- .../sdk/OptimizelyManagerDatafileServiceConnectionTest.java | 1 - .../OptimizelyManagerOptlyActivityLifecycleCallbacksTest.java | 3 --- 4 files changed, 4 insertions(+), 7 deletions(-) diff --git a/.travis.yml b/.travis.yml index 34e93757..6dc8f4e1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,8 +8,9 @@ env: - ADB_INSTALL_TIMEOUT=5 # minutes - ANDROID_API=29 # api is same as gradle file matrix: + - EMULATOR_API=16 - EMULATOR_API=21 - - EMULATOR_API=22 + - EMULATOR_API=30 android: components: - tools 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 c4149683..07062e6e 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 @@ -23,8 +23,8 @@ import android.content.pm.PackageManager; import android.os.Build; -import androidx.annotation.RequiresApi; import androidx.test.ext.junit.runners.AndroidJUnit4; +import androidx.test.filters.SdkSuppress; import androidx.test.platform.app.InstrumentationRegistry; import com.optimizely.ab.android.datafile_handler.DatafileHandler; @@ -396,7 +396,7 @@ public void injectOptimizelyWithDatafileLisener() { } @Test - @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) + @SdkSuppress(minSdkVersion = Build.VERSION_CODES.LOLLIPOP) public void injectOptimizelyNullListener() { Context context = mock(Context.class); PackageManager packageManager = mock(PackageManager.class); diff --git a/android-sdk/src/test/java/com/optimizely/ab/android/sdk/OptimizelyManagerDatafileServiceConnectionTest.java b/android-sdk/src/test/java/com/optimizely/ab/android/sdk/OptimizelyManagerDatafileServiceConnectionTest.java index efc88d40..905ac541 100644 --- a/android-sdk/src/test/java/com/optimizely/ab/android/sdk/OptimizelyManagerDatafileServiceConnectionTest.java +++ b/android-sdk/src/test/java/com/optimizely/ab/android/sdk/OptimizelyManagerDatafileServiceConnectionTest.java @@ -18,7 +18,6 @@ import android.content.Context; import android.os.Build; -import androidx.annotation.RequiresApi; import org.junit.Before; import org.junit.Test; diff --git a/android-sdk/src/test/java/com/optimizely/ab/android/sdk/OptimizelyManagerOptlyActivityLifecycleCallbacksTest.java b/android-sdk/src/test/java/com/optimizely/ab/android/sdk/OptimizelyManagerOptlyActivityLifecycleCallbacksTest.java index 5eec8c88..4135ed22 100644 --- a/android-sdk/src/test/java/com/optimizely/ab/android/sdk/OptimizelyManagerOptlyActivityLifecycleCallbacksTest.java +++ b/android-sdk/src/test/java/com/optimizely/ab/android/sdk/OptimizelyManagerOptlyActivityLifecycleCallbacksTest.java @@ -18,7 +18,6 @@ import android.app.Activity; import android.os.Build; -import androidx.annotation.RequiresApi; import org.junit.Before; import org.junit.Test; @@ -38,13 +37,11 @@ public class OptimizelyManagerOptlyActivityLifecycleCallbacksTest { @Mock Activity activity; private OptimizelyManager.OptlyActivityLifecycleCallbacks optlyActivityLifecycleCallbacks; - @RequiresApi(api = Build.VERSION_CODES.ICE_CREAM_SANDWICH) @Before public void setup() { optlyActivityLifecycleCallbacks = new OptimizelyManager.OptlyActivityLifecycleCallbacks(optimizelyManager); } - @RequiresApi(api = Build.VERSION_CODES.ICE_CREAM_SANDWICH) @Test public void onActivityStopped() { optlyActivityLifecycleCallbacks.onActivityStopped(activity); From 21aa823955f1b2152844375af6a7662c7719dee1 Mon Sep 17 00:00:00 2001 From: Jae Kim Date: Wed, 5 May 2021 10:25:50 -0700 Subject: [PATCH 09/20] fix travis test failure --- .travis.yml | 5 +++-- .../ab/android/event_handler/EventDispatcherTest.java | 5 +++++ .../com/optimizely/ab/android/shared/ServiceScheduler.java | 1 - 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 6dc8f4e1..285e6147 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,10 +7,11 @@ env: - ANDROID_BUILD_TOOLS=29.0.3 # should match gradle - ADB_INSTALL_TIMEOUT=5 # minutes - ANDROID_API=29 # api is same as gradle file + - ANDROID_ABI=armeabi-v7a matrix: - EMULATOR_API=16 - EMULATOR_API=21 - - EMULATOR_API=30 + - EMULATOR_API=29 android: components: - tools @@ -41,7 +42,7 @@ before_install: before_script: - echo $TRAVIS_BRANCH - echo $TRAVIS_TAG - - echo no | android create avd --force -n test -t android-$EMULATOR_API --abi armeabi-v7a + - echo no | android create avd --force -n test -t android-$EMULATOR_API --abi $ANDROID_ABI - emulator -avd test -no-audio -no-window & - scripts/android-wait-for-emulator.sh - adb shell input keyevent 82 & diff --git a/event-handler/src/androidTest/java/com/optimizely/ab/android/event_handler/EventDispatcherTest.java b/event-handler/src/androidTest/java/com/optimizely/ab/android/event_handler/EventDispatcherTest.java index b9525dc7..fcdf5147 100644 --- a/event-handler/src/androidTest/java/com/optimizely/ab/android/event_handler/EventDispatcherTest.java +++ b/event-handler/src/androidTest/java/com/optimizely/ab/android/event_handler/EventDispatcherTest.java @@ -21,6 +21,7 @@ import android.content.Intent; import android.os.Build; import androidx.annotation.RequiresApi; +import androidx.test.filters.SdkSuppress; import androidx.test.platform.app.InstrumentationRegistry; import androidx.test.ext.junit.runners.AndroidJUnit4; @@ -81,6 +82,7 @@ public void tearDown() { } @Test + @SdkSuppress(minSdkVersion = Build.VERSION_CODES.LOLLIPOP) public void handleIntentSchedulesWhenEventsLeftInStorage() throws IOException { Event event1 = new Event(new URL("http://www.foo1.com"), ""); Event event2 = new Event(new URL("http://www.foo2.com"), ""); @@ -107,6 +109,7 @@ public void handleIntentSchedulesWhenEventsLeftInStorage() throws IOException { } @Test + @SdkSuppress(minSdkVersion = Build.VERSION_CODES.LOLLIPOP) public void handleIntentSchedulesWhenNewEventFailsToSend() throws IOException { Event event = new Event(new URL("http://www.foo.com"), ""); @@ -126,6 +129,7 @@ public void handleIntentSchedulesWhenNewEventFailsToSend() throws IOException { } @Test + @SdkSuppress(minSdkVersion = Build.VERSION_CODES.LOLLIPOP) public void unschedulesServiceWhenNoEventsToFlush() { Intent mockIntent = mock(Intent.class); eventDispatcher.dispatch(mockIntent); @@ -134,6 +138,7 @@ public void unschedulesServiceWhenNoEventsToFlush() { } @Test + @SdkSuppress(minSdkVersion = Build.VERSION_CODES.LOLLIPOP) public void handleMalformedURL() throws MalformedURLException { String url= "foo"; diff --git a/shared/src/main/java/com/optimizely/ab/android/shared/ServiceScheduler.java b/shared/src/main/java/com/optimizely/ab/android/shared/ServiceScheduler.java index d3fc18dd..77c16b91 100644 --- a/shared/src/main/java/com/optimizely/ab/android/shared/ServiceScheduler.java +++ b/shared/src/main/java/com/optimizely/ab/android/shared/ServiceScheduler.java @@ -298,7 +298,6 @@ public static void startService(Context context, Integer jobId, Intent intent) { } - @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) private static boolean isScheduled(Context context, Integer jobId) { if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { JobScheduler jobScheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE); From 1cd9710faad461692577bb8b79f871bda54fc680 Mon Sep 17 00:00:00 2001 From: Jae Kim Date: Wed, 5 May 2021 11:48:42 -0700 Subject: [PATCH 10/20] fix travis devices --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 285e6147..c7da7b90 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,7 +9,7 @@ env: - ANDROID_API=29 # api is same as gradle file - ANDROID_ABI=armeabi-v7a matrix: - - EMULATOR_API=16 + - EMULATOR_API=19 # API-16 build fails in travis - EMULATOR_API=21 - EMULATOR_API=29 android: @@ -42,7 +42,7 @@ before_install: before_script: - echo $TRAVIS_BRANCH - echo $TRAVIS_TAG - - echo no | android create avd --force -n test -t android-$EMULATOR_API --abi $ANDROID_ABI + - echo no | android create avd --force -n test -t android-$EMULATOR_API --abi $ANDROID_ABI || sdkmanager --list - emulator -avd test -no-audio -no-window & - scripts/android-wait-for-emulator.sh - adb shell input keyevent 82 & From 1c094b6f2617c759325b6aaa40365ed38c014227 Mon Sep 17 00:00:00 2001 From: Jae Kim Date: Wed, 5 May 2021 13:53:59 -0700 Subject: [PATCH 11/20] clean up --- .../datafile_handler/DatafileLoaderTest.java | 5 + .../test_app/MainActivityEspressoTest.java | 199 ------------------ 2 files changed, 5 insertions(+), 199 deletions(-) delete mode 100644 test-app/src/androidTest/java/com/optimizely/ab/android/test_app/MainActivityEspressoTest.java diff --git a/datafile-handler/src/androidTest/java/com/optimizely/ab/android/datafile_handler/DatafileLoaderTest.java b/datafile-handler/src/androidTest/java/com/optimizely/ab/android/datafile_handler/DatafileLoaderTest.java index 9e6af4e9..db7d5aa9 100644 --- a/datafile-handler/src/androidTest/java/com/optimizely/ab/android/datafile_handler/DatafileLoaderTest.java +++ b/datafile-handler/src/androidTest/java/com/optimizely/ab/android/datafile_handler/DatafileLoaderTest.java @@ -21,6 +21,7 @@ import androidx.annotation.RequiresApi; import androidx.test.ext.junit.runners.AndroidJUnit4; +import androidx.test.filters.SdkSuppress; import androidx.test.platform.app.InstrumentationRegistry; import com.optimizely.ab.android.shared.Cache; @@ -146,6 +147,8 @@ public void noCacheAndLoadFromCDNFails() { } @Test + // flacky with lower API + @SdkSuppress(minSdkVersion = Build.VERSION_CODES.LOLLIPOP) public void warningsAreLogged() throws IOException { final ExecutorService executor = Executors.newSingleThreadExecutor(); Cache cache = mock(Cache.class); @@ -171,6 +174,8 @@ public void warningsAreLogged() throws IOException { } @Test + // flacky with lower API + @SdkSuppress(minSdkVersion = Build.VERSION_CODES.LOLLIPOP) public void debugLogged() throws IOException { final ExecutorService executor = Executors.newSingleThreadExecutor(); Cache cache = mock(Cache.class); diff --git a/test-app/src/androidTest/java/com/optimizely/ab/android/test_app/MainActivityEspressoTest.java b/test-app/src/androidTest/java/com/optimizely/ab/android/test_app/MainActivityEspressoTest.java deleted file mode 100644 index a9c6c32d..00000000 --- a/test-app/src/androidTest/java/com/optimizely/ab/android/test_app/MainActivityEspressoTest.java +++ /dev/null @@ -1,199 +0,0 @@ -/**************************************************************************** - * Copyright 2016-2017, Optimizely, Inc. and contributors * - * * - * Licensed under the Apache License, Version 2.0 (the "License"); * - * you may not use this file except in compliance with the License. * - * You may obtain a copy of the License at * - * * - * http://www.apache.org/licenses/LICENSE-2.0 * - * * - * Unless required by applicable law or agreed to in writing, software * - * distributed under the License is distributed on an "AS IS" BASIS, * - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * - * See the License for the specific language governing permissions and * - * limitations under the License. * - ***************************************************************************/ - -package com.optimizely.ab.android.test_app; - -import android.app.AlarmManager; -import android.content.Context; -import android.content.Intent; -import androidx.test.platform.app.InstrumentationRegistry; -import androidx.test.espresso.Espresso; -import androidx.test.espresso.IdlingPolicies; -import androidx.test.espresso.idling.CountingIdlingResource; -import androidx.test.filters.LargeTest; -import androidx.test.rule.ActivityTestRule; -import androidx.test.ext.junit.runners.AndroidJUnit4; -import android.util.Pair; -import android.view.WindowManager; - -import com.optimizely.ab.android.datafile_handler.DatafileService; -import com.optimizely.ab.android.event_handler.EventIntentService; -import com.optimizely.ab.android.shared.CountingIdlingResourceInterface; -import com.optimizely.ab.android.shared.CountingIdlingResourceManager; -import com.optimizely.ab.android.shared.DatafileConfig; -import com.optimizely.ab.android.shared.ServiceScheduler; - -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExternalResource; -import org.junit.rules.RuleChain; -import org.junit.rules.TestRule; -import org.junit.runner.RunWith; -import org.slf4j.LoggerFactory; - -import java.util.Iterator; -import java.util.List; -import java.util.concurrent.TimeUnit; - -import static androidx.test.espresso.Espresso.onView; -import static androidx.test.espresso.action.ViewActions.click; -import static androidx.test.espresso.assertion.ViewAssertions.matches; -import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed; -import static androidx.test.espresso.matcher.ViewMatchers.withId; -import static junit.framework.Assert.assertFalse; -import static junit.framework.Assert.assertNull; -import static junit.framework.Assert.assertTrue; - -@RunWith(AndroidJUnit4.class) -@LargeTest -public class MainActivityEspressoTest { - - private Context context = InstrumentationRegistry.getInstrumentation().getTargetContext(); - private CountingIdlingResource countingIdlingResource; - private ServiceScheduler serviceScheduler; - private Intent dataFileServiceIntent, eventIntentService; - - private ActivityTestRule activityTestRule = new ActivityTestRule<>(SplashScreenActivity.class); - @Rule public TestRule chain = RuleChain - .outerRule(new ExternalResource() { - @Override - protected void before() throws Throwable { - super.before(); - countingIdlingResource = new CountingIdlingResource("optly", true); - CountingIdlingResourceInterface wrapper = new CountingIdlingResourceInterface() { - @Override - public void increment() { - countingIdlingResource.increment(); - } - - @Override - public void decrement() { - countingIdlingResource.decrement(); - } - }; - CountingIdlingResourceManager.setIdlingResource(wrapper); - // To prove that the test fails, omit this call: - Espresso.registerIdlingResources(countingIdlingResource); - } - - @Override - protected void after() { - super.after(); - Espresso.unregisterIdlingResources(countingIdlingResource); - } - }) - .around(new ExternalResource() { - @Override - protected void before() throws Throwable { - super.before(); - // Set the user's id to the test user that is in the whitelist. - context.getSharedPreferences("user", Context.MODE_PRIVATE).edit() - .putString("userId", "test_user") - .apply(); - } - - @Override - protected void after() { - super.after(); - context.getSharedPreferences("user", Context.MODE_PRIVATE).edit().apply(); - // Clear sticky bucketing - context.deleteFile(String.format("optly-user-profile-%s.json", MyApplication.PROJECT_ID)); - } - }) - .around(new ExternalResource() { - @Override - protected void before() throws Throwable { - super.before(); - - dataFileServiceIntent = new Intent(context, DatafileService.class); - dataFileServiceIntent.putExtra(DatafileService.EXTRA_DATAFILE_CONFIG, new DatafileConfig(MyApplication.PROJECT_ID, null).toJSONString()); - - eventIntentService = new Intent(context, EventIntentService.class); - eventIntentService.putExtra(DatafileService.EXTRA_DATAFILE_CONFIG, new DatafileConfig(MyApplication.PROJECT_ID, null).toJSONString()); - - Context applicationContext = context.getApplicationContext(); - ServiceScheduler.PendingIntentFactory pendingIntentFactory = new ServiceScheduler.PendingIntentFactory(applicationContext); - AlarmManager alarmManager = (AlarmManager) applicationContext.getSystemService(Context.ALARM_SERVICE); - serviceScheduler = new ServiceScheduler(applicationContext, pendingIntentFactory, LoggerFactory.getLogger(ServiceScheduler.class)); - } - - @Override - protected void after() { - super.after(); - serviceScheduler.unschedule(dataFileServiceIntent); - assertFalse(serviceScheduler.isScheduled(dataFileServiceIntent)); - assertFalse(serviceScheduler.isScheduled(eventIntentService)); - CountingIdlingResourceManager.clearEvents(); - } - }) - .around(activityTestRule) - .around(new ExternalResource() { - @Override - protected void before() throws Throwable { - super.before(); - Runnable wakeUpDevice = new Runnable() { - public void run() { - activityTestRule.getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON | - WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | - WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); - } - }; - activityTestRule.getActivity().runOnUiThread(wakeUpDevice); - } - - @Override - protected void after() { - super.after(); - } - }); - - @Test - public void experimentActivationForWhitelistUser() throws Exception { - IdlingPolicies.setMasterPolicyTimeout(3, TimeUnit.MINUTES); - IdlingPolicies.setIdlingResourceTimeout(3, TimeUnit.MINUTES); - - // Check that the text was changed. - // These tests are pointed at a real project. - // The user 'test_user` is in the whitelist for variation_a for experiment background_experiment - onView(withId(R.id.tv_variation_a_text_1)) - .check(matches(isDisplayed())); - - - // here i am rescheduling the data file service. this is because in the splash activity after optimizely startup - // the app unschedules the data file service. - serviceScheduler.schedule(dataFileServiceIntent, TimeUnit.DAYS.toMillis(1L)); - - // Espresso will wait for Optimizely to start due to the registered idling resources - assertTrue(serviceScheduler.isScheduled(dataFileServiceIntent)); - - onView(withId(R.id.btn_variation_conversion)) // withId(R.id.my_view) is a ViewMatcher - .perform(click()); // click() is a ViewAction - - List> events = CountingIdlingResourceManager.getEvents(); - assertTrue(events.size() == 2); - Iterator> iterator = events.iterator(); - while (iterator.hasNext()) { - Pair event = iterator.next(); - final String url = event.first; - final String payload = event.second; - if (url.equals("https://logx.optimizely.com/v1/events") && payload.contains("11178792174") && payload.contains("11146534908") - || url.equals("https://logx.optimizely.com/v1/events") && payload.contains("sample_conversion")) { - iterator.remove(); - } - } - assertTrue(events.isEmpty()); - } -} From 7dec1275ed6c2b21f4319a09fc60a069a429a351 Mon Sep 17 00:00:00 2001 From: Jae Kim Date: Wed, 5 May 2021 14:22:50 -0700 Subject: [PATCH 12/20] fix travis android device error --- .travis.yml | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index c7da7b90..6dcab040 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,11 +7,10 @@ env: - ANDROID_BUILD_TOOLS=29.0.3 # should match gradle - ADB_INSTALL_TIMEOUT=5 # minutes - ANDROID_API=29 # api is same as gradle file - - ANDROID_ABI=armeabi-v7a matrix: - - EMULATOR_API=19 # API-16 build fails in travis - - EMULATOR_API=21 - - EMULATOR_API=29 + - EMULATOR_API=19 ANDROID_ABI=armeabi-v7a # API-16 build fails in travis + - EMULATOR_API=21 ANDROID_ABI=armeabi-v7a + - EMULATOR_API=29 ANDROID_ABI=arm64-v8a android: components: - tools @@ -42,7 +41,7 @@ before_install: before_script: - echo $TRAVIS_BRANCH - echo $TRAVIS_TAG - - echo no | android create avd --force -n test -t android-$EMULATOR_API --abi $ANDROID_ABI || sdkmanager --list + - echo no | android create avd --force -n test -t android-$EMULATOR_API --abi $ANDROID_ABI || { sdkmanager --list; exit 1; } - emulator -avd test -no-audio -no-window & - scripts/android-wait-for-emulator.sh - adb shell input keyevent 82 & From d3b769c399ca3801683f5fe218b55285fac453fd Mon Sep 17 00:00:00 2001 From: Jae Kim Date: Wed, 5 May 2021 15:07:03 -0700 Subject: [PATCH 13/20] test --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 6dcab040..a5617fb3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -37,11 +37,11 @@ cache: - $HOME/.gradle/caches/ - $HOME/.gradle/wrapper/ before_install: - #- yes | sdkmanager "platforms;android-$ANDROID_API" + - yes | sdkmanager "platforms;android-$ANDROID_API" before_script: - echo $TRAVIS_BRANCH - echo $TRAVIS_TAG - - echo no | android create avd --force -n test -t android-$EMULATOR_API --abi $ANDROID_ABI || { sdkmanager --list; exit 1; } + - echo no | android create avd --force -n test -t android-$EMULATOR_API --abi $ANDROID_ABI - emulator -avd test -no-audio -no-window & - scripts/android-wait-for-emulator.sh - adb shell input keyevent 82 & From d557dac5ee0cb7c450dfbd3e9f0ba7fe9b54ad12 Mon Sep 17 00:00:00 2001 From: Jae Kim Date: Wed, 5 May 2021 15:18:48 -0700 Subject: [PATCH 14/20] test --- .travis.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index a5617fb3..d9f59866 100644 --- a/.travis.yml +++ b/.travis.yml @@ -18,9 +18,9 @@ android: - build-tools-$ANDROID_BUILD_TOOLS - android-$ANDROID_API - android-$EMULATOR_API - - extra-google-m2repository - - extra-android-m2repository # for design library - - addon-google_apis-google-19 # google play services + #- extra-google-m2repository + #- extra-android-m2repository # for design library + #- addon-google_apis-google-19 # google play services - sys-img-armeabi-v7a-addon-google_apis-google-$ANDROID_API - sys-img-armeabi-v7a-addon-google_apis-google-$EMULATOR_API - sys-img-armeabi-v7a-android-$EMULATOR_API @@ -37,7 +37,7 @@ cache: - $HOME/.gradle/caches/ - $HOME/.gradle/wrapper/ before_install: - - yes | sdkmanager "platforms;android-$ANDROID_API" + - yes | sdkmanager --list before_script: - echo $TRAVIS_BRANCH - echo $TRAVIS_TAG From 37d0967535d7f95b60cf8baed7b3e1183ecfdb44 Mon Sep 17 00:00:00 2001 From: Jae Kim Date: Wed, 5 May 2021 15:40:36 -0700 Subject: [PATCH 15/20] test --- .travis.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index d9f59866..70c14228 100644 --- a/.travis.yml +++ b/.travis.yml @@ -36,12 +36,10 @@ cache: directories: - $HOME/.gradle/caches/ - $HOME/.gradle/wrapper/ -before_install: - - yes | sdkmanager --list before_script: - echo $TRAVIS_BRANCH - echo $TRAVIS_TAG - - echo no | android create avd --force -n test -t android-$EMULATOR_API --abi $ANDROID_ABI + - echo no | android create avd --force -n test -t android-$EMULATOR_API --abi $ANDROID_ABI || sdkmanager --list - emulator -avd test -no-audio -no-window & - scripts/android-wait-for-emulator.sh - adb shell input keyevent 82 & From e8e99c400a2b81d381b885a2fe7b31ddd2ccc584 Mon Sep 17 00:00:00 2001 From: Jae Kim Date: Wed, 5 May 2021 16:06:54 -0700 Subject: [PATCH 16/20] test --- .travis.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.travis.yml b/.travis.yml index 70c14228..eac173e5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -24,6 +24,9 @@ android: - sys-img-armeabi-v7a-addon-google_apis-google-$ANDROID_API - sys-img-armeabi-v7a-addon-google_apis-google-$EMULATOR_API - sys-img-armeabi-v7a-android-$EMULATOR_API + - sys-img-arme64-v8a-addon-google_apis-google-$ANDROID_API + - sys-img-arme64-v8a-addon-google_apis-google-$EMULATOR_API + - sys-img-arme64-v8a-android-$EMULATOR_API licenses: - android-sdk-preview-license-.+ - android-sdk-license-.+ From 097d4ee4e2782cf0642a70ffc347ace04945633a Mon Sep 17 00:00:00 2001 From: Jae Kim Date: Wed, 5 May 2021 17:39:06 -0700 Subject: [PATCH 17/20] test --- .travis.yml | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/.travis.yml b/.travis.yml index eac173e5..9282693c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,7 +10,7 @@ env: matrix: - EMULATOR_API=19 ANDROID_ABI=armeabi-v7a # API-16 build fails in travis - EMULATOR_API=21 ANDROID_ABI=armeabi-v7a - - EMULATOR_API=29 ANDROID_ABI=arm64-v8a + - EMULATOR_API=25 ANDROID_ABI=armeabi-v7a android: components: - tools @@ -18,15 +18,9 @@ android: - build-tools-$ANDROID_BUILD_TOOLS - android-$ANDROID_API - android-$EMULATOR_API - #- extra-google-m2repository - #- extra-android-m2repository # for design library - #- addon-google_apis-google-19 # google play services - sys-img-armeabi-v7a-addon-google_apis-google-$ANDROID_API - sys-img-armeabi-v7a-addon-google_apis-google-$EMULATOR_API - sys-img-armeabi-v7a-android-$EMULATOR_API - - sys-img-arme64-v8a-addon-google_apis-google-$ANDROID_API - - sys-img-arme64-v8a-addon-google_apis-google-$EMULATOR_API - - sys-img-arme64-v8a-android-$EMULATOR_API licenses: - android-sdk-preview-license-.+ - android-sdk-license-.+ From bcfc5dc4f394c7d8de1049179c0710004660c16e Mon Sep 17 00:00:00 2001 From: Jae Kim Date: Thu, 6 May 2021 17:54:06 -0700 Subject: [PATCH 18/20] fix abi for android-25 --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 9282693c..bbc86788 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,7 +10,7 @@ env: matrix: - EMULATOR_API=19 ANDROID_ABI=armeabi-v7a # API-16 build fails in travis - EMULATOR_API=21 ANDROID_ABI=armeabi-v7a - - EMULATOR_API=25 ANDROID_ABI=armeabi-v7a + - EMULATOR_API=25 ANDROID_ABI=google_apis/armeabi-v7a android: components: - tools From 86c45b882692193a66ced7690fe1b15d4fa7eaf7 Mon Sep 17 00:00:00 2001 From: Jae Kim Date: Fri, 7 May 2021 08:51:00 -0700 Subject: [PATCH 19/20] recover travis.yml and add API-19 --- .travis.yml | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index bbc86788..60b44380 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,9 +8,9 @@ env: - ADB_INSTALL_TIMEOUT=5 # minutes - ANDROID_API=29 # api is same as gradle file matrix: - - EMULATOR_API=19 ANDROID_ABI=armeabi-v7a # API-16 build fails in travis - - EMULATOR_API=21 ANDROID_ABI=armeabi-v7a - - EMULATOR_API=25 ANDROID_ABI=google_apis/armeabi-v7a + - EMULATOR_API=19 + - EMULATOR_API=21 + - EMULATOR_API=22 android: components: - tools @@ -18,6 +18,9 @@ android: - build-tools-$ANDROID_BUILD_TOOLS - android-$ANDROID_API - android-$EMULATOR_API + - extra-google-m2repository + - extra-android-m2repository # for design library + - addon-google_apis-google-19 # google play services - sys-img-armeabi-v7a-addon-google_apis-google-$ANDROID_API - sys-img-armeabi-v7a-addon-google_apis-google-$EMULATOR_API - sys-img-armeabi-v7a-android-$EMULATOR_API @@ -33,10 +36,12 @@ cache: directories: - $HOME/.gradle/caches/ - $HOME/.gradle/wrapper/ +before_install: + #- yes | sdkmanager "platforms;android-$ANDROID_API" before_script: - echo $TRAVIS_BRANCH - echo $TRAVIS_TAG - - echo no | android create avd --force -n test -t android-$EMULATOR_API --abi $ANDROID_ABI || sdkmanager --list + - echo no | android create avd --force -n test -t android-$EMULATOR_API --abi armeabi-v7a - emulator -avd test -no-audio -no-window & - scripts/android-wait-for-emulator.sh - adb shell input keyevent 82 & From 48032eccd9af620ac1a9bf2f4ced5f1bb323866d Mon Sep 17 00:00:00 2001 From: Jae Kim Date: Wed, 2 Jun 2021 10:12:28 -0700 Subject: [PATCH 20/20] fix per comments --- .../sdk/OptimizelyClientEngineTest.java | 2 +- ...lyManagerDatafileServiceConnectionTest.java | 2 +- ...gerOptlyActivityLifecycleCallbacksTest.java | 2 +- build.gradle | 2 +- .../datafile_handler/DatafileLoaderTest.java | 2 +- .../DatafileReschedulerTest.java | 2 +- .../datafile_handler/DatafileServiceTest.java | 2 +- .../datafile_handler/DatafileClient.java | 2 +- .../datafile_handler/DatafileService.java | 2 +- .../DatafileServiceConnection.java | 2 +- .../ab/android/event_handler/EventDAOTest.java | 2 +- .../event_handler/EventDispatcherTest.java | 2 +- .../EventSQLiteOpenHelperTest.java | 2 +- .../ab/android/event_handler/EventDAO.java | 2 +- .../event_handler/EventIntentService.java | 2 +- .../event_handler/EventSQLiteOpenHelper.java | 2 +- .../event_handler/EventReschedulerTest.java | 2 +- .../optimizely/ab/android/shared/Client.java | 2 +- .../ab/android/shared/ServiceScheduler.java | 2 +- .../ab/android/shared/TLSSocketFactory.java | 18 +++++++++++++++++- .../ab/android/test_app/MyApplication.kt | 10 +++++----- .../DefaultUserProfileService.java | 2 +- .../android/user_profile/UserProfileCache.java | 2 +- 23 files changed, 43 insertions(+), 27 deletions(-) diff --git a/android-sdk/src/androidTest/java/com/optimizely/ab/android/sdk/OptimizelyClientEngineTest.java b/android-sdk/src/androidTest/java/com/optimizely/ab/android/sdk/OptimizelyClientEngineTest.java index 94782c5f..8dc58f94 100644 --- a/android-sdk/src/androidTest/java/com/optimizely/ab/android/sdk/OptimizelyClientEngineTest.java +++ b/android-sdk/src/androidTest/java/com/optimizely/ab/android/sdk/OptimizelyClientEngineTest.java @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright 2017, Optimizely, Inc. and contributors * + * Copyright 2017,2021, Optimizely, Inc. and contributors * * * * Licensed under the Apache License, Version 2.0 (the "License"); * * you may not use this file except in compliance with the License. * diff --git a/android-sdk/src/test/java/com/optimizely/ab/android/sdk/OptimizelyManagerDatafileServiceConnectionTest.java b/android-sdk/src/test/java/com/optimizely/ab/android/sdk/OptimizelyManagerDatafileServiceConnectionTest.java index 905ac541..c03c4e71 100644 --- a/android-sdk/src/test/java/com/optimizely/ab/android/sdk/OptimizelyManagerDatafileServiceConnectionTest.java +++ b/android-sdk/src/test/java/com/optimizely/ab/android/sdk/OptimizelyManagerDatafileServiceConnectionTest.java @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright 2016, Optimizely, Inc. and contributors * + * Copyright 2016,2021, Optimizely, Inc. and contributors * * * * Licensed under the Apache License, Version 2.0 (the "License"); * * you may not use this file except in compliance with the License. * diff --git a/android-sdk/src/test/java/com/optimizely/ab/android/sdk/OptimizelyManagerOptlyActivityLifecycleCallbacksTest.java b/android-sdk/src/test/java/com/optimizely/ab/android/sdk/OptimizelyManagerOptlyActivityLifecycleCallbacksTest.java index 4135ed22..e00e89b9 100644 --- a/android-sdk/src/test/java/com/optimizely/ab/android/sdk/OptimizelyManagerOptlyActivityLifecycleCallbacksTest.java +++ b/android-sdk/src/test/java/com/optimizely/ab/android/sdk/OptimizelyManagerOptlyActivityLifecycleCallbacksTest.java @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright 2016, Optimizely, Inc. and contributors * + * Copyright 2016,2021, Optimizely, Inc. and contributors * * * * Licensed under the Apache License, Version 2.0 (the "License"); * * you may not use this file except in compliance with the License. * diff --git a/build.gradle b/build.gradle index 584c0ab0..9a773c0d 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright 2016-2020, Optimizely, Inc. and contributors * + * Copyright 2016-2021, Optimizely, Inc. and contributors * * * * Licensed under the Apache License, Version 2.0 (the "License"); * * you may not use this file except in compliance with the License. * diff --git a/datafile-handler/src/androidTest/java/com/optimizely/ab/android/datafile_handler/DatafileLoaderTest.java b/datafile-handler/src/androidTest/java/com/optimizely/ab/android/datafile_handler/DatafileLoaderTest.java index db7d5aa9..a45a397a 100644 --- a/datafile-handler/src/androidTest/java/com/optimizely/ab/android/datafile_handler/DatafileLoaderTest.java +++ b/datafile-handler/src/androidTest/java/com/optimizely/ab/android/datafile_handler/DatafileLoaderTest.java @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright 2016, Optimizely, Inc. and contributors * + * Copyright 2016,2021, Optimizely, Inc. and contributors * * * * Licensed under the Apache License, Version 2.0 (the "License"); * * you may not use this file except in compliance with the License. * diff --git a/datafile-handler/src/androidTest/java/com/optimizely/ab/android/datafile_handler/DatafileReschedulerTest.java b/datafile-handler/src/androidTest/java/com/optimizely/ab/android/datafile_handler/DatafileReschedulerTest.java index ee79d0f1..74e8448a 100644 --- a/datafile-handler/src/androidTest/java/com/optimizely/ab/android/datafile_handler/DatafileReschedulerTest.java +++ b/datafile-handler/src/androidTest/java/com/optimizely/ab/android/datafile_handler/DatafileReschedulerTest.java @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright 2016, Optimizely, Inc. and contributors * + * Copyright 2016,2021, Optimizely, Inc. and contributors * * * * Licensed under the Apache License, Version 2.0 (the "License"); * * you may not use this file except in compliance with the License. * diff --git a/datafile-handler/src/androidTest/java/com/optimizely/ab/android/datafile_handler/DatafileServiceTest.java b/datafile-handler/src/androidTest/java/com/optimizely/ab/android/datafile_handler/DatafileServiceTest.java index 03ab0349..5d9324ed 100644 --- a/datafile-handler/src/androidTest/java/com/optimizely/ab/android/datafile_handler/DatafileServiceTest.java +++ b/datafile-handler/src/androidTest/java/com/optimizely/ab/android/datafile_handler/DatafileServiceTest.java @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright 2016, Optimizely, Inc. and contributors * + * Copyright 2016,2021, Optimizely, Inc. and contributors * * * * Licensed under the Apache License, Version 2.0 (the "License"); * * you may not use this file except in compliance with the License. * diff --git a/datafile-handler/src/main/java/com/optimizely/ab/android/datafile_handler/DatafileClient.java b/datafile-handler/src/main/java/com/optimizely/ab/android/datafile_handler/DatafileClient.java index 0719afb9..06be95db 100644 --- a/datafile-handler/src/main/java/com/optimizely/ab/android/datafile_handler/DatafileClient.java +++ b/datafile-handler/src/main/java/com/optimizely/ab/android/datafile_handler/DatafileClient.java @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright 2016-2017, Optimizely, Inc. and contributors * + * Copyright 2016-2017,2021, Optimizely, Inc. and contributors * * * * Licensed under the Apache License, Version 2.0 (the "License"); * * you may not use this file except in compliance with the License. * diff --git a/datafile-handler/src/main/java/com/optimizely/ab/android/datafile_handler/DatafileService.java b/datafile-handler/src/main/java/com/optimizely/ab/android/datafile_handler/DatafileService.java index 1b3f5476..fb503318 100644 --- a/datafile-handler/src/main/java/com/optimizely/ab/android/datafile_handler/DatafileService.java +++ b/datafile-handler/src/main/java/com/optimizely/ab/android/datafile_handler/DatafileService.java @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright 2016-2017, Optimizely, Inc. and contributors * + * Copyright 2016-2017,2021, Optimizely, Inc. and contributors * * * * Licensed under the Apache License, Version 2.0 (the "License"); * * you may not use this file except in compliance with the License. * diff --git a/datafile-handler/src/main/java/com/optimizely/ab/android/datafile_handler/DatafileServiceConnection.java b/datafile-handler/src/main/java/com/optimizely/ab/android/datafile_handler/DatafileServiceConnection.java index b21db403..246ac7a4 100644 --- a/datafile-handler/src/main/java/com/optimizely/ab/android/datafile_handler/DatafileServiceConnection.java +++ b/datafile-handler/src/main/java/com/optimizely/ab/android/datafile_handler/DatafileServiceConnection.java @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright 2017, Optimizely, Inc. and contributors * + * Copyright 2017,2021, Optimizely, Inc. and contributors * * * * Licensed under the Apache License, Version 2.0 (the "License"); * * you may not use this file except in compliance with the License. * diff --git a/event-handler/src/androidTest/java/com/optimizely/ab/android/event_handler/EventDAOTest.java b/event-handler/src/androidTest/java/com/optimizely/ab/android/event_handler/EventDAOTest.java index e61d8219..afeaecd3 100644 --- a/event-handler/src/androidTest/java/com/optimizely/ab/android/event_handler/EventDAOTest.java +++ b/event-handler/src/androidTest/java/com/optimizely/ab/android/event_handler/EventDAOTest.java @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright 2016, Optimizely, Inc. and contributors * + * Copyright 2016,2021, Optimizely, Inc. and contributors * * * * Licensed under the Apache License, Version 2.0 (the "License"); * * you may not use this file except in compliance with the License. * diff --git a/event-handler/src/androidTest/java/com/optimizely/ab/android/event_handler/EventDispatcherTest.java b/event-handler/src/androidTest/java/com/optimizely/ab/android/event_handler/EventDispatcherTest.java index fcdf5147..f21b66f9 100644 --- a/event-handler/src/androidTest/java/com/optimizely/ab/android/event_handler/EventDispatcherTest.java +++ b/event-handler/src/androidTest/java/com/optimizely/ab/android/event_handler/EventDispatcherTest.java @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright 2016, Optimizely, Inc. and contributors * + * Copyright 2016,2021, Optimizely, Inc. and contributors * * * * Licensed under the Apache License, Version 2.0 (the "License"); * * you may not use this file except in compliance with the License. * diff --git a/event-handler/src/androidTest/java/com/optimizely/ab/android/event_handler/EventSQLiteOpenHelperTest.java b/event-handler/src/androidTest/java/com/optimizely/ab/android/event_handler/EventSQLiteOpenHelperTest.java index 665804b1..6a3367ca 100644 --- a/event-handler/src/androidTest/java/com/optimizely/ab/android/event_handler/EventSQLiteOpenHelperTest.java +++ b/event-handler/src/androidTest/java/com/optimizely/ab/android/event_handler/EventSQLiteOpenHelperTest.java @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright 2016, Optimizely, Inc. and contributors * + * Copyright 2016,2021, Optimizely, Inc. and contributors * * * * Licensed under the Apache License, Version 2.0 (the "License"); * * you may not use this file except in compliance with the License. * diff --git a/event-handler/src/main/java/com/optimizely/ab/android/event_handler/EventDAO.java b/event-handler/src/main/java/com/optimizely/ab/android/event_handler/EventDAO.java index 9c2030a0..d4c05574 100644 --- a/event-handler/src/main/java/com/optimizely/ab/android/event_handler/EventDAO.java +++ b/event-handler/src/main/java/com/optimizely/ab/android/event_handler/EventDAO.java @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright 2016, Optimizely, Inc. and contributors * + * Copyright 2016,2021, Optimizely, Inc. and contributors * * * * Licensed under the Apache License, Version 2.0 (the "License"); * * you may not use this file except in compliance with the License. * diff --git a/event-handler/src/main/java/com/optimizely/ab/android/event_handler/EventIntentService.java b/event-handler/src/main/java/com/optimizely/ab/android/event_handler/EventIntentService.java index 7ae534f1..c2f45c4a 100644 --- a/event-handler/src/main/java/com/optimizely/ab/android/event_handler/EventIntentService.java +++ b/event-handler/src/main/java/com/optimizely/ab/android/event_handler/EventIntentService.java @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright 2016, Optimizely, Inc. and contributors * + * Copyright 2016,2021, Optimizely, Inc. and contributors * * * * Licensed under the Apache License, Version 2.0 (the "License"); * * you may not use this file except in compliance with the License. * diff --git a/event-handler/src/main/java/com/optimizely/ab/android/event_handler/EventSQLiteOpenHelper.java b/event-handler/src/main/java/com/optimizely/ab/android/event_handler/EventSQLiteOpenHelper.java index 1ae662e2..0aef0e73 100644 --- a/event-handler/src/main/java/com/optimizely/ab/android/event_handler/EventSQLiteOpenHelper.java +++ b/event-handler/src/main/java/com/optimizely/ab/android/event_handler/EventSQLiteOpenHelper.java @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright 2016, Optimizely, Inc. and contributors * + * Copyright 2016,2021, Optimizely, Inc. and contributors * * * * Licensed under the Apache License, Version 2.0 (the "License"); * * you may not use this file except in compliance with the License. * diff --git a/event-handler/src/test/java/com/optimizely/ab/android/event_handler/EventReschedulerTest.java b/event-handler/src/test/java/com/optimizely/ab/android/event_handler/EventReschedulerTest.java index 9fc02c8d..0ce1f218 100644 --- a/event-handler/src/test/java/com/optimizely/ab/android/event_handler/EventReschedulerTest.java +++ b/event-handler/src/test/java/com/optimizely/ab/android/event_handler/EventReschedulerTest.java @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright 2016, Optimizely, Inc. and contributors * + * Copyright 2016,2021, Optimizely, Inc. and contributors * * * * Licensed under the Apache License, Version 2.0 (the "License"); * * you may not use this file except in compliance with the License. * diff --git a/shared/src/main/java/com/optimizely/ab/android/shared/Client.java b/shared/src/main/java/com/optimizely/ab/android/shared/Client.java index dbb91526..e8d6c436 100644 --- a/shared/src/main/java/com/optimizely/ab/android/shared/Client.java +++ b/shared/src/main/java/com/optimizely/ab/android/shared/Client.java @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright 2016-2017, Optimizely, Inc. and contributors * + * Copyright 2016-2017,2021, Optimizely, Inc. and contributors * * * * Licensed under the Apache License, Version 2.0 (the "License"); * * you may not use this file except in compliance with the License. * diff --git a/shared/src/main/java/com/optimizely/ab/android/shared/ServiceScheduler.java b/shared/src/main/java/com/optimizely/ab/android/shared/ServiceScheduler.java index 77c16b91..e1ffa925 100644 --- a/shared/src/main/java/com/optimizely/ab/android/shared/ServiceScheduler.java +++ b/shared/src/main/java/com/optimizely/ab/android/shared/ServiceScheduler.java @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright 2016, Optimizely, Inc. and contributors * + * Copyright 2016,2021, Optimizely, Inc. and contributors * * * * Licensed under the Apache License, Version 2.0 (the "License"); * * you may not use this file except in compliance with the License. * diff --git a/shared/src/main/java/com/optimizely/ab/android/shared/TLSSocketFactory.java b/shared/src/main/java/com/optimizely/ab/android/shared/TLSSocketFactory.java index db3513df..d458bde0 100644 --- a/shared/src/main/java/com/optimizely/ab/android/shared/TLSSocketFactory.java +++ b/shared/src/main/java/com/optimizely/ab/android/shared/TLSSocketFactory.java @@ -1,3 +1,19 @@ +/**************************************************************************** + * Copyright 2021, Optimizely, Inc. and contributors * + * * + * Licensed under the Apache License, Version 2.0 (the "License"); * + * you may not use this file except in compliance with the License. * + * You may obtain a copy of the License at * + * * + * http://www.apache.org/licenses/LICENSE-2.0 * + * * + * Unless required by applicable law or agreed to in writing, software * + * distributed under the License is distributed on an "AS IS" BASIS, * + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * + * See the License for the specific language governing permissions and * + * limitations under the License. * + ***************************************************************************/ + package com.optimizely.ab.android.shared; import java.io.IOException; @@ -64,7 +80,7 @@ public Socket createSocket(InetAddress address, int port, InetAddress localAddre } private Socket enableTLSOnSocket(Socket socket) { - if(socket != null && (socket instanceof SSLSocket)) { + if(socket instanceof SSLSocket) { ((SSLSocket)socket).setEnabledProtocols(new String[] {"TLSv1.2"}); } return socket; diff --git a/test-app/src/main/java/com/optimizely/ab/android/test_app/MyApplication.kt b/test-app/src/main/java/com/optimizely/ab/android/test_app/MyApplication.kt index 10ef68e8..ce16faaf 100644 --- a/test-app/src/main/java/com/optimizely/ab/android/test_app/MyApplication.kt +++ b/test-app/src/main/java/com/optimizely/ab/android/test_app/MyApplication.kt @@ -1,12 +1,12 @@ /**************************************************************************** - * Copyright 2016-2020, Optimizely, Inc. and contributors * - * * + * Copyright 2016-2021, Optimizely, Inc. and contributors * + * * * Licensed under the Apache License, Version 2.0 (the "License"); * * you may not use this file except in compliance with the License. * * You may obtain a copy of the License at * - * * - * http://www.apache.org/licenses/LICENSE-2.0 * - * * + * * + * http://www.apache.org/licenses/LICENSE-2.0 * + * * * Unless required by applicable law or agreed to in writing, software * * distributed under the License is distributed on an "AS IS" BASIS, * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * diff --git a/user-profile/src/main/java/com/optimizely/ab/android/user_profile/DefaultUserProfileService.java b/user-profile/src/main/java/com/optimizely/ab/android/user_profile/DefaultUserProfileService.java index a5f05958..11cd64b5 100644 --- a/user-profile/src/main/java/com/optimizely/ab/android/user_profile/DefaultUserProfileService.java +++ b/user-profile/src/main/java/com/optimizely/ab/android/user_profile/DefaultUserProfileService.java @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright 2017, Optimizely, Inc. and contributors * + * Copyright 2017,2021, Optimizely, Inc. and contributors * * * * Licensed under the Apache License, Version 2.0 (the "License"); * * you may not use this file except in compliance with the License. * diff --git a/user-profile/src/main/java/com/optimizely/ab/android/user_profile/UserProfileCache.java b/user-profile/src/main/java/com/optimizely/ab/android/user_profile/UserProfileCache.java index bc52ce75..8e90f271 100644 --- a/user-profile/src/main/java/com/optimizely/ab/android/user_profile/UserProfileCache.java +++ b/user-profile/src/main/java/com/optimizely/ab/android/user_profile/UserProfileCache.java @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright 2017, Optimizely, Inc. and contributors * + * Copyright 2017,2021, Optimizely, Inc. and contributors * * * * Licensed under the Apache License, Version 2.0 (the "License"); * * you may not use this file except in compliance with the License. *