Introduce interface for 'SharedItemsRepository'

Signed-off-by: Tim Krüger <t@timkrueger.me>
This commit is contained in:
Tim Krüger 2022-05-19 16:26:47 +02:00
parent b2f59ccb6c
commit 6b9ab738cb
No known key found for this signature in database
GPG Key ID: FECE3A7222C52A4E
3 changed files with 137 additions and 116 deletions

View File

@ -23,6 +23,7 @@ package com.nextcloud.talk.dagger.modules
import com.nextcloud.talk.api.NcApi import com.nextcloud.talk.api.NcApi
import com.nextcloud.talk.shareditems.repositories.SharedItemsRepository import com.nextcloud.talk.shareditems.repositories.SharedItemsRepository
import com.nextcloud.talk.shareditems.repositories.SharedItemsRepositoryImpl
import dagger.Module import dagger.Module
import dagger.Provides import dagger.Provides
@ -30,6 +31,6 @@ import dagger.Provides
class RepositoryModule { class RepositoryModule {
@Provides @Provides
fun provideSharedItemsRepository(ncApi: NcApi): SharedItemsRepository { fun provideSharedItemsRepository(ncApi: NcApi): SharedItemsRepository {
return SharedItemsRepository(ncApi) return SharedItemsRepositoryImpl(ncApi)
} }
} }

View File

@ -1,123 +1,21 @@
package com.nextcloud.talk.shareditems.repositories 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.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.SharedItemType
import com.nextcloud.talk.shareditems.model.SharedMediaItems import com.nextcloud.talk.shareditems.model.SharedMediaItems
import com.nextcloud.talk.utils.ApiUtils
import io.reactivex.Observable 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<SharedMediaItems>? { fun media(parameters: Parameters, type: SharedItemType): Observable<SharedMediaItems>?
return media(parameters, type, null)
}
fun media(parameters: Parameters, type: SharedItemType, lastKnownMessageId: Int?): Observable<SharedMediaItems>? { fun media(
val credentials = ApiUtils.getCredentials(parameters.userName, parameters.userToken) parameters: Parameters,
type: SharedItemType,
lastKnownMessageId: Int?
): Observable<SharedMediaItems>?
return ncApi.getSharedItems( fun availableTypes(parameters: Parameters): Observable<Set<SharedItemType>>
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<ChatShareOverall>,
parameters: Parameters
): SharedMediaItems {
var chatLastGiven: Int? = null
val items = mutableMapOf<String, SharedItem>()
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<Set<SharedItemType>> {
val credentials = ApiUtils.getCredentials(parameters.userName, parameters.userToken)
return ncApi.getSharedItemsOverview(
credentials,
ApiUtils.getUrlForChatSharedItemsOverview(1, parameters.baseUrl, parameters.roomToken),
1
).map {
val types = mutableSetOf<SharedItemType>()
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<String, String> {
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)
)
}
data class Parameters( data class Parameters(
val userName: String, val userName: String,
@ -126,9 +24,4 @@ class SharedItemsRepository @Inject constructor(private val ncApi: NcApi) {
val userEntity: UserEntity, val userEntity: UserEntity,
val roomToken: String val roomToken: String
) )
companion object {
const val BATCH_SIZE: Int = 28
private val TAG = SharedItemsRepository::class.simpleName
}
} }

View File

@ -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<SharedMediaItems>? {
return media(parameters, type, null)
}
override fun media(
parameters: SharedItemsRepository.Parameters,
type: SharedItemType,
lastKnownMessageId: Int?
): Observable<SharedMediaItems>? {
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<ChatShareOverall>,
parameters: SharedItemsRepository.Parameters
): SharedMediaItems {
var chatLastGiven: Int? = null
val items = mutableMapOf<String, SharedItem>()
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<Set<SharedItemType>> {
val credentials = ApiUtils.getCredentials(parameters.userName, parameters.userToken)
return ncApi.getSharedItemsOverview(
credentials,
ApiUtils.getUrlForChatSharedItemsOverview(1, parameters.baseUrl, parameters.roomToken),
1
).map {
val types = mutableSetOf<SharedItemType>()
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
}
}