From cafe86e67508ae5264985afecf357fe2cb921a32 Mon Sep 17 00:00:00 2001
From: Benoit Marty <benoit@matrix.org>
Date: Thu, 3 Dec 2020 09:56:26 +0100
Subject: [PATCH] Rework: create a MediaModule

---
 .../sdk/internal/session/SessionComponent.kt  |  2 +
 .../session/homeserver/CapabilitiesAPI.kt     |  7 ----
 .../DefaultGetHomeServerCapabilitiesTask.kt   | 17 ++++----
 .../GetMediaConfigResult.kt}                  |  6 +--
 .../sdk/internal/session/media/MediaAPI.kt    | 30 ++++++++++++++
 .../sdk/internal/session/media/MediaModule.kt | 39 +++++++++++++++++++
 6 files changed, 84 insertions(+), 17 deletions(-)
 rename matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/{homeserver/GetUploadCapabilitiesResult.kt => media/GetMediaConfigResult.kt} (86%)
 create mode 100644 matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/media/MediaAPI.kt
 create mode 100644 matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/media/MediaModule.kt

diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/SessionComponent.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/SessionComponent.kt
index e6fd5a7a0c..659fcc8f5c 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/SessionComponent.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/SessionComponent.kt
@@ -40,6 +40,7 @@ import org.matrix.android.sdk.internal.session.group.GroupModule
 import org.matrix.android.sdk.internal.session.homeserver.HomeServerCapabilitiesModule
 import org.matrix.android.sdk.internal.session.identity.IdentityModule
 import org.matrix.android.sdk.internal.session.integrationmanager.IntegrationManagerModule
+import org.matrix.android.sdk.internal.session.media.MediaModule
 import org.matrix.android.sdk.internal.session.openid.OpenIdModule
 import org.matrix.android.sdk.internal.session.profile.ProfileModule
 import org.matrix.android.sdk.internal.session.pushers.AddHttpPusherWorker
@@ -75,6 +76,7 @@ import org.matrix.android.sdk.internal.util.MatrixCoroutineDispatchers
             GroupModule::class,
             ContentModule::class,
             CacheModule::class,
+            MediaModule::class,
             CryptoModule::class,
             PushersModule::class,
             OpenIdModule::class,
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/homeserver/CapabilitiesAPI.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/homeserver/CapabilitiesAPI.kt
index 39b6608de3..8242edac84 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/homeserver/CapabilitiesAPI.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/homeserver/CapabilitiesAPI.kt
@@ -22,19 +22,12 @@ import retrofit2.Call
 import retrofit2.http.GET
 
 internal interface CapabilitiesAPI {
-
     /**
      * Request the homeserver capabilities
      */
     @GET(NetworkConstants.URI_API_PREFIX_PATH_R0 + "capabilities")
     fun getCapabilities(): Call<GetCapabilitiesResult>
 
-    /**
-     * Request the upload capabilities
-     */
-    @GET(NetworkConstants.URI_API_MEDIA_PREFIX_PATH_R0 + "config")
-    fun getUploadCapabilities(): Call<GetUploadCapabilitiesResult>
-
     /**
      * Request the versions
      */
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/homeserver/DefaultGetHomeServerCapabilitiesTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/homeserver/DefaultGetHomeServerCapabilitiesTask.kt
index 8d289dfda5..f3686b02d3 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/homeserver/DefaultGetHomeServerCapabilitiesTask.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/homeserver/DefaultGetHomeServerCapabilitiesTask.kt
@@ -29,6 +29,8 @@ import org.matrix.android.sdk.internal.di.SessionDatabase
 import org.matrix.android.sdk.internal.di.UserId
 import org.matrix.android.sdk.internal.network.executeRequest
 import org.matrix.android.sdk.internal.session.integrationmanager.IntegrationManagerConfigExtractor
+import org.matrix.android.sdk.internal.session.media.GetMediaConfigResult
+import org.matrix.android.sdk.internal.session.media.MediaAPI
 import org.matrix.android.sdk.internal.task.Task
 import org.matrix.android.sdk.internal.util.awaitTransaction
 import org.matrix.android.sdk.internal.wellknown.GetWellknownTask
@@ -40,6 +42,7 @@ internal interface GetHomeServerCapabilitiesTask : Task<Unit, Unit>
 
 internal class DefaultGetHomeServerCapabilitiesTask @Inject constructor(
         private val capabilitiesAPI: CapabilitiesAPI,
+        private val mediaAPI: MediaAPI,
         @SessionDatabase private val monarchy: Monarchy,
         private val eventBus: EventBus,
         private val getWellknownTask: GetWellknownTask,
@@ -67,9 +70,9 @@ internal class DefaultGetHomeServerCapabilitiesTask @Inject constructor(
             }
         }.getOrNull()
 
-        val uploadCapabilities = runCatching {
-            executeRequest<GetUploadCapabilitiesResult>(eventBus) {
-                apiCall = capabilitiesAPI.getUploadCapabilities()
+        val mediaConfig = runCatching {
+            executeRequest<GetMediaConfigResult>(eventBus) {
+                apiCall = mediaAPI.getMediaConfig()
             }
         }.getOrNull()
 
@@ -83,11 +86,11 @@ internal class DefaultGetHomeServerCapabilitiesTask @Inject constructor(
             getWellknownTask.execute(GetWellknownTask.Params(userId, homeServerConnectionConfig))
         }.getOrNull()
 
-        insertInDb(capabilities, uploadCapabilities, versions, wellknownResult)
+        insertInDb(capabilities, mediaConfig, versions, wellknownResult)
     }
 
     private suspend fun insertInDb(getCapabilitiesResult: GetCapabilitiesResult?,
-                                   getUploadCapabilitiesResult: GetUploadCapabilitiesResult?,
+                                   getMediaConfigResult: GetMediaConfigResult?,
                                    getVersionResult: Versions?,
                                    getWellknownResult: WellknownResult?) {
         monarchy.awaitTransaction { realm ->
@@ -97,8 +100,8 @@ internal class DefaultGetHomeServerCapabilitiesTask @Inject constructor(
                 homeServerCapabilitiesEntity.canChangePassword = getCapabilitiesResult.canChangePassword()
             }
 
-            if (getUploadCapabilitiesResult != null) {
-                homeServerCapabilitiesEntity.maxUploadFileSize = getUploadCapabilitiesResult.maxUploadSize
+            if (getMediaConfigResult != null) {
+                homeServerCapabilitiesEntity.maxUploadFileSize = getMediaConfigResult.maxUploadSize
                         ?: HomeServerCapabilities.MAX_UPLOAD_FILE_SIZE_UNKNOWN
             }
 
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/homeserver/GetUploadCapabilitiesResult.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/media/GetMediaConfigResult.kt
similarity index 86%
rename from matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/homeserver/GetUploadCapabilitiesResult.kt
rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/media/GetMediaConfigResult.kt
index 92903bf96e..fece6c06c6 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/homeserver/GetUploadCapabilitiesResult.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/media/GetMediaConfigResult.kt
@@ -5,7 +5,7 @@
  * 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
+ *     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,
@@ -14,13 +14,13 @@
  * limitations under the License.
  */
 
-package org.matrix.android.sdk.internal.session.homeserver
+package org.matrix.android.sdk.internal.session.media
 
 import com.squareup.moshi.Json
 import com.squareup.moshi.JsonClass
 
 @JsonClass(generateAdapter = true)
-internal data class GetUploadCapabilitiesResult(
+internal data class GetMediaConfigResult(
         /**
          * The maximum size an upload can be in bytes. Clients SHOULD use this as a guide when uploading content.
          * If not listed or null, the size limit should be treated as unknown.
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/media/MediaAPI.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/media/MediaAPI.kt
new file mode 100644
index 0000000000..dba693c724
--- /dev/null
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/media/MediaAPI.kt
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2020 The Matrix.org Foundation C.I.C.
+ *
+ * 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 org.matrix.android.sdk.internal.session.media
+
+import org.matrix.android.sdk.internal.network.NetworkConstants
+import retrofit2.Call
+import retrofit2.http.GET
+
+internal interface MediaAPI {
+    /**
+     * Retrieve the configuration of the content repository
+     * Ref: https://matrix.org/docs/spec/client_server/r0.6.1#get-matrix-media-r0-config
+     */
+    @GET(NetworkConstants.URI_API_MEDIA_PREFIX_PATH_R0 + "config")
+    fun getMediaConfig(): Call<GetMediaConfigResult>
+}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/media/MediaModule.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/media/MediaModule.kt
new file mode 100644
index 0000000000..84a82dc75a
--- /dev/null
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/media/MediaModule.kt
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2020 The Matrix.org Foundation C.I.C.
+ *
+ * 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 org.matrix.android.sdk.internal.session.media
+
+import dagger.Module
+import dagger.Provides
+import org.matrix.android.sdk.internal.session.SessionScope
+import retrofit2.Retrofit
+
+@Module
+internal abstract class MediaModule {
+
+    @Module
+    companion object {
+        @Provides
+        @JvmStatic
+        @SessionScope
+        fun providesMediaAPI(retrofit: Retrofit): MediaAPI {
+            return retrofit.create(MediaAPI::class.java)
+        }
+    }
+
+//    @Binds
+//    abstract fun bindGetHomeServerCapabilitiesTask(task: DefaultGetHomeServerCapabilitiesTask): GetHomeServerCapabilitiesTask
+}