@@ -32,10 +32,12 @@ import okhttp3.logging.HttpLoggingInterceptor
3232import one.mixin.android.BuildConfig
3333import one.mixin.android.Constants
3434import one.mixin.android.Constants.ALLOW_INTERVAL
35+ import one.mixin.android.Constants.API.CASH_URL
3536import one.mixin.android.Constants.API.FOURSQUARE_URL
3637import one.mixin.android.Constants.API.GIPHY_URL
3738import one.mixin.android.Constants.API.Mixin_URL
3839import one.mixin.android.Constants.API.URL
40+ import one.mixin.android.Constants.Account.PREF_CASH_BOT_PK
3941import one.mixin.android.Constants.Account.PREF_REFERRAL_BOT_PK
4042import one.mixin.android.Constants.Account.PREF_ROUTE_BOT_PK
4143import one.mixin.android.Constants.DNS
@@ -52,6 +54,7 @@ import one.mixin.android.api.service.AccountService
5254import one.mixin.android.api.service.AddressService
5355import one.mixin.android.api.service.AssetService
5456import one.mixin.android.api.service.AuthorizationService
57+ import one.mixin.android.api.service.CashService
5558import one.mixin.android.api.service.CircleService
5659import one.mixin.android.api.service.ContactService
5760import one.mixin.android.api.service.ConversationService
@@ -598,6 +601,49 @@ object AppModule {
598601 return retrofit.create(ReferralService ::class .java)
599602 }
600603
604+ @Singleton
605+ @Provides
606+ fun provideCashService (
607+ resolver : ContentResolver ,
608+ httpLoggingInterceptor : HttpLoggingInterceptor ? ,
609+ @ApplicationContext appContext : Context ,
610+ ): CashService {
611+ val builder = OkHttpClient .Builder ()
612+ builder.connectTimeout(15 , TimeUnit .SECONDS )
613+ builder.writeTimeout(15 , TimeUnit .SECONDS )
614+ builder.readTimeout(15 , TimeUnit .SECONDS )
615+ builder.dns(DNS )
616+ val client =
617+ builder.apply {
618+ httpLoggingInterceptor?.let { interceptor ->
619+ addNetworkInterceptor(interceptor)
620+ }
621+ addInterceptor { chain ->
622+ val sourceRequest = chain.request()
623+ val b = sourceRequest.newBuilder()
624+ b.addHeader(" User-Agent" , API_UA )
625+ .addHeader(" Accept-Language" , Locale .getDefault().toLanguageTag())
626+ .addHeader(" Mixin-Device-Id" , getStringDeviceId(resolver))
627+ .addHeader(xRequestId, UUID .randomUUID().toString())
628+ val botPublicKey = appContext.defaultSharedPreferences.getString(PREF_CASH_BOT_PK , null )
629+ if (botPublicKey.isNullOrBlank()) return @addInterceptor chain.proceed(b.build())
630+ val (ts, signature) = Session .getBotSignature(botPublicKey, sourceRequest)
631+ b.addHeader(mrAccessTimestamp, ts.toString())
632+ b.addHeader(mrAccessSign, signature)
633+ val request = b.build()
634+ return @addInterceptor chain.proceed(request)
635+ }
636+ }.build()
637+ val retrofit =
638+ Retrofit .Builder ()
639+ .baseUrl(CASH_URL )
640+ .addConverterFactory(GsonConverterFactory .create())
641+ .addCallAdapterFactory(CoroutineCallAdapterFactory ())
642+ .client(client)
643+ .build()
644+ return retrofit.create(CashService ::class .java)
645+ }
646+
601647 @Provides
602648 @Singleton
603649 fun provideCallState () = CallStateLiveData ()
0 commit comments