diff --git a/android/app/src/main/java/com/naviapp/app/initializers/SdkInitializer.kt b/android/app/src/main/java/com/naviapp/app/initializers/SdkInitializer.kt index 13566cf047..00a12f9848 100644 --- a/android/app/src/main/java/com/naviapp/app/initializers/SdkInitializer.kt +++ b/android/app/src/main/java/com/naviapp/app/initializers/SdkInitializer.kt @@ -1,6 +1,6 @@ /* * - * * Copyright © 2024 by Navi Technologies Limited + * * Copyright © 2024-2025 by Navi Technologies Limited * * All rights reserved. Strictly confidential * */ @@ -10,6 +10,7 @@ package com.naviapp.app.initializers import android.content.Context import com.navi.alfred.network.AlfredApiLogsManager import com.navi.analytics.utils.NaviTrackEvent +import com.navi.base.bandwidthbuddy.BandwidthAccessor import com.navi.base.sharedpref.PreferenceManager import com.navi.base.utils.NetWatchManger import com.navi.common.firebaseremoteconfig.FirebaseRemoteConfigHelper @@ -35,6 +36,7 @@ class SdkInitializer @Inject constructor() : ComponentInitializer { UiTronSdkManager.init(UiTronDependencyProvider(application.applicationContext)) initSdkDebugMode(application.applicationContext) AlfredApiLogsManager.init(AlfredApiLogsProviderImpl()) + BandwidthAccessor.init() // This will be removed in next release TemporaryStorageHelper.isOkHttpCustomDnsV2Enabled = FirebaseRemoteConfigHelper.getBoolean(OKHTTP_CUSTOM_DNS_EXPERIMENT_V2) diff --git a/android/gradle/libs.versions.toml b/android/gradle/libs.versions.toml index 58d59847f7..ca89e1a545 100644 --- a/android/gradle/libs.versions.toml +++ b/android/gradle/libs.versions.toml @@ -99,6 +99,7 @@ navi-guarddog = "3.14.0" navi-pulse = "1.15.0" navi-traceflow = "1.0.0" navi-uitron = "3.5.0" +navi-bandwidthBuddy = "1.0.0" navigation = "2.8.5" okhttp-bom = "4.12.0" payu-checkoutPro = "2.4.3" @@ -342,6 +343,7 @@ mvel2 = { module = "org.mvel:mvel2", version.ref = "mvel2" } navi-adverse = { module = "com.navi.android:adverse", version.ref = "navi-adverse" } navi-alfred = { module = "com.navi.android:alfred", version.ref = "navi-alfred" } +navi-bandwidthBuddy = { module = "com.navi.android:bandwidthbuddy", version.ref = "navi-bandwidthBuddy" } navi-customerDocumentCollector = { module = "com.navi.android:customer-document-collector", version.ref = "navi-customerDocumentCollector" } navi-elex = { module = "com.navi.android:elex", version.ref = "navi-elex" } navi-guarddog = { module = "com.navi.android:guarddog", version.ref = "navi-guarddog" } diff --git a/android/navi-base/build.gradle b/android/navi-base/build.gradle index 5509b0e0e4..20c79c7c26 100644 --- a/android/navi-base/build.gradle +++ b/android/navi-base/build.gradle @@ -75,6 +75,7 @@ dependencies { api libs.android.play.featureDeliveryKtx api libs.android.play.reviewKtx api libs.androidx.hilt.navigation.compose + api libs.navi.bandwidthBuddy api libs.firebase.analytics api libs.firebase.crashlytics api libs.firebase.firestore diff --git a/android/navi-base/src/main/java/com/navi/base/bandwidthbuddy/BandwidthAccessor.kt b/android/navi-base/src/main/java/com/navi/base/bandwidthbuddy/BandwidthAccessor.kt new file mode 100644 index 0000000000..c1c934d6d0 --- /dev/null +++ b/android/navi-base/src/main/java/com/navi/base/bandwidthbuddy/BandwidthAccessor.kt @@ -0,0 +1,54 @@ +/* + * + * * Copyright © 2025 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + +package com.navi.base.bandwidthbuddy + +import com.google.firebase.crashlytics.FirebaseCrashlytics +import com.navi.bandwidthbuddy.BandwidthBuddyManager +import com.navi.bandwidthbuddy.BandwidthQuality +import kotlinx.coroutines.CoroutineExceptionHandler +import kotlinx.coroutines.DelicateCoroutinesApi +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.flow.SharingStarted +import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.flowOn +import kotlinx.coroutines.flow.stateIn +import kotlinx.coroutines.launch + +object BandwidthAccessor { + private lateinit var bandwidthBuddyManager: BandwidthBuddyManager + var networkSpeed: Double? = null + private set + + var networkQuality: BandwidthQuality? = null + private set + + private val exceptionHandler = CoroutineExceptionHandler { _, exception -> + FirebaseCrashlytics.getInstance().recordException(exception) + } + + fun init() { + bandwidthBuddyManager = BandwidthBuddyManager() + fetchBandwidthData() + } + + @OptIn(DelicateCoroutinesApi::class) + private fun fetchBandwidthData() { + GlobalScope.launch(Dispatchers.IO + exceptionHandler) { + combine( + bandwidthBuddyManager.getBandwidthSpeed(), + bandwidthBuddyManager.getBandwidthQuality(), + ) { bandwidthSpeed, bandwidthQuality -> + networkSpeed = bandwidthSpeed + networkQuality = bandwidthQuality + } + .flowOn(Dispatchers.IO) + .stateIn(scope = this, started = SharingStarted.Eagerly, initialValue = null) + } + } +} diff --git a/android/navi-common/src/main/java/com/navi/common/checkmate/core/CheckMateManager.kt b/android/navi-common/src/main/java/com/navi/common/checkmate/core/CheckMateManager.kt index 16293bcc50..7fec422020 100644 --- a/android/navi-common/src/main/java/com/navi/common/checkmate/core/CheckMateManager.kt +++ b/android/navi-common/src/main/java/com/navi/common/checkmate/core/CheckMateManager.kt @@ -10,6 +10,7 @@ package com.navi.common.checkmate.core import com.navi.alfred.AlfredManager import com.navi.analytics.utils.NaviTrackEvent import com.navi.base.AppServiceManager +import com.navi.base.bandwidthbuddy.BandwidthAccessor import com.navi.base.utils.orZero import com.navi.common.checkmate.model.EventType import com.navi.common.checkmate.model.MetricInfo @@ -94,6 +95,8 @@ object CheckMateManager { "isNae" to getIsNae(isNae = isNae, statusCode = statusCode, exception = exception) .toString(), + "bandwidthBuddySpeed" to BandwidthAccessor.networkSpeed.toString(), + "bandwidthBuddyQuality" to BandwidthAccessor.networkQuality?.name.toString(), ), ) } @@ -137,6 +140,8 @@ object CheckMateManager { "vendor" to vendor.orEmpty(), "exception" to exception.toString(), "alfredSessionId" to AlfredManager.getAlfredSessionId(), + "bandwidthBuddySpeed" to BandwidthAccessor.networkSpeed.toString(), + "bandwidthBuddyQuality" to BandwidthAccessor.networkQuality?.name.toString(), ), ) } @@ -162,6 +167,8 @@ object CheckMateManager { "uIRenderLatency" to uIRenderLatency.toString(), "screenE2ELatency" to screenE2ELatency.toString(), "alfredSessionId" to AlfredManager.getAlfredSessionId(), + "bandwidthBuddySpeed" to BandwidthAccessor.networkSpeed.toString(), + "bandwidthBuddyQuality" to BandwidthAccessor.networkQuality?.name.toString(), ), ) }