mirror of
https://github.com/nextcloud/talk-android
synced 2025-06-20 03:59:35 +01:00
Introduce interface for 'SharedItemsRepository'
Signed-off-by: Tim Krüger <t@timkrueger.me>
This commit is contained in:
parent
b2f59ccb6c
commit
6b9ab738cb
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user