From 4c6dbcfd6e9c9ee33c90bbac90a9b4fc5167b1c6 Mon Sep 17 00:00:00 2001 From: Lucas Date: Mon, 4 Mar 2024 14:31:07 -0300 Subject: [PATCH 1/4] Add method to notify CodePush update into RN internal interface. --- .../api/embrace-android-sdk.api | 1 + .../ReactNativeInternalInterface.kt | 2 + .../ReactNativeInternalInterfaceImpl.kt | 32 +++++---- .../metadata/EmbraceMetadataService.kt | 33 ++++++--- .../capture/metadata/MetadataService.kt | 5 +- .../prefs/EmbracePreferencesService.kt | 5 ++ .../embracesdk/prefs/PreferencesService.kt | 5 ++ .../ReactNativeInternalInterfaceImplTest.kt | 38 ++++++++++ .../EmbraceMetadataReactNativeTest.kt | 70 +++++++++++++++++-- .../metadata/EmbraceMetadataServiceTest.kt | 2 + .../embracesdk/fakes/FakeMetadataService.kt | 4 +- .../embracesdk/fakes/FakePreferenceService.kt | 1 + .../prefs/EmbracePreferencesServiceTest.kt | 9 +++ 13 files changed, 180 insertions(+), 27 deletions(-) diff --git a/embrace-android-sdk/api/embrace-android-sdk.api b/embrace-android-sdk/api/embrace-android-sdk.api index fd66b537c..28847a753 100644 --- a/embrace-android-sdk/api/embrace-android-sdk.api +++ b/embrace-android-sdk/api/embrace-android-sdk.api @@ -145,6 +145,7 @@ public abstract interface class io/embrace/android/embracesdk/ReactNativeInterna public abstract fun logRnView (Ljava/lang/String;)V public abstract fun logUnhandledJsException (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V public abstract fun setJavaScriptBundleUrl (Landroid/content/Context;Ljava/lang/String;)V + public abstract fun setJavaScriptBundleUrlFromCodePush (Landroid/content/Context;Ljava/lang/String;Z)V public abstract fun setJavaScriptPatchNumber (Ljava/lang/String;)V public abstract fun setReactNativeSdkVersion (Ljava/lang/String;)V public abstract fun setReactNativeVersionNumber (Ljava/lang/String;)V diff --git a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/ReactNativeInternalInterface.kt b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/ReactNativeInternalInterface.kt index c6824466c..de4e3a233 100644 --- a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/ReactNativeInternalInterface.kt +++ b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/ReactNativeInternalInterface.kt @@ -33,6 +33,8 @@ public interface ReactNativeInternalInterface : EmbraceInternalInterface { public fun setJavaScriptBundleUrl(context: Context, url: String) + public fun setJavaScriptBundleUrlForCodePush(context: Context, url: String, didUpdate: Boolean) + /** * Logs a React Native Redux Action - this is not intended for public use. */ diff --git a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/ReactNativeInternalInterfaceImpl.kt b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/ReactNativeInternalInterfaceImpl.kt index f2fae8a5b..09cf28024 100644 --- a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/ReactNativeInternalInterfaceImpl.kt +++ b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/ReactNativeInternalInterfaceImpl.kt @@ -96,18 +96,11 @@ internal class ReactNativeInternalInterfaceImpl( } override fun setJavaScriptBundleUrl(context: Context, url: String) { - if (embrace.isStarted) { - if (framework != AppFramework.REACT_NATIVE) { - logger.logError( - "Failed to set Java Script bundle ID URL. Current framework: " + - framework.name + " is not React Native." - ) - return - } - metadataService.setReactNativeBundleId(context, url) - } else { - logger.logSDKNotInitialized("set JavaScript bundle URL") - } + setJavaScriptBundleUrl(context, url, null) + } + + override fun setJavaScriptBundleUrlForCodePush(context: Context, url: String, didUpdate: Boolean) { + setJavaScriptBundleUrl(context, url, didUpdate) } override fun logRnAction( @@ -124,4 +117,19 @@ internal class ReactNativeInternalInterfaceImpl( override fun logRnView(screen: String) { embrace.logRnView(screen) } + + private fun setJavaScriptBundleUrl(context: Context, url: String, didUpdate: Boolean? = null) { + if (embrace.isStarted) { + if (framework != AppFramework.REACT_NATIVE) { + logger.logError( + "Failed to set Java Script bundle ID URL. Current framework: " + + framework.name + " is not React Native." + ) + return + } + metadataService.setReactNativeBundleId(context, url, didUpdate) + } else { + logger.logSDKNotInitialized("set JavaScript bundle URL") + } + } } diff --git a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/capture/metadata/EmbraceMetadataService.kt b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/capture/metadata/EmbraceMetadataService.kt index f1723a373..f9ba1b102 100644 --- a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/capture/metadata/EmbraceMetadataService.kt +++ b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/capture/metadata/EmbraceMetadataService.kt @@ -383,20 +383,25 @@ internal class EmbraceMetadataService private constructor( override fun getEgl(): String? = egl - override fun setReactNativeBundleId(context: Context, jsBundleUrl: String?) { + override fun setReactNativeBundleId(context: Context, jsBundleUrl: String?, didCodePushBundleUpdate: Boolean?) { val currentUrl = preferencesService.javaScriptBundleURL - if (currentUrl != jsBundleUrl) { + if (currentUrl != jsBundleUrl || didCodePushBundleUpdate == true) { // It`s a new JS bundle URL, save the new value in preferences. preferencesService.javaScriptBundleURL = jsBundleUrl // Calculate the bundle ID for the new bundle URL reactNativeBundleId = metadataBackgroundWorker.submit { - computeReactNativeBundleId( + val bundleId = computeReactNativeBundleId( context, jsBundleUrl, buildInfo.buildId ) + if (didCodePushBundleUpdate != null) { + // If this was originated by Code Push, we should update the codePushJsBundleId in preferences. + preferencesService.codePushJsBundleId = bundleId + } + bundleId } } } @@ -501,11 +506,23 @@ internal class EmbraceMetadataService private constructor( if (appFramework == AppFramework.REACT_NATIVE) { reactNativeBundleId = metadataBackgroundWorker.submit { val lastKnownJsBundleUrl = preferencesService.javaScriptBundleURL - computeReactNativeBundleId( - context, - lastKnownJsBundleUrl, - buildInfo.buildId - ) + val lastKnownCodePushJsBundleId = preferencesService.codePushJsBundleId + if (!lastKnownJsBundleUrl.isNullOrEmpty() && !lastKnownCodePushJsBundleId.isNullOrEmpty()) { + // If we have a lastKnownCodePushJsBundleId, we use that as the last known bundle ID. + // This is because for CodePush, we'll be notified if the bundle is updated, and we can + // update the bundle ID at that moment. + return@submit lastKnownCodePushJsBundleId + } else { + // For other OTAs like Expo, we should calculate the bundle ID on each startup, + // as we don't have a way to know if the bundle was updated. + // If lastKnownJsBundleUrl is null, it means that neither CodePush nor any other OTA + // is being used, so the function will return the default buildId. + return@submit computeReactNativeBundleId( + context, + lastKnownJsBundleUrl, + buildInfo.buildId + ) + } } javaScriptPatchNumber = preferencesService.javaScriptPatchNumber if (javaScriptPatchNumber != null) { diff --git a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/capture/metadata/MetadataService.kt b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/capture/metadata/MetadataService.kt index 98aa31bd8..40be8fa6d 100644 --- a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/capture/metadata/MetadataService.kt +++ b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/capture/metadata/MetadataService.kt @@ -112,8 +112,11 @@ internal interface MetadataService { /** * Sets React Native Bundle ID from a custom JavaScript Bundle URL. + * @param context the context + * @param jsBundleUrl the JavaScript bundle URL + * @param didCodePushBundleUpdate if the bundle was updated and we need to recompute the bundleId */ - fun setReactNativeBundleId(context: Context, jsBundleUrl: String?) + fun setReactNativeBundleId(context: Context, jsBundleUrl: String?, didCodePushBundleUpdate: Boolean? = null) /** * Sets the Embrace Flutter SDK version diff --git a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/prefs/EmbracePreferencesService.kt b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/prefs/EmbracePreferencesService.kt index 81ea43787..dce182865 100644 --- a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/prefs/EmbracePreferencesService.kt +++ b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/prefs/EmbracePreferencesService.kt @@ -265,6 +265,10 @@ internal class EmbracePreferencesService( get() = prefs.getStringPreference(JAVA_SCRIPT_BUNDLE_URL_KEY) set(value) = prefs.setStringPreference(JAVA_SCRIPT_BUNDLE_URL_KEY, value) + override var codePushJsBundleId: String? + get() = prefs.getStringPreference(JAVA_SCRIPT_BUNDLE_ID_KEY) + set(value) = prefs.setStringPreference(JAVA_SCRIPT_BUNDLE_ID_KEY, value) + override var rnSdkVersion: String? get() = prefs.getStringPreference(REACT_NATIVE_SDK_VERSION_KEY) set(value) = prefs.setStringPreference(REACT_NATIVE_SDK_VERSION_KEY, value) @@ -372,6 +376,7 @@ internal class EmbracePreferencesService( private const val LAST_CRASH_NUMBER_KEY = "io.embrace.crashnumber" private const val LAST_NATIVE_CRASH_NUMBER_KEY = "io.embrace.nativecrashnumber" private const val JAVA_SCRIPT_BUNDLE_URL_KEY = "io.embrace.jsbundle.url" + private const val JAVA_SCRIPT_BUNDLE_ID_KEY = "io.embrace.jsbundle.id" private const val JAVA_SCRIPT_PATCH_NUMBER_KEY = "io.embrace.javascript.patch" private const val REACT_NATIVE_VERSION_KEY = "io.embrace.reactnative.version" private const val REACT_NATIVE_SDK_VERSION_KEY = "io.embrace.reactnative.sdk.version" diff --git a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/prefs/PreferencesService.kt b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/prefs/PreferencesService.kt index b230f43b6..16bfe3a78 100644 --- a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/prefs/PreferencesService.kt +++ b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/prefs/PreferencesService.kt @@ -116,6 +116,11 @@ internal interface PreferencesService { */ var javaScriptBundleURL: String? + /** + * Last Code Push javaScript bundle ID. + */ + var codePushJsBundleId: String? + /** * Embrace sdk version. */ diff --git a/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/ReactNativeInternalInterfaceImplTest.kt b/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/ReactNativeInternalInterfaceImplTest.kt index 77a61192e..03599cb70 100644 --- a/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/ReactNativeInternalInterfaceImplTest.kt +++ b/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/ReactNativeInternalInterfaceImplTest.kt @@ -158,6 +158,44 @@ internal class ReactNativeInternalInterfaceImplTest { } } + @Test + fun testSetJavaScriptBundleURLForCodePush() { + impl = ReactNativeInternalInterfaceImpl( + embrace, + mockk(), + REACT_NATIVE, + preferencesService, + crashService, + metadataService, + logger + ) + + every { embrace.isStarted } returns true + impl.setJavaScriptBundleUrlForCodePush(context, "index.android.bundle", true) + // Test that the metadata service was called with the correct parameters + assertEquals("index.android.bundle", metadataService.fakeReactNativeBundleId) + assertEquals(true, metadataService.didCodePushBundleUpdate) + } + + @Test + fun testSetJavaScriptBundleURLForOtherOTAs() { + impl = ReactNativeInternalInterfaceImpl( + embrace, + mockk(), + REACT_NATIVE, + preferencesService, + crashService, + metadataService, + logger + ) + + every { embrace.isStarted } returns true + impl.setJavaScriptBundleUrl(context, "index.android.bundle") + // Test that the metadata service was called with the correct parameters + assertEquals("index.android.bundle", metadataService.fakeReactNativeBundleId) + assertEquals(null, metadataService.didCodePushBundleUpdate) + } + @Test fun testLogUnhandledJsException() { every { embrace.isStarted } returns true diff --git a/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/capture/metadata/EmbraceMetadataReactNativeTest.kt b/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/capture/metadata/EmbraceMetadataReactNativeTest.kt index 09b22bf4c..f9084e4e5 100644 --- a/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/capture/metadata/EmbraceMetadataReactNativeTest.kt +++ b/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/capture/metadata/EmbraceMetadataReactNativeTest.kt @@ -104,6 +104,15 @@ internal class EmbraceMetadataReactNativeTest { assertEquals(buildInfo.buildId, metadataService.getReactNativeBundleId()) } + @Test + fun `test React Native bundle ID from preference if jsBundleIdUrl is a new value`() { + preferencesService.javaScriptBundleURL = "oldJavaScriptBundleURL" + val metadataService = getMetadataService() + + metadataService.setReactNativeBundleId(context, "newJavaScriptBundleURL") + assertEquals(buildInfo.buildId, metadataService.getReactNativeBundleId()) + } + @Test fun `test React Native bundle ID url as Asset`() { val bundleIdFile = Files.createTempFile("bundle-test", ".temp").toFile() @@ -115,8 +124,6 @@ internal class EmbraceMetadataReactNativeTest { val metadataService = getMetadataService() metadataService.setReactNativeBundleId(context, "assets://index.android.bundle") - // get the react native Bundle ID once to call the lazy property - metadataService.getReactNativeBundleId() verify(exactly = 1) { assetManager.open(eq("index.android.bundle")) } @@ -124,6 +131,62 @@ internal class EmbraceMetadataReactNativeTest { assertEquals("D41D8CD98F00B204E9800998ECF8427E", metadataService.getReactNativeBundleId()) } + @Test + fun `test React Native bundle ID url as Asset with CodePush didUpdate param in true`() { + val bundleIdFile = Files.createTempFile("bundle-test", ".temp").toFile() + val inputStream = FileInputStream(bundleIdFile) + preferencesService.javaScriptBundleURL = null + preferencesService.codePushJsBundleId = null + + every { context.assets } returns assetManager + every { assetManager.open(any()) } returns inputStream + + val metadataService = getMetadataService() + metadataService.setReactNativeBundleId(context, "assets://index.android.bundle", true) + + verify(exactly = 1) { assetManager.open(eq("index.android.bundle")) } + + assertNotEquals(buildInfo.buildId, metadataService.getReactNativeBundleId()) + assertEquals("D41D8CD98F00B204E9800998ECF8427E", metadataService.getReactNativeBundleId()) + assertEquals("D41D8CD98F00B204E9800998ECF8427E", preferencesService.codePushJsBundleId) + } + + @Test + fun `test React Native bundle ID url as Asset with CodePush didUpdate param in false`() { + val bundleIdFile = Files.createTempFile("bundle-test", ".temp").toFile() + val inputStream = FileInputStream(bundleIdFile) + preferencesService.javaScriptBundleURL = "assets://index.android.bundle" + preferencesService.codePushJsBundleId = "persistedBundleId" + + every { context.assets } returns assetManager + every { assetManager.open(any()) } returns inputStream + + val metadataService = getMetadataService() + metadataService.setReactNativeBundleId(context, "assets://index.android.bundle", false) + + assertNotEquals(buildInfo.buildId, metadataService.getReactNativeBundleId()) + assertEquals("persistedBundleId", metadataService.getReactNativeBundleId()) + assertEquals("persistedBundleId", preferencesService.codePushJsBundleId) + } + + @Test + fun `test React Native bundle ID url as Asset with CodePush didUpdate param being null`() { + val bundleIdFile = Files.createTempFile("bundle-test", ".temp").toFile() + val inputStream = FileInputStream(bundleIdFile) + preferencesService.javaScriptBundleURL = null + preferencesService.codePushJsBundleId = null + + every { context.assets } returns assetManager + every { assetManager.open(any()) } returns inputStream + + val metadataService = getMetadataService() + metadataService.setReactNativeBundleId(context, "assets://index.android.bundle", null) + + assertNotEquals(buildInfo.buildId, metadataService.getReactNativeBundleId()) + assertEquals("D41D8CD98F00B204E9800998ECF8427E", metadataService.getReactNativeBundleId()) + assertEquals(null, preferencesService.codePushJsBundleId) + } + @Test fun `test React Native bundle ID url as a custom file`() { val bundleIdFile = Files.createTempFile("index.android.bundle", "temp").toFile() @@ -132,9 +195,6 @@ internal class EmbraceMetadataReactNativeTest { context, bundleIdFile.absolutePath ) - // get the react native Bundle ID once to call the lazy property - metadataService.getReactNativeBundleId() - assertNotEquals(buildInfo.buildId, metadataService.getReactNativeBundleId()) assertEquals("D41D8CD98F00B204E9800998ECF8427E", metadataService.getReactNativeBundleId()) } diff --git a/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/capture/metadata/EmbraceMetadataServiceTest.kt b/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/capture/metadata/EmbraceMetadataServiceTest.kt index 79394243e..e852f427f 100644 --- a/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/capture/metadata/EmbraceMetadataServiceTest.kt +++ b/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/capture/metadata/EmbraceMetadataServiceTest.kt @@ -217,6 +217,8 @@ internal class EmbraceMetadataServiceTest { every { preferencesService.unityBuildIdNumber }.returns(null) every { preferencesService.rnSdkVersion }.returns(null) every { preferencesService.javaScriptPatchNumber }.returns(null) + every { preferencesService.javaScriptBundleURL }.returns(null) + every { preferencesService.codePushJsBundleId }.returns(null) every { MetadataUtils.appEnvironment(any()) }.returns("UNKNOWN") val metadataService = getReactNativeMetadataService() diff --git a/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/fakes/FakeMetadataService.kt b/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/fakes/FakeMetadataService.kt index 2bea8e807..854bbc8ee 100644 --- a/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/fakes/FakeMetadataService.kt +++ b/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/fakes/FakeMetadataService.kt @@ -44,6 +44,7 @@ internal class FakeMetadataService(sessionId: String? = null) : MetadataService var fakeAppId: String = "o0o0o" var fakeDeviceId: String = "07D85B44E4E245F4A30E559BFC0D07FF" var fakeReactNativeBundleId: String? = "fakeReactNativeBundleId" + var didCodePushBundleUpdate: Boolean? = null var fakeFlutterSdkVersion: String? = "fakeFlutterSdkVersion" var fakeDartVersion: String? = "fakeDartVersion" var fakeRnSdkVersion: String? = "fakeRnSdkVersion" @@ -96,8 +97,9 @@ internal class FakeMetadataService(sessionId: String? = null) : MetadataService override fun getAppState(): String = appState - override fun setReactNativeBundleId(context: Context, jsBundleUrl: String?) { + override fun setReactNativeBundleId(context: Context, jsBundleUrl: String?, didCodePushBundleUpdate: Boolean?) { fakeReactNativeBundleId = jsBundleUrl + this.didCodePushBundleUpdate = didCodePushBundleUpdate } override fun setEmbraceFlutterSdkVersion(version: String?) { diff --git a/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/fakes/FakePreferenceService.kt b/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/fakes/FakePreferenceService.kt index 033b986de..c13278c70 100644 --- a/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/fakes/FakePreferenceService.kt +++ b/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/fakes/FakePreferenceService.kt @@ -27,6 +27,7 @@ internal class FakePreferenceService( override var backgroundActivityEnabled: Boolean = false, override var dartSdkVersion: String? = null, override var javaScriptBundleURL: String? = null, + override var codePushJsBundleId: String? = null, override var rnSdkVersion: String? = null, override var javaScriptPatchNumber: String? = null, override var embraceFlutterSdkVersion: String? = null, diff --git a/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/prefs/EmbracePreferencesServiceTest.kt b/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/prefs/EmbracePreferencesServiceTest.kt index 6b4a82cc9..1680934a8 100644 --- a/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/prefs/EmbracePreferencesServiceTest.kt +++ b/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/prefs/EmbracePreferencesServiceTest.kt @@ -247,6 +247,15 @@ internal class EmbracePreferencesServiceTest { assertEquals(url, service.javaScriptBundleURL) } + @Test + fun `test code push JS bundle id is saved`() { + assertNull(service.codePushJsBundleId) + + val id = "0d48510589c0426b43f01a5fa060a333" + service.codePushJsBundleId = id + assertEquals(id, service.codePushJsBundleId) + } + @Test fun `test java script patch number is saved`() { assertNull(service.javaScriptPatchNumber) From 182934a5ba53b12cd1e4b4a456ed910f421a9a3a Mon Sep 17 00:00:00 2001 From: Lucas Date: Mon, 4 Mar 2024 14:50:32 -0300 Subject: [PATCH 2/4] Update API method name. --- embrace-android-sdk/api/embrace-android-sdk.api | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/embrace-android-sdk/api/embrace-android-sdk.api b/embrace-android-sdk/api/embrace-android-sdk.api index 28847a753..518d3ce8b 100644 --- a/embrace-android-sdk/api/embrace-android-sdk.api +++ b/embrace-android-sdk/api/embrace-android-sdk.api @@ -145,7 +145,7 @@ public abstract interface class io/embrace/android/embracesdk/ReactNativeInterna public abstract fun logRnView (Ljava/lang/String;)V public abstract fun logUnhandledJsException (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V public abstract fun setJavaScriptBundleUrl (Landroid/content/Context;Ljava/lang/String;)V - public abstract fun setJavaScriptBundleUrlFromCodePush (Landroid/content/Context;Ljava/lang/String;Z)V + public abstract fun setJavaScriptBundleUrlForCodePush (Landroid/content/Context;Ljava/lang/String;Z)V public abstract fun setJavaScriptPatchNumber (Ljava/lang/String;)V public abstract fun setReactNativeSdkVersion (Ljava/lang/String;)V public abstract fun setReactNativeVersionNumber (Ljava/lang/String;)V From 5201211eacf96a7d82fe56ba3cf6a7ec3a2449c5 Mon Sep 17 00:00:00 2001 From: Lucas Date: Mon, 4 Mar 2024 15:29:52 -0300 Subject: [PATCH 3/4] Rename method to setCacheableJavaScriptBundleUrl --- .../android/embracesdk/ReactNativeInternalInterface.kt | 2 +- .../android/embracesdk/ReactNativeInternalInterfaceImpl.kt | 2 +- .../embracesdk/ReactNativeInternalInterfaceImplTest.kt | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/ReactNativeInternalInterface.kt b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/ReactNativeInternalInterface.kt index de4e3a233..db764ef5d 100644 --- a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/ReactNativeInternalInterface.kt +++ b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/ReactNativeInternalInterface.kt @@ -33,7 +33,7 @@ public interface ReactNativeInternalInterface : EmbraceInternalInterface { public fun setJavaScriptBundleUrl(context: Context, url: String) - public fun setJavaScriptBundleUrlForCodePush(context: Context, url: String, didUpdate: Boolean) + public fun setCacheableJavaScriptBundleUrl(context: Context, url: String, didUpdate: Boolean) /** * Logs a React Native Redux Action - this is not intended for public use. diff --git a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/ReactNativeInternalInterfaceImpl.kt b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/ReactNativeInternalInterfaceImpl.kt index 09cf28024..5dbc85235 100644 --- a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/ReactNativeInternalInterfaceImpl.kt +++ b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/ReactNativeInternalInterfaceImpl.kt @@ -99,7 +99,7 @@ internal class ReactNativeInternalInterfaceImpl( setJavaScriptBundleUrl(context, url, null) } - override fun setJavaScriptBundleUrlForCodePush(context: Context, url: String, didUpdate: Boolean) { + override fun setCacheableJavaScriptBundleUrl(context: Context, url: String, didUpdate: Boolean) { setJavaScriptBundleUrl(context, url, didUpdate) } diff --git a/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/ReactNativeInternalInterfaceImplTest.kt b/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/ReactNativeInternalInterfaceImplTest.kt index 03599cb70..71d2dae23 100644 --- a/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/ReactNativeInternalInterfaceImplTest.kt +++ b/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/ReactNativeInternalInterfaceImplTest.kt @@ -159,7 +159,7 @@ internal class ReactNativeInternalInterfaceImplTest { } @Test - fun testSetJavaScriptBundleURLForCodePush() { + fun testSetCacheableJavaScriptBundleUrl() { impl = ReactNativeInternalInterfaceImpl( embrace, mockk(), @@ -171,7 +171,7 @@ internal class ReactNativeInternalInterfaceImplTest { ) every { embrace.isStarted } returns true - impl.setJavaScriptBundleUrlForCodePush(context, "index.android.bundle", true) + impl.setCacheableJavaScriptBundleUrl(context, "index.android.bundle", true) // Test that the metadata service was called with the correct parameters assertEquals("index.android.bundle", metadataService.fakeReactNativeBundleId) assertEquals(true, metadataService.didCodePushBundleUpdate) From d74b3aa6097ff2884c69a43d17e3d6d516207764 Mon Sep 17 00:00:00 2001 From: Lucas Date: Mon, 4 Mar 2024 15:53:37 -0300 Subject: [PATCH 4/4] Renaming. --- .../api/embrace-android-sdk.api | 2 +- .../ReactNativeInternalInterface.kt | 13 ++++++++++ .../metadata/EmbraceMetadataService.kt | 26 ++++++++----------- .../capture/metadata/MetadataService.kt | 4 +-- .../prefs/EmbracePreferencesService.kt | 2 +- .../embracesdk/prefs/PreferencesService.kt | 4 +-- .../ReactNativeInternalInterfaceImplTest.kt | 4 +-- .../EmbraceMetadataReactNativeTest.kt | 18 ++++++------- .../metadata/EmbraceMetadataServiceTest.kt | 2 +- .../embracesdk/fakes/FakeMetadataService.kt | 6 ++--- .../embracesdk/fakes/FakePreferenceService.kt | 2 +- .../prefs/EmbracePreferencesServiceTest.kt | 8 +++--- 12 files changed, 50 insertions(+), 41 deletions(-) diff --git a/embrace-android-sdk/api/embrace-android-sdk.api b/embrace-android-sdk/api/embrace-android-sdk.api index 518d3ce8b..e700e6c7e 100644 --- a/embrace-android-sdk/api/embrace-android-sdk.api +++ b/embrace-android-sdk/api/embrace-android-sdk.api @@ -144,8 +144,8 @@ public abstract interface class io/embrace/android/embracesdk/ReactNativeInterna public abstract fun logRnAction (Ljava/lang/String;JJLjava/util/Map;ILjava/lang/String;)V public abstract fun logRnView (Ljava/lang/String;)V public abstract fun logUnhandledJsException (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V + public abstract fun setCacheableJavaScriptBundleUrl (Landroid/content/Context;Ljava/lang/String;Z)V public abstract fun setJavaScriptBundleUrl (Landroid/content/Context;Ljava/lang/String;)V - public abstract fun setJavaScriptBundleUrlForCodePush (Landroid/content/Context;Ljava/lang/String;Z)V public abstract fun setJavaScriptPatchNumber (Ljava/lang/String;)V public abstract fun setReactNativeSdkVersion (Ljava/lang/String;)V public abstract fun setReactNativeVersionNumber (Ljava/lang/String;)V diff --git a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/ReactNativeInternalInterface.kt b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/ReactNativeInternalInterface.kt index db764ef5d..de9f25888 100644 --- a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/ReactNativeInternalInterface.kt +++ b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/ReactNativeInternalInterface.kt @@ -31,8 +31,21 @@ public interface ReactNativeInternalInterface : EmbraceInternalInterface { public fun setReactNativeVersionNumber(version: String?) + /** + * Sets the React Native Bundle URL. + * @param context the context + * @param url the JavaScript bundle URL + */ public fun setJavaScriptBundleUrl(context: Context, url: String) + /** + * Sets the React Native Bundle URL, indicating if the bundle was updated or not. + * If it was updated, the bundle ID will be recomputed. + * If not, the bundle ID will be retrieved from cache. + * @param context the context + * @param url the JavaScript bundle URL + * @param didUpdate if the bundle was updated + */ public fun setCacheableJavaScriptBundleUrl(context: Context, url: String, didUpdate: Boolean) /** diff --git a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/capture/metadata/EmbraceMetadataService.kt b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/capture/metadata/EmbraceMetadataService.kt index f9ba1b102..7ac3dc13c 100644 --- a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/capture/metadata/EmbraceMetadataService.kt +++ b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/capture/metadata/EmbraceMetadataService.kt @@ -383,10 +383,10 @@ internal class EmbraceMetadataService private constructor( override fun getEgl(): String? = egl - override fun setReactNativeBundleId(context: Context, jsBundleUrl: String?, didCodePushBundleUpdate: Boolean?) { + override fun setReactNativeBundleId(context: Context, jsBundleUrl: String?, forceUpdate: Boolean?) { val currentUrl = preferencesService.javaScriptBundleURL - if (currentUrl != jsBundleUrl || didCodePushBundleUpdate == true) { + if (currentUrl != jsBundleUrl || forceUpdate == true) { // It`s a new JS bundle URL, save the new value in preferences. preferencesService.javaScriptBundleURL = jsBundleUrl @@ -397,9 +397,9 @@ internal class EmbraceMetadataService private constructor( jsBundleUrl, buildInfo.buildId ) - if (didCodePushBundleUpdate != null) { - // If this was originated by Code Push, we should update the codePushJsBundleId in preferences. - preferencesService.codePushJsBundleId = bundleId + if (forceUpdate != null) { + // if we have a value for forceUpdate, it means the bundleId is cacheable and we should store it. + preferencesService.javaScriptBundleId = bundleId } bundleId } @@ -506,17 +506,13 @@ internal class EmbraceMetadataService private constructor( if (appFramework == AppFramework.REACT_NATIVE) { reactNativeBundleId = metadataBackgroundWorker.submit { val lastKnownJsBundleUrl = preferencesService.javaScriptBundleURL - val lastKnownCodePushJsBundleId = preferencesService.codePushJsBundleId - if (!lastKnownJsBundleUrl.isNullOrEmpty() && !lastKnownCodePushJsBundleId.isNullOrEmpty()) { - // If we have a lastKnownCodePushJsBundleId, we use that as the last known bundle ID. - // This is because for CodePush, we'll be notified if the bundle is updated, and we can - // update the bundle ID at that moment. - return@submit lastKnownCodePushJsBundleId + val lastKnownJsBundleId = preferencesService.javaScriptBundleId + if (!lastKnownJsBundleUrl.isNullOrEmpty() && !lastKnownJsBundleId.isNullOrEmpty()) { + // If we have a lastKnownJsBundleId, we use that as the last known bundle ID. + return@submit lastKnownJsBundleId } else { - // For other OTAs like Expo, we should calculate the bundle ID on each startup, - // as we don't have a way to know if the bundle was updated. - // If lastKnownJsBundleUrl is null, it means that neither CodePush nor any other OTA - // is being used, so the function will return the default buildId. + // If we don't have a lastKnownJsBundleId, we compute the bundle ID from the last known JS bundle URL. + // If the last known JS bundle URL is null, we set React Native bundle ID to the buildId. return@submit computeReactNativeBundleId( context, lastKnownJsBundleUrl, diff --git a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/capture/metadata/MetadataService.kt b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/capture/metadata/MetadataService.kt index 40be8fa6d..4b91c94e9 100644 --- a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/capture/metadata/MetadataService.kt +++ b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/capture/metadata/MetadataService.kt @@ -114,9 +114,9 @@ internal interface MetadataService { * Sets React Native Bundle ID from a custom JavaScript Bundle URL. * @param context the context * @param jsBundleUrl the JavaScript bundle URL - * @param didCodePushBundleUpdate if the bundle was updated and we need to recompute the bundleId + * @param forceUpdate if the bundle was updated and we need to recompute the bundleId */ - fun setReactNativeBundleId(context: Context, jsBundleUrl: String?, didCodePushBundleUpdate: Boolean? = null) + fun setReactNativeBundleId(context: Context, jsBundleUrl: String?, forceUpdate: Boolean? = null) /** * Sets the Embrace Flutter SDK version diff --git a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/prefs/EmbracePreferencesService.kt b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/prefs/EmbracePreferencesService.kt index dce182865..ca5e3b0f2 100644 --- a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/prefs/EmbracePreferencesService.kt +++ b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/prefs/EmbracePreferencesService.kt @@ -265,7 +265,7 @@ internal class EmbracePreferencesService( get() = prefs.getStringPreference(JAVA_SCRIPT_BUNDLE_URL_KEY) set(value) = prefs.setStringPreference(JAVA_SCRIPT_BUNDLE_URL_KEY, value) - override var codePushJsBundleId: String? + override var javaScriptBundleId: String? get() = prefs.getStringPreference(JAVA_SCRIPT_BUNDLE_ID_KEY) set(value) = prefs.setStringPreference(JAVA_SCRIPT_BUNDLE_ID_KEY, value) diff --git a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/prefs/PreferencesService.kt b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/prefs/PreferencesService.kt index 16bfe3a78..7bd85c943 100644 --- a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/prefs/PreferencesService.kt +++ b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/prefs/PreferencesService.kt @@ -117,9 +117,9 @@ internal interface PreferencesService { var javaScriptBundleURL: String? /** - * Last Code Push javaScript bundle ID. + * Last javaScript bundle ID. */ - var codePushJsBundleId: String? + var javaScriptBundleId: String? /** * Embrace sdk version. diff --git a/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/ReactNativeInternalInterfaceImplTest.kt b/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/ReactNativeInternalInterfaceImplTest.kt index 71d2dae23..f624dbfcc 100644 --- a/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/ReactNativeInternalInterfaceImplTest.kt +++ b/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/ReactNativeInternalInterfaceImplTest.kt @@ -174,7 +174,7 @@ internal class ReactNativeInternalInterfaceImplTest { impl.setCacheableJavaScriptBundleUrl(context, "index.android.bundle", true) // Test that the metadata service was called with the correct parameters assertEquals("index.android.bundle", metadataService.fakeReactNativeBundleId) - assertEquals(true, metadataService.didCodePushBundleUpdate) + assertEquals(true, metadataService.forceUpdate) } @Test @@ -193,7 +193,7 @@ internal class ReactNativeInternalInterfaceImplTest { impl.setJavaScriptBundleUrl(context, "index.android.bundle") // Test that the metadata service was called with the correct parameters assertEquals("index.android.bundle", metadataService.fakeReactNativeBundleId) - assertEquals(null, metadataService.didCodePushBundleUpdate) + assertEquals(null, metadataService.forceUpdate) } @Test diff --git a/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/capture/metadata/EmbraceMetadataReactNativeTest.kt b/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/capture/metadata/EmbraceMetadataReactNativeTest.kt index f9084e4e5..31af3c9e1 100644 --- a/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/capture/metadata/EmbraceMetadataReactNativeTest.kt +++ b/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/capture/metadata/EmbraceMetadataReactNativeTest.kt @@ -132,11 +132,11 @@ internal class EmbraceMetadataReactNativeTest { } @Test - fun `test React Native bundle ID url as Asset with CodePush didUpdate param in true`() { + fun `test React Native bundle ID url as Asset with forceUpdate param in true`() { val bundleIdFile = Files.createTempFile("bundle-test", ".temp").toFile() val inputStream = FileInputStream(bundleIdFile) preferencesService.javaScriptBundleURL = null - preferencesService.codePushJsBundleId = null + preferencesService.javaScriptBundleId = null every { context.assets } returns assetManager every { assetManager.open(any()) } returns inputStream @@ -148,15 +148,15 @@ internal class EmbraceMetadataReactNativeTest { assertNotEquals(buildInfo.buildId, metadataService.getReactNativeBundleId()) assertEquals("D41D8CD98F00B204E9800998ECF8427E", metadataService.getReactNativeBundleId()) - assertEquals("D41D8CD98F00B204E9800998ECF8427E", preferencesService.codePushJsBundleId) + assertEquals("D41D8CD98F00B204E9800998ECF8427E", preferencesService.javaScriptBundleId) } @Test - fun `test React Native bundle ID url as Asset with CodePush didUpdate param in false`() { + fun `test React Native bundle ID url as Asset with forceUpdate param in false`() { val bundleIdFile = Files.createTempFile("bundle-test", ".temp").toFile() val inputStream = FileInputStream(bundleIdFile) preferencesService.javaScriptBundleURL = "assets://index.android.bundle" - preferencesService.codePushJsBundleId = "persistedBundleId" + preferencesService.javaScriptBundleId = "persistedBundleId" every { context.assets } returns assetManager every { assetManager.open(any()) } returns inputStream @@ -166,15 +166,15 @@ internal class EmbraceMetadataReactNativeTest { assertNotEquals(buildInfo.buildId, metadataService.getReactNativeBundleId()) assertEquals("persistedBundleId", metadataService.getReactNativeBundleId()) - assertEquals("persistedBundleId", preferencesService.codePushJsBundleId) + assertEquals("persistedBundleId", preferencesService.javaScriptBundleId) } @Test - fun `test React Native bundle ID url as Asset with CodePush didUpdate param being null`() { + fun `test React Native bundle ID url as Asset with forceUpdate param being null`() { val bundleIdFile = Files.createTempFile("bundle-test", ".temp").toFile() val inputStream = FileInputStream(bundleIdFile) preferencesService.javaScriptBundleURL = null - preferencesService.codePushJsBundleId = null + preferencesService.javaScriptBundleId = null every { context.assets } returns assetManager every { assetManager.open(any()) } returns inputStream @@ -184,7 +184,7 @@ internal class EmbraceMetadataReactNativeTest { assertNotEquals(buildInfo.buildId, metadataService.getReactNativeBundleId()) assertEquals("D41D8CD98F00B204E9800998ECF8427E", metadataService.getReactNativeBundleId()) - assertEquals(null, preferencesService.codePushJsBundleId) + assertEquals(null, preferencesService.javaScriptBundleId) } @Test diff --git a/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/capture/metadata/EmbraceMetadataServiceTest.kt b/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/capture/metadata/EmbraceMetadataServiceTest.kt index e852f427f..d7a08196a 100644 --- a/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/capture/metadata/EmbraceMetadataServiceTest.kt +++ b/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/capture/metadata/EmbraceMetadataServiceTest.kt @@ -218,7 +218,7 @@ internal class EmbraceMetadataServiceTest { every { preferencesService.rnSdkVersion }.returns(null) every { preferencesService.javaScriptPatchNumber }.returns(null) every { preferencesService.javaScriptBundleURL }.returns(null) - every { preferencesService.codePushJsBundleId }.returns(null) + every { preferencesService.javaScriptBundleId }.returns(null) every { MetadataUtils.appEnvironment(any()) }.returns("UNKNOWN") val metadataService = getReactNativeMetadataService() diff --git a/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/fakes/FakeMetadataService.kt b/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/fakes/FakeMetadataService.kt index 854bbc8ee..6a00486ae 100644 --- a/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/fakes/FakeMetadataService.kt +++ b/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/fakes/FakeMetadataService.kt @@ -44,7 +44,7 @@ internal class FakeMetadataService(sessionId: String? = null) : MetadataService var fakeAppId: String = "o0o0o" var fakeDeviceId: String = "07D85B44E4E245F4A30E559BFC0D07FF" var fakeReactNativeBundleId: String? = "fakeReactNativeBundleId" - var didCodePushBundleUpdate: Boolean? = null + var forceUpdate: Boolean? = null var fakeFlutterSdkVersion: String? = "fakeFlutterSdkVersion" var fakeDartVersion: String? = "fakeDartVersion" var fakeRnSdkVersion: String? = "fakeRnSdkVersion" @@ -97,9 +97,9 @@ internal class FakeMetadataService(sessionId: String? = null) : MetadataService override fun getAppState(): String = appState - override fun setReactNativeBundleId(context: Context, jsBundleUrl: String?, didCodePushBundleUpdate: Boolean?) { + override fun setReactNativeBundleId(context: Context, jsBundleUrl: String?, forceUpdate: Boolean?) { fakeReactNativeBundleId = jsBundleUrl - this.didCodePushBundleUpdate = didCodePushBundleUpdate + this.forceUpdate = forceUpdate } override fun setEmbraceFlutterSdkVersion(version: String?) { diff --git a/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/fakes/FakePreferenceService.kt b/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/fakes/FakePreferenceService.kt index c13278c70..0d2c0b165 100644 --- a/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/fakes/FakePreferenceService.kt +++ b/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/fakes/FakePreferenceService.kt @@ -27,7 +27,7 @@ internal class FakePreferenceService( override var backgroundActivityEnabled: Boolean = false, override var dartSdkVersion: String? = null, override var javaScriptBundleURL: String? = null, - override var codePushJsBundleId: String? = null, + override var javaScriptBundleId: String? = null, override var rnSdkVersion: String? = null, override var javaScriptPatchNumber: String? = null, override var embraceFlutterSdkVersion: String? = null, diff --git a/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/prefs/EmbracePreferencesServiceTest.kt b/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/prefs/EmbracePreferencesServiceTest.kt index 1680934a8..3194d91d8 100644 --- a/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/prefs/EmbracePreferencesServiceTest.kt +++ b/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/prefs/EmbracePreferencesServiceTest.kt @@ -248,12 +248,12 @@ internal class EmbracePreferencesServiceTest { } @Test - fun `test code push JS bundle id is saved`() { - assertNull(service.codePushJsBundleId) + fun `test java script bundle id is saved`() { + assertNull(service.javaScriptBundleId) val id = "0d48510589c0426b43f01a5fa060a333" - service.codePushJsBundleId = id - assertEquals(id, service.codePushJsBundleId) + service.javaScriptBundleId = id + assertEquals(id, service.javaScriptBundleId) } @Test