From f179fc523d8bcbfd4e0006379ed4fc1f5f8291eb Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 3 Jul 2020 18:35:59 +0200 Subject: [PATCH] Give configured OkHttpClient to Glide and BigImageViewer --- .../matrix/android/api/session/Session.kt | 8 ++++ .../internal/session/DefaultSession.kt | 12 +++++- .../im/vector/riotx/core/di/ImageManager.kt | 16 +++++++- .../im/vector/riotx/core/glide/FactoryUrl.kt | 38 +++++++++++++++++++ .../core/glide/VectorGlideModelLoader.kt | 2 +- 5 files changed, 71 insertions(+), 5 deletions(-) create mode 100644 vector/src/main/java/im/vector/riotx/core/glide/FactoryUrl.kt diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/Session.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/Session.kt index 5b0f24aed7..8d97dfc01b 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/Session.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/Session.kt @@ -47,6 +47,7 @@ import im.vector.matrix.android.api.session.terms.TermsService import im.vector.matrix.android.api.session.typing.TypingUsersTracker import im.vector.matrix.android.api.session.user.UserService import im.vector.matrix.android.api.session.widgets.WidgetService +import okhttp3.OkHttpClient /** * This interface defines interactions with a session. @@ -205,6 +206,13 @@ interface Session : */ fun removeListener(listener: Listener) + /** + * Will return a OkHttpClient which will manage pinned certificates and Proxy if configured. + * It will not add any access-token to the request. + * So it is exposed to let the app be able to download image with Glide or any other libraries which accept an OkHttp client. + */ + fun getOkHttpClient(): OkHttpClient + /** * A global session listener to get notified for some events. */ diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/DefaultSession.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/DefaultSession.kt index 83ba76d5b8..16179dd64a 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/DefaultSession.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/DefaultSession.kt @@ -52,6 +52,7 @@ import im.vector.matrix.android.internal.auth.SessionParamsStore import im.vector.matrix.android.internal.crypto.DefaultCryptoService import im.vector.matrix.android.internal.di.SessionDatabase import im.vector.matrix.android.internal.di.SessionId +import im.vector.matrix.android.internal.di.UnauthenticatedWithCertificate import im.vector.matrix.android.internal.di.WorkManagerProvider import im.vector.matrix.android.internal.session.identity.DefaultIdentityService import im.vector.matrix.android.internal.session.room.timeline.TimelineEventDecryptor @@ -64,6 +65,7 @@ import im.vector.matrix.android.internal.util.createUIHandler import io.realm.RealmConfiguration import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch +import okhttp3.OkHttpClient import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode @@ -113,8 +115,10 @@ internal class DefaultSession @Inject constructor( private val defaultIdentityService: DefaultIdentityService, private val integrationManagerService: IntegrationManagerService, private val taskExecutor: TaskExecutor, - private val callSignalingService: Lazy) - : Session, + private val callSignalingService: Lazy, + @UnauthenticatedWithCertificate + private val unauthenticatedWithCertificateOkHttpClient: Lazy +) : Session, RoomService by roomService.get(), RoomDirectoryService by roomDirectoryService.get(), GroupService by groupService.get(), @@ -255,6 +259,10 @@ internal class DefaultSession @Inject constructor( override fun callSignalingService(): CallSignalingService = callSignalingService.get() + override fun getOkHttpClient(): OkHttpClient { + return unauthenticatedWithCertificateOkHttpClient.get() + } + override fun addListener(listener: Session.Listener) { sessionListeners.addListener(listener) } diff --git a/vector/src/main/java/im/vector/riotx/core/di/ImageManager.kt b/vector/src/main/java/im/vector/riotx/core/di/ImageManager.kt index 7972ebb163..74a01e76ec 100644 --- a/vector/src/main/java/im/vector/riotx/core/di/ImageManager.kt +++ b/vector/src/main/java/im/vector/riotx/core/di/ImageManager.kt @@ -17,19 +17,31 @@ package im.vector.riotx.core.di import android.content.Context +import com.bumptech.glide.Glide +import com.bumptech.glide.load.model.GlideUrl import com.github.piasy.biv.BigImageViewer import com.github.piasy.biv.loader.glide.GlideImageLoader import im.vector.matrix.android.api.session.Session +import im.vector.riotx.ActiveSessionDataSource +import im.vector.riotx.core.glide.FactoryUrl +import java.io.InputStream import javax.inject.Inject /** * This class is used to configure the library we use for images */ class ImageManager @Inject constructor( - private val context: Context + private val context: Context, + private val activeSessionDataSource: ActiveSessionDataSource ) { fun onSessionStarted(session: Session) { - BigImageViewer.initialize(GlideImageLoader.with(context)) + // Do this call first + BigImageViewer.initialize(GlideImageLoader.with(context, session.getOkHttpClient())) + + val glide = Glide.get(context) + + // And this one. FIXME But are losing what BigImageViewer has done to add a Progress listener + glide.registry.replace(GlideUrl::class.java, InputStream::class.java, FactoryUrl(activeSessionDataSource)) } } diff --git a/vector/src/main/java/im/vector/riotx/core/glide/FactoryUrl.kt b/vector/src/main/java/im/vector/riotx/core/glide/FactoryUrl.kt new file mode 100644 index 0000000000..fc037894db --- /dev/null +++ b/vector/src/main/java/im/vector/riotx/core/glide/FactoryUrl.kt @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2020 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.riotx.core.glide + +import com.bumptech.glide.integration.okhttp3.OkHttpUrlLoader +import com.bumptech.glide.load.model.GlideUrl +import com.bumptech.glide.load.model.ModelLoader +import com.bumptech.glide.load.model.ModelLoaderFactory +import com.bumptech.glide.load.model.MultiModelLoaderFactory +import im.vector.riotx.ActiveSessionDataSource +import okhttp3.OkHttpClient +import java.io.InputStream + +class FactoryUrl(private val activeSessionDataSource: ActiveSessionDataSource) : ModelLoaderFactory { + + override fun build(multiFactory: MultiModelLoaderFactory): ModelLoader { + val client = activeSessionDataSource.currentValue?.orNull()?.getOkHttpClient() ?: OkHttpClient() + return OkHttpUrlLoader(client) + } + + override fun teardown() { + // Do nothing, this instance doesn't own the client. + } +} diff --git a/vector/src/main/java/im/vector/riotx/core/glide/VectorGlideModelLoader.kt b/vector/src/main/java/im/vector/riotx/core/glide/VectorGlideModelLoader.kt index 191ab6d972..510eef71e1 100644 --- a/vector/src/main/java/im/vector/riotx/core/glide/VectorGlideModelLoader.kt +++ b/vector/src/main/java/im/vector/riotx/core/glide/VectorGlideModelLoader.kt @@ -65,7 +65,7 @@ class VectorGlideDataFetcher(private val activeSessionHolder: ActiveSessionHolde private val height: Int) : DataFetcher { - val client = OkHttpClient() + private val client = activeSessionHolder.getSafeActiveSession()?.getOkHttpClient() ?: OkHttpClient() override fun getDataClass(): Class { return InputStream::class.java