From 8c95b657020b9da37caf60aecfb65384436e3206 Mon Sep 17 00:00:00 2001 From: tore-statsig <74584483+tore-statsig@users.noreply.github.com> Date: Thu, 11 Aug 2022 14:53:09 -0700 Subject: [PATCH 1/2] Expose isInitialized, try/catch store initialization --- src/main/java/com/statsig/androidsdk/Statsig.kt | 10 ++++++++++ src/main/java/com/statsig/androidsdk/Store.kt | 4 ++-- .../java/com/statsig/androidsdk/StatsigCacheTest.kt | 2 ++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/statsig/androidsdk/Statsig.kt b/src/main/java/com/statsig/androidsdk/Statsig.kt index acf8e5d..ce504a6 100644 --- a/src/main/java/com/statsig/androidsdk/Statsig.kt +++ b/src/main/java/com/statsig/androidsdk/Statsig.kt @@ -326,6 +326,16 @@ object Statsig { return result ?: StatsigOverrides(mutableMapOf(), mutableMapOf()) } + /** + * @return true if the SDK is initialized (usable), though the most up + * to date values will not be fetched from the network until async initialization + * is complete + */ + @JvmStatic + fun isInitialized(): Boolean { + return client.isInitialized() + } + private fun enforceInitialized(functionName: String) { client.enforceInitialized(functionName) } diff --git a/src/main/java/com/statsig/androidsdk/Store.kt b/src/main/java/com/statsig/androidsdk/Store.kt index 49cbb3d..542c3da 100644 --- a/src/main/java/com/statsig/androidsdk/Store.kt +++ b/src/main/java/com/statsig/androidsdk/Store.kt @@ -45,8 +45,8 @@ internal class Store (private val sharedPrefs: SharedPreferences, user: StatsigU currentUserCacheKey = user.getCacheKey() if (cachedResponse != null) { - val type = object : TypeToken>() {}.type try { + val type = object : TypeToken>() {}.type cacheById = gson.fromJson(cachedResponse, type) ?: cacheById } catch (_: Exception) { StatsigUtil.removeFromSharedPrefs(sharedPrefs, CACHE_BY_USER_KEY) @@ -55,8 +55,8 @@ internal class Store (private val sharedPrefs: SharedPreferences, user: StatsigU stickyDeviceExperiments = mutableMapOf() if (cachedDeviceValues != null) { - val type = object : TypeToken>() {}.type try { + val type = object : TypeToken>() {}.type stickyDeviceExperiments = gson.fromJson(cachedDeviceValues, type) ?: stickyDeviceExperiments } catch (_: Exception) { StatsigUtil.removeFromSharedPrefs(sharedPrefs, STICKY_DEVICE_EXPERIMENTS_KEY) diff --git a/src/test/java/com/statsig/androidsdk/StatsigCacheTest.kt b/src/test/java/com/statsig/androidsdk/StatsigCacheTest.kt index 64ad096..0e988f8 100644 --- a/src/test/java/com/statsig/androidsdk/StatsigCacheTest.kt +++ b/src/test/java/com/statsig/androidsdk/StatsigCacheTest.kt @@ -55,7 +55,9 @@ class StatsigCacheTest { testSharedPrefs.edit().putString("Statsig.CACHE_BY_USER", gson.toJson(cacheById)) + assertFalse(Statsig.isInitialized()) TestUtil.startStatsigAndDontWait(app, user, StatsigOptions()) + assertTrue(Statsig.isInitialized()) client = Statsig.client assertTrue(client.checkGate("always_on")) From 089029f99359361cf3b5b48c1c78fb437faf954e Mon Sep 17 00:00:00 2001 From: tore-statsig <74584483+tore-statsig@users.noreply.github.com> Date: Thu, 11 Aug 2022 15:19:23 -0700 Subject: [PATCH 2/2] use error boundry to capture exceptions --- src/main/java/com/statsig/androidsdk/Store.kt | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/statsig/androidsdk/Store.kt b/src/main/java/com/statsig/androidsdk/Store.kt index 542c3da..fa0d9a8 100644 --- a/src/main/java/com/statsig/androidsdk/Store.kt +++ b/src/main/java/com/statsig/androidsdk/Store.kt @@ -45,31 +45,31 @@ internal class Store (private val sharedPrefs: SharedPreferences, user: StatsigU currentUserCacheKey = user.getCacheKey() if (cachedResponse != null) { - try { + Statsig.errorBoundary.capture({ val type = object : TypeToken>() {}.type cacheById = gson.fromJson(cachedResponse, type) ?: cacheById - } catch (_: Exception) { + }, { StatsigUtil.removeFromSharedPrefs(sharedPrefs, CACHE_BY_USER_KEY) - } + }) } stickyDeviceExperiments = mutableMapOf() if (cachedDeviceValues != null) { - try { + Statsig.errorBoundary.capture({ val type = object : TypeToken>() {}.type stickyDeviceExperiments = gson.fromJson(cachedDeviceValues, type) ?: stickyDeviceExperiments - } catch (_: Exception) { + }, { StatsigUtil.removeFromSharedPrefs(sharedPrefs, STICKY_DEVICE_EXPERIMENTS_KEY) - } + }) } localOverrides = StatsigOverrides(mutableMapOf(), mutableMapOf()) if (cachedLocalOverrides != null) { - try { + Statsig.errorBoundary.capture({ localOverrides = gson.fromJson(cachedLocalOverrides, StatsigOverrides::class.java) - } catch (_: Exception) { + }, { StatsigUtil.removeFromSharedPrefs(sharedPrefs, LOCAL_OVERRIDES_KEY) - } + }) } reason = EvaluationReason.Uninitialized currentCache = loadCacheForCurrentUser()