New network components

Signed-off-by: Mario Danic <mario@lovelyhq.com>
This commit is contained in:
Mario Danic 2020-03-10 13:05:07 +01:00
parent b338c336b8
commit de74755492
No known key found for this signature in database
GPG Key ID: CDE0BBD2738C4CC0
4 changed files with 59 additions and 21 deletions

View File

@ -53,9 +53,10 @@ import com.nextcloud.talk.newarch.data.model.ErrorModel
import com.nextcloud.talk.newarch.data.source.remote.ApiErrorHandler
import com.nextcloud.talk.newarch.domain.usecases.GetNotificationUseCase
import com.nextcloud.talk.newarch.domain.usecases.base.UseCaseResponse
import com.nextcloud.talk.newarch.local.models.toUser
import com.nextcloud.talk.newarch.utils.Images
import com.nextcloud.talk.newarch.utils.MagicJson
import com.nextcloud.talk.newarch.utils.ComponentsWithEmptyCookieJar
import com.nextcloud.talk.newarch.utils.NetworkComponents
import com.nextcloud.talk.utils.ApiUtils
import com.nextcloud.talk.utils.NotificationUtils
import com.nextcloud.talk.utils.bundle.BundleKeys
@ -73,7 +74,7 @@ class MessageNotificationWorker(
workerParams: WorkerParameters
) : CoroutineWorker(context, workerParams), KoinComponent {
val appPreferences: AppPreferences by inject()
private val componentsWithEmptyCookieJar: ComponentsWithEmptyCookieJar by inject()
private val networkComponents: NetworkComponents by inject()
private val apiErrorHandler: ApiErrorHandler by inject()
override suspend fun doWork(): Result = coroutineScope {
@ -107,7 +108,7 @@ class MessageNotificationWorker(
}
private fun showNotificationWithObjectData(coroutineScope: CoroutineScope, decryptedPushMessage: DecryptedPushMessage, signatureVerification: SignatureVerification, intent: Intent) {
val nextcloudTalkRepository = componentsWithEmptyCookieJar.getRepository()
val nextcloudTalkRepository = networkComponents.getRepository(false, signatureVerification.userEntity!!.toUser())
val getNotificationUseCase = GetNotificationUseCase(nextcloudTalkRepository, apiErrorHandler)
getNotificationUseCase.invoke(coroutineScope, parametersOf(signatureVerification.userEntity, decryptedPushMessage.notificationId.toString()), object : UseCaseResponse<NotificationOverall> {
override suspend fun onSuccess(result: NotificationOverall) {
@ -304,7 +305,7 @@ class MessageNotificationWorker(
target, null, CircleCropTransformation()
)
componentsWithEmptyCookieJar.getImageLoader().load(request)
networkComponents.getImageLoader(signatureVerification.userEntity!!.toUser()).load(request)
} else {
notificationBuilder.setStyle(getStyle(decryptedPushMessage, conversationType, person.build(), style))
NotificationManagerCompat.from(applicationContext).notify(notificationId, notificationBuilder.build())

View File

@ -46,7 +46,7 @@ import com.nextcloud.talk.newarch.domain.repository.online.NextcloudTalkReposito
import com.nextcloud.talk.newarch.utils.NetworkUtils
import com.nextcloud.talk.newarch.utils.NetworkUtils.GetProxyRunnable
import com.nextcloud.talk.newarch.utils.NetworkUtils.MagicAuthenticator
import com.nextcloud.talk.newarch.utils.ComponentsWithEmptyCookieJar
import com.nextcloud.talk.newarch.utils.NetworkComponents
import com.nextcloud.talk.utils.LoggingUtils
import com.nextcloud.talk.utils.preferences.AppPreferences
import com.nextcloud.talk.utils.singletons.AvatarStatusCodeHolder
@ -93,8 +93,8 @@ val NetworkModule = module {
}
fun createComponentsWithEmptyCookieJar(okHttpClient: OkHttpClient, retrofit: Retrofit, androidApplication: Application): ComponentsWithEmptyCookieJar {
return ComponentsWithEmptyCookieJar(okHttpClient, retrofit, androidApplication)
fun createComponentsWithEmptyCookieJar(okHttpClient: OkHttpClient, retrofit: Retrofit, androidApplication: Application): NetworkComponents {
return NetworkComponents(okHttpClient, retrofit, androidApplication)
}
fun createCookieManager(): CookieManager {

View File

@ -41,7 +41,8 @@ import com.nextcloud.talk.newarch.domain.usecases.GetConversationUseCase
import com.nextcloud.talk.newarch.domain.usecases.GetParticipantsForCallUseCase
import com.nextcloud.talk.newarch.domain.usecases.base.UseCaseResponse
import com.nextcloud.talk.newarch.local.models.UserNgEntity
import com.nextcloud.talk.newarch.utils.ComponentsWithEmptyCookieJar
import com.nextcloud.talk.newarch.local.models.toUser
import com.nextcloud.talk.newarch.utils.NetworkComponents
import com.nextcloud.talk.newarch.utils.Images
import com.nextcloud.talk.newarch.utils.MagicJson
import com.nextcloud.talk.utils.ApiUtils
@ -73,8 +74,7 @@ class CallService : Service(), KoinComponent, CoroutineScope {
val appPreferences: AppPreferences by inject()
val usersRepository: UsersRepository by inject()
val conversationsRepository: ConversationsRepository by inject()
val retrofit: Retrofit by inject()
val componentsWithEmptyCookieJar: ComponentsWithEmptyCookieJar by inject()
val networkComponents: NetworkComponents by inject()
val apiErrorHandler: ApiErrorHandler by inject()
val eventBus: EventBus by inject()
@ -206,7 +206,7 @@ class CallService : Service(), KoinComponent, CoroutineScope {
}
val avatarUrl = ApiUtils.getUrlForAvatarWithName(signatureVerification.userEntity!!.baseUrl, conversation.name, R.dimen.avatar_size)
val imageLoader = componentsWithEmptyCookieJar.getImageLoader()
val imageLoader = networkComponents.getImageLoader(signatureVerification.userEntity!!.toUser())
val request = Images().getRequestForUrl(
imageLoader, applicationContext, avatarUrl, signatureVerification.userEntity,
@ -250,7 +250,7 @@ class CallService : Service(), KoinComponent, CoroutineScope {
private fun checkIsConversationActive(user: UserNgEntity, conversationToken: String, activeNotificationArgument: String) {
if (activeNotificationArgument == activeNotification) {
val getParticipantsForCallUseCase = GetParticipantsForCallUseCase(componentsWithEmptyCookieJar.getRepository(), apiErrorHandler)
val getParticipantsForCallUseCase = GetParticipantsForCallUseCase(networkComponents.getRepository(false, user.toUser()), apiErrorHandler)
getParticipantsForCallUseCase.invoke(this, parametersOf(user, conversationToken), object : UseCaseResponse<ParticipantsOverall> {
override suspend fun onSuccess(result: ParticipantsOverall) {
val participants = result.ocs.data
@ -284,9 +284,9 @@ class CallService : Service(), KoinComponent, CoroutineScope {
}
private suspend fun getConversationForTokenAndUser(user: UserNgEntity, conversationToken: String): Conversation? {
var conversation = conversationsRepository.getConversationForUserWithToken(user.id!!, conversationToken)
var conversation = conversationsRepository.getConversationForUserWithToken(user.id, conversationToken)
if (conversation == null) {
val getConversationUseCase = GetConversationUseCase(componentsWithEmptyCookieJar.getRepository(), apiErrorHandler)
val getConversationUseCase = GetConversationUseCase(networkComponents.getRepository(false, user.toUser()), apiErrorHandler)
runBlocking {
getConversationUseCase.invoke(this, parametersOf(user, conversationToken), object : UseCaseResponse<ConversationOverall> {
override suspend fun onSuccess(result: ConversationOverall) {

View File

@ -31,32 +31,69 @@ import coil.decode.SvgDecoder
import com.nextcloud.talk.newarch.data.repository.online.NextcloudTalkRepositoryImpl
import com.nextcloud.talk.newarch.data.source.remote.ApiService
import com.nextcloud.talk.newarch.domain.repository.online.NextcloudTalkRepository
import com.nextcloud.talk.newarch.local.models.User
import okhttp3.JavaNetCookieJar
import okhttp3.OkHttpClient
import org.koin.core.KoinComponent
import retrofit2.Retrofit
import java.net.CookieManager
class ComponentsWithEmptyCookieJar(
class NetworkComponents(
private val okHttpClient: OkHttpClient,
private val retrofit: Retrofit,
private val androidApplication: Application
) : KoinComponent {
fun getRepository(): NextcloudTalkRepository {
return NextcloudTalkRepositoryImpl(retrofit.newBuilder().client(getOkHttpClient())
val usersSingleOperationRepositoryMap : MutableMap<Long, NextcloudTalkRepository> = mutableMapOf()
val usersMultipleOperationsRepositoryMap : MutableMap<Long, NextcloudTalkRepository> = mutableMapOf()
val usersSingleOperationOkHttpMap: MutableMap<Long, OkHttpClient> = mutableMapOf()
val usersMultipleOperationOkHttpMap: MutableMap<Long, OkHttpClient> = mutableMapOf()
fun getRepository(singleOperation: Boolean, user: User): NextcloudTalkRepository {
val mappedNextcloudTalkRepository = if (singleOperation) {
usersSingleOperationRepositoryMap[user.id]
} else {
usersMultipleOperationsRepositoryMap[user.id]
}
if (mappedNextcloudTalkRepository != null) {
return mappedNextcloudTalkRepository
}
return NextcloudTalkRepositoryImpl(retrofit.newBuilder().client(getOkHttpClient(singleOperation, user))
.build().create(ApiService::class.java))
}
fun getOkHttpClient(): OkHttpClient {
return okHttpClient.newBuilder().cookieJar(JavaNetCookieJar(CookieManager())).build()
fun getOkHttpClient(singleOperation: Boolean, user: User): OkHttpClient {
val mappedOkHttpClient = if (singleOperation) {
usersSingleOperationOkHttpMap[user.id]
} else {
usersMultipleOperationOkHttpMap[user.id]
}
if (mappedOkHttpClient != null) {
return mappedOkHttpClient
}
val okHttpClientBuilder = okHttpClient.newBuilder().cookieJar(JavaNetCookieJar(CookieManager()))
val dispatcher = okHttpClient.dispatcher()
if (singleOperation) {
dispatcher.maxRequests = 1
} else {
dispatcher.maxRequests = 100
}
okHttpClientBuilder.dispatcher(dispatcher)
return okHttpClientBuilder.build()
}
fun getImageLoader(): ImageLoader {
fun getImageLoader(user: User): ImageLoader {
return ImageLoader(androidApplication) {
availableMemoryPercentage(0.5)
bitmapPoolPercentage(0.5)
crossfade(false)
okHttpClient(getOkHttpClient())
okHttpClient(getOkHttpClient(false, user))
componentRegistry {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
add(ImageDecoderDecoder())