From 37183bbcaf33b67eac8164f42cda2accbaa476ec Mon Sep 17 00:00:00 2001 From: bboothe-branch Date: Mon, 24 Nov 2025 15:11:04 -0500 Subject: [PATCH 1/4] moved Branch.getAutoInstance() to background thread and set await before initializeBranch --- .../BranchLinkSimulatorApplication.kt | 38 +++++++++++++++++-- .../branchlinksimulator/MainActivity.kt | 2 + 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/io/branch/branchlinksimulator/BranchLinkSimulatorApplication.kt b/app/src/main/java/io/branch/branchlinksimulator/BranchLinkSimulatorApplication.kt index fb1bfea..2096da5 100644 --- a/app/src/main/java/io/branch/branchlinksimulator/BranchLinkSimulatorApplication.kt +++ b/app/src/main/java/io/branch/branchlinksimulator/BranchLinkSimulatorApplication.kt @@ -2,14 +2,26 @@ package io.branch.branchlinksimulator import android.app.Application import android.content.Context +import android.util.Log import io.branch.referral.Branch +import kotlinx.coroutines.CompletableDeferred import java.util.UUID +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext + class BranchLinkSimulatorApplication: Application() { lateinit var currentConfig: ApiConfiguration lateinit var roundTripStore: RoundTripStore private set + private val applicationJob = SupervisorJob() + val applicationScope = CoroutineScope(Dispatchers.Main + applicationJob) + val branchInitializationSignal = CompletableDeferred() + override fun onCreate() { super.onCreate() @@ -21,7 +33,7 @@ class BranchLinkSimulatorApplication: Application() { roundTripStore = RoundTripStore(this) Branch.enableLogging(roundTripStore) // Branch object initialization - Branch.getAutoInstance(this, currentConfig.branchKey) + // Branch.getAutoInstance(this, currentConfig.branchKey) // Retrieve or create the bls_session_id val sharedPreferences = getSharedPreferences("branch_session_prefs", Context.MODE_PRIVATE) @@ -30,8 +42,28 @@ class BranchLinkSimulatorApplication: Application() { sharedPreferences.edit().putString("bls_session_id", newId).apply() newId } + Log.d("AppScopeTest", "Application Fired launching coroutine") + applicationScope.launch { + Log.e("AppScopeTest", "Coroutine Successfully fired") + setupBranchInstance(this@BranchLinkSimulatorApplication, currentConfig.branchKey) + + withContext(Dispatchers.Main) { - // Set the bls_session_id in Branch request metadata - Branch.getInstance().setRequestMetadata("bls_session_id", blsSessionId) + // Set the bls_session_id in Branch request metadata + Branch.getInstance().setRequestMetadata("bls_session_id", blsSessionId) + } + } + } + + override fun onTerminate() { + super.onTerminate() + applicationJob.cancel() + } + + suspend fun setupBranchInstance(context: Context, branchKey: String) { + withContext(Dispatchers.IO) { + Branch.getAutoInstance(context, branchKey) + } + branchInitializationSignal.complete(Unit) } } \ No newline at end of file diff --git a/app/src/main/java/io/branch/branchlinksimulator/MainActivity.kt b/app/src/main/java/io/branch/branchlinksimulator/MainActivity.kt index 1212a20..c0c45ed 100644 --- a/app/src/main/java/io/branch/branchlinksimulator/MainActivity.kt +++ b/app/src/main/java/io/branch/branchlinksimulator/MainActivity.kt @@ -120,6 +120,8 @@ class MainActivity : ComponentActivity() { } lifecycleScope.launch { + val app = application as BranchLinkSimulatorApplication + app.branchInitializationSignal.await() val initErrorMessage = initializeBranch() initErrorMessageState.value = initErrorMessage } From 48adb420aeff616e6c1c557d902813a3c3eaf731 Mon Sep 17 00:00:00 2001 From: bboothe-branch Date: Mon, 24 Nov 2025 15:26:30 -0500 Subject: [PATCH 2/4] updated comments to clarify new structure --- .../branchlinksimulator/BranchLinkSimulatorApplication.kt | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/io/branch/branchlinksimulator/BranchLinkSimulatorApplication.kt b/app/src/main/java/io/branch/branchlinksimulator/BranchLinkSimulatorApplication.kt index 2096da5..f47ee31 100644 --- a/app/src/main/java/io/branch/branchlinksimulator/BranchLinkSimulatorApplication.kt +++ b/app/src/main/java/io/branch/branchlinksimulator/BranchLinkSimulatorApplication.kt @@ -32,8 +32,6 @@ class BranchLinkSimulatorApplication: Application() { roundTripStore = RoundTripStore(this) Branch.enableLogging(roundTripStore) - // Branch object initialization - // Branch.getAutoInstance(this, currentConfig.branchKey) // Retrieve or create the bls_session_id val sharedPreferences = getSharedPreferences("branch_session_prefs", Context.MODE_PRIVATE) @@ -42,13 +40,10 @@ class BranchLinkSimulatorApplication: Application() { sharedPreferences.edit().putString("bls_session_id", newId).apply() newId } - Log.d("AppScopeTest", "Application Fired launching coroutine") applicationScope.launch { - Log.e("AppScopeTest", "Coroutine Successfully fired") + // Coroutine used to move creating the Branch singleton through Branch.getAutoInstance() to background thread setupBranchInstance(this@BranchLinkSimulatorApplication, currentConfig.branchKey) - withContext(Dispatchers.Main) { - // Set the bls_session_id in Branch request metadata Branch.getInstance().setRequestMetadata("bls_session_id", blsSessionId) } @@ -62,6 +57,7 @@ class BranchLinkSimulatorApplication: Application() { suspend fun setupBranchInstance(context: Context, branchKey: String) { withContext(Dispatchers.IO) { + // Branch object initialization Branch.getAutoInstance(context, branchKey) } branchInitializationSignal.complete(Unit) From 8337f77055550c1b880f224a6507bd138b98ad98 Mon Sep 17 00:00:00 2001 From: bboothe-branch Date: Thu, 4 Dec 2025 16:34:44 -0500 Subject: [PATCH 3/4] Updating Branch SDK version --- app/build.gradle.kts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 0a1e97d..bfa9a61 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -83,9 +83,9 @@ dependencies { implementation ("com.android.support.constraint:constraint-layout:1.1.3") - //implementation("io.branch.sdk.android:library:5.18.1") + implementation("io.branch.sdk.android:library:5.20.3") // This branch assumes CI will place aar here - implementation(files("libs/branch-sdk-debug.aar")) + //implementation(files("libs/branch-sdk-debug.aar")) implementation("com.google.android.gms:play-services-ads-identifier:18.0.1") From cc746e07f8feee8b42325f478394b5a145d1c592 Mon Sep 17 00:00:00 2001 From: bboothe-branch Date: Mon, 8 Dec 2025 17:23:55 -0500 Subject: [PATCH 4/4] Updates with BackgroundInitTest --- .../BranchBackgroundInitTest.kt | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 app/src/androidTest/java/io/branch/branchlinksimulator/BranchBackgroundInitTest.kt diff --git a/app/src/androidTest/java/io/branch/branchlinksimulator/BranchBackgroundInitTest.kt b/app/src/androidTest/java/io/branch/branchlinksimulator/BranchBackgroundInitTest.kt new file mode 100644 index 0000000..08eb39a --- /dev/null +++ b/app/src/androidTest/java/io/branch/branchlinksimulator/BranchBackgroundInitTest.kt @@ -0,0 +1,39 @@ +package io.branch.branchlinksimulator + +import android.content.Context +import androidx.test.core.app.ApplicationProvider +import androidx.test.ext.junit.runners.AndroidJUnit4 +import io.branch.referral.Branch +import kotlinx.coroutines.CompletableDeferred +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import org.junit.Test +import org.junit.runner.RunWith + +val branchInitializationSignal = CompletableDeferred() +private val applicationJob = SupervisorJob() +val applicationScope = CoroutineScope(Dispatchers.Main + applicationJob) +val exampleBranchKey = "key_live_hshD4wiPK2sSxfkZqkH30ggmyBfmGmD7" + +@RunWith(AndroidJUnit4::class) +class BranchBackgroundInitTest { + + private val appContext: Context = ApplicationProvider.getApplicationContext() + @Test + fun branchGetInstanceTest() { + suspend fun backgroundGetBranchAutoInstanceTest(context: Context, branchKey: String) { + withContext(Dispatchers.IO) { + Branch.getAutoInstance(context, branchKey) + } + branchInitializationSignal.complete(Unit) + } + + applicationScope.launch { + backgroundGetBranchAutoInstanceTest(appContext, exampleBranchKey) + } + } + +} \ No newline at end of file