From 3af7ca9ab009f09212ca6b3909a04148a69f81a7 Mon Sep 17 00:00:00 2001
From: ganfra <francois.ganard@gmail.com>
Date: Wed, 6 Nov 2019 20:07:28 +0100
Subject: [PATCH] Retrofit: lazy init okhttp

---
 .../android/internal/auth/DefaultAuthenticator.kt     |  5 +++--
 .../android/internal/network/RetrofitFactory.kt       | 11 +++++++++--
 .../matrix/android/internal/session/SessionModule.kt  |  3 ++-
 3 files changed, 14 insertions(+), 5 deletions(-)

diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/auth/DefaultAuthenticator.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/auth/DefaultAuthenticator.kt
index 0192715ae5..1f7caa4fc3 100644
--- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/auth/DefaultAuthenticator.kt
+++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/auth/DefaultAuthenticator.kt
@@ -17,6 +17,7 @@
 package im.vector.matrix.android.internal.auth
 
 import android.util.Patterns
+import dagger.Lazy
 import im.vector.matrix.android.api.MatrixCallback
 import im.vector.matrix.android.api.auth.Authenticator
 import im.vector.matrix.android.api.auth.data.Credentials
@@ -42,7 +43,7 @@ import javax.inject.Inject
 import javax.inject.Provider
 
 internal class DefaultAuthenticator @Inject constructor(@Unauthenticated
-                                                        private val okHttpClient: Provider<OkHttpClient>,
+                                                        private val okHttpClient: Lazy<OkHttpClient>,
                                                         private val retrofitFactory: RetrofitFactory,
                                                         private val coroutineDispatchers: MatrixCoroutineDispatchers,
                                                         private val sessionParamsStore: SessionParamsStore,
@@ -133,7 +134,7 @@ internal class DefaultAuthenticator @Inject constructor(@Unauthenticated
     }
 
     private fun buildAuthAPI(homeServerConnectionConfig: HomeServerConnectionConfig): AuthAPI {
-        val retrofit = retrofitFactory.create(okHttpClient.get(), homeServerConnectionConfig.homeServerUri.toString())
+        val retrofit = retrofitFactory.create(okHttpClient, homeServerConnectionConfig.homeServerUri.toString())
         return retrofit.create(AuthAPI::class.java)
     }
 }
diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/network/RetrofitFactory.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/network/RetrofitFactory.kt
index 15e6f76381..44ccd7c941 100644
--- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/network/RetrofitFactory.kt
+++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/network/RetrofitFactory.kt
@@ -17,17 +17,24 @@
 package im.vector.matrix.android.internal.network
 
 import com.squareup.moshi.Moshi
+import dagger.Lazy
+import okhttp3.Call
 import okhttp3.OkHttpClient
+import okhttp3.Request
 import retrofit2.Retrofit
 import retrofit2.converter.moshi.MoshiConverterFactory
 import javax.inject.Inject
 
 class RetrofitFactory @Inject constructor(private val moshi: Moshi) {
 
-    fun create(okHttpClient: OkHttpClient, baseUrl: String): Retrofit {
+    fun create(okHttpClient: Lazy<OkHttpClient>, baseUrl: String): Retrofit {
         return Retrofit.Builder()
                 .baseUrl(baseUrl)
-                .client(okHttpClient)
+                .callFactory(object : Call.Factory {
+                    override fun newCall(request: Request): Call {
+                        return okHttpClient.get().newCall(request)
+                    }
+                })
                 .addConverterFactory(UnitConverterFactory)
                 .addConverterFactory(MoshiConverterFactory.create(moshi))
                 .build()
diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/SessionModule.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/SessionModule.kt
index d038630a74..0e88894969 100644
--- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/SessionModule.kt
+++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/SessionModule.kt
@@ -19,6 +19,7 @@ package im.vector.matrix.android.internal.session
 import android.content.Context
 import com.zhuinden.monarchy.Monarchy
 import dagger.Binds
+import dagger.Lazy
 import dagger.Module
 import dagger.Provides
 import dagger.multibindings.IntoSet
@@ -132,7 +133,7 @@ internal abstract class SessionModule {
         @JvmStatic
         @Provides
         @SessionScope
-        fun providesRetrofit(@Authenticated okHttpClient: OkHttpClient,
+        fun providesRetrofit(@Authenticated okHttpClient: Lazy<OkHttpClient>,
                              sessionParams: SessionParams,
                              retrofitFactory: RetrofitFactory): Retrofit {
             return retrofitFactory