From 6b9ab738cb5ad3e5494a12dd56fd03c94108baab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20Kr=C3=BCger?= Date: Thu, 19 May 2022 16:26:47 +0200 Subject: [PATCH] Introduce interface for 'SharedItemsRepository' MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tim Krüger --- .../talk/dagger/modules/RepositoryModule.kt | 3 +- .../repositories/SharedItemsRepository.kt | 123 ++--------------- .../repositories/SharedItemsRepositoryImpl.kt | 127 ++++++++++++++++++ 3 files changed, 137 insertions(+), 116 deletions(-) create mode 100644 app/src/main/java/com/nextcloud/talk/shareditems/repositories/SharedItemsRepositoryImpl.kt diff --git a/app/src/main/java/com/nextcloud/talk/dagger/modules/RepositoryModule.kt b/app/src/main/java/com/nextcloud/talk/dagger/modules/RepositoryModule.kt index b070689b8..50da11477 100644 --- a/app/src/main/java/com/nextcloud/talk/dagger/modules/RepositoryModule.kt +++ b/app/src/main/java/com/nextcloud/talk/dagger/modules/RepositoryModule.kt @@ -23,6 +23,7 @@ package com.nextcloud.talk.dagger.modules import com.nextcloud.talk.api.NcApi import com.nextcloud.talk.shareditems.repositories.SharedItemsRepository +import com.nextcloud.talk.shareditems.repositories.SharedItemsRepositoryImpl import dagger.Module import dagger.Provides @@ -30,6 +31,6 @@ import dagger.Provides class RepositoryModule { @Provides fun provideSharedItemsRepository(ncApi: NcApi): SharedItemsRepository { - return SharedItemsRepository(ncApi) + return SharedItemsRepositoryImpl(ncApi) } } diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/repositories/SharedItemsRepository.kt b/app/src/main/java/com/nextcloud/talk/shareditems/repositories/SharedItemsRepository.kt index 0aecfe12f..388c68634 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/repositories/SharedItemsRepository.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/repositories/SharedItemsRepository.kt @@ -1,123 +1,21 @@ package com.nextcloud.talk.shareditems.repositories -import android.util.Log -import com.nextcloud.talk.R -import com.nextcloud.talk.api.NcApi -import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.sharedApplication import com.nextcloud.talk.models.database.UserEntity -import com.nextcloud.talk.models.json.chat.ChatShareOverall -import com.nextcloud.talk.shareditems.model.SharedItem import com.nextcloud.talk.shareditems.model.SharedItemType import com.nextcloud.talk.shareditems.model.SharedMediaItems -import com.nextcloud.talk.utils.ApiUtils import io.reactivex.Observable -import retrofit2.Response -import java.util.Locale -import javax.inject.Inject -class SharedItemsRepository @Inject constructor(private val ncApi: NcApi) { +interface SharedItemsRepository { - fun media(parameters: Parameters, type: SharedItemType): Observable? { - return media(parameters, type, null) - } + fun media(parameters: Parameters, type: SharedItemType): Observable? - fun media(parameters: Parameters, type: SharedItemType, lastKnownMessageId: Int?): Observable? { - val credentials = ApiUtils.getCredentials(parameters.userName, parameters.userToken) + fun media( + parameters: Parameters, + type: SharedItemType, + lastKnownMessageId: Int? + ): Observable? - return ncApi.getSharedItems( - credentials, - ApiUtils.getUrlForChatSharedItems(1, parameters.baseUrl, parameters.roomToken), - type.toString().lowercase(Locale.ROOT), - lastKnownMessageId, - BATCH_SIZE - ).map { map(it, parameters) } - } - - private fun map( - response: Response, - parameters: Parameters - ): SharedMediaItems { - - var chatLastGiven: Int? = null - val items = mutableMapOf() - - if (response.headers()["x-chat-last-given"] != null) { - chatLastGiven = response.headers()["x-chat-last-given"]!!.toInt() - } - - val mediaItems = response.body()!!.ocs!!.data - if (mediaItems != null) { - for (it in mediaItems) { - if (it.value.messageParameters?.containsKey("file") == true) { - val fileParameters = it.value.messageParameters!!["file"]!! - - val previewAvailable = - "yes".equals(fileParameters["preview-available"]!!, ignoreCase = true) - - items[it.value.id] = SharedItem( - fileParameters["id"]!!, - fileParameters["name"]!!, - fileParameters["size"]!!.toLong(), - it.value.timestamp, - fileParameters["path"]!!, - fileParameters["link"]!!, - fileParameters["mimetype"]!!, - previewAvailable, - previewLink(fileParameters["id"], parameters.baseUrl), - parameters.userEntity - ) - } else { - Log.w(TAG, "location and deckcard are not yet supported") - } - } - } - - val sortedMutableItems = items.toSortedMap().values.toList().reversed().toMutableList() - val moreItemsExisting = items.count() == BATCH_SIZE - - return SharedMediaItems( - sortedMutableItems, - chatLastGiven, - moreItemsExisting, - authHeader(parameters.userName, parameters.userToken) - ) - } - - fun availableTypes(parameters: Parameters): Observable> { - val credentials = ApiUtils.getCredentials(parameters.userName, parameters.userToken) - - return ncApi.getSharedItemsOverview( - credentials, - ApiUtils.getUrlForChatSharedItemsOverview(1, parameters.baseUrl, parameters.roomToken), - 1 - ).map { - val types = mutableSetOf() - val typeMap = it.body()!!.ocs!!.data!! - for (t in typeMap) { - if (t.value.isNotEmpty()) { - try { - types += SharedItemType.typeFor(t.key) - } catch (e: IllegalArgumentException) { - Log.w(TAG, "Server responds an unknown shared item type: ${t.key}") - } - } - } - - types.toSet() - } - } - - private fun authHeader(userName: String, userToken: String): Map { - return mapOf(Pair("Authorization", ApiUtils.getCredentials(userName, userToken))) - } - - private fun previewLink(fileId: String?, baseUrl: String): String { - return ApiUtils.getUrlForFilePreviewWithFileId( - baseUrl, - fileId, - sharedApplication!!.resources.getDimensionPixelSize(R.dimen.maximum_file_preview_size) - ) - } + fun availableTypes(parameters: Parameters): Observable> data class Parameters( val userName: String, @@ -126,9 +24,4 @@ class SharedItemsRepository @Inject constructor(private val ncApi: NcApi) { val userEntity: UserEntity, val roomToken: String ) - - companion object { - const val BATCH_SIZE: Int = 28 - private val TAG = SharedItemsRepository::class.simpleName - } } diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/repositories/SharedItemsRepositoryImpl.kt b/app/src/main/java/com/nextcloud/talk/shareditems/repositories/SharedItemsRepositoryImpl.kt new file mode 100644 index 000000000..81f8c8134 --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/shareditems/repositories/SharedItemsRepositoryImpl.kt @@ -0,0 +1,127 @@ +package com.nextcloud.talk.shareditems.repositories + +import android.util.Log +import com.nextcloud.talk.R +import com.nextcloud.talk.api.NcApi +import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.sharedApplication +import com.nextcloud.talk.models.json.chat.ChatShareOverall +import com.nextcloud.talk.shareditems.model.SharedItem +import com.nextcloud.talk.shareditems.model.SharedItemType +import com.nextcloud.talk.shareditems.model.SharedMediaItems +import com.nextcloud.talk.utils.ApiUtils +import io.reactivex.Observable +import retrofit2.Response +import java.util.Locale +import javax.inject.Inject + +class SharedItemsRepositoryImpl @Inject constructor(private val ncApi: NcApi) : SharedItemsRepository { + + override fun media( + parameters: SharedItemsRepository.Parameters, + type: SharedItemType + ): Observable? { + return media(parameters, type, null) + } + + override fun media( + parameters: SharedItemsRepository.Parameters, + type: SharedItemType, + lastKnownMessageId: Int? + ): Observable? { + val credentials = ApiUtils.getCredentials(parameters.userName, parameters.userToken) + + return ncApi.getSharedItems( + credentials, + ApiUtils.getUrlForChatSharedItems(1, parameters.baseUrl, parameters.roomToken), + type.toString().lowercase(Locale.ROOT), + lastKnownMessageId, + BATCH_SIZE + ).map { map(it, parameters) } + } + + private fun map( + response: Response, + parameters: SharedItemsRepository.Parameters + ): SharedMediaItems { + + var chatLastGiven: Int? = null + val items = mutableMapOf() + + if (response.headers()["x-chat-last-given"] != null) { + chatLastGiven = response.headers()["x-chat-last-given"]!!.toInt() + } + + val mediaItems = response.body()!!.ocs!!.data + if (mediaItems != null) { + for (it in mediaItems) { + if (it.value.messageParameters?.containsKey("file") == true) { + val fileParameters = it.value.messageParameters!!["file"]!! + + val previewAvailable = + "yes".equals(fileParameters["preview-available"]!!, ignoreCase = true) + + items[it.value.id] = SharedItem( + fileParameters["id"]!!, + fileParameters["name"]!!, + fileParameters["size"]!!.toLong(), + it.value.timestamp, + fileParameters["path"]!!, + fileParameters["link"]!!, + fileParameters["mimetype"]!!, + previewAvailable, + previewLink(fileParameters["id"], parameters.baseUrl), + parameters.userEntity + ) + } else { + Log.w(TAG, "location and deckcard are not yet supported") + } + } + } + + val sortedMutableItems = items.toSortedMap().values.toList().reversed().toMutableList() + val moreItemsExisting = items.count() == BATCH_SIZE + + return SharedMediaItems( + sortedMutableItems, + chatLastGiven, + moreItemsExisting + ) + } + + override fun availableTypes(parameters: SharedItemsRepository.Parameters): Observable> { + val credentials = ApiUtils.getCredentials(parameters.userName, parameters.userToken) + + return ncApi.getSharedItemsOverview( + credentials, + ApiUtils.getUrlForChatSharedItemsOverview(1, parameters.baseUrl, parameters.roomToken), + 1 + ).map { + val types = mutableSetOf() + val typeMap = it.body()!!.ocs!!.data!! + for (t in typeMap) { + if (t.value.isNotEmpty()) { + try { + types += SharedItemType.typeFor(t.key) + } catch (e: IllegalArgumentException) { + Log.w(TAG, "Server responds an unknown shared item type: ${t.key}") + } + } + } + + types.toSet() + } + } + + private fun previewLink(fileId: String?, baseUrl: String): String { + return ApiUtils.getUrlForFilePreviewWithFileId( + baseUrl, + fileId, + sharedApplication!!.resources.getDimensionPixelSize(R.dimen.maximum_file_preview_size) + ) + } + + companion object { + const val BATCH_SIZE: Int = 28 + private val TAG = SharedItemsRepositoryImpl::class.simpleName + } +}