diff --git a/android/app/build.gradle b/android/app/build.gradle index 646f20f844..d0b9dd0086 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -268,6 +268,7 @@ dependencies { implementation libs.accompanist.systemuicontroller implementation libs.android.gms.playServicesAds implementation libs.android.gms.playServicesAuthApiPhone + implementation libs.android.gms.playServicesTime implementation libs.android.installreferrer implementation libs.android.material implementation libs.androidx.activity.activity diff --git a/android/app/src/main/java/com/naviapp/app/NaviApplication.kt b/android/app/src/main/java/com/naviapp/app/NaviApplication.kt index 34d5b41967..0523837eb2 100644 --- a/android/app/src/main/java/com/naviapp/app/NaviApplication.kt +++ b/android/app/src/main/java/com/naviapp/app/NaviApplication.kt @@ -11,6 +11,7 @@ import androidx.appcompat.app.AppCompatDelegate import coil.ImageLoader import coil.ImageLoaderFactory import com.navi.base.cache.repository.NaviCacheRepository +import com.navi.base.utils.TrustedTimeClientAccessor import com.navi.bbps.common.model.NaviBbpsManager import com.navi.moneymanager.common.manager.MMLibManager import com.navi.pay.common.setup.NaviPayManager @@ -47,6 +48,8 @@ open class NaviApplication : BaseApplication(), ImageLoaderFactory { @Inject lateinit var componentInitializers: Lazy> + @Inject lateinit var trustedTimeClientAccessor: Lazy + @Inject lateinit var imageLoaderProvider: ImageLoaderProvider private val isDifferentPackageValue: Boolean by lazy { diff --git a/android/app/src/main/java/com/naviapp/app/initializers/TrustedTimeClientInitializer.kt b/android/app/src/main/java/com/naviapp/app/initializers/TrustedTimeClientInitializer.kt new file mode 100644 index 0000000000..807766ba1e --- /dev/null +++ b/android/app/src/main/java/com/naviapp/app/initializers/TrustedTimeClientInitializer.kt @@ -0,0 +1,25 @@ +/* + * + * * Copyright © 2025 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + +package com.naviapp.app.initializers + +import com.navi.base.utils.TrustedTimeAccessor +import com.navi.common.utils.log +import com.naviapp.app.NaviApplication +import javax.inject.Inject + +class TrustedTimeClientInitializer @Inject constructor() : ComponentInitializer { + override fun initialize(application: NaviApplication) { + application.trustedTimeClientAccessor.get().createClient().addOnCompleteListener { task -> + if (task.isSuccessful) { + TrustedTimeAccessor.setInstance(trustedTimeClient = task.result) + } else { + task.exception?.log() + } + } + } +} diff --git a/android/app/src/main/java/com/naviapp/common/di/AppModule.kt b/android/app/src/main/java/com/naviapp/common/di/AppModule.kt index fd24a2e1f2..53a0447a43 100644 --- a/android/app/src/main/java/com/naviapp/common/di/AppModule.kt +++ b/android/app/src/main/java/com/naviapp/common/di/AppModule.kt @@ -21,6 +21,7 @@ import com.naviapp.app.initializers.NetworkConfigurationInitializer import com.naviapp.app.initializers.NetworkStatsInitializer import com.naviapp.app.initializers.SdkInitializer import com.naviapp.app.initializers.SignalManagerInitializer +import com.naviapp.app.initializers.TrustedTimeClientInitializer import com.naviapp.network.di.CoroutineScopeIO import dagger.Module import dagger.Provides @@ -63,6 +64,7 @@ object AppModule { signalManagerInitializer: SignalManagerInitializer, lottieInitializer: LottieInitializer, networkStatsInitializer: NetworkStatsInitializer, + trustedTimeClientInitializer: TrustedTimeClientInitializer, ): List { return listOf( sdkInitializer, @@ -73,6 +75,7 @@ object AppModule { signalManagerInitializer, lottieInitializer, networkStatsInitializer, + trustedTimeClientInitializer, ) } } diff --git a/android/gradle/libs.versions.toml b/android/gradle/libs.versions.toml index 3308758ac9..58d59847f7 100644 --- a/android/gradle/libs.versions.toml +++ b/android/gradle/libs.versions.toml @@ -8,6 +8,7 @@ android-gms-playServicesAuthApiPhone = "18.1.0" android-gms-playServicesLocation = "21.3.0" android-gms-playServicesMaps = "17.0.0" android-gms-playServicesMlkitTextRecognition = "19.0.1" +android-gms-playServicesTime = "16.0.1" android-installreferrer = "2.2" android-material = "1.9.0" android-places = "4.1.0" @@ -131,6 +132,7 @@ android-gms-playServicesAuthApiPhone = { module = "com.google.android.gms:play-s android-gms-playServicesLocation = { module = "com.google.android.gms:play-services-location", version.ref = "android-gms-playServicesLocation" } android-gms-playServicesMaps = { module = "com.google.android.gms:play-services-maps", version.ref = "android-gms-playServicesMaps" } android-gms-playServicesMlkitTextRecognition = { module = "com.google.android.gms:play-services-mlkit-text-recognition", version.ref = "android-gms-playServicesMlkitTextRecognition" } +android-gms-playServicesTime = { module = "com.google.android.gms:play-services-time", version.ref = "android-gms-playServicesTime" } android-installreferrer = { module = "com.android.installreferrer:installreferrer", version.ref = "android-installreferrer" } diff --git a/android/navi-base/build.gradle b/android/navi-base/build.gradle index 37b7288ad5..5509b0e0e4 100644 --- a/android/navi-base/build.gradle +++ b/android/navi-base/build.gradle @@ -70,6 +70,7 @@ static def formatString(String value) { dependencies { api platform(libs.firebase.bom) api platform(libs.okhttp.bom) + implementation libs.android.gms.playServicesTime api libs.android.play.appUpdateKtx api libs.android.play.featureDeliveryKtx api libs.android.play.reviewKtx diff --git a/android/navi-base/src/main/java/com/navi/base/cache/di/NaviBaseModule.kt b/android/navi-base/src/main/java/com/navi/base/cache/di/NaviBaseModule.kt index b21cf63d4d..09362e6278 100644 --- a/android/navi-base/src/main/java/com/navi/base/cache/di/NaviBaseModule.kt +++ b/android/navi-base/src/main/java/com/navi/base/cache/di/NaviBaseModule.kt @@ -9,6 +9,9 @@ package com.navi.base.cache.di import android.content.Context import androidx.room.Room +import com.google.android.gms.tasks.Task +import com.google.android.gms.time.TrustedTime +import com.google.android.gms.time.TrustedTimeClient import com.google.gson.Gson import com.navi.base.cache.database.NaviSharedDatabase import com.navi.base.cache.repository.NaviCacheRepository @@ -22,6 +25,7 @@ import com.navi.base.utils.NaviNetworkConnectivity import com.navi.base.utils.NaviNetworkConnectivityImpl import com.navi.base.utils.ResourceProvider import com.navi.base.utils.ResourceProviderImpl +import com.navi.base.utils.TrustedTimeClientAccessor import dagger.Binds import dagger.Module import dagger.Provides @@ -47,6 +51,18 @@ object NaviBaseModule { naviSharedDatabase.naviCacheDao() @Provides @Singleton @NaviCommonGson fun providesGson() = Gson() + + @Singleton + @Provides + fun provideTrustedTimeClientAccessor( + @ApplicationContext context: Context + ): TrustedTimeClientAccessor { + return object : TrustedTimeClientAccessor { + override fun createClient(): Task { + return TrustedTime.createClient(context) + } + } + } } @Module diff --git a/android/navi-base/src/main/java/com/navi/base/utils/TrustedTimeUtils.kt b/android/navi-base/src/main/java/com/navi/base/utils/TrustedTimeUtils.kt new file mode 100644 index 0000000000..ea169afe38 --- /dev/null +++ b/android/navi-base/src/main/java/com/navi/base/utils/TrustedTimeUtils.kt @@ -0,0 +1,27 @@ +/* + * + * * Copyright © 2025 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + +package com.navi.base.utils + +import com.google.android.gms.tasks.Task +import com.google.android.gms.time.TrustedTimeClient + +interface TrustedTimeClientAccessor { + fun createClient(): Task +} + +object TrustedTimeAccessor { + private var trustedTimeClient: TrustedTimeClient? = null + + fun setInstance(trustedTimeClient: TrustedTimeClient) { + this.trustedTimeClient = trustedTimeClient + } + + fun getCurrentTimeMillis(): Long { + return trustedTimeClient?.computeCurrentUnixEpochMillis() ?: System.currentTimeMillis() + } +}